Merge idea133 into master
This CL merges the following CLs from aosp/idea133 into aosp/master.
dabd634b Snapshot e2750ea61032f2a041cb012bb7b90cffa0deba73 from idea/133.124 of git://git.jetbrains.org/idea/community.git
29ab773f Make default test target run Android specific tests
967117a7 Merge "Make default test target run Android specific tests" into idea133
1eb71f20 Bump memory settings for unit tests
b13ea0d4 Don't bind the delete key to restoring property in layout editor
a20ccfa9 Add Gradle import module
0980f4a2 Add gradle-import to build script
cee6f8ca Fix Gradle notification lookup on Windows.
8668e1be Snapshot 020d29497847701e84e383d965abf543b80758e2 from idea/133.370 of git://git.jetbrains.org/idea/community.git
18f77669 Merge remote-tracking branch 'aosp/snapshot-master' into merge
36ac8cba Update from Guava 13.0.1 to Guava 15
4d451f93 Update libraries to lombok 0.2.2
ee06b1d0 Remove lint-cli dependency from the idea project
ab73dade Updater: add unit tests.
dd558b6e Updater: on Windows, add "Retry" on file op failures.
f2f7178a Snapshot c11f3ac9bbde3f85d1f837ec3eb48a395ed7dd10 from idea/133.471 of git://git.jetbrains.org/idea/community.git
5e4c77db Merge remote-tracking branch 'aosp/snapshot-master' into merge
8d957349 Fix junit.jar path in updater project.
58c3e0ae Include cloud tools tests in default test group
63cd9779 Temporarily disable errors in project structure dialog
e2d6089d Snapshot b9931c55d2175b6552f90b2225eb09c13bd6dfed from idea/133.609 of git://git.jetbrains.org/idea/community.git
031a291e Merge remote-tracking branch 'aosp/snapshot-master' into merge
ea628d6e Remove versions from Info.plist
809cb3e7 Snapshot 9e6329d622cc9649c9c035f28faddc29564a5b7a from idea/133.696 of git://git.jetbrains.org/idea/community.git
d6cfe6ec Merge remote-tracking branch 'aosp/snapshot-master' into merge
38f8c6f0 Gracefully handle build.gradle files in modules without a configured JDK
70ae6f2a Snapshot dc1944e804515a346297e368c3b9c35a203c9912 from idea/133.818 of git://git.jetbrains.org/idea/community.git
ac91a6de Merge remote-tracking branch 'aosp/snapshot-master' into merge
2f51d957 Gradle: respect build classpath order and use both classes and sources jars if available
0ecdb509 Snapshot c50a8ad26a72432f26e39046d6a6f21fd7a190ee from idea/134.1160 of git://git.jetbrains.org/idea/community.git
e8c22ad7 Merge remote-tracking branch 'aosp/snapshot-master' into merge
72253f7d Turn off android framework detection
93f77ee6 Temporarily remove GCT tests
88f318c9 Snapshot 34f078c3452e79ba209d28a551962857e0970e5d from idea/134.1342 of git://git.jetbrains.org/idea/community.git
afb54e4b Merge remote-tracking branch 'aosp/snapshot-master' into merge
4dc795dc Fix updater UI tests.
57a49ed1 Studio patch: more logging.
aa614ee0 table greyer (ability to disable a table)
5c571417 Use Gradle model prebuilts v0.9.0 in Studio.
cb38c25d build script: Run jarjar on the updater
f273ca07 Add App Engine templates dir to build
7607404f Removed android-builder library from Studio (not needed.)
8f29b4eb Merge idea133 changes into master
Change-Id: I12231f26e886dbf5e2e5ac0b1c4bfe18f274d78f
diff --git a/python/IntelliLang-python/IntelliLang-python.iml b/python/IntelliLang-python/IntelliLang-python.iml
index b28d5b4..a877c73 100644
--- a/python/IntelliLang-python/IntelliLang-python.iml
+++ b/python/IntelliLang-python/IntelliLang-python.iml
@@ -10,6 +10,7 @@
<orderEntry type="module" module-name="core-api" />
<orderEntry type="module" module-name="IntelliLang" />
<orderEntry type="module" module-name="python-community" />
+ <orderEntry type="module" module-name="lang-impl" />
</component>
</module>
diff --git a/python/IntelliLang-python/src/META-INF/intellilang-python-support.xml b/python/IntelliLang-python/src/META-INF/intellilang-python-support.xml
index 2ffa9f7..44bab2c 100644
--- a/python/IntelliLang-python/src/META-INF/intellilang-python-support.xml
+++ b/python/IntelliLang-python/src/META-INF/intellilang-python-support.xml
@@ -7,5 +7,7 @@
</extensions>
<extensions defaultExtensionNs="com.intellij">
<patterns.patternClass className="com.jetbrains.python.patterns.PythonPatterns" alias="py"/>
+ <multiHostInjector implementation="com.jetbrains.python.intelliLang.PyConfigurationInjector"/>
+ <multiHostInjector implementation="com.jetbrains.python.intelliLang.PyTemporaryInjector"/>
</extensions>
</idea-plugin>
\ No newline at end of file
diff --git a/python/IntelliLang-python/src/com/jetbrains/python/intelliLang/PyCommentInjector.java b/python/IntelliLang-python/src/com/jetbrains/python/intelliLang/PyCommentInjector.java
new file mode 100644
index 0000000..45eb96b
--- /dev/null
+++ b/python/IntelliLang-python/src/com/jetbrains/python/intelliLang/PyCommentInjector.java
@@ -0,0 +1,25 @@
+package com.jetbrains.python.intelliLang;
+
+import com.intellij.lang.Language;
+import com.intellij.psi.PsiElement;
+import com.jetbrains.python.codeInsight.PyInjectorBase;
+import org.intellij.plugins.intelliLang.inject.InjectedLanguage;
+import org.intellij.plugins.intelliLang.inject.InjectorUtils;
+import org.intellij.plugins.intelliLang.inject.config.BaseInjection;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * @author vlan
+ */
+public class PyCommentInjector extends PyInjectorBase {
+ @Nullable
+ @Override
+ public Language getInjectedLanguage(@NotNull PsiElement context) {
+ final BaseInjection injection = InjectorUtils.findCommentInjection(context, "comment", null);
+ if (injection != null) {
+ return InjectedLanguage.findLanguageById(injection.getInjectedLanguageId());
+ }
+ return null;
+ }
+}
diff --git a/python/IntelliLang-python/src/com/jetbrains/python/intelliLang/PyConfigurationInjector.java b/python/IntelliLang-python/src/com/jetbrains/python/intelliLang/PyConfigurationInjector.java
new file mode 100644
index 0000000..59974a4
--- /dev/null
+++ b/python/IntelliLang-python/src/com/jetbrains/python/intelliLang/PyConfigurationInjector.java
@@ -0,0 +1,44 @@
+package com.jetbrains.python.intelliLang;
+
+import com.intellij.lang.Language;
+import com.intellij.lang.injection.MultiHostRegistrar;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil;
+import com.jetbrains.python.codeInsight.PyInjectionUtil;
+import com.jetbrains.python.codeInsight.PyInjectorBase;
+import org.intellij.plugins.intelliLang.Configuration;
+import org.intellij.plugins.intelliLang.inject.InjectedLanguage;
+import org.intellij.plugins.intelliLang.inject.InjectorUtils;
+import org.intellij.plugins.intelliLang.inject.LanguageInjectionSupport;
+import org.intellij.plugins.intelliLang.inject.config.BaseInjection;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * @author vlan
+ */
+public class PyConfigurationInjector extends PyInjectorBase {
+ @Override
+ public void getLanguagesToInject(@NotNull MultiHostRegistrar registrar, @NotNull PsiElement context) {
+ final PyInjectionUtil.InjectionResult result = registerInjection(registrar, context);
+ if (!result.isStrict()) {
+ InjectorUtils.putInjectedFileUserData(registrar, InjectedLanguageUtil.FRANKENSTEIN_INJECTION, Boolean.TRUE);
+ }
+ }
+
+ @Nullable
+ @Override
+ public Language getInjectedLanguage(@NotNull PsiElement context) {
+ for (LanguageInjectionSupport support : InjectorUtils.getActiveInjectionSupports()) {
+ if (support instanceof PyLanguageInjectionSupport) {
+ final Configuration configuration = Configuration.getInstance();
+ for (BaseInjection injection : configuration.getInjections(support.getId())) {
+ if (injection.acceptsPsiElement(context)) {
+ return InjectedLanguage.findLanguageById(injection.getInjectedLanguageId());
+ }
+ }
+ }
+ }
+ return null;
+ }
+}
diff --git a/python/IntelliLang-python/src/com/jetbrains/python/intelliLang/PyLanguageInjectionSupport.java b/python/IntelliLang-python/src/com/jetbrains/python/intelliLang/PyLanguageInjectionSupport.java
index 5a91db5..dee16d2 100644
--- a/python/IntelliLang-python/src/com/jetbrains/python/intelliLang/PyLanguageInjectionSupport.java
+++ b/python/IntelliLang-python/src/com/jetbrains/python/intelliLang/PyLanguageInjectionSupport.java
@@ -15,22 +15,17 @@
*/
package com.jetbrains.python.intelliLang;
-import com.intellij.lang.Language;
-import com.intellij.openapi.util.TextRange;
+import com.intellij.openapi.util.Ref;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiLanguageInjectionHost;
import com.jetbrains.python.patterns.PythonPatterns;
import com.jetbrains.python.psi.PyElement;
-import com.jetbrains.python.psi.PyStringLiteralExpression;
import org.intellij.plugins.intelliLang.inject.AbstractLanguageInjectionSupport;
import org.intellij.plugins.intelliLang.inject.config.BaseInjection;
-import org.jdom.Element;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-import java.util.List;
-
/**
* @author yole
*/
@@ -54,36 +49,15 @@
return host instanceof PyElement;
}
- @Override
- public boolean useDefaultInjector(PsiLanguageInjectionHost host) {
- return true;
- }
-
- @Override
- public BaseInjection createInjection(Element element) {
- // This is how DefaultLanguageInjector gets its injection ranges
- return new BaseInjection(getId()) {
- @NotNull
- @Override
- public List<TextRange> getInjectedArea(PsiElement element) {
- if (element instanceof PyStringLiteralExpression) {
- return ((PyStringLiteralExpression)element).getStringValueTextRanges();
- }
- return super.getInjectedArea(element);
- }
- };
- }
-
- @Override
- public boolean addInjectionInPlace(Language language, PsiLanguageInjectionHost psiElement) {
- // XXX: Disable temporary injections via intention actions for Python elements, since TemporaryPlacesInjector cannot handle elements
- // with multiple injection text ranges (PY-10691)
- return true;
- }
-
@Nullable
@Override
public String getHelpId() {
return "reference.settings.language.injection.generic.python";
}
+
+ @Nullable
+ @Override
+ public BaseInjection findCommentInjection(@NotNull PsiElement host, @Nullable Ref<PsiElement> commentRef) {
+ return null;
+ }
}
diff --git a/python/IntelliLang-python/src/com/jetbrains/python/intelliLang/PyTemporaryInjector.java b/python/IntelliLang-python/src/com/jetbrains/python/intelliLang/PyTemporaryInjector.java
new file mode 100644
index 0000000..73c4b21
--- /dev/null
+++ b/python/IntelliLang-python/src/com/jetbrains/python/intelliLang/PyTemporaryInjector.java
@@ -0,0 +1,46 @@
+package com.jetbrains.python.intelliLang;
+
+import com.intellij.lang.Language;
+import com.intellij.lang.injection.MultiHostRegistrar;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiFile;
+import com.intellij.psi.PsiLanguageInjectionHost;
+import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil;
+import com.jetbrains.python.codeInsight.PyInjectionUtil;
+import com.jetbrains.python.codeInsight.PyInjectorBase;
+import org.intellij.plugins.intelliLang.inject.InjectedLanguage;
+import org.intellij.plugins.intelliLang.inject.InjectorUtils;
+import org.intellij.plugins.intelliLang.inject.TemporaryPlacesRegistry;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * @author vlan
+ */
+public class PyTemporaryInjector extends PyInjectorBase {
+ @Override
+ public void getLanguagesToInject(@NotNull MultiHostRegistrar registrar, @NotNull PsiElement context) {
+ final PyInjectionUtil.InjectionResult result = registerInjection(registrar, context);
+ if (result.isInjected()) {
+ final TemporaryPlacesRegistry registry = TemporaryPlacesRegistry.getInstance(context.getProject());
+ InjectorUtils.registerSupport(registry.getLanguageInjectionSupport(), false, registrar);
+ if (!result.isStrict()) {
+ InjectorUtils.putInjectedFileUserData(registrar, InjectedLanguageUtil.FRANKENSTEIN_INJECTION, Boolean.TRUE);
+ }
+ }
+ }
+
+ @Nullable
+ @Override
+ public Language getInjectedLanguage(@NotNull PsiElement context) {
+ final TemporaryPlacesRegistry registry = TemporaryPlacesRegistry.getInstance(context.getProject());
+ if (context instanceof PsiLanguageInjectionHost) {
+ final PsiFile file = context.getContainingFile();
+ final InjectedLanguage injectedLanguage = registry.getLanguageFor((PsiLanguageInjectionHost)context, file);
+ if (injectedLanguage != null) {
+ return injectedLanguage.getLanguage();
+ }
+ }
+ return null;
+ }
+}
diff --git a/python/IntelliLang-python/src/pyInjections.xml b/python/IntelliLang-python/src/pyInjections.xml
index e9ae34e..fc9207a 100644
--- a/python/IntelliLang-python/src/pyInjections.xml
+++ b/python/IntelliLang-python/src/pyInjections.xml
@@ -9,6 +9,6 @@
</injection>
<injection language="SQL" injector-id="python">
<display-name>"SQL select/delete/insert/update/create"</display-name>
- <place><![CDATA[pyLiteralExpression().withText(string().matchesBrics(" *(((SELECT|DELETE) .*FROM)|((INSERT|REPLACE) .*INTO)|(UPDATE .* SET)|((CREATE|DROP|ALTER) +(TABLE|INDEX))) .*"))]]></place>
+ <place><![CDATA[pyStringLiteralMatches("[ \\t\\r\\n]*(((SELECT|DELETE) .*FROM)|((INSERT|REPLACE) .*INTO)|(UPDATE .* SET)|((CREATE|DROP|ALTER) +(TABLE|INDEX))).*")]]></place>
</injection>
</component>
diff --git a/python/build.xml b/python/build.xml
index aa5176f..22f9990 100644
--- a/python/build.xml
+++ b/python/build.xml
@@ -17,8 +17,8 @@
<attribute name="script" />
<sequential>
<java failonerror="true" jar="${project.home}/lib/ant/lib/ant-launcher.jar" fork="true">
- <jvmarg line="-Xmx612m -XX:MaxPermSize=152m -Didea.build.number=${idea.build.number} -DideaPath=${idea.path}"/>
-
+ <jvmarg line="-Xmx612m -XX:MaxPermSize=152m -Didea.build.number=${idea.build.number} "-DideaPath=${idea.path}""/>
+ <sysproperty key="java.awt.headless" value="true"/>
<arg line=""-Dgant.script=@{script}""/>
<arg line=""-Dteamcity.build.tempDir=${tmp.dir}""/>
<arg line=""-Didea.build.number=${idea.build.number}""/>
diff --git a/python/build/plugin-list.txt b/python/build/plugin-list.txt
index aa7830f..0779cc0 100644
--- a/python/build/plugin-list.txt
+++ b/python/build/plugin-list.txt
@@ -9,6 +9,7 @@
tasks
tasks-core
tasks-api
+jira
github
terminal
IntelliLang
diff --git a/python/build/pycharm_community_build.gant b/python/build/pycharm_community_build.gant
index 4701545..dfb9b05 100644
--- a/python/build/pycharm_community_build.gant
+++ b/python/build/pycharm_community_build.gant
@@ -216,12 +216,6 @@
module("util-rt")
}
- dir("libpty") {
- fileset(dir: "$home/community/lib/libpty") {
- exclude(name: "*.txt")
- }
- }
-
jar("openapi.jar") {
openapiModules.each { module it }
}
@@ -272,6 +266,12 @@
fileset(file: it)
}
+ dir("libpty") {
+ fileset(dir: "$ch/lib/libpty") {
+ exclude(name: "*.txt")
+ }
+ }
+
dir("ext") {
fileset(dir: "$ch/lib") {
include(name: "cglib*.jar")
diff --git a/python/build/python_plugin_build.gant b/python/build/python_plugin_build.gant
index 0383e3e..261313a 100644
--- a/python/build/python_plugin_build.gant
+++ b/python/build/python_plugin_build.gant
@@ -149,6 +149,10 @@
fileset(file: "${pluginHome}/pluginResources/META-INF/*.xml")
}
+ ant.replace(file: "${classesDir}/META-INF/plugin.xml") {
+ replacefilter(token: "@@BUILD_NUMBER@@", value: "${buildNumber}")
+ }
+
ant.replaceregexp(file: "${classesDir}/META-INF/plugin.xml",
match: "since-build=\"\\d+\\.\\d+\"",
replace: "since-build=\"${ideaBuildNumber}\"")
diff --git a/python/build/resources/logo.bmp b/python/build/resources/logo.bmp
index 19188f3..0f0f82d 100644
--- a/python/build/resources/logo.bmp
+++ b/python/build/resources/logo.bmp
Binary files differ
diff --git a/python/helpers/generator3.py b/python/helpers/generator3.py
index 5fced92..ca61efe 100644
--- a/python/helpers/generator3.py
+++ b/python/helpers/generator3.py
@@ -1,49 +1,21 @@
# encoding: utf-8
+import atexit
+import zipfile
+
from pycharm_generator_utils.module_redeclarator import *
from pycharm_generator_utils.util_methods import *
from pycharm_generator_utils.constants import *
-import os
-import atexit
-import zipfile
+
debug_mode = False
-def build_output_name(dirname, qualified_name):
- qualifiers = qualified_name.split(".")
- if dirname and not dirname.endswith("/") and not dirname.endswith("\\"):
- dirname += os.path.sep # "a -> a/"
- for pathindex in range(len(qualifiers) - 1): # create dirs for all qualifiers but last
- subdirname = dirname + os.path.sep.join(qualifiers[0: pathindex + 1])
- if not os.path.isdir(subdirname):
- action("creating subdir %r", subdirname)
- os.makedirs(subdirname)
- init_py = os.path.join(subdirname, "__init__.py")
- if os.path.isfile(subdirname + ".py"):
- os.rename(subdirname + ".py", init_py)
- elif not os.path.isfile(init_py):
- init = fopen(init_py, "w")
- init.close()
- target_name = dirname + os.path.sep.join(qualifiers)
- if os.path.isdir(target_name):
- fname = os.path.join(target_name, "__init__.py")
- else:
- fname = target_name + ".py"
-
- dirname = os.path.dirname(fname)
-
- if not os.path.isdir(dirname):
- os.makedirs(dirname)
-
- return fname
-
-
-def redo_module(mod_name, outfile, module_file_name, doing_builtins):
+def redo_module(module_name, outfile, module_file_name, doing_builtins):
# gobject does 'del _gobject' in its __init__.py, so the chained attribute lookup code
# fails to find 'gobject._gobject'. thus we need to pull the module directly out of
# sys.modules
- mod = sys.modules.get(mod_name)
- mod_path = mod_name.split('.')
+ mod = sys.modules.get(module_name)
+ mod_path = module_name.split('.')
if not mod and sys.platform == 'cli':
# "import System.Collections" in IronPython 2.7 doesn't actually put System.Collections in sys.modules
# instead, sys.modules['System'] get set to a Microsoft.Scripting.Actions.NamespaceTracker and Collections can be
@@ -54,16 +26,16 @@
mod = getattr(mod, component)
except AttributeError:
mod = None
- report("Failed to find CLR module " + mod_name)
+ report("Failed to find CLR module " + module_name)
break
if mod:
action("restoring")
r = ModuleRedeclarator(mod, outfile, module_file_name, doing_builtins=doing_builtins)
- r.redo(mod_name, ".".join(mod_path[:-1]) in MODULES_INSPECT_DIR)
+ r.redo(module_name, ".".join(mod_path[:-1]) in MODULES_INSPECT_DIR)
action("flushing")
r.flush()
else:
- report("Failed to find imported module in sys.modules " + mod_name)
+ report("Failed to find imported module in sys.modules " + module_name)
# find_binaries functionality
def cut_binary_lib_suffix(path, f):
@@ -122,6 +94,18 @@
os.path.exists(os.path.join(root, d, "__init__.pyo")))
+def walk_python_path(path):
+ for root, dirs, files in os.walk(path):
+ if root.endswith('__pycache__'):
+ continue
+ dirs_copy = list(dirs)
+ for d in dirs_copy:
+ if d.endswith('__pycache__') or not is_module(d, root):
+ dirs.remove(d)
+ # some files show up but are actually non-existent symlinks
+ yield root, [f for f in files if os.path.exists(os.path.join(root, f))]
+
+
def list_binaries(paths):
"""
Finds binaries in the given list of paths.
@@ -139,13 +123,7 @@
paths = sorted_no_case(paths)
for path in paths:
if path == os.path.dirname(sys.argv[0]): continue
- for root, dirs, files in os.walk(path):
- if root.endswith('__pycache__'): continue
- dirs_copy = list(dirs)
- for d in dirs_copy:
- if d.endswith("__pycache__") or not is_module(d, root):
- dirs.remove(d)
-
+ for root, files in walk_python_path(path):
cutpoint = path.rfind(SEP)
if cutpoint > 0:
preprefix = path[(cutpoint + len(SEP)):] + '.'
@@ -180,17 +158,10 @@
path = os.path.normpath(path)
- for root, dirs, files in os.walk(path):
- if root.endswith('__pycache__'): continue
- dirs_copy = list(dirs)
- for d in dirs_copy:
- if d.endswith("__pycache__") or not is_module(d, root):
- dirs.remove(d)
+ for root, files in walk_python_path(path):
for name in files:
if name.endswith('.py'):
file_path = os.path.join(root, name)
- # some files show up but are actually non-existent symlinks
- if not os.path.exists(file_path): continue
say("%s\t%s\t%d", os.path.normpath(file_path), path, os.path.getsize(file_path))
say('END')
sys.stdout.flush()
@@ -264,80 +235,67 @@
say(name)
sys.stdout.flush()
action("doing nothing")
- outfile = None
+
try:
- try:
- fname = build_output_name(subdir, name)
- action("opening %r", fname)
- outfile = fopen(fname, "w")
- old_modules = list(sys.modules.keys())
- imported_module_names = []
+ fname = build_output_name(subdir, name)
+ action("opening %r", fname)
+ old_modules = list(sys.modules.keys())
+ imported_module_names = []
- class MyFinder:
- #noinspection PyMethodMayBeStatic
- def find_module(self, fullname, path=None):
- if fullname != name:
- imported_module_names.append(fullname)
- return None
+ class MyFinder:
+ #noinspection PyMethodMayBeStatic
+ def find_module(self, fullname, path=None):
+ if fullname != name:
+ imported_module_names.append(fullname)
+ return None
- my_finder = None
- if hasattr(sys, 'meta_path'):
- my_finder = MyFinder()
- sys.meta_path.append(my_finder)
- else:
- imported_module_names = None
+ my_finder = None
+ if hasattr(sys, 'meta_path'):
+ my_finder = MyFinder()
+ sys.meta_path.append(my_finder)
+ else:
+ imported_module_names = None
- action("importing")
- __import__(name) # sys.modules will fill up with what we want
+ action("importing")
+ __import__(name) # sys.modules will fill up with what we want
- if my_finder:
- sys.meta_path.remove(my_finder)
- if imported_module_names is None:
- imported_module_names = [m for m in sys.modules.keys() if m not in old_modules]
+ if my_finder:
+ sys.meta_path.remove(my_finder)
+ if imported_module_names is None:
+ imported_module_names = [m for m in sys.modules.keys() if m not in old_modules]
- redo_module(name, outfile, mod_file_name, doing_builtins)
- # The C library may have called Py_InitModule() multiple times to define several modules (gtk._gtk and gtk.gdk);
- # restore all of them
- path = name.split(".")
- redo_imports = not ".".join(path[:-1]) in MODULES_INSPECT_DIR
- if imported_module_names and redo_imports:
- for m in sys.modules.keys():
- action("looking at possible submodule %r", m)
- # if module has __file__ defined, it has Python source code and doesn't need a skeleton
- if m not in old_modules and m not in imported_module_names and m != name and not hasattr(
- sys.modules[m], '__file__'):
- if not quiet:
- say(m)
- sys.stdout.flush()
- fname = build_output_name(subdir, m)
- action("opening %r", fname)
- subfile = fopen(fname, "w")
- try:
- redo_module(m, subfile, mod_file_name, doing_builtins)
- finally:
- action("closing %r", fname)
- subfile.close()
- except:
- exctype, value = sys.exc_info()[:2]
- msg = "Failed to process %r while %s: %s"
- args = name, CURRENT_ACTION, str(value)
- report(msg, *args)
- if outfile is not None and not outfile.closed:
- outfile.write("# encoding: %s\n" % OUT_ENCODING)
- outfile.write("# module %s\n" % name)
- outfile.write("# from %s\n" % mod_file_name)
- outfile.write("# by generator %s\n" % VERSION)
- outfile.write("\n\n")
- outfile.write("# Skeleton generation error:\n#\n# " + (msg % args) + "\n")
- if debug_mode:
- if sys.platform == 'cli':
- import traceback
- traceback.print_exc(file=sys.stderr)
- raise
- return False
- finally:
- if outfile is not None and not outfile.closed:
- outfile.close()
+ redo_module(name, fname, mod_file_name, doing_builtins)
+ # The C library may have called Py_InitModule() multiple times to define several modules (gtk._gtk and gtk.gdk);
+ # restore all of them
+ path = name.split(".")
+ redo_imports = not ".".join(path[:-1]) in MODULES_INSPECT_DIR
+ if imported_module_names and redo_imports:
+ for m in sys.modules.keys():
+ if m.startswith("pycharm_generator_utils"): continue
+ action("looking at possible submodule %r", m)
+ # if module has __file__ defined, it has Python source code and doesn't need a skeleton
+ if m not in old_modules and m not in imported_module_names and m != name and not hasattr(
+ sys.modules[m], '__file__'):
+ if not quiet:
+ say(m)
+ sys.stdout.flush()
+ fname = build_output_name(subdir, m)
+ action("opening %r", fname)
+ try:
+ redo_module(m, fname, mod_file_name, doing_builtins)
+ finally:
+ action("closing %r", fname)
+ except:
+ exctype, value = sys.exc_info()[:2]
+ msg = "Failed to process %r while %s: %s"
+ args = name, CURRENT_ACTION, str(value)
+ report(msg, *args)
+ if debug_mode:
+ if sys.platform == 'cli':
+ import traceback
+ traceback.print_exc(file=sys.stderr)
+ raise
+ return False
return True
diff --git a/python/helpers/packaging_tool.py b/python/helpers/packaging_tool.py
index 9937a6b..c66cbcb 100644
--- a/python/helpers/packaging_tool.py
+++ b/python/helpers/packaging_tool.py
@@ -8,6 +8,8 @@
ERROR_NO_SETUPTOOLS = 3
ERROR_EXCEPTION = 4
+os.putenv("PIP_REQUIRE_VIRTUALENV", "false")
+
def exit(retcode):
major, minor, micro, release, serial = sys.version_info
version = major * 10 + minor
diff --git a/python/helpers/pycharm/django_test_runner.py b/python/helpers/pycharm/django_test_runner.py
index 3eb993d..f3f20a0 100644
--- a/python/helpers/pycharm/django_test_runner.py
+++ b/python/helpers/pycharm/django_test_runner.py
@@ -1,16 +1,15 @@
-import sys
-
-from tcunittest import TeamcityTestRunner
+from tcunittest import TeamcityTestRunner, TeamcityTestResult
from tcmessages import TeamcityServiceMessages
-
+import sys
from pycharm_run_utils import adjust_django_sys_path
+
+adjust_django_sys_path()
+
from django.conf import settings
if hasattr(settings, "TEST_RUNNER") and "NoseTestSuiteRunner" in settings.TEST_RUNNER:
from nose_utils import TeamcityNoseRunner
-adjust_django_sys_path()
-
from django.test.testcases import TestCase
from django import VERSION
try:
@@ -52,10 +51,41 @@
def __init__(self, stream=sys.stdout, **options):
TeamcityTestRunner.__init__(self, stream)
+
+def strclass(cls):
+ if not cls.__name__:
+ return cls.__module__
+ return "%s.%s" % (cls.__module__, cls.__name__)
+
+class DjangoTeamcityTestResult(TeamcityTestResult):
+ def __init__(self, *args, **kwargs):
+ super(DjangoTeamcityTestResult, self).__init__()
+
+ def _getSuite(self, test):
+ if hasattr(test, "suite"):
+ suite = strclass(test.suite)
+ suite_location = test.suite.location
+ location = test.suite.abs_location
+ if hasattr(test, "lineno"):
+ location = location + ":" + str(test.lineno)
+ else:
+ location = location + ":" + str(test.test.lineno)
+ else:
+
+ suite = strclass(test.__class__)
+ suite_location = "django_testid://" + suite
+ location = "django_testid://" + str(test.id())
+
+ return (suite, location, suite_location)
+
+
class DjangoTeamcityTestRunner(BaseRunner):
def __init__(self, stream=sys.stdout, **options):
super(DjangoTeamcityTestRunner, self).__init__(stream)
+ def _makeResult(self, **kwargs):
+ return DjangoTeamcityTestResult(self.stream, **kwargs)
+
def build_suite(self, *args, **kwargs):
EXCLUDED_APPS = getattr(settings, 'TEST_EXCLUDE', [])
suite = super(DjangoTeamcityTestRunner, self).build_suite(*args, **kwargs)
diff --git a/python/helpers/pycharm/nose_utils.py b/python/helpers/pycharm/nose_utils.py
index 62c77a2..a7efa08 100644
--- a/python/helpers/pycharm/nose_utils.py
+++ b/python/helpers/pycharm/nose_utils.py
@@ -1,9 +1,13 @@
-from tcmessages import TeamcityServiceMessages
-import sys, traceback, datetime
+import sys
+import traceback
+import datetime
import unittest
+
+from tcmessages import TeamcityServiceMessages
from tcunittest import strclass
from tcunittest import TeamcityTestResult
+
try:
from nose.util import isclass # backwards compat
from nose.config import Config
@@ -59,7 +63,10 @@
def formatErr(self, err):
exctype, value, tb = err
if isinstance(value, str):
- value = exctype(value)
+ try:
+ value = exctype(value)
+ except TypeError:
+ pass
return ''.join(traceback.format_exception(exctype, value, tb))
def is_gen(self, test):
@@ -107,9 +114,9 @@
location = location + ":" + str(test.test.lineno)
else:
suite = strclass(test.__class__)
- suite_location = "python_uttestid://" + suite
+ suite_location = "python_nosetestid://" + suite
try:
- from nose_helper.util import func_lineno
+ from nose.util import func_lineno
if hasattr(test.test, "descriptor") and test.test.descriptor:
suite_location = "file://" + self.test_address(
@@ -124,8 +131,8 @@
except:
test_id = test.id()
suite_id = test_id[:test_id.rfind(".")]
- suite_location = "python_uttestid://" + str(suite_id)
- location = "python_uttestid://" + str(test_id)
+ suite_location = "python_nosetestid://" + str(suite_id)
+ location = "python_nosetestid://" + str(test_id)
return (location, suite_location)
diff --git a/python/helpers/pycharm/pycharm_run_utils.py b/python/helpers/pycharm/pycharm_run_utils.py
index 5fbc35c..d905d05 100644
--- a/python/helpers/pycharm/pycharm_run_utils.py
+++ b/python/helpers/pycharm/pycharm_run_utils.py
@@ -20,9 +20,10 @@
insert_to_sys_path(script_path)
def adjust_django_sys_path():
- sys.path.pop(0)
+ pycharm_path = sys.path.pop(0)
script_path = sys.argv[-1]
insert_to_sys_path(script_path)
+ sys.path.append(pycharm_path)
def import_system_module(name):
f, filename, desc = imp.find_module(name)
diff --git a/python/helpers/pycharm/tcunittest.py b/python/helpers/pycharm/tcunittest.py
index 07da02d..b6950c9 100644
--- a/python/helpers/pycharm/tcunittest.py
+++ b/python/helpers/pycharm/tcunittest.py
@@ -47,7 +47,7 @@
quot = val[0]
count = 1
quote_ind = val[count:].find(quot)
- while val[count+quote_ind-1] == "\\" and quote_ind != -1:
+ while quote_ind != -1 and val[count+quote_ind-1] == "\\":
count = count + quote_ind + 1
quote_ind = val[count:].find(quot)
@@ -60,16 +60,15 @@
val = val[val_index+2:].strip()
quot = val[0]
quote_ind = val[count:].find(quot)
- while val[count+quote_ind-1] == "\\" and quote_ind != -1:
+ while quote_ind != -1 and val[count+quote_ind-1] == "\\":
count = count + quote_ind + 1
quote_ind = val[count:].find(quot)
return val[0:quote_ind+count+1]
else:
quot = val[-1]
- count = 0
- quote_ind = val[:len(val)-count-1].rfind(quot)
- while val[quote_ind-1] == "\\":
+ quote_ind = val[:len(val)-1].rfind(quot)
+ while quote_ind != -1 and val[quote_ind-1] == "\\":
quote_ind = val[:quote_ind-1].rfind(quot)
return val[quote_ind:]
diff --git a/python/helpers/pycharm_generator_utils/constants.py b/python/helpers/pycharm_generator_utils/constants.py
index 6b77e73..4ea8cf1 100644
--- a/python/helpers/pycharm_generator_utils/constants.py
+++ b/python/helpers/pycharm_generator_utils/constants.py
@@ -6,7 +6,7 @@
import time
-VERSION = "1.131"
+VERSION = "1.133"
OUT_ENCODING = 'utf-8'
diff --git a/python/helpers/pycharm_generator_utils/module_redeclarator.py b/python/helpers/pycharm_generator_utils/module_redeclarator.py
index f56fb43..8377879 100644
--- a/python/helpers/pycharm_generator_utils/module_redeclarator.py
+++ b/python/helpers/pycharm_generator_utils/module_redeclarator.py
@@ -1,6 +1,7 @@
+import keyword
+
from pycharm_generator_utils.util_methods import *
from pycharm_generator_utils.constants import *
-import keyword, re
class emptylistdict(dict):
@@ -49,6 +50,11 @@
return len(self.data) == 0
+class ClassBuf(Buf):
+ def __init__(self, name, indenter):
+ super(ClassBuf, self).__init__(indenter)
+ self.name = name
+
#noinspection PyUnresolvedReferences,PyBroadException
class ModuleRedeclarator(object):
def __init__(self, module, outfile, mod_filename, indent_size=4, doing_builtins=False):
@@ -67,6 +73,7 @@
self.imports_buf = Buf(self)
self.functions_buf = Buf(self)
self.classes_buf = Buf(self)
+ self.classes_buffs = list()
self.footer_buf = Buf(self)
self.indent_size = indent_size
self._indent_step = " " * self.indent_size
@@ -106,8 +113,43 @@
return self._indent_step * level
def flush(self):
- for buf in (self.header_buf, self.imports_buf, self.functions_buf, self.classes_buf, self.footer_buf):
- buf.flush(self.outfile)
+ init = None
+ try:
+ if self.mod_filename and len(self.classes_buffs) >= 30:
+ mod_path = self.outfile.strip(".py")
+
+ fname = build_output_name(mod_path, "__init__")
+ init = fopen(fname, "w")
+ for buf in (self.header_buf, self.imports_buf, self.functions_buf, self.classes_buf):
+ buf.flush(init)
+
+ data = ""
+ for buf in self.classes_buffs:
+ fname = build_output_name(mod_path, buf.name)
+ dummy = fopen(fname, "w")
+ self.header_buf.flush(dummy)
+ buf.flush(dummy)
+ data += "from "
+ if version[0] >= 3:
+ data += "."
+ data += buf.name + " import " + buf.name + "\n"
+ dummy.close()
+
+ init.write(data)
+ self.footer_buf.flush(init)
+ else:
+ init = fopen(self.outfile, "w")
+ for buf in (self.header_buf, self.imports_buf, self.functions_buf, self.classes_buf):
+ buf.flush(init)
+
+ for buf in self.classes_buffs:
+ buf.flush(init)
+
+ self.footer_buf.flush(init)
+
+ finally:
+ if init is not None and not init.closed:
+ init.close()
# Some builtin classes effectively change __init__ signature without overriding it.
# This callable serves as a placeholder to be replaced via REDEFINED_BUILTIN_SIGS
@@ -150,7 +192,7 @@
for initializer_type, r in self._initializers:
if initializer_type == a_type:
return r
- # NOTE: here we could handle things like defaultdict, sets, etc if we wanted
+ # NOTE: here we could handle things like defaultdict, sets, etc if we wanted
return "None"
@@ -224,7 +266,7 @@
seen_values.append(value)
if isinstance(k, SIMPLEST_TYPES):
self.fmt_value(out, value, indent + 1, prefix=repr(k) + ": ", postfix=",",
- seen_values=seen_values)
+ seen_values=seen_values)
else:
# both key and value need fancy formatting
self.fmt_value(out, k, indent + 1, postfix=": ", seen_values=seen_values)
@@ -244,9 +286,15 @@
if self._defined.get(found_name, False):
out(indent, prefix, found_name, postfix)
else:
- # a forward / circular declaration happens
+ # a forward / circular declaration happens
notice = ""
- real_value = cleanup(repr(p_value))
+ try:
+ representation = repr(p_value)
+ except Exception:
+ import traceback
+ traceback.print_exc(file=sys.stderr)
+ return
+ real_value = cleanup(representation)
if found_name:
if found_name == as_name:
notice = " # (!) real value is %r" % real_value
@@ -409,7 +457,7 @@
def is_predefined_builtin(self, module_name, class_name, func_name):
return self.doing_builtins and module_name == BUILTIN_MOD_NAME and (
- class_name, func_name) in PREDEFINED_BUILTIN_SIGS
+ class_name, func_name) in PREDEFINED_BUILTIN_SIGS
def redo_function(self, out, p_func, p_name, indent, p_class=None, p_modname=None, classname=None, seen=None):
@@ -434,7 +482,7 @@
return
else:
seen[id(p_func)] = p_name
- # real work
+ # real work
if classname is None:
classname = p_class and p_class.__name__ or None
if p_class and hasattr(p_class, '__mro__'):
@@ -492,7 +540,7 @@
out(indent, "def ", p_name, sig, ": # known case of ", ofwhat)
out_doc_attr(out, p_func, indent + 1, p_class)
else:
- # __doc__ is our best source of arglist
+ # __doc__ is our best source of arglist
sig_note = "real signature unknown"
spec = ""
is_init = (p_name == "__init__" and p_class is not None)
@@ -508,17 +556,17 @@
action("parsing doc of func %r of class %r", p_name, p_class)
if isinstance(funcdoc, STR_TYPES):
(spec, ret_literal, more_notes) = self.parse_func_doc(funcdoc, p_name, p_name, classname, deco,
- sip_generated)
+ sip_generated)
if spec is None and p_name == '__init__' and classname:
(spec, ret_literal, more_notes) = self.parse_func_doc(funcdoc, classname, p_name, classname, deco,
- sip_generated)
+ sip_generated)
sig_restored = spec is not None
if more_notes:
if sig_note:
sig_note += "; "
sig_note += more_notes
if not sig_restored:
- # use an allow-all declaration
+ # use an allow-all declaration
decl = []
if p_class:
first_param = propose_first_param(deco)
@@ -531,7 +579,7 @@
# to reduce size of stubs, don't output same docstring twice for class and its __init__ method
if not is_init or funcdoc != p_class.__doc__:
out_docstring(out, funcdoc, indent + 1)
- # body
+ # body
if ret_literal and not is_init:
out(indent + 1, "return ", ret_literal)
else:
@@ -646,7 +694,7 @@
self.redo_function(out, item, item_name, indent + 1, p_class, p_modname, classname=p_name, seen=seen_funcs)
except:
handle_error_func(item_name, out)
- #
+ #
known_props = KNOWN_PROPS.get(p_modname, {})
a_setter = "lambda self, v: None"
a_deleter = "lambda self: None"
@@ -782,7 +830,7 @@
for item_name in module_dict:
note("looking at %s", item_name)
if item_name in (
- "__dict__", "__doc__", "__module__", "__file__", "__name__", "__builtins__", "__package__"):
+ "__dict__", "__doc__", "__module__", "__file__", "__name__", "__builtins__", "__package__"):
continue # handled otherwise
try:
item = getattr(self.module, item_name) # let getters do the magic
@@ -806,7 +854,7 @@
mod_name = getattr(item, '__module__', None)
except:
pass
- # we assume that module foo.bar never imports foo; foo may import foo.bar. (see pygame and pygame.rect)
+ # we assume that module foo.bar never imports foo; foo may import foo.bar. (see pygame and pygame.rect)
maybe_import_mod_name = mod_name or ""
import_is_from_top = len(p_name) > len(maybe_import_mod_name) and p_name.startswith(maybe_import_mod_name)
note("mod_name = %s, prospective = %s, from top = %s", mod_name, maybe_import_mod_name, import_is_from_top)
@@ -906,9 +954,8 @@
self.functions_buf.out(0, "# no functions")
#
if classes:
- out = self.functions_buf.out
- out(0, "# classes")
- out(0, "")
+ self.classes_buf.out(0, "# classes")
+ self.classes_buf.out(0, "")
seen_classes = {}
# sort classes so that inheritance order is preserved
cls_list = [] # items are (class_name, mro_tuple)
@@ -922,6 +969,9 @@
break # ...and need not go fartehr than first known child
cls_list.insert(ins_index, (cls_name, get_mro(cls)))
for item_name in [cls_item[0] for cls_item in cls_list]:
+ buf = ClassBuf(item_name, self)
+ self.classes_buffs.append(buf)
+ out = buf.out
if item_name in omitted_names:
out(0, "# definition of ", item_name, " omitted")
continue
@@ -974,7 +1024,7 @@
self.footer_buf.out(0, "# intermittent names")
for value in values_to_add:
self.footer_buf.out(0, value)
- # imports: last, because previous parts could alter used_imports or hidden_imports
+ # imports: last, because previous parts could alter used_imports or hidden_imports
self.output_import_froms()
if self.imports_buf.isEmpty():
self.imports_buf.out(0, "# no imports")
@@ -1009,7 +1059,7 @@
names_pack.append(n)
names_pack.append(", ")
right_pos += (len_n + 2)
- # last line is...
+ # last line is...
if indent_level == 0: # one line
names_pack[0] = names_pack[0][:-1] # cut off lpar
names_pack[-1] = "" # cut last comma
diff --git a/python/helpers/pycharm_generator_utils/util_methods.py b/python/helpers/pycharm_generator_utils/util_methods.py
index 8d6d356..2ddbc94 100644
--- a/python/helpers/pycharm_generator_utils/util_methods.py
+++ b/python/helpers/pycharm_generator_utils/util_methods.py
@@ -6,7 +6,7 @@
inspect = None
def create_named_tuple(): #TODO: user-skeleton
- return """
+ return """
class __namedtuple(tuple):
'''A mock base class for named tuples.'''
@@ -38,12 +38,12 @@
"""
def create_generator():
- # Fake <type 'generator'>
- if version[0] < 3:
- next_name = "next"
- else:
- next_name = "__next__"
- txt = """
+ # Fake <type 'generator'>
+ if version[0] < 3:
+ next_name = "next"
+ else:
+ next_name = "__next__"
+ txt = """
class __generator(object):
'''A mock class representing the generator function type.'''
def __init__(self):
@@ -59,8 +59,8 @@
'''Return the next item from the container.'''
pass
""" % (next_name,)
- if version[0] >= 3 or (version[0] == 2 and version[1] >= 5):
- txt += """
+ if version[0] >= 3 or (version[0] == 2 and version[1] >= 5):
+ txt += """
def close(self):
'''Raises new GeneratorExit exception inside the generator to terminate the iteration.'''
pass
@@ -73,10 +73,10 @@
'''Used to raise an exception inside the generator.'''
pass
"""
- return txt
+ return txt
def _searchbases(cls, accum):
-# logic copied from inspect.py
+ # logic copied from inspect.py
if cls not in accum:
accum.append(cls)
for x in cls.__bases__:
@@ -84,7 +84,7 @@
def get_mro(a_class):
-# logic copied from inspect.py
+ # logic copied from inspect.py
"""Returns a tuple of MRO classes."""
if hasattr(a_class, "__mro__"):
return a_class.__mro__
@@ -236,7 +236,7 @@
if toplevel and not has_item_starting_with(ret, "*"):
ret.append("*more")
else:
- # we're in a "foo, (bar1, bar2, ...)"; make it "foo, bar_tuple"
+ # we're in a "foo, (bar1, bar2, ...)"; make it "foo, bar_tuple"
return extract_alpha_prefix(results[0][1]) + "_tuple"
else: # just name
ret.append(sanitize_ident(token_name, is_clr))
@@ -271,7 +271,7 @@
if len(token) == 3: # name with value; little sense, but can happen in a deeply nested optional
ret.append(sanitize_ident(token_name, is_clr) + "=" + sanitize_value(token[2]))
elif token_name == '...':
- # we're in a "foo, [bar, ...]"; make it "foo, *bar"
+ # we're in a "foo, [bar, ...]"; make it "foo, *bar"
return ["*" + extract_alpha_prefix(
results[1][1])] # we must return a seq; [1] is first simple, [1][1] is its name
else: # just name
@@ -531,7 +531,7 @@
if not methods:
bases = p_class.__bases__
if len(bases) == 1 and p_name in dir(bases[0]):
- # skip inherited methods
+ # skip inherited methods
return None, None
return p_name + '(*args)', 'cannot find CLR method'
@@ -542,3 +542,31 @@
if not methods[0].IsStatic:
params = ['self'] + params
return build_signature(p_name, params), None
+
+def build_output_name(dirname, qualified_name):
+ qualifiers = qualified_name.split(".")
+ if dirname and not dirname.endswith("/") and not dirname.endswith("\\"):
+ dirname += os.path.sep # "a -> a/"
+ for pathindex in range(len(qualifiers) - 1): # create dirs for all qualifiers but last
+ subdirname = dirname + os.path.sep.join(qualifiers[0: pathindex + 1])
+ if not os.path.isdir(subdirname):
+ action("creating subdir %r", subdirname)
+ os.makedirs(subdirname)
+ init_py = os.path.join(subdirname, "__init__.py")
+ if os.path.isfile(subdirname + ".py"):
+ os.rename(subdirname + ".py", init_py)
+ elif not os.path.isfile(init_py):
+ init = fopen(init_py, "w")
+ init.close()
+ target_name = dirname + os.path.sep.join(qualifiers)
+ if os.path.isdir(target_name):
+ fname = os.path.join(target_name, "__init__.py")
+ else:
+ fname = target_name + ".py"
+
+ dirname = os.path.dirname(fname)
+
+ if not os.path.isdir(dirname):
+ os.makedirs(dirname)
+
+ return fname
diff --git a/python/helpers/pydev/pydev_console_utils.py b/python/helpers/pydev/pydev_console_utils.py
index ee62910..54a8585 100644
--- a/python/helpers/pydev/pydev_console_utils.py
+++ b/python/helpers/pydev/pydev_console_utils.py
@@ -4,6 +4,7 @@
import traceback
from pydevd_constants import USE_LIB_COPY
+from pydevd_constants import IS_JYTHON
try:
if USE_LIB_COPY:
@@ -132,6 +133,16 @@
return '\n'
+class CodeFragment:
+ def __init__(self, text, is_single_line=True):
+ self.text = text
+ self.is_single_line = is_single_line
+
+ def append(self, code_fragment):
+ self.text = self.text + "\n" + code_fragment.text
+ if not code_fragment.is_single_line:
+ self.is_single_line = False
+
#=======================================================================================================================
# BaseInterpreterInterface
#=======================================================================================================================
@@ -140,22 +151,16 @@
self.mainThread = mainThread
self.interruptable = False
self.exec_queue = _queue.Queue(0)
- self.buffer = []
+ self.buffer = None
- def needMore(self, buffer, line):
- if not buffer:
- buffer = []
- buffer.append(line)
- source = "\n".join(buffer)
+ def needMoreForCode(self, source):
if hasattr(self.interpreter, 'is_complete'):
return not self.interpreter.is_complete(source)
-
try:
- code = self.interpreter.compile(source, "<input>", "single")
+ code = self.interpreter.compile(source, '<input>', 'exec')
except (OverflowError, SyntaxError, ValueError):
# Case 1
return False
-
if code is None:
# Case 2
return True
@@ -163,10 +168,15 @@
# Case 3
return False
+ def needMore(self, code_fragment):
+ if self.buffer is None:
+ self.buffer = code_fragment
+ else:
+ self.buffer.append(code_fragment)
+
+ return self.needMoreForCode(self.buffer.text)
- def addExec(self, line):
- #f_opened = open('c:/temp/a.txt', 'a')
- #f_opened.write(line+'\n')
+ def addExec(self, code_fragment):
original_in = sys.stdin
try:
help = None
@@ -199,14 +209,14 @@
self._input_error_printed = True
sys.stderr.write('\nError when trying to update pydoc.help.input\n')
sys.stderr.write('(help() may not work -- please report this as a bug in the pydev bugtracker).\n\n')
- import traceback;
+ import traceback
traceback.print_exc()
try:
self.startExec()
- more = self.doAddExec(line)
- self.finishExec()
+ more = self.doAddExec(code_fragment)
+ self.finishExec(more)
finally:
if help is not None:
try:
@@ -226,12 +236,10 @@
traceback.print_exc()
- #it's always false at this point
- need_input = False
- return more, need_input
+ return more
- def doAddExec(self, line):
+ def doAddExec(self, codeFragment):
'''
Subclasses should override.
@@ -309,15 +317,31 @@
return ''
- def execLine(self, line):
+ def doExecCode(self, code, is_single_line):
try:
- #buffer = self.interpreter.buffer[:]
- self.exec_queue.put(line)
- return self.needMore(self.buffer, line)
+ code_fragment = CodeFragment(code, is_single_line)
+ more = self.needMore(code_fragment)
+ if not more:
+ code_fragment = self.buffer
+ self.buffer = None
+ self.exec_queue.put(code_fragment)
+
+ return more
except:
traceback.print_exc()
return False
+ def execLine(self, line):
+ return self.doExecCode(line, True)
+
+
+ def execMultipleLines(self, lines):
+ if IS_JYTHON:
+ for line in lines.split('\n'):
+ self.doExecCode(line, True)
+ else:
+ return self.doExecCode(lines, False)
+
def interrupt(self):
try:
@@ -343,13 +367,13 @@
else:
return None
- def finishExec(self):
+ def finishExec(self, more):
self.interruptable = False
server = self.get_server()
if server is not None:
- return server.NotifyFinished()
+ return server.NotifyFinished(more)
else:
return True
diff --git a/python/helpers/pydev/pydev_ipython_console.py b/python/helpers/pydev/pydev_ipython_console.py
index d3d4ae8..6a8e056 100644
--- a/python/helpers/pydev/pydev_ipython_console.py
+++ b/python/helpers/pydev/pydev_ipython_console.py
@@ -39,14 +39,14 @@
def get_greeting_msg(self):
return self.interpreter.get_greeting_msg()
- def doAddExec(self, line):
+ def doAddExec(self, codeFragment):
self.notify_about_magic()
- if (line.rstrip().endswith('??')):
+ if (codeFragment.text.rstrip().endswith('??')):
print('IPython-->')
try:
- res = bool(self.interpreter.addExec(line))
+ res = bool(self.interpreter.addExec(codeFragment.text))
finally:
- if (line.rstrip().endswith('??')):
+ if (codeFragment.text.rstrip().endswith('??')):
print('<--IPython')
return res
diff --git a/python/helpers/pydev/pydev_monkey.py b/python/helpers/pydev/pydev_monkey.py
index 07c7e2b..ed6fea5 100644
--- a/python/helpers/pydev/pydev_monkey.py
+++ b/python/helpers/pydev/pydev_monkey.py
@@ -4,7 +4,7 @@
import pydev_log
import traceback
-helpers = os.path.dirname(__file__)
+helpers = os.path.dirname(__file__).replace('\\', '/')
def is_python(path):
if path.endswith("'") or path.endswith('"'):
@@ -37,8 +37,9 @@
host, port = pydevd.dispatch()
if port is not None:
- args[indC + 1] = "import sys; sys.path.append('%s'); import pydevd; pydevd.settrace(host='%s', port=%s, suspend=False); %s"%(helpers, host, port, args[indC + 1])
- return args
+ new_args.extend(args)
+ new_args[indC + 1] = "import sys; sys.path.append('%s'); import pydevd; pydevd.settrace(host='%s', port=%s, suspend=False); %s"%(helpers, host, port, args[indC + 1])
+ return new_args
else:
new_args.append(args[0])
else:
@@ -99,8 +100,9 @@
args = str_to_args(new_arg_str)
if not is_python(args[0]):
return arg_str
- art = args_to_str(patch_args(args))
- return art
+ arg_str = args_to_str(patch_args(args))
+ pydev_log.debug("New args: %s"% arg_str)
+ return arg_str
def monkey_patch_module(module, funcname, create_func):
if hasattr(module, funcname):
diff --git a/python/helpers/pydev/pydevconsole.py b/python/helpers/pydev/pydevconsole.py
index 026fb7f..e8b8d29 100644
--- a/python/helpers/pydev/pydevconsole.py
+++ b/python/helpers/pydev/pydevconsole.py
@@ -10,7 +10,7 @@
import sys
from pydevd_constants import USE_LIB_COPY
-from pydevd_utils import *
+from pydevd_constants import IS_JYTHON
if USE_LIB_COPY:
import _pydev_threading as threading
@@ -51,6 +51,7 @@
setattr(__builtin__, 'False', 0)
from pydev_console_utils import BaseInterpreterInterface
+from pydev_console_utils import CodeFragment
IS_PYTHON_3K = False
@@ -72,56 +73,30 @@
except ImportError:
import _pydev_xmlrpclib as xmlrpclib
-try:
- class ExecState:
- FIRST_CALL = True
- PYDEV_CONSOLE_RUN_IN_UI = False #Defines if we should run commands in the UI thread.
- from org.python.pydev.core.uiutils import RunInUiThread #@UnresolvedImport
- from java.lang import Runnable #@UnresolvedImport
+class Command:
+ def __init__(self, interpreter, code_fragment):
+ """
+ :type code_fragment: CodeFragment
+ :type interpreter: InteractiveConsole
+ """
+ self.interpreter = interpreter
+ self.code_fragment = code_fragment
+ self.more = None
- class Command(Runnable):
- def __init__(self, interpreter, line):
- self.interpreter = interpreter
- self.line = line
-
- def run(self):
- if ExecState.FIRST_CALL:
- ExecState.FIRST_CALL = False
- sys.stdout.write('\nYou are now in a console within Eclipse.\nUse it with care as it can halt the VM.\n')
- sys.stdout.write(
- 'Typing a line with "PYDEV_CONSOLE_TOGGLE_RUN_IN_UI"\nwill start executing all the commands in the UI thread.\n\n')
-
- if self.line == 'PYDEV_CONSOLE_TOGGLE_RUN_IN_UI':
- ExecState.PYDEV_CONSOLE_RUN_IN_UI = not ExecState.PYDEV_CONSOLE_RUN_IN_UI
- if ExecState.PYDEV_CONSOLE_RUN_IN_UI:
- sys.stdout.write(
- 'Running commands in UI mode. WARNING: using sys.stdin (i.e.: calling raw_input()) WILL HALT ECLIPSE.\n')
- else:
- sys.stdout.write('No longer running commands in UI mode.\n')
- self.more = False
- else:
- self.more = self.interpreter.push(self.line)
-
-
- def Sync(runnable):
- if ExecState.PYDEV_CONSOLE_RUN_IN_UI:
- return RunInUiThread.sync(runnable)
+ @staticmethod
+ def symbol_for_fragment(code_fragment):
+ if code_fragment.is_single_line:
+ symbol = 'single'
else:
- return runnable.run()
+ symbol = 'exec' # Jython doesn't support this
+ return symbol
-except:
- #If things are not there, define a way in which there's no 'real' sync, only the default execution.
- class Command:
- def __init__(self, interpreter, line):
- self.interpreter = interpreter
- self.line = line
+ def run(self):
+ text = self.code_fragment.text
+ symbol = self.symbol_for_fragment(self.code_fragment)
- def run(self):
- self.more = self.interpreter.push(self.line)
-
- def Sync(runnable):
- runnable.run()
+ self.more = self.interpreter.runsource(text, '<input>', symbol)
try:
try:
@@ -152,9 +127,9 @@
self._input_error_printed = False
- def doAddExec(self, line):
- command = Command(self.interpreter, line)
- Sync(command)
+ def doAddExec(self, codeFragment):
+ command = Command(self.interpreter, codeFragment)
+ command.run()
return command.more
@@ -185,14 +160,13 @@
while 1:
try:
try:
- line = interpreter.exec_queue.get(block=True, timeout=0.05)
+ codeFragment = interpreter.exec_queue.get(block=True, timeout=0.05)
except _queue.Empty:
continue
- if not interpreter.addExec(line): #TODO: think about locks here
- interpreter.buffer = []
+ more = interpreter.addExec(codeFragment)
except KeyboardInterrupt:
- interpreter.buffer = []
+ interpreter.buffer = None
continue
except SystemExit:
raise
@@ -274,6 +248,7 @@
raise
server.register_function(interpreter.execLine)
+ server.register_function(interpreter.execMultipleLines)
server.register_function(interpreter.getCompletions)
server.register_function(interpreter.getFrame)
server.register_function(interpreter.getVariable)
@@ -339,17 +314,17 @@
def get_frame():
return interpreterInterface.getFrame()
-def exec_expression(expression, globals, locals):
+def exec_code(code, globals, locals):
interpreterInterface = get_interpreter()
interpreterInterface.interpreter.update(globals, locals)
- res = interpreterInterface.needMore(None, expression)
+ res = interpreterInterface.needMore(code)
if res:
return True
- interpreterInterface.addExec(expression)
+ interpreterInterface.addExec(code)
return False
@@ -399,7 +374,7 @@
updated_globals.update(frame.f_locals) #locals later because it has precedence over the actual globals
if IPYTHON:
- return exec_expression(expression, updated_globals, frame.f_locals)
+ return exec_code(CodeFragment(expression), updated_globals, frame.f_locals)
interpreter = ConsoleWriter()
diff --git a/python/helpers/pydev/pydevd.py b/python/helpers/pydev/pydevd.py
index 031d6a1..f7bfb32 100644
--- a/python/helpers/pydev/pydevd.py
+++ b/python/helpers/pydev/pydevd.py
@@ -2,7 +2,6 @@
from django_debug import DjangoLineBreakpoint
from pydevd_signature import SignatureFactory
from pydevd_frame import add_exception_to_frame
-from pydevd_constants import * #@UnusedWildImport
import pydev_imports
from pydevd_breakpoints import * #@UnusedWildImport
import fix_getpass
@@ -1081,6 +1080,9 @@
from imp import new_module
m = new_module('__main__')
sys.modules['__main__'] = m
+ if hasattr(sys.modules['pydevd'], '__loader__'):
+ setattr(m, '__loader__', getattr(sys.modules['pydevd'], '__loader__'))
+
m.__file__ = file
globals = m.__dict__
try:
diff --git a/python/helpers/pydev/pydevd_constants.py b/python/helpers/pydev/pydevd_constants.py
index 34759f7..5e78e15 100644
--- a/python/helpers/pydev/pydevd_constants.py
+++ b/python/helpers/pydev/pydevd_constants.py
@@ -41,6 +41,10 @@
import os
+import pydevd_vm_type
+
+IS_JYTHON = pydevd_vm_type.GetVmType() == pydevd_vm_type.PydevdVmType.JYTHON
+
#=======================================================================================================================
# Python 3?
#=======================================================================================================================
diff --git a/python/helpers/pydev/test_debug.py b/python/helpers/pydev/test_debug.py
index 89051c8..bc55de1 100644
--- a/python/helpers/pydev/test_debug.py
+++ b/python/helpers/pydev/test_debug.py
@@ -1,16 +1,20 @@
__author__ = 'Dmitry.Trofimov'
import unittest
+import os
+
+test_data_path = os.path.abspath(os.path.join(os.path.dirname(os.path.realpath(__file__)), '..', '..', '..', '..', 'python', 'testData', 'debug'))
class PyDevTestCase(unittest.TestCase):
def testZipFileExits(self):
from pydevd_file_utils import exists
- self.assertTrue(exists('../../../testData/debug/zipped_lib.zip/zipped_module.py'))
- self.assertFalse(exists('../../../testData/debug/zipped_lib.zip/zipped_module2.py'))
- self.assertFalse(exists('../../../testData/debug/zipped_lib2.zip/zipped_module.py'))
+
+ self.assertTrue(exists(test_data_path +'/zipped_lib.zip/zipped_module.py'))
+ self.assertFalse(exists(test_data_path + '/zipped_lib.zip/zipped_module2.py'))
+ self.assertFalse(exists(test_data_path + '/zipped_lib2.zip/zipped_module.py'))
def testEggFileExits(self):
from pydevd_file_utils import exists
- self.assertTrue(exists('../../../testData/debug/pycharm-debug.egg/pydev/pydevd.py'))
- self.assertFalse(exists('../../../testData/debug/pycharm-debug.egg/pydev/pydevd2.py'))
+ self.assertTrue(exists(test_data_path + '/pycharm-debug.egg/pydev/pydevd.py'))
+ self.assertFalse(exists(test_data_path + '/pycharm-debug.egg/pydev/pydevd2.py'))
diff --git a/python/helpers/tools/stdlib_packages.txt b/python/helpers/tools/stdlib_packages.txt
index 619651e..2ee4b5d 100644
--- a/python/helpers/tools/stdlib_packages.txt
+++ b/python/helpers/tools/stdlib_packages.txt
@@ -6,6 +6,7 @@
array
ast
asynchat
+asyncio
asyncore
atexit
audiodev
@@ -68,6 +69,8 @@
dummy_threading
email
encodings
+ensurepip
+enum
errno
exceptions
fcntl
@@ -150,6 +153,7 @@
os2emxpath
ossaudiodev
parser
+pathlib
pdb
pickle
pickletools
@@ -194,6 +198,7 @@
runpy
sched
select
+selectors
sets
sgmllib
sha
@@ -219,6 +224,7 @@
ssl
stat
statcache
+statistics
statvfs
string
StringIO
@@ -254,6 +260,7 @@
tokenize
trace
traceback
+tracemalloc
tty
turtle
turtledemo
diff --git a/python/helpers/tools/versions.xml b/python/helpers/tools/versions.xml
index 9e92744..b995dc6 100644
--- a/python/helpers/tools/versions.xml
+++ b/python/helpers/tools/versions.xml
@@ -1 +1 @@
-<?xml version="1.0" ?><root><python version="2.4"><module>sqlite3.test.factory</module><module>importlib.test.source.test_file_loader</module><module>test.test_future_builtins</module><module>_dummy_thread</module><module>pydoc_data.topics</module><module>test.test_epoll</module><module>dbm.gnu</module><module>tkinter.test.test_tkinter.test_font</module><module>lib2to3.fixer_util</module><module>importlib.test.import_.test_caching</module><module>ctypes.test.test_cast</module><module>bsddb.test.test_distributed_transactions</module><module>encodings.utf_8_sig</module><module>antigravity</module><module>json.encoder</module><module>test.test_future5</module><module>test.test_future4</module><module>test.json_tests.test_recursion</module><module>runpy</module><module>multiprocessing.pool</module><module>tkinter._fix</module><module>test.ssl_servers</module><module>test.test_float</module><module>lib2to3.fixes.fix_methodattrs</module><module>ctypes.test.test_funcptr</module><module>turtledemo.minimal_hanoi</module><module>turtledemo.fractalcurves</module><module>turtledemo.lindenmayer</module><module>test.test_abstract_numbers</module><module>ctypes.test.test_pickling</module><module>lib2to3.fixer_base</module><module>lib2to3.fixes.fix_types</module><module>ctypes.test.test_pep3118</module><module>test.json_tests.test_separators</module><module>importlib.test.import_.test___package__</module><module>xml.etree</module><module>importlib.test.benchmark</module><module>json.tests.test_unicode</module><module>turtledemo.colormixer</module><module>lib2to3.fixes.fix_xreadlines</module><module>tkinter.ttk</module><module>email.mime.message</module><module>distutils.tests.test_core</module><module>test.test_hashlib</module><module>encodings.cp720</module><module>test.json_tests</module><module>unittest.test.test_result</module><module>test.test_sched</module><module>turtledemo.yinyang</module><module>ctypes.test.test_slicing</module><module>test.test_xmlrpc_net</module><module>test.test_sys_setprofile</module><module>tkinter.test.test_ttk</module><module>test.test_ttk_textonly</module><module>fractions</module><module>importlib.test.source.test_path_hook</module><module>bsddb.test.test_fileid</module><module>tkinter.font</module><module>unittest.__main__</module><module>tkinter.commondialog</module><module>lib2to3.fixes.fix_apply</module><module>test.test_keywordonlyarg</module><module>test.test_setcomps</module><module>test.test_collections</module><module>json.tests.test_speedups</module><module>json.tests.test_recursion</module><module>numbers</module><module>test.test_cmd</module><module>ctypes.test.test_checkretval</module><module>sqlite3.test</module><module>lib2to3.fixes.fix_long</module><module>concurrent.futures.process</module><module>distutils.tests.test_build</module><module>test.test_urllib_response</module><module>idlelib.tabbedpages</module><module>urllib.request</module><module>test.test_print</module><module>argparse</module><module>ctypes.test.test_functions</module><module>test.test_multiprocessing</module><module>ctypes.test.test_keeprefs</module><module>test.test_dbm_gnu</module><module>functools</module><module>ctypes.test.test_libc</module><module>idlelib.macosxSupport</module><module>importlib.util</module><module>test.json_tests.test_pass1</module><module>uuid</module><module>turtledemo.bytedesign</module><module>lib2to3.pgen2.pgen</module><module>distutils.tests.test_install_data</module><module>test.script_helper</module><module>test.test_readline</module><module>unittest.test.test_break</module><module>multiprocessing.synchronize</module><module>multiprocessing.heap</module><module>test.bad_coding2</module><module>test.test_dynamic</module><module>lib2to3.fixes.fix_imports2</module><module>lib2to3.fixes.fix_unicode</module><module>test.test_pep3120</module><module>distutils.tests.test_log</module><module>ctypes.test.test_cfuncs</module><module>ctypes.test.test_init</module><module>test.test_asyncore</module><module>importlib.test.builtin.test_finder</module><module>distutils.tests.test_build_ext</module><module>distutils.command.upload</module><module>test.test_http_cookiejar</module><module>sqlite3.test.types</module><module>ast</module><module>test.test_html</module><module>test.bad_coding</module><module>sqlite3.test.py25tests</module><module>ctypes.test.test_integers</module><module>ctypes.test.test_stringptr</module><module>lib2to3.refactor</module><module>unittest.test.test_setups</module><module>distutils.tests.test_install_lib</module><module>test.test_pep3131</module><module>test.__main__</module><module>test.badsyntax_pep3120</module><module>_collections</module><module>lib2to3.fixes.fix_metaclass</module><module>tkinter.test.test_ttk.test_functions</module><module>email.mime.image</module><module>turtledemo.planet_and_moon</module><module>unittest.test._test_warnings</module><module>test.test_coding</module><module>distutils.tests.test_sdist</module><module>importlib.test.frozen.test_loader</module><module>test.test_lib2to3</module><module>ctypes.macholib.dyld</module><module>lib2to3.fixes.fix_idioms</module><module>unittest.test.test_skipping</module><module>hashlib</module><module>test.test_contextlib</module><module>tkinter.tix</module><module>test.infinite_reload</module><module>_posixsubprocess</module><module>_curses</module><module>turtledemo.clock</module><module>_fileio</module><module>reprlib</module><module>lib2to3.fixes.fix_print</module><module>test.test_range</module><module>ctypes.test.test_simplesubclasses</module><module>xmlrpc.client</module><module>ctypes.test.test_byteswap</module><module>lib2to3.fixes.fix_callable</module><module>lib2to3</module><module>wsgiref.handlers</module><module>ctypes.test.test_pointers</module><module>lib2to3.fixes.fix_standarderror</module><module>abc</module><module>importlib.test.extension.test_case_sensitivity</module><module>_sqlite3</module><module>test.test_copyreg</module><module>distutils.tests.test_ccompiler</module><module>unittest.test.test_case</module><module>ctypes.macholib</module><module>distutils.tests.test_text_file</module><module>test.json_tests.test_indent</module><module>tkinter.dialog</module><module>test.test_memoryview</module><module>json.tests.test_scanstring</module><module>json.tests</module><module>importlib.test.import_.test_fromlist</module><module>ctypes._endian</module><module>lib2to3.btm_matcher</module><module>distutils.tests.test_util</module><module>_markupbase</module><module>importlib.test.import_.test_meta_path</module><module>lib2to3.tests.pytree_idempotency</module><module>lib2to3.fixes.fix_buffer</module><module>xml.etree.ElementTree</module><module>turtledemo.forest</module><module>tkinter.test.test_ttk.test_widgets</module><module>test.warning_tests</module><module>lib2to3.pgen2.conv</module><module>test.test_sqlite</module><module>importlib.test.frozen.test_finder</module><module>lib2to3.fixes.fix_renames</module><module>_lsprof</module><module>test.test_file2k</module><module>test.test_xml_etree</module><module>bsddb.test.test_early_close</module><module>html.parser</module><module>ctypes.test.test_bytes</module><module>pyexpat.model</module><module>test.test_univnewlines2k</module><module>test.test_linecache</module><module>lib2to3.pgen2.parse</module><module>lib2to3.fixes.fix_input</module><module>urllib.response</module><module>distutils.tests.test_unixccompiler</module><module>distutils.tests.test_clean</module><module>multiprocessing.util</module><module>lib2to3.pgen2</module><module>test.test_zipimport_support</module><module>build_class</module><module>ctypes.test.test_array_in_pointer</module><module>ctypes</module><module>http.cookies</module><module>lib2to3.fixes.fix_exitfunc</module><module>test.json_tests.test_fail</module><module>ctypes.test.test_prototypes</module><module>test.badsyntax_3131</module><module>lib2to3.tests.test_all_fixers</module><module>test.profilee</module><module>_stringio</module><module>ctypes.test.test_callbacks</module><module>ctypes.test.test_python_api</module><module>ctypes.test.test_loading</module><module>tkinter.scrolledtext</module><module>email.mime.application</module><module>test.tracedmodules.testmod</module><module>importlib.test.extension.test_path_hook</module><module>encodings.mac_croatian</module><module>importlib.test.import_.test_relative_imports</module><module>distutils.tests.test_bdist_msi</module><module>ctypes.test.test_win32</module><module>test.test_complex_args</module><module>encodings.utf_32</module><module>turtledemo.nim</module><module>lib2to3.fixes.fix_ws_comma</module><module>lib2to3.pgen2.grammar</module><module>test.test_cmd_line_script</module><module>encodings.mac_arabic</module><module>test.test_wait4</module><module>test.test_wait3</module><module>distutils.command.bdist_msi</module><module>distutils.tests.test_file_util</module><module>tkinter.test.test_ttk.test_style</module><module>test.test_http_cookies</module><module>json.decoder</module><module>ctypes.test.test_errcheck</module><module>unittest.test.test_program</module><module>lib2to3.tests.test_refactor</module><module>io</module><module>multiprocessing.queues</module><module>dbm.dumb</module><module>sqlite3</module><module>unittest.test.test_runner</module><module>ctypes.test.test_anon</module><module>test.test_property</module><module>test.test_macos</module><module>distutils.tests.test_filelist</module><module>ctypes.test.test_macholib</module><module>distutils.tests.test_bdist</module><module>ctypes.macholib.dylib</module><module>test.test_dbm_dumb</module><module>ctypes.test</module><module>distutils.tests.test_archive_util</module><module>lib2to3.fixes.fix_getcwdu</module><module>lib2to3.fixes.fix_raw_input</module><module>_ctypes_test</module><module>email.mime</module><module>test.test_mutex</module><module>test.test_argparse</module><module>json.tool</module><module>ctypes.test.test_find</module><module>unittest.main</module><module>multiprocessing.forking</module><module>json.tests.test_decode</module><module>multiprocessing.dummy</module><module>test.test_with</module><module>_bytesio</module><module>ctypes.test.test_returnfuncptrs</module><module>ctypes.test.test_memfunctions</module><module>test.test_sysconfig</module><module>distutils.tests.test_upload</module><module>test.test_py3kwarn</module><module>encodings.mac_romanian</module><module>test.test_dictcomps</module><module>bsddb.test.test_cursor_pget_bug</module><module>multiprocessing.reduction</module><module>test.win_console_handler</module><module>test.datetimetester</module><module>ctypes.test.test_buffers</module><module>lib2to3.fixes.fix_execfile</module><module>test.test_sys_settrace</module><module>ctypes.test.test_structures</module><module>wsgiref</module><module>turtledemo.peace</module><module>multiprocessing.managers</module><module>test.test_old_mailbox</module><module>encodings.mac_farsi</module><module>unittest.loader</module><module>idlelib.AutoComplete</module><module>email.mime.multipart</module><module>bsddb.test.test_dbenv</module><module>lib2to3.tests.test_parser</module><module>importlib.test.extension.util</module><module>lib2to3.fixes.fix_dict</module><module>bsddb.test.test_sequence</module><module>importlib.machinery</module><module>email.test.test_email_renamed</module><module>ctypes.test.test_incomplete</module><module>xml.etree.ElementInclude</module><module>lib2to3.fixes.fix_numliterals</module><module>lib2to3.fixes.fix_map</module><module>_pyio</module><module>_struct</module><module>json.tests.test_separators</module><module>importlib.test.test_util</module><module>test.pydoc_mod</module><module>json.tests.test_float</module><module>unittest.test.test_discovery</module><module>concurrent.futures.thread</module><module>test.make_ssl_certs</module><module>lib2to3.fixes.fix_nonzero</module><module>distutils.tests.setuptools_build_ext</module><module>lib2to3.btm_utils</module><module>genericpath</module><module>spwd</module><module>test.test_defaultdict</module><module>json.tests.test_check_circular</module><module>distutils.tests.test_config_cmd</module><module>concurrent</module><module>importlib.test.test_abc</module><module>email.mime.audio</module><module>test.test_bigaddrspace</module><module>distutils.tests.test_check</module><module>sqlite3.test.userfunctions</module><module>unittest.test.test_assertions</module><module>ctypes.test.test_bitfields</module><module>distutils.tests.test_bdist_wininst</module><module>turtledemo.paint</module><module>test.tracedmodules</module><module>lib2to3.fixes.fix_raise</module><module>idlelib.MultiCall</module><module>test.time_hashlib</module><module>lib2to3.fixes.fix_exec</module><module>urllib.parse</module><module>_elementtree</module><module>test.test_gdb</module><module>test.json_tests.test_pass2</module><module>test.json_tests.test_pass3</module><module>distutils.command.install_egg_info</module><module>wsgiref.util</module><module>json.tests.test_dump</module><module>ctypes.test.test_unaligned_structures</module><module>lib2to3.pygram</module><module>http.server</module><module>tkinter.constants</module><module>test.test_smtpd</module><module>distutils.msvc9compiler</module><module>test.json_tests.test_decode</module><module>multiprocessing</module><module>test.test_kqueue</module><module>unittest.test.support</module><module>lib2to3.pytree</module><module>_thread</module><module>importlib.test</module><module>test.test_cProfile</module><module>distutils.tests.test_spawn</module><module>unittest.suite</module><module>_ctypes</module><module>test.test_reprlib</module><module>json.scanner</module><module>importlib.test.import_.test_packages</module><module>importlib.test.regrtest</module><module>lib2to3.fixes.fix_imports</module><module>test.test_concurrent_futures</module><module>distutils.tests.test_cygwinccompiler</module><module>distutils.tests.setuptools_extension</module><module>tkinter.test</module><module>test.json_tests.test_scanstring</module><module>importlib.test.abc</module><module>lib2to3.main</module><module>distutils.tests.test_msvc9compiler</module><module>test.buffer_tests</module><module>test.encoded_modules</module><module>tkinter.messagebox</module><module>test.outstanding_bugs</module><module>idlelib.HyperParser</module><module>importlib.test.source.test_source_encoding</module><module>test.fork_wait</module><module>_ast</module><module>_datetime</module><module>unittest.test.test_functiontestcase</module><module>importlib.test.source.test_finder</module><module>test.test_telnetlib</module><module>wsgiref.headers</module><module>distutils.tests.test_extension</module><module>importlib.test.import_.test_api</module><module>xml.etree.ElementPath</module><module>tkinter.test.test_ttk.test_extensions</module><module>test.test_int_literal</module><module>importlib._bootstrap</module><module>importlib.test.import_.test_path</module><module>importlib.test.util</module><module>lib2to3.fixes.fix_tuple_params</module><module>test.encoded_modules.module_iso_8859_1</module><module>importlib.test.source</module><module>test.test_numeric_tower</module><module>ctypes.test.test_unicode</module><module>turtledemo.two_canvases</module><module>test.test_zipfile64</module><module>lib2to3.fixes.fix_operator</module><module>lib2to3.fixes.fix_isinstance</module><module>test.test_pydoc</module><module>_weakrefset</module><module>lib2to3.fixes.fix_reduce</module><module>test.test_ftplib</module><module>turtledemo.chaos</module><module>test.test_index</module><module>tkinter.filedialog</module><module>test.test_flufl</module><module>email.mime.text</module><module>sysconfig</module><module>tkinter.__main__</module><module>builtins</module><module>test.test_runpy</module><module>test.test_cprofile</module><module>importlib.test.extension</module><module>pydoc_topics</module><module>lib2to3.tests.test_fixers</module><module>unittest.util</module><module>lib2to3.fixes</module><module>importlib.test.source.util</module><module>test.test_sunau</module><module>test.test_raise</module><module>lib2to3.fixes.fix_intern</module><module>lib2to3.pgen2.driver</module><module>distutils.versionpredicate</module><module>test.test_exception_variations</module><module>turtle</module><module>test.test_wsgiref</module><module>test.json_tests.test_speedups</module><module>test.test_uuid</module><module>unittest.test</module><module>ctypes.util</module><module>lib2to3.fixes.fix_has_key</module><module>distutils.tests.test_versionpredicate</module><module>importlib.test.import_</module><module>test.test_compileall</module><module>lib2to3.tests.test_util</module><module>test.test_email_renamed</module><module>importlib.test.extension.test_finder</module><module>lib2to3.patcomp</module><module>turtledemo</module><module>test.json_tests.test_default</module><module>_string</module><module>sqlite3.test.dump</module><module>test.test_fileio</module><module>lib2to3.tests.test_main</module><module>ctypes.test.test_numbers</module><module>importlib.test.__main__</module><module>test.test_ctypes</module><module>fpectl</module><module>encodings.mac_centeuro</module><module>test.inspect_fodder2</module><module>test.test_SimpleHTTPServer</module><module>test.mock_socket</module><module>ctypes.test.test_random_things</module><module>test.json_tests.test_encode_basestring_ascii</module><module>distutils.tests.test_bdist_rpm</module><module>distutils.config</module><module>test.test_dbm_ndbm</module><module>distutils.tests.test_config</module><module>lib2to3.fixes.fix_repr</module><module>test.test_osx_env</module><module>test.test_modulefinder</module><module>test.test_aifc</module><module>wsgiref.simple_server</module><module>lib2to3.fixes.fix_import</module><module>_hashlib</module><module>test.inspect_fodder</module><module>test.test_platform</module><module>copyreg</module><module>ctypes.test.test_internals</module><module>test.test_docxmlrpc</module><module>concurrent.futures</module><module>xml.etree.cElementTree</module><module>unittest.result</module><module>concurrent.futures._base</module><module>lib2to3.fixes.fix_xrange</module><module>tkinter.test.test_tkinter</module><module>_curses_panel</module><module>future_builtins</module><module>lib2to3.fixes.fix_itertools_imports</module><module>lib2to3.tests</module><module>_io</module><module>sqlite3.test.hooks</module><module>dbm</module><module>_multiprocessing</module><module>lib2to3.fixes.fix_paren</module><module>test.dis_module</module><module>_compat_pickle</module><module>importlib</module><module>json.tests.test_encode_basestring_ascii</module><module>_json</module><module>pyexpat.errors</module><module>ctypes.test.runtests</module><module>cProfile</module><module>tkinter.test.test_tkinter.test_loadtk</module><module>test.test_memoryio</module><module>lib2to3.fixes.fix_itertools</module><module>test.test_rlcompleter</module><module>test.test_sndhdr</module><module>ssl</module><module>test.test_smtplib</module><module>test.test_int</module><module>ctypes.test.test_delattr</module><module>distutils.tests.test_bdist_dumb</module><module>unittest.runner</module><module>test.test_dictviews</module><module>ctypes.wintypes</module><module>test.test_strlit</module><module>test.test_ttk_guionly</module><module>encodings.cp858</module><module>lib2to3.fixes.fix_urllib</module><module>pydoc_data</module><module>test.test_xml_etree_c</module><module>lib2to3.fixes.fix_funcattrs</module><module>plistlib</module><module>multiprocessing.dummy.connection</module><module>unittest.case</module><module>json.tests.test_indent</module><module>distutils.tests.test_dir_util</module><module>test.json_tests.test_float</module><module>tkinter.test.support</module><module>unittest.test.dummy</module><module>lib2to3.tests.test_pytree</module><module>ctypes.test.test_values</module><module>json.tests.test_fail</module><module>_pickle</module><module>lib2to3.fixes.fix_zip</module><module>test.test_structmembers</module><module>bsddb.test.test_replication</module><module>tkinter.dnd</module><module>sqlite3.dump</module><module>test.test_pkgutil</module><module>importlib.test.builtin</module><module>json</module><module>lib2to3.pgen2.tokenize</module><module>turtledemo.round_dance</module><module>test.encoded_modules.module_koi8_r</module><module>test.test_nntplib</module><module>ctypes.test.test_sizes</module><module>tkinter</module><module>ctypes.test.test_arrays</module><module>sqlite3.test.transactions</module><module>ctypes.test.test_strings</module><module>ctypes.test.test_objects</module><module>lib2to3.fixes.fix_basestring</module><module>distutils.tests.test_install_headers</module><module>test.test_importlib</module><module>ctypes.test.test_refcounts</module><module>sqlite3.test.dbapi</module><module>test.test_smtpnet</module><module>tkinter.colorchooser</module><module>encodings.utf_32_be</module><module>test.test_tk</module><module>turtledemo.penrose</module><module>test.json_tests.test_dump</module><module>lib2to3.fixes.fix_throw</module><module>test.test_ssl</module><module>test.test_xdrlib</module><module>html</module><module>email.test.test_email_codecs_renamed</module><module>dbm.ndbm</module><module>turtledemo.wikipedia</module><module>http</module><module>unittest.test.test_loader</module><module>ctypes.test.test_struct_fields</module><module>bsddb.test.test_db</module><module>xmlrpc.server</module><module>ctypes.test.test_parameters</module><module>urllib.error</module><module>distutils.tests.test_build_clib</module><module>json.tests.test_pass2</module><module>json.tests.test_pass3</module><module>json.tests.test_pass1</module><module>test.test_weakset</module><module>test.test_strtod</module><module>test.test_io</module><module>html.entities</module><module>test.gdb_sample</module><module>http.client</module><module>test.test_msilib</module><module>ctypes.test.test_repr</module><module>importlib.test.frozen</module><module>_dbm</module><module>multiprocessing.sharedctypes</module><module>encodings.utf_32_le</module><module>test.curses_tests</module><module>tkinter.simpledialog</module><module>importlib.test.builtin.util</module><module>test.test_codecencodings_iso2022</module><module>xmlrpc</module><module>test.test_unpack_ex</module><module>importlib.abc</module><module>distutils.tests.test_version</module><module>test.test_bytes</module><module>tkinter.test.test_tkinter.test_text</module><module>turtledemo.__main__</module><module>test.support</module><module>test.test_urllib2_localnet</module><module>test.test_syslog</module><module>multiprocessing.process</module><module>distutils.tests.test_register</module><module>importlib.test.source.test_abc_loader</module><module>importlib.test.test_api</module><module>test.test_code</module><module>test.test_super</module><module>lib2to3.fixes.fix_next</module><module>tkinter.test.runtktests</module><module>test.test_genericpath</module><module>distutils.tests.test_sysconfig</module><module>test.test_listcomps</module><module>test.test_functools</module><module>test.test_ast</module><module>http.cookiejar</module><module>lib2to3.fixes.fix_set_literal</module><module>distutils.tests.test_dep_util</module><module>idlelib.RstripExtension</module><module>test.test_ascii_formatd</module><module>lib2to3.fixes.fix_future</module><module>json.tests.test_default</module><module>sqlite3.dbapi2</module><module>test.relimport</module><module>unittest.test.test_suite</module><module>_functools</module><module>test.lock_tests</module><module>lib2to3.pgen2.token</module><module>test.test_typechecks</module><module>ctypes.macholib.framework</module><module>idlelib.AutoCompleteWindow</module><module>lib2to3.fixes.fix_except</module><module>importlib.test.builtin.test_loader</module><module>sqlite3.test.regression</module><module>test.json_tests.test_unicode</module><module>lib2to3.tests.support</module><module>distutils.command.check</module><module>urllib.robotparser</module><module>multiprocessing.connection</module><module>test.test_fractions</module><module>test.test_abc</module><module>_warnings</module><module>importlib.test.extension.test_loader</module><module>lib2to3.fixes.fix_ne</module><module>test.test_buffer</module><module>lib2to3.fixes.fix_filter</module><module>importlib.test.source.test_case_sensitivity</module><module>wsgiref.validate</module><module>turtledemo.tree</module><module>_types</module><module>test.test_pdb</module><module>test.test_timeit</module><module>lib2to3.pgen2.literals</module><module>email.mime.base</module><module>ctypes.test.test_as_parameter</module><module>test.test_bigmem</module><module>ctypes.test.test_frombuffer</module><module>test.test_undocumented_details</module><module>test.test_pstats</module><module>contextlib</module><module>email.mime.nonmultipart</module><module>test.test_pipes</module><module>lib2to3.fixes.fix_sys_exc</module><module>test.test_poplib</module><module>test.test_metaclass</module><module>ctypes.test.test_varsize_struct</module><module>_abcoll</module><module>lib2to3.__main__</module><module>importlib.test.import_.util</module><module>test.test_startfile</module><module>unittest.signals</module><module>ctypes.test.test_errno</module><module>test.test_pep352</module><module>distutils.tests.test_cmd</module><module>bsddb.test.test_compare</module><module>test.test_json</module><module>test.test_httpservers</module><func>bytearray</func><func>all</func><func>memoryview</func><func>next</func><func>bin</func><func>bytes</func><func>ascii</func><func>format</func><func>any</func><func>print</func></python><python version="2.5"><module>importlib.test.source.test_file_loader</module><module>test.test_future_builtins</module><module>_dummy_thread</module><module>pydoc_data.topics</module><module>test.test_epoll</module><module>dbm.gnu</module><module>tkinter.test.test_tkinter.test_font</module><module>lib2to3.fixer_util</module><module>importlib.test.import_.test_caching</module><module>bsddb.test.test_distributed_transactions</module><module>antigravity</module><module>json.encoder</module><module>test.test_future5</module><module>test.test_future4</module><module>test.json_tests.test_recursion</module><module>multiprocessing.pool</module><module>tkinter._fix</module><module>test.ssl_servers</module><module>lib2to3.fixes.fix_methodattrs</module><module>turtledemo.minimal_hanoi</module><module>turtledemo.fractalcurves</module><module>turtledemo.lindenmayer</module><module>test.test_abstract_numbers</module><module>ctypes.test.test_pickling</module><module>lib2to3.fixer_base</module><module>lib2to3.fixes.fix_types</module><module>ctypes.test.test_pep3118</module><module>test.json_tests.test_separators</module><module>importlib.test.import_.test___package__</module><module>importlib.test.benchmark</module><module>json.tests.test_unicode</module><module>turtledemo.colormixer</module><module>lib2to3.fixes.fix_xreadlines</module><module>tkinter.ttk</module><module>distutils.tests.test_core</module><module>encodings.cp720</module><module>test.json_tests</module><module>unittest.test.test_result</module><module>test.test_sched</module><module>turtledemo.yinyang</module><module>test.test_xmlrpc_net</module><module>test.test_sys_setprofile</module><module>tkinter.test.test_ttk</module><module>test.test_ttk_textonly</module><module>fractions</module><module>importlib.test.source.test_path_hook</module><module>reconvert</module><module>bsddb.test.test_fileid</module><module>tkinter.font</module><module>unittest.__main__</module><module>tkinter.commondialog</module><module>lib2to3.fixes.fix_apply</module><module>test.test_keywordonlyarg</module><module>test.test_setcomps</module><module>test.test_collections</module><module>json.tests.test_speedups</module><module>json.tests.test_recursion</module><module>numbers</module><module>test.test_cmd</module><module>email.MIMEBase</module><module>lib2to3.fixes.fix_long</module><module>concurrent.futures.process</module><module>distutils.tests.test_build</module><module>test.test_urllib_response</module><module>idlelib.tabbedpages</module><module>urllib.request</module><module>test.test_print</module><module>argparse</module><module>test.test_multiprocessing</module><module>test.test_dbm_gnu</module><module>importlib.util</module><module>test.json_tests.test_pass1</module><module>turtledemo.bytedesign</module><module>lib2to3.pgen2.pgen</module><module>distutils.tests.test_install_data</module><module>test.script_helper</module><module>test.test_readline</module><module>unittest.test.test_break</module><module>multiprocessing.synchronize</module><module>multiprocessing.heap</module><module>test.test_dynamic</module><module>lib2to3.fixes.fix_imports2</module><module>lib2to3.fixes.fix_unicode</module><module>test.test_pep3120</module><module>distutils.tests.test_log</module><module>test.test_asyncore</module><module>importlib.test.builtin.test_finder</module><module>distutils.tests.test_build_ext</module><module>test.test_http_cookiejar</module><module>ast</module><module>test.test_html</module><module>sqlite3.test.py25tests</module><module>lib2to3.refactor</module><module>unittest.test.test_setups</module><module>distutils.tests.test_install_lib</module><module>test.test_pep3131</module><module>test.__main__</module><module>test.badsyntax_pep3120</module><module>_collections</module><module>lib2to3.fixes.fix_metaclass</module><module>tkinter.test.test_ttk.test_functions</module><module>turtledemo.planet_and_moon</module><module>unittest.test._test_warnings</module><module>distutils.tests.test_sdist</module><module>importlib.test.frozen.test_loader</module><module>test.test_lib2to3</module><module>lib2to3.fixes.fix_idioms</module><module>unittest.test.test_skipping</module><module>tkinter.tix</module><module>_posixsubprocess</module><module>_curses</module><module>turtledemo.clock</module><module>_fileio</module><module>reprlib</module><module>lib2to3.fixes.fix_print</module><module>test.test_range</module><module>xmlrpc.client</module><module>lib2to3.fixes.fix_callable</module><module>lib2to3</module><module>lib2to3.fixes.fix_standarderror</module><module>abc</module><module>importlib.test.extension.test_case_sensitivity</module><module>test.test_copyreg</module><module>distutils.tests.test_ccompiler</module><module>unittest.test.test_case</module><module>distutils.tests.test_text_file</module><module>test.json_tests.test_indent</module><module>tkinter.dialog</module><module>regex_syntax</module><module>test.test_memoryview</module><module>json.tests.test_scanstring</module><module>json.tests</module><module>importlib.test.import_.test_fromlist</module><module>lib2to3.btm_matcher</module><module>distutils.tests.test_util</module><module>_markupbase</module><module>test.test_regex</module><module>importlib.test.import_.test_meta_path</module><module>lib2to3.tests.pytree_idempotency</module><module>lib2to3.fixes.fix_buffer</module><module>turtledemo.forest</module><module>tkinter.test.test_ttk.test_widgets</module><module>test.warning_tests</module><module>lib2to3.pgen2.conv</module><module>importlib.test.frozen.test_finder</module><module>lib2to3.fixes.fix_renames</module><module>test.test_file2k</module><module>bsddb.test.test_early_close</module><module>html.parser</module><module>ctypes.test.test_bytes</module><module>test.test_univnewlines2k</module><module>test.test_linecache</module><module>lib2to3.pgen2.parse</module><module>lib2to3.fixes.fix_input</module><module>urllib.response</module><module>distutils.tests.test_unixccompiler</module><module>distutils.tests.test_clean</module><module>multiprocessing.util</module><module>lib2to3.pgen2</module><module>test.test_zipimport_support</module><module>build_class</module><module>http.cookies</module><module>lib2to3.fixes.fix_exitfunc</module><module>test.json_tests.test_fail</module><module>test.badsyntax_3131</module><module>lib2to3.tests.test_all_fixers</module><module>test.profilee</module><module>_stringio</module><module>tkinter.scrolledtext</module><module>test.tracedmodules.testmod</module><module>importlib.test.extension.test_path_hook</module><module>importlib.test.import_.test_relative_imports</module><module>distutils.tests.test_bdist_msi</module><module>encodings.utf_32</module><module>turtledemo.nim</module><module>lib2to3.fixes.fix_ws_comma</module><module>lib2to3.pgen2.grammar</module><module>test.test_cmd_line_script</module><module>distutils.tests.test_file_util</module><module>tkinter.test.test_ttk.test_style</module><module>test.test_http_cookies</module><module>json.decoder</module><module>unittest.test.test_program</module><module>lib2to3.tests.test_refactor</module><module>io</module><module>multiprocessing.queues</module><module>dbm.dumb</module><module>unittest.test.test_runner</module><module>test.test_property</module><module>test.test_macos</module><module>distutils.tests.test_filelist</module><module>distutils.tests.test_bdist</module><module>test.test_dbm_dumb</module><module>distutils.tests.test_archive_util</module><module>lib2to3.fixes.fix_getcwdu</module><module>lib2to3.fixes.fix_raw_input</module><module>test.test_mutex</module><module>test.test_argparse</module><module>json.tool</module><module>unittest.main</module><module>multiprocessing.forking</module><module>json.tests.test_decode</module><module>multiprocessing.dummy</module><module>_bytesio</module><module>test.test_sysconfig</module><module>distutils.tests.test_upload</module><module>test.test_py3kwarn</module><module>test.test_dictcomps</module><module>multiprocessing.reduction</module><module>test.win_console_handler</module><module>test.datetimetester</module><module>lib2to3.fixes.fix_execfile</module><module>whrandom</module><module>test.test_sys_settrace</module><module>turtledemo.peace</module><module>multiprocessing.managers</module><module>unittest.loader</module><module>bsddb.test.test_dbenv</module><module>lib2to3.tests.test_parser</module><module>importlib.test.extension.util</module><module>lib2to3.fixes.fix_dict</module><module>importlib.machinery</module><module>lib2to3.fixes.fix_numliterals</module><module>lib2to3.fixes.fix_map</module><module>_pyio</module><module>json.tests.test_separators</module><module>importlib.test.test_util</module><module>test.pydoc_mod</module><module>json.tests.test_float</module><module>tzparse</module><module>unittest.test.test_discovery</module><module>concurrent.futures.thread</module><module>test.make_ssl_certs</module><module>lib2to3.fixes.fix_nonzero</module><module>distutils.tests.setuptools_build_ext</module><module>lib2to3.btm_utils</module><module>genericpath</module><module>json.tests.test_check_circular</module><module>distutils.tests.test_config_cmd</module><module>concurrent</module><module>importlib.test.test_abc</module><module>distutils.tests.test_check</module><module>unittest.test.test_assertions</module><module>distutils.tests.test_bdist_wininst</module><module>test.test_timing</module><module>turtledemo.paint</module><module>test.tracedmodules</module><module>lib2to3.fixes.fix_raise</module><module>lib2to3.fixes.fix_exec</module><module>urllib.parse</module><module>test.test_gdb</module><module>test.json_tests.test_pass2</module><module>test.json_tests.test_pass3</module><module>json.tests.test_dump</module><module>lib2to3.pygram</module><module>http.server</module><module>tkinter.constants</module><module>test.test_smtpd</module><module>distutils.msvc9compiler</module><module>test.json_tests.test_decode</module><module>multiprocessing</module><module>test.test_kqueue</module><module>unittest.test.support</module><module>lib2to3.pytree</module><module>_thread</module><module>importlib.test</module><module>distutils.tests.test_spawn</module><module>unittest.suite</module><module>test.test_reprlib</module><module>json.scanner</module><module>importlib.test.import_.test_packages</module><module>importlib.test.regrtest</module><module>lib2to3.fixes.fix_imports</module><module>test.test_concurrent_futures</module><module>distutils.tests.test_cygwinccompiler</module><module>distutils.tests.setuptools_extension</module><module>tkinter.test</module><module>test.json_tests.test_scanstring</module><module>importlib.test.abc</module><module>lib2to3.main</module><module>regex</module><module>email.MIMEMessage</module><module>distutils.tests.test_msvc9compiler</module><module>test.buffer_tests</module><module>test.encoded_modules</module><module>tkinter.messagebox</module><module>importlib.test.source.test_source_encoding</module><module>_datetime</module><module>unittest.test.test_functiontestcase</module><module>importlib.test.source.test_finder</module><module>test.test_telnetlib</module><module>distutils.tests.test_extension</module><module>importlib.test.import_.test_api</module><module>tkinter.test.test_ttk.test_extensions</module><module>test.test_int_literal</module><module>importlib._bootstrap</module><module>importlib.test.import_.test_path</module><module>importlib.test.util</module><module>lib2to3.fixes.fix_tuple_params</module><module>test.encoded_modules.module_iso_8859_1</module><module>importlib.test.source</module><module>test.test_numeric_tower</module><module>turtledemo.two_canvases</module><module>lib2to3.fixes.fix_operator</module><module>lib2to3.fixes.fix_isinstance</module><module>test.test_pydoc</module><module>_weakrefset</module><module>lib2to3.fixes.fix_reduce</module><module>test.test_ftplib</module><module>turtledemo.chaos</module><module>tkinter.filedialog</module><module>test.test_flufl</module><module>sysconfig</module><module>email.MIMEImage</module><module>tkinter.__main__</module><module>email.MIMEText</module><module>builtins</module><module>test.test_cprofile</module><module>importlib.test.extension</module><module>pydoc_topics</module><module>lib2to3.tests.test_fixers</module><module>unittest.util</module><module>lib2to3.fixes</module><module>importlib.test.source.util</module><module>test.test_sunau</module><module>test.test_raise</module><module>lib2to3.fixes.fix_intern</module><module>lib2to3.pgen2.driver</module><module>turtle</module><module>test.json_tests.test_speedups</module><module>unittest.test</module><module>lib2to3.fixes.fix_has_key</module><module>importlib.test.import_</module><module>test.test_compileall</module><module>lib2to3.tests.test_util</module><module>importlib.test.extension.test_finder</module><module>lib2to3.patcomp</module><module>turtledemo</module><module>test.json_tests.test_default</module><module>_string</module><module>idlelib.buildapp</module><module>sqlite3.test.dump</module><module>test.test_fileio</module><module>lib2to3.tests.test_main</module><module>importlib.test.__main__</module><module>fpectl</module><module>test.test_SimpleHTTPServer</module><module>test.mock_socket</module><module>test.json_tests.test_encode_basestring_ascii</module><module>distutils.tests.test_bdist_rpm</module><module>distutils.config</module><module>test.test_dbm_ndbm</module><module>distutils.tests.test_config</module><module>lib2to3.fixes.fix_repr</module><module>test.test_osx_env</module><module>test.test_modulefinder</module><module>test.test_aifc</module><module>lib2to3.fixes.fix_import</module><module>copyreg</module><module>test.test_docxmlrpc</module><module>concurrent.futures</module><module>unittest.result</module><module>concurrent.futures._base</module><module>statcache</module><module>lib2to3.fixes.fix_xrange</module><module>tkinter.test.test_tkinter</module><module>_curses_panel</module><module>future_builtins</module><module>lib2to3.fixes.fix_itertools_imports</module><module>lib2to3.tests</module><module>_io</module><module>dbm</module><module>_multiprocessing</module><module>lib2to3.fixes.fix_paren</module><module>test.dis_module</module><module>_compat_pickle</module><module>importlib</module><module>json.tests.test_encode_basestring_ascii</module><module>_json</module><module>tkinter.test.test_tkinter.test_loadtk</module><module>test.test_memoryio</module><module>lib2to3.fixes.fix_itertools</module><module>test.test_rlcompleter</module><module>test.test_sndhdr</module><module>ssl</module><module>timing</module><module>test.test_smtplib</module><module>test.test_int</module><module>distutils.tests.test_bdist_dumb</module><module>unittest.runner</module><module>test.test_dictviews</module><module>test.test_strlit</module><module>test.test_ttk_guionly</module><module>encodings.cp858</module><module>lib2to3.fixes.fix_urllib</module><module>pydoc_data</module><module>lib2to3.fixes.fix_funcattrs</module><module>plistlib</module><module>multiprocessing.dummy.connection</module><module>unittest.case</module><module>json.tests.test_indent</module><module>distutils.tests.test_dir_util</module><module>test.json_tests.test_float</module><module>tkinter.test.support</module><module>unittest.test.dummy</module><module>lib2to3.tests.test_pytree</module><module>json.tests.test_fail</module><module>_pickle</module><module>email.MIMEMultipart</module><module>lib2to3.fixes.fix_zip</module><module>bsddb.test.test_replication</module><module>tkinter.dnd</module><module>sqlite3.dump</module><module>test.test_pkgutil</module><module>importlib.test.builtin</module><module>json</module><module>lib2to3.pgen2.tokenize</module><module>turtledemo.round_dance</module><module>test.encoded_modules.module_koi8_r</module><module>test.test_nntplib</module><module>tkinter</module><module>email.MIMENonMultipart</module><module>lib2to3.fixes.fix_basestring</module><module>distutils.tests.test_install_headers</module><module>test.test_importlib</module><module>test.test_smtpnet</module><module>tkinter.colorchooser</module><module>encodings.utf_32_be</module><module>test.test_tk</module><module>turtledemo.penrose</module><module>test.json_tests.test_dump</module><module>lib2to3.fixes.fix_throw</module><module>test.test_ssl</module><module>html</module><module>dbm.ndbm</module><module>turtledemo.wikipedia</module><module>http</module><module>unittest.test.test_loader</module><module>bsddb.test.test_db</module><module>xmlrpc.server</module><module>urllib.error</module><module>distutils.tests.test_build_clib</module><module>json.tests.test_pass2</module><module>json.tests.test_pass3</module><module>json.tests.test_pass1</module><module>test.test_weakset</module><module>test.test_strtod</module><module>test.test_io</module><module>html.entities</module><module>test.gdb_sample</module><module>http.client</module><module>test.test_msilib</module><module>importlib.test.frozen</module><module>_dbm</module><module>multiprocessing.sharedctypes</module><module>encodings.utf_32_le</module><module>test.curses_tests</module><module>tkinter.simpledialog</module><module>importlib.test.builtin.util</module><module>test.test_codecencodings_iso2022</module><module>xmlrpc</module><module>test.test_unpack_ex</module><module>importlib.abc</module><module>distutils.tests.test_version</module><module>test.test_bytes</module><module>tkinter.test.test_tkinter.test_text</module><module>turtledemo.__main__</module><module>test.support</module><module>test.test_syslog</module><module>multiprocessing.process</module><module>distutils.tests.test_register</module><module>importlib.test.source.test_abc_loader</module><module>importlib.test.test_api</module><module>test.test_super</module><module>lib2to3.fixes.fix_next</module><module>tkinter.test.runtktests</module><module>test.test_genericpath</module><module>distutils.tests.test_sysconfig</module><module>email.MIMEAudio</module><module>test.test_listcomps</module><module>http.cookiejar</module><module>lib2to3.fixes.fix_set_literal</module><module>distutils.tests.test_dep_util</module><module>idlelib.RstripExtension</module><module>test.test_ascii_formatd</module><module>lib2to3.fixes.fix_future</module><module>json.tests.test_default</module><module>test.relimport</module><module>unittest.test.test_suite</module><module>test.lock_tests</module><module>lib2to3.pgen2.token</module><module>test.test_typechecks</module><module>lib2to3.fixes.fix_except</module><module>importlib.test.builtin.test_loader</module><module>test.json_tests.test_unicode</module><module>lib2to3.tests.support</module><module>distutils.command.check</module><module>urllib.robotparser</module><module>multiprocessing.connection</module><module>regsub</module><module>test.test_fractions</module><module>test.test_abc</module><module>_warnings</module><module>importlib.test.extension.test_loader</module><module>lib2to3.fixes.fix_ne</module><module>test.test_buffer</module><module>lib2to3.fixes.fix_filter</module><module>importlib.test.source.test_case_sensitivity</module><module>turtledemo.tree</module><module>test.test_pdb</module><module>test.test_timeit</module><module>lib2to3.pgen2.literals</module><module>ctypes.test.test_frombuffer</module><module>test.test_undocumented_details</module><module>test.test_pstats</module><module>test.test_pipes</module><module>lib2to3.fixes.fix_sys_exc</module><module>test.test_poplib</module><module>test.test_metaclass</module><module>_abcoll</module><module>lib2to3.__main__</module><module>importlib.test.import_.util</module><module>unittest.signals</module><module>ctypes.test.test_errno</module><module>distutils.tests.test_cmd</module><module>test.test_json</module><module>test.test_httpservers</module><func>bytearray</func><func>memoryview</func><func>next</func><func>bin</func><func>bytes</func><func>ascii</func><func>format</func><func>print</func></python><python version="2.6"><module>importlib.test.source.test_file_loader</module><module>_dummy_thread</module><module>bsddb.test.test_env_close</module><module>pydoc_data.topics</module><module>dbm.gnu</module><module>tkinter.test.test_tkinter.test_font</module><module>importlib.test.import_.test_caching</module><module>antigravity</module><module>test.json_tests.test_recursion</module><module>tkinter._fix</module><module>test.ssl_servers</module><module>turtledemo.minimal_hanoi</module><module>turtledemo.fractalcurves</module><module>turtledemo.lindenmayer</module><module>test.json_tests.test_separators</module><module>importlib.test.import_.test___package__</module><module>importlib.test.benchmark</module><module>turtledemo.colormixer</module><module>tkinter.ttk</module><module>encodings.cp720</module><module>test.json_tests</module><module>unittest.test.test_result</module><module>test.test_sched</module><module>turtledemo.yinyang</module><module>test.test_xmlrpc_net</module><module>test.test_sys_setprofile</module><module>tkinter.test.test_ttk</module><module>test.test_ttk_textonly</module><module>importlib.test.source.test_path_hook</module><module>reconvert</module><module>bsddb.test.test_fileid</module><module>tkinter.font</module><module>unittest.__main__</module><module>tkinter.commondialog</module><module>test.test_keywordonlyarg</module><module>test.test_setcomps</module><module>email.MIMEBase</module><module>concurrent.futures.process</module><module>test.test_operations</module><module>distutils.tests.test_build</module><module>test.test_urllib_response</module><module>urllib.request</module><module>argparse</module><module>test.test_dbm_gnu</module><module>importlib.util</module><module>test.json_tests.test_pass1</module><module>turtledemo.bytedesign</module><module>psycopg2</module><module>distutils.tests.test_install_data</module><module>test.script_helper</module><module>unittest.test.test_break</module><module>test.test_dynamic</module><module>test.test_pep3120</module><module>distutils.tests.test_log</module><module>importlib.test.builtin.test_finder</module><module>test.test_http_cookiejar</module><module>test.test_html</module><module>unittest.test.test_setups</module><module>test.test_pep3131</module><module>test.__main__</module><module>test.badsyntax_pep3120</module><module>tkinter.test.test_ttk.test_functions</module><module>turtledemo.planet_and_moon</module><module>unittest.test._test_warnings</module><module>importlib.test.frozen.test_loader</module><module>idlelib.tabpage</module><module>unittest.test.test_skipping</module><module>tkinter.tix</module><module>_posixsubprocess</module><module>_curses</module><module>turtledemo.clock</module><module>reprlib</module><module>test.test_range</module><module>xmlrpc.client</module><module>importlib.test.extension.test_case_sensitivity</module><module>test.test_copyreg</module><module>distutils.tests.test_ccompiler</module><module>unittest.test.test_case</module><module>distutils.tests.test_text_file</module><module>test.json_tests.test_indent</module><module>tkinter.dialog</module><module>regex_syntax</module><module>test.test_memoryview</module><module>importlib.test.import_.test_fromlist</module><module>lib2to3.btm_matcher</module><module>_markupbase</module><module>test.test_regex</module><module>importlib.test.import_.test_meta_path</module><module>turtledemo.forest</module><module>tkinter.test.test_ttk.test_widgets</module><module>importlib.test.frozen.test_finder</module><module>test.test_file2k</module><module>html.parser</module><module>ctypes.test.test_bytes</module><module>test.test_univnewlines2k</module><module>urllib.response</module><module>distutils.tests.test_clean</module><module>build_class</module><module>http.cookies</module><module>test.json_tests.test_fail</module><module>test.badsyntax_3131</module><module>_stringio</module><module>test.test_macfs</module><module>tkinter.scrolledtext</module><module>test.tracedmodules.testmod</module><module>importlib.test.extension.test_path_hook</module><module>importlib.test.import_.test_relative_imports</module><module>distutils.tests.test_bdist_msi</module><module>turtledemo.nim</module><module>distutils.tests.test_file_util</module><module>tkinter.test.test_ttk.test_style</module><module>test.test_http_cookies</module><module>unittest.test.test_program</module><module>dbm.dumb</module><module>unittest.test.test_runner</module><module>distutils.tests.test_bdist</module><module>test.test_dbm_dumb</module><module>distutils.tests.test_archive_util</module><module>test.test_argparse</module><module>unittest.main</module><module>test.test_sysconfig</module><module>test.test_dictcomps</module><module>test.win_console_handler</module><module>test.datetimetester</module><module>whrandom</module><module>test.test_sys_settrace</module><module>turtledemo.peace</module><module>unittest.loader</module><module>bsddb.test.test_dbenv</module><module>importlib.test.extension.util</module><module>test.test_rgbimg</module><module>psycopg2._psycopg</module><module>importlib.machinery</module><module>_pyio</module><module>importlib.test.test_util</module><module>tzparse</module><module>unittest.test.test_discovery</module><module>concurrent.futures.thread</module><module>test.make_ssl_certs</module><module>lib2to3.btm_utils</module><module>json.tests.test_check_circular</module><module>distutils.tests.test_config_cmd</module><module>concurrent</module><module>importlib.test.test_abc</module><module>distutils.tests.test_check</module><module>unittest.test.test_assertions</module><module>test.test_timing</module><module>turtledemo.paint</module><module>test.tracedmodules</module><module>urllib.parse</module><module>test.test_gdb</module><module>test.json_tests.test_pass2</module><module>test.json_tests.test_pass3</module><module>http.server</module><module>tkinter.constants</module><module>test.test_smtpd</module><module>test.json_tests.test_decode</module><module>unittest.test.support</module><module>_thread</module><module>importlib.test</module><module>test.test_cProfile</module><module>distutils.tests.test_spawn</module><module>unittest.suite</module><module>test.test_reprlib</module><module>importlib.test.import_.test_packages</module><module>importlib.test.regrtest</module><module>test.test_concurrent_futures</module><module>distutils.tests.test_cygwinccompiler</module><module>tkinter.test</module><module>test.json_tests.test_scanstring</module><module>importlib.test.abc</module><module>regex</module><module>email.MIMEMessage</module><module>test.encoded_modules</module><module>tkinter.messagebox</module><module>importlib.test.source.test_source_encoding</module><module>_datetime</module><module>unittest.test.test_functiontestcase</module><module>importlib.test.source.test_finder</module><module>distutils.tests.test_extension</module><module>importlib.test.import_.test_api</module><module>tkinter.test.test_ttk.test_extensions</module><module>importlib._bootstrap</module><module>importlib.test.import_.test_path</module><module>importlib.test.util</module><module>test.encoded_modules.module_iso_8859_1</module><module>importlib.test.source</module><module>test.test_numeric_tower</module><module>turtledemo.two_canvases</module><module>_weakrefset</module><module>turtledemo.chaos</module><module>tkinter.filedialog</module><module>test.test_flufl</module><module>sysconfig</module><module>email.MIMEImage</module><module>tkinter.__main__</module><module>email.MIMEText</module><module>builtins</module><module>importlib.test.extension</module><module>gopherlib</module><module>unittest.util</module><module>importlib.test.source.util</module><module>test.test_sunau</module><module>test.test_raise</module><module>turtle</module><module>bsddb.test.test_1413192</module><module>test.json_tests.test_speedups</module><module>unittest.test</module><module>importlib.test.import_</module><module>test.test_compileall</module><module>importlib.test.extension.test_finder</module><module>turtledemo</module><module>test.json_tests.test_default</module><module>_string</module><module>idlelib.buildapp</module><module>importlib.test.__main__</module><module>fpectl</module><module>test.mock_socket</module><module>test.json_tests.test_encode_basestring_ascii</module><module>distutils.tests.test_bdist_rpm</module><module>test.test_dbm_ndbm</module><module>test.test_osx_env</module><module>copyreg</module><module>concurrent.futures</module><module>unittest.result</module><module>concurrent.futures._base</module><module>statcache</module><module>tkinter.test.test_tkinter</module><module>_curses_panel</module><module>_io</module><module>dbm</module><module>test.dis_module</module><module>_compat_pickle</module><module>importlib</module><module>tkinter.test.test_tkinter.test_loadtk</module><module>test.test_rlcompleter</module><module>test.test_sndhdr</module><module>timing</module><module>distutils.tests.test_bdist_dumb</module><module>unittest.runner</module><module>test.test_dictviews</module><module>test.test_strlit</module><module>test.test_ttk_guionly</module><module>encodings.cp858</module><module>pydoc_data</module><module>unittest.case</module><module>distutils.tests.test_dir_util</module><module>test.json_tests.test_float</module><module>tkinter.test.support</module><module>unittest.test.dummy</module><module>_pickle</module><module>email.MIMEMultipart</module><module>tkinter.dnd</module><module>importlib.test.builtin</module><module>turtledemo.round_dance</module><module>test.encoded_modules.module_koi8_r</module><module>test.test_nntplib</module><module>tkinter</module><module>email.MIMENonMultipart</module><module>distutils.tests.test_install_headers</module><module>test.test_importlib</module><module>tkinter.colorchooser</module><module>test.test_tk</module><module>turtledemo.penrose</module><module>test.json_tests.test_dump</module><module>html</module><module>dbm.ndbm</module><module>turtledemo.wikipedia</module><module>http</module><module>unittest.test.test_loader</module><module>test.test_hexoct</module><module>bsddb.test.test_db</module><module>xmlrpc.server</module><module>urllib.error</module><module>distutils.tests.test_build_clib</module><module>test.test_weakset</module><module>test.test_strtod</module><module>html.entities</module><module>test.gdb_sample</module><module>http.client</module><module>test.test_msilib</module><module>importlib.test.frozen</module><module>_dbm</module><module>tkinter.simpledialog</module><module>importlib.test.builtin.util</module><module>test.test_codecencodings_iso2022</module><module>xmlrpc</module><module>test.test_unpack_ex</module><module>importlib.abc</module><module>distutils.tests.test_version</module><module>tkinter.test.test_tkinter.test_text</module><module>turtledemo.__main__</module><module>test.support</module><module>test.test_syslog</module><module>importlib.test.source.test_abc_loader</module><module>importlib.test.test_api</module><module>test.test_super</module><module>tkinter.test.runtktests</module><module>email.MIMEAudio</module><module>test.test_listcomps</module><module>http.cookiejar</module><module>distutils.tests.test_dep_util</module><module>idlelib.RstripExtension</module><module>test.test_ascii_formatd</module><module>unittest.test.test_suite</module><module>importlib.test.builtin.test_loader</module><module>test.json_tests.test_unicode</module><module>distutils.command.check</module><module>urllib.robotparser</module><module>regsub</module><module>importlib.test.extension.test_loader</module><module>importlib.test.source.test_case_sensitivity</module><module>turtledemo.tree</module><module>test.test_socket_ssl</module><module>_types</module><module>test.test_pdb</module><module>test.test_timeit</module><module>test.test_metaclass</module><module>lib2to3.__main__</module><module>importlib.test.import_.util</module><module>unittest.signals</module><module>distutils.tests.test_cmd</module><func>memoryview</func><func>ascii</func></python><python version="2.7"><module>importlib.test.source.test_file_loader</module><module>_dummy_thread</module><module>bsddb.test.test_env_close</module><module>dbm.gnu</module><module>tkinter.test.test_tkinter.test_font</module><module>importlib.test.import_.test_caching</module><module>test.json_tests.test_recursion</module><module>tkinter._fix</module><module>test.ssl_servers</module><module>turtledemo.minimal_hanoi</module><module>turtledemo.fractalcurves</module><module>turtledemo.lindenmayer</module><module>test.json_tests.test_separators</module><module>importlib.test.import_.test___package__</module><module>importlib.test.benchmark</module><module>turtledemo.colormixer</module><module>tkinter.ttk</module><module>test.json_tests</module><module>test.test_sched</module><module>turtledemo.yinyang</module><module>test.test_xmlrpc_net</module><module>tkinter.test.test_ttk</module><module>importlib.test.source.test_path_hook</module><module>reconvert</module><module>tkinter.font</module><module>tkinter.commondialog</module><module>test.test_keywordonlyarg</module><module>test.test_profilehooks</module><module>email.MIMEBase</module><module>concurrent.futures.process</module><module>test.test_operations</module><module>test.test_urllib_response</module><module>urllib.request</module><module>test.test_dbm_gnu</module><module>importlib.util</module><module>test.json_tests.test_pass1</module><module>turtledemo.bytedesign</module><module>psycopg2</module><module>test.test_dynamic</module><module>test.test_pep3120</module><module>distutils.tests.test_log</module><module>importlib.test.builtin.test_finder</module><module>test.test_http_cookiejar</module><module>test.test_html</module><module>test.test_pep3131</module><module>test.__main__</module><module>test.badsyntax_pep3120</module><module>tkinter.test.test_ttk.test_functions</module><module>turtledemo.planet_and_moon</module><module>unittest.test._test_warnings</module><module>importlib.test.frozen.test_loader</module><module>idlelib.tabpage</module><module>tkinter.tix</module><module>_posixsubprocess</module><module>_curses</module><module>turtledemo.clock</module><module>_fileio</module><module>reprlib</module><module>test.test_range</module><module>xmlrpc.client</module><module>importlib.test.extension.test_case_sensitivity</module><module>test.test_copyreg</module><module>test.json_tests.test_indent</module><module>tkinter.dialog</module><module>regex_syntax</module><module>importlib.test.import_.test_fromlist</module><module>_markupbase</module><module>test.test_regex</module><module>importlib.test.import_.test_meta_path</module><module>turtledemo.forest</module><module>tkinter.test.test_ttk.test_widgets</module><module>test.cjkencodings_test</module><module>importlib.test.frozen.test_finder</module><module>html.parser</module><module>ctypes.test.test_bytes</module><module>urllib.response</module><module>build_class</module><module>http.cookies</module><module>test.json_tests.test_fail</module><module>test.badsyntax_3131</module><module>_stringio</module><module>test.test_macfs</module><module>tkinter.scrolledtext</module><module>importlib.test.extension.test_path_hook</module><module>importlib.test.import_.test_relative_imports</module><module>turtledemo.nim</module><module>tkinter.test.test_ttk.test_style</module><module>test.test_http_cookies</module><module>dbm.dumb</module><module>test.test_dbm_dumb</module><module>_bytesio</module><module>test.datetimetester</module><module>whrandom</module><module>turtledemo.peace</module><module>importlib.test.extension.util</module><module>test.test_rgbimg</module><module>psycopg2._psycopg</module><module>importlib.machinery</module><module>importlib.test.test_util</module><module>distutils.mwerkscompiler</module><module>tzparse</module><module>concurrent.futures.thread</module><module>test.make_ssl_certs</module><module>concurrent</module><module>importlib.test.test_abc</module><module>test.test_timing</module><module>turtledemo.paint</module><module>urllib.parse</module><module>test.json_tests.test_pass2</module><module>test.json_tests.test_pass3</module><module>http.server</module><module>tkinter.constants</module><module>test.test_smtpd</module><module>test.json_tests.test_decode</module><module>_thread</module><module>importlib.test</module><module>test.test_cProfile</module><module>test.test_reprlib</module><module>importlib.test.import_.test_packages</module><module>importlib.test.regrtest</module><module>test.test_concurrent_futures</module><module>distutils.tests.test_cygwinccompiler</module><module>tkinter.test</module><module>test.json_tests.test_scanstring</module><module>importlib.test.abc</module><module>regex</module><module>email.MIMEMessage</module><module>test.encoded_modules</module><module>tkinter.messagebox</module><module>importlib.test.source.test_source_encoding</module><module>_datetime</module><module>importlib.test.source.test_finder</module><module>distutils.tests.test_extension</module><module>importlib.test.import_.test_api</module><module>tkinter.test.test_ttk.test_extensions</module><module>importlib._bootstrap</module><module>importlib.test.import_.test_path</module><module>importlib.test.util</module><module>test.encoded_modules.module_iso_8859_1</module><module>importlib.test.source</module><module>test.test_numeric_tower</module><module>turtledemo.two_canvases</module><module>turtledemo.chaos</module><module>tkinter.filedialog</module><module>test.test_flufl</module><module>email.MIMEImage</module><module>tkinter.__main__</module><module>email.MIMEText</module><module>builtins</module><module>importlib.test.extension</module><module>pydoc_topics</module><module>gopherlib</module><module>importlib.test.source.util</module><module>test.test_sunau</module><module>test.test_raise</module><module>turtle</module><module>bsddb.test.test_1413192</module><module>test.json_tests.test_speedups</module><module>importlib.test.import_</module><module>importlib.test.extension.test_finder</module><module>turtledemo</module><module>test.json_tests.test_default</module><module>_string</module><module>idlelib.buildapp</module><module>importlib.test.__main__</module><module>fpectl</module><module>test.mock_socket</module><module>test.json_tests.test_encode_basestring_ascii</module><module>test.test_dbm_ndbm</module><module>test.test_osx_env</module><module>copyreg</module><module>concurrent.futures</module><module>concurrent.futures._base</module><module>statcache</module><module>tkinter.test.test_tkinter</module><module>_curses_panel</module><module>dbm</module><module>test.dis_module</module><module>_compat_pickle</module><module>tkinter.test.test_tkinter.test_loadtk</module><module>test.test_sndhdr</module><module>timing</module><module>test.test_strlit</module><module>test.json_tests.test_float</module><module>tkinter.test.support</module><module>_pickle</module><module>email.MIMEMultipart</module><module>tkinter.dnd</module><module>importlib.test.builtin</module><module>turtledemo.round_dance</module><module>test.encoded_modules.module_koi8_r</module><module>test.test_nntplib</module><module>tkinter</module><module>email.MIMENonMultipart</module><module>tkinter.colorchooser</module><module>turtledemo.penrose</module><module>test.json_tests.test_dump</module><module>html</module><module>dbm.ndbm</module><module>turtledemo.wikipedia</module><module>http</module><module>test.test_hexoct</module><module>xmlrpc.server</module><module>urllib.error</module><module>html.entities</module><module>http.client</module><module>importlib.test.frozen</module><module>_dbm</module><module>tkinter.simpledialog</module><module>importlib.test.builtin.util</module><module>test.test_codecencodings_iso2022</module><module>xmlrpc</module><module>test.test_unpack_ex</module><module>importlib.abc</module><module>tkinter.test.test_tkinter.test_text</module><module>turtledemo.__main__</module><module>test.support</module><module>test.test_syslog</module><module>importlib.test.source.test_abc_loader</module><module>importlib.test.test_api</module><module>test.test_super</module><module>tkinter.test.runtktests</module><module>email.MIMEAudio</module><module>test.test_listcomps</module><module>http.cookiejar</module><module>importlib.test.builtin.test_loader</module><module>test.json_tests.test_unicode</module><module>urllib.robotparser</module><module>regsub</module><module>importlib.test.extension.test_loader</module><module>importlib.test.source.test_case_sensitivity</module><module>turtledemo.tree</module><module>test.test_socket_ssl</module><module>_types</module><module>test.test_timeit</module><module>test.test_metaclass</module><module>importlib.test.import_.util</module><func>ascii</func></python><python version="3.0"><module>importlib.test.source.test_file_loader</module><module>test.test_future_builtins</module><module>bsddb.test</module><module>bsddb.test.test_basics</module><module>bsddb.test.test_env_close</module><module>test.test_al</module><module>pydoc_data.topics</module><module>mimify</module><module>tkinter.test.test_tkinter.test_font</module><module>importlib.test.import_.test_caching</module><module>bsddb.test.test_distributed_transactions</module><module>test.test_fpformat</module><module>test.test_getargs</module><module>test.test_multifile</module><module>test.json_tests.test_recursion</module><module>test.ssl_servers</module><module>turtledemo.minimal_hanoi</module><module>toaiff</module><module>turtledemo.fractalcurves</module><module>turtledemo.lindenmayer</module><module>UserList</module><module>test.json_tests.test_separators</module><module>new</module><module>test.test_cd</module><module>importlib.test.import_.test___package__</module><module>importlib.test.benchmark</module><module>turtledemo.colormixer</module><module>tkinter.ttk</module><module>StringIO</module><module>encodings.cp720</module><module>test.json_tests</module><module>unittest.test.test_result</module><module>test.test_sched</module><module>Bastion</module><module>turtledemo.yinyang</module><module>copy_reg</module><module>test.test_sys_setprofile</module><module>tkinter.test.test_ttk</module><module>test.test_ttk_textonly</module><module>cPickle</module><module>importlib.test.source.test_path_hook</module><module>reconvert</module><module>test.test_email_codecs</module><module>compiler.syntax</module><module>bsddb.test.test_fileid</module><module>anydbm</module><module>unittest.__main__</module><module>exceptions</module><module>compiler.pyassem</module><module>email.MIMEBase</module><module>strop</module><module>concurrent.futures.process</module><module>test.test_operations</module><module>bsddb.dbshelve</module><module>distutils.tests.test_build</module><module>test.test_urllib_response</module><module>htmlentitydefs</module><module>argparse</module><module>test.test_mimetools</module><module>test.test_sunaudiodev</module><module>test.test_cookielib</module><module>encodings.hex_codec</module><module>bsddb.test.test_dbtables</module><module>importlib.util</module><module>test.json_tests.test_pass1</module><module>turtledemo.bytedesign</module><module>psycopg2</module><module>distutils.tests.test_install_data</module><module>test.script_helper</module><module>test.test_readline</module><module>unittest.test.test_break</module><module>test.test_dynamic</module><module>distutils.tests.test_log</module><module>test.test_mhlib</module><module>importlib.test.builtin.test_finder</module><module>test.test_copy_reg</module><module>test.test_html</module><module>sqlite3.test.py25tests</module><module>md5</module><module>thread</module><module>test.test_cookie</module><module>unittest.test.test_setups</module><module>distutils.tests.test_install_lib</module><module>test.__main__</module><module>xmllib</module><module>tkinter.test.test_ttk.test_functions</module><module>turtledemo.planet_and_moon</module><module>unittest.test._test_warnings</module><module>importlib.test.frozen.test_loader</module><module>idlelib.tabpage</module><module>unittest.test.test_skipping</module><module>test.infinite_reload</module><module>_posixsubprocess</module><module>_curses</module><module>turtledemo.clock</module><module>encodings.string_escape</module><module>stringold</module><module>test.test_MimeWriter</module><module>sets</module><module>importlib.test.extension.test_case_sensitivity</module><module>_sqlite3</module><module>distutils.tests.test_ccompiler</module><module>unittest.test.test_case</module><module>distutils.tests.test_text_file</module><module>test.json_tests.test_indent</module><module>compiler.future</module><module>encodings.rot_13</module><module>regex_syntax</module><module>dbhash</module><module>linuxaudiodev</module><module>importlib.test.import_.test_fromlist</module><module>fpformat</module><module>lib2to3.btm_matcher</module><module>distutils.tests.test_util</module><module>test.test_linuxaudiodev</module><module>test.test_regex</module><module>importlib.test.import_.test_meta_path</module><module>turtledemo.forest</module><module>tkinter.test.test_ttk.test_widgets</module><module>importlib.test.frozen.test_finder</module><module>test.test_file2k</module><module>compiler</module><module>bsddb.test.test_early_close</module><module>test.test_univnewlines2k</module><module>test.test_linecache</module><module>distutils.tests.test_unixccompiler</module><module>distutils.tests.test_clean</module><module>mutex</module><module>lib2to3.fixes.fix_exitfunc</module><module>test.json_tests.test_fail</module><module>test.test_macfs</module><module>encodings.bz2_codec</module><module>dummy_thread</module><module>test.tracedmodules.testmod</module><module>importlib.test.extension.test_path_hook</module><module>importlib.test.import_.test_relative_imports</module><module>distutils.tests.test_bdist_msi</module><module>bsddb.test.test_get_none</module><module>test.test_complex_args</module><module>turtledemo.nim</module><module>test.test_gl</module><module>distutils.tests.test_file_util</module><module>test.test_aepack</module><module>tkinter.test.test_ttk.test_style</module><module>audiodev</module><module>compiler.ast</module><module>unittest.test.test_program</module><module>test.test_cl</module><module>test.test_popen2</module><module>test.test_strop</module><module>bsddb.dbutils</module><module>test.test_sets</module><module>rfc822</module><module>unittest.test.test_runner</module><module>user</module><module>test.test_macos</module><module>distutils.tests.test_filelist</module><module>distutils.tests.test_bdist</module><module>urlparse</module><module>htmllib</module><module>mhlib</module><module>test.test_applesingle</module><module>bsddb.test.test_dbobj</module><module>distutils.tests.test_archive_util</module><module>test.test_new</module><module>test.test_mutex</module><module>test.test_argparse</module><module>unittest.main</module><module>test.test_sysconfig</module><module>test.test_py3kwarn</module><module>bsddb.test.test_cursor_pget_bug</module><module>test.win_console_handler</module><module>test.datetimetester</module><module>HTMLParser</module><module>test.test_dumbdbm</module><module>whrandom</module><module>test.test_sys_settrace</module><module>test.test_imgfile</module><module>turtledemo.peace</module><module>test.test_old_mailbox</module><module>test.test_long_future</module><module>bsddb.test.test_queue</module><module>UserDict</module><module>unittest.loader</module><module>compiler.visitor</module><module>test.test_md5</module><module>bsddb.test.test_dbenv</module><module>importlib.test.extension.util</module><module>test.test_rgbimg</module><module>bsddb.test.test_sequence</module><module>psycopg2._psycopg</module><module>importlib.machinery</module><module>email.test.test_email_renamed</module><module>test.test_sha</module><module>_pyio</module><module>importlib.test.test_util</module><module>mimetools</module><module>tzparse</module><module>unittest.test.test_discovery</module><module>concurrent.futures.thread</module><module>test.make_ssl_certs</module><module>distutils.tests.setuptools_build_ext</module><module>lib2to3.btm_utils</module><module>json.tests.test_check_circular</module><module>distutils.tests.test_config_cmd</module><module>urllib2</module><module>concurrent</module><module>importlib.test.test_abc</module><module>distutils.tests.test_check</module><module>test.test_StringIO</module><module>bsddb.dbobj</module><module>unittest.test.test_assertions</module><module>distutils.tests.test_bdist_wininst</module><module>test.test_timing</module><module>turtledemo.paint</module><module>hotshot.stats</module><module>test.test_bsddb185</module><module>hotshot.stones</module><module>test.tracedmodules</module><module>test.test_gdb</module><module>test.testall</module><module>test.json_tests.test_pass2</module><module>test.json_tests.test_pass3</module><module>test.test_scriptpackages</module><module>test.test_smtpd</module><module>test.json_tests.test_decode</module><module>unittest.test.support</module><module>test.test_macostools</module><module>test.test_coercion</module><module>importlib.test</module><module>test.test_cProfile</module><module>distutils.tests.test_spawn</module><module>unittest.suite</module><module>importlib.test.import_.test_packages</module><module>importlib.test.regrtest</module><module>_hotshot</module><module>compiler.misc</module><module>SimpleXMLRPCServer</module><module>test.test_concurrent_futures</module><module>distutils.tests.test_cygwinccompiler</module><module>distutils.tests.setuptools_extension</module><module>tkinter.test</module><module>test.json_tests.test_scanstring</module><module>importlib.test.abc</module><module>regex</module><module>email.MIMEMessage</module><module>bsddb.test.test_pickle</module><module>rexec</module><module>test.encoded_modules</module><module>posixfile</module><module>importlib.test.source.test_source_encoding</module><module>_datetime</module><module>unittest.test.test_functiontestcase</module><module>importlib.test.source.test_finder</module><module>test.test_hotshot</module><module>markupbase</module><module>test.test_htmllib</module><module>CGIHTTPServer</module><module>distutils.tests.test_extension</module><module>bsddb.test.test_associate</module><module>imputil</module><module>importlib.test.import_.test_api</module><module>tkinter.test.test_ttk.test_extensions</module><module>dumbdbm</module><module>importlib._bootstrap</module><module>importlib.test.import_.test_path</module><module>importlib.test.util</module><module>test.encoded_modules.module_iso_8859_1</module><module>importlib.test.source</module><module>test.test_numeric_tower</module><module>turtledemo.two_canvases</module><module>compiler.symbols</module><module>lib2to3.fixes.fix_operator</module><module>turtledemo.chaos</module><module>test.test_flufl</module><module>sysconfig</module><module>email.MIMEImage</module><module>test.test_support</module><module>tkinter.__main__</module><module>email.MIMEText</module><module>sgmllib</module><module>importlib.test.extension</module><module>gopherlib</module><module>MimeWriter</module><module>unittest.util</module><module>test.test_bastion</module><module>encodings.base64_codec</module><module>importlib.test.source.util</module><module>test.test_sunau</module><module>test.test_imageop</module><module>statvfs</module><module>cStringIO</module><module>compiler.consts</module><module>bsddb.test.test_1413192</module><module>BaseHTTPServer</module><module>test.json_tests.test_speedups</module><module>test.test_rfc822</module><module>unittest.test</module><module>UserString</module><module>bsddb.dbtables</module><module>test.test_transformer</module><module>importlib.test.import_</module><module>test.test_compileall</module><module>test.test_email_renamed</module><module>importlib.test.extension.test_finder</module><module>turtledemo</module><module>test.json_tests.test_default</module><module>_string</module><module>idlelib.buildapp</module><module>encodings.uu_codec</module><module>encodings.zlib_codec</module><module>ihooks</module><module>lib2to3.tests.test_main</module><module>importlib.test.__main__</module><module>fpectl</module><module>test.test_bsddb3</module><module>_LWPCookieJar</module><module>sha</module><module>test.mock_socket</module><module>test.json_tests.test_encode_basestring_ascii</module><module>distutils.tests.test_bdist_rpm</module><module>compiler.transformer</module><module>test.test_aifc</module><module>test.test_bsddb</module><module>concurrent.futures</module><module>unittest.result</module><module>encodings.quopri_codec</module><module>concurrent.futures._base</module><module>test.test_dl</module><module>statcache</module><module>tkinter.test.test_tkinter</module><module>_curses_panel</module><module>future_builtins</module><module>_io</module><module>_compat_pickle</module><module>importlib</module><module>test.test_dircache</module><module>bsddb.test.test_misc</module><module>tkinter.test.test_tkinter.test_loadtk</module><module>test.test_rlcompleter</module><module>test.test_sndhdr</module><module>repr</module><module>test.test_xrange</module><module>hotshot</module><module>timing</module><module>cookielib</module><module>distutils.tests.test_bdist_dumb</module><module>unittest.runner</module><module>whichdb</module><module>dircache</module><module>test.test_repr</module><module>test.test_ttk_guionly</module><module>popen2</module><module>encodings.cp858</module><module>pydoc_data</module><module>test.test_anydbm</module><module>test.test_compiler</module><module>_MozillaCookieJar</module><module>unittest.case</module><module>distutils.tests.test_dir_util</module><module>test.json_tests.test_float</module><module>tkinter.test.support</module><module>unittest.test.dummy</module><module>bsddb.test.test_lock</module><module>commands</module><module>email.MIMEMultipart</module><module>bsddb.test.test_replication</module><module>robotparser</module><module>test.test_gdbm</module><module>bsddb.db</module><module>importlib.test.builtin</module><module>turtledemo.round_dance</module><module>test.encoded_modules.module_koi8_r</module><module>test.test_nntplib</module><module>test.test_cpickle</module><module>email.MIMENonMultipart</module><module>hotshot.log</module><module>multifile</module><module>distutils.tests.test_install_headers</module><module>test.test_importlib</module><module>test.test_smtpnet</module><module>test.test_tk</module><module>turtledemo.penrose</module><module>compiler.pycodegen</module><module>test.json_tests.test_dump</module><module>bsddb.test.test_dbshelve</module><module>turtledemo.wikipedia</module><module>bsddb.test.test_compat</module><module>unittest.test.test_loader</module><module>test.test_hexoct</module><module>bsddb.test.test_db</module><module>distutils.tests.test_build_clib</module><module>test.test_str</module><module>test.test_strtod</module><module>test.gdb_sample</module><module>bsddb.dbrecio</module><module>test.test_msilib</module><module>importlib.test.frozen</module><module>_dbm</module><module>importlib.test.builtin.util</module><module>test.test_codecencodings_iso2022</module><module>httplib</module><module>importlib.abc</module><module>distutils.tests.test_version</module><module>tkinter.test.test_tkinter.test_text</module><module>turtledemo.__main__</module><module>test.test_whichdb</module><module>importlib.test.source.test_abc_loader</module><module>importlib.test.test_api</module><module>SimpleHTTPServer</module><module>tkinter.test.runtktests</module><module>test.test_xmllib</module><module>email.MIMEAudio</module><module>distutils.tests.test_dep_util</module><module>idlelib.RstripExtension</module><module>test.test_ascii_formatd</module><module>bsddb.test.test_join</module><module>unittest.test.test_suite</module><module>sre</module><module>test.lock_tests</module><module>__builtin__</module><module>importlib.test.builtin.test_loader</module><module>test.json_tests.test_unicode</module><module>distutils.command.check</module><module>regsub</module><module>Cookie</module><module>importlib.test.extension.test_loader</module><module>test.test_buffer</module><module>importlib.test.source.test_case_sensitivity</module><module>turtledemo.tree</module><module>test.test_socket_ssl</module><module>_types</module><module>test.test_pdb</module><module>test.test_timeit</module><module>DocXMLRPCServer</module><module>bsddb.test.test_thread</module><module>test.test_xpickle</module><module>test.test_undocumented_details</module><module>bsddb.test.test_all</module><module>bsddb</module><module>lib2to3.__main__</module><module>importlib.test.import_.util</module><module>test.test_sgmllib</module><module>test.test_commands</module><module>unittest.signals</module><module>sunaudio</module><module>test.test_softspace</module><module>bsddb.test.test_recno</module><module>xmlrpclib</module><module>distutils.tests.test_cmd</module><module>bsddb.test.test_compare</module><func>unicode</func><func>apply</func><func>basestring</func><func>long</func><func>raw_input</func><func>reload</func><func>xrange</func><func>reduce</func><func>coerce</func><func>intern</func><func>file</func><func>unichr</func><func>execfile</func><func>buffer</func><func>callable</func></python><python version="3.1"><module>test.test_future_builtins</module><module>bsddb.test</module><module>bsddb.test.test_basics</module><module>bsddb.test.test_env_close</module><module>test.test_al</module><module>mimify</module><module>tkinter.test.test_tkinter.test_font</module><module>bsddb.test.test_distributed_transactions</module><module>test.test_fpformat</module><module>test.test_getargs</module><module>test.test_multifile</module><module>test.json_tests.test_recursion</module><module>test.ssl_servers</module><module>turtledemo.minimal_hanoi</module><module>toaiff</module><module>turtledemo.fractalcurves</module><module>turtledemo.lindenmayer</module><module>UserList</module><module>test.json_tests.test_separators</module><module>new</module><module>test.test_cd</module><module>turtledemo.colormixer</module><module>StringIO</module><module>encodings.cp720</module><module>test.json_tests</module><module>unittest.test.test_result</module><module>test.test_sched</module><module>Bastion</module><module>turtledemo.yinyang</module><module>copy_reg</module><module>cPickle</module><module>reconvert</module><module>test.test_email_codecs</module><module>compiler.syntax</module><module>bsddb.test.test_fileid</module><module>anydbm</module><module>unittest.__main__</module><module>exceptions</module><module>test.test_profilehooks</module><module>compiler.pyassem</module><module>email.MIMEBase</module><module>strop</module><module>concurrent.futures.process</module><module>test.test_operations</module><module>bsddb.dbshelve</module><module>distutils.tests.test_build</module><module>htmlentitydefs</module><module>argparse</module><module>test.test_mimetools</module><module>test.test_sunaudiodev</module><module>test.test_cookielib</module><module>encodings.hex_codec</module><module>bsddb.test.test_dbtables</module><module>test.json_tests.test_pass1</module><module>turtledemo.bytedesign</module><module>psycopg2</module><module>test.test_readline</module><module>unittest.test.test_break</module><module>test.test_dynamic</module><module>test.test_mhlib</module><module>test.test_copy_reg</module><module>test.test_html</module><module>sqlite3.test.py25tests</module><module>md5</module><module>thread</module><module>test.test_cookie</module><module>unittest.test.test_setups</module><module>test.__main__</module><module>xmllib</module><module>turtledemo.planet_and_moon</module><module>unittest.test._test_warnings</module><module>idlelib.tabpage</module><module>unittest.test.test_skipping</module><module>test.infinite_reload</module><module>_posixsubprocess</module><module>turtledemo.clock</module><module>_fileio</module><module>encodings.string_escape</module><module>stringold</module><module>test.test_MimeWriter</module><module>sets</module><module>distutils.tests.test_ccompiler</module><module>unittest.test.test_case</module><module>test.json_tests.test_indent</module><module>compiler.future</module><module>encodings.rot_13</module><module>regex_syntax</module><module>dbhash</module><module>linuxaudiodev</module><module>fpformat</module><module>test.test_linuxaudiodev</module><module>test.test_regex</module><module>turtledemo.forest</module><module>test.cjkencodings_test</module><module>test.test_file2k</module><module>compiler</module><module>bsddb.test.test_early_close</module><module>test.test_univnewlines2k</module><module>mutex</module><module>build_class</module><module>test.json_tests.test_fail</module><module>_stringio</module><module>test.test_macfs</module><module>encodings.bz2_codec</module><module>dummy_thread</module><module>distutils.tests.test_bdist_msi</module><module>bsddb.test.test_get_none</module><module>test.test_complex_args</module><module>turtledemo.nim</module><module>test.test_gl</module><module>test.test_aepack</module><module>audiodev</module><module>compiler.ast</module><module>unittest.test.test_program</module><module>test.test_cl</module><module>test.test_popen2</module><module>test.test_strop</module><module>bsddb.dbutils</module><module>test.test_sets</module><module>rfc822</module><module>unittest.test.test_runner</module><module>user</module><module>test.test_macos</module><module>urlparse</module><module>htmllib</module><module>mhlib</module><module>test.test_applesingle</module><module>bsddb.test.test_dbobj</module><module>test.test_new</module><module>test.test_mutex</module><module>test.test_argparse</module><module>unittest.main</module><module>_bytesio</module><module>test.test_sysconfig</module><module>test.test_py3kwarn</module><module>bsddb.test.test_cursor_pget_bug</module><module>test.win_console_handler</module><module>test.datetimetester</module><module>HTMLParser</module><module>test.test_dumbdbm</module><module>whrandom</module><module>test.test_imgfile</module><module>turtledemo.peace</module><module>test.test_old_mailbox</module><module>test.test_long_future</module><module>bsddb.test.test_queue</module><module>UserDict</module><module>unittest.loader</module><module>compiler.visitor</module><module>test.test_md5</module><module>bsddb.test.test_dbenv</module><module>test.test_rgbimg</module><module>bsddb.test.test_sequence</module><module>psycopg2._psycopg</module><module>email.test.test_email_renamed</module><module>test.test_sha</module><module>distutils.mwerkscompiler</module><module>mimetools</module><module>tzparse</module><module>unittest.test.test_discovery</module><module>concurrent.futures.thread</module><module>test.make_ssl_certs</module><module>distutils.tests.setuptools_build_ext</module><module>json.tests.test_check_circular</module><module>urllib2</module><module>concurrent</module><module>test.test_StringIO</module><module>bsddb.dbobj</module><module>unittest.test.test_assertions</module><module>test.test_timing</module><module>turtledemo.paint</module><module>hotshot.stats</module><module>test.test_bsddb185</module><module>hotshot.stones</module><module>test.test_gdb</module><module>test.testall</module><module>test.json_tests.test_pass2</module><module>test.json_tests.test_pass3</module><module>test.test_scriptpackages</module><module>test.test_smtpd</module><module>test.json_tests.test_decode</module><module>unittest.test.support</module><module>test.test_macostools</module><module>test.test_coercion</module><module>test.test_cProfile</module><module>unittest.suite</module><module>importlib.test.regrtest</module><module>_hotshot</module><module>compiler.misc</module><module>SimpleXMLRPCServer</module><module>test.test_concurrent_futures</module><module>distutils.tests.setuptools_extension</module><module>test.json_tests.test_scanstring</module><module>regex</module><module>email.MIMEMessage</module><module>bsddb.test.test_pickle</module><module>rexec</module><module>test.encoded_modules</module><module>posixfile</module><module>_datetime</module><module>unittest.test.test_functiontestcase</module><module>test.test_hotshot</module><module>markupbase</module><module>test.test_htmllib</module><module>CGIHTTPServer</module><module>bsddb.test.test_associate</module><module>imputil</module><module>importlib.test.import_.test_api</module><module>dumbdbm</module><module>test.encoded_modules.module_iso_8859_1</module><module>test.test_numeric_tower</module><module>turtledemo.two_canvases</module><module>compiler.symbols</module><module>turtledemo.chaos</module><module>sysconfig</module><module>email.MIMEImage</module><module>test.test_support</module><module>tkinter.__main__</module><module>email.MIMEText</module><module>sgmllib</module><module>pydoc_topics</module><module>gopherlib</module><module>MimeWriter</module><module>unittest.util</module><module>test.test_bastion</module><module>encodings.base64_codec</module><module>test.test_imageop</module><module>statvfs</module><module>cStringIO</module><module>compiler.consts</module><module>bsddb.test.test_1413192</module><module>BaseHTTPServer</module><module>test.json_tests.test_speedups</module><module>test.test_rfc822</module><module>unittest.test</module><module>UserString</module><module>bsddb.dbtables</module><module>test.test_transformer</module><module>test.test_email_renamed</module><module>turtledemo</module><module>test.json_tests.test_default</module><module>_string</module><module>idlelib.buildapp</module><module>encodings.uu_codec</module><module>encodings.zlib_codec</module><module>ihooks</module><module>importlib.test.__main__</module><module>test.test_bsddb3</module><module>_LWPCookieJar</module><module>sha</module><module>test.mock_socket</module><module>test.json_tests.test_encode_basestring_ascii</module><module>compiler.transformer</module><module>test.test_bsddb</module><module>concurrent.futures</module><module>unittest.result</module><module>encodings.quopri_codec</module><module>concurrent.futures._base</module><module>test.test_dl</module><module>statcache</module><module>future_builtins</module><module>test.test_dircache</module><module>bsddb.test.test_misc</module><module>repr</module><module>test.test_xrange</module><module>hotshot</module><module>timing</module><module>cookielib</module><module>unittest.runner</module><module>whichdb</module><module>dircache</module><module>test.test_repr</module><module>popen2</module><module>encodings.cp858</module><module>test.test_anydbm</module><module>test.test_compiler</module><module>_MozillaCookieJar</module><module>unittest.case</module><module>test.json_tests.test_float</module><module>unittest.test.dummy</module><module>bsddb.test.test_lock</module><module>commands</module><module>email.MIMEMultipart</module><module>bsddb.test.test_replication</module><module>robotparser</module><module>test.test_gdbm</module><module>bsddb.db</module><module>turtledemo.round_dance</module><module>test.encoded_modules.module_koi8_r</module><module>test.test_nntplib</module><module>test.test_cpickle</module><module>email.MIMENonMultipart</module><module>hotshot.log</module><module>multifile</module><module>turtledemo.penrose</module><module>compiler.pycodegen</module><module>test.json_tests.test_dump</module><module>email.test.test_email_codecs_renamed</module><module>bsddb.test.test_dbshelve</module><module>turtledemo.wikipedia</module><module>bsddb.test.test_compat</module><module>unittest.test.test_loader</module><module>test.test_hexoct</module><module>bsddb.test.test_db</module><module>test.test_str</module><module>test.gdb_sample</module><module>bsddb.dbrecio</module><module>test.test_codecencodings_iso2022</module><module>httplib</module><module>turtledemo.__main__</module><module>test.test_whichdb</module><module>SimpleHTTPServer</module><module>test.test_xmllib</module><module>email.MIMEAudio</module><module>distutils.tests.test_dep_util</module><module>bsddb.test.test_join</module><module>unittest.test.test_suite</module><module>sre</module><module>__builtin__</module><module>test.json_tests.test_unicode</module><module>regsub</module><module>Cookie</module><module>test.test_buffer</module><module>turtledemo.tree</module><module>test.test_socket_ssl</module><module>_types</module><module>test.test_timeit</module><module>DocXMLRPCServer</module><module>bsddb.test.test_thread</module><module>test.test_xpickle</module><module>test.test_undocumented_details</module><module>bsddb.test.test_all</module><module>bsddb</module><module>lib2to3.__main__</module><module>test.test_sgmllib</module><module>test.test_commands</module><module>unittest.signals</module><module>sunaudio</module><module>test.test_softspace</module><module>bsddb.test.test_recno</module><module>xmlrpclib</module><module>bsddb.test.test_compare</module><func>unicode</func><func>apply</func><func>basestring</func><func>long</func><func>raw_input</func><func>reload</func><func>cmp</func><func>xrange</func><func>reduce</func><func>coerce</func><func>intern</func><func>file</func><func>unichr</func><func>execfile</func><func>buffer</func><func>callable</func></python><python version="3.2"><module>test.test_future_builtins</module><module>bsddb.test</module><module>bsddb.test.test_basics</module><module>bsddb.test.test_env_close</module><module>test.test_al</module><module>mimify</module><module>bsddb.test.test_distributed_transactions</module><module>test.test_fpformat</module><module>test.test_getargs</module><module>test.test_multifile</module><module>toaiff</module><module>UserList</module><module>new</module><module>test.test_cd</module><module>json.tests.test_unicode</module><module>StringIO</module><module>Bastion</module><module>copy_reg</module><module>cPickle</module><module>reconvert</module><module>test.test_email_codecs</module><module>compiler.syntax</module><module>bsddb.test.test_fileid</module><module>anydbm</module><module>exceptions</module><module>json.tests.test_speedups</module><module>test.test_profilehooks</module><module>json.tests.test_recursion</module><module>compiler.pyassem</module><module>email.MIMEBase</module><module>strop</module><module>test.test_operations</module><module>bsddb.dbshelve</module><module>htmlentitydefs</module><module>test.test_mimetools</module><module>test.test_sunaudiodev</module><module>test.test_cookielib</module><module>bsddb.test.test_dbtables</module><module>psycopg2</module><module>test.test_mhlib</module><module>test.test_copy_reg</module><module>sqlite3.test.py25tests</module><module>md5</module><module>thread</module><module>test.test_cookie</module><module>xmllib</module><module>idlelib.tabpage</module><module>test.infinite_reload</module><module>_curses</module><module>_fileio</module><module>encodings.string_escape</module><module>stringold</module><module>test.test_MimeWriter</module><module>sets</module><module>_sqlite3</module><module>distutils.tests.test_ccompiler</module><module>compiler.future</module><module>regex_syntax</module><module>dbhash</module><module>json.tests.test_scanstring</module><module>json.tests</module><module>linuxaudiodev</module><module>fpformat</module><module>test.test_linuxaudiodev</module><module>test.test_regex</module><module>test.cjkencodings_test</module><module>test.test_file2k</module><module>compiler</module><module>bsddb.test.test_early_close</module><module>test.test_univnewlines2k</module><module>mutex</module><module>build_class</module><module>_stringio</module><module>test.test_macfs</module><module>dummy_thread</module><module>bsddb.test.test_get_none</module><module>test.test_complex_args</module><module>test.test_gl</module><module>test.test_aepack</module><module>audiodev</module><module>compiler.ast</module><module>test.test_cl</module><module>test.test_popen2</module><module>test.test_strop</module><module>bsddb.dbutils</module><module>test.test_sets</module><module>rfc822</module><module>user</module><module>test.test_macos</module><module>urlparse</module><module>htmllib</module><module>mhlib</module><module>test.test_applesingle</module><module>bsddb.test.test_dbobj</module><module>test.test_new</module><module>test.test_mutex</module><module>json.tests.test_decode</module><module>_bytesio</module><module>test.test_py3kwarn</module><module>bsddb.test.test_cursor_pget_bug</module><module>HTMLParser</module><module>test.test_dumbdbm</module><module>whrandom</module><module>test.test_imgfile</module><module>test.test_old_mailbox</module><module>test.test_long_future</module><module>bsddb.test.test_queue</module><module>UserDict</module><module>compiler.visitor</module><module>test.test_md5</module><module>bsddb.test.test_dbenv</module><module>test.test_rgbimg</module><module>bsddb.test.test_sequence</module><module>psycopg2._psycopg</module><module>email.test.test_email_renamed</module><module>test.test_sha</module><module>json.tests.test_separators</module><module>distutils.mwerkscompiler</module><module>mimetools</module><module>json.tests.test_float</module><module>tzparse</module><module>test.badsyntax_nocaret</module><module>distutils.tests.setuptools_build_ext</module><module>json.tests.test_check_circular</module><module>urllib2</module><module>test.test_StringIO</module><module>bsddb.dbobj</module><module>test.test_timing</module><module>hotshot.stats</module><module>test.test_bsddb185</module><module>hotshot.stones</module><module>test.testall</module><module>json.tests.test_dump</module><module>test.test_scriptpackages</module><module>test.test_macostools</module><module>test.test_coercion</module><module>test.test_cProfile</module><module>_hotshot</module><module>compiler.misc</module><module>SimpleXMLRPCServer</module><module>distutils.tests.setuptools_extension</module><module>regex</module><module>email.MIMEMessage</module><module>bsddb.test.test_pickle</module><module>rexec</module><module>posixfile</module><module>test.test_hotshot</module><module>markupbase</module><module>test.test_htmllib</module><module>CGIHTTPServer</module><module>bsddb.test.test_associate</module><module>imputil</module><module>dumbdbm</module><module>compiler.symbols</module><module>email.MIMEImage</module><module>test.test_support</module><module>email.MIMEText</module><module>sgmllib</module><module>pydoc_topics</module><module>gopherlib</module><module>MimeWriter</module><module>test.test_bastion</module><module>test.test_imageop</module><module>statvfs</module><module>cStringIO</module><module>compiler.consts</module><module>bsddb.test.test_1413192</module><module>BaseHTTPServer</module><module>test.test_rfc822</module><module>UserString</module><module>bsddb.dbtables</module><module>test.test_transformer</module><module>test.test_email_renamed</module><module>idlelib.buildapp</module><module>ihooks</module><module>fpectl</module><module>test.test_bsddb3</module><module>_LWPCookieJar</module><module>sha</module><module>test.test_SimpleHTTPServer</module><module>compiler.transformer</module><module>test.test_bsddb</module><module>test.test_dl</module><module>statcache</module><module>_curses_panel</module><module>future_builtins</module><module>json.tests.test_encode_basestring_ascii</module><module>test.test_dircache</module><module>bsddb.test.test_misc</module><module>repr</module><module>test.test_xrange</module><module>hotshot</module><module>timing</module><module>cookielib</module><module>whichdb</module><module>dircache</module><module>test.test_repr</module><module>popen2</module><module>test.test_anydbm</module><module>test.test_compiler</module><module>_MozillaCookieJar</module><module>json.tests.test_indent</module><module>bsddb.test.test_lock</module><module>commands</module><module>json.tests.test_fail</module><module>email.MIMEMultipart</module><module>bsddb.test.test_replication</module><module>robotparser</module><module>test.test_gdbm</module><module>bsddb.db</module><module>test.test_cpickle</module><module>email.MIMENonMultipart</module><module>hotshot.log</module><module>multifile</module><module>compiler.pycodegen</module><module>email.test.test_email_codecs_renamed</module><module>bsddb.test.test_dbshelve</module><module>bsddb.test.test_compat</module><module>test.test_hexoct</module><module>bsddb.test.test_db</module><module>json.tests.test_pass2</module><module>json.tests.test_pass3</module><module>json.tests.test_pass1</module><module>test.test_str</module><module>bsddb.dbrecio</module><module>_dbm</module><module>httplib</module><module>test.test_whichdb</module><module>SimpleHTTPServer</module><module>test.test_xmllib</module><module>email.MIMEAudio</module><module>test.test_ascii_formatd</module><module>bsddb.test.test_join</module><module>json.tests.test_default</module><module>sre</module><module>__builtin__</module><module>regsub</module><module>Cookie</module><module>test.test_buffer</module><module>test.test_socket_ssl</module><module>_types</module><module>DocXMLRPCServer</module><module>bsddb.test.test_thread</module><module>test.test_xpickle</module><module>test.test_undocumented_details</module><module>bsddb.test.test_all</module><module>bsddb</module><module>lib2to3.__main__</module><module>test.test_sgmllib</module><module>test.test_commands</module><module>sunaudio</module><module>test.test_softspace</module><module>bsddb.test.test_recno</module><module>xmlrpclib</module><module>bsddb.test.test_compare</module><func>unicode</func><func>apply</func><func>basestring</func><func>long</func><func>raw_input</func><func>reload</func><func>cmp</func><func>xrange</func><func>reduce</func><func>coerce</func><func>intern</func><func>file</func><func>unichr</func><func>execfile</func><func>buffer</func></python><python version="3.3"><module>distutils.tests.test_ccompiler</module><module>bsddb.test.test_fileid</module><module>bsddb.test</module><module>hotshot.stats</module><module>bsddb.test.test_basics</module><module>bsddb.test.test_env_close</module><module>test.test_al</module><module>test.test_bsddb185</module><module>hotshot.stones</module><module>json.tests.test_unicode</module><module>mimify</module><module>bsddb.test.test_distributed_transactions</module><module>test.test_fpformat</module><module>test.test_getargs</module><module>test.test_cookielib</module><module>test.test_multifile</module><module>json.tests.test_dump</module><module>test.test_str</module><module>test.test_scriptpackages</module><module>toaiff</module><module>test.test_macostools</module><module>test.test_sha</module><module>fpformat</module><module>test.test_regex</module><module>new</module><module>test.test_coercion</module><module>StringIO</module><module>test.testall</module><module>_hotshot</module><module>compiler.misc</module><module>bsddb.test.test_associate</module><module>Bastion</module><module>test.test_old_mailbox</module><module>email.MIMEMessage</module><module>bsddb.test.test_pickle</module><module>bsddb.test.test_misc</module><module>cPickle</module><module>posixfile</module><module>json.tests.test_check_circular</module><module>reconvert</module><module>test.test_email_codecs</module><module>compiler.syntax</module><module>test.test_timing</module><module>anydbm</module><module>test.test_hotshot</module><module>markupbase</module><module>test.test_htmllib</module><module>exceptions</module><module>json.tests.test_speedups</module><module>CGIHTTPServer</module><module>imputil</module><module>compiler.pyassem</module><module>strop</module><module>test.test_operations</module><module>bsddb.dbshelve</module><module>MimeWriter</module><module>test.test_imageop</module><module>htmlentitydefs</module><module>compiler.symbols</module><module>test.test_mimetools</module><module>test.test_sunaudiodev</module><module>whichdb</module><module>email.MIMEText</module><module>dumbdbm</module><module>psycopg2</module><module>cookielib</module><module>pydoc_topics</module><module>gopherlib</module><module>test.test_bastion</module><module>test.test_cProfile</module><module>httplib</module><module>statvfs</module><module>test.test_mhlib</module><module>cStringIO</module><module>bsddb.test.test_1413192</module><module>BaseHTTPServer</module><module>dircache</module><module>test.test_rfc822</module><module>UserString</module><module>bsddb.dbtables</module><module>test.test_email_renamed</module><module>sqlite3.test.py25tests</module><module>idlelib.buildapp</module><module>md5</module><module>thread</module><module>ihooks</module><module>fpectl</module><module>test.test_bsddb3</module><module>test.test_copy_reg</module><module>_LWPCookieJar</module><module>test.test_SimpleHTTPServer</module><module>email.MIMEMultipart</module><module>idlelib.tabpage</module><module>test.infinite_reload</module><module>_curses</module><module>_fileio</module><module>test.test_cd</module><module>test.test_aepack</module><module>test.test_cl</module><module>test.test_bsddb</module><module>test.test_MimeWriter</module><module>test.test_dl</module><module>statcache</module><module>sets</module><module>_sqlite3</module><module>mhlib</module><module>_curses_panel</module><module>future_builtins</module><module>compiler.future</module><module>regex_syntax</module><module>stringold</module><module>dbhash</module><module>bsddb.test.test_dbobj</module><module>json.tests</module><module>linuxaudiodev</module><module>UserList</module><module>json.tests.test_encode_basestring_ascii</module><module>test.test_dircache</module><module>pyexpat.errors</module><module>rexec</module><module>test.cjkencodings_test</module><module>repr</module><module>test.test_xrange</module><module>hotshot</module><module>timing</module><module>test.test_file2k</module><module>compiler</module><module>compiler.consts</module><module>email.MIMEImage</module><module>bsddb.test.test_early_close</module><module>sha</module><module>test.test_repr</module><module>pyexpat.model</module><module>test.test_univnewlines2k</module><module>popen2</module><module>compiler.transformer</module><module>test.test_anydbm</module><module>test.test_compiler</module><module>bsddb.test.test_dbtables</module><module>mutex</module><module>_MozillaCookieJar</module><module>json.tests.test_indent</module><module>build_class</module><module>sgmllib</module><module>bsddb.test.test_lock</module><module>commands</module><module>test.test_cpickle</module><module>_stringio</module><module>bsddb.test.test_thread</module><module>test.test_macfs</module><module>distutils.tests.setuptools_extension</module><module>bsddb.test.test_replication</module><module>dummy_thread</module><module>robotparser</module><module>test.test_gdbm</module><module>bsddb.db</module><module>bsddb.test.test_get_none</module><module>test.test_complex_args</module><module>SimpleXMLRPCServer</module><module>test.test_future_builtins</module><module>email.MIMENonMultipart</module><module>test.test_gl</module><module>hotshot.log</module><module>multifile</module><module>encodings.string_escape</module><module>audiodev</module><module>copy_reg</module><module>test.test_profilehooks</module><module>json.tests.test_recursion</module><module>email.MIMEBase</module><module>test.test_popen2</module><module>compiler.pycodegen</module><module>test.test_strop</module><module>bsddb.dbutils</module><module>email.test.test_email_codecs_renamed</module><module>bsddb.test.test_dbshelve</module><module>test.test_sets</module><module>rfc822</module><module>bsddb.test.test_compat</module><module>test.test_hexoct</module><module>bsddb.test.test_db</module><module>user</module><module>xmllib</module><module>test.badsyntax_nocaret</module><module>test.test_macos</module><module>urlparse</module><module>htmllib</module><module>test.test_cookie</module><module>json.tests.test_pass2</module><module>json.tests.test_pass3</module><module>test.test_applesingle</module><module>json.tests.test_pass1</module><module>json.tests.test_scanstring</module><module>test.test_linuxaudiodev</module><module>bsddb.dbrecio</module><module>test.test_new</module><module>test.test_mutex</module><module>json.tests.test_decode</module><module>compiler.ast</module><module>_bytesio</module><module>test.test_py3kwarn</module><module>whrandom</module><module>test.test_whichdb</module><module>bsddb.test.test_cursor_pget_bug</module><module>SimpleHTTPServer</module><module>psycopg2._psycopg</module><module>email.test.test_email_renamed</module><module>HTMLParser</module><module>distutils.tests.setuptools_build_ext</module><module>test.test_xmllib</module><module>email.MIMEAudio</module><module>test.test_imgfile</module><module>regex</module><module>test.test_long_future</module><module>test.test_ascii_formatd</module><module>bsddb.test.test_queue</module><module>UserDict</module><module>bsddb.test.test_join</module><module>json.tests.test_default</module><module>compiler.visitor</module><module>sre</module><module>test.test_md5</module><module>bsddb.test.test_dbenv</module><module>__builtin__</module><module>test.test_transformer</module><module>test.test_rgbimg</module><module>regsub</module><module>bsddb.test.test_sequence</module><module>Cookie</module><module>test.test_socket_ssl</module><module>_types</module><module>json.tests.test_separators</module><module>DocXMLRPCServer</module><module>json.tests.test_fail</module><module>distutils.mwerkscompiler</module><module>mimetools</module><module>test.test_xpickle</module><module>json.tests.test_float</module><module>bsddb.dbobj</module><module>tzparse</module><module>bsddb.test.test_all</module><module>test.test_dumbdbm</module><module>_dbm</module><module>_abcoll</module><module>bsddb</module><module>test.test_sgmllib</module><module>test.test_commands</module><module>urllib2</module><module>sunaudio</module><module>test.test_softspace</module><module>bsddb.test.test_recno</module><module>test.test_StringIO</module><module>xmlrpclib</module><module>test.test_undocumented_details</module><module>bsddb.test.test_compare</module><func>file</func><func>buffer</func><func>xrange</func><func>reduce</func><func>coerce</func><func>intern</func><func>unicode</func><func>apply</func><func>unichr</func><func>basestring</func><func>raw_input</func><func>execfile</func><func>long</func><func>reload</func><func>cmp</func></python></root>
+<?xml version="1.0" ?><root><python version="2.4"><module>sqlite3.test.factory</module><module>importlib.test.source.test_file_loader</module><module>test.test_future_builtins</module><module>_dummy_thread</module><module>pydoc_data.topics</module><module>test.test_epoll</module><module>dbm.gnu</module><module>tkinter.test.test_tkinter.test_font</module><module>lib2to3.fixer_util</module><module>importlib.test.import_.test_caching</module><module>ctypes.test.test_cast</module><module>bsddb.test.test_distributed_transactions</module><module>encodings.utf_8_sig</module><module>antigravity</module><module>json.encoder</module><module>test.test_future5</module><module>test.test_future4</module><module>test.json_tests.test_recursion</module><module>runpy</module><module>multiprocessing.pool</module><module>tkinter._fix</module><module>test.ssl_servers</module><module>test.test_float</module><module>lib2to3.fixes.fix_methodattrs</module><module>ctypes.test.test_funcptr</module><module>turtledemo.minimal_hanoi</module><module>turtledemo.fractalcurves</module><module>turtledemo.lindenmayer</module><module>test.test_abstract_numbers</module><module>ctypes.test.test_pickling</module><module>lib2to3.fixer_base</module><module>lib2to3.fixes.fix_types</module><module>ctypes.test.test_pep3118</module><module>test.json_tests.test_separators</module><module>importlib.test.import_.test___package__</module><module>xml.etree</module><module>importlib.test.benchmark</module><module>json.tests.test_unicode</module><module>turtledemo.colormixer</module><module>lib2to3.fixes.fix_xreadlines</module><module>tkinter.ttk</module><module>email.mime.message</module><module>distutils.tests.test_core</module><module>test.test_hashlib</module><module>encodings.cp720</module><module>test.json_tests</module><module>unittest.test.test_result</module><module>test.test_sched</module><module>turtledemo.yinyang</module><module>ctypes.test.test_slicing</module><module>test.test_xmlrpc_net</module><module>test.test_sys_setprofile</module><module>tkinter.test.test_ttk</module><module>test.test_ttk_textonly</module><module>fractions</module><module>importlib.test.source.test_path_hook</module><module>bsddb.test.test_fileid</module><module>tkinter.font</module><module>unittest.__main__</module><module>tkinter.commondialog</module><module>lib2to3.fixes.fix_apply</module><module>test.test_keywordonlyarg</module><module>test.test_setcomps</module><module>test.test_collections</module><module>json.tests.test_speedups</module><module>json.tests.test_recursion</module><module>numbers</module><module>test.test_cmd</module><module>ctypes.test.test_checkretval</module><module>sqlite3.test</module><module>lib2to3.fixes.fix_long</module><module>concurrent.futures.process</module><module>distutils.tests.test_build</module><module>test.test_urllib_response</module><module>idlelib.tabbedpages</module><module>urllib.request</module><module>test.test_print</module><module>argparse</module><module>ctypes.test.test_functions</module><module>test.test_multiprocessing</module><module>ctypes.test.test_keeprefs</module><module>test.test_dbm_gnu</module><module>functools</module><module>ctypes.test.test_libc</module><module>idlelib.macosxSupport</module><module>importlib.util</module><module>test.json_tests.test_pass1</module><module>uuid</module><module>turtledemo.bytedesign</module><module>lib2to3.pgen2.pgen</module><module>distutils.tests.test_install_data</module><module>test.script_helper</module><module>test.test_readline</module><module>unittest.test.test_break</module><module>multiprocessing.synchronize</module><module>multiprocessing.heap</module><module>test.bad_coding2</module><module>test.test_dynamic</module><module>lib2to3.fixes.fix_imports2</module><module>lib2to3.fixes.fix_unicode</module><module>test.test_pep3120</module><module>distutils.tests.test_log</module><module>ctypes.test.test_cfuncs</module><module>ctypes.test.test_init</module><module>test.test_asyncore</module><module>importlib.test.builtin.test_finder</module><module>distutils.tests.test_build_ext</module><module>distutils.command.upload</module><module>test.test_http_cookiejar</module><module>sqlite3.test.types</module><module>ast</module><module>test.test_html</module><module>test.bad_coding</module><module>sqlite3.test.py25tests</module><module>ctypes.test.test_integers</module><module>ctypes.test.test_stringptr</module><module>lib2to3.refactor</module><module>unittest.test.test_setups</module><module>distutils.tests.test_install_lib</module><module>test.test_pep3131</module><module>test.__main__</module><module>test.badsyntax_pep3120</module><module>_collections</module><module>lib2to3.fixes.fix_metaclass</module><module>tkinter.test.test_ttk.test_functions</module><module>email.mime.image</module><module>turtledemo.planet_and_moon</module><module>unittest.test._test_warnings</module><module>test.test_coding</module><module>distutils.tests.test_sdist</module><module>importlib.test.frozen.test_loader</module><module>test.test_lib2to3</module><module>ctypes.macholib.dyld</module><module>lib2to3.fixes.fix_idioms</module><module>unittest.test.test_skipping</module><module>hashlib</module><module>test.test_contextlib</module><module>tkinter.tix</module><module>test.infinite_reload</module><module>_posixsubprocess</module><module>_curses</module><module>turtledemo.clock</module><module>_fileio</module><module>reprlib</module><module>lib2to3.fixes.fix_print</module><module>test.test_range</module><module>ctypes.test.test_simplesubclasses</module><module>xmlrpc.client</module><module>ctypes.test.test_byteswap</module><module>lib2to3.fixes.fix_callable</module><module>lib2to3</module><module>wsgiref.handlers</module><module>ctypes.test.test_pointers</module><module>lib2to3.fixes.fix_standarderror</module><module>abc</module><module>importlib.test.extension.test_case_sensitivity</module><module>_sqlite3</module><module>test.test_copyreg</module><module>distutils.tests.test_ccompiler</module><module>unittest.test.test_case</module><module>ctypes.macholib</module><module>distutils.tests.test_text_file</module><module>test.json_tests.test_indent</module><module>tkinter.dialog</module><module>test.test_memoryview</module><module>json.tests.test_scanstring</module><module>json.tests</module><module>importlib.test.import_.test_fromlist</module><module>ctypes._endian</module><module>lib2to3.btm_matcher</module><module>distutils.tests.test_util</module><module>_markupbase</module><module>importlib.test.import_.test_meta_path</module><module>lib2to3.tests.pytree_idempotency</module><module>lib2to3.fixes.fix_buffer</module><module>xml.etree.ElementTree</module><module>turtledemo.forest</module><module>tkinter.test.test_ttk.test_widgets</module><module>test.warning_tests</module><module>lib2to3.pgen2.conv</module><module>test.test_sqlite</module><module>importlib.test.frozen.test_finder</module><module>lib2to3.fixes.fix_renames</module><module>_lsprof</module><module>test.test_file2k</module><module>test.test_xml_etree</module><module>bsddb.test.test_early_close</module><module>html.parser</module><module>ctypes.test.test_bytes</module><module>pyexpat.model</module><module>test.test_univnewlines2k</module><module>test.test_linecache</module><module>lib2to3.pgen2.parse</module><module>lib2to3.fixes.fix_input</module><module>urllib.response</module><module>distutils.tests.test_unixccompiler</module><module>distutils.tests.test_clean</module><module>multiprocessing.util</module><module>lib2to3.pgen2</module><module>test.test_zipimport_support</module><module>build_class</module><module>ctypes.test.test_array_in_pointer</module><module>ctypes</module><module>http.cookies</module><module>lib2to3.fixes.fix_exitfunc</module><module>test.json_tests.test_fail</module><module>ctypes.test.test_prototypes</module><module>test.badsyntax_3131</module><module>lib2to3.tests.test_all_fixers</module><module>test.profilee</module><module>_stringio</module><module>ctypes.test.test_callbacks</module><module>ctypes.test.test_python_api</module><module>ctypes.test.test_loading</module><module>tkinter.scrolledtext</module><module>email.mime.application</module><module>test.tracedmodules.testmod</module><module>importlib.test.extension.test_path_hook</module><module>encodings.mac_croatian</module><module>importlib.test.import_.test_relative_imports</module><module>distutils.tests.test_bdist_msi</module><module>ctypes.test.test_win32</module><module>test.test_complex_args</module><module>encodings.utf_32</module><module>turtledemo.nim</module><module>lib2to3.fixes.fix_ws_comma</module><module>lib2to3.pgen2.grammar</module><module>test.test_cmd_line_script</module><module>encodings.mac_arabic</module><module>test.test_wait4</module><module>test.test_wait3</module><module>distutils.command.bdist_msi</module><module>distutils.tests.test_file_util</module><module>tkinter.test.test_ttk.test_style</module><module>test.test_http_cookies</module><module>json.decoder</module><module>ctypes.test.test_errcheck</module><module>unittest.test.test_program</module><module>lib2to3.tests.test_refactor</module><module>io</module><module>multiprocessing.queues</module><module>dbm.dumb</module><module>sqlite3</module><module>unittest.test.test_runner</module><module>ctypes.test.test_anon</module><module>test.test_property</module><module>test.test_macos</module><module>distutils.tests.test_filelist</module><module>ctypes.test.test_macholib</module><module>distutils.tests.test_bdist</module><module>ctypes.macholib.dylib</module><module>test.test_dbm_dumb</module><module>ctypes.test</module><module>distutils.tests.test_archive_util</module><module>lib2to3.fixes.fix_getcwdu</module><module>lib2to3.fixes.fix_raw_input</module><module>_ctypes_test</module><module>email.mime</module><module>test.test_mutex</module><module>test.test_argparse</module><module>json.tool</module><module>ctypes.test.test_find</module><module>unittest.main</module><module>multiprocessing.forking</module><module>json.tests.test_decode</module><module>multiprocessing.dummy</module><module>test.test_with</module><module>_bytesio</module><module>ctypes.test.test_returnfuncptrs</module><module>ctypes.test.test_memfunctions</module><module>test.test_sysconfig</module><module>distutils.tests.test_upload</module><module>test.test_py3kwarn</module><module>encodings.mac_romanian</module><module>test.test_dictcomps</module><module>bsddb.test.test_cursor_pget_bug</module><module>multiprocessing.reduction</module><module>test.win_console_handler</module><module>test.datetimetester</module><module>ctypes.test.test_buffers</module><module>lib2to3.fixes.fix_execfile</module><module>test.test_sys_settrace</module><module>ctypes.test.test_structures</module><module>wsgiref</module><module>turtledemo.peace</module><module>multiprocessing.managers</module><module>test.test_old_mailbox</module><module>encodings.mac_farsi</module><module>unittest.loader</module><module>idlelib.AutoComplete</module><module>email.mime.multipart</module><module>bsddb.test.test_dbenv</module><module>lib2to3.tests.test_parser</module><module>importlib.test.extension.util</module><module>lib2to3.fixes.fix_dict</module><module>bsddb.test.test_sequence</module><module>importlib.machinery</module><module>email.test.test_email_renamed</module><module>ctypes.test.test_incomplete</module><module>xml.etree.ElementInclude</module><module>lib2to3.fixes.fix_numliterals</module><module>lib2to3.fixes.fix_map</module><module>_pyio</module><module>_struct</module><module>json.tests.test_separators</module><module>importlib.test.test_util</module><module>test.pydoc_mod</module><module>json.tests.test_float</module><module>unittest.test.test_discovery</module><module>concurrent.futures.thread</module><module>test.make_ssl_certs</module><module>lib2to3.fixes.fix_nonzero</module><module>distutils.tests.setuptools_build_ext</module><module>lib2to3.btm_utils</module><module>genericpath</module><module>spwd</module><module>test.test_defaultdict</module><module>json.tests.test_check_circular</module><module>distutils.tests.test_config_cmd</module><module>concurrent</module><module>importlib.test.test_abc</module><module>email.mime.audio</module><module>test.test_bigaddrspace</module><module>distutils.tests.test_check</module><module>sqlite3.test.userfunctions</module><module>unittest.test.test_assertions</module><module>ctypes.test.test_bitfields</module><module>distutils.tests.test_bdist_wininst</module><module>turtledemo.paint</module><module>test.tracedmodules</module><module>lib2to3.fixes.fix_raise</module><module>idlelib.MultiCall</module><module>test.time_hashlib</module><module>lib2to3.fixes.fix_exec</module><module>urllib.parse</module><module>_elementtree</module><module>test.test_gdb</module><module>test.json_tests.test_pass2</module><module>test.json_tests.test_pass3</module><module>distutils.command.install_egg_info</module><module>wsgiref.util</module><module>json.tests.test_dump</module><module>ctypes.test.test_unaligned_structures</module><module>lib2to3.pygram</module><module>http.server</module><module>tkinter.constants</module><module>test.test_smtpd</module><module>distutils.msvc9compiler</module><module>test.json_tests.test_decode</module><module>multiprocessing</module><module>test.test_kqueue</module><module>unittest.test.support</module><module>lib2to3.pytree</module><module>_thread</module><module>importlib.test</module><module>test.test_cProfile</module><module>distutils.tests.test_spawn</module><module>unittest.suite</module><module>_ctypes</module><module>test.test_reprlib</module><module>json.scanner</module><module>importlib.test.import_.test_packages</module><module>importlib.test.regrtest</module><module>lib2to3.fixes.fix_imports</module><module>test.test_concurrent_futures</module><module>distutils.tests.test_cygwinccompiler</module><module>distutils.tests.setuptools_extension</module><module>tkinter.test</module><module>test.json_tests.test_scanstring</module><module>importlib.test.abc</module><module>lib2to3.main</module><module>distutils.tests.test_msvc9compiler</module><module>test.buffer_tests</module><module>test.encoded_modules</module><module>tkinter.messagebox</module><module>test.outstanding_bugs</module><module>idlelib.HyperParser</module><module>importlib.test.source.test_source_encoding</module><module>test.fork_wait</module><module>_ast</module><module>_datetime</module><module>unittest.test.test_functiontestcase</module><module>importlib.test.source.test_finder</module><module>test.test_telnetlib</module><module>wsgiref.headers</module><module>distutils.tests.test_extension</module><module>importlib.test.import_.test_api</module><module>xml.etree.ElementPath</module><module>tkinter.test.test_ttk.test_extensions</module><module>test.test_int_literal</module><module>importlib._bootstrap</module><module>importlib.test.import_.test_path</module><module>importlib.test.util</module><module>lib2to3.fixes.fix_tuple_params</module><module>test.encoded_modules.module_iso_8859_1</module><module>importlib.test.source</module><module>test.test_numeric_tower</module><module>ctypes.test.test_unicode</module><module>turtledemo.two_canvases</module><module>test.test_zipfile64</module><module>lib2to3.fixes.fix_operator</module><module>lib2to3.fixes.fix_isinstance</module><module>test.test_pydoc</module><module>_weakrefset</module><module>lib2to3.fixes.fix_reduce</module><module>test.test_ftplib</module><module>turtledemo.chaos</module><module>test.test_index</module><module>tkinter.filedialog</module><module>test.test_flufl</module><module>email.mime.text</module><module>sysconfig</module><module>tkinter.__main__</module><module>builtins</module><module>test.test_runpy</module><module>test.test_cprofile</module><module>importlib.test.extension</module><module>pydoc_topics</module><module>lib2to3.tests.test_fixers</module><module>unittest.util</module><module>lib2to3.fixes</module><module>importlib.test.source.util</module><module>test.test_sunau</module><module>test.test_raise</module><module>lib2to3.fixes.fix_intern</module><module>lib2to3.pgen2.driver</module><module>distutils.versionpredicate</module><module>test.test_exception_variations</module><module>turtle</module><module>test.test_wsgiref</module><module>test.json_tests.test_speedups</module><module>test.test_uuid</module><module>unittest.test</module><module>ctypes.util</module><module>lib2to3.fixes.fix_has_key</module><module>distutils.tests.test_versionpredicate</module><module>importlib.test.import_</module><module>test.test_compileall</module><module>lib2to3.tests.test_util</module><module>test.test_email_renamed</module><module>importlib.test.extension.test_finder</module><module>lib2to3.patcomp</module><module>turtledemo</module><module>test.json_tests.test_default</module><module>_string</module><module>sqlite3.test.dump</module><module>test.test_fileio</module><module>lib2to3.tests.test_main</module><module>ctypes.test.test_numbers</module><module>importlib.test.__main__</module><module>test.test_ctypes</module><module>fpectl</module><module>encodings.mac_centeuro</module><module>test.inspect_fodder2</module><module>test.test_SimpleHTTPServer</module><module>test.mock_socket</module><module>ctypes.test.test_random_things</module><module>test.json_tests.test_encode_basestring_ascii</module><module>distutils.tests.test_bdist_rpm</module><module>distutils.config</module><module>test.test_dbm_ndbm</module><module>distutils.tests.test_config</module><module>lib2to3.fixes.fix_repr</module><module>test.test_osx_env</module><module>test.test_modulefinder</module><module>test.test_aifc</module><module>wsgiref.simple_server</module><module>lib2to3.fixes.fix_import</module><module>_hashlib</module><module>test.inspect_fodder</module><module>test.test_platform</module><module>copyreg</module><module>ctypes.test.test_internals</module><module>test.test_docxmlrpc</module><module>concurrent.futures</module><module>xml.etree.cElementTree</module><module>unittest.result</module><module>concurrent.futures._base</module><module>lib2to3.fixes.fix_xrange</module><module>tkinter.test.test_tkinter</module><module>_curses_panel</module><module>future_builtins</module><module>lib2to3.fixes.fix_itertools_imports</module><module>lib2to3.tests</module><module>_io</module><module>sqlite3.test.hooks</module><module>dbm</module><module>_multiprocessing</module><module>lib2to3.fixes.fix_paren</module><module>test.dis_module</module><module>_compat_pickle</module><module>importlib</module><module>json.tests.test_encode_basestring_ascii</module><module>_json</module><module>pyexpat.errors</module><module>ctypes.test.runtests</module><module>cProfile</module><module>tkinter.test.test_tkinter.test_loadtk</module><module>test.test_memoryio</module><module>lib2to3.fixes.fix_itertools</module><module>test.test_rlcompleter</module><module>test.test_sndhdr</module><module>ssl</module><module>test.test_smtplib</module><module>test.test_int</module><module>ctypes.test.test_delattr</module><module>distutils.tests.test_bdist_dumb</module><module>unittest.runner</module><module>test.test_dictviews</module><module>ctypes.wintypes</module><module>test.test_strlit</module><module>test.test_ttk_guionly</module><module>encodings.cp858</module><module>lib2to3.fixes.fix_urllib</module><module>pydoc_data</module><module>test.test_xml_etree_c</module><module>lib2to3.fixes.fix_funcattrs</module><module>plistlib</module><module>multiprocessing.dummy.connection</module><module>unittest.case</module><module>json.tests.test_indent</module><module>distutils.tests.test_dir_util</module><module>test.json_tests.test_float</module><module>tkinter.test.support</module><module>unittest.test.dummy</module><module>lib2to3.tests.test_pytree</module><module>ctypes.test.test_values</module><module>json.tests.test_fail</module><module>_pickle</module><module>lib2to3.fixes.fix_zip</module><module>test.test_structmembers</module><module>bsddb.test.test_replication</module><module>tkinter.dnd</module><module>sqlite3.dump</module><module>test.test_pkgutil</module><module>importlib.test.builtin</module><module>json</module><module>lib2to3.pgen2.tokenize</module><module>turtledemo.round_dance</module><module>test.encoded_modules.module_koi8_r</module><module>test.test_nntplib</module><module>ctypes.test.test_sizes</module><module>tkinter</module><module>ctypes.test.test_arrays</module><module>sqlite3.test.transactions</module><module>ctypes.test.test_strings</module><module>ctypes.test.test_objects</module><module>lib2to3.fixes.fix_basestring</module><module>distutils.tests.test_install_headers</module><module>test.test_importlib</module><module>ctypes.test.test_refcounts</module><module>sqlite3.test.dbapi</module><module>test.test_smtpnet</module><module>tkinter.colorchooser</module><module>encodings.utf_32_be</module><module>test.test_tk</module><module>turtledemo.penrose</module><module>test.json_tests.test_dump</module><module>lib2to3.fixes.fix_throw</module><module>test.test_ssl</module><module>test.test_xdrlib</module><module>html</module><module>email.test.test_email_codecs_renamed</module><module>dbm.ndbm</module><module>turtledemo.wikipedia</module><module>http</module><module>unittest.test.test_loader</module><module>ctypes.test.test_struct_fields</module><module>bsddb.test.test_db</module><module>xmlrpc.server</module><module>ctypes.test.test_parameters</module><module>urllib.error</module><module>distutils.tests.test_build_clib</module><module>json.tests.test_pass2</module><module>json.tests.test_pass3</module><module>json.tests.test_pass1</module><module>test.test_weakset</module><module>test.test_strtod</module><module>test.test_io</module><module>html.entities</module><module>test.gdb_sample</module><module>http.client</module><module>test.test_msilib</module><module>ctypes.test.test_repr</module><module>importlib.test.frozen</module><module>_dbm</module><module>multiprocessing.sharedctypes</module><module>encodings.utf_32_le</module><module>test.curses_tests</module><module>tkinter.simpledialog</module><module>importlib.test.builtin.util</module><module>test.test_codecencodings_iso2022</module><module>xmlrpc</module><module>test.test_unpack_ex</module><module>importlib.abc</module><module>distutils.tests.test_version</module><module>test.test_bytes</module><module>tkinter.test.test_tkinter.test_text</module><module>turtledemo.__main__</module><module>test.support</module><module>test.test_urllib2_localnet</module><module>test.test_syslog</module><module>multiprocessing.process</module><module>distutils.tests.test_register</module><module>importlib.test.source.test_abc_loader</module><module>importlib.test.test_api</module><module>test.test_code</module><module>test.test_super</module><module>lib2to3.fixes.fix_next</module><module>tkinter.test.runtktests</module><module>test.test_genericpath</module><module>distutils.tests.test_sysconfig</module><module>test.test_listcomps</module><module>test.test_functools</module><module>test.test_ast</module><module>http.cookiejar</module><module>lib2to3.fixes.fix_set_literal</module><module>distutils.tests.test_dep_util</module><module>idlelib.RstripExtension</module><module>test.test_ascii_formatd</module><module>lib2to3.fixes.fix_future</module><module>json.tests.test_default</module><module>sqlite3.dbapi2</module><module>test.relimport</module><module>unittest.test.test_suite</module><module>_functools</module><module>test.lock_tests</module><module>lib2to3.pgen2.token</module><module>test.test_typechecks</module><module>ctypes.macholib.framework</module><module>idlelib.AutoCompleteWindow</module><module>lib2to3.fixes.fix_except</module><module>importlib.test.builtin.test_loader</module><module>sqlite3.test.regression</module><module>test.json_tests.test_unicode</module><module>lib2to3.tests.support</module><module>distutils.command.check</module><module>urllib.robotparser</module><module>multiprocessing.connection</module><module>test.test_fractions</module><module>test.test_abc</module><module>_warnings</module><module>importlib.test.extension.test_loader</module><module>lib2to3.fixes.fix_ne</module><module>test.test_buffer</module><module>lib2to3.fixes.fix_filter</module><module>importlib.test.source.test_case_sensitivity</module><module>wsgiref.validate</module><module>turtledemo.tree</module><module>_types</module><module>test.test_pdb</module><module>test.test_timeit</module><module>lib2to3.pgen2.literals</module><module>email.mime.base</module><module>ctypes.test.test_as_parameter</module><module>test.test_bigmem</module><module>ctypes.test.test_frombuffer</module><module>test.test_undocumented_details</module><module>test.test_pstats</module><module>contextlib</module><module>email.mime.nonmultipart</module><module>test.test_pipes</module><module>lib2to3.fixes.fix_sys_exc</module><module>test.test_poplib</module><module>test.test_metaclass</module><module>ctypes.test.test_varsize_struct</module><module>_abcoll</module><module>lib2to3.__main__</module><module>importlib.test.import_.util</module><module>test.test_startfile</module><module>unittest.signals</module><module>ctypes.test.test_errno</module><module>test.test_pep352</module><module>distutils.tests.test_cmd</module><module>bsddb.test.test_compare</module><module>test.test_json</module><module>test.test_httpservers</module><func>bytearray</func><func>all</func><func>memoryview</func><func>next</func><func>bin</func><func>bytes</func><func>ascii</func><func>format</func><func>any</func><func>print</func></python><python version="2.5"><module>importlib.test.source.test_file_loader</module><module>test.test_future_builtins</module><module>_dummy_thread</module><module>pydoc_data.topics</module><module>test.test_epoll</module><module>dbm.gnu</module><module>tkinter.test.test_tkinter.test_font</module><module>lib2to3.fixer_util</module><module>importlib.test.import_.test_caching</module><module>bsddb.test.test_distributed_transactions</module><module>antigravity</module><module>json.encoder</module><module>test.test_future5</module><module>test.test_future4</module><module>test.json_tests.test_recursion</module><module>multiprocessing.pool</module><module>tkinter._fix</module><module>test.ssl_servers</module><module>lib2to3.fixes.fix_methodattrs</module><module>turtledemo.minimal_hanoi</module><module>turtledemo.fractalcurves</module><module>turtledemo.lindenmayer</module><module>test.test_abstract_numbers</module><module>ctypes.test.test_pickling</module><module>lib2to3.fixer_base</module><module>lib2to3.fixes.fix_types</module><module>ctypes.test.test_pep3118</module><module>test.json_tests.test_separators</module><module>importlib.test.import_.test___package__</module><module>importlib.test.benchmark</module><module>json.tests.test_unicode</module><module>turtledemo.colormixer</module><module>lib2to3.fixes.fix_xreadlines</module><module>tkinter.ttk</module><module>distutils.tests.test_core</module><module>encodings.cp720</module><module>test.json_tests</module><module>unittest.test.test_result</module><module>test.test_sched</module><module>turtledemo.yinyang</module><module>test.test_xmlrpc_net</module><module>test.test_sys_setprofile</module><module>tkinter.test.test_ttk</module><module>test.test_ttk_textonly</module><module>fractions</module><module>importlib.test.source.test_path_hook</module><module>reconvert</module><module>bsddb.test.test_fileid</module><module>tkinter.font</module><module>unittest.__main__</module><module>tkinter.commondialog</module><module>lib2to3.fixes.fix_apply</module><module>test.test_keywordonlyarg</module><module>test.test_setcomps</module><module>test.test_collections</module><module>json.tests.test_speedups</module><module>json.tests.test_recursion</module><module>numbers</module><module>test.test_cmd</module><module>email.MIMEBase</module><module>lib2to3.fixes.fix_long</module><module>concurrent.futures.process</module><module>distutils.tests.test_build</module><module>test.test_urllib_response</module><module>idlelib.tabbedpages</module><module>urllib.request</module><module>test.test_print</module><module>argparse</module><module>test.test_multiprocessing</module><module>test.test_dbm_gnu</module><module>importlib.util</module><module>test.json_tests.test_pass1</module><module>turtledemo.bytedesign</module><module>lib2to3.pgen2.pgen</module><module>distutils.tests.test_install_data</module><module>test.script_helper</module><module>test.test_readline</module><module>unittest.test.test_break</module><module>multiprocessing.synchronize</module><module>multiprocessing.heap</module><module>test.test_dynamic</module><module>lib2to3.fixes.fix_imports2</module><module>lib2to3.fixes.fix_unicode</module><module>test.test_pep3120</module><module>distutils.tests.test_log</module><module>test.test_asyncore</module><module>importlib.test.builtin.test_finder</module><module>distutils.tests.test_build_ext</module><module>test.test_http_cookiejar</module><module>ast</module><module>test.test_html</module><module>sqlite3.test.py25tests</module><module>lib2to3.refactor</module><module>unittest.test.test_setups</module><module>distutils.tests.test_install_lib</module><module>test.test_pep3131</module><module>test.__main__</module><module>test.badsyntax_pep3120</module><module>_collections</module><module>lib2to3.fixes.fix_metaclass</module><module>tkinter.test.test_ttk.test_functions</module><module>turtledemo.planet_and_moon</module><module>unittest.test._test_warnings</module><module>distutils.tests.test_sdist</module><module>importlib.test.frozen.test_loader</module><module>test.test_lib2to3</module><module>lib2to3.fixes.fix_idioms</module><module>unittest.test.test_skipping</module><module>tkinter.tix</module><module>_posixsubprocess</module><module>_curses</module><module>turtledemo.clock</module><module>_fileio</module><module>reprlib</module><module>lib2to3.fixes.fix_print</module><module>test.test_range</module><module>xmlrpc.client</module><module>lib2to3.fixes.fix_callable</module><module>lib2to3</module><module>lib2to3.fixes.fix_standarderror</module><module>abc</module><module>importlib.test.extension.test_case_sensitivity</module><module>test.test_copyreg</module><module>distutils.tests.test_ccompiler</module><module>unittest.test.test_case</module><module>distutils.tests.test_text_file</module><module>test.json_tests.test_indent</module><module>tkinter.dialog</module><module>regex_syntax</module><module>test.test_memoryview</module><module>json.tests.test_scanstring</module><module>json.tests</module><module>importlib.test.import_.test_fromlist</module><module>lib2to3.btm_matcher</module><module>distutils.tests.test_util</module><module>_markupbase</module><module>test.test_regex</module><module>importlib.test.import_.test_meta_path</module><module>lib2to3.tests.pytree_idempotency</module><module>lib2to3.fixes.fix_buffer</module><module>turtledemo.forest</module><module>tkinter.test.test_ttk.test_widgets</module><module>test.warning_tests</module><module>lib2to3.pgen2.conv</module><module>importlib.test.frozen.test_finder</module><module>lib2to3.fixes.fix_renames</module><module>test.test_file2k</module><module>bsddb.test.test_early_close</module><module>html.parser</module><module>ctypes.test.test_bytes</module><module>test.test_univnewlines2k</module><module>test.test_linecache</module><module>lib2to3.pgen2.parse</module><module>lib2to3.fixes.fix_input</module><module>urllib.response</module><module>distutils.tests.test_unixccompiler</module><module>distutils.tests.test_clean</module><module>multiprocessing.util</module><module>lib2to3.pgen2</module><module>test.test_zipimport_support</module><module>build_class</module><module>http.cookies</module><module>lib2to3.fixes.fix_exitfunc</module><module>test.json_tests.test_fail</module><module>test.badsyntax_3131</module><module>lib2to3.tests.test_all_fixers</module><module>test.profilee</module><module>_stringio</module><module>tkinter.scrolledtext</module><module>test.tracedmodules.testmod</module><module>importlib.test.extension.test_path_hook</module><module>importlib.test.import_.test_relative_imports</module><module>distutils.tests.test_bdist_msi</module><module>encodings.utf_32</module><module>turtledemo.nim</module><module>lib2to3.fixes.fix_ws_comma</module><module>lib2to3.pgen2.grammar</module><module>test.test_cmd_line_script</module><module>distutils.tests.test_file_util</module><module>tkinter.test.test_ttk.test_style</module><module>test.test_http_cookies</module><module>json.decoder</module><module>unittest.test.test_program</module><module>lib2to3.tests.test_refactor</module><module>io</module><module>multiprocessing.queues</module><module>dbm.dumb</module><module>unittest.test.test_runner</module><module>test.test_property</module><module>test.test_macos</module><module>distutils.tests.test_filelist</module><module>distutils.tests.test_bdist</module><module>test.test_dbm_dumb</module><module>distutils.tests.test_archive_util</module><module>lib2to3.fixes.fix_getcwdu</module><module>lib2to3.fixes.fix_raw_input</module><module>test.test_mutex</module><module>test.test_argparse</module><module>json.tool</module><module>unittest.main</module><module>multiprocessing.forking</module><module>json.tests.test_decode</module><module>multiprocessing.dummy</module><module>_bytesio</module><module>test.test_sysconfig</module><module>distutils.tests.test_upload</module><module>test.test_py3kwarn</module><module>test.test_dictcomps</module><module>multiprocessing.reduction</module><module>test.win_console_handler</module><module>test.datetimetester</module><module>lib2to3.fixes.fix_execfile</module><module>whrandom</module><module>test.test_sys_settrace</module><module>turtledemo.peace</module><module>multiprocessing.managers</module><module>unittest.loader</module><module>bsddb.test.test_dbenv</module><module>lib2to3.tests.test_parser</module><module>importlib.test.extension.util</module><module>lib2to3.fixes.fix_dict</module><module>importlib.machinery</module><module>lib2to3.fixes.fix_numliterals</module><module>lib2to3.fixes.fix_map</module><module>_pyio</module><module>json.tests.test_separators</module><module>importlib.test.test_util</module><module>test.pydoc_mod</module><module>json.tests.test_float</module><module>tzparse</module><module>unittest.test.test_discovery</module><module>concurrent.futures.thread</module><module>test.make_ssl_certs</module><module>lib2to3.fixes.fix_nonzero</module><module>distutils.tests.setuptools_build_ext</module><module>lib2to3.btm_utils</module><module>genericpath</module><module>json.tests.test_check_circular</module><module>distutils.tests.test_config_cmd</module><module>concurrent</module><module>importlib.test.test_abc</module><module>distutils.tests.test_check</module><module>unittest.test.test_assertions</module><module>distutils.tests.test_bdist_wininst</module><module>test.test_timing</module><module>turtledemo.paint</module><module>test.tracedmodules</module><module>lib2to3.fixes.fix_raise</module><module>lib2to3.fixes.fix_exec</module><module>urllib.parse</module><module>test.test_gdb</module><module>test.json_tests.test_pass2</module><module>test.json_tests.test_pass3</module><module>json.tests.test_dump</module><module>lib2to3.pygram</module><module>http.server</module><module>tkinter.constants</module><module>test.test_smtpd</module><module>distutils.msvc9compiler</module><module>test.json_tests.test_decode</module><module>multiprocessing</module><module>test.test_kqueue</module><module>unittest.test.support</module><module>lib2to3.pytree</module><module>_thread</module><module>importlib.test</module><module>distutils.tests.test_spawn</module><module>unittest.suite</module><module>test.test_reprlib</module><module>json.scanner</module><module>importlib.test.import_.test_packages</module><module>importlib.test.regrtest</module><module>lib2to3.fixes.fix_imports</module><module>test.test_concurrent_futures</module><module>distutils.tests.test_cygwinccompiler</module><module>distutils.tests.setuptools_extension</module><module>tkinter.test</module><module>test.json_tests.test_scanstring</module><module>importlib.test.abc</module><module>lib2to3.main</module><module>regex</module><module>email.MIMEMessage</module><module>distutils.tests.test_msvc9compiler</module><module>test.buffer_tests</module><module>test.encoded_modules</module><module>tkinter.messagebox</module><module>importlib.test.source.test_source_encoding</module><module>_datetime</module><module>unittest.test.test_functiontestcase</module><module>importlib.test.source.test_finder</module><module>test.test_telnetlib</module><module>distutils.tests.test_extension</module><module>importlib.test.import_.test_api</module><module>tkinter.test.test_ttk.test_extensions</module><module>test.test_int_literal</module><module>importlib._bootstrap</module><module>importlib.test.import_.test_path</module><module>importlib.test.util</module><module>lib2to3.fixes.fix_tuple_params</module><module>test.encoded_modules.module_iso_8859_1</module><module>importlib.test.source</module><module>test.test_numeric_tower</module><module>turtledemo.two_canvases</module><module>lib2to3.fixes.fix_operator</module><module>lib2to3.fixes.fix_isinstance</module><module>test.test_pydoc</module><module>_weakrefset</module><module>lib2to3.fixes.fix_reduce</module><module>test.test_ftplib</module><module>turtledemo.chaos</module><module>tkinter.filedialog</module><module>test.test_flufl</module><module>sysconfig</module><module>email.MIMEImage</module><module>tkinter.__main__</module><module>email.MIMEText</module><module>builtins</module><module>test.test_cprofile</module><module>importlib.test.extension</module><module>pydoc_topics</module><module>lib2to3.tests.test_fixers</module><module>unittest.util</module><module>lib2to3.fixes</module><module>importlib.test.source.util</module><module>test.test_sunau</module><module>test.test_raise</module><module>lib2to3.fixes.fix_intern</module><module>lib2to3.pgen2.driver</module><module>turtle</module><module>test.json_tests.test_speedups</module><module>unittest.test</module><module>lib2to3.fixes.fix_has_key</module><module>importlib.test.import_</module><module>test.test_compileall</module><module>lib2to3.tests.test_util</module><module>importlib.test.extension.test_finder</module><module>lib2to3.patcomp</module><module>turtledemo</module><module>test.json_tests.test_default</module><module>_string</module><module>idlelib.buildapp</module><module>sqlite3.test.dump</module><module>test.test_fileio</module><module>lib2to3.tests.test_main</module><module>importlib.test.__main__</module><module>fpectl</module><module>test.test_SimpleHTTPServer</module><module>test.mock_socket</module><module>test.json_tests.test_encode_basestring_ascii</module><module>distutils.tests.test_bdist_rpm</module><module>distutils.config</module><module>test.test_dbm_ndbm</module><module>distutils.tests.test_config</module><module>lib2to3.fixes.fix_repr</module><module>test.test_osx_env</module><module>test.test_modulefinder</module><module>test.test_aifc</module><module>lib2to3.fixes.fix_import</module><module>copyreg</module><module>test.test_docxmlrpc</module><module>concurrent.futures</module><module>unittest.result</module><module>concurrent.futures._base</module><module>statcache</module><module>lib2to3.fixes.fix_xrange</module><module>tkinter.test.test_tkinter</module><module>_curses_panel</module><module>future_builtins</module><module>lib2to3.fixes.fix_itertools_imports</module><module>lib2to3.tests</module><module>_io</module><module>dbm</module><module>_multiprocessing</module><module>lib2to3.fixes.fix_paren</module><module>test.dis_module</module><module>_compat_pickle</module><module>importlib</module><module>json.tests.test_encode_basestring_ascii</module><module>_json</module><module>tkinter.test.test_tkinter.test_loadtk</module><module>test.test_memoryio</module><module>lib2to3.fixes.fix_itertools</module><module>test.test_rlcompleter</module><module>test.test_sndhdr</module><module>ssl</module><module>timing</module><module>test.test_smtplib</module><module>test.test_int</module><module>distutils.tests.test_bdist_dumb</module><module>unittest.runner</module><module>test.test_dictviews</module><module>test.test_strlit</module><module>test.test_ttk_guionly</module><module>encodings.cp858</module><module>lib2to3.fixes.fix_urllib</module><module>pydoc_data</module><module>lib2to3.fixes.fix_funcattrs</module><module>plistlib</module><module>multiprocessing.dummy.connection</module><module>unittest.case</module><module>json.tests.test_indent</module><module>distutils.tests.test_dir_util</module><module>test.json_tests.test_float</module><module>tkinter.test.support</module><module>unittest.test.dummy</module><module>lib2to3.tests.test_pytree</module><module>json.tests.test_fail</module><module>_pickle</module><module>email.MIMEMultipart</module><module>lib2to3.fixes.fix_zip</module><module>bsddb.test.test_replication</module><module>tkinter.dnd</module><module>sqlite3.dump</module><module>test.test_pkgutil</module><module>importlib.test.builtin</module><module>json</module><module>lib2to3.pgen2.tokenize</module><module>turtledemo.round_dance</module><module>test.encoded_modules.module_koi8_r</module><module>test.test_nntplib</module><module>tkinter</module><module>email.MIMENonMultipart</module><module>lib2to3.fixes.fix_basestring</module><module>distutils.tests.test_install_headers</module><module>test.test_importlib</module><module>test.test_smtpnet</module><module>tkinter.colorchooser</module><module>encodings.utf_32_be</module><module>test.test_tk</module><module>turtledemo.penrose</module><module>test.json_tests.test_dump</module><module>lib2to3.fixes.fix_throw</module><module>test.test_ssl</module><module>html</module><module>dbm.ndbm</module><module>turtledemo.wikipedia</module><module>http</module><module>unittest.test.test_loader</module><module>bsddb.test.test_db</module><module>xmlrpc.server</module><module>urllib.error</module><module>distutils.tests.test_build_clib</module><module>json.tests.test_pass2</module><module>json.tests.test_pass3</module><module>json.tests.test_pass1</module><module>test.test_weakset</module><module>test.test_strtod</module><module>test.test_io</module><module>html.entities</module><module>test.gdb_sample</module><module>http.client</module><module>test.test_msilib</module><module>importlib.test.frozen</module><module>_dbm</module><module>multiprocessing.sharedctypes</module><module>encodings.utf_32_le</module><module>test.curses_tests</module><module>tkinter.simpledialog</module><module>importlib.test.builtin.util</module><module>test.test_codecencodings_iso2022</module><module>xmlrpc</module><module>test.test_unpack_ex</module><module>importlib.abc</module><module>distutils.tests.test_version</module><module>test.test_bytes</module><module>tkinter.test.test_tkinter.test_text</module><module>turtledemo.__main__</module><module>test.support</module><module>test.test_syslog</module><module>multiprocessing.process</module><module>distutils.tests.test_register</module><module>importlib.test.source.test_abc_loader</module><module>importlib.test.test_api</module><module>test.test_super</module><module>lib2to3.fixes.fix_next</module><module>tkinter.test.runtktests</module><module>test.test_genericpath</module><module>distutils.tests.test_sysconfig</module><module>email.MIMEAudio</module><module>test.test_listcomps</module><module>http.cookiejar</module><module>lib2to3.fixes.fix_set_literal</module><module>distutils.tests.test_dep_util</module><module>idlelib.RstripExtension</module><module>test.test_ascii_formatd</module><module>lib2to3.fixes.fix_future</module><module>json.tests.test_default</module><module>test.relimport</module><module>unittest.test.test_suite</module><module>test.lock_tests</module><module>lib2to3.pgen2.token</module><module>test.test_typechecks</module><module>lib2to3.fixes.fix_except</module><module>importlib.test.builtin.test_loader</module><module>test.json_tests.test_unicode</module><module>lib2to3.tests.support</module><module>distutils.command.check</module><module>urllib.robotparser</module><module>multiprocessing.connection</module><module>regsub</module><module>test.test_fractions</module><module>test.test_abc</module><module>_warnings</module><module>importlib.test.extension.test_loader</module><module>lib2to3.fixes.fix_ne</module><module>test.test_buffer</module><module>lib2to3.fixes.fix_filter</module><module>importlib.test.source.test_case_sensitivity</module><module>turtledemo.tree</module><module>test.test_pdb</module><module>test.test_timeit</module><module>lib2to3.pgen2.literals</module><module>ctypes.test.test_frombuffer</module><module>test.test_undocumented_details</module><module>test.test_pstats</module><module>test.test_pipes</module><module>lib2to3.fixes.fix_sys_exc</module><module>test.test_poplib</module><module>test.test_metaclass</module><module>_abcoll</module><module>lib2to3.__main__</module><module>importlib.test.import_.util</module><module>unittest.signals</module><module>ctypes.test.test_errno</module><module>distutils.tests.test_cmd</module><module>test.test_json</module><module>test.test_httpservers</module><func>bytearray</func><func>memoryview</func><func>next</func><func>bin</func><func>bytes</func><func>ascii</func><func>format</func><func>print</func></python><python version="2.6"><module>importlib.test.source.test_file_loader</module><module>_dummy_thread</module><module>bsddb.test.test_env_close</module><module>pydoc_data.topics</module><module>dbm.gnu</module><module>tkinter.test.test_tkinter.test_font</module><module>importlib.test.import_.test_caching</module><module>antigravity</module><module>test.json_tests.test_recursion</module><module>tkinter._fix</module><module>test.ssl_servers</module><module>turtledemo.minimal_hanoi</module><module>turtledemo.fractalcurves</module><module>turtledemo.lindenmayer</module><module>test.json_tests.test_separators</module><module>importlib.test.import_.test___package__</module><module>importlib.test.benchmark</module><module>turtledemo.colormixer</module><module>tkinter.ttk</module><module>encodings.cp720</module><module>test.json_tests</module><module>unittest.test.test_result</module><module>test.test_sched</module><module>turtledemo.yinyang</module><module>test.test_xmlrpc_net</module><module>test.test_sys_setprofile</module><module>tkinter.test.test_ttk</module><module>test.test_ttk_textonly</module><module>importlib.test.source.test_path_hook</module><module>reconvert</module><module>bsddb.test.test_fileid</module><module>tkinter.font</module><module>unittest.__main__</module><module>tkinter.commondialog</module><module>test.test_keywordonlyarg</module><module>test.test_setcomps</module><module>email.MIMEBase</module><module>concurrent.futures.process</module><module>test.test_operations</module><module>distutils.tests.test_build</module><module>test.test_urllib_response</module><module>urllib.request</module><module>argparse</module><module>test.test_dbm_gnu</module><module>importlib.util</module><module>test.json_tests.test_pass1</module><module>turtledemo.bytedesign</module><module>psycopg2</module><module>distutils.tests.test_install_data</module><module>test.script_helper</module><module>unittest.test.test_break</module><module>test.test_dynamic</module><module>test.test_pep3120</module><module>distutils.tests.test_log</module><module>importlib.test.builtin.test_finder</module><module>test.test_http_cookiejar</module><module>test.test_html</module><module>unittest.test.test_setups</module><module>test.test_pep3131</module><module>test.__main__</module><module>test.badsyntax_pep3120</module><module>tkinter.test.test_ttk.test_functions</module><module>turtledemo.planet_and_moon</module><module>unittest.test._test_warnings</module><module>importlib.test.frozen.test_loader</module><module>idlelib.tabpage</module><module>unittest.test.test_skipping</module><module>tkinter.tix</module><module>_posixsubprocess</module><module>_curses</module><module>turtledemo.clock</module><module>reprlib</module><module>test.test_range</module><module>xmlrpc.client</module><module>importlib.test.extension.test_case_sensitivity</module><module>test.test_copyreg</module><module>distutils.tests.test_ccompiler</module><module>unittest.test.test_case</module><module>distutils.tests.test_text_file</module><module>test.json_tests.test_indent</module><module>tkinter.dialog</module><module>regex_syntax</module><module>test.test_memoryview</module><module>importlib.test.import_.test_fromlist</module><module>lib2to3.btm_matcher</module><module>_markupbase</module><module>test.test_regex</module><module>importlib.test.import_.test_meta_path</module><module>turtledemo.forest</module><module>tkinter.test.test_ttk.test_widgets</module><module>importlib.test.frozen.test_finder</module><module>test.test_file2k</module><module>html.parser</module><module>ctypes.test.test_bytes</module><module>test.test_univnewlines2k</module><module>urllib.response</module><module>distutils.tests.test_clean</module><module>build_class</module><module>http.cookies</module><module>test.json_tests.test_fail</module><module>test.badsyntax_3131</module><module>_stringio</module><module>test.test_macfs</module><module>tkinter.scrolledtext</module><module>test.tracedmodules.testmod</module><module>importlib.test.extension.test_path_hook</module><module>importlib.test.import_.test_relative_imports</module><module>distutils.tests.test_bdist_msi</module><module>turtledemo.nim</module><module>distutils.tests.test_file_util</module><module>tkinter.test.test_ttk.test_style</module><module>test.test_http_cookies</module><module>unittest.test.test_program</module><module>dbm.dumb</module><module>unittest.test.test_runner</module><module>distutils.tests.test_bdist</module><module>test.test_dbm_dumb</module><module>distutils.tests.test_archive_util</module><module>test.test_argparse</module><module>unittest.main</module><module>test.test_sysconfig</module><module>test.test_dictcomps</module><module>test.win_console_handler</module><module>test.datetimetester</module><module>whrandom</module><module>test.test_sys_settrace</module><module>turtledemo.peace</module><module>unittest.loader</module><module>bsddb.test.test_dbenv</module><module>importlib.test.extension.util</module><module>test.test_rgbimg</module><module>psycopg2._psycopg</module><module>importlib.machinery</module><module>_pyio</module><module>importlib.test.test_util</module><module>tzparse</module><module>unittest.test.test_discovery</module><module>concurrent.futures.thread</module><module>test.make_ssl_certs</module><module>lib2to3.btm_utils</module><module>json.tests.test_check_circular</module><module>distutils.tests.test_config_cmd</module><module>concurrent</module><module>importlib.test.test_abc</module><module>distutils.tests.test_check</module><module>unittest.test.test_assertions</module><module>test.test_timing</module><module>turtledemo.paint</module><module>test.tracedmodules</module><module>urllib.parse</module><module>test.test_gdb</module><module>test.json_tests.test_pass2</module><module>test.json_tests.test_pass3</module><module>http.server</module><module>tkinter.constants</module><module>test.test_smtpd</module><module>test.json_tests.test_decode</module><module>unittest.test.support</module><module>_thread</module><module>importlib.test</module><module>test.test_cProfile</module><module>distutils.tests.test_spawn</module><module>unittest.suite</module><module>test.test_reprlib</module><module>importlib.test.import_.test_packages</module><module>importlib.test.regrtest</module><module>test.test_concurrent_futures</module><module>distutils.tests.test_cygwinccompiler</module><module>tkinter.test</module><module>test.json_tests.test_scanstring</module><module>importlib.test.abc</module><module>regex</module><module>email.MIMEMessage</module><module>test.encoded_modules</module><module>tkinter.messagebox</module><module>importlib.test.source.test_source_encoding</module><module>_datetime</module><module>unittest.test.test_functiontestcase</module><module>importlib.test.source.test_finder</module><module>distutils.tests.test_extension</module><module>importlib.test.import_.test_api</module><module>tkinter.test.test_ttk.test_extensions</module><module>importlib._bootstrap</module><module>importlib.test.import_.test_path</module><module>importlib.test.util</module><module>test.encoded_modules.module_iso_8859_1</module><module>importlib.test.source</module><module>test.test_numeric_tower</module><module>turtledemo.two_canvases</module><module>_weakrefset</module><module>turtledemo.chaos</module><module>tkinter.filedialog</module><module>test.test_flufl</module><module>sysconfig</module><module>email.MIMEImage</module><module>tkinter.__main__</module><module>email.MIMEText</module><module>builtins</module><module>importlib.test.extension</module><module>gopherlib</module><module>unittest.util</module><module>importlib.test.source.util</module><module>test.test_sunau</module><module>test.test_raise</module><module>turtle</module><module>bsddb.test.test_1413192</module><module>test.json_tests.test_speedups</module><module>unittest.test</module><module>importlib.test.import_</module><module>test.test_compileall</module><module>importlib.test.extension.test_finder</module><module>turtledemo</module><module>test.json_tests.test_default</module><module>_string</module><module>idlelib.buildapp</module><module>importlib.test.__main__</module><module>fpectl</module><module>test.mock_socket</module><module>test.json_tests.test_encode_basestring_ascii</module><module>distutils.tests.test_bdist_rpm</module><module>test.test_dbm_ndbm</module><module>test.test_osx_env</module><module>copyreg</module><module>concurrent.futures</module><module>unittest.result</module><module>concurrent.futures._base</module><module>statcache</module><module>tkinter.test.test_tkinter</module><module>_curses_panel</module><module>_io</module><module>dbm</module><module>test.dis_module</module><module>_compat_pickle</module><module>importlib</module><module>tkinter.test.test_tkinter.test_loadtk</module><module>test.test_rlcompleter</module><module>test.test_sndhdr</module><module>timing</module><module>distutils.tests.test_bdist_dumb</module><module>unittest.runner</module><module>test.test_dictviews</module><module>test.test_strlit</module><module>test.test_ttk_guionly</module><module>encodings.cp858</module><module>pydoc_data</module><module>unittest.case</module><module>distutils.tests.test_dir_util</module><module>test.json_tests.test_float</module><module>tkinter.test.support</module><module>unittest.test.dummy</module><module>_pickle</module><module>email.MIMEMultipart</module><module>tkinter.dnd</module><module>importlib.test.builtin</module><module>turtledemo.round_dance</module><module>test.encoded_modules.module_koi8_r</module><module>test.test_nntplib</module><module>tkinter</module><module>email.MIMENonMultipart</module><module>distutils.tests.test_install_headers</module><module>test.test_importlib</module><module>tkinter.colorchooser</module><module>test.test_tk</module><module>turtledemo.penrose</module><module>test.json_tests.test_dump</module><module>html</module><module>dbm.ndbm</module><module>turtledemo.wikipedia</module><module>http</module><module>unittest.test.test_loader</module><module>test.test_hexoct</module><module>bsddb.test.test_db</module><module>xmlrpc.server</module><module>urllib.error</module><module>distutils.tests.test_build_clib</module><module>test.test_weakset</module><module>test.test_strtod</module><module>html.entities</module><module>test.gdb_sample</module><module>http.client</module><module>test.test_msilib</module><module>importlib.test.frozen</module><module>_dbm</module><module>tkinter.simpledialog</module><module>importlib.test.builtin.util</module><module>test.test_codecencodings_iso2022</module><module>xmlrpc</module><module>test.test_unpack_ex</module><module>importlib.abc</module><module>distutils.tests.test_version</module><module>tkinter.test.test_tkinter.test_text</module><module>turtledemo.__main__</module><module>test.support</module><module>test.test_syslog</module><module>importlib.test.source.test_abc_loader</module><module>importlib.test.test_api</module><module>test.test_super</module><module>tkinter.test.runtktests</module><module>email.MIMEAudio</module><module>test.test_listcomps</module><module>http.cookiejar</module><module>distutils.tests.test_dep_util</module><module>idlelib.RstripExtension</module><module>test.test_ascii_formatd</module><module>unittest.test.test_suite</module><module>importlib.test.builtin.test_loader</module><module>test.json_tests.test_unicode</module><module>distutils.command.check</module><module>urllib.robotparser</module><module>regsub</module><module>importlib.test.extension.test_loader</module><module>importlib.test.source.test_case_sensitivity</module><module>turtledemo.tree</module><module>test.test_socket_ssl</module><module>_types</module><module>test.test_pdb</module><module>test.test_timeit</module><module>test.test_metaclass</module><module>lib2to3.__main__</module><module>importlib.test.import_.util</module><module>unittest.signals</module><module>distutils.tests.test_cmd</module><func>memoryview</func><func>ascii</func></python><python version="2.7"><module>importlib.test.source.test_file_loader</module><module>_dummy_thread</module><module>bsddb.test.test_env_close</module><module>dbm.gnu</module><module>tkinter.test.test_tkinter.test_font</module><module>importlib.test.import_.test_caching</module><module>test.json_tests.test_recursion</module><module>tkinter._fix</module><module>test.ssl_servers</module><module>turtledemo.minimal_hanoi</module><module>turtledemo.fractalcurves</module><module>turtledemo.lindenmayer</module><module>test.json_tests.test_separators</module><module>importlib.test.import_.test___package__</module><module>importlib.test.benchmark</module><module>turtledemo.colormixer</module><module>tkinter.ttk</module><module>test.json_tests</module><module>test.test_sched</module><module>turtledemo.yinyang</module><module>test.test_xmlrpc_net</module><module>tkinter.test.test_ttk</module><module>importlib.test.source.test_path_hook</module><module>reconvert</module><module>tkinter.font</module><module>tkinter.commondialog</module><module>test.test_keywordonlyarg</module><module>test.test_profilehooks</module><module>email.MIMEBase</module><module>concurrent.futures.process</module><module>test.test_operations</module><module>test.test_urllib_response</module><module>urllib.request</module><module>test.test_dbm_gnu</module><module>importlib.util</module><module>test.json_tests.test_pass1</module><module>turtledemo.bytedesign</module><module>psycopg2</module><module>test.test_dynamic</module><module>test.test_pep3120</module><module>distutils.tests.test_log</module><module>importlib.test.builtin.test_finder</module><module>test.test_http_cookiejar</module><module>test.test_html</module><module>test.test_pep3131</module><module>test.__main__</module><module>test.badsyntax_pep3120</module><module>tkinter.test.test_ttk.test_functions</module><module>turtledemo.planet_and_moon</module><module>unittest.test._test_warnings</module><module>importlib.test.frozen.test_loader</module><module>idlelib.tabpage</module><module>tkinter.tix</module><module>_posixsubprocess</module><module>_curses</module><module>turtledemo.clock</module><module>_fileio</module><module>reprlib</module><module>test.test_range</module><module>xmlrpc.client</module><module>importlib.test.extension.test_case_sensitivity</module><module>test.test_copyreg</module><module>test.json_tests.test_indent</module><module>tkinter.dialog</module><module>regex_syntax</module><module>importlib.test.import_.test_fromlist</module><module>_markupbase</module><module>test.test_regex</module><module>importlib.test.import_.test_meta_path</module><module>turtledemo.forest</module><module>tkinter.test.test_ttk.test_widgets</module><module>test.cjkencodings_test</module><module>importlib.test.frozen.test_finder</module><module>html.parser</module><module>ctypes.test.test_bytes</module><module>urllib.response</module><module>build_class</module><module>http.cookies</module><module>test.json_tests.test_fail</module><module>test.badsyntax_3131</module><module>_stringio</module><module>test.test_macfs</module><module>tkinter.scrolledtext</module><module>importlib.test.extension.test_path_hook</module><module>importlib.test.import_.test_relative_imports</module><module>turtledemo.nim</module><module>tkinter.test.test_ttk.test_style</module><module>test.test_http_cookies</module><module>dbm.dumb</module><module>test.test_dbm_dumb</module><module>_bytesio</module><module>test.datetimetester</module><module>whrandom</module><module>turtledemo.peace</module><module>importlib.test.extension.util</module><module>test.test_rgbimg</module><module>psycopg2._psycopg</module><module>importlib.machinery</module><module>importlib.test.test_util</module><module>distutils.mwerkscompiler</module><module>tzparse</module><module>concurrent.futures.thread</module><module>test.make_ssl_certs</module><module>concurrent</module><module>importlib.test.test_abc</module><module>test.test_timing</module><module>turtledemo.paint</module><module>urllib.parse</module><module>test.json_tests.test_pass2</module><module>test.json_tests.test_pass3</module><module>http.server</module><module>tkinter.constants</module><module>test.test_smtpd</module><module>test.json_tests.test_decode</module><module>_thread</module><module>importlib.test</module><module>test.test_cProfile</module><module>test.test_reprlib</module><module>importlib.test.import_.test_packages</module><module>importlib.test.regrtest</module><module>test.test_concurrent_futures</module><module>distutils.tests.test_cygwinccompiler</module><module>tkinter.test</module><module>test.json_tests.test_scanstring</module><module>importlib.test.abc</module><module>regex</module><module>email.MIMEMessage</module><module>test.encoded_modules</module><module>tkinter.messagebox</module><module>importlib.test.source.test_source_encoding</module><module>_datetime</module><module>importlib.test.source.test_finder</module><module>distutils.tests.test_extension</module><module>importlib.test.import_.test_api</module><module>tkinter.test.test_ttk.test_extensions</module><module>importlib._bootstrap</module><module>importlib.test.import_.test_path</module><module>importlib.test.util</module><module>test.encoded_modules.module_iso_8859_1</module><module>importlib.test.source</module><module>test.test_numeric_tower</module><module>turtledemo.two_canvases</module><module>turtledemo.chaos</module><module>tkinter.filedialog</module><module>test.test_flufl</module><module>email.MIMEImage</module><module>tkinter.__main__</module><module>email.MIMEText</module><module>builtins</module><module>importlib.test.extension</module><module>pydoc_topics</module><module>gopherlib</module><module>importlib.test.source.util</module><module>test.test_sunau</module><module>test.test_raise</module><module>turtle</module><module>bsddb.test.test_1413192</module><module>test.json_tests.test_speedups</module><module>importlib.test.import_</module><module>importlib.test.extension.test_finder</module><module>turtledemo</module><module>test.json_tests.test_default</module><module>_string</module><module>idlelib.buildapp</module><module>importlib.test.__main__</module><module>fpectl</module><module>test.mock_socket</module><module>test.json_tests.test_encode_basestring_ascii</module><module>test.test_dbm_ndbm</module><module>test.test_osx_env</module><module>copyreg</module><module>concurrent.futures</module><module>concurrent.futures._base</module><module>statcache</module><module>tkinter.test.test_tkinter</module><module>_curses_panel</module><module>dbm</module><module>test.dis_module</module><module>_compat_pickle</module><module>tkinter.test.test_tkinter.test_loadtk</module><module>test.test_sndhdr</module><module>timing</module><module>test.test_strlit</module><module>test.json_tests.test_float</module><module>tkinter.test.support</module><module>_pickle</module><module>email.MIMEMultipart</module><module>tkinter.dnd</module><module>importlib.test.builtin</module><module>turtledemo.round_dance</module><module>test.encoded_modules.module_koi8_r</module><module>test.test_nntplib</module><module>tkinter</module><module>email.MIMENonMultipart</module><module>tkinter.colorchooser</module><module>turtledemo.penrose</module><module>test.json_tests.test_dump</module><module>html</module><module>dbm.ndbm</module><module>turtledemo.wikipedia</module><module>http</module><module>test.test_hexoct</module><module>xmlrpc.server</module><module>urllib.error</module><module>html.entities</module><module>http.client</module><module>importlib.test.frozen</module><module>_dbm</module><module>tkinter.simpledialog</module><module>importlib.test.builtin.util</module><module>test.test_codecencodings_iso2022</module><module>xmlrpc</module><module>test.test_unpack_ex</module><module>importlib.abc</module><module>tkinter.test.test_tkinter.test_text</module><module>turtledemo.__main__</module><module>test.support</module><module>test.test_syslog</module><module>importlib.test.source.test_abc_loader</module><module>importlib.test.test_api</module><module>test.test_super</module><module>tkinter.test.runtktests</module><module>email.MIMEAudio</module><module>test.test_listcomps</module><module>http.cookiejar</module><module>importlib.test.builtin.test_loader</module><module>test.json_tests.test_unicode</module><module>urllib.robotparser</module><module>regsub</module><module>importlib.test.extension.test_loader</module><module>importlib.test.source.test_case_sensitivity</module><module>turtledemo.tree</module><module>test.test_socket_ssl</module><module>_types</module><module>test.test_timeit</module><module>test.test_metaclass</module><module>importlib.test.import_.util</module><func>ascii</func></python><python version="3.0"><module>importlib.test.source.test_file_loader</module><module>test.test_future_builtins</module><module>bsddb.test</module><module>bsddb.test.test_basics</module><module>bsddb.test.test_env_close</module><module>test.test_al</module><module>pydoc_data.topics</module><module>mimify</module><module>tkinter.test.test_tkinter.test_font</module><module>importlib.test.import_.test_caching</module><module>bsddb.test.test_distributed_transactions</module><module>test.test_fpformat</module><module>test.test_getargs</module><module>test.test_multifile</module><module>test.json_tests.test_recursion</module><module>test.ssl_servers</module><module>turtledemo.minimal_hanoi</module><module>toaiff</module><module>turtledemo.fractalcurves</module><module>turtledemo.lindenmayer</module><module>UserList</module><module>test.json_tests.test_separators</module><module>new</module><module>test.test_cd</module><module>importlib.test.import_.test___package__</module><module>importlib.test.benchmark</module><module>turtledemo.colormixer</module><module>tkinter.ttk</module><module>StringIO</module><module>encodings.cp720</module><module>test.json_tests</module><module>unittest.test.test_result</module><module>test.test_sched</module><module>Bastion</module><module>turtledemo.yinyang</module><module>copy_reg</module><module>test.test_sys_setprofile</module><module>tkinter.test.test_ttk</module><module>test.test_ttk_textonly</module><module>cPickle</module><module>importlib.test.source.test_path_hook</module><module>reconvert</module><module>test.test_email_codecs</module><module>compiler.syntax</module><module>bsddb.test.test_fileid</module><module>anydbm</module><module>unittest.__main__</module><module>exceptions</module><module>compiler.pyassem</module><module>email.MIMEBase</module><module>strop</module><module>concurrent.futures.process</module><module>test.test_operations</module><module>bsddb.dbshelve</module><module>distutils.tests.test_build</module><module>test.test_urllib_response</module><module>htmlentitydefs</module><module>argparse</module><module>test.test_mimetools</module><module>test.test_sunaudiodev</module><module>test.test_cookielib</module><module>encodings.hex_codec</module><module>bsddb.test.test_dbtables</module><module>importlib.util</module><module>test.json_tests.test_pass1</module><module>turtledemo.bytedesign</module><module>psycopg2</module><module>distutils.tests.test_install_data</module><module>test.script_helper</module><module>test.test_readline</module><module>unittest.test.test_break</module><module>test.test_dynamic</module><module>distutils.tests.test_log</module><module>test.test_mhlib</module><module>importlib.test.builtin.test_finder</module><module>test.test_copy_reg</module><module>test.test_html</module><module>sqlite3.test.py25tests</module><module>md5</module><module>thread</module><module>test.test_cookie</module><module>unittest.test.test_setups</module><module>distutils.tests.test_install_lib</module><module>test.__main__</module><module>xmllib</module><module>tkinter.test.test_ttk.test_functions</module><module>turtledemo.planet_and_moon</module><module>unittest.test._test_warnings</module><module>importlib.test.frozen.test_loader</module><module>idlelib.tabpage</module><module>unittest.test.test_skipping</module><module>test.infinite_reload</module><module>_posixsubprocess</module><module>_curses</module><module>turtledemo.clock</module><module>encodings.string_escape</module><module>stringold</module><module>test.test_MimeWriter</module><module>sets</module><module>importlib.test.extension.test_case_sensitivity</module><module>_sqlite3</module><module>distutils.tests.test_ccompiler</module><module>unittest.test.test_case</module><module>distutils.tests.test_text_file</module><module>test.json_tests.test_indent</module><module>compiler.future</module><module>encodings.rot_13</module><module>regex_syntax</module><module>dbhash</module><module>linuxaudiodev</module><module>importlib.test.import_.test_fromlist</module><module>fpformat</module><module>lib2to3.btm_matcher</module><module>distutils.tests.test_util</module><module>test.test_linuxaudiodev</module><module>test.test_regex</module><module>importlib.test.import_.test_meta_path</module><module>turtledemo.forest</module><module>tkinter.test.test_ttk.test_widgets</module><module>importlib.test.frozen.test_finder</module><module>test.test_file2k</module><module>compiler</module><module>bsddb.test.test_early_close</module><module>test.test_univnewlines2k</module><module>test.test_linecache</module><module>distutils.tests.test_unixccompiler</module><module>distutils.tests.test_clean</module><module>mutex</module><module>lib2to3.fixes.fix_exitfunc</module><module>test.json_tests.test_fail</module><module>test.test_macfs</module><module>encodings.bz2_codec</module><module>dummy_thread</module><module>test.tracedmodules.testmod</module><module>importlib.test.extension.test_path_hook</module><module>importlib.test.import_.test_relative_imports</module><module>distutils.tests.test_bdist_msi</module><module>bsddb.test.test_get_none</module><module>test.test_complex_args</module><module>turtledemo.nim</module><module>test.test_gl</module><module>distutils.tests.test_file_util</module><module>test.test_aepack</module><module>tkinter.test.test_ttk.test_style</module><module>audiodev</module><module>compiler.ast</module><module>unittest.test.test_program</module><module>test.test_cl</module><module>test.test_popen2</module><module>test.test_strop</module><module>bsddb.dbutils</module><module>test.test_sets</module><module>rfc822</module><module>unittest.test.test_runner</module><module>user</module><module>test.test_macos</module><module>distutils.tests.test_filelist</module><module>distutils.tests.test_bdist</module><module>urlparse</module><module>htmllib</module><module>mhlib</module><module>test.test_applesingle</module><module>bsddb.test.test_dbobj</module><module>distutils.tests.test_archive_util</module><module>test.test_new</module><module>test.test_mutex</module><module>test.test_argparse</module><module>unittest.main</module><module>test.test_sysconfig</module><module>test.test_py3kwarn</module><module>bsddb.test.test_cursor_pget_bug</module><module>test.win_console_handler</module><module>test.datetimetester</module><module>HTMLParser</module><module>test.test_dumbdbm</module><module>whrandom</module><module>test.test_sys_settrace</module><module>test.test_imgfile</module><module>turtledemo.peace</module><module>test.test_old_mailbox</module><module>test.test_long_future</module><module>bsddb.test.test_queue</module><module>UserDict</module><module>unittest.loader</module><module>compiler.visitor</module><module>test.test_md5</module><module>bsddb.test.test_dbenv</module><module>importlib.test.extension.util</module><module>test.test_rgbimg</module><module>bsddb.test.test_sequence</module><module>psycopg2._psycopg</module><module>importlib.machinery</module><module>email.test.test_email_renamed</module><module>test.test_sha</module><module>_pyio</module><module>importlib.test.test_util</module><module>mimetools</module><module>tzparse</module><module>unittest.test.test_discovery</module><module>concurrent.futures.thread</module><module>test.make_ssl_certs</module><module>distutils.tests.setuptools_build_ext</module><module>lib2to3.btm_utils</module><module>json.tests.test_check_circular</module><module>distutils.tests.test_config_cmd</module><module>urllib2</module><module>concurrent</module><module>importlib.test.test_abc</module><module>distutils.tests.test_check</module><module>test.test_StringIO</module><module>bsddb.dbobj</module><module>unittest.test.test_assertions</module><module>distutils.tests.test_bdist_wininst</module><module>test.test_timing</module><module>turtledemo.paint</module><module>hotshot.stats</module><module>test.test_bsddb185</module><module>hotshot.stones</module><module>test.tracedmodules</module><module>test.test_gdb</module><module>test.testall</module><module>test.json_tests.test_pass2</module><module>test.json_tests.test_pass3</module><module>test.test_scriptpackages</module><module>test.test_smtpd</module><module>test.json_tests.test_decode</module><module>unittest.test.support</module><module>test.test_macostools</module><module>test.test_coercion</module><module>importlib.test</module><module>test.test_cProfile</module><module>distutils.tests.test_spawn</module><module>unittest.suite</module><module>importlib.test.import_.test_packages</module><module>importlib.test.regrtest</module><module>_hotshot</module><module>compiler.misc</module><module>SimpleXMLRPCServer</module><module>test.test_concurrent_futures</module><module>distutils.tests.test_cygwinccompiler</module><module>distutils.tests.setuptools_extension</module><module>tkinter.test</module><module>test.json_tests.test_scanstring</module><module>importlib.test.abc</module><module>regex</module><module>email.MIMEMessage</module><module>bsddb.test.test_pickle</module><module>rexec</module><module>test.encoded_modules</module><module>posixfile</module><module>importlib.test.source.test_source_encoding</module><module>_datetime</module><module>unittest.test.test_functiontestcase</module><module>importlib.test.source.test_finder</module><module>test.test_hotshot</module><module>markupbase</module><module>test.test_htmllib</module><module>CGIHTTPServer</module><module>distutils.tests.test_extension</module><module>bsddb.test.test_associate</module><module>imputil</module><module>importlib.test.import_.test_api</module><module>tkinter.test.test_ttk.test_extensions</module><module>dumbdbm</module><module>importlib._bootstrap</module><module>importlib.test.import_.test_path</module><module>importlib.test.util</module><module>test.encoded_modules.module_iso_8859_1</module><module>importlib.test.source</module><module>test.test_numeric_tower</module><module>turtledemo.two_canvases</module><module>compiler.symbols</module><module>lib2to3.fixes.fix_operator</module><module>turtledemo.chaos</module><module>test.test_flufl</module><module>sysconfig</module><module>email.MIMEImage</module><module>test.test_support</module><module>tkinter.__main__</module><module>email.MIMEText</module><module>sgmllib</module><module>importlib.test.extension</module><module>gopherlib</module><module>MimeWriter</module><module>unittest.util</module><module>test.test_bastion</module><module>encodings.base64_codec</module><module>importlib.test.source.util</module><module>test.test_sunau</module><module>test.test_imageop</module><module>statvfs</module><module>cStringIO</module><module>compiler.consts</module><module>bsddb.test.test_1413192</module><module>BaseHTTPServer</module><module>test.json_tests.test_speedups</module><module>test.test_rfc822</module><module>unittest.test</module><module>UserString</module><module>bsddb.dbtables</module><module>test.test_transformer</module><module>importlib.test.import_</module><module>test.test_compileall</module><module>test.test_email_renamed</module><module>importlib.test.extension.test_finder</module><module>turtledemo</module><module>test.json_tests.test_default</module><module>_string</module><module>idlelib.buildapp</module><module>encodings.uu_codec</module><module>encodings.zlib_codec</module><module>ihooks</module><module>lib2to3.tests.test_main</module><module>importlib.test.__main__</module><module>fpectl</module><module>test.test_bsddb3</module><module>_LWPCookieJar</module><module>sha</module><module>test.mock_socket</module><module>test.json_tests.test_encode_basestring_ascii</module><module>distutils.tests.test_bdist_rpm</module><module>compiler.transformer</module><module>test.test_aifc</module><module>test.test_bsddb</module><module>concurrent.futures</module><module>unittest.result</module><module>encodings.quopri_codec</module><module>concurrent.futures._base</module><module>test.test_dl</module><module>statcache</module><module>tkinter.test.test_tkinter</module><module>_curses_panel</module><module>future_builtins</module><module>_io</module><module>_compat_pickle</module><module>importlib</module><module>test.test_dircache</module><module>bsddb.test.test_misc</module><module>tkinter.test.test_tkinter.test_loadtk</module><module>test.test_rlcompleter</module><module>test.test_sndhdr</module><module>repr</module><module>test.test_xrange</module><module>hotshot</module><module>timing</module><module>cookielib</module><module>distutils.tests.test_bdist_dumb</module><module>unittest.runner</module><module>whichdb</module><module>dircache</module><module>test.test_repr</module><module>test.test_ttk_guionly</module><module>popen2</module><module>encodings.cp858</module><module>pydoc_data</module><module>test.test_anydbm</module><module>test.test_compiler</module><module>_MozillaCookieJar</module><module>unittest.case</module><module>distutils.tests.test_dir_util</module><module>test.json_tests.test_float</module><module>tkinter.test.support</module><module>unittest.test.dummy</module><module>bsddb.test.test_lock</module><module>commands</module><module>email.MIMEMultipart</module><module>bsddb.test.test_replication</module><module>robotparser</module><module>test.test_gdbm</module><module>bsddb.db</module><module>importlib.test.builtin</module><module>turtledemo.round_dance</module><module>test.encoded_modules.module_koi8_r</module><module>test.test_nntplib</module><module>test.test_cpickle</module><module>email.MIMENonMultipart</module><module>hotshot.log</module><module>multifile</module><module>distutils.tests.test_install_headers</module><module>test.test_importlib</module><module>test.test_smtpnet</module><module>test.test_tk</module><module>turtledemo.penrose</module><module>compiler.pycodegen</module><module>test.json_tests.test_dump</module><module>bsddb.test.test_dbshelve</module><module>turtledemo.wikipedia</module><module>bsddb.test.test_compat</module><module>unittest.test.test_loader</module><module>test.test_hexoct</module><module>bsddb.test.test_db</module><module>distutils.tests.test_build_clib</module><module>test.test_str</module><module>test.test_strtod</module><module>test.gdb_sample</module><module>bsddb.dbrecio</module><module>test.test_msilib</module><module>importlib.test.frozen</module><module>_dbm</module><module>importlib.test.builtin.util</module><module>test.test_codecencodings_iso2022</module><module>httplib</module><module>importlib.abc</module><module>distutils.tests.test_version</module><module>tkinter.test.test_tkinter.test_text</module><module>turtledemo.__main__</module><module>test.test_whichdb</module><module>importlib.test.source.test_abc_loader</module><module>importlib.test.test_api</module><module>SimpleHTTPServer</module><module>tkinter.test.runtktests</module><module>test.test_xmllib</module><module>email.MIMEAudio</module><module>distutils.tests.test_dep_util</module><module>idlelib.RstripExtension</module><module>test.test_ascii_formatd</module><module>bsddb.test.test_join</module><module>unittest.test.test_suite</module><module>sre</module><module>test.lock_tests</module><module>__builtin__</module><module>importlib.test.builtin.test_loader</module><module>test.json_tests.test_unicode</module><module>distutils.command.check</module><module>regsub</module><module>Cookie</module><module>importlib.test.extension.test_loader</module><module>test.test_buffer</module><module>importlib.test.source.test_case_sensitivity</module><module>turtledemo.tree</module><module>test.test_socket_ssl</module><module>_types</module><module>test.test_pdb</module><module>test.test_timeit</module><module>DocXMLRPCServer</module><module>bsddb.test.test_thread</module><module>test.test_xpickle</module><module>test.test_undocumented_details</module><module>bsddb.test.test_all</module><module>bsddb</module><module>lib2to3.__main__</module><module>importlib.test.import_.util</module><module>test.test_sgmllib</module><module>test.test_commands</module><module>unittest.signals</module><module>sunaudio</module><module>test.test_softspace</module><module>bsddb.test.test_recno</module><module>xmlrpclib</module><module>distutils.tests.test_cmd</module><module>bsddb.test.test_compare</module><func>unicode</func><func>apply</func><func>basestring</func><func>long</func><func>raw_input</func><func>reload</func><func>xrange</func><func>reduce</func><func>coerce</func><func>intern</func><func>file</func><func>unichr</func><func>execfile</func><func>buffer</func><func>callable</func></python><python version="3.1"><module>test.test_future_builtins</module><module>bsddb.test</module><module>bsddb.test.test_basics</module><module>bsddb.test.test_env_close</module><module>test.test_al</module><module>mimify</module><module>tkinter.test.test_tkinter.test_font</module><module>bsddb.test.test_distributed_transactions</module><module>test.test_fpformat</module><module>test.test_getargs</module><module>test.test_multifile</module><module>test.json_tests.test_recursion</module><module>test.ssl_servers</module><module>turtledemo.minimal_hanoi</module><module>toaiff</module><module>turtledemo.fractalcurves</module><module>turtledemo.lindenmayer</module><module>UserList</module><module>test.json_tests.test_separators</module><module>new</module><module>test.test_cd</module><module>turtledemo.colormixer</module><module>StringIO</module><module>encodings.cp720</module><module>test.json_tests</module><module>unittest.test.test_result</module><module>test.test_sched</module><module>Bastion</module><module>turtledemo.yinyang</module><module>copy_reg</module><module>cPickle</module><module>reconvert</module><module>test.test_email_codecs</module><module>compiler.syntax</module><module>bsddb.test.test_fileid</module><module>anydbm</module><module>unittest.__main__</module><module>exceptions</module><module>test.test_profilehooks</module><module>compiler.pyassem</module><module>email.MIMEBase</module><module>strop</module><module>concurrent.futures.process</module><module>test.test_operations</module><module>bsddb.dbshelve</module><module>distutils.tests.test_build</module><module>htmlentitydefs</module><module>argparse</module><module>test.test_mimetools</module><module>test.test_sunaudiodev</module><module>test.test_cookielib</module><module>encodings.hex_codec</module><module>bsddb.test.test_dbtables</module><module>test.json_tests.test_pass1</module><module>turtledemo.bytedesign</module><module>psycopg2</module><module>test.test_readline</module><module>unittest.test.test_break</module><module>test.test_dynamic</module><module>test.test_mhlib</module><module>test.test_copy_reg</module><module>test.test_html</module><module>sqlite3.test.py25tests</module><module>md5</module><module>thread</module><module>test.test_cookie</module><module>unittest.test.test_setups</module><module>test.__main__</module><module>xmllib</module><module>turtledemo.planet_and_moon</module><module>unittest.test._test_warnings</module><module>idlelib.tabpage</module><module>unittest.test.test_skipping</module><module>test.infinite_reload</module><module>_posixsubprocess</module><module>turtledemo.clock</module><module>_fileio</module><module>encodings.string_escape</module><module>stringold</module><module>test.test_MimeWriter</module><module>sets</module><module>distutils.tests.test_ccompiler</module><module>unittest.test.test_case</module><module>test.json_tests.test_indent</module><module>compiler.future</module><module>encodings.rot_13</module><module>regex_syntax</module><module>dbhash</module><module>linuxaudiodev</module><module>fpformat</module><module>test.test_linuxaudiodev</module><module>test.test_regex</module><module>turtledemo.forest</module><module>test.cjkencodings_test</module><module>test.test_file2k</module><module>compiler</module><module>bsddb.test.test_early_close</module><module>test.test_univnewlines2k</module><module>mutex</module><module>build_class</module><module>test.json_tests.test_fail</module><module>_stringio</module><module>test.test_macfs</module><module>encodings.bz2_codec</module><module>dummy_thread</module><module>distutils.tests.test_bdist_msi</module><module>bsddb.test.test_get_none</module><module>test.test_complex_args</module><module>turtledemo.nim</module><module>test.test_gl</module><module>test.test_aepack</module><module>audiodev</module><module>compiler.ast</module><module>unittest.test.test_program</module><module>test.test_cl</module><module>test.test_popen2</module><module>test.test_strop</module><module>bsddb.dbutils</module><module>test.test_sets</module><module>rfc822</module><module>unittest.test.test_runner</module><module>user</module><module>test.test_macos</module><module>urlparse</module><module>htmllib</module><module>mhlib</module><module>test.test_applesingle</module><module>bsddb.test.test_dbobj</module><module>test.test_new</module><module>test.test_mutex</module><module>test.test_argparse</module><module>unittest.main</module><module>_bytesio</module><module>test.test_sysconfig</module><module>test.test_py3kwarn</module><module>bsddb.test.test_cursor_pget_bug</module><module>test.win_console_handler</module><module>test.datetimetester</module><module>HTMLParser</module><module>test.test_dumbdbm</module><module>whrandom</module><module>test.test_imgfile</module><module>turtledemo.peace</module><module>test.test_old_mailbox</module><module>test.test_long_future</module><module>bsddb.test.test_queue</module><module>UserDict</module><module>unittest.loader</module><module>compiler.visitor</module><module>test.test_md5</module><module>bsddb.test.test_dbenv</module><module>test.test_rgbimg</module><module>bsddb.test.test_sequence</module><module>psycopg2._psycopg</module><module>email.test.test_email_renamed</module><module>test.test_sha</module><module>distutils.mwerkscompiler</module><module>mimetools</module><module>tzparse</module><module>unittest.test.test_discovery</module><module>concurrent.futures.thread</module><module>test.make_ssl_certs</module><module>distutils.tests.setuptools_build_ext</module><module>json.tests.test_check_circular</module><module>urllib2</module><module>concurrent</module><module>test.test_StringIO</module><module>bsddb.dbobj</module><module>unittest.test.test_assertions</module><module>test.test_timing</module><module>turtledemo.paint</module><module>hotshot.stats</module><module>test.test_bsddb185</module><module>hotshot.stones</module><module>test.test_gdb</module><module>test.testall</module><module>test.json_tests.test_pass2</module><module>test.json_tests.test_pass3</module><module>test.test_scriptpackages</module><module>test.test_smtpd</module><module>test.json_tests.test_decode</module><module>unittest.test.support</module><module>test.test_macostools</module><module>test.test_coercion</module><module>test.test_cProfile</module><module>unittest.suite</module><module>importlib.test.regrtest</module><module>_hotshot</module><module>compiler.misc</module><module>SimpleXMLRPCServer</module><module>test.test_concurrent_futures</module><module>distutils.tests.setuptools_extension</module><module>test.json_tests.test_scanstring</module><module>regex</module><module>email.MIMEMessage</module><module>bsddb.test.test_pickle</module><module>rexec</module><module>test.encoded_modules</module><module>posixfile</module><module>_datetime</module><module>unittest.test.test_functiontestcase</module><module>test.test_hotshot</module><module>markupbase</module><module>test.test_htmllib</module><module>CGIHTTPServer</module><module>bsddb.test.test_associate</module><module>imputil</module><module>importlib.test.import_.test_api</module><module>dumbdbm</module><module>test.encoded_modules.module_iso_8859_1</module><module>test.test_numeric_tower</module><module>turtledemo.two_canvases</module><module>compiler.symbols</module><module>turtledemo.chaos</module><module>sysconfig</module><module>email.MIMEImage</module><module>test.test_support</module><module>tkinter.__main__</module><module>email.MIMEText</module><module>sgmllib</module><module>pydoc_topics</module><module>gopherlib</module><module>MimeWriter</module><module>unittest.util</module><module>test.test_bastion</module><module>encodings.base64_codec</module><module>test.test_imageop</module><module>statvfs</module><module>cStringIO</module><module>compiler.consts</module><module>bsddb.test.test_1413192</module><module>BaseHTTPServer</module><module>test.json_tests.test_speedups</module><module>test.test_rfc822</module><module>unittest.test</module><module>UserString</module><module>bsddb.dbtables</module><module>test.test_transformer</module><module>test.test_email_renamed</module><module>turtledemo</module><module>test.json_tests.test_default</module><module>_string</module><module>idlelib.buildapp</module><module>encodings.uu_codec</module><module>encodings.zlib_codec</module><module>ihooks</module><module>importlib.test.__main__</module><module>test.test_bsddb3</module><module>_LWPCookieJar</module><module>sha</module><module>test.mock_socket</module><module>test.json_tests.test_encode_basestring_ascii</module><module>compiler.transformer</module><module>test.test_bsddb</module><module>concurrent.futures</module><module>unittest.result</module><module>encodings.quopri_codec</module><module>concurrent.futures._base</module><module>test.test_dl</module><module>statcache</module><module>future_builtins</module><module>test.test_dircache</module><module>bsddb.test.test_misc</module><module>repr</module><module>test.test_xrange</module><module>hotshot</module><module>timing</module><module>cookielib</module><module>unittest.runner</module><module>whichdb</module><module>dircache</module><module>test.test_repr</module><module>popen2</module><module>encodings.cp858</module><module>test.test_anydbm</module><module>test.test_compiler</module><module>_MozillaCookieJar</module><module>unittest.case</module><module>test.json_tests.test_float</module><module>unittest.test.dummy</module><module>bsddb.test.test_lock</module><module>commands</module><module>email.MIMEMultipart</module><module>bsddb.test.test_replication</module><module>robotparser</module><module>test.test_gdbm</module><module>bsddb.db</module><module>turtledemo.round_dance</module><module>test.encoded_modules.module_koi8_r</module><module>test.test_nntplib</module><module>test.test_cpickle</module><module>email.MIMENonMultipart</module><module>hotshot.log</module><module>multifile</module><module>turtledemo.penrose</module><module>compiler.pycodegen</module><module>test.json_tests.test_dump</module><module>email.test.test_email_codecs_renamed</module><module>bsddb.test.test_dbshelve</module><module>turtledemo.wikipedia</module><module>bsddb.test.test_compat</module><module>unittest.test.test_loader</module><module>test.test_hexoct</module><module>bsddb.test.test_db</module><module>test.test_str</module><module>test.gdb_sample</module><module>bsddb.dbrecio</module><module>test.test_codecencodings_iso2022</module><module>httplib</module><module>turtledemo.__main__</module><module>test.test_whichdb</module><module>SimpleHTTPServer</module><module>test.test_xmllib</module><module>email.MIMEAudio</module><module>distutils.tests.test_dep_util</module><module>bsddb.test.test_join</module><module>unittest.test.test_suite</module><module>sre</module><module>__builtin__</module><module>test.json_tests.test_unicode</module><module>regsub</module><module>Cookie</module><module>test.test_buffer</module><module>turtledemo.tree</module><module>test.test_socket_ssl</module><module>_types</module><module>test.test_timeit</module><module>DocXMLRPCServer</module><module>bsddb.test.test_thread</module><module>test.test_xpickle</module><module>test.test_undocumented_details</module><module>bsddb.test.test_all</module><module>bsddb</module><module>lib2to3.__main__</module><module>test.test_sgmllib</module><module>test.test_commands</module><module>unittest.signals</module><module>sunaudio</module><module>test.test_softspace</module><module>bsddb.test.test_recno</module><module>xmlrpclib</module><module>bsddb.test.test_compare</module><func>unicode</func><func>apply</func><func>basestring</func><func>long</func><func>raw_input</func><func>reload</func><func>cmp</func><func>xrange</func><func>reduce</func><func>coerce</func><func>intern</func><func>file</func><func>unichr</func><func>execfile</func><func>buffer</func><func>callable</func></python><python version="3.2"><module>test.test_future_builtins</module><module>bsddb.test</module><module>bsddb.test.test_basics</module><module>bsddb.test.test_env_close</module><module>test.test_al</module><module>mimify</module><module>bsddb.test.test_distributed_transactions</module><module>test.test_fpformat</module><module>test.test_getargs</module><module>test.test_multifile</module><module>toaiff</module><module>UserList</module><module>new</module><module>test.test_cd</module><module>json.tests.test_unicode</module><module>StringIO</module><module>Bastion</module><module>copy_reg</module><module>cPickle</module><module>reconvert</module><module>test.test_email_codecs</module><module>compiler.syntax</module><module>bsddb.test.test_fileid</module><module>anydbm</module><module>exceptions</module><module>json.tests.test_speedups</module><module>test.test_profilehooks</module><module>json.tests.test_recursion</module><module>compiler.pyassem</module><module>email.MIMEBase</module><module>strop</module><module>test.test_operations</module><module>bsddb.dbshelve</module><module>htmlentitydefs</module><module>test.test_mimetools</module><module>test.test_sunaudiodev</module><module>test.test_cookielib</module><module>bsddb.test.test_dbtables</module><module>psycopg2</module><module>test.test_mhlib</module><module>test.test_copy_reg</module><module>sqlite3.test.py25tests</module><module>md5</module><module>thread</module><module>test.test_cookie</module><module>xmllib</module><module>idlelib.tabpage</module><module>test.infinite_reload</module><module>_curses</module><module>_fileio</module><module>encodings.string_escape</module><module>stringold</module><module>test.test_MimeWriter</module><module>sets</module><module>_sqlite3</module><module>distutils.tests.test_ccompiler</module><module>compiler.future</module><module>regex_syntax</module><module>dbhash</module><module>json.tests.test_scanstring</module><module>json.tests</module><module>linuxaudiodev</module><module>fpformat</module><module>test.test_linuxaudiodev</module><module>test.test_regex</module><module>test.cjkencodings_test</module><module>test.test_file2k</module><module>compiler</module><module>bsddb.test.test_early_close</module><module>test.test_univnewlines2k</module><module>mutex</module><module>build_class</module><module>_stringio</module><module>test.test_macfs</module><module>dummy_thread</module><module>bsddb.test.test_get_none</module><module>test.test_complex_args</module><module>test.test_gl</module><module>test.test_aepack</module><module>audiodev</module><module>compiler.ast</module><module>test.test_cl</module><module>test.test_popen2</module><module>test.test_strop</module><module>bsddb.dbutils</module><module>test.test_sets</module><module>rfc822</module><module>user</module><module>test.test_macos</module><module>urlparse</module><module>htmllib</module><module>mhlib</module><module>test.test_applesingle</module><module>bsddb.test.test_dbobj</module><module>test.test_new</module><module>test.test_mutex</module><module>json.tests.test_decode</module><module>_bytesio</module><module>test.test_py3kwarn</module><module>bsddb.test.test_cursor_pget_bug</module><module>HTMLParser</module><module>test.test_dumbdbm</module><module>whrandom</module><module>test.test_imgfile</module><module>test.test_old_mailbox</module><module>test.test_long_future</module><module>bsddb.test.test_queue</module><module>UserDict</module><module>compiler.visitor</module><module>test.test_md5</module><module>bsddb.test.test_dbenv</module><module>test.test_rgbimg</module><module>bsddb.test.test_sequence</module><module>psycopg2._psycopg</module><module>email.test.test_email_renamed</module><module>test.test_sha</module><module>json.tests.test_separators</module><module>distutils.mwerkscompiler</module><module>mimetools</module><module>json.tests.test_float</module><module>tzparse</module><module>test.badsyntax_nocaret</module><module>distutils.tests.setuptools_build_ext</module><module>json.tests.test_check_circular</module><module>urllib2</module><module>test.test_StringIO</module><module>bsddb.dbobj</module><module>test.test_timing</module><module>hotshot.stats</module><module>test.test_bsddb185</module><module>hotshot.stones</module><module>test.testall</module><module>json.tests.test_dump</module><module>test.test_scriptpackages</module><module>test.test_macostools</module><module>test.test_coercion</module><module>test.test_cProfile</module><module>_hotshot</module><module>compiler.misc</module><module>SimpleXMLRPCServer</module><module>distutils.tests.setuptools_extension</module><module>regex</module><module>email.MIMEMessage</module><module>bsddb.test.test_pickle</module><module>rexec</module><module>posixfile</module><module>test.test_hotshot</module><module>markupbase</module><module>test.test_htmllib</module><module>CGIHTTPServer</module><module>bsddb.test.test_associate</module><module>imputil</module><module>dumbdbm</module><module>compiler.symbols</module><module>email.MIMEImage</module><module>test.test_support</module><module>email.MIMEText</module><module>sgmllib</module><module>pydoc_topics</module><module>gopherlib</module><module>MimeWriter</module><module>test.test_bastion</module><module>test.test_imageop</module><module>statvfs</module><module>cStringIO</module><module>compiler.consts</module><module>bsddb.test.test_1413192</module><module>BaseHTTPServer</module><module>test.test_rfc822</module><module>UserString</module><module>bsddb.dbtables</module><module>test.test_transformer</module><module>test.test_email_renamed</module><module>idlelib.buildapp</module><module>ihooks</module><module>fpectl</module><module>test.test_bsddb3</module><module>_LWPCookieJar</module><module>sha</module><module>test.test_SimpleHTTPServer</module><module>compiler.transformer</module><module>test.test_bsddb</module><module>test.test_dl</module><module>statcache</module><module>_curses_panel</module><module>future_builtins</module><module>json.tests.test_encode_basestring_ascii</module><module>test.test_dircache</module><module>bsddb.test.test_misc</module><module>repr</module><module>test.test_xrange</module><module>hotshot</module><module>timing</module><module>cookielib</module><module>whichdb</module><module>dircache</module><module>test.test_repr</module><module>popen2</module><module>test.test_anydbm</module><module>test.test_compiler</module><module>_MozillaCookieJar</module><module>json.tests.test_indent</module><module>bsddb.test.test_lock</module><module>commands</module><module>json.tests.test_fail</module><module>email.MIMEMultipart</module><module>bsddb.test.test_replication</module><module>robotparser</module><module>test.test_gdbm</module><module>bsddb.db</module><module>test.test_cpickle</module><module>email.MIMENonMultipart</module><module>hotshot.log</module><module>multifile</module><module>compiler.pycodegen</module><module>email.test.test_email_codecs_renamed</module><module>bsddb.test.test_dbshelve</module><module>bsddb.test.test_compat</module><module>test.test_hexoct</module><module>bsddb.test.test_db</module><module>json.tests.test_pass2</module><module>json.tests.test_pass3</module><module>json.tests.test_pass1</module><module>test.test_str</module><module>bsddb.dbrecio</module><module>_dbm</module><module>httplib</module><module>test.test_whichdb</module><module>SimpleHTTPServer</module><module>test.test_xmllib</module><module>email.MIMEAudio</module><module>test.test_ascii_formatd</module><module>bsddb.test.test_join</module><module>json.tests.test_default</module><module>sre</module><module>__builtin__</module><module>regsub</module><module>Cookie</module><module>test.test_buffer</module><module>test.test_socket_ssl</module><module>_types</module><module>DocXMLRPCServer</module><module>bsddb.test.test_thread</module><module>test.test_xpickle</module><module>test.test_undocumented_details</module><module>bsddb.test.test_all</module><module>bsddb</module><module>lib2to3.__main__</module><module>test.test_sgmllib</module><module>test.test_commands</module><module>sunaudio</module><module>test.test_softspace</module><module>bsddb.test.test_recno</module><module>xmlrpclib</module><module>bsddb.test.test_compare</module><func>unicode</func><func>apply</func><func>basestring</func><func>long</func><func>raw_input</func><func>reload</func><func>cmp</func><func>xrange</func><func>reduce</func><func>coerce</func><func>intern</func><func>file</func><func>unichr</func><func>execfile</func><func>buffer</func></python><python version="3.3"><module>distutils.tests.test_ccompiler</module><module>bsddb.test.test_fileid</module><module>bsddb.test</module><module>hotshot.stats</module><module>bsddb.test.test_basics</module><module>bsddb.test.test_env_close</module><module>test.test_al</module><module>test.test_bsddb185</module><module>hotshot.stones</module><module>json.tests.test_unicode</module><module>mimify</module><module>bsddb.test.test_distributed_transactions</module><module>test.test_fpformat</module><module>test.test_getargs</module><module>test.test_cookielib</module><module>test.test_multifile</module><module>json.tests.test_dump</module><module>test.test_str</module><module>test.test_scriptpackages</module><module>toaiff</module><module>test.test_macostools</module><module>test.test_sha</module><module>fpformat</module><module>test.test_regex</module><module>new</module><module>test.test_coercion</module><module>StringIO</module><module>test.testall</module><module>_hotshot</module><module>compiler.misc</module><module>bsddb.test.test_associate</module><module>Bastion</module><module>test.test_old_mailbox</module><module>email.MIMEMessage</module><module>bsddb.test.test_pickle</module><module>bsddb.test.test_misc</module><module>cPickle</module><module>posixfile</module><module>json.tests.test_check_circular</module><module>reconvert</module><module>test.test_email_codecs</module><module>compiler.syntax</module><module>test.test_timing</module><module>anydbm</module><module>test.test_hotshot</module><module>markupbase</module><module>test.test_htmllib</module><module>exceptions</module><module>json.tests.test_speedups</module><module>CGIHTTPServer</module><module>imputil</module><module>compiler.pyassem</module><module>strop</module><module>test.test_operations</module><module>bsddb.dbshelve</module><module>MimeWriter</module><module>test.test_imageop</module><module>htmlentitydefs</module><module>compiler.symbols</module><module>test.test_mimetools</module><module>test.test_sunaudiodev</module><module>whichdb</module><module>email.MIMEText</module><module>dumbdbm</module><module>psycopg2</module><module>cookielib</module><module>pydoc_topics</module><module>gopherlib</module><module>test.test_bastion</module><module>test.test_cProfile</module><module>httplib</module><module>statvfs</module><module>test.test_mhlib</module><module>cStringIO</module><module>bsddb.test.test_1413192</module><module>BaseHTTPServer</module><module>dircache</module><module>test.test_rfc822</module><module>UserString</module><module>bsddb.dbtables</module><module>test.test_email_renamed</module><module>sqlite3.test.py25tests</module><module>idlelib.buildapp</module><module>md5</module><module>thread</module><module>ihooks</module><module>fpectl</module><module>test.test_bsddb3</module><module>test.test_copy_reg</module><module>_LWPCookieJar</module><module>test.test_SimpleHTTPServer</module><module>email.MIMEMultipart</module><module>idlelib.tabpage</module><module>test.infinite_reload</module><module>_curses</module><module>_fileio</module><module>test.test_cd</module><module>test.test_aepack</module><module>test.test_cl</module><module>test.test_bsddb</module><module>test.test_MimeWriter</module><module>test.test_dl</module><module>statcache</module><module>sets</module><module>_sqlite3</module><module>mhlib</module><module>_curses_panel</module><module>future_builtins</module><module>compiler.future</module><module>regex_syntax</module><module>stringold</module><module>dbhash</module><module>bsddb.test.test_dbobj</module><module>json.tests</module><module>linuxaudiodev</module><module>UserList</module><module>json.tests.test_encode_basestring_ascii</module><module>test.test_dircache</module><module>pyexpat.errors</module><module>rexec</module><module>test.cjkencodings_test</module><module>repr</module><module>test.test_xrange</module><module>hotshot</module><module>timing</module><module>test.test_file2k</module><module>compiler</module><module>compiler.consts</module><module>email.MIMEImage</module><module>bsddb.test.test_early_close</module><module>sha</module><module>test.test_repr</module><module>pyexpat.model</module><module>test.test_univnewlines2k</module><module>popen2</module><module>compiler.transformer</module><module>test.test_anydbm</module><module>test.test_compiler</module><module>bsddb.test.test_dbtables</module><module>mutex</module><module>_MozillaCookieJar</module><module>json.tests.test_indent</module><module>build_class</module><module>sgmllib</module><module>bsddb.test.test_lock</module><module>commands</module><module>test.test_cpickle</module><module>_stringio</module><module>bsddb.test.test_thread</module><module>test.test_macfs</module><module>distutils.tests.setuptools_extension</module><module>bsddb.test.test_replication</module><module>dummy_thread</module><module>robotparser</module><module>test.test_gdbm</module><module>bsddb.db</module><module>bsddb.test.test_get_none</module><module>test.test_complex_args</module><module>SimpleXMLRPCServer</module><module>test.test_future_builtins</module><module>email.MIMENonMultipart</module><module>test.test_gl</module><module>hotshot.log</module><module>multifile</module><module>encodings.string_escape</module><module>audiodev</module><module>copy_reg</module><module>test.test_profilehooks</module><module>json.tests.test_recursion</module><module>email.MIMEBase</module><module>test.test_popen2</module><module>compiler.pycodegen</module><module>test.test_strop</module><module>bsddb.dbutils</module><module>email.test.test_email_codecs_renamed</module><module>bsddb.test.test_dbshelve</module><module>test.test_sets</module><module>rfc822</module><module>bsddb.test.test_compat</module><module>test.test_hexoct</module><module>bsddb.test.test_db</module><module>user</module><module>xmllib</module><module>test.badsyntax_nocaret</module><module>test.test_macos</module><module>urlparse</module><module>htmllib</module><module>test.test_cookie</module><module>json.tests.test_pass2</module><module>json.tests.test_pass3</module><module>test.test_applesingle</module><module>json.tests.test_pass1</module><module>json.tests.test_scanstring</module><module>test.test_linuxaudiodev</module><module>bsddb.dbrecio</module><module>test.test_new</module><module>test.test_mutex</module><module>json.tests.test_decode</module><module>compiler.ast</module><module>_bytesio</module><module>test.test_py3kwarn</module><module>whrandom</module><module>test.test_whichdb</module><module>bsddb.test.test_cursor_pget_bug</module><module>SimpleHTTPServer</module><module>psycopg2._psycopg</module><module>email.test.test_email_renamed</module><module>HTMLParser</module><module>distutils.tests.setuptools_build_ext</module><module>test.test_xmllib</module><module>email.MIMEAudio</module><module>test.test_imgfile</module><module>regex</module><module>test.test_long_future</module><module>test.test_ascii_formatd</module><module>bsddb.test.test_queue</module><module>UserDict</module><module>bsddb.test.test_join</module><module>json.tests.test_default</module><module>compiler.visitor</module><module>sre</module><module>test.test_md5</module><module>bsddb.test.test_dbenv</module><module>__builtin__</module><module>test.test_transformer</module><module>test.test_rgbimg</module><module>regsub</module><module>bsddb.test.test_sequence</module><module>Cookie</module><module>test.test_socket_ssl</module><module>_types</module><module>json.tests.test_separators</module><module>DocXMLRPCServer</module><module>json.tests.test_fail</module><module>distutils.mwerkscompiler</module><module>mimetools</module><module>test.test_xpickle</module><module>json.tests.test_float</module><module>bsddb.dbobj</module><module>tzparse</module><module>bsddb.test.test_all</module><module>test.test_dumbdbm</module><module>_dbm</module><module>_abcoll</module><module>bsddb</module><module>test.test_sgmllib</module><module>test.test_commands</module><module>urllib2</module><module>sunaudio</module><module>test.test_softspace</module><module>bsddb.test.test_recno</module><module>test.test_StringIO</module><module>xmlrpclib</module><module>test.test_undocumented_details</module><module>bsddb.test.test_compare</module><func>file</func><func>buffer</func><func>xrange</func><func>reduce</func><func>coerce</func><func>intern</func><func>unicode</func><func>apply</func><func>unichr</func><func>basestring</func><func>raw_input</func><func>execfile</func><func>long</func><func>reload</func><func>cmp</func></python><python version="3.4"><module>distutils.tests.test_ccompiler</module><module>importlib.test.source.test_file_loader</module><module>bsddb.test.test_fileid</module><module>bsddb.test</module><module>hotshot.stats</module><module>bsddb.test.test_basics</module><module>bsddb.test.test_env_close</module><module>test.test_al</module><module>test.test_bsddb185</module><module>hotshot.stones</module><module>json.tests.test_unicode</module><module>mimify</module><module>bsddb.test.test_distributed_transactions</module><module>test.test_fpformat</module><module>test.test_getargs</module><module>test.test_cookielib</module><module>test.json_tests.test_pass2</module><module>test.json_tests.test_pass3</module><module>test.json_tests.test_pass1</module><module>test.test_multifile</module><module>json.tests.test_dump</module><module>test.test_str</module><module>test.test_scriptpackages</module><module>test.json_tests.test_decode</module><module>toaiff</module><module>test.test_macostools</module><module>test.test_sha</module><module>fpformat</module><module>test.test_regex</module><module>test.json_tests.test_separators</module><module>new</module><module>test.test_coercion</module><module>importlib.test</module><module>importlib.test.import_.test___package__</module><module>importlib.test.benchmark</module><module>importlib.test.import_.test_packages</module><module>StringIO</module><module>importlib.test.regrtest</module><module>_hotshot</module><module>compiler.misc</module><module>test.json_tests</module><module>bsddb.test.test_associate</module><module>Bastion</module><module>test.json_tests.test_scanstring</module><module>test.test_old_mailbox</module><module>email.MIMEMessage</module><module>bsddb.test.test_pickle</module><module>bsddb.test.test_misc</module><module>cPickle</module><module>posixfile</module><module>json.tests.test_check_circular</module><module>importlib.test.source.test_source_encoding</module><module>test.test_email_codecs</module><module>compiler.syntax</module><module>test.test_timing</module><module>anydbm</module><module>importlib.test.source.test_finder</module><module>test.test_hotshot</module><module>markupbase</module><module>test.test_htmllib</module><module>exceptions</module><module>json.tests.test_speedups</module><module>CGIHTTPServer</module><module>imputil</module><module>importlib.test.import_.test_api</module><module>compiler.pyassem</module><module>importlib.test.import_.test_path</module><module>strop</module><module>test.test_operations</module><module>bsddb.dbshelve</module><module>MimeWriter</module><module>test.test_imageop</module><module>importlib.test.util</module><module>importlib.test.source</module><module>htmlentitydefs</module><module>compiler.symbols</module><module>test.test_mimetools</module><module>test.test_sunaudiodev</module><module>test.test_multiprocessing</module><module>hotshot</module><module>whichdb</module><module>email.MIMEText</module><module>dumbdbm</module><module>test.json_tests.test_recursion</module><module>psycopg2</module><module>cookielib</module><module>importlib.test.extension</module><module>pydoc_topics</module><module>gopherlib</module><module>test.json_tests.test_speedups</module><module>test.test_bastion</module><module>importlib.test.source.util</module><module>httplib</module><module>statvfs</module><module>test.test_mhlib</module><module>cStringIO</module><module>importlib.test.builtin.test_finder</module><module>BaseHTTPServer</module><module>dircache</module><module>test.test_rfc822</module><module>importlib.test.import_.test_caching</module><module>UserString</module><module>bsddb.dbtables</module><module>importlib.test.import_</module><module>test.test_email_renamed</module><module>test.json_tests.test_default</module><module>sqlite3.test.py25tests</module><module>idlelib.buildapp</module><module>md5</module><module>thread</module><module>ihooks</module><module>importlib.test.__main__</module><module>fpectl</module><module>test.test_bsddb3</module><module>test.test_copy_reg</module><module>_LWPCookieJar</module><module>test.test_coding</module><module>test.test_SimpleHTTPServer</module><module>importlib.test.frozen.test_loader</module><module>email.MIMEMultipart</module><module>idlelib.tabpage</module><module>test.json_tests.test_encode_basestring_ascii</module><module>test.infinite_reload</module><module>_curses</module><module>_fileio</module><module>_hashlib</module><module>test.test_cd</module><module>test.test_aepack</module><module>test.test_cl</module><module>test.test_bsddb</module><module>test.test_MimeWriter</module><module>test.test_dl</module><module>statcache</module><module>sets</module><module>importlib.test.extension.test_case_sensitivity</module><module>_sqlite3</module><module>mhlib</module><module>_curses_panel</module><module>future_builtins</module><module>test.json_tests.test_indent</module><module>compiler.future</module><module>regex_syntax</module><module>stringold</module><module>dbhash</module><module>bsddb.test.test_dbobj</module><module>json.tests</module><module>linuxaudiodev</module><module>UserList</module><module>json.tests.test_encode_basestring_ascii</module><module>test.test_dircache</module><module>pyexpat.errors</module><module>importlib.test.import_.test_meta_path</module><module>rexec</module><module>test.cjkencodings_test</module><module>repr</module><module>test.test_xrange</module><module>importlib.test.frozen.test_finder</module><module>timing</module><module>test.test_file2k</module><module>compiler</module><module>compiler.consts</module><module>email.MIMEImage</module><module>bsddb.test.test_early_close</module><module>sha</module><module>test.test_repr</module><module>pyexpat.model</module><module>test.test_univnewlines2k</module><module>popen2</module><module>compiler.transformer</module><module>test.test_anydbm</module><module>test.test_compiler</module><module>bsddb.test.test_dbtables</module><module>mutex</module><module>_MozillaCookieJar</module><module>json.tests.test_indent</module><module>build_class</module><module>sgmllib</module><module>test.json_tests.test_float</module><module>test.json_tests.test_fail</module><module>bsddb.test.test_lock</module><module>commands</module><module>test.test_cpickle</module><module>_stringio</module><module>bsddb.test.test_thread</module><module>test.test_macfs</module><module>distutils.tests.setuptools_extension</module><module>bsddb.test.test_replication</module><module>dummy_thread</module><module>importlib.test.extension.test_finder</module><module>robotparser</module><module>importlib.test.extension.test_path_hook</module><module>test.test_gdbm</module><module>bsddb.db</module><module>importlib.test.import_.test_relative_imports</module><module>importlib.test.builtin</module><module>bsddb.test.test_get_none</module><module>test.test_complex_args</module><module>importlib.test.source.test_case_sensitivity</module><module>SimpleXMLRPCServer</module><module>test.test_future_builtins</module><module>email.MIMENonMultipart</module><module>test.test_gl</module><module>importlib.test.builtin.util</module><module>hotshot.log</module><module>multifile</module><module>encodings.string_escape</module><module>audiodev</module><module>copy_reg</module><module>test.test_profilehooks</module><module>json.tests.test_recursion</module><module>test.testall</module><module>email.MIMEBase</module><module>test.test_popen2</module><module>compiler.pycodegen</module><module>test.test_strop</module><module>test.json_tests.test_dump</module><module>bsddb.dbutils</module><module>email.test.test_email_codecs_renamed</module><module>bsddb.test.test_dbshelve</module><module>test.test_sets</module><module>rfc822</module><module>bsddb.test.test_compat</module><module>test.test_hexoct</module><module>bsddb.test.test_db</module><module>user</module><module>xmllib</module><module>test.badsyntax_nocaret</module><module>test.test_macos</module><module>urlparse</module><module>htmllib</module><module>test.test_cookie</module><module>json.tests.test_pass2</module><module>json.tests.test_pass3</module><module>test.test_applesingle</module><module>json.tests.test_pass1</module><module>json.tests.test_scanstring</module><module>importlib.test.import_.test_fromlist</module><module>test.test_linuxaudiodev</module><module>bsddb.dbrecio</module><module>importlib.test.frozen</module><module>test.test_new</module><module>test.test_mutex</module><module>test.test_cProfile</module><module>multiprocessing.forking</module><module>json.tests.test_decode</module><module>compiler.ast</module><module>_bytesio</module><module>test.test_py3kwarn</module><module>whrandom</module><module>test.test_whichdb</module><module>bsddb.test.test_cursor_pget_bug</module><module>importlib.test.source.test_abc_loader</module><module>importlib.test.test_api</module><module>SimpleHTTPServer</module><module>psycopg2._psycopg</module><module>email.test.test_email_renamed</module><module>HTMLParser</module><module>distutils.tests.setuptools_build_ext</module><module>test.test_xmllib</module><module>email.MIMEAudio</module><module>test.test_imgfile</module><module>regex</module><module>test.test_long_future</module><module>test.test_ascii_formatd</module><module>bsddb.test.test_queue</module><module>UserDict</module><module>bsddb.test.test_join</module><module>json.tests.test_default</module><module>importlib.test.abc</module><module>compiler.visitor</module><module>sre</module><module>test.test_md5</module><module>bsddb.test.test_dbenv</module><module>__builtin__</module><module>importlib.test.extension.util</module><module>importlib.test.builtin.test_loader</module><module>test.test_transformer</module><module>test.test_rgbimg</module><module>test.json_tests.test_unicode</module><module>regsub</module><module>bsddb.test.test_sequence</module><module>Cookie</module><module>bsddb.test.test_1413192</module><module>importlib.test.source.test_path_hook</module><module>importlib.test.extension.test_loader</module><module>test.test_socket_ssl</module><module>_types</module><module>json.tests.test_separators</module><module>importlib.test.test_util</module><module>DocXMLRPCServer</module><module>json.tests.test_fail</module><module>distutils.mwerkscompiler</module><module>mimetools</module><module>test.test_xpickle</module><module>json.tests.test_float</module><module>bsddb.dbobj</module><module>tzparse</module><module>bsddb.test.test_all</module><module>test.test_dumbdbm</module><module>_dbm</module><module>_abcoll</module><module>bsddb</module><module>importlib.test.import_.util</module><module>test.test_sgmllib</module><module>test.test_commands</module><module>urllib2</module><module>reconvert</module><module>sunaudio</module><module>test.test_softspace</module><module>importlib.test.test_abc</module><module>bsddb.test.test_recno</module><module>test.test_StringIO</module><module>xmlrpclib</module><module>test.test_undocumented_details</module><module>bsddb.test.test_compare</module><func>file</func><func>buffer</func><func>xrange</func><func>reduce</func><func>coerce</func><func>intern</func><func>unicode</func><func>unichr</func><func>apply</func><func>basestring</func><func>raw_input</func><func>execfile</func><func>long</func><func>reload</func><func>cmp</func></python></root>
\ No newline at end of file
diff --git a/python/ide/src/com/jetbrains/python/PyCharmInitialConfigurator.java b/python/ide/src/com/jetbrains/python/PyCharmInitialConfigurator.java
index e87d821..091a670 100644
--- a/python/ide/src/com/jetbrains/python/PyCharmInitialConfigurator.java
+++ b/python/ide/src/com/jetbrains/python/PyCharmInitialConfigurator.java
@@ -55,10 +55,15 @@
propertiesComponent.setValue("PyCharm.InitialConfiguration.V3", "true");
UISettings.getInstance().SHOW_MEMORY_INDICATOR = false;
final String ignoredFilesList = fileTypeManager.getIgnoredFilesList();
- ApplicationManager.getApplication().runWriteAction(new Runnable() {
+ ApplicationManager.getApplication().invokeLater(new Runnable() {
@Override
public void run() {
- FileTypeManager.getInstance().setIgnoredFilesList(ignoredFilesList + ";*$py.class");
+ ApplicationManager.getApplication().runWriteAction(new Runnable() {
+ @Override
+ public void run() {
+ FileTypeManager.getInstance().setIgnoredFilesList(ignoredFilesList + ";*$py.class");
+ }
+ });
}
});
}
diff --git a/python/ide/src/com/jetbrains/python/PyIdeCommonOptionsForm.java b/python/ide/src/com/jetbrains/python/PyIdeCommonOptionsForm.java
index 2636aa5..94e9912 100644
--- a/python/ide/src/com/jetbrains/python/PyIdeCommonOptionsForm.java
+++ b/python/ide/src/com/jetbrains/python/PyIdeCommonOptionsForm.java
@@ -224,7 +224,7 @@
}
public void updateSdkList(boolean preserveSelection, PyConfigurableInterpreterList myInterpreterList) {
- myPythonSdks = myInterpreterList.getAllPythonSdks();
+ myPythonSdks = myInterpreterList.getAllPythonSdks(myProject);
Sdk selection = preserveSelection ? (Sdk)myInterpreterComboBox.getSelectedItem() : null;
if (!myPythonSdks.contains(selection)) {
selection = null;
@@ -266,7 +266,7 @@
return myPathMappingsComponent.getMappingSettings();
}
else {
- return null;
+ return new PathMappingSettings();
}
}
diff --git a/python/ide/src/com/jetbrains/python/PythonSdkChooserCombo.java b/python/ide/src/com/jetbrains/python/PythonSdkChooserCombo.java
index a0d2fd0..b079014 100644
--- a/python/ide/src/com/jetbrains/python/PythonSdkChooserCombo.java
+++ b/python/ide/src/com/jetbrains/python/PythonSdkChooserCombo.java
@@ -15,18 +15,21 @@
*/
package com.jetbrains.python;
-import com.intellij.openapi.options.ShowSettingsUtil;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.projectRoots.SdkType;
import com.intellij.openapi.projectRoots.impl.SdkListCellRenderer;
import com.intellij.openapi.util.Condition;
+import com.intellij.openapi.util.IconLoader;
import com.intellij.ui.CollectionComboBoxModel;
import com.intellij.ui.ComboboxWithBrowseButton;
+import com.intellij.util.NullableConsumer;
import com.intellij.util.containers.ContainerUtil;
-import com.jetbrains.python.configuration.PythonSdkConfigurable;
-import com.jetbrains.python.sdk.flavors.PythonSdkFlavor;
+import com.jetbrains.python.configuration.PythonSdkDetailsDialog;
+import com.jetbrains.python.sdk.PyDetectedSdk;
import com.jetbrains.python.sdk.PythonSdkType;
+import com.jetbrains.python.sdk.flavors.PythonSdkFlavor;
+import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.event.ActionEvent;
@@ -39,10 +42,7 @@
public class PythonSdkChooserCombo extends ComboboxWithBrowseButton {
private final List<ActionListener> myChangedListeners = ContainerUtil.createLockFreeCopyOnWriteList();
- //public PythonSdkChooserCombo(final Condition<Sdk> acceptableSdkCondition) {
- // this(PythonSdkType.getAllSdks(), acceptableSdkCondition);
- //}
-
+ @SuppressWarnings("unchecked")
public PythonSdkChooserCombo(final Project project, List<Sdk> sdks, final Condition<Sdk> acceptableSdkCondition) {
Sdk initialSelection = null;
for (Sdk sdk : sdks) {
@@ -51,26 +51,30 @@
break;
}
}
- getComboBox().setModel(new CollectionComboBoxModel(sdks, initialSelection));
- getComboBox().setRenderer(new SdkListCellRenderer("<no interpreter>") {
+ final JComboBox comboBox = getComboBox();
+ comboBox.setModel(new CollectionComboBoxModel(sdks, initialSelection));
+ comboBox.setRenderer(new SdkListCellRenderer("<no interpreter>") {
@Override
protected Icon getSdkIcon(Sdk sdk) {
final PythonSdkFlavor flavor = PythonSdkFlavor.getFlavor(sdk);
- return flavor != null ? flavor.getIcon() : ((SdkType)sdk.getSdkType()).getIcon();
+ final Icon icon = flavor != null ? flavor.getIcon() : ((SdkType)sdk.getSdkType()).getIcon();
+ return sdk instanceof PyDetectedSdk ? IconLoader.getTransparentIcon(icon) : icon;
}
});
addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
- final PythonSdkConfigurable configurable = new PythonSdkConfigurable(project);
- configurable.setNewProject(true);
- ShowSettingsUtil.getInstance().editConfigurable(PythonSdkChooserCombo.this, configurable);
- Sdk selection = configurable.getRealSelectedSdk();
final List<Sdk> sdks = PythonSdkType.getAllSdks();
- getComboBox().setModel(new CollectionComboBoxModel(sdks, selection));
+ PythonSdkDetailsDialog dialog = new PythonSdkDetailsDialog(project, new NullableConsumer<Sdk>() {
+ @Override
+ public void consume(@Nullable Sdk sdk) {
+ comboBox.setModel(new CollectionComboBoxModel(sdks, sdk));
+ }
+ });
+ dialog.show();
notifyChanged(e);
}
});
- getComboBox().addActionListener(new ActionListener() {
+ comboBox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
notifyChanged(e);
}
@@ -83,6 +87,7 @@
}
}
+ @SuppressWarnings("UnusedDeclaration")
public void addChangedListener(ActionListener listener) {
myChangedListeners.add(listener);
}
diff --git a/python/ide/src/com/jetbrains/python/configuration/AddVEnvOptionsDialog.form b/python/ide/src/com/jetbrains/python/configuration/AddVEnvOptionsDialog.form
index 78c5657..5d2cd59 100644
--- a/python/ide/src/com/jetbrains/python/configuration/AddVEnvOptionsDialog.form
+++ b/python/ide/src/com/jetbrains/python/configuration/AddVEnvOptionsDialog.form
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="com.jetbrains.python.configuration.AddVEnvOptionsDialog">
- <grid id="27dc6" binding="myMainPanel" layout-manager="GridLayoutManager" row-count="3" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
+ <grid id="27dc6" binding="myMainPanel" layout-manager="GridLayoutManager" row-count="2" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
<xy x="20" y="20" width="500" height="400"/>
@@ -8,23 +8,14 @@
<properties/>
<border type="none"/>
<children>
- <component id="6ea43" class="com.intellij.ui.components.JBCheckBox" binding="myUseForThisProjectJBCheckBox" default-binding="true">
- <constraints>
- <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
- </constraints>
- <properties>
- <selected value="true"/>
- <text value="Set as project interpreter for &this project"/>
- </properties>
- </component>
<vspacer id="46c2b">
<constraints>
- <grid row="2" column="0" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
+ <grid row="1" column="0" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
</constraints>
</vspacer>
<component id="b3884" class="com.intellij.ui.components.JBCheckBox" binding="myMakeAvailableToAllJBCheckBox" default-binding="true">
<constraints>
- <grid row="1" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
+ <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="Make available to &all projects"/>
diff --git a/python/ide/src/com/jetbrains/python/configuration/AddVEnvOptionsDialog.java b/python/ide/src/com/jetbrains/python/configuration/AddVEnvOptionsDialog.java
index b4e5b8e..d894191 100644
--- a/python/ide/src/com/jetbrains/python/configuration/AddVEnvOptionsDialog.java
+++ b/python/ide/src/com/jetbrains/python/configuration/AddVEnvOptionsDialog.java
@@ -25,7 +25,6 @@
* @author yole
*/
public class AddVEnvOptionsDialog extends DialogWrapper {
- private JBCheckBox myUseForThisProjectJBCheckBox;
private JBCheckBox myMakeAvailableToAllJBCheckBox;
private JPanel myMainPanel;
@@ -40,10 +39,6 @@
return myMainPanel;
}
- public boolean useForThisProject() {
- return myUseForThisProjectJBCheckBox.isSelected();
- }
-
public boolean makeAvailableToAll() {
return myMakeAvailableToAllJBCheckBox.isSelected();
}
diff --git a/python/ide/src/com/jetbrains/python/configuration/EditSdkDialog.java b/python/ide/src/com/jetbrains/python/configuration/EditSdkDialog.java
index 988b5e9..2ad22fd 100644
--- a/python/ide/src/com/jetbrains/python/configuration/EditSdkDialog.java
+++ b/python/ide/src/com/jetbrains/python/configuration/EditSdkDialog.java
@@ -27,6 +27,7 @@
import com.intellij.util.NullableFunction;
import com.jetbrains.python.sdk.PythonSdkAdditionalData;
import com.jetbrains.python.sdk.PythonSdkType;
+import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
@@ -82,7 +83,7 @@
init();
new ClickListener() {
@Override
- public boolean onClick(MouseEvent e, int clickCount) {
+ public boolean onClick(@NotNull MouseEvent e, int clickCount) {
myAssociateCheckbox.setSelected(false);
myAssociateCheckbox.setEnabled(true);
myAssociateCheckbox.setText("Associate this environment with current project");
diff --git a/python/ide/src/com/jetbrains/python/configuration/PyActiveSdkConfigurable.form b/python/ide/src/com/jetbrains/python/configuration/PyActiveSdkConfigurable.form
deleted file mode 100644
index 79a648b..0000000
--- a/python/ide/src/com/jetbrains/python/configuration/PyActiveSdkConfigurable.form
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="com.jetbrains.python.configuration.PyActiveSdkConfigurable">
- <grid id="27dc6" binding="myPanel" layout-manager="GridLayoutManager" row-count="3" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
- <margin top="0" left="0" bottom="0" right="0"/>
- <constraints>
- <xy x="20" y="20" width="500" height="400"/>
- </constraints>
- <properties/>
- <border type="none"/>
- <children>
- <component id="70598" class="com.intellij.ui.components.JBLabel">
- <constraints>
- <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
- </constraints>
- <properties>
- <text value="Project Interpreter:"/>
- </properties>
- </component>
- <vspacer id="3aae9">
- <constraints>
- <grid row="2" column="0" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
- </constraints>
- </vspacer>
- <component id="7421c" class="javax.swing.JComboBox" binding="mySdkCombo">
- <constraints>
- <grid row="0" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="2" anchor="8" fill="1" indent="0" use-parent-layout="false"/>
- </constraints>
- <properties/>
- </component>
- <grid id="19f49" binding="myConfigureInterpretersPanel" layout-manager="BorderLayout" hgap="0" vgap="0">
- <constraints>
- <grid row="1" column="0" row-span="1" col-span="2" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
- </constraints>
- <properties/>
- <border type="none"/>
- <children/>
- </grid>
- </children>
- </grid>
-</form>
diff --git a/python/ide/src/com/jetbrains/python/configuration/PyActiveSdkConfigurable.java b/python/ide/src/com/jetbrains/python/configuration/PyActiveSdkConfigurable.java
index e4f22dd..242d008 100644
--- a/python/ide/src/com/jetbrains/python/configuration/PyActiveSdkConfigurable.java
+++ b/python/ide/src/com/jetbrains/python/configuration/PyActiveSdkConfigurable.java
@@ -16,6 +16,7 @@
package com.jetbrains.python.configuration;
import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.application.ModalityState;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.EditorFactory;
import com.intellij.openapi.editor.ex.EditorEx;
@@ -27,68 +28,224 @@
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.projectRoots.SdkModel;
+import com.intellij.openapi.projectRoots.impl.SdkConfigurationUtil;
import com.intellij.openapi.projectRoots.impl.SdkListCellRenderer;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.roots.ModuleRootModificationUtil;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.roots.ui.configuration.projectRoot.ProjectSdksModel;
+import com.intellij.openapi.ui.ComboBox;
+import com.intellij.openapi.ui.FixedSizeButton;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.ui.CollectionComboBoxModel;
+import com.intellij.util.NullableConsumer;
+import com.intellij.webcore.packaging.PackagesNotificationPanel;
+import com.jetbrains.python.packaging.ui.PyInstalledPackagesPanel;
+import com.jetbrains.python.packaging.ui.PyPackageManagementService;
import com.jetbrains.python.psi.LanguageLevel;
-import com.jetbrains.python.sdk.PySdkListCellRenderer;
+import com.jetbrains.python.sdk.*;
import com.jetbrains.python.sdk.flavors.PythonSdkFlavor;
+import icons.PythonIcons;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.ArrayList;
import java.util.List;
-/**
- * @author yole
- */
public class PyActiveSdkConfigurable implements UnnamedConfigurable {
- private JPanel myPanel;
+ private JPanel myMainPanel;
private final Project myProject;
@Nullable private final Module myModule;
- private JComboBox mySdkCombo;
- private JPanel myConfigureInterpretersPanel;
+ private MySdkModelListener mySdkModelListener;
+ private boolean myAddedSdk = false;
+
private PyConfigurableInterpreterList myInterpreterList;
private ProjectSdksModel myProjectSdksModel;
- private MyListener myListener;
+ private ComboBox mySdkCombo;
+ private PyInstalledPackagesPanel myPackagesPanel;
+ private JButton myDetailsButton;
+ private static final String SHOW_ALL = "Show All";
+ private NullableConsumer<Sdk> myDetailsCallback;
- public PyActiveSdkConfigurable(Project project) {
+ public PyActiveSdkConfigurable(@NotNull Project project) {
myModule = null;
myProject = project;
- init();
+ layoutPanel();
+ initContent();
}
public PyActiveSdkConfigurable(@NotNull Module module) {
myModule = module;
myProject = module.getProject();
- init();
+ layoutPanel();
+ initContent();
}
- private void init() {
+ private void initContent() {
+ myInterpreterList = PyConfigurableInterpreterList.getInstance(myProject);
+ myInterpreterList.setSdkCombo(mySdkCombo);
+
+ myProjectSdksModel = myInterpreterList.getModel();
+ mySdkModelListener = new MySdkModelListener(this);
+ myProjectSdksModel.addListener(mySdkModelListener);
+
+ mySdkCombo.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ final Sdk selectedSdk = (Sdk)mySdkCombo.getSelectedItem();
+ myPackagesPanel.updatePackages(selectedSdk != null ? new PyPackageManagementService(myProject, selectedSdk) : null);
+ if (selectedSdk != null)
+ myPackagesPanel.updateNotifications(selectedSdk);
+ }
+ });
+ myDetailsCallback = new NullableConsumer<Sdk>() {
+
+ @Override
+ public void consume(@Nullable Sdk sdk) {
+ if (sdk instanceof PyDetectedSdk) {
+ final Sdk addedSdk = SdkConfigurationUtil.setupSdk(myProjectSdksModel.getSdks(), sdk.getHomeDirectory(),
+ PythonSdkType.getInstance(), true,
+ null, null);
+ myAddedSdk = true;
+ myProjectSdksModel.addSdk(addedSdk);
+ myProjectSdksModel.removeSdk(sdk);
+ mySdkCombo.setSelectedItem(addedSdk);
+ }
+ else if (getSdk() != sdk && sdk != null) {
+ PythonSdkAdditionalData additionalData = (PythonSdkAdditionalData)sdk.getSdkAdditionalData();
+ if (additionalData != null) {
+ final String path = additionalData.getAssociatedProjectPath();
+ if (!myProject.getBasePath().equals(path))
+ additionalData.setAssociatedProjectPath(null);
+ }
+ updateSdkList(false);
+ mySdkCombo.setSelectedItem(sdk);
+ }
+ }
+ };
+
+ myDetailsButton.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ PythonSdkDetailsStep
+ .show(myProject, myProjectSdksModel.getSdks(),
+ myModule == null ? new PythonSdkDetailsDialog(myProject, myDetailsCallback) :
+ new PythonSdkDetailsDialog(myModule, myDetailsCallback), myMainPanel,
+ myDetailsButton.getLocationOnScreen(), true,
+ new NullableConsumer<Sdk>() {
+ @Override
+ public void consume(Sdk sdk) {
+ if (sdk == null) return;
+ if (myProjectSdksModel.findSdk(sdk) == null) {
+ myProjectSdksModel.addSdk(sdk);
+ myAddedSdk = true;
+ }
+ updateSdkList(false);
+ mySdkCombo.getModel().setSelectedItem(sdk);
+ myPackagesPanel.updatePackages(new PyPackageManagementService(myProject, sdk));
+ }
+ }
+ );
+ }
+ }
+ );
+
+ }
+
+ private void layoutPanel() {
+ final GridBagLayout layout = new GridBagLayout();
+ myMainPanel = new JPanel(layout);
+ final JLabel interpreterLabel = new JLabel("Project Interpreter:");
+ final JLabel emptyLabel = new JLabel(" ");
+ mySdkCombo = new ComboBox() {
+ @Override
+ public void setSelectedItem(Object item) {
+ if (SHOW_ALL.equals(item)) {
+ ApplicationManager.getApplication().invokeLater(new Runnable() {
+ public void run() {
+ PythonSdkDetailsDialog options = myModule == null ? new PythonSdkDetailsDialog(myProject, myDetailsCallback) :
+ new PythonSdkDetailsDialog(myModule, myDetailsCallback);
+ options.show();
+ }
+ });
+ return;
+ }
+ if (!PySdkListCellRenderer.SEPARATOR.equals(item))
+ super.setSelectedItem(item);
+ }
+ };
+ mySdkCombo.putClientProperty("JComboBox.isTableCellEditor", Boolean.TRUE);
mySdkCombo.setRenderer(new SdkListCellRenderer("<None>"));
- myInterpreterList = PyConfigurableInterpreterList.getInstance(myProject);
- myProjectSdksModel = myInterpreterList.getModel();
- myListener = new MyListener(this);
- myProjectSdksModel.addListener(myListener);
- myConfigureInterpretersPanel.add(new PyConfigureInterpretersLinkPanel(myPanel), BorderLayout.CENTER);
- myInterpreterList.setSdkCombo(mySdkCombo);
+ final PackagesNotificationPanel notificationsArea = new PackagesNotificationPanel(myProject);
+ final JComponent notificationsComponent = notificationsArea.getComponent();
+ final Dimension preferredSize = mySdkCombo.getPreferredSize();
+ notificationsComponent.setPreferredSize(new Dimension(500, preferredSize.height));
+
+ myDetailsButton = new FixedSizeButton();
+ myDetailsButton.setIcon(PythonIcons.Python.InterpreterGear);
+ //noinspection SuspiciousNameCombination
+ myDetailsButton.setPreferredSize(new Dimension(preferredSize.height, preferredSize.height));
+
+ myPackagesPanel = new PyInstalledPackagesPanel(myProject, notificationsArea);
+ final GridBagConstraints c = new GridBagConstraints();
+ c.fill = GridBagConstraints.HORIZONTAL;
+ c.insets = new Insets(2,2,2,2);
+
+ c.gridx = 0;
+ c.gridy = 0;
+ myMainPanel.add(interpreterLabel, c);
+
+ c.gridx = 1;
+ c.gridy = 0;
+ c.weightx = 0.1;
+ myMainPanel.add(mySdkCombo, c);
+
+ c.insets = new Insets(2,0,2,2);
+ c.gridx = 2;
+ c.gridy = 0;
+ c.weightx = 0.0;
+ myMainPanel.add(myDetailsButton, c);
+
+ c.insets = new Insets(2,2,2,2);
+ c.gridx = 0;
+ c.gridy = 1;
+ c.gridwidth = 3;
+ myMainPanel.add(emptyLabel, c);
+
+ c.gridx = 0;
+ c.gridy = 2;
+ c.weighty = 0.5;
+ c.gridwidth = 3;
+ c.gridheight = GridBagConstraints.RELATIVE;
+ c.fill = GridBagConstraints.BOTH;
+ myMainPanel.add(myPackagesPanel, c);
+
+ c.gridheight = GridBagConstraints.REMAINDER;
+ c.gridx = 0;
+ c.gridy = 3;
+ c.gridwidth = 3;
+
+ c.fill = GridBagConstraints.HORIZONTAL;
+ c.anchor = GridBagConstraints.SOUTH;
+
+ myMainPanel.add(notificationsComponent, c);
}
@Override
public JComponent createComponent() {
- return myPanel;
+ return myMainPanel;
}
@Override
public boolean isModified() {
final Sdk sdk = getSdk();
- return sdk != myProjectSdksModel.findSdk((Sdk)mySdkCombo.getSelectedItem());
+ final Sdk selectedItem = (Sdk)mySdkCombo.getSelectedItem();
+ return myAddedSdk || selectedItem instanceof PyDetectedSdk || sdk != myProjectSdksModel.findSdk(selectedItem);
}
@Nullable
@@ -102,28 +259,34 @@
@Override
public void apply() throws ConfigurationException {
- final Sdk selectedSdk = myProjectSdksModel.findSdk((Sdk)mySdkCombo.getSelectedItem());
- if (myModule == null) {
- final ProjectRootManager rootManager = ProjectRootManager.getInstance(myProject);
- ApplicationManager.getApplication().runWriteAction(new Runnable() {
+ final Sdk item = (Sdk)mySdkCombo.getSelectedItem();
+ if (item instanceof PyDetectedSdk) {
+ ApplicationManager.getApplication().invokeLater(new Runnable() {
@Override
public void run() {
- rootManager.setProjectSdk(selectedSdk);
+ final Sdk sdk = SdkConfigurationUtil.createAndAddSDK(item.getName(), PythonSdkType.getInstance());
+ myProjectSdksModel.removeSdk(item);
+ myProjectSdksModel.addSdk(sdk);
+ updateSdkList(true);
+ mySdkCombo.setSelectedItem(sdk);
+ setSdk(sdk);
}
- });
+ }, ModalityState.any());
}
else {
- ModuleRootModificationUtil.setModuleSdk(myModule, selectedSdk);
- }
- final Sdk prevSdk = ProjectRootManager.getInstance(myProject).getProjectSdk();
- ApplicationManager.getApplication().runWriteAction(new Runnable() {
- @Override
- public void run() {
- ProjectRootManager.getInstance(myProject).setProjectSdk(selectedSdk);
+ final Sdk sdk = myProjectSdksModel.findSdk(item);
+ if (item != null && sdk == null) {
+ myProjectSdksModel.addSdk(item);
+ myProjectSdksModel.apply(null, true);
+ mySdkCombo.setSelectedItem(item);
}
- });
+ else if (myAddedSdk) {
+ myProjectSdksModel.apply(null, true);
+ }
+ }
- myProjectSdksModel.setProjectSdk(selectedSdk);
+ final Sdk prevSdk = ProjectRootManager.getInstance(myProject).getProjectSdk();
+ final Sdk selectedSdk = setSdk(item);
// update string literals if different LanguageLevel was selected
if (prevSdk != null && selectedSdk != null) {
@@ -141,6 +304,24 @@
rehighlightStrings(myProject);
}
+ private Sdk setSdk(Sdk item) {
+ myAddedSdk = false;
+ final Sdk selectedSdk = myProjectSdksModel.findSdk(item);
+ if (myModule == null) {
+ final ProjectRootManager rootManager = ProjectRootManager.getInstance(myProject);
+ ApplicationManager.getApplication().runWriteAction(new Runnable() {
+ @Override
+ public void run() {
+ rootManager.setProjectSdk(selectedSdk);
+ }
+ });
+ }
+ else {
+ ModuleRootModificationUtil.setModuleSdk(myModule, selectedSdk);
+ }
+ return selectedSdk;
+ }
+
public static void rehighlightStrings(final @NotNull Project project) {
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@Override
@@ -161,6 +342,12 @@
@Override
public void reset() {
+ myAddedSdk = false;
+ myProjectSdksModel.reset(myProject);
+ resetSdkList();
+ }
+
+ private void resetSdkList() {
updateSdkList(false);
final Sdk sdk = getSdk();
@@ -168,7 +355,7 @@
}
private void updateSdkList(boolean preserveSelection) {
- final List<Sdk> sdkList = myInterpreterList.getAllPythonSdks();
+ final List<Sdk> sdkList = myInterpreterList.getAllPythonSdks(myProject);
Sdk selection = preserveSelection ? (Sdk)mySdkCombo.getSelectedItem() : null;
if (!sdkList.contains(selection)) {
selection = null;
@@ -178,27 +365,52 @@
if (selection != null && !sdkList.contains(selection)) {
sdkList.add(0, selection);
}
- sdkList.add(0, null);
+ List<Object> items = new ArrayList<Object>();
+ items.add(null);
+
+ boolean remoteSeparator = true;
+ boolean separator = true;
+ boolean detectedSeparator = true;
+ for (Sdk sdk : sdkList) {
+ if (!PythonSdkType.isVirtualEnv(sdk) && !PythonSdkType.isRemote(sdk) && !(sdk instanceof PyDetectedSdk) && separator) {
+ items.add(PySdkListCellRenderer.SEPARATOR);
+ separator = false;
+ }
+ if (PythonSdkType.isRemote(sdk) && remoteSeparator) {
+ items.add(PySdkListCellRenderer.SEPARATOR);
+ remoteSeparator = false;
+ }
+ if (sdk instanceof PyDetectedSdk && detectedSeparator) {
+ items.add(PySdkListCellRenderer.SEPARATOR);
+ detectedSeparator = false;
+ }
+ items.add(sdk);
+ }
+
+ items.add(PySdkListCellRenderer.SEPARATOR);
+ items.add(SHOW_ALL);
+
mySdkCombo.setRenderer(new PySdkListCellRenderer());
- mySdkCombo.setModel(new CollectionComboBoxModel(sdkList, selection));
+ //noinspection unchecked
+ mySdkCombo.setModel(new CollectionComboBoxModel(items, selection));
}
@Override
public void disposeUIResources() {
- myProjectSdksModel.removeListener(myListener);
+ myProjectSdksModel.removeListener(mySdkModelListener);
myInterpreterList.disposeModel();
}
- private static class MyListener implements SdkModel.Listener {
+ private static class MySdkModelListener implements SdkModel.Listener {
private final PyActiveSdkConfigurable myConfigurable;
- public MyListener(PyActiveSdkConfigurable configurable) {
+ public MySdkModelListener(PyActiveSdkConfigurable configurable) {
myConfigurable = configurable;
}
@Override
public void sdkAdded(Sdk sdk) {
- myConfigurable.reset();
+ myConfigurable.resetSdkList();
}
@Override
diff --git a/python/ide/src/com/jetbrains/python/configuration/PyActiveSdkModuleConfigurable.java b/python/ide/src/com/jetbrains/python/configuration/PyActiveSdkModuleConfigurable.java
index c3c299e..304424f 100644
--- a/python/ide/src/com/jetbrains/python/configuration/PyActiveSdkModuleConfigurable.java
+++ b/python/ide/src/com/jetbrains/python/configuration/PyActiveSdkModuleConfigurable.java
@@ -18,7 +18,6 @@
import com.intellij.application.options.ModuleAwareProjectConfigurable;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
-import com.intellij.openapi.options.Configurable;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.options.UnnamedConfigurable;
import com.intellij.openapi.project.Project;
@@ -28,17 +27,12 @@
import com.jetbrains.python.testing.VFSTestFrameworkListener;
import org.jetbrains.annotations.NotNull;
-/**
- * @author yole
- */
-public class PyActiveSdkModuleConfigurable extends ModuleAwareProjectConfigurable implements Configurable.Composite {
+public class PyActiveSdkModuleConfigurable extends ModuleAwareProjectConfigurable {
private final Project myProject;
- private final Configurable mySdkConfigurable;
public PyActiveSdkModuleConfigurable(Project project) {
super(project, "Project Interpreter", "reference.settings.project.interpreter");
myProject = project;
- mySdkConfigurable = new PythonSdkConfigurable(project);
}
@NotNull
@@ -67,9 +61,4 @@
}
PythonSdkUpdater.getInstance().updateActiveSdks(myProject, 0);
}
-
- @Override
- public Configurable[] getConfigurables() {
- return new Configurable[] { mySdkConfigurable };
- }
}
diff --git a/python/ide/src/com/jetbrains/python/configuration/PyConfigurableInterpreterList.java b/python/ide/src/com/jetbrains/python/configuration/PyConfigurableInterpreterList.java
index fbe1d0d..87b9163 100644
--- a/python/ide/src/com/jetbrains/python/configuration/PyConfigurableInterpreterList.java
+++ b/python/ide/src/com/jetbrains/python/configuration/PyConfigurableInterpreterList.java
@@ -18,15 +18,20 @@
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.Sdk;
+import com.intellij.openapi.projectRoots.impl.SdkConfigurationUtil;
import com.intellij.openapi.roots.ui.configuration.projectRoot.ProjectSdksModel;
import com.intellij.openapi.util.Comparing;
+import com.jetbrains.python.psi.LanguageLevel;
+import com.jetbrains.python.sdk.PyDetectedSdk;
+import com.jetbrains.python.sdk.PySdkUtil;
+import com.jetbrains.python.sdk.PythonSdkAdditionalData;
import com.jetbrains.python.sdk.PythonSdkType;
+import com.jetbrains.python.sdk.flavors.PythonSdkFlavor;
+import com.jetbrains.python.sdk.flavors.VirtualEnvSdkFlavor;
+import org.jetbrains.annotations.Nullable;
import javax.swing.*;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
+import java.util.*;
/**
* Manages the SDK model shared between PythonSdkConfigurable and PyActiveSdkConfigurable.
@@ -65,19 +70,77 @@
}
}
- public List<Sdk> getAllPythonSdks() {
+ public List<Sdk> getAllPythonSdks(@Nullable final Project project) {
List<Sdk> result = new ArrayList<Sdk>();
for (Sdk sdk : getModel().getSdks()) {
if (sdk.getSdkType() instanceof PythonSdkType) {
result.add(sdk);
}
}
+
Collections.sort(result, new Comparator<Sdk>() {
@Override
public int compare(Sdk o1, Sdk o2) {
+ if (!(o1.getSdkType() instanceof PythonSdkType) ||
+ !(o2.getSdkType() instanceof PythonSdkType))
+ return -Comparing.compare(o1.getName(), o2.getName());
+
+ final boolean isVEnv1 = PythonSdkType.isVirtualEnv(o1);
+ final boolean isVEnv2 = PythonSdkType.isVirtualEnv(o2);
+ final boolean isRemote1 = PySdkUtil.isRemote(o1);
+ final boolean isRemote2 = PySdkUtil.isRemote(o2);
+ final PythonSdkFlavor flavor1 = PythonSdkFlavor.getFlavor(o1);
+ final PythonSdkFlavor flavor2 = PythonSdkFlavor.getFlavor(o2);
+ final LanguageLevel level1 = flavor1 != null ? flavor1.getLanguageLevel(o1) : LanguageLevel.getDefault();
+ final LanguageLevel level2 = flavor2 != null ? flavor2.getLanguageLevel(o2) : LanguageLevel.getDefault();
+
+ if (isVEnv1) {
+ if (project != null && associatedWithCurrent(o1, project)) return -1;
+ if (isVEnv2) {
+ final int compare = Comparing.compare(level1, level2);
+ if (compare != 0) return -compare;
+ return Comparing.compare(o1.getName(), o2.getName());
+ }
+ return -1;
+ }
+ if (isVEnv2) {
+ return 1;
+ }
+ if (isRemote1) return 1;
+ if (isRemote2) return -1;
+
+ final int compare = Comparing.compare(level1, level2);
+ if (compare != 0) return -compare;
return Comparing.compare(o1.getName(), o2.getName());
}
});
+
+ final Collection<String> sdkHomes = new ArrayList<String>();
+ sdkHomes.addAll(VirtualEnvSdkFlavor.INSTANCE.suggestHomePaths());
+ for (PythonSdkFlavor flavor : PythonSdkFlavor.getApplicableFlavors()) {
+ if (flavor instanceof VirtualEnvSdkFlavor) continue;
+ sdkHomes.addAll(flavor.suggestHomePaths());
+ }
+
+ for (String sdkHome : SdkConfigurationUtil.filterExistingPaths(PythonSdkType.getInstance(), sdkHomes, getModel().getSdks())) {
+ result.add(new PyDetectedSdk(sdkHome));
+ }
return result;
}
+
+ private static boolean associatedWithCurrent(Sdk o1, Project project) {
+ final PythonSdkAdditionalData data = (PythonSdkAdditionalData)o1.getSdkAdditionalData();
+ if (data != null) {
+ final String path = data.getAssociatedProjectPath();
+ final String projectBasePath = project.getBasePath();
+ if (path != null && path.equals(projectBasePath)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public List<Sdk> getAllPythonSdks() {
+ return getAllPythonSdks(null);
+ }
}
diff --git a/python/ide/src/com/jetbrains/python/configuration/PyConfigureInterpretersLinkPanel.java b/python/ide/src/com/jetbrains/python/configuration/PyConfigureInterpretersLinkPanel.java
index 41c2ebe..23aa6c4 100644
--- a/python/ide/src/com/jetbrains/python/configuration/PyConfigureInterpretersLinkPanel.java
+++ b/python/ide/src/com/jetbrains/python/configuration/PyConfigureInterpretersLinkPanel.java
@@ -16,9 +16,11 @@
package com.jetbrains.python.configuration;
import com.intellij.ide.DataManager;
+import com.intellij.openapi.options.SearchableConfigurable;
import com.intellij.openapi.options.newEditor.OptionsEditor;
import com.intellij.ui.ClickListener;
import com.intellij.ui.components.JBLabel;
+import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.awt.*;
@@ -36,11 +38,11 @@
myConfigureLabel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
new ClickListener() {
@Override
- public boolean onClick(MouseEvent e, int clickCount) {
+ public boolean onClick(@NotNull MouseEvent e, int clickCount) {
if (clickCount == 1) {
final OptionsEditor optionsEditor = OptionsEditor.KEY.getData(DataManager.getInstance().getDataContext(parentPanel));
if (optionsEditor != null) {
- PythonSdkConfigurable configurable = optionsEditor.findConfigurable(PythonSdkConfigurable.class);
+ SearchableConfigurable configurable = optionsEditor.findConfigurableById(PyActiveSdkModuleConfigurable.class.getName());
if (configurable != null) {
optionsEditor.clearSearchAndSelect(configurable);
}
diff --git a/python/ide/src/com/jetbrains/python/configuration/PyContentEntriesModuleConfigurable.java b/python/ide/src/com/jetbrains/python/configuration/PyContentEntriesModuleConfigurable.java
new file mode 100644
index 0000000..bcbebc3
--- /dev/null
+++ b/python/ide/src/com/jetbrains/python/configuration/PyContentEntriesModuleConfigurable.java
@@ -0,0 +1,484 @@
+package com.jetbrains.python.configuration;
+
+import com.intellij.facet.impl.DefaultFacetsProvider;
+import com.intellij.openapi.Disposable;
+import com.intellij.openapi.actionSystem.AnActionEvent;
+import com.intellij.openapi.actionSystem.CustomShortcutSet;
+import com.intellij.openapi.actionSystem.Presentation;
+import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.module.Module;
+import com.intellij.openapi.module.impl.ModuleConfigurationStateImpl;
+import com.intellij.openapi.options.Configurable;
+import com.intellij.openapi.options.ConfigurationException;
+import com.intellij.openapi.options.SearchableConfigurable;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.roots.ContentEntry;
+import com.intellij.openapi.roots.ContentFolder;
+import com.intellij.openapi.roots.ModifiableRootModel;
+import com.intellij.openapi.roots.ModuleRootManager;
+import com.intellij.openapi.roots.impl.ContentEntryImpl;
+import com.intellij.openapi.roots.impl.ContentFolderBaseImpl;
+import com.intellij.openapi.roots.ui.configuration.*;
+import com.intellij.openapi.roots.ui.configuration.actions.ContentEntryEditingAction;
+import com.intellij.openapi.util.Comparing;
+import com.intellij.openapi.util.Computable;
+import com.intellij.openapi.util.Disposer;
+import com.intellij.openapi.vfs.VfsUtilCore;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.openapi.vfs.pointers.VirtualFilePointer;
+import com.intellij.openapi.vfs.pointers.VirtualFilePointerListener;
+import com.intellij.openapi.vfs.pointers.VirtualFilePointerManager;
+import com.intellij.ui.JBColor;
+import com.intellij.util.EventDispatcher;
+import com.intellij.util.containers.MultiMap;
+import com.jetbrains.python.templateLanguages.TemplatesService;
+import icons.PythonIcons;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.jetbrains.jps.model.java.JavaSourceRootType;
+import org.jetbrains.jps.model.module.JpsModuleSourceRootType;
+
+import javax.swing.*;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import javax.swing.tree.TreeCellRenderer;
+import java.awt.*;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import java.util.ArrayList;
+import java.util.List;
+
+public class PyContentEntriesModuleConfigurable extends SearchableConfigurable.Parent.Abstract {
+ private static final Color TEMPLATES_COLOR = JBColor.MAGENTA;
+
+ private final Module myModule;
+ private final JPanel myTopPanel = new JPanel(new BorderLayout());
+ protected ModifiableRootModel myModifiableModel;
+ protected MyCommonContentEntriesEditor myEditor;
+
+ public PyContentEntriesModuleConfigurable(final Module module) {
+ myModule = module;
+ }
+
+ @Override
+ public String getDisplayName() {
+ return "Project Structure";
+ }
+
+ @Override
+ public String getHelpTopic() {
+ return "reference.settingsdialog.project.structure";
+ }
+
+ @Override
+ public JComponent createComponent() {
+ createEditor();
+ return myTopPanel;
+ }
+
+ private void createEditor() {
+ if (myModule == null) return;
+ myModifiableModel = ApplicationManager.getApplication().runReadAction(new Computable<ModifiableRootModel>() {
+ @Override
+ public ModifiableRootModel compute() {
+ return ModuleRootManager.getInstance(myModule).getModifiableModel();
+ }
+ });
+
+ final ModuleConfigurationStateImpl moduleConfigurationState =
+ new ModuleConfigurationStateImpl(myModule.getProject(), new DefaultModulesProvider(myModule.getProject())) {
+ @Override
+ public ModifiableRootModel getRootModel() {
+ return myModifiableModel;
+ }
+
+ @Override
+ public FacetsProvider getFacetsProvider() {
+ return DefaultFacetsProvider.INSTANCE;
+ }
+ };
+ myEditor = createEditor(myModule, moduleConfigurationState);
+
+ JComponent component = ApplicationManager.getApplication().runReadAction(new Computable<JComponent>() {
+ @Override
+ public JComponent compute() {
+ return myEditor.createComponent();
+ }
+ });
+ myTopPanel.add(component, BorderLayout.CENTER);
+ }
+
+ protected MyCommonContentEntriesEditor createEditor(@NotNull Module module, @NotNull ModuleConfigurationStateImpl state) {
+ return new MyCommonContentEntriesEditor(module, state, JavaSourceRootType.SOURCE);
+ }
+
+ @Override
+ public boolean isModified() {
+ return myEditor != null && myEditor.isModified();
+ }
+
+ @Override
+ public void apply() throws ConfigurationException {
+ if (myEditor == null) return;
+ myEditor.apply();
+ if (myModifiableModel.isChanged()) {
+ ApplicationManager.getApplication().runWriteAction(new Runnable() {
+ @Override
+ public void run() {
+ myModifiableModel.commit();
+ }
+ });
+ resetEditor();
+ }
+ }
+
+ @Override
+ public void reset() {
+ if (myEditor == null) return;
+ if (myModifiableModel != null) {
+ myModifiableModel.dispose();
+ }
+ resetEditor();
+ }
+
+ private void resetEditor() {
+ myEditor.disposeUIResources();
+ myTopPanel.remove(myEditor.getComponent());
+ createEditor();
+ }
+
+ @Override
+ public void disposeUIResources() {
+ if (myEditor != null) {
+ myEditor.disposeUIResources();
+ myTopPanel.remove(myEditor.getComponent());
+ myEditor = null;
+ }
+ if (myModifiableModel != null) {
+ myModifiableModel.dispose();
+ myModifiableModel = null;
+ }
+ }
+
+ @Override
+ protected Configurable[] buildConfigurables() {
+ return new Configurable[0];
+ }
+
+ @Override
+ @NotNull
+ public String getId() {
+ return "python.project.structure";
+ }
+
+ private static class MyContentEntryTreeEditor extends ContentEntryTreeEditor {
+
+ private final ChangeListener myListener = new ChangeListener() {
+ @Override
+ public void stateChanged(ChangeEvent e) {
+ update();
+ }
+ };
+
+ public MyContentEntryTreeEditor(Project project, List<ModuleSourceRootEditHandler<?>> handlers) {
+ super(project, handlers);
+ }
+
+ @Override
+ public void setContentEntryEditor(ContentEntryEditor newEditor) {
+ MyCommonContentEntriesEditor.MyContentEntryEditor existingEditor = getContentEntryEditor();
+ if (Comparing.equal(existingEditor, newEditor)) {
+ return;
+ }
+ if (existingEditor != null) {
+ existingEditor.removeListener(myListener);
+ }
+ if (newEditor != null) {
+ ((MyCommonContentEntriesEditor.MyContentEntryEditor)newEditor).addListener(myListener);
+ }
+ super.setContentEntryEditor(newEditor);
+ }
+
+ @Override
+ public MyCommonContentEntriesEditor.MyContentEntryEditor getContentEntryEditor() {
+ return (MyCommonContentEntriesEditor.MyContentEntryEditor)super.getContentEntryEditor();
+ }
+
+ @Override
+ protected void createEditingActions() {
+ super.createEditingActions();
+
+ ContentEntryEditingAction a = new ContentEntryEditingAction(myTree) {
+ {
+ final Presentation templatePresentation = getTemplatePresentation();
+ templatePresentation.setText("Templates");
+ templatePresentation.setDescription("Template Folders");
+ templatePresentation.setIcon(PythonIcons.Python.TemplateRoot);
+ }
+
+ @Override
+ public boolean isSelected(AnActionEvent e) {
+ final VirtualFile[] selectedFiles = getSelectedFiles();
+ return selectedFiles.length != 0 && getContentEntryEditor().hasTemplateRoot(selectedFiles[0]);
+ }
+
+ @Override
+ public void setSelected(AnActionEvent e, boolean isSelected) {
+ final VirtualFile[] selectedFiles = getSelectedFiles();
+ assert selectedFiles.length != 0;
+
+ for (VirtualFile selectedFile : selectedFiles) {
+ boolean wasSelected = getContentEntryEditor().hasTemplateRoot(selectedFile);
+ if (isSelected) {
+ if (!wasSelected) {
+ getContentEntryEditor().addTemplateRoot(selectedFile);
+ }
+ }
+ else {
+ if (wasSelected) {
+ getContentEntryEditor().removeTemplateRoot(selectedFile);
+ }
+ }
+ }
+ }
+ };
+ myEditingActionsGroup.add(a);
+ a.registerCustomShortcutSet(new CustomShortcutSet(KeyStroke.getKeyStroke(KeyEvent.VK_R, InputEvent.ALT_MASK)), myTree);
+ }
+
+ @Override
+ protected TreeCellRenderer getContentEntryCellRenderer() {
+ return new ContentEntryTreeCellRenderer(this, getEditHandlers()) {
+ @Override
+ protected Icon updateIcon(final ContentEntry entry, final VirtualFile file, final Icon originalIcon) {
+ if (getContentEntryEditor().hasTemplateRoot(file)) {
+ return PythonIcons.Python.TemplateRoot;
+ }
+ return super.updateIcon(entry, file, originalIcon);
+ }
+ };
+ }
+ }
+
+ protected static class MyCommonContentEntriesEditor extends CommonContentEntriesEditor {
+ private final MultiMap<ContentEntry, VirtualFilePointer> myTemplateRoots = new MultiMap<ContentEntry, VirtualFilePointer>();
+ private final Module myModule;
+ private Disposable myFilePointersDisposable;
+
+ private final VirtualFilePointerListener DUMMY_LISTENER = new VirtualFilePointerListener() {
+ @Override
+ public void beforeValidityChanged(@NotNull VirtualFilePointer[] pointers) {
+ }
+
+ @Override
+ public void validityChanged(@NotNull VirtualFilePointer[] pointers) {
+ }
+ };
+
+ public MyCommonContentEntriesEditor(Module module,
+ ModuleConfigurationStateImpl moduleConfigurationState,
+ JpsModuleSourceRootType<?>... rootTypes) {
+ super(module.getName(), moduleConfigurationState, rootTypes);
+ myModule = module;
+ reset();
+ }
+
+ @Override
+ protected ContentEntryTreeEditor createContentEntryTreeEditor(Project project) {
+ return new MyContentEntryTreeEditor(project, getEditHandlers());
+ }
+
+ @Override
+ protected List<ContentEntry> addContentEntries(VirtualFile[] files) {
+ List<ContentEntry> entries = super.addContentEntries(files);
+ addContentEntryPanels(entries.toArray(new ContentEntry[entries.size()]));
+ return entries;
+ }
+
+ @Override
+ public void reset() {
+ if (myFilePointersDisposable != null) {
+ Disposer.dispose(myFilePointersDisposable);
+ }
+ myTemplateRoots.clear();
+
+ myFilePointersDisposable = Disposer.newDisposable();
+ final TemplatesService instance = TemplatesService.getInstance(myModule);
+ if (instance != null) {
+ final List<VirtualFile> folders = instance.getTemplateFolders();
+ for (VirtualFile folder : folders) {
+ ContentEntry contentEntry = findContentEntryForFile(folder);
+ if (contentEntry != null) {
+ myTemplateRoots.putValue(contentEntry, VirtualFilePointerManager.getInstance().create(folder, myFilePointersDisposable,
+ DUMMY_LISTENER));
+ }
+ }
+ }
+
+ if (myRootTreeEditor != null) {
+ ContentEntryEditor editor = myRootTreeEditor.getContentEntryEditor();
+ if(editor!=null) editor.update();
+ myRootTreeEditor.update();
+ }
+ }
+
+ @Nullable
+ private ContentEntry findContentEntryForFile(VirtualFile virtualFile) {
+ for (ContentEntry contentEntry : getModel().getContentEntries()) {
+ final VirtualFile file = contentEntry.getFile();
+ if (file != null && VfsUtilCore.isAncestor(file, virtualFile, false)) {
+ return contentEntry;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public void disposeUIResources() {
+ super.disposeUIResources();
+ if (myFilePointersDisposable != null) {
+ Disposer.dispose(myFilePointersDisposable);
+ }
+ }
+
+ @Override
+ public void apply() throws ConfigurationException {
+ super.apply();
+ List<VirtualFile> templateRoots = getCurrentState();
+ TemplatesService.getInstance(myModule).setTemplateFolders(templateRoots.toArray(new VirtualFile[templateRoots.size()]));
+ }
+
+ private List<VirtualFile> getCurrentState() {
+ List<VirtualFile> result = new ArrayList<VirtualFile>();
+ for (ContentEntry entry : myTemplateRoots.keySet()) {
+ for (VirtualFilePointer filePointer : myTemplateRoots.get(entry)) {
+ result.add(filePointer.getFile());
+ }
+ }
+ return result;
+ }
+
+ @Override
+ public boolean isModified() {
+ if (super.isModified()) return true;
+ final TemplatesService templatesService = TemplatesService.getInstance(myModule);
+ if (templatesService != null) {
+ List<VirtualFile> original = templatesService.getTemplateFolders();
+ List<VirtualFile> current = getCurrentState();
+
+ if (!Comparing.haveEqualElements(original, current)) return true;
+
+ }
+ return false;
+ }
+
+ @Override
+ protected MyContentEntryEditor createContentEntryEditor(String contentEntryUrl) {
+ return new MyContentEntryEditor(contentEntryUrl, getEditHandlers());
+ }
+
+ protected class MyContentEntryEditor extends ContentEntryEditor {
+ private final EventDispatcher<ChangeListener> myEventDispatcher = EventDispatcher.create(ChangeListener.class);
+
+ public MyContentEntryEditor(String contentEntryUrl, List<ModuleSourceRootEditHandler<?>> handlers) {
+ super(contentEntryUrl, handlers);
+ }
+
+ @Override
+ protected ModifiableRootModel getModel() {
+ return MyCommonContentEntriesEditor.this.getModel();
+ }
+
+ public void addListener(ChangeListener changeListener) {
+ myEventDispatcher.addListener(changeListener);
+ }
+
+ public void removeListener(ChangeListener changeListener) {
+ myEventDispatcher.removeListener(changeListener);
+ }
+
+ @Override
+ protected ContentRootPanel createContentRootPane() {
+ return new MyContentRootPanel();
+ }
+
+ @Override
+ public void deleteContentFolder(ContentEntry contentEntry, ContentFolder folder) {
+ if (folder instanceof TemplateRootFolder) {
+ final VirtualFile file = folder.getFile();
+ if (file != null) {
+ removeTemplateRoot(file);
+ }
+ }
+ else {
+ super.deleteContentFolder(contentEntry, folder);
+ }
+ }
+
+ public void addTemplateRoot(@NotNull final VirtualFile file) {
+ final VirtualFilePointer root = VirtualFilePointerManager.getInstance().create(file, myFilePointersDisposable, DUMMY_LISTENER);
+ myTemplateRoots.putValue(getContentEntry(), root);
+ myEventDispatcher.getMulticaster().stateChanged(new ChangeEvent(this));
+ update();
+ }
+
+ public void removeTemplateRoot(@NotNull final VirtualFile file) {
+ final VirtualFilePointer root = getTemplateRoot(file);
+ if (root != null) {
+ myTemplateRoots.remove(getContentEntry(), root);
+ myEventDispatcher.getMulticaster().stateChanged(new ChangeEvent(this));
+ update();
+ }
+ }
+
+ public boolean hasTemplateRoot(@NotNull final VirtualFile file) {
+ return getTemplateRoot(file) != null;
+ }
+
+ @Nullable
+ public VirtualFilePointer getTemplateRoot(@NotNull final VirtualFile file) {
+ for (VirtualFilePointer filePointer : myTemplateRoots.get(getContentEntry())) {
+ if (Comparing.equal(filePointer.getFile(), file)) {
+ return filePointer;
+ }
+ }
+ return null;
+ }
+
+ protected class MyContentRootPanel extends ContentRootPanel {
+ public MyContentRootPanel() {
+ super(MyContentEntryEditor.this, getEditHandlers());
+ }
+
+ @Override
+ @NotNull
+ protected ContentEntryImpl getContentEntry() {
+ //noinspection ConstantConditions
+ return (ContentEntryImpl)MyContentEntryEditor.this.getContentEntry();
+ }
+
+ @Override
+ protected void addFolderGroupComponents() {
+ super.addFolderGroupComponents();
+ if (!myTemplateRoots.get(getContentEntry()).isEmpty()) {
+ final List<TemplateRootFolder> folders = new ArrayList<TemplateRootFolder>(myTemplateRoots.size());
+ for (VirtualFilePointer root : myTemplateRoots.get(getContentEntry())) {
+ folders.add(new TemplateRootFolder(root, getContentEntry()));
+ }
+ final JComponent sourcesComponent = createFolderGroupComponent("Template Folders",
+ folders.toArray(new ContentFolder[folders.size()]),
+ TEMPLATES_COLOR, null);
+ this.add(sourcesComponent, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 1.0, 0.0, GridBagConstraints.NORTH,
+ GridBagConstraints.HORIZONTAL, new Insets(0, 0, 10, 0), 0, 0));
+ }
+ }
+ }
+ }
+ }
+
+ private static class TemplateRootFolder extends ContentFolderBaseImpl {
+ protected TemplateRootFolder(@NotNull VirtualFilePointer filePointer, @NotNull ContentEntryImpl contentEntry) {
+ super(filePointer, contentEntry);
+ }
+ }
+}
diff --git a/python/ide/src/com/jetbrains/python/configuration/PythonContentEntriesConfigurable.java b/python/ide/src/com/jetbrains/python/configuration/PythonContentEntriesConfigurable.java
index be9d2a7..f67260b 100644
--- a/python/ide/src/com/jetbrains/python/configuration/PythonContentEntriesConfigurable.java
+++ b/python/ide/src/com/jetbrains/python/configuration/PythonContentEntriesConfigurable.java
@@ -22,11 +22,9 @@
import com.intellij.openapi.options.NonDefaultProjectConfigurable;
import com.intellij.openapi.options.OptionalConfigurable;
import com.intellij.openapi.project.Project;
-import com.intellij.openapi.roots.ui.configuration.PlatformContentEntriesConfigurable;
import com.intellij.util.ArrayUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-import org.jetbrains.jps.model.java.JavaSourceRootType;
/**
* @author yole
@@ -52,6 +50,6 @@
@NotNull
@Override
protected Configurable createModuleConfigurable(Module module) {
- return new PlatformContentEntriesConfigurable(module, JavaSourceRootType.SOURCE);
+ return new PyContentEntriesModuleConfigurable(module);
}
}
diff --git a/python/ide/src/com/jetbrains/python/configuration/PythonPathEditor.java b/python/ide/src/com/jetbrains/python/configuration/PythonPathEditor.java
index d7f99bf..1c1a663 100644
--- a/python/ide/src/com/jetbrains/python/configuration/PythonPathEditor.java
+++ b/python/ide/src/com/jetbrains/python/configuration/PythonPathEditor.java
@@ -36,6 +36,7 @@
import com.intellij.ui.ToolbarDecorator;
import com.intellij.ui.components.JBList;
import com.intellij.util.ArrayUtil;
+import com.jetbrains.python.codeInsight.userSkeletons.PyUserSkeletonsUtil;
import com.jetbrains.python.sdk.PythonSdkAdditionalData;
import com.jetbrains.python.sdk.PythonSdkType;
import org.jetbrains.annotations.NotNull;
@@ -282,8 +283,11 @@
private static boolean isStubPath(@NotNull VirtualFile file) {
final String path = PythonSdkType.getSkeletonsRootPath(PathManager.getSystemPath());
final VirtualFile skeletonRoot = LocalFileSystem.getInstance().findFileByPath(path);
- if (skeletonRoot != null) {
- return file.getPath().startsWith(skeletonRoot.getPath());
+ if (skeletonRoot != null && file.getPath().startsWith(skeletonRoot.getPath())) {
+ return true;
+ }
+ else if (file.equals(PyUserSkeletonsUtil.getUserSkeletonsDirectory())) {
+ return true;
}
else {
return false;
diff --git a/python/ide/src/com/jetbrains/python/configuration/PythonSdkConfigurable.form b/python/ide/src/com/jetbrains/python/configuration/PythonSdkConfigurable.form
deleted file mode 100644
index b1a81e8..0000000
--- a/python/ide/src/com/jetbrains/python/configuration/PythonSdkConfigurable.form
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="com.jetbrains.python.configuration.PythonSdkConfigurable">
- <grid id="27dc6" binding="myPanel" layout-manager="GridLayoutManager" row-count="1" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
- <margin top="0" left="0" bottom="0" right="0"/>
- <constraints>
- <xy x="20" y="20" width="611" height="400"/>
- </constraints>
- <properties/>
- <border type="none"/>
- <children>
- <grid id="feff7" binding="mySplitterHolder" layout-manager="BorderLayout" hgap="0" vgap="0">
- <constraints>
- <grid row="0" column="0" row-span="1" col-span="2" vsize-policy="7" hsize-policy="7" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
- </constraints>
- <properties/>
- <border type="none"/>
- <children>
- <grid id="6feb9" binding="myNotificationsPlaceholder" layout-manager="BorderLayout" hgap="0" vgap="0">
- <constraints border-constraint="South"/>
- <properties>
- <background swing-color="ArrowButton.background"/>
- <minimumSize width="6" height="6"/>
- <preferredSize width="6" height="23"/>
- </properties>
- <border type="none"/>
- <children/>
- </grid>
- </children>
- </grid>
- </children>
- </grid>
-</form>
diff --git a/python/ide/src/com/jetbrains/python/configuration/PythonSdkConfigurable.java b/python/ide/src/com/jetbrains/python/configuration/PythonSdkConfigurable.java
deleted file mode 100644
index 78752b8..0000000
--- a/python/ide/src/com/jetbrains/python/configuration/PythonSdkConfigurable.java
+++ /dev/null
@@ -1,586 +0,0 @@
-/*
- * Copyright 2000-2013 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.jetbrains.python.configuration;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-import com.intellij.CommonBundle;
-import com.intellij.icons.AllIcons;
-import com.intellij.openapi.actionSystem.AnActionEvent;
-import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
-import com.intellij.openapi.module.Module;
-import com.intellij.openapi.module.ModuleManager;
-import com.intellij.openapi.options.Configurable;
-import com.intellij.openapi.options.ConfigurationException;
-import com.intellij.openapi.project.DumbAware;
-import com.intellij.openapi.project.Project;
-import com.intellij.openapi.projectRoots.*;
-import com.intellij.openapi.projectRoots.impl.ProjectJdkImpl;
-import com.intellij.openapi.projectRoots.impl.SdkConfigurationUtil;
-import com.intellij.openapi.roots.ModuleRootManager;
-import com.intellij.openapi.roots.OrderRootType;
-import com.intellij.openapi.roots.ProjectRootManager;
-import com.intellij.openapi.roots.ui.configuration.projectRoot.ProjectSdksModel;
-import com.intellij.openapi.ui.DialogWrapper;
-import com.intellij.openapi.ui.Messages;
-import com.intellij.openapi.ui.Splitter;
-import com.intellij.openapi.util.Comparing;
-import com.intellij.openapi.vfs.VirtualFile;
-import com.intellij.remotesdk.RemoteCredentials;
-import com.intellij.ui.*;
-import com.intellij.ui.components.JBList;
-import com.intellij.ui.components.JBTabbedPane;
-import com.intellij.util.Consumer;
-import com.intellij.util.NullableConsumer;
-import com.intellij.util.NullableFunction;
-import com.intellij.util.containers.FactoryMap;
-import com.intellij.webcore.packaging.PackagesNotificationPanel;
-import com.jetbrains.python.packaging.ui.PyInstalledPackagesPanel;
-import com.jetbrains.python.packaging.ui.PyPackageManagementService;
-import com.jetbrains.python.remote.PythonRemoteInterpreterManager;
-import com.jetbrains.python.sdk.*;
-import com.jetbrains.python.sdk.flavors.PythonSdkFlavor;
-import icons.PythonIcons;
-import org.jetbrains.annotations.Nullable;
-
-import javax.swing.*;
-import javax.swing.event.ListSelectionEvent;
-import javax.swing.event.ListSelectionListener;
-import java.awt.*;
-import java.util.*;
-import java.util.List;
-
-public class PythonSdkConfigurable implements Configurable, Configurable.NoScroll {
- private JPanel myPanel;
- private JList mySdkList;
- private JPanel mySplitterHolder;
- private PackagesNotificationPanel myNotificationsArea;
- private JPanel myNotificationsPlaceholder;
- private PythonPathEditor myPathEditor;
- private boolean mySdkListChanged = false;
- private final PyConfigurableInterpreterList myInterpreterList;
- private final ProjectSdksModel myProjectSdksModel;
- private final PyInstalledPackagesPanel myPackagesPanel;
-
- private Map<Sdk, SdkModificator> myModificators = new FactoryMap<Sdk, SdkModificator>() {
- @Override
- protected SdkModificator create(Sdk sdk) {
- return sdk.getSdkModificator();
- }
- };
- private Set<SdkModificator> myModifiedModificators = new HashSet<SdkModificator>();
- private Sdk myPreviousSelection;
- private boolean myFirstReset;
- private final Project myProject;
-
- private boolean myNewProject = false;
- private boolean myShowOtherProjectVirtualenvs = false;
-
- public void setNewProject(final boolean newProject) {
- myNewProject = newProject;
- }
-
- public PythonSdkConfigurable(Project project) {
- myProject = project;
- myInterpreterList = PyConfigurableInterpreterList.getInstance(myProject);
- myProjectSdksModel = myInterpreterList.getModel();
- myFirstReset = true;
-
-
- mySdkList = new JBList();
- mySdkList.setCellRenderer(new PySdkListCellRenderer("", myModificators));
- mySdkList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
-
- ToolbarDecorator decorator = ToolbarDecorator.createDecorator(mySdkList).disableUpDownActions()
- .setAddAction(new AnActionButtonRunnable() {
- @Override
- public void run(AnActionButton button) {
- addSdk(button);
- }
- })
- .setEditAction(new AnActionButtonRunnable() {
- @Override
- public void run(AnActionButton button) {
- editSdk();
- }
- })
- .setRemoveAction(new AnActionButtonRunnable() {
- @Override
- public void run(AnActionButton button) {
- removeSdk();
- }
- })
- .addExtraAction(new CreateVirtualEnvButton())
- .addExtraAction(new ToggleVirtualEnvFilterButton());
-
-
- final Splitter splitter = new Splitter(true);
- /*
- final JScrollPane sdkListPane = ScrollPaneFactory.createScrollPane(mySdkList,
- ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
- ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
- sdkListPane.setPreferredSize(new Dimension(10, 10));
- */
- splitter.setFirstComponent(decorator.createPanel());
-
- myPathEditor =
- new PythonPathEditor("Classes", OrderRootType.CLASSES, FileChooserDescriptorFactory.createAllButJarContentsDescriptor()) {
- @Override
- protected void onReloadButtonClicked() {
- reloadSdk();
- }
- };
-
- myNotificationsArea = new PackagesNotificationPanel(project);
- myNotificationsPlaceholder.add(myNotificationsArea.getComponent(), BorderLayout.CENTER);
-
- final JBTabbedPane tabbedPane = new JBTabbedPane(SwingConstants.TOP);
- myPackagesPanel = new PyInstalledPackagesPanel(project, myNotificationsArea);
- tabbedPane.addTab("Packages", myPackagesPanel);
-
- JPanel panel1 = new JPanel(new GridBagLayout());
- Insets anInsets1 = new Insets(2, 2, 2, 2);
- JScrollPane scrollPane1 = ScrollPaneFactory.createScrollPane(myPathEditor.createComponent(),
- ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
- ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
- scrollPane1.setPreferredSize(new Dimension(500, 500));
- panel1.add(scrollPane1, new GridBagConstraints(0, 0, 1, 8, 1.0, 1.0,
- GridBagConstraints.CENTER,
- GridBagConstraints.BOTH,
- anInsets1, 0, 0));
-
- tabbedPane.addTab("Paths", panel1);
-
- splitter.setSecondComponent(tabbedPane);
- mySplitterHolder.add(splitter, BorderLayout.CENTER);
-
- addListeners();
- }
-
- private void addListeners() {
- myProjectSdksModel.addListener(new SdkModel.Listener() {
- @Override
- public void sdkAdded(Sdk sdk) {
- }
-
- @Override
- public void beforeSdkRemove(Sdk sdk) {
- }
-
- @Override
- public void sdkChanged(Sdk sdk, String previousName) {
- refreshSdkList();
- }
-
- @Override
- public void sdkHomeSelected(Sdk sdk, String newSdkHome) {
- }
- });
- myPackagesPanel.addPathChangedListener(new Consumer<Sdk>() {
- @Override
- public void consume(Sdk sdk) {
- updateSdkPaths(sdk);
- }
- });
-
- myNotificationsArea.addLinkHandler(PyInstalledPackagesPanel.CREATE_VENV, new Runnable() {
- @Override
- public void run() {
- createVirtualEnv(getSelectedSdk());
- }
- });
- mySdkList.addListSelectionListener(new ListSelectionListener() {
- public void valueChanged(ListSelectionEvent event) {
- updateUI(getSelectedSdk());
- }
- });
- }
-
- private void updateUI(final Sdk selectedSdk) {
- if (myPreviousSelection != null) {
- saveSdkPaths(myPreviousSelection);
- }
- myProjectSdksModel.setProjectSdk(selectedSdk);
- updateSdkPaths(selectedSdk);
- myPreviousSelection = selectedSdk;
- myPackagesPanel.updatePackages(selectedSdk == null ? null : new PyPackageManagementService(myProject, selectedSdk));
-
- if (selectedSdk != null) {
- myPackagesPanel.updateNotifications(selectedSdk);
- }
- }
-
- private void createVirtualEnv(Sdk sdk) {
- CreateVirtualEnvDialog.VirtualEnvCallback callback = new CreateVirtualEnvDialog.VirtualEnvCallback() {
- @Override
- public void virtualEnvCreated(Sdk sdk, boolean associateWithProject, boolean setAsProjectInterpreter) {
- PythonSdkType.setupSdkPaths(sdk, myProject, null);
- if (associateWithProject) {
- SdkAdditionalData additionalData = sdk.getSdkAdditionalData();
- if (additionalData == null) {
- additionalData = new PythonSdkAdditionalData(PythonSdkFlavor.getFlavor(sdk.getHomePath()));
- ((ProjectJdkImpl)sdk).setSdkAdditionalData(additionalData);
- }
- if (myNewProject) {
- ((PythonSdkAdditionalData)additionalData).associateWithNewProject();
- }
- else {
- ((PythonSdkAdditionalData)additionalData).associateWithProject(myProject);
- }
- }
- addCreatedSdk(sdk, true, setAsProjectInterpreter);
- }
- };
- final List<Sdk> allSdks = PyConfigurableInterpreterList.getInstance(myProject).getAllPythonSdks();
- final CreateVirtualEnvDialog dialog = new CreateVirtualEnvDialog(myProject, myNewProject, allSdks, sdk);
- dialog.show();
- if (dialog.isOK()) {
- dialog.createVirtualEnv(allSdks, callback);
- }
- }
-
- public String getDisplayName() {
- return "Python Interpreters";
- }
-
- public String getHelpTopic() {
- return "python_interpreter";
- }
-
- public JComponent createComponent() {
- return myPanel;
- }
-
- public boolean isModified() {
- return mySdkListChanged ||
- myProjectSdksModel.isModified() ||
- myPathEditor.isModified() ||
- !myModifiedModificators.isEmpty();
- }
-
- @Nullable
- private String getSelectedSdkName() {
- final Sdk selectedSdk = (Sdk)mySdkList.getSelectedValue();
- return selectedSdk == null ? null : selectedSdk.getName();
- }
-
- public void apply() throws ConfigurationException {
- if (myPreviousSelection != null) {
- saveSdkPaths(myPreviousSelection);
- }
- for (SdkModificator modificator : myModifiedModificators) {
- modificator.commitChanges();
- }
- myModificators.clear();
- myModifiedModificators.clear();
- myProjectSdksModel.apply();
- mySdkListChanged = false;
- }
-
- /**
- * Returns the stable copy of the SDK currently selected in the SDK table.
- *
- * @return the selected SDK, or null if there's no selection
- */
- @Nullable
- public Sdk getRealSelectedSdk() {
- return ProjectJdkTable.getInstance().findJdk(getSelectedSdkName());
- }
-
- @Nullable
- public Sdk getSelectedSdk() {
- return (Sdk)mySdkList.getSelectedValue();
- }
-
- public void reset() {
- clearModificators();
- if (myFirstReset) {
- myFirstReset = false;
- }
- else {
- myProjectSdksModel.reset(null);
- }
- refreshSdkList();
- final Sdk selectedSdk = getRealSelectedSdk();
- if (selectedSdk != null) {
- myPackagesPanel.updateNotifications(selectedSdk);
- }
- }
-
- private void clearModificators() {
- myModificators.clear();
- myModifiedModificators.clear();
- myPreviousSelection = null;
- }
-
- private void refreshSdkList() {
- final List<Sdk> pythonSdks = myInterpreterList.getAllPythonSdks();
- Sdk projectSdk = myProjectSdksModel.getProjectSdk();
- if (!myShowOtherProjectVirtualenvs) {
- VirtualEnvProjectFilter.removeNotMatching(myProject, pythonSdks);
- }
- Collections.sort(pythonSdks, new PreferredSdkComparator());
- mySdkList.setModel(new CollectionListModel<Sdk>(pythonSdks));
-
- mySdkListChanged = false;
- if (projectSdk == null) projectSdk = getSdk();
- if (projectSdk != null) {
- projectSdk = myProjectSdksModel.findSdk(projectSdk.getName());
- mySdkList.clearSelection();
- mySdkList.setSelectedValue(projectSdk, true);
- mySdkList.updateUI();
- }
- }
-
- @Nullable
- private Sdk getSdk() {
- final Module[] modules = ModuleManager.getInstance(myProject).getModules();
- if (modules.length > 0) {
- final Module module = modules[0];
- final ModuleRootManager rootManager = ModuleRootManager.getInstance(module);
- return rootManager.getSdk();
- }
- return ProjectRootManager.getInstance(myProject).getProjectSdk();
- }
-
- private void addSdk(AnActionButton button) {
- InterpreterPathChooser
- .show(myProject, myProjectSdksModel.getSdks(), button.getPreferredPopupPoint(), false, new NullableConsumer<Sdk>() {
- @Override
- public void consume(Sdk sdk) {
- addCreatedSdk(sdk, false, false);
- }
- });
- }
-
- private void addCreatedSdk(@Nullable final Sdk sdk, boolean newVirtualEnv, boolean makeActive) {
- if (sdk != null) {
- boolean isVirtualEnv = PythonSdkType.isVirtualEnv(sdk);
- boolean askSetAsProjectInterpreter = !myProject.isDefault() && !myNewProject;
- if (askSetAsProjectInterpreter && isVirtualEnv && !newVirtualEnv) {
- AddVEnvOptionsDialog dialog = new AddVEnvOptionsDialog(myPanel);
- dialog.show();
- if (dialog.getExitCode() != DialogWrapper.OK_EXIT_CODE) {
- return;
- }
- SdkModificator modificator = myModificators.get(sdk);
- setSdkAssociated(modificator, !dialog.makeAvailableToAll());
- myModifiedModificators.add(modificator);
- makeActive = dialog.useForThisProject();
- }
- myProjectSdksModel.addSdk(sdk);
- refreshSdkList();
- mySdkList.setSelectedValue(sdk, true);
- mySdkListChanged = true;
- if (askSetAsProjectInterpreter && !isVirtualEnv && !PythonSdkType.isInvalid(sdk) && !PythonSdkType.isIncompleteRemote(sdk)) {
- //TODO: make native mac dialog work
- makeActive = Messages.showIdeaMessageDialog(myProject, "Do you want to set this interpreter as Project Interpreter?",
- "Project Interpreter",
- new String[]{CommonBundle.getYesButtonText(), CommonBundle.getNoButtonText()}, 0, null,
- null
- ) == Messages.YES;
- }
- if (makeActive) {
- SdkConfigurationUtil.setDirectoryProjectSdk(myProject, sdk);
- myProjectSdksModel.setProjectSdk(sdk);
- myInterpreterList.setSelectedSdk(sdk);
- }
- }
- }
-
- private void editSdk() {
- final Sdk currentSdk = getSelectedSdk();
- if (currentSdk != null) {
- if (currentSdk.getSdkAdditionalData() instanceof RemoteCredentials) {
- editRemoteSdk(currentSdk);
- }
- else {
- editSdk(currentSdk);
- }
- updateUI(currentSdk);
- }
- }
-
- private void editRemoteSdk(Sdk currentSdk) {
- PythonRemoteInterpreterManager remoteInterpreterManager = PythonRemoteInterpreterManager.getInstance();
- if (remoteInterpreterManager != null) {
- final SdkModificator modificator = myModificators.get(currentSdk);
- Set<Sdk> existingSdks = Sets.newHashSet(myProjectSdksModel.getSdks());
- existingSdks.remove(currentSdk);
- if (remoteInterpreterManager.editSdk(myProject, modificator, existingSdks)) {
- myModifiedModificators.add(modificator);
- }
- }
- }
-
- private void editSdk(final Sdk currentSdk) {
- final SdkModificator modificator = myModificators.get(currentSdk);
- final EditSdkDialog dialog = new EditSdkDialog(myProject, modificator, new NullableFunction<String, String>() {
- @Override
- public String fun(String s) {
- if (isDuplicateSdkName(s, currentSdk)) {
- return "Please specify a unique name for the interpreter";
- }
- return null;
- }
- });
- dialog.show();
- if (dialog.isOK()) {
- final boolean pathChanged = !Comparing.equal(currentSdk.getHomePath(), dialog.getHomePath());
- if (!currentSdk.getName().equals(dialog.getName()) || pathChanged || dialog.isAssociateChanged()) {
- myModifiedModificators.add(modificator);
- modificator.setName(dialog.getName());
- modificator.setHomePath(dialog.getHomePath());
-
- if (dialog.isAssociateChanged()) {
- setSdkAssociated(modificator, dialog.associateWithProject());
- }
- if (pathChanged) {
- reloadSdk(currentSdk);
- }
- }
- }
- }
-
- private void setSdkAssociated(SdkModificator modificator, boolean isAssociated) {
- PythonSdkAdditionalData additionalData = (PythonSdkAdditionalData)modificator.getSdkAdditionalData();
- if (additionalData == null) {
- additionalData = new PythonSdkAdditionalData(PythonSdkFlavor.getFlavor(modificator.getHomePath()));
- modificator.setSdkAdditionalData(additionalData);
- }
- if (isAssociated) {
- additionalData.associateWithProject(myProject);
- }
- else {
- additionalData.setAssociatedProjectPath(null);
- }
- }
-
- private boolean isDuplicateSdkName(String s, Sdk sdk) {
- for (Sdk existingSdk : myProjectSdksModel.getSdks()) {
- if (existingSdk == sdk) {
- continue;
- }
- String existingName;
- if (myModificators.containsKey(existingSdk)) {
- existingName = myModificators.get(existingSdk).getName();
- }
- else {
- existingName = existingSdk.getName();
- }
- if (existingName.equals(s)) {
- return true;
- }
- }
- return false;
- }
-
- private void removeSdk() {
- final Sdk current_sdk = getSelectedSdk();
- if (current_sdk != null) {
- myProjectSdksModel.removeSdk(current_sdk);
- if (myModificators.containsKey(current_sdk)) {
- SdkModificator modificator = myModificators.get(current_sdk);
- myModifiedModificators.remove(modificator);
- myModificators.remove(current_sdk);
- }
- refreshSdkList();
- mySdkListChanged = true;
- // TODO select initially selected SDK
- if (mySdkList.getSelectedIndex() < 0) {
- mySdkList.setSelectedIndex(0);
- }
- }
- }
-
- private void reloadSdk() {
- final Sdk currentSdk = getSelectedSdk();
- if (currentSdk != null) {
- myModifiedModificators.add(myModificators.get(currentSdk));
- reloadSdk(currentSdk);
- }
- }
-
- private void reloadSdk(Sdk currentSdk) {
- PythonSdkType.setupSdkPaths(myProject, null, currentSdk, myModificators.get(currentSdk)); // or must it be a RunWriteAction?
- reloadSdkPaths(currentSdk);
- }
-
- public void disposeUIResources() {
- myInterpreterList.disposeModel();
- clearModificators();
- myFirstReset = true;
- }
-
- private void saveSdkPaths(Sdk selection) {
- SdkModificator modificator = myModificators.get(selection);
- if (myPathEditor.isModified()) {
- myPathEditor.apply(modificator);
- myModifiedModificators.add(modificator);
- }
- }
-
- private void reloadSdkPaths(Sdk selection) {
- List<VirtualFile> rootPaths = Lists.newArrayList();
- if (selection != null) {
- Collections.addAll(rootPaths, selection.getRootProvider().getFiles(OrderRootType.CLASSES));
- myPathEditor.reload(myModificators.get(selection));
- }
- else {
- myPathEditor.reload(null);
- }
- }
-
- private void updateSdkPaths(final Sdk selection) {
- final List<VirtualFile> rootPaths = Lists.newArrayList();
- if (selection != null) {
- Collections.addAll(rootPaths, selection.getRootProvider().getFiles(OrderRootType.CLASSES));
- myPathEditor.reset(myModificators.get(selection));
- }
- else {
- myPathEditor.reset(null);
- }
- }
-
- private class CreateVirtualEnvButton extends AnActionButton implements DumbAware {
- public CreateVirtualEnvButton() {
- super("Create Virtual Environment", PythonIcons.Python.Virtualenv);
- }
-
- @Override
- public void actionPerformed(AnActionEvent e) {
- Sdk selectedSdk = getSelectedSdk();
- createVirtualEnv(selectedSdk);
- }
- }
-
- private class ToggleVirtualEnvFilterButton extends ToggleActionButton implements DumbAware {
- public ToggleVirtualEnvFilterButton() {
- super("Show virtual environments associated with other projects", AllIcons.General.Filter);
- }
-
- @Override
- public boolean isSelected(AnActionEvent e) {
- return myShowOtherProjectVirtualenvs;
- }
-
- @Override
- public void setSelected(AnActionEvent e, boolean state) {
- myShowOtherProjectVirtualenvs = state;
- refreshSdkList();
- }
- }
-}
diff --git a/python/ide/src/com/jetbrains/python/configuration/PythonSdkDetailsDialog.java b/python/ide/src/com/jetbrains/python/configuration/PythonSdkDetailsDialog.java
new file mode 100644
index 0000000..162ee67
--- /dev/null
+++ b/python/ide/src/com/jetbrains/python/configuration/PythonSdkDetailsDialog.java
@@ -0,0 +1,481 @@
+/*
+ * Copyright 2000-2013 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.configuration;
+
+import com.google.common.collect.Sets;
+import com.intellij.icons.AllIcons;
+import com.intellij.openapi.actionSystem.AnActionEvent;
+import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
+import com.intellij.openapi.module.Module;
+import com.intellij.openapi.options.ConfigurationException;
+import com.intellij.openapi.project.DumbAware;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.projectRoots.Sdk;
+import com.intellij.openapi.projectRoots.SdkModel;
+import com.intellij.openapi.projectRoots.SdkModificator;
+import com.intellij.openapi.projectRoots.impl.SdkConfigurationUtil;
+import com.intellij.openapi.roots.ModuleRootManager;
+import com.intellij.openapi.roots.OrderRootType;
+import com.intellij.openapi.roots.ProjectRootManager;
+import com.intellij.openapi.roots.ui.configuration.projectRoot.ProjectSdksModel;
+import com.intellij.openapi.ui.DialogBuilder;
+import com.intellij.openapi.ui.DialogWrapper;
+import com.intellij.openapi.util.Comparing;
+import com.intellij.remotesdk.RemoteCredentials;
+import com.intellij.ui.*;
+import com.intellij.ui.components.JBList;
+import com.intellij.util.NullableConsumer;
+import com.intellij.util.NullableFunction;
+import com.intellij.util.containers.FactoryMap;
+import com.jetbrains.python.remote.PythonRemoteInterpreterManager;
+import com.jetbrains.python.sdk.*;
+import com.jetbrains.python.sdk.flavors.PythonSdkFlavor;
+import icons.PythonIcons;
+import org.jetbrains.annotations.Nullable;
+
+import javax.swing.*;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+import java.awt.*;
+import java.util.*;
+import java.util.List;
+
+public class PythonSdkDetailsDialog extends DialogWrapper {
+ private JPanel myMainPanel;
+ private JList mySdkList;
+ private boolean mySdkListChanged = false;
+ private final PyConfigurableInterpreterList myInterpreterList;
+ private final ProjectSdksModel myProjectSdksModel;
+
+ private Map<Sdk, SdkModificator> myModificators = new FactoryMap<Sdk, SdkModificator>() {
+ @Override
+ protected SdkModificator create(Sdk sdk) {
+ return sdk.getSdkModificator();
+ }
+ };
+ private Set<SdkModificator> myModifiedModificators = new HashSet<SdkModificator>();
+ private final Project myProject;
+
+ private boolean myShowOtherProjectVirtualenvs = true;
+ private final Module myModule;
+ private NullableConsumer<Sdk> myShowMoreCallback;
+
+ public PythonSdkDetailsDialog(Project project, NullableConsumer<Sdk> showMoreCallback) {
+ super(project);
+ myModule = null;
+
+ setTitle("Project Interpreters");
+ myShowMoreCallback = showMoreCallback;
+ myProject = project;
+ myInterpreterList = PyConfigurableInterpreterList.getInstance(myProject);
+ myProjectSdksModel = myInterpreterList.getModel();
+ init();
+ updateOkButton();
+ }
+
+ public PythonSdkDetailsDialog(Module module, NullableConsumer<Sdk> showMoreCallback) {
+ super(module.getProject());
+ myModule = module;
+
+ setTitle("Project Interpreters");
+ myShowMoreCallback = showMoreCallback;
+ myProject = module.getProject();
+ myInterpreterList = PyConfigurableInterpreterList.getInstance(myProject);
+ myProjectSdksModel = myInterpreterList.getModel();
+ init();
+ updateOkButton();
+ }
+
+ @Nullable
+ @Override
+ protected JComponent createCenterPanel() {
+ mySdkList = new JBList();
+ //noinspection unchecked
+ mySdkList.setCellRenderer(new PySdkListCellRenderer("", myModificators));
+ mySdkList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+
+ ToolbarDecorator decorator = ToolbarDecorator.createDecorator(mySdkList).disableUpDownActions()
+ .setAddAction(new AnActionButtonRunnable() {
+ @Override
+ public void run(AnActionButton button) {
+ addSdk(button);
+ updateOkButton();
+ }
+ })
+ .setEditAction(new AnActionButtonRunnable() {
+ @Override
+ public void run(AnActionButton button) {
+ editSdk();
+ updateOkButton();
+ }
+ })
+ .setRemoveAction(new AnActionButtonRunnable() {
+ @Override
+ public void run(AnActionButton button) {
+ removeSdk();
+ updateOkButton();
+ }
+ })
+ .addExtraAction(new ToggleVirtualEnvFilterButton())
+ .addExtraAction(new ShowPathButton())
+ .addExtraAction(new GenerateSkeletonsButton());
+
+ decorator.setPreferredSize(new Dimension(600, 500));
+ myMainPanel = decorator.createPanel();
+ refreshSdkList();
+ addListeners();
+ return myMainPanel;
+ }
+
+ private void addListeners() {
+ myProjectSdksModel.addListener(new SdkModel.Listener() {
+ @Override
+ public void sdkAdded(Sdk sdk) {
+ }
+
+ @Override
+ public void beforeSdkRemove(Sdk sdk) {
+ }
+
+ @Override
+ public void sdkChanged(Sdk sdk, String previousName) {
+ refreshSdkList();
+ }
+
+ @Override
+ public void sdkHomeSelected(Sdk sdk, String newSdkHome) {
+ }
+ });
+ mySdkList.addListSelectionListener(new ListSelectionListener() {
+ public void valueChanged(ListSelectionEvent event) {
+ updateOkButton();
+ updateUI(getSelectedSdk());
+ }
+ });
+ }
+
+ private void updateUI(final Sdk selectedSdk) {
+ myProjectSdksModel.setProjectSdk(selectedSdk);
+ }
+
+ @Nullable
+ @Override
+ public JComponent getPreferredFocusedComponent() {
+ return mySdkList;
+ }
+
+ public boolean isModified() {
+ Sdk projectSdk = getSdk();
+ if (projectSdk != null) {
+ projectSdk = myProjectSdksModel.findSdk(projectSdk.getName());
+ }
+ return getSelectedSdk() != projectSdk || mySdkListChanged ||
+ myProjectSdksModel.isModified() ||
+ !myModifiedModificators.isEmpty();
+ }
+
+ protected void updateOkButton() {
+ super.setOKActionEnabled(isModified());
+ }
+
+ @Override
+ protected void doOKAction() {
+ try {
+ apply();
+ }
+ catch (ConfigurationException ignored) {
+ }
+ super.doOKAction();
+ }
+
+ public void apply() throws ConfigurationException {
+ for (SdkModificator modificator : myModifiedModificators) {
+ modificator.commitChanges();
+ }
+ myModificators.clear();
+ myModifiedModificators.clear();
+ myProjectSdksModel.apply();
+ mySdkListChanged = false;
+ myShowMoreCallback.consume(getSelectedSdk());
+ }
+
+ @Nullable
+ public Sdk getSelectedSdk() {
+ return (Sdk)mySdkList.getSelectedValue();
+ }
+
+ private void refreshSdkList() {
+ final List<Sdk> pythonSdks = myInterpreterList.getAllPythonSdks(myProject);
+ Sdk projectSdk = getSdk();
+ if (!myShowOtherProjectVirtualenvs) {
+ VirtualEnvProjectFilter.removeNotMatching(myProject, pythonSdks);
+ }
+ Collections.sort(pythonSdks, new PreferredSdkComparator());
+ //noinspection unchecked
+ mySdkList.setModel(new CollectionListModel<Sdk>(pythonSdks));
+
+ mySdkListChanged = false;
+ if (projectSdk != null) {
+ projectSdk = myProjectSdksModel.findSdk(projectSdk.getName());
+ mySdkList.clearSelection();
+ mySdkList.setSelectedValue(projectSdk, true);
+ mySdkList.updateUI();
+ }
+ }
+
+ @Nullable
+ private Sdk getSdk() {
+ if (myModule == null) {
+ return ProjectRootManager.getInstance(myProject).getProjectSdk();
+ }
+ final ModuleRootManager rootManager = ModuleRootManager.getInstance(myModule);
+ return rootManager.getSdk();
+ }
+
+ private void addSdk(AnActionButton button) {
+ PythonSdkDetailsStep
+ .show(myProject, myProjectSdksModel.getSdks(), this, myMainPanel, button.getPreferredPopupPoint().getScreenPoint(), false,
+ new NullableConsumer<Sdk>() {
+ @Override
+ public void consume(Sdk sdk) {
+ addCreatedSdk(sdk, false);
+ }
+ });
+ }
+
+ private void addCreatedSdk(@Nullable final Sdk sdk, boolean newVirtualEnv) {
+ if (sdk != null) {
+ boolean isVirtualEnv = PythonSdkType.isVirtualEnv(sdk);
+ if (isVirtualEnv && !newVirtualEnv) {
+ AddVEnvOptionsDialog dialog = new AddVEnvOptionsDialog(myMainPanel);
+ dialog.show();
+ if (dialog.getExitCode() != DialogWrapper.OK_EXIT_CODE) {
+ return;
+ }
+ SdkModificator modificator = myModificators.get(sdk);
+ setSdkAssociated(modificator, !dialog.makeAvailableToAll());
+ myModifiedModificators.add(modificator);
+ }
+ final Sdk oldSdk = myProjectSdksModel.findSdk(sdk);
+ if (oldSdk == null)
+ myProjectSdksModel.addSdk(sdk);
+ refreshSdkList();
+ mySdkList.setSelectedValue(sdk, true);
+ mySdkListChanged = true;
+ }
+ }
+
+ private void editSdk() {
+ final Sdk currentSdk = getSelectedSdk();
+ if (currentSdk != null) {
+ if (currentSdk.getSdkAdditionalData() instanceof RemoteCredentials) {
+ editRemoteSdk(currentSdk);
+ }
+ else {
+ editSdk(currentSdk);
+ }
+ updateUI(currentSdk);
+ }
+ }
+
+ private void editRemoteSdk(Sdk currentSdk) {
+ PythonRemoteInterpreterManager remoteInterpreterManager = PythonRemoteInterpreterManager.getInstance();
+ if (remoteInterpreterManager != null) {
+ final SdkModificator modificator = myModificators.get(currentSdk);
+ Set<Sdk> existingSdks = Sets.newHashSet(myProjectSdksModel.getSdks());
+ existingSdks.remove(currentSdk);
+ if (remoteInterpreterManager.editSdk(myProject, modificator, existingSdks)) {
+ myModifiedModificators.add(modificator);
+ }
+ }
+ }
+
+ private void editSdk(final Sdk currentSdk) {
+ final SdkModificator modificator = myModificators.get(currentSdk);
+ final EditSdkDialog dialog = new EditSdkDialog(myProject, modificator, new NullableFunction<String, String>() {
+ @Override
+ public String fun(String s) {
+ if (isDuplicateSdkName(s, currentSdk)) {
+ return "Please specify a unique name for the interpreter";
+ }
+ return null;
+ }
+ });
+ dialog.show();
+ if (dialog.isOK()) {
+ final boolean pathChanged = !Comparing.equal(currentSdk.getHomePath(), dialog.getHomePath());
+ if (!currentSdk.getName().equals(dialog.getName()) || pathChanged || dialog.isAssociateChanged()) {
+ myModifiedModificators.add(modificator);
+ modificator.setName(dialog.getName());
+ modificator.setHomePath(dialog.getHomePath());
+
+ if (dialog.isAssociateChanged()) {
+ setSdkAssociated(modificator, dialog.associateWithProject());
+ }
+ if (pathChanged) {
+ reloadSdk(currentSdk);
+ }
+ }
+ }
+ }
+
+ private void setSdkAssociated(SdkModificator modificator, boolean isAssociated) {
+ PythonSdkAdditionalData additionalData = (PythonSdkAdditionalData)modificator.getSdkAdditionalData();
+ if (additionalData == null) {
+ additionalData = new PythonSdkAdditionalData(PythonSdkFlavor.getFlavor(modificator.getHomePath()));
+ modificator.setSdkAdditionalData(additionalData);
+ }
+ if (isAssociated) {
+ additionalData.associateWithProject(myProject);
+ }
+ else {
+ additionalData.setAssociatedProjectPath(null);
+ }
+ }
+
+ private boolean isDuplicateSdkName(String s, Sdk sdk) {
+ for (Sdk existingSdk : myProjectSdksModel.getSdks()) {
+ if (existingSdk == sdk) {
+ continue;
+ }
+ String existingName;
+ if (myModificators.containsKey(existingSdk)) {
+ existingName = myModificators.get(existingSdk).getName();
+ }
+ else {
+ existingName = existingSdk.getName();
+ }
+ if (existingName.equals(s)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private void removeSdk() {
+ final Sdk current_sdk = getSelectedSdk();
+ if (current_sdk != null) {
+ myProjectSdksModel.removeSdk(current_sdk);
+ if (myModificators.containsKey(current_sdk)) {
+ SdkModificator modificator = myModificators.get(current_sdk);
+ myModifiedModificators.remove(modificator);
+ myModificators.remove(current_sdk);
+ }
+ refreshSdkList();
+ mySdkListChanged = true;
+ // TODO select initially selected SDK
+ if (mySdkList.getSelectedIndex() < 0) {
+ mySdkList.setSelectedIndex(0);
+ }
+ }
+ }
+
+ private void reloadSdk() {
+ final Sdk currentSdk = getSelectedSdk();
+ if (currentSdk != null) {
+ myModifiedModificators.add(myModificators.get(currentSdk));
+ reloadSdk(currentSdk);
+ }
+ }
+
+ private void reloadSdk(Sdk currentSdk) {
+ PythonSdkType.setupSdkPaths(myProject, null, currentSdk, myModificators.get(currentSdk)); // or must it be a RunWriteAction?
+ }
+
+ private class ToggleVirtualEnvFilterButton extends ToggleActionButton implements DumbAware {
+ public ToggleVirtualEnvFilterButton() {
+ super("Show virtual environments associated with other projects", AllIcons.General.Filter);
+ }
+
+ @Override
+ public boolean isSelected(AnActionEvent e) {
+ return myShowOtherProjectVirtualenvs;
+ }
+
+ @Override
+ public void setSelected(AnActionEvent e, boolean state) {
+ myShowOtherProjectVirtualenvs = state;
+ refreshSdkList();
+ updateOkButton();
+ }
+ }
+
+ private class ShowPathButton extends AnActionButton implements DumbAware {
+ public ShowPathButton() {
+ super("Show path for the selected interpreter", AllIcons.Actions.ShowAsTree);
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return !(getSelectedSdk() instanceof PyDetectedSdk);
+ }
+
+ @Override
+ public void actionPerformed(AnActionEvent e) {
+ DialogBuilder dialog = new DialogBuilder(myProject);
+
+ final PythonPathEditor editor =
+ new PythonPathEditor("Classes", OrderRootType.CLASSES, FileChooserDescriptorFactory.createAllButJarContentsDescriptor()) {
+ @Override
+ protected void onReloadButtonClicked() {
+ reloadSdk();
+ }
+ };
+ final JComponent component = editor.createComponent();
+ component.setPreferredSize(new Dimension(600, 400));
+ component.setBorder(IdeBorderFactory.createBorder(SideBorder.ALL));
+ dialog.setCenterPanel(component);
+ final Sdk sdk = getSelectedSdk();
+ editor.reload(sdk != null ? sdk.getSdkModificator(): null);
+
+ dialog.setTitle("Interpreter Paths");
+ dialog.show();
+ updateOkButton();
+ }
+ }
+
+ private class GenerateSkeletonsButton extends AnActionButton implements DumbAware {
+ public GenerateSkeletonsButton() {
+ super("Generate skeletons for the selected interpreter", PythonIcons.Python.Skeleton);
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return (getSelectedSdk() instanceof PyDetectedSdk);
+ }
+
+ @Override
+ public void actionPerformed(AnActionEvent e) {
+ final Sdk sdk = getSelectedSdk();
+ if (sdk instanceof PyDetectedSdk) {
+ try {
+ myProjectSdksModel.apply();
+ }
+ catch (ConfigurationException ignored) {
+ }
+
+ final Sdk addedSdk = SdkConfigurationUtil.setupSdk(myProjectSdksModel.getSdks(), sdk.getHomeDirectory(),
+ PythonSdkType.getInstance(), true,
+ null, null);
+ myProjectSdksModel.addSdk(addedSdk);
+ myProjectSdksModel.removeSdk(sdk);
+ refreshSdkList();
+ mySdkList.setSelectedValue(addedSdk, true);
+ updateOkButton();
+ }
+ }
+ }
+}
diff --git a/python/ide/src/com/jetbrains/python/configuration/VirtualEnvProjectFilter.java b/python/ide/src/com/jetbrains/python/configuration/VirtualEnvProjectFilter.java
index 1caf4c3..c8dc610 100644
--- a/python/ide/src/com/jetbrains/python/configuration/VirtualEnvProjectFilter.java
+++ b/python/ide/src/com/jetbrains/python/configuration/VirtualEnvProjectFilter.java
@@ -50,13 +50,14 @@
return false;
}
- public static void removeNotMatching(Project project, List<Sdk> sdks) {
+ public static boolean removeNotMatching(Project project, List<Sdk> sdks) {
if (project != null) {
final String basePath = project.getBasePath();
if (basePath != null) {
- Iterables.removeIf(sdks, new VirtualEnvProjectFilter(FileUtil.toSystemIndependentName(basePath)));
+ return Iterables.removeIf(sdks, new VirtualEnvProjectFilter(FileUtil.toSystemIndependentName(basePath)));
}
}
+ return false;
}
public static void removeAllAssociated(List<Sdk> sdks) {
diff --git a/python/ide/src/com/jetbrains/python/newProject/PythonNewDirectoryProjectAction.java b/python/ide/src/com/jetbrains/python/newProject/PythonNewDirectoryProjectAction.java
index 16f10c7..4d638ee 100644
--- a/python/ide/src/com/jetbrains/python/newProject/PythonNewDirectoryProjectAction.java
+++ b/python/ide/src/com/jetbrains/python/newProject/PythonNewDirectoryProjectAction.java
@@ -17,7 +17,6 @@
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.CommonDataKeys;
-import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.progress.ProcessCanceledException;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectManager;
@@ -28,6 +27,7 @@
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.platform.DirectoryProjectGenerator;
import com.intellij.platform.NewDirectoryProjectAction;
+import com.jetbrains.python.sdk.PyDetectedSdk;
import com.jetbrains.python.sdk.PythonSdkAdditionalData;
import com.jetbrains.python.sdk.PythonSdkType;
@@ -49,6 +49,9 @@
dlg.show();
if (dlg.getExitCode() != DialogWrapper.OK_EXIT_CODE) return;
mySdk = dlg.getSdk();
+ if (mySdk instanceof PyDetectedSdk) {
+ mySdk = SdkConfigurationUtil.createAndAddSDK(mySdk.getName(), PythonSdkType.getInstance());
+ }
myInstallFramework = dlg.installFramework();
Project newProject = generateProject(project, dlg);
if (newProject != null) {
diff --git a/python/ide/src/com/jetbrains/python/newProject/PythonNewDirectoryProjectDialog.java b/python/ide/src/com/jetbrains/python/newProject/PythonNewDirectoryProjectDialog.java
index ecdb29d..8ee900a 100644
--- a/python/ide/src/com/jetbrains/python/newProject/PythonNewDirectoryProjectDialog.java
+++ b/python/ide/src/com/jetbrains/python/newProject/PythonNewDirectoryProjectDialog.java
@@ -16,19 +16,22 @@
package com.jetbrains.python.newProject;
import com.intellij.facet.ui.ValidationResult;
+import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.progress.ProcessCanceledException;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.Sdk;
+import com.intellij.openapi.roots.ModuleRootModificationUtil;
import com.intellij.openapi.util.Condition;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.platform.DirectoryProjectGenerator;
import com.intellij.platform.NewDirectoryProjectDialog;
-import com.intellij.remotesdk.RemoteSdkData;
+import com.intellij.remotesdk.RemoteSdkCredentials;
import com.intellij.ui.ComboboxWithBrowseButton;
import com.intellij.ui.components.JBCheckBox;
import com.intellij.ui.components.JBLabel;
import com.jetbrains.python.PythonSdkChooserCombo;
+import com.jetbrains.python.configuration.PyConfigurableInterpreterList;
import com.jetbrains.python.configuration.VirtualEnvProjectFilter;
import com.jetbrains.python.packaging.PyExternalProcessException;
import com.jetbrains.python.packaging.PyPackage;
@@ -36,7 +39,6 @@
import com.jetbrains.python.packaging.PyPackageManagerImpl;
import com.jetbrains.python.remote.PythonRemoteInterpreterManager;
import com.jetbrains.python.remote.RemoteProjectSettings;
-import com.jetbrains.python.sdk.PreferredSdkComparator;
import com.jetbrains.python.sdk.PythonSdkType;
import com.jetbrains.python.sdk.flavors.JythonSdkFlavor;
import com.jetbrains.python.sdk.flavors.PyPySdkFlavor;
@@ -51,7 +53,6 @@
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
-import java.util.Collections;
import java.util.List;
/**
@@ -67,9 +68,8 @@
super(project);
myProject = project;
- final List<Sdk> sdks = PythonSdkType.getAllSdks();
+ final List<Sdk> sdks = PyConfigurableInterpreterList.getInstance(myProject).getAllPythonSdks();
VirtualEnvProjectFilter.removeAllAssociated(sdks);
- Collections.sort(sdks, PreferredSdkComparator.INSTANCE);
final Sdk preferred = sdks.isEmpty() ? null : sdks.iterator().next();
mySdkCombo = new PythonSdkChooserCombo(project, sdks, new Condition<Sdk>() {
@Override
@@ -169,23 +169,31 @@
if (PythonSdkType.isRemote(getSdk())) {
PythonRemoteInterpreterManager manager = PythonRemoteInterpreterManager.getInstance();
assert manager != null;
- return manager.showRemoteProjectSettingsDialog(baseDir, (RemoteSdkData)getSdk().getSdkAdditionalData());
+ return manager.showRemoteProjectSettingsDialog(baseDir, (RemoteSdkCredentials)getSdk().getSdkAdditionalData());
}
else {
- return null;
+ return new PyNewProjectSettings();
}
}
@Override
- public void generateProject(@NotNull Project project,
+ public void generateProject(@NotNull final Project project,
@NotNull VirtualFile baseDir,
- Object settings,
- @NotNull Module module) {
+ final Object settings,
+ @NotNull final Module module) {
if (settings instanceof RemoteProjectSettings) {
PythonRemoteInterpreterManager manager = PythonRemoteInterpreterManager.getInstance();
assert manager != null;
manager.createDeployment(project, baseDir, (RemoteProjectSettings)settings,
- (RemoteSdkData)getSdk().getSdkAdditionalData());
+ (RemoteSdkCredentials)getSdk().getSdkAdditionalData());
+ }
+ else if (settings instanceof PyNewProjectSettings) {
+ ApplicationManager.getApplication().runWriteAction(new Runnable() {
+ @Override
+ public void run() {
+ ModuleRootModificationUtil.setModuleSdk(module, ((PyNewProjectSettings)settings).getSdk());
+ }
+ });
}
}
diff --git a/python/main_pycharm_ce.iml b/python/main_pycharm_ce.iml
index 2886eb6..67303ad 100644
--- a/python/main_pycharm_ce.iml
+++ b/python/main_pycharm_ce.iml
@@ -17,6 +17,7 @@
<orderEntry type="module" module-name="terminal" />
<orderEntry type="module" module-name="python-ide-community" />
<orderEntry type="module" module-name="platform-main" />
+ <orderEntry type="module" module-name="jira" />
</component>
</module>
diff --git a/python/openapi/python-openapi.iml b/python/openapi/python-openapi.iml
index 690468a..9ac91c1 100644
--- a/python/openapi/python-openapi.iml
+++ b/python/openapi/python-openapi.iml
@@ -12,7 +12,6 @@
<orderEntry type="module" module-name="lang-api" />
<orderEntry type="module" module-name="lang-impl" />
<orderEntry type="library" name="Guava" level="project" />
- <orderEntry type="module" module-name="webide-impl" exported="" />
</component>
</module>
diff --git a/python/openapi/src/com/jetbrains/python/psi/PyStringLiteralFileReferenceSet.java b/python/openapi/src/com/jetbrains/python/psi/PyStringLiteralFileReferenceSet.java
index e74cd80..6c470c7 100644
--- a/python/openapi/src/com/jetbrains/python/psi/PyStringLiteralFileReferenceSet.java
+++ b/python/openapi/src/com/jetbrains/python/psi/PyStringLiteralFileReferenceSet.java
@@ -20,17 +20,19 @@
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiReferenceProvider;
import com.intellij.psi.impl.source.resolve.reference.impl.providers.FileReference;
-import com.intellij.psi.impl.source.resolve.reference.impl.providers.FileReferenceSet;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
/**
* @author traff
*/
public class PyStringLiteralFileReferenceSet extends RootFileReferenceSet {
+ public static final Pattern DELIMITERS = Pattern.compile("\\\\|/");
private final PyStringLiteralExpression myStringLiteralExpression;
@@ -57,61 +59,33 @@
protected void reparse() {
//noinspection ConstantConditions
if (myStringLiteralExpression != null) {
- MyTextRangeConsumer textRangeConsumer = new MyTextRangeConsumer(this);
-
- myStringLiteralExpression.iterateCharacterRanges(textRangeConsumer);
- textRangeConsumer.finish();
-
- List<FileReference> referencesList = textRangeConsumer.myReferenceList;
-
- myReferences = referencesList.toArray(new FileReference[referencesList.size()]);
+ final List<FileReference> references = getFileReferences(myStringLiteralExpression);
+ myReferences = references.toArray(new FileReference[references.size()]);
}
}
- private static class MyTextRangeConsumer implements PyStringLiteralExpression.TextRangeConsumer {
- private final StringBuilder myItem = new StringBuilder();
- private int myStartOffset = -1;
- private int myIndex = 0;
- private int myEndOffset = -1;
- private final FileReferenceSet myFileReferenceSet;
-
-
- private final List<FileReference> myReferenceList = new ArrayList<FileReference>();
-
- private MyTextRangeConsumer(FileReferenceSet set) {
- myFileReferenceSet = set;
- }
-
- @Override
- public boolean process(int startOffset, int endOffset, String value) {
- if ("\\".equals(value) || "/".equals(value)) {
- addReference(startOffset);
+ @NotNull
+ private List<FileReference> getFileReferences(@NotNull PyStringLiteralExpression expression) {
+ final String value = expression.getStringValue();
+ final Matcher matcher = DELIMITERS.matcher(value);
+ int start = 0;
+ int index = 0;
+ final List<FileReference> results = new ArrayList<FileReference>();
+ while (matcher.find()) {
+ final String s = value.substring(start, matcher.start());
+ if (!s.isEmpty()) {
+ final TextRange range = TextRange.create(expression.valueOffsetToTextOffset(start),
+ expression.valueOffsetToTextOffset(matcher.start()));
+ results.add(createFileReference(range, index++, s));
}
- else {
- if (myStartOffset == -1) {
- myStartOffset = startOffset;
- }
- myEndOffset = endOffset;
- myItem.append(value);
- }
- return true;
+ start = matcher.end();
}
-
- private void addReference(int startOffset) {
- if (myStartOffset != -1) {
- final FileReference ref = myFileReferenceSet.createFileReference(
- new TextRange(myStartOffset, startOffset),
- myIndex++,
- myItem.toString());
- myReferenceList.add(ref);
- myStartOffset = -1;
- myItem.setLength(0);
- }
+ final String s = value.substring(start);
+ if (!s.isEmpty()) {
+ final TextRange range = TextRange.create(expression.valueOffsetToTextOffset(start),
+ expression.valueOffsetToTextOffset(value.length()));
+ results.add(createFileReference(range, index, s));
}
-
-
- public void finish() {
- addReference(myEndOffset);
- }
+ return results;
}
}
diff --git a/python/openapi/src/com/jetbrains/python/psi/RootFileReferenceSet.java b/python/openapi/src/com/jetbrains/python/psi/RootFileReferenceSet.java
index 36cf4d2..8fd92a3 100644
--- a/python/openapi/src/com/jetbrains/python/psi/RootFileReferenceSet.java
+++ b/python/openapi/src/com/jetbrains/python/psi/RootFileReferenceSet.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,20 +15,20 @@
*/
package com.jetbrains.python.psi;
-import com.google.common.collect.Lists;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.util.io.FileUtil;
-import com.intellij.openapi.vfs.LocalFileSystem;
-import com.intellij.openapi.vfs.VirtualFile;
-import com.intellij.psi.*;
+import com.intellij.openapi.vfs.newvfs.ManagingFS;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiFile;
+import com.intellij.psi.PsiFileSystemItem;
+import com.intellij.psi.PsiReferenceProvider;
import com.intellij.psi.impl.source.resolve.reference.impl.providers.FileReferenceSet;
-import com.jetbrains.python.psi.PyStringLiteralExpression;
+import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Collection;
-import java.util.Collections;
/**
* Resolves absolute paths from FS root, not content roots
@@ -41,7 +41,8 @@
int startInElement,
PsiReferenceProvider provider,
boolean caseSensitive,
- boolean endingSlashNotAllowed, @Nullable FileType[] suitableFileTypes) {
+ boolean endingSlashNotAllowed,
+ @Nullable FileType[] suitableFileTypes) {
super(str, element, startInElement, provider, caseSensitive, endingSlashNotAllowed, suitableFileTypes);
}
@@ -49,6 +50,7 @@
super(s, element, offset, provider, sensitive);
}
+ @Override
public boolean isAbsolutePathReference() {
if (!ApplicationManager.getApplication().isUnitTestMode()) {
return FileUtil.isAbsolute(getPathString());
@@ -61,26 +63,13 @@
@NotNull
@Override
public Collection<PsiFileSystemItem> computeDefaultContexts() {
- final PsiFile file = getContainingFile();
- if (file != null) {
+ PsiFile file = getContainingFile();
+ if (file == null) return ContainerUtil.emptyList();
- if (isAbsolutePathReference()) {
- if (!ApplicationManager.getApplication().isUnitTestMode()) {
- VirtualFile root = LocalFileSystem.getInstance().getRoot();
- PsiDirectory directory = file.getManager().findDirectory(root);
- if (directory != null) {
- return Lists.<PsiFileSystemItem>newArrayList(directory);
- }
- }
- else {
- return super.computeDefaultContexts();
- }
- }
- else {
- return super.computeDefaultContexts();
- }
+ if (isAbsolutePathReference() && !ApplicationManager.getApplication().isUnitTestMode()) {
+ return toFileSystemItems(ManagingFS.getInstance().getLocalRoots());
}
- return Collections.emptyList();
+ return super.computeDefaultContexts();
}
}
diff --git a/python/openapi/src/com/jetbrains/python/templateLanguages/TemplateFileReference.java b/python/openapi/src/com/jetbrains/python/templateLanguages/TemplateFileReference.java
index a7ea147..84760d8 100644
--- a/python/openapi/src/com/jetbrains/python/templateLanguages/TemplateFileReference.java
+++ b/python/openapi/src/com/jetbrains/python/templateLanguages/TemplateFileReference.java
@@ -16,7 +16,6 @@
package com.jetbrains.python.templateLanguages;
import com.intellij.lang.injection.InjectedLanguageManager;
-import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VfsUtilCore;
@@ -26,7 +25,6 @@
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiFileSystemItem;
import com.intellij.psi.impl.source.resolve.reference.impl.providers.FileReferenceHelper;
-import com.intellij.psi.impl.source.resolve.reference.impl.providers.FileReferenceHelperRegistrar;
import com.intellij.psi.impl.source.resolve.reference.impl.providers.FileReferenceSet;
import com.intellij.psi.impl.source.resolve.reference.impl.providers.PsiFileSystemItemUtil;
import com.intellij.util.IncorrectOperationException;
@@ -66,17 +64,13 @@
final VirtualFile curVFile = file.getVirtualFile();
if (curVFile == null) throw new IncorrectOperationException("Cannot bind from non-physical element:" + file);
- final Project project = element.getProject();
-
String newName;
PsiFileSystemItem curItem = null;
PsiFileSystemItem dstItem = null;
- final FileReferenceHelper helper = FileReferenceHelperRegistrar.getNotNullHelper(file);
-
- PsiFileSystemItem _dstItem = helper.getPsiFileSystemItem(project, dstVFile);
- PsiFileSystemItem _curItem = helper.getPsiFileSystemItem(project, curVFile);
+ PsiFileSystemItem _dstItem = FileReferenceHelper.getPsiFileSystemItem(file.getManager(), dstVFile);
+ PsiFileSystemItem _curItem = FileReferenceHelper.getPsiFileSystemItem(file.getManager(), curVFile);
if (_dstItem != null && _curItem != null) {
curItem = _curItem;
dstItem = _dstItem;
diff --git a/python/pluginResources/META-INF/plugin.xml b/python/pluginResources/META-INF/plugin.xml
index 9e858a5..e3aa06f 100644
--- a/python/pluginResources/META-INF/plugin.xml
+++ b/python/pluginResources/META-INF/plugin.xml
@@ -4,9 +4,9 @@
<id>PythonCore</id>
<name>Python Community Edition</name>
- <idea-version since-build="130.0" until-build="133.0"/>
+ <idea-version since-build="134.1007" until-build="134.*"/>
<description>Smart editing for Python scripts</description>
- <version>3.0.1</version>
+ <version>3.1.1.134.@@BUILD_NUMBER@@</version>
<depends>com.intellij.modules.java</depends>
diff --git a/python/pluginSrc/com/jetbrains/python/module/PyProjectStructureDetector.java b/python/pluginSrc/com/jetbrains/python/module/PyProjectStructureDetector.java
index 45dd7cd..35898c7 100644
--- a/python/pluginSrc/com/jetbrains/python/module/PyProjectStructureDetector.java
+++ b/python/pluginSrc/com/jetbrains/python/module/PyProjectStructureDetector.java
@@ -15,20 +15,21 @@
*/
package com.jetbrains.python.module;
-import com.intellij.ide.util.importProject.ModuleDescriptor;
import com.intellij.ide.util.importProject.ProjectDescriptor;
import com.intellij.ide.util.projectWizard.ModuleWizardStep;
import com.intellij.ide.util.projectWizard.ProjectWizardStepFactory;
+import com.intellij.ide.util.projectWizard.importSources.DetectedContentRoot;
import com.intellij.ide.util.projectWizard.importSources.DetectedProjectRoot;
import com.intellij.ide.util.projectWizard.importSources.ProjectFromSourcesBuilder;
import com.intellij.ide.util.projectWizard.importSources.ProjectStructureDetector;
import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.module.WebModuleType;
import com.intellij.openapi.util.io.FileUtilRt;
+import com.jetbrains.python.PythonModuleTypeBase;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.io.File;
-import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
@@ -50,13 +51,7 @@
for (File child : children) {
if (FileUtilRt.extensionEquals(child.getName(), "py")) {
LOG.info("Found Python file " + child.getPath());
- result.add(new DetectedProjectRoot(dir) {
- @NotNull
- @Override
- public String getRootTypeName() {
- return "Python";
- }
- });
+ result.add(new DetectedContentRoot(dir, "Python", PythonModuleTypeBase.getInstance(), WebModuleType.getInstance()));
return DirectoryProcessingResult.SKIP_CHILDREN;
}
}
@@ -67,16 +62,7 @@
public void setupProjectStructure(@NotNull Collection<DetectedProjectRoot> roots,
@NotNull ProjectDescriptor projectDescriptor,
@NotNull ProjectFromSourcesBuilder builder) {
- if (!roots.isEmpty() && !builder.hasRootsFromOtherDetectors(this)) {
- List<ModuleDescriptor> modules = projectDescriptor.getModules();
- if (modules.isEmpty()) {
- modules = new ArrayList<ModuleDescriptor>();
- for (DetectedProjectRoot root : roots) {
- modules.add(new ModuleDescriptor(root.getDirectory(), PythonModuleType.getInstance(), root));
- }
- projectDescriptor.setModules(modules);
- }
- }
+ builder.setupModulesByContentRoots(projectDescriptor, roots);
}
@Override
diff --git a/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaClassType.java b/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaClassType.java
index 94aea76..02176e3 100644
--- a/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaClassType.java
+++ b/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaClassType.java
@@ -148,6 +148,12 @@
return myClass.isValid();
}
+ @Nullable
+ @Override
+ public PyClassLikeType getMetaClassType(@NotNull TypeEvalContext context, boolean inherited) {
+ return null;
+ }
+
public PsiClass getPsiClass() {
return myClass;
}
diff --git a/python/psi-api/resources/icons/com/jetbrains/python/pythonFile.png b/python/psi-api/resources/icons/com/jetbrains/python/pythonFile.png
index 6d284ad..3561cbb 100644
--- a/python/psi-api/resources/icons/com/jetbrains/python/pythonFile.png
+++ b/python/psi-api/resources/icons/com/jetbrains/python/pythonFile.png
Binary files differ
diff --git a/python/psi-api/src/com/jetbrains/python/PyNames.java b/python/psi-api/src/com/jetbrains/python/PyNames.java
index 81c05df..8e2430e 100644
--- a/python/psi-api/src/com/jetbrains/python/PyNames.java
+++ b/python/psi-api/src/com/jetbrains/python/PyNames.java
@@ -45,7 +45,7 @@
public static final String NEW = "__new__";
public static final String GETATTR = "__getattr__";
public static final String GETATTRIBUTE = "__getattribute__";
- public static final String CLASS = "__class__";
+ public static final String __CLASS__ = "__class__";
public static final String DUNDER_METACLASS = "__metaclass__";
public static final String METACLASS = "metaclass";
public static final String TYPE = "type";
@@ -136,9 +136,9 @@
public static final String COLLECTIONS_NAMEDTUPLE = COLLECTIONS + "." + NAMEDTUPLE;
public static final String FORMAT = "format";
-
- public static final String ABSTRACTMETHOD = "abc.abstractmethod";
- public static final String ABSTRACTPROPERTY = "abc.abstractproperty";
+
+ public static final String ABSTRACTMETHOD = "abstractmethod";
+ public static final String ABSTRACTPROPERTY = "abstractproperty";
public static final String TUPLE = "tuple";
public static final String SET = "set";
@@ -156,7 +156,7 @@
public static final String TEST_CASE = "TestCase";
- public static final String PYCACHE = "__pycache__";
+ public static final String PYCACHE = "__pycache__";
public static final String NOT_IMPLEMENTED_ERROR = "NotImplementedError";
@@ -166,7 +166,7 @@
* Contains all known predefined names of "__foo__" form.
*/
public static ImmutableSet<String> UnderscoredAttributes = ImmutableSet.of(
- "__all__",
+ "__all__",
"__author__",
"__bases__",
"__defaults__",
@@ -227,38 +227,38 @@
.put("__abs__", _only_self_descr)
.put("__add__", _self_other_descr)
.put("__and__", _self_other_descr)
- //_BuiltinMethods.put("__all__", _only_self_descr);
- //_BuiltinMethods.put("__author__", _only_self_descr);
- //_BuiltinMethods.put("__bases__", _only_self_descr);
+ //_BuiltinMethods.put("__all__", _only_self_descr);
+ //_BuiltinMethods.put("__author__", _only_self_descr);
+ //_BuiltinMethods.put("__bases__", _only_self_descr);
.put("__call__", new BuiltinDescription("(self, *args, **kwargs)"))
- //_BuiltinMethods.put("__class__", _only_self_descr);
+ //_BuiltinMethods.put("__class__", _only_self_descr);
.put("__cmp__", _self_other_descr)
.put("__coerce__", _self_other_descr)
.put("__complex__", _only_self_descr)
.put("__contains__", _self_item_descr)
- //_BuiltinMethods.put("__debug__", _only_self_descr);
+ //_BuiltinMethods.put("__debug__", _only_self_descr);
.put("__del__", _only_self_descr)
.put("__delete__", new BuiltinDescription("(self, instance)"))
.put("__delattr__", _self_item_descr)
.put("__delitem__", _self_key_descr)
.put("__delslice__", new BuiltinDescription("(self, i, j)"))
- //_BuiltinMethods.put("__dict__", _only_self_descr);
+ //_BuiltinMethods.put("__dict__", _only_self_descr);
.put("__divmod__", _self_other_descr)
- //_BuiltinMethods.put("__doc__", _only_self_descr);
- //_BuiltinMethods.put("__docformat__", _only_self_descr);
+ //_BuiltinMethods.put("__doc__", _only_self_descr);
+ //_BuiltinMethods.put("__docformat__", _only_self_descr);
.put("__enter__", _only_self_descr)
.put("__exit__", new BuiltinDescription("(self, exc_type, exc_val, exc_tb)"))
.put("__eq__", _self_other_descr)
- //_BuiltinMethods.put("__file__", _only_self_descr);
+ //_BuiltinMethods.put("__file__", _only_self_descr);
.put("__float__", _only_self_descr)
.put("__floordiv__", _self_other_descr)
- //_BuiltinMethods.put("__future__", _only_self_descr);
+ //_BuiltinMethods.put("__future__", _only_self_descr);
.put("__ge__", _self_other_descr)
.put("__get__", new BuiltinDescription("(self, instance, owner)"))
.put("__getattr__", _self_item_descr)
.put("__getattribute__", _self_item_descr)
.put("__getitem__", _self_item_descr)
- //_BuiltinMethods.put("__getslice__", new BuiltinDescription("(self, i, j)"));
+ //_BuiltinMethods.put("__getslice__", new BuiltinDescription("(self, i, j)"));
.put("__gt__", _self_other_descr)
.put("__hash__", _only_self_descr)
.put("__hex__", _only_self_descr)
@@ -266,7 +266,7 @@
.put("__iand__", _self_other_descr)
.put("__idiv__", _self_other_descr)
.put("__ifloordiv__", _self_other_descr)
- //_BuiltinMethods.put("__import__", _only_self_descr);
+ //_BuiltinMethods.put("__import__", _only_self_descr);
.put("__ilshift__", _self_other_descr)
.put("__imod__", _self_other_descr)
.put("__imul__", _self_other_descr)
@@ -286,18 +286,18 @@
.put("__long__", _only_self_descr)
.put("__lshift__", _self_other_descr)
.put("__lt__", _self_other_descr)
- //_BuiltinMethods.put("__members__", _only_self_descr);
- //_BuiltinMethods.put("__metaclass__", _only_self_descr);
+ //_BuiltinMethods.put("__members__", _only_self_descr);
+ //_BuiltinMethods.put("__metaclass__", _only_self_descr);
.put("__mod__", _self_other_descr)
- //_BuiltinMethods.put("__mro__", _only_self_descr);
+ //_BuiltinMethods.put("__mro__", _only_self_descr);
.put("__mul__", _self_other_descr)
- //_BuiltinMethods.put("__name__", _only_self_descr);
+ //_BuiltinMethods.put("__name__", _only_self_descr);
.put("__ne__", _self_other_descr)
.put("__neg__", _only_self_descr)
.put(NEW, new BuiltinDescription("(cls, *args, **kwargs)"))
.put("__oct__", _only_self_descr)
.put("__or__", _self_other_descr)
- //_BuiltinMethods.put("__path__", _only_self_descr);
+ //_BuiltinMethods.put("__path__", _only_self_descr);
.put("__pos__", _only_self_descr)
.put("__pow__", new BuiltinDescription("(self, power, modulo=None)"))
.put("__radd__", _self_other_descr)
@@ -322,13 +322,13 @@
.put("__setattr__", new BuiltinDescription("(self, key, value)"))
.put("__setitem__", new BuiltinDescription("(self, key, value)"))
.put("__setslice__", new BuiltinDescription("(self, i, j, sequence)"))
- //_BuiltinMethods.put("__self__", _only_self_descr);
- //_BuiltinMethods.put("__slots__", _only_self_descr);
+ //_BuiltinMethods.put("__self__", _only_self_descr);
+ //_BuiltinMethods.put("__slots__", _only_self_descr);
.put("__str__", _only_self_descr)
.put("__sub__", _self_other_descr)
.put("__truediv__", _self_other_descr)
.put("__unicode__", _only_self_descr)
- //_BuiltinMethods.put("__version__", _only_self_descr);
+ //_BuiltinMethods.put("__version__", _only_self_descr);
.put("__xor__", _self_other_descr)
.build();
@@ -355,56 +355,92 @@
public static final String CANONICAL_CLS = "cls";
public static final String BASESTRING = "basestring";
+ /*
+ Python keywords
+ */
+
+ public static final String CLASS = "class";
+ public static final String DEF = "def";
+ public static final String IF = "if";
+ public static final String ELSE = "else";
+ public static final String ELIF = "elif";
+ public static final String TRY = "try";
+ public static final String EXCEPT = "except";
+ public static final String FINALLY = "finally";
+ public static final String WHILE = "while";
+ public static final String FOR = "for";
+ public static final String WITH = "with";
+ public static final String AS = "as";
+ public static final String ASSERT = "assert";
+ public static final String DEL = "del";
+ public static final String EXEC = "exec";
+ public static final String FROM = "from";
+ public static final String IMPORT = "import";
+ public static final String RAISE = "raise";
+ public static final String PRINT = "print";
+ public static final String BREAK = "break";
+ public static final String CONTINUE = "continue";
+ public static final String GLOBAL = "global";
+ public static final String RETURN = "return";
+ public static final String YIELD = "yield";
+ public static final String NONLOCAL = "nonlocal";
+ public static final String AND = "and";
+ public static final String OR = "or";
+ public static final String IS = "is";
+ public static final String IN = "in";
+ public static final String NOT = "not";
+ public static final String LAMBDA = "lambda";
+
/**
* Contains keywords as of CPython 2.5.
*/
public static ImmutableSet<String> Keywords = ImmutableSet.of(
- "and",
- "del",
- "from",
- "not",
- "while",
- "as",
- "elif",
- "global",
- "or",
- "with",
- "assert",
- "else",
- "if",
- "pass",
- "yield",
- "break",
- "except",
- "import",
- "print",
- "class",
- "exec",
- "in",
- "raise",
- "continue",
- "finally",
- "is",
- "return",
- "def",
- "for",
- "lambda",
- "try"
+ AND,
+ DEL,
+ FROM,
+ NOT,
+ WHILE,
+ AS,
+ ELIF,
+ GLOBAL,
+ OR,
+ WITH,
+ ASSERT,
+ ELSE,
+ IF,
+ PASS,
+ YIELD,
+ BREAK,
+ EXCEPT,
+ IMPORT,
+ PRINT,
+ __CLASS__,
+ EXEC,
+ IN,
+ RAISE,
+ CONTINUE,
+ FINALLY,
+ IS,
+ RETURN,
+ DEF,
+ FOR,
+ LAMBDA,
+ TRY
);
public static Set<String> BuiltinInterfaces = ImmutableSet.of(
- CALLABLE, HASHABLE, ITERABLE, ITERATOR, SIZED, CONTAINER, SEQUENCE, MAPPING, ABC_COMPLEX, ABC_REAL, ABC_RATIONAL, ABC_INTEGRAL,
- ABC_NUMBER
+ CALLABLE, HASHABLE, ITERABLE, ITERATOR, SIZED, CONTAINER, SEQUENCE, MAPPING, ABC_COMPLEX, ABC_REAL, ABC_RATIONAL, ABC_INTEGRAL,
+ ABC_NUMBER
);
/**
* TODO: dependency on language level.
+ *
* @param name what to check
* @return true iff the name is either a keyword or a reserved name, like None.
- *
*/
public static boolean isReserved(@NonNls String name) {
- return Keywords.contains(name) || NONE.equals(name) || "as".equals(name) || "with".equals(name);
+ return Keywords.contains(name) || NONE.equals(name);
}
// NOTE: includes unicode only good for py3k
@@ -412,6 +448,7 @@
/**
* TODO: dependency on language level.
+ *
* @param name what to check
* @return true iff name is not reserved and is a well-formed identifier.
*/
diff --git a/python/psi-api/src/com/jetbrains/python/codeInsight/PyDynamicMember.java b/python/psi-api/src/com/jetbrains/python/codeInsight/PyDynamicMember.java
index 0dbf909..a344e89 100644
--- a/python/psi-api/src/com/jetbrains/python/codeInsight/PyDynamicMember.java
+++ b/python/psi-api/src/com/jetbrains/python/codeInsight/PyDynamicMember.java
@@ -37,6 +37,7 @@
private String myName;
private final boolean myResolveToInstance;
private final Function<PsiElement, PyType> myTypeCallback;
+ @Nullable
private final String myTypeName;
private final PsiElement myTarget;
@@ -44,7 +45,7 @@
boolean myFunction = false;
- public PyDynamicMember(@NotNull final String name, @NotNull final String type, final boolean resolveToInstance) {
+ public PyDynamicMember(@NotNull final String name, @Nullable final String type, final boolean resolveToInstance) {
myName = name;
myResolveToInstance = resolveToInstance;
myTypeName = type;
@@ -63,7 +64,7 @@
}
public PyDynamicMember(@NotNull final String name,
- @NotNull final String type,
+ @Nullable final String type,
final Function<PsiElement, PyType> typeCallback) {
myName = name;
diff --git a/python/psi-api/src/com/jetbrains/python/psi/LanguageLevel.java b/python/psi-api/src/com/jetbrains/python/psi/LanguageLevel.java
index f16c838..abf5114 100644
--- a/python/psi-api/src/com/jetbrains/python/psi/LanguageLevel.java
+++ b/python/psi-api/src/com/jetbrains/python/psi/LanguageLevel.java
@@ -34,7 +34,8 @@
PYTHON30(30, true, false, false, true),
PYTHON31(31, true, false, true, true),
PYTHON32(32, true, false, true, true),
- PYTHON33(33, true, false, true, true);
+ PYTHON33(33, true, false, true, true),
+ PYTHON34(34, true, false, true, true);
public static LanguageLevel FORCE_LANGUAGE_LEVEL = null;
@@ -108,7 +109,10 @@
if (pythonVersion.startsWith("3.2")) {
return PYTHON32;
}
- return PYTHON33;
+ if (pythonVersion.startsWith("3.3")) {
+ return PYTHON33;
+ }
+ return PYTHON34;
}
return PYTHON24;
}
diff --git a/python/psi-api/src/com/jetbrains/python/psi/NameDefiner.java b/python/psi-api/src/com/jetbrains/python/psi/NameDefiner.java
index 08c7aa5..3145b8e 100644
--- a/python/psi-api/src/com/jetbrains/python/psi/NameDefiner.java
+++ b/python/psi-api/src/com/jetbrains/python/psi/NameDefiner.java
@@ -58,7 +58,7 @@
for (PyElement elt : it) {
if (elt != null) {
// qualified refs don't match by last name, and we're not checking FQNs here
- if (elt instanceof PyQualifiedExpression && ((PyQualifiedExpression)elt).getQualifier() != null) continue;
+ if (elt instanceof PyQualifiedExpression && ((PyQualifiedExpression)elt).isQualified()) continue;
if (name.equals(elt.getName())) { // plain name matches
ret = elt;
break;
diff --git a/python/psi-api/src/com/jetbrains/python/psi/PyArgumentList.java b/python/psi-api/src/com/jetbrains/python/psi/PyArgumentList.java
index 55a6506..5ba21bf 100644
--- a/python/psi-api/src/com/jetbrains/python/psi/PyArgumentList.java
+++ b/python/psi-api/src/com/jetbrains/python/psi/PyArgumentList.java
@@ -27,12 +27,25 @@
*/
public interface PyArgumentList extends PyElement {
- @NotNull PyExpression[] getArguments();
+ @NotNull
+ PyExpression[] getArguments();
- @Nullable PyKeywordArgument getKeywordArgument(String name);
+ @Nullable
+ PyKeywordArgument getKeywordArgument(String name);
- void addArgument(PyExpression arg);
+ /**
+ * TODO: Copy/Paste with {@link com.jetbrains.python.psi.PyCallExpression#addArgument(PyExpression)} ?
+ * Adds argument to the appropriate place:
+ * {@link com.jetbrains.python.psi.PyKeywordArgument} goes to the end.
+ * All other go before key arguments (if any) but after last non-key arguments.
+ * Commas should be set correctly as well.
+ *
+ * @param arg argument to add
+ */
+ void addArgument(@NotNull PyExpression arg);
+
void addArgumentFirst(PyExpression arg);
+
void addArgumentAfter(PyExpression argument, PyExpression afterThis);
/**
@@ -43,9 +56,10 @@
/**
* Tries to map the argument list to callee's idea of parameters.
- * @return a result object with mappings and diagnostic flags.
+ *
* @param resolveContext the reference resolution context
* @param implicitOffset known from the context implicit offset
+ * @return a result object with mappings and diagnostic flags.
*/
@NotNull
CallArgumentsMapping analyzeCall(PyResolveContext resolveContext, int implicitOffset);
diff --git a/python/psi-api/src/com/jetbrains/python/psi/PyCallExpression.java b/python/psi-api/src/com/jetbrains/python/psi/PyCallExpression.java
index 41d93bf..71e31dd 100644
--- a/python/psi-api/src/com/jetbrains/python/psi/PyCallExpression.java
+++ b/python/psi-api/src/com/jetbrains/python/psi/PyCallExpression.java
@@ -68,6 +68,10 @@
@Nullable
PyExpression getKeywordArgument(String keyword);
+ /**
+ * TODO: Copy/Paste with {@link com.jetbrains.python.psi.PyArgumentList#addArgument(PyExpression)}
+ * @param expression
+ */
void addArgument(PyExpression expression);
/**
diff --git a/python/psi-api/src/com/jetbrains/python/psi/PyClass.java b/python/psi-api/src/com/jetbrains/python/psi/PyClass.java
index e1084e8..657a54f 100644
--- a/python/psi-api/src/com/jetbrains/python/psi/PyClass.java
+++ b/python/psi-api/src/com/jetbrains/python/psi/PyClass.java
@@ -25,6 +25,7 @@
import com.jetbrains.python.codeInsight.controlflow.ScopeOwner;
import com.jetbrains.python.psi.stubs.PyClassStub;
import com.jetbrains.python.psi.types.PyClassLikeType;
+import com.jetbrains.python.psi.types.PyType;
import com.jetbrains.python.psi.types.TypeEvalContext;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
@@ -36,7 +37,7 @@
* Represents a class declaration in source.
*/
public interface PyClass extends PsiNameIdentifierOwner, PyStatement, NameDefiner, PyDocStringOwner, StubBasedPsiElement<PyClassStub>,
- ScopeOwner, PyDecoratable, PyTypedElement, PyQualifiedNameOwner {
+ ScopeOwner, PyDecoratable, PyTypedElement, PyQualifiedNameOwner, PyStatementListContainer {
ArrayFactory<PyClass> ARRAY_FACTORY = new ArrayFactory<PyClass>() {
@NotNull
@Override
@@ -48,8 +49,6 @@
@Nullable
ASTNode getNameNode();
- @NotNull
- PyStatementList getStatementList();
/**
* Returns types of all ancestors from the hierarchy.
@@ -136,11 +135,13 @@
/**
* Finds a property with the specified name in the class or one of its ancestors.
*
+ *
* @param name of the property
+ * @param inherited
* @return descriptor of property accessors, or null if such property does not exist.
*/
@Nullable
- Property findProperty(@NotNull String name);
+ Property findProperty(@NotNull String name, boolean inherited);
/**
* Apply a processor to every method, looking at superclasses in method resolution order as needed.
@@ -153,6 +154,7 @@
List<PyTargetExpression> getClassAttributes();
+ @Nullable
PyTargetExpression findClassAttribute(@NotNull String name, boolean inherited);
List<PyTargetExpression> getInstanceAttributes();
@@ -216,4 +218,21 @@
boolean processClassLevelDeclarations(@NotNull PsiScopeProcessor processor);
boolean processInstanceLevelDeclarations(@NotNull PsiScopeProcessor processor, @Nullable PsiElement location);
+
+ //TODO: Add "addMetaClass" or move methods out of here
+ /**
+ * Returns the type representing the metaclass of the class if it is explicitly set, null otherwise.
+ *
+ * The metaclass might be defined outside the class in case of Python 2 file-level __metaclass__ attributes.
+ */
+ @Nullable
+ PyType getMetaClassType(@NotNull TypeEvalContext context);
+
+ /**
+ * Returns the expression that defines the metaclass of the class.
+ *
+ * Operates at the AST level.
+ */
+ @Nullable
+ PyExpression getMetaClassExpression();
}
diff --git a/python/psi-api/src/com/jetbrains/python/psi/PyElementGenerator.java b/python/psi-api/src/com/jetbrains/python/psi/PyElementGenerator.java
index 75a0bbc..568cb95 100644
--- a/python/psi-api/src/com/jetbrains/python/psi/PyElementGenerator.java
+++ b/python/psi-api/src/com/jetbrains/python/psi/PyElementGenerator.java
@@ -67,6 +67,21 @@
public abstract PyExpression createExpressionFromText(final LanguageLevel languageLevel, String text);
+ /**
+ * Adds elements to list inserting required commas.
+ * Method is like {@link #insertItemIntoList(PyElement, PyExpression, PyExpression)} but does not add unneeded commas.
+ *
+ * @param list where to add
+ * @param afterThis after which element it should be added (null for add to the head)
+ * @param toInsert what to insert
+ * @return newly inserted element
+ */
+ @NotNull
+ public abstract PsiElement insertItemIntoListRemoveRedundantCommas(
+ @NotNull PyElement list,
+ @Nullable PyExpression afterThis,
+ @NotNull PyExpression toInsert);
+
public abstract PsiElement insertItemIntoList(PyElement list, @Nullable PyExpression afterThis, PyExpression toInsert)
throws IncorrectOperationException;
diff --git a/python/psi-api/src/com/jetbrains/python/psi/PyFunction.java b/python/psi-api/src/com/jetbrains/python/psi/PyFunction.java
index cb43d38..e70a7ad 100644
--- a/python/psi-api/src/com/jetbrains/python/psi/PyFunction.java
+++ b/python/psi-api/src/com/jetbrains/python/psi/PyFunction.java
@@ -34,7 +34,8 @@
public interface PyFunction
extends
PsiNamedElement, StubBasedPsiElement<PyFunctionStub>,
- PsiNameIdentifierOwner, PyStatement, Callable, NameDefiner, PyDocStringOwner, ScopeOwner, PyDecoratable, PyTypedElement {
+ PsiNameIdentifierOwner, PyStatement, Callable, NameDefiner, PyDocStringOwner, ScopeOwner, PyDecoratable, PyTypedElement,
+ PyStatementListContainer{
PyFunction[] EMPTY_ARRAY = new PyFunction[0];
ArrayFactory<PyFunction> ARRAY_FACTORY = new ArrayFactory<PyFunction>() {
@@ -55,9 +56,6 @@
ASTNode getNameNode();
@Nullable
- PyStatementList getStatementList();
-
- @Nullable
PyClass getContainingClass();
@Nullable
diff --git a/python/psi-api/src/com/jetbrains/python/psi/PyQualifiedExpression.java b/python/psi-api/src/com/jetbrains/python/psi/PyQualifiedExpression.java
index 012ed41..995ad30 100644
--- a/python/psi-api/src/com/jetbrains/python/psi/PyQualifiedExpression.java
+++ b/python/psi-api/src/com/jetbrains/python/psi/PyQualifiedExpression.java
@@ -17,6 +17,7 @@
import com.intellij.lang.ASTNode;
import com.intellij.psi.PsiPolyVariantReference;
+import com.intellij.psi.util.QualifiedName;
import com.jetbrains.python.psi.resolve.PyResolveContext;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -31,6 +32,19 @@
PyExpression getQualifier();
/**
+ * Checks if the expression is qualified.
+ *
+ * Unlike {@link #getQualifier()}, it may not require AST access.
+ */
+ boolean isQualified();
+
+ /**
+ * Returns the qualified name for the expression if all the qualifiers are qualified expressions.
+ */
+ @Nullable
+ QualifiedName asQualifiedName();
+
+ /**
* Returns the name to the right of the qualifier.
*
* @return the name referenced by the expression.
diff --git a/python/psi-api/src/com/jetbrains/python/psi/PyReferenceExpression.java b/python/psi-api/src/com/jetbrains/python/psi/PyReferenceExpression.java
index a8fd0a9..c1f7e8d 100644
--- a/python/psi-api/src/com/jetbrains/python/psi/PyReferenceExpression.java
+++ b/python/psi-api/src/com/jetbrains/python/psi/PyReferenceExpression.java
@@ -16,11 +16,9 @@
package com.jetbrains.python.psi;
import com.intellij.psi.PsiPolyVariantReference;
-import com.intellij.psi.util.QualifiedName;
import com.jetbrains.python.psi.resolve.PyResolveContext;
import com.jetbrains.python.psi.resolve.QualifiedResolveResult;
import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
/**
* @author yole
@@ -40,9 +38,6 @@
@NotNull
QualifiedResolveResult followAssignmentsChain(PyResolveContext resolveContext);
- @Nullable
- QualifiedName asQualifiedName();
-
@NotNull
PsiPolyVariantReference getReference();
}
diff --git a/python/psi-api/src/com/jetbrains/python/psi/PyStatementListContainer.java b/python/psi-api/src/com/jetbrains/python/psi/PyStatementListContainer.java
new file mode 100644
index 0000000..3c4cd2c
--- /dev/null
+++ b/python/psi-api/src/com/jetbrains/python/psi/PyStatementListContainer.java
@@ -0,0 +1,11 @@
+package com.jetbrains.python.psi;
+
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * @author Ilya.Kazakevich
+ */
+public interface PyStatementListContainer {
+ @NotNull
+ PyStatementList getStatementList();
+}
diff --git a/python/psi-api/src/com/jetbrains/python/psi/PyStringLiteralExpression.java b/python/psi-api/src/com/jetbrains/python/psi/PyStringLiteralExpression.java
index 8c3182d..f7dd122 100644
--- a/python/psi-api/src/com/jetbrains/python/psi/PyStringLiteralExpression.java
+++ b/python/psi-api/src/com/jetbrains/python/psi/PyStringLiteralExpression.java
@@ -16,8 +16,10 @@
package com.jetbrains.python.psi;
import com.intellij.lang.ASTNode;
+import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiLanguageInjectionHost;
+import org.jetbrains.annotations.NotNull;
import java.util.List;
@@ -28,20 +30,6 @@
int valueOffsetToTextOffset(int valueOffset);
- void iterateCharacterRanges(TextRangeConsumer consumer);
-
- /**
- * Iterator over decoded string characters.
- */
- interface TextRangeConsumer {
- /**
- * Process a decoded character.
- *
- * @param startOffset start offset in the un-decoded string
- * @param endOffset end offset in the un-decoded string
- * @param value decoded character value
- * @return false in order to stop iteration
- */
- boolean process(int startOffset, int endOffset, String value);
- }
+ @NotNull
+ List<Pair<TextRange, String>> getDecodedFragments();
}
diff --git a/python/psi-api/src/com/jetbrains/python/psi/PySubscriptionExpression.java b/python/psi-api/src/com/jetbrains/python/psi/PySubscriptionExpression.java
index 0a12224..dc3f28d 100644
--- a/python/psi-api/src/com/jetbrains/python/psi/PySubscriptionExpression.java
+++ b/python/psi-api/src/com/jetbrains/python/psi/PySubscriptionExpression.java
@@ -15,12 +15,21 @@
*/
package com.jetbrains.python.psi;
+import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* @author yole
*/
public interface PySubscriptionExpression extends PyQualifiedExpression, PyReferenceOwner {
+
+ /**
+ * @return For <code>spam[x][y][n]</code> will return <code>spam</code> regardless number of its dimensions
+ */
+ @NotNull
+ PyExpression getRootOperand();
+
+ @NotNull
PyExpression getOperand();
@Nullable
diff --git a/python/psi-api/src/com/jetbrains/python/psi/PyTargetExpression.java b/python/psi-api/src/com/jetbrains/python/psi/PyTargetExpression.java
index fd028d6..0b67d85 100644
--- a/python/psi-api/src/com/jetbrains/python/psi/PyTargetExpression.java
+++ b/python/psi-api/src/com/jetbrains/python/psi/PyTargetExpression.java
@@ -57,6 +57,4 @@
@Nullable
PyClass getContainingClass();
-
- boolean isQualified();
}
diff --git a/python/psi-api/src/com/jetbrains/python/psi/impl/PyPsiUtils.java b/python/psi-api/src/com/jetbrains/python/psi/impl/PyPsiUtils.java
index c8433aa..b3a1134 100644
--- a/python/psi-api/src/com/jetbrains/python/psi/impl/PyPsiUtils.java
+++ b/python/psi-api/src/com/jetbrains/python/psi/impl/PyPsiUtils.java
@@ -23,6 +23,7 @@
import com.intellij.psi.stubs.StubElement;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.util.PsiTreeUtil;
+import com.intellij.psi.util.QualifiedName;
import com.intellij.util.ArrayUtil;
import com.intellij.util.containers.ContainerUtil;
import com.jetbrains.python.PyTokenTypes;
@@ -32,6 +33,7 @@
import java.lang.reflect.Array;
import java.util.ArrayList;
+import java.util.LinkedList;
import java.util.List;
/**
@@ -375,6 +377,65 @@
return element.getTextOffset() <= element2.getTextOffset();
}
+ @Nullable
+ public static QualifiedName asQualifiedName(@Nullable PyExpression expr) {
+ return expr instanceof PyQualifiedExpression ? ((PyQualifiedExpression)expr).asQualifiedName() : null;
+ }
+
+ @Nullable
+ public static PyExpression getFirstQualifier(@NotNull PyQualifiedExpression expr) {
+ final List<PyExpression> expressions = unwindQualifiers(expr);
+ if (!expressions.isEmpty()) {
+ return expressions.get(0);
+ }
+ return null;
+ }
+
+ @NotNull
+ public static String toPath(@Nullable PyQualifiedExpression expr) {
+ if (expr != null) {
+ final QualifiedName qName = expr.asQualifiedName();
+ if (qName != null) {
+ return qName.toString();
+ }
+ final String name = expr.getName();
+ if (name != null) {
+ return name;
+ }
+ }
+ return "";
+ }
+
+ @Nullable
+ protected static QualifiedName asQualifiedName(@NotNull PyQualifiedExpression expr) {
+ return fromReferenceChain(unwindQualifiers(expr));
+ }
+
+ @NotNull
+ private static List<PyExpression> unwindQualifiers(@NotNull final PyQualifiedExpression expr) {
+ final List<PyExpression> path = new LinkedList<PyExpression>();
+ PyQualifiedExpression e = expr;
+ while (e != null) {
+ path.add(0, e);
+ final PyExpression q = e.getQualifier();
+ e = q instanceof PyQualifiedExpression ? (PyQualifiedExpression)q : null;
+ }
+ return path;
+ }
+
+ @Nullable
+ private static QualifiedName fromReferenceChain(@NotNull List<PyExpression> components) {
+ final List<String> componentNames = new ArrayList<String>(components.size());
+ for (PyExpression component : components) {
+ final String refName = (component instanceof PyQualifiedExpression) ? ((PyQualifiedExpression)component).getReferencedName() : null;
+ if (refName == null) {
+ return null;
+ }
+ componentNames.add(refName);
+ }
+ return QualifiedName.fromComponents(componentNames);
+ }
+
private static abstract class TopLevelVisitor extends PyRecursiveElementVisitor {
public void visitPyElement(final PyElement node) {
super.visitPyElement(node);
diff --git a/python/psi-api/src/com/jetbrains/python/psi/impl/PyQualifiedNameFactory.java b/python/psi-api/src/com/jetbrains/python/psi/impl/PyQualifiedNameFactory.java
deleted file mode 100644
index b26d445..0000000
--- a/python/psi-api/src/com/jetbrains/python/psi/impl/PyQualifiedNameFactory.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright 2000-2013 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.jetbrains.python.psi.impl;
-
-import com.intellij.psi.util.QualifiedName;
-import com.jetbrains.python.psi.PyExpression;
-import com.jetbrains.python.psi.PyQualifiedExpression;
-import com.jetbrains.python.psi.PyReferenceExpression;
-import org.jetbrains.annotations.Nullable;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author yole
- */
-public class PyQualifiedNameFactory {
- @Nullable
- public static QualifiedName fromReferenceChain(List<PyExpression> components) {
- List<String> componentNames = new ArrayList<String>(components.size());
- for (PyExpression component : components) {
- final String refName = (component instanceof PyQualifiedExpression) ? ((PyQualifiedExpression)component).getReferencedName() : null;
- if (refName == null) {
- return null;
- }
- componentNames.add(refName);
- }
- return QualifiedName.fromComponents(componentNames);
- }
-
- @Nullable
- public static QualifiedName fromExpression(PyExpression expr) {
- return expr instanceof PyReferenceExpression ? ((PyReferenceExpression) expr).asQualifiedName() : null;
- }
-}
diff --git a/python/psi-api/src/com/jetbrains/python/psi/impl/PyResolveResultRater.java b/python/psi-api/src/com/jetbrains/python/psi/impl/PyResolveResultRater.java
new file mode 100644
index 0000000..961293f
--- /dev/null
+++ b/python/psi-api/src/com/jetbrains/python/psi/impl/PyResolveResultRater.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2000-2013 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.psi.impl;
+
+import com.intellij.openapi.extensions.ExtensionPointName;
+import com.intellij.psi.PsiElement;
+import org.jetbrains.annotations.NotNull;
+
+public interface PyResolveResultRater {
+ ExtensionPointName<PyResolveResultRater> EP_NAME = ExtensionPointName.create("Pythonid.resolveResultRater");
+
+ int getRate(@NotNull final PsiElement target);
+}
diff --git a/python/psi-api/src/com/jetbrains/python/psi/impl/PyTypeProvider.java b/python/psi-api/src/com/jetbrains/python/psi/impl/PyTypeProvider.java
index 38a0ee6..ff188f5 100644
--- a/python/psi-api/src/com/jetbrains/python/psi/impl/PyTypeProvider.java
+++ b/python/psi-api/src/com/jetbrains/python/psi/impl/PyTypeProvider.java
@@ -30,7 +30,7 @@
ExtensionPointName<PyTypeProvider> EP_NAME = ExtensionPointName.create("Pythonid.typeProvider");
@Nullable
- PyType getReferenceExpressionType(PyReferenceExpression referenceExpression, TypeEvalContext context);
+ PyType getReferenceExpressionType(@NotNull PyReferenceExpression referenceExpression, @NotNull TypeEvalContext context);
@Nullable
PyType getReferenceType(@NotNull PsiElement referenceTarget, TypeEvalContext context, @Nullable PsiElement anchor);
@@ -42,9 +42,6 @@
PyType getReturnType(@NotNull PyFunction function, @Nullable PyQualifiedExpression callSite, @NotNull TypeEvalContext context);
@Nullable
- PyType getIterationType(@NotNull PyClass iterable);
-
- @Nullable
PyType getContextManagerVariableType(PyClass contextManager, PyExpression withExpression, TypeEvalContext context);
@Nullable
diff --git a/python/psi-api/src/com/jetbrains/python/psi/stubs/PyClassStub.java b/python/psi-api/src/com/jetbrains/python/psi/stubs/PyClassStub.java
index 02b212c..2ca1e2a 100644
--- a/python/psi-api/src/com/jetbrains/python/psi/stubs/PyClassStub.java
+++ b/python/psi-api/src/com/jetbrains/python/psi/stubs/PyClassStub.java
@@ -20,13 +20,15 @@
package com.jetbrains.python.psi.stubs;
import com.intellij.psi.stubs.NamedStub;
-import com.jetbrains.python.psi.PyClass;
import com.intellij.psi.util.QualifiedName;
+import com.jetbrains.python.psi.PyClass;
+import org.jetbrains.annotations.Nullable;
import java.util.List;
public interface PyClassStub extends NamedStub<PyClass> {
QualifiedName[] getSuperClasses();
+ @Nullable QualifiedName getMetaClass();
List<String> getSlots();
String getDocString();
}
\ No newline at end of file
diff --git a/python/psi-api/src/com/jetbrains/python/psi/types/PyClassLikeType.java b/python/psi-api/src/com/jetbrains/python/psi/types/PyClassLikeType.java
index 804195a..a059bc7 100644
--- a/python/psi-api/src/com/jetbrains/python/psi/types/PyClassLikeType.java
+++ b/python/psi-api/src/com/jetbrains/python/psi/types/PyClassLikeType.java
@@ -44,4 +44,7 @@
boolean inherited);
boolean isValid();
+
+ @Nullable
+ PyClassLikeType getMetaClassType(@NotNull TypeEvalContext context, boolean inherited);
}
diff --git a/python/psi-api/src/com/jetbrains/python/psi/types/PyOverridingAncestorsClassMembersProvider.java b/python/psi-api/src/com/jetbrains/python/psi/types/PyOverridingAncestorsClassMembersProvider.java
new file mode 100644
index 0000000..07b5309
--- /dev/null
+++ b/python/psi-api/src/com/jetbrains/python/psi/types/PyOverridingAncestorsClassMembersProvider.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.psi.types;
+
+/**
+ * @author vlan
+ */
+public interface PyOverridingAncestorsClassMembersProvider extends PyClassMembersProvider {
+}
diff --git a/python/psi-api/src/com/jetbrains/python/psi/types/PyTypeProviderBase.java b/python/psi-api/src/com/jetbrains/python/psi/types/PyTypeProviderBase.java
index dc20bad..6330c4a 100644
--- a/python/psi-api/src/com/jetbrains/python/psi/types/PyTypeProviderBase.java
+++ b/python/psi-api/src/com/jetbrains/python/psi/types/PyTypeProviderBase.java
@@ -80,7 +80,7 @@
};
@Override
- public PyType getReferenceExpressionType(PyReferenceExpression referenceExpression, TypeEvalContext context) {
+ public PyType getReferenceExpressionType(@NotNull PyReferenceExpression referenceExpression, @NotNull TypeEvalContext context) {
return null;
}
@@ -106,11 +106,6 @@
return null;
}
- @Override
- public PyType getIterationType(@NotNull PyClass iterable) {
- return null;
- }
-
@Nullable
@Override
public PyType getContextManagerVariableType(PyClass contextManager, PyExpression withExpression, TypeEvalContext context) {
diff --git a/python/pydevSrc/com/jetbrains/python/console/pydev/AbstractConsoleCommunication.java b/python/pydevSrc/com/jetbrains/python/console/pydev/AbstractConsoleCommunication.java
index 70594f9..e8fa271 100644
--- a/python/pydevSrc/com/jetbrains/python/console/pydev/AbstractConsoleCommunication.java
+++ b/python/pydevSrc/com/jetbrains/python/console/pydev/AbstractConsoleCommunication.java
@@ -57,9 +57,9 @@
}
@Override
- public void notifyCommandExecuted() {
+ public void notifyCommandExecuted(boolean more) {
for (ConsoleCommunicationListener listener: communicationListeners) {
- listener.commandExecuted();
+ listener.commandExecuted(more);
}
}
diff --git a/python/pydevSrc/com/jetbrains/python/console/pydev/ConsoleCommunication.java b/python/pydevSrc/com/jetbrains/python/console/pydev/ConsoleCommunication.java
index a114c2c..3017171 100644
--- a/python/pydevSrc/com/jetbrains/python/console/pydev/ConsoleCommunication.java
+++ b/python/pydevSrc/com/jetbrains/python/console/pydev/ConsoleCommunication.java
@@ -18,13 +18,30 @@
boolean isExecuting();
- void execInterpreter(String s, Function<InterpreterResponse, Object> callback);
+ void execInterpreter(ConsoleCodeFragment code, Function<InterpreterResponse, Object> callback);
void interrupt();
void addCommunicationListener(ConsoleCommunicationListener listener);
- void notifyCommandExecuted();
+ void notifyCommandExecuted(boolean more);
void notifyInputRequested();
+ class ConsoleCodeFragment {
+ private final String myText;
+ private final boolean myIsSingleLine;
+
+ public ConsoleCodeFragment(String text, boolean isSingleLine) {
+ myText = text;
+ myIsSingleLine = isSingleLine;
+ }
+
+ public String getText() {
+ return myText;
+ }
+
+ public boolean isSingleLine() {
+ return myIsSingleLine;
+ }
+ }
}
diff --git a/python/pydevSrc/com/jetbrains/python/console/pydev/ConsoleCommunicationListener.java b/python/pydevSrc/com/jetbrains/python/console/pydev/ConsoleCommunicationListener.java
index 562f729..a9263b7 100644
--- a/python/pydevSrc/com/jetbrains/python/console/pydev/ConsoleCommunicationListener.java
+++ b/python/pydevSrc/com/jetbrains/python/console/pydev/ConsoleCommunicationListener.java
@@ -4,6 +4,6 @@
* @author traff
*/
public interface ConsoleCommunicationListener {
- void commandExecuted();
+ void commandExecuted(boolean more);
void inputRequested();
}
diff --git a/python/pydevSrc/com/jetbrains/python/console/pydev/IScriptConsoleCommunication.java b/python/pydevSrc/com/jetbrains/python/console/pydev/IScriptConsoleCommunication.java
deleted file mode 100644
index 3c998c8..0000000
--- a/python/pydevSrc/com/jetbrains/python/console/pydev/IScriptConsoleCommunication.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
-
- *******************************************************************************/
-package com.jetbrains.python.console.pydev;
-
-import com.intellij.util.Function;
-
-/**
- * Interface for the console communication.
- *
- * This interface is meant to be the way to communicate with the shell.
- */
-public interface IScriptConsoleCommunication {
-
- /**
- * Executes a given command in the interpreter (push a line)
- *
- * @param command the command to be executed
- * @return the response from the interpreter (contains the stdout, stderr, etc).
- * @throws Exception
- */
- void execInterpreter(String command, Function<InterpreterResponse, Object> onResponseReceived);
-
- /**
- * Creates the completions to be applied in the interpreter.
- *
- * @param text the text with what should be completed (e.g.: xxx.bar.foo)
- * @param offset the offset where the completion was requested in the console document
- * @return a list of proposals that can be applied for the given text.
- * @throws Exception
- */
- //public ICompletionProposal[] getCompletions(String text, int offset) throws Exception;
-
- /**
- * Gets the description to be shown on hover to the user
- *
- * @param text the text representing the completion to be applied
- * @return the description to be shown to the user
- * @throws Exception
- */
- String getDescription(String text) throws Exception;
-
- /**
- * Stops the communication with the server. Should ask the server to terminate at this point.
- * @throws Exception
- */
- void close();
-}
\ No newline at end of file
diff --git a/python/pydevSrc/com/jetbrains/python/console/pydev/PydevXmlRpcClient.java b/python/pydevSrc/com/jetbrains/python/console/pydev/PydevXmlRpcClient.java
index 695704f..ad9991f 100644
--- a/python/pydevSrc/com/jetbrains/python/console/pydev/PydevXmlRpcClient.java
+++ b/python/pydevSrc/com/jetbrains/python/console/pydev/PydevXmlRpcClient.java
@@ -1,17 +1,12 @@
package com.jetbrains.python.console.pydev;
import com.intellij.openapi.diagnostic.Logger;
-import com.intellij.openapi.util.SystemInfo;
import com.intellij.util.net.NetUtils;
import org.apache.xmlrpc.*;
-import java.io.IOException;
-import java.io.PrintWriter;
import java.net.MalformedURLException;
-import java.net.Socket;
import java.net.URL;
import java.util.Arrays;
-import java.util.Scanner;
import java.util.Vector;
/**
@@ -25,12 +20,12 @@
/**
* Internal xml-rpc client (responsible for the actual communication with the server)
*/
- private XmlRpcClient impl;
+ private final XmlRpcClient impl;
/**
* The process where the server is being executed.
*/
- private Process process;
+ private final Process process;
/**
* ItelliJ Logging
@@ -43,15 +38,9 @@
/**
* Constructor (see fields description)
*/
- public PydevXmlRpcClient(Process process, int port)
- throws MalformedURLException {
-
- String hostname = NetUtils.getLocalHostString();
-
- URL url = new URL("http://" + hostname + ':' + port + "/RPC2");
-
- XmlRpc.setDefaultInputEncoding("UTF8"); //eventhough it uses UTF anyway
- this.impl = new XmlRpcClientLite(url);
+ public PydevXmlRpcClient(Process process, int port) throws MalformedURLException {
+ XmlRpc.setDefaultInputEncoding("UTF8"); //even though it uses UTF anyway
+ impl = new XmlRpcClientLite(NetUtils.getLocalHostString(), port);
//this.impl = new XmlRpcClient(url, new CommonsXmlRpcTransportFactory(url));
this.process = process;
}
@@ -64,16 +53,19 @@
*
* @return the result from executing the given command in the server.
*/
+ @Override
public Object execute(String command, Object[] args) throws XmlRpcException {
final Object[] result = new Object[]{null};
//make an async call so that we can keep track of not actually having an answer.
- this.impl.executeAsync(command, new Vector(Arrays.asList(args)), new AsyncCallback() {
+ impl.executeAsync(command, new Vector(Arrays.asList(args)), new AsyncCallback() {
+ @Override
public void handleError(Exception error, URL url, String method) {
result[0] = new Object[]{error.getMessage()};
}
+ @Override
public void handleResult(Object recievedResult, URL url, String method) {
result[0] = recievedResult;
}
diff --git a/python/python-plugin-tests.iml b/python/python-plugin-tests.iml
index 3269555..8045894 100644
--- a/python/python-plugin-tests.iml
+++ b/python/python-plugin-tests.iml
@@ -13,7 +13,6 @@
<orderEntry type="module" module-name="testFramework-java" />
<orderEntry type="library" scope="TEST" name="JUnit3" level="project" />
<orderEntry type="module" module-name="java-impl" />
- <orderEntry type="module" module-name="jam-support-impl" scope="RUNTIME" />
<orderEntry type="module" module-name="IntelliLang-java" scope="RUNTIME" />
<orderEntry type="module" module-name="python-community-tests" />
<orderEntry type="module" module-name="python-community-plugin" />
diff --git a/python/python-rest/src/com/jetbrains/rest/RestFileProviderFactory.java b/python/python-rest/src/com/jetbrains/rest/RestFileProviderFactory.java
index 121ef6e..5c61251 100644
--- a/python/python-rest/src/com/jetbrains/rest/RestFileProviderFactory.java
+++ b/python/python-rest/src/com/jetbrains/rest/RestFileProviderFactory.java
@@ -27,7 +27,7 @@
*/
public class RestFileProviderFactory implements FileViewProviderFactory {
- public FileViewProvider createFileViewProvider(@NotNull VirtualFile virtualFile, Language language, @NotNull PsiManager psiManager, boolean physical) {
- return new RestFileViewProvider(psiManager, virtualFile, physical);
+ public FileViewProvider createFileViewProvider(@NotNull VirtualFile virtualFile, Language language, @NotNull PsiManager psiManager, boolean eventSystemEnabled) {
+ return new RestFileViewProvider(psiManager, virtualFile, eventSystemEnabled);
}
}
diff --git a/python/resources/icon-robots.txt b/python/resources/icon-robots.txt
index e1ca585..e9cf8c7 100644
--- a/python/resources/icon-robots.txt
+++ b/python/resources/icon-robots.txt
@@ -1,2 +1,3 @@
# Only has artwork and tips stuff
-skip: *
+skip: *.png
+skip: tips
diff --git a/python/resources/icons/com/jetbrains/pyqt/tsFile.png b/python/resources/icons/com/jetbrains/pyqt/tsFile.png
index 4f962a2..b87e71b 100644
--- a/python/resources/icons/com/jetbrains/pyqt/tsFile.png
+++ b/python/resources/icons/com/jetbrains/pyqt/tsFile.png
Binary files differ
diff --git a/python/resources/icons/com/jetbrains/pyqt/uiForm.png b/python/resources/icons/com/jetbrains/pyqt/uiForm.png
index 048cc19..ad5c245 100644
--- a/python/resources/icons/com/jetbrains/pyqt/uiForm.png
+++ b/python/resources/icons/com/jetbrains/pyqt/uiForm.png
Binary files differ
diff --git a/python/resources/icons/com/jetbrains/python/buildout/buildout.png b/python/resources/icons/com/jetbrains/python/buildout/buildout.png
index d3133dd..21710ea 100644
--- a/python/resources/icons/com/jetbrains/python/buildout/buildout.png
+++ b/python/resources/icons/com/jetbrains/python/buildout/buildout.png
Binary files differ
diff --git a/python/resources/icons/com/jetbrains/python/debug/commandLine.png b/python/resources/icons/com/jetbrains/python/debug/commandLine.png
index e064d3f..3d2333b 100644
--- a/python/resources/icons/com/jetbrains/python/debug/commandLine.png
+++ b/python/resources/icons/com/jetbrains/python/debug/commandLine.png
Binary files differ
diff --git a/python/resources/icons/com/jetbrains/python/dotnet.png b/python/resources/icons/com/jetbrains/python/dotnet.png
index b6c4d3b..b7ff8db 100644
--- a/python/resources/icons/com/jetbrains/python/dotnet.png
+++ b/python/resources/icons/com/jetbrains/python/dotnet.png
Binary files differ
diff --git a/python/resources/icons/com/jetbrains/python/interpreterGear.png b/python/resources/icons/com/jetbrains/python/interpreterGear.png
new file mode 100644
index 0000000..ea7f947
--- /dev/null
+++ b/python/resources/icons/com/jetbrains/python/interpreterGear.png
Binary files differ
diff --git a/python/resources/icons/com/jetbrains/python/interpreterGear@2x.png b/python/resources/icons/com/jetbrains/python/interpreterGear@2x.png
new file mode 100644
index 0000000..fe190f2
--- /dev/null
+++ b/python/resources/icons/com/jetbrains/python/interpreterGear@2x.png
Binary files differ
diff --git a/python/resources/icons/com/jetbrains/python/interpreterGear@2x_dark.png b/python/resources/icons/com/jetbrains/python/interpreterGear@2x_dark.png
new file mode 100644
index 0000000..2d77aac
--- /dev/null
+++ b/python/resources/icons/com/jetbrains/python/interpreterGear@2x_dark.png
Binary files differ
diff --git a/python/resources/icons/com/jetbrains/python/interpreterGear_dark.png b/python/resources/icons/com/jetbrains/python/interpreterGear_dark.png
new file mode 100644
index 0000000..44e79af
--- /dev/null
+++ b/python/resources/icons/com/jetbrains/python/interpreterGear_dark.png
Binary files differ
diff --git a/python/resources/icons/com/jetbrains/python/jython.png b/python/resources/icons/com/jetbrains/python/jython.png
index cf88263..ed5d76a 100644
--- a/python/resources/icons/com/jetbrains/python/jython.png
+++ b/python/resources/icons/com/jetbrains/python/jython.png
Binary files differ
diff --git a/python/resources/icons/com/jetbrains/python/nodes/cyan-dot.png b/python/resources/icons/com/jetbrains/python/nodes/cyan-dot.png
index a60819c..9118f7d 100644
--- a/python/resources/icons/com/jetbrains/python/nodes/cyan-dot.png
+++ b/python/resources/icons/com/jetbrains/python/nodes/cyan-dot.png
Binary files differ
diff --git a/python/resources/icons/com/jetbrains/python/nodes/lock.png b/python/resources/icons/com/jetbrains/python/nodes/lock.png
index 7ce8afc..be02730 100644
--- a/python/resources/icons/com/jetbrains/python/nodes/lock.png
+++ b/python/resources/icons/com/jetbrains/python/nodes/lock.png
Binary files differ
diff --git a/python/resources/icons/com/jetbrains/python/nodes/red-inv-triangle.png b/python/resources/icons/com/jetbrains/python/nodes/red-inv-triangle.png
index 0e9ad02..c078c76 100644
--- a/python/resources/icons/com/jetbrains/python/nodes/red-inv-triangle.png
+++ b/python/resources/icons/com/jetbrains/python/nodes/red-inv-triangle.png
Binary files differ
diff --git a/python/resources/icons/com/jetbrains/python/propertyDeleter.png b/python/resources/icons/com/jetbrains/python/propertyDeleter.png
index 98ba369..9084547 100644
--- a/python/resources/icons/com/jetbrains/python/propertyDeleter.png
+++ b/python/resources/icons/com/jetbrains/python/propertyDeleter.png
Binary files differ
diff --git a/python/resources/icons/com/jetbrains/python/propertyGetter.png b/python/resources/icons/com/jetbrains/python/propertyGetter.png
index dd5acf8..d3069a8 100644
--- a/python/resources/icons/com/jetbrains/python/propertyGetter.png
+++ b/python/resources/icons/com/jetbrains/python/propertyGetter.png
Binary files differ
diff --git a/python/resources/icons/com/jetbrains/python/propertySetter.png b/python/resources/icons/com/jetbrains/python/propertySetter.png
index 127501b..0154c38 100644
--- a/python/resources/icons/com/jetbrains/python/propertySetter.png
+++ b/python/resources/icons/com/jetbrains/python/propertySetter.png
Binary files differ
diff --git a/python/resources/icons/com/jetbrains/python/pypy.png b/python/resources/icons/com/jetbrains/python/pypy.png
index 053d30e..1649f3a 100644
--- a/python/resources/icons/com/jetbrains/python/pypy.png
+++ b/python/resources/icons/com/jetbrains/python/pypy.png
Binary files differ
diff --git a/python/resources/icons/com/jetbrains/python/pythonClosed.png b/python/resources/icons/com/jetbrains/python/pythonClosed.png
index c52010a..d3d3257 100644
--- a/python/resources/icons/com/jetbrains/python/pythonClosed.png
+++ b/python/resources/icons/com/jetbrains/python/pythonClosed.png
Binary files differ
diff --git a/python/resources/icons/com/jetbrains/python/skeleton.png b/python/resources/icons/com/jetbrains/python/skeleton.png
new file mode 100644
index 0000000..b77c54c
--- /dev/null
+++ b/python/resources/icons/com/jetbrains/python/skeleton.png
Binary files differ
diff --git a/python/resources/icons/com/jetbrains/python/skeleton@2x.png b/python/resources/icons/com/jetbrains/python/skeleton@2x.png
new file mode 100644
index 0000000..313b024
--- /dev/null
+++ b/python/resources/icons/com/jetbrains/python/skeleton@2x.png
Binary files differ
diff --git a/python/resources/icons/com/jetbrains/python/templateRoot.png b/python/resources/icons/com/jetbrains/python/templateRoot.png
new file mode 100644
index 0000000..a736036
--- /dev/null
+++ b/python/resources/icons/com/jetbrains/python/templateRoot.png
Binary files differ
diff --git a/python/resources/icons/com/jetbrains/python/templateRoot@2x.png b/python/resources/icons/com/jetbrains/python/templateRoot@2x.png
new file mode 100644
index 0000000..bc475d5
--- /dev/null
+++ b/python/resources/icons/com/jetbrains/python/templateRoot@2x.png
Binary files differ
diff --git a/python/resources/inspectionDescriptions/PyAssignmentToLoopOrWithParameterInspection.html b/python/resources/inspectionDescriptions/PyAssignmentToLoopOrWithParameterInspection.html
new file mode 100644
index 0000000..4fc3dcd
--- /dev/null
+++ b/python/resources/inspectionDescriptions/PyAssignmentToLoopOrWithParameterInspection.html
@@ -0,0 +1,21 @@
+<html>
+<body>
+<span style="font-family: verdana,serif;">
+ Checks for cases when you rewrite loop variable with inner loop
+</span>
+<pre style="font-family: monospace">
+ for i in xrange(5):
+ for i in xrange(20, 25):
+ print("Inner", i)
+ print("Outer", i)
+ </pre>
+<span style="font-family: verdana,serif;">
+ It also warns you if variable declared in <code>with</code> statement is redeclared inside of statement body:
+</span>
+<pre style="font-family: monospace">
+ with open("file") as f:
+ f.read()
+ with open("file") as f:
+ </pre>
+</body>
+</html>
diff --git a/python/resources/intentionDescriptions/ImportFromToImportIntention/description.html b/python/resources/intentionDescriptions/ImportFromToImportIntention/description.html
index 96be990..63818e3 100644
--- a/python/resources/intentionDescriptions/ImportFromToImportIntention/description.html
+++ b/python/resources/intentionDescriptions/ImportFromToImportIntention/description.html
@@ -1,7 +1,7 @@
<html>
<body>
<span style="font-family: verdana,sans-serif;">
-This instenton transforms <code>from module_name import ...</code> into <code>import module_name</code>
+This intention transforms <code>from module_name import ...</code> into <code>import module_name</code>
and qualifies any names imported from that module by module name.
</span>
</body>
diff --git a/python/resources/liveTemplates/Python.xml b/python/resources/liveTemplates/Python.xml
index 314f81c..a7e5781 100644
--- a/python/resources/liveTemplates/Python.xml
+++ b/python/resources/liveTemplates/Python.xml
@@ -1,10 +1,15 @@
-<?xml version="1.0" encoding="UTF-8"?>
<templateSet group="Python">
- <template name="super" value="super($class$, self).$method$($end$)" description="Generates a 'super' call" toReformat="false" toShortenFQNames="true">
+ <template name="super" value="super($class$, self).$method$($end$)" description="'super(...)' call" toReformat="false" toShortenFQNames="true">
<variable name="class" expression="pyClassName()" defaultValue="" alwaysStopAt="false" />
<variable name="method" expression="pyFunctionName()" defaultValue="" alwaysStopAt="false" />
<variable name="end" expression="" defaultValue="" alwaysStopAt="true" />
<context>
+ <option name="TypeScript" value="false" />
+ <option name="CoffeeScript" value="false" />
+ </context>
+ </template>
+ <template name="main" value="if __name__ == '__main__': $END$" description="if __name__ == '__main__'" toReformat="false" toShortenFQNames="true">
+ <context>
<option name="HTML_TEXT" value="false" />
<option name="HTML" value="false" />
<option name="XSL_TEXT" value="false" />
@@ -16,7 +21,294 @@
<option name="CSS_RULESET_LIST" value="false" />
<option name="CSS" value="false" />
<option name="JAVA_SCRIPT" value="false" />
+ <option name="TypeScript" value="false" />
<option name="SQL" value="false" />
+ <option name="CoffeeScript" value="false" />
+ <option name="OTHER" value="false" />
+ </context>
+ </template>
+ <template name="iter" value="for $VAR$ in $ITERABLE$: $END$" description="Iterate (for ... in ...)" toReformat="false" toShortenFQNames="true">
+ <variable name="ITERABLE" expression="pyIterableVariable()" defaultValue="" alwaysStopAt="true" />
+ <variable name="VAR" expression="collectionElementName(ITERABLE)" defaultValue="" alwaysStopAt="true" />
+ <context>
+ <option name="HTML_TEXT" value="false" />
+ <option name="HTML" value="false" />
+ <option name="XSL_TEXT" value="false" />
+ <option name="XML" value="false" />
+ <option name="Python" value="true" />
+ <option name="Django" value="false" />
+ <option name="CSS_PROPERTY_VALUE" value="false" />
+ <option name="CSS_DECLARATION_BLOCK" value="false" />
+ <option name="CSS_RULESET_LIST" value="false" />
+ <option name="CSS" value="false" />
+ <option name="JAVA_SCRIPT" value="false" />
+ <option name="TypeScript" value="false" />
+ <option name="SQL" value="false" />
+ <option name="CoffeeScript" value="false" />
+ <option name="OTHER" value="false" />
+ </context>
+ </template>
+ <template name="itere" value="for $INDEX$, $VAR$ in enumerate($ITERABLE$): $END$" description="Iterate (for ... in enumerate)" toReformat="false" toShortenFQNames="true">
+ <variable name="ITERABLE" expression="pyIterableVariable()" defaultValue="" alwaysStopAt="true" />
+ <variable name="VAR" expression="collectionElementName(ITERABLE)" defaultValue="" alwaysStopAt="true" />
+ <variable name="INDEX" expression="" defaultValue=""i"" alwaysStopAt="true" />
+ <context>
+ <option name="HTML_TEXT" value="false" />
+ <option name="HTML" value="false" />
+ <option name="XSL_TEXT" value="false" />
+ <option name="XML" value="false" />
+ <option name="Python" value="true" />
+ <option name="Django" value="false" />
+ <option name="CSS_PROPERTY_VALUE" value="false" />
+ <option name="CSS_DECLARATION_BLOCK" value="false" />
+ <option name="CSS_RULESET_LIST" value="false" />
+ <option name="CSS" value="false" />
+ <option name="JAVA_SCRIPT" value="false" />
+ <option name="TypeScript" value="false" />
+ <option name="SQL" value="false" />
+ <option name="CoffeeScript" value="false" />
+ <option name="OTHER" value="false" />
+ </context>
+ </template>
+ <template name="compl" value="[$VAR_EXPR$ for $VAR$ in $ITERABLE$]" description="List comprehension" toReformat="false" toShortenFQNames="true">
+ <variable name="ITERABLE" expression="pyIterableVariable()" defaultValue="" alwaysStopAt="true" />
+ <variable name="VAR" expression="collectionElementName(ITERABLE)" defaultValue="" alwaysStopAt="true" />
+ <variable name="VAR_EXPR" expression="" defaultValue="VAR" alwaysStopAt="true" />
+ <context>
+ <option name="HTML_TEXT" value="false" />
+ <option name="HTML" value="false" />
+ <option name="XSL_TEXT" value="false" />
+ <option name="XML" value="false" />
+ <option name="Python" value="true" />
+ <option name="Django" value="false" />
+ <option name="CSS_PROPERTY_VALUE" value="false" />
+ <option name="CSS_DECLARATION_BLOCK" value="false" />
+ <option name="CSS_RULESET_LIST" value="false" />
+ <option name="CSS" value="false" />
+ <option name="JAVA_SCRIPT" value="false" />
+ <option name="TypeScript" value="false" />
+ <option name="SQL" value="false" />
+ <option name="CoffeeScript" value="false" />
+ <option name="OTHER" value="false" />
+ </context>
+ </template>
+ <template name="compli" value="[$VAR_EXPR$ for $VAR$ in $ITERABLE$ if $VAR_EXPR_IF$]" description="List comprehension with 'if'" toReformat="false" toShortenFQNames="true">
+ <variable name="ITERABLE" expression="pyIterableVariable()" defaultValue="" alwaysStopAt="true" />
+ <variable name="VAR" expression="collectionElementName(ITERABLE)" defaultValue="" alwaysStopAt="true" />
+ <variable name="VAR_EXPR" expression="" defaultValue="VAR" alwaysStopAt="true" />
+ <variable name="VAR_EXPR_IF" expression="" defaultValue="VAR" alwaysStopAt="true" />
+ <context>
+ <option name="HTML_TEXT" value="false" />
+ <option name="HTML" value="false" />
+ <option name="XSL_TEXT" value="false" />
+ <option name="XML" value="false" />
+ <option name="Python" value="true" />
+ <option name="Django" value="false" />
+ <option name="CSS_PROPERTY_VALUE" value="false" />
+ <option name="CSS_DECLARATION_BLOCK" value="false" />
+ <option name="CSS_RULESET_LIST" value="false" />
+ <option name="CSS" value="false" />
+ <option name="JAVA_SCRIPT" value="false" />
+ <option name="TypeScript" value="false" />
+ <option name="SQL" value="false" />
+ <option name="CoffeeScript" value="false" />
+ <option name="OTHER" value="false" />
+ </context>
+ </template>
+ <template name="compg" value="($VAR_EXPR$ for $VAR$ in $ITERABLE$)" description="Generator comprehension" toReformat="false" toShortenFQNames="true">
+ <variable name="ITERABLE" expression="pyIterableVariable()" defaultValue="" alwaysStopAt="true" />
+ <variable name="VAR" expression="collectionElementName(ITERABLE)" defaultValue="" alwaysStopAt="true" />
+ <variable name="VAR_EXPR" expression="" defaultValue="VAR" alwaysStopAt="true" />
+ <context>
+ <option name="HTML_TEXT" value="false" />
+ <option name="HTML" value="false" />
+ <option name="XSL_TEXT" value="false" />
+ <option name="XML" value="false" />
+ <option name="Python" value="true" />
+ <option name="Django" value="false" />
+ <option name="CSS_PROPERTY_VALUE" value="false" />
+ <option name="CSS_DECLARATION_BLOCK" value="false" />
+ <option name="CSS_RULESET_LIST" value="false" />
+ <option name="CSS" value="false" />
+ <option name="JAVA_SCRIPT" value="false" />
+ <option name="TypeScript" value="false" />
+ <option name="SQL" value="false" />
+ <option name="CoffeeScript" value="false" />
+ <option name="OTHER" value="false" />
+ </context>
+ </template>
+ <template name="compgi" value="($VAR_EXPR$ for $VAR$ in $ITERABLE$ if $VAR_EXPR_IF$)" description="Generator comprehension with 'if'" toReformat="false" toShortenFQNames="true">
+ <variable name="ITERABLE" expression="pyIterableVariable()" defaultValue="" alwaysStopAt="true" />
+ <variable name="VAR" expression="collectionElementName(ITERABLE)" defaultValue="" alwaysStopAt="true" />
+ <variable name="VAR_EXPR" expression="" defaultValue="VAR" alwaysStopAt="true" />
+ <variable name="VAR_EXPR_IF" expression="" defaultValue="VAR" alwaysStopAt="true" />
+ <context>
+ <option name="HTML_TEXT" value="false" />
+ <option name="HTML" value="false" />
+ <option name="XSL_TEXT" value="false" />
+ <option name="XML" value="false" />
+ <option name="Python" value="true" />
+ <option name="Django" value="false" />
+ <option name="CSS_PROPERTY_VALUE" value="false" />
+ <option name="CSS_DECLARATION_BLOCK" value="false" />
+ <option name="CSS_RULESET_LIST" value="false" />
+ <option name="CSS" value="false" />
+ <option name="JAVA_SCRIPT" value="false" />
+ <option name="TypeScript" value="false" />
+ <option name="SQL" value="false" />
+ <option name="CoffeeScript" value="false" />
+ <option name="OTHER" value="false" />
+ </context>
+ </template>
+ <template name="comps" value="{$VAR_EXPR$ for $VAR$ in $ITERABLE$}" description="Set comprehension" toReformat="false" toShortenFQNames="true">
+ <variable name="ITERABLE" expression="pyIterableVariable()" defaultValue="" alwaysStopAt="true" />
+ <variable name="VAR" expression="collectionElementName(ITERABLE)" defaultValue="" alwaysStopAt="true" />
+ <variable name="VAR_EXPR" expression="" defaultValue="VAR" alwaysStopAt="true" />
+ <context>
+ <option name="HTML_TEXT" value="false" />
+ <option name="HTML" value="false" />
+ <option name="XSL_TEXT" value="false" />
+ <option name="XML" value="false" />
+ <option name="Python" value="true" />
+ <option name="Django" value="false" />
+ <option name="CSS_PROPERTY_VALUE" value="false" />
+ <option name="CSS_DECLARATION_BLOCK" value="false" />
+ <option name="CSS_RULESET_LIST" value="false" />
+ <option name="CSS" value="false" />
+ <option name="JAVA_SCRIPT" value="false" />
+ <option name="TypeScript" value="false" />
+ <option name="SQL" value="false" />
+ <option name="CoffeeScript" value="false" />
+ <option name="OTHER" value="false" />
+ </context>
+ </template>
+ <template name="compsi" value="{$VAR_EXPR$ for $VAR$ in $ITERABLE$ if $VAR_EXPR_IF$}" description="Set comprehension with 'if'" toReformat="false" toShortenFQNames="true">
+ <variable name="ITERABLE" expression="pyIterableVariable()" defaultValue="" alwaysStopAt="true" />
+ <variable name="VAR" expression="collectionElementName(ITERABLE)" defaultValue="" alwaysStopAt="true" />
+ <variable name="VAR_EXPR" expression="" defaultValue="VAR" alwaysStopAt="true" />
+ <variable name="VAR_EXPR_IF" expression="" defaultValue="VAR" alwaysStopAt="true" />
+ <context>
+ <option name="HTML_TEXT" value="false" />
+ <option name="HTML" value="false" />
+ <option name="XSL_TEXT" value="false" />
+ <option name="XML" value="false" />
+ <option name="Python" value="true" />
+ <option name="Django" value="false" />
+ <option name="CSS_PROPERTY_VALUE" value="false" />
+ <option name="CSS_DECLARATION_BLOCK" value="false" />
+ <option name="CSS_RULESET_LIST" value="false" />
+ <option name="CSS" value="false" />
+ <option name="JAVA_SCRIPT" value="false" />
+ <option name="TypeScript" value="false" />
+ <option name="SQL" value="false" />
+ <option name="CoffeeScript" value="false" />
+ <option name="OTHER" value="false" />
+ </context>
+ </template>
+ <template name="compd" value="{$KEY_EXPR$: $VAL_EXPR$ for $VAR$ in $ITERABLE$}" description="Generator comprehension" toReformat="false" toShortenFQNames="true">
+ <variable name="ITERABLE" expression="pyIterableVariable()" defaultValue="" alwaysStopAt="true" />
+ <variable name="VAR" expression="collectionElementName(ITERABLE)" defaultValue="" alwaysStopAt="true" />
+ <variable name="KEY_EXPR" expression="" defaultValue="VAR" alwaysStopAt="true" />
+ <variable name="VAL_EXPR" expression="" defaultValue="VAR" alwaysStopAt="true" />
+ <context>
+ <option name="HTML_TEXT" value="false" />
+ <option name="HTML" value="false" />
+ <option name="XSL_TEXT" value="false" />
+ <option name="XML" value="false" />
+ <option name="Python" value="true" />
+ <option name="Django" value="false" />
+ <option name="CSS_PROPERTY_VALUE" value="false" />
+ <option name="CSS_DECLARATION_BLOCK" value="false" />
+ <option name="CSS_RULESET_LIST" value="false" />
+ <option name="CSS" value="false" />
+ <option name="JAVA_SCRIPT" value="false" />
+ <option name="TypeScript" value="false" />
+ <option name="SQL" value="false" />
+ <option name="CoffeeScript" value="false" />
+ <option name="OTHER" value="false" />
+ </context>
+ </template>
+ <template name="compdi" value="{$KEY_EXPR$: $VAL_EXPR$ for $VAR$ in $ITERABLE$ if $VAR_EXPR_IF$}" description="Generator comprehension with 'if'" toReformat="false" toShortenFQNames="true">
+ <variable name="ITERABLE" expression="pyIterableVariable()" defaultValue="" alwaysStopAt="true" />
+ <variable name="VAR" expression="collectionElementName(ITERABLE)" defaultValue="" alwaysStopAt="true" />
+ <variable name="KEY_EXPR" expression="" defaultValue="VAR" alwaysStopAt="true" />
+ <variable name="VAL_EXPR" expression="" defaultValue="VAR" alwaysStopAt="true" />
+ <variable name="VAR_EXPR_IF" expression="" defaultValue="VAR" alwaysStopAt="true" />
+ <context>
+ <option name="HTML_TEXT" value="false" />
+ <option name="HTML" value="false" />
+ <option name="XSL_TEXT" value="false" />
+ <option name="XML" value="false" />
+ <option name="Python" value="true" />
+ <option name="Django" value="false" />
+ <option name="CSS_PROPERTY_VALUE" value="false" />
+ <option name="CSS_DECLARATION_BLOCK" value="false" />
+ <option name="CSS_RULESET_LIST" value="false" />
+ <option name="CSS" value="false" />
+ <option name="JAVA_SCRIPT" value="false" />
+ <option name="TypeScript" value="false" />
+ <option name="SQL" value="false" />
+ <option name="CoffeeScript" value="false" />
+ <option name="OTHER" value="false" />
+ </context>
+ </template>
+ <template name="prop" value="@property def $NAME$(self): return $END$" description="Property getter" toReformat="false" toShortenFQNames="true">
+ <variable name="NAME" expression="" defaultValue="" alwaysStopAt="true" />
+ <context>
+ <option name="HTML_TEXT" value="false" />
+ <option name="HTML" value="false" />
+ <option name="XSL_TEXT" value="false" />
+ <option name="XML" value="false" />
+ <option name="Python" value="true" />
+ <option name="Django" value="false" />
+ <option name="CSS_PROPERTY_VALUE" value="false" />
+ <option name="CSS_DECLARATION_BLOCK" value="false" />
+ <option name="CSS_RULESET_LIST" value="false" />
+ <option name="CSS" value="false" />
+ <option name="JAVA_SCRIPT" value="false" />
+ <option name="TypeScript" value="false" />
+ <option name="SQL" value="false" />
+ <option name="CoffeeScript" value="false" />
+ <option name="OTHER" value="false" />
+ </context>
+ </template>
+ <template name="props" value="@property def $NAME$(self): return $END$ @$NAME$.setter def $NAME$(self, value): pass" description="Property getter/setter" toReformat="false" toShortenFQNames="true">
+ <variable name="NAME" expression="" defaultValue="" alwaysStopAt="true" />
+ <context>
+ <option name="HTML_TEXT" value="false" />
+ <option name="HTML" value="false" />
+ <option name="XSL_TEXT" value="false" />
+ <option name="XML" value="false" />
+ <option name="Python" value="true" />
+ <option name="Django" value="false" />
+ <option name="CSS_PROPERTY_VALUE" value="false" />
+ <option name="CSS_DECLARATION_BLOCK" value="false" />
+ <option name="CSS_RULESET_LIST" value="false" />
+ <option name="CSS" value="false" />
+ <option name="JAVA_SCRIPT" value="false" />
+ <option name="TypeScript" value="false" />
+ <option name="SQL" value="false" />
+ <option name="CoffeeScript" value="false" />
+ <option name="OTHER" value="false" />
+ </context>
+ </template>
+ <template name="propsd" value="@property def $NAME$(self): return $END$ @$NAME$.setter def $NAME$(self, value): pass @$NAME$.deleter def $NAME$(self): pass" description="Property getter/setter/deleter" toReformat="false" toShortenFQNames="true">
+ <variable name="NAME" expression="" defaultValue="" alwaysStopAt="true" />
+ <context>
+ <option name="HTML_TEXT" value="false" />
+ <option name="HTML" value="false" />
+ <option name="XSL_TEXT" value="false" />
+ <option name="XML" value="false" />
+ <option name="Python" value="true" />
+ <option name="Django" value="false" />
+ <option name="CSS_PROPERTY_VALUE" value="false" />
+ <option name="CSS_DECLARATION_BLOCK" value="false" />
+ <option name="CSS_RULESET_LIST" value="false" />
+ <option name="CSS" value="false" />
+ <option name="JAVA_SCRIPT" value="false" />
+ <option name="TypeScript" value="false" />
+ <option name="SQL" value="false" />
+ <option name="CoffeeScript" value="false" />
<option name="OTHER" value="false" />
</context>
</template>
diff --git a/python/resources/pycharm_core_about.png b/python/resources/pycharm_core_about.png
index 9a1bb9f..b9fa97f 100644
--- a/python/resources/pycharm_core_about.png
+++ b/python/resources/pycharm_core_about.png
Binary files differ
diff --git a/python/resources/pycharm_core_about@2x.png b/python/resources/pycharm_core_about@2x.png
index c860c60..c58e5a3 100644
--- a/python/resources/pycharm_core_about@2x.png
+++ b/python/resources/pycharm_core_about@2x.png
Binary files differ
diff --git a/python/resources/pycharm_core_logo.png b/python/resources/pycharm_core_logo.png
index 228dfdd..632185d 100644
--- a/python/resources/pycharm_core_logo.png
+++ b/python/resources/pycharm_core_logo.png
Binary files differ
diff --git a/python/resources/pycharm_core_logo@2x.png b/python/resources/pycharm_core_logo@2x.png
index f45960d..df1382a 100644
--- a/python/resources/pycharm_core_logo@2x.png
+++ b/python/resources/pycharm_core_logo@2x.png
Binary files differ
diff --git a/python/resources/tips/AdaptiveWelcome.html b/python/resources/tips/AdaptiveWelcome.html
new file mode 100644
index 0000000..597ffaf
--- /dev/null
+++ b/python/resources/tips/AdaptiveWelcome.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+ <h1>Welcome to PyCharm Productivity Guide</h1>
+ <p>
+ PyCharm keeps track of which of its features you are using and will offer you some tips to let you know
+ about the features you may have missed. These tips will be shown while the startup process is going on.
+ You can always get back to them by selecting <span class="control">Help | Productivity Guide</span>
+ on the menu bar.</p>
+</body>
+</html>
diff --git a/python/resources/tips/AnnotationsAndDiffs.html b/python/resources/tips/AnnotationsAndDiffs.html
new file mode 100644
index 0000000..309d032
--- /dev/null
+++ b/python/resources/tips/AnnotationsAndDiffs.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+ <p>
+ Version control annotations show the latest changes of each line in one click.</p>
+ <p>
+ Just right-click an annotation and use the <span class="control">Show Diff</span> command in the context menu.</p>
+ <p class="image">
+ <img src="images/annotationShowDiff.png"></p>
+</body>
+</html>
\ No newline at end of file
diff --git a/python/resources/tips/BreakpointSpeedmenu.html b/python/resources/tips/BreakpointSpeedmenu.html
new file mode 100644
index 0000000..5a03f23
--- /dev/null
+++ b/python/resources/tips/BreakpointSpeedmenu.html
@@ -0,0 +1,12 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+ <p>
+ Right-clicking on a breakpoint (in the left gutter) invokes the context menu where
+ you can quickly enable/disable the breakpoint or adjust its properties.</p>
+ <p class="image">
+ <img src="images/breakpoint_speedmenu.png"></p>
+</body>
+</html>
diff --git a/python/resources/tips/BuiltInServer.html b/python/resources/tips/BuiltInServer.html
new file mode 100644
index 0000000..4515f04
--- /dev/null
+++ b/python/resources/tips/BuiltInServer.html
@@ -0,0 +1,16 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>It is very easy to change the built-in web server port (<span class="control">File | Settings – Debugger – JavaScript</span>),
+and use the "Built-in server port" spinner to set the new value. </p>
+ <p class="image"><img src="images/builtInServer.png"></p>
+ <p>Next, open an HTML page in your browser and see it running on the defined port.</p>
+
+
+
+</body>
+</html>
diff --git a/python/resources/tips/CamelHumpsInCodeCompletion.html b/python/resources/tips/CamelHumpsInCodeCompletion.html
new file mode 100644
index 0000000..610f91d
--- /dev/null
+++ b/python/resources/tips/CamelHumpsInCodeCompletion.html
@@ -0,0 +1,11 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+ <p>
+ When in the Code Completion lookup, you can ease the search by filtering the list with the help of the "camel words" prefixes.</p>
+ <p class="image">
+ <img src="images/camel_completion.png"></p>
+</body>
+</html>
diff --git a/python/resources/tips/CamelPrefixesInNavigationPopups.html b/python/resources/tips/CamelPrefixesInNavigationPopups.html
new file mode 100644
index 0000000..cae5bf2
--- /dev/null
+++ b/python/resources/tips/CamelPrefixesInNavigationPopups.html
@@ -0,0 +1,17 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>When in the <span class="control">Go to Class</span>,
+ <span class="control">Go to Symbol</span>, or
+ <span class="control">Go to File</span> popup,
+ you can ease the search by filtering the lookup list with the help of the "camel words" prefixes.</p>
+ <p class="image"><img src="images/camel_goto.png"></p>
+
+
+
+</body>
+</html>
diff --git a/python/resources/tips/CancelByControlArrows.html b/python/resources/tips/CancelByControlArrows.html
new file mode 100644
index 0000000..2433e56
--- /dev/null
+++ b/python/resources/tips/CancelByControlArrows.html
@@ -0,0 +1,12 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+ <p>
+ When an autopopup completion is active,
+ <span class="shortcut">&shortcut:EditorLookupDown;</span> and <span class="shortcut">&shortcut:EditorLookupUp;</span>
+ will close it and move the caret down or up in the editor.
+ </p>
+</body>
+</html>
diff --git a/python/resources/tips/ChangeSorting.html b/python/resources/tips/ChangeSorting.html
new file mode 100644
index 0000000..152e182
--- /dev/null
+++ b/python/resources/tips/ChangeSorting.html
@@ -0,0 +1,11 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+ <p>
+ You can switch between sorting completion variants by relevance or alphabetically by using an icon at the bottom right:
+ </p>
+ <p class="image"><img src="images/changeLookupSorting.png"/></p>
+</body>
+</html>
diff --git a/python/resources/tips/ChangesView.html b/python/resources/tips/ChangesView.html
new file mode 100644
index 0000000..73d19bb
--- /dev/null
+++ b/python/resources/tips/ChangesView.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+<p>The <span class="control">Changes</span> tool window shows all deleted, modified, and unversioned files in a single view.
+Use <span class="shortcut">&shortcut:ActivateChangesToolWindow;</span> keyboard shortcut to show or hide this tool window.</p>
+ <p>From the <span class="control">Changes</span> tool window you can perform all the necessary version control actions: commit changes, manage changelists, put resources under version control, examine differences and more.</p>
+
+
+
+</body>
+</html>
diff --git a/python/resources/tips/CheckRegExp.html b/python/resources/tips/CheckRegExp.html
new file mode 100644
index 0000000..d231480
--- /dev/null
+++ b/python/resources/tips/CheckRegExp.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+ <p>The format of a regular expression can be rather complicated.
+To make sure you didn't miss some slash of quotation mark, place the caret
+somewhere in the expression you want to check, and press <span class="shortcut">&shortcut:ShowIntentionActions;</span>. </p>
+<p>In the pop-up frame type a string that you think should match your regular expression. If the background turns green, you are lucky. If it turns red, then you have to look for a mistake. </p>
+ <p class="image">
+ <img src="images/checkRegExp.png"></p>
+</body>
+</html>
\ No newline at end of file
diff --git a/python/resources/tips/ClassNameCompletion.html b/python/resources/tips/ClassNameCompletion.html
new file mode 100644
index 0000000..cdeb660
--- /dev/null
+++ b/python/resources/tips/ClassNameCompletion.html
@@ -0,0 +1,14 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+ <p>
+ A special variant of the Code Completion feature invoked by pressing <span class="shortcut">&shortcut:CodeCompletion;</span> twice allows you to
+ complete the name of any class
+ no matter if it was imported in the current file or not.
+ If the class is not imported yet, the import statement is generated automatically.</p>
+ <p class="image">
+ <img src="images/class_name_completion.png"></p>
+</body>
+</html>
diff --git a/python/resources/tips/ClipboardStack.html b/python/resources/tips/ClipboardStack.html
new file mode 100644
index 0000000..1c5e008
--- /dev/null
+++ b/python/resources/tips/ClipboardStack.html
@@ -0,0 +1,12 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>Use the <span class="shortcut">&shortcut:PasteMultiple;</span> shortcut to choose and insert recent clipboard contents into the text.</p>
+
+
+</body>
+</html>
diff --git a/python/resources/tips/CloseOthers.html b/python/resources/tips/CloseOthers.html
new file mode 100644
index 0000000..ab5beb5
--- /dev/null
+++ b/python/resources/tips/CloseOthers.html
@@ -0,0 +1,15 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+ <p>
+ There are two ways of closing all tabs in the editor, except the current one:</p>
+<ul>
+<li>First, right-click the editor tab, and choose <span class="control">Close Others</span> on the context menu.</li>
+<li>Second, keeping the Alt key pressed, click <img src="images/close1.png"/> on the editor tab.</li>
+</ul>
+ <p class="image">
+ <img src="images/close_others.png"></p>
+</body>
+</html>
diff --git a/python/resources/tips/CodeCompletion.html b/python/resources/tips/CodeCompletion.html
new file mode 100644
index 0000000..351c332
--- /dev/null
+++ b/python/resources/tips/CodeCompletion.html
@@ -0,0 +1,15 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+ <p>
+ The Code Completion feature lets you quickly complete different kinds of statements
+ in the code.
+ For example, start typing a class name and press <span class="shortcut">&shortcut:CodeCompletion;</span>
+ to complete it.
+ When multiple choices are available, they are shown in the lookup list.</p>
+ <p class="image">
+ <img src="images/code_completion.png"></p>
+</body>
+</html>
diff --git a/python/resources/tips/CodeCompletionInSearch.html b/python/resources/tips/CodeCompletionInSearch.html
new file mode 100644
index 0000000..165a588
--- /dev/null
+++ b/python/resources/tips/CodeCompletionInSearch.html
@@ -0,0 +1,17 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>When you are finding text in the current file (<span class="shortcut">&shortcut:Find;</span>), you don't need to type the whole search string:
+ Basic Code Completion is available in the search field. Start typing, press <span class="shortcut">&shortcut:CodeCompletion;</span>, and
+ select the desired string from the suggestion list.</p>
+
+ <p class="image"><img src="images/CodeCompletionInSearch.png"></p>
+
+
+
+</body>
+</html>
diff --git a/python/resources/tips/CodeCompletionMiddle.html b/python/resources/tips/CodeCompletionMiddle.html
new file mode 100644
index 0000000..016a074
--- /dev/null
+++ b/python/resources/tips/CodeCompletionMiddle.html
@@ -0,0 +1,17 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+<p>When using basic code completion (<span class="shortcut">&shortcut:CodeCompletion;</span>),
+type any characters that exist anywhere in an identifier.
+</p>
+
+ <p class="image"><img src="images/code_completion_middle.png"></p>
+
+
+
+</body>
+</html>
diff --git a/python/resources/tips/CodeCompletionNoShift.html b/python/resources/tips/CodeCompletionNoShift.html
new file mode 100644
index 0000000..b9128ec
--- /dev/null
+++ b/python/resources/tips/CodeCompletionNoShift.html
@@ -0,0 +1,16 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+ <p>
+ When using basic code completion (<span class="shortcut">&shortcut:CodeCompletion;</span>),
+ you don't need to type upper-case letters in CamelHump names.
+ It is enough to type the initial letters of the camel names in lower case, and they will be smartly recognized.</p>
+ <p class="image">
+ <img src="images/code_completion_no_shift.png"></p>
+ <p>This behavior is enabled, if <span class="control">None</span> is selected from the
+<span class="control">Case sensitive completion</span> drop-down list (the
+<span class="control">Code Completion</span> page of the Editor settings).
+</body>
+</html>
diff --git a/python/resources/tips/ColorEditingInCss.html b/python/resources/tips/ColorEditingInCss.html
new file mode 100644
index 0000000..cf92ed9
--- /dev/null
+++ b/python/resources/tips/ColorEditingInCss.html
@@ -0,0 +1,19 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p><span class="product">&productName;</span>
+ simplifies your work
+ with colors in CSS files. The <span class="code_emphasis">color</span>
+ properties have the icons of the corresponding color in the left gutter area of the editor.
+ </p>
+ <p>Click color icons to choose the desired color from the color picker.</p>
+ <p class="image"><img src="images/cssColor.png"></p>
+
+
+
+</body>
+</html>
diff --git a/python/resources/tips/ColumnSelection.html b/python/resources/tips/ColumnSelection.html
new file mode 100644
index 0000000..d7bddd0
--- /dev/null
+++ b/python/resources/tips/ColumnSelection.html
@@ -0,0 +1,11 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+<p>You can easily make column selection by dragging your mouse pointer while keeping the
+ <span class="shortcut">Alt</span> key pressed.
+</p>
+<p class="image"><img src="images/columnSelection.png"></p>
+</body>
+</html>
diff --git a/python/resources/tips/Comment.html b/python/resources/tips/Comment.html
new file mode 100644
index 0000000..534d172
--- /dev/null
+++ b/python/resources/tips/Comment.html
@@ -0,0 +1,17 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+ <p>
+ You can comment and uncomment lines of code using <span class="shortcut">&shortcut:CommentByLineComment;</span>.</p>
+ <p>
+ <span class="shortcut">&shortcut:CommentByLineComment;</span> comments or uncomments the current line or
+ several selected lines with single line comments (<span class="code_emphasis">{#</span> in Django templates,
+ or <span class="code_emphasis">#</span> in Python scripts).</p>
+ <p>
+ Pressing <span class="shortcut">&shortcut:CommentByBlockComment;</span> for a selected block of source code
+ in a Django template surrounds the block with <span class="code_emphasis">{% comment %}</span>
+ and <span class="code_emphasis">{% endcomment %}</span> tags.</p>
+</body>
+</html>
diff --git a/python/resources/tips/CommitCtrlK.html b/python/resources/tips/CommitCtrlK.html
new file mode 100644
index 0000000..488a75e
--- /dev/null
+++ b/python/resources/tips/CommitCtrlK.html
@@ -0,0 +1,11 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+ <p>
+ The keyboard shortcut <span class="shortcut">Ctrl+K</span> enables you to quickly invoke the <span class="control">Commit Changes</span> dialog.</p>
+ <p>
+ This dialog shows all modifications in project, gives summary information of file status and suggests improvements before check-in.</p>
+</body>
+</html>
diff --git a/python/resources/tips/CompletionInHTML.html b/python/resources/tips/CompletionInHTML.html
new file mode 100644
index 0000000..3b39387
--- /dev/null
+++ b/python/resources/tips/CompletionInHTML.html
@@ -0,0 +1,17 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>You can use <span class="">Basic Completion</span>
+ (<span class="shortcut">&shortcut:CodeCompletion;</span>) in HTML, CSS and JavaScript files, for completing attributes,
+ parameters, tags, selectors, etc.</p>
+ <p class="image"><img src="images/completion_in_html.png"></p>
+ <p class="image"><img src="images/completion_in_html2.png"></p>
+
+
+
+</body>
+</html>
diff --git a/python/resources/tips/ConfiguringTerminal.html b/python/resources/tips/ConfiguringTerminal.html
new file mode 100644
index 0000000..c393ea6
--- /dev/null
+++ b/python/resources/tips/ConfiguringTerminal.html
@@ -0,0 +1,16 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>For the embedded local terminal, you can define your favorite shell,
+default tab name, and other settings.
+Choose
+<span class="control">File | Settings</span> (Windows/*nix) or
+<span class="control">PyCharm | Preferences</span> (Mac)
+on the main menu, and then open the page <span class="control">Terminal</span>. </p>
+
+</body>
+</html>
diff --git a/python/resources/tips/Consoles.html b/python/resources/tips/Consoles.html
new file mode 100644
index 0000000..1514b6e
--- /dev/null
+++ b/python/resources/tips/Consoles.html
@@ -0,0 +1,11 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+ <p>
+ You can work in the Python or Django shell without leaving the IDE.
+ Just choose <span class="control">Run Python Console</span> or <span class="control">Run Django Console</span>
+ in the <span class="control">Tools</span> menu.</p>
+</body>
+</html>
\ No newline at end of file
diff --git a/python/resources/tips/ConsolesCodeCompletion.html b/python/resources/tips/ConsolesCodeCompletion.html
new file mode 100644
index 0000000..8c4cbb3
--- /dev/null
+++ b/python/resources/tips/ConsolesCodeCompletion.html
@@ -0,0 +1,14 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+ <p>
+ Working in the interactive consoles, you don't need to memorise the command line syntax or available functions.
+ Instead, you can use the familiar code completion <span class="shortcut">&shortcut:CodeCompletion;</span>.
+ Moreover, from within the lookup list, you can press <span class="shortcut">&shortcut:QuickJavaDoc;</span>
+ to view the item's documentation.</p>
+ <p class="image">
+ <img src="images/pyconsole.png"></p>
+</body>
+</html>
\ No newline at end of file
diff --git a/python/resources/tips/ConsolesHistory.html b/python/resources/tips/ConsolesHistory.html
new file mode 100644
index 0000000..8fe19a5
--- /dev/null
+++ b/python/resources/tips/ConsolesHistory.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+ <p>
+ If you have already spent some time working in the interactive consoles,
+ you don't need to re-type the previously entered commands to repeat them.
+ Instead, press <span class="shortcut">&shortcut:EditorScrollUp;</span> and
+ <span class="shortcut">&shortcut:EditorScrollDown;</span> to scroll through
+ the history of commands.</p>
+</body>
+</html>
diff --git a/python/resources/tips/CopyWithNoSelection.html b/python/resources/tips/CopyWithNoSelection.html
new file mode 100644
index 0000000..d7321e4
--- /dev/null
+++ b/python/resources/tips/CopyWithNoSelection.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+<p>
+If nothing is selected in the editor, and you press <span class="shortcut">&shortcut:$Copy;</span>, then the whole line at caret is copied to the clipboard.
+</p>
+
+</body>
+</html>
diff --git a/python/resources/tips/CtrlD.html b/python/resources/tips/CtrlD.html
new file mode 100644
index 0000000..5b676b8
--- /dev/null
+++ b/python/resources/tips/CtrlD.html
@@ -0,0 +1,14 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p><span class="shortcut">&shortcut:EditorDuplicate;</span> in the editor duplicates the selected block or the current line
+ when no block is selected.</p>
+
+
+
+</body>
+</html>
diff --git a/python/resources/tips/CtrlDotInLookups.html b/python/resources/tips/CtrlDotInLookups.html
new file mode 100644
index 0000000..9cc5b37
--- /dev/null
+++ b/python/resources/tips/CtrlDotInLookups.html
@@ -0,0 +1,15 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>
+ When using autopopup Code Completion, you can select the first item using <span class="shortcut">&shortcut:EditorChooseLookupItemDot;</span>.
+ The selected name is automatically entered in the editor followed by dot.</p>
+
+
+
+</body>
+</html>
diff --git a/python/resources/tips/CtrlShiftI.html b/python/resources/tips/CtrlShiftI.html
new file mode 100644
index 0000000..59f9dd5
--- /dev/null
+++ b/python/resources/tips/CtrlShiftI.html
@@ -0,0 +1,17 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>Use <span class="shortcut">&shortcut:QuickImplementations;</span>
+ (<span class="control">View | Quick Definition</span>),
+ to quickly review definition or content of the symbol at caret, without the need to open it
+ in a new editor tab.</p>
+ <p class="image"><img src="images/ctrl_shift_i.png"></p>
+
+
+
+</body>
+</html>
diff --git a/python/resources/tips/CtrlShiftIForLookup.html b/python/resources/tips/CtrlShiftIForLookup.html
new file mode 100644
index 0000000..9a78331
--- /dev/null
+++ b/python/resources/tips/CtrlShiftIForLookup.html
@@ -0,0 +1,16 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>The <span class="emphasis">Quick Definition Viewer</span>
+ (<span class="shortcut">&shortcut:QuickImplementations;</span>) can be also used for items in lookup lists that appear on code
+ completion and class/file/symbol navigaton commands.</p>
+ <p class="image"><img src="images/ctrl_shift_in_lookup.png"></p>
+
+
+
+</body>
+</html>
\ No newline at end of file
diff --git a/python/resources/tips/CtrlW.html b/python/resources/tips/CtrlW.html
new file mode 100644
index 0000000..b4e609c
--- /dev/null
+++ b/python/resources/tips/CtrlW.html
@@ -0,0 +1,15 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p><span class="shortcut">&shortcut:EditorSelectWord;</span> (select word) in the editor selects the word at the caret
+ and then selects expanding areas of the source code. For example, it may select a method name,
+ then the expression that calls this method, then the whole statement, then the containing block, etc.
+ You can also select the word at the caret and the expanding areas of the source code by double-clicking the target areas in the editor. </p>
+
+
+</body>
+</html>
diff --git a/python/resources/tips/DirDiff.html b/python/resources/tips/DirDiff.html
new file mode 100644
index 0000000..b03166b
--- /dev/null
+++ b/python/resources/tips/DirDiff.html
@@ -0,0 +1,10 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+ <p>
+ To compare two directories, select one or both of them in the <span class="control">Project</span> view and
+ press <span class="shortcut">&shortcut:CompareDirs;</span>.</p>
+</body>
+</html>
\ No newline at end of file
diff --git a/python/resources/tips/DotEtcInLookups.html b/python/resources/tips/DotEtcInLookups.html
new file mode 100644
index 0000000..149bbaa
--- /dev/null
+++ b/python/resources/tips/DotEtcInLookups.html
@@ -0,0 +1,18 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>
+ When using Code Completion, you can accept the currently highlighted selection in the popup list
+ with the period character (<span class="code_emphasis">.</span>), comma (<span class="code_emphasis">,</span>),
+ semicolon (<span class="code_emphasis">;</span>), space and other characters.</p>
+ <p>
+ The selected name is automatically entered in the editor followed by the entered character.</p>
+
+
+
+</body>
+</html>
diff --git a/python/resources/tips/DragToOpen.html b/python/resources/tips/DragToOpen.html
new file mode 100644
index 0000000..6d788ae
--- /dev/null
+++ b/python/resources/tips/DragToOpen.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+<p>You can easily open an external file for editing, if you just drag it from the Explorer or Finder to the editor.</p>
+
+
+<p class="image"><img src="images/dragToOpen.png"></p>
+
+</body>
+</html>
diff --git a/python/resources/tips/EditRegExp.html b/python/resources/tips/EditRegExp.html
new file mode 100644
index 0000000..6a14a46
--- /dev/null
+++ b/python/resources/tips/EditRegExp.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+<p>You can avoid escaping backslashes in your regular expressions. Start typing a regular expression, then press <span class="shortcut">&shortcut:ShowIntentionActions;</span> and choose <span class="control">Edit RegExp</span>.
+The regular expression opens in a separate tab in the editor, where you can type backslashes as is.</p>
+<p>All changes are synchronized with the original regular expression, and escapes are presented automatically. When ready, just press <span class="shortcut">&shortcut:EditorEscape;</span> to close the regular expression editor.</p>
+<p class="image"><img src="images/editregexp.png"><p>
+
+</body>
+</html>
diff --git a/python/resources/tips/Emmet.html b/python/resources/tips/Emmet.html
new file mode 100644
index 0000000..6dcec74
--- /dev/null
+++ b/python/resources/tips/Emmet.html
@@ -0,0 +1,11 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+ <p>Speed up HTML, XML or CSS development with <span class="control">Emmet</span>.</p>
+ <p>Enable this framework in the <span class="control">Emmet(Zen Coding)</span> page of the <span class="control">Settings</span>/<span class="control">Preferences</span> dialog:</p>
+ <p class="image">
+ <img src="images/emmet.png"></p>
+</body>
+</html>
\ No newline at end of file
diff --git a/python/resources/tips/EnterDirectoryInGotoFile.html b/python/resources/tips/EnterDirectoryInGotoFile.html
new file mode 100644
index 0000000..71704d4
--- /dev/null
+++ b/python/resources/tips/EnterDirectoryInGotoFile.html
@@ -0,0 +1,17 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+<p>You can jump directly to any deeply buried file, if you press <span class="shortcut">&shortcut:GotoFile;</span>, and type just a couple
+of characters of the enclosing directories and file names: </p>
+
+ <p class="image"><img src="images/enterDirectory.png"></p>
+
+<p>Use either a slash or a backslash as a delimiter.</p>
+
+
+</body>
+</html>
\ No newline at end of file
diff --git a/python/resources/tips/Escape.html b/python/resources/tips/Escape.html
new file mode 100644
index 0000000..949dec6
--- /dev/null
+++ b/python/resources/tips/Escape.html
@@ -0,0 +1,15 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>The <span class="shortcut">&shortcut:EditorEscape;</span> key in any tool window moves the focus to the editor.</p>
+ <p><span class="shortcut">&shortcut:HideActiveWindow;</span> moves the focus to the editor and also hides the current (or last active) tool window.</p>
+ <p>The <span class="shortcut">&shortcut:JumpToLastWindow;</span> key moves the focus from the editor to the last focused tool window.</p>
+
+
+
+</body>
+</html>
diff --git a/python/resources/tips/EvaluateExpressionInEditor.html b/python/resources/tips/EvaluateExpressionInEditor.html
new file mode 100644
index 0000000..09917ef
--- /dev/null
+++ b/python/resources/tips/EvaluateExpressionInEditor.html
@@ -0,0 +1,15 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>To easily evaluate the value of any expression while debugging the program, select its text in the editor
+ (you might want to press a <span class="shortcut">&shortcut:EditorSelectWord;</span> a few times to efficiently perform this operation)
+ and then press <span class="shortcut">&shortcut:EvaluateExpression;</span>.</p>
+
+
+
+</body>
+</html>
diff --git a/python/resources/tips/ExcludeFromProject.html b/python/resources/tips/ExcludeFromProject.html
new file mode 100644
index 0000000..ec9f433
--- /dev/null
+++ b/python/resources/tips/ExcludeFromProject.html
@@ -0,0 +1,15 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+ <p>
+ You can exclude any file from your project. As a result, such a file will be ignored by indexing, inspection and code completion.</p>
+ <p>
+ In the <span class="control">Project</span> tool window, select the file you want to ignore, and choose
+ <span class="control">Mark as plain text</span> in its context menu.</p>
+ <p>
+ If necessary, you can always return the file to its original type using the
+ <span class="control">Mark as <file type></span> context menu command.</p>
+</body>
+</html>
diff --git a/python/resources/tips/ExtractVariable.html b/python/resources/tips/ExtractVariable.html
new file mode 100644
index 0000000..06ce96f
--- /dev/null
+++ b/python/resources/tips/ExtractVariable.html
@@ -0,0 +1,19 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>The Extract Variable
+ refactoring helps you simplify complicated statements in your code. For example, in the code fragment below,
+ you can select an expression in the code, and press <span class="shortcut">&shortcut:IntroduceVariable;</span> (<span class="control">Refactor | Extract | Variable</span>).</p>
+ <p>
+ <p class="image"><img src="images/extract_variable_1.png"></p>
+ This will result in the following:</p>
+ <p class="image"><img src="images/extract_variable_2.png"></p>
+
+
+
+</body>
+</html>
diff --git a/python/resources/tips/FileStructurePopup.html b/python/resources/tips/FileStructurePopup.html
new file mode 100644
index 0000000..f0f94c6
--- /dev/null
+++ b/python/resources/tips/FileStructurePopup.html
@@ -0,0 +1,17 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>You can quickly navigate in the currently edited file with <span class="shortcut">&shortcut:FileStructurePopup;</span>
+ (<span class="control">Navigate | File Structure</span>).</p>
+ <p>It shows the list of members of the current class. Select an element you want to navigate to and press the
+ <span class="shortcut">Enter</span> key or the <span class="shortcut">&shortcut:EditSource;</span> key.</p>
+ <p>To easily locate an item in the list, just start typing its name.</p>
+
+
+
+</body>
+</html>
diff --git a/python/resources/tips/FindReplaceToggle.html b/python/resources/tips/FindReplaceToggle.html
new file mode 100644
index 0000000..60d7b31
--- /dev/null
+++ b/python/resources/tips/FindReplaceToggle.html
@@ -0,0 +1,17 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+ <p>It is very easy to toggle between find and replace functionality.</p>
+<p>When you perform search and replace in a file, pressing <span class="shortcut">&shortcut:Find;</span>
+shows the search pane. Pressing <span class="shortcut">&shortcut:Replace;</span> adds field, where you can type the replace string.</p>
+
+ <p>While in the <span class="control">Find in Path</span> dialog, you can switch to
+replace by pressing <span class="shortcut">&shortcut:ReplaceInPath;</span>. Same way, press <span class="shortcut">&shortcut:FindInPath;</span> to hide the
+<span class="control">Replace with</span> field, and switch to mere search.</p>
+
+
+</body>
+</html>
diff --git a/python/resources/tips/FindUsages.html b/python/resources/tips/FindUsages.html
new file mode 100644
index 0000000..a716213
--- /dev/null
+++ b/python/resources/tips/FindUsages.html
@@ -0,0 +1,12 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+ <p>
+ You can quickly find all places where a particular class, method or variable is used in the whole project
+ by positioning the caret at the symbol's name or at its usage in code and pressing <span class="shortcut">&shortcut:FindUsages;</span>
+ (<span class="control">Find Usages</span>
+ in the popup menu).</p>
+</body>
+</html>
diff --git a/python/resources/tips/FinishByControlEnter.html b/python/resources/tips/FinishByControlEnter.html
new file mode 100644
index 0000000..28a907d
--- /dev/null
+++ b/python/resources/tips/FinishByControlEnter.html
@@ -0,0 +1,10 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+ <p>
+ <span class="shortcut">&shortcut:EditorChooseLookupItemAlways;</span> will
+choose the first item of the autopopup completion when there is no selection there.</p>
+</body>
+</html>
diff --git a/python/resources/tips/GoToAction.html b/python/resources/tips/GoToAction.html
new file mode 100644
index 0000000..89a93e9
--- /dev/null
+++ b/python/resources/tips/GoToAction.html
@@ -0,0 +1,16 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>To quickly find a menu command or toolbar action, you do not need to look through the menus. Just press
+ <span class="shortcut">&shortcut:GotoAction;</span>
+ (<span class="control">Help | Find Action</span> on the main
+ menu) and start typing the name of the action. Choose the desired action from the suggestion list.</p>
+
+
+
+</body>
+</html>
diff --git a/python/resources/tips/GoToClass.html b/python/resources/tips/GoToClass.html
new file mode 100644
index 0000000..2cdf5eb
--- /dev/null
+++ b/python/resources/tips/GoToClass.html
@@ -0,0 +1,16 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+ <p>
+ To open any class in the editor quickly, press <span class="shortcut">&shortcut:GotoClass;</span>
+ (<span class="control">Navigate | Class</span>)
+ and start typing the name of the class. Choose the class from a drop-down list that appears.</p>
+ <p class="image">
+ <img src="images/goto_class.png"></p>
+ <p>
+ You can open any file in your project in a similar way by using <span class="shortcut">&shortcut:GotoFile;</span>
+ (<span class="control">Navigate | File</span>)</p>
+</body>
+</html>
diff --git a/python/resources/tips/GoToDeclaration.html b/python/resources/tips/GoToDeclaration.html
new file mode 100644
index 0000000..7db07bb
--- /dev/null
+++ b/python/resources/tips/GoToDeclaration.html
@@ -0,0 +1,17 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>To navigate to the declaration of a class, method or variable used somewhere in the code,
+ position the caret at the usage and press <span class="shortcut">&shortcut:GotoDeclaration;</span>. You can also click the mouse
+ on usages with the <span class="shortcut">Ctrl</span>
+ key pressed to jump to declarations.</p>
+ <p class="image"><img src="images/ctrl_click.png"></p>
+
+
+
+</body>
+</html>
diff --git a/python/resources/tips/GoToInspection.html b/python/resources/tips/GoToInspection.html
new file mode 100644
index 0000000..dabb6ef
--- /dev/null
+++ b/python/resources/tips/GoToInspection.html
@@ -0,0 +1,16 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>To quickly find and run an inspection, press
+ <span class="shortcut">&shortcut:RunInspection;</span>
+ and start typing the name of the inspection or its group. Choose the desired inspection from the suggestion list and
+ then specify the desired scope.</p>
+
+
+
+</body>
+</html>
diff --git a/python/resources/tips/GoToSymbol.html b/python/resources/tips/GoToSymbol.html
new file mode 100644
index 0000000..85d099f
--- /dev/null
+++ b/python/resources/tips/GoToSymbol.html
@@ -0,0 +1,17 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>To open any particular method or field in the editor quickly, press <span class="shortcut">&shortcut:GotoSymbol;</span>
+ (<span class="control">Navigate | Symbol</span>)
+ and start typing its name.</p>
+ <p>Choose symbol from the drop-down list that appears.</p>
+ <p class="image"><img src="images/goto_symbol.png"></p>
+
+
+
+</body>
+</html>
diff --git a/python/resources/tips/GotoLineInFile.html b/python/resources/tips/GotoLineInFile.html
new file mode 100644
index 0000000..cc44b74
--- /dev/null
+++ b/python/resources/tips/GotoLineInFile.html
@@ -0,0 +1,16 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+ <p>
+ To open any class or file in the editor at the desired line, press <span class="shortcut">&shortcut:GotoFile;</span>
+ (<span class="control">Navigate | File</span>),
+ start typing the name, and choose the one from the suggestion list.
+ Then type the colon (<span class="code_emphasis">:</span>) and a line number.</p>
+ <p>
+ The selected file will open with the caret at the specified line.</p>
+ <p class="image">
+ <img src="images/gotoFileLineNumber.png"></p>
+</body>
+</html>
diff --git a/python/resources/tips/HierarchyBrowser.html b/python/resources/tips/HierarchyBrowser.html
new file mode 100644
index 0000000..3fd2fc9
--- /dev/null
+++ b/python/resources/tips/HierarchyBrowser.html
@@ -0,0 +1,15 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+ <p>
+ To see the inheritance hierarchy for a selected class,
+ press <span class="shortcut">&shortcut:TypeHierarchy;</span>
+ (<span class="control" >Navigate | Type Hierarchy</span>).
+ You can also invoke the hierarchy view right from the editor
+ to see the hierarchy for the currently edited class.</p>
+ <p class="image">
+ <img src="images/hierarchy_browser.png"></p>
+</body>
+</html>
diff --git a/python/resources/tips/HighlightUsagesInFile.html b/python/resources/tips/HighlightUsagesInFile.html
new file mode 100644
index 0000000..ea31613
--- /dev/null
+++ b/python/resources/tips/HighlightUsagesInFile.html
@@ -0,0 +1,16 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>Use <span class="shortcut">&shortcut:HighlightUsagesInFile;</span> (<span class="control">Edit | Find | Highlight Usages in File</span>)
+ to quickly highlight usages of some variable in the current file.</p>
+ <p>Use <span class="shortcut">&shortcut:FindNext;</span> and <span class="shortcut">&shortcut:FindPrevious;</span> keys to navigate through highlighted usages.</p>
+ <p>Press <span class="shortcut">&shortcut:EditorEscape;</span> to remove highlighting.</p>
+
+
+
+</body>
+</html>
diff --git a/python/resources/tips/HorizontalScrolling.html b/python/resources/tips/HorizontalScrolling.html
new file mode 100644
index 0000000..f70b0cd
--- /dev/null
+++ b/python/resources/tips/HorizontalScrolling.html
@@ -0,0 +1,10 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+ <p>
+ Enable the horizontal scrolling with the mouse wheel by holding
+ the <span class="shortcut">Shift</span> key.</p>
+</body>
+</html>
\ No newline at end of file
diff --git a/python/resources/tips/ImageFileCompletion.html b/python/resources/tips/ImageFileCompletion.html
new file mode 100644
index 0000000..cc6a529
--- /dev/null
+++ b/python/resources/tips/ImageFileCompletion.html
@@ -0,0 +1,15 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>Use <span class="">Basic Completion</span>
+ (<span class="shortcut">&shortcut:CodeCompletion;</span>) within HTML, CSS and other files, for completing image file names.</p>
+ <p class="image"><img src="images/image_completion.png"></p>
+
+
+
+</body>
+</html>
diff --git a/python/resources/tips/ImagesLookup.html b/python/resources/tips/ImagesLookup.html
new file mode 100644
index 0000000..cad3862
--- /dev/null
+++ b/python/resources/tips/ImagesLookup.html
@@ -0,0 +1,16 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>You can quickly view the image referenced at caret by using the
+ <span class="">Quick Definition</span>
+ (<span class="shortcut">&shortcut:QuickImplementations;</span>). The underlying image will be opened in a popup instead of a separate editor tab.</p>
+ <p class="image"><img src="images/image_lookup.png"></p>
+
+
+
+</body>
+</html>
diff --git a/python/resources/tips/Interpreter.html b/python/resources/tips/Interpreter.html
new file mode 100644
index 0000000..3bc9c18
--- /dev/null
+++ b/python/resources/tips/Interpreter.html
@@ -0,0 +1,12 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+ <p>PyCharm allows configuring Python interpreters on the various stages of development: </p>
+<ul>
+<li>When a project is only being created (<span class="control">File | New Project</span>, or <span class="control">Create New Project</span> on the Welcome screen).</li>
+<li>In an already existing project (<span class="control">File | Settings - Python Interpreters</span>).</li>
+</ul>
+</body>
+</html>
diff --git a/python/resources/tips/IssueNavigation.html b/python/resources/tips/IssueNavigation.html
new file mode 100644
index 0000000..8f1bc7d
--- /dev/null
+++ b/python/resources/tips/IssueNavigation.html
@@ -0,0 +1,22 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+
+ <p>&productName; lets you jump from your check-in comment to an issue in your task tracker.</p>
+ <p>All you have to do is to define issue navigation patterns on the
+ <span class="control">Version Control</span> page of the <span class="control">Settings</span>/<span class="control">Preferences</span>
+ dialog:</p>
+ <p class="image"><img src="images/issueNavigation1.png"></p>
+ <p>When you commit a changelist, and type the check-in comment, make sure it matches one of your issue navigation patterns.
+ Later, when you browse through the changelists in the repository, such comments turn into hyperlinks:</p>
+ <p class="image"><img src="images/issueNavigation.png"></p>
+ <p>Clicking a hyperlink brings you directly to an issue in your task tracker.</p>
+
+
+
+</body>
+</html>
\ No newline at end of file
diff --git a/python/resources/tips/JoinLines.html b/python/resources/tips/JoinLines.html
new file mode 100644
index 0000000..144035d
--- /dev/null
+++ b/python/resources/tips/JoinLines.html
@@ -0,0 +1,10 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+ <p>
+ The <span class="shortcut">&shortcut:EditorJoinLines;</span> shortcut joins two lines
+ into one and removes unnecessary spaces to match your code style.</p>
+</body>
+</html>
diff --git a/python/resources/tips/JumpToLastEdit.html b/python/resources/tips/JumpToLastEdit.html
new file mode 100644
index 0000000..1438812
--- /dev/null
+++ b/python/resources/tips/JumpToLastEdit.html
@@ -0,0 +1,15 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p><span class="shortcut">&shortcut:JumpToLastChange;</span> (<span class="control">Navigate | Last Edit Location</span>)
+ brings you back to the last place where you made changes in the code.</p>
+ <p>Pressing <span class="shortcut">&shortcut:JumpToLastChange;</span> a few times moves you deeper into your changes history.</p>
+
+
+
+</body>
+</html>
diff --git a/python/resources/tips/LaunchConsole.html b/python/resources/tips/LaunchConsole.html
new file mode 100644
index 0000000..5b2213c
--- /dev/null
+++ b/python/resources/tips/LaunchConsole.html
@@ -0,0 +1,15 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+ <p>
+ While debugging, you might need an interactive console at hand... This is most easy.
+During the debugging session, switch to the Debugger Console,
+and then press the very lowest button in its toolbar.
+</p>
+<p>The console becomes interactive, and shows a prompt, where you can enter commands, and view output.</p>
+ <p class="image"><img src="images/launch_console_in_debugger.png" alt="launch_console_in_debugger"/></p>
+
+</body>
+</html>
diff --git a/python/resources/tips/LineEndings.html b/python/resources/tips/LineEndings.html
new file mode 100644
index 0000000..162eb9b
--- /dev/null
+++ b/python/resources/tips/LineEndings.html
@@ -0,0 +1,12 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+ <p>To view which line separators style is used in the current file,
+look at the <span class="control">Status Bar</span>:</p>
+ <img src="images/line_separator.png">
+</p>
+ <p>To change the current line ending style, just click the spinner.</p>
+</body>
+</html>
\ No newline at end of file
diff --git a/python/resources/tips/LineEndingsFolder.html b/python/resources/tips/LineEndingsFolder.html
new file mode 100644
index 0000000..a782480
--- /dev/null
+++ b/python/resources/tips/LineEndingsFolder.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+ <p>You do not need to open a file in the editor to change its line separator style.
+Use the <span class="control">Project tool window</span> instead: select one or more files,
+or folders, point to <span class="control">File | Line Separators</span> on the main menu,
+and then choose the desired line ending style.</p>
+<p>For a directory, new line separator applies recursively.</p>
+ <img src="images/line_separator_folder.png"></p>
+</body>
+</html>
\ No newline at end of file
diff --git a/python/resources/tips/LiveTemplates.html b/python/resources/tips/LiveTemplates.html
new file mode 100644
index 0000000..be1d10b
--- /dev/null
+++ b/python/resources/tips/LiveTemplates.html
@@ -0,0 +1,20 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+ <p>
+ Live Templates let you generate many typical code constructs in seconds. For example, type
+ <i>for</i> in a Django template</p>
+ <p class="image">
+ <img src="images/live_templates_1.png"></p>
+ <p>
+ and then press the <span class="shortcut">Tab</span> key to see what happens.</p>
+ <p class="image">
+ <img src="images/live_templates_2.png"></p>
+ <p>
+ Use the <span class="shortcut">Tab</span> key to move between the template fields.</p>
+ <p> See <span class="control">Live Templates</span> page of the <span class="control">Settings / Preferences</span>
+dialog for more details.</p>
+</body>
+</html>
diff --git a/python/resources/tips/LiveTemplatesDjango.html b/python/resources/tips/LiveTemplatesDjango.html
new file mode 100644
index 0000000..4bd3fa7
--- /dev/null
+++ b/python/resources/tips/LiveTemplatesDjango.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+ <p>If you are going to use Django live templates, make sure that Django is selected
+as the default Python template language in the Settings / Preferences dialog:
+</p>
+ <p class="image">
+ <img src="images/default_template_language.png"></p>
+
+</body>
+</html>
diff --git a/python/resources/tips/LocalVCS.html b/python/resources/tips/LocalVCS.html
new file mode 100644
index 0000000..28811c1
--- /dev/null
+++ b/python/resources/tips/LocalVCS.html
@@ -0,0 +1,16 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>To see your local history of changes in a file, invoke
+ <span class="control">Local History | Show History</span>
+ from the context menu. You can navigate through different file versions, see the differences and roll back to any previous version.</p>
+ <p>Use the same context menu item to see the history of changes on a directory. You will never lose any code with this feature!</p>
+
+
+
+</body>
+</html>
diff --git a/python/resources/tips/Managepy.html b/python/resources/tips/Managepy.html
new file mode 100644
index 0000000..ca9250e
--- /dev/null
+++ b/python/resources/tips/Managepy.html
@@ -0,0 +1,18 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+ <p>
+ The easiest way to run a utility of the <span class="code_emphasis">manage.py</span> task is to
+ choose <span class="control">Run manage.py Task</span> in the
+ <span class="control">Tools</span> menu, or press <span class="shortcut">&shortcut:Django.RunManageTaskAction;</span>.</p>
+ <p>
+ As you type the name of the utility you want to run, the lookup list shrinks
+ to show the matching entries only.</p>
+ <p>
+ If you type an asterisk, PyCharm will show the complete list of all the available tasks.</p>
+ <p class="image">
+ <img src="images/managepy.png"></p>
+</body>
+</html>
diff --git a/python/resources/tips/MenuItemsDescriptions.html b/python/resources/tips/MenuItemsDescriptions.html
new file mode 100644
index 0000000..1739124
--- /dev/null
+++ b/python/resources/tips/MenuItemsDescriptions.html
@@ -0,0 +1,14 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>To help you learn the purpose of each item in the main menu, its short description is shown in the status
+ bar at the bottom of the application frame when you position the mouse pointer over this item.</p>
+
+
+
+</body>
+</html>
diff --git a/python/resources/tips/MethodSeparators.html b/python/resources/tips/MethodSeparators.html
new file mode 100644
index 0000000..1ce1b03
--- /dev/null
+++ b/python/resources/tips/MethodSeparators.html
@@ -0,0 +1,16 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>To show separator lines between methods in the editor, open the editor settings
+ and select the <span class="control">Show method separators</span> check box in the
+ <span class="control">Appearance</span> page.</p>
+
+ <p class="image"><img src="images/method_separator.png"></p>
+
+
+</body>
+</html>
diff --git a/python/resources/tips/MethodUpDown.html b/python/resources/tips/MethodUpDown.html
new file mode 100644
index 0000000..0bf39a2
--- /dev/null
+++ b/python/resources/tips/MethodUpDown.html
@@ -0,0 +1,12 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>Use <span class="shortcut">&shortcut:MethodUp;</span> and <span class="shortcut">&shortcut:MethodDown;</span> keys to quickly move between methods in the editor.</p>
+
+
+</body>
+</html>
diff --git a/python/resources/tips/MoveToChangelist.html b/python/resources/tips/MoveToChangelist.html
new file mode 100644
index 0000000..440cc9c
--- /dev/null
+++ b/python/resources/tips/MoveToChangelist.html
@@ -0,0 +1,17 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+
+ <p>If you don't want to commit some of your changes to the repository, you can set them aside for a while, by moving
+ to a separate changelist, or by putting them to a shelf. Select such file in the <span class="control">Local</span> tab of the <span class="control">Changes</span> tool
+ window, and on the context menu choose <span class="control">Move to another changelist</span>,
+ or <span class="control">Shelve Changes</span>.</p>
+
+
+
+</body>
+</html>
diff --git a/python/resources/tips/MoveUpDown.html b/python/resources/tips/MoveUpDown.html
new file mode 100644
index 0000000..0575c20
--- /dev/null
+++ b/python/resources/tips/MoveUpDown.html
@@ -0,0 +1,28 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+ <p>
+ The <span class="control">Code | Move Statement Up/Down</span> action is useful for reorganizing the code lines
+ in your file, e.g., for bringing a variable declaration closer to the variable usage.</p>
+ <p>
+ For example, select a code fragment and press <span class="shortcut">&shortcut:MoveStatementUp;</span> or
+ <span class="shortcut">&shortcut:MoveStatementDown;</span>.</p>
+ <p>
+ Before:</p>
+ <p class="image">
+ <img src="images/move_up_down_witharrows_initial.png"></p>
+ <p>
+ After moving the lines up:</p>
+ <p class="image">
+ <img src="images/move_up_down_witharrows_up.png" alt=""></p>
+ <p>
+ After moving the lines down:</p>
+ <p class="image">
+ <img src="images/move_up_down_witharrows_down.png" alt=""></p>
+ <p>
+ When there is no selection, the line at the cursor will be moved.</p>
+</body>
+</html>
+
diff --git a/python/resources/tips/MultipleProjects.html b/python/resources/tips/MultipleProjects.html
new file mode 100644
index 0000000..2efdd08
--- /dev/null
+++ b/python/resources/tips/MultipleProjects.html
@@ -0,0 +1,16 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p><span class="product">&productName;</span> can work with several projects in one window.
+To open a project in the same window with the already opened one, choose
+<span class="control">Open directory</span>, then in the <span class="control">Open project</span>
+dialog box, select the option
+<span class="control">Open in current window</span>, and select the check box
+<span class="control">Add to currently opened projects</span>.</p>
+
+</body>
+</html>
diff --git a/python/resources/tips/NavBar.html b/python/resources/tips/NavBar.html
new file mode 100644
index 0000000..2029dc9
--- /dev/null
+++ b/python/resources/tips/NavBar.html
@@ -0,0 +1,15 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>Navigation bar is a quick alternative to the <span class="control">Project</span> view.</p>
+<p>Use <span class="shortcut">&shortcut:ShowNavBar;</span> keyboard shortcut to show the navigation bar, and arrow keys to locate the necessary files or folders.</p>
+
+
+
+ <p class="image"><img src="images/navigationbar.png"></p>
+</body>
+</html>
diff --git a/python/resources/tips/NavigateToFilePath.html b/python/resources/tips/NavigateToFilePath.html
new file mode 100644
index 0000000..0df5aa5
--- /dev/null
+++ b/python/resources/tips/NavigateToFilePath.html
@@ -0,0 +1,16 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p><span class="shortcut">Ctrl+Click</span> (on Windows) or <span class="shortcut">Cmd+Click</span> (on MacOS) a tab in the editor to navigate to any part of the file path.
+Select the necessary element in the drop-down, and the corresponding file path opens in an external browser
+(e.g., in the Explorer, if your OS is Windows).</p>
+ <p class="image"><img src="images/navigateToFilePath.png"></p>
+
+
+
+</body>
+</html>
\ No newline at end of file
diff --git a/python/resources/tips/OverrideImplementMethods.html b/python/resources/tips/OverrideImplementMethods.html
new file mode 100644
index 0000000..f9a4ecb
--- /dev/null
+++ b/python/resources/tips/OverrideImplementMethods.html
@@ -0,0 +1,12 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+ <p>
+ You can easily override the methods of the base class by pressing
+ <span class="shortcut">&shortcut:OverrideMethods;</span> (<span class="control">Code | Override Methods</span>).</p>
+ <p class="image">
+ <img src="images/override_methods.png"></p>
+</body>
+</html>
diff --git a/python/resources/tips/ParameterInfo.html b/python/resources/tips/ParameterInfo.html
new file mode 100644
index 0000000..3cc6ab8
--- /dev/null
+++ b/python/resources/tips/ParameterInfo.html
@@ -0,0 +1,17 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>If the cursor is between the parentheses of a method call, pressing <span class="shortcut">&shortcut:ParameterInfo;</span> brings up
+ a list of valid parameters.</p>
+ <p class="image"><img src="images/param_info.png"></p>
+
+
+
+</body>
+</html>
+
+
diff --git a/python/resources/tips/PreviewTODO.html b/python/resources/tips/PreviewTODO.html
new file mode 100644
index 0000000..c7c9c2a
--- /dev/null
+++ b/python/resources/tips/PreviewTODO.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+<p><span class="control">TODO</span> tool window lets you preview each of the
+encountered TODO items – just click the preview button on the toolbar.</p>
+<p></p>
+<p class="image"><img src="images/todo_preview.png"><p>
+
+</body>
+</html>
diff --git a/python/resources/tips/PyColorFiles.html b/python/resources/tips/PyColorFiles.html
new file mode 100644
index 0000000..4ac26ed
--- /dev/null
+++ b/python/resources/tips/PyColorFiles.html
@@ -0,0 +1,15 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+ <p>
+ You don't need to guess which <span class="code_emphasis">__init__.py</span> or
+ <span class="code_emphasis">views.py</span> you are looking at...</p>
+ <p>
+ Make the editor tabs and the lines in navigation lists stand out
+ using the <span class="control">File Colors</span> page of the project settings.</p>
+ <p class="image">
+ <img src="images/pyColoredFiles.png"></p>
+</body>
+</html>
diff --git a/python/resources/tips/QuickFixRightArrow.html b/python/resources/tips/QuickFixRightArrow.html
new file mode 100644
index 0000000..04a9373
--- /dev/null
+++ b/python/resources/tips/QuickFixRightArrow.html
@@ -0,0 +1,17 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>When you press <span class="shortcut">&shortcut:ShowIntentionActions;</span> to invoke a quick fix or intention action,
+ press the right arrow key to reveal the list of additional options.</p>
+ <p>Depending on the context, you can choose to disable inspection, fix all problems,
+ change inspection profile, etc.</p>
+ <p class="image"><img src="images/quick_fix_options.png" alt="qfo"/></p>
+
+
+
+</body>
+</html>
diff --git a/python/resources/tips/QuickJavaDoc.html b/python/resources/tips/QuickJavaDoc.html
new file mode 100644
index 0000000..5bceb1a
--- /dev/null
+++ b/python/resources/tips/QuickJavaDoc.html
@@ -0,0 +1,12 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+ <p>
+ To quickly see the documentation for the symbol at caret, press <span class="shortcut">&shortcut:QuickJavaDoc;</span>
+ (<span class="control">View | Quick Documentation</span>).</p>
+ <p class="image">
+ <img src="images/quick_javadoc.png"></p>
+</body>
+</html>
diff --git a/python/resources/tips/QuickJavaDocInLookups.html b/python/resources/tips/QuickJavaDocInLookups.html
new file mode 100644
index 0000000..b2c2329
--- /dev/null
+++ b/python/resources/tips/QuickJavaDocInLookups.html
@@ -0,0 +1,18 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>The shortcuts such as <span class="shortcut">&shortcut:QuickJavaDoc;</span>
+ (<span class="control">View | Quick Documentation</span>),
+ <span class="shortcut">&shortcut:ParameterInfo;</span> (<span class="control">View | Parameter Info</span>),
+ <span class="shortcut">&shortcut:GotoDeclaration;</span> (<span class="control">Navigate | Declaration</span>)
+ and others can be used not only in the editor but in the code completion popup list as well.</p>
+ <p class="image"><img src="images/quick_javadoc_in_lookups.png"></p>
+
+
+
+</body>
+</html>
diff --git a/python/resources/tips/QuickSwitchScheme.html b/python/resources/tips/QuickSwitchScheme.html
new file mode 100644
index 0000000..0d93599
--- /dev/null
+++ b/python/resources/tips/QuickSwitchScheme.html
@@ -0,0 +1,17 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>With a single keystroke, you can apply another code style/coloring scheme or keymap right from the editor.
+ Just press <span class="shortcut">&shortcut:QuickChangeScheme;</span>
+ (<span class="control">View | Quick Switch Scheme</span>),
+ to specify the scheme you want to change.</p>
+ <p class="image"><img src="images/quick_switch_scheme.png"></p>
+
+
+
+</body>
+</html>
\ No newline at end of file
diff --git a/python/resources/tips/RecentChanges.html b/python/resources/tips/RecentChanges.html
new file mode 100644
index 0000000..83cae82
--- /dev/null
+++ b/python/resources/tips/RecentChanges.html
@@ -0,0 +1,14 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>Use <span class="shortcut">&shortcut:RecentChanges;</span> to quickly review your recent changes to the project.</p>
+ <p class="image"><img src="images/recent_changes.png"></p>
+
+
+
+</body>
+</html>
diff --git a/python/resources/tips/RecentFiles.html b/python/resources/tips/RecentFiles.html
new file mode 100644
index 0000000..975af50
--- /dev/null
+++ b/python/resources/tips/RecentFiles.html
@@ -0,0 +1,22 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p><span class="shortcut">&shortcut:RecentFiles;</span> (<span class="control">View | Recent Files</span>)
+ brings a popup list of the recently visited files. Choose the desired file and press
+ <span class="shortcut">Enter</span> to open it.</p>
+ <p class="image"><img src="images/recent_files_1.png"></p>
+
+ <p>Besides recent files, you can bring up results of the usage searches you have performed
+ recently. To do that, use the same <span class="shortcut">&shortcut:RecentFiles;</span> shortcut with the <span class="control">Find</span> tool window having
+ the focus, and select the desired find usages result from the <span class="control">Recent Find Usages</span> popup.</p>
+
+ <p class="image"><img src="images/recent_files_2.png"></p>
+
+
+
+</body>
+</html>
diff --git a/python/resources/tips/RecentSearch.html b/python/resources/tips/RecentSearch.html
new file mode 100644
index 0000000..1c727e6
--- /dev/null
+++ b/python/resources/tips/RecentSearch.html
@@ -0,0 +1,16 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+
+ <p>When searching for a text string in a file, use recent history: with the search pane already open, click
+ the down arrow to show the list of recent entries.
+ <p class="image"><img src="images/recentSearch.png"></p>
+
+
+
+</body>
+</html>
diff --git a/python/resources/tips/RefactorThis.html b/python/resources/tips/RefactorThis.html
new file mode 100644
index 0000000..275e43b
--- /dev/null
+++ b/python/resources/tips/RefactorThis.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+<p>If you place the caret at certain symbol and press <span class="shortcut">&shortcut:Refactorings.QuickListPopupAction;</span>,
+you will see the list of refactorings applicable to the current context.</p>
+ <p class="image">
+ <img src="images/refactor_this.png"></p>
+
+</body>
+</html>
diff --git a/python/resources/tips/RemoteInterpreter.html b/python/resources/tips/RemoteInterpreter.html
new file mode 100644
index 0000000..1428939
--- /dev/null
+++ b/python/resources/tips/RemoteInterpreter.html
@@ -0,0 +1,15 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+ <p>Found yourself in a situation, when you want to use an interpreter located remotely? With
+PyCharm it is quite easy.</p>
+<p>To configure a remote interpreter, press <span class="shortcut">&shortcut:ShowProjectStructureSettings;</span>, and
+under the <span class="control">Project Settings</span>. open the page <span class="control">Python Interpreters</span>.</p>
+<p>Then press <span class="shortcut">&shortcut:NewElement;</span>, and choose the option <span class="control">Remote</span>:</p>
+<p class="image"><img src="images/add_remote_interpreter.png" alt="add_remote_interpreter"/></p>
+
+<p>You can use this remote interpreter for your project, or just leave it as one of the available interpreters.</p>
+</body>
+</html>
diff --git a/python/resources/tips/Rename.html b/python/resources/tips/Rename.html
new file mode 100644
index 0000000..a130744
--- /dev/null
+++ b/python/resources/tips/Rename.html
@@ -0,0 +1,17 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>You can easily rename your local variables with automatic correction of all places where they are used.</p>
+ <p>To try it, place the caret at the variable you want to rename, and press <span class="shortcut">&shortcut:RenameElement;</span>
+ (<span class="control">Refactor | Rename</span>).
+ Type the new name in the popup window that appears, or select one of the suggested names,
+ and press
+ <span class="shortcut">Enter</span>.</p>
+ <p class="image"><img src="images/rename.png"></p>
+
+</body>
+</html>
diff --git a/python/resources/tips/RenameCssSelector.html b/python/resources/tips/RenameCssSelector.html
new file mode 100644
index 0000000..12e4b7a
--- /dev/null
+++ b/python/resources/tips/RenameCssSelector.html
@@ -0,0 +1,15 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>It is possible to rename CSS selectors directly from HTML. Position the caret at
+ the selector to be renamed and press <span class="shortcut">&shortcut:RenameElement;</span>
+ (<span class="control">Refactor | Rename</span>).</p>
+
+
+
+</body>
+</html>
diff --git a/python/resources/tips/Reopen.html b/python/resources/tips/Reopen.html
new file mode 100644
index 0000000..f66edac
--- /dev/null
+++ b/python/resources/tips/Reopen.html
@@ -0,0 +1,20 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+<p>To open again one of the recent projects, use <span class="control">Reopen</span>(on Windows and Linux)/<span class="control">Open Recent</span>(on MacOS)
+on the <span class="control">File</span> menu:</p>
+<p class="image"><img src="images/reopen.png"></p>
+
+<p>Another way to reopen a project is to right-click the <span class="product">&productName;</span> icon on the task bar:
+
+</p>
+
+
+<p class="image"><img src="images/jumplist.png"></p>
+
+</body>
+</html>
diff --git a/python/resources/tips/RunConfigFolders.html b/python/resources/tips/RunConfigFolders.html
new file mode 100644
index 0000000..a4d8c08
--- /dev/null
+++ b/python/resources/tips/RunConfigFolders.html
@@ -0,0 +1,11 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+<p>If there are too many run/debug configurations of the same type, you can group them into folders, and thus distinguish them visually.</p>
+<p class="image"><img src="images/RunConfigFolder.png"><p>
+
+</body>
+</html>
diff --git a/python/resources/tips/ScopesInTODO.html b/python/resources/tips/ScopesInTODO.html
new file mode 100644
index 0000000..9872b80
--- /dev/null
+++ b/python/resources/tips/ScopesInTODO.html
@@ -0,0 +1,15 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+<p>If you are working on a large project, with numerous TODO items,
+filter them by scopes.</p>
+<p>Use the Scope-Based tab in the TODO tool window to show only those items
+that pertain to the scope of interest.</p>
+<p></p>
+<p class="image"><img src="images/todo_scopes.png"><p>
+
+</body>
+</html>
diff --git a/python/resources/tips/SearchEverywhere.html b/python/resources/tips/SearchEverywhere.html
new file mode 100644
index 0000000..9488ee2
--- /dev/null
+++ b/python/resources/tips/SearchEverywhere.html
@@ -0,0 +1,15 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>Find any action, symbol, or setting in <span class="product">&productName;</span> with
+Double Shift: </p>
+ <p class="image"><img src="images/searchEverywhere.png">.
+<p>You can also click <span class="image"><img src="images/searchEverywhere_lense.png"></span> in the upper-right corner of the product window.
+ </p>
+
+</body>
+</html>
diff --git a/python/resources/tips/SearchInSettings.html b/python/resources/tips/SearchInSettings.html
new file mode 100644
index 0000000..85f14b1
--- /dev/null
+++ b/python/resources/tips/SearchInSettings.html
@@ -0,0 +1,16 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>You can quickly find a setting you need in the <span class="control">Settings/Preferences</span> dialog, without browsing through the numerous options.
+Just type some characters that, in your opinion, exist in the option description, and the list of settings will reduce to the
+matching ones. Select the desired entry, and see the setting that contains the entered characters highlighted:</p>
+ <p class="image"><img src="images/search_settings.png"></p>
+
+
+
+</body>
+</html>
diff --git a/python/resources/tips/SelectIn.html b/python/resources/tips/SelectIn.html
new file mode 100644
index 0000000..5076777
--- /dev/null
+++ b/python/resources/tips/SelectIn.html
@@ -0,0 +1,16 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>To quickly select the currently edited element (class, file, method or field) in any view (<span class="control">Project</span> view,
+ <span class="control">Structure</span> view or other),
+ press <span class="shortcut">&shortcut:SelectIn;</span>.</p>
+ <p class="image"><img src="images/select_in.png"></p>
+
+
+
+</body>
+</html>
diff --git a/python/resources/tips/SelectRunDebugConfiguration.html b/python/resources/tips/SelectRunDebugConfiguration.html
new file mode 100644
index 0000000..54ff5a4
--- /dev/null
+++ b/python/resources/tips/SelectRunDebugConfiguration.html
@@ -0,0 +1,14 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>By pressing <span class="shortcut">&shortcut:ChooseRunConfiguration;</span> you can access the Run/Debug dropdown on the main toolbar,
+ without the need to use your mouse.</p>
+
+
+
+</body>
+</html>
\ No newline at end of file
diff --git a/python/resources/tips/SelectTasks.html b/python/resources/tips/SelectTasks.html
new file mode 100644
index 0000000..db5fb1a
--- /dev/null
+++ b/python/resources/tips/SelectTasks.html
@@ -0,0 +1,15 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+<p>When working with a lengthy list of tasks, you don't need to delete them one by one.
+ Select several tasks, using <span class="control">Shift</span>
+ or <span class="control">Control/Command</span> keys, click the right arrow, and then click
+<span class="control">Remove<span>.
+</p>
+<p class="image"><img src="images/select_tasks.png"><p>
+
+</body>
+</html>
diff --git a/python/resources/tips/ShowAppliedStyles.html b/python/resources/tips/ShowAppliedStyles.html
new file mode 100644
index 0000000..2f6b098
--- /dev/null
+++ b/python/resources/tips/ShowAppliedStyles.html
@@ -0,0 +1,17 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+<p>You can quickly review all styles currently applied to an HTML tag, by right-clicking the tag name and selecting
+ <span class="control">Show Applied Styles For Tag</span>
+ from the context menu:</p>
+<p class="image"><img src="images/show_applied_styles.png"></p>
+
+
+
+</body>
+</html>
+
diff --git a/python/resources/tips/ShowHideSideBars.html b/python/resources/tips/ShowHideSideBars.html
new file mode 100644
index 0000000..d39e28f
--- /dev/null
+++ b/python/resources/tips/ShowHideSideBars.html
@@ -0,0 +1,14 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+ <p>
+ If you need more workspace, you can hide the tool windows bars:
+ click <img src="images/show_hide_tool_window_bars.png"> in the lower left corner.</p>
+ <p>
+ If necessary, you can show the tool window buttons just for a moment. To do that, press the key <span class="shortcut">Alt</span> (for Windows/*nix) or
+<span class="shortcut">Cmd</span> (for Mac) twice and keep it down.
+ While the key is pressed, the tool window buttons are visible.</p>
+</body>
+</html>
diff --git a/python/resources/tips/ShowUsages.html b/python/resources/tips/ShowUsages.html
new file mode 100644
index 0000000..83e009f
--- /dev/null
+++ b/python/resources/tips/ShowUsages.html
@@ -0,0 +1,17 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>You can bring forward the list of all usages of a class, method or variable across the whole
+ project, and quickly jump to the selected usage. To do that, place the caret at the symbol's name or at its usage
+ in code and press <span class="shortcut">&shortcut:ShowUsages;</span> (<span class="control">Edit | Find | Show Usages</span>
+ in the main menu), scroll the list and click the desired usage.</p>
+ <p class="image"><img src="images/showUsages.png"/></p>
+
+
+
+</body>
+</html>
diff --git a/python/resources/tips/SpeedSearch.html b/python/resources/tips/SpeedSearch.html
new file mode 100644
index 0000000..8796153
--- /dev/null
+++ b/python/resources/tips/SpeedSearch.html
@@ -0,0 +1,14 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>The speed search is available in all the tree views: just start typing and you'll quickly locate the necessary item.</p>
+ <p class="image"><img src="images/speed_search.png"></p>
+
+
+
+</body>
+</html>
diff --git a/python/resources/tips/SpeedSearchinLiveTemplates.html b/python/resources/tips/SpeedSearchinLiveTemplates.html
new file mode 100644
index 0000000..c5b3f9c
--- /dev/null
+++ b/python/resources/tips/SpeedSearchinLiveTemplates.html
@@ -0,0 +1,12 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+<p>In the <span class="control">Live Templates</span> settings, use speed search to find templates with certain text in the template abbreviation, body or description.</p>
+<p>Start typing the desired text, and the list of available templates will shrink to show matching templates only:</p>
+<p class="image"><img src="images/SpeedSearchInLiveTemplates.png"><p>
+
+</body>
+</html>
diff --git a/python/resources/tips/Spellchecker.html b/python/resources/tips/Spellchecker.html
new file mode 100644
index 0000000..7361ddf
--- /dev/null
+++ b/python/resources/tips/Spellchecker.html
@@ -0,0 +1,15 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+<p>Keep your source code typo-free with the help of the built-in <span class="">Spellchecker</span>.</p>
+
+<p>All texts, including comments, textual strings and literals, are inspected against the pre-defined dictionaries.
+All typos are highlighted, which leaves you with the task of choosing the correct word, accepting the current spelling, or disabling inspection.</p>
+<p>Use <span class="shortcut">&shortcut:ShowIntentionActions;</span> to see the list of available actions.</p>
+
+
+</body>
+</html>
diff --git a/python/resources/tips/SpellcheckerDictionaries.html b/python/resources/tips/SpellcheckerDictionaries.html
new file mode 100644
index 0000000..c81027a
--- /dev/null
+++ b/python/resources/tips/SpellcheckerDictionaries.html
@@ -0,0 +1,12 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+<p>If you lack words in the pre-defined dictionaries, you can create your own ones. A custom dictionary is a mere
+textual file with a <span class="code_emphasis">.dic</span> extension, with each word starting on a new line.</p>
+<p>All you have to do is to point to the directories where your dictionaries are stored, in the
+<span class="control">Spelling</span> of the <span class="control">Settings</span> dialog.</p>
+</body>
+</html>
diff --git a/python/resources/tips/Surround.html b/python/resources/tips/Surround.html
new file mode 100644
index 0000000..a7b2478
--- /dev/null
+++ b/python/resources/tips/Surround.html
@@ -0,0 +1,14 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+ <p>
+ When you want to catch exceptions thrown by some code fragment,
+ select it in the editor, press <span class="shortcut">&shortcut:SurroundWith;</span>
+ (<span class="control">Code | Surround With</span>) and choose <span class="control">try/except</span>.
+ This will automatically generate the except clause.</p>
+ <p class="image">
+ <img src="images/try_except.png" alt="surround"/></p>
+</body>
+</html>
diff --git a/python/resources/tips/Switcher.html b/python/resources/tips/Switcher.html
new file mode 100644
index 0000000..270bd9b
--- /dev/null
+++ b/python/resources/tips/Switcher.html
@@ -0,0 +1,15 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>Use the Switcher (<span class="shortcut">&shortcut:Switcher;</span>) to switch between open files and tool windows.
+ Keeping <span class="shortcut">Ctrl</span> pressed, use the <span class="shortcut">Up</span> and <span class="shortcut">Down</span> arrow keys,
+ <span class="shortcut">Tab</span> or <span class="shortcut">Shift+Tab</span>, <span class="control">Alt</span> for navigation;
+ use <span class="shortcut">Delete</span> or <span class="shortcut">BackSpace</span> to close editor tab or hide a tool window.</p>
+<p class="image"><img src="images/switcher.png"/></p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/python/resources/tips/TabInEditorClose.html b/python/resources/tips/TabInEditorClose.html
new file mode 100644
index 0000000..dd3f371
--- /dev/null
+++ b/python/resources/tips/TabInEditorClose.html
@@ -0,0 +1,15 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>Did you know that you can close tabs in the editor and the tool windows of &productName; without actually
+ using the context menu commands?
+ It is enough to point with your mouse cursor to a tab to be closed, and click the middle mouse button, or just
+ use the <span class="shortcut">Shift+click</span> combination.</p>
+
+
+</body>
+</html>
diff --git a/python/resources/tips/TabInLookups.html b/python/resources/tips/TabInLookups.html
new file mode 100644
index 0000000..3280473
--- /dev/null
+++ b/python/resources/tips/TabInLookups.html
@@ -0,0 +1,17 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>When using Code Completion, you can accept the currently highlighted selection in the popup list
+ with <span class="shortcut">&shortcut:EditorChooseLookupItemReplace;</span> key.</p>
+ <p>Unlike accepting with the <span class="shortcut">&shortcut:EditorChooseLookupItem;</span> key, the selected name will overwrite
+ the rest of the name to the right of the caret. This can be especially useful for replacing one method
+ or variable name with another.</p>
+
+
+
+</body>
+</html>
diff --git a/python/resources/tips/TagNameCompletion.html b/python/resources/tips/TagNameCompletion.html
new file mode 100644
index 0000000..cdce274
--- /dev/null
+++ b/python/resources/tips/TagNameCompletion.html
@@ -0,0 +1,17 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+<p>
+ A special variant of the Code Completion feature invoked by pressing <span class="shortcut">&shortcut:CodeCompletion;</span> twice allows you to
+ complete
+ XML tag names from namespaces not declared in the current file.
+ If the namespace is not declared yet the declaration is generated automatically.
+</p>
+
+<p class="image"><img src="images/tagNameCompletion.png"></p>
+
+
+</body>
+</html>
\ No newline at end of file
diff --git a/python/resources/tips/Templates.html b/python/resources/tips/Templates.html
new file mode 100644
index 0000000..91bd658
--- /dev/null
+++ b/python/resources/tips/Templates.html
@@ -0,0 +1,14 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+ <p>
+ It's very easy to navigate between the Django templates and referencing views.</p>
+ <p>
+ To do that, use the icons <img src="images/goto_view_icon.png"/> and <img src="images/goto_template_icon.png"/>
+ in the left gutter of the editor.</p>
+ <p class="image">
+ <img src="images/goto_view.png"></p>
+</body>
+</html>
diff --git a/python/resources/tips/Terminal.html b/python/resources/tips/Terminal.html
new file mode 100644
index 0000000..fcebc65
--- /dev/null
+++ b/python/resources/tips/Terminal.html
@@ -0,0 +1,14 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>You don't need to leave <span class="product">&productName;</span> to work with your favorite shell. Just choose
+<span class="control">Tools | Open Terminal</span> on the main menu,
+and enjoy using the embedded local terminal. </p>
+ <p class="image"><img src="images/terminal.png"></p>
+
+</body>
+</html>
diff --git a/python/resources/tips/ToolWindowsQuickAccess.html b/python/resources/tips/ToolWindowsQuickAccess.html
new file mode 100644
index 0000000..bf499d3
--- /dev/null
+++ b/python/resources/tips/ToolWindowsQuickAccess.html
@@ -0,0 +1,14 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>You can gain quick access to the available tool windows: hover your mouse
+pointer over <img src="images/lower_left.png"> icon in the lower left corner of the IDE window.</p> </p>
+<p>The list of tool windows shows up, leaving you with the task of selecting the desired one: </p>
+ <p class="image"><img src="images/showToolWindows.png"></p>
+
+</body>
+</html>
diff --git a/python/resources/tips/VcsQuickList.html b/python/resources/tips/VcsQuickList.html
new file mode 100644
index 0000000..e7455ba
--- /dev/null
+++ b/python/resources/tips/VcsQuickList.html
@@ -0,0 +1,16 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+<p>All your most indispensable VCS commands are just one-click away...</p>
+<p>
+Choose <span class="control">VCS | VCS Operations Popup</span>
+on the main menu, and get a popup with the VCS commands that are relevant to the current context:
+</p>
+
+<p class="image"><img src="images/vcsQuickList.png"></p>
+
+</body>
+</html>
diff --git a/python/resources/tips/Welcome.html b/python/resources/tips/Welcome.html
new file mode 100644
index 0000000..1be740b
--- /dev/null
+++ b/python/resources/tips/Welcome.html
@@ -0,0 +1,15 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+ <h1>Welcome to PyCharm &majorVersion;.&minorVersion;</h1>
+ <p>
+ You can quickly get familiar with the main features of the IDE by reading these tips.</p>
+ <p>
+ You can try out the features described in the tips while this dialog stays open on the screen.</p>
+ <p>
+ If you close the dialog, you can always get back to it using
+ <span class="control">Help | Tip of the Day</span> on the menu bar.</p>
+</body>
+</html>
diff --git a/python/resources/tips/WideScreen.html b/python/resources/tips/WideScreen.html
new file mode 100644
index 0000000..1ef170b
--- /dev/null
+++ b/python/resources/tips/WideScreen.html
@@ -0,0 +1,16 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+<p>Tune the <span class="product">&productName;</span> tool windows layout to make better use of your screen.</p>
+<p>Toggle between the vertical and side-by-side placement of the tool windows by
+Ctrl+click (Windows/*nix) or Cmd+click (Mac) on the splitter:</p>
+
+
+<p class="image"><img src="images/sidebyside.png"></p>
+
+</body>
+</html>
diff --git a/python/resources/tips/WildcardsInNavigationPopups.html b/python/resources/tips/WildcardsInNavigationPopups.html
new file mode 100644
index 0000000..87958ee
--- /dev/null
+++ b/python/resources/tips/WildcardsInNavigationPopups.html
@@ -0,0 +1,20 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>For the pattern search in the <span class="control">Go to Class</span>,
+ <span class="control">Go to Symbol</span> and
+ <span class="control">Go to File</span> pop-up frames,
+ use <span class="code_emphasis">*</span> and space symbols.</p>
+ <p><span class="code_emphasis">*</span> stands for any symbol.</p>
+ <p>Space at the end means the end of a pattern, and the preceding string will be considered not just a prefix but a whole pattern.
+ The list of the suggested names will be reduced accordingly.</p>
+ <p class="image"><img src="images/wildcard_goto.png"></p>
+
+
+
+</body>
+</html>
diff --git a/python/resources/tips/WordCompletion.html b/python/resources/tips/WordCompletion.html
new file mode 100644
index 0000000..fd51de5
--- /dev/null
+++ b/python/resources/tips/WordCompletion.html
@@ -0,0 +1,16 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+ <p>Use <span class="">Basic Completion</span>
+ (<span class="shortcut">&shortcut:CodeCompletion;</span>) for completing words in text and comments in files of many different types.</p>
+ <p>All the words from the current file that start with the typed prefix will appear in the lookup list.</p>
+ <p class="image"><img src="images/word_completion.png"></p>
+
+
+
+</body>
+</html>
diff --git a/python/resources/tips/css/tips.css b/python/resources/tips/css/tips.css
new file mode 100644
index 0000000..1dea96f
--- /dev/null
+++ b/python/resources/tips/css/tips.css
@@ -0,0 +1,60 @@
+body {
+ /*background: #ffffff;*/
+ margin-left: 10px;
+ margin-right: 2px;
+ margin-bottom: 6px;
+}
+h1, p, ul {
+ font-family: 'MS Reference Sans Serif', verdana, arial, sans-serif;
+}
+.code, .code_emphasis, .code_keyword, pre, .shortcut {
+ font-family: 'Lucida Console', monospace;
+}
+h1, p, pre, ul {
+ font-size: 10px;
+ /*color: #3f3f3f;*/
+}
+p, ul {
+ margin-top: 6px;
+}
+h1, p, ul {
+ margin-bottom: 0;
+}
+ul {
+ margin-left: 0;
+ padding-left: 14px;
+}
+h1, .image, pre {
+ margin-top: 10px;
+}
+.image, pre {
+ margin-bottom: 2px;
+}
+pre {
+ margin-right: 6px;
+ border-style: solid;
+ border-width: 1px;
+ border-color: #d0d0d0;
+ background-color: #fbfbfb;
+ padding-left: 10px;
+ padding-top: 6px;
+ padding-bottom: 6px;
+}
+.control, h1 {
+ font-weight: bold;
+}
+.control {
+ color: #808080;
+}
+.caret, .code_emphasis, .code_keyword, .emphasis, .shortcut {
+ color: #990000;
+}
+pre .keyword{
+ color: #000080;
+}
+h1 .product {
+ color: #264db5;
+}
+h1 .version {
+ color: #f58220;
+}
\ No newline at end of file
diff --git a/python/resources/tips/css/tips_darcula.css b/python/resources/tips/css/tips_darcula.css
new file mode 100644
index 0000000..5524189
--- /dev/null
+++ b/python/resources/tips/css/tips_darcula.css
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2000-2013 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+body {
+ margin-left: 10px;
+ margin-right: 2px;
+ margin-bottom: 6px;
+}
+h1, p, ul {
+ font-family: 'MS Reference Sans Serif', verdana, arial, sans-serif;
+}
+.code, .code_emphasis, .code_keyword, pre, .shortcut {
+ font-family: 'Lucida Console', monospace;
+}
+h1, p, pre, ul {
+ font-size: 10px;
+ /*color: #3f3f3f;*/
+}
+p, ul {
+ margin-top: 6px;
+}
+h1, p, ul {
+ margin-bottom: 0;
+}
+ul {
+ margin-left: 0;
+ padding-left: 14px;
+}
+h1, .image, pre {
+ margin-top: 10px;
+}
+.image, pre {
+ margin-bottom: 2px;
+}
+pre {
+ margin-right: 6px;
+ border-style: solid;
+ border-width: 1px;
+ border-color: #d0d0d0;
+ background-color: #fbfbfb;
+ padding-left: 10px;
+ padding-top: 6px;
+ padding-bottom: 6px;
+}
+.control, h1 {
+ font-weight: bold;
+}
+.control {
+ color: #d19a67;
+}
+.caret, .code_emphasis, .code_keyword, .emphasis, .shortcut {
+ color: #cb7d4a;
+ font-weight: bold;
+}
+pre .keyword{
+ color: #cb7832;
+}
+h1 .product {
+ color: #5275d0;
+}
+h1 .version {
+ color: #f58220;
+}
\ No newline at end of file
diff --git a/python/resources/tips/images/CodeCompletionInSearch.png b/python/resources/tips/images/CodeCompletionInSearch.png
new file mode 100644
index 0000000..f4aa5e7
--- /dev/null
+++ b/python/resources/tips/images/CodeCompletionInSearch.png
Binary files differ
diff --git a/python/resources/tips/images/CodeCompletionInSearch@2x.png b/python/resources/tips/images/CodeCompletionInSearch@2x.png
new file mode 100644
index 0000000..ffdc6ec
--- /dev/null
+++ b/python/resources/tips/images/CodeCompletionInSearch@2x.png
Binary files differ
diff --git a/python/resources/tips/images/CodeCompletionInSearch@2x_dark.png b/python/resources/tips/images/CodeCompletionInSearch@2x_dark.png
new file mode 100644
index 0000000..13a36f0
--- /dev/null
+++ b/python/resources/tips/images/CodeCompletionInSearch@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/CodeCompletionInSearch_dark.png b/python/resources/tips/images/CodeCompletionInSearch_dark.png
new file mode 100644
index 0000000..69c9b5d
--- /dev/null
+++ b/python/resources/tips/images/CodeCompletionInSearch_dark.png
Binary files differ
diff --git a/python/resources/tips/images/RunConfigFolder.png b/python/resources/tips/images/RunConfigFolder.png
new file mode 100644
index 0000000..b9badc1
--- /dev/null
+++ b/python/resources/tips/images/RunConfigFolder.png
Binary files differ
diff --git a/python/resources/tips/images/RunConfigFolder@2x.png b/python/resources/tips/images/RunConfigFolder@2x.png
new file mode 100644
index 0000000..ae8a0eb
--- /dev/null
+++ b/python/resources/tips/images/RunConfigFolder@2x.png
Binary files differ
diff --git a/python/resources/tips/images/RunConfigFolder@2x_dark.png b/python/resources/tips/images/RunConfigFolder@2x_dark.png
new file mode 100644
index 0000000..34bdb86
--- /dev/null
+++ b/python/resources/tips/images/RunConfigFolder@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/RunConfigFolder_dark.png b/python/resources/tips/images/RunConfigFolder_dark.png
new file mode 100644
index 0000000..c1c4e99
--- /dev/null
+++ b/python/resources/tips/images/RunConfigFolder_dark.png
Binary files differ
diff --git a/python/resources/tips/images/SpeedSearchInLiveTemplates.png b/python/resources/tips/images/SpeedSearchInLiveTemplates.png
new file mode 100644
index 0000000..586a47d
--- /dev/null
+++ b/python/resources/tips/images/SpeedSearchInLiveTemplates.png
Binary files differ
diff --git a/python/resources/tips/images/SpeedSearchInLiveTemplates@2x.png b/python/resources/tips/images/SpeedSearchInLiveTemplates@2x.png
new file mode 100644
index 0000000..ae951e8
--- /dev/null
+++ b/python/resources/tips/images/SpeedSearchInLiveTemplates@2x.png
Binary files differ
diff --git a/python/resources/tips/images/SpeedSearchInLiveTemplates@2x_dark.png b/python/resources/tips/images/SpeedSearchInLiveTemplates@2x_dark.png
new file mode 100644
index 0000000..562e5c0
--- /dev/null
+++ b/python/resources/tips/images/SpeedSearchInLiveTemplates@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/SpeedSearchInLiveTemplates_dark.png b/python/resources/tips/images/SpeedSearchInLiveTemplates_dark.png
new file mode 100644
index 0000000..5def14a
--- /dev/null
+++ b/python/resources/tips/images/SpeedSearchInLiveTemplates_dark.png
Binary files differ
diff --git a/python/resources/tips/images/add_remote_interpreter.png b/python/resources/tips/images/add_remote_interpreter.png
new file mode 100644
index 0000000..d9370e4
--- /dev/null
+++ b/python/resources/tips/images/add_remote_interpreter.png
Binary files differ
diff --git a/python/resources/tips/images/add_remote_interpreter@2x.png b/python/resources/tips/images/add_remote_interpreter@2x.png
new file mode 100644
index 0000000..0171250
--- /dev/null
+++ b/python/resources/tips/images/add_remote_interpreter@2x.png
Binary files differ
diff --git a/python/resources/tips/images/add_remote_interpreter@2x_dark.png b/python/resources/tips/images/add_remote_interpreter@2x_dark.png
new file mode 100644
index 0000000..f575813
--- /dev/null
+++ b/python/resources/tips/images/add_remote_interpreter@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/add_remote_interpreter_dark.png b/python/resources/tips/images/add_remote_interpreter_dark.png
new file mode 100644
index 0000000..81177f5
--- /dev/null
+++ b/python/resources/tips/images/add_remote_interpreter_dark.png
Binary files differ
diff --git a/python/resources/tips/images/annotationShowDiff.png b/python/resources/tips/images/annotationShowDiff.png
new file mode 100644
index 0000000..f31b707
--- /dev/null
+++ b/python/resources/tips/images/annotationShowDiff.png
Binary files differ
diff --git a/python/resources/tips/images/annotationShowDiff@2x.png b/python/resources/tips/images/annotationShowDiff@2x.png
new file mode 100644
index 0000000..22cd9dc
--- /dev/null
+++ b/python/resources/tips/images/annotationShowDiff@2x.png
Binary files differ
diff --git a/python/resources/tips/images/annotationShowDiff@2x_dark.png b/python/resources/tips/images/annotationShowDiff@2x_dark.png
new file mode 100644
index 0000000..ebe7bd7
--- /dev/null
+++ b/python/resources/tips/images/annotationShowDiff@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/annotationShowDiff_dark.png b/python/resources/tips/images/annotationShowDiff_dark.png
new file mode 100644
index 0000000..f91539d
--- /dev/null
+++ b/python/resources/tips/images/annotationShowDiff_dark.png
Binary files differ
diff --git a/python/resources/tips/images/breakpoint_speedmenu.png b/python/resources/tips/images/breakpoint_speedmenu.png
new file mode 100644
index 0000000..51c8cde
--- /dev/null
+++ b/python/resources/tips/images/breakpoint_speedmenu.png
Binary files differ
diff --git a/python/resources/tips/images/breakpoint_speedmenu@2x.png b/python/resources/tips/images/breakpoint_speedmenu@2x.png
new file mode 100644
index 0000000..cb0eb1b
--- /dev/null
+++ b/python/resources/tips/images/breakpoint_speedmenu@2x.png
Binary files differ
diff --git a/python/resources/tips/images/breakpoint_speedmenu@2x_dark.png b/python/resources/tips/images/breakpoint_speedmenu@2x_dark.png
new file mode 100644
index 0000000..c384649
--- /dev/null
+++ b/python/resources/tips/images/breakpoint_speedmenu@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/breakpoint_speedmenu@_dark.png b/python/resources/tips/images/breakpoint_speedmenu@_dark.png
new file mode 100644
index 0000000..f51e9a5
--- /dev/null
+++ b/python/resources/tips/images/breakpoint_speedmenu@_dark.png
Binary files differ
diff --git a/python/resources/tips/images/browse_remote_hosts.png b/python/resources/tips/images/browse_remote_hosts.png
new file mode 100644
index 0000000..fc79b19
--- /dev/null
+++ b/python/resources/tips/images/browse_remote_hosts.png
Binary files differ
diff --git a/python/resources/tips/images/builtInServer.png b/python/resources/tips/images/builtInServer.png
new file mode 100644
index 0000000..068f822
--- /dev/null
+++ b/python/resources/tips/images/builtInServer.png
Binary files differ
diff --git a/python/resources/tips/images/builtInServer@2x.png b/python/resources/tips/images/builtInServer@2x.png
new file mode 100644
index 0000000..09b46ff
--- /dev/null
+++ b/python/resources/tips/images/builtInServer@2x.png
Binary files differ
diff --git a/python/resources/tips/images/builtInServer@2x_dark.png b/python/resources/tips/images/builtInServer@2x_dark.png
new file mode 100644
index 0000000..215fd3e
--- /dev/null
+++ b/python/resources/tips/images/builtInServer@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/builtInServer@_dark.png b/python/resources/tips/images/builtInServer@_dark.png
new file mode 100644
index 0000000..4e3d5a4
--- /dev/null
+++ b/python/resources/tips/images/builtInServer@_dark.png
Binary files differ
diff --git a/python/resources/tips/images/bullet.png b/python/resources/tips/images/bullet.png
new file mode 100644
index 0000000..bc9f6a7
--- /dev/null
+++ b/python/resources/tips/images/bullet.png
Binary files differ
diff --git a/python/resources/tips/images/camel_completion.png b/python/resources/tips/images/camel_completion.png
new file mode 100644
index 0000000..45c166b
--- /dev/null
+++ b/python/resources/tips/images/camel_completion.png
Binary files differ
diff --git a/python/resources/tips/images/camel_completion@2x.png b/python/resources/tips/images/camel_completion@2x.png
new file mode 100644
index 0000000..55fb7a7
--- /dev/null
+++ b/python/resources/tips/images/camel_completion@2x.png
Binary files differ
diff --git a/python/resources/tips/images/camel_completion@2x_dark.png b/python/resources/tips/images/camel_completion@2x_dark.png
new file mode 100644
index 0000000..1c9f53a
--- /dev/null
+++ b/python/resources/tips/images/camel_completion@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/camel_completion_dark.png b/python/resources/tips/images/camel_completion_dark.png
new file mode 100644
index 0000000..d4ea6e8
--- /dev/null
+++ b/python/resources/tips/images/camel_completion_dark.png
Binary files differ
diff --git a/python/resources/tips/images/camel_goto.png b/python/resources/tips/images/camel_goto.png
new file mode 100644
index 0000000..28405e5
--- /dev/null
+++ b/python/resources/tips/images/camel_goto.png
Binary files differ
diff --git a/python/resources/tips/images/camel_goto@2x.png b/python/resources/tips/images/camel_goto@2x.png
new file mode 100644
index 0000000..31f2be4
--- /dev/null
+++ b/python/resources/tips/images/camel_goto@2x.png
Binary files differ
diff --git a/python/resources/tips/images/camel_goto@2x_dark.png b/python/resources/tips/images/camel_goto@2x_dark.png
new file mode 100644
index 0000000..3ed950f
--- /dev/null
+++ b/python/resources/tips/images/camel_goto@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/camel_goto_dark.png b/python/resources/tips/images/camel_goto_dark.png
new file mode 100644
index 0000000..0871187
--- /dev/null
+++ b/python/resources/tips/images/camel_goto_dark.png
Binary files differ
diff --git a/python/resources/tips/images/changeLookupSorting.png b/python/resources/tips/images/changeLookupSorting.png
new file mode 100644
index 0000000..63155a3
--- /dev/null
+++ b/python/resources/tips/images/changeLookupSorting.png
Binary files differ
diff --git a/python/resources/tips/images/changeLookupSorting@2x.png b/python/resources/tips/images/changeLookupSorting@2x.png
new file mode 100644
index 0000000..5fd6b02
--- /dev/null
+++ b/python/resources/tips/images/changeLookupSorting@2x.png
Binary files differ
diff --git a/python/resources/tips/images/changeLookupSorting@2x_dark.png b/python/resources/tips/images/changeLookupSorting@2x_dark.png
new file mode 100644
index 0000000..e87e55e
--- /dev/null
+++ b/python/resources/tips/images/changeLookupSorting@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/changeLookupSorting_dark.png b/python/resources/tips/images/changeLookupSorting_dark.png
new file mode 100644
index 0000000..4e7f0df
--- /dev/null
+++ b/python/resources/tips/images/changeLookupSorting_dark.png
Binary files differ
diff --git a/python/resources/tips/images/checkRegExp.png b/python/resources/tips/images/checkRegExp.png
new file mode 100644
index 0000000..8d74fbe
--- /dev/null
+++ b/python/resources/tips/images/checkRegExp.png
Binary files differ
diff --git a/python/resources/tips/images/checkRegExp@2x.png b/python/resources/tips/images/checkRegExp@2x.png
new file mode 100644
index 0000000..2a20810
--- /dev/null
+++ b/python/resources/tips/images/checkRegExp@2x.png
Binary files differ
diff --git a/python/resources/tips/images/checkRegExp@2x_dark.png b/python/resources/tips/images/checkRegExp@2x_dark.png
new file mode 100644
index 0000000..26dcf18
--- /dev/null
+++ b/python/resources/tips/images/checkRegExp@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/checkRegExp_dark.png b/python/resources/tips/images/checkRegExp_dark.png
new file mode 100644
index 0000000..909fc3d
--- /dev/null
+++ b/python/resources/tips/images/checkRegExp_dark.png
Binary files differ
diff --git a/python/resources/tips/images/class_name_completion.png b/python/resources/tips/images/class_name_completion.png
new file mode 100644
index 0000000..5c517e0
--- /dev/null
+++ b/python/resources/tips/images/class_name_completion.png
Binary files differ
diff --git a/python/resources/tips/images/class_name_completion@2x.png b/python/resources/tips/images/class_name_completion@2x.png
new file mode 100644
index 0000000..394a977
--- /dev/null
+++ b/python/resources/tips/images/class_name_completion@2x.png
Binary files differ
diff --git a/python/resources/tips/images/class_name_completion@2x_dark.png b/python/resources/tips/images/class_name_completion@2x_dark.png
new file mode 100644
index 0000000..e6bbe34
--- /dev/null
+++ b/python/resources/tips/images/class_name_completion@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/class_name_completion_dark.png b/python/resources/tips/images/class_name_completion_dark.png
new file mode 100644
index 0000000..6f87933
--- /dev/null
+++ b/python/resources/tips/images/class_name_completion_dark.png
Binary files differ
diff --git a/python/resources/tips/images/close1.png b/python/resources/tips/images/close1.png
new file mode 100644
index 0000000..c09b94d
--- /dev/null
+++ b/python/resources/tips/images/close1.png
Binary files differ
diff --git a/python/resources/tips/images/close_others.png b/python/resources/tips/images/close_others.png
new file mode 100644
index 0000000..9c86050
--- /dev/null
+++ b/python/resources/tips/images/close_others.png
Binary files differ
diff --git a/python/resources/tips/images/close_others@2x.png b/python/resources/tips/images/close_others@2x.png
new file mode 100644
index 0000000..2b1654b
--- /dev/null
+++ b/python/resources/tips/images/close_others@2x.png
Binary files differ
diff --git a/python/resources/tips/images/close_others@2x_dark.png b/python/resources/tips/images/close_others@2x_dark.png
new file mode 100644
index 0000000..f4a8ece
--- /dev/null
+++ b/python/resources/tips/images/close_others@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/close_others_dark.png b/python/resources/tips/images/close_others_dark.png
new file mode 100644
index 0000000..903575f
--- /dev/null
+++ b/python/resources/tips/images/close_others_dark.png
Binary files differ
diff --git a/python/resources/tips/images/code_completion.png b/python/resources/tips/images/code_completion.png
new file mode 100644
index 0000000..cd51006
--- /dev/null
+++ b/python/resources/tips/images/code_completion.png
Binary files differ
diff --git a/python/resources/tips/images/code_completion@2x.png b/python/resources/tips/images/code_completion@2x.png
new file mode 100644
index 0000000..933f30e
--- /dev/null
+++ b/python/resources/tips/images/code_completion@2x.png
Binary files differ
diff --git a/python/resources/tips/images/code_completion@2x_dark.png b/python/resources/tips/images/code_completion@2x_dark.png
new file mode 100644
index 0000000..c1c078e
--- /dev/null
+++ b/python/resources/tips/images/code_completion@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/code_completion_dark.png b/python/resources/tips/images/code_completion_dark.png
new file mode 100644
index 0000000..e932b9a
--- /dev/null
+++ b/python/resources/tips/images/code_completion_dark.png
Binary files differ
diff --git a/python/resources/tips/images/code_completion_middle.png b/python/resources/tips/images/code_completion_middle.png
new file mode 100644
index 0000000..7dd4008
--- /dev/null
+++ b/python/resources/tips/images/code_completion_middle.png
Binary files differ
diff --git a/python/resources/tips/images/code_completion_middle@2x.png b/python/resources/tips/images/code_completion_middle@2x.png
new file mode 100644
index 0000000..4df16b9
--- /dev/null
+++ b/python/resources/tips/images/code_completion_middle@2x.png
Binary files differ
diff --git a/python/resources/tips/images/code_completion_middle@2x_dark.png b/python/resources/tips/images/code_completion_middle@2x_dark.png
new file mode 100644
index 0000000..2a72b63
--- /dev/null
+++ b/python/resources/tips/images/code_completion_middle@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/code_completion_middle_dark.png b/python/resources/tips/images/code_completion_middle_dark.png
new file mode 100644
index 0000000..392db57
--- /dev/null
+++ b/python/resources/tips/images/code_completion_middle_dark.png
Binary files differ
diff --git a/python/resources/tips/images/code_completion_no_shift.png b/python/resources/tips/images/code_completion_no_shift.png
new file mode 100644
index 0000000..0907cb0
--- /dev/null
+++ b/python/resources/tips/images/code_completion_no_shift.png
Binary files differ
diff --git a/python/resources/tips/images/code_completion_no_shift@2x.png b/python/resources/tips/images/code_completion_no_shift@2x.png
new file mode 100644
index 0000000..7680b7c
--- /dev/null
+++ b/python/resources/tips/images/code_completion_no_shift@2x.png
Binary files differ
diff --git a/python/resources/tips/images/code_completion_no_shift@2x_dark.png b/python/resources/tips/images/code_completion_no_shift@2x_dark.png
new file mode 100644
index 0000000..e1d5fa9
--- /dev/null
+++ b/python/resources/tips/images/code_completion_no_shift@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/code_completion_no_shift_dark.png b/python/resources/tips/images/code_completion_no_shift_dark.png
new file mode 100644
index 0000000..3394c0e
--- /dev/null
+++ b/python/resources/tips/images/code_completion_no_shift_dark.png
Binary files differ
diff --git a/python/resources/tips/images/coloredFiles.png b/python/resources/tips/images/coloredFiles.png
new file mode 100644
index 0000000..b685713
--- /dev/null
+++ b/python/resources/tips/images/coloredFiles.png
Binary files differ
diff --git a/python/resources/tips/images/coloredFiles@2x.png b/python/resources/tips/images/coloredFiles@2x.png
new file mode 100644
index 0000000..f260128
--- /dev/null
+++ b/python/resources/tips/images/coloredFiles@2x.png
Binary files differ
diff --git a/python/resources/tips/images/coloredFiles@2x_dark.png b/python/resources/tips/images/coloredFiles@2x_dark.png
new file mode 100644
index 0000000..3691b6d
--- /dev/null
+++ b/python/resources/tips/images/coloredFiles@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/coloredFiles_dark.png b/python/resources/tips/images/coloredFiles_dark.png
new file mode 100644
index 0000000..45b3d00
--- /dev/null
+++ b/python/resources/tips/images/coloredFiles_dark.png
Binary files differ
diff --git a/python/resources/tips/images/columnSelection.png b/python/resources/tips/images/columnSelection.png
new file mode 100644
index 0000000..2e3b62c
--- /dev/null
+++ b/python/resources/tips/images/columnSelection.png
Binary files differ
diff --git a/python/resources/tips/images/columnSelection@2x.png b/python/resources/tips/images/columnSelection@2x.png
new file mode 100644
index 0000000..56fbe0c
--- /dev/null
+++ b/python/resources/tips/images/columnSelection@2x.png
Binary files differ
diff --git a/python/resources/tips/images/columnSelection@2x_dark.png b/python/resources/tips/images/columnSelection@2x_dark.png
new file mode 100644
index 0000000..0e8c967
--- /dev/null
+++ b/python/resources/tips/images/columnSelection@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/columnSelection_dark.png b/python/resources/tips/images/columnSelection_dark.png
new file mode 100644
index 0000000..a676d7e
--- /dev/null
+++ b/python/resources/tips/images/columnSelection_dark.png
Binary files differ
diff --git a/python/resources/tips/images/completion_in_html.png b/python/resources/tips/images/completion_in_html.png
new file mode 100644
index 0000000..9c20bb4
--- /dev/null
+++ b/python/resources/tips/images/completion_in_html.png
Binary files differ
diff --git a/python/resources/tips/images/completion_in_html2.png b/python/resources/tips/images/completion_in_html2.png
new file mode 100644
index 0000000..b51fb2c
--- /dev/null
+++ b/python/resources/tips/images/completion_in_html2.png
Binary files differ
diff --git a/python/resources/tips/images/completion_in_html2@2x.png b/python/resources/tips/images/completion_in_html2@2x.png
new file mode 100644
index 0000000..748e667
--- /dev/null
+++ b/python/resources/tips/images/completion_in_html2@2x.png
Binary files differ
diff --git a/python/resources/tips/images/completion_in_html2@2x_dark.png b/python/resources/tips/images/completion_in_html2@2x_dark.png
new file mode 100644
index 0000000..cb619b3
--- /dev/null
+++ b/python/resources/tips/images/completion_in_html2@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/completion_in_html2_dark.png b/python/resources/tips/images/completion_in_html2_dark.png
new file mode 100644
index 0000000..3064282
--- /dev/null
+++ b/python/resources/tips/images/completion_in_html2_dark.png
Binary files differ
diff --git a/python/resources/tips/images/completion_in_html@2x.png b/python/resources/tips/images/completion_in_html@2x.png
new file mode 100644
index 0000000..6a62d72
--- /dev/null
+++ b/python/resources/tips/images/completion_in_html@2x.png
Binary files differ
diff --git a/python/resources/tips/images/completion_in_html@2x_dark.png b/python/resources/tips/images/completion_in_html@2x_dark.png
new file mode 100644
index 0000000..ffbf466
--- /dev/null
+++ b/python/resources/tips/images/completion_in_html@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/completion_in_html_dark.png b/python/resources/tips/images/completion_in_html_dark.png
new file mode 100644
index 0000000..f845b3c
--- /dev/null
+++ b/python/resources/tips/images/completion_in_html_dark.png
Binary files differ
diff --git a/python/resources/tips/images/cssColor.png b/python/resources/tips/images/cssColor.png
new file mode 100644
index 0000000..a6bdd6e
--- /dev/null
+++ b/python/resources/tips/images/cssColor.png
Binary files differ
diff --git a/python/resources/tips/images/cssColor@2x.png b/python/resources/tips/images/cssColor@2x.png
new file mode 100644
index 0000000..e0f2723
--- /dev/null
+++ b/python/resources/tips/images/cssColor@2x.png
Binary files differ
diff --git a/python/resources/tips/images/cssColor@2x_dark.png b/python/resources/tips/images/cssColor@2x_dark.png
new file mode 100644
index 0000000..8ff841e
--- /dev/null
+++ b/python/resources/tips/images/cssColor@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/cssColor_dark.png b/python/resources/tips/images/cssColor_dark.png
new file mode 100644
index 0000000..e37bb9a
--- /dev/null
+++ b/python/resources/tips/images/cssColor_dark.png
Binary files differ
diff --git a/python/resources/tips/images/ctrl_click.png b/python/resources/tips/images/ctrl_click.png
new file mode 100644
index 0000000..fd35a03
--- /dev/null
+++ b/python/resources/tips/images/ctrl_click.png
Binary files differ
diff --git a/python/resources/tips/images/ctrl_click@2x.png b/python/resources/tips/images/ctrl_click@2x.png
new file mode 100644
index 0000000..7ce99f9
--- /dev/null
+++ b/python/resources/tips/images/ctrl_click@2x.png
Binary files differ
diff --git a/python/resources/tips/images/ctrl_click@2x_dark.png b/python/resources/tips/images/ctrl_click@2x_dark.png
new file mode 100644
index 0000000..09f5b04
--- /dev/null
+++ b/python/resources/tips/images/ctrl_click@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/ctrl_click_dark.png b/python/resources/tips/images/ctrl_click_dark.png
new file mode 100644
index 0000000..dc331f7
--- /dev/null
+++ b/python/resources/tips/images/ctrl_click_dark.png
Binary files differ
diff --git a/python/resources/tips/images/ctrl_shift_i.png b/python/resources/tips/images/ctrl_shift_i.png
new file mode 100644
index 0000000..fbb8786
--- /dev/null
+++ b/python/resources/tips/images/ctrl_shift_i.png
Binary files differ
diff --git a/python/resources/tips/images/ctrl_shift_i@2x.png b/python/resources/tips/images/ctrl_shift_i@2x.png
new file mode 100644
index 0000000..6bb2978
--- /dev/null
+++ b/python/resources/tips/images/ctrl_shift_i@2x.png
Binary files differ
diff --git a/python/resources/tips/images/ctrl_shift_i@2x_dark.png b/python/resources/tips/images/ctrl_shift_i@2x_dark.png
new file mode 100644
index 0000000..3e29df0
--- /dev/null
+++ b/python/resources/tips/images/ctrl_shift_i@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/ctrl_shift_i_dark.png b/python/resources/tips/images/ctrl_shift_i_dark.png
new file mode 100644
index 0000000..61201ff
--- /dev/null
+++ b/python/resources/tips/images/ctrl_shift_i_dark.png
Binary files differ
diff --git a/python/resources/tips/images/ctrl_shift_in_lookup.png b/python/resources/tips/images/ctrl_shift_in_lookup.png
new file mode 100644
index 0000000..073b31b
--- /dev/null
+++ b/python/resources/tips/images/ctrl_shift_in_lookup.png
Binary files differ
diff --git a/python/resources/tips/images/ctrl_shift_in_lookup@2x.png b/python/resources/tips/images/ctrl_shift_in_lookup@2x.png
new file mode 100644
index 0000000..ee49d45
--- /dev/null
+++ b/python/resources/tips/images/ctrl_shift_in_lookup@2x.png
Binary files differ
diff --git a/python/resources/tips/images/ctrl_shift_in_lookup@2x_dark.png b/python/resources/tips/images/ctrl_shift_in_lookup@2x_dark.png
new file mode 100644
index 0000000..5730d90
--- /dev/null
+++ b/python/resources/tips/images/ctrl_shift_in_lookup@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/ctrl_shift_in_lookup_dark.png b/python/resources/tips/images/ctrl_shift_in_lookup_dark.png
new file mode 100644
index 0000000..2ab9f9f
--- /dev/null
+++ b/python/resources/tips/images/ctrl_shift_in_lookup_dark.png
Binary files differ
diff --git a/python/resources/tips/images/default_template_language.png b/python/resources/tips/images/default_template_language.png
new file mode 100644
index 0000000..9e46fb1
--- /dev/null
+++ b/python/resources/tips/images/default_template_language.png
Binary files differ
diff --git a/python/resources/tips/images/default_template_language@2x.png b/python/resources/tips/images/default_template_language@2x.png
new file mode 100644
index 0000000..dddd008
--- /dev/null
+++ b/python/resources/tips/images/default_template_language@2x.png
Binary files differ
diff --git a/python/resources/tips/images/default_template_language@2x_dark.png b/python/resources/tips/images/default_template_language@2x_dark.png
new file mode 100644
index 0000000..fa48561
--- /dev/null
+++ b/python/resources/tips/images/default_template_language@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/default_template_language_dark.png b/python/resources/tips/images/default_template_language_dark.png
new file mode 100644
index 0000000..486b307
--- /dev/null
+++ b/python/resources/tips/images/default_template_language_dark.png
Binary files differ
diff --git a/python/resources/tips/images/deployment.png b/python/resources/tips/images/deployment.png
new file mode 100644
index 0000000..f104afa
--- /dev/null
+++ b/python/resources/tips/images/deployment.png
Binary files differ
diff --git a/python/resources/tips/images/deployment@2x.png b/python/resources/tips/images/deployment@2x.png
new file mode 100644
index 0000000..af593c2
--- /dev/null
+++ b/python/resources/tips/images/deployment@2x.png
Binary files differ
diff --git a/python/resources/tips/images/deployment@2x_dark.png b/python/resources/tips/images/deployment@2x_dark.png
new file mode 100644
index 0000000..ec478c0
--- /dev/null
+++ b/python/resources/tips/images/deployment@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/deployment_dark.png b/python/resources/tips/images/deployment_dark.png
new file mode 100644
index 0000000..6ed4686
--- /dev/null
+++ b/python/resources/tips/images/deployment_dark.png
Binary files differ
diff --git a/python/resources/tips/images/dragToOpen.png b/python/resources/tips/images/dragToOpen.png
new file mode 100644
index 0000000..30f5647
--- /dev/null
+++ b/python/resources/tips/images/dragToOpen.png
Binary files differ
diff --git a/python/resources/tips/images/dragToOpen@2x.png b/python/resources/tips/images/dragToOpen@2x.png
new file mode 100644
index 0000000..039e85b
--- /dev/null
+++ b/python/resources/tips/images/dragToOpen@2x.png
Binary files differ
diff --git a/python/resources/tips/images/dragToOpen@2x_dark.png b/python/resources/tips/images/dragToOpen@2x_dark.png
new file mode 100644
index 0000000..55e3a47
--- /dev/null
+++ b/python/resources/tips/images/dragToOpen@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/dragToOpen_dark.png b/python/resources/tips/images/dragToOpen_dark.png
new file mode 100644
index 0000000..666446e
--- /dev/null
+++ b/python/resources/tips/images/dragToOpen_dark.png
Binary files differ
diff --git a/python/resources/tips/images/editregexp.png b/python/resources/tips/images/editregexp.png
new file mode 100644
index 0000000..ccb059c
--- /dev/null
+++ b/python/resources/tips/images/editregexp.png
Binary files differ
diff --git a/python/resources/tips/images/editregexp@2x.png b/python/resources/tips/images/editregexp@2x.png
new file mode 100644
index 0000000..1d80b7a
--- /dev/null
+++ b/python/resources/tips/images/editregexp@2x.png
Binary files differ
diff --git a/python/resources/tips/images/editregexp@2x_dark.png b/python/resources/tips/images/editregexp@2x_dark.png
new file mode 100644
index 0000000..b2fb919
--- /dev/null
+++ b/python/resources/tips/images/editregexp@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/editregexp_dark.png b/python/resources/tips/images/editregexp_dark.png
new file mode 100644
index 0000000..37a44fc
--- /dev/null
+++ b/python/resources/tips/images/editregexp_dark.png
Binary files differ
diff --git a/python/resources/tips/images/emmet.png b/python/resources/tips/images/emmet.png
new file mode 100644
index 0000000..6c616f5
--- /dev/null
+++ b/python/resources/tips/images/emmet.png
Binary files differ
diff --git a/python/resources/tips/images/emmet@2x.png b/python/resources/tips/images/emmet@2x.png
new file mode 100644
index 0000000..2c5d963
--- /dev/null
+++ b/python/resources/tips/images/emmet@2x.png
Binary files differ
diff --git a/python/resources/tips/images/emmet@2x_dark.png b/python/resources/tips/images/emmet@2x_dark.png
new file mode 100644
index 0000000..37f6952
--- /dev/null
+++ b/python/resources/tips/images/emmet@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/emmet_dark.png b/python/resources/tips/images/emmet_dark.png
new file mode 100644
index 0000000..671bcd3
--- /dev/null
+++ b/python/resources/tips/images/emmet_dark.png
Binary files differ
diff --git a/python/resources/tips/images/enterDirectory.png b/python/resources/tips/images/enterDirectory.png
new file mode 100644
index 0000000..f5a882e
--- /dev/null
+++ b/python/resources/tips/images/enterDirectory.png
Binary files differ
diff --git a/python/resources/tips/images/enterDirectory@2x.png b/python/resources/tips/images/enterDirectory@2x.png
new file mode 100644
index 0000000..bfbadea
--- /dev/null
+++ b/python/resources/tips/images/enterDirectory@2x.png
Binary files differ
diff --git a/python/resources/tips/images/enterDirectory@2x_dark.png b/python/resources/tips/images/enterDirectory@2x_dark.png
new file mode 100644
index 0000000..b4e271b
--- /dev/null
+++ b/python/resources/tips/images/enterDirectory@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/enterDirectory_dark.png b/python/resources/tips/images/enterDirectory_dark.png
new file mode 100644
index 0000000..1facfef
--- /dev/null
+++ b/python/resources/tips/images/enterDirectory_dark.png
Binary files differ
diff --git a/python/resources/tips/images/extract_variable_1.png b/python/resources/tips/images/extract_variable_1.png
new file mode 100644
index 0000000..60e5d66
--- /dev/null
+++ b/python/resources/tips/images/extract_variable_1.png
Binary files differ
diff --git a/python/resources/tips/images/extract_variable_1@2x.png b/python/resources/tips/images/extract_variable_1@2x.png
new file mode 100644
index 0000000..b468e5f
--- /dev/null
+++ b/python/resources/tips/images/extract_variable_1@2x.png
Binary files differ
diff --git a/python/resources/tips/images/extract_variable_1@2x_dark.png b/python/resources/tips/images/extract_variable_1@2x_dark.png
new file mode 100644
index 0000000..dbc02db
--- /dev/null
+++ b/python/resources/tips/images/extract_variable_1@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/extract_variable_1_dark.png b/python/resources/tips/images/extract_variable_1_dark.png
new file mode 100644
index 0000000..7064766
--- /dev/null
+++ b/python/resources/tips/images/extract_variable_1_dark.png
Binary files differ
diff --git a/python/resources/tips/images/extract_variable_2.png b/python/resources/tips/images/extract_variable_2.png
new file mode 100644
index 0000000..4e3b767
--- /dev/null
+++ b/python/resources/tips/images/extract_variable_2.png
Binary files differ
diff --git a/python/resources/tips/images/extract_variable_2@2x.png b/python/resources/tips/images/extract_variable_2@2x.png
new file mode 100644
index 0000000..49cdf52
--- /dev/null
+++ b/python/resources/tips/images/extract_variable_2@2x.png
Binary files differ
diff --git a/python/resources/tips/images/extract_variable_2@2x_dark.png b/python/resources/tips/images/extract_variable_2@2x_dark.png
new file mode 100644
index 0000000..120e9a5
--- /dev/null
+++ b/python/resources/tips/images/extract_variable_2@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/extract_variable_2_dark.png b/python/resources/tips/images/extract_variable_2_dark.png
new file mode 100644
index 0000000..07e67b7
--- /dev/null
+++ b/python/resources/tips/images/extract_variable_2_dark.png
Binary files differ
diff --git a/python/resources/tips/images/gotoFileLineNumber.png b/python/resources/tips/images/gotoFileLineNumber.png
new file mode 100644
index 0000000..3d4f72a
--- /dev/null
+++ b/python/resources/tips/images/gotoFileLineNumber.png
Binary files differ
diff --git a/python/resources/tips/images/gotoFileLineNumber@2x.png b/python/resources/tips/images/gotoFileLineNumber@2x.png
new file mode 100644
index 0000000..5727edb
--- /dev/null
+++ b/python/resources/tips/images/gotoFileLineNumber@2x.png
Binary files differ
diff --git a/python/resources/tips/images/gotoFileLineNumber@2x_dark.png b/python/resources/tips/images/gotoFileLineNumber@2x_dark.png
new file mode 100644
index 0000000..5bd7da5
--- /dev/null
+++ b/python/resources/tips/images/gotoFileLineNumber@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/gotoFileLineNumber_dark.png b/python/resources/tips/images/gotoFileLineNumber_dark.png
new file mode 100644
index 0000000..52c9137
--- /dev/null
+++ b/python/resources/tips/images/gotoFileLineNumber_dark.png
Binary files differ
diff --git a/python/resources/tips/images/goto_class.png b/python/resources/tips/images/goto_class.png
new file mode 100644
index 0000000..8eb339e
--- /dev/null
+++ b/python/resources/tips/images/goto_class.png
Binary files differ
diff --git a/python/resources/tips/images/goto_class@2x.png b/python/resources/tips/images/goto_class@2x.png
new file mode 100644
index 0000000..e7fd228
--- /dev/null
+++ b/python/resources/tips/images/goto_class@2x.png
Binary files differ
diff --git a/python/resources/tips/images/goto_class@2x_dark.png b/python/resources/tips/images/goto_class@2x_dark.png
new file mode 100644
index 0000000..5c524ba
--- /dev/null
+++ b/python/resources/tips/images/goto_class@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/goto_class_dark.png b/python/resources/tips/images/goto_class_dark.png
new file mode 100644
index 0000000..6a9b461
--- /dev/null
+++ b/python/resources/tips/images/goto_class_dark.png
Binary files differ
diff --git a/python/resources/tips/images/goto_symbol.png b/python/resources/tips/images/goto_symbol.png
new file mode 100644
index 0000000..d10fdc3
--- /dev/null
+++ b/python/resources/tips/images/goto_symbol.png
Binary files differ
diff --git a/python/resources/tips/images/goto_symbol@2x.png b/python/resources/tips/images/goto_symbol@2x.png
new file mode 100644
index 0000000..86bae12
--- /dev/null
+++ b/python/resources/tips/images/goto_symbol@2x.png
Binary files differ
diff --git a/python/resources/tips/images/goto_symbol@2x_dark.png b/python/resources/tips/images/goto_symbol@2x_dark.png
new file mode 100644
index 0000000..03bf40e
--- /dev/null
+++ b/python/resources/tips/images/goto_symbol@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/goto_symbol_dark.png b/python/resources/tips/images/goto_symbol_dark.png
new file mode 100644
index 0000000..201ec69
--- /dev/null
+++ b/python/resources/tips/images/goto_symbol_dark.png
Binary files differ
diff --git a/python/resources/tips/images/goto_template_icon.png b/python/resources/tips/images/goto_template_icon.png
new file mode 100644
index 0000000..9a6f4f2
--- /dev/null
+++ b/python/resources/tips/images/goto_template_icon.png
Binary files differ
diff --git a/python/resources/tips/images/goto_template_icon@2x.png b/python/resources/tips/images/goto_template_icon@2x.png
new file mode 100644
index 0000000..28f1ef8
--- /dev/null
+++ b/python/resources/tips/images/goto_template_icon@2x.png
Binary files differ
diff --git a/python/resources/tips/images/goto_template_icon@2x_dark.png b/python/resources/tips/images/goto_template_icon@2x_dark.png
new file mode 100644
index 0000000..b9f13e1
--- /dev/null
+++ b/python/resources/tips/images/goto_template_icon@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/goto_template_icon_dark.png b/python/resources/tips/images/goto_template_icon_dark.png
new file mode 100644
index 0000000..5e91cc9
--- /dev/null
+++ b/python/resources/tips/images/goto_template_icon_dark.png
Binary files differ
diff --git a/python/resources/tips/images/goto_view.png b/python/resources/tips/images/goto_view.png
new file mode 100644
index 0000000..66fe571
--- /dev/null
+++ b/python/resources/tips/images/goto_view.png
Binary files differ
diff --git a/python/resources/tips/images/goto_view@2x.png b/python/resources/tips/images/goto_view@2x.png
new file mode 100644
index 0000000..8d7d74b
--- /dev/null
+++ b/python/resources/tips/images/goto_view@2x.png
Binary files differ
diff --git a/python/resources/tips/images/goto_view@2x_dark.png b/python/resources/tips/images/goto_view@2x_dark.png
new file mode 100644
index 0000000..11d399b
--- /dev/null
+++ b/python/resources/tips/images/goto_view@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/goto_view_dark.png b/python/resources/tips/images/goto_view_dark.png
new file mode 100644
index 0000000..df77bd4
--- /dev/null
+++ b/python/resources/tips/images/goto_view_dark.png
Binary files differ
diff --git a/python/resources/tips/images/goto_view_icon.png b/python/resources/tips/images/goto_view_icon.png
new file mode 100644
index 0000000..4f7dab9
--- /dev/null
+++ b/python/resources/tips/images/goto_view_icon.png
Binary files differ
diff --git a/python/resources/tips/images/goto_view_icon@2x.png b/python/resources/tips/images/goto_view_icon@2x.png
new file mode 100644
index 0000000..579d967
--- /dev/null
+++ b/python/resources/tips/images/goto_view_icon@2x.png
Binary files differ
diff --git a/python/resources/tips/images/goto_view_icon@2x_dark.png b/python/resources/tips/images/goto_view_icon@2x_dark.png
new file mode 100644
index 0000000..9a9c925
--- /dev/null
+++ b/python/resources/tips/images/goto_view_icon@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/goto_view_icon_dark.png b/python/resources/tips/images/goto_view_icon_dark.png
new file mode 100644
index 0000000..dd6a508
--- /dev/null
+++ b/python/resources/tips/images/goto_view_icon_dark.png
Binary files differ
diff --git a/python/resources/tips/images/hierarchy_browser.png b/python/resources/tips/images/hierarchy_browser.png
new file mode 100644
index 0000000..05bbb92
--- /dev/null
+++ b/python/resources/tips/images/hierarchy_browser.png
Binary files differ
diff --git a/python/resources/tips/images/hierarchy_browser@2x.png b/python/resources/tips/images/hierarchy_browser@2x.png
new file mode 100644
index 0000000..a2f4cd2
--- /dev/null
+++ b/python/resources/tips/images/hierarchy_browser@2x.png
Binary files differ
diff --git a/python/resources/tips/images/hierarchy_browser@2x_dark.png b/python/resources/tips/images/hierarchy_browser@2x_dark.png
new file mode 100644
index 0000000..4b120e8
--- /dev/null
+++ b/python/resources/tips/images/hierarchy_browser@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/hierarchy_browser_dark.png b/python/resources/tips/images/hierarchy_browser_dark.png
new file mode 100644
index 0000000..d52835c
--- /dev/null
+++ b/python/resources/tips/images/hierarchy_browser_dark.png
Binary files differ
diff --git a/python/resources/tips/images/image_completion.png b/python/resources/tips/images/image_completion.png
new file mode 100644
index 0000000..56a3599
--- /dev/null
+++ b/python/resources/tips/images/image_completion.png
Binary files differ
diff --git a/python/resources/tips/images/image_completion@2x.png b/python/resources/tips/images/image_completion@2x.png
new file mode 100644
index 0000000..2d96d83
--- /dev/null
+++ b/python/resources/tips/images/image_completion@2x.png
Binary files differ
diff --git a/python/resources/tips/images/image_completion@2x_dark.png b/python/resources/tips/images/image_completion@2x_dark.png
new file mode 100644
index 0000000..99f6e96
--- /dev/null
+++ b/python/resources/tips/images/image_completion@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/image_completion_dark.png b/python/resources/tips/images/image_completion_dark.png
new file mode 100644
index 0000000..3b396c9
--- /dev/null
+++ b/python/resources/tips/images/image_completion_dark.png
Binary files differ
diff --git a/python/resources/tips/images/image_lookup.png b/python/resources/tips/images/image_lookup.png
new file mode 100644
index 0000000..cdff22d
--- /dev/null
+++ b/python/resources/tips/images/image_lookup.png
Binary files differ
diff --git a/python/resources/tips/images/image_lookup@2x.png b/python/resources/tips/images/image_lookup@2x.png
new file mode 100644
index 0000000..05075dd
--- /dev/null
+++ b/python/resources/tips/images/image_lookup@2x.png
Binary files differ
diff --git a/python/resources/tips/images/image_lookup@2x_dark.png b/python/resources/tips/images/image_lookup@2x_dark.png
new file mode 100644
index 0000000..6ac2a46
--- /dev/null
+++ b/python/resources/tips/images/image_lookup@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/image_lookup_dark.png b/python/resources/tips/images/image_lookup_dark.png
new file mode 100644
index 0000000..75af27a
--- /dev/null
+++ b/python/resources/tips/images/image_lookup_dark.png
Binary files differ
diff --git a/python/resources/tips/images/issueNavigation.png b/python/resources/tips/images/issueNavigation.png
new file mode 100644
index 0000000..1fe9422
--- /dev/null
+++ b/python/resources/tips/images/issueNavigation.png
Binary files differ
diff --git a/python/resources/tips/images/issueNavigation1.png b/python/resources/tips/images/issueNavigation1.png
new file mode 100644
index 0000000..bc5c7bb
--- /dev/null
+++ b/python/resources/tips/images/issueNavigation1.png
Binary files differ
diff --git a/python/resources/tips/images/issueNavigation1@2x.png b/python/resources/tips/images/issueNavigation1@2x.png
new file mode 100644
index 0000000..31b4d3f
--- /dev/null
+++ b/python/resources/tips/images/issueNavigation1@2x.png
Binary files differ
diff --git a/python/resources/tips/images/issueNavigation1@2x_dark.png b/python/resources/tips/images/issueNavigation1@2x_dark.png
new file mode 100644
index 0000000..9a654a2
--- /dev/null
+++ b/python/resources/tips/images/issueNavigation1@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/issueNavigation1_dark.png b/python/resources/tips/images/issueNavigation1_dark.png
new file mode 100644
index 0000000..fa1cdc6
--- /dev/null
+++ b/python/resources/tips/images/issueNavigation1_dark.png
Binary files differ
diff --git a/python/resources/tips/images/issueNavigation@2x.png b/python/resources/tips/images/issueNavigation@2x.png
new file mode 100644
index 0000000..835c9db
--- /dev/null
+++ b/python/resources/tips/images/issueNavigation@2x.png
Binary files differ
diff --git a/python/resources/tips/images/issueNavigation@2x_dark.png b/python/resources/tips/images/issueNavigation@2x_dark.png
new file mode 100644
index 0000000..47e4270
--- /dev/null
+++ b/python/resources/tips/images/issueNavigation@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/issueNavigation_dark.png b/python/resources/tips/images/issueNavigation_dark.png
new file mode 100644
index 0000000..4085ed8
--- /dev/null
+++ b/python/resources/tips/images/issueNavigation_dark.png
Binary files differ
diff --git a/python/resources/tips/images/jumplist.png b/python/resources/tips/images/jumplist.png
new file mode 100644
index 0000000..6a195bc
--- /dev/null
+++ b/python/resources/tips/images/jumplist.png
Binary files differ
diff --git a/python/resources/tips/images/jumplist@2x.png b/python/resources/tips/images/jumplist@2x.png
new file mode 100644
index 0000000..a3b8d7e
--- /dev/null
+++ b/python/resources/tips/images/jumplist@2x.png
Binary files differ
diff --git a/python/resources/tips/images/jumplist@2x_dark.png b/python/resources/tips/images/jumplist@2x_dark.png
new file mode 100644
index 0000000..b9b279e
--- /dev/null
+++ b/python/resources/tips/images/jumplist@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/jumplist_dark.png b/python/resources/tips/images/jumplist_dark.png
new file mode 100644
index 0000000..3f0e906
--- /dev/null
+++ b/python/resources/tips/images/jumplist_dark.png
Binary files differ
diff --git a/python/resources/tips/images/launch_console_in_debugger.png b/python/resources/tips/images/launch_console_in_debugger.png
new file mode 100644
index 0000000..7725080
--- /dev/null
+++ b/python/resources/tips/images/launch_console_in_debugger.png
Binary files differ
diff --git a/python/resources/tips/images/launch_console_in_debugger@2x.png b/python/resources/tips/images/launch_console_in_debugger@2x.png
new file mode 100644
index 0000000..468c49c
--- /dev/null
+++ b/python/resources/tips/images/launch_console_in_debugger@2x.png
Binary files differ
diff --git a/python/resources/tips/images/launch_console_in_debugger@2x_dark.png b/python/resources/tips/images/launch_console_in_debugger@2x_dark.png
new file mode 100644
index 0000000..5f5381c
--- /dev/null
+++ b/python/resources/tips/images/launch_console_in_debugger@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/launch_console_in_debugger_dark.png b/python/resources/tips/images/launch_console_in_debugger_dark.png
new file mode 100644
index 0000000..9fa62e0
--- /dev/null
+++ b/python/resources/tips/images/launch_console_in_debugger_dark.png
Binary files differ
diff --git a/python/resources/tips/images/line_separator.png b/python/resources/tips/images/line_separator.png
new file mode 100644
index 0000000..61d20d1
--- /dev/null
+++ b/python/resources/tips/images/line_separator.png
Binary files differ
diff --git a/python/resources/tips/images/line_separator@2x.png b/python/resources/tips/images/line_separator@2x.png
new file mode 100644
index 0000000..bf67e11
--- /dev/null
+++ b/python/resources/tips/images/line_separator@2x.png
Binary files differ
diff --git a/python/resources/tips/images/line_separator@2x_dark.png b/python/resources/tips/images/line_separator@2x_dark.png
new file mode 100644
index 0000000..eb6f8ea
--- /dev/null
+++ b/python/resources/tips/images/line_separator@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/line_separator_dark.png b/python/resources/tips/images/line_separator_dark.png
new file mode 100644
index 0000000..3d8b1a6
--- /dev/null
+++ b/python/resources/tips/images/line_separator_dark.png
Binary files differ
diff --git a/python/resources/tips/images/line_separator_folder.png b/python/resources/tips/images/line_separator_folder.png
new file mode 100644
index 0000000..4ae8dc0
--- /dev/null
+++ b/python/resources/tips/images/line_separator_folder.png
Binary files differ
diff --git a/python/resources/tips/images/line_separator_folder@2x.png b/python/resources/tips/images/line_separator_folder@2x.png
new file mode 100644
index 0000000..782b58b
--- /dev/null
+++ b/python/resources/tips/images/line_separator_folder@2x.png
Binary files differ
diff --git a/python/resources/tips/images/line_separator_folder@2x_dark.png b/python/resources/tips/images/line_separator_folder@2x_dark.png
new file mode 100644
index 0000000..d8ab148
--- /dev/null
+++ b/python/resources/tips/images/line_separator_folder@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/line_separator_folder_dark.png b/python/resources/tips/images/line_separator_folder_dark.png
new file mode 100644
index 0000000..c02c201
--- /dev/null
+++ b/python/resources/tips/images/line_separator_folder_dark.png
Binary files differ
diff --git a/python/resources/tips/images/live_templates_1.png b/python/resources/tips/images/live_templates_1.png
new file mode 100644
index 0000000..b0fc105
--- /dev/null
+++ b/python/resources/tips/images/live_templates_1.png
Binary files differ
diff --git a/python/resources/tips/images/live_templates_1@2x.png b/python/resources/tips/images/live_templates_1@2x.png
new file mode 100644
index 0000000..ec45620
--- /dev/null
+++ b/python/resources/tips/images/live_templates_1@2x.png
Binary files differ
diff --git a/python/resources/tips/images/live_templates_1@2x_dark.png b/python/resources/tips/images/live_templates_1@2x_dark.png
new file mode 100644
index 0000000..c4dd574
--- /dev/null
+++ b/python/resources/tips/images/live_templates_1@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/live_templates_1_dark.png b/python/resources/tips/images/live_templates_1_dark.png
new file mode 100644
index 0000000..8e3da85
--- /dev/null
+++ b/python/resources/tips/images/live_templates_1_dark.png
Binary files differ
diff --git a/python/resources/tips/images/live_templates_2.png b/python/resources/tips/images/live_templates_2.png
new file mode 100644
index 0000000..2ed16fb
--- /dev/null
+++ b/python/resources/tips/images/live_templates_2.png
Binary files differ
diff --git a/python/resources/tips/images/live_templates_2@2x.png b/python/resources/tips/images/live_templates_2@2x.png
new file mode 100644
index 0000000..54e6b05
--- /dev/null
+++ b/python/resources/tips/images/live_templates_2@2x.png
Binary files differ
diff --git a/python/resources/tips/images/live_templates_2@2x_dark.png b/python/resources/tips/images/live_templates_2@2x_dark.png
new file mode 100644
index 0000000..89fbb74
--- /dev/null
+++ b/python/resources/tips/images/live_templates_2@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/live_templates_2_dark.png b/python/resources/tips/images/live_templates_2_dark.png
new file mode 100644
index 0000000..3431fde
--- /dev/null
+++ b/python/resources/tips/images/live_templates_2_dark.png
Binary files differ
diff --git a/python/resources/tips/images/lower_left.png b/python/resources/tips/images/lower_left.png
new file mode 100644
index 0000000..771913e
--- /dev/null
+++ b/python/resources/tips/images/lower_left.png
Binary files differ
diff --git a/python/resources/tips/images/lower_left@2x.png b/python/resources/tips/images/lower_left@2x.png
new file mode 100644
index 0000000..2839f40
--- /dev/null
+++ b/python/resources/tips/images/lower_left@2x.png
Binary files differ
diff --git a/python/resources/tips/images/lower_left@2x_dark.png b/python/resources/tips/images/lower_left@2x_dark.png
new file mode 100644
index 0000000..2c2a582
--- /dev/null
+++ b/python/resources/tips/images/lower_left@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/lower_left_dark.png b/python/resources/tips/images/lower_left_dark.png
new file mode 100644
index 0000000..19996d7
--- /dev/null
+++ b/python/resources/tips/images/lower_left_dark.png
Binary files differ
diff --git a/python/resources/tips/images/managepy.png b/python/resources/tips/images/managepy.png
new file mode 100644
index 0000000..6212233
--- /dev/null
+++ b/python/resources/tips/images/managepy.png
Binary files differ
diff --git a/python/resources/tips/images/managepy@2x.png b/python/resources/tips/images/managepy@2x.png
new file mode 100644
index 0000000..c29d6b7
--- /dev/null
+++ b/python/resources/tips/images/managepy@2x.png
Binary files differ
diff --git a/python/resources/tips/images/managepy@2x_dark.png b/python/resources/tips/images/managepy@2x_dark.png
new file mode 100644
index 0000000..d877856
--- /dev/null
+++ b/python/resources/tips/images/managepy@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/managepy_dark.png b/python/resources/tips/images/managepy_dark.png
new file mode 100644
index 0000000..9228a0d
--- /dev/null
+++ b/python/resources/tips/images/managepy_dark.png
Binary files differ
diff --git a/python/resources/tips/images/method_separator.png b/python/resources/tips/images/method_separator.png
new file mode 100644
index 0000000..e458b82
--- /dev/null
+++ b/python/resources/tips/images/method_separator.png
Binary files differ
diff --git a/python/resources/tips/images/method_separator@2x.png b/python/resources/tips/images/method_separator@2x.png
new file mode 100644
index 0000000..d7221f8
--- /dev/null
+++ b/python/resources/tips/images/method_separator@2x.png
Binary files differ
diff --git a/python/resources/tips/images/method_separator@2x_dark.png b/python/resources/tips/images/method_separator@2x_dark.png
new file mode 100644
index 0000000..9bd4e5d
--- /dev/null
+++ b/python/resources/tips/images/method_separator@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/method_separator_dark.png b/python/resources/tips/images/method_separator_dark.png
new file mode 100644
index 0000000..eed48d2
--- /dev/null
+++ b/python/resources/tips/images/method_separator_dark.png
Binary files differ
diff --git a/python/resources/tips/images/move_to_changelist.png b/python/resources/tips/images/move_to_changelist.png
new file mode 100644
index 0000000..e5e95ff
--- /dev/null
+++ b/python/resources/tips/images/move_to_changelist.png
Binary files differ
diff --git a/python/resources/tips/images/move_to_changelist@2x.png b/python/resources/tips/images/move_to_changelist@2x.png
new file mode 100644
index 0000000..893f9a9
--- /dev/null
+++ b/python/resources/tips/images/move_to_changelist@2x.png
Binary files differ
diff --git a/python/resources/tips/images/move_to_changelist@2x_dark.png b/python/resources/tips/images/move_to_changelist@2x_dark.png
new file mode 100644
index 0000000..389c34e
--- /dev/null
+++ b/python/resources/tips/images/move_to_changelist@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/move_to_changelist_dark.png b/python/resources/tips/images/move_to_changelist_dark.png
new file mode 100644
index 0000000..057bad2
--- /dev/null
+++ b/python/resources/tips/images/move_to_changelist_dark.png
Binary files differ
diff --git a/python/resources/tips/images/move_up_down_witharrows_down.png b/python/resources/tips/images/move_up_down_witharrows_down.png
new file mode 100644
index 0000000..cb9469f
--- /dev/null
+++ b/python/resources/tips/images/move_up_down_witharrows_down.png
Binary files differ
diff --git a/python/resources/tips/images/move_up_down_witharrows_down@2x.png b/python/resources/tips/images/move_up_down_witharrows_down@2x.png
new file mode 100644
index 0000000..1d689d7
--- /dev/null
+++ b/python/resources/tips/images/move_up_down_witharrows_down@2x.png
Binary files differ
diff --git a/python/resources/tips/images/move_up_down_witharrows_down@2x_dark.png b/python/resources/tips/images/move_up_down_witharrows_down@2x_dark.png
new file mode 100644
index 0000000..bb935b0
--- /dev/null
+++ b/python/resources/tips/images/move_up_down_witharrows_down@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/move_up_down_witharrows_down_dark.png b/python/resources/tips/images/move_up_down_witharrows_down_dark.png
new file mode 100644
index 0000000..2346d8c
--- /dev/null
+++ b/python/resources/tips/images/move_up_down_witharrows_down_dark.png
Binary files differ
diff --git a/python/resources/tips/images/move_up_down_witharrows_initial.png b/python/resources/tips/images/move_up_down_witharrows_initial.png
new file mode 100644
index 0000000..82fd746
--- /dev/null
+++ b/python/resources/tips/images/move_up_down_witharrows_initial.png
Binary files differ
diff --git a/python/resources/tips/images/move_up_down_witharrows_initial@2x.png b/python/resources/tips/images/move_up_down_witharrows_initial@2x.png
new file mode 100644
index 0000000..bd1792c
--- /dev/null
+++ b/python/resources/tips/images/move_up_down_witharrows_initial@2x.png
Binary files differ
diff --git a/python/resources/tips/images/move_up_down_witharrows_initial@2x_dark.png b/python/resources/tips/images/move_up_down_witharrows_initial@2x_dark.png
new file mode 100644
index 0000000..a476ac3
--- /dev/null
+++ b/python/resources/tips/images/move_up_down_witharrows_initial@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/move_up_down_witharrows_initial_dark.png b/python/resources/tips/images/move_up_down_witharrows_initial_dark.png
new file mode 100644
index 0000000..8b84ae8
--- /dev/null
+++ b/python/resources/tips/images/move_up_down_witharrows_initial_dark.png
Binary files differ
diff --git a/python/resources/tips/images/move_up_down_witharrows_up.png b/python/resources/tips/images/move_up_down_witharrows_up.png
new file mode 100644
index 0000000..e19c67b
--- /dev/null
+++ b/python/resources/tips/images/move_up_down_witharrows_up.png
Binary files differ
diff --git a/python/resources/tips/images/move_up_down_witharrows_up@2x.png b/python/resources/tips/images/move_up_down_witharrows_up@2x.png
new file mode 100644
index 0000000..d0008e2
--- /dev/null
+++ b/python/resources/tips/images/move_up_down_witharrows_up@2x.png
Binary files differ
diff --git a/python/resources/tips/images/move_up_down_witharrows_up@2x_dark.png b/python/resources/tips/images/move_up_down_witharrows_up@2x_dark.png
new file mode 100644
index 0000000..124866e
--- /dev/null
+++ b/python/resources/tips/images/move_up_down_witharrows_up@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/move_up_down_witharrows_up_dark.png b/python/resources/tips/images/move_up_down_witharrows_up_dark.png
new file mode 100644
index 0000000..7251cb3
--- /dev/null
+++ b/python/resources/tips/images/move_up_down_witharrows_up_dark.png
Binary files differ
diff --git a/python/resources/tips/images/navigateToFilePath.png b/python/resources/tips/images/navigateToFilePath.png
new file mode 100644
index 0000000..ae4b789
--- /dev/null
+++ b/python/resources/tips/images/navigateToFilePath.png
Binary files differ
diff --git a/python/resources/tips/images/navigateToFilePath@2x.png b/python/resources/tips/images/navigateToFilePath@2x.png
new file mode 100644
index 0000000..077f183
--- /dev/null
+++ b/python/resources/tips/images/navigateToFilePath@2x.png
Binary files differ
diff --git a/python/resources/tips/images/navigateToFilePath@2x_dark.png b/python/resources/tips/images/navigateToFilePath@2x_dark.png
new file mode 100644
index 0000000..a73df98
--- /dev/null
+++ b/python/resources/tips/images/navigateToFilePath@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/navigateToFilePath_dark.png b/python/resources/tips/images/navigateToFilePath_dark.png
new file mode 100644
index 0000000..756020e
--- /dev/null
+++ b/python/resources/tips/images/navigateToFilePath_dark.png
Binary files differ
diff --git a/python/resources/tips/images/navigationbar.png b/python/resources/tips/images/navigationbar.png
new file mode 100644
index 0000000..ba8c147
--- /dev/null
+++ b/python/resources/tips/images/navigationbar.png
Binary files differ
diff --git a/python/resources/tips/images/navigationbar@2x.png b/python/resources/tips/images/navigationbar@2x.png
new file mode 100644
index 0000000..fc2bcd0
--- /dev/null
+++ b/python/resources/tips/images/navigationbar@2x.png
Binary files differ
diff --git a/python/resources/tips/images/navigationbar@2x_dark.png b/python/resources/tips/images/navigationbar@2x_dark.png
new file mode 100644
index 0000000..5b69d32
--- /dev/null
+++ b/python/resources/tips/images/navigationbar@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/navigationbar_dark.png b/python/resources/tips/images/navigationbar_dark.png
new file mode 100644
index 0000000..03c5f6f
--- /dev/null
+++ b/python/resources/tips/images/navigationbar_dark.png
Binary files differ
diff --git a/python/resources/tips/images/override_methods.png b/python/resources/tips/images/override_methods.png
new file mode 100644
index 0000000..2234f7f
--- /dev/null
+++ b/python/resources/tips/images/override_methods.png
Binary files differ
diff --git a/python/resources/tips/images/override_methods@2x.png b/python/resources/tips/images/override_methods@2x.png
new file mode 100644
index 0000000..94a8307
--- /dev/null
+++ b/python/resources/tips/images/override_methods@2x.png
Binary files differ
diff --git a/python/resources/tips/images/override_methods@2x_dark.png b/python/resources/tips/images/override_methods@2x_dark.png
new file mode 100644
index 0000000..789ac6c
--- /dev/null
+++ b/python/resources/tips/images/override_methods@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/override_methods_dark.png b/python/resources/tips/images/override_methods_dark.png
new file mode 100644
index 0000000..3d32dc7
--- /dev/null
+++ b/python/resources/tips/images/override_methods_dark.png
Binary files differ
diff --git a/python/resources/tips/images/param_info.png b/python/resources/tips/images/param_info.png
new file mode 100644
index 0000000..b0b39e4
--- /dev/null
+++ b/python/resources/tips/images/param_info.png
Binary files differ
diff --git a/python/resources/tips/images/param_info@2x.png b/python/resources/tips/images/param_info@2x.png
new file mode 100644
index 0000000..6e63f83
--- /dev/null
+++ b/python/resources/tips/images/param_info@2x.png
Binary files differ
diff --git a/python/resources/tips/images/param_info@2x_dark.png b/python/resources/tips/images/param_info@2x_dark.png
new file mode 100644
index 0000000..b651411
--- /dev/null
+++ b/python/resources/tips/images/param_info@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/param_info_dark.png b/python/resources/tips/images/param_info_dark.png
new file mode 100644
index 0000000..dcf7651
--- /dev/null
+++ b/python/resources/tips/images/param_info_dark.png
Binary files differ
diff --git a/python/resources/tips/images/pyColoredFiles.png b/python/resources/tips/images/pyColoredFiles.png
new file mode 100644
index 0000000..b2c7ef9
--- /dev/null
+++ b/python/resources/tips/images/pyColoredFiles.png
Binary files differ
diff --git a/python/resources/tips/images/pyColoredFiles@2x.png b/python/resources/tips/images/pyColoredFiles@2x.png
new file mode 100644
index 0000000..3274e2f
--- /dev/null
+++ b/python/resources/tips/images/pyColoredFiles@2x.png
Binary files differ
diff --git a/python/resources/tips/images/pyColoredFiles@2x_dark.png b/python/resources/tips/images/pyColoredFiles@2x_dark.png
new file mode 100644
index 0000000..69e38f9
--- /dev/null
+++ b/python/resources/tips/images/pyColoredFiles@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/pyColoredFiles_dark.png b/python/resources/tips/images/pyColoredFiles_dark.png
new file mode 100644
index 0000000..61e0cc1
--- /dev/null
+++ b/python/resources/tips/images/pyColoredFiles_dark.png
Binary files differ
diff --git a/python/resources/tips/images/pyconsole.png b/python/resources/tips/images/pyconsole.png
new file mode 100644
index 0000000..b319f10
--- /dev/null
+++ b/python/resources/tips/images/pyconsole.png
Binary files differ
diff --git a/python/resources/tips/images/pyconsole@2x.png b/python/resources/tips/images/pyconsole@2x.png
new file mode 100644
index 0000000..caf7b5c
--- /dev/null
+++ b/python/resources/tips/images/pyconsole@2x.png
Binary files differ
diff --git a/python/resources/tips/images/pyconsole@2x_dark.png b/python/resources/tips/images/pyconsole@2x_dark.png
new file mode 100644
index 0000000..b05cee2
--- /dev/null
+++ b/python/resources/tips/images/pyconsole@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/pyconsole_dark.png b/python/resources/tips/images/pyconsole_dark.png
new file mode 100644
index 0000000..8748fe1
--- /dev/null
+++ b/python/resources/tips/images/pyconsole_dark.png
Binary files differ
diff --git a/python/resources/tips/images/quick_fix_options.png b/python/resources/tips/images/quick_fix_options.png
new file mode 100644
index 0000000..418a252
--- /dev/null
+++ b/python/resources/tips/images/quick_fix_options.png
Binary files differ
diff --git a/python/resources/tips/images/quick_fix_options@2x.png b/python/resources/tips/images/quick_fix_options@2x.png
new file mode 100644
index 0000000..21e6346
--- /dev/null
+++ b/python/resources/tips/images/quick_fix_options@2x.png
Binary files differ
diff --git a/python/resources/tips/images/quick_fix_options@2x_dark.png b/python/resources/tips/images/quick_fix_options@2x_dark.png
new file mode 100644
index 0000000..aaf91a6
--- /dev/null
+++ b/python/resources/tips/images/quick_fix_options@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/quick_fix_options_dark.png b/python/resources/tips/images/quick_fix_options_dark.png
new file mode 100644
index 0000000..8a80f47
--- /dev/null
+++ b/python/resources/tips/images/quick_fix_options_dark.png
Binary files differ
diff --git a/python/resources/tips/images/quick_javadoc.png b/python/resources/tips/images/quick_javadoc.png
new file mode 100644
index 0000000..b19982d
--- /dev/null
+++ b/python/resources/tips/images/quick_javadoc.png
Binary files differ
diff --git a/python/resources/tips/images/quick_javadoc@2x.png b/python/resources/tips/images/quick_javadoc@2x.png
new file mode 100644
index 0000000..abbfebc
--- /dev/null
+++ b/python/resources/tips/images/quick_javadoc@2x.png
Binary files differ
diff --git a/python/resources/tips/images/quick_javadoc@2x_dark.png b/python/resources/tips/images/quick_javadoc@2x_dark.png
new file mode 100644
index 0000000..8f971f5
--- /dev/null
+++ b/python/resources/tips/images/quick_javadoc@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/quick_javadoc_dark.png b/python/resources/tips/images/quick_javadoc_dark.png
new file mode 100644
index 0000000..7f482d4
--- /dev/null
+++ b/python/resources/tips/images/quick_javadoc_dark.png
Binary files differ
diff --git a/python/resources/tips/images/quick_javadoc_in_lookups.png b/python/resources/tips/images/quick_javadoc_in_lookups.png
new file mode 100644
index 0000000..f346e10
--- /dev/null
+++ b/python/resources/tips/images/quick_javadoc_in_lookups.png
Binary files differ
diff --git a/python/resources/tips/images/quick_javadoc_in_lookups@2x.png b/python/resources/tips/images/quick_javadoc_in_lookups@2x.png
new file mode 100644
index 0000000..d782d4a
--- /dev/null
+++ b/python/resources/tips/images/quick_javadoc_in_lookups@2x.png
Binary files differ
diff --git a/python/resources/tips/images/quick_javadoc_in_lookups@2x_dark.png b/python/resources/tips/images/quick_javadoc_in_lookups@2x_dark.png
new file mode 100644
index 0000000..5af062a
--- /dev/null
+++ b/python/resources/tips/images/quick_javadoc_in_lookups@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/quick_javadoc_in_lookups_dark.png b/python/resources/tips/images/quick_javadoc_in_lookups_dark.png
new file mode 100644
index 0000000..e1e954f
--- /dev/null
+++ b/python/resources/tips/images/quick_javadoc_in_lookups_dark.png
Binary files differ
diff --git a/python/resources/tips/images/quick_switch_scheme.png b/python/resources/tips/images/quick_switch_scheme.png
new file mode 100644
index 0000000..b1f99b5
--- /dev/null
+++ b/python/resources/tips/images/quick_switch_scheme.png
Binary files differ
diff --git a/python/resources/tips/images/quick_switch_scheme@2x.png b/python/resources/tips/images/quick_switch_scheme@2x.png
new file mode 100644
index 0000000..7a9a343
--- /dev/null
+++ b/python/resources/tips/images/quick_switch_scheme@2x.png
Binary files differ
diff --git a/python/resources/tips/images/quick_switch_scheme@2x_dark.png b/python/resources/tips/images/quick_switch_scheme@2x_dark.png
new file mode 100644
index 0000000..ee68d67
--- /dev/null
+++ b/python/resources/tips/images/quick_switch_scheme@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/quick_switch_scheme_dark.png b/python/resources/tips/images/quick_switch_scheme_dark.png
new file mode 100644
index 0000000..0ab7af5
--- /dev/null
+++ b/python/resources/tips/images/quick_switch_scheme_dark.png
Binary files differ
diff --git a/python/resources/tips/images/recentSearch.png b/python/resources/tips/images/recentSearch.png
new file mode 100644
index 0000000..1894939
--- /dev/null
+++ b/python/resources/tips/images/recentSearch.png
Binary files differ
diff --git a/python/resources/tips/images/recentSearch@2x.png b/python/resources/tips/images/recentSearch@2x.png
new file mode 100644
index 0000000..b39244b
--- /dev/null
+++ b/python/resources/tips/images/recentSearch@2x.png
Binary files differ
diff --git a/python/resources/tips/images/recentSearch@2x_dark.png b/python/resources/tips/images/recentSearch@2x_dark.png
new file mode 100644
index 0000000..15e255f
--- /dev/null
+++ b/python/resources/tips/images/recentSearch@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/recentSearch_dark.png b/python/resources/tips/images/recentSearch_dark.png
new file mode 100644
index 0000000..2c2acc5
--- /dev/null
+++ b/python/resources/tips/images/recentSearch_dark.png
Binary files differ
diff --git a/python/resources/tips/images/recent_changes.png b/python/resources/tips/images/recent_changes.png
new file mode 100644
index 0000000..27470ca
--- /dev/null
+++ b/python/resources/tips/images/recent_changes.png
Binary files differ
diff --git a/python/resources/tips/images/recent_changes@2x.png b/python/resources/tips/images/recent_changes@2x.png
new file mode 100644
index 0000000..60d873c
--- /dev/null
+++ b/python/resources/tips/images/recent_changes@2x.png
Binary files differ
diff --git a/python/resources/tips/images/recent_changes@2x_dark.png b/python/resources/tips/images/recent_changes@2x_dark.png
new file mode 100644
index 0000000..bf0463e
--- /dev/null
+++ b/python/resources/tips/images/recent_changes@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/recent_changes_dark.png b/python/resources/tips/images/recent_changes_dark.png
new file mode 100644
index 0000000..a3abbde
--- /dev/null
+++ b/python/resources/tips/images/recent_changes_dark.png
Binary files differ
diff --git a/python/resources/tips/images/recent_files_1.png b/python/resources/tips/images/recent_files_1.png
new file mode 100644
index 0000000..c10b423
--- /dev/null
+++ b/python/resources/tips/images/recent_files_1.png
Binary files differ
diff --git a/python/resources/tips/images/recent_files_1@2x.png b/python/resources/tips/images/recent_files_1@2x.png
new file mode 100644
index 0000000..634f836
--- /dev/null
+++ b/python/resources/tips/images/recent_files_1@2x.png
Binary files differ
diff --git a/python/resources/tips/images/recent_files_1@2x_dark.png b/python/resources/tips/images/recent_files_1@2x_dark.png
new file mode 100644
index 0000000..59ae46a
--- /dev/null
+++ b/python/resources/tips/images/recent_files_1@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/recent_files_1_dark.png b/python/resources/tips/images/recent_files_1_dark.png
new file mode 100644
index 0000000..1257769
--- /dev/null
+++ b/python/resources/tips/images/recent_files_1_dark.png
Binary files differ
diff --git a/python/resources/tips/images/recent_files_2.png b/python/resources/tips/images/recent_files_2.png
new file mode 100644
index 0000000..05698c8
--- /dev/null
+++ b/python/resources/tips/images/recent_files_2.png
Binary files differ
diff --git a/python/resources/tips/images/recent_files_2@2x.png b/python/resources/tips/images/recent_files_2@2x.png
new file mode 100644
index 0000000..7df083a
--- /dev/null
+++ b/python/resources/tips/images/recent_files_2@2x.png
Binary files differ
diff --git a/python/resources/tips/images/recent_files_2@2x_dark.png b/python/resources/tips/images/recent_files_2@2x_dark.png
new file mode 100644
index 0000000..f66da1b
--- /dev/null
+++ b/python/resources/tips/images/recent_files_2@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/recent_files_2_dark.png b/python/resources/tips/images/recent_files_2_dark.png
new file mode 100644
index 0000000..99cdf79
--- /dev/null
+++ b/python/resources/tips/images/recent_files_2_dark.png
Binary files differ
diff --git a/python/resources/tips/images/refactor_this.png b/python/resources/tips/images/refactor_this.png
new file mode 100644
index 0000000..1a5fc49
--- /dev/null
+++ b/python/resources/tips/images/refactor_this.png
Binary files differ
diff --git a/python/resources/tips/images/refactor_this@2x.png b/python/resources/tips/images/refactor_this@2x.png
new file mode 100644
index 0000000..698889b
--- /dev/null
+++ b/python/resources/tips/images/refactor_this@2x.png
Binary files differ
diff --git a/python/resources/tips/images/refactor_this@2x_dark.png b/python/resources/tips/images/refactor_this@2x_dark.png
new file mode 100644
index 0000000..78c122a
--- /dev/null
+++ b/python/resources/tips/images/refactor_this@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/refactor_this_dark.png b/python/resources/tips/images/refactor_this_dark.png
new file mode 100644
index 0000000..a832560
--- /dev/null
+++ b/python/resources/tips/images/refactor_this_dark.png
Binary files differ
diff --git a/python/resources/tips/images/rename.png b/python/resources/tips/images/rename.png
new file mode 100644
index 0000000..35d5335
--- /dev/null
+++ b/python/resources/tips/images/rename.png
Binary files differ
diff --git a/python/resources/tips/images/rename@2x.png b/python/resources/tips/images/rename@2x.png
new file mode 100644
index 0000000..26b49a4
--- /dev/null
+++ b/python/resources/tips/images/rename@2x.png
Binary files differ
diff --git a/python/resources/tips/images/rename@2x_dark.png b/python/resources/tips/images/rename@2x_dark.png
new file mode 100644
index 0000000..7bda594
--- /dev/null
+++ b/python/resources/tips/images/rename@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/rename_dark.png b/python/resources/tips/images/rename_dark.png
new file mode 100644
index 0000000..c5f96c3
--- /dev/null
+++ b/python/resources/tips/images/rename_dark.png
Binary files differ
diff --git a/python/resources/tips/images/reopen.png b/python/resources/tips/images/reopen.png
new file mode 100644
index 0000000..3cdb2df
--- /dev/null
+++ b/python/resources/tips/images/reopen.png
Binary files differ
diff --git a/python/resources/tips/images/reopen@2x.png b/python/resources/tips/images/reopen@2x.png
new file mode 100644
index 0000000..a0b61f5
--- /dev/null
+++ b/python/resources/tips/images/reopen@2x.png
Binary files differ
diff --git a/python/resources/tips/images/reopen@2x_dark.png b/python/resources/tips/images/reopen@2x_dark.png
new file mode 100644
index 0000000..ed33d6e
--- /dev/null
+++ b/python/resources/tips/images/reopen@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/reopen_dark.png b/python/resources/tips/images/reopen_dark.png
new file mode 100644
index 0000000..af7ba67
--- /dev/null
+++ b/python/resources/tips/images/reopen_dark.png
Binary files differ
diff --git a/python/resources/tips/images/searchEverywhere.png b/python/resources/tips/images/searchEverywhere.png
new file mode 100644
index 0000000..639f100
--- /dev/null
+++ b/python/resources/tips/images/searchEverywhere.png
Binary files differ
diff --git a/python/resources/tips/images/searchEverywhere@2x.png b/python/resources/tips/images/searchEverywhere@2x.png
new file mode 100644
index 0000000..9ef380c
--- /dev/null
+++ b/python/resources/tips/images/searchEverywhere@2x.png
Binary files differ
diff --git a/python/resources/tips/images/searchEverywhere@2x_dark.png b/python/resources/tips/images/searchEverywhere@2x_dark.png
new file mode 100644
index 0000000..2f6fa56
--- /dev/null
+++ b/python/resources/tips/images/searchEverywhere@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/searchEverywhere_dark.png b/python/resources/tips/images/searchEverywhere_dark.png
new file mode 100644
index 0000000..c71501a
--- /dev/null
+++ b/python/resources/tips/images/searchEverywhere_dark.png
Binary files differ
diff --git a/python/resources/tips/images/searchEverywhere_lense.png b/python/resources/tips/images/searchEverywhere_lense.png
new file mode 100644
index 0000000..d855d22
--- /dev/null
+++ b/python/resources/tips/images/searchEverywhere_lense.png
Binary files differ
diff --git a/python/resources/tips/images/searchEverywhere_lense@2x.png b/python/resources/tips/images/searchEverywhere_lense@2x.png
new file mode 100644
index 0000000..5255eca
--- /dev/null
+++ b/python/resources/tips/images/searchEverywhere_lense@2x.png
Binary files differ
diff --git a/python/resources/tips/images/searchEverywhere_lense@2x_dark.png b/python/resources/tips/images/searchEverywhere_lense@2x_dark.png
new file mode 100644
index 0000000..680c002
--- /dev/null
+++ b/python/resources/tips/images/searchEverywhere_lense@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/searchEverywhere_lense_dark.png b/python/resources/tips/images/searchEverywhere_lense_dark.png
new file mode 100644
index 0000000..1157f40
--- /dev/null
+++ b/python/resources/tips/images/searchEverywhere_lense_dark.png
Binary files differ
diff --git a/python/resources/tips/images/search_settings.png b/python/resources/tips/images/search_settings.png
new file mode 100644
index 0000000..31796e2
--- /dev/null
+++ b/python/resources/tips/images/search_settings.png
Binary files differ
diff --git a/python/resources/tips/images/search_settings@2x.png b/python/resources/tips/images/search_settings@2x.png
new file mode 100644
index 0000000..14212d4
--- /dev/null
+++ b/python/resources/tips/images/search_settings@2x.png
Binary files differ
diff --git a/python/resources/tips/images/search_settings@2x_dark.png b/python/resources/tips/images/search_settings@2x_dark.png
new file mode 100644
index 0000000..10a33a2
--- /dev/null
+++ b/python/resources/tips/images/search_settings@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/search_settings_dark.png b/python/resources/tips/images/search_settings_dark.png
new file mode 100644
index 0000000..32a05bc
--- /dev/null
+++ b/python/resources/tips/images/search_settings_dark.png
Binary files differ
diff --git a/python/resources/tips/images/select_in.png b/python/resources/tips/images/select_in.png
new file mode 100644
index 0000000..782ccc2
--- /dev/null
+++ b/python/resources/tips/images/select_in.png
Binary files differ
diff --git a/python/resources/tips/images/select_in@2x.png b/python/resources/tips/images/select_in@2x.png
new file mode 100644
index 0000000..68aec61
--- /dev/null
+++ b/python/resources/tips/images/select_in@2x.png
Binary files differ
diff --git a/python/resources/tips/images/select_in@2x_dark.png b/python/resources/tips/images/select_in@2x_dark.png
new file mode 100644
index 0000000..993408d
--- /dev/null
+++ b/python/resources/tips/images/select_in@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/select_in_dark.png b/python/resources/tips/images/select_in_dark.png
new file mode 100644
index 0000000..8ead246
--- /dev/null
+++ b/python/resources/tips/images/select_in_dark.png
Binary files differ
diff --git a/python/resources/tips/images/select_tasks.png b/python/resources/tips/images/select_tasks.png
new file mode 100644
index 0000000..1c9aa89
--- /dev/null
+++ b/python/resources/tips/images/select_tasks.png
Binary files differ
diff --git a/python/resources/tips/images/select_tasks@2x.png b/python/resources/tips/images/select_tasks@2x.png
new file mode 100644
index 0000000..58a42c0
--- /dev/null
+++ b/python/resources/tips/images/select_tasks@2x.png
Binary files differ
diff --git a/python/resources/tips/images/select_tasks@2x_dark.png b/python/resources/tips/images/select_tasks@2x_dark.png
new file mode 100644
index 0000000..59272a3
--- /dev/null
+++ b/python/resources/tips/images/select_tasks@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/select_tasks_dark.png b/python/resources/tips/images/select_tasks_dark.png
new file mode 100644
index 0000000..7d00152
--- /dev/null
+++ b/python/resources/tips/images/select_tasks_dark.png
Binary files differ
diff --git a/python/resources/tips/images/showToolWindows.png b/python/resources/tips/images/showToolWindows.png
new file mode 100644
index 0000000..2a925b2
--- /dev/null
+++ b/python/resources/tips/images/showToolWindows.png
Binary files differ
diff --git a/python/resources/tips/images/showToolWindows@2x.png b/python/resources/tips/images/showToolWindows@2x.png
new file mode 100644
index 0000000..db1071b
--- /dev/null
+++ b/python/resources/tips/images/showToolWindows@2x.png
Binary files differ
diff --git a/python/resources/tips/images/showToolWindows@2x_dark.png b/python/resources/tips/images/showToolWindows@2x_dark.png
new file mode 100644
index 0000000..06c3878
--- /dev/null
+++ b/python/resources/tips/images/showToolWindows@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/showToolWindows_dark.png b/python/resources/tips/images/showToolWindows_dark.png
new file mode 100644
index 0000000..471d3b7
--- /dev/null
+++ b/python/resources/tips/images/showToolWindows_dark.png
Binary files differ
diff --git a/python/resources/tips/images/showUsages.png b/python/resources/tips/images/showUsages.png
new file mode 100644
index 0000000..196992b
--- /dev/null
+++ b/python/resources/tips/images/showUsages.png
Binary files differ
diff --git a/python/resources/tips/images/showUsages@2x.png b/python/resources/tips/images/showUsages@2x.png
new file mode 100644
index 0000000..694a59c
--- /dev/null
+++ b/python/resources/tips/images/showUsages@2x.png
Binary files differ
diff --git a/python/resources/tips/images/showUsages@2x_dark.png b/python/resources/tips/images/showUsages@2x_dark.png
new file mode 100644
index 0000000..b0abb99
--- /dev/null
+++ b/python/resources/tips/images/showUsages@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/showUsages_dark.png b/python/resources/tips/images/showUsages_dark.png
new file mode 100644
index 0000000..b6ebb3e
--- /dev/null
+++ b/python/resources/tips/images/showUsages_dark.png
Binary files differ
diff --git a/python/resources/tips/images/show_applied_styles.png b/python/resources/tips/images/show_applied_styles.png
new file mode 100644
index 0000000..1f6988b
--- /dev/null
+++ b/python/resources/tips/images/show_applied_styles.png
Binary files differ
diff --git a/python/resources/tips/images/show_applied_styles@2x.png b/python/resources/tips/images/show_applied_styles@2x.png
new file mode 100644
index 0000000..e0720cb
--- /dev/null
+++ b/python/resources/tips/images/show_applied_styles@2x.png
Binary files differ
diff --git a/python/resources/tips/images/show_applied_styles@2x_dark.png b/python/resources/tips/images/show_applied_styles@2x_dark.png
new file mode 100644
index 0000000..8fa79d6
--- /dev/null
+++ b/python/resources/tips/images/show_applied_styles@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/show_applied_styles_dark.png b/python/resources/tips/images/show_applied_styles_dark.png
new file mode 100644
index 0000000..f403cd1
--- /dev/null
+++ b/python/resources/tips/images/show_applied_styles_dark.png
Binary files differ
diff --git a/python/resources/tips/images/show_hide_tool_window_bars.png b/python/resources/tips/images/show_hide_tool_window_bars.png
new file mode 100644
index 0000000..bf752ce
--- /dev/null
+++ b/python/resources/tips/images/show_hide_tool_window_bars.png
Binary files differ
diff --git a/python/resources/tips/images/show_hide_tool_window_bars@2x.png b/python/resources/tips/images/show_hide_tool_window_bars@2x.png
new file mode 100644
index 0000000..994df87
--- /dev/null
+++ b/python/resources/tips/images/show_hide_tool_window_bars@2x.png
Binary files differ
diff --git a/python/resources/tips/images/show_hide_tool_window_bars@2x_dark.png b/python/resources/tips/images/show_hide_tool_window_bars@2x_dark.png
new file mode 100644
index 0000000..8229751
--- /dev/null
+++ b/python/resources/tips/images/show_hide_tool_window_bars@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/show_hide_tool_window_bars_dark.png b/python/resources/tips/images/show_hide_tool_window_bars_dark.png
new file mode 100644
index 0000000..083029c
--- /dev/null
+++ b/python/resources/tips/images/show_hide_tool_window_bars_dark.png
Binary files differ
diff --git a/python/resources/tips/images/sidebyside.png b/python/resources/tips/images/sidebyside.png
new file mode 100644
index 0000000..8d004bc
--- /dev/null
+++ b/python/resources/tips/images/sidebyside.png
Binary files differ
diff --git a/python/resources/tips/images/sidebyside@2x.png b/python/resources/tips/images/sidebyside@2x.png
new file mode 100644
index 0000000..9cf631a
--- /dev/null
+++ b/python/resources/tips/images/sidebyside@2x.png
Binary files differ
diff --git a/python/resources/tips/images/sidebyside@2x_dark.png b/python/resources/tips/images/sidebyside@2x_dark.png
new file mode 100644
index 0000000..c64e919
--- /dev/null
+++ b/python/resources/tips/images/sidebyside@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/sidebyside_dark.png b/python/resources/tips/images/sidebyside_dark.png
new file mode 100644
index 0000000..c55c6e3
--- /dev/null
+++ b/python/resources/tips/images/sidebyside_dark.png
Binary files differ
diff --git a/python/resources/tips/images/speed_search.png b/python/resources/tips/images/speed_search.png
new file mode 100644
index 0000000..2e58d33
--- /dev/null
+++ b/python/resources/tips/images/speed_search.png
Binary files differ
diff --git a/python/resources/tips/images/speed_search@2x.png b/python/resources/tips/images/speed_search@2x.png
new file mode 100644
index 0000000..60b5f2e
--- /dev/null
+++ b/python/resources/tips/images/speed_search@2x.png
Binary files differ
diff --git a/python/resources/tips/images/speed_search@2x_dark.png b/python/resources/tips/images/speed_search@2x_dark.png
new file mode 100644
index 0000000..112b381
--- /dev/null
+++ b/python/resources/tips/images/speed_search@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/speed_search_dark.png b/python/resources/tips/images/speed_search_dark.png
new file mode 100644
index 0000000..86642ce
--- /dev/null
+++ b/python/resources/tips/images/speed_search_dark.png
Binary files differ
diff --git a/python/resources/tips/images/switcher.png b/python/resources/tips/images/switcher.png
new file mode 100644
index 0000000..2a4cbcd
--- /dev/null
+++ b/python/resources/tips/images/switcher.png
Binary files differ
diff --git a/python/resources/tips/images/switcher@2x.png b/python/resources/tips/images/switcher@2x.png
new file mode 100644
index 0000000..1fb023f
--- /dev/null
+++ b/python/resources/tips/images/switcher@2x.png
Binary files differ
diff --git a/python/resources/tips/images/switcher@2x_dark.png b/python/resources/tips/images/switcher@2x_dark.png
new file mode 100644
index 0000000..b36a0e6
--- /dev/null
+++ b/python/resources/tips/images/switcher@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/switcher_dark.png b/python/resources/tips/images/switcher_dark.png
new file mode 100644
index 0000000..0549a5a
--- /dev/null
+++ b/python/resources/tips/images/switcher_dark.png
Binary files differ
diff --git a/python/resources/tips/images/tagNameCompletion.png b/python/resources/tips/images/tagNameCompletion.png
new file mode 100644
index 0000000..e711aa8
--- /dev/null
+++ b/python/resources/tips/images/tagNameCompletion.png
Binary files differ
diff --git a/python/resources/tips/images/tagNameCompletion@2x.png b/python/resources/tips/images/tagNameCompletion@2x.png
new file mode 100644
index 0000000..2942719
--- /dev/null
+++ b/python/resources/tips/images/tagNameCompletion@2x.png
Binary files differ
diff --git a/python/resources/tips/images/tagNameCompletion@2x_dark.png b/python/resources/tips/images/tagNameCompletion@2x_dark.png
new file mode 100644
index 0000000..71bd316
--- /dev/null
+++ b/python/resources/tips/images/tagNameCompletion@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/tagNameCompletion_dark.png b/python/resources/tips/images/tagNameCompletion_dark.png
new file mode 100644
index 0000000..1e6971d
--- /dev/null
+++ b/python/resources/tips/images/tagNameCompletion_dark.png
Binary files differ
diff --git a/python/resources/tips/images/terminal.png b/python/resources/tips/images/terminal.png
new file mode 100644
index 0000000..f717743
--- /dev/null
+++ b/python/resources/tips/images/terminal.png
Binary files differ
diff --git a/python/resources/tips/images/terminal@2x.png b/python/resources/tips/images/terminal@2x.png
new file mode 100644
index 0000000..2d75b4f
--- /dev/null
+++ b/python/resources/tips/images/terminal@2x.png
Binary files differ
diff --git a/python/resources/tips/images/terminal@2x_dark.png b/python/resources/tips/images/terminal@2x_dark.png
new file mode 100644
index 0000000..9cdd82e
--- /dev/null
+++ b/python/resources/tips/images/terminal@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/terminal_dark.png b/python/resources/tips/images/terminal_dark.png
new file mode 100644
index 0000000..54ae051
--- /dev/null
+++ b/python/resources/tips/images/terminal_dark.png
Binary files differ
diff --git a/python/resources/tips/images/todo_preview.png b/python/resources/tips/images/todo_preview.png
new file mode 100644
index 0000000..8475624
--- /dev/null
+++ b/python/resources/tips/images/todo_preview.png
Binary files differ
diff --git a/python/resources/tips/images/todo_preview@2x.png b/python/resources/tips/images/todo_preview@2x.png
new file mode 100644
index 0000000..9962b2b
--- /dev/null
+++ b/python/resources/tips/images/todo_preview@2x.png
Binary files differ
diff --git a/python/resources/tips/images/todo_preview@2x_dark.png b/python/resources/tips/images/todo_preview@2x_dark.png
new file mode 100644
index 0000000..6caef92
--- /dev/null
+++ b/python/resources/tips/images/todo_preview@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/todo_preview_dark.png b/python/resources/tips/images/todo_preview_dark.png
new file mode 100644
index 0000000..a0c50eb
--- /dev/null
+++ b/python/resources/tips/images/todo_preview_dark.png
Binary files differ
diff --git a/python/resources/tips/images/todo_scopes.png b/python/resources/tips/images/todo_scopes.png
new file mode 100644
index 0000000..8121347
--- /dev/null
+++ b/python/resources/tips/images/todo_scopes.png
Binary files differ
diff --git a/python/resources/tips/images/todo_scopes@2x.png b/python/resources/tips/images/todo_scopes@2x.png
new file mode 100644
index 0000000..e395360
--- /dev/null
+++ b/python/resources/tips/images/todo_scopes@2x.png
Binary files differ
diff --git a/python/resources/tips/images/todo_scopes@2x_dark.png b/python/resources/tips/images/todo_scopes@2x_dark.png
new file mode 100644
index 0000000..ec8a301
--- /dev/null
+++ b/python/resources/tips/images/todo_scopes@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/todo_scopes_dark.png b/python/resources/tips/images/todo_scopes_dark.png
new file mode 100644
index 0000000..2a2a056
--- /dev/null
+++ b/python/resources/tips/images/todo_scopes_dark.png
Binary files differ
diff --git a/python/resources/tips/images/try_except.png b/python/resources/tips/images/try_except.png
new file mode 100644
index 0000000..918275f
--- /dev/null
+++ b/python/resources/tips/images/try_except.png
Binary files differ
diff --git a/python/resources/tips/images/try_except@2x.png b/python/resources/tips/images/try_except@2x.png
new file mode 100644
index 0000000..6336bbc
--- /dev/null
+++ b/python/resources/tips/images/try_except@2x.png
Binary files differ
diff --git a/python/resources/tips/images/try_except@2x_dark.png b/python/resources/tips/images/try_except@2x_dark.png
new file mode 100644
index 0000000..32f100a
--- /dev/null
+++ b/python/resources/tips/images/try_except@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/try_except_dark.png b/python/resources/tips/images/try_except_dark.png
new file mode 100644
index 0000000..5c12670
--- /dev/null
+++ b/python/resources/tips/images/try_except_dark.png
Binary files differ
diff --git a/python/resources/tips/images/vcsQuickList.png b/python/resources/tips/images/vcsQuickList.png
new file mode 100644
index 0000000..61209a6
--- /dev/null
+++ b/python/resources/tips/images/vcsQuickList.png
Binary files differ
diff --git a/python/resources/tips/images/vcsQuickList@2x.png b/python/resources/tips/images/vcsQuickList@2x.png
new file mode 100644
index 0000000..e473510
--- /dev/null
+++ b/python/resources/tips/images/vcsQuickList@2x.png
Binary files differ
diff --git a/python/resources/tips/images/vcsQuickList@2x_dark.png b/python/resources/tips/images/vcsQuickList@2x_dark.png
new file mode 100644
index 0000000..0749190
--- /dev/null
+++ b/python/resources/tips/images/vcsQuickList@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/vcsQuickList_dark.png b/python/resources/tips/images/vcsQuickList_dark.png
new file mode 100644
index 0000000..0c8cbe4
--- /dev/null
+++ b/python/resources/tips/images/vcsQuickList_dark.png
Binary files differ
diff --git a/python/resources/tips/images/wildcard_goto.png b/python/resources/tips/images/wildcard_goto.png
new file mode 100644
index 0000000..3486682
--- /dev/null
+++ b/python/resources/tips/images/wildcard_goto.png
Binary files differ
diff --git a/python/resources/tips/images/wildcard_goto@2x.png b/python/resources/tips/images/wildcard_goto@2x.png
new file mode 100644
index 0000000..557f5b2
--- /dev/null
+++ b/python/resources/tips/images/wildcard_goto@2x.png
Binary files differ
diff --git a/python/resources/tips/images/wildcard_goto@2x_dark.png b/python/resources/tips/images/wildcard_goto@2x_dark.png
new file mode 100644
index 0000000..06d01e5
--- /dev/null
+++ b/python/resources/tips/images/wildcard_goto@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/wildcard_goto_dark.png b/python/resources/tips/images/wildcard_goto_dark.png
new file mode 100644
index 0000000..1f7340e
--- /dev/null
+++ b/python/resources/tips/images/wildcard_goto_dark.png
Binary files differ
diff --git a/python/resources/tips/images/word_completion.png b/python/resources/tips/images/word_completion.png
new file mode 100644
index 0000000..ae32b93
--- /dev/null
+++ b/python/resources/tips/images/word_completion.png
Binary files differ
diff --git a/python/resources/tips/images/word_completion@2x.png b/python/resources/tips/images/word_completion@2x.png
new file mode 100644
index 0000000..2bfed89
--- /dev/null
+++ b/python/resources/tips/images/word_completion@2x.png
Binary files differ
diff --git a/python/resources/tips/images/word_completion@2x_dark.png b/python/resources/tips/images/word_completion@2x_dark.png
new file mode 100644
index 0000000..bcdc558
--- /dev/null
+++ b/python/resources/tips/images/word_completion@2x_dark.png
Binary files differ
diff --git a/python/resources/tips/images/word_completion_dark.png b/python/resources/tips/images/word_completion_dark.png
new file mode 100644
index 0000000..199bcfb
--- /dev/null
+++ b/python/resources/tips/images/word_completion_dark.png
Binary files differ
diff --git a/python/resources/tips/moveFileToChangelist.html b/python/resources/tips/moveFileToChangelist.html
new file mode 100644
index 0000000..7ec305e
--- /dev/null
+++ b/python/resources/tips/moveFileToChangelist.html
@@ -0,0 +1,16 @@
+<html>
+<head>
+ <link rel="stylesheet" type="text/css" href="css/tips.css">
+</head>
+<body>
+
+
+<p>
+You can move any file to a changelist of your choice. To do that, just choose
+<span class="control">Move to Changelist</span> on the file context menu in the Changes tool window:
+</p>
+
+<p class="image"><img src="images/move_to_changelist.png"></p>
+
+</body>
+</html>
diff --git a/python/rest/resources/META-INF/plugin.xml b/python/rest/resources/META-INF/plugin.xml
index 06cd1f4..76e5727 100644
--- a/python/rest/resources/META-INF/plugin.xml
+++ b/python/rest/resources/META-INF/plugin.xml
@@ -3,12 +3,16 @@
<id>org.jetbrains.plugins.rest</id>
<description>This plugin enables support for reStructuredText files (*.rst)</description>
<vendor>JetBrains</vendor>
- <version>132.SNAPSHOT</version>
- <idea-version since-build="130.1" until-build="133.0"/>
+ <version>134.SNAPSHOT</version>
+ <idea-version since-build="130.1"/>
<depends>com.intellij.modules.lang</depends>
<xi:include href="/META-INF/rest.xml" xpointer="xpointer(/idea-plugin/*)"/>
-
+ <change-notes><![CDATA[
+ <ul>
+ <li>Added inspection for title & underline length math (PY-10998)</li>
+ </ul>
+]]></change-notes>
<extensions defaultExtensionNs="com.intellij">
<errorHandler implementation="com.intellij.diagnostic.ITNReporter"/>
</extensions>
diff --git a/python/rest/resources/icons/com/jetbrains/rest/rst.png b/python/rest/resources/icons/com/jetbrains/rest/rst.png
index 2b7fcd7..9a423a4 100644
--- a/python/rest/resources/icons/com/jetbrains/rest/rst.png
+++ b/python/rest/resources/icons/com/jetbrains/rest/rst.png
Binary files differ
diff --git a/python/rest/src/com/jetbrains/rest/RestBundle.java b/python/rest/src/com/jetbrains/rest/RestBundle.java
index ed1b663..5884d2c 100644
--- a/python/rest/src/com/jetbrains/rest/RestBundle.java
+++ b/python/rest/src/com/jetbrains/rest/RestBundle.java
@@ -18,6 +18,7 @@
import com.intellij.CommonBundle;
import com.intellij.reference.SoftReference;
import org.jetbrains.annotations.NonNls;
+import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.PropertyKey;
import java.lang.ref.Reference;
@@ -29,22 +30,21 @@
* User : catherine
*/
public class RestBundle {
- private static Reference<ResourceBundle> ourBundle;
+ public static String message(@NotNull @PropertyKey(resourceBundle = BUNDLE) String key, @NotNull Object... params) {
+ return CommonBundle.message(getBundle(), key, params);
+ }
+
+ private static Reference<ResourceBundle> ourBundle;
@NonNls
private static final String BUNDLE = "com.jetbrains.rest.RestBundle";
private RestBundle() {
}
- public static String message(@PropertyKey(resourceBundle = BUNDLE)String key, Object... params) {
- return CommonBundle.message(getBundle(), key, params);
- }
-
// Cached loading
private static ResourceBundle getBundle() {
- ResourceBundle bundle = null;
- if (ourBundle != null) bundle = ourBundle.get();
+ ResourceBundle bundle = SoftReference.dereference(ourBundle);
if (bundle == null) {
bundle = ResourceBundle.getBundle(BUNDLE);
ourBundle = new SoftReference<ResourceBundle>(bundle);
diff --git a/python/rest/src/com/jetbrains/rest/RestBundle.properties b/python/rest/src/com/jetbrains/rest/RestBundle.properties
index 24b98c7..192f443 100644
--- a/python/rest/src/com/jetbrains/rest/RestBundle.properties
+++ b/python/rest/src/com/jetbrains/rest/RestBundle.properties
@@ -9,6 +9,7 @@
### Annotators ###
ANN.unknown.target=Unknown target name ''{0}''
ANN.duplicate.target=Duplicate explicit target name ''{0}''
+ANN.title.length=Title length must match the underline
ANN.unusable.anonymous.target=Anonymous hyperlink target has no reference
ANN.inline.block=Blank line is required after a literal block
diff --git a/python/rest/src/com/jetbrains/rest/RestGotoProvider.java b/python/rest/src/com/jetbrains/rest/RestGotoProvider.java
index 6526202..f032851 100644
--- a/python/rest/src/com/jetbrains/rest/RestGotoProvider.java
+++ b/python/rest/src/com/jetbrains/rest/RestGotoProvider.java
@@ -20,19 +20,21 @@
import com.intellij.psi.PsiElement;
import com.intellij.psi.util.PsiTreeUtil;
import com.jetbrains.rest.psi.RestReference;
+import org.jetbrains.annotations.Nullable;
/**
- * User : catherine
+ * @author catherine
*/
public class RestGotoProvider extends GotoDeclarationHandlerBase {
-
- public PsiElement getGotoDeclarationTarget(PsiElement source, Editor editor) {
+ @Override
+ public PsiElement getGotoDeclarationTarget(@Nullable PsiElement source, Editor editor) {
if (source != null && source.getLanguage() instanceof RestLanguage) {
RestReference ref = PsiTreeUtil.getParentOfType(source, RestReference.class);
if (ref != null) {
return ref.resolve();
}
}
+
return null;
}
}
diff --git a/python/rest/src/com/jetbrains/rest/RestLanguage.java b/python/rest/src/com/jetbrains/rest/RestLanguage.java
index c451e37..df05659 100644
--- a/python/rest/src/com/jetbrains/rest/RestLanguage.java
+++ b/python/rest/src/com/jetbrains/rest/RestLanguage.java
@@ -17,10 +17,7 @@
import com.intellij.lang.Language;
import com.intellij.psi.templateLanguages.TemplateLanguage;
-import com.jetbrains.rest.validation.RestAnnotator;
-import com.jetbrains.rest.validation.RestHyperlinksAnnotator;
-import com.jetbrains.rest.validation.RestInlineBlockAnnotator;
-import com.jetbrains.rest.validation.RestReferenceTargetAnnotator;
+import com.jetbrains.rest.validation.*;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
@@ -48,6 +45,7 @@
_annotators.add(RestHyperlinksAnnotator.class);
_annotators.add(RestReferenceTargetAnnotator.class);
_annotators.add(RestInlineBlockAnnotator.class);
+ _annotators.add(RestTitleAnnotator.class);
}
public Set<Class<? extends RestAnnotator>> getAnnotators() {
diff --git a/python/rest/src/com/jetbrains/rest/lexer/_RestFlexLexer.java b/python/rest/src/com/jetbrains/rest/lexer/_RestFlexLexer.java
index 41c44c0..8c3a1de 100644
--- a/python/rest/src/com/jetbrains/rest/lexer/_RestFlexLexer.java
+++ b/python/rest/src/com/jetbrains/rest/lexer/_RestFlexLexer.java
@@ -1,20 +1,4 @@
-/*
- * Copyright 2000-2013 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/* The following code was generated by JFlex 1.4.3 on 12/26/12 1:46 PM */
+/* The following code was generated by JFlex 1.4.3 on 12/17/13 7:08 PM */
package com.jetbrains.rest.lexer;
@@ -25,10 +9,10 @@
/* Auto generated File */
/**
- * This class is a scanner generated by
+ * This class is a scanner generated by
* <a href="http://www.jflex.de/">JFlex</a> 1.4.3
- * on 12/26/12 1:46 PM from the specification file
- * <tt>./rest.flex</tt>
+ * on 12/17/13 7:08 PM from the specification file
+ * <tt>/home/ktisha/IDEA/tools/lexer/../../community/python/rest/src/com/jetbrains/rest/lexer/rest.flex</tt>
*/
public class _RestFlexLexer implements FlexLexer, RestTokenTypes {
/** initial size of the lookahead buffer */
@@ -59,32 +43,32 @@
* at the beginning of a line
* l is of the form l = 2*k, k a non negative integer
*/
- private static final int ZZ_LEXSTATE[] = {
- 0, 0, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 3, 3, 5, 5,
- 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13,
+ private static final int ZZ_LEXSTATE[] = {
+ 0, 0, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 3, 3, 5, 5,
+ 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13,
14, 15
};
- /**
+ /**
* Translates characters to character classes
*/
- private static final String ZZ_CMAP_PACKED =
- "\11\0\1\3\1\1\2\0\1\2\22\0\1\23\1\0\1\12\1\20"+
- "\3\0\1\11\1\62\1\22\1\16\1\17\1\22\1\5\1\10\1\55"+
+ private static final String ZZ_CMAP_PACKED =
+ "\11\0\1\3\1\1\2\0\1\2\22\0\1\22\1\0\1\12\1\20"+
+ "\3\0\1\11\1\62\1\23\1\16\1\17\1\23\1\5\1\10\1\55"+
"\12\60\1\7\2\0\1\4\1\21\2\0\1\24\1\45\1\32\1\34"+
"\1\26\1\43\1\35\1\37\1\30\1\56\1\52\1\46\1\40\1\27"+
"\1\31\1\41\1\47\1\36\1\44\1\25\1\33\1\50\1\42\1\51"+
"\2\56\1\57\1\53\1\61\1\14\1\15\1\6\1\24\1\45\1\32"+
"\1\34\1\26\1\43\1\35\1\37\1\30\1\56\1\52\1\46\1\40"+
"\1\27\1\31\1\41\1\47\1\36\1\44\1\25\1\33\1\50\1\42"+
- "\1\51\2\56\1\62\1\54\1\22\1\13\uff81\0";
+ "\1\51\2\56\1\62\1\54\1\23\1\13\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();
@@ -105,18 +89,18 @@
"\4\0\3\42\1\43\2\0\1\31\70\0\1\41\35\0"+
"\2\42\7\0\1\43\5\0\1\31\3\44\2\1\1\45"+
"\7\1\1\0\1\1\1\0\5\1\1\0\6\1\3\46"+
- "\21\0\1\46\127\0\2\46\1\42\15\0\7\1\1\0"+
+ "\21\0\1\46\130\0\2\46\1\42\15\0\7\1\1\0"+
"\1\1\1\0\4\1\1\0\5\1\15\0\1\47\1\50"+
- "\1\0\2\51\50\0\2\51\47\0\1\47\10\0\1\50"+
+ "\1\0\2\51\51\0\2\51\50\0\1\47\10\0\1\50"+
"\5\0\3\1\1\0\1\1\1\0\3\1\2\0\3\1"+
- "\34\0\1\51\15\0\2\51\34\0\2\51\14\0\2\51"+
- "\34\0\2\1\3\0\1\1\15\0\1\52\131\0\1\52"+
+ "\35\0\1\51\16\0\2\51\35\0\2\51\15\0\2\51"+
+ "\35\0\2\1\3\0\1\1\15\0\1\52\131\0\1\52"+
"\4\0\2\1\2\0\1\1\150\0\1\1\3\0\1\1"+
"\147\0\1\1\1\53\150\0\1\1\150\0\1\1\150\0"+
- "\1\1\147\0\1\1\147\0\1\1\u1a31\0";
+ "\1\1\147\0\1\1\147\0\1\1\u1a2a\0";
private static int [] zzUnpackAction() {
- int [] result = new int[8573];
+ int [] result = new int[8574];
int offset = 0;
offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
return result;
@@ -135,7 +119,7 @@
}
- /**
+ /**
* Translates a state to a row index in the transition table
*/
private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
@@ -232,45 +216,45 @@
"\0\u7f80\0\u7fb3\0\u7fe6\0\u8019\0\u804c\0\u807f\0\u80b2\0\u80e5"+
"\0\u8118\0\u814b\0\u817e\0\u81b1\0\u81e4\0\u8217\0\u824a\0\u827d"+
"\0\u82b0\0\u82e3\0\u8316\0\u8349\0\u837c\0\u83af\0\u83e2\0\u8415"+
- "\0\u8448\0\u847b\0\u84ae\0\u84e1\0\u0e58\0\u491d\0\u1f47\0\u8514"+
+ "\0\u8448\0\u847b\0\u84ae\0\u84e1\0\u8514\0\u0e58\0\u491d\0\u1f47"+
"\0\u8547\0\u857a\0\u85ad\0\u85e0\0\u8613\0\u8646\0\u8679\0\u86ac"+
"\0\u86df\0\u8712\0\u8745\0\u8778\0\u87ab\0\u87de\0\u8811\0\u8844"+
"\0\u8877\0\u88aa\0\u88dd\0\u8910\0\u8943\0\u8976\0\u89a9\0\u89dc"+
"\0\u8a0f\0\u8a42\0\u8a75\0\u8aa8\0\u8adb\0\u8b0e\0\u8b41\0\u8b74"+
"\0\u8ba7\0\u8bda\0\u8c0d\0\u8c40\0\u8c73\0\u8ca6\0\u8cd9\0\u8d0c"+
- "\0\u8d3f\0\u8d72\0\u8da5\0\u8dd8\0\u8e0b\0\u0330\0\u0330\0\u8e3e"+
- "\0\u0330\0\u8e71\0\u8ea4\0\u8ed7\0\u8f0a\0\u8f3d\0\u8f70\0\u8fa3"+
+ "\0\u8d3f\0\u8d72\0\u8da5\0\u8dd8\0\u8e0b\0\u8e3e\0\u0330\0\u0330"+
+ "\0\u8e71\0\u0330\0\u8ea4\0\u8ed7\0\u8f0a\0\u8f3d\0\u8f70\0\u8fa3"+
"\0\u8fd6\0\u9009\0\u903c\0\u906f\0\u90a2\0\u90d5\0\u9108\0\u913b"+
"\0\u916e\0\u91a1\0\u91d4\0\u9207\0\u923a\0\u926d\0\u92a0\0\u92d3"+
"\0\u9306\0\u9339\0\u936c\0\u939f\0\u93d2\0\u9405\0\u9438\0\u946b"+
"\0\u949e\0\u94d1\0\u9504\0\u9537\0\u956a\0\u959d\0\u95d0\0\u9603"+
- "\0\u9636\0\u9669\0\u1f47\0\u969c\0\u96cf\0\u9702\0\u9735\0\u9768"+
+ "\0\u9636\0\u9669\0\u969c\0\u96cf\0\u1f47\0\u9702\0\u9735\0\u9768"+
"\0\u979b\0\u97ce\0\u9801\0\u9834\0\u9867\0\u989a\0\u98cd\0\u9900"+
"\0\u9933\0\u9966\0\u9999\0\u99cc\0\u99ff\0\u9a32\0\u9a65\0\u9a98"+
"\0\u9acb\0\u9afe\0\u9b31\0\u9b64\0\u9b97\0\u9bca\0\u9bfd\0\u9c30"+
"\0\u9c63\0\u9c96\0\u9cc9\0\u9cfc\0\u9d2f\0\u9d62\0\u9d95\0\u9dc8"+
- "\0\u9dfb\0\u9e2e\0\u9e61\0\u0e58\0\u9e94\0\u9ec7\0\u9efa\0\u9f2d"+
- "\0\u9f60\0\u9f93\0\u9fc6\0\u9ff9\0\u0e58\0\ua02c\0\ua05f\0\ua092"+
+ "\0\u9dfb\0\u9e2e\0\u9e61\0\u9e94\0\u9ec7\0\u9efa\0\u0e58\0\u9f2d"+
+ "\0\u9f60\0\u9f93\0\u9fc6\0\u9ff9\0\ua02c\0\ua05f\0\ua092\0\u0e58"+
"\0\ua0c5\0\ua0f8\0\ua12b\0\ua15e\0\ua191\0\ua1c4\0\ua1f7\0\ua22a"+
"\0\ua25d\0\ua290\0\ua2c3\0\ua2f6\0\ua329\0\ua35c\0\ua38f\0\ua3c2"+
"\0\ua3f5\0\ua428\0\ua45b\0\ua48e\0\ua4c1\0\ua4f4\0\ua527\0\ua55a"+
"\0\ua58d\0\ua5c0\0\ua5f3\0\ua626\0\ua659\0\ua68c\0\ua6bf\0\ua6f2"+
"\0\ua725\0\ua758\0\ua78b\0\ua7be\0\ua7f1\0\ua824\0\ua857\0\ua88a"+
- "\0\ua8bd\0\ua8f0\0\ua923\0\ua956\0\ua3f5\0\ua989\0\ua9bc\0\ua9ef"+
- "\0\uaa22\0\uaa55\0\uaa88\0\uaabb\0\uaaee\0\uab21\0\uab54\0\uab87"+
+ "\0\ua8bd\0\ua8f0\0\ua923\0\ua956\0\ua989\0\ua9bc\0\ua9ef\0\uaa22"+
+ "\0\ua48e\0\uaa55\0\uaa88\0\uaabb\0\uaaee\0\uab21\0\uab54\0\uab87"+
"\0\uabba\0\uabed\0\uac20\0\uac53\0\uac86\0\uacb9\0\uacec\0\uad1f"+
"\0\uad52\0\uad85\0\uadb8\0\uadeb\0\uae1e\0\uae51\0\uae84\0\uaeb7"+
"\0\uaeea\0\uaf1d\0\uaf50\0\uaf83\0\uafb6\0\uafe9\0\ub01c\0\ub04f"+
"\0\ub082\0\ub0b5\0\ub0e8\0\ub11b\0\ub14e\0\ub181\0\ub1b4\0\ub1e7"+
- "\0\u1d49\0\ub21a\0\ub24d\0\ub280\0\ub2b3\0\ub2e6\0\ub319\0\ub34c"+
- "\0\ub37f\0\ub3b2\0\ub3e5\0\ub418\0\ub44b\0\ub47e\0\u25da\0\ub4b1"+
- "\0\ub4e4\0\ub517\0\ub54a\0\ub57d\0\ub5b0\0\ub5e3\0\ub616\0\ub649"+
+ "\0\ub21a\0\ub24d\0\ub280\0\ub2b3\0\ub2e6\0\ub319\0\u1d49\0\ub34c"+
+ "\0\ub37f\0\ub3b2\0\ub3e5\0\ub418\0\ub44b\0\ub47e\0\ub4b1\0\ub4e4"+
+ "\0\ub517\0\ub54a\0\ub57d\0\ub5b0\0\ub5e3\0\u25da\0\ub616\0\ub649"+
"\0\ub67c\0\ub6af\0\ub6e2\0\ub715\0\ub748\0\ub77b\0\ub7ae\0\ub7e1"+
"\0\ub814\0\ub847\0\ub87a\0\ub8ad\0\ub8e0\0\ub913\0\ub946\0\ub979"+
"\0\ub9ac\0\ub9df\0\uba12\0\uba45\0\uba78\0\ubaab\0\ubade\0\ubb11"+
"\0\ubb44\0\ubb77\0\ubbaa\0\ubbdd\0\ubc10\0\ubc43\0\ubc76\0\ubca9"+
- "\0\ubcdc\0\ubd0f\0\ubd42\0\ubd75\0\ubda8\0\ubddb\0\ube0e\0\ua6bf"+
- "\0\ube41\0\ube74\0\ubea7\0\ubeda\0\ubf0d\0\ubf40\0\ubf73\0\ubfa6"+
+ "\0\ubcdc\0\ubd0f\0\ubd42\0\ubd75\0\ubda8\0\ubddb\0\ube0e\0\ube41"+
+ "\0\ube74\0\ubea7\0\ubeda\0\ubf0d\0\ubf40\0\ubf73\0\ubfa6\0\ua78b"+
"\0\ubfd9\0\uc00c\0\uc03f\0\uc072\0\uc0a5\0\uc0d8\0\uc10b\0\uc13e"+
"\0\uc171\0\uc1a4\0\uc1d7\0\uc20a\0\uc23d\0\uc270\0\uc2a3\0\uc2d6"+
"\0\uc309\0\uc33c\0\uc36f\0\uc3a2\0\uc3d5\0\uc408\0\uc43b\0\uc46e"+
@@ -281,8 +265,8 @@
"\0\ucb01\0\ucb34\0\ucb67\0\ucb9a\0\ucbcd\0\ucc00\0\ucc33\0\ucc66"+
"\0\ucc99\0\ucccc\0\uccff\0\ucd32\0\ucd65\0\ucd98\0\ucdcb\0\ucdfe"+
"\0\uce31\0\uce64\0\uce97\0\uceca\0\ucefd\0\ucf30\0\ucf63\0\ucf96"+
- "\0\ucfc9\0\ub979\0\ucffc\0\ud02f\0\ud062\0\ud095\0\ud0c8\0\ud0fb"+
- "\0\ud12e\0\ud161\0\ud194\0\ud1c7\0\ud1fa\0\ud22d\0\ud260\0\ud293"+
+ "\0\ucfc9\0\ucffc\0\ud02f\0\ud062\0\ud095\0\ud0c8\0\ud0fb\0\ud12e"+
+ "\0\ud161\0\ubb11\0\ud194\0\ud1c7\0\ud1fa\0\ud22d\0\ud260\0\ud293"+
"\0\ud2c6\0\ud2f9\0\ud32c\0\ud35f\0\ud392\0\ud3c5\0\ud3f8\0\ud42b"+
"\0\ud45e\0\ud491\0\ud4c4\0\ud4f7\0\ud52a\0\ud55d\0\ud590\0\ud5c3"+
"\0\ud5f6\0\ud629\0\ud65c\0\ud68f\0\ud6c2\0\ud6f5\0\ud728\0\ud75b"+
@@ -309,8 +293,8 @@
"\0\uf76e\0\uf7a1\0\uf7d4\0\uf807\0\uf83a\0\uf86d\0\uf8a0\0\uf8d3"+
"\0\uf906\0\uf939\0\uf96c\0\uf99f\0\uf9d2\0\ufa05\0\ufa38\0\ufa6b"+
"\0\ufa9e\0\ufad1\0\ufb04\0\ufb37\0\ufb6a\0\ufb9d\0\ufbd0\0\ufc03"+
- "\0\u0495\0\ufc36\0\ufc69\0\ufc9c\0\ufccf\0\ufd02\0\ufd35\0\ufd68"+
- "\0\ufd9b\0\ufdce\0\ufe01\0\ufe34\0\ufe67\0\ufe9a\0\ufecd\0\uff00"+
+ "\0\ufc36\0\ufc69\0\ufc9c\0\ufccf\0\ufd02\0\ufd35\0\ufd68\0\ufd9b"+
+ "\0\u0495\0\ufdce\0\ufe01\0\ufe34\0\ufe67\0\ufe9a\0\ufecd\0\uff00"+
"\0\uff33\0\uff66\0\uff99\0\uffcc\0\uffff\1\62\1\145\1\230"+
"\1\313\1\376\1\u0131\1\u0164\1\u0197\1\u01ca\1\u01fd\1\u0230"+
"\1\u0263\1\u0296\1\u02c9\1\u02fc\1\u032f\1\u0362\1\u0395\1\u03c8"+
@@ -1212,10 +1196,10 @@
"\6\u9663\6\u9696\6\u96c9\6\u96fc\6\u972f\6\u9762\6\u9795\6\u97c8"+
"\6\u97fb\6\u982e\6\u9861\6\u9894\6\u98c7\6\u98fa\6\u992d\6\u9960"+
"\6\u9993\6\u99c6\6\u99f9\6\u9a2c\6\u9a5f\6\u9a92\6\u9ac5\6\u9af8"+
- "\6\u9b2b\6\u9b5e\6\u9b91\6\u9bc4\6\u9bf7";
+ "\6\u9b2b\6\u9b5e\6\u9b91\6\u9bc4\6\u9bf7\6\u9c2a";
private static int [] zzUnpackRowMap() {
- int [] result = new int[8573];
+ int [] result = new int[8574];
int offset = 0;
offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
return result;
@@ -1232,7 +1216,7 @@
return j;
}
- /**
+ /**
* The transition table of the DFA
*/
private static final int [] ZZ_TRANS = zzUnpackTrans();
@@ -1240,5931 +1224,7871 @@
private static final String ZZ_TRANS_PACKED_0 =
"\1\21\1\22\1\23\4\21\1\24\53\21\1\25\1\26"+
"\1\27\1\30\1\25\1\31\1\25\1\32\1\33\4\25"+
- "\1\34\5\25\1\30\1\35\1\36\1\37\1\40\1\41"+
- "\1\42\1\43\1\44\1\45\1\42\1\46\1\47\1\50"+
- "\1\51\1\52\1\53\1\54\1\42\1\55\4\42\1\25"+
- "\1\56\1\25\1\42\1\57\1\42\2\25\1\60\1\61"+
- "\1\62\1\63\17\60\1\63\37\60\1\25\1\22\1\64"+
- "\61\25\1\65\1\66\1\67\16\70\1\25\1\67\37\25"+
- "\1\71\2\72\1\73\17\71\1\73\37\71\1\74\1\75"+
+ "\1\34\4\25\1\30\1\25\1\35\1\36\1\37\1\40"+
+ "\1\41\1\42\1\43\1\44\1\45\1\42\1\46\1\47"+
+ "\1\50\1\51\1\52\1\53\1\54\1\42\1\55\4\42"+
+ "\1\25\1\56\1\25\1\42\1\57\1\42\2\25\1\60"+
+ "\1\61\1\62\1\63\16\60\1\63\40\60\1\25\1\22"+
+ "\1\64\61\25\1\65\1\66\1\67\16\70\1\67\40\25"+
+ "\1\71\2\72\1\73\16\71\1\73\40\71\1\74\1\75"+
"\1\76\60\74\1\77\1\22\1\100\1\77\16\101\41\77"+
"\1\102\1\103\1\104\60\102\1\105\1\65\1\66\3\105"+
- "\2\106\6\105\1\106\4\105\1\107\30\105\1\106\2\105"+
+ "\2\106\6\105\1\106\3\105\1\107\31\105\1\106\2\105"+
"\1\107\2\105\1\107\1\21\1\22\1\64\1\63\13\21"+
- "\1\110\3\21\1\63\27\110\3\21\1\110\4\21\1\111"+
- "\1\22\1\64\60\111\1\21\1\65\1\66\1\112\17\21"+
- "\1\112\33\21\1\113\4\21\1\65\1\66\1\112\3\21"+
- "\1\114\5\21\1\115\5\21\1\112\33\21\1\113\3\21"+
- "\1\116\1\117\1\120\1\121\2\116\1\122\1\123\1\124"+
- "\5\116\1\125\4\116\1\121\13\126\1\127\13\126\1\130"+
- "\1\131\1\116\1\126\1\116\1\126\2\116\1\132\1\133"+
- "\1\134\1\135\1\136\1\137\1\140\1\141\1\142\1\143"+
- "\1\144\1\145\1\146\1\147\1\150\1\151\1\152\2\132"+
- "\1\135\13\153\1\154\13\153\1\155\1\156\1\132\1\153"+
- "\1\132\1\153\2\132\64\0\1\22\61\0\1\157\2\0"+
- "\4\157\1\0\13\157\1\0\37\157\1\0\1\160\1\161"+
- "\61\0\1\162\1\161\61\0\2\163\1\30\17\0\1\30"+
- "\44\0\1\164\1\0\1\165\14\0\27\164\3\0\1\164"+
- "\1\0\1\164\7\0\1\164\1\0\1\166\14\0\27\164"+
- "\3\0\1\164\1\0\1\164\12\0\1\33\4\0\1\33"+
- "\6\0\27\33\1\0\1\33\1\0\3\33\2\0\1\167"+
- "\2\0\4\167\1\0\1\170\4\167\1\171\6\167\27\170"+
- "\1\167\1\170\1\167\3\170\2\167\5\0\1\164\1\0"+
- "\1\165\1\33\4\0\1\33\6\0\1\42\1\172\6\42"+
- "\1\173\16\42\1\0\1\33\1\0\1\42\1\33\1\42"+
- "\7\0\1\164\1\0\1\165\1\33\4\0\1\33\6\0"+
- "\1\174\3\42\1\175\1\176\21\42\1\0\1\33\1\0"+
+ "\1\110\2\21\1\63\1\21\27\110\3\21\1\110\4\21"+
+ "\1\111\1\22\1\64\60\111\1\21\1\65\1\66\1\112"+
+ "\16\21\1\112\34\21\1\113\4\21\1\65\1\66\1\112"+
+ "\3\21\1\114\5\21\1\115\4\21\1\112\34\21\1\113"+
+ "\3\21\1\116\1\117\1\120\1\121\2\116\1\122\1\123"+
+ "\1\124\5\116\1\125\3\116\1\121\1\116\13\126\1\127"+
+ "\13\126\1\130\1\131\1\116\1\126\1\116\1\126\2\116"+
+ "\1\132\1\133\1\134\1\135\1\136\1\137\1\140\1\141"+
+ "\1\142\1\143\1\144\1\145\1\146\1\147\1\150\1\151"+
+ "\1\152\1\132\1\135\1\132\13\153\1\154\13\153\1\155"+
+ "\1\156\1\132\1\153\1\132\1\153\2\132\64\0\1\22"+
+ "\61\0\1\157\2\0\4\157\1\0\12\157\1\0\40\157"+
+ "\1\0\1\160\1\161\61\0\1\162\1\161\61\0\2\163"+
+ "\1\30\16\0\1\30\45\0\1\164\1\0\1\165\14\0"+
+ "\27\164\3\0\1\164\1\0\1\164\7\0\1\164\1\0"+
+ "\1\166\14\0\27\164\3\0\1\164\1\0\1\164\12\0"+
+ "\1\33\4\0\1\33\6\0\27\33\1\0\1\33\1\0"+
+ "\3\33\2\0\1\167\2\0\4\167\1\0\1\170\4\167"+
+ "\1\171\6\167\27\170\1\167\1\170\1\167\3\170\2\167"+
+ "\5\0\1\164\1\0\1\165\1\33\4\0\1\33\6\0"+
+ "\1\42\1\172\6\42\1\173\16\42\1\0\1\33\1\0"+
"\1\42\1\33\1\42\7\0\1\164\1\0\1\165\1\33"+
- "\4\0\1\33\6\0\12\42\1\177\2\42\1\200\11\42"+
+ "\4\0\1\33\6\0\1\174\3\42\1\175\1\176\21\42"+
"\1\0\1\33\1\0\1\42\1\33\1\42\7\0\1\164"+
- "\1\0\1\165\1\33\4\0\1\33\6\0\5\42\1\201"+
- "\21\42\1\0\1\33\1\0\1\42\1\33\1\42\7\0"+
- "\1\164\1\0\1\165\1\33\4\0\1\33\6\0\3\42"+
- "\1\202\10\42\1\203\12\42\1\0\1\33\1\0\1\42"+
+ "\1\0\1\165\1\33\4\0\1\33\6\0\12\42\1\177"+
+ "\2\42\1\200\11\42\1\0\1\33\1\0\1\42\1\33"+
+ "\1\42\7\0\1\164\1\0\1\165\1\33\4\0\1\33"+
+ "\6\0\5\42\1\201\21\42\1\0\1\33\1\0\1\42"+
"\1\33\1\42\7\0\1\164\1\0\1\165\1\33\4\0"+
- "\1\33\6\0\27\42\1\0\1\33\1\0\1\42\1\33"+
- "\1\42\7\0\1\164\1\0\1\165\1\33\4\0\1\33"+
- "\6\0\1\204\3\42\1\205\1\206\12\42\1\207\1\42"+
- "\1\210\4\42\1\0\1\33\1\0\1\42\1\33\1\42"+
- "\7\0\1\164\1\0\1\165\1\33\4\0\1\33\6\0"+
- "\3\42\1\211\23\42\1\0\1\33\1\0\1\42\1\33"+
- "\1\42\7\0\1\164\1\0\1\165\1\33\4\0\1\33"+
- "\6\0\1\212\1\42\1\213\24\42\1\0\1\33\1\0"+
- "\1\42\1\33\1\42\7\0\1\164\1\0\1\165\1\33"+
- "\4\0\1\33\6\0\1\214\1\42\1\215\2\42\1\216"+
- "\1\42\1\217\17\42\1\0\1\33\1\0\1\42\1\33"+
- "\1\42\7\0\1\164\1\0\1\165\1\33\4\0\1\33"+
- "\6\0\2\42\1\220\1\42\1\221\22\42\1\0\1\33"+
- "\1\0\1\42\1\33\1\42\7\0\1\164\1\0\1\165"+
- "\1\33\4\0\1\33\6\0\2\42\1\222\24\42\1\0"+
+ "\1\33\6\0\3\42\1\202\10\42\1\203\12\42\1\0"+
"\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
- "\1\165\1\33\4\0\1\33\6\0\1\223\6\42\1\224"+
- "\17\42\1\0\1\33\1\0\1\42\1\33\1\42\7\0"+
- "\1\164\1\0\1\165\1\33\4\0\1\33\6\0\1\225"+
- "\26\42\1\0\1\33\1\0\1\42\1\33\1\42\7\0"+
- "\1\164\1\0\1\165\1\33\4\0\1\33\6\0\4\42"+
- "\1\226\1\227\21\42\1\0\1\33\1\0\1\42\1\33"+
- "\1\42\7\0\1\164\1\0\1\165\1\33\4\0\1\33"+
- "\6\0\2\42\1\230\1\42\1\231\1\232\21\42\1\0"+
- "\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
- "\1\165\1\33\4\0\1\33\6\0\4\42\1\233\22\42"+
- "\1\0\1\33\1\0\1\42\1\33\1\42\12\0\1\33"+
- "\4\0\1\33\6\0\27\56\1\0\1\234\1\0\1\56"+
- "\1\33\1\56\12\0\1\33\4\0\1\33\1\235\1\0"+
- "\1\236\3\0\27\237\1\0\1\33\1\0\1\237\1\33"+
- "\1\240\1\241\2\0\1\242\1\243\5\0\1\244\53\0"+
- "\1\245\1\243\5\0\1\244\55\0\1\63\17\0\1\63"+
- "\40\0\1\65\64\0\1\67\17\0\1\67\40\0\2\72"+
- "\61\0\2\72\1\73\17\0\1\73\37\0\1\74\1\0"+
- "\62\74\1\75\61\74\1\102\1\0\62\102\1\103\61\102"+
- "\1\105\2\0\3\105\2\0\6\105\1\0\4\105\1\0"+
- "\30\105\1\0\2\105\1\0\2\105\2\0\1\246\1\247"+
- "\14\0\1\250\4\0\27\250\3\0\1\250\4\0\1\111"+
- "\2\0\60\111\16\0\1\251\1\0\1\252\3\0\27\252"+
- "\3\0\1\252\1\0\1\252\1\253\1\0\1\254\2\0"+
- "\4\254\1\0\13\254\1\0\37\254\15\0\1\255\46\0"+
- "\1\256\1\257\61\0\1\260\1\257\63\0\1\261\17\0"+
- "\1\261\37\0\1\262\2\263\3\262\1\264\14\262\1\263"+
- "\37\262\1\265\2\0\4\265\1\266\13\265\1\0\37\265"+
- "\10\0\1\267\52\0\1\270\2\0\13\270\1\271\4\270"+
- "\1\0\37\270\5\0\1\272\1\0\1\272\5\0\1\273"+
- "\1\0\1\272\4\0\27\272\3\0\1\272\1\0\1\272"+
- "\7\0\1\272\1\0\1\272\5\0\1\273\1\0\1\272"+
- "\4\0\1\272\1\274\25\272\3\0\1\272\1\0\1\272"+
- "\2\0\1\275\2\0\13\275\1\0\4\275\1\0\30\275"+
- "\1\0\6\275\1\276\1\277\1\300\60\276\1\0\1\256"+
- "\1\257\1\0\1\301\1\302\1\303\1\304\1\305\1\306"+
- "\1\307\1\310\1\311\1\312\1\313\1\314\1\315\42\0"+
- "\1\276\1\316\1\317\1\276\1\320\1\321\1\322\1\323"+
- "\1\324\1\325\1\326\1\327\1\330\1\331\1\332\1\333"+
- "\1\334\43\276\1\277\1\300\1\335\17\276\1\335\40\276"+
- "\1\277\1\300\1\276\1\336\57\276\1\277\1\300\2\276"+
- "\1\337\55\276\1\340\1\341\1\342\3\340\1\343\14\340"+
- "\1\344\37\340\1\345\1\277\1\300\4\345\1\346\13\345"+
- "\1\276\37\345\1\276\1\277\1\300\5\276\1\347\53\276"+
- "\1\277\1\300\6\276\1\350\52\276\1\277\1\300\7\276"+
- "\1\351\51\276\1\277\1\300\10\276\1\352\50\276\1\277"+
- "\1\300\11\276\1\353\47\276\1\277\1\300\12\276\1\354"+
- "\45\276\1\355\1\277\1\300\13\355\1\356\4\355\1\276"+
- "\37\355\1\276\1\277\1\300\14\276\1\357\44\276\1\277"+
- "\1\300\15\276\1\360\43\276\1\277\1\300\2\276\1\361"+
- "\1\276\1\361\5\276\1\362\1\276\1\361\4\276\27\361"+
- "\3\276\1\361\1\276\1\361\3\276\1\277\1\300\2\276"+
- "\1\361\1\276\1\361\5\276\1\362\1\276\1\361\4\276"+
- "\1\361\1\363\25\361\3\276\1\361\1\276\1\361\2\276"+
- "\1\364\1\277\1\300\13\364\1\276\4\364\1\276\30\364"+
- "\1\276\6\364\1\365\2\0\4\365\1\0\13\365\1\157"+
- "\27\365\1\366\7\365\1\0\2\163\61\0\1\160\1\163"+
- "\60\0\1\367\2\0\4\367\1\0\54\367\2\0\4\367"+
- "\1\0\1\370\4\367\1\370\6\367\27\370\1\367\1\370"+
- "\1\367\3\370\2\367\5\0\1\164\1\0\1\165\1\33"+
- "\4\0\1\33\6\0\1\42\1\371\25\42\1\0\1\33"+
- "\1\0\1\42\1\33\1\42\7\0\1\164\1\0\1\165"+
- "\1\33\4\0\1\33\6\0\14\42\1\372\12\42\1\0"+
- "\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
- "\1\165\1\33\4\0\1\33\6\0\12\42\1\373\6\42"+
- "\1\216\5\42\1\0\1\33\1\0\1\42\1\33\1\42"+
- "\7\0\1\164\1\0\1\165\1\33\4\0\1\33\6\0"+
- "\1\42\1\216\13\42\1\374\11\42\1\0\1\33\1\0"+
- "\1\42\1\33\1\42\7\0\1\164\1\0\1\165\1\33"+
- "\4\0\1\33\6\0\15\42\1\375\11\42\1\0\1\33"+
- "\1\0\1\42\1\33\1\42\7\0\1\164\1\0\1\165"+
- "\1\33\4\0\1\33\6\0\12\42\1\376\14\42\1\0"+
- "\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
- "\1\165\1\33\4\0\1\33\6\0\4\42\1\377\22\42"+
- "\1\0\1\33\1\0\1\42\1\33\1\42\7\0\1\164"+
- "\1\0\1\165\1\33\4\0\1\33\6\0\1\42\1\u0100"+
- "\25\42\1\0\1\33\1\0\1\42\1\33\1\42\7\0"+
- "\1\164\1\0\1\165\1\33\4\0\1\33\6\0\6\42"+
- "\1\u0101\20\42\1\0\1\33\1\0\1\42\1\33\1\42"+
- "\7\0\1\164\1\0\1\165\1\33\4\0\1\33\6\0"+
- "\1\u0102\14\42\1\u0103\11\42\1\0\1\33\1\0\1\42"+
- "\1\33\1\42\7\0\1\164\1\0\1\165\1\33\4\0"+
- "\1\33\6\0\7\42\1\u0104\17\42\1\0\1\33\1\0"+
- "\1\42\1\33\1\42\7\0\1\164\1\0\1\165\1\33"+
- "\4\0\1\33\6\0\1\42\1\u0105\25\42\1\0\1\33"+
- "\1\0\1\42\1\33\1\42\7\0\1\164\1\0\1\165"+
- "\1\33\4\0\1\33\6\0\3\42\1\u0106\4\42\1\u0107"+
- "\3\42\1\u0108\12\42\1\0\1\33\1\0\1\42\1\33"+
- "\1\42\7\0\1\164\1\0\1\165\1\33\4\0\1\33"+
- "\6\0\24\42\1\u0109\2\42\1\0\1\33\1\0\1\42"+
- "\1\33\1\42\7\0\1\164\1\0\1\165\1\33\4\0"+
- "\1\33\6\0\1\u010a\26\42\1\0\1\33\1\0\1\42"+
- "\1\33\1\42\7\0\1\164\1\0\1\165\1\33\4\0"+
- "\1\33\6\0\4\42\1\u010b\22\42\1\0\1\33\1\0"+
- "\1\42\1\33\1\42\7\0\1\164\1\0\1\165\1\33"+
- "\4\0\1\33\6\0\1\42\1\u0100\1\42\1\u010c\23\42"+
- "\1\0\1\33\1\0\1\42\1\33\1\42\7\0\1\164"+
- "\1\0\1\165\1\33\4\0\1\33\6\0\17\42\1\u010d"+
- "\7\42\1\0\1\33\1\0\1\42\1\33\1\42\7\0"+
- "\1\164\1\0\1\165\1\33\4\0\1\33\6\0\16\42"+
- "\1\374\10\42\1\0\1\33\1\0\1\42\1\33\1\42"+
- "\7\0\1\164\1\0\1\165\1\33\4\0\1\33\6\0"+
- "\15\42\1\u010e\2\42\1\u010f\6\42\1\0\1\33\1\0"+
- "\1\42\1\33\1\42\7\0\1\164\1\0\1\165\1\33"+
- "\4\0\1\33\6\0\22\42\1\u0100\4\42\1\0\1\33"+
- "\1\0\1\42\1\33\1\42\7\0\1\164\1\0\1\165"+
- "\1\33\4\0\1\33\6\0\21\42\1\u0110\5\42\1\0"+
- "\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
- "\1\165\1\33\4\0\1\33\6\0\1\u0111\26\42\1\0"+
- "\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
- "\1\165\1\33\4\0\1\33\6\0\3\42\1\u0112\5\42"+
- "\1\u0113\15\42\1\0\1\33\1\0\1\42\1\33\1\42"+
- "\7\0\1\164\1\0\1\165\1\33\4\0\1\33\6\0"+
- "\1\42\1\u0114\25\42\1\0\1\33\1\0\1\42\1\33"+
- "\1\42\7\0\1\164\1\0\1\165\1\33\4\0\1\33"+
- "\6\0\12\42\1\u0115\14\42\1\0\1\33\1\0\1\42"+
- "\1\33\1\42\7\0\1\164\1\0\1\165\1\33\4\0"+
- "\1\33\6\0\22\42\1\u0116\4\42\1\0\1\33\1\0"+
- "\1\42\1\33\1\42\7\0\1\164\1\0\1\165\1\33"+
- "\4\0\1\33\6\0\12\42\1\u0117\14\42\1\0\1\33"+
- "\1\0\1\42\1\33\1\42\7\0\1\164\1\0\1\165"+
- "\1\33\4\0\1\33\6\0\11\42\1\u0118\15\42\1\0"+
- "\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
- "\1\165\1\33\4\0\1\33\6\0\5\42\1\u0119\21\42"+
- "\1\0\1\33\1\0\1\42\1\33\1\42\7\0\1\164"+
- "\1\0\1\165\1\33\4\0\1\33\6\0\6\42\1\u011a"+
- "\20\42\1\0\1\33\1\0\1\42\1\33\1\42\7\0"+
- "\1\164\1\0\1\165\1\33\4\0\1\33\6\0\10\42"+
- "\1\u011b\16\42\1\0\1\33\1\0\1\42\1\33\1\42"+
- "\7\0\1\164\1\0\1\165\1\33\4\0\1\33\6\0"+
- "\7\42\1\u011c\17\42\1\0\1\33\1\0\1\42\1\33"+
- "\1\42\7\0\1\164\1\0\1\165\1\33\4\0\1\33"+
- "\6\0\20\42\1\u011d\6\42\1\0\1\33\1\0\1\42"+
- "\1\33\1\42\63\0\1\241\25\0\27\236\3\0\1\236"+
- "\1\0\1\236\1\241\11\0\1\33\4\0\1\33\6\0"+
- "\27\237\1\0\1\33\1\0\1\237\1\33\1\237\1\u011e"+
- "\11\0\1\33\4\0\1\33\6\0\27\237\1\0\1\33"+
- "\1\0\1\237\1\33\1\240\1\241\2\0\1\242\71\0"+
- "\1\u011f\53\0\1\u0120\1\u0121\61\0\1\u0122\1\u0121\141\0"+
- "\1\253\25\0\27\252\3\0\1\252\1\0\1\252\1\253"+
- "\16\0\1\u0123\45\0\1\u0124\2\0\4\u0124\1\0\13\u0124"+
- "\1\254\27\u0124\1\u0125\7\u0124\1\0\1\u0126\1\u0127\1\0"+
- "\1\u0128\1\u0129\1\u012a\1\u012b\1\u012c\1\u012d\1\u012e\1\u012f"+
- "\1\u0130\1\u0131\1\u0132\1\u0133\1\u0134\43\0\1\256\1\u0127"+
- "\1\0\1\u0128\1\u0129\1\u012a\1\u012b\1\u012c\1\u012d\1\u012e"+
- "\1\u012f\1\u0130\1\u0131\1\u0132\1\u0133\1\u0134\43\0\1\256"+
- "\1\257\1\0\1\u0128\1\u0129\1\u012a\1\u012b\1\u012c\1\u012d"+
- "\1\u012e\1\u012f\1\u0130\1\u0131\1\u0132\1\u0133\1\u0134\42\0"+
- "\1\u0135\2\263\3\u0135\1\u0136\14\u0135\1\262\37\u0135\6\263"+
- "\1\u0136\54\263\1\u0137\2\0\3\u0137\1\0\14\u0137\1\0"+
- "\37\u0137\1\u0138\2\0\4\u0138\1\0\13\u0138\1\265\27\u0138"+
- "\1\u0139\7\u0138\1\0\1\u013a\1\u013b\103\0\1\u013c\37\0"+
- "\1\u013d\2\0\13\u013d\1\0\4\u013d\1\270\37\u013d\1\u013e"+
- "\2\0\13\u013e\1\0\4\u013e\1\0\37\u013e\1\0\1\u013f"+
- "\3\0\1\u0140\1\0\1\u0140\1\u013f\4\0\1\273\1\0"+
- "\1\272\2\0\2\u013f\27\272\3\0\1\272\1\u013f\1\272"+
- "\2\u013f\5\0\1\272\1\0\1\272\5\0\1\273\1\0"+
- "\1\272\4\0\1\272\1\u0141\25\272\3\0\1\272\1\0"+
- "\1\272\2\0\1\u0142\2\0\13\u0142\1\0\4\u0142\1\275"+
- "\30\u0142\1\0\6\u0142\4\0\1\301\1\302\1\303\1\304"+
- "\1\305\1\306\1\307\1\310\1\311\1\312\1\313\1\314"+
- "\1\315\42\0\1\276\1\277\1\300\1\276\1\320\1\321"+
- "\1\322\1\323\1\324\1\325\1\326\1\327\1\330\1\331"+
- "\1\332\1\333\1\334\42\276\4\0\1\u0143\63\0\1\u0144"+
- "\63\0\1\u0145\63\0\1\u0146\63\0\1\u0147\63\0\1\u0148"+
- "\63\0\1\u0149\63\0\1\u014a\63\0\1\u014b\63\0\1\u014c"+
- "\63\0\1\u014d\63\0\1\u014e\63\0\1\u014f\43\0\1\256"+
- "\1\257\1\0\1\u0150\1\u0151\1\u0152\1\u0153\1\u0154\1\u0155"+
- "\1\u0156\1\u0157\1\u0158\1\u0159\1\u015a\1\u015b\1\u015c\42\0"+
- "\1\276\1\u015d\1\u015e\1\276\1\u015f\1\u0160\1\u0161\1\u0162"+
- "\1\u0163\1\u0164\1\u0165\1\u0166\1\u0167\1\u0168\1\u0169\1\u016a"+
- "\1\u016b\43\276\1\277\1\300\1\276\1\u016c\57\276\1\277"+
- "\1\300\2\276\1\u016d\56\276\1\277\1\300\3\276\1\u016e"+
- "\55\276\1\277\1\300\4\276\1\u016f\54\276\1\277\1\300"+
- "\5\276\1\u0170\53\276\1\277\1\300\6\276\1\u0171\52\276"+
- "\1\277\1\300\7\276\1\u0172\51\276\1\277\1\300\10\276"+
- "\1\u0173\50\276\1\277\1\300\11\276\1\u0174\47\276\1\277"+
- "\1\300\12\276\1\u0175\46\276\1\277\1\300\13\276\1\u0176"+
- "\45\276\1\277\1\300\14\276\1\u0177\44\276\1\277\1\300"+
- "\15\276\1\u0178\43\276\1\277\1\300\1\276\1\u0179\57\276"+
- "\1\277\1\300\2\276\1\u017a\55\276\1\u017b\1\341\1\342"+
- "\3\u017b\1\u017c\14\u017b\1\340\37\u017b\4\263\1\u017d\1\u017e"+
- "\1\u017f\1\u0180\1\u0181\1\u0182\1\u0183\1\u0184\1\u0185\1\u0186"+
- "\1\u0187\1\u0188\1\u0189\42\263\1\344\1\341\1\342\1\344"+
- "\1\u018a\1\u018b\1\u018c\1\u018d\1\u018e\1\u018f\1\u0190\1\u0191"+
- "\1\u0192\1\u0193\1\u0194\1\u0195\1\u0196\42\344\1\u0197\1\277"+
- "\1\300\3\u0197\1\u0198\14\u0197\1\276\37\u0197\1\344\1\341"+
- "\1\342\3\344\1\u017c\54\344\1\u0199\1\277\1\300\4\u0199"+
- "\1\276\13\u0199\1\345\27\u0199\1\u019a\7\u0199\1\276\1\u019b"+
- "\1\u019c\4\276\1\u019d\54\276\1\277\1\300\5\276\1\u019e"+
- "\12\276\1\u019f\40\276\1\277\1\300\6\276\1\u01a0\52\276"+
- "\1\277\1\300\7\276\1\u01a1\51\276\1\277\1\300\10\276"+
- "\1\u01a2\50\276\1\277\1\300\11\276\1\u01a3\47\276\1\277"+
- "\1\300\12\276\1\u01a4\45\276\1\u01a5\1\277\1\300\13\u01a5"+
- "\1\276\4\u01a5\1\355\37\u01a5\1\u01a6\1\277\1\300\13\u01a6"+
- "\1\u01a7\4\u01a6\1\276\37\u01a6\1\276\1\277\1\300\14\276"+
- "\1\u01a8\44\276\1\277\1\300\15\276\1\u01a9\43\276\1\u01aa"+
- "\1\300\2\276\1\u01ab\1\276\1\u01ab\1\u01ac\4\276\1\362"+
- "\1\276\1\361\2\276\2\u01ac\27\361\3\276\1\361\1\u01ac"+
- "\1\361\2\u01ac\1\276\1\277\1\300\2\276\1\361\1\276"+
- "\1\361\5\276\1\362\1\276\1\361\4\276\1\361\1\u01ad"+
- "\25\361\3\276\1\361\1\276\1\361\2\276\1\u01ae\1\277"+
- "\1\300\13\u01ae\1\276\4\u01ae\1\364\30\u01ae\1\276\6\u01ae"+
- "\1\365\2\0\4\365\1\u01af\13\365\1\157\27\365\1\366"+
- "\10\365\2\0\4\365\1\u01b0\13\365\1\157\27\365\1\366"+
- "\7\365\1\367\2\0\4\367\1\u01b1\54\367\2\0\4\367"+
- "\1\u01b1\1\370\4\367\1\370\6\367\27\370\1\367\1\370"+
- "\1\367\3\370\2\367\5\0\1\164\1\0\1\165\1\33"+
- "\4\0\1\33\6\0\2\42\1\u01b2\24\42\1\0\1\33"+
- "\1\0\1\42\1\33\1\42\7\0\1\164\1\0\1\165"+
- "\1\33\4\0\1\33\6\0\5\42\1\u01b3\21\42\1\0"+
- "\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
- "\1\165\1\33\4\0\1\33\6\0\11\42\1\u01b4\15\42"+
- "\1\0\1\33\1\0\1\42\1\33\1\42\7\0\1\164"+
- "\1\0\1\u01b5\1\33\4\0\1\33\6\0\27\42\1\0"+
- "\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
- "\1\165\1\33\4\0\1\33\6\0\4\42\1\u01b6\22\42"+
- "\1\0\1\33\1\0\1\42\1\33\1\42\7\0\1\164"+
- "\1\0\1\165\1\33\4\0\1\33\6\0\5\42\1\u01b7"+
- "\21\42\1\0\1\33\1\0\1\42\1\33\1\42\7\0"+
- "\1\164\1\0\1\165\1\33\4\0\1\33\6\0\11\42"+
- "\1\u01b8\15\42\1\0\1\33\1\0\1\42\1\33\1\42"+
- "\7\0\1\164\1\0\1\165\1\33\4\0\1\33\6\0"+
- "\2\42\1\374\24\42\1\0\1\33\1\0\1\42\1\33"+
- "\1\42\7\0\1\164\1\0\1\165\1\33\4\0\1\33"+
- "\6\0\22\42\1\u01b9\4\42\1\0\1\33\1\0\1\42"+
- "\1\33\1\42\7\0\1\164\1\0\1\165\1\33\4\0"+
- "\1\33\6\0\11\42\1\u0100\15\42\1\0\1\33\1\0"+
- "\1\42\1\33\1\42\7\0\1\164\1\0\1\165\1\33"+
- "\4\0\1\33\6\0\5\42\1\u01ba\21\42\1\0\1\33"+
- "\1\0\1\42\1\33\1\42\7\0\1\164\1\0\1\165"+
- "\1\33\4\0\1\33\6\0\1\42\1\u01bb\25\42\1\0"+
- "\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
- "\1\165\1\33\4\0\1\33\6\0\1\u01bc\26\42\1\0"+
- "\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
- "\1\165\1\33\4\0\1\33\6\0\1\42\1\u01bd\25\42"+
- "\1\0\1\33\1\0\1\42\1\33\1\42\7\0\1\164"+
- "\1\0\1\165\1\33\4\0\1\33\6\0\2\42\1\u01be"+
- "\24\42\1\0\1\33\1\0\1\42\1\33\1\42\7\0"+
- "\1\164\1\0\1\165\1\33\4\0\1\33\6\0\15\42"+
- "\1\u01bf\11\42\1\0\1\33\1\0\1\42\1\33\1\42"+
- "\7\0\1\u01c0\1\0\1\165\1\33\4\0\1\33\6\0"+
- "\27\42\1\0\1\33\1\0\1\42\1\33\1\42\7\0"+
- "\1\164\1\0\1\165\1\33\4\0\1\33\6\0\20\42"+
- "\1\u01c1\6\42\1\0\1\33\1\0\1\42\1\33\1\42"+
- "\7\0\1\164\1\0\1\165\1\33\4\0\1\33\6\0"+
- "\6\42\1\u01c2\20\42\1\0\1\33\1\0\1\42\1\33"+
- "\1\42\7\0\1\164\1\0\1\165\1\33\4\0\1\33"+
- "\6\0\11\42\1\u01c3\15\42\1\0\1\33\1\0\1\42"+
- "\1\33\1\42\7\0\1\164\1\0\1\165\1\33\4\0"+
- "\1\33\6\0\1\u01c4\26\42\1\0\1\33\1\0\1\42"+
- "\1\33\1\42\7\0\1\164\1\0\1\165\1\33\4\0"+
- "\1\33\6\0\22\42\1\u01c5\4\42\1\0\1\33\1\0"+
- "\1\42\1\33\1\42\7\0\1\164\1\0\1\165\1\33"+
- "\4\0\1\33\6\0\1\42\1\u01c6\25\42\1\0\1\33"+
- "\1\0\1\42\1\33\1\42\7\0\1\164\1\0\1\165"+
- "\1\33\4\0\1\33\6\0\12\42\1\375\14\42\1\0"+
- "\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
- "\1\165\1\33\4\0\1\33\6\0\10\42\1\u01c3\16\42"+
- "\1\0\1\33\1\0\1\42\1\33\1\42\7\0\1\164"+
- "\1\0\1\165\1\33\4\0\1\33\6\0\1\42\1\374"+
- "\25\42\1\0\1\33\1\0\1\42\1\33\1\42\7\0"+
- "\1\164\1\0\1\165\1\33\4\0\1\33\6\0\13\42"+
- "\1\u01c7\13\42\1\0\1\33\1\0\1\42\1\33\1\42"+
- "\7\0\1\164\1\0\1\165\1\33\4\0\1\33\6\0"+
- "\1\374\26\42\1\0\1\33\1\0\1\42\1\33\1\42"+
- "\7\0\1\164\1\0\1\165\1\33\4\0\1\33\6\0"+
- "\20\42\1\u01c8\6\42\1\0\1\33\1\0\1\42\1\33"+
- "\1\42\7\0\1\164\1\0\1\165\1\33\4\0\1\33"+
- "\6\0\22\42\1\u01c9\4\42\1\0\1\33\1\0\1\42"+
- "\1\33\1\42\7\0\1\164\1\0\1\165\1\33\4\0"+
- "\1\33\6\0\3\42\1\u01ca\23\42\1\0\1\33\1\0"+
- "\1\42\1\33\1\42\7\0\1\164\1\0\1\165\1\33"+
- "\4\0\1\33\6\0\7\42\1\u01cb\17\42\1\0\1\33"+
- "\1\0\1\42\1\33\1\42\7\0\1\164\1\0\1\165"+
- "\1\33\4\0\1\33\6\0\1\42\1\u01cc\25\42\1\0"+
- "\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
- "\1\165\1\33\4\0\1\33\6\0\1\42\1\u01cd\25\42"+
- "\1\0\1\33\1\0\1\42\1\33\1\42\7\0\1\164"+
- "\1\0\1\165\1\33\4\0\1\33\6\0\2\42\1\u01ce"+
- "\24\42\1\0\1\33\1\0\1\42\1\33\1\42\7\0"+
- "\1\164\1\0\1\165\1\33\4\0\1\33\6\0\12\42"+
- "\1\u01cf\14\42\1\0\1\33\1\0\1\42\1\33\1\42"+
- "\7\0\1\164\1\0\1\165\1\33\4\0\1\33\6\0"+
- "\1\42\1\u0109\25\42\1\0\1\33\1\0\1\42\1\33"+
- "\1\42\25\0\1\u01d0\40\0\1\u0120\62\0\1\u01d1\3\0"+
- "\1\u01d1\1\0\2\u01d1\11\0\2\u01d1\33\0\1\u01d1\1\0"+
- "\2\u01d1\1\u0124\2\0\4\u0124\1\u01d2\13\u0124\1\254\27\u0124"+
- "\1\u0125\10\u0124\2\0\4\u0124\1\u01d3\13\u0124\1\254\27\u0124"+
- "\1\u0125\7\u0124\1\0\1\u01d4\1\u01d5\1\0\1\u0128\1\u0129"+
- "\1\u012a\1\u012b\1\u012c\1\u012d\1\u012e\1\u012f\1\u0130\1\u0131"+
- "\1\u0132\1\u0133\1\u0134\43\0\1\u0126\1\u01d5\1\0\1\u0128"+
- "\1\u0129\1\u012a\1\u012b\1\u012c\1\u012d\1\u012e\1\u012f\1\u0130"+
- "\1\u0131\1\u0132\1\u0133\1\u0134\46\0\1\u01d6\63\0\1\u01d7"+
- "\63\0\1\u01d8\63\0\1\u01d9\63\0\1\u01da\63\0\1\u01db"+
- "\63\0\1\u01dc\63\0\1\u01dd\63\0\1\u01de\63\0\1\u01df"+
- "\63\0\1\u01e0\63\0\1\u01e1\63\0\1\u01e2\42\0\1\u0135"+
- "\2\263\3\u0135\1\u01e3\14\u0135\1\262\37\u0135\15\0\1\u01e4"+
- "\45\0\1\u01e5\2\0\3\u01e5\1\0\14\u01e5\1\u0137\37\u01e5"+
- "\1\u0138\2\0\4\u0138\1\u01e6\13\u0138\1\265\27\u0138\1\u0139"+
- "\10\u0138\2\0\4\u0138\1\u01e7\13\u0138\1\265\27\u0138\1\u0139"+
- "\7\u0138\1\0\1\u01e8\1\u01e9\61\0\1\u01ea\1\u01e9\60\0"+
- "\1\u013d\2\0\13\u013d\1\u01eb\4\u013d\1\270\37\u013d\1\u01ec"+
- "\2\0\13\u01ec\1\0\4\u01ec\1\u013e\37\u01ec\5\0\1\272"+
- "\1\0\1\272\5\0\1\273\1\0\1\272\4\0\15\272"+
- "\1\u01ed\11\272\3\0\1\272\1\0\1\272\2\0\1\u0142"+
- "\2\0\13\u0142\1\0\4\u0142\1\275\30\u0142\1\u01ee\6\u0142"+
- "\4\0\1\u01ef\63\0\1\u01f0\63\0\1\u01f1\63\0\1\u01f2"+
- "\63\0\1\u01f3\63\0\1\u01f4\63\0\1\u01f5\63\0\1\u01f6"+
- "\63\0\1\u01f7\63\0\1\u01f8\63\0\1\u01f9\63\0\1\u01fa"+
- "\63\0\1\u01fb\46\0\1\u01fc\63\0\1\u01fd\63\0\1\u01fe"+
- "\63\0\1\u01ff\63\0\1\u0200\63\0\1\u0201\63\0\1\u0202"+
- "\63\0\1\u0203\63\0\1\u0204\63\0\1\u0205\63\0\1\u0206"+
- "\63\0\1\u0207\63\0\1\u0208\43\0\1\u0126\1\u0127\1\0"+
- "\1\u0150\1\u0151\1\u0152\1\u0153\1\u0154\1\u0155\1\u0156\1\u0157"+
- "\1\u0158\1\u0159\1\u015a\1\u015b\1\u015c\42\0\1\276\1\u0209"+
- "\1\u020a\1\276\1\u015f\1\u0160\1\u0161\1\u0162\1\u0163\1\u0164"+
- "\1\u0165\1\u0166\1\u0167\1\u0168\1\u0169\1\u016a\1\u016b\43\276"+
- "\1\277\1\300\1\276\1\u020b\57\276\1\277\1\300\2\276"+
- "\1\u020c\56\276\1\277\1\300\3\276\1\u020d\55\276\1\277"+
- "\1\300\4\276\1\u020e\54\276\1\277\1\300\5\276\1\u020f"+
- "\53\276\1\277\1\300\6\276\1\u0210\52\276\1\277\1\300"+
- "\7\276\1\u0211\51\276\1\277\1\300\10\276\1\u0212\50\276"+
- "\1\277\1\300\11\276\1\u0213\47\276\1\277\1\300\12\276"+
- "\1\u0214\46\276\1\277\1\300\13\276\1\u0215\45\276\1\277"+
- "\1\300\14\276\1\u0216\44\276\1\277\1\300\15\276\1\u0217"+
- "\43\276\1\277\1\300\1\276\1\u0218\57\276\1\277\1\300"+
- "\2\276\1\u0219\56\276\1\277\1\300\3\276\1\u021a\55\276"+
- "\1\277\1\300\4\276\1\u021b\54\276\1\277\1\300\5\276"+
- "\1\u021c\53\276\1\277\1\300\6\276\1\u021d\52\276\1\277"+
- "\1\300\7\276\1\u021e\51\276\1\277\1\300\10\276\1\u021f"+
- "\50\276\1\277\1\300\11\276\1\u0220\47\276\1\277\1\300"+
- "\12\276\1\u0221\46\276\1\277\1\300\13\276\1\u0222\45\276"+
- "\1\277\1\300\14\276\1\u0223\44\276\1\277\1\300\15\276"+
- "\1\u0224\43\276\1\277\1\300\1\276\1\u0225\57\276\1\277"+
- "\1\300\2\276\1\u0226\55\276\1\u017b\1\341\1\342\3\u017b"+
- "\1\u0227\14\u017b\1\340\37\u017b\1\276\1\277\1\300\12\276"+
- "\1\u0228\45\276\4\263\1\u0229\1\263\1\u0136\61\263\1\u022a"+
- "\1\u0136\54\263\6\0\1\u0145\6\0\1\u01e4\45\0\6\263"+
- "\1\u0136\1\u022b\61\263\1\u0136\1\263\1\u022c\60\263\1\u0136"+
- "\2\263\1\u022d\57\263\1\u0136\3\263\1\u022e\56\263\1\u0136"+
- "\4\263\1\u022f\55\263\1\u0136\5\263\1\u0230\54\263\1\u0136"+
- "\6\263\1\u0231\53\263\1\u0136\7\263\1\u0232\52\263\1\u0136"+
- "\10\263\1\u0233\51\263\1\u0136\11\263\1\u0234\42\263\1\344"+
- "\1\341\1\342\1\344\1\u0235\1\344\1\u017c\55\344\1\341"+
- "\1\342\2\344\1\u0236\1\u017c\54\344\1\276\1\277\1\300"+
- "\3\276\1\u016e\6\276\1\u0228\45\276\1\344\1\341\1\342"+
- "\3\344\1\u017c\1\u0237\54\344\1\341\1\342\3\344\1\u017c"+
- "\1\344\1\u0238\53\344\1\341\1\342\3\344\1\u017c\2\344"+
- "\1\u0239\52\344\1\341\1\342\3\344\1\u017c\3\344\1\u023a"+
- "\51\344\1\341\1\342\3\344\1\u017c\4\344\1\u023b\50\344"+
- "\1\341\1\342\3\344\1\u017c\5\344\1\u023c\47\344\1\341"+
- "\1\342\3\344\1\u017c\6\344\1\u023d\46\344\1\341\1\342"+
- "\3\344\1\u017c\7\344\1\u023e\45\344\1\341\1\342\3\344"+
- "\1\u017c\10\344\1\u023f\44\344\1\341\1\342\3\344\1\u017c"+
- "\11\344\1\u0240\42\344\1\u0241\1\277\1\300\3\u0241\1\276"+
- "\14\u0241\1\u0197\37\u0241\1\276\1\277\1\300\3\276\1\u0242"+
- "\54\276\1\u0199\1\277\1\300\4\u0199\1\u0243\13\u0199\1\345"+
- "\27\u0199\1\u019a\10\u0199\1\277\1\300\4\u0199\1\u0244\13\u0199"+
- "\1\345\27\u0199\1\u019a\7\u0199\1\0\1\u01e8\1\u01e9\1\0"+
- "\1\301\1\302\1\303\1\304\1\305\1\306\1\307\1\310"+
- "\1\311\1\312\1\313\1\314\1\315\42\0\1\276\1\u0245"+
- "\1\u0246\1\276\1\320\1\321\1\322\1\323\1\324\1\325"+
- "\1\326\1\327\1\330\1\331\1\332\1\333\1\334\43\276"+
- "\1\277\1\300\4\276\1\u0247\54\276\1\277\1\300\5\276"+
- "\1\u0248\53\276\1\277\1\300\20\276\1\u019f\40\276\1\277"+
- "\1\300\6\276\1\u0249\52\276\1\277\1\300\7\276\1\u024a"+
- "\51\276\1\277\1\300\10\276\1\u024b\50\276\1\277\1\300"+
- "\11\276\1\u024c\47\276\1\277\1\300\12\276\1\u024d\45\276"+
- "\1\u01a5\1\277\1\300\13\u01a5\1\u024e\4\u01a5\1\355\37\u01a5"+
- "\1\u024f\1\277\1\300\13\u024f\1\276\4\u024f\1\u01a6\37\u024f"+
- "\1\276\1\277\1\300\13\276\1\u0250\45\276\1\277\1\300"+
- "\14\276\1\u0251\44\276\1\277\1\300\15\276\1\u0252\43\276"+
- "\1\277\1\300\2\276\1\361\1\276\1\361\5\276\1\362"+
- "\1\276\1\361\4\276\15\361\1\u0253\11\361\3\276\1\361"+
- "\1\276\1\361\2\276\1\u01ae\1\277\1\300\13\u01ae\1\276"+
- "\4\u01ae\1\364\30\u01ae\1\u0254\6\u01ae\1\0\1\u0255\4\0"+
- "\1\u0255\14\0\1\u0255\37\0\1\365\1\u0255\1\0\3\365"+
- "\1\u0256\1\0\13\365\1\u0257\27\365\1\366\7\365\5\0"+
- "\1\164\1\0\1\165\1\33\4\0\1\33\6\0\3\42"+
- "\1\u0104\23\42\1\0\1\33\1\0\1\42\1\33\1\42"+
- "\7\0\1\164\1\0\1\165\1\33\4\0\1\33\6\0"+
- "\3\42\1\u0258\23\42\1\0\1\33\1\0\1\42\1\33"+
- "\1\42\7\0\1\164\1\0\1\165\1\33\4\0\1\33"+
- "\6\0\2\42\1\u0259\24\42\1\0\1\33\1\0\1\42"+
- "\1\33\1\42\7\0\1\164\1\0\1\u025a\14\0\27\164"+
- "\3\0\1\164\1\0\1\164\7\0\1\164\1\0\1\165"+
- "\1\33\4\0\1\33\6\0\6\42\1\374\20\42\1\0"+
- "\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
- "\1\165\1\33\4\0\1\33\6\0\12\42\1\374\14\42"+
- "\1\0\1\33\1\0\1\42\1\33\1\42\7\0\1\164"+
- "\1\0\1\165\1\33\4\0\1\33\6\0\12\42\1\u025b"+
- "\14\42\1\0\1\33\1\0\1\42\1\33\1\42\7\0"+
- "\1\164\1\0\1\165\1\33\4\0\1\33\6\0\7\42"+
- "\1\u025c\17\42\1\0\1\33\1\0\1\42\1\33\1\42"+
- "\7\0\1\164\1\0\1\165\1\33\4\0\1\33\6\0"+
- "\12\42\1\u025d\14\42\1\0\1\33\1\0\1\42\1\33"+
- "\1\42\7\0\1\164\1\0\1\165\1\33\4\0\1\33"+
- "\6\0\4\42\1\u025e\22\42\1\0\1\33\1\0\1\42"+
- "\1\33\1\42\7\0\1\164\1\0\1\165\1\33\4\0"+
- "\1\33\6\0\1\42\1\u025f\25\42\1\0\1\33\1\0"+
- "\1\42\1\33\1\42\7\0\1\164\1\0\1\165\1\33"+
- "\4\0\1\33\6\0\1\u0260\1\42\1\u0261\24\42\1\0"+
- "\1\33\1\0\1\42\1\33\1\42\7\0\1\u0262\1\0"+
"\1\165\1\33\4\0\1\33\6\0\27\42\1\0\1\33"+
"\1\0\1\42\1\33\1\42\7\0\1\164\1\0\1\165"+
- "\1\33\4\0\1\33\6\0\5\42\1\u0263\21\42\1\0"+
- "\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
- "\1\165\14\0\1\164\1\u0264\25\164\3\0\1\164\1\0"+
- "\1\164\7\0\1\164\1\0\1\165\1\33\4\0\1\33"+
- "\6\0\20\42\1\374\6\42\1\0\1\33\1\0\1\42"+
- "\1\33\1\42\7\0\1\164\1\0\1\165\1\33\4\0"+
- "\1\33\6\0\5\42\1\u025c\21\42\1\0\1\33\1\0"+
+ "\1\33\4\0\1\33\6\0\1\204\3\42\1\205\1\206"+
+ "\12\42\1\207\1\42\1\210\4\42\1\0\1\33\1\0"+
"\1\42\1\33\1\42\7\0\1\164\1\0\1\165\1\33"+
- "\4\0\1\33\6\0\2\42\1\u01b7\24\42\1\0\1\33"+
+ "\4\0\1\33\6\0\3\42\1\211\23\42\1\0\1\33"+
"\1\0\1\42\1\33\1\42\7\0\1\164\1\0\1\165"+
- "\1\33\4\0\1\33\6\0\7\42\1\u0265\17\42\1\0"+
- "\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
- "\1\165\1\33\4\0\1\33\6\0\1\u0266\26\42\1\0"+
- "\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
- "\1\165\1\33\4\0\1\33\6\0\12\42\1\u0267\14\42"+
+ "\1\33\4\0\1\33\6\0\1\212\1\42\1\213\24\42"+
"\1\0\1\33\1\0\1\42\1\33\1\42\7\0\1\164"+
- "\1\0\1\165\1\33\4\0\1\33\6\0\22\42\1\u0268"+
- "\4\42\1\0\1\33\1\0\1\42\1\33\1\42\7\0"+
- "\1\164\1\0\1\165\1\33\4\0\1\33\6\0\2\42"+
- "\1\u0269\24\42\1\0\1\33\1\0\1\42\1\33\1\42"+
- "\7\0\1\u026a\1\0\1\165\1\33\4\0\1\33\6\0"+
- "\27\42\1\0\1\33\1\0\1\42\1\33\1\42\7\0"+
- "\1\164\1\0\1\165\1\33\4\0\1\33\6\0\4\42"+
- "\1\u026b\22\42\1\0\1\33\1\0\1\42\1\33\1\42"+
- "\7\0\1\164\1\0\1\165\1\33\4\0\1\33\6\0"+
- "\12\42\1\u0100\14\42\1\0\1\33\1\0\1\42\1\33"+
- "\1\42\7\0\1\164\1\0\1\165\1\33\4\0\1\33"+
- "\6\0\2\42\1\u01b7\1\u026c\23\42\1\0\1\33\1\0"+
- "\1\42\1\33\1\42\7\0\1\164\1\0\1\165\1\33"+
- "\4\0\1\33\6\0\3\42\1\u026d\1\u026e\22\42\1\0"+
- "\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
- "\1\165\1\33\4\0\1\33\6\0\21\42\1\u026f\5\42"+
- "\1\0\1\33\1\0\1\42\1\33\1\42\7\0\1\164"+
- "\1\0\1\165\1\33\4\0\1\33\6\0\6\42\1\u0270"+
- "\20\42\1\0\1\33\1\0\1\42\1\33\1\42\3\0"+
- "\1\u0271\4\0\1\u0271\14\0\1\u0271\37\0\1\u0124\1\u0271"+
- "\1\0\3\u0124\1\u0272\1\0\13\u0124\1\u0273\27\u0124\1\u0125"+
- "\7\u0124\1\0\1\u0274\1\u0275\1\0\1\u0128\1\u0129\1\u012a"+
- "\1\u012b\1\u012c\1\u012d\1\u012e\1\u012f\1\u0130\1\u0131\1\u0132"+
- "\1\u0133\1\u0134\43\0\1\u01d4\1\u0275\1\0\1\u0128\1\u0129"+
- "\1\u012a\1\u012b\1\u012c\1\u012d\1\u012e\1\u012f\1\u0130\1\u0131"+
- "\1\u0132\1\u0133\1\u0134\46\0\1\u0276\63\0\1\u0277\63\0"+
- "\1\u0278\63\0\1\u0279\63\0\1\u027a\63\0\1\u027b\63\0"+
- "\1\u027c\63\0\1\u027d\63\0\1\u027e\63\0\1\u027f\63\0"+
- "\1\u0280\63\0\1\u0281\63\0\1\u0282\43\0\1\u013f\3\0"+
- "\1\u013f\1\0\2\u013f\4\0\1\u0283\4\0\2\u013f\33\0"+
- "\1\u013f\1\0\2\u013f\1\u01e5\2\0\3\u01e5\1\u0284\14\u01e5"+
- "\1\u0137\37\u01e5\6\0\1\u0271\54\0\1\u0138\2\0\3\u0138"+
- "\1\u0285\1\0\13\u0138\1\265\27\u0138\1\u0139\7\u0138\1\0"+
- "\1\u01e8\61\0\1\u01ec\2\0\13\u01ec\1\u0286\4\u01ec\1\u013e"+
- "\37\u01ec\5\0\1\272\1\0\1\u0287\5\0\1\273\1\0"+
- "\1\272\4\0\20\272\1\u0288\6\272\3\0\1\272\1\0"+
- "\1\272\6\0\1\u0289\63\0\1\u028a\63\0\1\u028b\63\0"+
- "\1\u028c\63\0\1\u028d\63\0\1\u028e\63\0\1\u028f\63\0"+
- "\1\u0290\63\0\1\u0291\63\0\1\u0292\63\0\1\u0293\63\0"+
- "\1\u0294\63\0\1\u0295\46\0\1\u0296\63\0\1\u0297\63\0"+
- "\1\u0298\63\0\1\u0299\63\0\1\u029a\63\0\1\u029b\63\0"+
- "\1\u029c\63\0\1\u029d\63\0\1\u029e\63\0\1\u029f\63\0"+
- "\1\u02a0\63\0\1\u02a1\63\0\1\u02a2\43\0\1\u01d4\1\u01d5"+
- "\1\0\1\u0150\1\u0151\1\u0152\1\u0153\1\u0154\1\u0155\1\u0156"+
- "\1\u0157\1\u0158\1\u0159\1\u015a\1\u015b\1\u015c\42\0\1\276"+
- "\1\u02a3\1\u02a4\1\276\1\u015f\1\u0160\1\u0161\1\u0162\1\u0163"+
- "\1\u0164\1\u0165\1\u0166\1\u0167\1\u0168\1\u0169\1\u016a\1\u016b"+
- "\43\276\1\277\1\300\1\276\1\u02a5\57\276\1\277\1\300"+
- "\2\276\1\u02a6\56\276\1\277\1\300\3\276\1\u02a7\55\276"+
- "\1\277\1\300\4\276\1\u02a8\54\276\1\277\1\300\5\276"+
- "\1\u02a9\53\276\1\277\1\300\6\276\1\u02aa\52\276\1\277"+
- "\1\300\7\276\1\u02ab\51\276\1\277\1\300\10\276\1\u02ac"+
- "\50\276\1\277\1\300\11\276\1\u02ad\47\276\1\277\1\300"+
- "\12\276\1\u02ae\46\276\1\277\1\300\13\276\1\u02af\45\276"+
- "\1\277\1\300\14\276\1\u02b0\44\276\1\277\1\300\15\276"+
- "\1\u02b1\43\276\1\277\1\300\1\276\1\u02b2\57\276\1\277"+
- "\1\300\2\276\1\u02b3\56\276\1\277\1\300\3\276\1\u02b4"+
- "\55\276\1\277\1\300\4\276\1\u02b5\54\276\1\277\1\300"+
- "\5\276\1\u02b6\53\276\1\277\1\300\6\276\1\u02b7\52\276"+
- "\1\277\1\300\7\276\1\u02b8\51\276\1\277\1\300\10\276"+
- "\1\u02b9\50\276\1\277\1\300\11\276\1\u02ba\47\276\1\277"+
- "\1\300\12\276\1\u02bb\46\276\1\277\1\300\13\276\1\u02bc"+
- "\45\276\1\277\1\300\14\276\1\u02bd\44\276\1\277\1\300"+
- "\15\276\1\u02be\43\276\1\300\1\u02bf\1\276\1\u02c0\57\276"+
- "\1\300\1\u02bf\2\276\1\u02c1\56\276\1\u01aa\1\300\2\276"+
- "\1\u01ac\1\276\2\u01ac\4\276\1\u02c2\4\276\2\u01ac\33\276"+
- "\1\u01ac\1\276\2\u01ac\4\263\1\u02c3\1\263\1\u0136\61\263"+
- "\1\u02c4\1\u0136\62\263\1\u0136\1\u02c5\61\263\1\u0136\1\263"+
- "\1\u02c6\60\263\1\u0136\2\263\1\u02c7\57\263\1\u0136\3\263"+
- "\1\u02c8\56\263\1\u0136\4\263\1\u02c9\55\263\1\u0136\5\263"+
- "\1\u02ca\54\263\1\u0136\6\263\1\u02cb\53\263\1\u0136\7\263"+
- "\1\u02cc\52\263\1\u0136\10\263\1\u02cd\51\263\1\u0136\11\263"+
- "\1\u02ce\42\263\1\344\1\341\1\342\1\344\1\u02cf\1\344"+
- "\1\u017c\55\344\1\341\1\342\2\344\1\u02d0\1\u017c\55\344"+
- "\1\341\1\342\3\344\1\u017c\1\u02d1\54\344\1\341\1\342"+
- "\3\344\1\u017c\1\344\1\u02d2\53\344\1\341\1\342\3\344"+
- "\1\u017c\2\344\1\u02d3\52\344\1\341\1\342\3\344\1\u017c"+
- "\3\344\1\u02d4\51\344\1\341\1\342\3\344\1\u017c\4\344"+
- "\1\u02d5\50\344\1\341\1\342\3\344\1\u017c\5\344\1\u02d6"+
- "\47\344\1\341\1\342\3\344\1\u017c\6\344\1\u02d7\46\344"+
- "\1\341\1\342\3\344\1\u017c\7\344\1\u02d8\45\344\1\341"+
- "\1\342\3\344\1\u017c\10\344\1\u02d9\44\344\1\341\1\342"+
- "\3\344\1\u017c\11\344\1\u02da\42\344\1\u0241\1\277\1\300"+
- "\3\u0241\1\u02db\14\u0241\1\u0197\37\u0241\1\276\1\300\1\u02bf"+
- "\3\276\1\u02dc\55\276\1\277\1\300\3\276\1\u02dd\54\276"+
- "\1\u0199\1\277\1\300\3\u0199\1\u02de\1\276\13\u0199\1\345"+
- "\27\u0199\1\u019a\7\u0199\1\276\1\u02df\1\300\1\276\1\320"+
- "\1\321\1\322\1\323\1\324\1\325\1\326\1\327\1\330"+
- "\1\331\1\332\1\333\1\334\43\276\1\300\1\u02bf\4\276"+
- "\1\u02e0\54\276\1\300\1\u02bf\5\276\1\u02e1\53\276\1\300"+
- "\1\u02bf\6\276\1\u02e2\52\276\1\300\1\u02bf\7\276\1\u02e3"+
- "\51\276\1\300\1\u02bf\10\276\1\u02e4\50\276\1\300\1\u02bf"+
- "\11\276\1\u02e5\47\276\1\300\1\u02bf\12\276\1\u02e6\45\276"+
- "\1\u024f\1\277\1\300\13\u024f\1\u02e7\4\u024f\1\u01a6\37\u024f"+
- "\1\276\1\300\1\u02bf\13\276\1\u02e8\45\276\1\300\1\u02bf"+
- "\14\276\1\u02e9\44\276\1\300\1\u02bf\15\276\1\u02ea\43\276"+
- "\1\277\1\300\2\276\1\361\1\276\1\u02eb\5\276\1\362"+
- "\1\276\1\361\4\276\20\361\1\u02ec\6\361\3\276\1\361"+
- "\1\276\1\361\2\276\5\0\1\164\1\0\1\165\1\33"+
- "\4\0\1\33\6\0\4\42\1\u0104\22\42\1\0\1\33"+
+ "\1\0\1\165\1\33\4\0\1\33\6\0\1\214\1\42"+
+ "\1\215\2\42\1\216\1\42\1\217\17\42\1\0\1\33"+
"\1\0\1\42\1\33\1\42\7\0\1\164\1\0\1\165"+
- "\1\33\4\0\1\33\6\0\1\42\1\u02ed\25\42\1\0"+
- "\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
- "\1\165\1\33\4\0\1\33\6\0\1\u02ee\26\42\1\0"+
- "\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
- "\1\165\1\33\4\0\1\33\6\0\10\42\1\u0100\16\42"+
- "\1\0\1\33\1\0\1\42\1\33\1\42\7\0\1\164"+
- "\1\0\1\165\1\33\4\0\1\33\6\0\1\42\1\u02ef"+
- "\25\42\1\0\1\33\1\0\1\42\1\33\1\42\7\0"+
- "\1\164\1\0\1\165\1\33\4\0\1\33\6\0\5\42"+
- "\1\u02f0\21\42\1\0\1\33\1\0\1\42\1\33\1\42"+
- "\7\0\1\164\1\0\1\165\1\33\4\0\1\33\6\0"+
- "\4\42\1\u02f1\22\42\1\0\1\33\1\0\1\42\1\33"+
- "\1\42\7\0\1\164\1\0\1\165\1\33\4\0\1\33"+
- "\6\0\4\42\1\u02f2\22\42\1\0\1\33\1\0\1\42"+
- "\1\33\1\42\7\0\1\164\1\0\1\165\1\33\4\0"+
- "\1\33\6\0\3\42\1\u02f3\23\42\1\0\1\33\1\0"+
- "\1\42\1\33\1\42\7\0\1\164\1\0\1\165\14\0"+
- "\21\164\1\u02f4\5\164\3\0\1\164\1\0\1\164\7\0"+
- "\1\164\1\0\1\165\1\33\4\0\1\33\6\0\7\42"+
- "\1\u02f5\17\42\1\0\1\33\1\0\1\42\1\33\1\42"+
- "\7\0\1\164\1\0\1\165\14\0\1\u02f6\26\164\3\0"+
- "\1\164\1\0\1\164\7\0\1\164\1\0\1\165\1\33"+
- "\4\0\1\33\6\0\22\42\1\u02f7\4\42\1\0\1\33"+
- "\1\0\1\42\1\33\1\42\7\0\1\164\1\0\1\165"+
- "\1\33\4\0\1\33\6\0\6\42\1\u0100\20\42\1\0"+
- "\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
- "\1\165\1\33\4\0\1\33\6\0\7\42\1\u02f8\17\42"+
- "\1\0\1\33\1\0\1\42\1\33\1\42\7\0\1\164"+
- "\1\0\1\165\1\33\4\0\1\33\6\0\4\42\1\u02f9"+
+ "\1\33\4\0\1\33\6\0\2\42\1\220\1\42\1\221"+
"\22\42\1\0\1\33\1\0\1\42\1\33\1\42\7\0"+
- "\1\164\1\0\1\165\1\33\4\0\1\33\6\0\10\42"+
- "\1\u02fa\16\42\1\0\1\33\1\0\1\42\1\33\1\42"+
- "\7\0\1\164\1\0\1\165\14\0\23\164\1\u02fb\3\164"+
- "\3\0\1\164\1\0\1\164\7\0\1\164\1\0\1\165"+
- "\1\33\4\0\1\33\6\0\3\42\1\u02fc\23\42\1\0"+
- "\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
- "\1\165\1\33\4\0\1\33\6\0\5\42\1\u02fd\21\42"+
+ "\1\164\1\0\1\165\1\33\4\0\1\33\6\0\2\42"+
+ "\1\222\24\42\1\0\1\33\1\0\1\42\1\33\1\42"+
+ "\7\0\1\164\1\0\1\165\1\33\4\0\1\33\6\0"+
+ "\1\223\6\42\1\224\17\42\1\0\1\33\1\0\1\42"+
+ "\1\33\1\42\7\0\1\164\1\0\1\165\1\33\4\0"+
+ "\1\33\6\0\1\225\26\42\1\0\1\33\1\0\1\42"+
+ "\1\33\1\42\7\0\1\164\1\0\1\165\1\33\4\0"+
+ "\1\33\6\0\4\42\1\226\1\227\21\42\1\0\1\33"+
+ "\1\0\1\42\1\33\1\42\7\0\1\164\1\0\1\165"+
+ "\1\33\4\0\1\33\6\0\2\42\1\230\1\42\1\231"+
+ "\1\232\21\42\1\0\1\33\1\0\1\42\1\33\1\42"+
+ "\7\0\1\164\1\0\1\165\1\33\4\0\1\33\6\0"+
+ "\4\42\1\233\22\42\1\0\1\33\1\0\1\42\1\33"+
+ "\1\42\12\0\1\33\4\0\1\33\6\0\27\56\1\0"+
+ "\1\234\1\0\1\56\1\33\1\56\12\0\1\33\4\0"+
+ "\1\33\1\235\1\0\1\236\3\0\27\237\1\0\1\33"+
+ "\1\0\1\237\1\33\1\240\1\241\2\0\1\242\1\243"+
+ "\5\0\1\244\53\0\1\245\1\243\5\0\1\244\55\0"+
+ "\1\63\16\0\1\63\41\0\1\65\64\0\1\67\16\0"+
+ "\1\67\41\0\2\72\61\0\2\72\1\73\16\0\1\73"+
+ "\40\0\1\74\1\0\62\74\1\75\61\74\1\102\1\0"+
+ "\62\102\1\103\61\102\1\105\2\0\3\105\2\0\6\105"+
+ "\1\0\3\105\1\0\31\105\1\0\2\105\1\0\2\105"+
+ "\2\0\1\246\1\247\14\0\1\250\4\0\27\250\3\0"+
+ "\1\250\4\0\1\111\2\0\60\111\16\0\1\251\1\0"+
+ "\1\252\3\0\27\252\3\0\1\252\1\0\1\252\1\253"+
+ "\1\0\1\254\2\0\4\254\1\0\12\254\1\0\40\254"+
+ "\15\0\1\255\46\0\1\256\1\257\61\0\1\260\1\257"+
+ "\63\0\1\261\16\0\1\261\40\0\1\262\2\263\3\262"+
+ "\1\264\13\262\1\263\40\262\1\265\2\0\4\265\1\266"+
+ "\12\265\1\0\40\265\10\0\1\267\52\0\1\270\2\0"+
+ "\13\270\1\271\3\270\1\0\40\270\5\0\1\272\1\0"+
+ "\1\272\5\0\1\273\1\0\1\272\4\0\27\272\3\0"+
+ "\1\272\1\0\1\272\7\0\1\272\1\0\1\272\5\0"+
+ "\1\273\1\0\1\272\4\0\1\272\1\274\25\272\3\0"+
+ "\1\272\1\0\1\272\2\0\1\275\2\0\13\275\1\0"+
+ "\3\275\1\0\31\275\1\0\6\275\1\276\1\277\1\300"+
+ "\60\276\1\0\1\256\1\257\1\0\1\301\1\302\1\303"+
+ "\1\304\1\305\1\306\1\307\1\310\1\311\1\312\1\313"+
+ "\1\314\1\315\42\0\1\276\1\316\1\317\1\276\1\320"+
+ "\1\321\1\322\1\323\1\324\1\325\1\326\1\327\1\330"+
+ "\1\331\1\332\1\333\1\334\43\276\1\277\1\300\1\335"+
+ "\16\276\1\335\41\276\1\277\1\300\1\276\1\336\57\276"+
+ "\1\277\1\300\2\276\1\337\55\276\1\340\1\341\1\342"+
+ "\3\340\1\343\13\340\1\344\40\340\1\345\1\277\1\300"+
+ "\4\345\1\346\12\345\1\276\40\345\1\276\1\277\1\300"+
+ "\5\276\1\347\53\276\1\277\1\300\6\276\1\350\52\276"+
+ "\1\277\1\300\7\276\1\351\51\276\1\277\1\300\10\276"+
+ "\1\352\50\276\1\277\1\300\11\276\1\353\47\276\1\277"+
+ "\1\300\12\276\1\354\45\276\1\355\1\277\1\300\13\355"+
+ "\1\356\3\355\1\276\40\355\1\276\1\277\1\300\14\276"+
+ "\1\357\44\276\1\277\1\300\15\276\1\360\43\276\1\277"+
+ "\1\300\2\276\1\361\1\276\1\361\5\276\1\362\1\276"+
+ "\1\361\4\276\27\361\3\276\1\361\1\276\1\361\3\276"+
+ "\1\277\1\300\2\276\1\361\1\276\1\361\5\276\1\362"+
+ "\1\276\1\361\4\276\1\361\1\363\25\361\3\276\1\361"+
+ "\1\276\1\361\2\276\1\364\1\277\1\300\13\364\1\276"+
+ "\3\364\1\276\31\364\1\276\6\364\1\365\2\0\4\365"+
+ "\1\0\12\365\1\157\30\365\1\366\7\365\1\0\2\163"+
+ "\61\0\1\160\1\163\60\0\1\367\2\0\4\367\1\0"+
+ "\54\367\2\0\4\367\1\0\1\370\4\367\1\370\6\367"+
+ "\27\370\1\367\1\370\1\367\3\370\2\367\5\0\1\164"+
+ "\1\0\1\165\1\33\4\0\1\33\6\0\1\42\1\371"+
+ "\25\42\1\0\1\33\1\0\1\42\1\33\1\42\7\0"+
+ "\1\164\1\0\1\165\1\33\4\0\1\33\6\0\14\42"+
+ "\1\372\12\42\1\0\1\33\1\0\1\42\1\33\1\42"+
+ "\7\0\1\164\1\0\1\165\1\33\4\0\1\33\6\0"+
+ "\12\42\1\373\6\42\1\216\5\42\1\0\1\33\1\0"+
+ "\1\42\1\33\1\42\7\0\1\164\1\0\1\165\1\33"+
+ "\4\0\1\33\6\0\1\42\1\216\13\42\1\374\11\42"+
"\1\0\1\33\1\0\1\42\1\33\1\42\7\0\1\164"+
- "\1\0\1\165\1\33\4\0\1\33\6\0\7\42\1\u02fe"+
- "\17\42\1\0\1\33\1\0\1\42\1\33\1\42\7\0"+
- "\1\164\1\0\1\165\1\33\4\0\1\33\6\0\5\42"+
- "\1\u02ff\21\42\1\0\1\33\1\0\1\42\1\33\1\42"+
+ "\1\0\1\165\1\33\4\0\1\33\6\0\15\42\1\375"+
+ "\11\42\1\0\1\33\1\0\1\42\1\33\1\42\7\0"+
+ "\1\164\1\0\1\165\1\33\4\0\1\33\6\0\12\42"+
+ "\1\376\14\42\1\0\1\33\1\0\1\42\1\33\1\42"+
"\7\0\1\164\1\0\1\165\1\33\4\0\1\33\6\0"+
- "\1\u01b7\26\42\1\0\1\33\1\0\1\42\1\33\1\42"+
+ "\4\42\1\377\22\42\1\0\1\33\1\0\1\42\1\33"+
+ "\1\42\7\0\1\164\1\0\1\165\1\33\4\0\1\33"+
+ "\6\0\1\42\1\u0100\25\42\1\0\1\33\1\0\1\42"+
+ "\1\33\1\42\7\0\1\164\1\0\1\165\1\33\4\0"+
+ "\1\33\6\0\6\42\1\u0101\20\42\1\0\1\33\1\0"+
+ "\1\42\1\33\1\42\7\0\1\164\1\0\1\165\1\33"+
+ "\4\0\1\33\6\0\1\u0102\14\42\1\u0103\11\42\1\0"+
+ "\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
+ "\1\165\1\33\4\0\1\33\6\0\7\42\1\u0104\17\42"+
+ "\1\0\1\33\1\0\1\42\1\33\1\42\7\0\1\164"+
+ "\1\0\1\165\1\33\4\0\1\33\6\0\1\42\1\u0105"+
+ "\25\42\1\0\1\33\1\0\1\42\1\33\1\42\7\0"+
+ "\1\164\1\0\1\165\1\33\4\0\1\33\6\0\3\42"+
+ "\1\u0106\4\42\1\u0107\3\42\1\u0108\12\42\1\0\1\33"+
+ "\1\0\1\42\1\33\1\42\7\0\1\164\1\0\1\165"+
+ "\1\33\4\0\1\33\6\0\24\42\1\u0109\2\42\1\0"+
+ "\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
+ "\1\165\1\33\4\0\1\33\6\0\1\u010a\26\42\1\0"+
+ "\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
+ "\1\165\1\33\4\0\1\33\6\0\4\42\1\u010b\22\42"+
+ "\1\0\1\33\1\0\1\42\1\33\1\42\7\0\1\164"+
+ "\1\0\1\165\1\33\4\0\1\33\6\0\1\42\1\u0100"+
+ "\1\42\1\u010c\23\42\1\0\1\33\1\0\1\42\1\33"+
+ "\1\42\7\0\1\164\1\0\1\165\1\33\4\0\1\33"+
+ "\6\0\17\42\1\u010d\7\42\1\0\1\33\1\0\1\42"+
+ "\1\33\1\42\7\0\1\164\1\0\1\165\1\33\4\0"+
+ "\1\33\6\0\16\42\1\374\10\42\1\0\1\33\1\0"+
+ "\1\42\1\33\1\42\7\0\1\164\1\0\1\165\1\33"+
+ "\4\0\1\33\6\0\15\42\1\u010e\2\42\1\u010f\6\42"+
+ "\1\0\1\33\1\0\1\42\1\33\1\42\7\0\1\164"+
+ "\1\0\1\165\1\33\4\0\1\33\6\0\22\42\1\u0100"+
+ "\4\42\1\0\1\33\1\0\1\42\1\33\1\42\7\0"+
+ "\1\164\1\0\1\165\1\33\4\0\1\33\6\0\21\42"+
+ "\1\u0110\5\42\1\0\1\33\1\0\1\42\1\33\1\42"+
"\7\0\1\164\1\0\1\165\1\33\4\0\1\33\6\0"+
- "\2\42\1\u0300\24\42\1\0\1\33\1\0\1\42\1\33"+
- "\1\42\6\0\1\u0128\1\u0129\1\u012a\1\u012b\1\u012c\1\u012d"+
- "\1\u012e\1\u012f\1\u0130\1\u0131\1\u0132\1\u0133\1\u0134\43\0"+
- "\1\u0274\2\0\1\u0128\1\u0129\1\u012a\1\u012b\1\u012c\1\u012d"+
- "\1\u012e\1\u012f\1\u0130\1\u0131\1\u0132\1\u0133\1\u0134\46\0"+
- "\1\u0301\63\0\1\u0302\63\0\1\u0303\63\0\1\u0304\63\0"+
- "\1\u0305\63\0\1\u0306\63\0\1\u0307\63\0\1\u0308\63\0"+
- "\1\u0309\63\0\1\u030a\63\0\1\u030b\63\0\1\u030c\63\0"+
- "\1\u030d\43\0\1\u013f\3\0\1\u013f\1\0\2\u013f\11\0"+
- "\2\u013f\33\0\1\u013f\1\0\2\u013f\6\0\1\u030e\72\0"+
- "\1\u030f\51\0\1\272\1\0\1\272\5\0\1\273\1\0"+
- "\1\272\4\0\27\272\2\0\1\u0310\1\272\1\0\1\272"+
- "\7\0\1\272\1\0\1\u0287\5\0\1\273\1\0\1\272"+
- "\4\0\27\272\3\0\1\272\1\0\1\272\3\0\1\u0311"+
- "\1\u0312\1\0\1\u0313\57\0\1\u0311\1\u0312\2\0\1\u0314"+
- "\56\0\1\u0311\1\u0312\3\0\1\u0315\55\0\1\u0311\1\u0312"+
- "\4\0\1\u0316\54\0\1\u0311\1\u0312\5\0\1\u0317\53\0"+
- "\1\u0311\1\u0312\6\0\1\u0318\52\0\1\u0311\1\u0312\7\0"+
- "\1\u0319\51\0\1\u0311\1\u0312\10\0\1\u031a\50\0\1\u0311"+
- "\1\u0312\11\0\1\u031b\47\0\1\u0311\1\u0312\12\0\1\u031c"+
- "\46\0\1\u0311\1\u0312\13\0\1\u031d\45\0\1\u0311\1\u0312"+
- "\14\0\1\u031e\44\0\1\u0311\1\u0312\15\0\1\u031f\46\0"+
- "\1\u0320\63\0\1\u0321\63\0\1\u0322\63\0\1\u0323\63\0"+
- "\1\u0324\63\0\1\u0325\63\0\1\u0326\63\0\1\u0327\63\0"+
- "\1\u0328\63\0\1\u0329\63\0\1\u032a\63\0\1\u032b\63\0"+
- "\1\u032c\43\0\1\u0274\1\u0275\1\0\1\u0150\1\u0151\1\u0152"+
+ "\1\u0111\26\42\1\0\1\33\1\0\1\42\1\33\1\42"+
+ "\7\0\1\164\1\0\1\165\1\33\4\0\1\33\6\0"+
+ "\3\42\1\u0112\5\42\1\u0113\15\42\1\0\1\33\1\0"+
+ "\1\42\1\33\1\42\7\0\1\164\1\0\1\165\1\33"+
+ "\4\0\1\33\6\0\1\42\1\u0114\25\42\1\0\1\33"+
+ "\1\0\1\42\1\33\1\42\7\0\1\164\1\0\1\165"+
+ "\1\33\4\0\1\33\6\0\12\42\1\u0115\14\42\1\0"+
+ "\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
+ "\1\165\1\33\4\0\1\33\6\0\22\42\1\u0116\4\42"+
+ "\1\0\1\33\1\0\1\42\1\33\1\42\7\0\1\164"+
+ "\1\0\1\165\1\33\4\0\1\33\6\0\12\42\1\u0117"+
+ "\14\42\1\0\1\33\1\0\1\42\1\33\1\42\7\0"+
+ "\1\164\1\0\1\165\1\33\4\0\1\33\6\0\11\42"+
+ "\1\u0118\15\42\1\0\1\33\1\0\1\42\1\33\1\42"+
+ "\7\0\1\164\1\0\1\165\1\33\4\0\1\33\6\0"+
+ "\5\42\1\u0119\21\42\1\0\1\33\1\0\1\42\1\33"+
+ "\1\42\7\0\1\164\1\0\1\165\1\33\4\0\1\33"+
+ "\6\0\6\42\1\u011a\20\42\1\0\1\33\1\0\1\42"+
+ "\1\33\1\42\7\0\1\164\1\0\1\165\1\33\4\0"+
+ "\1\33\6\0\10\42\1\u011b\16\42\1\0\1\33\1\0"+
+ "\1\42\1\33\1\42\7\0\1\164\1\0\1\165\1\33"+
+ "\4\0\1\33\6\0\7\42\1\u011c\17\42\1\0\1\33"+
+ "\1\0\1\42\1\33\1\42\7\0\1\164\1\0\1\165"+
+ "\1\33\4\0\1\33\6\0\20\42\1\u011d\6\42\1\0"+
+ "\1\33\1\0\1\42\1\33\1\42\63\0\1\241\25\0"+
+ "\27\236\3\0\1\236\1\0\1\236\1\241\11\0\1\33"+
+ "\4\0\1\33\6\0\27\237\1\0\1\33\1\0\1\237"+
+ "\1\33\1\237\1\u011e\11\0\1\33\4\0\1\33\6\0"+
+ "\27\237\1\0\1\33\1\0\1\237\1\33\1\240\1\241"+
+ "\2\0\1\242\71\0\1\u011f\53\0\1\u0120\1\u0121\61\0"+
+ "\1\u0122\1\u0121\141\0\1\253\25\0\27\252\3\0\1\252"+
+ "\1\0\1\252\1\253\16\0\1\u0123\45\0\1\u0124\2\0"+
+ "\4\u0124\1\0\12\u0124\1\254\30\u0124\1\u0125\7\u0124\1\0"+
+ "\1\u0126\1\u0127\1\0\1\u0128\1\u0129\1\u012a\1\u012b\1\u012c"+
+ "\1\u012d\1\u012e\1\u012f\1\u0130\1\u0131\1\u0132\1\u0133\1\u0134"+
+ "\43\0\1\256\1\u0127\1\0\1\u0128\1\u0129\1\u012a\1\u012b"+
+ "\1\u012c\1\u012d\1\u012e\1\u012f\1\u0130\1\u0131\1\u0132\1\u0133"+
+ "\1\u0134\43\0\1\256\1\257\1\0\1\u0128\1\u0129\1\u012a"+
+ "\1\u012b\1\u012c\1\u012d\1\u012e\1\u012f\1\u0130\1\u0131\1\u0132"+
+ "\1\u0133\1\u0134\42\0\1\u0135\2\263\3\u0135\1\u0136\13\u0135"+
+ "\1\262\40\u0135\6\263\1\u0136\54\263\1\u0137\2\0\3\u0137"+
+ "\1\0\13\u0137\1\0\40\u0137\1\u0138\2\0\4\u0138\1\0"+
+ "\12\u0138\1\265\30\u0138\1\u0139\7\u0138\1\0\1\u013a\1\u013b"+
+ "\102\0\1\u013c\40\0\1\u013d\2\0\13\u013d\1\0\3\u013d"+
+ "\1\270\40\u013d\1\u013e\2\0\13\u013e\1\0\3\u013e\1\0"+
+ "\40\u013e\1\0\1\u013f\3\0\1\u0140\1\0\1\u0140\1\u013f"+
+ "\4\0\1\273\1\0\1\272\2\0\2\u013f\27\272\3\0"+
+ "\1\272\1\u013f\1\272\2\u013f\5\0\1\272\1\0\1\272"+
+ "\5\0\1\273\1\0\1\272\4\0\1\272\1\u0141\25\272"+
+ "\3\0\1\272\1\0\1\272\2\0\1\u0142\2\0\13\u0142"+
+ "\1\0\3\u0142\1\275\31\u0142\1\0\6\u0142\4\0\1\301"+
+ "\1\302\1\303\1\304\1\305\1\306\1\307\1\310\1\311"+
+ "\1\312\1\313\1\314\1\315\42\0\1\276\1\277\1\300"+
+ "\1\276\1\320\1\321\1\322\1\323\1\324\1\325\1\326"+
+ "\1\327\1\330\1\331\1\332\1\333\1\334\42\276\4\0"+
+ "\1\u0143\63\0\1\u0144\63\0\1\u0145\63\0\1\u0146\63\0"+
+ "\1\u0147\63\0\1\u0148\63\0\1\u0149\63\0\1\u014a\63\0"+
+ "\1\u014b\63\0\1\u014c\63\0\1\u014d\63\0\1\u014e\63\0"+
+ "\1\u014f\43\0\1\256\1\257\1\0\1\u0150\1\u0151\1\u0152"+
"\1\u0153\1\u0154\1\u0155\1\u0156\1\u0157\1\u0158\1\u0159\1\u015a"+
- "\1\u015b\1\u015c\42\0\1\276\1\u032d\1\300\1\276\1\u015f"+
+ "\1\u015b\1\u015c\42\0\1\276\1\u015d\1\u015e\1\276\1\u015f"+
"\1\u0160\1\u0161\1\u0162\1\u0163\1\u0164\1\u0165\1\u0166\1\u0167"+
"\1\u0168\1\u0169\1\u016a\1\u016b\43\276\1\277\1\300\1\276"+
- "\1\u032e\57\276\1\277\1\300\2\276\1\u032f\56\276\1\277"+
- "\1\300\3\276\1\u0330\55\276\1\277\1\300\4\276\1\u0331"+
- "\54\276\1\277\1\300\5\276\1\u0332\53\276\1\277\1\300"+
- "\6\276\1\u0333\52\276\1\277\1\300\7\276\1\u0334\51\276"+
- "\1\277\1\300\10\276\1\u0335\50\276\1\277\1\300\11\276"+
- "\1\u0336\47\276\1\277\1\300\12\276\1\u0337\46\276\1\277"+
- "\1\300\13\276\1\u0338\45\276\1\277\1\300\14\276\1\u0339"+
- "\44\276\1\277\1\300\15\276\1\u033a\43\276\1\u033b\1\u033c"+
- "\1\276\1\u033d\57\276\1\u033b\1\u033c\2\276\1\u033e\56\276"+
- "\1\u033b\1\u033c\3\276\1\u033f\55\276\1\u033b\1\u033c\4\276"+
- "\1\u0340\54\276\1\u033b\1\u033c\5\276\1\u0341\53\276\1\u033b"+
- "\1\u033c\6\276\1\u0342\52\276\1\u033b\1\u033c\7\276\1\u0343"+
- "\51\276\1\u033b\1\u033c\10\276\1\u0344\50\276\1\u033b\1\u033c"+
- "\11\276\1\u0345\47\276\1\u033b\1\u033c\12\276\1\u0346\46\276"+
- "\1\u033b\1\u033c\13\276\1\u0347\45\276\1\u033b\1\u033c\14\276"+
- "\1\u0348\44\276\1\u033b\1\u033c\15\276\1\u0349\43\276\2\300"+
- "\1\276\1\320\1\321\1\322\1\323\1\324\1\325\1\326"+
- "\1\327\1\330\1\331\1\332\1\333\1\334\43\276\1\300"+
- "\1\u02bf\1\276\1\u034a\57\276\1\300\1\u02bf\2\276\1\u034b"+
- "\56\276\1\u01aa\1\300\2\276\1\u01ac\1\276\2\u01ac\11\276"+
- "\2\u01ac\33\276\1\u01ac\1\276\2\u01ac\4\263\1\u034c\1\263"+
- "\1\u0136\61\263\1\u034d\1\u0136\62\263\1\u0136\1\u034e\61\263"+
- "\1\u0136\1\263\1\u034f\60\263\1\u0136\2\263\1\u0350\57\263"+
- "\1\u0136\3\263\1\u0351\56\263\1\u0136\4\263\1\u0352\55\263"+
- "\1\u0136\5\263\1\u0353\54\263\1\u0136\6\263\1\u0354\53\263"+
- "\1\u0136\7\263\1\u0355\52\263\1\u0136\10\263\1\u0356\51\263"+
- "\1\u0136\11\263\1\u0357\42\263\1\344\1\341\1\342\1\344"+
- "\1\u0358\1\344\1\u017c\55\344\1\341\1\342\2\344\1\u0359"+
- "\1\u017c\55\344\1\341\1\342\3\344\1\u017c\1\u035a\54\344"+
- "\1\341\1\342\3\344\1\u017c\1\344\1\u035b\53\344\1\341"+
- "\1\342\3\344\1\u017c\2\344\1\u035c\52\344\1\341\1\342"+
- "\3\344\1\u017c\3\344\1\u035d\51\344\1\341\1\342\3\344"+
- "\1\u017c\4\344\1\u035e\50\344\1\341\1\342\3\344\1\u017c"+
- "\5\344\1\u035f\47\344\1\341\1\342\3\344\1\u017c\6\344"+
- "\1\u0360\46\344\1\341\1\342\3\344\1\u017c\7\344\1\u0361"+
- "\45\344\1\341\1\342\3\344\1\u017c\10\344\1\u0362\44\344"+
- "\1\341\1\342\3\344\1\u017c\11\344\1\u0363\42\344\1\276"+
- "\1\277\1\300\3\276\1\u0364\55\276\1\300\1\u02bf\3\276"+
- "\1\u0365\55\276\1\300\1\u02bf\4\276\1\u0366\54\276\1\300"+
- "\1\u02bf\5\276\1\u0367\53\276\1\300\1\u02bf\6\276\1\u0368"+
- "\52\276\1\300\1\u02bf\7\276\1\u0369\51\276\1\300\1\u02bf"+
- "\10\276\1\u036a\50\276\1\300\1\u02bf\11\276\1\u036b\47\276"+
- "\1\300\1\u02bf\12\276\1\u036c\46\276\1\277\1\300\13\276"+
- "\1\u036d\45\276\1\300\1\u02bf\13\276\1\u036e\45\276\1\300"+
- "\1\u02bf\14\276\1\u036f\44\276\1\300\1\u02bf\15\276\1\u0370"+
- "\43\276\1\277\1\300\2\276\1\361\1\276\1\361\5\276"+
- "\1\362\1\276\1\361\4\276\27\361\2\276\1\u0371\1\361"+
+ "\1\u016c\57\276\1\277\1\300\2\276\1\u016d\56\276\1\277"+
+ "\1\300\3\276\1\u016e\55\276\1\277\1\300\4\276\1\u016f"+
+ "\54\276\1\277\1\300\5\276\1\u0170\53\276\1\277\1\300"+
+ "\6\276\1\u0171\52\276\1\277\1\300\7\276\1\u0172\51\276"+
+ "\1\277\1\300\10\276\1\u0173\50\276\1\277\1\300\11\276"+
+ "\1\u0174\47\276\1\277\1\300\12\276\1\u0175\46\276\1\277"+
+ "\1\300\13\276\1\u0176\45\276\1\277\1\300\14\276\1\u0177"+
+ "\44\276\1\277\1\300\15\276\1\u0178\43\276\1\277\1\300"+
+ "\1\276\1\u0179\57\276\1\277\1\300\2\276\1\u017a\55\276"+
+ "\1\u017b\1\341\1\342\3\u017b\1\u017c\13\u017b\1\340\40\u017b"+
+ "\4\263\1\u017d\1\u017e\1\u017f\1\u0180\1\u0181\1\u0182\1\u0183"+
+ "\1\u0184\1\u0185\1\u0186\1\u0187\1\u0188\1\u0189\42\263\1\344"+
+ "\1\341\1\342\1\344\1\u018a\1\u018b\1\u018c\1\u018d\1\u018e"+
+ "\1\u018f\1\u0190\1\u0191\1\u0192\1\u0193\1\u0194\1\u0195\1\u0196"+
+ "\42\344\1\u0197\1\277\1\300\3\u0197\1\u0198\13\u0197\1\276"+
+ "\40\u0197\1\344\1\341\1\342\3\344\1\u017c\54\344\1\u0199"+
+ "\1\277\1\300\4\u0199\1\276\12\u0199\1\345\30\u0199\1\u019a"+
+ "\7\u0199\1\276\1\u019b\1\u019c\4\276\1\u019d\54\276\1\277"+
+ "\1\300\5\276\1\u019e\11\276\1\u019f\41\276\1\277\1\300"+
+ "\6\276\1\u01a0\52\276\1\277\1\300\7\276\1\u01a1\51\276"+
+ "\1\277\1\300\10\276\1\u01a2\50\276\1\277\1\300\11\276"+
+ "\1\u01a3\47\276\1\277\1\300\12\276\1\u01a4\45\276\1\u01a5"+
+ "\1\277\1\300\13\u01a5\1\276\3\u01a5\1\355\40\u01a5\1\u01a6"+
+ "\1\277\1\300\13\u01a6\1\u01a7\3\u01a6\1\276\40\u01a6\1\276"+
+ "\1\277\1\300\14\276\1\u01a8\44\276\1\277\1\300\15\276"+
+ "\1\u01a9\43\276\1\u01aa\1\300\2\276\1\u01ab\1\276\1\u01ab"+
+ "\1\u01ac\4\276\1\362\1\276\1\361\2\276\2\u01ac\27\361"+
+ "\3\276\1\361\1\u01ac\1\361\2\u01ac\1\276\1\277\1\300"+
+ "\2\276\1\361\1\276\1\361\5\276\1\362\1\276\1\361"+
+ "\4\276\1\361\1\u01ad\25\361\3\276\1\361\1\276\1\361"+
+ "\2\276\1\u01ae\1\277\1\300\13\u01ae\1\276\3\u01ae\1\364"+
+ "\31\u01ae\1\276\6\u01ae\1\365\2\0\4\365\1\u01af\12\365"+
+ "\1\157\30\365\1\366\10\365\2\0\4\365\1\u01b0\12\365"+
+ "\1\157\30\365\1\366\7\365\1\367\2\0\4\367\1\u01b1"+
+ "\54\367\2\0\4\367\1\u01b1\1\370\4\367\1\370\6\367"+
+ "\27\370\1\367\1\370\1\367\3\370\2\367\5\0\1\164"+
+ "\1\0\1\165\1\33\4\0\1\33\6\0\2\42\1\u01b2"+
+ "\24\42\1\0\1\33\1\0\1\42\1\33\1\42\7\0"+
+ "\1\164\1\0\1\165\1\33\4\0\1\33\6\0\5\42"+
+ "\1\u01b3\21\42\1\0\1\33\1\0\1\42\1\33\1\42"+
+ "\7\0\1\164\1\0\1\165\1\33\4\0\1\33\6\0"+
+ "\11\42\1\u01b4\15\42\1\0\1\33\1\0\1\42\1\33"+
+ "\1\42\7\0\1\164\1\0\1\u01b5\1\33\4\0\1\33"+
+ "\6\0\27\42\1\0\1\33\1\0\1\42\1\33\1\42"+
+ "\7\0\1\164\1\0\1\165\1\33\4\0\1\33\6\0"+
+ "\4\42\1\u01b6\22\42\1\0\1\33\1\0\1\42\1\33"+
+ "\1\42\7\0\1\164\1\0\1\165\1\33\4\0\1\33"+
+ "\6\0\5\42\1\u01b7\21\42\1\0\1\33\1\0\1\42"+
+ "\1\33\1\42\7\0\1\164\1\0\1\165\1\33\4\0"+
+ "\1\33\6\0\11\42\1\u01b8\15\42\1\0\1\33\1\0"+
+ "\1\42\1\33\1\42\7\0\1\164\1\0\1\165\1\33"+
+ "\4\0\1\33\6\0\2\42\1\374\24\42\1\0\1\33"+
+ "\1\0\1\42\1\33\1\42\7\0\1\164\1\0\1\165"+
+ "\1\33\4\0\1\33\6\0\22\42\1\u01b9\4\42\1\0"+
+ "\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
+ "\1\165\1\33\4\0\1\33\6\0\11\42\1\u0100\15\42"+
+ "\1\0\1\33\1\0\1\42\1\33\1\42\7\0\1\164"+
+ "\1\0\1\165\1\33\4\0\1\33\6\0\5\42\1\u01ba"+
+ "\21\42\1\0\1\33\1\0\1\42\1\33\1\42\7\0"+
+ "\1\164\1\0\1\165\1\33\4\0\1\33\6\0\1\42"+
+ "\1\u01bb\25\42\1\0\1\33\1\0\1\42\1\33\1\42"+
+ "\7\0\1\164\1\0\1\165\1\33\4\0\1\33\6\0"+
+ "\1\u01bc\26\42\1\0\1\33\1\0\1\42\1\33\1\42"+
+ "\7\0\1\164\1\0\1\165\1\33\4\0\1\33\6\0"+
+ "\1\42\1\u01bd\25\42\1\0\1\33\1\0\1\42\1\33"+
+ "\1\42\7\0\1\164\1\0\1\165\1\33\4\0\1\33"+
+ "\6\0\2\42\1\u01be\24\42\1\0\1\33\1\0\1\42"+
+ "\1\33\1\42\7\0\1\164\1\0\1\165\1\33\4\0"+
+ "\1\33\6\0\15\42\1\u01bf\11\42\1\0\1\33\1\0"+
+ "\1\42\1\33\1\42\7\0\1\u01c0\1\0\1\165\1\33"+
+ "\4\0\1\33\6\0\27\42\1\0\1\33\1\0\1\42"+
+ "\1\33\1\42\7\0\1\164\1\0\1\165\1\33\4\0"+
+ "\1\33\6\0\20\42\1\u01c1\6\42\1\0\1\33\1\0"+
+ "\1\42\1\33\1\42\7\0\1\164\1\0\1\165\1\33"+
+ "\4\0\1\33\6\0\6\42\1\u01c2\20\42\1\0\1\33"+
+ "\1\0\1\42\1\33\1\42\7\0\1\164\1\0\1\165"+
+ "\1\33\4\0\1\33\6\0\11\42\1\u01c3\15\42\1\0"+
+ "\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
+ "\1\165\1\33\4\0\1\33\6\0\1\u01c4\26\42\1\0"+
+ "\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
+ "\1\165\1\33\4\0\1\33\6\0\22\42\1\u01c5\4\42"+
+ "\1\0\1\33\1\0\1\42\1\33\1\42\7\0\1\164"+
+ "\1\0\1\165\1\33\4\0\1\33\6\0\1\42\1\u01c6"+
+ "\25\42\1\0\1\33\1\0\1\42\1\33\1\42\7\0"+
+ "\1\164\1\0\1\165\1\33\4\0\1\33\6\0\12\42"+
+ "\1\375\14\42\1\0\1\33\1\0\1\42\1\33\1\42"+
+ "\7\0\1\164\1\0\1\165\1\33\4\0\1\33\6\0"+
+ "\10\42\1\u01c3\16\42\1\0\1\33\1\0\1\42\1\33"+
+ "\1\42\7\0\1\164\1\0\1\165\1\33\4\0\1\33"+
+ "\6\0\1\42\1\374\25\42\1\0\1\33\1\0\1\42"+
+ "\1\33\1\42\7\0\1\164\1\0\1\165\1\33\4\0"+
+ "\1\33\6\0\13\42\1\u01c7\13\42\1\0\1\33\1\0"+
+ "\1\42\1\33\1\42\7\0\1\164\1\0\1\165\1\33"+
+ "\4\0\1\33\6\0\1\374\26\42\1\0\1\33\1\0"+
+ "\1\42\1\33\1\42\7\0\1\164\1\0\1\165\1\33"+
+ "\4\0\1\33\6\0\20\42\1\u01c8\6\42\1\0\1\33"+
+ "\1\0\1\42\1\33\1\42\7\0\1\164\1\0\1\165"+
+ "\1\33\4\0\1\33\6\0\22\42\1\u01c9\4\42\1\0"+
+ "\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
+ "\1\165\1\33\4\0\1\33\6\0\3\42\1\u01ca\23\42"+
+ "\1\0\1\33\1\0\1\42\1\33\1\42\7\0\1\164"+
+ "\1\0\1\165\1\33\4\0\1\33\6\0\7\42\1\u01cb"+
+ "\17\42\1\0\1\33\1\0\1\42\1\33\1\42\7\0"+
+ "\1\164\1\0\1\165\1\33\4\0\1\33\6\0\1\42"+
+ "\1\u01cc\25\42\1\0\1\33\1\0\1\42\1\33\1\42"+
+ "\7\0\1\164\1\0\1\165\1\33\4\0\1\33\6\0"+
+ "\1\42\1\u01cd\25\42\1\0\1\33\1\0\1\42\1\33"+
+ "\1\42\7\0\1\164\1\0\1\165\1\33\4\0\1\33"+
+ "\6\0\2\42\1\u01ce\24\42\1\0\1\33\1\0\1\42"+
+ "\1\33\1\42\7\0\1\164\1\0\1\165\1\33\4\0"+
+ "\1\33\6\0\12\42\1\u01cf\14\42\1\0\1\33\1\0"+
+ "\1\42\1\33\1\42\7\0\1\164\1\0\1\165\1\33"+
+ "\4\0\1\33\6\0\1\42\1\u0109\25\42\1\0\1\33"+
+ "\1\0\1\42\1\33\1\42\24\0\1\u01d0\41\0\1\u0120"+
+ "\62\0\1\u01d1\3\0\1\u01d1\1\0\2\u01d1\11\0\2\u01d1"+
+ "\33\0\1\u01d1\1\0\2\u01d1\1\u0124\2\0\4\u0124\1\u01d2"+
+ "\12\u0124\1\254\30\u0124\1\u0125\10\u0124\2\0\4\u0124\1\u01d3"+
+ "\12\u0124\1\254\30\u0124\1\u0125\7\u0124\1\0\1\u01d4\1\u01d5"+
+ "\1\0\1\u0128\1\u0129\1\u012a\1\u012b\1\u012c\1\u012d\1\u012e"+
+ "\1\u012f\1\u0130\1\u0131\1\u0132\1\u0133\1\u0134\43\0\1\u0126"+
+ "\1\u01d5\1\0\1\u0128\1\u0129\1\u012a\1\u012b\1\u012c\1\u012d"+
+ "\1\u012e\1\u012f\1\u0130\1\u0131\1\u0132\1\u0133\1\u0134\46\0"+
+ "\1\u01d6\63\0\1\u01d7\63\0\1\u01d8\63\0\1\u01d9\63\0"+
+ "\1\u01da\63\0\1\u01db\63\0\1\u01dc\63\0\1\u01dd\63\0"+
+ "\1\u01de\63\0\1\u01df\63\0\1\u01e0\63\0\1\u01e1\63\0"+
+ "\1\u01e2\42\0\1\u0135\2\263\3\u0135\1\u01e3\13\u0135\1\262"+
+ "\40\u0135\15\0\1\u01e4\45\0\1\u01e5\2\0\3\u01e5\1\0"+
+ "\13\u01e5\1\u0137\40\u01e5\1\u0138\2\0\4\u0138\1\u01e6\12\u0138"+
+ "\1\265\30\u0138\1\u0139\10\u0138\2\0\4\u0138\1\u01e7\12\u0138"+
+ "\1\265\30\u0138\1\u0139\7\u0138\1\0\1\u01e8\1\u01e9\61\0"+
+ "\1\u01ea\1\u01e9\60\0\1\u013d\2\0\13\u013d\1\u01eb\3\u013d"+
+ "\1\270\40\u013d\1\u01ec\2\0\13\u01ec\1\0\3\u01ec\1\u013e"+
+ "\40\u01ec\5\0\1\272\1\0\1\272\5\0\1\273\1\0"+
+ "\1\272\4\0\15\272\1\u01ed\11\272\3\0\1\272\1\0"+
+ "\1\272\2\0\1\u0142\2\0\13\u0142\1\0\3\u0142\1\275"+
+ "\31\u0142\1\u01ee\6\u0142\4\0\1\u01ef\63\0\1\u01f0\63\0"+
+ "\1\u01f1\63\0\1\u01f2\63\0\1\u01f3\63\0\1\u01f4\63\0"+
+ "\1\u01f5\63\0\1\u01f6\63\0\1\u01f7\63\0\1\u01f8\63\0"+
+ "\1\u01f9\63\0\1\u01fa\63\0\1\u01fb\46\0\1\u01fc\63\0"+
+ "\1\u01fd\63\0\1\u01fe\63\0\1\u01ff\63\0\1\u0200\63\0"+
+ "\1\u0201\63\0\1\u0202\63\0\1\u0203\63\0\1\u0204\63\0"+
+ "\1\u0205\63\0\1\u0206\63\0\1\u0207\63\0\1\u0208\43\0"+
+ "\1\u0126\1\u0127\1\0\1\u0150\1\u0151\1\u0152\1\u0153\1\u0154"+
+ "\1\u0155\1\u0156\1\u0157\1\u0158\1\u0159\1\u015a\1\u015b\1\u015c"+
+ "\42\0\1\276\1\u0209\1\u020a\1\276\1\u015f\1\u0160\1\u0161"+
+ "\1\u0162\1\u0163\1\u0164\1\u0165\1\u0166\1\u0167\1\u0168\1\u0169"+
+ "\1\u016a\1\u016b\43\276\1\277\1\300\1\276\1\u020b\57\276"+
+ "\1\277\1\300\2\276\1\u020c\56\276\1\277\1\300\3\276"+
+ "\1\u020d\55\276\1\277\1\300\4\276\1\u020e\54\276\1\277"+
+ "\1\300\5\276\1\u020f\53\276\1\277\1\300\6\276\1\u0210"+
+ "\52\276\1\277\1\300\7\276\1\u0211\51\276\1\277\1\300"+
+ "\10\276\1\u0212\50\276\1\277\1\300\11\276\1\u0213\47\276"+
+ "\1\277\1\300\12\276\1\u0214\46\276\1\277\1\300\13\276"+
+ "\1\u0215\45\276\1\277\1\300\14\276\1\u0216\44\276\1\277"+
+ "\1\300\15\276\1\u0217\43\276\1\277\1\300\1\276\1\u0218"+
+ "\57\276\1\277\1\300\2\276\1\u0219\56\276\1\277\1\300"+
+ "\3\276\1\u021a\55\276\1\277\1\300\4\276\1\u021b\54\276"+
+ "\1\277\1\300\5\276\1\u021c\53\276\1\277\1\300\6\276"+
+ "\1\u021d\52\276\1\277\1\300\7\276\1\u021e\51\276\1\277"+
+ "\1\300\10\276\1\u021f\50\276\1\277\1\300\11\276\1\u0220"+
+ "\47\276\1\277\1\300\12\276\1\u0221\46\276\1\277\1\300"+
+ "\13\276\1\u0222\45\276\1\277\1\300\14\276\1\u0223\44\276"+
+ "\1\277\1\300\15\276\1\u0224\43\276\1\277\1\300\1\276"+
+ "\1\u0225\57\276\1\277\1\300\2\276\1\u0226\55\276\1\u017b"+
+ "\1\341\1\342\3\u017b\1\u0227\13\u017b\1\340\40\u017b\1\276"+
+ "\1\277\1\300\12\276\1\u0228\45\276\4\263\1\u0229\1\263"+
+ "\1\u0136\61\263\1\u022a\1\u0136\54\263\6\0\1\u0145\6\0"+
+ "\1\u01e4\45\0\6\263\1\u0136\1\u022b\61\263\1\u0136\1\263"+
+ "\1\u022c\60\263\1\u0136\2\263\1\u022d\57\263\1\u0136\3\263"+
+ "\1\u022e\56\263\1\u0136\4\263\1\u022f\55\263\1\u0136\5\263"+
+ "\1\u0230\54\263\1\u0136\6\263\1\u0231\53\263\1\u0136\7\263"+
+ "\1\u0232\52\263\1\u0136\10\263\1\u0233\51\263\1\u0136\11\263"+
+ "\1\u0234\42\263\1\344\1\341\1\342\1\344\1\u0235\1\344"+
+ "\1\u017c\55\344\1\341\1\342\2\344\1\u0236\1\u017c\54\344"+
+ "\1\276\1\277\1\300\3\276\1\u016e\6\276\1\u0228\45\276"+
+ "\1\344\1\341\1\342\3\344\1\u017c\1\u0237\54\344\1\341"+
+ "\1\342\3\344\1\u017c\1\344\1\u0238\53\344\1\341\1\342"+
+ "\3\344\1\u017c\2\344\1\u0239\52\344\1\341\1\342\3\344"+
+ "\1\u017c\3\344\1\u023a\51\344\1\341\1\342\3\344\1\u017c"+
+ "\4\344\1\u023b\50\344\1\341\1\342\3\344\1\u017c\5\344"+
+ "\1\u023c\47\344\1\341\1\342\3\344\1\u017c\6\344\1\u023d"+
+ "\46\344\1\341\1\342\3\344\1\u017c\7\344\1\u023e\45\344"+
+ "\1\341\1\342\3\344\1\u017c\10\344\1\u023f\44\344\1\341"+
+ "\1\342\3\344\1\u017c\11\344\1\u0240\42\344\1\u0241\1\277"+
+ "\1\300\3\u0241\1\276\13\u0241\1\u0197\40\u0241\1\276\1\277"+
+ "\1\300\3\276\1\u0242\54\276\1\u0199\1\277\1\300\4\u0199"+
+ "\1\u0243\12\u0199\1\345\30\u0199\1\u019a\10\u0199\1\277\1\300"+
+ "\4\u0199\1\u0244\12\u0199\1\345\30\u0199\1\u019a\7\u0199\1\0"+
+ "\1\u01e8\1\u01e9\1\0\1\301\1\302\1\303\1\304\1\305"+
+ "\1\306\1\307\1\310\1\311\1\312\1\313\1\314\1\315"+
+ "\42\0\1\276\1\u0245\1\u0246\1\276\1\320\1\321\1\322"+
+ "\1\323\1\324\1\325\1\326\1\327\1\330\1\331\1\332"+
+ "\1\333\1\334\43\276\1\277\1\300\4\276\1\u0247\54\276"+
+ "\1\277\1\300\5\276\1\u0248\53\276\1\277\1\300\17\276"+
+ "\1\u019f\41\276\1\277\1\300\6\276\1\u0249\52\276\1\277"+
+ "\1\300\7\276\1\u024a\51\276\1\277\1\300\10\276\1\u024b"+
+ "\50\276\1\277\1\300\11\276\1\u024c\47\276\1\277\1\300"+
+ "\12\276\1\u024d\45\276\1\u01a5\1\277\1\300\13\u01a5\1\u024e"+
+ "\3\u01a5\1\355\40\u01a5\1\u024f\1\277\1\300\13\u024f\1\276"+
+ "\3\u024f\1\u01a6\40\u024f\1\276\1\277\1\300\13\276\1\u0250"+
+ "\45\276\1\277\1\300\14\276\1\u0251\44\276\1\277\1\300"+
+ "\15\276\1\u0252\43\276\1\277\1\300\2\276\1\361\1\276"+
+ "\1\361\5\276\1\362\1\276\1\361\4\276\15\361\1\u0253"+
+ "\11\361\3\276\1\361\1\276\1\361\2\276\1\u01ae\1\277"+
+ "\1\300\13\u01ae\1\276\3\u01ae\1\364\31\u01ae\1\u0254\6\u01ae"+
+ "\1\0\1\u0255\4\0\1\u0255\13\0\1\u0255\40\0\1\365"+
+ "\1\u0255\1\0\3\365\1\u0256\1\0\12\365\1\u0257\30\365"+
+ "\1\366\7\365\5\0\1\164\1\0\1\165\1\33\4\0"+
+ "\1\33\6\0\3\42\1\u0104\23\42\1\0\1\33\1\0"+
+ "\1\42\1\33\1\42\7\0\1\164\1\0\1\165\1\33"+
+ "\4\0\1\33\6\0\3\42\1\u0258\23\42\1\0\1\33"+
+ "\1\0\1\42\1\33\1\42\7\0\1\164\1\0\1\165"+
+ "\1\33\4\0\1\33\6\0\2\42\1\u0259\24\42\1\0"+
+ "\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
+ "\1\u025a\14\0\27\164\3\0\1\164\1\0\1\164\7\0"+
+ "\1\164\1\0\1\165\1\33\4\0\1\33\6\0\6\42"+
+ "\1\374\20\42\1\0\1\33\1\0\1\42\1\33\1\42"+
+ "\7\0\1\164\1\0\1\165\1\33\4\0\1\33\6\0"+
+ "\12\42\1\374\14\42\1\0\1\33\1\0\1\42\1\33"+
+ "\1\42\7\0\1\164\1\0\1\165\1\33\4\0\1\33"+
+ "\6\0\12\42\1\u025b\14\42\1\0\1\33\1\0\1\42"+
+ "\1\33\1\42\7\0\1\164\1\0\1\165\1\33\4\0"+
+ "\1\33\6\0\7\42\1\u025c\17\42\1\0\1\33\1\0"+
+ "\1\42\1\33\1\42\7\0\1\164\1\0\1\165\1\33"+
+ "\4\0\1\33\6\0\12\42\1\u025d\14\42\1\0\1\33"+
+ "\1\0\1\42\1\33\1\42\7\0\1\164\1\0\1\165"+
+ "\1\33\4\0\1\33\6\0\4\42\1\u025e\22\42\1\0"+
+ "\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
+ "\1\165\1\33\4\0\1\33\6\0\1\42\1\u025f\25\42"+
+ "\1\0\1\33\1\0\1\42\1\33\1\42\7\0\1\164"+
+ "\1\0\1\165\1\33\4\0\1\33\6\0\1\u0260\1\42"+
+ "\1\u0261\24\42\1\0\1\33\1\0\1\42\1\33\1\42"+
+ "\7\0\1\u0262\1\0\1\165\1\33\4\0\1\33\6\0"+
+ "\27\42\1\0\1\33\1\0\1\42\1\33\1\42\7\0"+
+ "\1\164\1\0\1\165\1\33\4\0\1\33\6\0\5\42"+
+ "\1\u0263\21\42\1\0\1\33\1\0\1\42\1\33\1\42"+
+ "\7\0\1\164\1\0\1\165\14\0\1\164\1\u0264\25\164"+
+ "\3\0\1\164\1\0\1\164\7\0\1\164\1\0\1\165"+
+ "\1\33\4\0\1\33\6\0\20\42\1\374\6\42\1\0"+
+ "\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
+ "\1\165\1\33\4\0\1\33\6\0\5\42\1\u025c\21\42"+
+ "\1\0\1\33\1\0\1\42\1\33\1\42\7\0\1\164"+
+ "\1\0\1\165\1\33\4\0\1\33\6\0\2\42\1\u01b7"+
+ "\24\42\1\0\1\33\1\0\1\42\1\33\1\42\7\0"+
+ "\1\164\1\0\1\165\1\33\4\0\1\33\6\0\7\42"+
+ "\1\u0265\17\42\1\0\1\33\1\0\1\42\1\33\1\42"+
+ "\7\0\1\164\1\0\1\165\1\33\4\0\1\33\6\0"+
+ "\1\u0266\26\42\1\0\1\33\1\0\1\42\1\33\1\42"+
+ "\7\0\1\164\1\0\1\165\1\33\4\0\1\33\6\0"+
+ "\12\42\1\u0267\14\42\1\0\1\33\1\0\1\42\1\33"+
+ "\1\42\7\0\1\164\1\0\1\165\1\33\4\0\1\33"+
+ "\6\0\22\42\1\u0268\4\42\1\0\1\33\1\0\1\42"+
+ "\1\33\1\42\7\0\1\164\1\0\1\165\1\33\4\0"+
+ "\1\33\6\0\2\42\1\u0269\24\42\1\0\1\33\1\0"+
+ "\1\42\1\33\1\42\7\0\1\u026a\1\0\1\165\1\33"+
+ "\4\0\1\33\6\0\27\42\1\0\1\33\1\0\1\42"+
+ "\1\33\1\42\7\0\1\164\1\0\1\165\1\33\4\0"+
+ "\1\33\6\0\4\42\1\u026b\22\42\1\0\1\33\1\0"+
+ "\1\42\1\33\1\42\7\0\1\164\1\0\1\165\1\33"+
+ "\4\0\1\33\6\0\12\42\1\u0100\14\42\1\0\1\33"+
+ "\1\0\1\42\1\33\1\42\7\0\1\164\1\0\1\165"+
+ "\1\33\4\0\1\33\6\0\2\42\1\u01b7\1\u026c\23\42"+
+ "\1\0\1\33\1\0\1\42\1\33\1\42\7\0\1\164"+
+ "\1\0\1\165\1\33\4\0\1\33\6\0\3\42\1\u026d"+
+ "\1\u026e\22\42\1\0\1\33\1\0\1\42\1\33\1\42"+
+ "\7\0\1\164\1\0\1\165\1\33\4\0\1\33\6\0"+
+ "\21\42\1\u026f\5\42\1\0\1\33\1\0\1\42\1\33"+
+ "\1\42\7\0\1\164\1\0\1\165\1\33\4\0\1\33"+
+ "\6\0\6\42\1\u0270\20\42\1\0\1\33\1\0\1\42"+
+ "\1\33\1\42\3\0\1\u0271\4\0\1\u0271\13\0\1\u0271"+
+ "\40\0\1\u0124\1\u0271\1\0\3\u0124\1\u0272\1\0\12\u0124"+
+ "\1\u0273\30\u0124\1\u0125\7\u0124\1\0\1\u0274\1\u0275\1\0"+
+ "\1\u0128\1\u0129\1\u012a\1\u012b\1\u012c\1\u012d\1\u012e\1\u012f"+
+ "\1\u0130\1\u0131\1\u0132\1\u0133\1\u0134\43\0\1\u01d4\1\u0275"+
+ "\1\0\1\u0128\1\u0129\1\u012a\1\u012b\1\u012c\1\u012d\1\u012e"+
+ "\1\u012f\1\u0130\1\u0131\1\u0132\1\u0133\1\u0134\46\0\1\u0276"+
+ "\63\0\1\u0277\63\0\1\u0278\63\0\1\u0279\63\0\1\u027a"+
+ "\63\0\1\u027b\63\0\1\u027c\63\0\1\u027d\63\0\1\u027e"+
+ "\63\0\1\u027f\63\0\1\u0280\63\0\1\u0281\63\0\1\u0282"+
+ "\43\0\1\u013f\3\0\1\u013f\1\0\2\u013f\4\0\1\u0283"+
+ "\4\0\2\u013f\33\0\1\u013f\1\0\2\u013f\1\u01e5\2\0"+
+ "\3\u01e5\1\u0284\13\u01e5\1\u0137\40\u01e5\6\0\1\u0271\54\0"+
+ "\1\u0138\2\0\3\u0138\1\u0285\1\0\12\u0138\1\265\30\u0138"+
+ "\1\u0139\7\u0138\1\0\1\u01e8\61\0\1\u01ec\2\0\13\u01ec"+
+ "\1\u0286\3\u01ec\1\u013e\40\u01ec\5\0\1\272\1\0\1\u0287"+
+ "\5\0\1\273\1\0\1\272\4\0\20\272\1\u0288\6\272"+
+ "\3\0\1\272\1\0\1\272\6\0\1\u0289\63\0\1\u028a"+
+ "\63\0\1\u028b\63\0\1\u028c\63\0\1\u028d\63\0\1\u028e"+
+ "\63\0\1\u028f\63\0\1\u0290\63\0\1\u0291\63\0\1\u0292"+
+ "\63\0\1\u0293\63\0\1\u0294\63\0\1\u0295\46\0\1\u0296"+
+ "\63\0\1\u0297\63\0\1\u0298\63\0\1\u0299\63\0\1\u029a"+
+ "\63\0\1\u029b\63\0\1\u029c\63\0\1\u029d\63\0\1\u029e"+
+ "\63\0\1\u029f\63\0\1\u02a0\63\0\1\u02a1\63\0\1\u02a2"+
+ "\43\0\1\u01d4\1\u01d5\1\0\1\u0150\1\u0151\1\u0152\1\u0153"+
+ "\1\u0154\1\u0155\1\u0156\1\u0157\1\u0158\1\u0159\1\u015a\1\u015b"+
+ "\1\u015c\42\0\1\276\1\u02a3\1\u02a4\1\276\1\u015f\1\u0160"+
+ "\1\u0161\1\u0162\1\u0163\1\u0164\1\u0165\1\u0166\1\u0167\1\u0168"+
+ "\1\u0169\1\u016a\1\u016b\43\276\1\277\1\300\1\276\1\u02a5"+
+ "\57\276\1\277\1\300\2\276\1\u02a6\56\276\1\277\1\300"+
+ "\3\276\1\u02a7\55\276\1\277\1\300\4\276\1\u02a8\54\276"+
+ "\1\277\1\300\5\276\1\u02a9\53\276\1\277\1\300\6\276"+
+ "\1\u02aa\52\276\1\277\1\300\7\276\1\u02ab\51\276\1\277"+
+ "\1\300\10\276\1\u02ac\50\276\1\277\1\300\11\276\1\u02ad"+
+ "\47\276\1\277\1\300\12\276\1\u02ae\46\276\1\277\1\300"+
+ "\13\276\1\u02af\45\276\1\277\1\300\14\276\1\u02b0\44\276"+
+ "\1\277\1\300\15\276\1\u02b1\43\276\1\277\1\300\1\276"+
+ "\1\u02b2\57\276\1\277\1\300\2\276\1\u02b3\56\276\1\277"+
+ "\1\300\3\276\1\u02b4\55\276\1\277\1\300\4\276\1\u02b5"+
+ "\54\276\1\277\1\300\5\276\1\u02b6\53\276\1\277\1\300"+
+ "\6\276\1\u02b7\52\276\1\277\1\300\7\276\1\u02b8\51\276"+
+ "\1\277\1\300\10\276\1\u02b9\50\276\1\277\1\300\11\276"+
+ "\1\u02ba\47\276\1\277\1\300\12\276\1\u02bb\46\276\1\277"+
+ "\1\300\13\276\1\u02bc\45\276\1\277\1\300\14\276\1\u02bd"+
+ "\44\276\1\277\1\300\15\276\1\u02be\43\276\1\300\1\u02bf"+
+ "\1\276\1\u02c0\15\276\1\u02c1\41\276\1\300\1\u02bf\2\276"+
+ "\1\u02c2\14\276\1\u02c1\41\276\1\u01aa\1\300\2\276\1\u01ac"+
+ "\1\276\2\u01ac\4\276\1\u02c3\4\276\2\u01ac\33\276\1\u01ac"+
+ "\1\276\2\u01ac\4\263\1\u02c4\1\263\1\u0136\61\263\1\u02c5"+
+ "\1\u0136\62\263\1\u0136\1\u02c6\61\263\1\u0136\1\263\1\u02c7"+
+ "\60\263\1\u0136\2\263\1\u02c8\57\263\1\u0136\3\263\1\u02c9"+
+ "\56\263\1\u0136\4\263\1\u02ca\55\263\1\u0136\5\263\1\u02cb"+
+ "\54\263\1\u0136\6\263\1\u02cc\53\263\1\u0136\7\263\1\u02cd"+
+ "\52\263\1\u0136\10\263\1\u02ce\51\263\1\u0136\11\263\1\u02cf"+
+ "\42\263\1\344\1\341\1\342\1\344\1\u02d0\1\344\1\u017c"+
+ "\55\344\1\341\1\342\2\344\1\u02d1\1\u017c\55\344\1\341"+
+ "\1\342\3\344\1\u017c\1\u02d2\54\344\1\341\1\342\3\344"+
+ "\1\u017c\1\344\1\u02d3\53\344\1\341\1\342\3\344\1\u017c"+
+ "\2\344\1\u02d4\52\344\1\341\1\342\3\344\1\u017c\3\344"+
+ "\1\u02d5\51\344\1\341\1\342\3\344\1\u017c\4\344\1\u02d6"+
+ "\50\344\1\341\1\342\3\344\1\u017c\5\344\1\u02d7\47\344"+
+ "\1\341\1\342\3\344\1\u017c\6\344\1\u02d8\46\344\1\341"+
+ "\1\342\3\344\1\u017c\7\344\1\u02d9\45\344\1\341\1\342"+
+ "\3\344\1\u017c\10\344\1\u02da\44\344\1\341\1\342\3\344"+
+ "\1\u017c\11\344\1\u02db\42\344\1\u0241\1\277\1\300\3\u0241"+
+ "\1\u02dc\13\u0241\1\u0197\40\u0241\1\276\1\300\1\u02bf\3\276"+
+ "\1\u02dd\13\276\1\u02c1\41\276\1\277\1\300\3\276\1\u02de"+
+ "\54\276\1\u0199\1\277\1\300\3\u0199\1\u02df\1\276\12\u0199"+
+ "\1\345\30\u0199\1\u019a\7\u0199\1\276\1\u02e0\1\300\1\276"+
+ "\1\320\1\321\1\322\1\323\1\324\1\325\1\326\1\327"+
+ "\1\330\1\331\1\332\1\333\1\334\43\276\1\300\1\u02bf"+
+ "\4\276\1\u02e1\12\276\1\u02c1\41\276\1\300\1\u02bf\5\276"+
+ "\1\u02e2\11\276\1\u02c1\41\276\1\300\1\u02bf\6\276\1\u02e3"+
+ "\10\276\1\u02c1\41\276\1\300\1\u02bf\7\276\1\u02e4\7\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\10\276\1\u02e5\6\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\11\276\1\u02e6\5\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\12\276\1\u02e7\4\276\1\u02c1\40\276\1\u024f"+
+ "\1\277\1\300\13\u024f\1\u02e8\3\u024f\1\u01a6\40\u024f\1\276"+
+ "\1\300\1\u02bf\13\276\1\u02e9\3\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\14\276\1\u02ea\2\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\15\276\1\u02eb\1\276\1\u02c1\41\276\1\277\1\300\2\276"+
+ "\1\361\1\276\1\u02ec\5\276\1\362\1\276\1\361\4\276"+
+ "\20\361\1\u02ed\6\361\3\276\1\361\1\276\1\361\2\276"+
+ "\5\0\1\164\1\0\1\165\1\33\4\0\1\33\6\0"+
+ "\4\42\1\u0104\22\42\1\0\1\33\1\0\1\42\1\33"+
+ "\1\42\7\0\1\164\1\0\1\165\1\33\4\0\1\33"+
+ "\6\0\1\42\1\u02ee\25\42\1\0\1\33\1\0\1\42"+
+ "\1\33\1\42\7\0\1\164\1\0\1\165\1\33\4\0"+
+ "\1\33\6\0\1\u02ef\26\42\1\0\1\33\1\0\1\42"+
+ "\1\33\1\42\7\0\1\164\1\0\1\165\1\33\4\0"+
+ "\1\33\6\0\10\42\1\u0100\16\42\1\0\1\33\1\0"+
+ "\1\42\1\33\1\42\7\0\1\164\1\0\1\165\1\33"+
+ "\4\0\1\33\6\0\1\42\1\u02f0\25\42\1\0\1\33"+
+ "\1\0\1\42\1\33\1\42\7\0\1\164\1\0\1\165"+
+ "\1\33\4\0\1\33\6\0\5\42\1\u02f1\21\42\1\0"+
+ "\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
+ "\1\165\1\33\4\0\1\33\6\0\4\42\1\u02f2\22\42"+
+ "\1\0\1\33\1\0\1\42\1\33\1\42\7\0\1\164"+
+ "\1\0\1\165\1\33\4\0\1\33\6\0\4\42\1\u02f3"+
+ "\22\42\1\0\1\33\1\0\1\42\1\33\1\42\7\0"+
+ "\1\164\1\0\1\165\1\33\4\0\1\33\6\0\3\42"+
+ "\1\u02f4\23\42\1\0\1\33\1\0\1\42\1\33\1\42"+
+ "\7\0\1\164\1\0\1\165\14\0\21\164\1\u02f5\5\164"+
+ "\3\0\1\164\1\0\1\164\7\0\1\164\1\0\1\165"+
+ "\1\33\4\0\1\33\6\0\7\42\1\u02f6\17\42\1\0"+
+ "\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
+ "\1\165\14\0\1\u02f7\26\164\3\0\1\164\1\0\1\164"+
+ "\7\0\1\164\1\0\1\165\1\33\4\0\1\33\6\0"+
+ "\22\42\1\u02f8\4\42\1\0\1\33\1\0\1\42\1\33"+
+ "\1\42\7\0\1\164\1\0\1\165\1\33\4\0\1\33"+
+ "\6\0\6\42\1\u0100\20\42\1\0\1\33\1\0\1\42"+
+ "\1\33\1\42\7\0\1\164\1\0\1\165\1\33\4\0"+
+ "\1\33\6\0\7\42\1\u02f9\17\42\1\0\1\33\1\0"+
+ "\1\42\1\33\1\42\7\0\1\164\1\0\1\165\1\33"+
+ "\4\0\1\33\6\0\4\42\1\u02fa\22\42\1\0\1\33"+
+ "\1\0\1\42\1\33\1\42\7\0\1\164\1\0\1\165"+
+ "\1\33\4\0\1\33\6\0\10\42\1\u02fb\16\42\1\0"+
+ "\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
+ "\1\165\14\0\23\164\1\u02fc\3\164\3\0\1\164\1\0"+
+ "\1\164\7\0\1\164\1\0\1\165\1\33\4\0\1\33"+
+ "\6\0\3\42\1\u02fd\23\42\1\0\1\33\1\0\1\42"+
+ "\1\33\1\42\7\0\1\164\1\0\1\165\1\33\4\0"+
+ "\1\33\6\0\5\42\1\u02fe\21\42\1\0\1\33\1\0"+
+ "\1\42\1\33\1\42\7\0\1\164\1\0\1\165\1\33"+
+ "\4\0\1\33\6\0\7\42\1\u02ff\17\42\1\0\1\33"+
+ "\1\0\1\42\1\33\1\42\7\0\1\164\1\0\1\165"+
+ "\1\33\4\0\1\33\6\0\5\42\1\u0300\21\42\1\0"+
+ "\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
+ "\1\165\1\33\4\0\1\33\6\0\1\u01b7\26\42\1\0"+
+ "\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
+ "\1\165\1\33\4\0\1\33\6\0\2\42\1\u0301\24\42"+
+ "\1\0\1\33\1\0\1\42\1\33\1\42\6\0\1\u0128"+
+ "\1\u0129\1\u012a\1\u012b\1\u012c\1\u012d\1\u012e\1\u012f\1\u0130"+
+ "\1\u0131\1\u0132\1\u0133\1\u0134\43\0\1\u0274\2\0\1\u0128"+
+ "\1\u0129\1\u012a\1\u012b\1\u012c\1\u012d\1\u012e\1\u012f\1\u0130"+
+ "\1\u0131\1\u0132\1\u0133\1\u0134\46\0\1\u0302\63\0\1\u0303"+
+ "\63\0\1\u0304\63\0\1\u0305\63\0\1\u0306\63\0\1\u0307"+
+ "\63\0\1\u0308\63\0\1\u0309\63\0\1\u030a\63\0\1\u030b"+
+ "\63\0\1\u030c\63\0\1\u030d\63\0\1\u030e\43\0\1\u013f"+
+ "\3\0\1\u013f\1\0\2\u013f\11\0\2\u013f\33\0\1\u013f"+
+ "\1\0\2\u013f\6\0\1\u030f\72\0\1\u0310\51\0\1\272"+
+ "\1\0\1\272\5\0\1\273\1\0\1\272\4\0\27\272"+
+ "\2\0\1\u0311\1\272\1\0\1\272\7\0\1\272\1\0"+
+ "\1\u0287\5\0\1\273\1\0\1\272\4\0\27\272\3\0"+
+ "\1\272\1\0\1\272\3\0\1\u0312\1\u0313\1\0\1\u0314"+
+ "\15\0\1\u0315\41\0\1\u0312\1\u0313\2\0\1\u0316\14\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\3\0\1\u0317\13\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\4\0\1\u0318\12\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\5\0\1\u0319\11\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\6\0\1\u031a\10\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\7\0\1\u031b\7\0\1\u0315\41\0\1\u0312\1\u0313\10\0"+
+ "\1\u031c\6\0\1\u0315\41\0\1\u0312\1\u0313\11\0\1\u031d"+
+ "\5\0\1\u0315\41\0\1\u0312\1\u0313\12\0\1\u031e\4\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\13\0\1\u031f\3\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\14\0\1\u0320\2\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\15\0\1\u0321\1\0\1\u0315\44\0\1\u0322"+
+ "\63\0\1\u0323\63\0\1\u0324\63\0\1\u0325\63\0\1\u0326"+
+ "\63\0\1\u0327\63\0\1\u0328\63\0\1\u0329\63\0\1\u032a"+
+ "\63\0\1\u032b\63\0\1\u032c\63\0\1\u032d\63\0\1\u032e"+
+ "\43\0\1\u0274\1\u0275\1\0\1\u0150\1\u0151\1\u0152\1\u0153"+
+ "\1\u0154\1\u0155\1\u0156\1\u0157\1\u0158\1\u0159\1\u015a\1\u015b"+
+ "\1\u015c\42\0\1\276\1\u032f\1\300\1\276\1\u015f\1\u0160"+
+ "\1\u0161\1\u0162\1\u0163\1\u0164\1\u0165\1\u0166\1\u0167\1\u0168"+
+ "\1\u0169\1\u016a\1\u016b\43\276\1\277\1\300\1\276\1\u0330"+
+ "\57\276\1\277\1\300\2\276\1\u0331\56\276\1\277\1\300"+
+ "\3\276\1\u0332\55\276\1\277\1\300\4\276\1\u0333\54\276"+
+ "\1\277\1\300\5\276\1\u0334\53\276\1\277\1\300\6\276"+
+ "\1\u0335\52\276\1\277\1\300\7\276\1\u0336\51\276\1\277"+
+ "\1\300\10\276\1\u0337\50\276\1\277\1\300\11\276\1\u0338"+
+ "\47\276\1\277\1\300\12\276\1\u0339\46\276\1\277\1\300"+
+ "\13\276\1\u033a\45\276\1\277\1\300\14\276\1\u033b\44\276"+
+ "\1\277\1\300\15\276\1\u033c\43\276\1\u033d\1\u033e\1\276"+
+ "\1\u033f\15\276\1\u0340\41\276\1\u033d\1\u033e\2\276\1\u0341"+
+ "\14\276\1\u0340\41\276\1\u033d\1\u033e\3\276\1\u0342\13\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\4\276\1\u0343\12\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\5\276\1\u0344\11\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\6\276\1\u0345\10\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\7\276\1\u0346\7\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\10\276\1\u0347\6\276\1\u0340\41\276\1\u033d\1\u033e\11\276"+
+ "\1\u0348\5\276\1\u0340\41\276\1\u033d\1\u033e\12\276\1\u0349"+
+ "\4\276\1\u0340\41\276\1\u033d\1\u033e\13\276\1\u034a\3\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\14\276\1\u034b\2\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\15\276\1\u034c\1\276\1\u0340\41\276"+
+ "\2\300\1\276\1\320\1\321\1\322\1\323\1\324\1\325"+
+ "\1\326\1\327\1\330\1\331\1\332\1\333\1\334\43\276"+
+ "\1\300\1\u02bf\1\276\1\u034d\15\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\17\276\1\u02c1\41\276\1\300\1\u02bf\2\276\1\u034e"+
+ "\14\276\1\u02c1\41\276\1\u01aa\1\300\2\276\1\u01ac\1\276"+
+ "\2\u01ac\11\276\2\u01ac\33\276\1\u01ac\1\276\2\u01ac\4\263"+
+ "\1\u034f\1\263\1\u0136\61\263\1\u0350\1\u0136\62\263\1\u0136"+
+ "\1\u0351\61\263\1\u0136\1\263\1\u0352\60\263\1\u0136\2\263"+
+ "\1\u0353\57\263\1\u0136\3\263\1\u0354\56\263\1\u0136\4\263"+
+ "\1\u0355\55\263\1\u0136\5\263\1\u0356\54\263\1\u0136\6\263"+
+ "\1\u0357\53\263\1\u0136\7\263\1\u0358\52\263\1\u0136\10\263"+
+ "\1\u0359\51\263\1\u0136\11\263\1\u035a\42\263\1\344\1\341"+
+ "\1\342\1\344\1\u035b\1\344\1\u017c\55\344\1\341\1\342"+
+ "\2\344\1\u035c\1\u017c\55\344\1\341\1\342\3\344\1\u017c"+
+ "\1\u035d\54\344\1\341\1\342\3\344\1\u017c\1\344\1\u035e"+
+ "\53\344\1\341\1\342\3\344\1\u017c\2\344\1\u035f\52\344"+
+ "\1\341\1\342\3\344\1\u017c\3\344\1\u0360\51\344\1\341"+
+ "\1\342\3\344\1\u017c\4\344\1\u0361\50\344\1\341\1\342"+
+ "\3\344\1\u017c\5\344\1\u0362\47\344\1\341\1\342\3\344"+
+ "\1\u017c\6\344\1\u0363\46\344\1\341\1\342\3\344\1\u017c"+
+ "\7\344\1\u0364\45\344\1\341\1\342\3\344\1\u017c\10\344"+
+ "\1\u0365\44\344\1\341\1\342\3\344\1\u017c\11\344\1\u0366"+
+ "\42\344\1\276\1\277\1\300\3\276\1\u0367\55\276\1\300"+
+ "\1\u02bf\3\276\1\u0368\13\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\4\276\1\u0369\12\276\1\u02c1\41\276\1\300\1\u02bf\5\276"+
+ "\1\u036a\11\276\1\u02c1\41\276\1\300\1\u02bf\6\276\1\u036b"+
+ "\10\276\1\u02c1\41\276\1\300\1\u02bf\7\276\1\u036c\7\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\10\276\1\u036d\6\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\11\276\1\u036e\5\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\12\276\1\u036f\4\276\1\u02c1\41\276\1\277"+
+ "\1\300\13\276\1\u0370\45\276\1\300\1\u02bf\13\276\1\u0371"+
+ "\3\276\1\u02c1\41\276\1\300\1\u02bf\14\276\1\u0372\2\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\15\276\1\u0373\1\276\1\u02c1"+
+ "\41\276\1\277\1\300\2\276\1\361\1\276\1\361\5\276"+
+ "\1\362\1\276\1\361\4\276\27\361\2\276\1\u0374\1\361"+
"\1\276\1\361\3\276\1\277\1\300\2\276\1\361\1\276"+
- "\1\u02eb\5\276\1\362\1\276\1\361\4\276\27\361\3\276"+
- "\1\361\1\276\1\361\2\276\5\0\1\u0372\1\0\1\165"+
+ "\1\u02ec\5\276\1\362\1\276\1\361\4\276\27\361\3\276"+
+ "\1\361\1\276\1\361\2\276\5\0\1\u0375\1\0\1\165"+
"\1\33\4\0\1\33\6\0\27\42\1\0\1\33\1\0"+
"\1\42\1\33\1\42\7\0\1\164\1\0\1\165\1\33"+
- "\4\0\1\33\6\0\15\42\1\u0373\11\42\1\0\1\33"+
+ "\4\0\1\33\6\0\15\42\1\u0376\11\42\1\0\1\33"+
"\1\0\1\42\1\33\1\42\7\0\1\164\1\0\1\165"+
- "\1\33\4\0\1\33\6\0\1\u0374\26\42\1\0\1\33"+
+ "\1\33\4\0\1\33\6\0\1\u0377\26\42\1\0\1\33"+
"\1\0\1\42\1\33\1\42\7\0\1\164\1\0\1\165"+
"\1\33\4\0\1\33\6\0\3\42\1\374\23\42\1\0"+
"\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
- "\1\165\1\33\4\0\1\33\6\0\5\42\1\u0375\21\42"+
+ "\1\165\1\33\4\0\1\33\6\0\5\42\1\u0378\21\42"+
"\1\0\1\33\1\0\1\42\1\33\1\42\7\0\1\164"+
"\1\0\1\165\1\33\4\0\1\33\6\0\3\42\1\u01c3"+
"\23\42\1\0\1\33\1\0\1\42\1\33\1\42\7\0"+
"\1\164\1\0\1\165\1\33\4\0\1\33\6\0\1\42"+
"\1\u01c1\25\42\1\0\1\33\1\0\1\42\1\33\1\42"+
- "\7\0\1\164\1\0\1\165\14\0\22\164\1\u0376\4\164"+
+ "\7\0\1\164\1\0\1\165\14\0\22\164\1\u0379\4\164"+
"\3\0\1\164\1\0\1\164\7\0\1\164\1\0\1\165"+
- "\1\33\4\0\1\33\6\0\3\42\1\u0377\23\42\1\0"+
+ "\1\33\4\0\1\33\6\0\3\42\1\u037a\23\42\1\0"+
"\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
- "\1\165\14\0\21\164\1\u0378\5\164\3\0\1\164\1\0"+
+ "\1\165\14\0\21\164\1\u037b\5\164\3\0\1\164\1\0"+
"\1\164\7\0\1\164\1\0\1\165\1\33\4\0\1\33"+
- "\6\0\1\42\1\u0379\25\42\1\0\1\33\1\0\1\42"+
+ "\6\0\1\42\1\u037c\25\42\1\0\1\33\1\0\1\42"+
"\1\33\1\42\7\0\1\164\1\0\1\165\1\33\4\0"+
- "\1\33\6\0\6\42\1\u037a\20\42\1\0\1\33\1\0"+
+ "\1\33\6\0\6\42\1\u037d\20\42\1\0\1\33\1\0"+
"\1\42\1\33\1\42\7\0\1\164\1\0\1\165\1\33"+
- "\4\0\1\33\6\0\11\42\1\u037b\15\42\1\0\1\33"+
- "\1\0\1\42\1\33\1\42\7\0\1\u037c\1\0\1\165"+
+ "\4\0\1\33\6\0\11\42\1\u037e\15\42\1\0\1\33"+
+ "\1\0\1\42\1\33\1\42\7\0\1\u037f\1\0\1\165"+
"\1\33\4\0\1\33\6\0\27\42\1\0\1\33\1\0"+
"\1\42\1\33\1\42\7\0\1\164\1\0\1\165\14\0"+
- "\7\164\1\u037d\17\164\3\0\1\164\1\0\1\164\7\0"+
+ "\7\164\1\u0380\17\164\3\0\1\164\1\0\1\164\7\0"+
"\1\164\1\0\1\165\1\33\4\0\1\33\6\0\11\42"+
"\1\374\15\42\1\0\1\33\1\0\1\42\1\33\1\42"+
"\7\0\1\164\1\0\1\165\1\33\4\0\1\33\6\0"+
- "\1\42\1\u037e\25\42\1\0\1\33\1\0\1\42\1\33"+
+ "\1\42\1\u0381\25\42\1\0\1\33\1\0\1\42\1\33"+
"\1\42\7\0\1\164\1\0\1\165\1\33\4\0\1\33"+
"\6\0\14\42\1\374\12\42\1\0\1\33\1\0\1\42"+
"\1\33\1\42\7\0\1\164\1\0\1\165\1\33\4\0"+
- "\1\33\6\0\3\42\1\u037f\23\42\1\0\1\33\1\0"+
+ "\1\33\6\0\3\42\1\u0382\23\42\1\0\1\33\1\0"+
"\1\42\1\33\1\42\7\0\1\164\1\0\1\165\1\33"+
- "\4\0\1\33\6\0\6\42\1\u0380\20\42\1\0\1\33"+
- "\1\0\1\42\1\33\1\42\3\0\2\u0381\1\0\1\u0382"+
- "\57\0\2\u0381\2\0\1\u0383\56\0\2\u0381\3\0\1\u0384"+
- "\55\0\2\u0381\4\0\1\u0385\54\0\2\u0381\5\0\1\u0386"+
- "\53\0\2\u0381\6\0\1\u0387\52\0\2\u0381\7\0\1\u0388"+
- "\51\0\2\u0381\10\0\1\u0389\50\0\2\u0381\11\0\1\u038a"+
- "\47\0\2\u0381\12\0\1\u038b\46\0\2\u0381\13\0\1\u038c"+
- "\45\0\2\u0381\14\0\1\u038d\44\0\2\u0381\15\0\1\u038e"+
- "\117\0\1\u038f\6\0\1\u0311\62\0\1\u0311\1\u0312\1\0"+
- "\1\u0390\57\0\1\u0311\1\u0312\2\0\1\u0391\56\0\1\u0311"+
- "\1\u0312\3\0\1\u0392\55\0\1\u0311\1\u0312\4\0\1\u0393"+
- "\54\0\1\u0311\1\u0312\5\0\1\u0394\53\0\1\u0311\1\u0312"+
- "\6\0\1\u0395\52\0\1\u0311\1\u0312\7\0\1\u0396\51\0"+
- "\1\u0311\1\u0312\10\0\1\u0397\50\0\1\u0311\1\u0312\11\0"+
- "\1\u0398\47\0\1\u0311\1\u0312\12\0\1\u0399\46\0\1\u0311"+
- "\1\u0312\13\0\1\u039a\45\0\1\u0311\1\u0312\14\0\1\u039b"+
- "\44\0\1\u0311\1\u0312\15\0\1\u039c\43\0\2\u039d\1\0"+
- "\1\u039e\57\0\2\u039d\2\0\1\u039f\56\0\2\u039d\3\0"+
- "\1\u03a0\55\0\2\u039d\4\0\1\u03a1\54\0\2\u039d\5\0"+
- "\1\u03a2\53\0\2\u039d\6\0\1\u03a3\52\0\2\u039d\7\0"+
- "\1\u03a4\51\0\2\u039d\10\0\1\u03a5\50\0\2\u039d\11\0"+
- "\1\u03a6\47\0\2\u039d\12\0\1\u03a7\46\0\2\u039d\13\0"+
- "\1\u03a8\45\0\2\u039d\14\0\1\u03a9\44\0\2\u039d\15\0"+
- "\1\u03aa\46\0\1\u0150\1\u0151\1\u0152\1\u0153\1\u0154\1\u0155"+
- "\1\u0156\1\u0157\1\u0158\1\u0159\1\u015a\1\u015b\1\u015c\42\0"+
- "\1\276\1\u03ab\1\u03ac\1\276\1\u03ad\57\276\1\u03ab\1\u03ac"+
- "\2\276\1\u03ae\56\276\1\u03ab\1\u03ac\3\276\1\u03af\55\276"+
- "\1\u03ab\1\u03ac\4\276\1\u03b0\54\276\1\u03ab\1\u03ac\5\276"+
- "\1\u03b1\53\276\1\u03ab\1\u03ac\6\276\1\u03b2\52\276\1\u03ab"+
- "\1\u03ac\7\276\1\u03b3\51\276\1\u03ab\1\u03ac\10\276\1\u03b4"+
- "\50\276\1\u03ab\1\u03ac\11\276\1\u03b5\47\276\1\u03ab\1\u03ac"+
- "\12\276\1\u03b6\46\276\1\u03ab\1\u03ac\13\276\1\u03b7\45\276"+
- "\1\u03ab\1\u03ac\14\276\1\u03b8\44\276\1\u03ab\1\u03ac\15\276"+
- "\1\u03b9\43\276\1\u033b\1\300\1\276\1\320\1\321\1\322"+
- "\1\323\1\324\1\325\1\326\1\327\1\330\1\331\1\332"+
- "\1\333\1\334\43\276\1\u033b\1\u033c\1\276\1\u03ba\57\276"+
- "\1\u033b\1\u033c\2\276\1\u03bb\56\276\1\u033b\1\u033c\3\276"+
- "\1\u03bc\55\276\1\u033b\1\u033c\4\276\1\u03bd\54\276\1\u033b"+
- "\1\u033c\5\276\1\u03be\53\276\1\u033b\1\u033c\6\276\1\u03bf"+
- "\52\276\1\u033b\1\u033c\7\276\1\u03c0\51\276\1\u033b\1\u033c"+
- "\10\276\1\u03c1\50\276\1\u033b\1\u033c\11\276\1\u03c2\47\276"+
- "\1\u033b\1\u033c\12\276\1\u03c3\46\276\1\u033b\1\u033c\13\276"+
- "\1\u03c4\45\276\1\u033b\1\u033c\14\276\1\u03c5\44\276\1\u033b"+
- "\1\u033c\15\276\1\u03c6\43\276\1\300\1\u02bf\1\276\1\u03c7"+
- "\57\276\1\300\1\u02bf\2\276\1\u03c8\55\276\1\263\1\u03c9"+
- "\1\u03ca\1\263\1\u03cb\1\263\1\u0136\55\263\1\u03c9\1\u03ca"+
- "\2\263\1\u03cc\1\u0136\55\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\1\u03cd\54\263\1\u03c9\1\u03ca\3\263\1\u0136\1\263\1\u03ce"+
- "\53\263\1\u03c9\1\u03ca\3\263\1\u0136\2\263\1\u03cf\52\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\3\263\1\u03d0\51\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\4\263\1\u03d1\50\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\5\263\1\u03d2\47\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\6\263\1\u03d3\46\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\7\263\1\u03d4\45\263\1\u03c9\1\u03ca\3\263\1\u0136\10\263"+
- "\1\u03d5\44\263\1\u03c9\1\u03ca\3\263\1\u0136\11\263\1\u03d6"+
- "\42\263\1\344\1\u03d7\1\u03d8\1\344\1\u03d9\1\344\1\u017c"+
- "\55\344\1\u03d7\1\u03d8\2\344\1\u03da\1\u017c\55\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\1\u03db\54\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\1\344\1\u03dc\53\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\2\344\1\u03dd\52\344\1\u03d7\1\u03d8\3\344\1\u017c\3\344"+
- "\1\u03de\51\344\1\u03d7\1\u03d8\3\344\1\u017c\4\344\1\u03df"+
- "\50\344\1\u03d7\1\u03d8\3\344\1\u017c\5\344\1\u03e0\47\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\6\344\1\u03e1\46\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\7\344\1\u03e2\45\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\10\344\1\u03e3\44\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\11\344\1\u03e4\42\344\1\276\1\300\1\u02bf\3\276"+
- "\1\u03e5\55\276\1\300\1\u02bf\4\276\1\u03e6\54\276\1\300"+
- "\1\u02bf\5\276\1\u03e7\53\276\1\300\1\u02bf\6\276\1\u03e8"+
- "\52\276\1\300\1\u02bf\7\276\1\u03e9\51\276\1\300\1\u02bf"+
- "\10\276\1\u03ea\50\276\1\300\1\u02bf\11\276\1\u03eb\47\276"+
- "\1\300\1\u02bf\12\276\1\u03ec\46\276\1\300\1\u02bf\13\276"+
- "\1\u03ed\45\276\1\300\1\u02bf\14\276\1\u03ee\44\276\1\300"+
- "\1\u02bf\15\276\1\u03ef\43\276\1\277\1\300\52\276\1\u03f0"+
- "\5\276\5\0\1\164\1\0\1\165\14\0\3\164\1\u03f1"+
- "\23\164\3\0\1\164\1\0\1\164\7\0\1\164\1\0"+
- "\1\165\1\33\4\0\1\33\6\0\13\42\1\374\13\42"+
- "\1\0\1\33\1\0\1\42\1\33\1\42\7\0\1\164"+
- "\1\0\1\165\1\33\4\0\1\33\6\0\3\42\1\u0112"+
- "\23\42\1\0\1\33\1\0\1\42\1\33\1\42\7\0"+
- "\1\164\1\0\1\165\1\33\4\0\1\33\6\0\3\42"+
- "\1\u01c1\23\42\1\0\1\33\1\0\1\42\1\33\1\42"+
- "\7\0\1\164\1\0\1\165\14\0\5\164\1\u03f2\21\164"+
- "\3\0\1\164\1\0\1\164\7\0\1\164\1\0\1\165"+
- "\1\33\4\0\1\33\6\0\10\42\1\374\16\42\1\0"+
+ "\4\0\1\33\6\0\6\42\1\u0383\20\42\1\0\1\33"+
+ "\1\0\1\42\1\33\1\42\3\0\2\u0384\1\0\1\u0385"+
+ "\15\0\1\u0386\41\0\2\u0384\2\0\1\u0387\14\0\1\u0386"+
+ "\41\0\2\u0384\3\0\1\u0388\13\0\1\u0386\41\0\2\u0384"+
+ "\4\0\1\u0389\12\0\1\u0386\41\0\2\u0384\5\0\1\u038a"+
+ "\11\0\1\u0386\41\0\2\u0384\6\0\1\u038b\10\0\1\u0386"+
+ "\41\0\2\u0384\7\0\1\u038c\7\0\1\u0386\41\0\2\u0384"+
+ "\10\0\1\u038d\6\0\1\u0386\41\0\2\u0384\11\0\1\u038e"+
+ "\5\0\1\u0386\41\0\2\u0384\12\0\1\u038f\4\0\1\u0386"+
+ "\41\0\2\u0384\13\0\1\u0390\3\0\1\u0386\41\0\2\u0384"+
+ "\14\0\1\u0391\2\0\1\u0386\41\0\2\u0384\15\0\1\u0392"+
+ "\1\0\1\u0386\115\0\1\u0393\6\0\1\u0312\62\0\1\u0312"+
+ "\1\u0313\1\0\1\u0394\15\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\17\0\1\u0315\41\0\1\u0312\1\u0313\2\0\1\u0395\14\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\3\0\1\u0396\13\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\4\0\1\u0397\12\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\5\0\1\u0398\11\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\6\0\1\u0399\10\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\7\0\1\u039a\7\0\1\u0315\41\0\1\u0312\1\u0313\10\0"+
+ "\1\u039b\6\0\1\u0315\41\0\1\u0312\1\u0313\11\0\1\u039c"+
+ "\5\0\1\u0315\41\0\1\u0312\1\u0313\12\0\1\u039d\4\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\13\0\1\u039e\3\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\14\0\1\u039f\2\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\15\0\1\u03a0\1\0\1\u0315\41\0\2\u03a1"+
+ "\1\0\1\u03a2\15\0\1\u03a3\41\0\2\u03a1\2\0\1\u03a4"+
+ "\14\0\1\u03a3\41\0\2\u03a1\3\0\1\u03a5\13\0\1\u03a3"+
+ "\41\0\2\u03a1\4\0\1\u03a6\12\0\1\u03a3\41\0\2\u03a1"+
+ "\5\0\1\u03a7\11\0\1\u03a3\41\0\2\u03a1\6\0\1\u03a8"+
+ "\10\0\1\u03a3\41\0\2\u03a1\7\0\1\u03a9\7\0\1\u03a3"+
+ "\41\0\2\u03a1\10\0\1\u03aa\6\0\1\u03a3\41\0\2\u03a1"+
+ "\11\0\1\u03ab\5\0\1\u03a3\41\0\2\u03a1\12\0\1\u03ac"+
+ "\4\0\1\u03a3\41\0\2\u03a1\13\0\1\u03ad\3\0\1\u03a3"+
+ "\41\0\2\u03a1\14\0\1\u03ae\2\0\1\u03a3\41\0\2\u03a1"+
+ "\15\0\1\u03af\1\0\1\u03a3\44\0\1\u0150\1\u0151\1\u0152"+
+ "\1\u0153\1\u0154\1\u0155\1\u0156\1\u0157\1\u0158\1\u0159\1\u015a"+
+ "\1\u015b\1\u015c\42\0\1\276\1\u03b0\1\u03b1\1\276\1\u03b2"+
+ "\15\276\1\u03b3\41\276\1\u03b0\1\u03b1\2\276\1\u03b4\14\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\3\276\1\u03b5\13\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\4\276\1\u03b6\12\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\5\276\1\u03b7\11\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\6\276\1\u03b8\10\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\7\276\1\u03b9\7\276\1\u03b3\41\276\1\u03b0\1\u03b1\10\276"+
+ "\1\u03ba\6\276\1\u03b3\41\276\1\u03b0\1\u03b1\11\276\1\u03bb"+
+ "\5\276\1\u03b3\41\276\1\u03b0\1\u03b1\12\276\1\u03bc\4\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\13\276\1\u03bd\3\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\14\276\1\u03be\2\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\15\276\1\u03bf\1\276\1\u03b3\41\276\1\u033d"+
+ "\1\300\1\276\1\320\1\321\1\322\1\323\1\324\1\325"+
+ "\1\326\1\327\1\330\1\331\1\332\1\333\1\334\43\276"+
+ "\1\u033d\1\u033e\1\276\1\u03c0\15\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\17\276\1\u0340\41\276\1\u033d\1\u033e\2\276\1\u03c1"+
+ "\14\276\1\u0340\41\276\1\u033d\1\u033e\3\276\1\u03c2\13\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\4\276\1\u03c3\12\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\5\276\1\u03c4\11\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\6\276\1\u03c5\10\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\7\276\1\u03c6\7\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\10\276\1\u03c7\6\276\1\u0340\41\276\1\u033d\1\u033e\11\276"+
+ "\1\u03c8\5\276\1\u0340\41\276\1\u033d\1\u033e\12\276\1\u03c9"+
+ "\4\276\1\u0340\41\276\1\u033d\1\u033e\13\276\1\u03ca\3\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\14\276\1\u03cb\2\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\15\276\1\u03cc\1\276\1\u0340\41\276"+
+ "\1\300\1\u02bf\1\276\1\u03cd\15\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\2\276\1\u03ce\14\276\1\u02c1\40\276\1\263\1\u03cf"+
+ "\1\u03d0\1\263\1\u03d1\1\263\1\u0136\13\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\2\263\1\u03d3\1\u0136\13\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\1\u03d4\12\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\1\263\1\u03d5\11\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\2\263\1\u03d6\10\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\3\263\1\u03d7"+
+ "\7\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\4\263"+
+ "\1\u03d8\6\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\5\263\1\u03d9\5\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\6\263\1\u03da\4\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\7\263\1\u03db\3\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\10\263\1\u03dc\2\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\11\263\1\u03dd\1\263\1\u03d2"+
+ "\40\263\1\344\1\u03de\1\u03df\1\344\1\u03e0\1\344\1\u017c"+
+ "\13\344\1\u03e1\41\344\1\u03de\1\u03df\2\344\1\u03e2\1\u017c"+
+ "\13\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\1\u03e3"+
+ "\12\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\1\344"+
+ "\1\u03e4\11\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\2\344\1\u03e5\10\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\3\344\1\u03e6\7\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\4\344\1\u03e7\6\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\5\344\1\u03e8\5\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\6\344\1\u03e9\4\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\7\344\1\u03ea\3\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\10\344\1\u03eb"+
+ "\2\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\11\344"+
+ "\1\u03ec\1\344\1\u03e1\40\344\1\276\1\300\1\u02bf\3\276"+
+ "\1\u03ed\13\276\1\u02c1\41\276\1\300\1\u02bf\4\276\1\u03ee"+
+ "\12\276\1\u02c1\41\276\1\300\1\u02bf\5\276\1\u03ef\11\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\6\276\1\u03f0\10\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\7\276\1\u03f1\7\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\10\276\1\u03f2\6\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\11\276\1\u03f3\5\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\12\276\1\u03f4\4\276\1\u02c1\41\276\1\300\1\u02bf\13\276"+
+ "\1\u03f5\3\276\1\u02c1\41\276\1\300\1\u02bf\14\276\1\u03f6"+
+ "\2\276\1\u02c1\41\276\1\300\1\u02bf\15\276\1\u03f7\1\276"+
+ "\1\u02c1\41\276\1\277\1\300\52\276\1\u03f8\5\276\5\0"+
+ "\1\164\1\0\1\165\14\0\3\164\1\u03f9\23\164\3\0"+
+ "\1\164\1\0\1\164\7\0\1\164\1\0\1\165\1\33"+
+ "\4\0\1\33\6\0\13\42\1\374\13\42\1\0\1\33"+
+ "\1\0\1\42\1\33\1\42\7\0\1\164\1\0\1\165"+
+ "\1\33\4\0\1\33\6\0\3\42\1\u0112\23\42\1\0"+
"\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
- "\1\165\14\0\22\164\1\u03f3\4\164\3\0\1\164\1\0"+
- "\1\164\7\0\1\u03f4\1\0\1\165\1\33\4\0\1\33"+
+ "\1\165\1\33\4\0\1\33\6\0\3\42\1\u01c1\23\42"+
+ "\1\0\1\33\1\0\1\42\1\33\1\42\7\0\1\164"+
+ "\1\0\1\165\14\0\5\164\1\u03fa\21\164\3\0\1\164"+
+ "\1\0\1\164\7\0\1\164\1\0\1\165\1\33\4\0"+
+ "\1\33\6\0\10\42\1\374\16\42\1\0\1\33\1\0"+
+ "\1\42\1\33\1\42\7\0\1\164\1\0\1\165\14\0"+
+ "\22\164\1\u03fb\4\164\3\0\1\164\1\0\1\164\7\0"+
+ "\1\u03fc\1\0\1\165\1\33\4\0\1\33\6\0\27\42"+
+ "\1\0\1\33\1\0\1\42\1\33\1\42\7\0\1\164"+
+ "\1\0\1\165\1\33\4\0\1\33\6\0\1\42\1\u03fd"+
+ "\25\42\1\0\1\33\1\0\1\42\1\33\1\42\7\0"+
+ "\1\164\1\0\1\165\1\33\4\0\1\33\6\0\13\42"+
+ "\1\u03fe\13\42\1\0\1\33\1\0\1\42\1\33\1\42"+
+ "\7\0\1\164\1\0\1\165\14\0\22\164\1\u03ff\4\164"+
+ "\3\0\1\164\1\0\1\164\7\0\1\164\1\0\1\165"+
+ "\14\0\5\164\1\u0400\21\164\3\0\1\164\1\0\1\164"+
+ "\7\0\1\164\1\0\1\165\1\33\4\0\1\33\6\0"+
+ "\2\42\1\u01c1\24\42\1\0\1\33\1\0\1\42\1\33"+
+ "\1\42\7\0\1\u0401\1\0\1\165\1\33\4\0\1\33"+
"\6\0\27\42\1\0\1\33\1\0\1\42\1\33\1\42"+
"\7\0\1\164\1\0\1\165\1\33\4\0\1\33\6\0"+
- "\1\42\1\u03f5\25\42\1\0\1\33\1\0\1\42\1\33"+
- "\1\42\7\0\1\164\1\0\1\165\1\33\4\0\1\33"+
- "\6\0\13\42\1\u03f6\13\42\1\0\1\33\1\0\1\42"+
- "\1\33\1\42\7\0\1\164\1\0\1\165\14\0\22\164"+
- "\1\u03f7\4\164\3\0\1\164\1\0\1\164\7\0\1\164"+
- "\1\0\1\165\14\0\5\164\1\u03f8\21\164\3\0\1\164"+
- "\1\0\1\164\7\0\1\164\1\0\1\165\1\33\4\0"+
- "\1\33\6\0\2\42\1\u01c1\24\42\1\0\1\33\1\0"+
- "\1\42\1\33\1\42\7\0\1\u03f9\1\0\1\165\1\33"+
- "\4\0\1\33\6\0\27\42\1\0\1\33\1\0\1\42"+
- "\1\33\1\42\7\0\1\164\1\0\1\165\1\33\4\0"+
- "\1\33\6\0\5\42\1\u03fa\21\42\1\0\1\33\1\0"+
- "\1\42\1\33\1\42\3\0\2\u039d\61\0\2\u0381\1\0"+
- "\1\u03fb\57\0\2\u0381\2\0\1\u03fc\56\0\2\u0381\3\0"+
- "\1\u03fd\55\0\2\u0381\4\0\1\u03fe\54\0\2\u0381\5\0"+
- "\1\u03ff\53\0\2\u0381\6\0\1\u0400\52\0\2\u0381\7\0"+
- "\1\u0401\51\0\2\u0381\10\0\1\u0402\50\0\2\u0381\11\0"+
- "\1\u0403\47\0\2\u0381\12\0\1\u0404\46\0\2\u0381\13\0"+
- "\1\u0405\45\0\2\u0381\14\0\1\u0406\44\0\2\u0381\15\0"+
- "\1\u0407\42\0\1\u0408\2\0\20\u0408\1\0\37\u0408\1\0"+
- "\1\u0311\1\u0312\1\0\1\u0409\57\0\1\u0311\1\u0312\2\0"+
- "\1\u040a\56\0\1\u0311\1\u0312\3\0\1\u040b\55\0\1\u0311"+
- "\1\u0312\4\0\1\u040c\54\0\1\u0311\1\u0312\5\0\1\u040d"+
- "\53\0\1\u0311\1\u0312\6\0\1\u040e\52\0\1\u0311\1\u0312"+
- "\7\0\1\u040f\51\0\1\u0311\1\u0312\10\0\1\u0410\50\0"+
- "\1\u0311\1\u0312\11\0\1\u0411\47\0\1\u0311\1\u0312\12\0"+
- "\1\u0412\46\0\1\u0311\1\u0312\13\0\1\u0413\45\0\1\u0311"+
- "\1\u0312\14\0\1\u0414\44\0\1\u0311\1\u0312\15\0\1\u0415"+
- "\43\0\2\u039d\1\0\1\u0416\57\0\2\u039d\2\0\1\u0417"+
- "\56\0\2\u039d\3\0\1\u0418\55\0\2\u039d\4\0\1\u0419"+
- "\54\0\2\u039d\5\0\1\u041a\53\0\2\u039d\6\0\1\u041b"+
- "\52\0\2\u039d\7\0\1\u041c\51\0\2\u039d\10\0\1\u041d"+
- "\50\0\2\u039d\11\0\1\u041e\47\0\2\u039d\12\0\1\u041f"+
- "\46\0\2\u039d\13\0\1\u0420\45\0\2\u039d\14\0\1\u0421"+
- "\44\0\2\u039d\15\0\1\u0422\43\0\2\u039d\1\0\1\301"+
- "\1\302\1\303\1\304\1\305\1\306\1\307\1\310\1\311"+
- "\1\312\1\313\1\314\1\315\42\0\1\276\1\u03ab\1\u03ac"+
- "\1\276\1\320\1\321\1\322\1\323\1\324\1\325\1\326"+
- "\1\327\1\330\1\331\1\332\1\333\1\334\43\276\1\u03ab"+
- "\1\u03ac\1\276\1\u0423\57\276\1\u03ab\1\u03ac\2\276\1\u0424"+
- "\56\276\1\u03ab\1\u03ac\3\276\1\u0425\55\276\1\u03ab\1\u03ac"+
- "\4\276\1\u0426\54\276\1\u03ab\1\u03ac\5\276\1\u0427\53\276"+
- "\1\u03ab\1\u03ac\6\276\1\u0428\52\276\1\u03ab\1\u03ac\7\276"+
- "\1\u0429\51\276\1\u03ab\1\u03ac\10\276\1\u042a\50\276\1\u03ab"+
- "\1\u03ac\11\276\1\u042b\47\276\1\u03ab\1\u03ac\12\276\1\u042c"+
- "\46\276\1\u03ab\1\u03ac\13\276\1\u042d\45\276\1\u03ab\1\u03ac"+
- "\14\276\1\u042e\44\276\1\u03ab\1\u03ac\15\276\1\u042f\43\276"+
- "\1\u033b\1\u033c\1\276\1\u0430\57\276\1\u033b\1\u033c\2\276"+
- "\1\u0431\56\276\1\u033b\1\u033c\3\276\1\u0432\55\276\1\u033b"+
- "\1\u033c\4\276\1\u0433\54\276\1\u033b\1\u033c\5\276\1\u0434"+
- "\53\276\1\u033b\1\u033c\6\276\1\u0435\52\276\1\u033b\1\u033c"+
- "\7\276\1\u0436\51\276\1\u033b\1\u033c\10\276\1\u0437\50\276"+
- "\1\u033b\1\u033c\11\276\1\u0438\47\276\1\u033b\1\u033c\12\276"+
- "\1\u0439\46\276\1\u033b\1\u033c\13\276\1\u043a\45\276\1\u033b"+
- "\1\u033c\14\276\1\u043b\44\276\1\u033b\1\u033c\15\276\1\u043c"+
- "\43\276\1\300\1\u02bf\1\276\1\u043d\57\276\1\300\1\u02bf"+
- "\2\276\1\u043e\55\276\1\263\1\u03c9\4\263\1\u0136\55\263"+
- "\1\u03c9\1\u03ca\1\263\1\u043f\1\263\1\u0136\55\263\1\u03c9"+
- "\1\u03ca\2\263\1\u0440\1\u0136\55\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\1\u0441\54\263\1\u03c9\1\u03ca\3\263\1\u0136\1\263"+
- "\1\u0442\53\263\1\u03c9\1\u03ca\3\263\1\u0136\2\263\1\u0443"+
- "\52\263\1\u03c9\1\u03ca\3\263\1\u0136\3\263\1\u0444\51\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\4\263\1\u0445\50\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\5\263\1\u0446\47\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\6\263\1\u0447\46\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\7\263\1\u0448\45\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\10\263\1\u0449\44\263\1\u03c9\1\u03ca\3\263\1\u0136\11\263"+
- "\1\u044a\42\263\1\344\1\u03d7\1\342\1\344\1\u018a\1\u018b"+
+ "\5\42\1\u0402\21\42\1\0\1\33\1\0\1\42\1\33"+
+ "\1\42\3\0\2\u03a1\61\0\2\u0384\1\0\1\u0403\15\0"+
+ "\1\u0386\41\0\2\u0384\17\0\1\u0386\41\0\2\u0384\2\0"+
+ "\1\u0404\14\0\1\u0386\41\0\2\u0384\3\0\1\u0405\13\0"+
+ "\1\u0386\41\0\2\u0384\4\0\1\u0406\12\0\1\u0386\41\0"+
+ "\2\u0384\5\0\1\u0407\11\0\1\u0386\41\0\2\u0384\6\0"+
+ "\1\u0408\10\0\1\u0386\41\0\2\u0384\7\0\1\u0409\7\0"+
+ "\1\u0386\41\0\2\u0384\10\0\1\u040a\6\0\1\u0386\41\0"+
+ "\2\u0384\11\0\1\u040b\5\0\1\u0386\41\0\2\u0384\12\0"+
+ "\1\u040c\4\0\1\u0386\41\0\2\u0384\13\0\1\u040d\3\0"+
+ "\1\u0386\41\0\2\u0384\14\0\1\u040e\2\0\1\u0386\41\0"+
+ "\2\u0384\15\0\1\u040f\1\0\1\u0386\40\0\1\u0410\2\0"+
+ "\17\u0410\1\0\40\u0410\1\0\1\u0312\1\u0313\1\0\1\u0411"+
+ "\15\0\1\u0315\41\0\1\u0312\1\u0313\2\0\1\u0412\14\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\3\0\1\u0413\13\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\4\0\1\u0414\12\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\5\0\1\u0415\11\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\6\0\1\u0416\10\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\7\0\1\u0417\7\0\1\u0315\41\0\1\u0312\1\u0313\10\0"+
+ "\1\u0418\6\0\1\u0315\41\0\1\u0312\1\u0313\11\0\1\u0419"+
+ "\5\0\1\u0315\41\0\1\u0312\1\u0313\12\0\1\u041a\4\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\13\0\1\u041b\3\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\14\0\1\u041c\2\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\15\0\1\u041d\1\0\1\u0315\41\0\2\u03a1"+
+ "\1\0\1\u041e\15\0\1\u03a3\41\0\2\u03a1\17\0\1\u03a3"+
+ "\41\0\2\u03a1\2\0\1\u041f\14\0\1\u03a3\41\0\2\u03a1"+
+ "\3\0\1\u0420\13\0\1\u03a3\41\0\2\u03a1\4\0\1\u0421"+
+ "\12\0\1\u03a3\41\0\2\u03a1\5\0\1\u0422\11\0\1\u03a3"+
+ "\41\0\2\u03a1\6\0\1\u0423\10\0\1\u03a3\41\0\2\u03a1"+
+ "\7\0\1\u0424\7\0\1\u03a3\41\0\2\u03a1\10\0\1\u0425"+
+ "\6\0\1\u03a3\41\0\2\u03a1\11\0\1\u0426\5\0\1\u03a3"+
+ "\41\0\2\u03a1\12\0\1\u0427\4\0\1\u03a3\41\0\2\u03a1"+
+ "\13\0\1\u0428\3\0\1\u03a3\41\0\2\u03a1\14\0\1\u0429"+
+ "\2\0\1\u03a3\41\0\2\u03a1\15\0\1\u042a\1\0\1\u03a3"+
+ "\41\0\2\u03a1\1\0\1\301\1\302\1\303\1\304\1\305"+
+ "\1\306\1\307\1\310\1\311\1\312\1\313\1\314\1\315"+
+ "\42\0\1\276\1\u03b0\1\u03b1\1\276\1\320\1\321\1\322"+
+ "\1\323\1\324\1\325\1\326\1\327\1\330\1\331\1\332"+
+ "\1\333\1\334\43\276\1\u03b0\1\u03b1\1\276\1\u042b\15\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\17\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\2\276\1\u042c\14\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\3\276\1\u042d\13\276\1\u03b3\41\276\1\u03b0\1\u03b1\4\276"+
+ "\1\u042e\12\276\1\u03b3\41\276\1\u03b0\1\u03b1\5\276\1\u042f"+
+ "\11\276\1\u03b3\41\276\1\u03b0\1\u03b1\6\276\1\u0430\10\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\7\276\1\u0431\7\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\10\276\1\u0432\6\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\11\276\1\u0433\5\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\12\276\1\u0434\4\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\13\276\1\u0435\3\276\1\u03b3\41\276\1\u03b0\1\u03b1\14\276"+
+ "\1\u0436\2\276\1\u03b3\41\276\1\u03b0\1\u03b1\15\276\1\u0437"+
+ "\1\276\1\u03b3\41\276\1\u033d\1\u033e\1\276\1\u0438\15\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\2\276\1\u0439\14\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\3\276\1\u043a\13\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\4\276\1\u043b\12\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\5\276\1\u043c\11\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\6\276\1\u043d\10\276\1\u0340\41\276\1\u033d\1\u033e\7\276"+
+ "\1\u043e\7\276\1\u0340\41\276\1\u033d\1\u033e\10\276\1\u043f"+
+ "\6\276\1\u0340\41\276\1\u033d\1\u033e\11\276\1\u0440\5\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\12\276\1\u0441\4\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\13\276\1\u0442\3\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\14\276\1\u0443\2\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\15\276\1\u0444\1\276\1\u0340\41\276\1\300\1\u02bf"+
+ "\1\276\1\u0445\15\276\1\u02c1\41\276\1\300\1\u02bf\2\276"+
+ "\1\u0446\14\276\1\u02c1\40\276\1\263\1\u03cf\4\263\1\u0136"+
+ "\55\263\1\u03cf\1\u03d0\1\263\1\u0447\1\263\1\u0136\13\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\13\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\2\263\1\u0448\1\u0136\13\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\u0449\12\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\263\1\u044a\11\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\2\263\1\u044b"+
+ "\10\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\3\263"+
+ "\1\u044c\7\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\4\263\1\u044d\6\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\5\263\1\u044e\5\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\6\263\1\u044f\4\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\7\263\1\u0450\3\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\10\263\1\u0451\2\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\11\263\1\u0452\1\263"+
+ "\1\u03d2\40\263\1\344\1\u03de\1\342\1\344\1\u018a\1\u018b"+
"\1\u018c\1\u018d\1\u018e\1\u018f\1\u0190\1\u0191\1\u0192\1\u0193"+
- "\1\u0194\1\u0195\1\u0196\43\344\1\u03d7\1\u03d8\1\344\1\u044b"+
- "\1\344\1\u017c\55\344\1\u03d7\1\u03d8\2\344\1\u044c\1\u017c"+
- "\55\344\1\u03d7\1\u03d8\3\344\1\u017c\1\u044d\54\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\1\344\1\u044e\53\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\2\344\1\u044f\52\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\3\344\1\u0450\51\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\4\344\1\u0451\50\344\1\u03d7\1\u03d8\3\344\1\u017c\5\344"+
- "\1\u0452\47\344\1\u03d7\1\u03d8\3\344\1\u017c\6\344\1\u0453"+
- "\46\344\1\u03d7\1\u03d8\3\344\1\u017c\7\344\1\u0454\45\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\10\344\1\u0455\44\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\11\344\1\u0456\42\344\1\276\1\300"+
- "\1\u02bf\3\276\1\u0457\55\276\1\300\1\u02bf\4\276\1\u0458"+
- "\54\276\1\300\1\u02bf\5\276\1\u0459\53\276\1\300\1\u02bf"+
- "\6\276\1\u045a\52\276\1\300\1\u02bf\7\276\1\u045b\51\276"+
- "\1\300\1\u02bf\10\276\1\u045c\50\276\1\300\1\u02bf\11\276"+
- "\1\u045d\47\276\1\300\1\u02bf\12\276\1\u045e\46\276\1\300"+
- "\1\u02bf\13\276\1\u045f\45\276\1\300\1\u02bf\14\276\1\u0460"+
- "\44\276\1\300\1\u02bf\15\276\1\u0461\42\276\1\u0462\1\277"+
- "\1\300\20\u0462\1\276\37\u0462\5\0\1\164\1\0\1\165"+
- "\14\0\5\164\1\u0463\21\164\3\0\1\164\1\0\1\164"+
- "\7\0\1\164\1\0\1\165\14\0\6\164\1\u0464\20\164"+
- "\3\0\1\164\1\0\1\164\7\0\1\164\1\0\1\165"+
- "\14\0\2\164\1\u0465\24\164\3\0\1\164\1\0\1\164"+
- "\7\0\1\164\1\0\1\165\14\0\12\164\1\u0466\14\164"+
- "\3\0\1\164\1\0\1\164\7\0\1\164\1\0\1\165"+
- "\1\33\4\0\1\33\6\0\7\42\1\u0467\17\42\1\0"+
- "\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
- "\1\165\1\33\4\0\1\33\6\0\1\42\1\u0468\25\42"+
- "\1\0\1\33\1\0\1\42\1\33\1\42\7\0\1\164"+
- "\1\0\1\165\14\0\4\164\1\u0469\22\164\3\0\1\164"+
- "\1\0\1\164\7\0\1\164\1\0\1\165\14\0\1\164"+
- "\1\u03f3\25\164\3\0\1\164\1\0\1\164\7\0\1\164"+
- "\1\0\1\165\14\0\1\u046a\26\164\3\0\1\164\1\0"+
+ "\1\u0194\1\u0195\1\u0196\43\344\1\u03de\1\u03df\1\344\1\u0453"+
+ "\1\344\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df\2\344\1\u0454"+
+ "\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\1\u0455\12\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\1\344\1\u0456\11\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\2\344\1\u0457\10\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\3\344\1\u0458\7\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\4\344\1\u0459\6\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\5\344\1\u045a\5\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\6\344\1\u045b\4\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\7\344\1\u045c"+
+ "\3\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\10\344"+
+ "\1\u045d\2\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\11\344\1\u045e\1\344\1\u03e1\40\344\1\276\1\300\1\u02bf"+
+ "\3\276\1\u045f\13\276\1\u02c1\41\276\1\300\1\u02bf\4\276"+
+ "\1\u0460\12\276\1\u02c1\41\276\1\300\1\u02bf\5\276\1\u0461"+
+ "\11\276\1\u02c1\41\276\1\300\1\u02bf\6\276\1\u0462\10\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\7\276\1\u0463\7\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\10\276\1\u0464\6\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\11\276\1\u0465\5\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\12\276\1\u0466\4\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\13\276\1\u0467\3\276\1\u02c1\41\276\1\300\1\u02bf\14\276"+
+ "\1\u0468\2\276\1\u02c1\41\276\1\300\1\u02bf\15\276\1\u0469"+
+ "\1\276\1\u02c1\40\276\1\u046a\1\277\1\300\17\u046a\1\276"+
+ "\40\u046a\5\0\1\164\1\0\1\165\14\0\5\164\1\u046b"+
+ "\21\164\3\0\1\164\1\0\1\164\7\0\1\164\1\0"+
+ "\1\165\14\0\6\164\1\u046c\20\164\3\0\1\164\1\0"+
+ "\1\164\7\0\1\164\1\0\1\165\14\0\2\164\1\u046d"+
+ "\24\164\3\0\1\164\1\0\1\164\7\0\1\164\1\0"+
+ "\1\165\14\0\12\164\1\u046e\14\164\3\0\1\164\1\0"+
"\1\164\7\0\1\164\1\0\1\165\1\33\4\0\1\33"+
- "\6\0\10\42\1\u046b\16\42\1\0\1\33\1\0\1\42"+
- "\1\33\1\42\3\0\2\u0381\1\0\1\u046c\57\0\2\u0381"+
- "\2\0\1\u046d\56\0\2\u0381\3\0\1\u046e\55\0\2\u0381"+
- "\4\0\1\u046f\54\0\2\u0381\5\0\1\u0470\53\0\2\u0381"+
- "\6\0\1\u0471\52\0\2\u0381\7\0\1\u0472\51\0\2\u0381"+
- "\10\0\1\u0473\50\0\2\u0381\11\0\1\u0474\47\0\2\u0381"+
- "\12\0\1\u0475\46\0\2\u0381\13\0\1\u0476\45\0\2\u0381"+
- "\14\0\1\u0477\44\0\2\u0381\15\0\1\u0478\43\0\1\u0311"+
- "\1\u0312\1\0\1\u0479\57\0\1\u0311\1\u0312\2\0\1\u047a"+
- "\56\0\1\u0311\1\u0312\3\0\1\u047b\55\0\1\u0311\1\u0312"+
- "\4\0\1\u047c\54\0\1\u0311\1\u0312\5\0\1\u047d\53\0"+
- "\1\u0311\1\u0312\6\0\1\u047e\52\0\1\u0311\1\u0312\7\0"+
- "\1\u047f\51\0\1\u0311\1\u0312\10\0\1\u0480\50\0\1\u0311"+
- "\1\u0312\11\0\1\u0481\47\0\1\u0311\1\u0312\12\0\1\u0482"+
- "\46\0\1\u0311\1\u0312\13\0\1\u0483\45\0\1\u0311\1\u0312"+
- "\14\0\1\u0484\44\0\1\u0311\1\u0312\15\0\1\u0485\43\0"+
- "\2\u039d\1\0\1\u0486\57\0\2\u039d\2\0\1\u0487\56\0"+
- "\2\u039d\3\0\1\u0488\55\0\2\u039d\4\0\1\u0489\54\0"+
- "\2\u039d\5\0\1\u048a\53\0\2\u039d\6\0\1\u048b\52\0"+
- "\2\u039d\7\0\1\u048c\51\0\2\u039d\10\0\1\u048d\50\0"+
- "\2\u039d\11\0\1\u048e\47\0\2\u039d\12\0\1\u048f\46\0"+
- "\2\u039d\13\0\1\u0490\45\0\2\u039d\14\0\1\u0491\44\0"+
- "\2\u039d\15\0\1\u0492\42\0\1\276\1\u03ab\1\u03ac\1\276"+
- "\1\u0493\57\276\1\u03ab\1\u03ac\2\276\1\u0494\56\276\1\u03ab"+
- "\1\u03ac\3\276\1\u0495\55\276\1\u03ab\1\u03ac\4\276\1\u0496"+
- "\54\276\1\u03ab\1\u03ac\5\276\1\u0497\53\276\1\u03ab\1\u03ac"+
- "\6\276\1\u0498\52\276\1\u03ab\1\u03ac\7\276\1\u0499\51\276"+
- "\1\u03ab\1\u03ac\10\276\1\u049a\50\276\1\u03ab\1\u03ac\11\276"+
- "\1\u049b\47\276\1\u03ab\1\u03ac\12\276\1\u049c\46\276\1\u03ab"+
- "\1\u03ac\13\276\1\u049d\45\276\1\u03ab\1\u03ac\14\276\1\u049e"+
- "\44\276\1\u03ab\1\u03ac\15\276\1\u049f\43\276\1\u033b\1\u033c"+
- "\1\276\1\u04a0\57\276\1\u033b\1\u033c\2\276\1\u04a1\56\276"+
- "\1\u033b\1\u033c\3\276\1\u04a2\55\276\1\u033b\1\u033c\4\276"+
- "\1\u04a3\54\276\1\u033b\1\u033c\5\276\1\u04a4\53\276\1\u033b"+
- "\1\u033c\6\276\1\u04a5\52\276\1\u033b\1\u033c\7\276\1\u04a6"+
- "\51\276\1\u033b\1\u033c\10\276\1\u04a7\50\276\1\u033b\1\u033c"+
- "\11\276\1\u04a8\47\276\1\u033b\1\u033c\12\276\1\u04a9\46\276"+
- "\1\u033b\1\u033c\13\276\1\u04aa\45\276\1\u033b\1\u033c\14\276"+
- "\1\u04ab\44\276\1\u033b\1\u033c\15\276\1\u04ac\43\276\1\300"+
- "\1\u02bf\1\276\1\u04ad\57\276\1\300\1\u02bf\2\276\1\u04ae"+
- "\55\276\1\263\1\u03c9\1\u03ca\1\263\1\u04af\1\263\1\u0136"+
- "\55\263\1\u03c9\1\u03ca\2\263\1\u04b0\1\u0136\55\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\1\u04b1\54\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\1\263\1\u04b2\53\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\2\263\1\u04b3\52\263\1\u03c9\1\u03ca\3\263\1\u0136\3\263"+
- "\1\u04b4\51\263\1\u03c9\1\u03ca\3\263\1\u0136\4\263\1\u04b5"+
- "\50\263\1\u03c9\1\u03ca\3\263\1\u0136\5\263\1\u04b6\47\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\6\263\1\u04b7\46\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\7\263\1\u04b8\45\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\10\263\1\u04b9\44\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\11\263\1\u04ba\42\263\1\344\1\u03d7\1\u03d8\1\344"+
- "\1\u04bb\1\344\1\u017c\55\344\1\u03d7\1\u03d8\2\344\1\u04bc"+
- "\1\u017c\55\344\1\u03d7\1\u03d8\3\344\1\u017c\1\u04bd\54\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\1\344\1\u04be\53\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\2\344\1\u04bf\52\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\3\344\1\u04c0\51\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\4\344\1\u04c1\50\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\5\344\1\u04c2\47\344\1\u03d7\1\u03d8\3\344\1\u017c\6\344"+
- "\1\u04c3\46\344\1\u03d7\1\u03d8\3\344\1\u017c\7\344\1\u04c4"+
- "\45\344\1\u03d7\1\u03d8\3\344\1\u017c\10\344\1\u04c5\44\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\11\344\1\u04c6\42\344\1\276"+
- "\1\300\1\u02bf\3\276\1\u04c7\55\276\1\300\1\u02bf\4\276"+
- "\1\u04c8\54\276\1\300\1\u02bf\5\276\1\u04c9\53\276\1\300"+
- "\1\u02bf\6\276\1\u04ca\52\276\1\300\1\u02bf\7\276\1\u04cb"+
- "\51\276\1\300\1\u02bf\10\276\1\u04cc\50\276\1\300\1\u02bf"+
- "\11\276\1\u04cd\47\276\1\300\1\u02bf\12\276\1\u04ce\46\276"+
- "\1\300\1\u02bf\13\276\1\u04cf\45\276\1\300\1\u02bf\14\276"+
- "\1\u04d0\44\276\1\300\1\u02bf\15\276\1\u04d1\42\276\5\0"+
- "\1\164\1\0\1\165\14\0\1\164\1\u04d2\25\164\3\0"+
+ "\6\0\7\42\1\u046f\17\42\1\0\1\33\1\0\1\42"+
+ "\1\33\1\42\7\0\1\164\1\0\1\165\1\33\4\0"+
+ "\1\33\6\0\1\42\1\u0470\25\42\1\0\1\33\1\0"+
+ "\1\42\1\33\1\42\7\0\1\164\1\0\1\165\14\0"+
+ "\4\164\1\u0471\22\164\3\0\1\164\1\0\1\164\7\0"+
+ "\1\164\1\0\1\165\14\0\1\164\1\u03fb\25\164\3\0"+
"\1\164\1\0\1\164\7\0\1\164\1\0\1\165\14\0"+
- "\26\164\1\u04d3\3\0\1\164\1\0\1\164\7\0\1\164"+
- "\1\0\1\u01b5\14\0\27\164\3\0\1\164\1\0\1\164"+
- "\7\0\1\164\1\0\1\165\14\0\5\164\1\u0378\21\164"+
+ "\1\u0472\26\164\3\0\1\164\1\0\1\164\7\0\1\164"+
+ "\1\0\1\165\1\33\4\0\1\33\6\0\10\42\1\u0473"+
+ "\16\42\1\0\1\33\1\0\1\42\1\33\1\42\3\0"+
+ "\2\u0384\1\0\1\u0474\15\0\1\u0386\41\0\2\u0384\2\0"+
+ "\1\u0475\14\0\1\u0386\41\0\2\u0384\3\0\1\u0476\13\0"+
+ "\1\u0386\41\0\2\u0384\4\0\1\u0477\12\0\1\u0386\41\0"+
+ "\2\u0384\5\0\1\u0478\11\0\1\u0386\41\0\2\u0384\6\0"+
+ "\1\u0479\10\0\1\u0386\41\0\2\u0384\7\0\1\u047a\7\0"+
+ "\1\u0386\41\0\2\u0384\10\0\1\u047b\6\0\1\u0386\41\0"+
+ "\2\u0384\11\0\1\u047c\5\0\1\u0386\41\0\2\u0384\12\0"+
+ "\1\u047d\4\0\1\u0386\41\0\2\u0384\13\0\1\u047e\3\0"+
+ "\1\u0386\41\0\2\u0384\14\0\1\u047f\2\0\1\u0386\41\0"+
+ "\2\u0384\15\0\1\u0480\1\0\1\u0386\41\0\1\u0312\1\u0313"+
+ "\1\0\1\u0481\15\0\1\u0315\41\0\1\u0312\1\u0313\2\0"+
+ "\1\u0482\14\0\1\u0315\41\0\1\u0312\1\u0313\3\0\1\u0483"+
+ "\13\0\1\u0315\41\0\1\u0312\1\u0313\4\0\1\u0484\12\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\5\0\1\u0485\11\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\6\0\1\u0486\10\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\7\0\1\u0487\7\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\10\0\1\u0488\6\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\11\0\1\u0489\5\0\1\u0315\41\0\1\u0312\1\u0313\12\0"+
+ "\1\u048a\4\0\1\u0315\41\0\1\u0312\1\u0313\13\0\1\u048b"+
+ "\3\0\1\u0315\41\0\1\u0312\1\u0313\14\0\1\u048c\2\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\15\0\1\u048d\1\0\1\u0315"+
+ "\41\0\2\u03a1\1\0\1\u048e\15\0\1\u03a3\41\0\2\u03a1"+
+ "\2\0\1\u048f\14\0\1\u03a3\41\0\2\u03a1\3\0\1\u0490"+
+ "\13\0\1\u03a3\41\0\2\u03a1\4\0\1\u0491\12\0\1\u03a3"+
+ "\41\0\2\u03a1\5\0\1\u0492\11\0\1\u03a3\41\0\2\u03a1"+
+ "\6\0\1\u0493\10\0\1\u03a3\41\0\2\u03a1\7\0\1\u0494"+
+ "\7\0\1\u03a3\41\0\2\u03a1\10\0\1\u0495\6\0\1\u03a3"+
+ "\41\0\2\u03a1\11\0\1\u0496\5\0\1\u03a3\41\0\2\u03a1"+
+ "\12\0\1\u0497\4\0\1\u03a3\41\0\2\u03a1\13\0\1\u0498"+
+ "\3\0\1\u03a3\41\0\2\u03a1\14\0\1\u0499\2\0\1\u03a3"+
+ "\41\0\2\u03a1\15\0\1\u049a\1\0\1\u03a3\40\0\1\276"+
+ "\1\u03b0\1\u03b1\1\276\1\u049b\15\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\2\276\1\u049c\14\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\3\276\1\u049d\13\276\1\u03b3\41\276\1\u03b0\1\u03b1\4\276"+
+ "\1\u049e\12\276\1\u03b3\41\276\1\u03b0\1\u03b1\5\276\1\u049f"+
+ "\11\276\1\u03b3\41\276\1\u03b0\1\u03b1\6\276\1\u04a0\10\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\7\276\1\u04a1\7\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\10\276\1\u04a2\6\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\11\276\1\u04a3\5\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\12\276\1\u04a4\4\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\13\276\1\u04a5\3\276\1\u03b3\41\276\1\u03b0\1\u03b1\14\276"+
+ "\1\u04a6\2\276\1\u03b3\41\276\1\u03b0\1\u03b1\15\276\1\u04a7"+
+ "\1\276\1\u03b3\41\276\1\u033d\1\u033e\1\276\1\u04a8\15\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\2\276\1\u04a9\14\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\3\276\1\u04aa\13\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\4\276\1\u04ab\12\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\5\276\1\u04ac\11\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\6\276\1\u04ad\10\276\1\u0340\41\276\1\u033d\1\u033e\7\276"+
+ "\1\u04ae\7\276\1\u0340\41\276\1\u033d\1\u033e\10\276\1\u04af"+
+ "\6\276\1\u0340\41\276\1\u033d\1\u033e\11\276\1\u04b0\5\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\12\276\1\u04b1\4\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\13\276\1\u04b2\3\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\14\276\1\u04b3\2\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\15\276\1\u04b4\1\276\1\u0340\41\276\1\300\1\u02bf"+
+ "\1\276\1\u04b5\15\276\1\u02c1\41\276\1\300\1\u02bf\2\276"+
+ "\1\u04b6\14\276\1\u02c1\40\276\1\263\1\u03cf\1\u03d0\1\263"+
+ "\1\u04b7\1\263\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\2\263\1\u04b8\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\1\u04b9\12\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\1\263\1\u04ba\11\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\2\263\1\u04bb\10\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\3\263\1\u04bc\7\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\4\263\1\u04bd\6\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\5\263\1\u04be"+
+ "\5\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\6\263"+
+ "\1\u04bf\4\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\7\263\1\u04c0\3\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\10\263\1\u04c1\2\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\11\263\1\u04c2\1\263\1\u03d2\40\263\1\344"+
+ "\1\u03de\1\u03df\1\344\1\u04c3\1\344\1\u017c\13\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\2\344\1\u04c4\1\u017c\13\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\1\u04c5\12\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\1\344\1\u04c6\11\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\2\344\1\u04c7"+
+ "\10\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\3\344"+
+ "\1\u04c8\7\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\4\344\1\u04c9\6\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\5\344\1\u04ca\5\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\6\344\1\u04cb\4\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\7\344\1\u04cc\3\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\10\344\1\u04cd\2\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\11\344\1\u04ce\1\344"+
+ "\1\u03e1\40\344\1\276\1\300\1\u02bf\3\276\1\u04cf\13\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\4\276\1\u04d0\12\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\5\276\1\u04d1\11\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\6\276\1\u04d2\10\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\7\276\1\u04d3\7\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\10\276\1\u04d4\6\276\1\u02c1\41\276\1\300\1\u02bf\11\276"+
+ "\1\u04d5\5\276\1\u02c1\41\276\1\300\1\u02bf\12\276\1\u04d6"+
+ "\4\276\1\u02c1\41\276\1\300\1\u02bf\13\276\1\u04d7\3\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\14\276\1\u04d8\2\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\15\276\1\u04d9\1\276\1\u02c1\40\276"+
+ "\5\0\1\164\1\0\1\165\14\0\1\164\1\u04da\25\164"+
"\3\0\1\164\1\0\1\164\7\0\1\164\1\0\1\165"+
- "\1\33\4\0\1\33\6\0\12\42\1\u04d4\14\42\1\0"+
- "\1\33\1\0\1\42\1\33\1\42\7\0\1\164\1\0"+
- "\1\u04d5\1\33\4\0\1\33\6\0\20\42\1\374\6\42"+
+ "\14\0\26\164\1\u04db\3\0\1\164\1\0\1\164\7\0"+
+ "\1\164\1\0\1\u01b5\14\0\27\164\3\0\1\164\1\0"+
+ "\1\164\7\0\1\164\1\0\1\165\14\0\5\164\1\u037b"+
+ "\21\164\3\0\1\164\1\0\1\164\7\0\1\164\1\0"+
+ "\1\165\1\33\4\0\1\33\6\0\12\42\1\u04dc\14\42"+
"\1\0\1\33\1\0\1\42\1\33\1\42\7\0\1\164"+
- "\1\0\1\165\14\0\1\164\1\u04d6\25\164\3\0\1\164"+
- "\1\0\1\164\7\0\1\164\1\0\1\165\14\0\7\164"+
- "\1\u04d7\17\164\3\0\1\164\1\0\1\164\7\0\1\164"+
- "\1\0\1\165\1\33\4\0\1\33\6\0\2\42\1\u04d8"+
- "\24\42\1\0\1\33\1\0\1\42\1\33\1\42\3\0"+
- "\2\u0381\1\0\1\u04d9\57\0\2\u0381\2\0\1\u04da\56\0"+
- "\2\u0381\3\0\1\u04db\55\0\2\u0381\4\0\1\u04dc\54\0"+
- "\2\u0381\5\0\1\u04dd\53\0\2\u0381\6\0\1\u04de\52\0"+
- "\2\u0381\7\0\1\u04df\51\0\2\u0381\10\0\1\u04e0\50\0"+
- "\2\u0381\11\0\1\u04e1\47\0\2\u0381\12\0\1\u04e2\46\0"+
- "\2\u0381\13\0\1\u04e3\45\0\2\u0381\14\0\1\u04e4\44\0"+
- "\2\u0381\15\0\1\u04e5\43\0\1\u0311\1\u0312\1\0\1\u04e6"+
- "\57\0\1\u0311\1\u0312\2\0\1\u04e7\56\0\1\u0311\1\u0312"+
- "\3\0\1\u04e8\55\0\1\u0311\1\u0312\4\0\1\u04e9\54\0"+
- "\1\u0311\1\u0312\5\0\1\u04ea\53\0\1\u0311\1\u0312\6\0"+
- "\1\u04eb\52\0\1\u0311\1\u0312\7\0\1\u04ec\51\0\1\u0311"+
- "\1\u0312\10\0\1\u04ed\50\0\1\u0311\1\u0312\11\0\1\u04ee"+
- "\47\0\1\u0311\1\u0312\12\0\1\u04ef\46\0\1\u0311\1\u0312"+
- "\13\0\1\u04f0\45\0\1\u0311\1\u0312\14\0\1\u04f1\44\0"+
- "\1\u0311\1\u0312\15\0\1\u04f2\43\0\2\u039d\1\0\1\u04f3"+
- "\57\0\2\u039d\2\0\1\u04f4\56\0\2\u039d\3\0\1\u04f5"+
- "\55\0\2\u039d\4\0\1\u04f6\54\0\2\u039d\5\0\1\u04f7"+
- "\53\0\2\u039d\6\0\1\u04f8\52\0\2\u039d\7\0\1\u04f9"+
- "\51\0\2\u039d\10\0\1\u04fa\50\0\2\u039d\11\0\1\u04fb"+
- "\47\0\2\u039d\12\0\1\u04fc\46\0\2\u039d\13\0\1\u04fd"+
- "\45\0\2\u039d\14\0\1\u04fe\44\0\2\u039d\15\0\1\u04ff"+
- "\42\0\1\276\1\u03ab\1\u03ac\1\276\1\u0500\57\276\1\u03ab"+
- "\1\u03ac\2\276\1\u0501\56\276\1\u03ab\1\u03ac\3\276\1\u0502"+
- "\55\276\1\u03ab\1\u03ac\4\276\1\u0503\54\276\1\u03ab\1\u03ac"+
- "\5\276\1\u0504\53\276\1\u03ab\1\u03ac\6\276\1\u0505\52\276"+
- "\1\u03ab\1\u03ac\7\276\1\u0506\51\276\1\u03ab\1\u03ac\10\276"+
- "\1\u0507\50\276\1\u03ab\1\u03ac\11\276\1\u0508\47\276\1\u03ab"+
- "\1\u03ac\12\276\1\u0509\46\276\1\u03ab\1\u03ac\13\276\1\u050a"+
- "\45\276\1\u03ab\1\u03ac\14\276\1\u050b\44\276\1\u03ab\1\u03ac"+
- "\15\276\1\u050c\43\276\1\u033b\1\u033c\1\276\1\u050d\57\276"+
- "\1\u033b\1\u033c\2\276\1\u050e\56\276\1\u033b\1\u033c\3\276"+
- "\1\u050f\55\276\1\u033b\1\u033c\4\276\1\u0510\54\276\1\u033b"+
- "\1\u033c\5\276\1\u0511\53\276\1\u033b\1\u033c\6\276\1\u0512"+
- "\52\276\1\u033b\1\u033c\7\276\1\u0513\51\276\1\u033b\1\u033c"+
- "\10\276\1\u0514\50\276\1\u033b\1\u033c\11\276\1\u0515\47\276"+
- "\1\u033b\1\u033c\12\276\1\u0516\46\276\1\u033b\1\u033c\13\276"+
- "\1\u0517\45\276\1\u033b\1\u033c\14\276\1\u0518\44\276\1\u033b"+
- "\1\u033c\15\276\1\u0519\43\276\1\300\1\u02bf\1\276\1\u051a"+
- "\57\276\1\300\1\u02bf\2\276\1\u051b\55\276\1\263\1\u03c9"+
- "\1\u03ca\1\263\1\u051c\1\263\1\u0136\55\263\1\u03c9\1\u03ca"+
- "\2\263\1\u051d\1\u0136\55\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\1\u051e\54\263\1\u03c9\1\u03ca\3\263\1\u0136\1\263\1\u051f"+
- "\53\263\1\u03c9\1\u03ca\3\263\1\u0136\2\263\1\u0520\52\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\3\263\1\u0521\51\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\4\263\1\u0522\50\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\5\263\1\u0523\47\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\6\263\1\u0524\46\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\7\263\1\u0525\45\263\1\u03c9\1\u03ca\3\263\1\u0136\10\263"+
- "\1\u0526\44\263\1\u03c9\1\u03ca\3\263\1\u0136\11\263\1\u0527"+
- "\42\263\1\344\1\u03d7\1\u03d8\1\344\1\u0528\1\344\1\u017c"+
- "\55\344\1\u03d7\1\u03d8\2\344\1\u0529\1\u017c\55\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\1\u052a\54\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\1\344\1\u052b\53\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\2\344\1\u052c\52\344\1\u03d7\1\u03d8\3\344\1\u017c\3\344"+
- "\1\u052d\51\344\1\u03d7\1\u03d8\3\344\1\u017c\4\344\1\u052e"+
- "\50\344\1\u03d7\1\u03d8\3\344\1\u017c\5\344\1\u052f\47\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\6\344\1\u0530\46\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\7\344\1\u0531\45\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\10\344\1\u0532\44\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\11\344\1\u0533\42\344\1\276\1\300\1\u02bf\3\276"+
- "\1\u0534\55\276\1\300\1\u02bf\4\276\1\u0535\54\276\1\300"+
- "\1\u02bf\5\276\1\u0536\53\276\1\300\1\u02bf\6\276\1\u0537"+
- "\52\276\1\300\1\u02bf\7\276\1\u0538\51\276\1\300\1\u02bf"+
- "\10\276\1\u0539\50\276\1\300\1\u02bf\11\276\1\u053a\47\276"+
- "\1\300\1\u02bf\12\276\1\u053b\46\276\1\300\1\u02bf\13\276"+
- "\1\u053c\45\276\1\300\1\u02bf\14\276\1\u053d\44\276\1\300"+
- "\1\u02bf\15\276\1\u053e\42\276\5\0\1\164\1\0\1\165"+
- "\14\0\2\164\1\u053f\24\164\3\0\1\164\1\0\1\164"+
- "\7\0\1\164\1\0\1\u04d5\14\0\27\164\3\0\1\164"+
- "\1\0\1\164\7\0\1\164\1\0\1\165\1\33\4\0"+
- "\1\33\6\0\2\42\1\u0540\24\42\1\0\1\33\1\0"+
- "\1\42\1\33\1\42\7\0\1\164\1\0\1\u0541\14\0"+
- "\27\164\3\0\1\164\1\0\1\164\7\0\1\164\1\0"+
- "\1\165\14\0\2\164\1\u0542\24\164\3\0\1\164\1\0"+
- "\1\164\7\0\1\164\1\0\1\165\14\0\1\164\1\u0543"+
- "\25\164\3\0\1\164\1\0\1\164\7\0\1\164\1\0"+
- "\1\u04d5\1\33\4\0\1\33\6\0\27\42\1\0\1\33"+
- "\1\0\1\42\1\33\1\42\3\0\2\u0381\1\0\1\u0544"+
- "\57\0\2\u0381\2\0\1\u0545\56\0\2\u0381\3\0\1\u0546"+
- "\55\0\2\u0381\4\0\1\u0547\54\0\2\u0381\5\0\1\u0548"+
- "\53\0\2\u0381\6\0\1\u0549\52\0\2\u0381\7\0\1\u054a"+
- "\51\0\2\u0381\10\0\1\u054b\50\0\2\u0381\11\0\1\u054c"+
- "\47\0\2\u0381\12\0\1\u054d\46\0\2\u0381\13\0\1\u054e"+
- "\45\0\2\u0381\14\0\1\u054f\44\0\2\u0381\15\0\1\u0550"+
- "\43\0\1\u0311\1\u0312\1\0\1\u0551\57\0\1\u0311\1\u0312"+
- "\2\0\1\u0552\56\0\1\u0311\1\u0312\3\0\1\u0553\55\0"+
- "\1\u0311\1\u0312\4\0\1\u0554\54\0\1\u0311\1\u0312\5\0"+
- "\1\u0555\53\0\1\u0311\1\u0312\6\0\1\u0556\52\0\1\u0311"+
- "\1\u0312\7\0\1\u0557\51\0\1\u0311\1\u0312\10\0\1\u0558"+
- "\50\0\1\u0311\1\u0312\11\0\1\u0559\47\0\1\u0311\1\u0312"+
- "\12\0\1\u055a\46\0\1\u0311\1\u0312\13\0\1\u055b\45\0"+
- "\1\u0311\1\u0312\14\0\1\u055c\44\0\1\u0311\1\u0312\15\0"+
- "\1\u055d\43\0\2\u039d\1\0\1\u055e\57\0\2\u039d\2\0"+
- "\1\u055f\56\0\2\u039d\3\0\1\u0560\55\0\2\u039d\4\0"+
- "\1\u0561\54\0\2\u039d\5\0\1\u0562\53\0\2\u039d\6\0"+
- "\1\u0563\52\0\2\u039d\7\0\1\u0564\51\0\2\u039d\10\0"+
- "\1\u0565\50\0\2\u039d\11\0\1\u0566\47\0\2\u039d\12\0"+
- "\1\u0567\46\0\2\u039d\13\0\1\u0568\45\0\2\u039d\14\0"+
- "\1\u0569\44\0\2\u039d\15\0\1\u056a\42\0\1\276\1\u03ab"+
- "\1\u03ac\1\276\1\u056b\57\276\1\u03ab\1\u03ac\2\276\1\u056c"+
- "\56\276\1\u03ab\1\u03ac\3\276\1\u056d\55\276\1\u03ab\1\u03ac"+
- "\4\276\1\u056e\54\276\1\u03ab\1\u03ac\5\276\1\u056f\53\276"+
- "\1\u03ab\1\u03ac\6\276\1\u0570\52\276\1\u03ab\1\u03ac\7\276"+
- "\1\u0571\51\276\1\u03ab\1\u03ac\10\276\1\u0572\50\276\1\u03ab"+
- "\1\u03ac\11\276\1\u0573\47\276\1\u03ab\1\u03ac\12\276\1\u0574"+
- "\46\276\1\u03ab\1\u03ac\13\276\1\u0575\45\276\1\u03ab\1\u03ac"+
- "\14\276\1\u0576\44\276\1\u03ab\1\u03ac\15\276\1\u0577\43\276"+
- "\1\u033b\1\u033c\1\276\1\u0578\57\276\1\u033b\1\u033c\2\276"+
- "\1\u0579\56\276\1\u033b\1\u033c\3\276\1\u057a\55\276\1\u033b"+
- "\1\u033c\4\276\1\u057b\54\276\1\u033b\1\u033c\5\276\1\u057c"+
- "\53\276\1\u033b\1\u033c\6\276\1\u057d\52\276\1\u033b\1\u033c"+
- "\7\276\1\u057e\51\276\1\u033b\1\u033c\10\276\1\u057f\50\276"+
- "\1\u033b\1\u033c\11\276\1\u0580\47\276\1\u033b\1\u033c\12\276"+
- "\1\u0581\46\276\1\u033b\1\u033c\13\276\1\u0582\45\276\1\u033b"+
- "\1\u033c\14\276\1\u0583\44\276\1\u033b\1\u033c\15\276\1\u0584"+
- "\43\276\1\300\1\u02bf\1\276\1\u0585\57\276\1\300\1\u02bf"+
- "\2\276\1\u0586\55\276\1\263\1\u03c9\1\u03ca\1\263\1\u0587"+
- "\1\263\1\u0136\55\263\1\u03c9\1\u03ca\2\263\1\u0588\1\u0136"+
- "\55\263\1\u03c9\1\u03ca\3\263\1\u0136\1\u0589\54\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\1\263\1\u058a\53\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\2\263\1\u058b\52\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\3\263\1\u058c\51\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\4\263\1\u058d\50\263\1\u03c9\1\u03ca\3\263\1\u0136\5\263"+
- "\1\u058e\47\263\1\u03c9\1\u03ca\3\263\1\u0136\6\263\1\u058f"+
- "\46\263\1\u03c9\1\u03ca\3\263\1\u0136\7\263\1\u0590\45\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\10\263\1\u0591\44\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\11\263\1\u0592\42\263\1\344\1\u03d7"+
- "\1\u03d8\1\344\1\u0593\1\344\1\u017c\55\344\1\u03d7\1\u03d8"+
- "\2\344\1\u0594\1\u017c\55\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\1\u0595\54\344\1\u03d7\1\u03d8\3\344\1\u017c\1\344\1\u0596"+
- "\53\344\1\u03d7\1\u03d8\3\344\1\u017c\2\344\1\u0597\52\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\3\344\1\u0598\51\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\4\344\1\u0599\50\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\5\344\1\u059a\47\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\6\344\1\u059b\46\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\7\344\1\u059c\45\344\1\u03d7\1\u03d8\3\344\1\u017c\10\344"+
- "\1\u059d\44\344\1\u03d7\1\u03d8\3\344\1\u017c\11\344\1\u059e"+
- "\42\344\1\276\1\300\1\u02bf\3\276\1\u059f\55\276\1\300"+
- "\1\u02bf\4\276\1\u05a0\54\276\1\300\1\u02bf\5\276\1\u05a1"+
- "\53\276\1\300\1\u02bf\6\276\1\u05a2\52\276\1\300\1\u02bf"+
- "\7\276\1\u05a3\51\276\1\300\1\u02bf\10\276\1\u05a4\50\276"+
- "\1\300\1\u02bf\11\276\1\u05a5\47\276\1\300\1\u02bf\12\276"+
- "\1\u05a6\46\276\1\300\1\u02bf\13\276\1\u05a7\45\276\1\300"+
- "\1\u02bf\14\276\1\u05a8\44\276\1\300\1\u02bf\15\276\1\u05a9"+
- "\42\276\5\0\1\164\1\0\1\165\14\0\20\164\1\u0465"+
- "\6\164\3\0\1\164\1\0\1\164\7\0\1\164\1\0"+
- "\1\165\1\33\4\0\1\33\6\0\10\42\1\u05aa\16\42"+
- "\1\0\1\33\1\0\1\42\1\33\1\42\7\0\1\164"+
- "\1\0\1\165\14\0\12\164\1\u05ab\14\164\3\0\1\164"+
- "\1\0\1\164\7\0\1\164\1\0\1\165\14\0\5\164"+
- "\1\u05ac\21\164\3\0\1\164\1\0\1\164\3\0\2\u0381"+
- "\1\0\1\u05ad\57\0\2\u0381\2\0\1\u05ae\56\0\2\u0381"+
- "\3\0\1\u05af\55\0\2\u0381\4\0\1\u05b0\54\0\2\u0381"+
- "\5\0\1\u05b1\53\0\2\u0381\6\0\1\u05b2\52\0\2\u0381"+
- "\7\0\1\u05b3\51\0\2\u0381\10\0\1\u05b4\50\0\2\u0381"+
- "\11\0\1\u05b5\47\0\2\u0381\12\0\1\u05b6\46\0\2\u0381"+
- "\13\0\1\u05b7\45\0\2\u0381\14\0\1\u05b8\44\0\2\u0381"+
- "\15\0\1\u05b9\43\0\1\u0311\1\u0312\1\0\1\u05ba\57\0"+
- "\1\u0311\1\u0312\2\0\1\u05bb\56\0\1\u0311\1\u0312\3\0"+
- "\1\u05bc\55\0\1\u0311\1\u0312\4\0\1\u05bd\54\0\1\u0311"+
- "\1\u0312\5\0\1\u05be\53\0\1\u0311\1\u0312\6\0\1\u05bf"+
- "\52\0\1\u0311\1\u0312\7\0\1\u05c0\51\0\1\u0311\1\u0312"+
- "\10\0\1\u05c1\50\0\1\u0311\1\u0312\11\0\1\u05c2\47\0"+
- "\1\u0311\1\u0312\12\0\1\u05c3\46\0\1\u0311\1\u0312\13\0"+
- "\1\u05c4\45\0\1\u0311\1\u0312\14\0\1\u05c5\44\0\1\u0311"+
- "\1\u0312\15\0\1\u05c6\43\0\2\u039d\1\0\1\u05c7\57\0"+
- "\2\u039d\2\0\1\u05c8\56\0\2\u039d\3\0\1\u05c9\55\0"+
- "\2\u039d\4\0\1\u05ca\54\0\2\u039d\5\0\1\u05cb\53\0"+
- "\2\u039d\6\0\1\u05cc\52\0\2\u039d\7\0\1\u05cd\51\0"+
- "\2\u039d\10\0\1\u05ce\50\0\2\u039d\11\0\1\u05cf\47\0"+
- "\2\u039d\12\0\1\u05d0\46\0\2\u039d\13\0\1\u05d1\45\0"+
- "\2\u039d\14\0\1\u05d2\44\0\2\u039d\15\0\1\u05d3\42\0"+
- "\1\276\1\u03ab\1\u03ac\1\276\1\u05d4\57\276\1\u03ab\1\u03ac"+
- "\2\276\1\u05d5\56\276\1\u03ab\1\u03ac\3\276\1\u05d6\55\276"+
- "\1\u03ab\1\u03ac\4\276\1\u05d7\54\276\1\u03ab\1\u03ac\5\276"+
- "\1\u05d8\53\276\1\u03ab\1\u03ac\6\276\1\u05d9\52\276\1\u03ab"+
- "\1\u03ac\7\276\1\u05da\51\276\1\u03ab\1\u03ac\10\276\1\u05db"+
- "\50\276\1\u03ab\1\u03ac\11\276\1\u05dc\47\276\1\u03ab\1\u03ac"+
- "\12\276\1\u05dd\46\276\1\u03ab\1\u03ac\13\276\1\u05de\45\276"+
- "\1\u03ab\1\u03ac\14\276\1\u05df\44\276\1\u03ab\1\u03ac\15\276"+
- "\1\u05e0\43\276\1\u033b\1\u033c\1\276\1\u05e1\57\276\1\u033b"+
- "\1\u033c\2\276\1\u05e2\56\276\1\u033b\1\u033c\3\276\1\u05e3"+
- "\55\276\1\u033b\1\u033c\4\276\1\u05e4\54\276\1\u033b\1\u033c"+
- "\5\276\1\u05e5\53\276\1\u033b\1\u033c\6\276\1\u05e6\52\276"+
- "\1\u033b\1\u033c\7\276\1\u05e7\51\276\1\u033b\1\u033c\10\276"+
- "\1\u05e8\50\276\1\u033b\1\u033c\11\276\1\u05e9\47\276\1\u033b"+
- "\1\u033c\12\276\1\u05ea\46\276\1\u033b\1\u033c\13\276\1\u05eb"+
- "\45\276\1\u033b\1\u033c\14\276\1\u05ec\44\276\1\u033b\1\u033c"+
- "\15\276\1\u05ed\43\276\1\300\1\u02bf\1\276\1\u05ee\57\276"+
- "\1\300\1\u02bf\2\276\1\u05ef\55\276\1\263\1\u03c9\1\u03ca"+
- "\1\263\1\u05f0\1\263\1\u0136\55\263\1\u03c9\1\u03ca\2\263"+
- "\1\u05f1\1\u0136\55\263\1\u03c9\1\u03ca\3\263\1\u0136\1\u05f2"+
- "\54\263\1\u03c9\1\u03ca\3\263\1\u0136\1\263\1\u05f3\53\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\2\263\1\u05f4\52\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\3\263\1\u05f5\51\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\4\263\1\u05f6\50\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\5\263\1\u05f7\47\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\6\263\1\u05f8\46\263\1\u03c9\1\u03ca\3\263\1\u0136\7\263"+
- "\1\u05f9\45\263\1\u03c9\1\u03ca\3\263\1\u0136\10\263\1\u05fa"+
- "\44\263\1\u03c9\1\u03ca\3\263\1\u0136\11\263\1\u05fb\42\263"+
- "\1\344\1\u03d7\1\u03d8\1\344\1\u05fc\1\344\1\u017c\55\344"+
- "\1\u03d7\1\u03d8\2\344\1\u05fd\1\u017c\55\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\1\u05fe\54\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\1\344\1\u05ff\53\344\1\u03d7\1\u03d8\3\344\1\u017c\2\344"+
- "\1\u0600\52\344\1\u03d7\1\u03d8\3\344\1\u017c\3\344\1\u0601"+
- "\51\344\1\u03d7\1\u03d8\3\344\1\u017c\4\344\1\u0602\50\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\5\344\1\u0603\47\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\6\344\1\u0604\46\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\7\344\1\u0605\45\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\10\344\1\u0606\44\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\11\344\1\u0607\42\344\1\276\1\300\1\u02bf\3\276\1\u0608"+
- "\55\276\1\300\1\u02bf\4\276\1\u0609\54\276\1\300\1\u02bf"+
- "\5\276\1\u060a\53\276\1\300\1\u02bf\6\276\1\u060b\52\276"+
- "\1\300\1\u02bf\7\276\1\u060c\51\276\1\300\1\u02bf\10\276"+
- "\1\u060d\50\276\1\300\1\u02bf\11\276\1\u060e\47\276\1\300"+
- "\1\u02bf\12\276\1\u060f\46\276\1\300\1\u02bf\13\276\1\u0610"+
- "\45\276\1\300\1\u02bf\14\276\1\u0611\44\276\1\300\1\u02bf"+
- "\15\276\1\u0612\42\276\5\0\1\164\1\0\1\165\1\33"+
- "\4\0\1\33\6\0\1\42\1\u0613\25\42\1\0\1\33"+
- "\1\0\1\42\1\33\1\42\7\0\1\164\1\0\1\165"+
- "\14\0\1\u0614\26\164\3\0\1\164\1\0\1\164\7\0"+
- "\1\164\1\0\1\165\14\0\3\164\1\u0615\23\164\3\0"+
- "\1\164\1\0\1\164\3\0\2\u0381\1\0\1\u0616\57\0"+
- "\2\u0381\2\0\1\u0617\56\0\2\u0381\3\0\1\u0618\55\0"+
- "\2\u0381\4\0\1\u0619\54\0\2\u0381\5\0\1\u061a\53\0"+
- "\2\u0381\6\0\1\u061b\52\0\2\u0381\7\0\1\u061c\51\0"+
- "\2\u0381\10\0\1\u061d\50\0\2\u0381\11\0\1\u061e\47\0"+
- "\2\u0381\12\0\1\u061f\46\0\2\u0381\13\0\1\u0620\45\0"+
- "\2\u0381\14\0\1\u0621\44\0\2\u0381\15\0\1\u0622\43\0"+
- "\1\u0311\1\u0312\1\0\1\u0623\57\0\1\u0311\1\u0312\2\0"+
- "\1\u0624\56\0\1\u0311\1\u0312\3\0\1\u0625\55\0\1\u0311"+
- "\1\u0312\4\0\1\u0626\54\0\1\u0311\1\u0312\5\0\1\u0627"+
- "\53\0\1\u0311\1\u0312\6\0\1\u0628\52\0\1\u0311\1\u0312"+
- "\7\0\1\u0629\51\0\1\u0311\1\u0312\10\0\1\u062a\50\0"+
- "\1\u0311\1\u0312\11\0\1\u062b\47\0\1\u0311\1\u0312\12\0"+
- "\1\u062c\46\0\1\u0311\1\u0312\13\0\1\u062d\45\0\1\u0311"+
- "\1\u0312\14\0\1\u062e\44\0\1\u0311\1\u0312\15\0\1\u062f"+
- "\43\0\2\u039d\1\0\1\u0630\57\0\2\u039d\2\0\1\u0631"+
- "\56\0\2\u039d\3\0\1\u0632\55\0\2\u039d\4\0\1\u0633"+
- "\54\0\2\u039d\5\0\1\u0634\53\0\2\u039d\6\0\1\u0635"+
- "\52\0\2\u039d\7\0\1\u0636\51\0\2\u039d\10\0\1\u0637"+
- "\50\0\2\u039d\11\0\1\u0638\47\0\2\u039d\12\0\1\u0639"+
- "\46\0\2\u039d\13\0\1\u063a\45\0\2\u039d\14\0\1\u063b"+
- "\44\0\2\u039d\15\0\1\u063c\42\0\1\276\1\u03ab\1\u03ac"+
- "\1\276\1\u063d\57\276\1\u03ab\1\u03ac\2\276\1\u063e\56\276"+
- "\1\u03ab\1\u03ac\3\276\1\u063f\55\276\1\u03ab\1\u03ac\4\276"+
- "\1\u0640\54\276\1\u03ab\1\u03ac\5\276\1\u0641\53\276\1\u03ab"+
- "\1\u03ac\6\276\1\u0642\52\276\1\u03ab\1\u03ac\7\276\1\u0643"+
- "\51\276\1\u03ab\1\u03ac\10\276\1\u0644\50\276\1\u03ab\1\u03ac"+
- "\11\276\1\u0645\47\276\1\u03ab\1\u03ac\12\276\1\u0646\46\276"+
- "\1\u03ab\1\u03ac\13\276\1\u0647\45\276\1\u03ab\1\u03ac\14\276"+
- "\1\u0648\44\276\1\u03ab\1\u03ac\15\276\1\u0649\43\276\1\u033b"+
- "\1\u033c\1\276\1\u064a\57\276\1\u033b\1\u033c\2\276\1\u064b"+
- "\56\276\1\u033b\1\u033c\3\276\1\u064c\55\276\1\u033b\1\u033c"+
- "\4\276\1\u064d\54\276\1\u033b\1\u033c\5\276\1\u064e\53\276"+
- "\1\u033b\1\u033c\6\276\1\u064f\52\276\1\u033b\1\u033c\7\276"+
- "\1\u0650\51\276\1\u033b\1\u033c\10\276\1\u0651\50\276\1\u033b"+
- "\1\u033c\11\276\1\u0652\47\276\1\u033b\1\u033c\12\276\1\u0653"+
- "\46\276\1\u033b\1\u033c\13\276\1\u0654\45\276\1\u033b\1\u033c"+
- "\14\276\1\u0655\44\276\1\u033b\1\u033c\15\276\1\u0656\43\276"+
- "\1\300\1\u02bf\1\276\1\u0657\57\276\1\300\1\u02bf\2\276"+
- "\1\u0658\55\276\1\263\1\u03c9\1\u03ca\1\263\1\u0659\1\263"+
- "\1\u0136\55\263\1\u03c9\1\u03ca\2\263\1\u065a\1\u0136\55\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\1\u065b\54\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\1\263\1\u065c\53\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\2\263\1\u065d\52\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\3\263\1\u065e\51\263\1\u03c9\1\u03ca\3\263\1\u0136\4\263"+
- "\1\u065f\50\263\1\u03c9\1\u03ca\3\263\1\u0136\5\263\1\u0660"+
- "\47\263\1\u03c9\1\u03ca\3\263\1\u0136\6\263\1\u0661\46\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\7\263\1\u0662\45\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\10\263\1\u0663\44\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\11\263\1\u0664\42\263\1\344\1\u03d7\1\u03d8"+
- "\1\344\1\u0665\1\344\1\u017c\55\344\1\u03d7\1\u03d8\2\344"+
- "\1\u0666\1\u017c\55\344\1\u03d7\1\u03d8\3\344\1\u017c\1\u0667"+
- "\54\344\1\u03d7\1\u03d8\3\344\1\u017c\1\344\1\u0668\53\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\2\344\1\u0669\52\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\3\344\1\u066a\51\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\4\344\1\u066b\50\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\5\344\1\u066c\47\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\6\344\1\u066d\46\344\1\u03d7\1\u03d8\3\344\1\u017c\7\344"+
- "\1\u066e\45\344\1\u03d7\1\u03d8\3\344\1\u017c\10\344\1\u066f"+
- "\44\344\1\u03d7\1\u03d8\3\344\1\u017c\11\344\1\u0670\42\344"+
- "\1\276\1\300\1\u02bf\3\276\1\u0671\55\276\1\300\1\u02bf"+
- "\4\276\1\u0672\54\276\1\300\1\u02bf\5\276\1\u0673\53\276"+
- "\1\300\1\u02bf\6\276\1\u0674\52\276\1\300\1\u02bf\7\276"+
- "\1\u0675\51\276\1\300\1\u02bf\10\276\1\u0676\50\276\1\300"+
- "\1\u02bf\11\276\1\u0677\47\276\1\300\1\u02bf\12\276\1\u0678"+
- "\46\276\1\300\1\u02bf\13\276\1\u0679\45\276\1\300\1\u02bf"+
- "\14\276\1\u067a\44\276\1\300\1\u02bf\15\276\1\u067b\42\276"+
- "\5\0\1\164\1\0\1\165\1\33\4\0\1\33\6\0"+
- "\2\42\1\u067c\24\42\1\0\1\33\1\0\1\42\1\33"+
- "\1\42\7\0\1\164\1\0\1\165\14\0\22\164\1\u0465"+
- "\4\164\3\0\1\164\1\0\1\164\7\0\1\164\1\0"+
- "\1\165\14\0\7\164\1\u067d\17\164\3\0\1\164\1\0"+
- "\1\164\3\0\2\u0381\1\0\1\u067e\57\0\2\u0381\2\0"+
- "\1\u067f\56\0\2\u0381\3\0\1\u0680\55\0\2\u0381\4\0"+
- "\1\u0681\54\0\2\u0381\5\0\1\u0682\53\0\2\u0381\6\0"+
- "\1\u0683\52\0\2\u0381\7\0\1\u0684\51\0\2\u0381\10\0"+
- "\1\u0685\50\0\2\u0381\11\0\1\u0686\47\0\2\u0381\12\0"+
- "\1\u0687\46\0\2\u0381\13\0\1\u0688\45\0\2\u0381\14\0"+
- "\1\u0689\44\0\2\u0381\15\0\1\u068a\43\0\1\u0311\1\u0312"+
- "\1\0\1\u068b\57\0\1\u0311\1\u0312\2\0\1\u068c\56\0"+
- "\1\u0311\1\u0312\3\0\1\u068d\55\0\1\u0311\1\u0312\4\0"+
- "\1\u068e\54\0\1\u0311\1\u0312\5\0\1\u068f\53\0\1\u0311"+
- "\1\u0312\6\0\1\u0690\52\0\1\u0311\1\u0312\7\0\1\u0691"+
- "\51\0\1\u0311\1\u0312\10\0\1\u0692\50\0\1\u0311\1\u0312"+
- "\11\0\1\u0693\47\0\1\u0311\1\u0312\12\0\1\u0694\46\0"+
- "\1\u0311\1\u0312\13\0\1\u0695\45\0\1\u0311\1\u0312\14\0"+
- "\1\u0696\44\0\1\u0311\1\u0312\15\0\1\u0697\43\0\2\u039d"+
- "\1\0\1\u0698\57\0\2\u039d\2\0\1\u0699\56\0\2\u039d"+
- "\3\0\1\u069a\55\0\2\u039d\4\0\1\u069b\54\0\2\u039d"+
- "\5\0\1\u069c\53\0\2\u039d\6\0\1\u069d\52\0\2\u039d"+
- "\7\0\1\u069e\51\0\2\u039d\10\0\1\u069f\50\0\2\u039d"+
- "\11\0\1\u06a0\47\0\2\u039d\12\0\1\u06a1\46\0\2\u039d"+
- "\13\0\1\u06a2\45\0\2\u039d\14\0\1\u06a3\44\0\2\u039d"+
- "\15\0\1\u06a4\42\0\1\276\1\u03ab\1\u03ac\1\276\1\u06a5"+
- "\57\276\1\u03ab\1\u03ac\2\276\1\u06a6\56\276\1\u03ab\1\u03ac"+
- "\3\276\1\u06a7\55\276\1\u03ab\1\u03ac\4\276\1\u06a8\54\276"+
- "\1\u03ab\1\u03ac\5\276\1\u06a9\53\276\1\u03ab\1\u03ac\6\276"+
- "\1\u06aa\52\276\1\u03ab\1\u03ac\7\276\1\u06ab\51\276\1\u03ab"+
- "\1\u03ac\10\276\1\u06ac\50\276\1\u03ab\1\u03ac\11\276\1\u06ad"+
- "\47\276\1\u03ab\1\u03ac\12\276\1\u06ae\46\276\1\u03ab\1\u03ac"+
- "\13\276\1\u06af\45\276\1\u03ab\1\u03ac\14\276\1\u06b0\44\276"+
- "\1\u03ab\1\u03ac\15\276\1\u06b1\43\276\1\u033b\1\u033c\1\276"+
- "\1\u06b2\57\276\1\u033b\1\u033c\2\276\1\u06b3\56\276\1\u033b"+
- "\1\u033c\3\276\1\u06b4\55\276\1\u033b\1\u033c\4\276\1\u06b5"+
- "\54\276\1\u033b\1\u033c\5\276\1\u06b6\53\276\1\u033b\1\u033c"+
- "\6\276\1\u06b7\52\276\1\u033b\1\u033c\7\276\1\u06b8\51\276"+
- "\1\u033b\1\u033c\10\276\1\u06b9\50\276\1\u033b\1\u033c\11\276"+
- "\1\u06ba\47\276\1\u033b\1\u033c\12\276\1\u06bb\46\276\1\u033b"+
- "\1\u033c\13\276\1\u06bc\45\276\1\u033b\1\u033c\14\276\1\u06bd"+
- "\44\276\1\u033b\1\u033c\15\276\1\u06be\43\276\1\300\1\u02bf"+
- "\1\276\1\u06bf\57\276\1\300\1\u02bf\2\276\1\u06c0\55\276"+
- "\1\263\1\u03c9\1\u03ca\1\263\1\u06c1\1\263\1\u0136\55\263"+
- "\1\u03c9\1\u03ca\2\263\1\u06c2\1\u0136\55\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\1\u06c3\54\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\1\263\1\u06c4\53\263\1\u03c9\1\u03ca\3\263\1\u0136\2\263"+
- "\1\u06c5\52\263\1\u03c9\1\u03ca\3\263\1\u0136\3\263\1\u06c6"+
- "\51\263\1\u03c9\1\u03ca\3\263\1\u0136\4\263\1\u06c7\50\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\5\263\1\u06c8\47\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\6\263\1\u06c9\46\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\7\263\1\u06ca\45\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\10\263\1\u06cb\44\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\11\263\1\u06cc\42\263\1\344\1\u03d7\1\u03d8\1\344\1\u06cd"+
- "\1\344\1\u017c\55\344\1\u03d7\1\u03d8\2\344\1\u06ce\1\u017c"+
- "\55\344\1\u03d7\1\u03d8\3\344\1\u017c\1\u06cf\54\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\1\344\1\u06d0\53\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\2\344\1\u06d1\52\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\3\344\1\u06d2\51\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\4\344\1\u06d3\50\344\1\u03d7\1\u03d8\3\344\1\u017c\5\344"+
- "\1\u06d4\47\344\1\u03d7\1\u03d8\3\344\1\u017c\6\344\1\u06d5"+
- "\46\344\1\u03d7\1\u03d8\3\344\1\u017c\7\344\1\u06d6\45\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\10\344\1\u06d7\44\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\11\344\1\u06d8\42\344\1\276\1\300"+
- "\1\u02bf\3\276\1\u06d9\55\276\1\300\1\u02bf\4\276\1\u06da"+
- "\54\276\1\300\1\u02bf\5\276\1\u06db\53\276\1\300\1\u02bf"+
- "\6\276\1\u06dc\52\276\1\300\1\u02bf\7\276\1\u06dd\51\276"+
- "\1\300\1\u02bf\10\276\1\u06de\50\276\1\300\1\u02bf\11\276"+
- "\1\u06df\47\276\1\300\1\u02bf\12\276\1\u06e0\46\276\1\300"+
- "\1\u02bf\13\276\1\u06e1\45\276\1\300\1\u02bf\14\276\1\u06e2"+
- "\44\276\1\300\1\u02bf\15\276\1\u06e3\42\276\5\0\1\164"+
- "\1\0\1\165\1\33\4\0\1\33\6\0\25\42\1\u06e4"+
- "\1\42\1\0\1\33\1\0\1\42\1\33\1\42\7\0"+
- "\1\164\1\0\1\165\14\0\14\164\1\u06e5\12\164\3\0"+
- "\1\164\1\0\1\164\3\0\2\u0381\1\0\1\u06e6\57\0"+
- "\2\u0381\2\0\1\u06e7\56\0\2\u0381\3\0\1\u06e8\55\0"+
- "\2\u0381\4\0\1\u06e9\54\0\2\u0381\5\0\1\u06ea\53\0"+
- "\2\u0381\6\0\1\u06eb\52\0\2\u0381\7\0\1\u06ec\51\0"+
- "\2\u0381\10\0\1\u06ed\50\0\2\u0381\11\0\1\u06ee\47\0"+
- "\2\u0381\12\0\1\u06ef\46\0\2\u0381\13\0\1\u06f0\45\0"+
- "\2\u0381\14\0\1\u06f1\44\0\2\u0381\15\0\1\u06f2\43\0"+
- "\1\u0311\1\u0312\1\0\1\u06f3\57\0\1\u0311\1\u0312\2\0"+
- "\1\u06f4\56\0\1\u0311\1\u0312\3\0\1\u06f5\55\0\1\u0311"+
- "\1\u0312\4\0\1\u06f6\54\0\1\u0311\1\u0312\5\0\1\u06f7"+
- "\53\0\1\u0311\1\u0312\6\0\1\u06f8\52\0\1\u0311\1\u0312"+
- "\7\0\1\u06f9\51\0\1\u0311\1\u0312\10\0\1\u06fa\50\0"+
- "\1\u0311\1\u0312\11\0\1\u06fb\47\0\1\u0311\1\u0312\12\0"+
- "\1\u06fc\46\0\1\u0311\1\u0312\13\0\1\u06fd\45\0\1\u0311"+
- "\1\u0312\14\0\1\u06fe\44\0\1\u0311\1\u0312\15\0\1\u06ff"+
- "\43\0\2\u039d\1\0\1\u0700\57\0\2\u039d\2\0\1\u0701"+
- "\56\0\2\u039d\3\0\1\u0702\55\0\2\u039d\4\0\1\u0703"+
- "\54\0\2\u039d\5\0\1\u0704\53\0\2\u039d\6\0\1\u0705"+
- "\52\0\2\u039d\7\0\1\u0706\51\0\2\u039d\10\0\1\u0707"+
- "\50\0\2\u039d\11\0\1\u0708\47\0\2\u039d\12\0\1\u0709"+
- "\46\0\2\u039d\13\0\1\u070a\45\0\2\u039d\14\0\1\u070b"+
- "\44\0\2\u039d\15\0\1\u070c\42\0\1\276\1\u03ab\1\u03ac"+
- "\1\276\1\u070d\57\276\1\u03ab\1\u03ac\2\276\1\u070e\56\276"+
- "\1\u03ab\1\u03ac\3\276\1\u070f\55\276\1\u03ab\1\u03ac\4\276"+
- "\1\u0710\54\276\1\u03ab\1\u03ac\5\276\1\u0711\53\276\1\u03ab"+
- "\1\u03ac\6\276\1\u0712\52\276\1\u03ab\1\u03ac\7\276\1\u0713"+
- "\51\276\1\u03ab\1\u03ac\10\276\1\u0714\50\276\1\u03ab\1\u03ac"+
- "\11\276\1\u0715\47\276\1\u03ab\1\u03ac\12\276\1\u0716\46\276"+
- "\1\u03ab\1\u03ac\13\276\1\u0717\45\276\1\u03ab\1\u03ac\14\276"+
- "\1\u0718\44\276\1\u03ab\1\u03ac\15\276\1\u0719\43\276\1\u033b"+
- "\1\u033c\1\276\1\u071a\57\276\1\u033b\1\u033c\2\276\1\u071b"+
- "\56\276\1\u033b\1\u033c\3\276\1\u071c\55\276\1\u033b\1\u033c"+
- "\4\276\1\u071d\54\276\1\u033b\1\u033c\5\276\1\u071e\53\276"+
- "\1\u033b\1\u033c\6\276\1\u071f\52\276\1\u033b\1\u033c\7\276"+
- "\1\u0720\51\276\1\u033b\1\u033c\10\276\1\u0721\50\276\1\u033b"+
- "\1\u033c\11\276\1\u0722\47\276\1\u033b\1\u033c\12\276\1\u0723"+
- "\46\276\1\u033b\1\u033c\13\276\1\u0724\45\276\1\u033b\1\u033c"+
- "\14\276\1\u0725\44\276\1\u033b\1\u033c\15\276\1\u0726\43\276"+
- "\1\300\1\u02bf\1\276\1\u0727\57\276\1\300\1\u02bf\2\276"+
- "\1\u0728\55\276\1\263\1\u03c9\1\u03ca\1\263\1\u0729\1\263"+
- "\1\u0136\55\263\1\u03c9\1\u03ca\2\263\1\u072a\1\u0136\55\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\1\u072b\54\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\1\263\1\u072c\53\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\2\263\1\u072d\52\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\3\263\1\u072e\51\263\1\u03c9\1\u03ca\3\263\1\u0136\4\263"+
- "\1\u072f\50\263\1\u03c9\1\u03ca\3\263\1\u0136\5\263\1\u0730"+
- "\47\263\1\u03c9\1\u03ca\3\263\1\u0136\6\263\1\u0731\46\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\7\263\1\u0732\45\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\10\263\1\u0733\44\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\11\263\1\u0734\42\263\1\344\1\u03d7\1\u03d8"+
- "\1\344\1\u0735\1\344\1\u017c\55\344\1\u03d7\1\u03d8\2\344"+
- "\1\u0736\1\u017c\55\344\1\u03d7\1\u03d8\3\344\1\u017c\1\u0737"+
- "\54\344\1\u03d7\1\u03d8\3\344\1\u017c\1\344\1\u0738\53\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\2\344\1\u0739\52\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\3\344\1\u073a\51\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\4\344\1\u073b\50\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\5\344\1\u073c\47\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\6\344\1\u073d\46\344\1\u03d7\1\u03d8\3\344\1\u017c\7\344"+
- "\1\u073e\45\344\1\u03d7\1\u03d8\3\344\1\u017c\10\344\1\u073f"+
- "\44\344\1\u03d7\1\u03d8\3\344\1\u017c\11\344\1\u0740\42\344"+
- "\1\276\1\300\1\u02bf\3\276\1\u0741\55\276\1\300\1\u02bf"+
- "\4\276\1\u0742\54\276\1\300\1\u02bf\5\276\1\u0743\53\276"+
- "\1\300\1\u02bf\6\276\1\u0744\52\276\1\300\1\u02bf\7\276"+
- "\1\u0745\51\276\1\300\1\u02bf\10\276\1\u0746\50\276\1\300"+
- "\1\u02bf\11\276\1\u0747\47\276\1\300\1\u02bf\12\276\1\u0748"+
- "\46\276\1\300\1\u02bf\13\276\1\u0749\45\276\1\300\1\u02bf"+
- "\14\276\1\u074a\44\276\1\300\1\u02bf\15\276\1\u074b\42\276"+
- "\5\0\1\164\1\0\1\165\1\33\4\0\1\33\6\0"+
- "\1\42\1\u074c\25\42\1\0\1\33\1\0\1\42\1\33"+
- "\1\42\7\0\1\164\1\0\1\165\14\0\21\164\1\u074d"+
- "\5\164\3\0\1\164\1\0\1\164\3\0\2\u0381\1\0"+
- "\1\u074e\57\0\2\u0381\2\0\1\u074f\56\0\2\u0381\3\0"+
- "\1\u0750\55\0\2\u0381\4\0\1\u0751\54\0\2\u0381\5\0"+
- "\1\u0752\53\0\2\u0381\6\0\1\u0753\52\0\2\u0381\7\0"+
- "\1\u0754\51\0\2\u0381\10\0\1\u0755\50\0\2\u0381\11\0"+
- "\1\u0756\47\0\2\u0381\12\0\1\u0757\46\0\2\u0381\13\0"+
- "\1\u0758\45\0\2\u0381\14\0\1\u0759\44\0\2\u0381\15\0"+
- "\1\u075a\43\0\1\u0311\1\u0312\1\0\1\u075b\57\0\1\u0311"+
- "\1\u0312\2\0\1\u075c\56\0\1\u0311\1\u0312\3\0\1\u075d"+
- "\55\0\1\u0311\1\u0312\4\0\1\u075e\54\0\1\u0311\1\u0312"+
- "\5\0\1\u075f\53\0\1\u0311\1\u0312\6\0\1\u0760\52\0"+
- "\1\u0311\1\u0312\7\0\1\u0761\51\0\1\u0311\1\u0312\10\0"+
- "\1\u0762\50\0\1\u0311\1\u0312\11\0\1\u0763\47\0\1\u0311"+
- "\1\u0312\12\0\1\u0764\46\0\1\u0311\1\u0312\13\0\1\u0765"+
- "\45\0\1\u0311\1\u0312\14\0\1\u0766\44\0\1\u0311\1\u0312"+
- "\15\0\1\u0767\43\0\2\u039d\1\0\1\u0768\57\0\2\u039d"+
- "\2\0\1\u0769\56\0\2\u039d\3\0\1\u076a\55\0\2\u039d"+
- "\4\0\1\u076b\54\0\2\u039d\5\0\1\u076c\53\0\2\u039d"+
- "\6\0\1\u076d\52\0\2\u039d\7\0\1\u076e\51\0\2\u039d"+
- "\10\0\1\u076f\50\0\2\u039d\11\0\1\u0770\47\0\2\u039d"+
- "\12\0\1\u0771\46\0\2\u039d\13\0\1\u0772\45\0\2\u039d"+
- "\14\0\1\u0773\44\0\2\u039d\15\0\1\u0774\42\0\1\276"+
- "\1\u03ab\1\u03ac\1\276\1\u0775\57\276\1\u03ab\1\u03ac\2\276"+
- "\1\u0776\56\276\1\u03ab\1\u03ac\3\276\1\u0777\55\276\1\u03ab"+
- "\1\u03ac\4\276\1\u0778\54\276\1\u03ab\1\u03ac\5\276\1\u0779"+
- "\53\276\1\u03ab\1\u03ac\6\276\1\u077a\52\276\1\u03ab\1\u03ac"+
- "\7\276\1\u077b\51\276\1\u03ab\1\u03ac\10\276\1\u077c\50\276"+
- "\1\u03ab\1\u03ac\11\276\1\u077d\47\276\1\u03ab\1\u03ac\12\276"+
- "\1\u077e\46\276\1\u03ab\1\u03ac\13\276\1\u077f\45\276\1\u03ab"+
- "\1\u03ac\14\276\1\u0780\44\276\1\u03ab\1\u03ac\15\276\1\u0781"+
- "\43\276\1\u033b\1\u033c\1\276\1\u0782\57\276\1\u033b\1\u033c"+
- "\2\276\1\u0783\56\276\1\u033b\1\u033c\3\276\1\u0784\55\276"+
- "\1\u033b\1\u033c\4\276\1\u0785\54\276\1\u033b\1\u033c\5\276"+
- "\1\u0786\53\276\1\u033b\1\u033c\6\276\1\u0787\52\276\1\u033b"+
- "\1\u033c\7\276\1\u0788\51\276\1\u033b\1\u033c\10\276\1\u0789"+
- "\50\276\1\u033b\1\u033c\11\276\1\u078a\47\276\1\u033b\1\u033c"+
- "\12\276\1\u078b\46\276\1\u033b\1\u033c\13\276\1\u078c\45\276"+
- "\1\u033b\1\u033c\14\276\1\u078d\44\276\1\u033b\1\u033c\15\276"+
- "\1\u078e\43\276\1\300\1\u02bf\1\276\1\u078f\57\276\1\300"+
- "\1\u02bf\2\276\1\u0790\55\276\1\263\1\u03c9\1\u03ca\1\263"+
- "\1\u0791\1\263\1\u0136\55\263\1\u03c9\1\u03ca\2\263\1\u0792"+
- "\1\u0136\55\263\1\u03c9\1\u03ca\3\263\1\u0136\1\u0793\54\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\1\263\1\u0794\53\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\2\263\1\u0795\52\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\3\263\1\u0796\51\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\4\263\1\u0797\50\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\5\263\1\u0798\47\263\1\u03c9\1\u03ca\3\263\1\u0136\6\263"+
- "\1\u0799\46\263\1\u03c9\1\u03ca\3\263\1\u0136\7\263\1\u079a"+
- "\45\263\1\u03c9\1\u03ca\3\263\1\u0136\10\263\1\u079b\44\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\11\263\1\u079c\42\263\1\344"+
- "\1\u03d7\1\u03d8\1\344\1\u079d\1\344\1\u017c\55\344\1\u03d7"+
- "\1\u03d8\2\344\1\u079e\1\u017c\55\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\1\u079f\54\344\1\u03d7\1\u03d8\3\344\1\u017c\1\344"+
- "\1\u07a0\53\344\1\u03d7\1\u03d8\3\344\1\u017c\2\344\1\u07a1"+
- "\52\344\1\u03d7\1\u03d8\3\344\1\u017c\3\344\1\u07a2\51\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\4\344\1\u07a3\50\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\5\344\1\u07a4\47\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\6\344\1\u07a5\46\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\7\344\1\u07a6\45\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\10\344\1\u07a7\44\344\1\u03d7\1\u03d8\3\344\1\u017c\11\344"+
- "\1\u07a8\42\344\1\276\1\300\1\u02bf\3\276\1\u07a9\55\276"+
- "\1\300\1\u02bf\4\276\1\u07aa\54\276\1\300\1\u02bf\5\276"+
- "\1\u07ab\53\276\1\300\1\u02bf\6\276\1\u07ac\52\276\1\300"+
- "\1\u02bf\7\276\1\u07ad\51\276\1\300\1\u02bf\10\276\1\u07ae"+
- "\50\276\1\300\1\u02bf\11\276\1\u07af\47\276\1\300\1\u02bf"+
- "\12\276\1\u07b0\46\276\1\300\1\u02bf\13\276\1\u07b1\45\276"+
- "\1\300\1\u02bf\14\276\1\u07b2\44\276\1\300\1\u02bf\15\276"+
- "\1\u07b3\42\276\5\0\1\u07b4\1\0\1\165\1\33\4\0"+
- "\1\33\6\0\27\42\1\0\1\33\1\0\1\42\1\33"+
- "\1\42\7\0\1\164\1\0\1\165\14\0\2\164\1\u07b5"+
- "\24\164\3\0\1\164\1\0\1\164\3\0\2\u0381\1\0"+
- "\1\u07b6\57\0\2\u0381\2\0\1\u07b7\56\0\2\u0381\3\0"+
- "\1\u07b8\55\0\2\u0381\4\0\1\u07b9\54\0\2\u0381\5\0"+
- "\1\u07ba\53\0\2\u0381\6\0\1\u07bb\52\0\2\u0381\7\0"+
- "\1\u07bc\51\0\2\u0381\10\0\1\u07bd\50\0\2\u0381\11\0"+
- "\1\u07be\47\0\2\u0381\12\0\1\u07bf\46\0\2\u0381\13\0"+
- "\1\u07c0\45\0\2\u0381\14\0\1\u07c1\44\0\2\u0381\15\0"+
- "\1\u07c2\43\0\1\u0311\1\u0312\1\0\1\u07c3\57\0\1\u0311"+
- "\1\u0312\2\0\1\u07c4\56\0\1\u0311\1\u0312\3\0\1\u07c5"+
- "\55\0\1\u0311\1\u0312\4\0\1\u07c6\54\0\1\u0311\1\u0312"+
- "\5\0\1\u07c7\53\0\1\u0311\1\u0312\6\0\1\u07c8\52\0"+
- "\1\u0311\1\u0312\7\0\1\u07c9\51\0\1\u0311\1\u0312\10\0"+
- "\1\u07ca\50\0\1\u0311\1\u0312\11\0\1\u07cb\47\0\1\u0311"+
- "\1\u0312\12\0\1\u07cc\46\0\1\u0311\1\u0312\13\0\1\u07cd"+
- "\45\0\1\u0311\1\u0312\14\0\1\u07ce\44\0\1\u0311\1\u0312"+
- "\15\0\1\u07cf\43\0\2\u039d\1\0\1\u07d0\57\0\2\u039d"+
- "\2\0\1\u07d1\56\0\2\u039d\3\0\1\u07d2\55\0\2\u039d"+
- "\4\0\1\u07d3\54\0\2\u039d\5\0\1\u07d4\53\0\2\u039d"+
- "\6\0\1\u07d5\52\0\2\u039d\7\0\1\u07d6\51\0\2\u039d"+
- "\10\0\1\u07d7\50\0\2\u039d\11\0\1\u07d8\47\0\2\u039d"+
- "\12\0\1\u07d9\46\0\2\u039d\13\0\1\u07da\45\0\2\u039d"+
- "\14\0\1\u07db\44\0\2\u039d\15\0\1\u07dc\42\0\1\276"+
- "\1\u03ab\1\u03ac\1\276\1\u07dd\57\276\1\u03ab\1\u03ac\2\276"+
- "\1\u07de\56\276\1\u03ab\1\u03ac\3\276\1\u07df\55\276\1\u03ab"+
- "\1\u03ac\4\276\1\u07e0\54\276\1\u03ab\1\u03ac\5\276\1\u07e1"+
- "\53\276\1\u03ab\1\u03ac\6\276\1\u07e2\52\276\1\u03ab\1\u03ac"+
- "\7\276\1\u07e3\51\276\1\u03ab\1\u03ac\10\276\1\u07e4\50\276"+
- "\1\u03ab\1\u03ac\11\276\1\u07e5\47\276\1\u03ab\1\u03ac\12\276"+
- "\1\u07e6\46\276\1\u03ab\1\u03ac\13\276\1\u07e7\45\276\1\u03ab"+
- "\1\u03ac\14\276\1\u07e8\44\276\1\u03ab\1\u03ac\15\276\1\u07e9"+
- "\43\276\1\u033b\1\u033c\1\276\1\u07ea\57\276\1\u033b\1\u033c"+
- "\2\276\1\u07eb\56\276\1\u033b\1\u033c\3\276\1\u07ec\55\276"+
- "\1\u033b\1\u033c\4\276\1\u07ed\54\276\1\u033b\1\u033c\5\276"+
- "\1\u07ee\53\276\1\u033b\1\u033c\6\276\1\u07ef\52\276\1\u033b"+
- "\1\u033c\7\276\1\u07f0\51\276\1\u033b\1\u033c\10\276\1\u07f1"+
- "\50\276\1\u033b\1\u033c\11\276\1\u07f2\47\276\1\u033b\1\u033c"+
- "\12\276\1\u07f3\46\276\1\u033b\1\u033c\13\276\1\u07f4\45\276"+
- "\1\u033b\1\u033c\14\276\1\u07f5\44\276\1\u033b\1\u033c\15\276"+
- "\1\u07f6\43\276\1\300\1\u02bf\1\276\1\u07f7\57\276\1\300"+
- "\1\u02bf\2\276\1\u07f8\55\276\1\263\1\u03c9\1\u03ca\1\263"+
- "\1\u07f9\1\263\1\u0136\55\263\1\u03c9\1\u03ca\2\263\1\u07fa"+
- "\1\u0136\55\263\1\u03c9\1\u03ca\3\263\1\u0136\1\u07fb\54\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\1\263\1\u07fc\53\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\2\263\1\u07fd\52\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\3\263\1\u07fe\51\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\4\263\1\u07ff\50\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\5\263\1\u0800\47\263\1\u03c9\1\u03ca\3\263\1\u0136\6\263"+
- "\1\u0801\46\263\1\u03c9\1\u03ca\3\263\1\u0136\7\263\1\u0802"+
- "\45\263\1\u03c9\1\u03ca\3\263\1\u0136\10\263\1\u0803\44\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\11\263\1\u0804\42\263\1\344"+
- "\1\u03d7\1\u03d8\1\344\1\u0805\1\344\1\u017c\55\344\1\u03d7"+
- "\1\u03d8\2\344\1\u0806\1\u017c\55\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\1\u0807\54\344\1\u03d7\1\u03d8\3\344\1\u017c\1\344"+
- "\1\u0808\53\344\1\u03d7\1\u03d8\3\344\1\u017c\2\344\1\u0809"+
- "\52\344\1\u03d7\1\u03d8\3\344\1\u017c\3\344\1\u080a\51\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\4\344\1\u080b\50\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\5\344\1\u080c\47\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\6\344\1\u080d\46\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\7\344\1\u080e\45\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\10\344\1\u080f\44\344\1\u03d7\1\u03d8\3\344\1\u017c\11\344"+
- "\1\u0810\42\344\1\276\1\300\1\u02bf\3\276\1\u0811\55\276"+
- "\1\300\1\u02bf\4\276\1\u0812\54\276\1\300\1\u02bf\5\276"+
- "\1\u0813\53\276\1\300\1\u02bf\6\276\1\u0814\52\276\1\300"+
- "\1\u02bf\7\276\1\u0815\51\276\1\300\1\u02bf\10\276\1\u0816"+
- "\50\276\1\300\1\u02bf\11\276\1\u0817\47\276\1\300\1\u02bf"+
- "\12\276\1\u0818\46\276\1\300\1\u02bf\13\276\1\u0819\45\276"+
- "\1\300\1\u02bf\14\276\1\u081a\44\276\1\300\1\u02bf\15\276"+
- "\1\u081b\42\276\5\0\1\164\1\0\1\165\14\0\1\164"+
- "\1\u081c\25\164\3\0\1\164\1\0\1\164\7\0\1\164"+
- "\1\0\1\165\14\0\12\164\1\u081d\14\164\3\0\1\164"+
- "\1\0\1\164\3\0\2\u0381\1\0\1\u081e\57\0\2\u0381"+
- "\2\0\1\u081f\56\0\2\u0381\3\0\1\u0820\55\0\2\u0381"+
- "\4\0\1\u0821\54\0\2\u0381\5\0\1\u0822\53\0\2\u0381"+
- "\6\0\1\u0823\52\0\2\u0381\7\0\1\u0824\51\0\2\u0381"+
- "\10\0\1\u0825\50\0\2\u0381\11\0\1\u0826\47\0\2\u0381"+
- "\12\0\1\u0827\46\0\2\u0381\13\0\1\u0828\45\0\2\u0381"+
- "\14\0\1\u0829\44\0\2\u0381\15\0\1\u082a\43\0\1\u0311"+
- "\1\u0312\1\0\1\u082b\57\0\1\u0311\1\u0312\2\0\1\u082c"+
- "\56\0\1\u0311\1\u0312\3\0\1\u082d\55\0\1\u0311\1\u0312"+
- "\4\0\1\u082e\54\0\1\u0311\1\u0312\5\0\1\u082f\53\0"+
- "\1\u0311\1\u0312\6\0\1\u0830\52\0\1\u0311\1\u0312\7\0"+
- "\1\u0831\51\0\1\u0311\1\u0312\10\0\1\u0832\50\0\1\u0311"+
- "\1\u0312\11\0\1\u0833\47\0\1\u0311\1\u0312\12\0\1\u0834"+
- "\46\0\1\u0311\1\u0312\13\0\1\u0835\45\0\1\u0311\1\u0312"+
- "\14\0\1\u0836\44\0\1\u0311\1\u0312\15\0\1\u0837\43\0"+
- "\2\u039d\1\0\1\u0838\57\0\2\u039d\2\0\1\u0839\56\0"+
- "\2\u039d\3\0\1\u083a\55\0\2\u039d\4\0\1\u083b\54\0"+
- "\2\u039d\5\0\1\u083c\53\0\2\u039d\6\0\1\u083d\52\0"+
- "\2\u039d\7\0\1\u083e\51\0\2\u039d\10\0\1\u083f\50\0"+
- "\2\u039d\11\0\1\u0840\47\0\2\u039d\12\0\1\u0841\46\0"+
- "\2\u039d\13\0\1\u0842\45\0\2\u039d\14\0\1\u0843\44\0"+
- "\2\u039d\15\0\1\u0844\42\0\1\276\1\u03ab\1\u03ac\1\276"+
- "\1\u0845\57\276\1\u03ab\1\u03ac\2\276\1\u0846\56\276\1\u03ab"+
- "\1\u03ac\3\276\1\u0847\55\276\1\u03ab\1\u03ac\4\276\1\u0848"+
- "\54\276\1\u03ab\1\u03ac\5\276\1\u0849\53\276\1\u03ab\1\u03ac"+
- "\6\276\1\u084a\52\276\1\u03ab\1\u03ac\7\276\1\u084b\51\276"+
- "\1\u03ab\1\u03ac\10\276\1\u084c\50\276\1\u03ab\1\u03ac\11\276"+
- "\1\u084d\47\276\1\u03ab\1\u03ac\12\276\1\u084e\46\276\1\u03ab"+
- "\1\u03ac\13\276\1\u084f\45\276\1\u03ab\1\u03ac\14\276\1\u0850"+
- "\44\276\1\u03ab\1\u03ac\15\276\1\u0851\43\276\1\u033b\1\u033c"+
- "\1\276\1\u0852\57\276\1\u033b\1\u033c\2\276\1\u0853\56\276"+
- "\1\u033b\1\u033c\3\276\1\u0854\55\276\1\u033b\1\u033c\4\276"+
- "\1\u0855\54\276\1\u033b\1\u033c\5\276\1\u0856\53\276\1\u033b"+
- "\1\u033c\6\276\1\u0857\52\276\1\u033b\1\u033c\7\276\1\u0858"+
- "\51\276\1\u033b\1\u033c\10\276\1\u0859\50\276\1\u033b\1\u033c"+
- "\11\276\1\u085a\47\276\1\u033b\1\u033c\12\276\1\u085b\46\276"+
- "\1\u033b\1\u033c\13\276\1\u085c\45\276\1\u033b\1\u033c\14\276"+
- "\1\u085d\44\276\1\u033b\1\u033c\15\276\1\u085e\43\276\1\300"+
- "\1\u02bf\1\276\1\u085f\57\276\1\300\1\u02bf\2\276\1\u0860"+
- "\55\276\1\263\1\u03c9\1\u03ca\1\263\1\u0861\1\263\1\u0136"+
- "\55\263\1\u03c9\1\u03ca\2\263\1\u0862\1\u0136\55\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\1\u0863\54\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\1\263\1\u0864\53\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\2\263\1\u0865\52\263\1\u03c9\1\u03ca\3\263\1\u0136\3\263"+
- "\1\u0866\51\263\1\u03c9\1\u03ca\3\263\1\u0136\4\263\1\u0867"+
- "\50\263\1\u03c9\1\u03ca\3\263\1\u0136\5\263\1\u0868\47\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\6\263\1\u0869\46\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\7\263\1\u086a\45\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\10\263\1\u086b\44\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\11\263\1\u086c\42\263\1\344\1\u03d7\1\u03d8\1\344"+
- "\1\u086d\1\344\1\u017c\55\344\1\u03d7\1\u03d8\2\344\1\u086e"+
- "\1\u017c\55\344\1\u03d7\1\u03d8\3\344\1\u017c\1\u086f\54\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\1\344\1\u0870\53\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\2\344\1\u0871\52\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\3\344\1\u0872\51\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\4\344\1\u0873\50\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\5\344\1\u0874\47\344\1\u03d7\1\u03d8\3\344\1\u017c\6\344"+
- "\1\u0875\46\344\1\u03d7\1\u03d8\3\344\1\u017c\7\344\1\u0876"+
- "\45\344\1\u03d7\1\u03d8\3\344\1\u017c\10\344\1\u0877\44\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\11\344\1\u0878\42\344\1\276"+
- "\1\300\1\u02bf\3\276\1\u0879\55\276\1\300\1\u02bf\4\276"+
- "\1\u087a\54\276\1\300\1\u02bf\5\276\1\u087b\53\276\1\300"+
- "\1\u02bf\6\276\1\u087c\52\276\1\300\1\u02bf\7\276\1\u087d"+
- "\51\276\1\300\1\u02bf\10\276\1\u087e\50\276\1\300\1\u02bf"+
- "\11\276\1\u087f\47\276\1\300\1\u02bf\12\276\1\u0880\46\276"+
- "\1\300\1\u02bf\13\276\1\u0881\45\276\1\300\1\u02bf\14\276"+
- "\1\u0882\44\276\1\300\1\u02bf\15\276\1\u0883\42\276\5\0"+
- "\1\164\1\0\1\165\14\0\2\164\1\u0884\24\164\3\0"+
+ "\1\0\1\u04dd\1\33\4\0\1\33\6\0\20\42\1\374"+
+ "\6\42\1\0\1\33\1\0\1\42\1\33\1\42\7\0"+
+ "\1\164\1\0\1\165\14\0\1\164\1\u04de\25\164\3\0"+
"\1\164\1\0\1\164\7\0\1\164\1\0\1\165\14\0"+
- "\4\164\1\u0885\22\164\3\0\1\164\1\0\1\164\3\0"+
- "\2\u0381\1\0\1\u0886\57\0\2\u0381\2\0\1\u0887\56\0"+
- "\2\u0381\3\0\1\u0888\55\0\2\u0381\4\0\1\u0889\54\0"+
- "\2\u0381\5\0\1\u088a\53\0\2\u0381\6\0\1\u088b\52\0"+
- "\2\u0381\7\0\1\u088c\51\0\2\u0381\10\0\1\u088d\50\0"+
- "\2\u0381\11\0\1\u088e\47\0\2\u0381\12\0\1\u088f\46\0"+
- "\2\u0381\13\0\1\u0890\45\0\2\u0381\14\0\1\u0891\44\0"+
- "\2\u0381\15\0\1\u0892\43\0\1\u0311\1\u0312\1\0\1\u0893"+
- "\57\0\1\u0311\1\u0312\2\0\1\u0894\56\0\1\u0311\1\u0312"+
- "\3\0\1\u0895\55\0\1\u0311\1\u0312\4\0\1\u0896\54\0"+
- "\1\u0311\1\u0312\5\0\1\u0897\53\0\1\u0311\1\u0312\6\0"+
- "\1\u0898\52\0\1\u0311\1\u0312\7\0\1\u0899\51\0\1\u0311"+
- "\1\u0312\10\0\1\u089a\50\0\1\u0311\1\u0312\11\0\1\u089b"+
- "\47\0\1\u0311\1\u0312\12\0\1\u089c\46\0\1\u0311\1\u0312"+
- "\13\0\1\u089d\45\0\1\u0311\1\u0312\14\0\1\u089e\44\0"+
- "\1\u0311\1\u0312\15\0\1\u089f\43\0\2\u039d\1\0\1\u08a0"+
- "\57\0\2\u039d\2\0\1\u08a1\56\0\2\u039d\3\0\1\u08a2"+
- "\55\0\2\u039d\4\0\1\u08a3\54\0\2\u039d\5\0\1\u08a4"+
- "\53\0\2\u039d\6\0\1\u08a5\52\0\2\u039d\7\0\1\u08a6"+
- "\51\0\2\u039d\10\0\1\u08a7\50\0\2\u039d\11\0\1\u08a8"+
- "\47\0\2\u039d\12\0\1\u08a9\46\0\2\u039d\13\0\1\u08aa"+
- "\45\0\2\u039d\14\0\1\u08ab\44\0\2\u039d\15\0\1\u08ac"+
- "\42\0\1\276\1\u03ab\1\u03ac\1\276\1\u08ad\57\276\1\u03ab"+
- "\1\u03ac\2\276\1\u08ae\56\276\1\u03ab\1\u03ac\3\276\1\u08af"+
- "\55\276\1\u03ab\1\u03ac\4\276\1\u08b0\54\276\1\u03ab\1\u03ac"+
- "\5\276\1\u08b1\53\276\1\u03ab\1\u03ac\6\276\1\u08b2\52\276"+
- "\1\u03ab\1\u03ac\7\276\1\u08b3\51\276\1\u03ab\1\u03ac\10\276"+
- "\1\u08b4\50\276\1\u03ab\1\u03ac\11\276\1\u08b5\47\276\1\u03ab"+
- "\1\u03ac\12\276\1\u08b6\46\276\1\u03ab\1\u03ac\13\276\1\u08b7"+
- "\45\276\1\u03ab\1\u03ac\14\276\1\u08b8\44\276\1\u03ab\1\u03ac"+
- "\15\276\1\u08b9\43\276\1\u033b\1\u033c\1\276\1\u08ba\57\276"+
- "\1\u033b\1\u033c\2\276\1\u08bb\56\276\1\u033b\1\u033c\3\276"+
- "\1\u08bc\55\276\1\u033b\1\u033c\4\276\1\u08bd\54\276\1\u033b"+
- "\1\u033c\5\276\1\u08be\53\276\1\u033b\1\u033c\6\276\1\u08bf"+
- "\52\276\1\u033b\1\u033c\7\276\1\u08c0\51\276\1\u033b\1\u033c"+
- "\10\276\1\u08c1\50\276\1\u033b\1\u033c\11\276\1\u08c2\47\276"+
- "\1\u033b\1\u033c\12\276\1\u08c3\46\276\1\u033b\1\u033c\13\276"+
- "\1\u08c4\45\276\1\u033b\1\u033c\14\276\1\u08c5\44\276\1\u033b"+
- "\1\u033c\15\276\1\u08c6\43\276\1\300\1\u02bf\1\276\1\u08c7"+
- "\57\276\1\300\1\u02bf\2\276\1\u08c8\55\276\1\263\1\u03c9"+
- "\1\u03ca\1\263\1\u08c9\1\263\1\u0136\55\263\1\u03c9\1\u03ca"+
- "\2\263\1\u08ca\1\u0136\55\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\1\u08cb\54\263\1\u03c9\1\u03ca\3\263\1\u0136\1\263\1\u08cc"+
- "\53\263\1\u03c9\1\u03ca\3\263\1\u0136\2\263\1\u08cd\52\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\3\263\1\u08ce\51\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\4\263\1\u08cf\50\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\5\263\1\u08d0\47\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\6\263\1\u08d1\46\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\7\263\1\u08d2\45\263\1\u03c9\1\u03ca\3\263\1\u0136\10\263"+
- "\1\u08d3\44\263\1\u03c9\1\u03ca\3\263\1\u0136\11\263\1\u08d4"+
- "\42\263\1\344\1\u03d7\1\u03d8\1\344\1\u08d5\1\344\1\u017c"+
- "\55\344\1\u03d7\1\u03d8\2\344\1\u08d6\1\u017c\55\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\1\u08d7\54\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\1\344\1\u08d8\53\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\2\344\1\u08d9\52\344\1\u03d7\1\u03d8\3\344\1\u017c\3\344"+
- "\1\u08da\51\344\1\u03d7\1\u03d8\3\344\1\u017c\4\344\1\u08db"+
- "\50\344\1\u03d7\1\u03d8\3\344\1\u017c\5\344\1\u08dc\47\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\6\344\1\u08dd\46\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\7\344\1\u08de\45\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\10\344\1\u08df\44\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\11\344\1\u08e0\42\344\1\276\1\300\1\u02bf\3\276"+
- "\1\u08e1\55\276\1\300\1\u02bf\4\276\1\u08e2\54\276\1\300"+
- "\1\u02bf\5\276\1\u08e3\53\276\1\300\1\u02bf\6\276\1\u08e4"+
- "\52\276\1\300\1\u02bf\7\276\1\u08e5\51\276\1\300\1\u02bf"+
- "\10\276\1\u08e6\50\276\1\300\1\u02bf\11\276\1\u08e7\47\276"+
- "\1\300\1\u02bf\12\276\1\u08e8\46\276\1\300\1\u02bf\13\276"+
- "\1\u08e9\45\276\1\300\1\u02bf\14\276\1\u08ea\44\276\1\300"+
- "\1\u02bf\15\276\1\u08eb\42\276\5\0\1\164\1\0\1\165"+
- "\14\0\20\164\1\u08ec\6\164\3\0\1\164\1\0\1\164"+
- "\7\0\1\164\1\0\1\165\14\0\3\164\1\u08ed\23\164"+
- "\3\0\1\164\1\0\1\164\3\0\2\u0381\1\0\1\u08ee"+
- "\57\0\2\u0381\2\0\1\u08ef\56\0\2\u0381\3\0\1\u08f0"+
- "\55\0\2\u0381\4\0\1\u08f1\54\0\2\u0381\5\0\1\u08f2"+
- "\53\0\2\u0381\6\0\1\u08f3\52\0\2\u0381\7\0\1\u08f4"+
- "\51\0\2\u0381\10\0\1\u08f5\50\0\2\u0381\11\0\1\u08f6"+
- "\47\0\2\u0381\12\0\1\u08f7\46\0\2\u0381\13\0\1\u08f8"+
- "\45\0\2\u0381\14\0\1\u08f9\44\0\2\u0381\15\0\1\u08fa"+
- "\43\0\1\u0311\1\u0312\1\0\1\u08fb\57\0\1\u0311\1\u0312"+
- "\2\0\1\u08fc\56\0\1\u0311\1\u0312\3\0\1\u08fd\55\0"+
- "\1\u0311\1\u0312\4\0\1\u08fe\54\0\1\u0311\1\u0312\5\0"+
- "\1\u08ff\53\0\1\u0311\1\u0312\6\0\1\u0900\52\0\1\u0311"+
- "\1\u0312\7\0\1\u0901\51\0\1\u0311\1\u0312\10\0\1\u0902"+
- "\50\0\1\u0311\1\u0312\11\0\1\u0903\47\0\1\u0311\1\u0312"+
- "\12\0\1\u0904\46\0\1\u0311\1\u0312\13\0\1\u0905\45\0"+
- "\1\u0311\1\u0312\14\0\1\u0906\44\0\1\u0311\1\u0312\15\0"+
- "\1\u0907\43\0\2\u039d\1\0\1\u0908\57\0\2\u039d\2\0"+
- "\1\u0909\56\0\2\u039d\3\0\1\u090a\55\0\2\u039d\4\0"+
- "\1\u090b\54\0\2\u039d\5\0\1\u090c\53\0\2\u039d\6\0"+
- "\1\u090d\52\0\2\u039d\7\0\1\u090e\51\0\2\u039d\10\0"+
- "\1\u090f\50\0\2\u039d\11\0\1\u0910\47\0\2\u039d\12\0"+
- "\1\u0911\46\0\2\u039d\13\0\1\u0912\45\0\2\u039d\14\0"+
- "\1\u0913\44\0\2\u039d\15\0\1\u0914\42\0\1\276\1\u03ab"+
- "\1\u03ac\1\276\1\u0915\57\276\1\u03ab\1\u03ac\2\276\1\u0916"+
- "\56\276\1\u03ab\1\u03ac\3\276\1\u0917\55\276\1\u03ab\1\u03ac"+
- "\4\276\1\u0918\54\276\1\u03ab\1\u03ac\5\276\1\u0919\53\276"+
- "\1\u03ab\1\u03ac\6\276\1\u091a\52\276\1\u03ab\1\u03ac\7\276"+
- "\1\u091b\51\276\1\u03ab\1\u03ac\10\276\1\u091c\50\276\1\u03ab"+
- "\1\u03ac\11\276\1\u091d\47\276\1\u03ab\1\u03ac\12\276\1\u091e"+
- "\46\276\1\u03ab\1\u03ac\13\276\1\u091f\45\276\1\u03ab\1\u03ac"+
- "\14\276\1\u0920\44\276\1\u03ab\1\u03ac\15\276\1\u0921\43\276"+
- "\1\u033b\1\u033c\1\276\1\u0922\57\276\1\u033b\1\u033c\2\276"+
- "\1\u0923\56\276\1\u033b\1\u033c\3\276\1\u0924\55\276\1\u033b"+
- "\1\u033c\4\276\1\u0925\54\276\1\u033b\1\u033c\5\276\1\u0926"+
- "\53\276\1\u033b\1\u033c\6\276\1\u0927\52\276\1\u033b\1\u033c"+
- "\7\276\1\u0928\51\276\1\u033b\1\u033c\10\276\1\u0929\50\276"+
- "\1\u033b\1\u033c\11\276\1\u092a\47\276\1\u033b\1\u033c\12\276"+
- "\1\u092b\46\276\1\u033b\1\u033c\13\276\1\u092c\45\276\1\u033b"+
- "\1\u033c\14\276\1\u092d\44\276\1\u033b\1\u033c\15\276\1\u092e"+
- "\43\276\1\300\1\u02bf\1\276\1\u092f\57\276\1\300\1\u02bf"+
- "\2\276\1\u0930\55\276\1\263\1\u03c9\1\u03ca\1\263\1\u0931"+
- "\1\263\1\u0136\55\263\1\u03c9\1\u03ca\2\263\1\u0932\1\u0136"+
- "\55\263\1\u03c9\1\u03ca\3\263\1\u0136\1\u0933\54\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\1\263\1\u0934\53\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\2\263\1\u0935\52\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\3\263\1\u0936\51\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\4\263\1\u0937\50\263\1\u03c9\1\u03ca\3\263\1\u0136\5\263"+
- "\1\u0938\47\263\1\u03c9\1\u03ca\3\263\1\u0136\6\263\1\u0939"+
- "\46\263\1\u03c9\1\u03ca\3\263\1\u0136\7\263\1\u093a\45\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\10\263\1\u093b\44\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\11\263\1\u093c\42\263\1\344\1\u03d7"+
- "\1\u03d8\1\344\1\u093d\1\344\1\u017c\55\344\1\u03d7\1\u03d8"+
- "\2\344\1\u093e\1\u017c\55\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\1\u093f\54\344\1\u03d7\1\u03d8\3\344\1\u017c\1\344\1\u0940"+
- "\53\344\1\u03d7\1\u03d8\3\344\1\u017c\2\344\1\u0941\52\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\3\344\1\u0942\51\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\4\344\1\u0943\50\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\5\344\1\u0944\47\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\6\344\1\u0945\46\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\7\344\1\u0946\45\344\1\u03d7\1\u03d8\3\344\1\u017c\10\344"+
- "\1\u0947\44\344\1\u03d7\1\u03d8\3\344\1\u017c\11\344\1\u0948"+
- "\42\344\1\276\1\300\1\u02bf\3\276\1\u0949\55\276\1\300"+
- "\1\u02bf\4\276\1\u094a\54\276\1\300\1\u02bf\5\276\1\u094b"+
- "\53\276\1\300\1\u02bf\6\276\1\u094c\52\276\1\300\1\u02bf"+
- "\7\276\1\u094d\51\276\1\300\1\u02bf\10\276\1\u094e\50\276"+
- "\1\300\1\u02bf\11\276\1\u094f\47\276\1\300\1\u02bf\12\276"+
- "\1\u0950\46\276\1\300\1\u02bf\13\276\1\u0951\45\276\1\300"+
- "\1\u02bf\14\276\1\u0952\44\276\1\300\1\u02bf\15\276\1\u0953"+
- "\42\276\5\0\1\164\1\0\1\165\14\0\1\164\1\u0954"+
- "\25\164\3\0\1\164\1\0\1\164\7\0\1\164\1\0"+
- "\1\165\14\0\11\164\1\u0465\15\164\3\0\1\164\1\0"+
- "\1\164\3\0\2\u0381\1\0\1\u0955\57\0\2\u0381\2\0"+
- "\1\u0956\56\0\2\u0381\3\0\1\u0957\55\0\2\u0381\4\0"+
- "\1\u0958\54\0\2\u0381\5\0\1\u0959\53\0\2\u0381\6\0"+
- "\1\u095a\52\0\2\u0381\7\0\1\u095b\51\0\2\u0381\10\0"+
- "\1\u095c\50\0\2\u0381\11\0\1\u095d\47\0\2\u0381\12\0"+
- "\1\u095e\46\0\2\u0381\13\0\1\u095f\45\0\2\u0381\14\0"+
- "\1\u0960\44\0\2\u0381\15\0\1\u0961\43\0\1\u0311\1\u0312"+
- "\1\0\1\u0962\57\0\1\u0311\1\u0312\2\0\1\u0963\56\0"+
- "\1\u0311\1\u0312\3\0\1\u0964\55\0\1\u0311\1\u0312\4\0"+
- "\1\u0965\54\0\1\u0311\1\u0312\5\0\1\u0966\53\0\1\u0311"+
- "\1\u0312\6\0\1\u0967\52\0\1\u0311\1\u0312\7\0\1\u0968"+
- "\51\0\1\u0311\1\u0312\10\0\1\u0969\50\0\1\u0311\1\u0312"+
- "\11\0\1\u096a\47\0\1\u0311\1\u0312\12\0\1\u096b\46\0"+
- "\1\u0311\1\u0312\13\0\1\u096c\45\0\1\u0311\1\u0312\14\0"+
- "\1\u096d\44\0\1\u0311\1\u0312\15\0\1\u096e\43\0\2\u039d"+
- "\1\0\1\u096f\57\0\2\u039d\2\0\1\u0970\56\0\2\u039d"+
- "\3\0\1\u0971\55\0\2\u039d\4\0\1\u0972\54\0\2\u039d"+
- "\5\0\1\u0973\53\0\2\u039d\6\0\1\u0974\52\0\2\u039d"+
- "\7\0\1\u0975\51\0\2\u039d\10\0\1\u0976\50\0\2\u039d"+
- "\11\0\1\u0977\47\0\2\u039d\12\0\1\u0978\46\0\2\u039d"+
- "\13\0\1\u0979\45\0\2\u039d\14\0\1\u097a\44\0\2\u039d"+
- "\15\0\1\u097b\42\0\1\276\1\u03ab\1\u03ac\1\276\1\u097c"+
- "\57\276\1\u03ab\1\u03ac\2\276\1\u097d\56\276\1\u03ab\1\u03ac"+
- "\3\276\1\u097e\55\276\1\u03ab\1\u03ac\4\276\1\u097f\54\276"+
- "\1\u03ab\1\u03ac\5\276\1\u0980\53\276\1\u03ab\1\u03ac\6\276"+
- "\1\u0981\52\276\1\u03ab\1\u03ac\7\276\1\u0982\51\276\1\u03ab"+
- "\1\u03ac\10\276\1\u0983\50\276\1\u03ab\1\u03ac\11\276\1\u0984"+
- "\47\276\1\u03ab\1\u03ac\12\276\1\u0985\46\276\1\u03ab\1\u03ac"+
- "\13\276\1\u0986\45\276\1\u03ab\1\u03ac\14\276\1\u0987\44\276"+
- "\1\u03ab\1\u03ac\15\276\1\u0988\43\276\1\u033b\1\u033c\1\276"+
- "\1\u0989\57\276\1\u033b\1\u033c\2\276\1\u098a\56\276\1\u033b"+
- "\1\u033c\3\276\1\u098b\55\276\1\u033b\1\u033c\4\276\1\u098c"+
- "\54\276\1\u033b\1\u033c\5\276\1\u098d\53\276\1\u033b\1\u033c"+
- "\6\276\1\u098e\52\276\1\u033b\1\u033c\7\276\1\u098f\51\276"+
- "\1\u033b\1\u033c\10\276\1\u0990\50\276\1\u033b\1\u033c\11\276"+
- "\1\u0991\47\276\1\u033b\1\u033c\12\276\1\u0992\46\276\1\u033b"+
- "\1\u033c\13\276\1\u0993\45\276\1\u033b\1\u033c\14\276\1\u0994"+
- "\44\276\1\u033b\1\u033c\15\276\1\u0995\43\276\1\300\1\u02bf"+
- "\1\276\1\u0996\57\276\1\300\1\u02bf\2\276\1\u0997\55\276"+
- "\1\263\1\u03c9\1\u03ca\1\263\1\u0998\1\263\1\u0136\55\263"+
- "\1\u03c9\1\u03ca\2\263\1\u0999\1\u0136\55\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\1\u099a\54\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\1\263\1\u099b\53\263\1\u03c9\1\u03ca\3\263\1\u0136\2\263"+
- "\1\u099c\52\263\1\u03c9\1\u03ca\3\263\1\u0136\3\263\1\u099d"+
- "\51\263\1\u03c9\1\u03ca\3\263\1\u0136\4\263\1\u099e\50\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\5\263\1\u099f\47\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\6\263\1\u09a0\46\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\7\263\1\u09a1\45\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\10\263\1\u09a2\44\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\11\263\1\u09a3\42\263\1\344\1\u03d7\1\u03d8\1\344\1\u09a4"+
- "\1\344\1\u017c\55\344\1\u03d7\1\u03d8\2\344\1\u09a5\1\u017c"+
- "\55\344\1\u03d7\1\u03d8\3\344\1\u017c\1\u09a6\54\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\1\344\1\u09a7\53\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\2\344\1\u09a8\52\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\3\344\1\u09a9\51\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\4\344\1\u09aa\50\344\1\u03d7\1\u03d8\3\344\1\u017c\5\344"+
- "\1\u09ab\47\344\1\u03d7\1\u03d8\3\344\1\u017c\6\344\1\u09ac"+
- "\46\344\1\u03d7\1\u03d8\3\344\1\u017c\7\344\1\u09ad\45\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\10\344\1\u09ae\44\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\11\344\1\u09af\42\344\1\276\1\300"+
- "\1\u02bf\3\276\1\u09b0\55\276\1\300\1\u02bf\4\276\1\u09b1"+
- "\54\276\1\300\1\u02bf\5\276\1\u09b2\53\276\1\300\1\u02bf"+
- "\6\276\1\u09b3\52\276\1\300\1\u02bf\7\276\1\u09b4\51\276"+
- "\1\300\1\u02bf\10\276\1\u09b5\50\276\1\300\1\u02bf\11\276"+
- "\1\u09b6\47\276\1\300\1\u02bf\12\276\1\u09b7\46\276\1\300"+
- "\1\u02bf\13\276\1\u09b8\45\276\1\300\1\u02bf\14\276\1\u09b9"+
- "\44\276\1\300\1\u02bf\15\276\1\u09ba\42\276\5\0\1\u09bb"+
- "\1\0\1\165\14\0\27\164\3\0\1\164\1\0\1\164"+
- "\3\0\2\u0381\1\0\1\u09bc\57\0\2\u0381\2\0\1\u09bd"+
- "\56\0\2\u0381\3\0\1\u09be\55\0\2\u0381\4\0\1\u09bf"+
- "\54\0\2\u0381\5\0\1\u09c0\53\0\2\u0381\6\0\1\u09c1"+
- "\52\0\2\u0381\7\0\1\u09c2\51\0\2\u0381\10\0\1\u09c3"+
- "\50\0\2\u0381\11\0\1\u09c4\47\0\2\u0381\12\0\1\u09c5"+
- "\46\0\2\u0381\13\0\1\u09c6\45\0\2\u0381\14\0\1\u09c7"+
- "\44\0\2\u0381\15\0\1\u09c8\43\0\1\u0311\1\u0312\1\0"+
- "\1\u09c9\57\0\1\u0311\1\u0312\2\0\1\u09ca\56\0\1\u0311"+
- "\1\u0312\3\0\1\u09cb\55\0\1\u0311\1\u0312\4\0\1\u09cc"+
- "\54\0\1\u0311\1\u0312\5\0\1\u09cd\53\0\1\u0311\1\u0312"+
- "\6\0\1\u09ce\52\0\1\u0311\1\u0312\7\0\1\u09cf\51\0"+
- "\1\u0311\1\u0312\10\0\1\u09d0\50\0\1\u0311\1\u0312\11\0"+
- "\1\u09d1\47\0\1\u0311\1\u0312\12\0\1\u09d2\46\0\1\u0311"+
- "\1\u0312\13\0\1\u09d3\45\0\1\u0311\1\u0312\14\0\1\u09d4"+
- "\44\0\1\u0311\1\u0312\15\0\1\u09d5\43\0\2\u039d\1\0"+
- "\1\u09d6\57\0\2\u039d\2\0\1\u09d7\56\0\2\u039d\3\0"+
- "\1\u09d8\55\0\2\u039d\4\0\1\u09d9\54\0\2\u039d\5\0"+
- "\1\u09da\53\0\2\u039d\6\0\1\u09db\52\0\2\u039d\7\0"+
- "\1\u09dc\51\0\2\u039d\10\0\1\u09dd\50\0\2\u039d\11\0"+
- "\1\u09de\47\0\2\u039d\12\0\1\u09df\46\0\2\u039d\13\0"+
- "\1\u09e0\45\0\2\u039d\14\0\1\u09e1\44\0\2\u039d\15\0"+
- "\1\u09e2\42\0\1\276\1\u03ab\1\u03ac\1\276\1\u09e3\57\276"+
- "\1\u03ab\1\u03ac\2\276\1\u09e4\56\276\1\u03ab\1\u03ac\3\276"+
- "\1\u09e5\55\276\1\u03ab\1\u03ac\4\276\1\u09e6\54\276\1\u03ab"+
- "\1\u03ac\5\276\1\u09e7\53\276\1\u03ab\1\u03ac\6\276\1\u09e8"+
- "\52\276\1\u03ab\1\u03ac\7\276\1\u09e9\51\276\1\u03ab\1\u03ac"+
- "\10\276\1\u09ea\50\276\1\u03ab\1\u03ac\11\276\1\u09eb\47\276"+
- "\1\u03ab\1\u03ac\12\276\1\u09ec\46\276\1\u03ab\1\u03ac\13\276"+
- "\1\u09ed\45\276\1\u03ab\1\u03ac\14\276\1\u09ee\44\276\1\u03ab"+
- "\1\u03ac\15\276\1\u09ef\43\276\1\u033b\1\u033c\1\276\1\u09f0"+
- "\57\276\1\u033b\1\u033c\2\276\1\u09f1\56\276\1\u033b\1\u033c"+
- "\3\276\1\u09f2\55\276\1\u033b\1\u033c\4\276\1\u09f3\54\276"+
- "\1\u033b\1\u033c\5\276\1\u09f4\53\276\1\u033b\1\u033c\6\276"+
- "\1\u09f5\52\276\1\u033b\1\u033c\7\276\1\u09f6\51\276\1\u033b"+
- "\1\u033c\10\276\1\u09f7\50\276\1\u033b\1\u033c\11\276\1\u09f8"+
- "\47\276\1\u033b\1\u033c\12\276\1\u09f9\46\276\1\u033b\1\u033c"+
- "\13\276\1\u09fa\45\276\1\u033b\1\u033c\14\276\1\u09fb\44\276"+
- "\1\u033b\1\u033c\15\276\1\u09fc\43\276\1\300\1\u02bf\1\276"+
- "\1\u09fd\57\276\1\300\1\u02bf\2\276\1\u09fe\55\276\1\263"+
- "\1\u03c9\1\u03ca\1\263\1\u09ff\1\263\1\u0136\55\263\1\u03c9"+
- "\1\u03ca\2\263\1\u0a00\1\u0136\55\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\1\u0a01\54\263\1\u03c9\1\u03ca\3\263\1\u0136\1\263"+
- "\1\u0a02\53\263\1\u03c9\1\u03ca\3\263\1\u0136\2\263\1\u0a03"+
- "\52\263\1\u03c9\1\u03ca\3\263\1\u0136\3\263\1\u0a04\51\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\4\263\1\u0a05\50\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\5\263\1\u0a06\47\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\6\263\1\u0a07\46\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\7\263\1\u0a08\45\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\10\263\1\u0a09\44\263\1\u03c9\1\u03ca\3\263\1\u0136\11\263"+
- "\1\u0a0a\42\263\1\344\1\u03d7\1\u03d8\1\344\1\u0a0b\1\344"+
- "\1\u017c\55\344\1\u03d7\1\u03d8\2\344\1\u0a0c\1\u017c\55\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\1\u0a0d\54\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\1\344\1\u0a0e\53\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\2\344\1\u0a0f\52\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\3\344\1\u0a10\51\344\1\u03d7\1\u03d8\3\344\1\u017c\4\344"+
- "\1\u0a11\50\344\1\u03d7\1\u03d8\3\344\1\u017c\5\344\1\u0a12"+
- "\47\344\1\u03d7\1\u03d8\3\344\1\u017c\6\344\1\u0a13\46\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\7\344\1\u0a14\45\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\10\344\1\u0a15\44\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\11\344\1\u0a16\42\344\1\276\1\300\1\u02bf"+
- "\3\276\1\u0a17\55\276\1\300\1\u02bf\4\276\1\u0a18\54\276"+
- "\1\300\1\u02bf\5\276\1\u0a19\53\276\1\300\1\u02bf\6\276"+
- "\1\u0a1a\52\276\1\300\1\u02bf\7\276\1\u0a1b\51\276\1\300"+
- "\1\u02bf\10\276\1\u0a1c\50\276\1\300\1\u02bf\11\276\1\u0a1d"+
- "\47\276\1\300\1\u02bf\12\276\1\u0a1e\46\276\1\300\1\u02bf"+
- "\13\276\1\u0a1f\45\276\1\300\1\u02bf\14\276\1\u0a20\44\276"+
- "\1\300\1\u02bf\15\276\1\u0a21\42\276\5\0\1\164\1\0"+
- "\1\165\14\0\10\164\1\u0a22\16\164\3\0\1\164\1\0"+
- "\1\164\3\0\2\u0381\1\0\1\u0a23\57\0\2\u0381\2\0"+
- "\1\u0a24\56\0\2\u0381\3\0\1\u0a25\55\0\2\u0381\4\0"+
- "\1\u0a26\54\0\2\u0381\5\0\1\u0a27\53\0\2\u0381\6\0"+
- "\1\u0a28\52\0\2\u0381\7\0\1\u0a29\51\0\2\u0381\10\0"+
- "\1\u0a2a\50\0\2\u0381\11\0\1\u0a2b\47\0\2\u0381\12\0"+
- "\1\u0a2c\46\0\2\u0381\13\0\1\u0a2d\45\0\2\u0381\14\0"+
- "\1\u0a2e\44\0\2\u0381\15\0\1\u0a2f\43\0\1\u0311\1\u0312"+
- "\1\0\1\u0a30\57\0\1\u0311\1\u0312\2\0\1\u0a31\56\0"+
- "\1\u0311\1\u0312\3\0\1\u0a32\55\0\1\u0311\1\u0312\4\0"+
- "\1\u0a33\54\0\1\u0311\1\u0312\5\0\1\u0a34\53\0\1\u0311"+
- "\1\u0312\6\0\1\u0a35\52\0\1\u0311\1\u0312\7\0\1\u0a36"+
- "\51\0\1\u0311\1\u0312\10\0\1\u0a37\50\0\1\u0311\1\u0312"+
- "\11\0\1\u0a38\47\0\1\u0311\1\u0312\12\0\1\u0a39\46\0"+
- "\1\u0311\1\u0312\13\0\1\u0a3a\45\0\1\u0311\1\u0312\14\0"+
- "\1\u0a3b\44\0\1\u0311\1\u0312\15\0\1\u0a3c\43\0\2\u039d"+
- "\1\0\1\u0a3d\57\0\2\u039d\2\0\1\u0a3e\56\0\2\u039d"+
- "\3\0\1\u0a3f\55\0\2\u039d\4\0\1\u0a40\54\0\2\u039d"+
- "\5\0\1\u0a41\53\0\2\u039d\6\0\1\u0a42\52\0\2\u039d"+
- "\7\0\1\u0a43\51\0\2\u039d\10\0\1\u0a44\50\0\2\u039d"+
- "\11\0\1\u0a45\47\0\2\u039d\12\0\1\u0a46\46\0\2\u039d"+
- "\13\0\1\u0a47\45\0\2\u039d\14\0\1\u0a48\44\0\2\u039d"+
- "\15\0\1\u0a49\42\0\1\276\1\u03ab\1\u03ac\1\276\1\u0a4a"+
- "\57\276\1\u03ab\1\u03ac\2\276\1\u0a4b\56\276\1\u03ab\1\u03ac"+
- "\3\276\1\u0a4c\55\276\1\u03ab\1\u03ac\4\276\1\u0a4d\54\276"+
- "\1\u03ab\1\u03ac\5\276\1\u0a4e\53\276\1\u03ab\1\u03ac\6\276"+
- "\1\u0a4f\52\276\1\u03ab\1\u03ac\7\276\1\u0a50\51\276\1\u03ab"+
- "\1\u03ac\10\276\1\u0a51\50\276\1\u03ab\1\u03ac\11\276\1\u0a52"+
- "\47\276\1\u03ab\1\u03ac\12\276\1\u0a53\46\276\1\u03ab\1\u03ac"+
- "\13\276\1\u0a54\45\276\1\u03ab\1\u03ac\14\276\1\u0a55\44\276"+
- "\1\u03ab\1\u03ac\15\276\1\u0a56\43\276\1\u033b\1\u033c\1\276"+
- "\1\u0a57\57\276\1\u033b\1\u033c\2\276\1\u0a58\56\276\1\u033b"+
- "\1\u033c\3\276\1\u0a59\55\276\1\u033b\1\u033c\4\276\1\u0a5a"+
- "\54\276\1\u033b\1\u033c\5\276\1\u0a5b\53\276\1\u033b\1\u033c"+
- "\6\276\1\u0a5c\52\276\1\u033b\1\u033c\7\276\1\u0a5d\51\276"+
- "\1\u033b\1\u033c\10\276\1\u0a5e\50\276\1\u033b\1\u033c\11\276"+
- "\1\u0a5f\47\276\1\u033b\1\u033c\12\276\1\u0a60\46\276\1\u033b"+
- "\1\u033c\13\276\1\u0a61\45\276\1\u033b\1\u033c\14\276\1\u0a62"+
- "\44\276\1\u033b\1\u033c\15\276\1\u0a63\43\276\1\300\1\u02bf"+
- "\1\276\1\u0a64\57\276\1\300\1\u02bf\2\276\1\u0a65\55\276"+
- "\1\263\1\u03c9\1\u03ca\1\263\1\u0a66\1\263\1\u0136\55\263"+
- "\1\u03c9\1\u03ca\2\263\1\u0a67\1\u0136\55\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\1\u0a68\54\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\1\263\1\u0a69\53\263\1\u03c9\1\u03ca\3\263\1\u0136\2\263"+
- "\1\u0a6a\52\263\1\u03c9\1\u03ca\3\263\1\u0136\3\263\1\u0a6b"+
- "\51\263\1\u03c9\1\u03ca\3\263\1\u0136\4\263\1\u0a6c\50\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\5\263\1\u0a6d\47\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\6\263\1\u0a6e\46\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\7\263\1\u0a6f\45\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\10\263\1\u0a70\44\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\11\263\1\u0a71\42\263\1\344\1\u03d7\1\u03d8\1\344\1\u0a72"+
- "\1\344\1\u017c\55\344\1\u03d7\1\u03d8\2\344\1\u0a73\1\u017c"+
- "\55\344\1\u03d7\1\u03d8\3\344\1\u017c\1\u0a74\54\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\1\344\1\u0a75\53\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\2\344\1\u0a76\52\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\3\344\1\u0a77\51\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\4\344\1\u0a78\50\344\1\u03d7\1\u03d8\3\344\1\u017c\5\344"+
- "\1\u0a79\47\344\1\u03d7\1\u03d8\3\344\1\u017c\6\344\1\u0a7a"+
- "\46\344\1\u03d7\1\u03d8\3\344\1\u017c\7\344\1\u0a7b\45\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\10\344\1\u0a7c\44\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\11\344\1\u0a7d\42\344\1\276\1\300"+
- "\1\u02bf\3\276\1\u0a7e\55\276\1\300\1\u02bf\4\276\1\u0a7f"+
- "\54\276\1\300\1\u02bf\5\276\1\u0a80\53\276\1\300\1\u02bf"+
- "\6\276\1\u0a81\52\276\1\300\1\u02bf\7\276\1\u0a82\51\276"+
- "\1\300\1\u02bf\10\276\1\u0a83\50\276\1\300\1\u02bf\11\276"+
- "\1\u0a84\47\276\1\300\1\u02bf\12\276\1\u0a85\46\276\1\300"+
- "\1\u02bf\13\276\1\u0a86\45\276\1\300\1\u02bf\14\276\1\u0a87"+
- "\44\276\1\300\1\u02bf\15\276\1\u0a88\42\276\5\0\1\164"+
- "\1\0\1\165\14\0\4\164\1\u0a89\22\164\3\0\1\164"+
- "\1\0\1\164\3\0\2\u0381\1\0\1\u0a8a\57\0\2\u0381"+
- "\2\0\1\u0a8b\56\0\2\u0381\3\0\1\u0a8c\55\0\2\u0381"+
- "\4\0\1\u0a8d\54\0\2\u0381\5\0\1\u0a8e\53\0\2\u0381"+
- "\6\0\1\u0a8f\52\0\2\u0381\7\0\1\u0a90\51\0\2\u0381"+
- "\10\0\1\u0a91\50\0\2\u0381\11\0\1\u0a92\47\0\2\u0381"+
- "\12\0\1\u0a93\46\0\2\u0381\13\0\1\u0a94\45\0\2\u0381"+
- "\14\0\1\u0a95\44\0\2\u0381\15\0\1\u0a96\43\0\1\u0311"+
- "\1\u0312\1\0\1\u0a97\57\0\1\u0311\1\u0312\2\0\1\u0a98"+
- "\56\0\1\u0311\1\u0312\3\0\1\u0a99\55\0\1\u0311\1\u0312"+
- "\4\0\1\u0a9a\54\0\1\u0311\1\u0312\5\0\1\u0a9b\53\0"+
- "\1\u0311\1\u0312\6\0\1\u0a9c\52\0\1\u0311\1\u0312\7\0"+
- "\1\u0a9d\51\0\1\u0311\1\u0312\10\0\1\u0a9e\50\0\1\u0311"+
- "\1\u0312\11\0\1\u0a9f\47\0\1\u0311\1\u0312\12\0\1\u0aa0"+
- "\46\0\1\u0311\1\u0312\13\0\1\u0aa1\45\0\1\u0311\1\u0312"+
- "\14\0\1\u0aa2\44\0\1\u0311\1\u0312\15\0\1\u0aa3\43\0"+
- "\2\u039d\1\0\1\u0aa4\57\0\2\u039d\2\0\1\u0aa5\56\0"+
- "\2\u039d\3\0\1\u0aa6\55\0\2\u039d\4\0\1\u0aa7\54\0"+
- "\2\u039d\5\0\1\u0aa8\53\0\2\u039d\6\0\1\u0aa9\52\0"+
- "\2\u039d\7\0\1\u0aaa\51\0\2\u039d\10\0\1\u0aab\50\0"+
- "\2\u039d\11\0\1\u0aac\47\0\2\u039d\12\0\1\u0aad\46\0"+
- "\2\u039d\13\0\1\u0aae\45\0\2\u039d\14\0\1\u0aaf\44\0"+
- "\2\u039d\15\0\1\u0ab0\42\0\1\276\1\u03ab\1\u03ac\1\276"+
- "\1\u0ab1\57\276\1\u03ab\1\u03ac\2\276\1\u0ab2\56\276\1\u03ab"+
- "\1\u03ac\3\276\1\u0ab3\55\276\1\u03ab\1\u03ac\4\276\1\u0ab4"+
- "\54\276\1\u03ab\1\u03ac\5\276\1\u0ab5\53\276\1\u03ab\1\u03ac"+
- "\6\276\1\u0ab6\52\276\1\u03ab\1\u03ac\7\276\1\u0ab7\51\276"+
- "\1\u03ab\1\u03ac\10\276\1\u0ab8\50\276\1\u03ab\1\u03ac\11\276"+
- "\1\u0ab9\47\276\1\u03ab\1\u03ac\12\276\1\u0aba\46\276\1\u03ab"+
- "\1\u03ac\13\276\1\u0abb\45\276\1\u03ab\1\u03ac\14\276\1\u0abc"+
- "\44\276\1\u03ab\1\u03ac\15\276\1\u0abd\43\276\1\u033b\1\u033c"+
- "\1\276\1\u0abe\57\276\1\u033b\1\u033c\2\276\1\u0abf\56\276"+
- "\1\u033b\1\u033c\3\276\1\u0ac0\55\276\1\u033b\1\u033c\4\276"+
- "\1\u0ac1\54\276\1\u033b\1\u033c\5\276\1\u0ac2\53\276\1\u033b"+
- "\1\u033c\6\276\1\u0ac3\52\276\1\u033b\1\u033c\7\276\1\u0ac4"+
- "\51\276\1\u033b\1\u033c\10\276\1\u0ac5\50\276\1\u033b\1\u033c"+
- "\11\276\1\u0ac6\47\276\1\u033b\1\u033c\12\276\1\u0ac7\46\276"+
- "\1\u033b\1\u033c\13\276\1\u0ac8\45\276\1\u033b\1\u033c\14\276"+
- "\1\u0ac9\44\276\1\u033b\1\u033c\15\276\1\u0aca\43\276\1\300"+
- "\1\u02bf\1\276\1\u0acb\57\276\1\300\1\u02bf\2\276\1\u0acc"+
- "\55\276\1\263\1\u03c9\1\u03ca\1\263\1\u0acd\1\263\1\u0136"+
- "\55\263\1\u03c9\1\u03ca\2\263\1\u0ace\1\u0136\55\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\1\u0acf\54\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\1\263\1\u0ad0\53\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\2\263\1\u0ad1\52\263\1\u03c9\1\u03ca\3\263\1\u0136\3\263"+
- "\1\u0ad2\51\263\1\u03c9\1\u03ca\3\263\1\u0136\4\263\1\u0ad3"+
- "\50\263\1\u03c9\1\u03ca\3\263\1\u0136\5\263\1\u0ad4\47\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\6\263\1\u0ad5\46\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\7\263\1\u0ad6\45\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\10\263\1\u0ad7\44\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\11\263\1\u0ad8\42\263\1\344\1\u03d7\1\u03d8\1\344"+
- "\1\u0ad9\1\344\1\u017c\55\344\1\u03d7\1\u03d8\2\344\1\u0ada"+
- "\1\u017c\55\344\1\u03d7\1\u03d8\3\344\1\u017c\1\u0adb\54\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\1\344\1\u0adc\53\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\2\344\1\u0add\52\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\3\344\1\u0ade\51\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\4\344\1\u0adf\50\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\5\344\1\u0ae0\47\344\1\u03d7\1\u03d8\3\344\1\u017c\6\344"+
- "\1\u0ae1\46\344\1\u03d7\1\u03d8\3\344\1\u017c\7\344\1\u0ae2"+
- "\45\344\1\u03d7\1\u03d8\3\344\1\u017c\10\344\1\u0ae3\44\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\11\344\1\u0ae4\42\344\1\276"+
- "\1\300\1\u02bf\3\276\1\u0ae5\55\276\1\300\1\u02bf\4\276"+
- "\1\u0ae6\54\276\1\300\1\u02bf\5\276\1\u0ae7\53\276\1\300"+
- "\1\u02bf\6\276\1\u0ae8\52\276\1\300\1\u02bf\7\276\1\u0ae9"+
- "\51\276\1\300\1\u02bf\10\276\1\u0aea\50\276\1\300\1\u02bf"+
- "\11\276\1\u0aeb\47\276\1\300\1\u02bf\12\276\1\u0aec\46\276"+
- "\1\300\1\u02bf\13\276\1\u0aed\45\276\1\300\1\u02bf\14\276"+
- "\1\u0aee\44\276\1\300\1\u02bf\15\276\1\u0aef\42\276\5\0"+
- "\1\164\1\0\1\165\14\0\12\164\1\u0af0\14\164\3\0"+
- "\1\164\1\0\1\164\3\0\2\u0381\1\0\1\u0af1\57\0"+
- "\2\u0381\2\0\1\u0af2\56\0\2\u0381\3\0\1\u0af3\55\0"+
- "\2\u0381\4\0\1\u0af4\54\0\2\u0381\5\0\1\u0af5\53\0"+
- "\2\u0381\6\0\1\u0af6\52\0\2\u0381\7\0\1\u0af7\51\0"+
- "\2\u0381\10\0\1\u0af8\50\0\2\u0381\11\0\1\u0af9\47\0"+
- "\2\u0381\12\0\1\u0afa\46\0\2\u0381\13\0\1\u0afb\45\0"+
- "\2\u0381\14\0\1\u0afc\44\0\2\u0381\15\0\1\u0afd\43\0"+
- "\1\u0311\1\u0312\1\0\1\u0afe\57\0\1\u0311\1\u0312\2\0"+
- "\1\u0aff\56\0\1\u0311\1\u0312\3\0\1\u0b00\55\0\1\u0311"+
- "\1\u0312\4\0\1\u0b01\54\0\1\u0311\1\u0312\5\0\1\u0b02"+
- "\53\0\1\u0311\1\u0312\6\0\1\u0b03\52\0\1\u0311\1\u0312"+
- "\7\0\1\u0b04\51\0\1\u0311\1\u0312\10\0\1\u0b05\50\0"+
- "\1\u0311\1\u0312\11\0\1\u0b06\47\0\1\u0311\1\u0312\12\0"+
- "\1\u0b07\46\0\1\u0311\1\u0312\13\0\1\u0b08\45\0\1\u0311"+
- "\1\u0312\14\0\1\u0b09\44\0\1\u0311\1\u0312\15\0\1\u0b0a"+
- "\43\0\2\u039d\1\0\1\u0b0b\57\0\2\u039d\2\0\1\u0b0c"+
- "\56\0\2\u039d\3\0\1\u0b0d\55\0\2\u039d\4\0\1\u0b0e"+
- "\54\0\2\u039d\5\0\1\u0b0f\53\0\2\u039d\6\0\1\u0b10"+
- "\52\0\2\u039d\7\0\1\u0b11\51\0\2\u039d\10\0\1\u0b12"+
- "\50\0\2\u039d\11\0\1\u0b13\47\0\2\u039d\12\0\1\u0b14"+
- "\46\0\2\u039d\13\0\1\u0b15\45\0\2\u039d\14\0\1\u0b16"+
- "\44\0\2\u039d\15\0\1\u0b17\42\0\1\276\1\u03ab\1\u03ac"+
- "\1\276\1\u0b18\57\276\1\u03ab\1\u03ac\2\276\1\u0b19\56\276"+
- "\1\u03ab\1\u03ac\3\276\1\u0b1a\55\276\1\u03ab\1\u03ac\4\276"+
- "\1\u0b1b\54\276\1\u03ab\1\u03ac\5\276\1\u0b1c\53\276\1\u03ab"+
- "\1\u03ac\6\276\1\u0b1d\52\276\1\u03ab\1\u03ac\7\276\1\u0b1e"+
- "\51\276\1\u03ab\1\u03ac\10\276\1\u0b1f\50\276\1\u03ab\1\u03ac"+
- "\11\276\1\u0b20\47\276\1\u03ab\1\u03ac\12\276\1\u0b21\46\276"+
- "\1\u03ab\1\u03ac\13\276\1\u0b22\45\276\1\u03ab\1\u03ac\14\276"+
- "\1\u0b23\44\276\1\u03ab\1\u03ac\15\276\1\u0b24\43\276\1\u033b"+
- "\1\u033c\1\276\1\u0b25\57\276\1\u033b\1\u033c\2\276\1\u0b26"+
- "\56\276\1\u033b\1\u033c\3\276\1\u0b27\55\276\1\u033b\1\u033c"+
- "\4\276\1\u0b28\54\276\1\u033b\1\u033c\5\276\1\u0b29\53\276"+
- "\1\u033b\1\u033c\6\276\1\u0b2a\52\276\1\u033b\1\u033c\7\276"+
- "\1\u0b2b\51\276\1\u033b\1\u033c\10\276\1\u0b2c\50\276\1\u033b"+
- "\1\u033c\11\276\1\u0b2d\47\276\1\u033b\1\u033c\12\276\1\u0b2e"+
- "\46\276\1\u033b\1\u033c\13\276\1\u0b2f\45\276\1\u033b\1\u033c"+
- "\14\276\1\u0b30\44\276\1\u033b\1\u033c\15\276\1\u0b31\43\276"+
- "\1\300\1\u02bf\1\276\1\u0b32\57\276\1\300\1\u02bf\2\276"+
- "\1\u0b33\55\276\1\263\1\u03c9\1\u03ca\1\263\1\u0b34\1\263"+
- "\1\u0136\55\263\1\u03c9\1\u03ca\2\263\1\u0b35\1\u0136\55\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\1\u0b36\54\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\1\263\1\u0b37\53\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\2\263\1\u0b38\52\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\3\263\1\u0b39\51\263\1\u03c9\1\u03ca\3\263\1\u0136\4\263"+
- "\1\u0b3a\50\263\1\u03c9\1\u03ca\3\263\1\u0136\5\263\1\u0b3b"+
- "\47\263\1\u03c9\1\u03ca\3\263\1\u0136\6\263\1\u0b3c\46\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\7\263\1\u0b3d\45\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\10\263\1\u0b3e\44\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\11\263\1\u0b3f\42\263\1\344\1\u03d7\1\u03d8"+
- "\1\344\1\u0b40\1\344\1\u017c\55\344\1\u03d7\1\u03d8\2\344"+
- "\1\u0b41\1\u017c\55\344\1\u03d7\1\u03d8\3\344\1\u017c\1\u0b42"+
- "\54\344\1\u03d7\1\u03d8\3\344\1\u017c\1\344\1\u0b43\53\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\2\344\1\u0b44\52\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\3\344\1\u0b45\51\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\4\344\1\u0b46\50\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\5\344\1\u0b47\47\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\6\344\1\u0b48\46\344\1\u03d7\1\u03d8\3\344\1\u017c\7\344"+
- "\1\u0b49\45\344\1\u03d7\1\u03d8\3\344\1\u017c\10\344\1\u0b4a"+
- "\44\344\1\u03d7\1\u03d8\3\344\1\u017c\11\344\1\u0b4b\42\344"+
- "\1\276\1\300\1\u02bf\3\276\1\u0b4c\55\276\1\300\1\u02bf"+
- "\4\276\1\u0b4d\54\276\1\300\1\u02bf\5\276\1\u0b4e\53\276"+
- "\1\300\1\u02bf\6\276\1\u0b4f\52\276\1\300\1\u02bf\7\276"+
- "\1\u0b50\51\276\1\300\1\u02bf\10\276\1\u0b51\50\276\1\300"+
- "\1\u02bf\11\276\1\u0b52\47\276\1\300\1\u02bf\12\276\1\u0b53"+
- "\46\276\1\300\1\u02bf\13\276\1\u0b54\45\276\1\300\1\u02bf"+
- "\14\276\1\u0b55\44\276\1\300\1\u02bf\15\276\1\u0b56\42\276"+
- "\5\0\1\164\1\0\1\165\14\0\2\164\1\u0b57\24\164"+
- "\3\0\1\164\1\0\1\164\3\0\2\u0381\1\0\1\u0b58"+
- "\57\0\2\u0381\2\0\1\u0b59\56\0\2\u0381\3\0\1\u0b5a"+
- "\55\0\2\u0381\4\0\1\u0b5b\54\0\2\u0381\5\0\1\u0b5c"+
- "\53\0\2\u0381\6\0\1\u0b5d\52\0\2\u0381\7\0\1\u0b5e"+
- "\51\0\2\u0381\10\0\1\u0b5f\50\0\2\u0381\11\0\1\u0b60"+
- "\47\0\2\u0381\12\0\1\u0b61\46\0\2\u0381\13\0\1\u0b62"+
- "\45\0\2\u0381\14\0\1\u0b63\44\0\2\u0381\15\0\1\u0b64"+
- "\43\0\1\u0311\1\u0312\1\0\1\u0b65\57\0\1\u0311\1\u0312"+
- "\2\0\1\u0b66\56\0\1\u0311\1\u0312\3\0\1\u0b67\55\0"+
- "\1\u0311\1\u0312\4\0\1\u0b68\54\0\1\u0311\1\u0312\5\0"+
- "\1\u0b69\53\0\1\u0311\1\u0312\6\0\1\u0b6a\52\0\1\u0311"+
- "\1\u0312\7\0\1\u0b6b\51\0\1\u0311\1\u0312\10\0\1\u0b6c"+
- "\50\0\1\u0311\1\u0312\11\0\1\u0b6d\47\0\1\u0311\1\u0312"+
- "\12\0\1\u0b6e\46\0\1\u0311\1\u0312\13\0\1\u0b6f\45\0"+
- "\1\u0311\1\u0312\14\0\1\u0b70\44\0\1\u0311\1\u0312\15\0"+
- "\1\u0b71\43\0\2\u039d\1\0\1\u0b72\57\0\2\u039d\2\0"+
- "\1\u0b73\56\0\2\u039d\3\0\1\u0b74\55\0\2\u039d\4\0"+
- "\1\u0b75\54\0\2\u039d\5\0\1\u0b76\53\0\2\u039d\6\0"+
- "\1\u0b77\52\0\2\u039d\7\0\1\u0b78\51\0\2\u039d\10\0"+
- "\1\u0b79\50\0\2\u039d\11\0\1\u0b7a\47\0\2\u039d\12\0"+
- "\1\u0b7b\46\0\2\u039d\13\0\1\u0b7c\45\0\2\u039d\14\0"+
- "\1\u0b7d\44\0\2\u039d\15\0\1\u0b7e\42\0\1\276\1\u03ab"+
- "\1\u03ac\1\276\1\u0b7f\57\276\1\u03ab\1\u03ac\2\276\1\u0b80"+
- "\56\276\1\u03ab\1\u03ac\3\276\1\u0b81\55\276\1\u03ab\1\u03ac"+
- "\4\276\1\u0b82\54\276\1\u03ab\1\u03ac\5\276\1\u0b83\53\276"+
- "\1\u03ab\1\u03ac\6\276\1\u0b84\52\276\1\u03ab\1\u03ac\7\276"+
- "\1\u0b85\51\276\1\u03ab\1\u03ac\10\276\1\u0b86\50\276\1\u03ab"+
- "\1\u03ac\11\276\1\u0b87\47\276\1\u03ab\1\u03ac\12\276\1\u0b88"+
- "\46\276\1\u03ab\1\u03ac\13\276\1\u0b89\45\276\1\u03ab\1\u03ac"+
- "\14\276\1\u0b8a\44\276\1\u03ab\1\u03ac\15\276\1\u0b8b\43\276"+
- "\1\u033b\1\u033c\1\276\1\u0b8c\57\276\1\u033b\1\u033c\2\276"+
- "\1\u0b8d\56\276\1\u033b\1\u033c\3\276\1\u0b8e\55\276\1\u033b"+
- "\1\u033c\4\276\1\u0b8f\54\276\1\u033b\1\u033c\5\276\1\u0b90"+
- "\53\276\1\u033b\1\u033c\6\276\1\u0b91\52\276\1\u033b\1\u033c"+
- "\7\276\1\u0b92\51\276\1\u033b\1\u033c\10\276\1\u0b93\50\276"+
- "\1\u033b\1\u033c\11\276\1\u0b94\47\276\1\u033b\1\u033c\12\276"+
- "\1\u0b95\46\276\1\u033b\1\u033c\13\276\1\u0b96\45\276\1\u033b"+
- "\1\u033c\14\276\1\u0b97\44\276\1\u033b\1\u033c\15\276\1\u0b98"+
- "\43\276\1\300\1\u02bf\1\276\1\u0b99\57\276\1\300\1\u02bf"+
- "\2\276\1\u0b9a\55\276\1\263\1\u03c9\1\u03ca\1\263\1\u0b9b"+
- "\1\263\1\u0136\55\263\1\u03c9\1\u03ca\2\263\1\u0b9c\1\u0136"+
- "\55\263\1\u03c9\1\u03ca\3\263\1\u0136\1\u0b9d\54\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\1\263\1\u0b9e\53\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\2\263\1\u0b9f\52\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\3\263\1\u0ba0\51\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\4\263\1\u0ba1\50\263\1\u03c9\1\u03ca\3\263\1\u0136\5\263"+
- "\1\u0ba2\47\263\1\u03c9\1\u03ca\3\263\1\u0136\6\263\1\u0ba3"+
- "\46\263\1\u03c9\1\u03ca\3\263\1\u0136\7\263\1\u0ba4\45\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\10\263\1\u0ba5\44\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\11\263\1\u0ba6\42\263\1\344\1\u03d7"+
- "\1\u03d8\1\344\1\u0ba7\1\344\1\u017c\55\344\1\u03d7\1\u03d8"+
- "\2\344\1\u0ba8\1\u017c\55\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\1\u0ba9\54\344\1\u03d7\1\u03d8\3\344\1\u017c\1\344\1\u0baa"+
- "\53\344\1\u03d7\1\u03d8\3\344\1\u017c\2\344\1\u0bab\52\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\3\344\1\u0bac\51\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\4\344\1\u0bad\50\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\5\344\1\u0bae\47\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\6\344\1\u0baf\46\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\7\344\1\u0bb0\45\344\1\u03d7\1\u03d8\3\344\1\u017c\10\344"+
- "\1\u0bb1\44\344\1\u03d7\1\u03d8\3\344\1\u017c\11\344\1\u0bb2"+
- "\42\344\1\276\1\300\1\u02bf\3\276\1\u0bb3\55\276\1\300"+
- "\1\u02bf\4\276\1\u0bb4\54\276\1\300\1\u02bf\5\276\1\u0bb5"+
- "\53\276\1\300\1\u02bf\6\276\1\u0bb6\52\276\1\300\1\u02bf"+
- "\7\276\1\u0bb7\51\276\1\300\1\u02bf\10\276\1\u0bb8\50\276"+
- "\1\300\1\u02bf\11\276\1\u0bb9\47\276\1\300\1\u02bf\12\276"+
- "\1\u0bba\46\276\1\300\1\u02bf\13\276\1\u0bbb\45\276\1\300"+
- "\1\u02bf\14\276\1\u0bbc\44\276\1\300\1\u02bf\15\276\1\u0bbd"+
- "\42\276\5\0\1\164\1\0\1\165\14\0\6\164\1\u0bbe"+
- "\20\164\3\0\1\164\1\0\1\164\3\0\2\u0381\1\0"+
- "\1\u0bbf\57\0\2\u0381\2\0\1\u0bc0\56\0\2\u0381\3\0"+
- "\1\u0bc1\55\0\2\u0381\4\0\1\u0bc2\54\0\2\u0381\5\0"+
- "\1\u0bc3\53\0\2\u0381\6\0\1\u0bc4\52\0\2\u0381\7\0"+
- "\1\u0bc5\51\0\2\u0381\10\0\1\u0bc6\50\0\2\u0381\11\0"+
- "\1\u0bc7\47\0\2\u0381\12\0\1\u0bc8\46\0\2\u0381\13\0"+
- "\1\u0bc9\45\0\2\u0381\14\0\1\u0bca\44\0\2\u0381\15\0"+
- "\1\u0bcb\43\0\1\u0311\1\u0312\1\0\1\u0bcc\57\0\1\u0311"+
- "\1\u0312\2\0\1\u0bcd\56\0\1\u0311\1\u0312\3\0\1\u0bce"+
- "\55\0\1\u0311\1\u0312\4\0\1\u0bcf\54\0\1\u0311\1\u0312"+
- "\5\0\1\u0bd0\53\0\1\u0311\1\u0312\6\0\1\u0bd1\52\0"+
- "\1\u0311\1\u0312\7\0\1\u0bd2\51\0\1\u0311\1\u0312\10\0"+
- "\1\u0bd3\50\0\1\u0311\1\u0312\11\0\1\u0bd4\47\0\1\u0311"+
- "\1\u0312\12\0\1\u0bd5\46\0\1\u0311\1\u0312\13\0\1\u0bd6"+
- "\45\0\1\u0311\1\u0312\14\0\1\u0bd7\44\0\1\u0311\1\u0312"+
- "\15\0\1\u0bd8\43\0\2\u039d\1\0\1\u0bd9\57\0\2\u039d"+
- "\2\0\1\u0bda\56\0\2\u039d\3\0\1\u0bdb\55\0\2\u039d"+
- "\4\0\1\u0bdc\54\0\2\u039d\5\0\1\u0bdd\53\0\2\u039d"+
- "\6\0\1\u0bde\52\0\2\u039d\7\0\1\u0bdf\51\0\2\u039d"+
- "\10\0\1\u0be0\50\0\2\u039d\11\0\1\u0be1\47\0\2\u039d"+
- "\12\0\1\u0be2\46\0\2\u039d\13\0\1\u0be3\45\0\2\u039d"+
- "\14\0\1\u0be4\44\0\2\u039d\15\0\1\u0be5\42\0\1\276"+
- "\1\u03ab\1\u03ac\1\276\1\u0be6\57\276\1\u03ab\1\u03ac\2\276"+
- "\1\u0be7\56\276\1\u03ab\1\u03ac\3\276\1\u0be8\55\276\1\u03ab"+
- "\1\u03ac\4\276\1\u0be9\54\276\1\u03ab\1\u03ac\5\276\1\u0bea"+
- "\53\276\1\u03ab\1\u03ac\6\276\1\u0beb\52\276\1\u03ab\1\u03ac"+
- "\7\276\1\u0bec\51\276\1\u03ab\1\u03ac\10\276\1\u0bed\50\276"+
- "\1\u03ab\1\u03ac\11\276\1\u0bee\47\276\1\u03ab\1\u03ac\12\276"+
- "\1\u0bef\46\276\1\u03ab\1\u03ac\13\276\1\u0bf0\45\276\1\u03ab"+
- "\1\u03ac\14\276\1\u0bf1\44\276\1\u03ab\1\u03ac\15\276\1\u0bf2"+
- "\43\276\1\u033b\1\u033c\1\276\1\u0bf3\57\276\1\u033b\1\u033c"+
- "\2\276\1\u0bf4\56\276\1\u033b\1\u033c\3\276\1\u0bf5\55\276"+
- "\1\u033b\1\u033c\4\276\1\u0bf6\54\276\1\u033b\1\u033c\5\276"+
- "\1\u0bf7\53\276\1\u033b\1\u033c\6\276\1\u0bf8\52\276\1\u033b"+
- "\1\u033c\7\276\1\u0bf9\51\276\1\u033b\1\u033c\10\276\1\u0bfa"+
- "\50\276\1\u033b\1\u033c\11\276\1\u0bfb\47\276\1\u033b\1\u033c"+
- "\12\276\1\u0bfc\46\276\1\u033b\1\u033c\13\276\1\u0bfd\45\276"+
- "\1\u033b\1\u033c\14\276\1\u0bfe\44\276\1\u033b\1\u033c\15\276"+
- "\1\u0bff\43\276\1\300\1\u02bf\1\276\1\u0c00\57\276\1\300"+
- "\1\u02bf\2\276\1\u0c01\55\276\1\263\1\u03c9\1\u03ca\1\263"+
- "\1\u0c02\1\263\1\u0136\55\263\1\u03c9\1\u03ca\2\263\1\u0c03"+
- "\1\u0136\55\263\1\u03c9\1\u03ca\3\263\1\u0136\1\u0c04\54\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\1\263\1\u0c05\53\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\2\263\1\u0c06\52\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\3\263\1\u0c07\51\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\4\263\1\u0c08\50\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\5\263\1\u0c09\47\263\1\u03c9\1\u03ca\3\263\1\u0136\6\263"+
- "\1\u0c0a\46\263\1\u03c9\1\u03ca\3\263\1\u0136\7\263\1\u0c0b"+
- "\45\263\1\u03c9\1\u03ca\3\263\1\u0136\10\263\1\u0c0c\44\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\11\263\1\u0c0d\42\263\1\344"+
- "\1\u03d7\1\u03d8\1\344\1\u0c0e\1\344\1\u017c\55\344\1\u03d7"+
- "\1\u03d8\2\344\1\u0c0f\1\u017c\55\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\1\u0c10\54\344\1\u03d7\1\u03d8\3\344\1\u017c\1\344"+
- "\1\u0c11\53\344\1\u03d7\1\u03d8\3\344\1\u017c\2\344\1\u0c12"+
- "\52\344\1\u03d7\1\u03d8\3\344\1\u017c\3\344\1\u0c13\51\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\4\344\1\u0c14\50\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\5\344\1\u0c15\47\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\6\344\1\u0c16\46\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\7\344\1\u0c17\45\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\10\344\1\u0c18\44\344\1\u03d7\1\u03d8\3\344\1\u017c\11\344"+
- "\1\u0c19\42\344\1\276\1\300\1\u02bf\3\276\1\u0c1a\55\276"+
- "\1\300\1\u02bf\4\276\1\u0c1b\54\276\1\300\1\u02bf\5\276"+
- "\1\u0c1c\53\276\1\300\1\u02bf\6\276\1\u0c1d\52\276\1\300"+
- "\1\u02bf\7\276\1\u0c1e\51\276\1\300\1\u02bf\10\276\1\u0c1f"+
- "\50\276\1\300\1\u02bf\11\276\1\u0c20\47\276\1\300\1\u02bf"+
- "\12\276\1\u0c21\46\276\1\300\1\u02bf\13\276\1\u0c22\45\276"+
- "\1\300\1\u02bf\14\276\1\u0c23\44\276\1\300\1\u02bf\15\276"+
- "\1\u0c24\42\276\5\0\1\164\1\0\1\165\14\0\1\164"+
- "\1\u0c25\25\164\3\0\1\164\1\0\1\164\3\0\2\u0381"+
- "\1\0\1\u0c26\57\0\2\u0381\2\0\1\u0c27\56\0\2\u0381"+
- "\3\0\1\u0c28\55\0\2\u0381\4\0\1\u0c29\54\0\2\u0381"+
- "\5\0\1\u0c2a\53\0\2\u0381\6\0\1\u0c2b\52\0\2\u0381"+
- "\7\0\1\u0c2c\51\0\2\u0381\10\0\1\u0c2d\50\0\2\u0381"+
- "\11\0\1\u0c2e\47\0\2\u0381\12\0\1\u0c2f\46\0\2\u0381"+
- "\13\0\1\u0c30\45\0\2\u0381\14\0\1\u0c31\44\0\2\u0381"+
- "\15\0\1\u0c32\43\0\1\u0311\1\u0312\1\0\1\u0c33\57\0"+
- "\1\u0311\1\u0312\2\0\1\u0c34\56\0\1\u0311\1\u0312\3\0"+
- "\1\u0c35\55\0\1\u0311\1\u0312\4\0\1\u0c36\54\0\1\u0311"+
- "\1\u0312\5\0\1\u0c37\53\0\1\u0311\1\u0312\6\0\1\u0c38"+
- "\52\0\1\u0311\1\u0312\7\0\1\u0c39\51\0\1\u0311\1\u0312"+
- "\10\0\1\u0c3a\50\0\1\u0311\1\u0312\11\0\1\u0c3b\47\0"+
- "\1\u0311\1\u0312\12\0\1\u0c3c\46\0\1\u0311\1\u0312\13\0"+
- "\1\u0c3d\45\0\1\u0311\1\u0312\14\0\1\u0c3e\44\0\1\u0311"+
- "\1\u0312\15\0\1\u0c3f\43\0\2\u039d\1\0\1\u0c40\57\0"+
- "\2\u039d\2\0\1\u0c41\56\0\2\u039d\3\0\1\u0c42\55\0"+
- "\2\u039d\4\0\1\u0c43\54\0\2\u039d\5\0\1\u0c44\53\0"+
- "\2\u039d\6\0\1\u0c45\52\0\2\u039d\7\0\1\u0c46\51\0"+
- "\2\u039d\10\0\1\u0c47\50\0\2\u039d\11\0\1\u0c48\47\0"+
- "\2\u039d\12\0\1\u0c49\46\0\2\u039d\13\0\1\u0c4a\45\0"+
- "\2\u039d\14\0\1\u0c4b\44\0\2\u039d\15\0\1\u0c4c\42\0"+
- "\1\276\1\u03ab\1\u03ac\1\276\1\u0c4d\57\276\1\u03ab\1\u03ac"+
- "\2\276\1\u0c4e\56\276\1\u03ab\1\u03ac\3\276\1\u0c4f\55\276"+
- "\1\u03ab\1\u03ac\4\276\1\u0c50\54\276\1\u03ab\1\u03ac\5\276"+
- "\1\u0c51\53\276\1\u03ab\1\u03ac\6\276\1\u0c52\52\276\1\u03ab"+
- "\1\u03ac\7\276\1\u0c53\51\276\1\u03ab\1\u03ac\10\276\1\u0c54"+
- "\50\276\1\u03ab\1\u03ac\11\276\1\u0c55\47\276\1\u03ab\1\u03ac"+
- "\12\276\1\u0c56\46\276\1\u03ab\1\u03ac\13\276\1\u0c57\45\276"+
- "\1\u03ab\1\u03ac\14\276\1\u0c58\44\276\1\u03ab\1\u03ac\15\276"+
- "\1\u0c59\43\276\1\u033b\1\u033c\1\276\1\u0c5a\57\276\1\u033b"+
- "\1\u033c\2\276\1\u0c5b\56\276\1\u033b\1\u033c\3\276\1\u0c5c"+
- "\55\276\1\u033b\1\u033c\4\276\1\u0c5d\54\276\1\u033b\1\u033c"+
- "\5\276\1\u0c5e\53\276\1\u033b\1\u033c\6\276\1\u0c5f\52\276"+
- "\1\u033b\1\u033c\7\276\1\u0c60\51\276\1\u033b\1\u033c\10\276"+
- "\1\u0c61\50\276\1\u033b\1\u033c\11\276\1\u0c62\47\276\1\u033b"+
- "\1\u033c\12\276\1\u0c63\46\276\1\u033b\1\u033c\13\276\1\u0c64"+
- "\45\276\1\u033b\1\u033c\14\276\1\u0c65\44\276\1\u033b\1\u033c"+
- "\15\276\1\u0c66\43\276\1\300\1\u02bf\1\276\1\u0c67\57\276"+
- "\1\300\1\u02bf\2\276\1\u0c68\55\276\1\263\1\u03c9\1\u03ca"+
- "\1\263\1\u0c69\1\263\1\u0136\55\263\1\u03c9\1\u03ca\2\263"+
- "\1\u0c6a\1\u0136\55\263\1\u03c9\1\u03ca\3\263\1\u0136\1\u0c6b"+
- "\54\263\1\u03c9\1\u03ca\3\263\1\u0136\1\263\1\u0c6c\53\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\2\263\1\u0c6d\52\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\3\263\1\u0c6e\51\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\4\263\1\u0c6f\50\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\5\263\1\u0c70\47\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\6\263\1\u0c71\46\263\1\u03c9\1\u03ca\3\263\1\u0136\7\263"+
- "\1\u0c72\45\263\1\u03c9\1\u03ca\3\263\1\u0136\10\263\1\u0c73"+
- "\44\263\1\u03c9\1\u03ca\3\263\1\u0136\11\263\1\u0c74\42\263"+
- "\1\344\1\u03d7\1\u03d8\1\344\1\u0c75\1\344\1\u017c\55\344"+
- "\1\u03d7\1\u03d8\2\344\1\u0c76\1\u017c\55\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\1\u0c77\54\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\1\344\1\u0c78\53\344\1\u03d7\1\u03d8\3\344\1\u017c\2\344"+
- "\1\u0c79\52\344\1\u03d7\1\u03d8\3\344\1\u017c\3\344\1\u0c7a"+
- "\51\344\1\u03d7\1\u03d8\3\344\1\u017c\4\344\1\u0c7b\50\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\5\344\1\u0c7c\47\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\6\344\1\u0c7d\46\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\7\344\1\u0c7e\45\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\10\344\1\u0c7f\44\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\11\344\1\u0c80\42\344\1\276\1\300\1\u02bf\3\276\1\u0c81"+
- "\55\276\1\300\1\u02bf\4\276\1\u0c82\54\276\1\300\1\u02bf"+
- "\5\276\1\u0c83\53\276\1\300\1\u02bf\6\276\1\u0c84\52\276"+
- "\1\300\1\u02bf\7\276\1\u0c85\51\276\1\300\1\u02bf\10\276"+
- "\1\u0c86\50\276\1\300\1\u02bf\11\276\1\u0c87\47\276\1\300"+
- "\1\u02bf\12\276\1\u0c88\46\276\1\300\1\u02bf\13\276\1\u0c89"+
- "\45\276\1\300\1\u02bf\14\276\1\u0c8a\44\276\1\300\1\u02bf"+
- "\15\276\1\u0c8b\42\276\5\0\1\164\1\0\1\165\14\0"+
- "\4\164\1\u0c8c\22\164\3\0\1\164\1\0\1\164\3\0"+
- "\2\u0381\1\0\1\u0c8d\57\0\2\u0381\2\0\1\u0c8e\56\0"+
- "\2\u0381\3\0\1\u0c8f\55\0\2\u0381\4\0\1\u0c90\54\0"+
- "\2\u0381\5\0\1\u0c91\53\0\2\u0381\6\0\1\u0c92\52\0"+
- "\2\u0381\7\0\1\u0c93\51\0\2\u0381\10\0\1\u0c94\50\0"+
- "\2\u0381\11\0\1\u0c95\47\0\2\u0381\12\0\1\u0c96\46\0"+
- "\2\u0381\13\0\1\u0c97\45\0\2\u0381\14\0\1\u0c98\44\0"+
- "\2\u0381\15\0\1\u0c99\43\0\1\u0311\1\u0312\1\0\1\u0c9a"+
- "\57\0\1\u0311\1\u0312\2\0\1\u0c9b\56\0\1\u0311\1\u0312"+
- "\3\0\1\u0c9c\55\0\1\u0311\1\u0312\4\0\1\u0c9d\54\0"+
- "\1\u0311\1\u0312\5\0\1\u0c9e\53\0\1\u0311\1\u0312\6\0"+
- "\1\u0c9f\52\0\1\u0311\1\u0312\7\0\1\u0ca0\51\0\1\u0311"+
- "\1\u0312\10\0\1\u0ca1\50\0\1\u0311\1\u0312\11\0\1\u0ca2"+
- "\47\0\1\u0311\1\u0312\12\0\1\u0ca3\46\0\1\u0311\1\u0312"+
- "\13\0\1\u0ca4\45\0\1\u0311\1\u0312\14\0\1\u0ca5\44\0"+
- "\1\u0311\1\u0312\15\0\1\u0ca6\43\0\2\u039d\1\0\1\u0ca7"+
- "\57\0\2\u039d\2\0\1\u0ca8\56\0\2\u039d\3\0\1\u0ca9"+
- "\55\0\2\u039d\4\0\1\u0caa\54\0\2\u039d\5\0\1\u0cab"+
- "\53\0\2\u039d\6\0\1\u0cac\52\0\2\u039d\7\0\1\u0cad"+
- "\51\0\2\u039d\10\0\1\u0cae\50\0\2\u039d\11\0\1\u0caf"+
- "\47\0\2\u039d\12\0\1\u0cb0\46\0\2\u039d\13\0\1\u0cb1"+
- "\45\0\2\u039d\14\0\1\u0cb2\44\0\2\u039d\15\0\1\u0cb3"+
- "\42\0\1\276\1\u03ab\1\u03ac\1\276\1\u0cb4\57\276\1\u03ab"+
- "\1\u03ac\2\276\1\u0cb5\56\276\1\u03ab\1\u03ac\3\276\1\u0cb6"+
- "\55\276\1\u03ab\1\u03ac\4\276\1\u0cb7\54\276\1\u03ab\1\u03ac"+
- "\5\276\1\u0cb8\53\276\1\u03ab\1\u03ac\6\276\1\u0cb9\52\276"+
- "\1\u03ab\1\u03ac\7\276\1\u0cba\51\276\1\u03ab\1\u03ac\10\276"+
- "\1\u0cbb\50\276\1\u03ab\1\u03ac\11\276\1\u0cbc\47\276\1\u03ab"+
- "\1\u03ac\12\276\1\u0cbd\46\276\1\u03ab\1\u03ac\13\276\1\u0cbe"+
- "\45\276\1\u03ab\1\u03ac\14\276\1\u0cbf\44\276\1\u03ab\1\u03ac"+
- "\15\276\1\u0cc0\43\276\1\u033b\1\u033c\1\276\1\u0cc1\57\276"+
- "\1\u033b\1\u033c\2\276\1\u0cc2\56\276\1\u033b\1\u033c\3\276"+
- "\1\u0cc3\55\276\1\u033b\1\u033c\4\276\1\u0cc4\54\276\1\u033b"+
- "\1\u033c\5\276\1\u0cc5\53\276\1\u033b\1\u033c\6\276\1\u0cc6"+
- "\52\276\1\u033b\1\u033c\7\276\1\u0cc7\51\276\1\u033b\1\u033c"+
- "\10\276\1\u0cc8\50\276\1\u033b\1\u033c\11\276\1\u0cc9\47\276"+
- "\1\u033b\1\u033c\12\276\1\u0cca\46\276\1\u033b\1\u033c\13\276"+
- "\1\u0ccb\45\276\1\u033b\1\u033c\14\276\1\u0ccc\44\276\1\u033b"+
- "\1\u033c\15\276\1\u0ccd\43\276\1\300\1\u02bf\1\276\1\u0cce"+
- "\57\276\1\300\1\u02bf\2\276\1\u0ccf\55\276\1\263\1\u03c9"+
- "\1\u03ca\1\263\1\u0cd0\1\263\1\u0136\55\263\1\u03c9\1\u03ca"+
- "\2\263\1\u0cd1\1\u0136\55\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\1\u0cd2\54\263\1\u03c9\1\u03ca\3\263\1\u0136\1\263\1\u0cd3"+
- "\53\263\1\u03c9\1\u03ca\3\263\1\u0136\2\263\1\u0cd4\52\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\3\263\1\u0cd5\51\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\4\263\1\u0cd6\50\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\5\263\1\u0cd7\47\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\6\263\1\u0cd8\46\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\7\263\1\u0cd9\45\263\1\u03c9\1\u03ca\3\263\1\u0136\10\263"+
- "\1\u0cda\44\263\1\u03c9\1\u03ca\3\263\1\u0136\11\263\1\u0cdb"+
- "\42\263\1\344\1\u03d7\1\u03d8\1\344\1\u0cdc\1\344\1\u017c"+
- "\55\344\1\u03d7\1\u03d8\2\344\1\u0cdd\1\u017c\55\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\1\u0cde\54\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\1\344\1\u0cdf\53\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\2\344\1\u0ce0\52\344\1\u03d7\1\u03d8\3\344\1\u017c\3\344"+
- "\1\u0ce1\51\344\1\u03d7\1\u03d8\3\344\1\u017c\4\344\1\u0ce2"+
- "\50\344\1\u03d7\1\u03d8\3\344\1\u017c\5\344\1\u0ce3\47\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\6\344\1\u0ce4\46\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\7\344\1\u0ce5\45\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\10\344\1\u0ce6\44\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\11\344\1\u0ce7\42\344\1\276\1\300\1\u02bf\3\276"+
- "\1\u0ce8\55\276\1\300\1\u02bf\4\276\1\u0ce9\54\276\1\300"+
- "\1\u02bf\5\276\1\u0cea\53\276\1\300\1\u02bf\6\276\1\u0ceb"+
- "\52\276\1\300\1\u02bf\7\276\1\u0cec\51\276\1\300\1\u02bf"+
- "\10\276\1\u0ced\50\276\1\300\1\u02bf\11\276\1\u0cee\47\276"+
- "\1\300\1\u02bf\12\276\1\u0cef\46\276\1\300\1\u02bf\13\276"+
- "\1\u0cf0\45\276\1\300\1\u02bf\14\276\1\u0cf1\44\276\1\300"+
- "\1\u02bf\15\276\1\u0cf2\42\276\5\0\1\164\1\0\1\165"+
- "\14\0\24\164\1\u03f3\2\164\3\0\1\164\1\0\1\164"+
- "\3\0\2\u0381\1\0\1\u0cf3\57\0\2\u0381\2\0\1\u0cf4"+
- "\56\0\2\u0381\3\0\1\u0cf5\55\0\2\u0381\4\0\1\u0cf6"+
- "\54\0\2\u0381\5\0\1\u0cf7\53\0\2\u0381\6\0\1\u0cf8"+
- "\52\0\2\u0381\7\0\1\u0cf9\51\0\2\u0381\10\0\1\u0cfa"+
- "\50\0\2\u0381\11\0\1\u0cfb\47\0\2\u0381\12\0\1\u0cfc"+
- "\46\0\2\u0381\13\0\1\u0cfd\45\0\2\u0381\14\0\1\u0cfe"+
- "\44\0\2\u0381\15\0\1\u0cff\43\0\1\u0311\1\u0312\1\0"+
- "\1\u0d00\57\0\1\u0311\1\u0312\2\0\1\u0d01\56\0\1\u0311"+
- "\1\u0312\3\0\1\u0d02\55\0\1\u0311\1\u0312\4\0\1\u0d03"+
- "\54\0\1\u0311\1\u0312\5\0\1\u0d04\53\0\1\u0311\1\u0312"+
- "\6\0\1\u0d05\52\0\1\u0311\1\u0312\7\0\1\u0d06\51\0"+
- "\1\u0311\1\u0312\10\0\1\u0d07\50\0\1\u0311\1\u0312\11\0"+
- "\1\u0d08\47\0\1\u0311\1\u0312\12\0\1\u0d09\46\0\1\u0311"+
- "\1\u0312\13\0\1\u0d0a\45\0\1\u0311\1\u0312\14\0\1\u0d0b"+
- "\44\0\1\u0311\1\u0312\15\0\1\u0d0c\43\0\2\u039d\1\0"+
- "\1\u0d0d\57\0\2\u039d\2\0\1\u0d0e\56\0\2\u039d\3\0"+
- "\1\u0d0f\55\0\2\u039d\4\0\1\u0d10\54\0\2\u039d\5\0"+
- "\1\u0d11\53\0\2\u039d\6\0\1\u0d12\52\0\2\u039d\7\0"+
- "\1\u0d13\51\0\2\u039d\10\0\1\u0d14\50\0\2\u039d\11\0"+
- "\1\u0d15\47\0\2\u039d\12\0\1\u0d16\46\0\2\u039d\13\0"+
- "\1\u0d17\45\0\2\u039d\14\0\1\u0d18\44\0\2\u039d\15\0"+
- "\1\u0d19\42\0\1\276\1\u03ab\1\u03ac\1\276\1\u0d1a\57\276"+
- "\1\u03ab\1\u03ac\2\276\1\u0d1b\56\276\1\u03ab\1\u03ac\3\276"+
- "\1\u0d1c\55\276\1\u03ab\1\u03ac\4\276\1\u0d1d\54\276\1\u03ab"+
- "\1\u03ac\5\276\1\u0d1e\53\276\1\u03ab\1\u03ac\6\276\1\u0d1f"+
- "\52\276\1\u03ab\1\u03ac\7\276\1\u0d20\51\276\1\u03ab\1\u03ac"+
- "\10\276\1\u0d21\50\276\1\u03ab\1\u03ac\11\276\1\u0d22\47\276"+
- "\1\u03ab\1\u03ac\12\276\1\u0d23\46\276\1\u03ab\1\u03ac\13\276"+
- "\1\u0d24\45\276\1\u03ab\1\u03ac\14\276\1\u0d25\44\276\1\u03ab"+
- "\1\u03ac\15\276\1\u0d26\43\276\1\u033b\1\u033c\1\276\1\u0d27"+
- "\57\276\1\u033b\1\u033c\2\276\1\u0d28\56\276\1\u033b\1\u033c"+
- "\3\276\1\u0d29\55\276\1\u033b\1\u033c\4\276\1\u0d2a\54\276"+
- "\1\u033b\1\u033c\5\276\1\u0d2b\53\276\1\u033b\1\u033c\6\276"+
- "\1\u0d2c\52\276\1\u033b\1\u033c\7\276\1\u0d2d\51\276\1\u033b"+
- "\1\u033c\10\276\1\u0d2e\50\276\1\u033b\1\u033c\11\276\1\u0d2f"+
- "\47\276\1\u033b\1\u033c\12\276\1\u0d30\46\276\1\u033b\1\u033c"+
- "\13\276\1\u0d31\45\276\1\u033b\1\u033c\14\276\1\u0d32\44\276"+
- "\1\u033b\1\u033c\15\276\1\u0d33\43\276\1\300\1\u02bf\1\276"+
- "\1\u0d34\57\276\1\300\1\u02bf\2\276\1\u0d35\55\276\1\263"+
- "\1\u03c9\1\u03ca\1\263\1\u0d36\1\263\1\u0136\55\263\1\u03c9"+
- "\1\u03ca\2\263\1\u0d37\1\u0136\55\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\1\u0d38\54\263\1\u03c9\1\u03ca\3\263\1\u0136\1\263"+
- "\1\u0d39\53\263\1\u03c9\1\u03ca\3\263\1\u0136\2\263\1\u0d3a"+
- "\52\263\1\u03c9\1\u03ca\3\263\1\u0136\3\263\1\u0d3b\51\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\4\263\1\u0d3c\50\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\5\263\1\u0d3d\47\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\6\263\1\u0d3e\46\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\7\263\1\u0d3f\45\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\10\263\1\u0d40\44\263\1\u03c9\1\u03ca\3\263\1\u0136\11\263"+
- "\1\u0d41\42\263\1\344\1\u03d7\1\u03d8\1\344\1\u0d42\1\344"+
- "\1\u017c\55\344\1\u03d7\1\u03d8\2\344\1\u0d43\1\u017c\55\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\1\u0d44\54\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\1\344\1\u0d45\53\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\2\344\1\u0d46\52\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\3\344\1\u0d47\51\344\1\u03d7\1\u03d8\3\344\1\u017c\4\344"+
- "\1\u0d48\50\344\1\u03d7\1\u03d8\3\344\1\u017c\5\344\1\u0d49"+
- "\47\344\1\u03d7\1\u03d8\3\344\1\u017c\6\344\1\u0d4a\46\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\7\344\1\u0d4b\45\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\10\344\1\u0d4c\44\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\11\344\1\u0d4d\42\344\1\276\1\300\1\u02bf"+
- "\3\276\1\u0d4e\55\276\1\300\1\u02bf\4\276\1\u0d4f\54\276"+
- "\1\300\1\u02bf\5\276\1\u0d50\53\276\1\300\1\u02bf\6\276"+
- "\1\u0d51\52\276\1\300\1\u02bf\7\276\1\u0d52\51\276\1\300"+
- "\1\u02bf\10\276\1\u0d53\50\276\1\300\1\u02bf\11\276\1\u0d54"+
- "\47\276\1\300\1\u02bf\12\276\1\u0d55\46\276\1\300\1\u02bf"+
- "\13\276\1\u0d56\45\276\1\300\1\u02bf\14\276\1\u0d57\44\276"+
- "\1\300\1\u02bf\15\276\1\u0d58\42\276\1\0\2\u0381\1\0"+
- "\1\u0d59\57\0\2\u0381\2\0\1\u0d5a\56\0\2\u0381\3\0"+
- "\1\u0d5b\55\0\2\u0381\4\0\1\u0d5c\54\0\2\u0381\5\0"+
- "\1\u0d5d\53\0\2\u0381\6\0\1\u0d5e\52\0\2\u0381\7\0"+
- "\1\u0d5f\51\0\2\u0381\10\0\1\u0d60\50\0\2\u0381\11\0"+
- "\1\u0d61\47\0\2\u0381\12\0\1\u0d62\46\0\2\u0381\13\0"+
- "\1\u0d63\45\0\2\u0381\14\0\1\u0d64\44\0\2\u0381\15\0"+
- "\1\u0d65\43\0\1\u0311\1\u0312\1\0\1\u0d66\57\0\1\u0311"+
- "\1\u0312\2\0\1\u0d67\56\0\1\u0311\1\u0312\3\0\1\u0d68"+
- "\55\0\1\u0311\1\u0312\4\0\1\u0d69\54\0\1\u0311\1\u0312"+
- "\5\0\1\u0d6a\53\0\1\u0311\1\u0312\6\0\1\u0d6b\52\0"+
- "\1\u0311\1\u0312\7\0\1\u0d6c\51\0\1\u0311\1\u0312\10\0"+
- "\1\u0d6d\50\0\1\u0311\1\u0312\11\0\1\u0d6e\47\0\1\u0311"+
- "\1\u0312\12\0\1\u0d6f\46\0\1\u0311\1\u0312\13\0\1\u0d70"+
- "\45\0\1\u0311\1\u0312\14\0\1\u0d71\44\0\1\u0311\1\u0312"+
- "\15\0\1\u0d72\43\0\2\u039d\1\0\1\u0d73\57\0\2\u039d"+
- "\2\0\1\u0d74\56\0\2\u039d\3\0\1\u0d75\55\0\2\u039d"+
- "\4\0\1\u0d76\54\0\2\u039d\5\0\1\u0d77\53\0\2\u039d"+
- "\6\0\1\u0d78\52\0\2\u039d\7\0\1\u0d79\51\0\2\u039d"+
- "\10\0\1\u0d7a\50\0\2\u039d\11\0\1\u0d7b\47\0\2\u039d"+
- "\12\0\1\u0d7c\46\0\2\u039d\13\0\1\u0d7d\45\0\2\u039d"+
- "\14\0\1\u0d7e\44\0\2\u039d\15\0\1\u0d7f\42\0\1\276"+
- "\1\u03ab\1\u03ac\1\276\1\u0d80\57\276\1\u03ab\1\u03ac\2\276"+
- "\1\u0d81\56\276\1\u03ab\1\u03ac\3\276\1\u0d82\55\276\1\u03ab"+
- "\1\u03ac\4\276\1\u0d83\54\276\1\u03ab\1\u03ac\5\276\1\u0d84"+
- "\53\276\1\u03ab\1\u03ac\6\276\1\u0d85\52\276\1\u03ab\1\u03ac"+
- "\7\276\1\u0d86\51\276\1\u03ab\1\u03ac\10\276\1\u0d87\50\276"+
- "\1\u03ab\1\u03ac\11\276\1\u0d88\47\276\1\u03ab\1\u03ac\12\276"+
- "\1\u0d89\46\276\1\u03ab\1\u03ac\13\276\1\u0d8a\45\276\1\u03ab"+
- "\1\u03ac\14\276\1\u0d8b\44\276\1\u03ab\1\u03ac\15\276\1\u0d8c"+
- "\43\276\1\u033b\1\u033c\1\276\1\u0d8d\57\276\1\u033b\1\u033c"+
- "\2\276\1\u0d8e\56\276\1\u033b\1\u033c\3\276\1\u0d8f\55\276"+
- "\1\u033b\1\u033c\4\276\1\u0d90\54\276\1\u033b\1\u033c\5\276"+
- "\1\u0d91\53\276\1\u033b\1\u033c\6\276\1\u0d92\52\276\1\u033b"+
- "\1\u033c\7\276\1\u0d93\51\276\1\u033b\1\u033c\10\276\1\u0d94"+
- "\50\276\1\u033b\1\u033c\11\276\1\u0d95\47\276\1\u033b\1\u033c"+
- "\12\276\1\u0d96\46\276\1\u033b\1\u033c\13\276\1\u0d97\45\276"+
- "\1\u033b\1\u033c\14\276\1\u0d98\44\276\1\u033b\1\u033c\15\276"+
- "\1\u0d99\43\276\1\300\1\u02bf\1\276\1\u0d9a\57\276\1\300"+
- "\1\u02bf\2\276\1\u0d9b\55\276\1\263\1\u03c9\1\u03ca\1\263"+
- "\1\u0d9c\1\263\1\u0136\55\263\1\u03c9\1\u03ca\2\263\1\u0d9d"+
- "\1\u0136\55\263\1\u03c9\1\u03ca\3\263\1\u0136\1\u0d9e\54\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\1\263\1\u0d9f\53\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\2\263\1\u0da0\52\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\3\263\1\u0da1\51\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\4\263\1\u0da2\50\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\5\263\1\u0da3\47\263\1\u03c9\1\u03ca\3\263\1\u0136\6\263"+
- "\1\u0da4\46\263\1\u03c9\1\u03ca\3\263\1\u0136\7\263\1\u0da5"+
- "\45\263\1\u03c9\1\u03ca\3\263\1\u0136\10\263\1\u0da6\44\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\11\263\1\u0da7\42\263\1\344"+
- "\1\u03d7\1\u03d8\1\344\1\u0da8\1\344\1\u017c\55\344\1\u03d7"+
- "\1\u03d8\2\344\1\u0da9\1\u017c\55\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\1\u0daa\54\344\1\u03d7\1\u03d8\3\344\1\u017c\1\344"+
- "\1\u0dab\53\344\1\u03d7\1\u03d8\3\344\1\u017c\2\344\1\u0dac"+
- "\52\344\1\u03d7\1\u03d8\3\344\1\u017c\3\344\1\u0dad\51\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\4\344\1\u0dae\50\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\5\344\1\u0daf\47\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\6\344\1\u0db0\46\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\7\344\1\u0db1\45\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\10\344\1\u0db2\44\344\1\u03d7\1\u03d8\3\344\1\u017c\11\344"+
- "\1\u0db3\42\344\1\276\1\300\1\u02bf\3\276\1\u0db4\55\276"+
- "\1\300\1\u02bf\4\276\1\u0db5\54\276\1\300\1\u02bf\5\276"+
- "\1\u0db6\53\276\1\300\1\u02bf\6\276\1\u0db7\52\276\1\300"+
- "\1\u02bf\7\276\1\u0db8\51\276\1\300\1\u02bf\10\276\1\u0db9"+
- "\50\276\1\300\1\u02bf\11\276\1\u0dba\47\276\1\300\1\u02bf"+
- "\12\276\1\u0dbb\46\276\1\300\1\u02bf\13\276\1\u0dbc\45\276"+
- "\1\300\1\u02bf\14\276\1\u0dbd\44\276\1\300\1\u02bf\15\276"+
- "\1\u0dbe\42\276\1\0\2\u0381\1\0\1\u0dbf\57\0\2\u0381"+
- "\2\0\1\u0dc0\56\0\2\u0381\3\0\1\u0dc1\55\0\2\u0381"+
- "\4\0\1\u0dc2\54\0\2\u0381\5\0\1\u0dc3\53\0\2\u0381"+
- "\6\0\1\u0dc4\52\0\2\u0381\7\0\1\u0dc5\51\0\2\u0381"+
- "\10\0\1\u0dc6\50\0\2\u0381\11\0\1\u0dc7\47\0\2\u0381"+
- "\12\0\1\u0dc8\46\0\2\u0381\13\0\1\u0dc9\45\0\2\u0381"+
- "\14\0\1\u0dca\44\0\2\u0381\15\0\1\u0dcb\43\0\1\u0311"+
- "\1\u0312\1\0\1\u0dcc\57\0\1\u0311\1\u0312\2\0\1\u0dcd"+
- "\56\0\1\u0311\1\u0312\3\0\1\u0dce\55\0\1\u0311\1\u0312"+
- "\4\0\1\u0dcf\54\0\1\u0311\1\u0312\5\0\1\u0dd0\53\0"+
- "\1\u0311\1\u0312\6\0\1\u0dd1\52\0\1\u0311\1\u0312\7\0"+
- "\1\u0dd2\51\0\1\u0311\1\u0312\10\0\1\u0dd3\50\0\1\u0311"+
- "\1\u0312\11\0\1\u0dd4\47\0\1\u0311\1\u0312\12\0\1\u0dd5"+
- "\46\0\1\u0311\1\u0312\13\0\1\u0dd6\45\0\1\u0311\1\u0312"+
- "\14\0\1\u0dd7\44\0\1\u0311\1\u0312\15\0\1\u0dd8\43\0"+
- "\2\u039d\1\0\1\u0dd9\57\0\2\u039d\2\0\1\u0dda\56\0"+
- "\2\u039d\3\0\1\u0ddb\55\0\2\u039d\4\0\1\u0ddc\54\0"+
- "\2\u039d\5\0\1\u0ddd\53\0\2\u039d\6\0\1\u0dde\52\0"+
- "\2\u039d\7\0\1\u0ddf\51\0\2\u039d\10\0\1\u0de0\50\0"+
- "\2\u039d\11\0\1\u0de1\47\0\2\u039d\12\0\1\u0de2\46\0"+
- "\2\u039d\13\0\1\u0de3\45\0\2\u039d\14\0\1\u0de4\44\0"+
- "\2\u039d\15\0\1\u0de5\42\0\1\276\1\u03ab\1\u03ac\1\276"+
- "\1\u0de6\57\276\1\u03ab\1\u03ac\2\276\1\u0de7\56\276\1\u03ab"+
- "\1\u03ac\3\276\1\u0de8\55\276\1\u03ab\1\u03ac\4\276\1\u0de9"+
- "\54\276\1\u03ab\1\u03ac\5\276\1\u0dea\53\276\1\u03ab\1\u03ac"+
- "\6\276\1\u0deb\52\276\1\u03ab\1\u03ac\7\276\1\u0dec\51\276"+
- "\1\u03ab\1\u03ac\10\276\1\u0ded\50\276\1\u03ab\1\u03ac\11\276"+
- "\1\u0dee\47\276\1\u03ab\1\u03ac\12\276\1\u0def\46\276\1\u03ab"+
- "\1\u03ac\13\276\1\u0df0\45\276\1\u03ab\1\u03ac\14\276\1\u0df1"+
- "\44\276\1\u03ab\1\u03ac\15\276\1\u0df2\43\276\1\u033b\1\u033c"+
- "\1\276\1\u0df3\57\276\1\u033b\1\u033c\2\276\1\u0df4\56\276"+
- "\1\u033b\1\u033c\3\276\1\u0df5\55\276\1\u033b\1\u033c\4\276"+
- "\1\u0df6\54\276\1\u033b\1\u033c\5\276\1\u0df7\53\276\1\u033b"+
- "\1\u033c\6\276\1\u0df8\52\276\1\u033b\1\u033c\7\276\1\u0df9"+
- "\51\276\1\u033b\1\u033c\10\276\1\u0dfa\50\276\1\u033b\1\u033c"+
- "\11\276\1\u0dfb\47\276\1\u033b\1\u033c\12\276\1\u0dfc\46\276"+
- "\1\u033b\1\u033c\13\276\1\u0dfd\45\276\1\u033b\1\u033c\14\276"+
- "\1\u0dfe\44\276\1\u033b\1\u033c\15\276\1\u0dff\43\276\1\300"+
- "\1\u02bf\1\276\1\u0e00\57\276\1\300\1\u02bf\2\276\1\u0e01"+
- "\55\276\1\263\1\u03c9\1\u03ca\1\263\1\u0e02\1\263\1\u0136"+
- "\55\263\1\u03c9\1\u03ca\2\263\1\u0e03\1\u0136\55\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\1\u0e04\54\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\1\263\1\u0e05\53\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\2\263\1\u0e06\52\263\1\u03c9\1\u03ca\3\263\1\u0136\3\263"+
- "\1\u0e07\51\263\1\u03c9\1\u03ca\3\263\1\u0136\4\263\1\u0e08"+
- "\50\263\1\u03c9\1\u03ca\3\263\1\u0136\5\263\1\u0e09\47\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\6\263\1\u0e0a\46\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\7\263\1\u0e0b\45\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\10\263\1\u0e0c\44\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\11\263\1\u0e0d\42\263\1\344\1\u03d7\1\u03d8\1\344"+
- "\1\u0e0e\1\344\1\u017c\55\344\1\u03d7\1\u03d8\2\344\1\u0e0f"+
- "\1\u017c\55\344\1\u03d7\1\u03d8\3\344\1\u017c\1\u0e10\54\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\1\344\1\u0e11\53\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\2\344\1\u0e12\52\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\3\344\1\u0e13\51\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\4\344\1\u0e14\50\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\5\344\1\u0e15\47\344\1\u03d7\1\u03d8\3\344\1\u017c\6\344"+
- "\1\u0e16\46\344\1\u03d7\1\u03d8\3\344\1\u017c\7\344\1\u0e17"+
- "\45\344\1\u03d7\1\u03d8\3\344\1\u017c\10\344\1\u0e18\44\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\11\344\1\u0e19\42\344\1\276"+
- "\1\300\1\u02bf\3\276\1\u0e1a\55\276\1\300\1\u02bf\4\276"+
- "\1\u0e1b\54\276\1\300\1\u02bf\5\276\1\u0e1c\53\276\1\300"+
- "\1\u02bf\6\276\1\u0e1d\52\276\1\300\1\u02bf\7\276\1\u0e1e"+
- "\51\276\1\300\1\u02bf\10\276\1\u0e1f\50\276\1\300\1\u02bf"+
- "\11\276\1\u0e20\47\276\1\300\1\u02bf\12\276\1\u0e21\46\276"+
- "\1\300\1\u02bf\13\276\1\u0e22\45\276\1\300\1\u02bf\14\276"+
- "\1\u0e23\44\276\1\300\1\u02bf\15\276\1\u0e24\42\276\1\0"+
- "\2\u0381\1\0\1\u0e25\57\0\2\u0381\2\0\1\u0e26\56\0"+
- "\2\u0381\3\0\1\u0e27\55\0\2\u0381\4\0\1\u0e28\54\0"+
- "\2\u0381\5\0\1\u0e29\53\0\2\u0381\6\0\1\u0e2a\52\0"+
- "\2\u0381\7\0\1\u0e2b\51\0\2\u0381\10\0\1\u0e2c\50\0"+
- "\2\u0381\11\0\1\u0e2d\47\0\2\u0381\12\0\1\u0e2e\46\0"+
- "\2\u0381\13\0\1\u0e2f\45\0\2\u0381\14\0\1\u0e30\44\0"+
- "\2\u0381\15\0\1\u0e31\43\0\1\u0311\1\u0312\1\0\1\u0e32"+
- "\57\0\1\u0311\1\u0312\2\0\1\u0e33\56\0\1\u0311\1\u0312"+
- "\3\0\1\u0e34\55\0\1\u0311\1\u0312\4\0\1\u0e35\54\0"+
- "\1\u0311\1\u0312\5\0\1\u0e36\53\0\1\u0311\1\u0312\6\0"+
- "\1\u0e37\52\0\1\u0311\1\u0312\7\0\1\u0e38\51\0\1\u0311"+
- "\1\u0312\10\0\1\u0e39\50\0\1\u0311\1\u0312\11\0\1\u0e3a"+
- "\47\0\1\u0311\1\u0312\12\0\1\u0e3b\46\0\1\u0311\1\u0312"+
- "\13\0\1\u0e3c\45\0\1\u0311\1\u0312\14\0\1\u0e3d\44\0"+
- "\1\u0311\1\u0312\15\0\1\u0e3e\43\0\2\u039d\1\0\1\u0e3f"+
- "\57\0\2\u039d\2\0\1\u0e40\56\0\2\u039d\3\0\1\u0e41"+
- "\55\0\2\u039d\4\0\1\u0e42\54\0\2\u039d\5\0\1\u0e43"+
- "\53\0\2\u039d\6\0\1\u0e44\52\0\2\u039d\7\0\1\u0e45"+
- "\51\0\2\u039d\10\0\1\u0e46\50\0\2\u039d\11\0\1\u0e47"+
- "\47\0\2\u039d\12\0\1\u0e48\46\0\2\u039d\13\0\1\u0e49"+
- "\45\0\2\u039d\14\0\1\u0e4a\44\0\2\u039d\15\0\1\u0e4b"+
- "\42\0\1\276\1\u03ab\1\u03ac\1\276\1\u0e4c\57\276\1\u03ab"+
- "\1\u03ac\2\276\1\u0e4d\56\276\1\u03ab\1\u03ac\3\276\1\u0e4e"+
- "\55\276\1\u03ab\1\u03ac\4\276\1\u0e4f\54\276\1\u03ab\1\u03ac"+
- "\5\276\1\u0e50\53\276\1\u03ab\1\u03ac\6\276\1\u0e51\52\276"+
- "\1\u03ab\1\u03ac\7\276\1\u0e52\51\276\1\u03ab\1\u03ac\10\276"+
- "\1\u0e53\50\276\1\u03ab\1\u03ac\11\276\1\u0e54\47\276\1\u03ab"+
- "\1\u03ac\12\276\1\u0e55\46\276\1\u03ab\1\u03ac\13\276\1\u0e56"+
- "\45\276\1\u03ab\1\u03ac\14\276\1\u0e57\44\276\1\u03ab\1\u03ac"+
- "\15\276\1\u0e58\43\276\1\u033b\1\u033c\1\276\1\u0e59\57\276"+
- "\1\u033b\1\u033c\2\276\1\u0e5a\56\276\1\u033b\1\u033c\3\276"+
- "\1\u0e5b\55\276\1\u033b\1\u033c\4\276\1\u0e5c\54\276\1\u033b"+
- "\1\u033c\5\276\1\u0e5d\53\276\1\u033b\1\u033c\6\276\1\u0e5e"+
- "\52\276\1\u033b\1\u033c\7\276\1\u0e5f\51\276\1\u033b\1\u033c"+
- "\10\276\1\u0e60\50\276\1\u033b\1\u033c\11\276\1\u0e61\47\276"+
- "\1\u033b\1\u033c\12\276\1\u0e62\46\276\1\u033b\1\u033c\13\276"+
- "\1\u0e63\45\276\1\u033b\1\u033c\14\276\1\u0e64\44\276\1\u033b"+
- "\1\u033c\15\276\1\u0e65\43\276\1\300\1\u02bf\1\276\1\u0e66"+
- "\57\276\1\300\1\u02bf\2\276\1\u0e67\55\276\1\263\1\u03c9"+
- "\1\u03ca\1\263\1\u0e68\1\263\1\u0136\55\263\1\u03c9\1\u03ca"+
- "\2\263\1\u0e69\1\u0136\55\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\1\u0e6a\54\263\1\u03c9\1\u03ca\3\263\1\u0136\1\263\1\u0e6b"+
- "\53\263\1\u03c9\1\u03ca\3\263\1\u0136\2\263\1\u0e6c\52\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\3\263\1\u0e6d\51\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\4\263\1\u0e6e\50\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\5\263\1\u0e6f\47\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\6\263\1\u0e70\46\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\7\263\1\u0e71\45\263\1\u03c9\1\u03ca\3\263\1\u0136\10\263"+
- "\1\u0e72\44\263\1\u03c9\1\u03ca\3\263\1\u0136\11\263\1\u0e73"+
- "\42\263\1\344\1\u03d7\1\u03d8\1\344\1\u0e74\1\344\1\u017c"+
- "\55\344\1\u03d7\1\u03d8\2\344\1\u0e75\1\u017c\55\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\1\u0e76\54\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\1\344\1\u0e77\53\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\2\344\1\u0e78\52\344\1\u03d7\1\u03d8\3\344\1\u017c\3\344"+
- "\1\u0e79\51\344\1\u03d7\1\u03d8\3\344\1\u017c\4\344\1\u0e7a"+
- "\50\344\1\u03d7\1\u03d8\3\344\1\u017c\5\344\1\u0e7b\47\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\6\344\1\u0e7c\46\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\7\344\1\u0e7d\45\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\10\344\1\u0e7e\44\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\11\344\1\u0e7f\42\344\1\276\1\300\1\u02bf\3\276"+
- "\1\u0e80\55\276\1\300\1\u02bf\4\276\1\u0e81\54\276\1\300"+
- "\1\u02bf\5\276\1\u0e82\53\276\1\300\1\u02bf\6\276\1\u0e83"+
- "\52\276\1\300\1\u02bf\7\276\1\u0e84\51\276\1\300\1\u02bf"+
- "\10\276\1\u0e85\50\276\1\300\1\u02bf\11\276\1\u0e86\47\276"+
- "\1\300\1\u02bf\12\276\1\u0e87\46\276\1\300\1\u02bf\13\276"+
- "\1\u0e88\45\276\1\300\1\u02bf\14\276\1\u0e89\44\276\1\300"+
- "\1\u02bf\15\276\1\u0e8a\42\276\1\0\2\u0381\1\0\1\u0e8b"+
- "\57\0\2\u0381\2\0\1\u0e8c\56\0\2\u0381\3\0\1\u0e8d"+
- "\55\0\2\u0381\4\0\1\u0e8e\54\0\2\u0381\5\0\1\u0e8f"+
- "\53\0\2\u0381\6\0\1\u0e90\52\0\2\u0381\7\0\1\u0e91"+
- "\51\0\2\u0381\10\0\1\u0e92\50\0\2\u0381\11\0\1\u0e93"+
- "\47\0\2\u0381\12\0\1\u0e94\46\0\2\u0381\13\0\1\u0e95"+
- "\45\0\2\u0381\14\0\1\u0e96\44\0\2\u0381\15\0\1\u0e97"+
- "\43\0\1\u0311\1\u0312\1\0\1\u0e98\57\0\1\u0311\1\u0312"+
- "\2\0\1\u0e99\56\0\1\u0311\1\u0312\3\0\1\u0e9a\55\0"+
- "\1\u0311\1\u0312\4\0\1\u0e9b\54\0\1\u0311\1\u0312\5\0"+
- "\1\u0e9c\53\0\1\u0311\1\u0312\6\0\1\u0e9d\52\0\1\u0311"+
- "\1\u0312\7\0\1\u0e9e\51\0\1\u0311\1\u0312\10\0\1\u0e9f"+
- "\50\0\1\u0311\1\u0312\11\0\1\u0ea0\47\0\1\u0311\1\u0312"+
- "\12\0\1\u0ea1\46\0\1\u0311\1\u0312\13\0\1\u0ea2\45\0"+
- "\1\u0311\1\u0312\14\0\1\u0ea3\44\0\1\u0311\1\u0312\15\0"+
- "\1\u0ea4\43\0\2\u039d\1\0\1\u0ea5\57\0\2\u039d\2\0"+
- "\1\u0ea6\56\0\2\u039d\3\0\1\u0ea7\55\0\2\u039d\4\0"+
- "\1\u0ea8\54\0\2\u039d\5\0\1\u0ea9\53\0\2\u039d\6\0"+
- "\1\u0eaa\52\0\2\u039d\7\0\1\u0eab\51\0\2\u039d\10\0"+
- "\1\u0eac\50\0\2\u039d\11\0\1\u0ead\47\0\2\u039d\12\0"+
- "\1\u0eae\46\0\2\u039d\13\0\1\u0eaf\45\0\2\u039d\14\0"+
- "\1\u0eb0\44\0\2\u039d\15\0\1\u0eb1\42\0\1\276\1\u03ab"+
- "\1\u03ac\1\276\1\u0eb2\57\276\1\u03ab\1\u03ac\2\276\1\u0eb3"+
- "\56\276\1\u03ab\1\u03ac\3\276\1\u0eb4\55\276\1\u03ab\1\u03ac"+
- "\4\276\1\u0eb5\54\276\1\u03ab\1\u03ac\5\276\1\u0eb6\53\276"+
- "\1\u03ab\1\u03ac\6\276\1\u0eb7\52\276\1\u03ab\1\u03ac\7\276"+
- "\1\u0eb8\51\276\1\u03ab\1\u03ac\10\276\1\u0eb9\50\276\1\u03ab"+
- "\1\u03ac\11\276\1\u0eba\47\276\1\u03ab\1\u03ac\12\276\1\u0ebb"+
- "\46\276\1\u03ab\1\u03ac\13\276\1\u0ebc\45\276\1\u03ab\1\u03ac"+
- "\14\276\1\u0ebd\44\276\1\u03ab\1\u03ac\15\276\1\u0ebe\43\276"+
- "\1\u033b\1\u033c\1\276\1\u0ebf\57\276\1\u033b\1\u033c\2\276"+
- "\1\u0ec0\56\276\1\u033b\1\u033c";
+ "\7\164\1\u04df\17\164\3\0\1\164\1\0\1\164\7\0"+
+ "\1\164\1\0\1\165\1\33\4\0\1\33\6\0\2\42"+
+ "\1\u04e0\24\42\1\0\1\33\1\0\1\42\1\33\1\42"+
+ "\3\0\2\u0384\1\0\1\u04e1\15\0\1\u0386\41\0\2\u0384"+
+ "\2\0\1\u04e2\14\0\1\u0386\41\0\2\u0384\3\0\1\u04e3"+
+ "\13\0\1\u0386\41\0\2\u0384\4\0\1\u04e4\12\0\1\u0386"+
+ "\41\0\2\u0384\5\0\1\u04e5\11\0\1\u0386\41\0\2\u0384"+
+ "\6\0\1\u04e6\10\0\1\u0386\41\0\2\u0384\7\0\1\u04e7"+
+ "\7\0\1\u0386\41\0\2\u0384\10\0\1\u04e8\6\0\1\u0386"+
+ "\41\0\2\u0384\11\0\1\u04e9\5\0\1\u0386\41\0\2\u0384"+
+ "\12\0\1\u04ea\4\0\1\u0386\41\0\2\u0384\13\0\1\u04eb"+
+ "\3\0\1\u0386\41\0\2\u0384\14\0\1\u04ec\2\0\1\u0386"+
+ "\41\0\2\u0384\15\0\1\u04ed\1\0\1\u0386\41\0\1\u0312"+
+ "\1\u0313\1\0\1\u04ee\15\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\2\0\1\u04ef\14\0\1\u0315\41\0\1\u0312\1\u0313\3\0"+
+ "\1\u04f0\13\0\1\u0315\41\0\1\u0312\1\u0313\4\0\1\u04f1"+
+ "\12\0\1\u0315\41\0\1\u0312\1\u0313\5\0\1\u04f2\11\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\6\0\1\u04f3\10\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\7\0\1\u04f4\7\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\10\0\1\u04f5\6\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\11\0\1\u04f6\5\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\12\0\1\u04f7\4\0\1\u0315\41\0\1\u0312\1\u0313\13\0"+
+ "\1\u04f8\3\0\1\u0315\41\0\1\u0312\1\u0313\14\0\1\u04f9"+
+ "\2\0\1\u0315\41\0\1\u0312\1\u0313\15\0\1\u04fa\1\0"+
+ "\1\u0315\41\0\2\u03a1\1\0\1\u04fb\15\0\1\u03a3\41\0"+
+ "\2\u03a1\2\0\1\u04fc\14\0\1\u03a3\41\0\2\u03a1\3\0"+
+ "\1\u04fd\13\0\1\u03a3\41\0\2\u03a1\4\0\1\u04fe\12\0"+
+ "\1\u03a3\41\0\2\u03a1\5\0\1\u04ff\11\0\1\u03a3\41\0"+
+ "\2\u03a1\6\0\1\u0500\10\0\1\u03a3\41\0\2\u03a1\7\0"+
+ "\1\u0501\7\0\1\u03a3\41\0\2\u03a1\10\0\1\u0502\6\0"+
+ "\1\u03a3\41\0\2\u03a1\11\0\1\u0503\5\0\1\u03a3\41\0"+
+ "\2\u03a1\12\0\1\u0504\4\0\1\u03a3\41\0\2\u03a1\13\0"+
+ "\1\u0505\3\0\1\u03a3\41\0\2\u03a1\14\0\1\u0506\2\0"+
+ "\1\u03a3\41\0\2\u03a1\15\0\1\u0507\1\0\1\u03a3\40\0"+
+ "\1\276\1\u03b0\1\u03b1\1\276\1\u0508\15\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\2\276\1\u0509\14\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\3\276\1\u050a\13\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\4\276\1\u050b\12\276\1\u03b3\41\276\1\u03b0\1\u03b1\5\276"+
+ "\1\u050c\11\276\1\u03b3\41\276\1\u03b0\1\u03b1\6\276\1\u050d"+
+ "\10\276\1\u03b3\41\276\1\u03b0\1\u03b1\7\276\1\u050e\7\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\10\276\1\u050f\6\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\11\276\1\u0510\5\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\12\276\1\u0511\4\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\13\276\1\u0512\3\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\14\276\1\u0513\2\276\1\u03b3\41\276\1\u03b0\1\u03b1\15\276"+
+ "\1\u0514\1\276\1\u03b3\41\276\1\u033d\1\u033e\1\276\1\u0515"+
+ "\15\276\1\u0340\41\276\1\u033d\1\u033e\2\276\1\u0516\14\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\3\276\1\u0517\13\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\4\276\1\u0518\12\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\5\276\1\u0519\11\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\6\276\1\u051a\10\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\7\276\1\u051b\7\276\1\u0340\41\276\1\u033d\1\u033e\10\276"+
+ "\1\u051c\6\276\1\u0340\41\276\1\u033d\1\u033e\11\276\1\u051d"+
+ "\5\276\1\u0340\41\276\1\u033d\1\u033e\12\276\1\u051e\4\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\13\276\1\u051f\3\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\14\276\1\u0520\2\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\15\276\1\u0521\1\276\1\u0340\41\276\1\300"+
+ "\1\u02bf\1\276\1\u0522\15\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\2\276\1\u0523\14\276\1\u02c1\40\276\1\263\1\u03cf\1\u03d0"+
+ "\1\263\1\u0524\1\263\1\u0136\13\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\2\263\1\u0525\1\u0136\13\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\1\u0526\12\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\1\263\1\u0527\11\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\2\263\1\u0528\10\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\3\263\1\u0529\7\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\4\263\1\u052a"+
+ "\6\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\5\263"+
+ "\1\u052b\5\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\6\263\1\u052c\4\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\7\263\1\u052d\3\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\10\263\1\u052e\2\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\11\263\1\u052f\1\263\1\u03d2\40\263"+
+ "\1\344\1\u03de\1\u03df\1\344\1\u0530\1\344\1\u017c\13\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\2\344\1\u0531\1\u017c\13\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\1\u0532\12\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\1\344\1\u0533"+
+ "\11\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\2\344"+
+ "\1\u0534\10\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\3\344\1\u0535\7\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\4\344\1\u0536\6\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\5\344\1\u0537\5\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\6\344\1\u0538\4\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\7\344\1\u0539\3\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\10\344\1\u053a\2\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\11\344\1\u053b"+
+ "\1\344\1\u03e1\40\344\1\276\1\300\1\u02bf\3\276\1\u053c"+
+ "\13\276\1\u02c1\41\276\1\300\1\u02bf\4\276\1\u053d\12\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\5\276\1\u053e\11\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\6\276\1\u053f\10\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\7\276\1\u0540\7\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\10\276\1\u0541\6\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\11\276\1\u0542\5\276\1\u02c1\41\276\1\300\1\u02bf\12\276"+
+ "\1\u0543\4\276\1\u02c1\41\276\1\300\1\u02bf\13\276\1\u0544"+
+ "\3\276\1\u02c1\41\276\1\300\1\u02bf\14\276\1\u0545\2\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\15\276\1\u0546\1\276\1\u02c1"+
+ "\40\276\5\0\1\164\1\0\1\165\14\0\2\164\1\u0547"+
+ "\24\164\3\0\1\164\1\0\1\164\7\0\1\164\1\0"+
+ "\1\u04dd\14\0\27\164\3\0\1\164\1\0\1\164\7\0"+
+ "\1\164\1\0\1\165\1\33\4\0\1\33\6\0\2\42"+
+ "\1\u0548\24\42\1\0\1\33\1\0\1\42\1\33\1\42"+
+ "\7\0\1\164\1\0\1\u0549\14\0\27\164\3\0\1\164"+
+ "\1\0\1\164\7\0\1\164\1\0\1\165\14\0\2\164"+
+ "\1\u054a\24\164\3\0\1\164\1\0\1\164\7\0\1\164"+
+ "\1\0\1\165\14\0\1\164\1\u054b\25\164\3\0\1\164"+
+ "\1\0\1\164\7\0\1\164\1\0\1\u04dd\1\33\4\0"+
+ "\1\33\6\0\27\42\1\0\1\33\1\0\1\42\1\33"+
+ "\1\42\3\0\2\u0384\1\0\1\u054c\15\0\1\u0386\41\0"+
+ "\2\u0384\2\0\1\u054d\14\0\1\u0386\41\0\2\u0384\3\0"+
+ "\1\u054e\13\0\1\u0386\41\0\2\u0384\4\0\1\u054f\12\0"+
+ "\1\u0386\41\0\2\u0384\5\0\1\u0550\11\0\1\u0386\41\0"+
+ "\2\u0384\6\0\1\u0551\10\0\1\u0386\41\0\2\u0384\7\0"+
+ "\1\u0552\7\0\1\u0386\41\0\2\u0384\10\0\1\u0553\6\0"+
+ "\1\u0386\41\0\2\u0384\11\0\1\u0554\5\0\1\u0386\41\0"+
+ "\2\u0384\12\0\1\u0555\4\0\1\u0386\41\0\2\u0384\13\0"+
+ "\1\u0556\3\0\1\u0386\41\0\2\u0384\14\0\1\u0557\2\0"+
+ "\1\u0386\41\0\2\u0384\15\0\1\u0558\1\0\1\u0386\41\0"+
+ "\1\u0312\1\u0313\1\0\1\u0559\15\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\2\0\1\u055a\14\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\3\0\1\u055b\13\0\1\u0315\41\0\1\u0312\1\u0313\4\0"+
+ "\1\u055c\12\0\1\u0315\41\0\1\u0312\1\u0313\5\0\1\u055d"+
+ "\11\0\1\u0315\41\0\1\u0312\1\u0313\6\0\1\u055e\10\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\7\0\1\u055f\7\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\10\0\1\u0560\6\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\11\0\1\u0561\5\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\12\0\1\u0562\4\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\13\0\1\u0563\3\0\1\u0315\41\0\1\u0312\1\u0313\14\0"+
+ "\1\u0564\2\0\1\u0315\41\0\1\u0312\1\u0313\15\0\1\u0565"+
+ "\1\0\1\u0315\41\0\2\u03a1\1\0\1\u0566\15\0\1\u03a3"+
+ "\41\0\2\u03a1\2\0\1\u0567\14\0\1\u03a3\41\0\2\u03a1"+
+ "\3\0\1\u0568\13\0\1\u03a3\41\0\2\u03a1\4\0\1\u0569"+
+ "\12\0\1\u03a3\41\0\2\u03a1\5\0\1\u056a\11\0\1\u03a3"+
+ "\41\0\2\u03a1\6\0\1\u056b\10\0\1\u03a3\41\0\2\u03a1"+
+ "\7\0\1\u056c\7\0\1\u03a3\41\0\2\u03a1\10\0\1\u056d"+
+ "\6\0\1\u03a3\41\0\2\u03a1\11\0\1\u056e\5\0\1\u03a3"+
+ "\41\0\2\u03a1\12\0\1\u056f\4\0\1\u03a3\41\0\2\u03a1"+
+ "\13\0\1\u0570\3\0\1\u03a3\41\0\2\u03a1\14\0\1\u0571"+
+ "\2\0\1\u03a3\41\0\2\u03a1\15\0\1\u0572\1\0\1\u03a3"+
+ "\40\0\1\276\1\u03b0\1\u03b1\1\276\1\u0573\15\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\2\276\1\u0574\14\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\3\276\1\u0575\13\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\4\276\1\u0576\12\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\5\276\1\u0577\11\276\1\u03b3\41\276\1\u03b0\1\u03b1\6\276"+
+ "\1\u0578\10\276\1\u03b3\41\276\1\u03b0\1\u03b1\7\276\1\u0579"+
+ "\7\276\1\u03b3\41\276\1\u03b0\1\u03b1\10\276\1\u057a\6\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\11\276\1\u057b\5\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\12\276\1\u057c\4\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\13\276\1\u057d\3\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\14\276\1\u057e\2\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\15\276\1\u057f\1\276\1\u03b3\41\276\1\u033d\1\u033e\1\276"+
+ "\1\u0580\15\276\1\u0340\41\276\1\u033d\1\u033e\2\276\1\u0581"+
+ "\14\276\1\u0340\41\276\1\u033d\1\u033e\3\276\1\u0582\13\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\4\276\1\u0583\12\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\5\276\1\u0584\11\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\6\276\1\u0585\10\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\7\276\1\u0586\7\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\10\276\1\u0587\6\276\1\u0340\41\276\1\u033d\1\u033e\11\276"+
+ "\1\u0588\5\276\1\u0340\41\276\1\u033d\1\u033e\12\276\1\u0589"+
+ "\4\276\1\u0340\41\276\1\u033d\1\u033e\13\276\1\u058a\3\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\14\276\1\u058b\2\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\15\276\1\u058c\1\276\1\u0340\41\276"+
+ "\1\300\1\u02bf\1\276\1\u058d\15\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\2\276\1\u058e\14\276\1\u02c1\40\276\1\263\1\u03cf"+
+ "\1\u03d0\1\263\1\u058f\1\263\1\u0136\13\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\2\263\1\u0590\1\u0136\13\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\1\u0591\12\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\1\263\1\u0592\11\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\2\263\1\u0593\10\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\3\263\1\u0594"+
+ "\7\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\4\263"+
+ "\1\u0595\6\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\5\263\1\u0596\5\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\6\263\1\u0597\4\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\7\263\1\u0598\3\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\10\263\1\u0599\2\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\11\263\1\u059a\1\263\1\u03d2"+
+ "\40\263\1\344\1\u03de\1\u03df\1\344\1\u059b\1\344\1\u017c"+
+ "\13\344\1\u03e1\41\344\1\u03de\1\u03df\2\344\1\u059c\1\u017c"+
+ "\13\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\1\u059d"+
+ "\12\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\1\344"+
+ "\1\u059e\11\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\2\344\1\u059f\10\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\3\344\1\u05a0\7\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\4\344\1\u05a1\6\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\5\344\1\u05a2\5\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\6\344\1\u05a3\4\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\7\344\1\u05a4\3\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\10\344\1\u05a5"+
+ "\2\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\11\344"+
+ "\1\u05a6\1\344\1\u03e1\40\344\1\276\1\300\1\u02bf\3\276"+
+ "\1\u05a7\13\276\1\u02c1\41\276\1\300\1\u02bf\4\276\1\u05a8"+
+ "\12\276\1\u02c1\41\276\1\300\1\u02bf\5\276\1\u05a9\11\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\6\276\1\u05aa\10\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\7\276\1\u05ab\7\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\10\276\1\u05ac\6\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\11\276\1\u05ad\5\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\12\276\1\u05ae\4\276\1\u02c1\41\276\1\300\1\u02bf\13\276"+
+ "\1\u05af\3\276\1\u02c1\41\276\1\300\1\u02bf\14\276\1\u05b0"+
+ "\2\276\1\u02c1\41\276\1\300\1\u02bf\15\276\1\u05b1\1\276"+
+ "\1\u02c1\40\276\5\0\1\164\1\0\1\165\14\0\20\164"+
+ "\1\u046d\6\164\3\0\1\164\1\0\1\164\7\0\1\164"+
+ "\1\0\1\165\1\33\4\0\1\33\6\0\10\42\1\u05b2"+
+ "\16\42\1\0\1\33\1\0\1\42\1\33\1\42\7\0"+
+ "\1\164\1\0\1\165\14\0\12\164\1\u05b3\14\164\3\0"+
+ "\1\164\1\0\1\164\7\0\1\164\1\0\1\165\14\0"+
+ "\5\164\1\u05b4\21\164\3\0\1\164\1\0\1\164\3\0"+
+ "\2\u0384\1\0\1\u05b5\15\0\1\u0386\41\0\2\u0384\2\0"+
+ "\1\u05b6\14\0\1\u0386\41\0\2\u0384\3\0\1\u05b7\13\0"+
+ "\1\u0386\41\0\2\u0384\4\0\1\u05b8\12\0\1\u0386\41\0"+
+ "\2\u0384\5\0\1\u05b9\11\0\1\u0386\41\0\2\u0384\6\0"+
+ "\1\u05ba\10\0\1\u0386\41\0\2\u0384\7\0\1\u05bb\7\0"+
+ "\1\u0386\41\0\2\u0384\10\0\1\u05bc\6\0\1\u0386\41\0"+
+ "\2\u0384\11\0\1\u05bd\5\0\1\u0386\41\0\2\u0384\12\0"+
+ "\1\u05be\4\0\1\u0386\41\0\2\u0384\13\0\1\u05bf\3\0"+
+ "\1\u0386\41\0\2\u0384\14\0\1\u05c0\2\0\1\u0386\41\0"+
+ "\2\u0384\15\0\1\u05c1\1\0\1\u0386\41\0\1\u0312\1\u0313"+
+ "\1\0\1\u05c2\15\0\1\u0315\41\0\1\u0312\1\u0313\2\0"+
+ "\1\u05c3\14\0\1\u0315\41\0\1\u0312\1\u0313\3\0\1\u05c4"+
+ "\13\0\1\u0315\41\0\1\u0312\1\u0313\4\0\1\u05c5\12\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\5\0\1\u05c6\11\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\6\0\1\u05c7\10\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\7\0\1\u05c8\7\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\10\0\1\u05c9\6\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\11\0\1\u05ca\5\0\1\u0315\41\0\1\u0312\1\u0313\12\0"+
+ "\1\u05cb\4\0\1\u0315\41\0\1\u0312\1\u0313\13\0\1\u05cc"+
+ "\3\0\1\u0315\41\0\1\u0312\1\u0313\14\0\1\u05cd\2\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\15\0\1\u05ce\1\0\1\u0315"+
+ "\41\0\2\u03a1\1\0\1\u05cf\15\0\1\u03a3\41\0\2\u03a1"+
+ "\2\0\1\u05d0\14\0\1\u03a3\41\0\2\u03a1\3\0\1\u05d1"+
+ "\13\0\1\u03a3\41\0\2\u03a1\4\0\1\u05d2\12\0\1\u03a3"+
+ "\41\0\2\u03a1\5\0\1\u05d3\11\0\1\u03a3\41\0\2\u03a1"+
+ "\6\0\1\u05d4\10\0\1\u03a3\41\0\2\u03a1\7\0\1\u05d5"+
+ "\7\0\1\u03a3\41\0\2\u03a1\10\0\1\u05d6\6\0\1\u03a3"+
+ "\41\0\2\u03a1\11\0\1\u05d7\5\0\1\u03a3\41\0\2\u03a1"+
+ "\12\0\1\u05d8\4\0\1\u03a3\41\0\2\u03a1\13\0\1\u05d9"+
+ "\3\0\1\u03a3\41\0\2\u03a1\14\0\1\u05da\2\0\1\u03a3"+
+ "\41\0\2\u03a1\15\0\1\u05db\1\0\1\u03a3\40\0\1\276"+
+ "\1\u03b0\1\u03b1\1\276\1\u05dc\15\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\2\276\1\u05dd\14\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\3\276\1\u05de\13\276\1\u03b3\41\276\1\u03b0\1\u03b1\4\276"+
+ "\1\u05df\12\276\1\u03b3\41\276\1\u03b0\1\u03b1\5\276\1\u05e0"+
+ "\11\276\1\u03b3\41\276\1\u03b0\1\u03b1\6\276\1\u05e1\10\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\7\276\1\u05e2\7\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\10\276\1\u05e3\6\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\11\276\1\u05e4\5\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\12\276\1\u05e5\4\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\13\276\1\u05e6\3\276\1\u03b3\41\276\1\u03b0\1\u03b1\14\276"+
+ "\1\u05e7\2\276\1\u03b3\41\276\1\u03b0\1\u03b1\15\276\1\u05e8"+
+ "\1\276\1\u03b3\41\276\1\u033d\1\u033e\1\276\1\u05e9\15\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\2\276\1\u05ea\14\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\3\276\1\u05eb\13\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\4\276\1\u05ec\12\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\5\276\1\u05ed\11\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\6\276\1\u05ee\10\276\1\u0340\41\276\1\u033d\1\u033e\7\276"+
+ "\1\u05ef\7\276\1\u0340\41\276\1\u033d\1\u033e\10\276\1\u05f0"+
+ "\6\276\1\u0340\41\276\1\u033d\1\u033e\11\276\1\u05f1\5\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\12\276\1\u05f2\4\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\13\276\1\u05f3\3\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\14\276\1\u05f4\2\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\15\276\1\u05f5\1\276\1\u0340\41\276\1\300\1\u02bf"+
+ "\1\276\1\u05f6\15\276\1\u02c1\41\276\1\300\1\u02bf\2\276"+
+ "\1\u05f7\14\276\1\u02c1\40\276\1\263\1\u03cf\1\u03d0\1\263"+
+ "\1\u05f8\1\263\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\2\263\1\u05f9\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\1\u05fa\12\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\1\263\1\u05fb\11\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\2\263\1\u05fc\10\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\3\263\1\u05fd\7\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\4\263\1\u05fe\6\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\5\263\1\u05ff"+
+ "\5\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\6\263"+
+ "\1\u0600\4\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\7\263\1\u0601\3\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\10\263\1\u0602\2\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\11\263\1\u0603\1\263\1\u03d2\40\263\1\344"+
+ "\1\u03de\1\u03df\1\344\1\u0604\1\344\1\u017c\13\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\2\344\1\u0605\1\u017c\13\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\1\u0606\12\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\1\344\1\u0607\11\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\2\344\1\u0608"+
+ "\10\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\3\344"+
+ "\1\u0609\7\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\4\344\1\u060a\6\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\5\344\1\u060b\5\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\6\344\1\u060c\4\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\7\344\1\u060d\3\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\10\344\1\u060e\2\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\11\344\1\u060f\1\344"+
+ "\1\u03e1\40\344\1\276\1\300\1\u02bf\3\276\1\u0610\13\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\4\276\1\u0611\12\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\5\276\1\u0612\11\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\6\276\1\u0613\10\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\7\276\1\u0614\7\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\10\276\1\u0615\6\276\1\u02c1\41\276\1\300\1\u02bf\11\276"+
+ "\1\u0616\5\276\1\u02c1\41\276\1\300\1\u02bf\12\276\1\u0617"+
+ "\4\276\1\u02c1\41\276\1\300\1\u02bf\13\276\1\u0618\3\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\14\276\1\u0619\2\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\15\276\1\u061a\1\276\1\u02c1\40\276"+
+ "\5\0\1\164\1\0\1\165\1\33\4\0\1\33\6\0"+
+ "\1\42\1\u061b\25\42\1\0\1\33\1\0\1\42\1\33"+
+ "\1\42\7\0\1\164\1\0\1\165\14\0\1\u061c\26\164"+
+ "\3\0\1\164\1\0\1\164\7\0\1\164\1\0\1\165"+
+ "\14\0\3\164\1\u061d\23\164\3\0\1\164\1\0\1\164"+
+ "\3\0\2\u0384\1\0\1\u061e\15\0\1\u0386\41\0\2\u0384"+
+ "\2\0\1\u061f\14\0\1\u0386\41\0\2\u0384\3\0\1\u0620"+
+ "\13\0\1\u0386\41\0\2\u0384\4\0\1\u0621\12\0\1\u0386"+
+ "\41\0\2\u0384\5\0\1\u0622\11\0\1\u0386\41\0\2\u0384"+
+ "\6\0\1\u0623\10\0\1\u0386\41\0\2\u0384\7\0\1\u0624"+
+ "\7\0\1\u0386\41\0\2\u0384\10\0\1\u0625\6\0\1\u0386"+
+ "\41\0\2\u0384\11\0\1\u0626\5\0\1\u0386\41\0\2\u0384"+
+ "\12\0\1\u0627\4\0\1\u0386\41\0\2\u0384\13\0\1\u0628"+
+ "\3\0\1\u0386\41\0\2\u0384\14\0\1\u0629\2\0\1\u0386"+
+ "\41\0\2\u0384\15\0\1\u062a\1\0\1\u0386\41\0\1\u0312"+
+ "\1\u0313\1\0\1\u062b\15\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\2\0\1\u062c\14\0\1\u0315\41\0\1\u0312\1\u0313\3\0"+
+ "\1\u062d\13\0\1\u0315\41\0\1\u0312\1\u0313\4\0\1\u062e"+
+ "\12\0\1\u0315\41\0\1\u0312\1\u0313\5\0\1\u062f\11\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\6\0\1\u0630\10\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\7\0\1\u0631\7\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\10\0\1\u0632\6\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\11\0\1\u0633\5\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\12\0\1\u0634\4\0\1\u0315\41\0\1\u0312\1\u0313\13\0"+
+ "\1\u0635\3\0\1\u0315\41\0\1\u0312\1\u0313\14\0\1\u0636"+
+ "\2\0\1\u0315\41\0\1\u0312\1\u0313\15\0\1\u0637\1\0"+
+ "\1\u0315\41\0\2\u03a1\1\0\1\u0638\15\0\1\u03a3\41\0"+
+ "\2\u03a1\2\0\1\u0639\14\0\1\u03a3\41\0\2\u03a1\3\0"+
+ "\1\u063a\13\0\1\u03a3\41\0\2\u03a1\4\0\1\u063b\12\0"+
+ "\1\u03a3\41\0\2\u03a1\5\0\1\u063c\11\0\1\u03a3\41\0"+
+ "\2\u03a1\6\0\1\u063d\10\0\1\u03a3\41\0\2\u03a1\7\0"+
+ "\1\u063e\7\0\1\u03a3\41\0\2\u03a1\10\0\1\u063f\6\0"+
+ "\1\u03a3\41\0\2\u03a1\11\0\1\u0640\5\0\1\u03a3\41\0"+
+ "\2\u03a1\12\0\1\u0641\4\0\1\u03a3\41\0\2\u03a1\13\0"+
+ "\1\u0642\3\0\1\u03a3\41\0\2\u03a1\14\0\1\u0643\2\0"+
+ "\1\u03a3\41\0\2\u03a1\15\0\1\u0644\1\0\1\u03a3\40\0"+
+ "\1\276\1\u03b0\1\u03b1\1\276\1\u0645\15\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\2\276\1\u0646\14\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\3\276\1\u0647\13\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\4\276\1\u0648\12\276\1\u03b3\41\276\1\u03b0\1\u03b1\5\276"+
+ "\1\u0649\11\276\1\u03b3\41\276\1\u03b0\1\u03b1\6\276\1\u064a"+
+ "\10\276\1\u03b3\41\276\1\u03b0\1\u03b1\7\276\1\u064b\7\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\10\276\1\u064c\6\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\11\276\1\u064d\5\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\12\276\1\u064e\4\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\13\276\1\u064f\3\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\14\276\1\u0650\2\276\1\u03b3\41\276\1\u03b0\1\u03b1\15\276"+
+ "\1\u0651\1\276\1\u03b3\41\276\1\u033d\1\u033e\1\276\1\u0652"+
+ "\15\276\1\u0340\41\276\1\u033d\1\u033e\2\276\1\u0653\14\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\3\276\1\u0654\13\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\4\276\1\u0655\12\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\5\276\1\u0656\11\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\6\276\1\u0657\10\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\7\276\1\u0658\7\276\1\u0340\41\276\1\u033d\1\u033e\10\276"+
+ "\1\u0659\6\276\1\u0340\41\276\1\u033d\1\u033e\11\276\1\u065a"+
+ "\5\276\1\u0340\41\276\1\u033d\1\u033e\12\276\1\u065b\4\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\13\276\1\u065c\3\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\14\276\1\u065d\2\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\15\276\1\u065e\1\276\1\u0340\41\276\1\300"+
+ "\1\u02bf\1\276\1\u065f\15\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\2\276\1\u0660\14\276\1\u02c1\40\276\1\263\1\u03cf\1\u03d0"+
+ "\1\263\1\u0661\1\263\1\u0136\13\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\2\263\1\u0662\1\u0136\13\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\1\u0663\12\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\1\263\1\u0664\11\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\2\263\1\u0665\10\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\3\263\1\u0666\7\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\4\263\1\u0667"+
+ "\6\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\5\263"+
+ "\1\u0668\5\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\6\263\1\u0669\4\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\7\263\1\u066a\3\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\10\263\1\u066b\2\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\11\263\1\u066c\1\263\1\u03d2\40\263"+
+ "\1\344\1\u03de\1\u03df\1\344\1\u066d\1\344\1\u017c\13\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\2\344\1\u066e\1\u017c\13\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\1\u066f\12\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\1\344\1\u0670"+
+ "\11\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\2\344"+
+ "\1\u0671\10\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\3\344\1\u0672\7\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\4\344\1\u0673\6\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\5\344\1\u0674\5\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\6\344\1\u0675\4\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\7\344\1\u0676\3\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\10\344\1\u0677\2\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\11\344\1\u0678"+
+ "\1\344\1\u03e1\40\344\1\276\1\300\1\u02bf\3\276\1\u0679"+
+ "\13\276\1\u02c1\41\276\1\300\1\u02bf\4\276\1\u067a\12\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\5\276\1\u067b\11\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\6\276\1\u067c\10\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\7\276\1\u067d\7\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\10\276\1\u067e\6\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\11\276\1\u067f\5\276\1\u02c1\41\276\1\300\1\u02bf\12\276"+
+ "\1\u0680\4\276\1\u02c1\41\276\1\300\1\u02bf\13\276\1\u0681"+
+ "\3\276\1\u02c1\41\276\1\300\1\u02bf\14\276\1\u0682\2\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\15\276\1\u0683\1\276\1\u02c1"+
+ "\40\276\5\0\1\164\1\0\1\165\1\33\4\0\1\33"+
+ "\6\0\2\42\1\u0684\24\42\1\0\1\33\1\0\1\42"+
+ "\1\33\1\42\7\0\1\164\1\0\1\165\14\0\22\164"+
+ "\1\u046d\4\164\3\0\1\164\1\0\1\164\7\0\1\164"+
+ "\1\0\1\165\14\0\7\164\1\u0685\17\164\3\0\1\164"+
+ "\1\0\1\164\3\0\2\u0384\1\0\1\u0686\15\0\1\u0386"+
+ "\41\0\2\u0384\2\0\1\u0687\14\0\1\u0386\41\0\2\u0384"+
+ "\3\0\1\u0688\13\0\1\u0386\41\0\2\u0384\4\0\1\u0689"+
+ "\12\0\1\u0386\41\0\2\u0384\5\0\1\u068a\11\0\1\u0386"+
+ "\41\0\2\u0384\6\0\1\u068b\10\0\1\u0386\41\0\2\u0384"+
+ "\7\0\1\u068c\7\0\1\u0386\41\0\2\u0384\10\0\1\u068d"+
+ "\6\0\1\u0386\41\0\2\u0384\11\0\1\u068e\5\0\1\u0386"+
+ "\41\0\2\u0384\12\0\1\u068f\4\0\1\u0386\41\0\2\u0384"+
+ "\13\0\1\u0690\3\0\1\u0386\41\0\2\u0384\14\0\1\u0691"+
+ "\2\0\1\u0386\41\0\2\u0384\15\0\1\u0692\1\0\1\u0386"+
+ "\41\0\1\u0312\1\u0313\1\0\1\u0693\15\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\2\0\1\u0694\14\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\3\0\1\u0695\13\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\4\0\1\u0696\12\0\1\u0315\41\0\1\u0312\1\u0313\5\0"+
+ "\1\u0697\11\0\1\u0315\41\0\1\u0312\1\u0313\6\0\1\u0698"+
+ "\10\0\1\u0315\41\0\1\u0312\1\u0313\7\0\1\u0699\7\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\10\0\1\u069a\6\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\11\0\1\u069b\5\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\12\0\1\u069c\4\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\13\0\1\u069d\3\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\14\0\1\u069e\2\0\1\u0315\41\0\1\u0312\1\u0313\15\0"+
+ "\1\u069f\1\0\1\u0315\41\0\2\u03a1\1\0\1\u06a0\15\0"+
+ "\1\u03a3\41\0\2\u03a1\2\0\1\u06a1\14\0\1\u03a3\41\0"+
+ "\2\u03a1\3\0\1\u06a2\13\0\1\u03a3\41\0\2\u03a1\4\0"+
+ "\1\u06a3\12\0\1\u03a3\41\0\2\u03a1\5\0\1\u06a4\11\0"+
+ "\1\u03a3\41\0\2\u03a1\6\0\1\u06a5\10\0\1\u03a3\41\0"+
+ "\2\u03a1\7\0\1\u06a6\7\0\1\u03a3\41\0\2\u03a1\10\0"+
+ "\1\u06a7\6\0\1\u03a3\41\0\2\u03a1\11\0\1\u06a8\5\0"+
+ "\1\u03a3\41\0\2\u03a1\12\0\1\u06a9\4\0\1\u03a3\41\0"+
+ "\2\u03a1\13\0\1\u06aa\3\0\1\u03a3\41\0\2\u03a1\14\0"+
+ "\1\u06ab\2\0\1\u03a3\41\0\2\u03a1\15\0\1\u06ac\1\0"+
+ "\1\u03a3\40\0\1\276\1\u03b0\1\u03b1\1\276\1\u06ad\15\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\2\276\1\u06ae\14\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\3\276\1\u06af\13\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\4\276\1\u06b0\12\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\5\276\1\u06b1\11\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\6\276\1\u06b2\10\276\1\u03b3\41\276\1\u03b0\1\u03b1\7\276"+
+ "\1\u06b3\7\276\1\u03b3\41\276\1\u03b0\1\u03b1\10\276\1\u06b4"+
+ "\6\276\1\u03b3\41\276\1\u03b0\1\u03b1\11\276\1\u06b5\5\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\12\276\1\u06b6\4\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\13\276\1\u06b7\3\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\14\276\1\u06b8\2\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\15\276\1\u06b9\1\276\1\u03b3\41\276\1\u033d\1\u033e"+
+ "\1\276\1\u06ba\15\276\1\u0340\41\276\1\u033d\1\u033e\2\276"+
+ "\1\u06bb\14\276\1\u0340\41\276\1\u033d\1\u033e\3\276\1\u06bc"+
+ "\13\276\1\u0340\41\276\1\u033d\1\u033e\4\276\1\u06bd\12\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\5\276\1\u06be\11\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\6\276\1\u06bf\10\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\7\276\1\u06c0\7\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\10\276\1\u06c1\6\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\11\276\1\u06c2\5\276\1\u0340\41\276\1\u033d\1\u033e\12\276"+
+ "\1\u06c3\4\276\1\u0340\41\276\1\u033d\1\u033e\13\276\1\u06c4"+
+ "\3\276\1\u0340\41\276\1\u033d\1\u033e\14\276\1\u06c5\2\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\15\276\1\u06c6\1\276\1\u0340"+
+ "\41\276\1\300\1\u02bf\1\276\1\u06c7\15\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\2\276\1\u06c8\14\276\1\u02c1\40\276\1\263"+
+ "\1\u03cf\1\u03d0\1\263\1\u06c9\1\263\1\u0136\13\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\2\263\1\u06ca\1\u0136\13\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\u06cb\12\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\263\1\u06cc\11\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\2\263\1\u06cd"+
+ "\10\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\3\263"+
+ "\1\u06ce\7\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\4\263\1\u06cf\6\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\5\263\1\u06d0\5\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\6\263\1\u06d1\4\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\7\263\1\u06d2\3\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\10\263\1\u06d3\2\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\11\263\1\u06d4\1\263"+
+ "\1\u03d2\40\263\1\344\1\u03de\1\u03df\1\344\1\u06d5\1\344"+
+ "\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df\2\344\1\u06d6"+
+ "\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\1\u06d7\12\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\1\344\1\u06d8\11\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\2\344\1\u06d9\10\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\3\344\1\u06da\7\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\4\344\1\u06db\6\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\5\344\1\u06dc\5\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\6\344\1\u06dd\4\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\7\344\1\u06de"+
+ "\3\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\10\344"+
+ "\1\u06df\2\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\11\344\1\u06e0\1\344\1\u03e1\40\344\1\276\1\300\1\u02bf"+
+ "\3\276\1\u06e1\13\276\1\u02c1\41\276\1\300\1\u02bf\4\276"+
+ "\1\u06e2\12\276\1\u02c1\41\276\1\300\1\u02bf\5\276\1\u06e3"+
+ "\11\276\1\u02c1\41\276\1\300\1\u02bf\6\276\1\u06e4\10\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\7\276\1\u06e5\7\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\10\276\1\u06e6\6\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\11\276\1\u06e7\5\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\12\276\1\u06e8\4\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\13\276\1\u06e9\3\276\1\u02c1\41\276\1\300\1\u02bf\14\276"+
+ "\1\u06ea\2\276\1\u02c1\41\276\1\300\1\u02bf\15\276\1\u06eb"+
+ "\1\276\1\u02c1\40\276\5\0\1\164\1\0\1\165\1\33"+
+ "\4\0\1\33\6\0\25\42\1\u06ec\1\42\1\0\1\33"+
+ "\1\0\1\42\1\33\1\42\7\0\1\164\1\0\1\165"+
+ "\14\0\14\164\1\u06ed\12\164\3\0\1\164\1\0\1\164"+
+ "\3\0\2\u0384\1\0\1\u06ee\15\0\1\u0386\41\0\2\u0384"+
+ "\2\0\1\u06ef\14\0\1\u0386\41\0\2\u0384\3\0\1\u06f0"+
+ "\13\0\1\u0386\41\0\2\u0384\4\0\1\u06f1\12\0\1\u0386"+
+ "\41\0\2\u0384\5\0\1\u06f2\11\0\1\u0386\41\0\2\u0384"+
+ "\6\0\1\u06f3\10\0\1\u0386\41\0\2\u0384\7\0\1\u06f4"+
+ "\7\0\1\u0386\41\0\2\u0384\10\0\1\u06f5\6\0\1\u0386"+
+ "\41\0\2\u0384\11\0\1\u06f6\5\0\1\u0386\41\0\2\u0384"+
+ "\12\0\1\u06f7\4\0\1\u0386\41\0\2\u0384\13\0\1\u06f8"+
+ "\3\0\1\u0386\41\0\2\u0384\14\0\1\u06f9\2\0\1\u0386"+
+ "\41\0\2\u0384\15\0\1\u06fa\1\0\1\u0386\41\0\1\u0312"+
+ "\1\u0313\1\0\1\u06fb\15\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\2\0\1\u06fc\14\0\1\u0315\41\0\1\u0312\1\u0313\3\0"+
+ "\1\u06fd\13\0\1\u0315\41\0\1\u0312\1\u0313\4\0\1\u06fe"+
+ "\12\0\1\u0315\41\0\1\u0312\1\u0313\5\0\1\u06ff\11\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\6\0\1\u0700\10\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\7\0\1\u0701\7\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\10\0\1\u0702\6\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\11\0\1\u0703\5\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\12\0\1\u0704\4\0\1\u0315\41\0\1\u0312\1\u0313\13\0"+
+ "\1\u0705\3\0\1\u0315\41\0\1\u0312\1\u0313\14\0\1\u0706"+
+ "\2\0\1\u0315\41\0\1\u0312\1\u0313\15\0\1\u0707\1\0"+
+ "\1\u0315\41\0\2\u03a1\1\0\1\u0708\15\0\1\u03a3\41\0"+
+ "\2\u03a1\2\0\1\u0709\14\0\1\u03a3\41\0\2\u03a1\3\0"+
+ "\1\u070a\13\0\1\u03a3\41\0\2\u03a1\4\0\1\u070b\12\0"+
+ "\1\u03a3\41\0\2\u03a1\5\0\1\u070c\11\0\1\u03a3\41\0"+
+ "\2\u03a1\6\0\1\u070d\10\0\1\u03a3\41\0\2\u03a1\7\0"+
+ "\1\u070e\7\0\1\u03a3\41\0\2\u03a1\10\0\1\u070f\6\0"+
+ "\1\u03a3\41\0\2\u03a1\11\0\1\u0710\5\0\1\u03a3\41\0"+
+ "\2\u03a1\12\0\1\u0711\4\0\1\u03a3\41\0\2\u03a1\13\0"+
+ "\1\u0712\3\0\1\u03a3\41\0\2\u03a1\14\0\1\u0713\2\0"+
+ "\1\u03a3\41\0\2\u03a1\15\0\1\u0714\1\0\1\u03a3\40\0"+
+ "\1\276\1\u03b0\1\u03b1\1\276\1\u0715\15\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\2\276\1\u0716\14\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\3\276\1\u0717\13\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\4\276\1\u0718\12\276\1\u03b3\41\276\1\u03b0\1\u03b1\5\276"+
+ "\1\u0719\11\276\1\u03b3\41\276\1\u03b0\1\u03b1\6\276\1\u071a"+
+ "\10\276\1\u03b3\41\276\1\u03b0\1\u03b1\7\276\1\u071b\7\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\10\276\1\u071c\6\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\11\276\1\u071d\5\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\12\276\1\u071e\4\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\13\276\1\u071f\3\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\14\276\1\u0720\2\276\1\u03b3\41\276\1\u03b0\1\u03b1\15\276"+
+ "\1\u0721\1\276\1\u03b3\41\276\1\u033d\1\u033e\1\276\1\u0722"+
+ "\15\276\1\u0340\41\276\1\u033d\1\u033e\2\276\1\u0723\14\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\3\276\1\u0724\13\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\4\276\1\u0725\12\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\5\276\1\u0726\11\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\6\276\1\u0727\10\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\7\276\1\u0728\7\276\1\u0340\41\276\1\u033d\1\u033e\10\276"+
+ "\1\u0729\6\276\1\u0340\41\276\1\u033d\1\u033e\11\276\1\u072a"+
+ "\5\276\1\u0340\41\276\1\u033d\1\u033e\12\276\1\u072b\4\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\13\276\1\u072c\3\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\14\276\1\u072d\2\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\15\276\1\u072e\1\276\1\u0340\41\276\1\300"+
+ "\1\u02bf\1\276\1\u072f\15\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\2\276\1\u0730\14\276\1\u02c1\40\276\1\263\1\u03cf\1\u03d0"+
+ "\1\263\1\u0731\1\263\1\u0136\13\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\2\263\1\u0732\1\u0136\13\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\1\u0733\12\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\1\263\1\u0734\11\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\2\263\1\u0735\10\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\3\263\1\u0736\7\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\4\263\1\u0737"+
+ "\6\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\5\263"+
+ "\1\u0738\5\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\6\263\1\u0739\4\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\7\263\1\u073a\3\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\10\263\1\u073b\2\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\11\263\1\u073c\1\263\1\u03d2\40\263"+
+ "\1\344\1\u03de\1\u03df\1\344\1\u073d\1\344\1\u017c\13\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\2\344\1\u073e\1\u017c\13\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\1\u073f\12\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\1\344\1\u0740"+
+ "\11\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\2\344"+
+ "\1\u0741\10\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\3\344\1\u0742\7\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\4\344\1\u0743\6\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\5\344\1\u0744\5\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\6\344\1\u0745\4\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\7\344\1\u0746\3\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\10\344\1\u0747\2\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\11\344\1\u0748"+
+ "\1\344\1\u03e1\40\344\1\276\1\300\1\u02bf\3\276\1\u0749"+
+ "\13\276\1\u02c1\41\276\1\300\1\u02bf\4\276\1\u074a\12\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\5\276\1\u074b\11\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\6\276\1\u074c\10\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\7\276\1\u074d\7\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\10\276\1\u074e\6\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\11\276\1\u074f\5\276\1\u02c1\41\276\1\300\1\u02bf\12\276"+
+ "\1\u0750\4\276\1\u02c1\41\276\1\300\1\u02bf\13\276\1\u0751"+
+ "\3\276\1\u02c1\41\276\1\300\1\u02bf\14\276\1\u0752\2\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\15\276\1\u0753\1\276\1\u02c1"+
+ "\40\276\5\0\1\164\1\0\1\165\1\33\4\0\1\33"+
+ "\6\0\1\42\1\u0754\25\42\1\0\1\33\1\0\1\42"+
+ "\1\33\1\42\7\0\1\164\1\0\1\165\14\0\21\164"+
+ "\1\u0755\5\164\3\0\1\164\1\0\1\164\3\0\2\u0384"+
+ "\1\0\1\u0756\15\0\1\u0386\41\0\2\u0384\2\0\1\u0757"+
+ "\14\0\1\u0386\41\0\2\u0384\3\0\1\u0758\13\0\1\u0386"+
+ "\41\0\2\u0384\4\0\1\u0759\12\0\1\u0386\41\0\2\u0384"+
+ "\5\0\1\u075a\11\0\1\u0386\41\0\2\u0384\6\0\1\u075b"+
+ "\10\0\1\u0386\41\0\2\u0384\7\0\1\u075c\7\0\1\u0386"+
+ "\41\0\2\u0384\10\0\1\u075d\6\0\1\u0386\41\0\2\u0384"+
+ "\11\0\1\u075e\5\0\1\u0386\41\0\2\u0384\12\0\1\u075f"+
+ "\4\0\1\u0386\41\0\2\u0384\13\0\1\u0760\3\0\1\u0386"+
+ "\41\0\2\u0384\14\0\1\u0761\2\0\1\u0386\41\0\2\u0384"+
+ "\15\0\1\u0762\1\0\1\u0386\41\0\1\u0312\1\u0313\1\0"+
+ "\1\u0763\15\0\1\u0315\41\0\1\u0312\1\u0313\2\0\1\u0764"+
+ "\14\0\1\u0315\41\0\1\u0312\1\u0313\3\0\1\u0765\13\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\4\0\1\u0766\12\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\5\0\1\u0767\11\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\6\0\1\u0768\10\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\7\0\1\u0769\7\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\10\0\1\u076a\6\0\1\u0315\41\0\1\u0312\1\u0313\11\0"+
+ "\1\u076b\5\0\1\u0315\41\0\1\u0312\1\u0313\12\0\1\u076c"+
+ "\4\0\1\u0315\41\0\1\u0312\1\u0313\13\0\1\u076d\3\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\14\0\1\u076e\2\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\15\0\1\u076f\1\0\1\u0315\41\0"+
+ "\2\u03a1\1\0\1\u0770\15\0\1\u03a3\41\0\2\u03a1\2\0"+
+ "\1\u0771\14\0\1\u03a3\41\0\2\u03a1\3\0\1\u0772\13\0"+
+ "\1\u03a3\41\0\2\u03a1\4\0\1\u0773\12\0\1\u03a3\41\0"+
+ "\2\u03a1\5\0\1\u0774\11\0\1\u03a3\41\0\2\u03a1\6\0"+
+ "\1\u0775\10\0\1\u03a3\41\0\2\u03a1\7\0\1\u0776\7\0"+
+ "\1\u03a3\41\0\2\u03a1\10\0\1\u0777\6\0\1\u03a3\41\0"+
+ "\2\u03a1\11\0\1\u0778\5\0\1\u03a3\41\0\2\u03a1\12\0"+
+ "\1\u0779\4\0\1\u03a3\41\0\2\u03a1\13\0\1\u077a\3\0"+
+ "\1\u03a3\41\0\2\u03a1\14\0\1\u077b\2\0\1\u03a3\41\0"+
+ "\2\u03a1\15\0\1\u077c\1\0\1\u03a3\40\0\1\276\1\u03b0"+
+ "\1\u03b1\1\276\1\u077d\15\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\2\276\1\u077e\14\276\1\u03b3\41\276\1\u03b0\1\u03b1\3\276"+
+ "\1\u077f\13\276\1\u03b3\41\276\1\u03b0\1\u03b1\4\276\1\u0780"+
+ "\12\276\1\u03b3\41\276\1\u03b0\1\u03b1\5\276\1\u0781\11\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\6\276\1\u0782\10\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\7\276\1\u0783\7\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\10\276\1\u0784\6\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\11\276\1\u0785\5\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\12\276\1\u0786\4\276\1\u03b3\41\276\1\u03b0\1\u03b1\13\276"+
+ "\1\u0787\3\276\1\u03b3\41\276\1\u03b0\1\u03b1\14\276\1\u0788"+
+ "\2\276\1\u03b3\41\276\1\u03b0\1\u03b1\15\276\1\u0789\1\276"+
+ "\1\u03b3\41\276\1\u033d\1\u033e\1\276\1\u078a\15\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\2\276\1\u078b\14\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\3\276\1\u078c\13\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\4\276\1\u078d\12\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\5\276\1\u078e\11\276\1\u0340\41\276\1\u033d\1\u033e\6\276"+
+ "\1\u078f\10\276\1\u0340\41\276\1\u033d\1\u033e\7\276\1\u0790"+
+ "\7\276\1\u0340\41\276\1\u033d\1\u033e\10\276\1\u0791\6\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\11\276\1\u0792\5\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\12\276\1\u0793\4\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\13\276\1\u0794\3\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\14\276\1\u0795\2\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\15\276\1\u0796\1\276\1\u0340\41\276\1\300\1\u02bf\1\276"+
+ "\1\u0797\15\276\1\u02c1\41\276\1\300\1\u02bf\2\276\1\u0798"+
+ "\14\276\1\u02c1\40\276\1\263\1\u03cf\1\u03d0\1\263\1\u0799"+
+ "\1\263\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\2\263"+
+ "\1\u079a\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\1\u079b\12\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\1\263\1\u079c\11\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\2\263\1\u079d\10\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\3\263\1\u079e\7\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\4\263\1\u079f\6\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\5\263\1\u07a0\5\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\6\263\1\u07a1"+
+ "\4\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\7\263"+
+ "\1\u07a2\3\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\10\263\1\u07a3\2\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\11\263\1\u07a4\1\263\1\u03d2\40\263\1\344\1\u03de"+
+ "\1\u03df\1\344\1\u07a5\1\344\1\u017c\13\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\2\344\1\u07a6\1\u017c\13\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\1\u07a7\12\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\1\344\1\u07a8\11\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\2\344\1\u07a9\10\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\3\344\1\u07aa"+
+ "\7\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\4\344"+
+ "\1\u07ab\6\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\5\344\1\u07ac\5\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\6\344\1\u07ad\4\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\7\344\1\u07ae\3\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\10\344\1\u07af\2\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\11\344\1\u07b0\1\344\1\u03e1"+
+ "\40\344\1\276\1\300\1\u02bf\3\276\1\u07b1\13\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\4\276\1\u07b2\12\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\5\276\1\u07b3\11\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\6\276\1\u07b4\10\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\7\276\1\u07b5\7\276\1\u02c1\41\276\1\300\1\u02bf\10\276"+
+ "\1\u07b6\6\276\1\u02c1\41\276\1\300\1\u02bf\11\276\1\u07b7"+
+ "\5\276\1\u02c1\41\276\1\300\1\u02bf\12\276\1\u07b8\4\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\13\276\1\u07b9\3\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\14\276\1\u07ba\2\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\15\276\1\u07bb\1\276\1\u02c1\40\276\5\0"+
+ "\1\u07bc\1\0\1\165\1\33\4\0\1\33\6\0\27\42"+
+ "\1\0\1\33\1\0\1\42\1\33\1\42\7\0\1\164"+
+ "\1\0\1\165\14\0\2\164\1\u07bd\24\164\3\0\1\164"+
+ "\1\0\1\164\3\0\2\u0384\1\0\1\u07be\15\0\1\u0386"+
+ "\41\0\2\u0384\2\0\1\u07bf\14\0\1\u0386\41\0\2\u0384"+
+ "\3\0\1\u07c0\13\0\1\u0386\41\0\2\u0384\4\0\1\u07c1"+
+ "\12\0\1\u0386\41\0\2\u0384\5\0\1\u07c2\11\0\1\u0386"+
+ "\41\0\2\u0384\6\0\1\u07c3\10\0\1\u0386\41\0\2\u0384"+
+ "\7\0\1\u07c4\7\0\1\u0386\41\0\2\u0384\10\0\1\u07c5"+
+ "\6\0\1\u0386\41\0\2\u0384\11\0\1\u07c6\5\0\1\u0386"+
+ "\41\0\2\u0384\12\0\1\u07c7\4\0\1\u0386\41\0\2\u0384"+
+ "\13\0\1\u07c8\3\0\1\u0386\41\0\2\u0384\14\0\1\u07c9"+
+ "\2\0\1\u0386\41\0\2\u0384\15\0\1\u07ca\1\0\1\u0386"+
+ "\41\0\1\u0312\1\u0313\1\0\1\u07cb\15\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\2\0\1\u07cc\14\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\3\0\1\u07cd\13\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\4\0\1\u07ce\12\0\1\u0315\41\0\1\u0312\1\u0313\5\0"+
+ "\1\u07cf\11\0\1\u0315\41\0\1\u0312\1\u0313\6\0\1\u07d0"+
+ "\10\0\1\u0315\41\0\1\u0312\1\u0313\7\0\1\u07d1\7\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\10\0\1\u07d2\6\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\11\0\1\u07d3\5\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\12\0\1\u07d4\4\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\13\0\1\u07d5\3\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\14\0\1\u07d6\2\0\1\u0315\41\0\1\u0312\1\u0313\15\0"+
+ "\1\u07d7\1\0\1\u0315\41\0\2\u03a1\1\0\1\u07d8\15\0"+
+ "\1\u03a3\41\0\2\u03a1\2\0\1\u07d9\14\0\1\u03a3\41\0"+
+ "\2\u03a1\3\0\1\u07da\13\0\1\u03a3\41\0\2\u03a1\4\0"+
+ "\1\u07db\12\0\1\u03a3\41\0\2\u03a1\5\0\1\u07dc\11\0"+
+ "\1\u03a3\41\0\2\u03a1\6\0\1\u07dd\10\0\1\u03a3\41\0"+
+ "\2\u03a1\7\0\1\u07de\7\0\1\u03a3\41\0\2\u03a1\10\0"+
+ "\1\u07df\6\0\1\u03a3\41\0\2\u03a1\11\0\1\u07e0\5\0"+
+ "\1\u03a3\41\0\2\u03a1\12\0\1\u07e1\4\0\1\u03a3\41\0"+
+ "\2\u03a1\13\0\1\u07e2\3\0\1\u03a3\41\0\2\u03a1\14\0"+
+ "\1\u07e3\2\0\1\u03a3\41\0\2\u03a1\15\0\1\u07e4\1\0"+
+ "\1\u03a3\40\0\1\276\1\u03b0\1\u03b1\1\276\1\u07e5\15\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\2\276\1\u07e6\14\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\3\276\1\u07e7\13\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\4\276\1\u07e8\12\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\5\276\1\u07e9\11\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\6\276\1\u07ea\10\276\1\u03b3\41\276\1\u03b0\1\u03b1\7\276"+
+ "\1\u07eb\7\276\1\u03b3\41\276\1\u03b0\1\u03b1\10\276\1\u07ec"+
+ "\6\276\1\u03b3\41\276\1\u03b0\1\u03b1\11\276\1\u07ed\5\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\12\276\1\u07ee\4\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\13\276\1\u07ef\3\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\14\276\1\u07f0\2\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\15\276\1\u07f1\1\276\1\u03b3\41\276\1\u033d\1\u033e"+
+ "\1\276\1\u07f2\15\276\1\u0340\41\276\1\u033d\1\u033e\2\276"+
+ "\1\u07f3\14\276\1\u0340\41\276\1\u033d\1\u033e\3\276\1\u07f4"+
+ "\13\276\1\u0340\41\276\1\u033d\1\u033e\4\276\1\u07f5\12\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\5\276\1\u07f6\11\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\6\276\1\u07f7\10\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\7\276\1\u07f8\7\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\10\276\1\u07f9\6\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\11\276\1\u07fa\5\276\1\u0340\41\276\1\u033d\1\u033e\12\276"+
+ "\1\u07fb\4\276\1\u0340\41\276\1\u033d\1\u033e\13\276\1\u07fc"+
+ "\3\276\1\u0340\41\276\1\u033d\1\u033e\14\276\1\u07fd\2\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\15\276\1\u07fe\1\276\1\u0340"+
+ "\41\276\1\300\1\u02bf\1\276\1\u07ff\15\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\2\276\1\u0800\14\276\1\u02c1\40\276\1\263"+
+ "\1\u03cf\1\u03d0\1\263\1\u0801\1\263\1\u0136\13\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\2\263\1\u0802\1\u0136\13\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\u0803\12\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\263\1\u0804\11\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\2\263\1\u0805"+
+ "\10\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\3\263"+
+ "\1\u0806\7\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\4\263\1\u0807\6\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\5\263\1\u0808\5\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\6\263\1\u0809\4\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\7\263\1\u080a\3\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\10\263\1\u080b\2\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\11\263\1\u080c\1\263"+
+ "\1\u03d2\40\263\1\344\1\u03de\1\u03df\1\344\1\u080d\1\344"+
+ "\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df\2\344\1\u080e"+
+ "\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\1\u080f\12\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\1\344\1\u0810\11\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\2\344\1\u0811\10\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\3\344\1\u0812\7\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\4\344\1\u0813\6\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\5\344\1\u0814\5\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\6\344\1\u0815\4\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\7\344\1\u0816"+
+ "\3\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\10\344"+
+ "\1\u0817\2\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\11\344\1\u0818\1\344\1\u03e1\40\344\1\276\1\300\1\u02bf"+
+ "\3\276\1\u0819\13\276\1\u02c1\41\276\1\300\1\u02bf\4\276"+
+ "\1\u081a\12\276\1\u02c1\41\276\1\300\1\u02bf\5\276\1\u081b"+
+ "\11\276\1\u02c1\41\276\1\300\1\u02bf\6\276\1\u081c\10\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\7\276\1\u081d\7\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\10\276\1\u081e\6\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\11\276\1\u081f\5\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\12\276\1\u0820\4\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\13\276\1\u0821\3\276\1\u02c1\41\276\1\300\1\u02bf\14\276"+
+ "\1\u0822\2\276\1\u02c1\41\276\1\300\1\u02bf\15\276\1\u0823"+
+ "\1\276\1\u02c1\40\276\5\0\1\164\1\0\1\165\14\0"+
+ "\1\164\1\u0824\25\164\3\0\1\164\1\0\1\164\7\0"+
+ "\1\164\1\0\1\165\14\0\12\164\1\u0825\14\164\3\0"+
+ "\1\164\1\0\1\164\3\0\2\u0384\1\0\1\u0826\15\0"+
+ "\1\u0386\41\0\2\u0384\2\0\1\u0827\14\0\1\u0386\41\0"+
+ "\2\u0384\3\0\1\u0828\13\0\1\u0386\41\0\2\u0384\4\0"+
+ "\1\u0829\12\0\1\u0386\41\0\2\u0384\5\0\1\u082a\11\0"+
+ "\1\u0386\41\0\2\u0384\6\0\1\u082b\10\0\1\u0386\41\0"+
+ "\2\u0384\7\0\1\u082c\7\0\1\u0386\41\0\2\u0384\10\0"+
+ "\1\u082d\6\0\1\u0386\41\0\2\u0384\11\0\1\u082e\5\0"+
+ "\1\u0386\41\0\2\u0384\12\0\1\u082f\4\0\1\u0386\41\0"+
+ "\2\u0384\13\0\1\u0830\3\0\1\u0386\41\0\2\u0384\14\0"+
+ "\1\u0831\2\0\1\u0386\41\0\2\u0384\15\0\1\u0832\1\0"+
+ "\1\u0386\41\0\1\u0312\1\u0313\1\0\1\u0833\15\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\2\0\1\u0834\14\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\3\0\1\u0835\13\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\4\0\1\u0836\12\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\5\0\1\u0837\11\0\1\u0315\41\0\1\u0312\1\u0313\6\0"+
+ "\1\u0838\10\0\1\u0315\41\0\1\u0312\1\u0313\7\0\1\u0839"+
+ "\7\0\1\u0315\41\0\1\u0312\1\u0313\10\0\1\u083a\6\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\11\0\1\u083b\5\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\12\0\1\u083c\4\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\13\0\1\u083d\3\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\14\0\1\u083e\2\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\15\0\1\u083f\1\0\1\u0315\41\0\2\u03a1\1\0\1\u0840"+
+ "\15\0\1\u03a3\41\0\2\u03a1\2\0\1\u0841\14\0\1\u03a3"+
+ "\41\0\2\u03a1\3\0\1\u0842\13\0\1\u03a3\41\0\2\u03a1"+
+ "\4\0\1\u0843\12\0\1\u03a3\41\0\2\u03a1\5\0\1\u0844"+
+ "\11\0\1\u03a3\41\0\2\u03a1\6\0\1\u0845\10\0\1\u03a3"+
+ "\41\0\2\u03a1\7\0\1\u0846\7\0\1\u03a3\41\0\2\u03a1"+
+ "\10\0\1\u0847\6\0\1\u03a3\41\0\2\u03a1\11\0\1\u0848"+
+ "\5\0\1\u03a3\41\0\2\u03a1\12\0\1\u0849\4\0\1\u03a3"+
+ "\41\0\2\u03a1\13\0\1\u084a\3\0\1\u03a3\41\0\2\u03a1"+
+ "\14\0\1\u084b\2\0\1\u03a3\41\0\2\u03a1\15\0\1\u084c"+
+ "\1\0\1\u03a3\40\0\1\276\1\u03b0\1\u03b1\1\276\1\u084d"+
+ "\15\276\1\u03b3\41\276\1\u03b0\1\u03b1\2\276\1\u084e\14\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\3\276\1\u084f\13\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\4\276\1\u0850\12\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\5\276\1\u0851\11\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\6\276\1\u0852\10\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\7\276\1\u0853\7\276\1\u03b3\41\276\1\u03b0\1\u03b1\10\276"+
+ "\1\u0854\6\276\1\u03b3\41\276\1\u03b0\1\u03b1\11\276\1\u0855"+
+ "\5\276\1\u03b3\41\276\1\u03b0\1\u03b1\12\276\1\u0856\4\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\13\276\1\u0857\3\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\14\276\1\u0858\2\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\15\276\1\u0859\1\276\1\u03b3\41\276\1\u033d"+
+ "\1\u033e\1\276\1\u085a\15\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\2\276\1\u085b\14\276\1\u0340\41\276\1\u033d\1\u033e\3\276"+
+ "\1\u085c\13\276\1\u0340\41\276\1\u033d\1\u033e\4\276\1\u085d"+
+ "\12\276\1\u0340\41\276\1\u033d\1\u033e\5\276\1\u085e\11\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\6\276\1\u085f\10\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\7\276\1\u0860\7\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\10\276\1\u0861\6\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\11\276\1\u0862\5\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\12\276\1\u0863\4\276\1\u0340\41\276\1\u033d\1\u033e\13\276"+
+ "\1\u0864\3\276\1\u0340\41\276\1\u033d\1\u033e\14\276\1\u0865"+
+ "\2\276\1\u0340\41\276\1\u033d\1\u033e\15\276\1\u0866\1\276"+
+ "\1\u0340\41\276\1\300\1\u02bf\1\276\1\u0867\15\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\2\276\1\u0868\14\276\1\u02c1\40\276"+
+ "\1\263\1\u03cf\1\u03d0\1\263\1\u0869\1\263\1\u0136\13\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\2\263\1\u086a\1\u0136\13\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\u086b\12\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\263\1\u086c"+
+ "\11\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\2\263"+
+ "\1\u086d\10\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\3\263\1\u086e\7\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\4\263\1\u086f\6\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\5\263\1\u0870\5\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\6\263\1\u0871\4\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\7\263\1\u0872\3\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\10\263\1\u0873\2\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\11\263\1\u0874"+
+ "\1\263\1\u03d2\40\263\1\344\1\u03de\1\u03df\1\344\1\u0875"+
+ "\1\344\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df\2\344"+
+ "\1\u0876\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\1\u0877\12\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\1\344\1\u0878\11\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\2\344\1\u0879\10\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\3\344\1\u087a\7\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\4\344\1\u087b\6\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\5\344\1\u087c\5\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\6\344\1\u087d"+
+ "\4\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\7\344"+
+ "\1\u087e\3\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\10\344\1\u087f\2\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\11\344\1\u0880\1\344\1\u03e1\40\344\1\276\1\300"+
+ "\1\u02bf\3\276\1\u0881\13\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\4\276\1\u0882\12\276\1\u02c1\41\276\1\300\1\u02bf\5\276"+
+ "\1\u0883\11\276\1\u02c1\41\276\1\300\1\u02bf\6\276\1\u0884"+
+ "\10\276\1\u02c1\41\276\1\300\1\u02bf\7\276\1\u0885\7\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\10\276\1\u0886\6\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\11\276\1\u0887\5\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\12\276\1\u0888\4\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\13\276\1\u0889\3\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\14\276\1\u088a\2\276\1\u02c1\41\276\1\300\1\u02bf\15\276"+
+ "\1\u088b\1\276\1\u02c1\40\276\5\0\1\164\1\0\1\165"+
+ "\14\0\2\164\1\u088c\24\164\3\0\1\164\1\0\1\164"+
+ "\7\0\1\164\1\0\1\165\14\0\4\164\1\u088d\22\164"+
+ "\3\0\1\164\1\0\1\164\3\0\2\u0384\1\0\1\u088e"+
+ "\15\0\1\u0386\41\0\2\u0384\2\0\1\u088f\14\0\1\u0386"+
+ "\41\0\2\u0384\3\0\1\u0890\13\0\1\u0386\41\0\2\u0384"+
+ "\4\0\1\u0891\12\0\1\u0386\41\0\2\u0384\5\0\1\u0892"+
+ "\11\0\1\u0386\41\0\2\u0384\6\0\1\u0893\10\0\1\u0386"+
+ "\41\0\2\u0384\7\0\1\u0894\7\0\1\u0386\41\0\2\u0384"+
+ "\10\0\1\u0895\6\0\1\u0386\41\0\2\u0384\11\0\1\u0896"+
+ "\5\0\1\u0386\41\0\2\u0384\12\0\1\u0897\4\0\1\u0386"+
+ "\41\0\2\u0384\13\0\1\u0898\3\0\1\u0386\41\0\2\u0384"+
+ "\14\0\1\u0899\2\0\1\u0386\41\0\2\u0384\15\0\1\u089a"+
+ "\1\0\1\u0386\41\0\1\u0312\1\u0313\1\0\1\u089b\15\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\2\0\1\u089c\14\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\3\0\1\u089d\13\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\4\0\1\u089e\12\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\5\0\1\u089f\11\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\6\0\1\u08a0\10\0\1\u0315\41\0\1\u0312\1\u0313\7\0"+
+ "\1\u08a1\7\0\1\u0315\41\0\1\u0312\1\u0313\10\0\1\u08a2"+
+ "\6\0\1\u0315\41\0\1\u0312\1\u0313\11\0\1\u08a3\5\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\12\0\1\u08a4\4\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\13\0\1\u08a5\3\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\14\0\1\u08a6\2\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\15\0\1\u08a7\1\0\1\u0315\41\0\2\u03a1\1\0"+
+ "\1\u08a8\15\0\1\u03a3\41\0\2\u03a1\2\0\1\u08a9\14\0"+
+ "\1\u03a3\41\0\2\u03a1\3\0\1\u08aa\13\0\1\u03a3\41\0"+
+ "\2\u03a1\4\0\1\u08ab\12\0\1\u03a3\41\0\2\u03a1\5\0"+
+ "\1\u08ac\11\0\1\u03a3\41\0\2\u03a1\6\0\1\u08ad\10\0"+
+ "\1\u03a3\41\0\2\u03a1\7\0\1\u08ae\7\0\1\u03a3\41\0"+
+ "\2\u03a1\10\0\1\u08af\6\0\1\u03a3\41\0\2\u03a1\11\0"+
+ "\1\u08b0\5\0\1\u03a3\41\0\2\u03a1\12\0\1\u08b1\4\0"+
+ "\1\u03a3\41\0\2\u03a1\13\0\1\u08b2\3\0\1\u03a3\41\0"+
+ "\2\u03a1\14\0\1\u08b3\2\0\1\u03a3\41\0\2\u03a1\15\0"+
+ "\1\u08b4\1\0\1\u03a3\40\0\1\276\1\u03b0\1\u03b1\1\276"+
+ "\1\u08b5\15\276\1\u03b3\41\276\1\u03b0\1\u03b1\2\276\1\u08b6"+
+ "\14\276\1\u03b3\41\276\1\u03b0\1\u03b1\3\276\1\u08b7\13\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\4\276\1\u08b8\12\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\5\276\1\u08b9\11\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\6\276\1\u08ba\10\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\7\276\1\u08bb\7\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\10\276\1\u08bc\6\276\1\u03b3\41\276\1\u03b0\1\u03b1\11\276"+
+ "\1\u08bd\5\276\1\u03b3\41\276\1\u03b0\1\u03b1\12\276\1\u08be"+
+ "\4\276\1\u03b3\41\276\1\u03b0\1\u03b1\13\276\1\u08bf\3\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\14\276\1\u08c0\2\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\15\276\1\u08c1\1\276\1\u03b3\41\276"+
+ "\1\u033d\1\u033e\1\276\1\u08c2\15\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\2\276\1\u08c3\14\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\3\276\1\u08c4\13\276\1\u0340\41\276\1\u033d\1\u033e\4\276"+
+ "\1\u08c5\12\276\1\u0340\41\276\1\u033d\1\u033e\5\276\1\u08c6"+
+ "\11\276\1\u0340\41\276\1\u033d\1\u033e\6\276\1\u08c7\10\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\7\276\1\u08c8\7\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\10\276\1\u08c9\6\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\11\276\1\u08ca\5\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\12\276\1\u08cb\4\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\13\276\1\u08cc\3\276\1\u0340\41\276\1\u033d\1\u033e\14\276"+
+ "\1\u08cd\2\276\1\u0340\41\276\1\u033d\1\u033e\15\276\1\u08ce"+
+ "\1\276\1\u0340\41\276\1\300\1\u02bf\1\276\1\u08cf\15\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\2\276\1\u08d0\14\276\1\u02c1"+
+ "\40\276\1\263\1\u03cf\1\u03d0\1\263\1\u08d1\1\263\1\u0136"+
+ "\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\2\263\1\u08d2\1\u0136"+
+ "\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\u08d3"+
+ "\12\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\263"+
+ "\1\u08d4\11\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\2\263\1\u08d5\10\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\3\263\1\u08d6\7\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\4\263\1\u08d7\6\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\5\263\1\u08d8\5\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\6\263\1\u08d9\4\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\7\263\1\u08da\3\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\10\263\1\u08db"+
+ "\2\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\11\263"+
+ "\1\u08dc\1\263\1\u03d2\40\263\1\344\1\u03de\1\u03df\1\344"+
+ "\1\u08dd\1\344\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\2\344\1\u08de\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\1\u08df\12\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\1\344\1\u08e0\11\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\2\344\1\u08e1\10\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\3\344\1\u08e2\7\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\4\344\1\u08e3\6\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\5\344\1\u08e4"+
+ "\5\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\6\344"+
+ "\1\u08e5\4\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\7\344\1\u08e6\3\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\10\344\1\u08e7\2\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\11\344\1\u08e8\1\344\1\u03e1\40\344\1\276"+
+ "\1\300\1\u02bf\3\276\1\u08e9\13\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\4\276\1\u08ea\12\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\5\276\1\u08eb\11\276\1\u02c1\41\276\1\300\1\u02bf\6\276"+
+ "\1\u08ec\10\276\1\u02c1\41\276\1\300\1\u02bf\7\276\1\u08ed"+
+ "\7\276\1\u02c1\41\276\1\300\1\u02bf\10\276\1\u08ee\6\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\11\276\1\u08ef\5\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\12\276\1\u08f0\4\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\13\276\1\u08f1\3\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\14\276\1\u08f2\2\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\15\276\1\u08f3\1\276\1\u02c1\40\276\5\0\1\164\1\0"+
+ "\1\165\14\0\20\164\1\u08f4\6\164\3\0\1\164\1\0"+
+ "\1\164\7\0\1\164\1\0\1\165\14\0\3\164\1\u08f5"+
+ "\23\164\3\0\1\164\1\0\1\164\3\0\2\u0384\1\0"+
+ "\1\u08f6\15\0\1\u0386\41\0\2\u0384\2\0\1\u08f7\14\0"+
+ "\1\u0386\41\0\2\u0384\3\0\1\u08f8\13\0\1\u0386\41\0"+
+ "\2\u0384\4\0\1\u08f9\12\0\1\u0386\41\0\2\u0384\5\0"+
+ "\1\u08fa\11\0\1\u0386\41\0\2\u0384\6\0\1\u08fb\10\0"+
+ "\1\u0386\41\0\2\u0384\7\0\1\u08fc\7\0\1\u0386\41\0"+
+ "\2\u0384\10\0\1\u08fd\6\0\1\u0386\41\0\2\u0384\11\0"+
+ "\1\u08fe\5\0\1\u0386\41\0\2\u0384\12\0\1\u08ff\4\0"+
+ "\1\u0386\41\0\2\u0384\13\0\1\u0900\3\0\1\u0386\41\0"+
+ "\2\u0384\14\0\1\u0901\2\0\1\u0386\41\0\2\u0384\15\0"+
+ "\1\u0902\1\0\1\u0386\41\0\1\u0312\1\u0313\1\0\1\u0903"+
+ "\15\0\1\u0315\41\0\1\u0312\1\u0313\2\0\1\u0904\14\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\3\0\1\u0905\13\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\4\0\1\u0906\12\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\5\0\1\u0907\11\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\6\0\1\u0908\10\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\7\0\1\u0909\7\0\1\u0315\41\0\1\u0312\1\u0313\10\0"+
+ "\1\u090a\6\0\1\u0315\41\0\1\u0312\1\u0313\11\0\1\u090b"+
+ "\5\0\1\u0315\41\0\1\u0312\1\u0313\12\0\1\u090c\4\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\13\0\1\u090d\3\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\14\0\1\u090e\2\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\15\0\1\u090f\1\0\1\u0315\41\0\2\u03a1"+
+ "\1\0\1\u0910\15\0\1\u03a3\41\0\2\u03a1\2\0\1\u0911"+
+ "\14\0\1\u03a3\41\0\2\u03a1\3\0\1\u0912\13\0\1\u03a3"+
+ "\41\0\2\u03a1\4\0\1\u0913\12\0\1\u03a3\41\0\2\u03a1"+
+ "\5\0\1\u0914\11\0\1\u03a3\41\0\2\u03a1\6\0\1\u0915"+
+ "\10\0\1\u03a3\41\0\2\u03a1\7\0\1\u0916\7\0\1\u03a3"+
+ "\41\0\2\u03a1\10\0\1\u0917\6\0\1\u03a3\41\0\2\u03a1"+
+ "\11\0\1\u0918\5\0\1\u03a3\41\0\2\u03a1\12\0\1\u0919"+
+ "\4\0\1\u03a3\41\0\2\u03a1\13\0\1\u091a\3\0\1\u03a3"+
+ "\41\0\2\u03a1\14\0\1\u091b\2\0\1\u03a3\41\0\2\u03a1"+
+ "\15\0\1\u091c\1\0\1\u03a3\40\0\1\276\1\u03b0\1\u03b1"+
+ "\1\276\1\u091d\15\276\1\u03b3\41\276\1\u03b0\1\u03b1\2\276"+
+ "\1\u091e\14\276\1\u03b3\41\276\1\u03b0\1\u03b1\3\276\1\u091f"+
+ "\13\276\1\u03b3\41\276\1\u03b0\1\u03b1\4\276\1\u0920\12\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\5\276\1\u0921\11\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\6\276\1\u0922\10\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\7\276\1\u0923\7\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\10\276\1\u0924\6\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\11\276\1\u0925\5\276\1\u03b3\41\276\1\u03b0\1\u03b1\12\276"+
+ "\1\u0926\4\276\1\u03b3\41\276\1\u03b0\1\u03b1\13\276\1\u0927"+
+ "\3\276\1\u03b3\41\276\1\u03b0\1\u03b1\14\276\1\u0928\2\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\15\276\1\u0929\1\276\1\u03b3"+
+ "\41\276\1\u033d\1\u033e\1\276\1\u092a\15\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\2\276\1\u092b\14\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\3\276\1\u092c\13\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\4\276\1\u092d\12\276\1\u0340\41\276\1\u033d\1\u033e\5\276"+
+ "\1\u092e\11\276\1\u0340\41\276\1\u033d\1\u033e\6\276\1\u092f"+
+ "\10\276\1\u0340\41\276\1\u033d\1\u033e\7\276\1\u0930\7\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\10\276\1\u0931\6\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\11\276\1\u0932\5\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\12\276\1\u0933\4\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\13\276\1\u0934\3\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\14\276\1\u0935\2\276\1\u0340\41\276\1\u033d\1\u033e\15\276"+
+ "\1\u0936\1\276\1\u0340\41\276\1\300\1\u02bf\1\276\1\u0937"+
+ "\15\276\1\u02c1\41\276\1\300\1\u02bf\2\276\1\u0938\14\276"+
+ "\1\u02c1\40\276\1\263\1\u03cf\1\u03d0\1\263\1\u0939\1\263"+
+ "\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\2\263\1\u093a"+
+ "\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\1\u093b\12\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\1\263\1\u093c\11\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\2\263\1\u093d\10\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\3\263\1\u093e\7\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\4\263\1\u093f\6\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\5\263\1\u0940\5\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\6\263\1\u0941\4\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\7\263\1\u0942"+
+ "\3\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\10\263"+
+ "\1\u0943\2\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\11\263\1\u0944\1\263\1\u03d2\40\263\1\344\1\u03de\1\u03df"+
+ "\1\344\1\u0945\1\344\1\u017c\13\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\2\344\1\u0946\1\u017c\13\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\1\u0947\12\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\1\344\1\u0948\11\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\2\344\1\u0949\10\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\3\344\1\u094a\7\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\4\344\1\u094b"+
+ "\6\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\5\344"+
+ "\1\u094c\5\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\6\344\1\u094d\4\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\7\344\1\u094e\3\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\10\344\1\u094f\2\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\11\344\1\u0950\1\344\1\u03e1\40\344"+
+ "\1\276\1\300\1\u02bf\3\276\1\u0951\13\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\4\276\1\u0952\12\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\5\276\1\u0953\11\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\6\276\1\u0954\10\276\1\u02c1\41\276\1\300\1\u02bf\7\276"+
+ "\1\u0955\7\276\1\u02c1\41\276\1\300\1\u02bf\10\276\1\u0956"+
+ "\6\276\1\u02c1\41\276\1\300\1\u02bf\11\276\1\u0957\5\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\12\276\1\u0958\4\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\13\276\1\u0959\3\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\14\276\1\u095a\2\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\15\276\1\u095b\1\276\1\u02c1\40\276\5\0\1\164"+
+ "\1\0\1\165\14\0\1\164\1\u095c\25\164\3\0\1\164"+
+ "\1\0\1\164\7\0\1\164\1\0\1\165\14\0\11\164"+
+ "\1\u046d\15\164\3\0\1\164\1\0\1\164\3\0\2\u0384"+
+ "\1\0\1\u095d\15\0\1\u0386\41\0\2\u0384\2\0\1\u095e"+
+ "\14\0\1\u0386\41\0\2\u0384\3\0\1\u095f\13\0\1\u0386"+
+ "\41\0\2\u0384\4\0\1\u0960\12\0\1\u0386\41\0\2\u0384"+
+ "\5\0\1\u0961\11\0\1\u0386\41\0\2\u0384\6\0\1\u0962"+
+ "\10\0\1\u0386\41\0\2\u0384\7\0\1\u0963\7\0\1\u0386"+
+ "\41\0\2\u0384\10\0\1\u0964\6\0\1\u0386\41\0\2\u0384"+
+ "\11\0\1\u0965\5\0\1\u0386\41\0\2\u0384\12\0\1\u0966"+
+ "\4\0\1\u0386\41\0\2\u0384\13\0\1\u0967\3\0\1\u0386"+
+ "\41\0\2\u0384\14\0\1\u0968\2\0\1\u0386\41\0\2\u0384"+
+ "\15\0\1\u0969\1\0\1\u0386\41\0\1\u0312\1\u0313\1\0"+
+ "\1\u096a\15\0\1\u0315\41\0\1\u0312\1\u0313\2\0\1\u096b"+
+ "\14\0\1\u0315\41\0\1\u0312\1\u0313\3\0\1\u096c\13\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\4\0\1\u096d\12\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\5\0\1\u096e\11\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\6\0\1\u096f\10\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\7\0\1\u0970\7\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\10\0\1\u0971\6\0\1\u0315\41\0\1\u0312\1\u0313\11\0"+
+ "\1\u0972\5\0\1\u0315\41\0\1\u0312\1\u0313\12\0\1\u0973"+
+ "\4\0\1\u0315\41\0\1\u0312\1\u0313\13\0\1\u0974\3\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\14\0\1\u0975\2\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\15\0\1\u0976\1\0\1\u0315\41\0"+
+ "\2\u03a1\1\0\1\u0977\15\0\1\u03a3\41\0\2\u03a1\2\0"+
+ "\1\u0978\14\0\1\u03a3\41\0\2\u03a1\3\0\1\u0979\13\0"+
+ "\1\u03a3\41\0\2\u03a1\4\0\1\u097a\12\0\1\u03a3\41\0"+
+ "\2\u03a1\5\0\1\u097b\11\0\1\u03a3\41\0\2\u03a1\6\0"+
+ "\1\u097c\10\0\1\u03a3\41\0\2\u03a1\7\0\1\u097d\7\0"+
+ "\1\u03a3\41\0\2\u03a1\10\0\1\u097e\6\0\1\u03a3\41\0"+
+ "\2\u03a1\11\0\1\u097f\5\0\1\u03a3\41\0\2\u03a1\12\0"+
+ "\1\u0980\4\0\1\u03a3\41\0\2\u03a1\13\0\1\u0981\3\0"+
+ "\1\u03a3\41\0\2\u03a1\14\0\1\u0982\2\0\1\u03a3\41\0"+
+ "\2\u03a1\15\0\1\u0983\1\0\1\u03a3\40\0\1\276\1\u03b0"+
+ "\1\u03b1\1\276\1\u0984\15\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\2\276\1\u0985\14\276\1\u03b3\41\276\1\u03b0\1\u03b1\3\276"+
+ "\1\u0986\13\276\1\u03b3\41\276\1\u03b0\1\u03b1\4\276\1\u0987"+
+ "\12\276\1\u03b3\41\276\1\u03b0\1\u03b1\5\276\1\u0988\11\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\6\276\1\u0989\10\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\7\276\1\u098a\7\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\10\276\1\u098b\6\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\11\276\1\u098c\5\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\12\276\1\u098d\4\276\1\u03b3\41\276\1\u03b0\1\u03b1\13\276"+
+ "\1\u098e\3\276\1\u03b3\41\276\1\u03b0\1\u03b1\14\276\1\u098f"+
+ "\2\276\1\u03b3\41\276\1\u03b0\1\u03b1\15\276\1\u0990\1\276"+
+ "\1\u03b3\41\276\1\u033d\1\u033e\1\276\1\u0991\15\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\2\276\1\u0992\14\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\3\276\1\u0993\13\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\4\276\1\u0994\12\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\5\276\1\u0995\11\276\1\u0340\41\276\1\u033d\1\u033e\6\276"+
+ "\1\u0996\10\276\1\u0340\41\276\1\u033d\1\u033e\7\276\1\u0997"+
+ "\7\276\1\u0340\41\276\1\u033d\1\u033e\10\276\1\u0998\6\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\11\276\1\u0999\5\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\12\276\1\u099a\4\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\13\276\1\u099b\3\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\14\276\1\u099c\2\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\15\276\1\u099d\1\276\1\u0340\41\276\1\300\1\u02bf\1\276"+
+ "\1\u099e\15\276\1\u02c1\41\276\1\300\1\u02bf\2\276\1\u099f"+
+ "\14\276\1\u02c1\40\276\1\263\1\u03cf\1\u03d0\1\263\1\u09a0"+
+ "\1\263\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\2\263"+
+ "\1\u09a1\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\1\u09a2\12\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\1\263\1\u09a3\11\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\2\263\1\u09a4\10\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\3\263\1\u09a5\7\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\4\263\1\u09a6\6\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\5\263\1\u09a7\5\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\6\263\1\u09a8"+
+ "\4\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\7\263"+
+ "\1\u09a9\3\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\10\263\1\u09aa\2\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\11\263\1\u09ab\1\263\1\u03d2\40\263\1\344\1\u03de"+
+ "\1\u03df\1\344\1\u09ac\1\344\1\u017c\13\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\2\344\1\u09ad\1\u017c\13\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\1\u09ae\12\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\1\344\1\u09af\11\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\2\344\1\u09b0\10\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\3\344\1\u09b1"+
+ "\7\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\4\344"+
+ "\1\u09b2\6\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\5\344\1\u09b3\5\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\6\344\1\u09b4\4\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\7\344\1\u09b5\3\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\10\344\1\u09b6\2\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\11\344\1\u09b7\1\344\1\u03e1"+
+ "\40\344\1\276\1\300\1\u02bf\3\276\1\u09b8\13\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\4\276\1\u09b9\12\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\5\276\1\u09ba\11\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\6\276\1\u09bb\10\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\7\276\1\u09bc\7\276\1\u02c1\41\276\1\300\1\u02bf\10\276"+
+ "\1\u09bd\6\276\1\u02c1\41\276\1\300\1\u02bf\11\276\1\u09be"+
+ "\5\276\1\u02c1\41\276\1\300\1\u02bf\12\276\1\u09bf\4\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\13\276\1\u09c0\3\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\14\276\1\u09c1\2\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\15\276\1\u09c2\1\276\1\u02c1\40\276\5\0"+
+ "\1\u09c3\1\0\1\165\14\0\27\164\3\0\1\164\1\0"+
+ "\1\164\3\0\2\u0384\1\0\1\u09c4\15\0\1\u0386\41\0"+
+ "\2\u0384\2\0\1\u09c5\14\0\1\u0386\41\0\2\u0384\3\0"+
+ "\1\u09c6\13\0\1\u0386\41\0\2\u0384\4\0\1\u09c7\12\0"+
+ "\1\u0386\41\0\2\u0384\5\0\1\u09c8\11\0\1\u0386\41\0"+
+ "\2\u0384\6\0\1\u09c9\10\0\1\u0386\41\0\2\u0384\7\0"+
+ "\1\u09ca\7\0\1\u0386\41\0\2\u0384\10\0\1\u09cb\6\0"+
+ "\1\u0386\41\0\2\u0384\11\0\1\u09cc\5\0\1\u0386\41\0"+
+ "\2\u0384\12\0\1\u09cd\4\0\1\u0386\41\0\2\u0384\13\0"+
+ "\1\u09ce\3\0\1\u0386\41\0\2\u0384\14\0\1\u09cf\2\0"+
+ "\1\u0386\41\0\2\u0384\15\0\1\u09d0\1\0\1\u0386\41\0"+
+ "\1\u0312\1\u0313\1\0\1\u09d1\15\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\2\0\1\u09d2\14\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\3\0\1\u09d3\13\0\1\u0315\41\0\1\u0312\1\u0313\4\0"+
+ "\1\u09d4\12\0\1\u0315\41\0\1\u0312\1\u0313\5\0\1\u09d5"+
+ "\11\0\1\u0315\41\0\1\u0312\1\u0313\6\0\1\u09d6\10\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\7\0\1\u09d7\7\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\10\0\1\u09d8\6\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\11\0\1\u09d9\5\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\12\0\1\u09da\4\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\13\0\1\u09db\3\0\1\u0315\41\0\1\u0312\1\u0313\14\0"+
+ "\1\u09dc\2\0\1\u0315\41\0\1\u0312\1\u0313\15\0\1\u09dd"+
+ "\1\0\1\u0315\41\0\2\u03a1\1\0\1\u09de\15\0\1\u03a3"+
+ "\41\0\2\u03a1\2\0\1\u09df\14\0\1\u03a3\41\0\2\u03a1"+
+ "\3\0\1\u09e0\13\0\1\u03a3\41\0\2\u03a1\4\0\1\u09e1"+
+ "\12\0\1\u03a3\41\0\2\u03a1\5\0\1\u09e2\11\0\1\u03a3"+
+ "\41\0\2\u03a1\6\0\1\u09e3\10\0\1\u03a3\41\0\2\u03a1"+
+ "\7\0\1\u09e4\7\0\1\u03a3\41\0\2\u03a1\10\0\1\u09e5"+
+ "\6\0\1\u03a3\41\0\2\u03a1\11\0\1\u09e6\5\0\1\u03a3"+
+ "\41\0\2\u03a1\12\0\1\u09e7\4\0\1\u03a3\41\0\2\u03a1"+
+ "\13\0\1\u09e8\3\0\1\u03a3\41\0\2\u03a1\14\0\1\u09e9"+
+ "\2\0\1\u03a3\41\0\2\u03a1\15\0\1\u09ea\1\0\1\u03a3"+
+ "\40\0\1\276\1\u03b0\1\u03b1\1\276\1\u09eb\15\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\2\276\1\u09ec\14\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\3\276\1\u09ed\13\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\4\276\1\u09ee\12\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\5\276\1\u09ef\11\276\1\u03b3\41\276\1\u03b0\1\u03b1\6\276"+
+ "\1\u09f0\10\276\1\u03b3\41\276\1\u03b0\1\u03b1\7\276\1\u09f1"+
+ "\7\276\1\u03b3\41\276\1\u03b0\1\u03b1\10\276\1\u09f2\6\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\11\276\1\u09f3\5\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\12\276\1\u09f4\4\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\13\276\1\u09f5\3\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\14\276\1\u09f6\2\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\15\276\1\u09f7\1\276\1\u03b3\41\276\1\u033d\1\u033e\1\276"+
+ "\1\u09f8\15\276\1\u0340\41\276\1\u033d\1\u033e\2\276\1\u09f9"+
+ "\14\276\1\u0340\41\276\1\u033d\1\u033e\3\276\1\u09fa\13\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\4\276\1\u09fb\12\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\5\276\1\u09fc\11\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\6\276\1\u09fd\10\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\7\276\1\u09fe\7\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\10\276\1\u09ff\6\276\1\u0340\41\276\1\u033d\1\u033e\11\276"+
+ "\1\u0a00\5\276\1\u0340\41\276\1\u033d\1\u033e\12\276\1\u0a01"+
+ "\4\276\1\u0340\41\276\1\u033d\1\u033e\13\276\1\u0a02\3\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\14\276\1\u0a03\2\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\15\276\1\u0a04\1\276\1\u0340\41\276"+
+ "\1\300\1\u02bf\1\276\1\u0a05\15\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\2\276\1\u0a06\14\276\1\u02c1\40\276\1\263\1\u03cf"+
+ "\1\u03d0\1\263\1\u0a07\1\263\1\u0136\13\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\2\263\1\u0a08\1\u0136\13\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\1\u0a09\12\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\1\263\1\u0a0a\11\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\2\263\1\u0a0b\10\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\3\263\1\u0a0c"+
+ "\7\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\4\263"+
+ "\1\u0a0d\6\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\5\263\1\u0a0e\5\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\6\263\1\u0a0f\4\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\7\263\1\u0a10\3\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\10\263\1\u0a11\2\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\11\263\1\u0a12\1\263\1\u03d2"+
+ "\40\263\1\344\1\u03de\1\u03df\1\344\1\u0a13\1\344\1\u017c"+
+ "\13\344\1\u03e1\41\344\1\u03de\1\u03df\2\344\1\u0a14\1\u017c"+
+ "\13\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\1\u0a15"+
+ "\12\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\1\344"+
+ "\1\u0a16\11\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\2\344\1\u0a17\10\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\3\344\1\u0a18\7\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\4\344\1\u0a19\6\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\5\344\1\u0a1a\5\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\6\344\1\u0a1b\4\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\7\344\1\u0a1c\3\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\10\344\1\u0a1d"+
+ "\2\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\11\344"+
+ "\1\u0a1e\1\344\1\u03e1\40\344\1\276\1\300\1\u02bf\3\276"+
+ "\1\u0a1f\13\276\1\u02c1\41\276\1\300\1\u02bf\4\276\1\u0a20"+
+ "\12\276\1\u02c1\41\276\1\300\1\u02bf\5\276\1\u0a21\11\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\6\276\1\u0a22\10\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\7\276\1\u0a23\7\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\10\276\1\u0a24\6\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\11\276\1\u0a25\5\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\12\276\1\u0a26\4\276\1\u02c1\41\276\1\300\1\u02bf\13\276"+
+ "\1\u0a27\3\276\1\u02c1\41\276\1\300\1\u02bf\14\276\1\u0a28"+
+ "\2\276\1\u02c1\41\276\1\300\1\u02bf\15\276\1\u0a29\1\276"+
+ "\1\u02c1\40\276\5\0\1\164\1\0\1\165\14\0\10\164"+
+ "\1\u0a2a\16\164\3\0\1\164\1\0\1\164\3\0\2\u0384"+
+ "\1\0\1\u0a2b\15\0\1\u0386\41\0\2\u0384\2\0\1\u0a2c"+
+ "\14\0\1\u0386\41\0\2\u0384\3\0\1\u0a2d\13\0\1\u0386"+
+ "\41\0\2\u0384\4\0\1\u0a2e\12\0\1\u0386\41\0\2\u0384"+
+ "\5\0\1\u0a2f\11\0\1\u0386\41\0\2\u0384\6\0\1\u0a30"+
+ "\10\0\1\u0386\41\0\2\u0384\7\0\1\u0a31\7\0\1\u0386"+
+ "\41\0\2\u0384\10\0\1\u0a32\6\0\1\u0386\41\0\2\u0384"+
+ "\11\0\1\u0a33\5\0\1\u0386\41\0\2\u0384\12\0\1\u0a34"+
+ "\4\0\1\u0386\41\0\2\u0384\13\0\1\u0a35\3\0\1\u0386"+
+ "\41\0\2\u0384\14\0\1\u0a36\2\0\1\u0386\41\0\2\u0384"+
+ "\15\0\1\u0a37\1\0\1\u0386\41\0\1\u0312\1\u0313\1\0"+
+ "\1\u0a38\15\0\1\u0315\41\0\1\u0312\1\u0313\2\0\1\u0a39"+
+ "\14\0\1\u0315\41\0\1\u0312\1\u0313\3\0\1\u0a3a\13\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\4\0\1\u0a3b\12\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\5\0\1\u0a3c\11\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\6\0\1\u0a3d\10\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\7\0\1\u0a3e\7\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\10\0\1\u0a3f\6\0\1\u0315\41\0\1\u0312\1\u0313\11\0"+
+ "\1\u0a40\5\0\1\u0315\41\0\1\u0312\1\u0313\12\0\1\u0a41"+
+ "\4\0\1\u0315\41\0\1\u0312\1\u0313\13\0\1\u0a42\3\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\14\0\1\u0a43\2\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\15\0\1\u0a44\1\0\1\u0315\41\0"+
+ "\2\u03a1\1\0\1\u0a45\15\0\1\u03a3\41\0\2\u03a1\2\0"+
+ "\1\u0a46\14\0\1\u03a3\41\0\2\u03a1\3\0\1\u0a47\13\0"+
+ "\1\u03a3\41\0\2\u03a1\4\0\1\u0a48\12\0\1\u03a3\41\0"+
+ "\2\u03a1\5\0\1\u0a49\11\0\1\u03a3\41\0\2\u03a1\6\0"+
+ "\1\u0a4a\10\0\1\u03a3\41\0\2\u03a1\7\0\1\u0a4b\7\0"+
+ "\1\u03a3\41\0\2\u03a1\10\0\1\u0a4c\6\0\1\u03a3\41\0"+
+ "\2\u03a1\11\0\1\u0a4d\5\0\1\u03a3\41\0\2\u03a1\12\0"+
+ "\1\u0a4e\4\0\1\u03a3\41\0\2\u03a1\13\0\1\u0a4f\3\0"+
+ "\1\u03a3\41\0\2\u03a1\14\0\1\u0a50\2\0\1\u03a3\41\0"+
+ "\2\u03a1\15\0\1\u0a51\1\0\1\u03a3\40\0\1\276\1\u03b0"+
+ "\1\u03b1\1\276\1\u0a52\15\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\2\276\1\u0a53\14\276\1\u03b3\41\276\1\u03b0\1\u03b1\3\276"+
+ "\1\u0a54\13\276\1\u03b3\41\276\1\u03b0\1\u03b1\4\276\1\u0a55"+
+ "\12\276\1\u03b3\41\276\1\u03b0\1\u03b1\5\276\1\u0a56\11\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\6\276\1\u0a57\10\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\7\276\1\u0a58\7\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\10\276\1\u0a59\6\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\11\276\1\u0a5a\5\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\12\276\1\u0a5b\4\276\1\u03b3\41\276\1\u03b0\1\u03b1\13\276"+
+ "\1\u0a5c\3\276\1\u03b3\41\276\1\u03b0\1\u03b1\14\276\1\u0a5d"+
+ "\2\276\1\u03b3\41\276\1\u03b0\1\u03b1\15\276\1\u0a5e\1\276"+
+ "\1\u03b3\41\276\1\u033d\1\u033e\1\276\1\u0a5f\15\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\2\276\1\u0a60\14\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\3\276\1\u0a61\13\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\4\276\1\u0a62\12\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\5\276\1\u0a63\11\276\1\u0340\41\276\1\u033d\1\u033e\6\276"+
+ "\1\u0a64\10\276\1\u0340\41\276\1\u033d\1\u033e\7\276\1\u0a65"+
+ "\7\276\1\u0340\41\276\1\u033d\1\u033e\10\276\1\u0a66\6\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\11\276\1\u0a67\5\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\12\276\1\u0a68\4\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\13\276\1\u0a69\3\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\14\276\1\u0a6a\2\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\15\276\1\u0a6b\1\276\1\u0340\41\276\1\300\1\u02bf\1\276"+
+ "\1\u0a6c\15\276\1\u02c1\41\276\1\300\1\u02bf\2\276\1\u0a6d"+
+ "\14\276\1\u02c1\40\276\1\263\1\u03cf\1\u03d0\1\263\1\u0a6e"+
+ "\1\263\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\2\263"+
+ "\1\u0a6f\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\1\u0a70\12\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\1\263\1\u0a71\11\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\2\263\1\u0a72\10\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\3\263\1\u0a73\7\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\4\263\1\u0a74\6\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\5\263\1\u0a75\5\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\6\263\1\u0a76"+
+ "\4\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\7\263"+
+ "\1\u0a77\3\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\10\263\1\u0a78\2\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\11\263\1\u0a79\1\263\1\u03d2\40\263\1\344\1\u03de"+
+ "\1\u03df\1\344\1\u0a7a\1\344\1\u017c\13\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\2\344\1\u0a7b\1\u017c\13\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\1\u0a7c\12\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\1\344\1\u0a7d\11\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\2\344\1\u0a7e\10\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\3\344\1\u0a7f"+
+ "\7\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\4\344"+
+ "\1\u0a80\6\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\5\344\1\u0a81\5\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\6\344\1\u0a82\4\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\7\344\1\u0a83\3\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\10\344\1\u0a84\2\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\11\344\1\u0a85\1\344\1\u03e1"+
+ "\40\344\1\276\1\300\1\u02bf\3\276\1\u0a86\13\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\4\276\1\u0a87\12\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\5\276\1\u0a88\11\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\6\276\1\u0a89\10\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\7\276\1\u0a8a\7\276\1\u02c1\41\276\1\300\1\u02bf\10\276"+
+ "\1\u0a8b\6\276\1\u02c1\41\276\1\300\1\u02bf\11\276\1\u0a8c"+
+ "\5\276\1\u02c1\41\276\1\300\1\u02bf\12\276\1\u0a8d\4\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\13\276\1\u0a8e\3\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\14\276\1\u0a8f\2\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\15\276\1\u0a90\1\276\1\u02c1\40\276\5\0"+
+ "\1\164\1\0\1\165\14\0\4\164\1\u0a91\22\164\3\0"+
+ "\1\164\1\0\1\164\3\0\2\u0384\1\0\1\u0a92\15\0"+
+ "\1\u0386\41\0\2\u0384\2\0\1\u0a93\14\0\1\u0386\41\0"+
+ "\2\u0384\3\0\1\u0a94\13\0\1\u0386\41\0\2\u0384\4\0"+
+ "\1\u0a95\12\0\1\u0386\41\0\2\u0384\5\0\1\u0a96\11\0"+
+ "\1\u0386\41\0\2\u0384\6\0\1\u0a97\10\0\1\u0386\41\0"+
+ "\2\u0384\7\0\1\u0a98\7\0\1\u0386\41\0\2\u0384\10\0"+
+ "\1\u0a99\6\0\1\u0386\41\0\2\u0384\11\0\1\u0a9a\5\0"+
+ "\1\u0386\41\0\2\u0384\12\0\1\u0a9b\4\0\1\u0386\41\0"+
+ "\2\u0384\13\0\1\u0a9c\3\0\1\u0386\41\0\2\u0384\14\0"+
+ "\1\u0a9d\2\0\1\u0386\41\0\2\u0384\15\0\1\u0a9e\1\0"+
+ "\1\u0386\41\0\1\u0312\1\u0313\1\0\1\u0a9f\15\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\2\0\1\u0aa0\14\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\3\0\1\u0aa1\13\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\4\0\1\u0aa2\12\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\5\0\1\u0aa3\11\0\1\u0315\41\0\1\u0312\1\u0313\6\0"+
+ "\1\u0aa4\10\0\1\u0315\41\0\1\u0312\1\u0313\7\0\1\u0aa5"+
+ "\7\0\1\u0315\41\0\1\u0312\1\u0313\10\0\1\u0aa6\6\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\11\0\1\u0aa7\5\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\12\0\1\u0aa8\4\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\13\0\1\u0aa9\3\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\14\0\1\u0aaa\2\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\15\0\1\u0aab\1\0\1\u0315\41\0\2\u03a1\1\0\1\u0aac"+
+ "\15\0\1\u03a3\41\0\2\u03a1\2\0\1\u0aad\14\0\1\u03a3"+
+ "\41\0\2\u03a1\3\0\1\u0aae\13\0\1\u03a3\41\0\2\u03a1"+
+ "\4\0\1\u0aaf\12\0\1\u03a3\41\0\2\u03a1\5\0\1\u0ab0"+
+ "\11\0\1\u03a3\41\0\2\u03a1\6\0\1\u0ab1\10\0\1\u03a3"+
+ "\41\0\2\u03a1\7\0\1\u0ab2\7\0\1\u03a3\41\0\2\u03a1"+
+ "\10\0\1\u0ab3\6\0\1\u03a3\41\0\2\u03a1\11\0\1\u0ab4"+
+ "\5\0\1\u03a3\41\0\2\u03a1\12\0\1\u0ab5\4\0\1\u03a3"+
+ "\41\0\2\u03a1\13\0\1\u0ab6\3\0\1\u03a3\41\0\2\u03a1"+
+ "\14\0\1\u0ab7\2\0\1\u03a3\41\0\2\u03a1\15\0\1\u0ab8"+
+ "\1\0\1\u03a3\40\0\1\276\1\u03b0\1\u03b1\1\276\1\u0ab9"+
+ "\15\276\1\u03b3\41\276\1\u03b0\1\u03b1\2\276\1\u0aba\14\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\3\276\1\u0abb\13\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\4\276\1\u0abc\12\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\5\276\1\u0abd\11\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\6\276\1\u0abe\10\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\7\276\1\u0abf\7\276\1\u03b3\41\276\1\u03b0\1\u03b1\10\276"+
+ "\1\u0ac0\6\276\1\u03b3\41\276\1\u03b0\1\u03b1\11\276\1\u0ac1"+
+ "\5\276\1\u03b3\41\276\1\u03b0\1\u03b1\12\276\1\u0ac2\4\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\13\276\1\u0ac3\3\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\14\276\1\u0ac4\2\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\15\276\1\u0ac5\1\276\1\u03b3\41\276\1\u033d"+
+ "\1\u033e\1\276\1\u0ac6\15\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\2\276\1\u0ac7\14\276\1\u0340\41\276\1\u033d\1\u033e\3\276"+
+ "\1\u0ac8\13\276\1\u0340\41\276\1\u033d\1\u033e\4\276\1\u0ac9"+
+ "\12\276\1\u0340\41\276\1\u033d\1\u033e\5\276\1\u0aca\11\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\6\276\1\u0acb\10\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\7\276\1\u0acc\7\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\10\276\1\u0acd\6\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\11\276\1\u0ace\5\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\12\276\1\u0acf\4\276\1\u0340\41\276\1\u033d\1\u033e\13\276"+
+ "\1\u0ad0\3\276\1\u0340\41\276\1\u033d\1\u033e\14\276\1\u0ad1"+
+ "\2\276\1\u0340\41\276\1\u033d\1\u033e\15\276\1\u0ad2\1\276"+
+ "\1\u0340\41\276\1\300\1\u02bf\1\276\1\u0ad3\15\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\2\276\1\u0ad4\14\276\1\u02c1\40\276"+
+ "\1\263\1\u03cf\1\u03d0\1\263\1\u0ad5\1\263\1\u0136\13\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\2\263\1\u0ad6\1\u0136\13\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\u0ad7\12\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\263\1\u0ad8"+
+ "\11\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\2\263"+
+ "\1\u0ad9\10\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\3\263\1\u0ada\7\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\4\263\1\u0adb\6\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\5\263\1\u0adc\5\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\6\263\1\u0add\4\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\7\263\1\u0ade\3\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\10\263\1\u0adf\2\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\11\263\1\u0ae0"+
+ "\1\263\1\u03d2\40\263\1\344\1\u03de\1\u03df\1\344\1\u0ae1"+
+ "\1\344\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df\2\344"+
+ "\1\u0ae2\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\1\u0ae3\12\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\1\344\1\u0ae4\11\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\2\344\1\u0ae5\10\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\3\344\1\u0ae6\7\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\4\344\1\u0ae7\6\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\5\344\1\u0ae8\5\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\6\344\1\u0ae9"+
+ "\4\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\7\344"+
+ "\1\u0aea\3\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\10\344\1\u0aeb\2\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\11\344\1\u0aec\1\344\1\u03e1\40\344\1\276\1\300"+
+ "\1\u02bf\3\276\1\u0aed\13\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\4\276\1\u0aee\12\276\1\u02c1\41\276\1\300\1\u02bf\5\276"+
+ "\1\u0aef\11\276\1\u02c1\41\276\1\300\1\u02bf\6\276\1\u0af0"+
+ "\10\276\1\u02c1\41\276\1\300\1\u02bf\7\276\1\u0af1\7\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\10\276\1\u0af2\6\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\11\276\1\u0af3\5\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\12\276\1\u0af4\4\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\13\276\1\u0af5\3\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\14\276\1\u0af6\2\276\1\u02c1\41\276\1\300\1\u02bf\15\276"+
+ "\1\u0af7\1\276\1\u02c1\40\276\5\0\1\164\1\0\1\165"+
+ "\14\0\12\164\1\u0af8\14\164\3\0\1\164\1\0\1\164"+
+ "\3\0\2\u0384\1\0\1\u0af9\15\0\1\u0386\41\0\2\u0384"+
+ "\2\0\1\u0afa\14\0\1\u0386\41\0\2\u0384\3\0\1\u0afb"+
+ "\13\0\1\u0386\41\0\2\u0384\4\0\1\u0afc\12\0\1\u0386"+
+ "\41\0\2\u0384\5\0\1\u0afd\11\0\1\u0386\41\0\2\u0384"+
+ "\6\0\1\u0afe\10\0\1\u0386\41\0\2\u0384\7\0\1\u0aff"+
+ "\7\0\1\u0386\41\0\2\u0384\10\0\1\u0b00\6\0\1\u0386"+
+ "\41\0\2\u0384\11\0\1\u0b01\5\0\1\u0386\41\0\2\u0384"+
+ "\12\0\1\u0b02\4\0\1\u0386\41\0\2\u0384\13\0\1\u0b03"+
+ "\3\0\1\u0386\41\0\2\u0384\14\0\1\u0b04\2\0\1\u0386"+
+ "\41\0\2\u0384\15\0\1\u0b05\1\0\1\u0386\41\0\1\u0312"+
+ "\1\u0313\1\0\1\u0b06\15\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\2\0\1\u0b07\14\0\1\u0315\41\0\1\u0312\1\u0313\3\0"+
+ "\1\u0b08\13\0\1\u0315\41\0\1\u0312\1\u0313\4\0\1\u0b09"+
+ "\12\0\1\u0315\41\0\1\u0312\1\u0313\5\0\1\u0b0a\11\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\6\0\1\u0b0b\10\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\7\0\1\u0b0c\7\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\10\0\1\u0b0d\6\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\11\0\1\u0b0e\5\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\12\0\1\u0b0f\4\0\1\u0315\41\0\1\u0312\1\u0313\13\0"+
+ "\1\u0b10\3\0\1\u0315\41\0\1\u0312\1\u0313\14\0\1\u0b11"+
+ "\2\0\1\u0315\41\0\1\u0312\1\u0313\15\0\1\u0b12\1\0"+
+ "\1\u0315\41\0\2\u03a1\1\0\1\u0b13\15\0\1\u03a3\41\0"+
+ "\2\u03a1\2\0\1\u0b14\14\0\1\u03a3\41\0\2\u03a1\3\0"+
+ "\1\u0b15\13\0\1\u03a3\41\0\2\u03a1\4\0\1\u0b16\12\0"+
+ "\1\u03a3\41\0\2\u03a1\5\0\1\u0b17\11\0\1\u03a3\41\0"+
+ "\2\u03a1\6\0\1\u0b18\10\0\1\u03a3\41\0\2\u03a1\7\0"+
+ "\1\u0b19\7\0\1\u03a3\41\0\2\u03a1\10\0\1\u0b1a\6\0"+
+ "\1\u03a3\41\0\2\u03a1\11\0\1\u0b1b\5\0\1\u03a3\41\0"+
+ "\2\u03a1\12\0\1\u0b1c\4\0\1\u03a3\41\0\2\u03a1\13\0"+
+ "\1\u0b1d\3\0\1\u03a3\41\0\2\u03a1\14\0\1\u0b1e\2\0"+
+ "\1\u03a3\41\0\2\u03a1\15\0\1\u0b1f\1\0\1\u03a3\40\0"+
+ "\1\276\1\u03b0\1\u03b1\1\276\1\u0b20\15\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\2\276\1\u0b21\14\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\3\276\1\u0b22\13\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\4\276\1\u0b23\12\276\1\u03b3\41\276\1\u03b0\1\u03b1\5\276"+
+ "\1\u0b24\11\276\1\u03b3\41\276\1\u03b0\1\u03b1\6\276\1\u0b25"+
+ "\10\276\1\u03b3\41\276\1\u03b0\1\u03b1\7\276\1\u0b26\7\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\10\276\1\u0b27\6\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\11\276\1\u0b28\5\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\12\276\1\u0b29\4\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\13\276\1\u0b2a\3\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\14\276\1\u0b2b\2\276\1\u03b3\41\276\1\u03b0\1\u03b1\15\276"+
+ "\1\u0b2c\1\276\1\u03b3\41\276\1\u033d\1\u033e\1\276\1\u0b2d"+
+ "\15\276\1\u0340\41\276\1\u033d\1\u033e\2\276\1\u0b2e\14\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\3\276\1\u0b2f\13\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\4\276\1\u0b30\12\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\5\276\1\u0b31\11\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\6\276\1\u0b32\10\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\7\276\1\u0b33\7\276\1\u0340\41\276\1\u033d\1\u033e\10\276"+
+ "\1\u0b34\6\276\1\u0340\41\276\1\u033d\1\u033e\11\276\1\u0b35"+
+ "\5\276\1\u0340\41\276\1\u033d\1\u033e\12\276\1\u0b36\4\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\13\276\1\u0b37\3\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\14\276\1\u0b38\2\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\15\276\1\u0b39\1\276\1\u0340\41\276\1\300"+
+ "\1\u02bf\1\276\1\u0b3a\15\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\2\276\1\u0b3b\14\276\1\u02c1\40\276\1\263\1\u03cf\1\u03d0"+
+ "\1\263\1\u0b3c\1\263\1\u0136\13\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\2\263\1\u0b3d\1\u0136\13\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\1\u0b3e\12\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\1\263\1\u0b3f\11\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\2\263\1\u0b40\10\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\3\263\1\u0b41\7\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\4\263\1\u0b42"+
+ "\6\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\5\263"+
+ "\1\u0b43\5\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\6\263\1\u0b44\4\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\7\263\1\u0b45\3\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\10\263\1\u0b46\2\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\11\263\1\u0b47\1\263\1\u03d2\40\263"+
+ "\1\344\1\u03de\1\u03df\1\344\1\u0b48\1\344\1\u017c\13\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\2\344\1\u0b49\1\u017c\13\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\1\u0b4a\12\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\1\344\1\u0b4b"+
+ "\11\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\2\344"+
+ "\1\u0b4c\10\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\3\344\1\u0b4d\7\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\4\344\1\u0b4e\6\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\5\344\1\u0b4f\5\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\6\344\1\u0b50\4\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\7\344\1\u0b51\3\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\10\344\1\u0b52\2\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\11\344\1\u0b53"+
+ "\1\344\1\u03e1\40\344\1\276\1\300\1\u02bf\3\276\1\u0b54"+
+ "\13\276\1\u02c1\41\276\1\300\1\u02bf\4\276\1\u0b55\12\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\5\276\1\u0b56\11\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\6\276\1\u0b57\10\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\7\276\1\u0b58\7\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\10\276\1\u0b59\6\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\11\276\1\u0b5a\5\276\1\u02c1\41\276\1\300\1\u02bf\12\276"+
+ "\1\u0b5b\4\276\1\u02c1\41\276\1\300\1\u02bf\13\276\1\u0b5c"+
+ "\3\276\1\u02c1\41\276\1\300\1\u02bf\14\276\1\u0b5d\2\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\15\276\1\u0b5e\1\276\1\u02c1"+
+ "\40\276\5\0\1\164\1\0\1\165\14\0\2\164\1\u0b5f"+
+ "\24\164\3\0\1\164\1\0\1\164\3\0\2\u0384\1\0"+
+ "\1\u0b60\15\0\1\u0386\41\0\2\u0384\2\0\1\u0b61\14\0"+
+ "\1\u0386\41\0\2\u0384\3\0\1\u0b62\13\0\1\u0386\41\0"+
+ "\2\u0384\4\0\1\u0b63\12\0\1\u0386\41\0\2\u0384\5\0"+
+ "\1\u0b64\11\0\1\u0386\41\0\2\u0384\6\0\1\u0b65\10\0"+
+ "\1\u0386\41\0\2\u0384\7\0\1\u0b66\7\0\1\u0386\41\0"+
+ "\2\u0384\10\0\1\u0b67\6\0\1\u0386\41\0\2\u0384\11\0"+
+ "\1\u0b68\5\0\1\u0386\41\0\2\u0384\12\0\1\u0b69\4\0"+
+ "\1\u0386\41\0\2\u0384\13\0\1\u0b6a\3\0\1\u0386\41\0"+
+ "\2\u0384\14\0\1\u0b6b\2\0\1\u0386\41\0\2\u0384\15\0"+
+ "\1\u0b6c\1\0\1\u0386\41\0\1\u0312\1\u0313\1\0\1\u0b6d"+
+ "\15\0\1\u0315\41\0\1\u0312\1\u0313\2\0\1\u0b6e\14\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\3\0\1\u0b6f\13\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\4\0\1\u0b70\12\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\5\0\1\u0b71\11\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\6\0\1\u0b72\10\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\7\0\1\u0b73\7\0\1\u0315\41\0\1\u0312\1\u0313\10\0"+
+ "\1\u0b74\6\0\1\u0315\41\0\1\u0312\1\u0313\11\0\1\u0b75"+
+ "\5\0\1\u0315\41\0\1\u0312\1\u0313\12\0\1\u0b76\4\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\13\0\1\u0b77\3\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\14\0\1\u0b78\2\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\15\0\1\u0b79\1\0\1\u0315\41\0\2\u03a1"+
+ "\1\0\1\u0b7a\15\0\1\u03a3\41\0\2\u03a1\2\0\1\u0b7b"+
+ "\14\0\1\u03a3\41\0\2\u03a1\3\0\1\u0b7c\13\0\1\u03a3"+
+ "\41\0\2\u03a1\4\0\1\u0b7d\12\0\1\u03a3\41\0\2\u03a1"+
+ "\5\0\1\u0b7e\11\0\1\u03a3\41\0\2\u03a1\6\0\1\u0b7f"+
+ "\10\0\1\u03a3\41\0\2\u03a1\7\0\1\u0b80\7\0\1\u03a3"+
+ "\41\0\2\u03a1\10\0\1\u0b81\6\0\1\u03a3\41\0\2\u03a1"+
+ "\11\0\1\u0b82\5\0\1\u03a3\41\0\2\u03a1\12\0\1\u0b83"+
+ "\4\0\1\u03a3\41\0\2\u03a1\13\0\1\u0b84\3\0\1\u03a3"+
+ "\41\0\2\u03a1\14\0\1\u0b85\2\0\1\u03a3\41\0\2\u03a1"+
+ "\15\0\1\u0b86\1\0\1\u03a3\40\0\1\276\1\u03b0\1\u03b1"+
+ "\1\276\1\u0b87\15\276\1\u03b3\41\276\1\u03b0\1\u03b1\2\276"+
+ "\1\u0b88\14\276\1\u03b3\41\276\1\u03b0\1\u03b1\3\276\1\u0b89"+
+ "\13\276\1\u03b3\41\276\1\u03b0\1\u03b1\4\276\1\u0b8a\12\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\5\276\1\u0b8b\11\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\6\276\1\u0b8c\10\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\7\276\1\u0b8d\7\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\10\276\1\u0b8e\6\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\11\276\1\u0b8f\5\276\1\u03b3\41\276\1\u03b0\1\u03b1\12\276"+
+ "\1\u0b90\4\276\1\u03b3\41\276\1\u03b0\1\u03b1\13\276\1\u0b91"+
+ "\3\276\1\u03b3\41\276\1\u03b0\1\u03b1\14\276\1\u0b92\2\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\15\276\1\u0b93\1\276\1\u03b3"+
+ "\41\276\1\u033d\1\u033e\1\276\1\u0b94\15\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\2\276\1\u0b95\14\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\3\276\1\u0b96\13\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\4\276\1\u0b97\12\276\1\u0340\41\276\1\u033d\1\u033e\5\276"+
+ "\1\u0b98\11\276\1\u0340\41\276\1\u033d\1\u033e\6\276\1\u0b99"+
+ "\10\276\1\u0340\41\276\1\u033d\1\u033e\7\276\1\u0b9a\7\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\10\276\1\u0b9b\6\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\11\276\1\u0b9c\5\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\12\276\1\u0b9d\4\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\13\276\1\u0b9e\3\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\14\276\1\u0b9f\2\276\1\u0340\41\276\1\u033d\1\u033e\15\276"+
+ "\1\u0ba0\1\276\1\u0340\41\276\1\300\1\u02bf\1\276\1\u0ba1"+
+ "\15\276\1\u02c1\41\276\1\300\1\u02bf\2\276\1\u0ba2\14\276"+
+ "\1\u02c1\40\276\1\263\1\u03cf\1\u03d0\1\263\1\u0ba3\1\263"+
+ "\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\2\263\1\u0ba4"+
+ "\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\1\u0ba5\12\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\1\263\1\u0ba6\11\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\2\263\1\u0ba7\10\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\3\263\1\u0ba8\7\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\4\263\1\u0ba9\6\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\5\263\1\u0baa\5\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\6\263\1\u0bab\4\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\7\263\1\u0bac"+
+ "\3\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\10\263"+
+ "\1\u0bad\2\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\11\263\1\u0bae\1\263\1\u03d2\40\263\1\344\1\u03de\1\u03df"+
+ "\1\344\1\u0baf\1\344\1\u017c\13\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\2\344\1\u0bb0\1\u017c\13\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\1\u0bb1\12\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\1\344\1\u0bb2\11\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\2\344\1\u0bb3\10\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\3\344\1\u0bb4\7\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\4\344\1\u0bb5"+
+ "\6\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\5\344"+
+ "\1\u0bb6\5\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\6\344\1\u0bb7\4\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\7\344\1\u0bb8\3\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\10\344\1\u0bb9\2\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\11\344\1\u0bba\1\344\1\u03e1\40\344"+
+ "\1\276\1\300\1\u02bf\3\276\1\u0bbb\13\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\4\276\1\u0bbc\12\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\5\276\1\u0bbd\11\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\6\276\1\u0bbe\10\276\1\u02c1\41\276\1\300\1\u02bf\7\276"+
+ "\1\u0bbf\7\276\1\u02c1\41\276\1\300\1\u02bf\10\276\1\u0bc0"+
+ "\6\276\1\u02c1\41\276\1\300\1\u02bf\11\276\1\u0bc1\5\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\12\276\1\u0bc2\4\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\13\276\1\u0bc3\3\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\14\276\1\u0bc4\2\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\15\276\1\u0bc5\1\276\1\u02c1\40\276\5\0\1\164"+
+ "\1\0\1\165\14\0\6\164\1\u0bc6\20\164\3\0\1\164"+
+ "\1\0\1\164\3\0\2\u0384\1\0\1\u0bc7\15\0\1\u0386"+
+ "\41\0\2\u0384\2\0\1\u0bc8\14\0\1\u0386\41\0\2\u0384"+
+ "\3\0\1\u0bc9\13\0\1\u0386\41\0\2\u0384\4\0\1\u0bca"+
+ "\12\0\1\u0386\41\0\2\u0384\5\0\1\u0bcb\11\0\1\u0386"+
+ "\41\0\2\u0384\6\0";
private static final String ZZ_TRANS_PACKED_1 =
- "\3\276\1\u0ec1\55\276\1\u033b\1\u033c\4\276\1\u0ec2\54\276"+
- "\1\u033b\1\u033c\5\276\1\u0ec3\53\276\1\u033b\1\u033c\6\276"+
- "\1\u0ec4\52\276\1\u033b\1\u033c\7\276\1\u0ec5\51\276\1\u033b"+
- "\1\u033c\10\276\1\u0ec6\50\276\1\u033b\1\u033c\11\276\1\u0ec7"+
- "\47\276\1\u033b\1\u033c\12\276\1\u0ec8\46\276\1\u033b\1\u033c"+
- "\13\276\1\u0ec9\45\276\1\u033b\1\u033c\14\276\1\u0eca\44\276"+
- "\1\u033b\1\u033c\15\276\1\u0ecb\43\276\1\300\1\u02bf\1\276"+
- "\1\u0ecc\57\276\1\300\1\u02bf\2\276\1\u0ecd\55\276\1\263"+
- "\1\u03c9\1\u03ca\1\263\1\u0ece\1\263\1\u0136\55\263\1\u03c9"+
- "\1\u03ca\2\263\1\u0ecf\1\u0136\55\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\1\u0ed0\54\263\1\u03c9\1\u03ca\3\263\1\u0136\1\263"+
- "\1\u0ed1\53\263\1\u03c9\1\u03ca\3\263\1\u0136\2\263\1\u0ed2"+
- "\52\263\1\u03c9\1\u03ca\3\263\1\u0136\3\263\1\u0ed3\51\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\4\263\1\u0ed4\50\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\5\263\1\u0ed5\47\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\6\263\1\u0ed6\46\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\7\263\1\u0ed7\45\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\10\263\1\u0ed8\44\263\1\u03c9\1\u03ca\3\263\1\u0136\11\263"+
- "\1\u0ed9\42\263\1\344\1\u03d7\1\u03d8\1\344\1\u0eda\1\344"+
- "\1\u017c\55\344\1\u03d7\1\u03d8\2\344\1\u0edb\1\u017c\55\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\1\u0edc\54\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\1\344\1\u0edd\53\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\2\344\1\u0ede\52\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\3\344\1\u0edf\51\344\1\u03d7\1\u03d8\3\344\1\u017c\4\344"+
- "\1\u0ee0\50\344\1\u03d7\1\u03d8\3\344\1\u017c\5\344\1\u0ee1"+
- "\47\344\1\u03d7\1\u03d8\3\344\1\u017c\6\344\1\u0ee2\46\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\7\344\1\u0ee3\45\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\10\344\1\u0ee4\44\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\11\344\1\u0ee5\42\344\1\276\1\300\1\u02bf"+
- "\3\276\1\u0ee6\55\276\1\300\1\u02bf\4\276\1\u0ee7\54\276"+
- "\1\300\1\u02bf\5\276\1\u0ee8\53\276\1\300\1\u02bf\6\276"+
- "\1\u0ee9\52\276\1\300\1\u02bf\7\276\1\u0eea\51\276\1\300"+
- "\1\u02bf\10\276\1\u0eeb\50\276\1\300\1\u02bf\11\276\1\u0eec"+
- "\47\276\1\300\1\u02bf\12\276\1\u0eed\46\276\1\300\1\u02bf"+
- "\13\276\1\u0eee\45\276\1\300\1\u02bf\14\276\1\u0eef\44\276"+
- "\1\300\1\u02bf\15\276\1\u0ef0\42\276\1\0\2\u0381\1\0"+
- "\1\u0ef1\57\0\2\u0381\2\0\1\u0ef2\56\0\2\u0381\3\0"+
- "\1\u0ef3\55\0\2\u0381\4\0\1\u0ef4\54\0\2\u0381\5\0"+
- "\1\u0ef5\53\0\2\u0381\6\0\1\u0ef6\52\0\2\u0381\7\0"+
- "\1\u0ef7\51\0\2\u0381\10\0\1\u0ef8\50\0\2\u0381\11\0"+
- "\1\u0ef9\47\0\2\u0381\12\0\1\u0efa\46\0\2\u0381\13\0"+
- "\1\u0efb\45\0\2\u0381\14\0\1\u0efc\44\0\2\u0381\15\0"+
- "\1\u0efd\43\0\1\u0311\1\u0312\1\0\1\u0efe\57\0\1\u0311"+
- "\1\u0312\2\0\1\u0eff\56\0\1\u0311\1\u0312\3\0\1\u0f00"+
- "\55\0\1\u0311\1\u0312\4\0\1\u0f01\54\0\1\u0311\1\u0312"+
- "\5\0\1\u0f02\53\0\1\u0311\1\u0312\6\0\1\u0f03\52\0"+
- "\1\u0311\1\u0312\7\0\1\u0f04\51\0\1\u0311\1\u0312\10\0"+
- "\1\u0f05\50\0\1\u0311\1\u0312\11\0\1\u0f06\47\0\1\u0311"+
- "\1\u0312\12\0\1\u0f07\46\0\1\u0311\1\u0312\13\0\1\u0f08"+
- "\45\0\1\u0311\1\u0312\14\0\1\u0f09\44\0\1\u0311\1\u0312"+
- "\15\0\1\u0f0a\43\0\2\u039d\1\0\1\u0f0b\57\0\2\u039d"+
- "\2\0\1\u0f0c\56\0\2\u039d\3\0\1\u0f0d\55\0\2\u039d"+
- "\4\0\1\u0f0e\54\0\2\u039d\5\0\1\u0f0f\53\0\2\u039d"+
- "\6\0\1\u0f10\52\0\2\u039d\7\0\1\u0f11\51\0\2\u039d"+
- "\10\0\1\u0f12\50\0\2\u039d\11\0\1\u0f13\47\0\2\u039d"+
- "\12\0\1\u0f14\46\0\2\u039d\13\0\1\u0f15\45\0\2\u039d"+
- "\14\0\1\u0f16\44\0\2\u039d\15\0\1\u0f17\42\0\1\276"+
- "\1\u03ab\1\u03ac\1\276\1\u0f18\57\276\1\u03ab\1\u03ac\2\276"+
- "\1\u0f19\56\276\1\u03ab\1\u03ac\3\276\1\u0f1a\55\276\1\u03ab"+
- "\1\u03ac\4\276\1\u0f1b\54\276\1\u03ab\1\u03ac\5\276\1\u0f1c"+
- "\53\276\1\u03ab\1\u03ac\6\276\1\u0f1d\52\276\1\u03ab\1\u03ac"+
- "\7\276\1\u0f1e\51\276\1\u03ab\1\u03ac\10\276\1\u0f1f\50\276"+
- "\1\u03ab\1\u03ac\11\276\1\u0f20\47\276\1\u03ab\1\u03ac\12\276"+
- "\1\u0f21\46\276\1\u03ab\1\u03ac\13\276\1\u0f22\45\276\1\u03ab"+
- "\1\u03ac\14\276\1\u0f23\44\276\1\u03ab\1\u03ac\15\276\1\u0f24"+
- "\43\276\1\u033b\1\u033c\1\276\1\u0f25\57\276\1\u033b\1\u033c"+
- "\2\276\1\u0f26\56\276\1\u033b\1\u033c\3\276\1\u0f27\55\276"+
- "\1\u033b\1\u033c\4\276\1\u0f28\54\276\1\u033b\1\u033c\5\276"+
- "\1\u0f29\53\276\1\u033b\1\u033c\6\276\1\u0f2a\52\276\1\u033b"+
- "\1\u033c\7\276\1\u0f2b\51\276\1\u033b\1\u033c\10\276\1\u0f2c"+
- "\50\276\1\u033b\1\u033c\11\276\1\u0f2d\47\276\1\u033b\1\u033c"+
- "\12\276\1\u0f2e\46\276\1\u033b\1\u033c\13\276\1\u0f2f\45\276"+
- "\1\u033b\1\u033c\14\276\1\u0f30\44\276\1\u033b\1\u033c\15\276"+
- "\1\u0f31\43\276\1\300\1\u02bf\1\276\1\u0f32\57\276\1\300"+
- "\1\u02bf\2\276\1\u0f33\55\276\1\263\1\u03c9\1\u03ca\1\263"+
- "\1\u0f34\1\263\1\u0136\55\263\1\u03c9\1\u03ca\2\263\1\u0f35"+
- "\1\u0136\55\263\1\u03c9\1\u03ca\3\263\1\u0136\1\u0f36\54\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\1\263\1\u0f37\53\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\2\263\1\u0f38\52\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\3\263\1\u0f39\51\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\4\263\1\u0f3a\50\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\5\263\1\u0f3b\47\263\1\u03c9\1\u03ca\3\263\1\u0136\6\263"+
- "\1\u0f3c\46\263\1\u03c9\1\u03ca\3\263\1\u0136\7\263\1\u0f3d"+
- "\45\263\1\u03c9\1\u03ca\3\263\1\u0136\10\263\1\u0f3e\44\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\11\263\1\u0f3f\42\263\1\344"+
- "\1\u03d7\1\u03d8\1\344\1\u0f40\1\344\1\u017c\55\344\1\u03d7"+
- "\1\u03d8\2\344\1\u0f41\1\u017c\55\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\1\u0f42\54\344\1\u03d7\1\u03d8\3\344\1\u017c\1\344"+
- "\1\u0f43\53\344\1\u03d7\1\u03d8\3\344\1\u017c\2\344\1\u0f44"+
- "\52\344\1\u03d7\1\u03d8\3\344\1\u017c\3\344\1\u0f45\51\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\4\344\1\u0f46\50\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\5\344\1\u0f47\47\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\6\344\1\u0f48\46\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\7\344\1\u0f49\45\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\10\344\1\u0f4a\44\344\1\u03d7\1\u03d8\3\344\1\u017c\11\344"+
- "\1\u0f4b\42\344\1\276\1\300\1\u02bf\3\276\1\u0f4c\55\276"+
- "\1\300\1\u02bf\4\276\1\u0f4d\54\276\1\300\1\u02bf\5\276"+
- "\1\u0f4e\53\276\1\300\1\u02bf\6\276\1\u0f4f\52\276\1\300"+
- "\1\u02bf\7\276\1\u0f50\51\276\1\300\1\u02bf\10\276\1\u0f51"+
- "\50\276\1\300\1\u02bf\11\276\1\u0f52\47\276\1\300\1\u02bf"+
- "\12\276\1\u0f53\46\276\1\300\1\u02bf\13\276\1\u0f54\45\276"+
- "\1\300\1\u02bf\14\276\1\u0f55\44\276\1\300\1\u02bf\15\276"+
- "\1\u0f56\42\276\1\0\2\u0381\1\0\1\u0f57\57\0\2\u0381"+
- "\2\0\1\u0f58\56\0\2\u0381\3\0\1\u0f59\55\0\2\u0381"+
- "\4\0\1\u0f5a\54\0\2\u0381\5\0\1\u0f5b\53\0\2\u0381"+
- "\6\0\1\u0f5c\52\0\2\u0381\7\0\1\u0f5d\51\0\2\u0381"+
- "\10\0\1\u0f5e\50\0\2\u0381\11\0\1\u0f5f\47\0\2\u0381"+
- "\12\0\1\u0f60\46\0\2\u0381\13\0\1\u0f61\45\0\2\u0381"+
- "\14\0\1\u0f62\44\0\2\u0381\15\0\1\u0f63\43\0\1\u0311"+
- "\1\u0312\1\0\1\u0f64\57\0\1\u0311\1\u0312\2\0\1\u0f65"+
- "\56\0\1\u0311\1\u0312\3\0\1\u0f66\55\0\1\u0311\1\u0312"+
- "\4\0\1\u0f67\54\0\1\u0311\1\u0312\5\0\1\u0f68\53\0"+
- "\1\u0311\1\u0312\6\0\1\u0f69\52\0\1\u0311\1\u0312\7\0"+
- "\1\u0f6a\51\0\1\u0311\1\u0312\10\0\1\u0f6b\50\0\1\u0311"+
- "\1\u0312\11\0\1\u0f6c\47\0\1\u0311\1\u0312\12\0\1\u0f6d"+
- "\46\0\1\u0311\1\u0312\13\0\1\u0f6e\45\0\1\u0311\1\u0312"+
- "\14\0\1\u0f6f\44\0\1\u0311\1\u0312\15\0\1\u0f70\43\0"+
- "\2\u039d\1\0\1\u0f71\57\0\2\u039d\2\0\1\u0f72\56\0"+
- "\2\u039d\3\0\1\u0f73\55\0\2\u039d\4\0\1\u0f74\54\0"+
- "\2\u039d\5\0\1\u0f75\53\0\2\u039d\6\0\1\u0f76\52\0"+
- "\2\u039d\7\0\1\u0f77\51\0\2\u039d\10\0\1\u0f78\50\0"+
- "\2\u039d\11\0\1\u0f79\47\0\2\u039d\12\0\1\u0f7a\46\0"+
- "\2\u039d\13\0\1\u0f7b\45\0\2\u039d\14\0\1\u0f7c\44\0"+
- "\2\u039d\15\0\1\u0f7d\42\0\1\276\1\u03ab\1\u03ac\1\276"+
- "\1\u0f7e\57\276\1\u03ab\1\u03ac\2\276\1\u0f7f\56\276\1\u03ab"+
- "\1\u03ac\3\276\1\u0f80\55\276\1\u03ab\1\u03ac\4\276\1\u0f81"+
- "\54\276\1\u03ab\1\u03ac\5\276\1\u0f82\53\276\1\u03ab\1\u03ac"+
- "\6\276\1\u0f83\52\276\1\u03ab\1\u03ac\7\276\1\u0f84\51\276"+
- "\1\u03ab\1\u03ac\10\276\1\u0f85\50\276\1\u03ab\1\u03ac\11\276"+
- "\1\u0f86\47\276\1\u03ab\1\u03ac\12\276\1\u0f87\46\276\1\u03ab"+
- "\1\u03ac\13\276\1\u0f88\45\276\1\u03ab\1\u03ac\14\276\1\u0f89"+
- "\44\276\1\u03ab\1\u03ac\15\276\1\u0f8a\43\276\1\u033b\1\u033c"+
- "\1\276\1\u0f8b\57\276\1\u033b\1\u033c\2\276\1\u0f8c\56\276"+
- "\1\u033b\1\u033c\3\276\1\u0f8d\55\276\1\u033b\1\u033c\4\276"+
- "\1\u0f8e\54\276\1\u033b\1\u033c\5\276\1\u0f8f\53\276\1\u033b"+
- "\1\u033c\6\276\1\u0f90\52\276\1\u033b\1\u033c\7\276\1\u0f91"+
- "\51\276\1\u033b\1\u033c\10\276\1\u0f92\50\276\1\u033b\1\u033c"+
- "\11\276\1\u0f93\47\276\1\u033b\1\u033c\12\276\1\u0f94\46\276"+
- "\1\u033b\1\u033c\13\276\1\u0f95\45\276\1\u033b\1\u033c\14\276"+
- "\1\u0f96\44\276\1\u033b\1\u033c\15\276\1\u0f97\43\276\1\300"+
- "\1\u02bf\1\276\1\u0f98\57\276\1\300\1\u02bf\2\276\1\u0f99"+
- "\55\276\1\263\1\u03c9\1\u03ca\1\263\1\u0f9a\1\263\1\u0136"+
- "\55\263\1\u03c9\1\u03ca\2\263\1\u0f9b\1\u0136\55\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\1\u0f9c\54\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\1\263\1\u0f9d\53\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\2\263\1\u0f9e\52\263\1\u03c9\1\u03ca\3\263\1\u0136\3\263"+
- "\1\u0f9f\51\263\1\u03c9\1\u03ca\3\263\1\u0136\4\263\1\u0fa0"+
- "\50\263\1\u03c9\1\u03ca\3\263\1\u0136\5\263\1\u0fa1\47\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\6\263\1\u0fa2\46\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\7\263\1\u0fa3\45\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\10\263\1\u0fa4\44\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\11\263\1\u0fa5\42\263\1\344\1\u03d7\1\u03d8\1\344"+
- "\1\u0fa6\1\344\1\u017c\55\344\1\u03d7\1\u03d8\2\344\1\u0fa7"+
- "\1\u017c\55\344\1\u03d7\1\u03d8\3\344\1\u017c\1\u0fa8\54\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\1\344\1\u0fa9\53\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\2\344\1\u0faa\52\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\3\344\1\u0fab\51\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\4\344\1\u0fac\50\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\5\344\1\u0fad\47\344\1\u03d7\1\u03d8\3\344\1\u017c\6\344"+
- "\1\u0fae\46\344\1\u03d7\1\u03d8\3\344\1\u017c\7\344\1\u0faf"+
- "\45\344\1\u03d7\1\u03d8\3\344\1\u017c\10\344\1\u0fb0\44\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\11\344\1\u0fb1\42\344\1\276"+
- "\1\300\1\u02bf\3\276\1\u0fb2\55\276\1\300\1\u02bf\4\276"+
- "\1\u0fb3\54\276\1\300\1\u02bf\5\276\1\u0fb4\53\276\1\300"+
- "\1\u02bf\6\276\1\u0fb5\52\276\1\300\1\u02bf\7\276\1\u0fb6"+
- "\51\276\1\300\1\u02bf\10\276\1\u0fb7\50\276\1\300\1\u02bf"+
- "\11\276\1\u0fb8\47\276\1\300\1\u02bf\12\276\1\u0fb9\46\276"+
- "\1\300\1\u02bf\13\276\1\u0fba\45\276\1\300\1\u02bf\14\276"+
- "\1\u0fbb\44\276\1\300\1\u02bf\15\276\1\u0fbc\42\276\1\0"+
- "\2\u0381\1\0\1\u0fbd\57\0\2\u0381\2\0\1\u0fbe\56\0"+
- "\2\u0381\3\0\1\u0fbf\55\0\2\u0381\4\0\1\u0fc0\54\0"+
- "\2\u0381\5\0\1\u0fc1\53\0\2\u0381\6\0\1\u0fc2\52\0"+
- "\2\u0381\7\0\1\u0fc3\51\0\2\u0381\10\0\1\u0fc4\50\0"+
- "\2\u0381\11\0\1\u0fc5\47\0\2\u0381\12\0\1\u0fc6\46\0"+
- "\2\u0381\13\0\1\u0fc7\45\0\2\u0381\14\0\1\u0fc8\44\0"+
- "\2\u0381\15\0\1\u0fc9\43\0\1\u0311\1\u0312\1\0\1\u0fca"+
- "\57\0\1\u0311\1\u0312\2\0\1\u0fcb\56\0\1\u0311\1\u0312"+
- "\3\0\1\u0fcc\55\0\1\u0311\1\u0312\4\0\1\u0fcd\54\0"+
- "\1\u0311\1\u0312\5\0\1\u0fce\53\0\1\u0311\1\u0312\6\0"+
- "\1\u0fcf\52\0\1\u0311\1\u0312\7\0\1\u0fd0\51\0\1\u0311"+
- "\1\u0312\10\0\1\u0fd1\50\0\1\u0311\1\u0312\11\0\1\u0fd2"+
- "\47\0\1\u0311\1\u0312\12\0\1\u0fd3\46\0\1\u0311\1\u0312"+
- "\13\0\1\u0fd4\45\0\1\u0311\1\u0312\14\0\1\u0fd5\44\0"+
- "\1\u0311\1\u0312\15\0\1\u0fd6\43\0\2\u039d\1\0\1\u0fd7"+
- "\57\0\2\u039d\2\0\1\u0fd8\56\0\2\u039d\3\0\1\u0fd9"+
- "\55\0\2\u039d\4\0\1\u0fda\54\0\2\u039d\5\0\1\u0fdb"+
- "\53\0\2\u039d\6\0\1\u0fdc\52\0\2\u039d\7\0\1\u0fdd"+
- "\51\0\2\u039d\10\0\1\u0fde\50\0\2\u039d\11\0\1\u0fdf"+
- "\47\0\2\u039d\12\0\1\u0fe0\46\0\2\u039d\13\0\1\u0fe1"+
- "\45\0\2\u039d\14\0\1\u0fe2\44\0\2\u039d\15\0\1\u0fe3"+
- "\42\0\1\276\1\u03ab\1\u03ac\1\276\1\u0fe4\57\276\1\u03ab"+
- "\1\u03ac\2\276\1\u0fe5\56\276\1\u03ab\1\u03ac\3\276\1\u0fe6"+
- "\55\276\1\u03ab\1\u03ac\4\276\1\u0fe7\54\276\1\u03ab\1\u03ac"+
- "\5\276\1\u0fe8\53\276\1\u03ab\1\u03ac\6\276\1\u0fe9\52\276"+
- "\1\u03ab\1\u03ac\7\276\1\u0fea\51\276\1\u03ab\1\u03ac\10\276"+
- "\1\u0feb\50\276\1\u03ab\1\u03ac\11\276\1\u0fec\47\276\1\u03ab"+
- "\1\u03ac\12\276\1\u0fed\46\276\1\u03ab\1\u03ac\13\276\1\u0fee"+
- "\45\276\1\u03ab\1\u03ac\14\276\1\u0fef\44\276\1\u03ab\1\u03ac"+
- "\15\276\1\u0ff0\43\276\1\u033b\1\u033c\1\276\1\u0ff1\57\276"+
- "\1\u033b\1\u033c\2\276\1\u0ff2\56\276\1\u033b\1\u033c\3\276"+
- "\1\u0ff3\55\276\1\u033b\1\u033c\4\276\1\u0ff4\54\276\1\u033b"+
- "\1\u033c\5\276\1\u0ff5\53\276\1\u033b\1\u033c\6\276\1\u0ff6"+
- "\52\276\1\u033b\1\u033c\7\276\1\u0ff7\51\276\1\u033b\1\u033c"+
- "\10\276\1\u0ff8\50\276\1\u033b\1\u033c\11\276\1\u0ff9\47\276"+
- "\1\u033b\1\u033c\12\276\1\u0ffa\46\276\1\u033b\1\u033c\13\276"+
- "\1\u0ffb\45\276\1\u033b\1\u033c\14\276\1\u0ffc\44\276\1\u033b"+
- "\1\u033c\15\276\1\u0ffd\43\276\1\300\1\u02bf\1\276\1\u0ffe"+
- "\57\276\1\300\1\u02bf\2\276\1\u0fff\55\276\1\263\1\u03c9"+
- "\1\u03ca\1\263\1\u1000\1\263\1\u0136\55\263\1\u03c9\1\u03ca"+
- "\2\263\1\u1001\1\u0136\55\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\1\u1002\54\263\1\u03c9\1\u03ca\3\263\1\u0136\1\263\1\u1003"+
- "\53\263\1\u03c9\1\u03ca\3\263\1\u0136\2\263\1\u1004\52\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\3\263\1\u1005\51\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\4\263\1\u1006\50\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\5\263\1\u1007\47\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\6\263\1\u1008\46\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\7\263\1\u1009\45\263\1\u03c9\1\u03ca\3\263\1\u0136\10\263"+
- "\1\u100a\44\263\1\u03c9\1\u03ca\3\263\1\u0136\11\263\1\u100b"+
- "\42\263\1\344\1\u03d7\1\u03d8\1\344\1\u100c\1\344\1\u017c"+
- "\55\344\1\u03d7\1\u03d8\2\344\1\u100d\1\u017c\55\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\1\u100e\54\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\1\344\1\u100f\53\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\2\344\1\u1010\52\344\1\u03d7\1\u03d8\3\344\1\u017c\3\344"+
- "\1\u1011\51\344\1\u03d7\1\u03d8\3\344\1\u017c\4\344\1\u1012"+
- "\50\344\1\u03d7\1\u03d8\3\344\1\u017c\5\344\1\u1013\47\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\6\344\1\u1014\46\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\7\344\1\u1015\45\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\10\344\1\u1016\44\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\11\344\1\u1017\42\344\1\276\1\300\1\u02bf\3\276"+
- "\1\u1018\55\276\1\300\1\u02bf\4\276\1\u1019\54\276\1\300"+
- "\1\u02bf\5\276\1\u101a\53\276\1\300\1\u02bf\6\276\1\u101b"+
- "\52\276\1\300\1\u02bf\7\276\1\u101c\51\276\1\300\1\u02bf"+
- "\10\276\1\u101d\50\276\1\300\1\u02bf\11\276\1\u101e\47\276"+
- "\1\300\1\u02bf\12\276\1\u101f\46\276\1\300\1\u02bf\13\276"+
- "\1\u1020\45\276\1\300\1\u02bf\14\276\1\u1021\44\276\1\300"+
- "\1\u02bf\15\276\1\u1022\42\276\1\0\2\u0381\1\0\1\u1023"+
- "\57\0\2\u0381\2\0\1\u1024\56\0\2\u0381\3\0\1\u1025"+
- "\55\0\2\u0381\4\0\1\u1026\54\0\2\u0381\5\0\1\u1027"+
- "\53\0\2\u0381\6\0\1\u1028\52\0\2\u0381\7\0\1\u1029"+
- "\51\0\2\u0381\10\0\1\u102a\50\0\2\u0381\11\0\1\u102b"+
- "\47\0\2\u0381\12\0\1\u102c\46\0\2\u0381\13\0\1\u102d"+
- "\45\0\2\u0381\14\0\1\u102e\44\0\2\u0381\15\0\1\u102f"+
- "\43\0\1\u0311\1\u0312\1\0\1\u1030\57\0\1\u0311\1\u0312"+
- "\2\0\1\u1031\56\0\1\u0311\1\u0312\3\0\1\u1032\55\0"+
- "\1\u0311\1\u0312\4\0\1\u1033\54\0\1\u0311\1\u0312\5\0"+
- "\1\u1034\53\0\1\u0311\1\u0312\6\0\1\u1035\52\0\1\u0311"+
- "\1\u0312\7\0\1\u1036\51\0\1\u0311\1\u0312\10\0\1\u1037"+
- "\50\0\1\u0311\1\u0312\11\0\1\u1038\47\0\1\u0311\1\u0312"+
- "\12\0\1\u1039\46\0\1\u0311\1\u0312\13\0\1\u103a\45\0"+
- "\1\u0311\1\u0312\14\0\1\u103b\44\0\1\u0311\1\u0312\15\0"+
- "\1\u103c\43\0\2\u039d\1\0\1\u103d\57\0\2\u039d\2\0"+
- "\1\u103e\56\0\2\u039d\3\0\1\u103f\55\0\2\u039d\4\0"+
- "\1\u1040\54\0\2\u039d\5\0\1\u1041\53\0\2\u039d\6\0"+
- "\1\u1042\52\0\2\u039d\7\0\1\u1043\51\0\2\u039d\10\0"+
- "\1\u1044\50\0\2\u039d\11\0\1\u1045\47\0\2\u039d\12\0"+
- "\1\u1046\46\0\2\u039d\13\0\1\u1047\45\0\2\u039d\14\0"+
- "\1\u1048\44\0\2\u039d\15\0\1\u1049\42\0\1\276\1\u03ab"+
- "\1\u03ac\1\276\1\u104a\57\276\1\u03ab\1\u03ac\2\276\1\u104b"+
- "\56\276\1\u03ab\1\u03ac\3\276\1\u104c\55\276\1\u03ab\1\u03ac"+
- "\4\276\1\u104d\54\276\1\u03ab\1\u03ac\5\276\1\u104e\53\276"+
- "\1\u03ab\1\u03ac\6\276\1\u104f\52\276\1\u03ab\1\u03ac\7\276"+
- "\1\u1050\51\276\1\u03ab\1\u03ac\10\276\1\u1051\50\276\1\u03ab"+
- "\1\u03ac\11\276\1\u1052\47\276\1\u03ab\1\u03ac\12\276\1\u1053"+
- "\46\276\1\u03ab\1\u03ac\13\276\1\u1054\45\276\1\u03ab\1\u03ac"+
- "\14\276\1\u1055\44\276\1\u03ab\1\u03ac\15\276\1\u1056\43\276"+
- "\1\u033b\1\u033c\1\276\1\u1057\57\276\1\u033b\1\u033c\2\276"+
- "\1\u1058\56\276\1\u033b\1\u033c\3\276\1\u1059\55\276\1\u033b"+
- "\1\u033c\4\276\1\u105a\54\276\1\u033b\1\u033c\5\276\1\u105b"+
- "\53\276\1\u033b\1\u033c\6\276\1\u105c\52\276\1\u033b\1\u033c"+
- "\7\276\1\u105d\51\276\1\u033b\1\u033c\10\276\1\u105e\50\276"+
- "\1\u033b\1\u033c\11\276\1\u105f\47\276\1\u033b\1\u033c\12\276"+
- "\1\u1060\46\276\1\u033b\1\u033c\13\276\1\u1061\45\276\1\u033b"+
- "\1\u033c\14\276\1\u1062\44\276\1\u033b\1\u033c\15\276\1\u1063"+
- "\43\276\1\300\1\u02bf\1\276\1\u1064\57\276\1\300\1\u02bf"+
- "\2\276\1\u1065\55\276\1\263\1\u03c9\1\u03ca\1\263\1\u1066"+
- "\1\263\1\u0136\55\263\1\u03c9\1\u03ca\2\263\1\u1067\1\u0136"+
- "\55\263\1\u03c9\1\u03ca\3\263\1\u0136\1\u1068\54\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\1\263\1\u1069\53\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\2\263\1\u106a\52\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\3\263\1\u106b\51\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\4\263\1\u106c\50\263\1\u03c9\1\u03ca\3\263\1\u0136\5\263"+
- "\1\u106d\47\263\1\u03c9\1\u03ca\3\263\1\u0136\6\263\1\u106e"+
- "\46\263\1\u03c9\1\u03ca\3\263\1\u0136\7\263\1\u106f\45\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\10\263\1\u1070\44\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\11\263\1\u1071\42\263\1\344\1\u03d7"+
- "\1\u03d8\1\344\1\u1072\1\344\1\u017c\55\344\1\u03d7\1\u03d8"+
- "\2\344\1\u1073\1\u017c\55\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\1\u1074\54\344\1\u03d7\1\u03d8\3\344\1\u017c\1\344\1\u1075"+
- "\53\344\1\u03d7\1\u03d8\3\344\1\u017c\2\344\1\u1076\52\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\3\344\1\u1077\51\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\4\344\1\u1078\50\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\5\344\1\u1079\47\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\6\344\1\u107a\46\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\7\344\1\u107b\45\344\1\u03d7\1\u03d8\3\344\1\u017c\10\344"+
- "\1\u107c\44\344\1\u03d7\1\u03d8\3\344\1\u017c\11\344\1\u107d"+
- "\42\344\1\276\1\300\1\u02bf\3\276\1\u107e\55\276\1\300"+
- "\1\u02bf\4\276\1\u107f\54\276\1\300\1\u02bf\5\276\1\u1080"+
- "\53\276\1\300\1\u02bf\6\276\1\u1081\52\276\1\300\1\u02bf"+
- "\7\276\1\u1082\51\276\1\300\1\u02bf\10\276\1\u1083\50\276"+
- "\1\300\1\u02bf\11\276\1\u1084\47\276\1\300\1\u02bf\12\276"+
- "\1\u1085\46\276\1\300\1\u02bf\13\276\1\u1086\45\276\1\300"+
- "\1\u02bf\14\276\1\u1087\44\276\1\300\1\u02bf\15\276\1\u1088"+
- "\42\276\1\0\2\u0381\1\0\1\u1089\57\0\2\u0381\2\0"+
- "\1\u108a\56\0\2\u0381\3\0\1\u108b\55\0\2\u0381\4\0"+
- "\1\u108c\54\0\2\u0381\5\0\1\u108d\53\0\2\u0381\6\0"+
- "\1\u108e\52\0\2\u0381\7\0\1\u108f\51\0\2\u0381\10\0"+
- "\1\u1090\50\0\2\u0381\11\0\1\u1091\47\0\2\u0381\12\0"+
- "\1\u1092\46\0\2\u0381\13\0\1\u1093\45\0\2\u0381\14\0"+
- "\1\u1094\44\0\2\u0381\15\0\1\u1095\43\0\1\u0311\1\u0312"+
- "\1\0\1\u1096\57\0\1\u0311\1\u0312\2\0\1\u1097\56\0"+
- "\1\u0311\1\u0312\3\0\1\u1098\55\0\1\u0311\1\u0312\4\0"+
- "\1\u1099\54\0\1\u0311\1\u0312\5\0\1\u109a\53\0\1\u0311"+
- "\1\u0312\6\0\1\u109b\52\0\1\u0311\1\u0312\7\0\1\u109c"+
- "\51\0\1\u0311\1\u0312\10\0\1\u109d\50\0\1\u0311\1\u0312"+
- "\11\0\1\u109e\47\0\1\u0311\1\u0312\12\0\1\u109f\46\0"+
- "\1\u0311\1\u0312\13\0\1\u10a0\45\0\1\u0311\1\u0312\14\0"+
- "\1\u10a1\44\0\1\u0311\1\u0312\15\0\1\u10a2\43\0\2\u039d"+
- "\1\0\1\u10a3\57\0\2\u039d\2\0\1\u10a4\56\0\2\u039d"+
- "\3\0\1\u10a5\55\0\2\u039d\4\0\1\u10a6\54\0\2\u039d"+
- "\5\0\1\u10a7\53\0\2\u039d\6\0\1\u10a8\52\0\2\u039d"+
- "\7\0\1\u10a9\51\0\2\u039d\10\0\1\u10aa\50\0\2\u039d"+
- "\11\0\1\u10ab\47\0\2\u039d\12\0\1\u10ac\46\0\2\u039d"+
- "\13\0\1\u10ad\45\0\2\u039d\14\0\1\u10ae\44\0\2\u039d"+
- "\15\0\1\u10af\42\0\1\276\1\u03ab\1\u03ac\1\276\1\u10b0"+
- "\57\276\1\u03ab\1\u03ac\2\276\1\u10b1\56\276\1\u03ab\1\u03ac"+
- "\3\276\1\u10b2\55\276\1\u03ab\1\u03ac\4\276\1\u10b3\54\276"+
- "\1\u03ab\1\u03ac\5\276\1\u10b4\53\276\1\u03ab\1\u03ac\6\276"+
- "\1\u10b5\52\276\1\u03ab\1\u03ac\7\276\1\u10b6\51\276\1\u03ab"+
- "\1\u03ac\10\276\1\u10b7\50\276\1\u03ab\1\u03ac\11\276\1\u10b8"+
- "\47\276\1\u03ab\1\u03ac\12\276\1\u10b9\46\276\1\u03ab\1\u03ac"+
- "\13\276\1\u10ba\45\276\1\u03ab\1\u03ac\14\276\1\u10bb\44\276"+
- "\1\u03ab\1\u03ac\15\276\1\u10bc\43\276\1\u033b\1\u033c\1\276"+
- "\1\u10bd\57\276\1\u033b\1\u033c\2\276\1\u10be\56\276\1\u033b"+
- "\1\u033c\3\276\1\u10bf\55\276\1\u033b\1\u033c\4\276\1\u10c0"+
- "\54\276\1\u033b\1\u033c\5\276\1\u10c1\53\276\1\u033b\1\u033c"+
- "\6\276\1\u10c2\52\276\1\u033b\1\u033c\7\276\1\u10c3\51\276"+
- "\1\u033b\1\u033c\10\276\1\u10c4\50\276\1\u033b\1\u033c\11\276"+
- "\1\u10c5\47\276\1\u033b\1\u033c\12\276\1\u10c6\46\276\1\u033b"+
- "\1\u033c\13\276\1\u10c7\45\276\1\u033b\1\u033c\14\276\1\u10c8"+
- "\44\276\1\u033b\1\u033c\15\276\1\u10c9\43\276\1\300\1\u02bf"+
- "\1\276\1\u10ca\57\276\1\300\1\u02bf\2\276\1\u10cb\55\276"+
- "\1\263\1\u03c9\1\u03ca\1\263\1\u10cc\1\263\1\u0136\55\263"+
- "\1\u03c9\1\u03ca\2\263\1\u10cd\1\u0136\55\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\1\u10ce\54\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\1\263\1\u10cf\53\263\1\u03c9\1\u03ca\3\263\1\u0136\2\263"+
- "\1\u10d0\52\263\1\u03c9\1\u03ca\3\263\1\u0136\3\263\1\u10d1"+
- "\51\263\1\u03c9\1\u03ca\3\263\1\u0136\4\263\1\u10d2\50\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\5\263\1\u10d3\47\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\6\263\1\u10d4\46\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\7\263\1\u10d5\45\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\10\263\1\u10d6\44\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\11\263\1\u10d7\42\263\1\344\1\u03d7\1\u03d8\1\344\1\u10d8"+
- "\1\344\1\u017c\55\344\1\u03d7\1\u03d8\2\344\1\u10d9\1\u017c"+
- "\55\344\1\u03d7\1\u03d8\3\344\1\u017c\1\u10da\54\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\1\344\1\u10db\53\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\2\344\1\u10dc\52\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\3\344\1\u10dd\51\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\4\344\1\u10de\50\344\1\u03d7\1\u03d8\3\344\1\u017c\5\344"+
- "\1\u10df\47\344\1\u03d7\1\u03d8\3\344\1\u017c\6\344\1\u10e0"+
- "\46\344\1\u03d7\1\u03d8\3\344\1\u017c\7\344\1\u10e1\45\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\10\344\1\u10e2\44\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\11\344\1\u10e3\42\344\1\276\1\300"+
- "\1\u02bf\3\276\1\u10e4\55\276\1\300\1\u02bf\4\276\1\u10e5"+
- "\54\276\1\300\1\u02bf\5\276\1\u10e6\53\276\1\300\1\u02bf"+
- "\6\276\1\u10e7\52\276\1\300\1\u02bf\7\276\1\u10e8\51\276"+
- "\1\300\1\u02bf\10\276\1\u10e9\50\276\1\300\1\u02bf\11\276"+
- "\1\u10ea\47\276\1\300\1\u02bf\12\276\1\u10eb\46\276\1\300"+
- "\1\u02bf\13\276\1\u10ec\45\276\1\300\1\u02bf\14\276\1\u10ed"+
- "\44\276\1\300\1\u02bf\15\276\1\u10ee\42\276\1\0\2\u0381"+
- "\1\0\1\u10ef\57\0\2\u0381\2\0\1\u10f0\56\0\2\u0381"+
- "\3\0\1\u10f1\55\0\2\u0381\4\0\1\u10f2\54\0\2\u0381"+
- "\5\0\1\u10f3\53\0\2\u0381\6\0\1\u10f4\52\0\2\u0381"+
- "\7\0\1\u10f5\51\0\2\u0381\10\0\1\u10f6\50\0\2\u0381"+
- "\11\0\1\u10f7\47\0\2\u0381\12\0\1\u10f8\46\0\2\u0381"+
- "\13\0\1\u10f9\45\0\2\u0381\14\0\1\u10fa\44\0\2\u0381"+
- "\15\0\1\u10fb\43\0\1\u0311\1\u0312\1\0\1\u10fc\57\0"+
- "\1\u0311\1\u0312\2\0\1\u10fd\56\0\1\u0311\1\u0312\3\0"+
- "\1\u10fe\55\0\1\u0311\1\u0312\4\0\1\u10ff\54\0\1\u0311"+
- "\1\u0312\5\0\1\u1100\53\0\1\u0311\1\u0312\6\0\1\u1101"+
- "\52\0\1\u0311\1\u0312\7\0\1\u1102\51\0\1\u0311\1\u0312"+
- "\10\0\1\u1103\50\0\1\u0311\1\u0312\11\0\1\u1104\47\0"+
- "\1\u0311\1\u0312\12\0\1\u1105\46\0\1\u0311\1\u0312\13\0"+
- "\1\u1106\45\0\1\u0311\1\u0312\14\0\1\u1107\44\0\1\u0311"+
- "\1\u0312\15\0\1\u1108\43\0\2\u039d\1\0\1\u1109\57\0"+
- "\2\u039d\2\0\1\u110a\56\0\2\u039d\3\0\1\u110b\55\0"+
- "\2\u039d\4\0\1\u110c\54\0\2\u039d\5\0\1\u110d\53\0"+
- "\2\u039d\6\0\1\u110e\52\0\2\u039d\7\0\1\u110f\51\0"+
- "\2\u039d\10\0\1\u1110\50\0\2\u039d\11\0\1\u1111\47\0"+
- "\2\u039d\12\0\1\u1112\46\0\2\u039d\13\0\1\u1113\45\0"+
- "\2\u039d\14\0\1\u1114\44\0\2\u039d\15\0\1\u1115\42\0"+
- "\1\276\1\u03ab\1\u03ac\1\276\1\u1116\57\276\1\u03ab\1\u03ac"+
- "\2\276\1\u1117\56\276\1\u03ab\1\u03ac\3\276\1\u1118\55\276"+
- "\1\u03ab\1\u03ac\4\276\1\u1119\54\276\1\u03ab\1\u03ac\5\276"+
- "\1\u111a\53\276\1\u03ab\1\u03ac\6\276\1\u111b\52\276\1\u03ab"+
- "\1\u03ac\7\276\1\u111c\51\276\1\u03ab\1\u03ac\10\276\1\u111d"+
- "\50\276\1\u03ab\1\u03ac\11\276\1\u111e\47\276\1\u03ab\1\u03ac"+
- "\12\276\1\u111f\46\276\1\u03ab\1\u03ac\13\276\1\u1120\45\276"+
- "\1\u03ab\1\u03ac\14\276\1\u1121\44\276\1\u03ab\1\u03ac\15\276"+
- "\1\u1122\43\276\1\u033b\1\u033c\1\276\1\u1123\57\276\1\u033b"+
- "\1\u033c\2\276\1\u1124\56\276\1\u033b\1\u033c\3\276\1\u1125"+
- "\55\276\1\u033b\1\u033c\4\276\1\u1126\54\276\1\u033b\1\u033c"+
- "\5\276\1\u1127\53\276\1\u033b\1\u033c\6\276\1\u1128\52\276"+
- "\1\u033b\1\u033c\7\276\1\u1129\51\276\1\u033b\1\u033c\10\276"+
- "\1\u112a\50\276\1\u033b\1\u033c\11\276\1\u112b\47\276\1\u033b"+
- "\1\u033c\12\276\1\u112c\46\276\1\u033b\1\u033c\13\276\1\u112d"+
- "\45\276\1\u033b\1\u033c\14\276\1\u112e\44\276\1\u033b\1\u033c"+
- "\15\276\1\u112f\43\276\1\300\1\u02bf\1\276\1\u1130\57\276"+
- "\1\300\1\u02bf\2\276\1\u1131\55\276\1\263\1\u03c9\1\u03ca"+
- "\1\263\1\u1132\1\263\1\u0136\55\263\1\u03c9\1\u03ca\2\263"+
- "\1\u1133\1\u0136\55\263\1\u03c9\1\u03ca\3\263\1\u0136\1\u1134"+
- "\54\263\1\u03c9\1\u03ca\3\263\1\u0136\1\263\1\u1135\53\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\2\263\1\u1136\52\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\3\263\1\u1137\51\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\4\263\1\u1138\50\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\5\263\1\u1139\47\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\6\263\1\u113a\46\263\1\u03c9\1\u03ca\3\263\1\u0136\7\263"+
- "\1\u113b\45\263\1\u03c9\1\u03ca\3\263\1\u0136\10\263\1\u113c"+
- "\44\263\1\u03c9\1\u03ca\3\263\1\u0136\11\263\1\u113d\42\263"+
- "\1\344\1\u03d7\1\u03d8\1\344\1\u113e\1\344\1\u017c\55\344"+
- "\1\u03d7\1\u03d8\2\344\1\u113f\1\u017c\55\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\1\u1140\54\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\1\344\1\u1141\53\344\1\u03d7\1\u03d8\3\344\1\u017c\2\344"+
- "\1\u1142\52\344\1\u03d7\1\u03d8\3\344\1\u017c\3\344\1\u1143"+
- "\51\344\1\u03d7\1\u03d8\3\344\1\u017c\4\344\1\u1144\50\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\5\344\1\u1145\47\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\6\344\1\u1146\46\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\7\344\1\u1147\45\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\10\344\1\u1148\44\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\11\344\1\u1149\42\344\1\276\1\300\1\u02bf\3\276\1\u114a"+
- "\55\276\1\300\1\u02bf\4\276\1\u114b\54\276\1\300\1\u02bf"+
- "\5\276\1\u114c\53\276\1\300\1\u02bf\6\276\1\u114d\52\276"+
- "\1\300\1\u02bf\7\276\1\u114e\51\276\1\300\1\u02bf\10\276"+
- "\1\u114f\50\276\1\300\1\u02bf\11\276\1\u1150\47\276\1\300"+
- "\1\u02bf\12\276\1\u1151\46\276\1\300\1\u02bf\13\276\1\u1152"+
- "\45\276\1\300\1\u02bf\14\276\1\u1153\44\276\1\300\1\u02bf"+
- "\15\276\1\u1154\42\276\1\0\2\u0381\1\0\1\u1155\57\0"+
- "\2\u0381\2\0\1\u1156\56\0\2\u0381\3\0\1\u1157\55\0"+
- "\2\u0381\4\0\1\u1158\54\0\2\u0381\5\0\1\u1159\53\0"+
- "\2\u0381\6\0\1\u115a\52\0\2\u0381\7\0\1\u115b\51\0"+
- "\2\u0381\10\0\1\u115c\50\0\2\u0381\11\0\1\u115d\47\0"+
- "\2\u0381\12\0\1\u115e\46\0\2\u0381\13\0\1\u115f\45\0"+
- "\2\u0381\14\0\1\u1160\44\0\2\u0381\15\0\1\u1161\43\0"+
- "\1\u0311\1\u0312\1\0\1\u1162\57\0\1\u0311\1\u0312\2\0"+
- "\1\u1163\56\0\1\u0311\1\u0312\3\0\1\u1164\55\0\1\u0311"+
- "\1\u0312\4\0\1\u1165\54\0\1\u0311\1\u0312\5\0\1\u1166"+
- "\53\0\1\u0311\1\u0312\6\0\1\u1167\52\0\1\u0311\1\u0312"+
- "\7\0\1\u1168\51\0\1\u0311\1\u0312\10\0\1\u1169\50\0"+
- "\1\u0311\1\u0312\11\0\1\u116a\47\0\1\u0311\1\u0312\12\0"+
- "\1\u116b\46\0\1\u0311\1\u0312\13\0\1\u116c\45\0\1\u0311"+
- "\1\u0312\14\0\1\u116d\44\0\1\u0311\1\u0312\15\0\1\u116e"+
- "\43\0\2\u039d\1\0\1\u116f\57\0\2\u039d\2\0\1\u1170"+
- "\56\0\2\u039d\3\0\1\u1171\55\0\2\u039d\4\0\1\u1172"+
- "\54\0\2\u039d\5\0\1\u1173\53\0\2\u039d\6\0\1\u1174"+
- "\52\0\2\u039d\7\0\1\u1175\51\0\2\u039d\10\0\1\u1176"+
- "\50\0\2\u039d\11\0\1\u1177\47\0\2\u039d\12\0\1\u1178"+
- "\46\0\2\u039d\13\0\1\u1179\45\0\2\u039d\14\0\1\u117a"+
- "\44\0\2\u039d\15\0\1\u117b\42\0\1\276\1\u03ab\1\u03ac"+
- "\1\276\1\u117c\57\276\1\u03ab\1\u03ac\2\276\1\u117d\56\276"+
- "\1\u03ab\1\u03ac\3\276\1\u117e\55\276\1\u03ab\1\u03ac\4\276"+
- "\1\u117f\54\276\1\u03ab\1\u03ac\5\276\1\u1180\53\276\1\u03ab"+
- "\1\u03ac\6\276\1\u1181\52\276\1\u03ab\1\u03ac\7\276\1\u1182"+
- "\51\276\1\u03ab\1\u03ac\10\276\1\u1183\50\276\1\u03ab\1\u03ac"+
- "\11\276\1\u1184\47\276\1\u03ab\1\u03ac\12\276\1\u1185\46\276"+
- "\1\u03ab\1\u03ac\13\276\1\u1186\45\276\1\u03ab\1\u03ac\14\276"+
- "\1\u1187\44\276\1\u03ab\1\u03ac\15\276\1\u1188\43\276\1\u033b"+
- "\1\u033c\1\276\1\u1189\57\276\1\u033b\1\u033c\2\276\1\u118a"+
- "\56\276\1\u033b\1\u033c\3\276\1\u118b\55\276\1\u033b\1\u033c"+
- "\4\276\1\u118c\54\276\1\u033b\1\u033c\5\276\1\u118d\53\276"+
- "\1\u033b\1\u033c\6\276\1\u118e\52\276\1\u033b\1\u033c\7\276"+
- "\1\u118f\51\276\1\u033b\1\u033c\10\276\1\u1190\50\276\1\u033b"+
- "\1\u033c\11\276\1\u1191\47\276\1\u033b\1\u033c\12\276\1\u1192"+
- "\46\276\1\u033b\1\u033c\13\276\1\u1193\45\276\1\u033b\1\u033c"+
- "\14\276\1\u1194\44\276\1\u033b\1\u033c\15\276\1\u1195\43\276"+
- "\1\300\1\u02bf\1\276\1\u1196\57\276\1\300\1\u02bf\2\276"+
- "\1\u1197\55\276\1\263\1\u03c9\1\u03ca\1\263\1\u1198\1\263"+
- "\1\u0136\55\263\1\u03c9\1\u03ca\2\263\1\u1199\1\u0136\55\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\1\u119a\54\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\1\263\1\u119b\53\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\2\263\1\u119c\52\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\3\263\1\u119d\51\263\1\u03c9\1\u03ca\3\263\1\u0136\4\263"+
- "\1\u119e\50\263\1\u03c9\1\u03ca\3\263\1\u0136\5\263\1\u119f"+
- "\47\263\1\u03c9\1\u03ca\3\263\1\u0136\6\263\1\u11a0\46\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\7\263\1\u11a1\45\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\10\263\1\u11a2\44\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\11\263\1\u11a3\42\263\1\344\1\u03d7\1\u03d8"+
- "\1\344\1\u11a4\1\344\1\u017c\55\344\1\u03d7\1\u03d8\2\344"+
- "\1\u11a5\1\u017c\55\344\1\u03d7\1\u03d8\3\344\1\u017c\1\u11a6"+
- "\54\344\1\u03d7\1\u03d8\3\344\1\u017c\1\344\1\u11a7\53\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\2\344\1\u11a8\52\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\3\344\1\u11a9\51\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\4\344\1\u11aa\50\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\5\344\1\u11ab\47\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\6\344\1\u11ac\46\344\1\u03d7\1\u03d8\3\344\1\u017c\7\344"+
- "\1\u11ad\45\344\1\u03d7\1\u03d8\3\344\1\u017c\10\344\1\u11ae"+
- "\44\344\1\u03d7\1\u03d8\3\344\1\u017c\11\344\1\u11af\42\344"+
- "\1\276\1\300\1\u02bf\3\276\1\u11b0\55\276\1\300\1\u02bf"+
- "\4\276\1\u11b1\54\276\1\300\1\u02bf\5\276\1\u11b2\53\276"+
- "\1\300\1\u02bf\6\276\1\u11b3\52\276\1\300\1\u02bf\7\276"+
- "\1\u11b4\51\276\1\300\1\u02bf\10\276\1\u11b5\50\276\1\300"+
- "\1\u02bf\11\276\1\u11b6\47\276\1\300\1\u02bf\12\276\1\u11b7"+
- "\46\276\1\300\1\u02bf\13\276\1\u11b8\45\276\1\300\1\u02bf"+
- "\14\276\1\u11b9\44\276\1\300\1\u02bf\15\276\1\u11ba\42\276"+
- "\1\0\2\u0381\1\0\1\u11bb\57\0\2\u0381\2\0\1\u11bc"+
- "\56\0\2\u0381\3\0\1\u11bd\55\0\2\u0381\4\0\1\u11be"+
- "\54\0\2\u0381\5\0\1\u11bf\53\0\2\u0381\6\0\1\u11c0"+
- "\52\0\2\u0381\7\0\1\u11c1\51\0\2\u0381\10\0\1\u11c2"+
- "\50\0\2\u0381\11\0\1\u11c3\47\0\2\u0381\12\0\1\u11c4"+
- "\46\0\2\u0381\13\0\1\u11c5\45\0\2\u0381\14\0\1\u11c6"+
- "\44\0\2\u0381\15\0\1\u11c7\43\0\1\u0311\1\u0312\1\0"+
- "\1\u11c8\57\0\1\u0311\1\u0312\2\0\1\u11c9\56\0\1\u0311"+
- "\1\u0312\3\0\1\u11ca\55\0\1\u0311\1\u0312\4\0\1\u11cb"+
- "\54\0\1\u0311\1\u0312\5\0\1\u11cc\53\0\1\u0311\1\u0312"+
- "\6\0\1\u11cd\52\0\1\u0311\1\u0312\7\0\1\u11ce\51\0"+
- "\1\u0311\1\u0312\10\0\1\u11cf\50\0\1\u0311\1\u0312\11\0"+
- "\1\u11d0\47\0\1\u0311\1\u0312\12\0\1\u11d1\46\0\1\u0311"+
- "\1\u0312\13\0\1\u11d2\45\0\1\u0311\1\u0312\14\0\1\u11d3"+
- "\44\0\1\u0311\1\u0312\15\0\1\u11d4\43\0\2\u039d\1\0"+
- "\1\u11d5\57\0\2\u039d\2\0\1\u11d6\56\0\2\u039d\3\0"+
- "\1\u11d7\55\0\2\u039d\4\0\1\u11d8\54\0\2\u039d\5\0"+
- "\1\u11d9\53\0\2\u039d\6\0\1\u11da\52\0\2\u039d\7\0"+
- "\1\u11db\51\0\2\u039d\10\0\1\u11dc\50\0\2\u039d\11\0"+
- "\1\u11dd\47\0\2\u039d\12\0\1\u11de\46\0\2\u039d\13\0"+
- "\1\u11df\45\0\2\u039d\14\0\1\u11e0\44\0\2\u039d\15\0"+
- "\1\u11e1\42\0\1\276\1\u03ab\1\u03ac\1\276\1\u11e2\57\276"+
- "\1\u03ab\1\u03ac\2\276\1\u11e3\56\276\1\u03ab\1\u03ac\3\276"+
- "\1\u11e4\55\276\1\u03ab\1\u03ac\4\276\1\u11e5\54\276\1\u03ab"+
- "\1\u03ac\5\276\1\u11e6\53\276\1\u03ab\1\u03ac\6\276\1\u11e7"+
- "\52\276\1\u03ab\1\u03ac\7\276\1\u11e8\51\276\1\u03ab\1\u03ac"+
- "\10\276\1\u11e9\50\276\1\u03ab\1\u03ac\11\276\1\u11ea\47\276"+
- "\1\u03ab\1\u03ac\12\276\1\u11eb\46\276\1\u03ab\1\u03ac\13\276"+
- "\1\u11ec\45\276\1\u03ab\1\u03ac\14\276\1\u11ed\44\276\1\u03ab"+
- "\1\u03ac\15\276\1\u11ee\43\276\1\u033b\1\u033c\1\276\1\u11ef"+
- "\57\276\1\u033b\1\u033c\2\276\1\u11f0\56\276\1\u033b\1\u033c"+
- "\3\276\1\u11f1\55\276\1\u033b\1\u033c\4\276\1\u11f2\54\276"+
- "\1\u033b\1\u033c\5\276\1\u11f3\53\276\1\u033b\1\u033c\6\276"+
- "\1\u11f4\52\276\1\u033b\1\u033c\7\276\1\u11f5\51\276\1\u033b"+
- "\1\u033c\10\276\1\u11f6\50\276\1\u033b\1\u033c\11\276\1\u11f7"+
- "\47\276\1\u033b\1\u033c\12\276\1\u11f8\46\276\1\u033b\1\u033c"+
- "\13\276\1\u11f9\45\276\1\u033b\1\u033c\14\276\1\u11fa\44\276"+
- "\1\u033b\1\u033c\15\276\1\u11fb\43\276\1\300\1\u02bf\1\276"+
- "\1\u11fc\57\276\1\300\1\u02bf\2\276\1\u11fd\55\276\1\263"+
- "\1\u03c9\1\u03ca\1\263\1\u11fe\1\263\1\u0136\55\263\1\u03c9"+
- "\1\u03ca\2\263\1\u11ff\1\u0136\55\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\1\u1200\54\263\1\u03c9\1\u03ca\3\263\1\u0136\1\263"+
- "\1\u1201\53\263\1\u03c9\1\u03ca\3\263\1\u0136\2\263\1\u1202"+
- "\52\263\1\u03c9\1\u03ca\3\263\1\u0136\3\263\1\u1203\51\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\4\263\1\u1204\50\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\5\263\1\u1205\47\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\6\263\1\u1206\46\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\7\263\1\u1207\45\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\10\263\1\u1208\44\263\1\u03c9\1\u03ca\3\263\1\u0136\11\263"+
- "\1\u1209\42\263\1\344\1\u03d7\1\u03d8\1\344\1\u120a\1\344"+
- "\1\u017c\55\344\1\u03d7\1\u03d8\2\344\1\u120b\1\u017c\55\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\1\u120c\54\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\1\344\1\u120d\53\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\2\344\1\u120e\52\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\3\344\1\u120f\51\344\1\u03d7\1\u03d8\3\344\1\u017c\4\344"+
- "\1\u1210\50\344\1\u03d7\1\u03d8\3\344\1\u017c\5\344\1\u1211"+
- "\47\344\1\u03d7\1\u03d8\3\344\1\u017c\6\344\1\u1212\46\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\7\344\1\u1213\45\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\10\344\1\u1214\44\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\11\344\1\u1215\42\344\1\276\1\300\1\u02bf"+
- "\3\276\1\u1216\55\276\1\300\1\u02bf\4\276\1\u1217\54\276"+
- "\1\300\1\u02bf\5\276\1\u1218\53\276\1\300\1\u02bf\6\276"+
- "\1\u1219\52\276\1\300\1\u02bf\7\276\1\u121a\51\276\1\300"+
- "\1\u02bf\10\276\1\u121b\50\276\1\300\1\u02bf\11\276\1\u121c"+
- "\47\276\1\300\1\u02bf\12\276\1\u121d\46\276\1\300\1\u02bf"+
- "\13\276\1\u121e\45\276\1\300\1\u02bf\14\276\1\u121f\44\276"+
- "\1\300\1\u02bf\15\276\1\u1220\42\276\1\0\2\u0381\1\0"+
- "\1\u1221\57\0\2\u0381\2\0\1\u1222\56\0\2\u0381\3\0"+
- "\1\u1223\55\0\2\u0381\4\0\1\u1224\54\0\2\u0381\5\0"+
- "\1\u1225\53\0\2\u0381\6\0\1\u1226\52\0\2\u0381\7\0"+
- "\1\u1227\51\0\2\u0381\10\0\1\u1228\50\0\2\u0381\11\0"+
- "\1\u1229\47\0\2\u0381\12\0\1\u122a\46\0\2\u0381\13\0"+
- "\1\u122b\45\0\2\u0381\14\0\1\u122c\44\0\2\u0381\15\0"+
- "\1\u122d\43\0\1\u0311\1\u0312\1\0\1\u122e\57\0\1\u0311"+
- "\1\u0312\2\0\1\u122f\56\0\1\u0311\1\u0312\3\0\1\u1230"+
- "\55\0\1\u0311\1\u0312\4\0\1\u1231\54\0\1\u0311\1\u0312"+
- "\5\0\1\u1232\53\0\1\u0311\1\u0312\6\0\1\u1233\52\0"+
- "\1\u0311\1\u0312\7\0\1\u1234\51\0\1\u0311\1\u0312\10\0"+
- "\1\u1235\50\0\1\u0311\1\u0312\11\0\1\u1236\47\0\1\u0311"+
- "\1\u0312\12\0\1\u1237\46\0\1\u0311\1\u0312\13\0\1\u1238"+
- "\45\0\1\u0311\1\u0312\14\0\1\u1239\44\0\1\u0311\1\u0312"+
- "\15\0\1\u123a\43\0\2\u039d\1\0\1\u123b\57\0\2\u039d"+
- "\2\0\1\u123c\56\0\2\u039d\3\0\1\u123d\55\0\2\u039d"+
- "\4\0\1\u123e\54\0\2\u039d\5\0\1\u123f\53\0\2\u039d"+
- "\6\0\1\u1240\52\0\2\u039d\7\0\1\u1241\51\0\2\u039d"+
- "\10\0\1\u1242\50\0\2\u039d\11\0\1\u1243\47\0\2\u039d"+
- "\12\0\1\u1244\46\0\2\u039d\13\0\1\u1245\45\0\2\u039d"+
- "\14\0\1\u1246\44\0\2\u039d\15\0\1\u1247\42\0\1\276"+
- "\1\u03ab\1\u03ac\1\276\1\u1248\57\276\1\u03ab\1\u03ac\2\276"+
- "\1\u1249\56\276\1\u03ab\1\u03ac\3\276\1\u124a\55\276\1\u03ab"+
- "\1\u03ac\4\276\1\u124b\54\276\1\u03ab\1\u03ac\5\276\1\u124c"+
- "\53\276\1\u03ab\1\u03ac\6\276\1\u124d\52\276\1\u03ab\1\u03ac"+
- "\7\276\1\u124e\51\276\1\u03ab\1\u03ac\10\276\1\u124f\50\276"+
- "\1\u03ab\1\u03ac\11\276\1\u1250\47\276\1\u03ab\1\u03ac\12\276"+
- "\1\u1251\46\276\1\u03ab\1\u03ac\13\276\1\u1252\45\276\1\u03ab"+
- "\1\u03ac\14\276\1\u1253\44\276\1\u03ab\1\u03ac\15\276\1\u1254"+
- "\43\276\1\u033b\1\u033c\1\276\1\u1255\57\276\1\u033b\1\u033c"+
- "\2\276\1\u1256\56\276\1\u033b\1\u033c\3\276\1\u1257\55\276"+
- "\1\u033b\1\u033c\4\276\1\u1258\54\276\1\u033b\1\u033c\5\276"+
- "\1\u1259\53\276\1\u033b\1\u033c\6\276\1\u125a\52\276\1\u033b"+
- "\1\u033c\7\276\1\u125b\51\276\1\u033b\1\u033c\10\276\1\u125c"+
- "\50\276\1\u033b\1\u033c\11\276\1\u125d\47\276\1\u033b\1\u033c"+
- "\12\276\1\u125e\46\276\1\u033b\1\u033c\13\276\1\u125f\45\276"+
- "\1\u033b\1\u033c\14\276\1\u1260\44\276\1\u033b\1\u033c\15\276"+
- "\1\u1261\43\276\1\300\1\u02bf\1\276\1\u1262\57\276\1\300"+
- "\1\u02bf\2\276\1\u1263\55\276\1\263\1\u03c9\1\u03ca\1\263"+
- "\1\u1264\1\263\1\u0136\55\263\1\u03c9\1\u03ca\2\263\1\u1265"+
- "\1\u0136\55\263\1\u03c9\1\u03ca\3\263\1\u0136\1\u1266\54\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\1\263\1\u1267\53\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\2\263\1\u1268\52\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\3\263\1\u1269\51\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\4\263\1\u126a\50\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\5\263\1\u126b\47\263\1\u03c9\1\u03ca\3\263\1\u0136\6\263"+
- "\1\u126c\46\263\1\u03c9\1\u03ca\3\263\1\u0136\7\263\1\u126d"+
- "\45\263\1\u03c9\1\u03ca\3\263\1\u0136\10\263\1\u126e\44\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\11\263\1\u126f\42\263\1\344"+
- "\1\u03d7\1\u03d8\1\344\1\u1270\1\344\1\u017c\55\344\1\u03d7"+
- "\1\u03d8\2\344\1\u1271\1\u017c\55\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\1\u1272\54\344\1\u03d7\1\u03d8\3\344\1\u017c\1\344"+
- "\1\u1273\53\344\1\u03d7\1\u03d8\3\344\1\u017c\2\344\1\u1274"+
- "\52\344\1\u03d7\1\u03d8\3\344\1\u017c\3\344\1\u1275\51\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\4\344\1\u1276\50\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\5\344\1\u1277\47\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\6\344\1\u1278\46\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\7\344\1\u1279\45\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\10\344\1\u127a\44\344\1\u03d7\1\u03d8\3\344\1\u017c\11\344"+
- "\1\u127b\42\344\1\276\1\300\1\u02bf\3\276\1\u127c\55\276"+
- "\1\300\1\u02bf\4\276\1\u127d\54\276\1\300\1\u02bf\5\276"+
- "\1\u127e\53\276\1\300\1\u02bf\6\276\1\u127f\52\276\1\300"+
- "\1\u02bf\7\276\1\u1280\51\276\1\300\1\u02bf\10\276\1\u1281"+
- "\50\276\1\300\1\u02bf\11\276\1\u1282\47\276\1\300\1\u02bf"+
- "\12\276\1\u1283\46\276\1\300\1\u02bf\13\276\1\u1284\45\276"+
- "\1\300\1\u02bf\14\276\1\u1285\44\276\1\300\1\u02bf\15\276"+
- "\1\u1286\42\276\1\0\2\u0381\1\0\1\u1287\57\0\2\u0381"+
- "\2\0\1\u1288\56\0\2\u0381\3\0\1\u1289\55\0\2\u0381"+
- "\4\0\1\u128a\54\0\2\u0381\5\0\1\u128b\53\0\2\u0381"+
- "\6\0\1\u128c\52\0\2\u0381\7\0\1\u128d\51\0\2\u0381"+
- "\10\0\1\u128e\50\0\2\u0381\11\0\1\u128f\47\0\2\u0381"+
- "\12\0\1\u1290\46\0\2\u0381\13\0\1\u1291\45\0\2\u0381"+
- "\14\0\1\u1292\44\0\2\u0381\15\0\1\u1293\43\0\1\u0311"+
- "\1\u0312\1\0\1\u1294\57\0\1\u0311\1\u0312\2\0\1\u1295"+
- "\56\0\1\u0311\1\u0312\3\0\1\u1296\55\0\1\u0311\1\u0312"+
- "\4\0\1\u1297\54\0\1\u0311\1\u0312\5\0\1\u1298\53\0"+
- "\1\u0311\1\u0312\6\0\1\u1299\52\0\1\u0311\1\u0312\7\0"+
- "\1\u129a\51\0\1\u0311\1\u0312\10\0\1\u129b\50\0\1\u0311"+
- "\1\u0312\11\0\1\u129c\47\0\1\u0311\1\u0312\12\0\1\u129d"+
- "\46\0\1\u0311\1\u0312\13\0\1\u129e\45\0\1\u0311\1\u0312"+
- "\14\0\1\u129f\44\0\1\u0311\1\u0312\15\0\1\u12a0\43\0"+
- "\2\u039d\1\0\1\u12a1\57\0\2\u039d\2\0\1\u12a2\56\0"+
- "\2\u039d\3\0\1\u12a3\55\0\2\u039d\4\0\1\u12a4\54\0"+
- "\2\u039d\5\0\1\u12a5\53\0\2\u039d\6\0\1\u12a6\52\0"+
- "\2\u039d\7\0\1\u12a7\51\0\2\u039d\10\0\1\u12a8\50\0"+
- "\2\u039d\11\0\1\u12a9\47\0\2\u039d\12\0\1\u12aa\46\0"+
- "\2\u039d\13\0\1\u12ab\45\0\2\u039d\14\0\1\u12ac\44\0"+
- "\2\u039d\15\0\1\u12ad\42\0\1\276\1\u03ab\1\u03ac\1\276"+
- "\1\u12ae\57\276\1\u03ab\1\u03ac\2\276\1\u12af\56\276\1\u03ab"+
- "\1\u03ac\3\276\1\u12b0\55\276\1\u03ab\1\u03ac\4\276\1\u12b1"+
- "\54\276\1\u03ab\1\u03ac\5\276\1\u12b2\53\276\1\u03ab\1\u03ac"+
- "\6\276\1\u12b3\52\276\1\u03ab\1\u03ac\7\276\1\u12b4\51\276"+
- "\1\u03ab\1\u03ac\10\276\1\u12b5\50\276\1\u03ab\1\u03ac\11\276"+
- "\1\u12b6\47\276\1\u03ab\1\u03ac\12\276\1\u12b7\46\276\1\u03ab"+
- "\1\u03ac\13\276\1\u12b8\45\276\1\u03ab\1\u03ac\14\276\1\u12b9"+
- "\44\276\1\u03ab\1\u03ac\15\276\1\u12ba\43\276\1\u033b\1\u033c"+
- "\1\276\1\u12bb\57\276\1\u033b\1\u033c\2\276\1\u12bc\56\276"+
- "\1\u033b\1\u033c\3\276\1\u12bd\55\276\1\u033b\1\u033c\4\276"+
- "\1\u12be\54\276\1\u033b\1\u033c\5\276\1\u12bf\53\276\1\u033b"+
- "\1\u033c\6\276\1\u12c0\52\276\1\u033b\1\u033c\7\276\1\u12c1"+
- "\51\276\1\u033b\1\u033c\10\276\1\u12c2\50\276\1\u033b\1\u033c"+
- "\11\276\1\u12c3\47\276\1\u033b\1\u033c\12\276\1\u12c4\46\276"+
- "\1\u033b\1\u033c\13\276\1\u12c5\45\276\1\u033b\1\u033c\14\276"+
- "\1\u12c6\44\276\1\u033b\1\u033c\15\276\1\u12c7\43\276\1\300"+
- "\1\u02bf\1\276\1\u12c8\57\276\1\300\1\u02bf\2\276\1\u12c9"+
- "\55\276\1\263\1\u03c9\1\u03ca\1\263\1\u12ca\1\263\1\u0136"+
- "\55\263\1\u03c9\1\u03ca\2\263\1\u12cb\1\u0136\55\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\1\u12cc\54\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\1\263\1\u12cd\53\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\2\263\1\u12ce\52\263\1\u03c9\1\u03ca\3\263\1\u0136\3\263"+
- "\1\u12cf\51\263\1\u03c9\1\u03ca\3\263\1\u0136\4\263\1\u12d0"+
- "\50\263\1\u03c9\1\u03ca\3\263\1\u0136\5\263\1\u12d1\47\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\6\263\1\u12d2\46\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\7\263\1\u12d3\45\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\10\263\1\u12d4\44\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\11\263\1\u12d5\42\263\1\344\1\u03d7\1\u03d8\1\344"+
- "\1\u12d6\1\344\1\u017c\55\344\1\u03d7\1\u03d8\2\344\1\u12d7"+
- "\1\u017c\55\344\1\u03d7\1\u03d8\3\344\1\u017c\1\u12d8\54\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\1\344\1\u12d9\53\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\2\344\1\u12da\52\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\3\344\1\u12db\51\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\4\344\1\u12dc\50\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\5\344\1\u12dd\47\344\1\u03d7\1\u03d8\3\344\1\u017c\6\344"+
- "\1\u12de\46\344\1\u03d7\1\u03d8\3\344\1\u017c\7\344\1\u12df"+
- "\45\344\1\u03d7\1\u03d8\3\344\1\u017c\10\344\1\u12e0\44\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\11\344\1\u12e1\42\344\1\276"+
- "\1\300\1\u02bf\3\276\1\u12e2\55\276\1\300\1\u02bf\4\276"+
- "\1\u12e3\54\276\1\300\1\u02bf\5\276\1\u12e4\53\276\1\300"+
- "\1\u02bf\6\276\1\u12e5\52\276\1\300\1\u02bf\7\276\1\u12e6"+
- "\51\276\1\300\1\u02bf\10\276\1\u12e7\50\276\1\300\1\u02bf"+
- "\11\276\1\u12e8\47\276\1\300\1\u02bf\12\276\1\u12e9\46\276"+
- "\1\300\1\u02bf\13\276\1\u12ea\45\276\1\300\1\u02bf\14\276"+
- "\1\u12eb\44\276\1\300\1\u02bf\15\276\1\u12ec\42\276\1\0"+
- "\2\u0381\1\0\1\u12ed\57\0\2\u0381\2\0\1\u12ee\56\0"+
- "\2\u0381\3\0\1\u12ef\55\0\2\u0381\4\0\1\u12f0\54\0"+
- "\2\u0381\5\0\1\u12f1\53\0\2\u0381\6\0\1\u12f2\52\0"+
- "\2\u0381\7\0\1\u12f3\51\0\2\u0381\10\0\1\u12f4\50\0"+
- "\2\u0381\11\0\1\u12f5\47\0\2\u0381\12\0\1\u12f6\46\0"+
- "\2\u0381\13\0\1\u12f7\45\0\2\u0381\14\0\1\u12f8\44\0"+
- "\2\u0381\15\0\1\u12f9\43\0\1\u0311\1\u0312\1\0\1\u12fa"+
- "\57\0\1\u0311\1\u0312\2\0\1\u12fb\56\0\1\u0311\1\u0312"+
- "\3\0\1\u12fc\55\0\1\u0311\1\u0312\4\0\1\u12fd\54\0"+
- "\1\u0311\1\u0312\5\0\1\u12fe\53\0\1\u0311\1\u0312\6\0"+
- "\1\u12ff\52\0\1\u0311\1\u0312\7\0\1\u1300\51\0\1\u0311"+
- "\1\u0312\10\0\1\u1301\50\0\1\u0311\1\u0312\11\0\1\u1302"+
- "\47\0\1\u0311\1\u0312\12\0\1\u1303\46\0\1\u0311\1\u0312"+
- "\13\0\1\u1304\45\0\1\u0311\1\u0312\14\0\1\u1305\44\0"+
- "\1\u0311\1\u0312\15\0\1\u1306\43\0\2\u039d\1\0\1\u1307"+
- "\57\0\2\u039d\2\0\1\u1308\56\0\2\u039d\3\0\1\u1309"+
- "\55\0\2\u039d\4\0\1\u130a\54\0\2\u039d\5\0\1\u130b"+
- "\53\0\2\u039d\6\0\1\u130c\52\0\2\u039d\7\0\1\u130d"+
- "\51\0\2\u039d\10\0\1\u130e\50\0\2\u039d\11\0\1\u130f"+
- "\47\0\2\u039d\12\0\1\u1310\46\0\2\u039d\13\0\1\u1311"+
- "\45\0\2\u039d\14\0\1\u1312\44\0\2\u039d\15\0\1\u1313"+
- "\42\0\1\276\1\u03ab\1\u03ac\1\276\1\u1314\57\276\1\u03ab"+
- "\1\u03ac\2\276\1\u1315\56\276\1\u03ab\1\u03ac\3\276\1\u1316"+
- "\55\276\1\u03ab\1\u03ac\4\276\1\u1317\54\276\1\u03ab\1\u03ac"+
- "\5\276\1\u1318\53\276\1\u03ab\1\u03ac\6\276\1\u1319\52\276"+
- "\1\u03ab\1\u03ac\7\276\1\u131a\51\276\1\u03ab\1\u03ac\10\276"+
- "\1\u131b\50\276\1\u03ab\1\u03ac\11\276\1\u131c\47\276\1\u03ab"+
- "\1\u03ac\12\276\1\u131d\46\276\1\u03ab\1\u03ac\13\276\1\u131e"+
- "\45\276\1\u03ab\1\u03ac\14\276\1\u131f\44\276\1\u03ab\1\u03ac"+
- "\15\276\1\u1320\43\276\1\u033b\1\u033c\1\276\1\u1321\57\276"+
- "\1\u033b\1\u033c\2\276\1\u1322\56\276\1\u033b\1\u033c\3\276"+
- "\1\u1323\55\276\1\u033b\1\u033c\4\276\1\u1324\54\276\1\u033b"+
- "\1\u033c\5\276\1\u1325\53\276\1\u033b\1\u033c\6\276\1\u1326"+
- "\52\276\1\u033b\1\u033c\7\276\1\u1327\51\276\1\u033b\1\u033c"+
- "\10\276\1\u1328\50\276\1\u033b\1\u033c\11\276\1\u1329\47\276"+
- "\1\u033b\1\u033c\12\276\1\u132a\46\276\1\u033b\1\u033c\13\276"+
- "\1\u132b\45\276\1\u033b\1\u033c\14\276\1\u132c\44\276\1\u033b"+
- "\1\u033c\15\276\1\u132d\43\276\1\300\1\u02bf\1\276\1\u132e"+
- "\57\276\1\300\1\u02bf\2\276\1\u132f\55\276\1\263\1\u03c9"+
- "\1\u03ca\1\263\1\u1330\1\263\1\u0136\55\263\1\u03c9\1\u03ca"+
- "\2\263\1\u1331\1\u0136\55\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\1\u1332\54\263\1\u03c9\1\u03ca\3\263\1\u0136\1\263\1\u1333"+
- "\53\263\1\u03c9\1\u03ca\3\263\1\u0136\2\263\1\u1334\52\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\3\263\1\u1335\51\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\4\263\1\u1336\50\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\5\263\1\u1337\47\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\6\263\1\u1338\46\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\7\263\1\u1339\45\263\1\u03c9\1\u03ca\3\263\1\u0136\10\263"+
- "\1\u133a\44\263\1\u03c9\1\u03ca\3\263\1\u0136\11\263\1\u133b"+
- "\42\263\1\344\1\u03d7\1\u03d8\1\344\1\u133c\1\344\1\u017c"+
- "\55\344\1\u03d7\1\u03d8\2\344\1\u133d\1\u017c\55\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\1\u133e\54\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\1\344\1\u133f\53\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\2\344\1\u1340\52\344\1\u03d7\1\u03d8\3\344\1\u017c\3\344"+
- "\1\u1341\51\344\1\u03d7\1\u03d8\3\344\1\u017c\4\344\1\u1342"+
- "\50\344\1\u03d7\1\u03d8\3\344\1\u017c\5\344\1\u1343\47\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\6\344\1\u1344\46\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\7\344\1\u1345\45\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\10\344\1\u1346\44\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\11\344\1\u1347\42\344\1\276\1\300\1\u02bf\3\276"+
- "\1\u1348\55\276\1\300\1\u02bf\4\276\1\u1349\54\276\1\300"+
- "\1\u02bf\5\276\1\u134a\53\276\1\300\1\u02bf\6\276\1\u134b"+
- "\52\276\1\300\1\u02bf\7\276\1\u134c\51\276\1\300\1\u02bf"+
- "\10\276\1\u134d\50\276\1\300\1\u02bf\11\276\1\u134e\47\276"+
- "\1\300\1\u02bf\12\276\1\u134f\46\276\1\300\1\u02bf\13\276"+
- "\1\u1350\45\276\1\300\1\u02bf\14\276\1\u1351\44\276\1\300"+
- "\1\u02bf\15\276\1\u1352\42\276\1\0\2\u0381\1\0\1\u1353"+
- "\57\0\2\u0381\2\0\1\u1354\56\0\2\u0381\3\0\1\u1355"+
- "\55\0\2\u0381\4\0\1\u1356\54\0\2\u0381\5\0\1\u1357"+
- "\53\0\2\u0381\6\0\1\u1358\52\0\2\u0381\7\0\1\u1359"+
- "\51\0\2\u0381\10\0\1\u135a\50\0\2\u0381\11\0\1\u135b"+
- "\47\0\2\u0381\12\0\1\u135c\46\0\2\u0381\13\0\1\u135d"+
- "\45\0\2\u0381\14\0\1\u135e\44\0\2\u0381\15\0\1\u135f"+
- "\43\0\1\u0311\1\u0312\1\0\1\u1360\57\0\1\u0311\1\u0312"+
- "\2\0\1\u1361\56\0\1\u0311\1\u0312\3\0\1\u1362\55\0"+
- "\1\u0311\1\u0312\4\0\1\u1363\54\0\1\u0311\1\u0312\5\0"+
- "\1\u1364\53\0\1\u0311\1\u0312\6\0\1\u1365\52\0\1\u0311"+
- "\1\u0312\7\0\1\u1366\51\0\1\u0311\1\u0312\10\0\1\u1367"+
- "\50\0\1\u0311\1\u0312\11\0\1\u1368\47\0\1\u0311\1\u0312"+
- "\12\0\1\u1369\46\0\1\u0311\1\u0312\13\0\1\u136a\45\0"+
- "\1\u0311\1\u0312\14\0\1\u136b\44\0\1\u0311\1\u0312\15\0"+
- "\1\u136c\43\0\2\u039d\1\0\1\u136d\57\0\2\u039d\2\0"+
- "\1\u136e\56\0\2\u039d\3\0\1\u136f\55\0\2\u039d\4\0"+
- "\1\u1370\54\0\2\u039d\5\0\1\u1371\53\0\2\u039d\6\0"+
- "\1\u1372\52\0\2\u039d\7\0\1\u1373\51\0\2\u039d\10\0"+
- "\1\u1374\50\0\2\u039d\11\0\1\u1375\47\0\2\u039d\12\0"+
- "\1\u1376\46\0\2\u039d\13\0\1\u1377\45\0\2\u039d\14\0"+
- "\1\u1378\44\0\2\u039d\15\0\1\u1379\42\0\1\276\1\u03ab"+
- "\1\u03ac\1\276\1\u137a\57\276\1\u03ab\1\u03ac\2\276\1\u137b"+
- "\56\276\1\u03ab\1\u03ac\3\276\1\u137c\55\276\1\u03ab\1\u03ac"+
- "\4\276\1\u137d\54\276\1\u03ab\1\u03ac\5\276\1\u137e\53\276"+
- "\1\u03ab\1\u03ac\6\276\1\u137f\52\276\1\u03ab\1\u03ac\7\276"+
- "\1\u1380\51\276\1\u03ab\1\u03ac\10\276\1\u1381\50\276\1\u03ab"+
- "\1\u03ac\11\276\1\u1382\47\276\1\u03ab\1\u03ac\12\276\1\u1383"+
- "\46\276\1\u03ab\1\u03ac\13\276\1\u1384\45\276\1\u03ab\1\u03ac"+
- "\14\276\1\u1385\44\276\1\u03ab\1\u03ac\15\276\1\u1386\43\276"+
- "\1\u033b\1\u033c\1\276\1\u1387\57\276\1\u033b\1\u033c\2\276"+
- "\1\u1388\56\276\1\u033b\1\u033c\3\276\1\u1389\55\276\1\u033b"+
- "\1\u033c\4\276\1\u138a\54\276\1\u033b\1\u033c\5\276\1\u138b"+
- "\53\276\1\u033b\1\u033c\6\276\1\u138c\52\276\1\u033b\1\u033c"+
- "\7\276\1\u138d\51\276\1\u033b\1\u033c\10\276\1\u138e\50\276"+
- "\1\u033b\1\u033c\11\276\1\u138f\47\276\1\u033b\1\u033c\12\276"+
- "\1\u1390\46\276\1\u033b\1\u033c\13\276\1\u1391\45\276\1\u033b"+
- "\1\u033c\14\276\1\u1392\44\276\1\u033b\1\u033c\15\276\1\u1393"+
- "\43\276\1\300\1\u02bf\1\276\1\u1394\57\276\1\300\1\u02bf"+
- "\2\276\1\u1395\55\276\1\263\1\u03c9\1\u03ca\1\263\1\u1396"+
- "\1\263\1\u0136\55\263\1\u03c9\1\u03ca\2\263\1\u1397\1\u0136"+
- "\55\263\1\u03c9\1\u03ca\3\263\1\u0136\1\u1398\54\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\1\263\1\u1399\53\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\2\263\1\u139a\52\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\3\263\1\u139b\51\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\4\263\1\u139c\50\263\1\u03c9\1\u03ca\3\263\1\u0136\5\263"+
- "\1\u139d\47\263\1\u03c9\1\u03ca\3\263\1\u0136\6\263\1\u139e"+
- "\46\263\1\u03c9\1\u03ca\3\263\1\u0136\7\263\1\u139f\45\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\10\263\1\u13a0\44\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\11\263\1\u13a1\42\263\1\344\1\u03d7"+
- "\1\u03d8\1\344\1\u13a2\1\344\1\u017c\55\344\1\u03d7\1\u03d8"+
- "\2\344\1\u13a3\1\u017c\55\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\1\u13a4\54\344\1\u03d7\1\u03d8\3\344\1\u017c\1\344\1\u13a5"+
- "\53\344\1\u03d7\1\u03d8\3\344\1\u017c\2\344\1\u13a6\52\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\3\344\1\u13a7\51\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\4\344\1\u13a8\50\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\5\344\1\u13a9\47\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\6\344\1\u13aa\46\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\7\344\1\u13ab\45\344\1\u03d7\1\u03d8\3\344\1\u017c\10\344"+
- "\1\u13ac\44\344\1\u03d7\1\u03d8\3\344\1\u017c\11\344\1\u13ad"+
- "\42\344\1\276\1\300\1\u02bf\3\276\1\u13ae\55\276\1\300"+
- "\1\u02bf\4\276\1\u13af\54\276\1\300\1\u02bf\5\276\1\u13b0"+
- "\53\276\1\300\1\u02bf\6\276\1\u13b1\52\276\1\300\1\u02bf"+
- "\7\276\1\u13b2\51\276\1\300\1\u02bf\10\276\1\u13b3\50\276"+
- "\1\300\1\u02bf\11\276\1\u13b4\47\276\1\300\1\u02bf\12\276"+
- "\1\u13b5\46\276\1\300\1\u02bf\13\276\1\u13b6\45\276\1\300"+
- "\1\u02bf\14\276\1\u13b7\44\276\1\300\1\u02bf\15\276\1\u13b8"+
- "\42\276\1\0\2\u0381\1\0\1\u13b9\57\0\2\u0381\2\0"+
- "\1\u13ba\56\0\2\u0381\3\0\1\u13bb\55\0\2\u0381\4\0"+
- "\1\u13bc\54\0\2\u0381\5\0\1\u13bd\53\0\2\u0381\6\0"+
- "\1\u13be\52\0\2\u0381\7\0\1\u13bf\51\0\2\u0381\10\0"+
- "\1\u13c0\50\0\2\u0381\11\0\1\u13c1\47\0\2\u0381\12\0"+
- "\1\u13c2\46\0\2\u0381\13\0\1\u13c3\45\0\2\u0381\14\0"+
- "\1\u13c4\44\0\2\u0381\15\0\1\u13c5\43\0\1\u0311\1\u0312"+
- "\1\0\1\u13c6\57\0\1\u0311\1\u0312\2\0\1\u13c7\56\0"+
- "\1\u0311\1\u0312\3\0\1\u13c8\55\0\1\u0311\1\u0312\4\0"+
- "\1\u13c9\54\0\1\u0311\1\u0312\5\0\1\u13ca\53\0\1\u0311"+
- "\1\u0312\6\0\1\u13cb\52\0\1\u0311\1\u0312\7\0\1\u13cc"+
- "\51\0\1\u0311\1\u0312\10\0\1\u13cd\50\0\1\u0311\1\u0312"+
- "\11\0\1\u13ce\47\0\1\u0311\1\u0312\12\0\1\u13cf\46\0"+
- "\1\u0311\1\u0312\13\0\1\u13d0\45\0\1\u0311\1\u0312\14\0"+
- "\1\u13d1\44\0\1\u0311\1\u0312\15\0\1\u13d2\43\0\2\u039d"+
- "\1\0\1\u13d3\57\0\2\u039d\2\0\1\u13d4\56\0\2\u039d"+
- "\3\0\1\u13d5\55\0\2\u039d\4\0\1\u13d6\54\0\2\u039d"+
- "\5\0\1\u13d7\53\0\2\u039d\6\0\1\u13d8\52\0\2\u039d"+
- "\7\0\1\u13d9\51\0\2\u039d\10\0\1\u13da\50\0\2\u039d"+
- "\11\0\1\u13db\47\0\2\u039d\12\0\1\u13dc\46\0\2\u039d"+
- "\13\0\1\u13dd\45\0\2\u039d\14\0\1\u13de\44\0\2\u039d"+
- "\15\0\1\u13df\42\0\1\276\1\u03ab\1\u03ac\1\276\1\u13e0"+
- "\57\276\1\u03ab\1\u03ac\2\276\1\u13e1\56\276\1\u03ab\1\u03ac"+
- "\3\276\1\u13e2\55\276\1\u03ab\1\u03ac\4\276\1\u13e3\54\276"+
- "\1\u03ab\1\u03ac\5\276\1\u13e4\53\276\1\u03ab\1\u03ac\6\276"+
- "\1\u13e5\52\276\1\u03ab\1\u03ac\7\276\1\u13e6\51\276\1\u03ab"+
- "\1\u03ac\10\276\1\u13e7\50\276\1\u03ab\1\u03ac\11\276\1\u13e8"+
- "\47\276\1\u03ab\1\u03ac\12\276\1\u13e9\46\276\1\u03ab\1\u03ac"+
- "\13\276\1\u13ea\45\276\1\u03ab\1\u03ac\14\276\1\u13eb\44\276"+
- "\1\u03ab\1\u03ac\15\276\1\u13ec\43\276\1\u033b\1\u033c\1\276"+
- "\1\u13ed\57\276\1\u033b\1\u033c\2\276\1\u13ee\56\276\1\u033b"+
- "\1\u033c\3\276\1\u13ef\55\276\1\u033b\1\u033c\4\276\1\u13f0"+
- "\54\276\1\u033b\1\u033c\5\276\1\u13f1\53\276\1\u033b\1\u033c"+
- "\6\276\1\u13f2\52\276\1\u033b\1\u033c\7\276\1\u13f3\51\276"+
- "\1\u033b\1\u033c\10\276\1\u13f4\50\276\1\u033b\1\u033c\11\276"+
- "\1\u13f5\47\276\1\u033b\1\u033c\12\276\1\u13f6\46\276\1\u033b"+
- "\1\u033c\13\276\1\u13f7\45\276\1\u033b\1\u033c\14\276\1\u13f8"+
- "\44\276\1\u033b\1\u033c\15\276\1\u13f9\43\276\1\300\1\u02bf"+
- "\1\276\1\u13fa\57\276\1\300\1\u02bf\2\276\1\u13fb\55\276"+
- "\1\263\1\u03c9\1\u03ca\1\263\1\u13fc\1\263\1\u0136\55\263"+
- "\1\u03c9\1\u03ca\2\263\1\u13fd\1\u0136\55\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\1\u13fe\54\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\1\263\1\u13ff\53\263\1\u03c9\1\u03ca\3\263\1\u0136\2\263"+
- "\1\u1400\52\263\1\u03c9\1\u03ca\3\263\1\u0136\3\263\1\u1401"+
- "\51\263\1\u03c9\1\u03ca\3\263\1\u0136\4\263\1\u1402\50\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\5\263\1\u1403\47\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\6\263\1\u1404\46\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\7\263\1\u1405\45\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\10\263\1\u1406\44\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\11\263\1\u1407\42\263\1\344\1\u03d7\1\u03d8\1\344\1\u1408"+
- "\1\344\1\u017c\55\344\1\u03d7\1\u03d8\2\344\1\u1409\1\u017c"+
- "\55\344\1\u03d7\1\u03d8\3\344\1\u017c\1\u140a\54\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\1\344\1\u140b\53\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\2\344\1\u140c\52\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\3\344\1\u140d\51\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\4\344\1\u140e\50\344\1\u03d7\1\u03d8\3\344\1\u017c\5\344"+
- "\1\u140f\47\344\1\u03d7\1\u03d8\3\344\1\u017c\6\344\1\u1410"+
- "\46\344\1\u03d7\1\u03d8\3\344\1\u017c\7\344\1\u1411\45\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\10\344\1\u1412\44\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\11\344\1\u1413\42\344\1\276\1\300"+
- "\1\u02bf\3\276\1\u1414\55\276\1\300\1\u02bf\4\276\1\u1415"+
- "\54\276\1\300\1\u02bf\5\276\1\u1416\53\276\1\300\1\u02bf"+
- "\6\276\1\u1417\52\276\1\300\1\u02bf\7\276\1\u1418\51\276"+
- "\1\300\1\u02bf\10\276\1\u1419\50\276\1\300\1\u02bf\11\276"+
- "\1\u141a\47\276\1\300\1\u02bf\12\276\1\u141b\46\276\1\300"+
- "\1\u02bf\13\276\1\u141c\45\276\1\300\1\u02bf\14\276\1\u141d"+
- "\44\276\1\300\1\u02bf\15\276\1\u141e\42\276\1\0\2\u0381"+
- "\1\0\1\u141f\57\0\2\u0381\2\0\1\u1420\56\0\2\u0381"+
- "\3\0\1\u1421\55\0\2\u0381\4\0\1\u1422\54\0\2\u0381"+
- "\5\0\1\u1423\53\0\2\u0381\6\0\1\u1424\52\0\2\u0381"+
- "\7\0\1\u1425\51\0\2\u0381\10\0\1\u1426\50\0\2\u0381"+
- "\11\0\1\u1427\47\0\2\u0381\12\0\1\u1428\46\0\2\u0381"+
- "\13\0\1\u1429\45\0\2\u0381\14\0\1\u142a\44\0\2\u0381"+
- "\15\0\1\u142b\43\0\1\u0311\1\u0312\1\0\1\u142c\57\0"+
- "\1\u0311\1\u0312\2\0\1\u142d\56\0\1\u0311\1\u0312\3\0"+
- "\1\u142e\55\0\1\u0311\1\u0312\4\0\1\u142f\54\0\1\u0311"+
- "\1\u0312\5\0\1\u1430\53\0\1\u0311\1\u0312\6\0\1\u1431"+
- "\52\0\1\u0311\1\u0312\7\0\1\u1432\51\0\1\u0311\1\u0312"+
- "\10\0\1\u1433\50\0\1\u0311\1\u0312\11\0\1\u1434\47\0"+
- "\1\u0311\1\u0312\12\0\1\u1435\46\0\1\u0311\1\u0312\13\0"+
- "\1\u1436\45\0\1\u0311\1\u0312\14\0\1\u1437\44\0\1\u0311"+
- "\1\u0312\15\0\1\u1438\43\0\2\u039d\1\0\1\u1439\57\0"+
- "\2\u039d\2\0\1\u143a\56\0\2\u039d\3\0\1\u143b\55\0"+
- "\2\u039d\4\0\1\u143c\54\0\2\u039d\5\0\1\u143d\53\0"+
- "\2\u039d\6\0\1\u143e\52\0\2\u039d\7\0\1\u143f\51\0"+
- "\2\u039d\10\0\1\u1440\50\0\2\u039d\11\0\1\u1441\47\0"+
- "\2\u039d\12\0\1\u1442\46\0\2\u039d\13\0\1\u1443\45\0"+
- "\2\u039d\14\0\1\u1444\44\0\2\u039d\15\0\1\u1445\42\0"+
- "\1\276\1\u03ab\1\u03ac\1\276\1\u1446\57\276\1\u03ab\1\u03ac"+
- "\2\276\1\u1447\56\276\1\u03ab\1\u03ac\3\276\1\u1448\55\276"+
- "\1\u03ab\1\u03ac\4\276\1\u1449\54\276\1\u03ab\1\u03ac\5\276"+
- "\1\u144a\53\276\1\u03ab\1\u03ac\6\276\1\u144b\52\276\1\u03ab"+
- "\1\u03ac\7\276\1\u144c\51\276\1\u03ab\1\u03ac\10\276\1\u144d"+
- "\50\276\1\u03ab\1\u03ac\11\276\1\u144e\47\276\1\u03ab\1\u03ac"+
- "\12\276\1\u144f\46\276\1\u03ab\1\u03ac\13\276\1\u1450\45\276"+
- "\1\u03ab\1\u03ac\14\276\1\u1451\44\276\1\u03ab\1\u03ac\15\276"+
- "\1\u1452\43\276\1\u033b\1\u033c\1\276\1\u1453\57\276\1\u033b"+
- "\1\u033c\2\276\1\u1454\56\276\1\u033b\1\u033c\3\276\1\u1455"+
- "\55\276\1\u033b\1\u033c\4\276\1\u1456\54\276\1\u033b\1\u033c"+
- "\5\276\1\u1457\53\276\1\u033b\1\u033c\6\276\1\u1458\52\276"+
- "\1\u033b\1\u033c\7\276\1\u1459\51\276\1\u033b\1\u033c\10\276"+
- "\1\u145a\50\276\1\u033b\1\u033c\11\276\1\u145b\47\276\1\u033b"+
- "\1\u033c\12\276\1\u145c\46\276\1\u033b\1\u033c\13\276\1\u145d"+
- "\45\276\1\u033b\1\u033c\14\276\1\u145e\44\276\1\u033b\1\u033c"+
- "\15\276\1\u145f\43\276\1\300\1\u02bf\1\276\1\u1460\57\276"+
- "\1\300\1\u02bf\2\276\1\u1461\55\276\1\263\1\u03c9\1\u03ca"+
- "\1\263\1\u1462\1\263\1\u0136\55\263\1\u03c9\1\u03ca\2\263"+
- "\1\u1463\1\u0136\55\263\1\u03c9\1\u03ca\3\263\1\u0136\1\u1464"+
- "\54\263\1\u03c9\1\u03ca\3\263\1\u0136\1\263\1\u1465\53\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\2\263\1\u1466\52\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\3\263\1\u1467\51\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\4\263\1\u1468\50\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\5\263\1\u1469\47\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\6\263\1\u146a\46\263\1\u03c9\1\u03ca\3\263\1\u0136\7\263"+
- "\1\u146b\45\263\1\u03c9\1\u03ca\3\263\1\u0136\10\263\1\u146c"+
- "\44\263\1\u03c9\1\u03ca\3\263\1\u0136\11\263\1\u146d\42\263"+
- "\1\344\1\u03d7\1\u03d8\1\344\1\u146e\1\344\1\u017c\55\344"+
- "\1\u03d7\1\u03d8\2\344\1\u146f\1\u017c\55\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\1\u1470\54\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\1\344\1\u1471\53\344\1\u03d7\1\u03d8\3\344\1\u017c\2\344"+
- "\1\u1472\52\344\1\u03d7\1\u03d8\3\344\1\u017c\3\344\1\u1473"+
- "\51\344\1\u03d7\1\u03d8\3\344\1\u017c\4\344\1\u1474\50\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\5\344\1\u1475\47\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\6\344\1\u1476\46\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\7\344\1\u1477\45\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\10\344\1\u1478\44\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\11\344\1\u1479\42\344\1\276\1\300\1\u02bf\3\276\1\u147a"+
- "\55\276\1\300\1\u02bf\4\276\1\u147b\54\276\1\300\1\u02bf"+
- "\5\276\1\u147c\53\276\1\300\1\u02bf\6\276\1\u147d\52\276"+
- "\1\300\1\u02bf\7\276\1\u147e\51\276\1\300\1\u02bf\10\276"+
- "\1\u147f\50\276\1\300\1\u02bf\11\276\1\u1480\47\276\1\300"+
- "\1\u02bf\12\276\1\u1481\46\276\1\300\1\u02bf\13\276\1\u1482"+
- "\45\276\1\300\1\u02bf\14\276\1\u1483\44\276\1\300\1\u02bf"+
- "\15\276\1\u1484\42\276\1\0\2\u0381\1\0\1\u1485\57\0"+
- "\2\u0381\2\0\1\u1486\56\0\2\u0381\3\0\1\u1487\55\0"+
- "\2\u0381\4\0\1\u1488\54\0\2\u0381\5\0\1\u1489\53\0"+
- "\2\u0381\6\0\1\u148a\52\0\2\u0381\7\0\1\u148b\51\0"+
- "\2\u0381\10\0\1\u148c\50\0\2\u0381\11\0\1\u148d\47\0"+
- "\2\u0381\12\0\1\u148e\46\0\2\u0381\13\0\1\u148f\45\0"+
- "\2\u0381\14\0\1\u1490\44\0\2\u0381\15\0\1\u1491\43\0"+
- "\1\u0311\1\u0312\1\0\1\u1492\57\0\1\u0311\1\u0312\2\0"+
- "\1\u1493\56\0\1\u0311\1\u0312\3\0\1\u1494\55\0\1\u0311"+
- "\1\u0312\4\0\1\u1495\54\0\1\u0311\1\u0312\5\0\1\u1496"+
- "\53\0\1\u0311\1\u0312\6\0\1\u1497\52\0\1\u0311\1\u0312"+
- "\7\0\1\u1498\51\0\1\u0311\1\u0312\10\0\1\u1499\50\0"+
- "\1\u0311\1\u0312\11\0\1\u149a\47\0\1\u0311\1\u0312\12\0"+
- "\1\u149b\46\0\1\u0311\1\u0312\13\0\1\u149c\45\0\1\u0311"+
- "\1\u0312\14\0\1\u149d\44\0\1\u0311\1\u0312\15\0\1\u149e"+
- "\43\0\2\u039d\1\0\1\u149f\57\0\2\u039d\2\0\1\u14a0"+
- "\56\0\2\u039d\3\0\1\u14a1\55\0\2\u039d\4\0\1\u14a2"+
- "\54\0\2\u039d\5\0\1\u14a3\53\0\2\u039d\6\0\1\u14a4"+
- "\52\0\2\u039d\7\0\1\u14a5\51\0\2\u039d\10\0\1\u14a6"+
- "\50\0\2\u039d\11\0\1\u14a7\47\0\2\u039d\12\0\1\u14a8"+
- "\46\0\2\u039d\13\0\1\u14a9\45\0\2\u039d\14\0\1\u14aa"+
- "\44\0\2\u039d\15\0\1\u14ab\42\0\1\276\1\u03ab\1\u03ac"+
- "\1\276\1\u14ac\57\276\1\u03ab\1\u03ac\2\276\1\u14ad\56\276"+
- "\1\u03ab\1\u03ac\3\276\1\u14ae\55\276\1\u03ab\1\u03ac\4\276"+
- "\1\u14af\54\276\1\u03ab\1\u03ac\5\276\1\u14b0\53\276\1\u03ab"+
- "\1\u03ac\6\276\1\u14b1\52\276\1\u03ab\1\u03ac\7\276\1\u14b2"+
- "\51\276\1\u03ab\1\u03ac\10\276\1\u14b3\50\276\1\u03ab\1\u03ac"+
- "\11\276\1\u14b4\47\276\1\u03ab\1\u03ac\12\276\1\u14b5\46\276"+
- "\1\u03ab\1\u03ac\13\276\1\u14b6\45\276\1\u03ab\1\u03ac\14\276"+
- "\1\u14b7\44\276\1\u03ab\1\u03ac\15\276\1\u14b8\43\276\1\u033b"+
- "\1\u033c\1\276\1\u14b9\57\276\1\u033b\1\u033c\2\276\1\u14ba"+
- "\56\276\1\u033b\1\u033c\3\276\1\u14bb\55\276\1\u033b\1\u033c"+
- "\4\276\1\u14bc\54\276\1\u033b\1\u033c\5\276\1\u14bd\53\276"+
- "\1\u033b\1\u033c\6\276\1\u14be\52\276\1\u033b\1\u033c\7\276"+
- "\1\u14bf\51\276\1\u033b\1\u033c\10\276\1\u14c0\50\276\1\u033b"+
- "\1\u033c\11\276\1\u14c1\47\276\1\u033b\1\u033c\12\276\1\u14c2"+
- "\46\276\1\u033b\1\u033c\13\276\1\u14c3\45\276\1\u033b\1\u033c"+
- "\14\276\1\u14c4\44\276\1\u033b\1\u033c\15\276\1\u14c5\43\276"+
- "\1\300\1\u02bf\1\276\1\u14c6\57\276\1\300\1\u02bf\2\276"+
- "\1\u14c7\55\276\1\263\1\u03c9\1\u03ca\1\263\1\u14c8\1\263"+
- "\1\u0136\55\263\1\u03c9\1\u03ca\2\263\1\u14c9\1\u0136\55\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\1\u14ca\54\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\1\263\1\u14cb\53\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\2\263\1\u14cc\52\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\3\263\1\u14cd\51\263\1\u03c9\1\u03ca\3\263\1\u0136\4\263"+
- "\1\u14ce\50\263\1\u03c9\1\u03ca\3\263\1\u0136\5\263\1\u14cf"+
- "\47\263\1\u03c9\1\u03ca\3\263\1\u0136\6\263\1\u14d0\46\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\7\263\1\u14d1\45\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\10\263\1\u14d2\44\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\11\263\1\u14d3\42\263\1\344\1\u03d7\1\u03d8"+
- "\1\344\1\u14d4\1\344\1\u017c\55\344\1\u03d7\1\u03d8\2\344"+
- "\1\u14d5\1\u017c\55\344\1\u03d7\1\u03d8\3\344\1\u017c\1\u14d6"+
- "\54\344\1\u03d7\1\u03d8\3\344\1\u017c\1\344\1\u14d7\53\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\2\344\1\u14d8\52\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\3\344\1\u14d9\51\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\4\344\1\u14da\50\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\5\344\1\u14db\47\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\6\344\1\u14dc\46\344\1\u03d7\1\u03d8\3\344\1\u017c\7\344"+
- "\1\u14dd\45\344\1\u03d7\1\u03d8\3\344\1\u017c\10\344\1\u14de"+
- "\44\344\1\u03d7\1\u03d8\3\344\1\u017c\11\344\1\u14df\42\344"+
- "\1\276\1\300\1\u02bf\3\276\1\u14e0\55\276\1\300\1\u02bf"+
- "\4\276\1\u14e1\54\276\1\300\1\u02bf\5\276\1\u14e2\53\276"+
- "\1\300\1\u02bf\6\276\1\u14e3\52\276\1\300\1\u02bf\7\276"+
- "\1\u14e4\51\276\1\300\1\u02bf\10\276\1\u14e5\50\276\1\300"+
- "\1\u02bf\11\276\1\u14e6\47\276\1\300\1\u02bf\12\276\1\u14e7"+
- "\46\276\1\300\1\u02bf\13\276\1\u14e8\45\276\1\300\1\u02bf"+
- "\14\276\1\u14e9\44\276\1\300\1\u02bf\15\276\1\u14ea\42\276"+
- "\1\0\2\u0381\1\0\1\u14eb\57\0\2\u0381\2\0\1\u14ec"+
- "\56\0\2\u0381\3\0\1\u14ed\55\0\2\u0381\4\0\1\u14ee"+
- "\54\0\2\u0381\5\0\1\u14ef\53\0\2\u0381\6\0\1\u14f0"+
- "\52\0\2\u0381\7\0\1\u14f1\51\0\2\u0381\10\0\1\u14f2"+
- "\50\0\2\u0381\11\0\1\u14f3\47\0\2\u0381\12\0\1\u14f4"+
- "\46\0\2\u0381\13\0\1\u14f5\45\0\2\u0381\14\0\1\u14f6"+
- "\44\0\2\u0381\15\0\1\u14f7\43\0\1\u0311\1\u0312\1\0"+
- "\1\u14f8\57\0\1\u0311\1\u0312\2\0\1\u14f9\56\0\1\u0311"+
- "\1\u0312\3\0\1\u14fa\55\0\1\u0311\1\u0312\4\0\1\u14fb"+
- "\54\0\1\u0311\1\u0312\5\0\1\u14fc\53\0\1\u0311\1\u0312"+
- "\6\0\1\u14fd\52\0\1\u0311\1\u0312\7\0\1\u14fe\51\0"+
- "\1\u0311\1\u0312\10\0\1\u14ff\50\0\1\u0311\1\u0312\11\0"+
- "\1\u1500\47\0\1\u0311\1\u0312\12\0\1\u1501\46\0\1\u0311"+
- "\1\u0312\13\0\1\u1502\45\0\1\u0311\1\u0312\14\0\1\u1503"+
- "\44\0\1\u0311\1\u0312\15\0\1\u1504\43\0\2\u039d\1\0"+
- "\1\u1505\57\0\2\u039d\2\0\1\u1506\56\0\2\u039d\3\0"+
- "\1\u1507\55\0\2\u039d\4\0\1\u1508\54\0\2\u039d\5\0"+
- "\1\u1509\53\0\2\u039d\6\0\1\u150a\52\0\2\u039d\7\0"+
- "\1\u150b\51\0\2\u039d\10\0\1\u150c\50\0\2\u039d\11\0"+
- "\1\u150d\47\0\2\u039d\12\0\1\u150e\46\0\2\u039d\13\0"+
- "\1\u150f\45\0\2\u039d\14\0\1\u1510\44\0\2\u039d\15\0"+
- "\1\u1511\42\0\1\276\1\u03ab\1\u03ac\1\276\1\u1512\57\276"+
- "\1\u03ab\1\u03ac\2\276\1\u1513\56\276\1\u03ab\1\u03ac\3\276"+
- "\1\u1514\55\276\1\u03ab\1\u03ac\4\276\1\u1515\54\276\1\u03ab"+
- "\1\u03ac\5\276\1\u1516\53\276\1\u03ab\1\u03ac\6\276\1\u1517"+
- "\52\276\1\u03ab\1\u03ac\7\276\1\u1518\51\276\1\u03ab\1\u03ac"+
- "\10\276\1\u1519\50\276\1\u03ab\1\u03ac\11\276\1\u151a\47\276"+
- "\1\u03ab\1\u03ac\12\276\1\u151b\46\276\1\u03ab\1\u03ac\13\276"+
- "\1\u151c\45\276\1\u03ab\1\u03ac\14\276\1\u151d\44\276\1\u03ab"+
- "\1\u03ac\15\276\1\u151e\43\276\1\u033b\1\u033c\1\276\1\u151f"+
- "\57\276\1\u033b\1\u033c\2\276\1\u1520\56\276\1\u033b\1\u033c"+
- "\3\276\1\u1521\55\276\1\u033b\1\u033c\4\276\1\u1522\54\276"+
- "\1\u033b\1\u033c\5\276\1\u1523\53\276\1\u033b\1\u033c\6\276"+
- "\1\u1524\52\276\1\u033b\1\u033c\7\276\1\u1525\51\276\1\u033b"+
- "\1\u033c\10\276\1\u1526\50\276\1\u033b\1\u033c\11\276\1\u1527"+
- "\47\276\1\u033b\1\u033c\12\276\1\u1528\46\276\1\u033b\1\u033c"+
- "\13\276\1\u1529\45\276\1\u033b\1\u033c\14\276\1\u152a\44\276"+
- "\1\u033b\1\u033c\15\276\1\u152b\43\276\1\300\1\u02bf\1\276"+
- "\1\u152c\57\276\1\300\1\u02bf\2\276\1\u152d\55\276\1\263"+
- "\1\u03c9\1\u03ca\1\263\1\u152e\1\263\1\u0136\55\263\1\u03c9"+
- "\1\u03ca\2\263\1\u152f\1\u0136\55\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\1\u1530\54\263\1\u03c9\1\u03ca\3\263\1\u0136\1\263"+
- "\1\u1531\53\263\1\u03c9\1\u03ca\3\263\1\u0136\2\263\1\u1532"+
- "\52\263\1\u03c9\1\u03ca\3\263\1\u0136\3\263\1\u1533\51\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\4\263\1\u1534\50\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\5\263\1\u1535\47\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\6\263\1\u1536\46\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\7\263\1\u1537\45\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\10\263\1\u1538\44\263\1\u03c9\1\u03ca\3\263\1\u0136\11\263"+
- "\1\u1539\42\263\1\344\1\u03d7\1\u03d8\1\344\1\u153a\1\344"+
- "\1\u017c\55\344\1\u03d7\1\u03d8\2\344\1\u153b\1\u017c\55\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\1\u153c\54\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\1\344\1\u153d\53\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\2\344\1\u153e\52\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\3\344\1\u153f\51\344\1\u03d7\1\u03d8\3\344\1\u017c\4\344"+
- "\1\u1540\50\344\1\u03d7\1\u03d8\3\344\1\u017c\5\344\1\u1541"+
- "\47\344\1\u03d7\1\u03d8\3\344\1\u017c\6\344\1\u1542\46\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\7\344\1\u1543\45\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\10\344\1\u1544\44\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\11\344\1\u1545\42\344\1\276\1\300\1\u02bf"+
- "\3\276\1\u1546\55\276\1\300\1\u02bf\4\276\1\u1547\54\276"+
- "\1\300\1\u02bf\5\276\1\u1548\53\276\1\300\1\u02bf\6\276"+
- "\1\u1549\52\276\1\300\1\u02bf\7\276\1\u154a\51\276\1\300"+
- "\1\u02bf\10\276\1\u154b\50\276\1\300\1\u02bf\11\276\1\u154c"+
- "\47\276\1\300\1\u02bf\12\276\1\u154d\46\276\1\300\1\u02bf"+
- "\13\276\1\u154e\45\276\1\300\1\u02bf\14\276\1\u154f\44\276"+
- "\1\300\1\u02bf\15\276\1\u1550\42\276\1\0\2\u0381\1\0"+
- "\1\u1551\57\0\2\u0381\2\0\1\u1552\56\0\2\u0381\3\0"+
- "\1\u1553\55\0\2\u0381\4\0\1\u1554\54\0\2\u0381\5\0"+
- "\1\u1555\53\0\2\u0381\6\0\1\u1556\52\0\2\u0381\7\0"+
- "\1\u1557\51\0\2\u0381\10\0\1\u1558\50\0\2\u0381\11\0"+
- "\1\u1559\47\0\2\u0381\12\0\1\u155a\46\0\2\u0381\13\0"+
- "\1\u155b\45\0\2\u0381\14\0\1\u155c\44\0\2\u0381\15\0"+
- "\1\u155d\43\0\1\u0311\1\u0312\1\0\1\u155e\57\0\1\u0311"+
- "\1\u0312\2\0\1\u155f\56\0\1\u0311\1\u0312\3\0\1\u1560"+
- "\55\0\1\u0311\1\u0312\4\0\1\u1561\54\0\1\u0311\1\u0312"+
- "\5\0\1\u1562\53\0\1\u0311\1\u0312\6\0\1\u1563\52\0"+
- "\1\u0311\1\u0312\7\0\1\u1564\51\0\1\u0311\1\u0312\10\0"+
- "\1\u1565\50\0\1\u0311\1\u0312\11\0\1\u1566\47\0\1\u0311"+
- "\1\u0312\12\0\1\u1567\46\0\1\u0311\1\u0312\13\0\1\u1568"+
- "\45\0\1\u0311\1\u0312\14\0\1\u1569\44\0\1\u0311\1\u0312"+
- "\15\0\1\u156a\43\0\2\u039d\1\0\1\u156b\57\0\2\u039d"+
- "\2\0\1\u156c\56\0\2\u039d\3\0\1\u156d\55\0\2\u039d"+
- "\4\0\1\u156e\54\0\2\u039d\5\0\1\u156f\53\0\2\u039d"+
- "\6\0\1\u1570\52\0\2\u039d\7\0\1\u1571\51\0\2\u039d"+
- "\10\0\1\u1572\50\0\2\u039d\11\0\1\u1573\47\0\2\u039d"+
- "\12\0\1\u1574\46\0\2\u039d\13\0\1\u1575\45\0\2\u039d"+
- "\14\0\1\u1576\44\0\2\u039d\15\0\1\u1577\42\0\1\276"+
- "\1\u03ab\1\u03ac\1\276\1\u1578\57\276\1\u03ab\1\u03ac\2\276"+
- "\1\u1579\56\276\1\u03ab\1\u03ac\3\276\1\u157a\55\276\1\u03ab"+
- "\1\u03ac\4\276\1\u157b\54\276\1\u03ab\1\u03ac\5\276\1\u157c"+
- "\53\276\1\u03ab\1\u03ac\6\276\1\u157d\52\276\1\u03ab\1\u03ac"+
- "\7\276\1\u157e\51\276\1\u03ab\1\u03ac\10\276\1\u157f\50\276"+
- "\1\u03ab\1\u03ac\11\276\1\u1580\47\276\1\u03ab\1\u03ac\12\276"+
- "\1\u1581\46\276\1\u03ab\1\u03ac\13\276\1\u1582\45\276\1\u03ab"+
- "\1\u03ac\14\276\1\u1583\44\276\1\u03ab\1\u03ac\15\276\1\u1584"+
- "\43\276\1\u033b\1\u033c\1\276\1\u1585\57\276\1\u033b\1\u033c"+
- "\2\276\1\u1586\56\276\1\u033b\1\u033c\3\276\1\u1587\55\276"+
- "\1\u033b\1\u033c\4\276\1\u1588\54\276\1\u033b\1\u033c\5\276"+
- "\1\u1589\53\276\1\u033b\1\u033c\6\276\1\u158a\52\276\1\u033b"+
- "\1\u033c\7\276\1\u158b\51\276\1\u033b\1\u033c\10\276\1\u158c"+
- "\50\276\1\u033b\1\u033c\11\276\1\u158d\47\276\1\u033b\1\u033c"+
- "\12\276\1\u158e\46\276\1\u033b\1\u033c\13\276\1\u158f\45\276"+
- "\1\u033b\1\u033c\14\276\1\u1590\44\276\1\u033b\1\u033c\15\276"+
- "\1\u1591\43\276\1\300\1\u02bf\1\276\1\u1592\57\276\1\300"+
- "\1\u02bf\2\276\1\u1593\55\276\1\263\1\u03c9\1\u03ca\1\263"+
- "\1\u1594\1\263\1\u0136\55\263\1\u03c9\1\u03ca\2\263\1\u1595"+
- "\1\u0136\55\263\1\u03c9\1\u03ca\3\263\1\u0136\1\u1596\54\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\1\263\1\u1597\53\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\2\263\1\u1598\52\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\3\263\1\u1599\51\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\4\263\1\u159a\50\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\5\263\1\u159b\47\263\1\u03c9\1\u03ca\3\263\1\u0136\6\263"+
- "\1\u159c\46\263\1\u03c9\1\u03ca\3\263\1\u0136\7\263\1\u159d"+
- "\45\263\1\u03c9\1\u03ca\3\263\1\u0136\10\263\1\u159e\44\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\11\263\1\u159f\42\263\1\344"+
- "\1\u03d7\1\u03d8\1\344\1\u15a0\1\344\1\u017c\55\344\1\u03d7"+
- "\1\u03d8\2\344\1\u15a1\1\u017c\55\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\1\u15a2\54\344\1\u03d7\1\u03d8\3\344\1\u017c\1\344"+
- "\1\u15a3\53\344\1\u03d7\1\u03d8\3\344\1\u017c\2\344\1\u15a4"+
- "\52\344\1\u03d7\1\u03d8\3\344\1\u017c\3\344\1\u15a5\51\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\4\344\1\u15a6\50\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\5\344\1\u15a7\47\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\6\344\1\u15a8\46\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\7\344\1\u15a9\45\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\10\344\1\u15aa\44\344\1\u03d7\1\u03d8\3\344\1\u017c\11\344"+
- "\1\u15ab\42\344\1\276\1\300\1\u02bf\3\276\1\u15ac\55\276"+
- "\1\300\1\u02bf\4\276\1\u15ad\54\276\1\300\1\u02bf\5\276"+
- "\1\u15ae\53\276\1\300\1\u02bf\6\276\1\u15af\52\276\1\300"+
- "\1\u02bf\7\276\1\u15b0\51\276\1\300\1\u02bf\10\276\1\u15b1"+
- "\50\276\1\300\1\u02bf\11\276\1\u15b2\47\276\1\300\1\u02bf"+
- "\12\276\1\u15b3\46\276\1\300\1\u02bf\13\276\1\u15b4\45\276"+
- "\1\300\1\u02bf\14\276\1\u15b5\44\276\1\300\1\u02bf\15\276"+
- "\1\u15b6\42\276\1\0\2\u0381\1\0\1\u15b7\57\0\2\u0381"+
- "\2\0\1\u15b8\56\0\2\u0381\3\0\1\u15b9\55\0\2\u0381"+
- "\4\0\1\u15ba\54\0\2\u0381\5\0\1\u15bb\53\0\2\u0381"+
- "\6\0\1\u15bc\52\0\2\u0381\7\0\1\u15bd\51\0\2\u0381"+
- "\10\0\1\u15be\50\0\2\u0381\11\0\1\u15bf\47\0\2\u0381"+
- "\12\0\1\u15c0\46\0\2\u0381\13\0\1\u15c1\45\0\2\u0381"+
- "\14\0\1\u15c2\44\0\2\u0381\15\0\1\u15c3\43\0\1\u0311"+
- "\1\u0312\1\0\1\u15c4\57\0\1\u0311\1\u0312\2\0\1\u15c5"+
- "\56\0\1\u0311\1\u0312\3\0\1\u15c6\55\0\1\u0311\1\u0312"+
- "\4\0\1\u15c7\54\0\1\u0311\1\u0312\5\0\1\u15c8\53\0"+
- "\1\u0311\1\u0312\6\0\1\u15c9\52\0\1\u0311\1\u0312\7\0"+
- "\1\u15ca\51\0\1\u0311\1\u0312\10\0\1\u15cb\50\0\1\u0311"+
- "\1\u0312\11\0\1\u15cc\47\0\1\u0311\1\u0312\12\0\1\u15cd"+
- "\46\0\1\u0311\1\u0312\13\0\1\u15ce\45\0\1\u0311\1\u0312"+
- "\14\0\1\u15cf\44\0\1\u0311\1\u0312\15\0\1\u15d0\43\0"+
- "\2\u039d\1\0\1\u15d1\57\0\2\u039d\2\0\1\u15d2\56\0"+
- "\2\u039d\3\0\1\u15d3\55\0\2\u039d\4\0\1\u15d4\54\0"+
- "\2\u039d\5\0\1\u15d5\53\0\2\u039d\6\0\1\u15d6\52\0"+
- "\2\u039d\7\0\1\u15d7\51\0\2\u039d\10\0\1\u15d8\50\0"+
- "\2\u039d\11\0\1\u15d9\47\0\2\u039d\12\0\1\u15da\46\0"+
- "\2\u039d\13\0\1\u15db\45\0\2\u039d\14\0\1\u15dc\44\0"+
- "\2\u039d\15\0\1\u15dd\42\0\1\276\1\u03ab\1\u03ac\1\276"+
- "\1\u15de\57\276\1\u03ab\1\u03ac\2\276\1\u15df\56\276\1\u03ab"+
- "\1\u03ac\3\276\1\u15e0\55\276\1\u03ab\1\u03ac\4\276\1\u15e1"+
- "\54\276\1\u03ab\1\u03ac\5\276\1\u15e2\53\276\1\u03ab\1\u03ac"+
- "\6\276\1\u15e3\52\276\1\u03ab\1\u03ac\7\276\1\u15e4\51\276"+
- "\1\u03ab\1\u03ac\10\276\1\u15e5\50\276\1\u03ab\1\u03ac\11\276"+
- "\1\u15e6\47\276\1\u03ab\1\u03ac\12\276\1\u15e7\46\276\1\u03ab"+
- "\1\u03ac\13\276\1\u15e8\45\276\1\u03ab\1\u03ac\14\276\1\u15e9"+
- "\44\276\1\u03ab\1\u03ac\15\276\1\u15ea\43\276\1\u033b\1\u033c"+
- "\1\276\1\u15eb\57\276\1\u033b\1\u033c\2\276\1\u15ec\56\276"+
- "\1\u033b\1\u033c\3\276\1\u15ed\55\276\1\u033b\1\u033c\4\276"+
- "\1\u15ee\54\276\1\u033b\1\u033c\5\276\1\u15ef\53\276\1\u033b"+
- "\1\u033c\6\276\1\u15f0\52\276\1\u033b\1\u033c\7\276\1\u15f1"+
- "\51\276\1\u033b\1\u033c\10\276\1\u15f2\50\276\1\u033b\1\u033c"+
- "\11\276\1\u15f3\47\276\1\u033b\1\u033c\12\276\1\u15f4\46\276"+
- "\1\u033b\1\u033c\13\276\1\u15f5\45\276\1\u033b\1\u033c\14\276"+
- "\1\u15f6\44\276\1\u033b\1\u033c\15\276\1\u15f7\43\276\1\300"+
- "\1\u02bf\1\276\1\u15f8\57\276\1\300\1\u02bf\2\276\1\u15f9"+
- "\55\276\1\263\1\u03c9\1\u03ca\1\263\1\u15fa\1\263\1\u0136"+
- "\55\263\1\u03c9\1\u03ca\2\263\1\u15fb\1\u0136\55\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\1\u15fc\54\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\1\263\1\u15fd\53\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\2\263\1\u15fe\52\263\1\u03c9\1\u03ca\3\263\1\u0136\3\263"+
- "\1\u15ff\51\263\1\u03c9\1\u03ca\3\263\1\u0136\4\263\1\u1600"+
- "\50\263\1\u03c9\1\u03ca\3\263\1\u0136\5\263\1\u1601\47\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\6\263\1\u1602\46\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\7\263\1\u1603\45\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\10\263\1\u1604\44\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\11\263\1\u1605\42\263\1\344\1\u03d7\1\u03d8\1\344"+
- "\1\u1606\1\344\1\u017c\55\344\1\u03d7\1\u03d8\2\344\1\u1607"+
- "\1\u017c\55\344\1\u03d7\1\u03d8\3\344\1\u017c\1\u1608\54\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\1\344\1\u1609\53\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\2\344\1\u160a\52\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\3\344\1\u160b\51\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\4\344\1\u160c\50\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\5\344\1\u160d\47\344\1\u03d7\1\u03d8\3\344\1\u017c\6\344"+
- "\1\u160e\46\344\1\u03d7\1\u03d8\3\344\1\u017c\7\344\1\u160f"+
- "\45\344\1\u03d7\1\u03d8\3\344\1\u017c\10\344\1\u1610\44\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\11\344\1\u1611\42\344\1\276"+
- "\1\300\1\u02bf\3\276\1\u1612\55\276\1\300\1\u02bf\4\276"+
- "\1\u1613\54\276\1\300\1\u02bf\5\276\1\u1614\53\276\1\300"+
- "\1\u02bf\6\276\1\u1615\52\276\1\300\1\u02bf\7\276\1\u1616"+
- "\51\276\1\300\1\u02bf\10\276\1\u1617\50\276\1\300\1\u02bf"+
- "\11\276\1\u1618\47\276\1\300\1\u02bf\12\276\1\u1619\46\276"+
- "\1\300\1\u02bf\13\276\1\u161a\45\276\1\300\1\u02bf\14\276"+
- "\1\u161b\44\276\1\300\1\u02bf\15\276\1\u161c\42\276\1\0"+
- "\2\u0381\1\0\1\u161d\57\0\2\u0381\2\0\1\u161e\56\0"+
- "\2\u0381\3\0\1\u161f\55\0\2\u0381\4\0\1\u1620\54\0"+
- "\2\u0381\5\0\1\u1621\53\0\2\u0381\6\0\1\u1622\52\0"+
- "\2\u0381\7\0\1\u1623\51\0\2\u0381\10\0\1\u1624\50\0"+
- "\2\u0381\11\0\1\u1625\47\0\2\u0381\12\0\1\u1626\46\0"+
- "\2\u0381\13\0\1\u1627\45\0\2\u0381\14\0\1\u1628\44\0"+
- "\2\u0381\15\0\1\u1629\43\0\1\u0311\1\u0312\1\0\1\u162a"+
- "\57\0\1\u0311\1\u0312\2\0\1\u162b\56\0\1\u0311\1\u0312"+
- "\3\0\1\u162c\55\0\1\u0311\1\u0312\4\0\1\u162d\54\0"+
- "\1\u0311\1\u0312\5\0\1\u162e\53\0\1\u0311\1\u0312\6\0"+
- "\1\u162f\52\0\1\u0311\1\u0312\7\0\1\u1630\51\0\1\u0311"+
- "\1\u0312\10\0\1\u1631\50\0\1\u0311\1\u0312\11\0\1\u1632"+
- "\47\0\1\u0311\1\u0312\12\0\1\u1633\46\0\1\u0311\1\u0312"+
- "\13\0\1\u1634\45\0\1\u0311\1\u0312\14\0\1\u1635\44\0"+
- "\1\u0311\1\u0312\15\0\1\u1636\43\0\2\u039d\1\0\1\u1637"+
- "\57\0\2\u039d\2\0\1\u1638\56\0\2\u039d\3\0\1\u1639"+
- "\55\0\2\u039d\4\0\1\u163a\54\0\2\u039d\5\0\1\u163b"+
- "\53\0\2\u039d\6\0\1\u163c\52\0\2\u039d\7\0\1\u163d"+
- "\51\0\2\u039d\10\0\1\u163e\50\0\2\u039d\11\0\1\u163f"+
- "\47\0\2\u039d\12\0\1\u1640\46\0\2\u039d\13\0\1\u1641"+
- "\45\0\2\u039d\14\0\1\u1642\44\0\2\u039d\15\0\1\u1643"+
- "\42\0\1\276\1\u03ab\1\u03ac\1\276\1\u1644\57\276\1\u03ab"+
- "\1\u03ac\2\276\1\u1645\56\276\1\u03ab\1\u03ac\3\276\1\u1646"+
- "\55\276\1\u03ab\1\u03ac\4\276\1\u1647\54\276\1\u03ab\1\u03ac"+
- "\5\276\1\u1648\53\276\1\u03ab\1\u03ac\6\276\1\u1649\52\276"+
- "\1\u03ab\1\u03ac\7\276\1\u164a\51\276\1\u03ab\1\u03ac\10\276"+
- "\1\u164b\50\276\1\u03ab\1\u03ac\11\276\1\u164c\47\276\1\u03ab"+
- "\1\u03ac\12\276\1\u164d\46\276\1\u03ab\1\u03ac\13\276\1\u164e"+
- "\45\276\1\u03ab\1\u03ac\14\276\1\u164f\44\276\1\u03ab\1\u03ac"+
- "\15\276\1\u1650\43\276\1\u033b\1\u033c\1\276\1\u1651\57\276"+
- "\1\u033b\1\u033c\2\276\1\u1652\56\276\1\u033b\1\u033c\3\276"+
- "\1\u1653\55\276\1\u033b\1\u033c\4\276\1\u1654\54\276\1\u033b"+
- "\1\u033c\5\276\1\u1655\53\276\1\u033b\1\u033c\6\276\1\u1656"+
- "\52\276\1\u033b\1\u033c\7\276\1\u1657\51\276\1\u033b\1\u033c"+
- "\10\276\1\u1658\50\276\1\u033b\1\u033c\11\276\1\u1659\47\276"+
- "\1\u033b\1\u033c\12\276\1\u165a\46\276\1\u033b\1\u033c\13\276"+
- "\1\u165b\45\276\1\u033b\1\u033c\14\276\1\u165c\44\276\1\u033b"+
- "\1\u033c\15\276\1\u165d\43\276\1\300\1\u02bf\1\276\1\u165e"+
- "\57\276\1\300\1\u02bf\2\276\1\u165f\55\276\1\263\1\u03c9"+
- "\1\u03ca\1\263\1\u1660\1\263\1\u0136\55\263\1\u03c9\1\u03ca"+
- "\2\263\1\u1661\1\u0136\55\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\1\u1662\54\263\1\u03c9\1\u03ca\3\263\1\u0136\1\263\1\u1663"+
- "\53\263\1\u03c9\1\u03ca\3\263\1\u0136\2\263\1\u1664\52\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\3\263\1\u1665\51\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\4\263\1\u1666\50\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\5\263\1\u1667\47\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\6\263\1\u1668\46\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\7\263\1\u1669\45\263\1\u03c9\1\u03ca\3\263\1\u0136\10\263"+
- "\1\u166a\44\263\1\u03c9\1\u03ca\3\263\1\u0136\11\263\1\u166b"+
- "\42\263\1\344\1\u03d7\1\u03d8\1\344\1\u166c\1\344\1\u017c"+
- "\55\344\1\u03d7\1\u03d8\2\344\1\u166d\1\u017c\55\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\1\u166e\54\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\1\344\1\u166f\53\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\2\344\1\u1670\52\344\1\u03d7\1\u03d8\3\344\1\u017c\3\344"+
- "\1\u1671\51\344\1\u03d7\1\u03d8\3\344\1\u017c\4\344\1\u1672"+
- "\50\344\1\u03d7\1\u03d8\3\344\1\u017c\5\344\1\u1673\47\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\6\344\1\u1674\46\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\7\344\1\u1675\45\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\10\344\1\u1676\44\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\11\344\1\u1677\42\344\1\276\1\300\1\u02bf\3\276"+
- "\1\u1678\55\276\1\300\1\u02bf\4\276\1\u1679\54\276\1\300"+
- "\1\u02bf\5\276\1\u167a\53\276\1\300\1\u02bf\6\276\1\u167b"+
- "\52\276\1\300\1\u02bf\7\276\1\u167c\51\276\1\300\1\u02bf"+
- "\10\276\1\u167d\50\276\1\300\1\u02bf\11\276\1\u167e\47\276"+
- "\1\300\1\u02bf\12\276\1\u167f\46\276\1\300\1\u02bf\13\276"+
- "\1\u1680\45\276\1\300\1\u02bf\14\276\1\u1681\44\276\1\300"+
- "\1\u02bf\15\276\1\u1682\42\276\1\0\2\u0381\1\0\1\u1683"+
- "\57\0\2\u0381\2\0\1\u1684\56\0\2\u0381\3\0\1\u1685"+
- "\55\0\2\u0381\4\0\1\u1686\54\0\2\u0381\5\0\1\u1687"+
- "\53\0\2\u0381\6\0\1\u1688\52\0\2\u0381\7\0\1\u1689"+
- "\51\0\2\u0381\10\0\1\u168a\50\0\2\u0381\11\0\1\u168b"+
- "\47\0\2\u0381\12\0\1\u168c\46\0\2\u0381\13\0\1\u168d"+
- "\45\0\2\u0381\14\0\1\u168e\44\0\2\u0381\15\0\1\u168f"+
- "\43\0\1\u0311\1\u0312\1\0\1\u1690\57\0\1\u0311\1\u0312"+
- "\2\0\1\u1691\56\0\1\u0311\1\u0312\3\0\1\u1692\55\0"+
- "\1\u0311\1\u0312\4\0\1\u1693\54\0\1\u0311\1\u0312\5\0"+
- "\1\u1694\53\0\1\u0311\1\u0312\6\0\1\u1695\52\0\1\u0311"+
- "\1\u0312\7\0\1\u1696\51\0\1\u0311\1\u0312\10\0\1\u1697"+
- "\50\0\1\u0311\1\u0312\11\0\1\u1698\47\0\1\u0311\1\u0312"+
- "\12\0\1\u1699\46\0\1\u0311\1\u0312\13\0\1\u169a\45\0"+
- "\1\u0311\1\u0312\14\0\1\u169b\44\0\1\u0311\1\u0312\15\0"+
- "\1\u169c\43\0\2\u039d\1\0\1\u169d\57\0\2\u039d\2\0"+
- "\1\u169e\56\0\2\u039d\3\0\1\u169f\55\0\2\u039d\4\0"+
- "\1\u16a0\54\0\2\u039d\5\0\1\u16a1\53\0\2\u039d\6\0"+
- "\1\u16a2\52\0\2\u039d\7\0\1\u16a3\51\0\2\u039d\10\0"+
- "\1\u16a4\50\0\2\u039d\11\0\1\u16a5\47\0\2\u039d\12\0"+
- "\1\u16a6\46\0\2\u039d\13\0\1\u16a7\45\0\2\u039d\14\0"+
- "\1\u16a8\44\0\2\u039d\15\0\1\u16a9\42\0\1\276\1\u03ab"+
- "\1\u03ac\1\276\1\u16aa\57\276\1\u03ab\1\u03ac\2\276\1\u16ab"+
- "\56\276\1\u03ab\1\u03ac\3\276\1\u16ac\55\276\1\u03ab\1\u03ac"+
- "\4\276\1\u16ad\54\276\1\u03ab\1\u03ac\5\276\1\u16ae\53\276"+
- "\1\u03ab\1\u03ac\6\276\1\u16af\52\276\1\u03ab\1\u03ac\7\276"+
- "\1\u16b0\51\276\1\u03ab\1\u03ac\10\276\1\u16b1\50\276\1\u03ab"+
- "\1\u03ac\11\276\1\u16b2\47\276\1\u03ab\1\u03ac\12\276\1\u16b3"+
- "\46\276\1\u03ab\1\u03ac\13\276\1\u16b4\45\276\1\u03ab\1\u03ac"+
- "\14\276\1\u16b5\44\276\1\u03ab\1\u03ac\15\276\1\u16b6\43\276"+
- "\1\u033b\1\u033c\1\276\1\u16b7\57\276\1\u033b\1\u033c\2\276"+
- "\1\u16b8\56\276\1\u033b\1\u033c\3\276\1\u16b9\55\276\1\u033b"+
- "\1\u033c\4\276\1\u16ba\54\276\1\u033b\1\u033c\5\276\1\u16bb"+
- "\53\276\1\u033b\1\u033c\6\276\1\u16bc\52\276\1\u033b\1\u033c"+
- "\7\276\1\u16bd\51\276\1\u033b\1\u033c\10\276\1\u16be\50\276"+
- "\1\u033b\1\u033c\11\276\1\u16bf\47\276\1\u033b\1\u033c\12\276"+
- "\1\u16c0\46\276\1\u033b\1\u033c\13\276\1\u16c1\45\276\1\u033b"+
- "\1\u033c\14\276\1\u16c2\44\276\1\u033b\1\u033c\15\276\1\u16c3"+
- "\43\276\1\300\1\u02bf\1\276\1\u16c4\57\276\1\300\1\u02bf"+
- "\2\276\1\u16c5\55\276\1\263\1\u03c9\1\u03ca\1\263\1\u16c6"+
- "\1\263\1\u0136\55\263\1\u03c9\1\u03ca\2\263\1\u16c7\1\u0136"+
- "\55\263\1\u03c9\1\u03ca\3\263\1\u0136\1\u16c8\54\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\1\263\1\u16c9\53\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\2\263\1\u16ca\52\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\3\263\1\u16cb\51\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\4\263\1\u16cc\50\263\1\u03c9\1\u03ca\3\263\1\u0136\5\263"+
- "\1\u16cd\47\263\1\u03c9\1\u03ca\3\263\1\u0136\6\263\1\u16ce"+
- "\46\263\1\u03c9\1\u03ca\3\263\1\u0136\7\263\1\u16cf\45\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\10\263\1\u16d0\44\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\11\263\1\u16d1\42\263\1\344\1\u03d7"+
- "\1\u03d8\1\344\1\u16d2\1\344\1\u017c\55\344\1\u03d7\1\u03d8"+
- "\2\344\1\u16d3\1\u017c\55\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\1\u16d4\54\344\1\u03d7\1\u03d8\3\344\1\u017c\1\344\1\u16d5"+
- "\53\344\1\u03d7\1\u03d8\3\344\1\u017c\2\344\1\u16d6\52\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\3\344\1\u16d7\51\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\4\344\1\u16d8\50\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\5\344\1\u16d9\47\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\6\344\1\u16da\46\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\7\344\1\u16db\45\344\1\u03d7\1\u03d8\3\344\1\u017c\10\344"+
- "\1\u16dc\44\344\1\u03d7\1\u03d8\3\344\1\u017c\11\344\1\u16dd"+
- "\42\344\1\276\1\300\1\u02bf\3\276\1\u16de\55\276\1\300"+
- "\1\u02bf\4\276\1\u16df\54\276\1\300\1\u02bf\5\276\1\u16e0"+
- "\53\276\1\300\1\u02bf\6\276\1\u16e1\52\276\1\300\1\u02bf"+
- "\7\276\1\u16e2\51\276\1\300\1\u02bf\10\276\1\u16e3\50\276"+
- "\1\300\1\u02bf\11\276\1\u16e4\47\276\1\300\1\u02bf\12\276"+
- "\1\u16e5\46\276\1\300\1\u02bf\13\276\1\u16e6\45\276\1\300"+
- "\1\u02bf\14\276\1\u16e7\44\276\1\300\1\u02bf\15\276\1\u16e8"+
- "\42\276\1\0\2\u0381\1\0\1\u16e9\57\0\2\u0381\2\0"+
- "\1\u16ea\56\0\2\u0381\3\0\1\u16eb\55\0\2\u0381\4\0"+
- "\1\u16ec\54\0\2\u0381\5\0\1\u16ed\53\0\2\u0381\6\0"+
- "\1\u16ee\52\0\2\u0381\7\0\1\u16ef\51\0\2\u0381\10\0"+
- "\1\u16f0\50\0\2\u0381\11\0\1\u16f1\47\0\2\u0381\12\0"+
- "\1\u16f2\46\0\2\u0381\13\0\1\u16f3\45\0\2\u0381\14\0"+
- "\1\u16f4\44\0\2\u0381\15\0\1\u16f5\43\0\1\u0311\1\u0312"+
- "\1\0\1\u16f6\57\0\1\u0311\1\u0312\2\0\1\u16f7\56\0"+
- "\1\u0311\1\u0312\3\0\1\u16f8\55\0\1\u0311\1\u0312\4\0"+
- "\1\u16f9\54\0\1\u0311\1\u0312\5\0\1\u16fa\53\0\1\u0311"+
- "\1\u0312\6\0\1\u16fb\52\0\1\u0311\1\u0312\7\0\1\u16fc"+
- "\51\0\1\u0311\1\u0312\10\0\1\u16fd\50\0\1\u0311\1\u0312"+
- "\11\0\1\u16fe\47\0\1\u0311\1\u0312\12\0\1\u16ff\46\0"+
- "\1\u0311\1\u0312\13\0\1\u1700\45\0\1\u0311\1\u0312\14\0"+
- "\1\u1701\44\0\1\u0311\1\u0312\15\0\1\u1702\43\0\2\u039d"+
- "\1\0\1\u1703\57\0\2\u039d\2\0\1\u1704\56\0\2\u039d"+
- "\3\0\1\u1705\55\0\2\u039d\4\0\1\u1706\54\0\2\u039d"+
- "\5\0\1\u1707\53\0\2\u039d\6\0\1\u1708\52\0\2\u039d"+
- "\7\0\1\u1709\51\0\2\u039d\10\0\1\u170a\50\0\2\u039d"+
- "\11\0\1\u170b\47\0\2\u039d\12\0\1\u170c\46\0\2\u039d"+
- "\13\0\1\u170d\45\0\2\u039d\14\0\1\u170e\44\0\2\u039d"+
- "\15\0\1\u170f\42\0\1\276\1\u03ab\1\u03ac\1\276\1\u1710"+
- "\57\276\1\u03ab\1\u03ac\2\276\1\u1711\56\276\1\u03ab\1\u03ac"+
- "\3\276\1\u1712\55\276\1\u03ab\1\u03ac\4\276\1\u1713\54\276"+
- "\1\u03ab\1\u03ac\5\276\1\u1714\53\276\1\u03ab\1\u03ac\6\276"+
- "\1\u1715\52\276\1\u03ab\1\u03ac\7\276\1\u1716\51\276\1\u03ab"+
- "\1\u03ac\10\276\1\u1717\50\276\1\u03ab\1\u03ac\11\276\1\u1718"+
- "\47\276\1\u03ab\1\u03ac\12\276\1\u1719\46\276\1\u03ab\1\u03ac"+
- "\13\276\1\u171a\45\276\1\u03ab\1\u03ac\14\276\1\u171b\44\276"+
- "\1\u03ab\1\u03ac\15\276\1\u171c\43\276\1\u033b\1\u033c\1\276"+
- "\1\u171d\57\276\1\u033b\1\u033c\2\276\1\u171e\56\276\1\u033b"+
- "\1\u033c\3\276\1\u171f\55\276\1\u033b\1\u033c\4\276\1\u1720"+
- "\54\276\1\u033b\1\u033c\5\276\1\u1721\53\276\1\u033b\1\u033c"+
- "\6\276\1\u1722\52\276\1\u033b\1\u033c\7\276\1\u1723\51\276"+
- "\1\u033b\1\u033c\10\276\1\u1724\50\276\1\u033b\1\u033c\11\276"+
- "\1\u1725\47\276\1\u033b\1\u033c\12\276\1\u1726\46\276\1\u033b"+
- "\1\u033c\13\276\1\u1727\45\276\1\u033b\1\u033c\14\276\1\u1728"+
- "\44\276\1\u033b\1\u033c\15\276\1\u1729\43\276\1\300\1\u02bf"+
- "\1\276\1\u172a\57\276\1\300\1\u02bf\2\276\1\u172b\55\276"+
- "\1\263\1\u03c9\1\u03ca\1\263\1\u172c\1\263\1\u0136\55\263"+
- "\1\u03c9\1\u03ca\2\263\1\u172d\1\u0136\55\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\1\u172e\54\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\1\263\1\u172f\53\263\1\u03c9\1\u03ca\3\263\1\u0136\2\263"+
- "\1\u1730\52\263\1\u03c9\1\u03ca\3\263\1\u0136\3\263\1\u1731"+
- "\51\263\1\u03c9\1\u03ca\3\263\1\u0136\4\263\1\u1732\50\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\5\263\1\u1733\47\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\6\263\1\u1734\46\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\7\263\1\u1735\45\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\10\263\1\u1736\44\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\11\263\1\u1737\42\263\1\344\1\u03d7\1\u03d8\1\344\1\u1738"+
- "\1\344\1\u017c\55\344\1\u03d7\1\u03d8\2\344\1\u1739\1\u017c"+
- "\55\344\1\u03d7\1\u03d8\3\344\1\u017c\1\u173a\54\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\1\344\1\u173b\53\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\2\344\1\u173c\52\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\3\344\1\u173d\51\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\4\344\1\u173e\50\344\1\u03d7\1\u03d8\3\344\1\u017c\5\344"+
- "\1\u173f\47\344\1\u03d7\1\u03d8\3\344\1\u017c\6\344\1\u1740"+
- "\46\344\1\u03d7\1\u03d8\3\344\1\u017c\7\344\1\u1741\45\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\10\344\1\u1742\44\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\11\344\1\u1743\42\344\1\276\1\300"+
- "\1\u02bf\3\276\1\u1744\55\276\1\300\1\u02bf\4\276\1\u1745"+
- "\54\276\1\300\1\u02bf\5\276\1\u1746\53\276\1\300\1\u02bf"+
- "\6\276\1\u1747\52\276\1\300\1\u02bf\7\276\1\u1748\51\276"+
- "\1\300\1\u02bf\10\276\1\u1749\50\276\1\300\1\u02bf\11\276"+
- "\1\u174a\47\276\1\300\1\u02bf\12\276\1\u174b\46\276\1\300"+
- "\1\u02bf\13\276\1\u174c\45\276\1\300\1\u02bf\14\276\1\u174d"+
- "\44\276\1\300\1\u02bf\15\276\1\u174e\42\276\1\0\2\u0381"+
- "\1\0\1\u174f\57\0\2\u0381\2\0\1\u1750\56\0\2\u0381"+
- "\3\0\1\u1751\55\0\2\u0381\4\0\1\u1752\54\0\2\u0381"+
- "\5\0\1\u1753\53\0\2\u0381\6\0\1\u1754\52\0\2\u0381"+
- "\7\0\1\u1755\51\0\2\u0381\10\0\1\u1756\50\0\2\u0381"+
- "\11\0\1\u1757\47\0\2\u0381\12\0\1\u1758\46\0\2\u0381"+
- "\13\0\1\u1759\45\0\2\u0381\14\0\1\u175a\44\0\2\u0381"+
- "\15\0\1\u175b\43\0\1\u0311\1\u0312\1\0\1\u175c\57\0"+
- "\1\u0311\1\u0312\2\0\1\u175d\56\0\1\u0311\1\u0312\3\0"+
- "\1\u175e\55\0\1\u0311\1\u0312\4\0\1\u175f\54\0\1\u0311"+
- "\1\u0312\5\0\1\u1760\53\0\1\u0311\1\u0312\6\0\1\u1761"+
- "\52\0\1\u0311\1\u0312\7\0\1\u1762\51\0\1\u0311\1\u0312"+
- "\10\0\1\u1763\50\0\1\u0311\1\u0312\11\0\1\u1764\47\0"+
- "\1\u0311\1\u0312\12\0\1\u1765\46\0\1\u0311\1\u0312\13\0"+
- "\1\u1766\45\0\1\u0311\1\u0312\14\0\1\u1767\44\0\1\u0311"+
- "\1\u0312\15\0\1\u1768\43\0\2\u039d\1\0\1\u1769\57\0"+
- "\2\u039d\2\0\1\u176a\56\0\2\u039d\3\0\1\u176b\55\0"+
- "\2\u039d\4\0\1\u176c\54\0\2\u039d\5\0\1\u176d\53\0"+
- "\2\u039d\6\0\1\u176e\52\0\2\u039d\7\0\1\u176f\51\0"+
- "\2\u039d\10\0\1\u1770\50\0\2\u039d\11\0\1\u1771\47\0"+
- "\2\u039d\12\0\1\u1772\46\0\2\u039d\13\0\1\u1773\45\0"+
- "\2\u039d\14\0\1\u1774\44\0\2\u039d\15\0\1\u1775\42\0"+
- "\1\276\1\u03ab\1\u03ac\1\276\1\u1776\57\276\1\u03ab\1\u03ac"+
- "\2\276\1\u1777\56\276\1\u03ab\1\u03ac\3\276\1\u1778\55\276"+
- "\1\u03ab\1\u03ac\4\276\1\u1779\54\276\1\u03ab\1\u03ac\5\276"+
- "\1\u177a\53\276\1\u03ab\1\u03ac\6\276\1\u177b\52\276\1\u03ab"+
- "\1\u03ac\7\276\1\u177c\51\276\1\u03ab\1\u03ac\10\276\1\u177d"+
- "\50\276\1\u03ab\1\u03ac\11\276\1\u177e\47\276\1\u03ab\1\u03ac"+
- "\12\276\1\u177f\46\276\1\u03ab\1\u03ac\13\276\1\u1780\45\276"+
- "\1\u03ab\1\u03ac\14\276\1\u1781\44\276\1\u03ab\1\u03ac\15\276"+
- "\1\u1782\43\276\1\u033b\1\u033c\1\276\1\u1783\57\276\1\u033b"+
- "\1\u033c\2\276\1\u1784\56\276\1\u033b\1\u033c\3\276\1\u1785"+
- "\55\276\1\u033b\1\u033c\4\276\1\u1786\54\276\1\u033b\1\u033c"+
- "\5\276\1\u1787\53\276\1\u033b\1\u033c\6\276\1\u1788\52\276"+
- "\1\u033b\1\u033c\7\276\1\u1789\51\276\1\u033b\1\u033c\10\276"+
- "\1\u178a\50\276\1\u033b\1\u033c\11\276\1\u178b\47\276\1\u033b"+
- "\1\u033c\12\276\1\u178c\46\276\1\u033b\1\u033c\13\276\1\u178d"+
- "\45\276\1\u033b\1\u033c\14\276\1\u178e\44\276\1\u033b\1\u033c"+
- "\15\276\1\u178f\43\276\1\300\1\u02bf\1\276\1\u1790\57\276"+
- "\1\300\1\u02bf\2\276\1\u1791\55\276\1\263\1\u03c9\1\u03ca"+
- "\1\263\1\u1792\1\263\1\u0136\55\263\1\u03c9\1\u03ca\2\263"+
- "\1\u1793\1\u0136\55\263\1\u03c9\1\u03ca\3\263\1\u0136\1\u1794"+
- "\54\263\1\u03c9\1\u03ca\3\263\1\u0136\1\263\1\u1795\53\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\2\263\1\u1796\52\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\3\263\1\u1797\51\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\4\263\1\u1798\50\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\5\263\1\u1799\47\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\6\263\1\u179a\46\263\1\u03c9\1\u03ca\3\263\1\u0136\7\263"+
- "\1\u179b\45\263\1\u03c9\1\u03ca\3\263\1\u0136\10\263\1\u179c"+
- "\44\263\1\u03c9\1\u03ca\3\263\1\u0136\11\263\1\u179d\42\263"+
- "\1\344\1\u03d7\1\u03d8\1\344\1\u179e\1\344\1\u017c\55\344"+
- "\1\u03d7\1\u03d8\2\344\1\u179f\1\u017c\55\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\1\u17a0\54\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\1\344\1\u17a1\53\344\1\u03d7\1\u03d8\3\344\1\u017c\2\344"+
- "\1\u17a2\52\344\1\u03d7\1\u03d8\3\344\1\u017c\3\344\1\u17a3"+
- "\51\344\1\u03d7\1\u03d8\3\344\1\u017c\4\344\1\u17a4\50\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\5\344\1\u17a5\47\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\6\344\1\u17a6\46\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\7\344\1\u17a7\45\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\10\344\1\u17a8\44\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\11\344\1\u17a9\42\344\1\276\1\300\1\u02bf\3\276\1\u17aa"+
- "\55\276\1\300\1\u02bf\4\276\1\u17ab\54\276\1\300\1\u02bf"+
- "\5\276\1\u17ac\53\276\1\300\1\u02bf\6\276\1\u17ad\52\276"+
- "\1\300\1\u02bf\7\276\1\u17ae\51\276\1\300\1\u02bf\10\276"+
- "\1\u17af\50\276\1\300\1\u02bf\11\276\1\u17b0\47\276\1\300"+
- "\1\u02bf\12\276\1\u17b1\46\276\1\300\1\u02bf\13\276\1\u17b2"+
- "\45\276\1\300\1\u02bf\14\276\1\u17b3\44\276\1\300\1\u02bf"+
- "\15\276\1\u17b4\42\276\1\0\2\u0381\1\0\1\u17b5\57\0"+
- "\2\u0381\2\0\1\u17b6\56\0\2\u0381\3\0\1\u17b7\55\0"+
- "\2\u0381\4\0\1\u17b8\54\0\2\u0381\5\0\1\u17b9\53\0"+
- "\2\u0381\6\0\1\u17ba\52\0\2\u0381\7\0\1\u17bb\51\0"+
- "\2\u0381\10\0\1\u17bc\50\0\2\u0381\11\0\1\u17bd\47\0"+
- "\2\u0381\12\0\1\u17be\46\0\2\u0381\13\0\1\u17bf\45\0"+
- "\2\u0381\14\0\1\u17c0\44\0\2\u0381\15\0\1\u17c1\43\0"+
- "\1\u0311\1\u0312\1\0\1\u17c2\57\0\1\u0311\1\u0312\2\0"+
- "\1\u17c3\56\0\1\u0311\1\u0312\3\0\1\u17c4\55\0\1\u0311"+
- "\1\u0312\4\0\1\u17c5\54\0\1\u0311\1\u0312\5\0\1\u17c6"+
- "\53\0\1\u0311\1\u0312\6\0\1\u17c7\52\0\1\u0311\1\u0312"+
- "\7\0\1\u17c8\51\0\1\u0311\1\u0312\10\0\1\u17c9\50\0"+
- "\1\u0311\1\u0312\11\0\1\u17ca\47\0\1\u0311\1\u0312\12\0"+
- "\1\u17cb\46\0\1\u0311\1\u0312\13\0\1\u17cc\45\0\1\u0311"+
- "\1\u0312\14\0\1\u17cd\44\0\1\u0311\1\u0312\15\0\1\u17ce"+
- "\43\0\2\u039d\1\0\1\u17cf\57\0\2\u039d\2\0\1\u17d0"+
- "\56\0\2\u039d\3\0\1\u17d1\55\0\2\u039d\4\0\1\u17d2"+
- "\54\0\2\u039d\5\0\1\u17d3\53\0\2\u039d\6\0\1\u17d4"+
- "\52\0\2\u039d\7\0\1\u17d5\51\0\2\u039d\10\0\1\u17d6"+
- "\50\0\2\u039d\11\0\1\u17d7\47\0\2\u039d\12\0\1\u17d8"+
- "\46\0\2\u039d\13\0\1\u17d9\45\0\2\u039d\14\0\1\u17da"+
- "\44\0\2\u039d\15\0\1\u17db\42\0\1\276\1\u03ab\1\u03ac"+
- "\1\276\1\u17dc\57\276\1\u03ab\1\u03ac\2\276\1\u17dd\56\276"+
- "\1\u03ab\1\u03ac\3\276\1\u17de\55\276\1\u03ab\1\u03ac\4\276"+
- "\1\u17df\54\276\1\u03ab\1\u03ac\5\276\1\u17e0\53\276\1\u03ab"+
- "\1\u03ac\6\276\1\u17e1\52\276\1\u03ab\1\u03ac\7\276\1\u17e2"+
- "\51\276\1\u03ab\1\u03ac\10\276\1\u17e3\50\276\1\u03ab\1\u03ac"+
- "\11\276\1\u17e4\47\276\1\u03ab\1\u03ac\12\276\1\u17e5\46\276"+
- "\1\u03ab\1\u03ac\13\276\1\u17e6\45\276\1\u03ab\1\u03ac\14\276"+
- "\1\u17e7\44\276\1\u03ab\1\u03ac\15\276\1\u17e8\43\276\1\u033b"+
- "\1\u033c\1\276\1\u17e9\57\276\1\u033b\1\u033c\2\276\1\u17ea"+
- "\56\276\1\u033b\1\u033c\3\276\1\u17eb\55\276\1\u033b\1\u033c"+
- "\4\276\1\u17ec\54\276\1\u033b\1\u033c\5\276\1\u17ed\53\276"+
- "\1\u033b\1\u033c\6\276\1\u17ee\52\276\1\u033b\1\u033c\7\276"+
- "\1\u17ef\51\276\1\u033b\1\u033c\10\276\1\u17f0\50\276\1\u033b"+
- "\1\u033c\11\276\1\u17f1\47\276\1\u033b\1\u033c\12\276\1\u17f2"+
- "\46\276\1\u033b\1\u033c\13\276\1\u17f3\45\276\1\u033b\1\u033c"+
- "\14\276\1\u17f4\44\276\1\u033b\1\u033c\15\276\1\u17f5\43\276"+
- "\1\300\1\u02bf\1\276\1\u17f6\57\276\1\300\1\u02bf\2\276"+
- "\1\u17f7\55\276\1\263\1\u03c9\1\u03ca\1\263\1\u17f8\1\263"+
- "\1\u0136\55\263\1\u03c9\1\u03ca\2\263\1\u17f9\1\u0136\55\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\1\u17fa\54\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\1\263\1\u17fb\53\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\2\263\1\u17fc\52\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\3\263\1\u17fd\51\263\1\u03c9\1\u03ca\3\263\1\u0136\4\263"+
- "\1\u17fe\50\263\1\u03c9\1\u03ca\3\263\1\u0136\5\263\1\u17ff"+
- "\47\263\1\u03c9\1\u03ca\3\263\1\u0136\6\263\1\u1800\46\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\7\263\1\u1801\45\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\10\263\1\u1802\44\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\11\263\1\u1803\42\263\1\344\1\u03d7\1\u03d8"+
- "\1\344\1\u1804\1\344\1\u017c\55\344\1\u03d7\1\u03d8\2\344"+
- "\1\u1805\1\u017c\55\344\1\u03d7\1\u03d8\3\344\1\u017c\1\u1806"+
- "\54\344\1\u03d7\1\u03d8\3\344\1\u017c\1\344\1\u1807\53\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\2\344\1\u1808\52\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\3\344\1\u1809\51\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\4\344\1\u180a\50\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\5\344\1\u180b\47\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\6\344\1\u180c\46\344\1\u03d7\1\u03d8\3\344\1\u017c\7\344"+
- "\1\u180d\45\344\1\u03d7\1\u03d8\3\344\1\u017c\10\344\1\u180e"+
- "\44\344\1\u03d7\1\u03d8\3\344\1\u017c\11\344\1\u180f\42\344"+
- "\1\276\1\300\1\u02bf\3\276\1\u1810\55\276\1\300\1\u02bf"+
- "\4\276\1\u1811\54\276\1\300\1\u02bf\5\276\1\u1812\53\276"+
- "\1\300\1\u02bf\6\276\1\u1813\52\276\1\300\1\u02bf\7\276"+
- "\1\u1814\51\276\1\300\1\u02bf\10\276\1\u1815\50\276\1\300"+
- "\1\u02bf\11\276\1\u1816\47\276\1\300\1\u02bf\12\276\1\u1817"+
- "\46\276\1\300\1\u02bf\13\276\1\u1818\45\276\1\300\1\u02bf"+
- "\14\276\1\u1819\44\276\1\300\1\u02bf\15\276\1\u181a\42\276"+
- "\1\0\2\u0381\1\0\1\u181b\57\0\2\u0381\2\0\1\u181c"+
- "\56\0\2\u0381\3\0\1\u181d\55\0\2\u0381\4\0\1\u181e"+
- "\54\0\2\u0381\5\0\1\u181f\53\0\2\u0381\6\0\1\u1820"+
- "\52\0\2\u0381\7\0\1\u1821\51\0\2\u0381\10\0\1\u1822"+
- "\50\0\2\u0381\11\0\1\u1823\47\0\2\u0381\12\0\1\u1824"+
- "\46\0\2\u0381\13\0\1\u1825\45\0\2\u0381\14\0\1\u1826"+
- "\44\0\2\u0381\15\0\1\u1827\43\0\1\u0311\1\u0312\1\0"+
- "\1\u1828\57\0\1\u0311\1\u0312\2\0\1\u1829\56\0\1\u0311"+
- "\1\u0312\3\0\1\u182a\55\0\1\u0311\1\u0312\4\0\1\u182b"+
- "\54\0\1\u0311\1\u0312\5\0\1\u182c\53\0\1\u0311\1\u0312"+
- "\6\0\1\u182d\52\0\1\u0311\1\u0312\7\0\1\u182e\51\0"+
- "\1\u0311\1\u0312\10\0\1\u182f\50\0\1\u0311\1\u0312\11\0"+
- "\1\u1830\47\0\1\u0311\1\u0312\12\0\1\u1831\46\0\1\u0311"+
- "\1\u0312\13\0\1\u1832\45\0\1\u0311\1\u0312\14\0\1\u1833"+
- "\44\0\1\u0311\1\u0312\15\0\1\u1834\43\0\2\u039d\1\0"+
- "\1\u1835\57\0\2\u039d\2\0\1\u1836\56\0\2\u039d\3\0"+
- "\1\u1837\55\0\2\u039d\4\0\1\u1838\54\0\2\u039d\5\0"+
- "\1\u1839\53\0\2\u039d\6\0\1\u183a\52\0\2\u039d\7\0"+
- "\1\u183b\51\0\2\u039d\10\0\1\u183c\50\0\2\u039d\11\0"+
- "\1\u183d\47\0\2\u039d\12\0\1\u183e\46\0\2\u039d\13\0"+
- "\1\u183f\45\0\2\u039d\14\0\1\u1840\44\0\2\u039d\15\0"+
- "\1\u1841\42\0\1\276\1\u03ab\1\u03ac\1\276\1\u1842\57\276"+
- "\1\u03ab\1\u03ac\2\276\1\u1843\56\276\1\u03ab\1\u03ac\3\276"+
- "\1\u1844\55\276\1\u03ab\1\u03ac\4\276\1\u1845\54\276\1\u03ab"+
- "\1\u03ac\5\276\1\u1846\53\276\1\u03ab\1\u03ac\6\276\1\u1847"+
- "\52\276\1\u03ab\1\u03ac\7\276\1\u1848\51\276\1\u03ab\1\u03ac"+
- "\10\276\1\u1849\50\276\1\u03ab\1\u03ac\11\276\1\u184a\47\276"+
- "\1\u03ab\1\u03ac\12\276\1\u184b\46\276\1\u03ab\1\u03ac\13\276"+
- "\1\u184c\45\276\1\u03ab\1\u03ac\14\276\1\u184d\44\276\1\u03ab"+
- "\1\u03ac\15\276\1\u184e\43\276\1\u033b\1\u033c\1\276\1\u184f"+
- "\57\276\1\u033b\1\u033c\2\276\1\u1850\56\276\1\u033b\1\u033c"+
- "\3\276\1\u1851\55\276\1\u033b\1\u033c\4\276\1\u1852\54\276"+
- "\1\u033b\1\u033c\5\276\1\u1853\53\276\1\u033b\1\u033c\6\276"+
- "\1\u1854\52\276\1\u033b\1\u033c\7\276\1\u1855\51\276\1\u033b"+
- "\1\u033c\10\276\1\u1856\50\276\1\u033b\1\u033c\11\276\1\u1857"+
- "\47\276\1\u033b\1\u033c\12\276\1\u1858\46\276\1\u033b\1\u033c"+
- "\13\276\1\u1859\45\276\1\u033b\1\u033c\14\276\1\u185a\44\276"+
- "\1\u033b\1\u033c\15\276\1\u185b\43\276\1\300\1\u02bf\1\276"+
- "\1\u185c\57\276\1\300\1\u02bf\2\276\1\u185d\55\276\1\263"+
- "\1\u03c9\1\u03ca\1\263\1\u185e\1\263\1\u0136\55\263\1\u03c9"+
- "\1\u03ca\2\263\1\u185f\1\u0136\55\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\1\u1860\54\263\1\u03c9\1\u03ca\3\263\1\u0136\1\263"+
- "\1\u1861\53\263\1\u03c9\1\u03ca\3\263\1\u0136\2\263\1\u1862"+
- "\52\263\1\u03c9\1\u03ca\3\263\1\u0136\3\263\1\u1863\51\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\4\263\1\u1864\50\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\5\263\1\u1865\47\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\6\263\1\u1866\46\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\7\263\1\u1867\45\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\10\263\1\u1868\44\263\1\u03c9\1\u03ca\3\263\1\u0136\11\263"+
- "\1\u1869\42\263\1\344\1\u03d7\1\u03d8\1\344\1\u186a\1\344"+
- "\1\u017c\55\344\1\u03d7\1\u03d8\2\344\1\u186b\1\u017c\55\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\1\u186c\54\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\1\344\1\u186d\53\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\2\344\1\u186e\52\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\3\344\1\u186f\51\344\1\u03d7\1\u03d8\3\344\1\u017c\4\344"+
- "\1\u1870\50\344\1\u03d7\1\u03d8\3\344\1\u017c\5\344\1\u1871"+
- "\47\344\1\u03d7\1\u03d8\3\344\1\u017c\6\344\1\u1872\46\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\7\344\1\u1873\45\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\10\344\1\u1874\44\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\11\344\1\u1875\42\344\1\276\1\300\1\u02bf"+
- "\3\276\1\u1876\55\276\1\300\1\u02bf\4\276\1\u1877\54\276"+
- "\1\300\1\u02bf\5\276\1\u1878\53\276\1\300\1\u02bf\6\276"+
- "\1\u1879\52\276\1\300\1\u02bf\7\276\1\u187a\51\276\1\300"+
- "\1\u02bf\10\276\1\u187b\50\276\1\300\1\u02bf\11\276\1\u187c"+
- "\47\276\1\300\1\u02bf\12\276\1\u187d\46\276\1\300\1\u02bf"+
- "\13\276\1\u187e\45\276\1\300\1\u02bf\14\276\1\u187f\44\276"+
- "\1\300\1\u02bf\15\276\1\u1880\42\276\1\0\2\u0381\1\0"+
- "\1\u1881\57\0\2\u0381\2\0\1\u1882\56\0\2\u0381\3\0"+
- "\1\u1883\55\0\2\u0381\4\0\1\u1884\54\0\2\u0381\5\0"+
- "\1\u1885\53\0\2\u0381\6\0\1\u1886\52\0\2\u0381\7\0"+
- "\1\u1887\51\0\2\u0381\10\0\1\u1888\50\0\2\u0381\11\0"+
- "\1\u1889\47\0\2\u0381\12\0\1\u188a\46\0\2\u0381\13\0"+
- "\1\u188b\45\0\2\u0381\14\0\1\u188c\44\0\2\u0381\15\0"+
- "\1\u188d\43\0\1\u0311\1\u0312\1\0\1\u188e\57\0\1\u0311"+
- "\1\u0312\2\0\1\u188f\56\0\1\u0311\1\u0312\3\0\1\u1890"+
- "\55\0\1\u0311\1\u0312\4\0\1\u1891\54\0\1\u0311\1\u0312"+
- "\5\0\1\u1892\53\0\1\u0311\1\u0312\6\0\1\u1893\52\0"+
- "\1\u0311\1\u0312\7\0\1\u1894\51\0\1\u0311\1\u0312\10\0"+
- "\1\u1895\50\0\1\u0311\1\u0312\11\0\1\u1896\47\0\1\u0311"+
- "\1\u0312\12\0\1\u1897\46\0\1\u0311\1\u0312\13\0\1\u1898"+
- "\45\0\1\u0311\1\u0312\14\0\1\u1899\44\0\1\u0311\1\u0312"+
- "\15\0\1\u189a\43\0\2\u039d\1\0\1\u189b\57\0\2\u039d"+
- "\2\0\1\u189c\56\0\2\u039d\3\0\1\u189d\55\0\2\u039d"+
- "\4\0\1\u189e\54\0\2\u039d\5\0\1\u189f\53\0\2\u039d"+
- "\6\0\1\u18a0\52\0\2\u039d\7\0\1\u18a1\51\0\2\u039d"+
- "\10\0\1\u18a2\50\0\2\u039d\11\0\1\u18a3\47\0\2\u039d"+
- "\12\0\1\u18a4\46\0\2\u039d\13\0\1\u18a5\45\0\2\u039d"+
- "\14\0\1\u18a6\44\0\2\u039d\15\0\1\u18a7\42\0\1\276"+
- "\1\u03ab\1\u03ac\1\276\1\u18a8\57\276\1\u03ab\1\u03ac\2\276"+
- "\1\u18a9\56\276\1\u03ab\1\u03ac\3\276\1\u18aa\55\276\1\u03ab"+
- "\1\u03ac\4\276\1\u18ab\54\276\1\u03ab\1\u03ac\5\276\1\u18ac"+
- "\53\276\1\u03ab\1\u03ac\6\276\1\u18ad\52\276\1\u03ab\1\u03ac"+
- "\7\276\1\u18ae\51\276\1\u03ab\1\u03ac\10\276\1\u18af\50\276"+
- "\1\u03ab\1\u03ac\11\276\1\u18b0\47\276\1\u03ab\1\u03ac\12\276"+
- "\1\u18b1\46\276\1\u03ab\1\u03ac\13\276\1\u18b2\45\276\1\u03ab"+
- "\1\u03ac\14\276\1\u18b3\44\276\1\u03ab\1\u03ac\15\276\1\u18b4"+
- "\43\276\1\u033b\1\u033c\1\276\1\u18b5\57\276\1\u033b\1\u033c"+
- "\2\276\1\u18b6\56\276\1\u033b\1\u033c\3\276\1\u18b7\55\276"+
- "\1\u033b\1\u033c\4\276\1\u18b8\54\276\1\u033b\1\u033c\5\276"+
- "\1\u18b9\53\276\1\u033b\1\u033c\6\276\1\u18ba\52\276\1\u033b"+
- "\1\u033c\7\276\1\u18bb\51\276\1\u033b\1\u033c\10\276\1\u18bc"+
- "\50\276\1\u033b\1\u033c\11\276\1\u18bd\47\276\1\u033b\1\u033c"+
- "\12\276\1\u18be\46\276\1\u033b\1\u033c\13\276\1\u18bf\45\276"+
- "\1\u033b\1\u033c\14\276\1\u18c0\44\276\1\u033b\1\u033c\15\276"+
- "\1\u18c1\43\276\1\300\1\u02bf\1\276\1\u18c2\57\276\1\300"+
- "\1\u02bf\2\276\1\u18c3\55\276\1\263\1\u03c9\1\u03ca\1\263"+
- "\1\u18c4\1\263\1\u0136\55\263\1\u03c9\1\u03ca\2\263\1\u18c5"+
- "\1\u0136\55\263\1\u03c9\1\u03ca\3\263\1\u0136\1\u18c6\54\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\1\263\1\u18c7\53\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\2\263\1\u18c8\52\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\3\263\1\u18c9\51\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\4\263\1\u18ca\50\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\5\263\1\u18cb\47\263\1\u03c9\1\u03ca\3\263\1\u0136\6\263"+
- "\1\u18cc\46\263\1\u03c9\1\u03ca\3\263\1\u0136\7\263\1\u18cd"+
- "\45\263\1\u03c9\1\u03ca\3\263\1\u0136\10\263\1\u18ce\44\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\11\263\1\u18cf\42\263\1\344"+
- "\1\u03d7\1\u03d8\1\344\1\u18d0\1\344\1\u017c\55\344\1\u03d7"+
- "\1\u03d8\2\344\1\u18d1\1\u017c\55\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\1\u18d2\54\344\1\u03d7\1\u03d8\3\344\1\u017c\1\344"+
- "\1\u18d3\53\344\1\u03d7\1\u03d8\3\344\1\u017c\2\344\1\u18d4"+
- "\52\344\1\u03d7\1\u03d8\3\344\1\u017c\3\344\1\u18d5\51\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\4\344\1\u18d6\50\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\5\344\1\u18d7\47\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\6\344\1\u18d8\46\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\7\344\1\u18d9\45\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\10\344\1\u18da\44\344\1\u03d7\1\u03d8\3\344\1\u017c\11\344"+
- "\1\u18db\42\344\1\276\1\300\1\u02bf\3\276\1\u18dc\55\276"+
- "\1\300\1\u02bf\4\276\1\u18dd\54\276\1\300\1\u02bf\5\276"+
- "\1\u18de\53\276\1\300\1\u02bf\6\276\1\u18df\52\276\1\300"+
- "\1\u02bf\7\276\1\u18e0\51\276\1\300\1\u02bf\10\276\1\u18e1"+
- "\50\276\1\300\1\u02bf\11\276\1\u18e2\47\276\1\300\1\u02bf"+
- "\12\276\1\u18e3\46\276\1\300\1\u02bf\13\276\1\u18e4\45\276"+
- "\1\300\1\u02bf\14\276\1\u18e5\44\276\1\300\1\u02bf\15\276"+
- "\1\u18e6\42\276\1\0\2\u0381\1\0\1\u18e7\57\0\2\u0381"+
- "\2\0\1\u18e8\56\0\2\u0381\3\0\1\u18e9\55\0\2\u0381"+
- "\4\0\1\u18ea\54\0\2\u0381\5\0\1\u18eb\53\0\2\u0381"+
- "\6\0\1\u18ec\52\0\2\u0381\7\0\1\u18ed\51\0\2\u0381"+
- "\10\0\1\u18ee\50\0\2\u0381\11\0\1\u18ef\47\0\2\u0381"+
- "\12\0\1\u18f0\46\0\2\u0381\13\0\1\u18f1\45\0\2\u0381"+
- "\14\0\1\u18f2\44\0\2\u0381\15\0\1\u18f3\43\0\1\u0311"+
- "\1\u0312\1\0\1\u18f4\57\0\1\u0311\1\u0312\2\0\1\u18f5"+
- "\56\0\1\u0311\1\u0312\3\0\1\u18f6\55\0\1\u0311\1\u0312"+
- "\4\0\1\u18f7\54\0\1\u0311\1\u0312\5\0\1\u18f8\53\0"+
- "\1\u0311\1\u0312\6\0\1\u18f9\52\0\1\u0311\1\u0312\7\0"+
- "\1\u18fa\51\0\1\u0311\1\u0312\10\0\1\u18fb\50\0\1\u0311"+
- "\1\u0312\11\0\1\u18fc\47\0\1\u0311\1\u0312\12\0\1\u18fd"+
- "\46\0\1\u0311\1\u0312\13\0\1\u18fe\45\0\1\u0311\1\u0312"+
- "\14\0\1\u18ff\44\0\1\u0311\1\u0312\15\0\1\u1900\43\0"+
- "\2\u039d\1\0\1\u1901\57\0\2\u039d\2\0\1\u1902\56\0"+
- "\2\u039d\3\0\1\u1903\55\0\2\u039d\4\0\1\u1904\54\0"+
- "\2\u039d\5\0\1\u1905\53\0\2\u039d\6\0\1\u1906\52\0"+
- "\2\u039d\7\0\1\u1907\51\0\2\u039d\10\0\1\u1908\50\0"+
- "\2\u039d\11\0\1\u1909\47\0\2\u039d\12\0\1\u190a\46\0"+
- "\2\u039d\13\0\1\u190b\45\0\2\u039d\14\0\1\u190c\44\0"+
- "\2\u039d\15\0\1\u190d\42\0\1\276\1\u03ab\1\u03ac\1\276"+
- "\1\u190e\57\276\1\u03ab\1\u03ac\2\276\1\u190f\56\276\1\u03ab"+
- "\1\u03ac\3\276\1\u1910\55\276\1\u03ab\1\u03ac\4\276\1\u1911"+
- "\54\276\1\u03ab\1\u03ac\5\276\1\u1912\53\276\1\u03ab\1\u03ac"+
- "\6\276\1\u1913\52\276\1\u03ab\1\u03ac\7\276\1\u1914\51\276"+
- "\1\u03ab\1\u03ac\10\276\1\u1915\50\276\1\u03ab\1\u03ac\11\276"+
- "\1\u1916\47\276\1\u03ab\1\u03ac\12\276\1\u1917\46\276\1\u03ab"+
- "\1\u03ac\13\276\1\u1918\45\276\1\u03ab\1\u03ac\14\276\1\u1919"+
- "\44\276\1\u03ab\1\u03ac\15\276\1\u191a\43\276\1\u033b\1\u033c"+
- "\1\276\1\u191b\57\276\1\u033b\1\u033c\2\276\1\u191c\56\276"+
- "\1\u033b\1\u033c\3\276\1\u191d\55\276\1\u033b\1\u033c\4\276"+
- "\1\u191e\54\276\1\u033b\1\u033c\5\276\1\u191f\53\276\1\u033b"+
- "\1\u033c\6\276\1\u1920\52\276\1\u033b\1\u033c\7\276\1\u1921"+
- "\51\276\1\u033b\1\u033c\10\276\1\u1922\50\276\1\u033b\1\u033c"+
- "\11\276\1\u1923\47\276\1\u033b\1\u033c\12\276\1\u1924\46\276"+
- "\1\u033b\1\u033c\13\276\1\u1925\45\276\1\u033b\1\u033c\14\276"+
- "\1\u1926\44\276\1\u033b\1\u033c\15\276\1\u1927\43\276\1\300"+
- "\1\u02bf\1\276\1\u1928\57\276\1\300\1\u02bf\2\276\1\u1929"+
- "\55\276\1\263\1\u03c9\1\u03ca\1\263\1\u192a\1\263\1\u0136"+
- "\55\263\1\u03c9\1\u03ca\2\263\1\u192b\1\u0136\55\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\1\u192c\54\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\1\263\1\u192d\53\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\2\263\1\u192e\52\263\1\u03c9\1\u03ca\3\263\1\u0136\3\263"+
- "\1\u192f\51\263\1\u03c9\1\u03ca\3\263\1\u0136\4\263\1\u1930"+
- "\50\263\1\u03c9\1\u03ca\3\263\1\u0136\5\263\1\u1931\47\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\6\263\1\u1932\46\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\7\263\1\u1933\45\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\10\263\1\u1934\44\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\11\263\1\u1935\42\263\1\344\1\u03d7\1\u03d8\1\344"+
- "\1\u1936\1\344\1\u017c\55\344\1\u03d7\1\u03d8\2\344\1\u1937"+
- "\1\u017c\55\344\1\u03d7\1\u03d8\3\344\1\u017c\1\u1938\54\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\1\344\1\u1939\53\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\2\344\1\u193a\52\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\3\344\1\u193b\51\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\4\344\1\u193c\50\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\5\344\1\u193d\47\344\1\u03d7\1\u03d8\3\344\1\u017c\6\344"+
- "\1\u193e\46\344\1\u03d7\1\u03d8\3\344\1\u017c\7\344\1\u193f"+
- "\45\344\1\u03d7\1\u03d8\3\344\1\u017c\10\344\1\u1940\44\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\11\344\1\u1941\42\344\1\276"+
- "\1\300\1\u02bf\3\276\1\u1942\55\276\1\300\1\u02bf\4\276"+
- "\1\u1943\54\276\1\300\1\u02bf\5\276\1\u1944\53\276\1\300"+
- "\1\u02bf\6\276\1\u1945\52\276\1\300\1\u02bf\7\276\1\u1946"+
- "\51\276\1\300\1\u02bf\10\276\1\u1947\50\276\1\300\1\u02bf"+
- "\11\276\1\u1948\47\276\1\300\1\u02bf\12\276\1\u1949\46\276"+
- "\1\300\1\u02bf\13\276\1\u194a\45\276\1\300\1\u02bf\14\276"+
- "\1\u194b\44\276\1\300\1\u02bf\15\276\1\u194c\42\276\1\0"+
- "\2\u0381\1\0\1\u194d\57\0\2\u0381\2\0\1\u194e\56\0"+
- "\2\u0381\3\0\1\u194f\55\0\2\u0381\4\0\1\u1950\54\0"+
- "\2\u0381\5\0\1\u1951\53\0\2\u0381\6\0\1\u1952\52\0"+
- "\2\u0381\7\0\1\u1953\51\0\2\u0381\10\0\1\u1954\50\0"+
- "\2\u0381\11\0\1\u1955\47\0\2\u0381\12\0\1\u1956\46\0"+
- "\2\u0381\13\0\1\u1957\45\0\2\u0381\14\0\1\u1958\44\0"+
- "\2\u0381\15\0\1\u1959\43\0\1\u0311\1\u0312\1\0\1\u195a"+
- "\57\0\1\u0311\1\u0312\2\0\1\u195b\56\0\1\u0311\1\u0312"+
- "\3\0\1\u195c\55\0\1\u0311\1\u0312\4\0\1\u195d\54\0"+
- "\1\u0311\1\u0312\5\0\1\u195e\53\0\1\u0311\1\u0312\6\0"+
- "\1\u195f\52\0\1\u0311\1\u0312\7\0\1\u1960\51\0\1\u0311"+
- "\1\u0312\10\0\1\u1961\50\0\1\u0311\1\u0312\11\0\1\u1962"+
- "\47\0\1\u0311\1\u0312\12\0\1\u1963\46\0\1\u0311\1\u0312"+
- "\13\0\1\u1964\45\0\1\u0311\1\u0312\14\0\1\u1965\44\0"+
- "\1\u0311\1\u0312\15\0\1\u1966\43\0\2\u039d\1\0\1\u1967"+
- "\57\0\2\u039d\2\0\1\u1968\56\0\2\u039d\3\0\1\u1969"+
- "\55\0\2\u039d\4\0\1\u196a\54\0\2\u039d\5\0\1\u196b"+
- "\53\0\2\u039d\6\0\1\u196c\52\0\2\u039d\7\0\1\u196d"+
- "\51\0\2\u039d\10\0\1\u196e\50\0\2\u039d\11\0\1\u196f"+
- "\47\0\2\u039d\12\0\1\u1970\46\0\2\u039d\13\0\1\u1971"+
- "\45\0\2\u039d\14\0\1\u1972\44\0\2\u039d\15\0\1\u1973"+
- "\42\0\1\276\1\u03ab\1\u03ac\1\276\1\u1974\57\276\1\u03ab"+
- "\1\u03ac\2\276\1\u1975\56\276\1\u03ab\1\u03ac\3\276\1\u1976"+
- "\55\276\1\u03ab\1\u03ac\4\276\1\u1977\54\276\1\u03ab\1\u03ac"+
- "\5\276\1\u1978\53\276\1\u03ab\1\u03ac\6\276\1\u1979\52\276"+
- "\1\u03ab\1\u03ac\7\276\1\u197a\51\276\1\u03ab\1\u03ac\10\276"+
- "\1\u197b\50\276\1\u03ab\1\u03ac\11\276\1\u197c\47\276\1\u03ab"+
- "\1\u03ac\12\276\1\u197d\46\276\1\u03ab\1\u03ac\13\276\1\u197e"+
- "\45\276\1\u03ab\1\u03ac\14\276\1\u197f\44\276\1\u03ab\1\u03ac"+
- "\15\276\1\u1980\43\276\1\u033b\1\u033c\1\276\1\u1981\57\276"+
- "\1\u033b\1\u033c\2\276\1\u1982\56\276\1\u033b\1\u033c\3\276"+
- "\1\u1983\55\276\1\u033b\1\u033c\4\276\1\u1984\54\276\1\u033b"+
- "\1\u033c\5\276\1\u1985\53\276\1\u033b\1\u033c\6\276\1\u1986"+
- "\52\276\1\u033b\1\u033c\7\276\1\u1987\51\276\1\u033b\1\u033c"+
- "\10\276\1\u1988\50\276\1\u033b\1\u033c\11\276\1\u1989\47\276"+
- "\1\u033b\1\u033c\12\276\1\u198a\46\276\1\u033b\1\u033c\13\276"+
- "\1\u198b\45\276\1\u033b\1\u033c\14\276\1\u198c\44\276\1\u033b"+
- "\1\u033c\15\276\1\u198d\43\276\1\300\1\u02bf\1\276\1\u198e"+
- "\57\276\1\300\1\u02bf\2\276\1\u198f\55\276\1\263\1\u03c9"+
- "\1\u03ca\1\263\1\u1990\1\263\1\u0136\55\263\1\u03c9\1\u03ca"+
- "\2\263\1\u1991\1\u0136\55\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\1\u1992\54\263\1\u03c9\1\u03ca\3\263\1\u0136\1\263\1\u1993"+
- "\53\263\1\u03c9\1\u03ca\3\263\1\u0136\2\263\1\u1994\52\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\3\263\1\u1995\51\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\4\263\1\u1996\50\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\5\263\1\u1997\47\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\6\263\1\u1998\46\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\7\263\1\u1999\45\263\1\u03c9\1\u03ca\3\263\1\u0136\10\263"+
- "\1\u199a\44\263\1\u03c9\1\u03ca\3\263\1\u0136\11\263\1\u199b"+
- "\42\263\1\344\1\u03d7\1\u03d8\1\344\1\u199c\1\344\1\u017c"+
- "\55\344\1\u03d7\1\u03d8\2\344\1\u199d\1\u017c\55\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\1\u199e\54\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\1\344\1\u199f\53\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\2\344\1\u19a0\52\344\1\u03d7\1\u03d8\3\344\1\u017c\3\344"+
- "\1\u19a1\51\344\1\u03d7\1\u03d8\3\344\1\u017c\4\344\1\u19a2"+
- "\50\344\1\u03d7\1\u03d8\3\344\1\u017c\5\344\1\u19a3\47\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\6\344\1\u19a4\46\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\7\344\1\u19a5\45\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\10\344\1\u19a6\44\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\11\344\1\u19a7\42\344\1\276\1\300\1\u02bf\3\276"+
- "\1\u19a8\55\276\1\300\1\u02bf\4\276\1\u19a9\54\276\1\300"+
- "\1\u02bf\5\276\1\u19aa\53\276\1\300\1\u02bf\6\276\1\u19ab"+
- "\52\276\1\300\1\u02bf\7\276\1\u19ac\51\276\1\300\1\u02bf"+
- "\10\276\1\u19ad\50\276\1\300\1\u02bf\11\276\1\u19ae\47\276"+
- "\1\300\1\u02bf\12\276\1\u19af\46\276\1\300\1\u02bf\13\276"+
- "\1\u19b0\45\276\1\300\1\u02bf\14\276\1\u19b1\44\276\1\300"+
- "\1\u02bf\15\276\1\u19b2\42\276\1\0\2\u0381\1\0\1\u19b3"+
- "\57\0\2\u0381\2\0\1\u19b4\56\0\2\u0381\3\0\1\u19b5"+
- "\55\0\2\u0381\4\0\1\u19b6\54\0\2\u0381\5\0\1\u19b7"+
- "\53\0\2\u0381\6\0\1\u19b8\52\0\2\u0381\7\0\1\u19b9"+
- "\51\0\2\u0381\10\0\1\u19ba\50\0\2\u0381\11\0\1\u19bb"+
- "\47\0\2\u0381\12\0\1\u19bc\46\0\2\u0381\13\0\1\u19bd"+
- "\45\0\2\u0381\14\0\1\u19be\44\0\2\u0381\15\0\1\u19bf"+
- "\43\0\1\u0311\1\u0312\1\0\1\u19c0\57\0\1\u0311\1\u0312"+
- "\2\0\1\u19c1\56\0\1\u0311\1\u0312\3\0\1\u19c2\55\0"+
- "\1\u0311\1\u0312\4\0\1\u19c3\54\0\1\u0311\1\u0312\5\0"+
- "\1\u19c4\53\0\1\u0311\1\u0312\6\0\1\u19c5\52\0\1\u0311"+
- "\1\u0312\7\0\1\u19c6\51\0\1\u0311\1\u0312\10\0\1\u19c7"+
- "\50\0\1\u0311\1\u0312\11\0\1\u19c8\47\0\1\u0311\1\u0312"+
- "\12\0\1\u19c9\46\0\1\u0311\1\u0312\13\0\1\u19ca\45\0"+
- "\1\u0311\1\u0312\14\0\1\u19cb\44\0\1\u0311\1\u0312\15\0"+
- "\1\u19cc\43\0\2\u039d\1\0\1\u19cd\57\0\2\u039d\2\0"+
- "\1\u19ce\56\0\2\u039d\3\0\1\u19cf\55\0\2\u039d\4\0"+
- "\1\u19d0\54\0\2\u039d\5\0\1\u19d1\53\0\2\u039d\6\0"+
- "\1\u19d2\52\0\2\u039d\7\0\1\u19d3\51\0\2\u039d\10\0"+
- "\1\u19d4\50\0\2\u039d\11\0\1\u19d5\47\0\2\u039d\12\0"+
- "\1\u19d6\46\0\2\u039d\13\0\1\u19d7\45\0\2\u039d\14\0"+
- "\1\u19d8\44\0\2\u039d\15\0\1\u19d9\42\0\1\276\1\u03ab"+
- "\1\u03ac\1\276\1\u19da\57\276\1\u03ab\1\u03ac\2\276\1\u19db"+
- "\56\276\1\u03ab\1\u03ac\3\276\1\u19dc\55\276\1\u03ab\1\u03ac"+
- "\4\276\1\u19dd\54\276\1\u03ab\1\u03ac\5\276\1\u19de\53\276"+
- "\1\u03ab\1\u03ac\6\276\1\u19df\52\276\1\u03ab\1\u03ac\7\276"+
- "\1\u19e0\51\276\1\u03ab\1\u03ac\10\276\1\u19e1\50\276\1\u03ab"+
- "\1\u03ac\11\276\1\u19e2\47\276\1\u03ab\1\u03ac\12\276\1\u19e3"+
- "\46\276\1\u03ab\1\u03ac\13\276\1\u19e4\45\276\1\u03ab\1\u03ac"+
- "\14\276\1\u19e5\44\276\1\u03ab\1\u03ac\15\276\1\u19e6\43\276"+
- "\1\u033b\1\u033c\1\276\1\u19e7\57\276\1\u033b\1\u033c\2\276"+
- "\1\u19e8\56\276\1\u033b\1\u033c\3\276\1\u19e9\55\276\1\u033b"+
- "\1\u033c\4\276\1\u19ea\54\276\1\u033b\1\u033c\5\276\1\u19eb"+
- "\53\276\1\u033b\1\u033c\6\276\1\u19ec\52\276\1\u033b\1\u033c"+
- "\7\276\1\u19ed\51\276\1\u033b\1\u033c\10\276\1\u19ee\50\276"+
- "\1\u033b\1\u033c\11\276\1\u19ef\47\276\1\u033b\1\u033c\12\276"+
- "\1\u19f0\46\276\1\u033b\1\u033c\13\276\1\u19f1\45\276\1\u033b"+
- "\1\u033c\14\276\1\u19f2\44\276\1\u033b\1\u033c\15\276\1\u19f3"+
- "\43\276\1\300\1\u02bf\1\276\1\u19f4\57\276\1\300\1\u02bf"+
- "\2\276\1\u19f5\55\276\1\263\1\u03c9\1\u03ca\1\263\1\u19f6"+
- "\1\263\1\u0136\55\263\1\u03c9\1\u03ca\2\263\1\u19f7\1\u0136"+
- "\55\263\1\u03c9\1\u03ca\3\263\1\u0136\1\u19f8\54\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\1\263\1\u19f9\53\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\2\263\1\u19fa\52\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\3\263\1\u19fb\51\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\4\263\1\u19fc\50\263\1\u03c9\1\u03ca\3\263\1\u0136\5\263"+
- "\1\u19fd\47\263\1\u03c9\1\u03ca\3\263\1\u0136\6\263\1\u19fe"+
- "\46\263\1\u03c9\1\u03ca\3\263\1\u0136\7\263\1\u19ff\45\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\10\263\1\u1a00\44\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\11\263\1\u1a01\42\263\1\344\1\u03d7"+
- "\1\u03d8\1\344\1\u1a02\1\344\1\u017c\55\344\1\u03d7\1\u03d8"+
- "\2\344\1\u1a03\1\u017c\55\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\1\u1a04\54\344\1\u03d7\1\u03d8\3\344\1\u017c\1\344\1\u1a05"+
- "\53\344\1\u03d7\1\u03d8\3\344\1\u017c\2\344\1\u1a06\52\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\3\344\1\u1a07\51\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\4\344\1\u1a08\50\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\5\344\1\u1a09\47\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\6\344\1\u1a0a\46\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\7\344\1\u1a0b\45\344\1\u03d7\1\u03d8\3\344\1\u017c\10\344"+
- "\1\u1a0c\44\344\1\u03d7\1\u03d8\3\344\1\u017c\11\344\1\u1a0d"+
- "\42\344\1\276\1\300\1\u02bf\3\276\1\u1a0e\55\276\1\300"+
- "\1\u02bf\4\276\1\u1a0f\54\276\1\300\1\u02bf\5\276\1\u1a10"+
- "\53\276\1\300\1\u02bf\6\276\1\u1a11\52\276\1\300\1\u02bf"+
- "\7\276\1\u1a12\51\276\1\300\1\u02bf\10\276\1\u1a13\50\276"+
- "\1\300\1\u02bf\11\276\1\u1a14\47\276\1\300\1\u02bf\12\276"+
- "\1\u1a15\46\276\1\300\1\u02bf\13\276\1\u1a16\45\276\1\300"+
- "\1\u02bf\14\276\1\u1a17\44\276\1\300\1\u02bf\15\276\1\u1a18"+
- "\42\276\1\0\2\u0381\1\0\1\u1a19\57\0\2\u0381\2\0"+
- "\1\u1a1a\56\0\2\u0381\3\0\1\u1a1b\55\0\2\u0381\4\0"+
- "\1\u1a1c\54\0\2\u0381\5\0\1\u1a1d\53\0\2\u0381\6\0"+
- "\1\u1a1e\52\0\2\u0381\7\0\1\u1a1f\51\0\2\u0381\10\0"+
- "\1\u1a20\50\0\2\u0381\11\0\1\u1a21\47\0\2\u0381\12\0"+
- "\1\u1a22\46\0\2\u0381\13\0\1\u1a23\45\0\2\u0381\14\0"+
- "\1\u1a24\44\0\2\u0381\15\0\1\u1a25\43\0\1\u0311\1\u0312"+
- "\1\0\1\u1a26\57\0\1\u0311\1\u0312\2\0\1\u1a27\56\0"+
- "\1\u0311\1\u0312\3\0\1\u1a28\55\0\1\u0311\1\u0312\4\0"+
- "\1\u1a29\54\0\1\u0311\1\u0312\5\0\1\u1a2a\53\0\1\u0311"+
- "\1\u0312\6\0\1\u1a2b\52\0\1\u0311\1\u0312\7\0\1\u1a2c"+
- "\51\0\1\u0311\1\u0312\10\0\1\u1a2d\50\0\1\u0311\1\u0312"+
- "\11\0\1\u1a2e\47\0\1\u0311\1\u0312\12\0\1\u1a2f\46\0"+
- "\1\u0311\1\u0312\13\0\1\u1a30\45\0\1\u0311\1\u0312\14\0"+
- "\1\u1a31\44\0\1\u0311\1\u0312\15\0\1\u1a32\43\0\2\u039d"+
- "\1\0\1\u1a33\57\0\2\u039d\2\0\1\u1a34\56\0\2\u039d"+
- "\3\0\1\u1a35\55\0\2\u039d\4\0\1\u1a36\54\0\2\u039d"+
- "\5\0\1\u1a37\53\0\2\u039d\6\0\1\u1a38\52\0\2\u039d"+
- "\7\0\1\u1a39\51\0\2\u039d\10\0\1\u1a3a\50\0\2\u039d"+
- "\11\0\1\u1a3b\47\0\2\u039d\12\0\1\u1a3c\46\0\2\u039d"+
- "\13\0\1\u1a3d\45\0\2\u039d\14\0\1\u1a3e\44\0\2\u039d"+
- "\15\0\1\u1a3f\42\0\1\276\1\u03ab\1\u03ac\1\276\1\u1a40"+
- "\57\276\1\u03ab\1\u03ac\2\276\1\u1a41\56\276\1\u03ab\1\u03ac"+
- "\3\276\1\u1a42\55\276\1\u03ab\1\u03ac\4\276\1\u1a43\54\276"+
- "\1\u03ab\1\u03ac\5\276\1\u1a44\53\276\1\u03ab\1\u03ac\6\276"+
- "\1\u1a45\52\276\1\u03ab\1\u03ac\7\276\1\u1a46\51\276\1\u03ab"+
- "\1\u03ac\10\276\1\u1a47\50\276\1\u03ab\1\u03ac\11\276\1\u1a48"+
- "\47\276\1\u03ab\1\u03ac\12\276\1\u1a49\46\276\1\u03ab\1\u03ac"+
- "\13\276\1\u1a4a\45\276\1\u03ab\1\u03ac\14\276\1\u1a4b\44\276"+
- "\1\u03ab\1\u03ac\15\276\1\u1a4c\43\276\1\u033b\1\u033c\1\276"+
- "\1\u1a4d\57\276\1\u033b\1\u033c\2\276\1\u1a4e\56\276\1\u033b"+
- "\1\u033c\3\276\1\u1a4f\55\276\1\u033b\1\u033c\4\276\1\u1a50"+
- "\54\276\1\u033b\1\u033c\5\276\1\u1a51\53\276\1\u033b\1\u033c"+
- "\6\276\1\u1a52\52\276\1\u033b\1\u033c\7\276\1\u1a53\51\276"+
- "\1\u033b\1\u033c\10\276\1\u1a54\50\276\1\u033b\1\u033c\11\276"+
- "\1\u1a55\47\276\1\u033b\1\u033c\12\276\1\u1a56\46\276\1\u033b"+
- "\1\u033c\13\276\1\u1a57\45\276\1\u033b\1\u033c\14\276\1\u1a58"+
- "\44\276\1\u033b\1\u033c\15\276\1\u1a59\43\276\1\300\1\u02bf"+
- "\1\276\1\u1a5a\57\276\1\300\1\u02bf\2\276\1\u1a5b\55\276"+
- "\1\263\1\u03c9\1\u03ca\1\263\1\u1a5c\1\263\1\u0136\55\263"+
- "\1\u03c9\1\u03ca\2\263\1\u1a5d\1\u0136\55\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\1\u1a5e\54\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\1\263\1\u1a5f\53\263\1\u03c9\1\u03ca\3\263\1\u0136\2\263"+
- "\1\u1a60\52\263\1\u03c9\1\u03ca\3\263\1\u0136\3\263\1\u1a61"+
- "\51\263\1\u03c9\1\u03ca\3\263\1\u0136\4\263\1\u1a62\50\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\5\263\1\u1a63\47\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\6\263\1\u1a64\46\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\7\263\1\u1a65\45\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\10\263\1\u1a66\44\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\11\263\1\u1a67\42\263\1\344\1\u03d7\1\u03d8\1\344\1\u1a68"+
- "\1\344\1\u017c\55\344\1\u03d7\1\u03d8\2\344\1\u1a69\1\u017c"+
- "\55\344\1\u03d7\1\u03d8\3\344\1\u017c\1\u1a6a\54\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\1\344\1\u1a6b\53\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\2\344\1\u1a6c\52\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\3\344\1\u1a6d\51\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\4\344\1\u1a6e\50\344\1\u03d7\1\u03d8\3\344\1\u017c\5\344"+
- "\1\u1a6f\47\344\1\u03d7\1\u03d8\3\344\1\u017c\6\344\1\u1a70"+
- "\46\344\1\u03d7\1\u03d8\3\344\1\u017c\7\344\1\u1a71\45\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\10\344\1\u1a72\44\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\11\344\1\u1a73\42\344\1\276\1\300"+
- "\1\u02bf\3\276\1\u1a74\55\276\1\300\1\u02bf\4\276\1\u1a75"+
- "\54\276\1\300\1\u02bf\5\276\1\u1a76\53\276\1\300\1\u02bf"+
- "\6\276\1\u1a77\52\276\1\300\1\u02bf\7\276\1\u1a78\51\276"+
- "\1\300\1\u02bf\10\276\1\u1a79\50\276\1\300\1\u02bf\11\276"+
- "\1\u1a7a\47\276\1\300\1\u02bf\12\276\1\u1a7b\46\276\1\300"+
- "\1\u02bf\13\276\1\u1a7c\45\276\1\300\1\u02bf\14\276\1\u1a7d"+
- "\44\276\1\300\1\u02bf\15\276\1\u1a7e\42\276\1\0\2\u0381"+
- "\1\0\1\u1a7f\57\0\2\u0381\2\0\1\u1a80\56\0\2\u0381"+
- "\3\0\1\u1a81\55\0\2\u0381\4\0\1\u1a82\54\0\2\u0381"+
- "\5\0\1\u1a83\53\0\2\u0381\6\0\1\u1a84\52\0\2\u0381"+
- "\7\0\1\u1a85\51\0\2\u0381\10\0\1\u1a86\50\0\2\u0381"+
- "\11\0\1\u1a87\47\0\2\u0381\12\0\1\u1a88\46\0\2\u0381"+
- "\13\0\1\u1a89\45\0\2\u0381\14\0\1\u1a8a\44\0\2\u0381"+
- "\15\0\1\u1a8b\43\0\1\u0311\1\u0312\1\0\1\u1a8c\57\0"+
- "\1\u0311\1\u0312\2\0\1\u1a8d\56\0\1\u0311\1\u0312\3\0"+
- "\1\u1a8e\55\0\1\u0311\1\u0312\4\0\1\u1a8f\54\0\1\u0311"+
- "\1\u0312\5\0\1\u1a90\53\0\1\u0311\1\u0312\6\0\1\u1a91"+
- "\52\0\1\u0311\1\u0312\7\0\1\u1a92\51\0\1\u0311\1\u0312"+
- "\10\0\1\u1a93\50\0\1\u0311\1\u0312\11\0\1\u1a94\47\0"+
- "\1\u0311\1\u0312\12\0\1\u1a95\46\0\1\u0311\1\u0312\13\0"+
- "\1\u1a96\45\0\1\u0311\1\u0312\14\0\1\u1a97\44\0\1\u0311"+
- "\1\u0312\15\0\1\u1a98\43\0\2\u039d\1\0\1\u1a99\57\0"+
- "\2\u039d\2\0\1\u1a9a\56\0\2\u039d\3\0\1\u1a9b\55\0"+
- "\2\u039d\4\0\1\u1a9c\54\0\2\u039d\5\0\1\u1a9d\53\0"+
- "\2\u039d\6\0\1\u1a9e\52\0\2\u039d\7\0\1\u1a9f\51\0"+
- "\2\u039d\10\0\1\u1aa0\50\0\2\u039d\11\0\1\u1aa1\47\0"+
- "\2\u039d\12\0\1\u1aa2\46\0\2\u039d\13\0\1\u1aa3\45\0"+
- "\2\u039d\14\0\1\u1aa4\44\0\2\u039d\15\0\1\u1aa5\42\0"+
- "\1\276\1\u03ab\1\u03ac\1\276\1\u1aa6\57\276\1\u03ab\1\u03ac"+
- "\2\276\1\u1aa7\56\276\1\u03ab\1\u03ac\3\276\1\u1aa8\55\276"+
- "\1\u03ab\1\u03ac\4\276\1\u1aa9\54\276\1\u03ab\1\u03ac\5\276"+
- "\1\u1aaa\53\276\1\u03ab\1\u03ac\6\276\1\u1aab\52\276\1\u03ab"+
- "\1\u03ac\7\276\1\u1aac\51\276\1\u03ab\1\u03ac\10\276\1\u1aad"+
- "\50\276\1\u03ab\1\u03ac\11\276\1\u1aae\47\276\1\u03ab\1\u03ac"+
- "\12\276\1\u1aaf\46\276\1\u03ab\1\u03ac\13\276\1\u1ab0\45\276"+
- "\1\u03ab\1\u03ac\14\276\1\u1ab1\44\276\1\u03ab\1\u03ac\15\276"+
- "\1\u1ab2\43\276\1\u033b\1\u033c\1\276\1\u1ab3\57\276\1\u033b"+
- "\1\u033c\2\276\1\u1ab4\56\276\1\u033b\1\u033c\3\276\1\u1ab5"+
- "\55\276\1\u033b\1\u033c\4\276\1\u1ab6\54\276\1\u033b\1\u033c"+
- "\5\276\1\u1ab7\53\276\1\u033b\1\u033c\6\276\1\u1ab8\52\276"+
- "\1\u033b\1\u033c\7\276\1\u1ab9\51\276\1\u033b\1\u033c\10\276"+
- "\1\u1aba\50\276\1\u033b\1\u033c\11\276\1\u1abb\47\276\1\u033b"+
- "\1\u033c\12\276\1\u1abc\46\276\1\u033b\1\u033c\13\276\1\u1abd"+
- "\45\276\1\u033b\1\u033c\14\276\1\u1abe\44\276\1\u033b\1\u033c"+
- "\15\276\1\u1abf\43\276\1\300\1\u02bf\1\276\1\u1ac0\57\276"+
- "\1\300\1\u02bf\2\276\1\u1ac1\55\276\1\263\1\u03c9\1\u03ca"+
- "\1\263\1\u1ac2\1\263\1\u0136\55\263\1\u03c9\1\u03ca\2\263"+
- "\1\u1ac3\1\u0136\55\263\1\u03c9\1\u03ca\3\263\1\u0136\1\u1ac4"+
- "\54\263\1\u03c9\1\u03ca\3\263\1\u0136\1\263\1\u1ac5\53\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\2\263\1\u1ac6\52\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\3\263\1\u1ac7\51\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\4\263\1\u1ac8\50\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\5\263\1\u1ac9\47\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\6\263\1\u1aca\46\263\1\u03c9\1\u03ca\3\263\1\u0136\7\263"+
- "\1\u1acb\45\263\1\u03c9\1\u03ca\3\263\1\u0136\10\263\1\u1acc"+
- "\44\263\1\u03c9\1\u03ca\3\263\1\u0136\11\263\1\u1acd\42\263"+
- "\1\344\1\u03d7\1\u03d8\1\344\1\u1ace\1\344\1\u017c\55\344"+
- "\1\u03d7\1\u03d8\2\344\1\u1acf\1\u017c\55\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\1\u1ad0\54\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\1\344\1\u1ad1\53\344\1\u03d7\1\u03d8\3\344\1\u017c\2\344"+
- "\1\u1ad2\52\344\1\u03d7\1\u03d8\3\344\1\u017c\3\344\1\u1ad3"+
- "\51\344\1\u03d7\1\u03d8\3\344\1\u017c\4\344\1\u1ad4\50\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\5\344\1\u1ad5\47\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\6\344\1\u1ad6\46\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\7\344\1\u1ad7\45\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\10\344\1\u1ad8\44\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\11\344\1\u1ad9\42\344\1\276\1\300\1\u02bf\3\276\1\u1ada"+
- "\55\276\1\300\1\u02bf\4\276\1\u1adb\54\276\1\300\1\u02bf"+
- "\5\276\1\u1adc\53\276\1\300\1\u02bf\6\276\1\u1add\52\276"+
- "\1\300\1\u02bf\7\276\1\u1ade\51\276\1\300\1\u02bf\10\276"+
- "\1\u1adf\50\276\1\300\1\u02bf\11\276\1\u1ae0\47\276\1\300"+
- "\1\u02bf\12\276\1\u1ae1\46\276\1\300\1\u02bf\13\276\1\u1ae2"+
- "\45\276\1\300\1\u02bf\14\276\1\u1ae3\44\276\1\300\1\u02bf"+
- "\15\276\1\u1ae4\42\276\1\0\2\u0381\1\0\1\u1ae5\57\0"+
- "\2\u0381\2\0\1\u1ae6\56\0\2\u0381\3\0\1\u1ae7\55\0"+
- "\2\u0381\4\0\1\u1ae8\54\0\2\u0381\5\0\1\u1ae9\53\0"+
- "\2\u0381\6\0\1\u1aea\52\0\2\u0381\7\0\1\u1aeb\51\0"+
- "\2\u0381\10\0\1\u1aec\50\0\2\u0381\11\0\1\u1aed\47\0"+
- "\2\u0381\12\0\1\u1aee\46\0\2\u0381\13\0\1\u1aef\45\0"+
- "\2\u0381\14\0\1\u1af0\44\0\2\u0381\15\0\1\u1af1\43\0"+
- "\1\u0311\1\u0312\1\0\1\u1af2\57\0\1\u0311\1\u0312\2\0"+
- "\1\u1af3\56\0\1\u0311\1\u0312\3\0\1\u1af4\55\0\1\u0311"+
- "\1\u0312\4\0\1\u1af5\54\0\1\u0311\1\u0312\5\0\1\u1af6"+
- "\53\0\1\u0311\1\u0312\6\0\1\u1af7\52\0\1\u0311\1\u0312"+
- "\7\0\1\u1af8\51\0\1\u0311\1\u0312\10\0\1\u1af9\50\0"+
- "\1\u0311\1\u0312\11\0\1\u1afa\47\0\1\u0311\1\u0312\12\0"+
- "\1\u1afb\46\0\1\u0311\1\u0312\13\0\1\u1afc\45\0\1\u0311"+
- "\1\u0312\14\0\1\u1afd\44\0\1\u0311\1\u0312\15\0\1\u1afe"+
- "\43\0\2\u039d\1\0\1\u1aff\57\0\2\u039d\2\0\1\u1b00"+
- "\56\0\2\u039d\3\0\1\u1b01\55\0\2\u039d\4\0\1\u1b02"+
- "\54\0\2\u039d\5\0\1\u1b03\53\0\2\u039d\6\0\1\u1b04"+
- "\52\0\2\u039d\7\0\1\u1b05\51\0\2\u039d\10\0\1\u1b06"+
- "\50\0\2\u039d\11\0\1\u1b07\47\0\2\u039d\12\0\1\u1b08"+
- "\46\0\2\u039d\13\0\1\u1b09\45\0\2\u039d\14\0\1\u1b0a"+
- "\44\0\2\u039d\15\0\1\u1b0b\42\0\1\276\1\u03ab\1\u03ac"+
- "\1\276\1\u1b0c\57\276\1\u03ab\1\u03ac\2\276\1\u1b0d\56\276"+
- "\1\u03ab\1\u03ac\3\276\1\u1b0e\55\276\1\u03ab\1\u03ac\4\276"+
- "\1\u1b0f\54\276\1\u03ab\1\u03ac\5\276\1\u1b10\53\276\1\u03ab"+
- "\1\u03ac\6\276\1\u1b11\52\276\1\u03ab\1\u03ac\7\276\1\u1b12"+
- "\51\276\1\u03ab\1\u03ac\10\276\1\u1b13\50\276\1\u03ab\1\u03ac"+
- "\11\276\1\u1b14\47\276\1\u03ab\1\u03ac\12\276\1\u1b15\46\276"+
- "\1\u03ab\1\u03ac\13\276\1\u1b16\45\276\1\u03ab\1\u03ac\14\276"+
- "\1\u1b17\44\276\1\u03ab\1\u03ac\15\276\1\u1b18\43\276\1\u033b"+
- "\1\u033c\1\276\1\u1b19\57\276\1\u033b\1\u033c\2\276\1\u1b1a"+
- "\56\276\1\u033b\1\u033c\3\276\1\u1b1b\55\276\1\u033b\1\u033c"+
- "\4\276\1\u1b1c\54\276\1\u033b\1\u033c\5\276\1\u1b1d\53\276"+
- "\1\u033b\1\u033c\6\276\1\u1b1e\52\276\1\u033b\1\u033c\7\276"+
- "\1\u1b1f\51\276\1\u033b\1\u033c\10\276\1\u1b20\50\276\1\u033b"+
- "\1\u033c\11\276\1\u1b21\47\276\1\u033b\1\u033c\12\276\1\u1b22"+
- "\46\276\1\u033b\1\u033c\13\276\1\u1b23\45\276\1\u033b\1\u033c"+
- "\14\276\1\u1b24\44\276\1\u033b\1\u033c\15\276\1\u1b25\43\276"+
- "\1\300\1\u02bf\1\276\1\u1b26\57\276\1\300\1\u02bf\2\276"+
- "\1\u1b27\55\276\1\263\1\u03c9\1\u03ca\1\263\1\u1b28\1\263"+
- "\1\u0136\55\263\1\u03c9\1\u03ca\2\263\1\u1b29\1\u0136\55\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\1\u1b2a\54\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\1\263\1\u1b2b\53\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\2\263\1\u1b2c\52\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\3\263\1\u1b2d\51\263\1\u03c9\1\u03ca\3\263\1\u0136\4\263"+
- "\1\u1b2e\50\263\1\u03c9\1\u03ca\3\263\1\u0136\5\263\1\u1b2f"+
- "\47\263\1\u03c9\1\u03ca\3\263\1\u0136\6\263\1\u1b30\46\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\7\263\1\u1b31\45\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\10\263\1\u1b32\44\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\11\263\1\u1b33\42\263\1\344\1\u03d7\1\u03d8"+
- "\1\344\1\u1b34\1\344\1\u017c\55\344\1\u03d7\1\u03d8\2\344"+
- "\1\u1b35\1\u017c\55\344\1\u03d7\1\u03d8\3\344\1\u017c\1\u1b36"+
- "\54\344\1\u03d7\1\u03d8\3\344\1\u017c\1\344\1\u1b37\53\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\2\344\1\u1b38\52\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\3\344\1\u1b39\51\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\4\344\1\u1b3a\50\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\5\344\1\u1b3b\47\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\6\344\1\u1b3c\46\344\1\u03d7\1\u03d8\3\344\1\u017c\7\344"+
- "\1\u1b3d\45\344\1\u03d7\1\u03d8\3\344\1\u017c\10\344\1\u1b3e"+
- "\44\344\1\u03d7\1\u03d8\3\344\1\u017c\11\344\1\u1b3f\42\344"+
- "\1\276\1\300\1\u02bf\3\276\1\u1b40\55\276\1\300\1\u02bf"+
- "\4\276\1\u1b41\54\276\1\300\1\u02bf\5\276\1\u1b42\53\276"+
- "\1\300\1\u02bf\6\276\1\u1b43\52\276\1\300\1\u02bf\7\276"+
- "\1\u1b44\51\276\1\300\1\u02bf\10\276\1\u1b45\50\276\1\300"+
- "\1\u02bf\11\276\1\u1b46\47\276\1\300\1\u02bf\12\276\1\u1b47"+
- "\46\276\1\300\1\u02bf\13\276\1\u1b48\45\276\1\300\1\u02bf"+
- "\14\276\1\u1b49\44\276\1\300\1\u02bf\15\276\1\u1b4a\42\276"+
- "\1\0\2\u0381\1\0\1\u1b4b\57\0\2\u0381\2\0\1\u1b4c"+
- "\56\0\2\u0381\3\0\1\u1b4d\55\0\2\u0381\4\0\1\u1b4e"+
- "\54\0\2\u0381\5\0\1\u1b4f\53\0\2\u0381\6\0\1\u1b50"+
- "\52\0\2\u0381\7\0\1\u1b51\51\0\2\u0381\10\0\1\u1b52"+
- "\50\0\2\u0381\11\0\1\u1b53\47\0\2\u0381\12\0\1\u1b54"+
- "\46\0\2\u0381\13\0\1\u1b55\45\0\2\u0381\14\0\1\u1b56"+
- "\44\0\2\u0381\15\0\1\u1b57\43\0\1\u0311\1\u0312\1\0"+
- "\1\u1b58\57\0\1\u0311\1\u0312\2\0\1\u1b59\56\0\1\u0311"+
- "\1\u0312\3\0\1\u1b5a\55\0\1\u0311\1\u0312\4\0\1\u1b5b"+
- "\54\0\1\u0311\1\u0312\5\0\1\u1b5c\53\0\1\u0311\1\u0312"+
- "\6\0\1\u1b5d\52\0\1\u0311\1\u0312\7\0\1\u1b5e\51\0"+
- "\1\u0311\1\u0312\10\0\1\u1b5f\50\0\1\u0311\1\u0312\11\0"+
- "\1\u1b60\47\0\1\u0311\1\u0312\12\0\1\u1b61\46\0\1\u0311"+
- "\1\u0312\13\0\1\u1b62\45\0\1\u0311\1\u0312\14\0\1\u1b63"+
- "\44\0\1\u0311\1\u0312\15\0\1\u1b64\43\0\2\u039d\1\0"+
- "\1\u1b65\57\0\2\u039d\2\0\1\u1b66\56\0\2\u039d\3\0"+
- "\1\u1b67\55\0\2\u039d\4\0\1\u1b68\54\0\2\u039d\5\0"+
- "\1\u1b69\53\0\2\u039d\6\0\1\u1b6a\52\0\2\u039d\7\0"+
- "\1\u1b6b\51\0\2\u039d\10\0\1\u1b6c\50\0\2\u039d\11\0"+
- "\1\u1b6d\47\0\2\u039d\12\0\1\u1b6e\46\0\2\u039d\13\0"+
- "\1\u1b6f\45\0\2\u039d\14\0\1\u1b70\44\0\2\u039d\15\0"+
- "\1\u1b71\42\0\1\276\1\u03ab\1\u03ac\1\276\1\u1b72\57\276"+
- "\1\u03ab\1\u03ac\2\276\1\u1b73\56\276\1\u03ab\1\u03ac\3\276"+
- "\1\u1b74\55\276\1\u03ab\1\u03ac\4\276\1\u1b75\54\276\1\u03ab"+
- "\1\u03ac\5\276\1\u1b76\53\276\1\u03ab\1\u03ac\6\276\1\u1b77"+
- "\52\276\1\u03ab\1\u03ac\7\276\1\u1b78\51\276\1\u03ab\1\u03ac"+
- "\10\276\1\u1b79\50\276\1\u03ab\1\u03ac\11\276\1\u1b7a\47\276"+
- "\1\u03ab\1\u03ac\12\276\1\u1b7b\46\276\1\u03ab\1\u03ac\13\276"+
- "\1\u1b7c\45\276\1\u03ab\1\u03ac\14\276\1\u1b7d\44\276\1\u03ab"+
- "\1\u03ac\15\276\1\u1b7e\43\276\1\u033b\1\u033c\1\276\1\u1b7f"+
- "\57\276\1\u033b\1\u033c\2\276\1\u1b80\56\276\1\u033b\1\u033c"+
- "\3\276\1\u1b81\55\276\1\u033b\1\u033c\4\276\1\u1b82\54\276"+
- "\1\u033b\1\u033c\5\276\1\u1b83\53\276\1\u033b\1\u033c\6\276"+
- "\1\u1b84\52\276\1\u033b\1\u033c\7\276\1\u1b85\51\276\1\u033b"+
- "\1\u033c\10\276\1\u1b86\50\276\1\u033b\1\u033c\11\276\1\u1b87"+
- "\47\276\1\u033b\1\u033c\12\276\1\u1b88\46\276\1\u033b\1\u033c"+
- "\13\276\1\u1b89\45\276\1\u033b\1\u033c\14\276\1\u1b8a\44\276"+
- "\1\u033b\1\u033c\15\276\1\u1b8b\43\276\1\300\1\u02bf\1\276"+
- "\1\u1b8c\57\276\1\300\1\u02bf\2\276\1\u1b8d\55\276\1\263"+
- "\1\u03c9\1\u03ca\1\263\1\u1b8e\1\263\1\u0136\55\263\1\u03c9"+
- "\1\u03ca\2\263\1\u1b8f\1\u0136\55\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\1\u1b90\54\263\1\u03c9\1\u03ca\3\263\1\u0136\1\263"+
- "\1\u1b91\53\263\1\u03c9\1\u03ca\3\263\1\u0136\2\263\1\u1b92"+
- "\52\263\1\u03c9\1\u03ca\3\263\1\u0136\3\263\1\u1b93\51\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\4\263\1\u1b94\50\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\5\263\1\u1b95\47\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\6\263\1\u1b96\46\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\7\263\1\u1b97\45\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\10\263\1\u1b98\44\263\1\u03c9\1\u03ca\3\263\1\u0136\11\263"+
- "\1\u1b99\42\263\1\344\1\u03d7\1\u03d8\1\344\1\u1b9a\1\344"+
- "\1\u017c\55\344\1\u03d7\1\u03d8\2\344\1\u1b9b\1\u017c\55\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\1\u1b9c\54\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\1\344\1\u1b9d\53\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\2\344\1\u1b9e\52\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\3\344\1\u1b9f\51\344\1\u03d7\1\u03d8\3\344\1\u017c\4\344"+
- "\1\u1ba0\50\344\1\u03d7\1\u03d8\3\344\1\u017c\5\344\1\u1ba1"+
- "\47\344\1\u03d7\1\u03d8\3\344\1\u017c\6\344\1\u1ba2\46\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\7\344\1\u1ba3\45\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\10\344\1\u1ba4\44\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\11\344\1\u1ba5\42\344\1\276\1\300\1\u02bf"+
- "\3\276\1\u1ba6\55\276\1\300\1\u02bf\4\276\1\u1ba7\54\276"+
- "\1\300\1\u02bf\5\276\1\u1ba8\53\276\1\300\1\u02bf\6\276"+
- "\1\u1ba9\52\276\1\300\1\u02bf\7\276\1\u1baa\51\276\1\300"+
- "\1\u02bf\10\276\1\u1bab\50\276\1\300\1\u02bf\11\276\1\u1bac"+
- "\47\276\1\300\1\u02bf\12\276\1\u1bad\46\276\1\300\1\u02bf"+
- "\13\276\1\u1bae\45\276\1\300\1\u02bf\14\276\1\u1baf\44\276"+
- "\1\300\1\u02bf\15\276\1\u1bb0\42\276\1\0\2\u0381\1\0"+
- "\1\u1bb1\57\0\2\u0381\2\0\1\u1bb2\56\0\2\u0381\3\0"+
- "\1\u1bb3\55\0\2\u0381\4\0\1\u1bb4\54\0\2\u0381\5\0"+
- "\1\u1bb5\53\0\2\u0381\6\0\1\u1bb6\52\0\2\u0381\7\0"+
- "\1\u1bb7\51\0\2\u0381\10\0\1\u1bb8\50\0\2\u0381\11\0"+
- "\1\u1bb9\47\0\2\u0381\12\0\1\u1bba\46\0\2\u0381\13\0"+
- "\1\u1bbb\45\0\2\u0381\14\0\1\u1bbc\44\0\2\u0381\15\0"+
- "\1\u1bbd\43\0\1\u0311\1\u0312\1\0\1\u1bbe\57\0\1\u0311"+
- "\1\u0312\2\0\1\u1bbf\56\0\1\u0311\1\u0312\3\0\1\u1bc0"+
- "\55\0\1\u0311\1\u0312\4\0\1\u1bc1\54\0\1\u0311\1\u0312"+
- "\5\0\1\u1bc2\53\0\1\u0311\1\u0312\6\0\1\u1bc3\52\0"+
- "\1\u0311\1\u0312\7\0\1\u1bc4\51\0\1\u0311\1\u0312\10\0"+
- "\1\u1bc5\50\0\1\u0311\1\u0312\11\0\1\u1bc6\47\0\1\u0311"+
- "\1\u0312\12\0\1\u1bc7\46\0\1\u0311\1\u0312\13\0\1\u1bc8"+
- "\45\0\1\u0311\1\u0312\14\0\1\u1bc9\44\0\1\u0311\1\u0312"+
- "\15\0\1\u1bca\43\0\2\u039d\1\0\1\u1bcb\57\0\2\u039d"+
- "\2\0\1\u1bcc\56\0\2\u039d\3\0\1\u1bcd\55\0\2\u039d"+
- "\4\0\1\u1bce\54\0\2\u039d\5\0\1\u1bcf\53\0\2\u039d"+
- "\6\0\1\u1bd0\52\0\2\u039d\7\0\1\u1bd1\51\0\2\u039d"+
- "\10\0\1\u1bd2\50\0\2\u039d\11\0\1\u1bd3\47\0\2\u039d"+
- "\12\0\1\u1bd4\46\0\2\u039d\13\0\1\u1bd5\45\0\2\u039d"+
- "\14\0\1\u1bd6\44\0\2\u039d\15\0\1\u1bd7\42\0\1\276"+
- "\1\u03ab\1\u03ac\1\276\1\u1bd8\57\276\1\u03ab\1\u03ac\2\276"+
- "\1\u1bd9\56\276\1\u03ab\1\u03ac\3\276\1\u1bda\55\276\1\u03ab"+
- "\1\u03ac\4\276\1\u1bdb\54\276\1\u03ab\1\u03ac\5\276\1\u1bdc"+
- "\53\276\1\u03ab\1\u03ac\6\276\1\u1bdd\52\276\1\u03ab\1\u03ac"+
- "\7\276\1\u1bde\51\276\1\u03ab\1\u03ac\10\276\1\u1bdf\50\276"+
- "\1\u03ab\1\u03ac\11\276\1\u1be0\47\276\1\u03ab\1\u03ac\12\276"+
- "\1\u1be1\46\276\1\u03ab\1\u03ac\13\276\1\u1be2\45\276\1\u03ab"+
- "\1\u03ac\14\276\1\u1be3\44\276\1\u03ab\1\u03ac\15\276\1\u1be4"+
- "\43\276\1\u033b\1\u033c\1\276\1\u1be5\57\276\1\u033b\1\u033c"+
- "\2\276\1\u1be6\56\276\1\u033b\1\u033c\3\276\1\u1be7\55\276"+
- "\1\u033b\1\u033c\4\276\1\u1be8\54\276\1\u033b\1\u033c\5\276"+
- "\1\u1be9\53\276\1\u033b\1\u033c\6\276\1\u1bea\52\276\1\u033b"+
- "\1\u033c\7\276\1\u1beb\51\276\1\u033b\1\u033c\10\276\1\u1bec"+
- "\50\276\1\u033b\1\u033c\11\276\1\u1bed\47\276\1\u033b\1\u033c"+
- "\12\276\1\u1bee\46\276\1\u033b\1\u033c\13\276\1\u1bef\45\276"+
- "\1\u033b\1\u033c\14\276\1\u1bf0\44\276\1\u033b\1\u033c\15\276"+
- "\1\u1bf1\43\276\1\300\1\u02bf\1\276\1\u1bf2\57\276\1\300"+
- "\1\u02bf\2\276\1\u1bf3\55\276\1\263\1\u03c9\1\u03ca\1\263"+
- "\1\u1bf4\1\263\1\u0136\55\263\1\u03c9\1\u03ca\2\263\1\u1bf5"+
- "\1\u0136\55\263\1\u03c9\1\u03ca\3\263\1\u0136\1\u1bf6\54\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\1\263\1\u1bf7\53\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\2\263\1\u1bf8\52\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\3\263\1\u1bf9\51\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\4\263\1\u1bfa\50\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\5\263\1\u1bfb\47\263\1\u03c9\1\u03ca\3\263\1\u0136\6\263"+
- "\1\u1bfc\46\263\1\u03c9\1\u03ca\3\263\1\u0136\7\263\1\u1bfd"+
- "\45\263\1\u03c9\1\u03ca\3\263\1\u0136\10\263\1\u1bfe\44\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\11\263\1\u1bff\42\263\1\344"+
- "\1\u03d7\1\u03d8\1\344\1\u1c00\1\344\1\u017c\55\344\1\u03d7"+
- "\1\u03d8\2\344\1\u1c01\1\u017c\55\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\1\u1c02\54\344\1\u03d7\1\u03d8\3\344\1\u017c\1\344"+
- "\1\u1c03\53\344\1\u03d7\1\u03d8\3\344\1\u017c\2\344\1\u1c04"+
- "\52\344\1\u03d7\1\u03d8\3\344\1\u017c\3\344\1\u1c05\51\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\4\344\1\u1c06\50\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\5\344\1\u1c07\47\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\6\344\1\u1c08\46\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\7\344\1\u1c09\45\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\10\344\1\u1c0a\44\344\1\u03d7\1\u03d8\3\344\1\u017c\11\344"+
- "\1\u1c0b\42\344\1\276\1\300\1\u02bf\3\276\1\u1c0c\55\276"+
- "\1\300\1\u02bf\4\276\1\u1c0d\54\276\1\300\1\u02bf\5\276"+
- "\1\u1c0e\53\276\1\300\1\u02bf\6\276\1\u1c0f\52\276\1\300"+
- "\1\u02bf\7\276\1\u1c10\51\276\1\300\1\u02bf\10\276\1\u1c11"+
- "\50\276\1\300\1\u02bf\11\276\1\u1c12\47\276\1\300\1\u02bf"+
- "\12\276\1\u1c13\46\276\1\300\1\u02bf\13\276\1\u1c14\45\276"+
- "\1\300\1\u02bf\14\276\1\u1c15\44\276\1\300\1\u02bf\15\276"+
- "\1\u1c16\42\276\1\0\2\u0381\1\0\1\u1c17\57\0\2\u0381"+
- "\2\0\1\u1c18\56\0\2\u0381\3\0\1\u1c19\55\0\2\u0381"+
- "\4\0\1\u1c1a\54\0\2\u0381\5\0\1\u1c1b\53\0\2\u0381"+
- "\6\0\1\u1c1c\52\0\2\u0381\7\0\1\u1c1d\51\0\2\u0381"+
- "\10\0\1\u1c1e\50\0\2\u0381\11\0\1\u1c1f\47\0\2\u0381"+
- "\12\0\1\u1c20\46\0\2\u0381\13\0\1\u1c21\45\0\2\u0381"+
- "\14\0\1\u1c22\44\0\2\u0381\15\0\1\u1c23\43\0\1\u0311"+
- "\1\u0312\1\0\1\u1c24\57\0\1\u0311\1\u0312\2\0\1\u1c25"+
- "\56\0\1\u0311\1\u0312\3\0\1\u1c26\55\0\1\u0311\1\u0312"+
- "\4\0\1\u1c27\54\0\1\u0311\1\u0312\5\0\1\u1c28\53\0"+
- "\1\u0311\1\u0312\6\0\1\u1c29\52\0\1\u0311\1\u0312\7\0"+
- "\1\u1c2a\51\0\1\u0311\1\u0312\10\0\1\u1c2b\50\0\1\u0311"+
- "\1\u0312\11\0\1\u1c2c\47\0\1\u0311\1\u0312\12\0\1\u1c2d"+
- "\46\0\1\u0311\1\u0312\13\0\1\u1c2e\45\0\1\u0311\1\u0312"+
- "\14\0\1\u1c2f\44\0\1\u0311\1\u0312\15\0\1\u1c30\43\0"+
- "\2\u039d\1\0\1\u1c31\57\0\2\u039d\2\0\1\u1c32\56\0"+
- "\2\u039d\3\0\1\u1c33\55\0\2\u039d\4\0\1\u1c34\54\0"+
- "\2\u039d\5\0\1\u1c35\53\0\2\u039d\6\0\1\u1c36\52\0"+
- "\2\u039d\7\0\1\u1c37\51\0\2\u039d\10\0\1\u1c38\50\0"+
- "\2\u039d\11\0\1\u1c39\47\0\2\u039d\12\0\1\u1c3a\46\0"+
- "\2\u039d\13\0\1\u1c3b\45\0\2\u039d\14\0\1\u1c3c\44\0"+
- "\2\u039d\15\0\1\u1c3d\42\0\1\276\1\u03ab\1\u03ac\1\276"+
- "\1\u1c3e\57\276\1\u03ab\1\u03ac\2\276\1\u1c3f\56\276\1\u03ab"+
- "\1\u03ac\3\276\1\u1c40\55\276\1\u03ab\1\u03ac\4\276\1\u1c41"+
- "\54\276\1\u03ab\1\u03ac\5\276\1\u1c42\53\276\1\u03ab\1\u03ac"+
- "\6\276\1\u1c43\52\276\1\u03ab\1\u03ac\7\276\1\u1c44\51\276"+
- "\1\u03ab\1\u03ac\10\276\1\u1c45\50\276\1\u03ab\1\u03ac\11\276"+
- "\1\u1c46\47\276\1\u03ab\1\u03ac\12\276\1\u1c47\46\276\1\u03ab"+
- "\1\u03ac\13\276\1\u1c48\45\276\1\u03ab\1\u03ac\14\276\1\u1c49"+
- "\44\276\1\u03ab\1\u03ac\15\276\1\u1c4a\43\276\1\u033b\1\u033c"+
- "\1\276\1\u1c4b\57\276\1\u033b\1\u033c\2\276\1\u1c4c\56\276"+
- "\1\u033b\1\u033c\3\276\1\u1c4d\55\276\1\u033b\1\u033c\4\276"+
- "\1\u1c4e\54\276\1\u033b\1\u033c\5\276\1\u1c4f\53\276\1\u033b"+
- "\1\u033c\6\276\1\u1c50\52\276\1\u033b\1\u033c\7\276\1\u1c51"+
- "\51\276\1\u033b\1\u033c\10\276\1\u1c52\50\276\1\u033b\1\u033c"+
- "\11\276\1\u1c53\47\276\1\u033b\1\u033c\12\276\1\u1c54\46\276"+
- "\1\u033b\1\u033c\13\276\1\u1c55\45\276\1\u033b\1\u033c\14\276"+
- "\1\u1c56\44\276\1\u033b\1\u033c\15\276\1\u1c57\43\276\1\300"+
- "\1\u02bf\1\276\1\u1c58\57\276\1\300\1\u02bf\2\276\1\u1c59"+
- "\55\276\1\263\1\u03c9\1\u03ca\1\263\1\u1c5a\1\263\1\u0136"+
- "\55\263\1\u03c9\1\u03ca\2\263\1\u1c5b\1\u0136\55\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\1\u1c5c\54\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\1\263\1\u1c5d\53\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\2\263\1\u1c5e\52\263\1\u03c9\1\u03ca\3\263\1\u0136\3\263"+
- "\1\u1c5f\51\263\1\u03c9\1\u03ca\3\263\1\u0136\4\263\1\u1c60"+
- "\50\263\1\u03c9\1\u03ca\3\263\1\u0136\5\263\1\u1c61\47\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\6\263\1\u1c62\46\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\7\263\1\u1c63\45\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\10\263\1\u1c64\44\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\11\263\1\u1c65\42\263\1\344\1\u03d7\1\u03d8\1\344"+
- "\1\u1c66\1\344\1\u017c\55\344\1\u03d7\1\u03d8\2\344\1\u1c67"+
- "\1\u017c\55\344\1\u03d7\1\u03d8\3\344\1\u017c\1\u1c68\54\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\1\344\1\u1c69\53\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\2\344\1\u1c6a\52\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\3\344\1\u1c6b\51\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\4\344\1\u1c6c\50\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\5\344\1\u1c6d\47\344\1\u03d7\1\u03d8\3\344\1\u017c\6\344"+
- "\1\u1c6e\46\344\1\u03d7\1\u03d8\3\344\1\u017c\7\344\1\u1c6f"+
- "\45\344\1\u03d7\1\u03d8\3\344\1\u017c\10\344\1\u1c70\44\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\11\344\1\u1c71\42\344\1\276"+
- "\1\300\1\u02bf\3\276\1\u1c72\55\276\1\300\1\u02bf\4\276"+
- "\1\u1c73\54\276\1\300\1\u02bf\5\276\1\u1c74\53\276\1\300"+
- "\1\u02bf\6\276\1\u1c75\52\276\1\300\1\u02bf\7\276\1\u1c76"+
- "\51\276\1\300\1\u02bf\10\276\1\u1c77\50\276\1\300\1\u02bf"+
- "\11\276\1\u1c78\47\276\1\300\1\u02bf\12\276\1\u1c79\46\276"+
- "\1\300\1\u02bf\13\276\1\u1c7a\45\276\1\300\1\u02bf\14\276"+
- "\1\u1c7b\44\276\1\300\1\u02bf\15\276\1\u1c7c\42\276\1\0"+
- "\2\u0381\1\0\1\u1c7d\57\0\2\u0381\2\0\1\u1c7e\56\0"+
- "\2\u0381\3\0\1\u1c7f\55\0\2\u0381\4\0\1\u1c80\54\0"+
- "\2\u0381\5\0\1\u1c81\53\0\2\u0381\6\0\1\u1c82\52\0"+
- "\2\u0381\7\0\1\u1c83\51\0\2\u0381\10\0\1\u1c84\50\0"+
- "\2\u0381\11\0\1\u1c85\47\0\2\u0381\12\0\1\u1c86\46\0"+
- "\2\u0381\13\0\1\u1c87\45\0\2\u0381\14\0\1\u1c88\44\0"+
- "\2\u0381\15\0\1\u1c89\43\0\1\u0311\1\u0312\1\0\1\u1c8a"+
- "\57\0\1\u0311\1\u0312\2\0\1\u1c8b\56\0\1\u0311\1\u0312"+
- "\3\0\1\u1c8c\55\0\1\u0311\1\u0312\4\0\1\u1c8d\54\0"+
- "\1\u0311\1\u0312\5\0\1\u1c8e\53\0\1\u0311\1\u0312\6\0"+
- "\1\u1c8f\52\0\1\u0311\1\u0312\7\0\1\u1c90\51\0\1\u0311"+
- "\1\u0312\10\0\1\u1c91\50\0\1\u0311\1\u0312\11\0\1\u1c92"+
- "\47\0\1\u0311\1\u0312\12\0\1\u1c93\46\0\1\u0311\1\u0312"+
- "\13\0\1\u1c94\45\0\1\u0311\1\u0312\14\0\1\u1c95\44\0"+
- "\1\u0311\1\u0312\15\0\1\u1c96\43\0\2\u039d\1\0\1\u1c97"+
- "\57\0\2\u039d\2\0\1\u1c98\56\0\2\u039d\3\0\1\u1c99"+
- "\55\0\2\u039d\4\0\1\u1c9a\54\0\2\u039d\5\0\1\u1c9b"+
- "\53\0\2\u039d\6\0\1\u1c9c\52\0\2\u039d\7\0\1\u1c9d"+
- "\51\0\2\u039d\10\0\1\u1c9e\50\0\2\u039d\11\0\1\u1c9f"+
- "\47\0\2\u039d\12\0\1\u1ca0\46\0\2\u039d\13\0\1\u1ca1"+
- "\45\0\2\u039d\14\0\1\u1ca2\44\0\2\u039d\15\0\1\u1ca3"+
- "\42\0\1\276\1\u03ab\1\u03ac\1\276\1\u1ca4\57\276\1\u03ab"+
- "\1\u03ac\2\276\1\u1ca5\56\276\1\u03ab\1\u03ac\3\276\1\u1ca6"+
- "\55\276\1\u03ab\1\u03ac\4\276\1\u1ca7\54\276\1\u03ab\1\u03ac"+
- "\5\276\1\u1ca8\53\276\1\u03ab\1\u03ac\6\276\1\u1ca9\52\276"+
- "\1\u03ab\1\u03ac\7\276\1\u1caa\51\276\1\u03ab\1\u03ac\10\276"+
- "\1\u1cab\50\276\1\u03ab\1\u03ac\11\276\1\u1cac\47\276\1\u03ab"+
- "\1\u03ac\12\276\1\u1cad\46\276\1\u03ab\1\u03ac\13\276\1\u1cae"+
- "\45\276\1\u03ab\1\u03ac\14\276\1\u1caf\44\276\1\u03ab\1\u03ac"+
- "\15\276\1\u1cb0\43\276\1\u033b\1\u033c\1\276\1\u1cb1\57\276"+
- "\1\u033b\1\u033c\2\276\1\u1cb2\56\276\1\u033b\1\u033c\3\276"+
- "\1\u1cb3\55\276\1\u033b\1\u033c\4\276\1\u1cb4\54\276\1\u033b"+
- "\1\u033c\5\276\1\u1cb5\53\276\1\u033b\1\u033c\6\276\1\u1cb6"+
- "\52\276\1\u033b\1\u033c\7\276\1\u1cb7\51\276\1\u033b\1\u033c"+
- "\10\276\1\u1cb8\50\276\1\u033b\1\u033c\11\276\1\u1cb9\47\276"+
- "\1\u033b\1\u033c\12\276\1\u1cba\46\276\1\u033b\1\u033c\13\276"+
- "\1\u1cbb\45\276\1\u033b\1\u033c\14\276\1\u1cbc\44\276\1\u033b"+
- "\1\u033c\15\276\1\u1cbd\43\276\1\300\1\u02bf\1\276\1\u1cbe"+
- "\57\276\1\300\1\u02bf\2\276\1\u1cbf\55\276\1\263\1\u03c9"+
- "\1\u03ca\1\263\1\u1cc0\1\263\1\u0136\55\263\1\u03c9\1\u03ca"+
- "\2\263\1\u1cc1\1\u0136\55\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\1\u1cc2\54\263\1\u03c9\1\u03ca\3\263\1\u0136\1\263\1\u1cc3"+
- "\53\263\1\u03c9\1\u03ca\3\263\1\u0136\2\263\1\u1cc4\52\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\3\263\1\u1cc5\51\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\4\263\1\u1cc6\50\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\5\263\1\u1cc7\47\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\6\263\1\u1cc8\46\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\7\263\1\u1cc9\45\263\1\u03c9\1\u03ca\3\263\1\u0136\10\263"+
- "\1\u1cca\44\263\1\u03c9\1\u03ca\3\263\1\u0136\11\263\1\u1ccb"+
- "\42\263\1\344\1\u03d7\1\u03d8\1\344\1\u1ccc\1\344\1\u017c"+
- "\55\344\1\u03d7\1\u03d8\2\344\1\u1ccd\1\u017c\55\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\1\u1cce\54\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\1\344\1\u1ccf\53\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\2\344\1\u1cd0\52\344\1\u03d7\1\u03d8\3\344\1\u017c\3\344"+
- "\1\u1cd1\51\344\1\u03d7\1\u03d8\3\344\1\u017c\4\344\1\u1cd2"+
- "\50\344\1\u03d7\1\u03d8\3\344\1\u017c\5\344\1\u1cd3\47\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\6\344\1\u1cd4\46\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\7\344\1\u1cd5\45\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\10\344\1\u1cd6\44\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\11\344\1\u1cd7\42\344\1\276\1\300\1\u02bf\3\276"+
- "\1\u1cd8\55\276\1\300\1\u02bf\4\276\1\u1cd9\54\276\1\300"+
- "\1\u02bf\5\276\1\u1cda\53\276\1\300\1\u02bf\6\276\1\u1cdb"+
- "\52\276\1\300\1\u02bf\7\276\1\u1cdc\51\276\1\300\1\u02bf"+
- "\10\276\1\u1cdd\50\276\1\300\1\u02bf\11\276\1\u1cde\47\276"+
- "\1\300\1\u02bf\12\276\1\u1cdf\46\276\1\300\1\u02bf\13\276"+
- "\1\u1ce0\45\276\1\300\1\u02bf\14\276\1\u1ce1\44\276\1\300"+
- "\1\u02bf\15\276\1\u1ce2\42\276\1\0\2\u0381\1\0\1\u1ce3"+
- "\57\0\2\u0381\2\0\1\u1ce4\56\0\2\u0381\3\0\1\u1ce5"+
- "\55\0\2\u0381\4\0\1\u1ce6\54\0\2\u0381\5\0\1\u1ce7"+
- "\53\0\2\u0381\6\0\1\u1ce8\52\0\2\u0381\7\0\1\u1ce9"+
- "\51\0\2\u0381\10\0\1\u1cea\50\0\2\u0381\11\0\1\u1ceb"+
- "\47\0\2\u0381\12\0\1\u1cec\46\0\2\u0381\13\0\1\u1ced"+
- "\45\0\2\u0381\14\0\1\u1cee\44\0\2\u0381\15\0\1\u1cef"+
- "\43\0\1\u0311\1\u0312\1\0\1\u1cf0\57\0\1\u0311\1\u0312"+
- "\2\0\1\u1cf1\56\0\1\u0311\1\u0312\3\0\1\u1cf2\55\0"+
- "\1\u0311\1\u0312\4\0\1\u1cf3\54\0\1\u0311\1\u0312\5\0"+
- "\1\u1cf4\53\0\1\u0311\1\u0312\6\0\1\u1cf5\52\0\1\u0311"+
- "\1\u0312\7\0\1\u1cf6\51\0\1\u0311\1\u0312\10\0\1\u1cf7"+
- "\50\0\1\u0311\1\u0312\11\0\1\u1cf8\47\0\1\u0311\1\u0312"+
- "\12\0\1\u1cf9\46\0\1\u0311\1\u0312\13\0\1\u1cfa\45\0"+
- "\1\u0311\1\u0312\14\0\1\u1cfb\44\0\1\u0311\1\u0312\15\0"+
- "\1\u1cfc\43\0\2\u039d\1\0\1\u1cfd\57\0\2\u039d\2\0"+
- "\1\u1cfe\56\0\2\u039d\3\0\1\u1cff\55\0\2\u039d\4\0"+
- "\1\u1d00\54\0\2\u039d\5\0\1\u1d01\53\0\2\u039d\6\0"+
- "\1\u1d02\52\0\2\u039d\7\0\1\u1d03\51\0\2\u039d\10\0"+
- "\1\u1d04\50\0\2\u039d\11\0\1\u1d05\47\0\2\u039d\12\0"+
- "\1\u1d06\46\0\2\u039d\13\0\1\u1d07\45\0\2\u039d\14\0"+
- "\1\u1d08\44\0\2\u039d\15\0\1\u1d09\42\0\1\276\1\u03ab"+
- "\1\u03ac\1\276\1\u1d0a\57\276\1\u03ab\1\u03ac\2\276\1\u1d0b"+
- "\56\276\1\u03ab\1\u03ac\3\276\1\u1d0c\55\276\1\u03ab\1\u03ac"+
- "\4\276\1\u1d0d\54\276\1\u03ab\1\u03ac\5\276\1\u1d0e\53\276"+
- "\1\u03ab\1\u03ac\6\276\1\u1d0f\52\276\1\u03ab\1\u03ac\7\276"+
- "\1\u1d10\51\276\1\u03ab\1\u03ac\10\276\1\u1d11\50\276\1\u03ab"+
- "\1\u03ac\11\276\1\u1d12\47\276\1\u03ab\1\u03ac\12\276\1\u1d13"+
- "\46\276\1\u03ab\1\u03ac\13\276\1\u1d14\45\276\1\u03ab\1\u03ac"+
- "\14\276\1\u1d15\44\276\1\u03ab\1\u03ac\15\276\1\u1d16\43\276"+
- "\1\u033b\1\u033c\1\276\1\u1d17\57\276\1\u033b\1\u033c\2\276"+
- "\1\u1d18\56\276\1\u033b\1\u033c\3\276\1\u1d19\55\276\1\u033b"+
- "\1\u033c\4\276\1\u1d1a\54\276\1\u033b\1\u033c\5\276\1\u1d1b"+
- "\53\276\1\u033b\1\u033c\6\276\1\u1d1c\52\276\1\u033b\1\u033c"+
- "\7\276\1\u1d1d\51\276\1\u033b\1\u033c\10\276\1\u1d1e\50\276"+
- "\1\u033b\1\u033c\11\276\1\u1d1f\47\276\1\u033b\1\u033c\12\276"+
- "\1\u1d20\46\276\1\u033b\1\u033c\13\276\1\u1d21\45\276\1\u033b"+
- "\1\u033c\14\276\1\u1d22\44\276\1\u033b\1\u033c\15\276\1\u1d23"+
- "\43\276\1\300\1\u02bf\1\276\1\u1d24\57\276\1\300\1\u02bf"+
- "\2\276\1\u1d25\55\276\1\263\1\u03c9\1\u03ca\1\263\1\u1d26"+
- "\1\263\1\u0136\55\263\1\u03c9\1\u03ca\2\263\1\u1d27\1\u0136"+
- "\55\263\1\u03c9\1\u03ca\3\263\1\u0136\1\u1d28\54\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\1\263\1\u1d29\53\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\2\263\1\u1d2a\52\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\3\263\1\u1d2b\51\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\4\263\1\u1d2c\50\263\1\u03c9\1\u03ca\3\263\1\u0136\5\263"+
- "\1\u1d2d\47\263\1\u03c9\1\u03ca\3\263\1\u0136\6\263\1\u1d2e"+
- "\46\263\1\u03c9\1\u03ca\3\263\1\u0136\7\263\1\u1d2f\45\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\10\263\1\u1d30\44\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\11\263\1\u1d31\42\263\1\344\1\u03d7"+
- "\1\u03d8\1\344\1\u1d32\1\344\1\u017c\55\344\1\u03d7\1\u03d8"+
- "\2\344\1\u1d33\1\u017c\55\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\1\u1d34\54\344\1\u03d7\1\u03d8\3\344\1\u017c\1\344\1\u1d35"+
- "\53\344\1\u03d7\1\u03d8\3\344\1\u017c\2\344\1\u1d36\52\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\3\344\1\u1d37\51\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\4\344\1\u1d38\50\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\5\344\1\u1d39\47\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\6\344\1\u1d3a\46\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\7\344\1\u1d3b\45\344\1\u03d7\1\u03d8\3\344\1\u017c\10\344"+
- "\1\u1d3c\44\344\1\u03d7\1\u03d8\3\344\1\u017c\11\344\1\u1d3d"+
- "\42\344\1\276\1\300\1\u02bf\3\276\1\u1d3e\55\276\1\300"+
- "\1\u02bf\4\276\1\u1d3f\54\276\1\300\1\u02bf\5\276\1\u1d40"+
- "\53\276\1\300\1\u02bf\6\276\1\u1d41\52\276\1\300\1\u02bf"+
- "\7\276\1\u1d42\51\276\1\300\1\u02bf\10\276\1\u1d43\50\276"+
- "\1\300\1\u02bf\11\276\1\u1d44\47\276\1\300\1\u02bf\12\276"+
- "\1\u1d45\46\276\1\300\1\u02bf\13\276\1\u1d46\45\276\1\300"+
- "\1\u02bf\14\276\1\u1d47\44\276\1\300\1\u02bf\15\276\1\u1d48"+
- "\42\276\1\0\2\u0381\1\0\1\u1d49\57\0\2\u0381\2\0"+
- "\1\u1d4a\56\0\2\u0381\3\0\1\u1d4b\55\0\2\u0381\4\0"+
- "\1\u1d4c\54\0\2\u0381\5\0\1\u1d4d\53\0\2\u0381\6\0"+
- "\1\u1d4e\52\0\2\u0381\7\0\1\u1d4f\51\0\2\u0381\10\0"+
- "\1\u1d50\50\0\2\u0381\11\0\1\u1d51\47\0\2\u0381\12\0"+
- "\1\u1d52\46\0\2\u0381\13\0\1\u1d53\45\0\2\u0381\14\0"+
- "\1\u1d54\44\0\2\u0381\15\0\1\u1d55\43\0\1\u0311\1\u0312"+
- "\1\0\1\u1d56\57\0\1\u0311\1\u0312\2\0\1\u1d57\56\0"+
- "\1\u0311\1\u0312\3\0\1\u1d58\55\0\1\u0311\1\u0312\4\0"+
- "\1\u1d59\54\0\1\u0311\1\u0312\5\0\1\u1d5a\53\0\1\u0311"+
- "\1\u0312\6\0\1\u1d5b\52\0\1\u0311\1\u0312\7\0\1\u1d5c"+
- "\51\0\1\u0311\1\u0312\10\0\1\u1d5d\50\0\1\u0311\1\u0312"+
- "\11\0\1\u1d5e\47\0\1\u0311\1\u0312\12\0\1\u1d5f\46\0"+
- "\1\u0311\1\u0312\13\0\1\u1d60\45\0\1\u0311\1\u0312\14\0"+
- "\1\u1d61\44\0\1\u0311\1\u0312\15\0\1\u1d62\43\0\2\u039d"+
- "\1\0\1\u1d63\57\0\2\u039d\2\0\1\u1d64\56\0\2\u039d"+
- "\3\0\1\u1d65\55\0\2\u039d\4\0\1\u1d66\54\0\2\u039d"+
- "\5\0\1\u1d67\53\0\2\u039d\6\0\1\u1d68\52\0\2\u039d"+
- "\7\0\1\u1d69\51\0\2\u039d\10\0\1\u1d6a\50\0\2\u039d"+
- "\11\0\1\u1d6b\47\0\2\u039d\12\0\1\u1d6c\46\0\2\u039d"+
- "\13\0\1\u1d6d\45\0\2\u039d\14\0\1\u1d6e\44\0\2\u039d"+
- "\15\0\1\u1d6f\42\0\1\276\1\u03ab\1\u03ac\1\276\1\u1d70"+
- "\57\276\1\u03ab\1\u03ac\2\276\1\u1d71\56\276\1\u03ab\1\u03ac"+
- "\3\276\1\u1d72\55\276\1\u03ab\1\u03ac\4\276\1\u1d73\54\276"+
- "\1\u03ab\1\u03ac\5\276\1\u1d74\53\276\1\u03ab\1\u03ac\6\276"+
- "\1\u1d75\52\276\1\u03ab\1\u03ac\7\276\1\u1d76\51\276\1\u03ab"+
- "\1\u03ac\10\276\1\u1d77\50\276\1\u03ab\1\u03ac\11\276\1\u1d78"+
- "\47\276\1\u03ab\1\u03ac\12\276\1\u1d79\46\276\1\u03ab\1\u03ac"+
- "\13\276\1\u1d7a\45\276\1\u03ab\1\u03ac\14\276\1\u1d7b\44\276"+
- "\1\u03ab\1\u03ac\15\276\1\u1d7c\43\276\1\u033b\1\u033c\1\276"+
- "\1\u1d7d\57\276\1\u033b\1\u033c\2\276\1\u1d7e\56\276\1\u033b"+
- "\1\u033c\3\276\1\u1d7f\55\276\1\u033b\1\u033c\4\276\1\u1d80"+
- "\54\276\1\u033b\1\u033c\5\276\1\u1d81\53\276\1\u033b\1\u033c"+
- "\6\276\1\u1d82\52\276\1\u033b\1\u033c\7\276\1\u1d83\51\276"+
- "\1\u033b\1\u033c\10\276\1\u1d84\50\276\1\u033b\1\u033c\11\276"+
- "\1\u1d85\47\276\1\u033b\1\u033c\12\276\1\u1d86\46\276\1\u033b"+
- "\1\u033c\13\276\1\u1d87\45\276\1\u033b\1\u033c\14\276\1\u1d88"+
- "\44\276\1\u033b\1\u033c\15\276\1\u1d89\43\276\1\300\1\u02bf"+
- "\1\276\1\u1d8a\57\276\1\300\1\u02bf\2\276\1\u1d8b\55\276"+
- "\1\263\1\u03c9\1\u03ca\1\263\1\u1d8c\1\263\1\u0136\55\263"+
- "\1\u03c9\1\u03ca\2\263\1\u1d8d\1\u0136\55\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\1\u1d8e\54\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\1\263\1\u1d8f\53\263\1\u03c9\1\u03ca\3\263\1\u0136\2\263"+
- "\1\u1d90\52\263\1\u03c9\1\u03ca\3\263\1\u0136\3\263\1\u1d91"+
- "\51\263\1\u03c9\1\u03ca\3\263\1\u0136\4\263\1\u1d92\50\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\5\263\1\u1d93\47\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\6\263\1\u1d94\46\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\7\263\1\u1d95\45\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\10\263\1\u1d96\44\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\11\263\1\u1d97\42\263\1\344\1\u03d7\1\u03d8\1\344\1\u1d98"+
- "\1\344\1\u017c\55\344\1\u03d7\1\u03d8\2\344\1\u1d99\1\u017c"+
- "\55\344\1\u03d7\1\u03d8\3\344\1\u017c\1\u1d9a\54\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\1\344\1\u1d9b\53\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\2\344\1\u1d9c\52\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\3\344\1\u1d9d\51\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\4\344\1\u1d9e\50\344\1\u03d7\1\u03d8\3\344\1\u017c\5\344"+
- "\1\u1d9f\47\344\1\u03d7\1\u03d8\3\344\1\u017c\6\344\1\u1da0"+
- "\46\344\1\u03d7\1\u03d8\3\344\1\u017c\7\344\1\u1da1\45\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\10\344\1\u1da2\44\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\11\344\1\u1da3\42\344\1\276\1\300"+
- "\1\u02bf\3\276\1\u1da4\55\276\1\300\1\u02bf\4\276\1\u1da5"+
- "\54\276\1\300\1\u02bf\5\276\1\u1da6\53\276\1\300\1\u02bf"+
- "\6\276\1\u1da7\52\276\1\300\1\u02bf\7\276\1\u1da8\51\276"+
- "\1\300\1\u02bf\10\276\1\u1da9\50\276\1\300\1\u02bf\11\276"+
- "\1\u1daa\47\276\1\300\1\u02bf\12\276\1\u1dab\46\276\1\300"+
- "\1\u02bf\13\276\1\u1dac\45\276\1\300\1\u02bf\14\276\1\u1dad"+
- "\44\276\1\300\1\u02bf\15\276\1\u1dae\42\276\1\0\2\u0381"+
- "\1\0\1\u1daf\57\0\2\u0381\2\0\1\u1db0\56\0\2\u0381"+
- "\3\0\1\u1db1\55\0\2\u0381\4\0\1\u1db2\54\0\2\u0381"+
- "\5\0\1\u1db3\53\0\2\u0381\6\0\1\u1db4\52\0\2\u0381"+
- "\7\0\1\u1db5\51\0\2\u0381\10\0\1\u1db6\50\0\2\u0381"+
- "\11\0\1\u1db7\47\0\2\u0381\12\0\1\u1db8\46\0\2\u0381"+
- "\13\0\1\u1db9\45\0\2\u0381\14\0\1\u1dba\44\0\2\u0381"+
- "\15\0\1\u1dbb\43\0\1\u0311\1\u0312\1\0\1\u1dbc\57\0"+
- "\1\u0311\1\u0312\2\0\1\u1dbd\56\0\1\u0311\1\u0312\3\0"+
- "\1\u1dbe\55\0\1\u0311\1\u0312\4\0\1\u1dbf\54\0\1\u0311"+
- "\1\u0312\5\0\1\u1dc0\53\0\1\u0311\1\u0312\6\0\1\u1dc1"+
- "\52\0\1\u0311\1\u0312\7\0\1\u1dc2\51\0\1\u0311\1\u0312"+
- "\10\0\1\u1dc3\50\0\1\u0311\1\u0312\11\0\1\u1dc4\47\0"+
- "\1\u0311\1\u0312\12\0\1\u1dc5\46\0\1\u0311\1\u0312\13\0"+
- "\1\u1dc6\45\0\1\u0311\1\u0312\14\0\1\u1dc7\44\0\1\u0311"+
- "\1\u0312\15\0\1\u1dc8\43\0\2\u039d\1\0\1\u1dc9\57\0"+
- "\2\u039d\2\0\1\u1dca\56\0\2\u039d\3\0\1\u1dcb\55\0"+
- "\2\u039d\4\0\1\u1dcc\54\0\2\u039d\5\0\1\u1dcd\53\0"+
- "\2\u039d\6\0\1\u1dce\52\0\2\u039d\7\0\1\u1dcf\51\0"+
- "\2\u039d\10\0\1\u1dd0\50\0\2\u039d\11\0\1\u1dd1\47\0"+
- "\2\u039d\12\0\1\u1dd2\46\0\2\u039d\13\0\1\u1dd3\45\0"+
- "\2\u039d\14\0\1\u1dd4\44\0\2\u039d\15\0\1\u1dd5\42\0"+
- "\1\276\1\u03ab\1\u03ac\1\276\1\u1dd6\57\276\1\u03ab\1\u03ac"+
- "\2\276\1\u1dd7\56\276\1\u03ab\1\u03ac\3\276\1\u1dd8\55\276"+
- "\1\u03ab\1\u03ac\4\276\1\u1dd9\54\276\1\u03ab\1\u03ac\5\276"+
- "\1\u1dda\53\276\1\u03ab\1\u03ac\6\276\1\u1ddb\52\276\1\u03ab"+
- "\1\u03ac\7\276\1\u1ddc\51\276\1\u03ab\1\u03ac\10\276\1\u1ddd"+
- "\50\276\1\u03ab\1\u03ac\11\276\1\u1dde\47\276\1\u03ab\1\u03ac"+
- "\12\276\1\u1ddf\46\276\1\u03ab\1\u03ac\13\276\1\u1de0\45\276"+
- "\1\u03ab\1\u03ac\14\276\1\u1de1\44\276\1\u03ab\1\u03ac\15\276"+
- "\1\u1de2\43\276\1\u033b\1\u033c\1\276\1\u1de3\57\276\1\u033b"+
- "\1\u033c\2\276\1\u1de4\56\276\1\u033b\1\u033c\3\276\1\u1de5"+
- "\55\276\1\u033b\1\u033c\4\276\1\u1de6\54\276\1\u033b\1\u033c"+
- "\5\276\1\u1de7\53\276\1\u033b\1\u033c\6\276\1\u1de8\52\276"+
- "\1\u033b\1\u033c\7\276\1\u1de9\51\276\1\u033b\1\u033c\10\276"+
- "\1\u1dea\50\276\1\u033b\1\u033c\11\276\1\u1deb\47\276\1\u033b"+
- "\1\u033c\12\276\1\u1dec\46\276\1\u033b\1\u033c\13\276\1\u1ded"+
- "\45\276\1\u033b\1\u033c\14\276\1\u1dee\44\276\1\u033b\1\u033c"+
- "\15\276\1\u1def\43\276\1\300\1\u02bf\1\276\1\u1df0\57\276"+
- "\1\300\1\u02bf\2\276\1\u1df1\55\276\1\263\1\u03c9\1\u03ca"+
- "\1\263\1\u1df2\1\263\1\u0136\55\263\1\u03c9\1\u03ca\2\263"+
- "\1\u1df3\1\u0136\55\263\1\u03c9\1\u03ca\3\263\1\u0136\1\u1df4"+
- "\54\263\1\u03c9\1\u03ca\3\263\1\u0136\1\263\1\u1df5\53\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\2\263\1\u1df6\52\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\3\263\1\u1df7\51\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\4\263\1\u1df8\50\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\5\263\1\u1df9\47\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\6\263\1\u1dfa\46\263\1\u03c9\1\u03ca\3\263\1\u0136\7\263"+
- "\1\u1dfb\45\263\1\u03c9\1\u03ca\3\263\1\u0136\10\263\1\u1dfc"+
- "\44\263\1\u03c9\1\u03ca\3\263\1\u0136\11\263\1\u1dfd\42\263"+
- "\1\344\1\u03d7\1\u03d8\1\344\1\u1dfe\1\344\1\u017c\55\344"+
- "\1\u03d7\1\u03d8\2\344\1\u1dff\1\u017c\55\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\1\u1e00\54\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\1\344\1\u1e01\53\344\1\u03d7\1\u03d8\3\344\1\u017c\2\344"+
- "\1\u1e02\52\344\1\u03d7\1\u03d8\3\344\1\u017c\3\344\1\u1e03"+
- "\51\344\1\u03d7\1\u03d8\3\344\1\u017c\4\344\1\u1e04\50\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\5\344\1\u1e05\47\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\6\344\1\u1e06\46\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\7\344\1\u1e07\45\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\10\344\1\u1e08\44\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\11\344\1\u1e09\42\344\1\276\1\300\1\u02bf\3\276\1\u1e0a"+
- "\55\276\1\300\1\u02bf\4\276\1\u1e0b\54\276\1\300\1\u02bf"+
- "\5\276\1\u1e0c\53\276\1\300\1\u02bf\6\276\1\u1e0d\52\276"+
- "\1\300\1\u02bf\7\276\1\u1e0e\51\276\1\300\1\u02bf\10\276"+
- "\1\u1e0f\50\276\1\300\1\u02bf\11\276\1\u1e10\47\276\1\300"+
- "\1\u02bf\12\276\1\u1e11\46\276\1\300\1\u02bf\13\276\1\u1e12"+
- "\45\276\1\300\1\u02bf\14\276\1\u1e13\44\276\1\300\1\u02bf";
+ "\1\u0bcc\10\0\1\u0386\41\0\2\u0384\7\0\1\u0bcd\7\0"+
+ "\1\u0386\41\0\2\u0384\10\0\1\u0bce\6\0\1\u0386\41\0"+
+ "\2\u0384\11\0\1\u0bcf\5\0\1\u0386\41\0\2\u0384\12\0"+
+ "\1\u0bd0\4\0\1\u0386\41\0\2\u0384\13\0\1\u0bd1\3\0"+
+ "\1\u0386\41\0\2\u0384\14\0\1\u0bd2\2\0\1\u0386\41\0"+
+ "\2\u0384\15\0\1\u0bd3\1\0\1\u0386\41\0\1\u0312\1\u0313"+
+ "\1\0\1\u0bd4\15\0\1\u0315\41\0\1\u0312\1\u0313\2\0"+
+ "\1\u0bd5\14\0\1\u0315\41\0\1\u0312\1\u0313\3\0\1\u0bd6"+
+ "\13\0\1\u0315\41\0\1\u0312\1\u0313\4\0\1\u0bd7\12\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\5\0\1\u0bd8\11\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\6\0\1\u0bd9\10\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\7\0\1\u0bda\7\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\10\0\1\u0bdb\6\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\11\0\1\u0bdc\5\0\1\u0315\41\0\1\u0312\1\u0313\12\0"+
+ "\1\u0bdd\4\0\1\u0315\41\0\1\u0312\1\u0313\13\0\1\u0bde"+
+ "\3\0\1\u0315\41\0\1\u0312\1\u0313\14\0\1\u0bdf\2\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\15\0\1\u0be0\1\0\1\u0315"+
+ "\41\0\2\u03a1\1\0\1\u0be1\15\0\1\u03a3\41\0\2\u03a1"+
+ "\2\0\1\u0be2\14\0\1\u03a3\41\0\2\u03a1\3\0\1\u0be3"+
+ "\13\0\1\u03a3\41\0\2\u03a1\4\0\1\u0be4\12\0\1\u03a3"+
+ "\41\0\2\u03a1\5\0\1\u0be5\11\0\1\u03a3\41\0\2\u03a1"+
+ "\6\0\1\u0be6\10\0\1\u03a3\41\0\2\u03a1\7\0\1\u0be7"+
+ "\7\0\1\u03a3\41\0\2\u03a1\10\0\1\u0be8\6\0\1\u03a3"+
+ "\41\0\2\u03a1\11\0\1\u0be9\5\0\1\u03a3\41\0\2\u03a1"+
+ "\12\0\1\u0bea\4\0\1\u03a3\41\0\2\u03a1\13\0\1\u0beb"+
+ "\3\0\1\u03a3\41\0\2\u03a1\14\0\1\u0bec\2\0\1\u03a3"+
+ "\41\0\2\u03a1\15\0\1\u0bed\1\0\1\u03a3\40\0\1\276"+
+ "\1\u03b0\1\u03b1\1\276\1\u0bee\15\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\2\276\1\u0bef\14\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\3\276\1\u0bf0\13\276\1\u03b3\41\276\1\u03b0\1\u03b1\4\276"+
+ "\1\u0bf1\12\276\1\u03b3\41\276\1\u03b0\1\u03b1\5\276\1\u0bf2"+
+ "\11\276\1\u03b3\41\276\1\u03b0\1\u03b1\6\276\1\u0bf3\10\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\7\276\1\u0bf4\7\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\10\276\1\u0bf5\6\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\11\276\1\u0bf6\5\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\12\276\1\u0bf7\4\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\13\276\1\u0bf8\3\276\1\u03b3\41\276\1\u03b0\1\u03b1\14\276"+
+ "\1\u0bf9\2\276\1\u03b3\41\276\1\u03b0\1\u03b1\15\276\1\u0bfa"+
+ "\1\276\1\u03b3\41\276\1\u033d\1\u033e\1\276\1\u0bfb\15\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\2\276\1\u0bfc\14\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\3\276\1\u0bfd\13\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\4\276\1\u0bfe\12\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\5\276\1\u0bff\11\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\6\276\1\u0c00\10\276\1\u0340\41\276\1\u033d\1\u033e\7\276"+
+ "\1\u0c01\7\276\1\u0340\41\276\1\u033d\1\u033e\10\276\1\u0c02"+
+ "\6\276\1\u0340\41\276\1\u033d\1\u033e\11\276\1\u0c03\5\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\12\276\1\u0c04\4\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\13\276\1\u0c05\3\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\14\276\1\u0c06\2\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\15\276\1\u0c07\1\276\1\u0340\41\276\1\300\1\u02bf"+
+ "\1\276\1\u0c08\15\276\1\u02c1\41\276\1\300\1\u02bf\2\276"+
+ "\1\u0c09\14\276\1\u02c1\40\276\1\263\1\u03cf\1\u03d0\1\263"+
+ "\1\u0c0a\1\263\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\2\263\1\u0c0b\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\1\u0c0c\12\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\1\263\1\u0c0d\11\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\2\263\1\u0c0e\10\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\3\263\1\u0c0f\7\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\4\263\1\u0c10\6\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\5\263\1\u0c11"+
+ "\5\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\6\263"+
+ "\1\u0c12\4\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\7\263\1\u0c13\3\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\10\263\1\u0c14\2\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\11\263\1\u0c15\1\263\1\u03d2\40\263\1\344"+
+ "\1\u03de\1\u03df\1\344\1\u0c16\1\344\1\u017c\13\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\2\344\1\u0c17\1\u017c\13\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\1\u0c18\12\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\1\344\1\u0c19\11\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\2\344\1\u0c1a"+
+ "\10\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\3\344"+
+ "\1\u0c1b\7\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\4\344\1\u0c1c\6\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\5\344\1\u0c1d\5\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\6\344\1\u0c1e\4\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\7\344\1\u0c1f\3\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\10\344\1\u0c20\2\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\11\344\1\u0c21\1\344"+
+ "\1\u03e1\40\344\1\276\1\300\1\u02bf\3\276\1\u0c22\13\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\4\276\1\u0c23\12\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\5\276\1\u0c24\11\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\6\276\1\u0c25\10\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\7\276\1\u0c26\7\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\10\276\1\u0c27\6\276\1\u02c1\41\276\1\300\1\u02bf\11\276"+
+ "\1\u0c28\5\276\1\u02c1\41\276\1\300\1\u02bf\12\276\1\u0c29"+
+ "\4\276\1\u02c1\41\276\1\300\1\u02bf\13\276\1\u0c2a\3\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\14\276\1\u0c2b\2\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\15\276\1\u0c2c\1\276\1\u02c1\40\276"+
+ "\5\0\1\164\1\0\1\165\14\0\1\164\1\u0c2d\25\164"+
+ "\3\0\1\164\1\0\1\164\3\0\2\u0384\1\0\1\u0c2e"+
+ "\15\0\1\u0386\41\0\2\u0384\2\0\1\u0c2f\14\0\1\u0386"+
+ "\41\0\2\u0384\3\0\1\u0c30\13\0\1\u0386\41\0\2\u0384"+
+ "\4\0\1\u0c31\12\0\1\u0386\41\0\2\u0384\5\0\1\u0c32"+
+ "\11\0\1\u0386\41\0\2\u0384\6\0\1\u0c33\10\0\1\u0386"+
+ "\41\0\2\u0384\7\0\1\u0c34\7\0\1\u0386\41\0\2\u0384"+
+ "\10\0\1\u0c35\6\0\1\u0386\41\0\2\u0384\11\0\1\u0c36"+
+ "\5\0\1\u0386\41\0\2\u0384\12\0\1\u0c37\4\0\1\u0386"+
+ "\41\0\2\u0384\13\0\1\u0c38\3\0\1\u0386\41\0\2\u0384"+
+ "\14\0\1\u0c39\2\0\1\u0386\41\0\2\u0384\15\0\1\u0c3a"+
+ "\1\0\1\u0386\41\0\1\u0312\1\u0313\1\0\1\u0c3b\15\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\2\0\1\u0c3c\14\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\3\0\1\u0c3d\13\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\4\0\1\u0c3e\12\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\5\0\1\u0c3f\11\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\6\0\1\u0c40\10\0\1\u0315\41\0\1\u0312\1\u0313\7\0"+
+ "\1\u0c41\7\0\1\u0315\41\0\1\u0312\1\u0313\10\0\1\u0c42"+
+ "\6\0\1\u0315\41\0\1\u0312\1\u0313\11\0\1\u0c43\5\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\12\0\1\u0c44\4\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\13\0\1\u0c45\3\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\14\0\1\u0c46\2\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\15\0\1\u0c47\1\0\1\u0315\41\0\2\u03a1\1\0"+
+ "\1\u0c48\15\0\1\u03a3\41\0\2\u03a1\2\0\1\u0c49\14\0"+
+ "\1\u03a3\41\0\2\u03a1\3\0\1\u0c4a\13\0\1\u03a3\41\0"+
+ "\2\u03a1\4\0\1\u0c4b\12\0\1\u03a3\41\0\2\u03a1\5\0"+
+ "\1\u0c4c\11\0\1\u03a3\41\0\2\u03a1\6\0\1\u0c4d\10\0"+
+ "\1\u03a3\41\0\2\u03a1\7\0\1\u0c4e\7\0\1\u03a3\41\0"+
+ "\2\u03a1\10\0\1\u0c4f\6\0\1\u03a3\41\0\2\u03a1\11\0"+
+ "\1\u0c50\5\0\1\u03a3\41\0\2\u03a1\12\0\1\u0c51\4\0"+
+ "\1\u03a3\41\0\2\u03a1\13\0\1\u0c52\3\0\1\u03a3\41\0"+
+ "\2\u03a1\14\0\1\u0c53\2\0\1\u03a3\41\0\2\u03a1\15\0"+
+ "\1\u0c54\1\0\1\u03a3\40\0\1\276\1\u03b0\1\u03b1\1\276"+
+ "\1\u0c55\15\276\1\u03b3\41\276\1\u03b0\1\u03b1\2\276\1\u0c56"+
+ "\14\276\1\u03b3\41\276\1\u03b0\1\u03b1\3\276\1\u0c57\13\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\4\276\1\u0c58\12\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\5\276\1\u0c59\11\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\6\276\1\u0c5a\10\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\7\276\1\u0c5b\7\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\10\276\1\u0c5c\6\276\1\u03b3\41\276\1\u03b0\1\u03b1\11\276"+
+ "\1\u0c5d\5\276\1\u03b3\41\276\1\u03b0\1\u03b1\12\276\1\u0c5e"+
+ "\4\276\1\u03b3\41\276\1\u03b0\1\u03b1\13\276\1\u0c5f\3\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\14\276\1\u0c60\2\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\15\276\1\u0c61\1\276\1\u03b3\41\276"+
+ "\1\u033d\1\u033e\1\276\1\u0c62\15\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\2\276\1\u0c63\14\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\3\276\1\u0c64\13\276\1\u0340\41\276\1\u033d\1\u033e\4\276"+
+ "\1\u0c65\12\276\1\u0340\41\276\1\u033d\1\u033e\5\276\1\u0c66"+
+ "\11\276\1\u0340\41\276\1\u033d\1\u033e\6\276\1\u0c67\10\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\7\276\1\u0c68\7\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\10\276\1\u0c69\6\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\11\276\1\u0c6a\5\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\12\276\1\u0c6b\4\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\13\276\1\u0c6c\3\276\1\u0340\41\276\1\u033d\1\u033e\14\276"+
+ "\1\u0c6d\2\276\1\u0340\41\276\1\u033d\1\u033e\15\276\1\u0c6e"+
+ "\1\276\1\u0340\41\276\1\300\1\u02bf\1\276\1\u0c6f\15\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\2\276\1\u0c70\14\276\1\u02c1"+
+ "\40\276\1\263\1\u03cf\1\u03d0\1\263\1\u0c71\1\263\1\u0136"+
+ "\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\2\263\1\u0c72\1\u0136"+
+ "\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\u0c73"+
+ "\12\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\263"+
+ "\1\u0c74\11\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\2\263\1\u0c75\10\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\3\263\1\u0c76\7\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\4\263\1\u0c77\6\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\5\263\1\u0c78\5\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\6\263\1\u0c79\4\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\7\263\1\u0c7a\3\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\10\263\1\u0c7b"+
+ "\2\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\11\263"+
+ "\1\u0c7c\1\263\1\u03d2\40\263\1\344\1\u03de\1\u03df\1\344"+
+ "\1\u0c7d\1\344\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\2\344\1\u0c7e\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\1\u0c7f\12\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\1\344\1\u0c80\11\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\2\344\1\u0c81\10\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\3\344\1\u0c82\7\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\4\344\1\u0c83\6\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\5\344\1\u0c84"+
+ "\5\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\6\344"+
+ "\1\u0c85\4\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\7\344\1\u0c86\3\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\10\344\1\u0c87\2\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\11\344\1\u0c88\1\344\1\u03e1\40\344\1\276"+
+ "\1\300\1\u02bf\3\276\1\u0c89\13\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\4\276\1\u0c8a\12\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\5\276\1\u0c8b\11\276\1\u02c1\41\276\1\300\1\u02bf\6\276"+
+ "\1\u0c8c\10\276\1\u02c1\41\276\1\300\1\u02bf\7\276\1\u0c8d"+
+ "\7\276\1\u02c1\41\276\1\300\1\u02bf\10\276\1\u0c8e\6\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\11\276\1\u0c8f\5\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\12\276\1\u0c90\4\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\13\276\1\u0c91\3\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\14\276\1\u0c92\2\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\15\276\1\u0c93\1\276\1\u02c1\40\276\5\0\1\164\1\0"+
+ "\1\165\14\0\4\164\1\u0c94\22\164\3\0\1\164\1\0"+
+ "\1\164\3\0\2\u0384\1\0\1\u0c95\15\0\1\u0386\41\0"+
+ "\2\u0384\2\0\1\u0c96\14\0\1\u0386\41\0\2\u0384\3\0"+
+ "\1\u0c97\13\0\1\u0386\41\0\2\u0384\4\0\1\u0c98\12\0"+
+ "\1\u0386\41\0\2\u0384\5\0\1\u0c99\11\0\1\u0386\41\0"+
+ "\2\u0384\6\0\1\u0c9a\10\0\1\u0386\41\0\2\u0384\7\0"+
+ "\1\u0c9b\7\0\1\u0386\41\0\2\u0384\10\0\1\u0c9c\6\0"+
+ "\1\u0386\41\0\2\u0384\11\0\1\u0c9d\5\0\1\u0386\41\0"+
+ "\2\u0384\12\0\1\u0c9e\4\0\1\u0386\41\0\2\u0384\13\0"+
+ "\1\u0c9f\3\0\1\u0386\41\0\2\u0384\14\0\1\u0ca0\2\0"+
+ "\1\u0386\41\0\2\u0384\15\0\1\u0ca1\1\0\1\u0386\41\0"+
+ "\1\u0312\1\u0313\1\0\1\u0ca2\15\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\2\0\1\u0ca3\14\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\3\0\1\u0ca4\13\0\1\u0315\41\0\1\u0312\1\u0313\4\0"+
+ "\1\u0ca5\12\0\1\u0315\41\0\1\u0312\1\u0313\5\0\1\u0ca6"+
+ "\11\0\1\u0315\41\0\1\u0312\1\u0313\6\0\1\u0ca7\10\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\7\0\1\u0ca8\7\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\10\0\1\u0ca9\6\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\11\0\1\u0caa\5\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\12\0\1\u0cab\4\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\13\0\1\u0cac\3\0\1\u0315\41\0\1\u0312\1\u0313\14\0"+
+ "\1\u0cad\2\0\1\u0315\41\0\1\u0312\1\u0313\15\0\1\u0cae"+
+ "\1\0\1\u0315\41\0\2\u03a1\1\0\1\u0caf\15\0\1\u03a3"+
+ "\41\0\2\u03a1\2\0\1\u0cb0\14\0\1\u03a3\41\0\2\u03a1"+
+ "\3\0\1\u0cb1\13\0\1\u03a3\41\0\2\u03a1\4\0\1\u0cb2"+
+ "\12\0\1\u03a3\41\0\2\u03a1\5\0\1\u0cb3\11\0\1\u03a3"+
+ "\41\0\2\u03a1\6\0\1\u0cb4\10\0\1\u03a3\41\0\2\u03a1"+
+ "\7\0\1\u0cb5\7\0\1\u03a3\41\0\2\u03a1\10\0\1\u0cb6"+
+ "\6\0\1\u03a3\41\0\2\u03a1\11\0\1\u0cb7\5\0\1\u03a3"+
+ "\41\0\2\u03a1\12\0\1\u0cb8\4\0\1\u03a3\41\0\2\u03a1"+
+ "\13\0\1\u0cb9\3\0\1\u03a3\41\0\2\u03a1\14\0\1\u0cba"+
+ "\2\0\1\u03a3\41\0\2\u03a1\15\0\1\u0cbb\1\0\1\u03a3"+
+ "\40\0\1\276\1\u03b0\1\u03b1\1\276\1\u0cbc\15\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\2\276\1\u0cbd\14\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\3\276\1\u0cbe\13\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\4\276\1\u0cbf\12\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\5\276\1\u0cc0\11\276\1\u03b3\41\276\1\u03b0\1\u03b1\6\276"+
+ "\1\u0cc1\10\276\1\u03b3\41\276\1\u03b0\1\u03b1\7\276\1\u0cc2"+
+ "\7\276\1\u03b3\41\276\1\u03b0\1\u03b1\10\276\1\u0cc3\6\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\11\276\1\u0cc4\5\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\12\276\1\u0cc5\4\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\13\276\1\u0cc6\3\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\14\276\1\u0cc7\2\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\15\276\1\u0cc8\1\276\1\u03b3\41\276\1\u033d\1\u033e\1\276"+
+ "\1\u0cc9\15\276\1\u0340\41\276\1\u033d\1\u033e\2\276\1\u0cca"+
+ "\14\276\1\u0340\41\276\1\u033d\1\u033e\3\276\1\u0ccb\13\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\4\276\1\u0ccc\12\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\5\276\1\u0ccd\11\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\6\276\1\u0cce\10\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\7\276\1\u0ccf\7\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\10\276\1\u0cd0\6\276\1\u0340\41\276\1\u033d\1\u033e\11\276"+
+ "\1\u0cd1\5\276\1\u0340\41\276\1\u033d\1\u033e\12\276\1\u0cd2"+
+ "\4\276\1\u0340\41\276\1\u033d\1\u033e\13\276\1\u0cd3\3\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\14\276\1\u0cd4\2\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\15\276\1\u0cd5\1\276\1\u0340\41\276"+
+ "\1\300\1\u02bf\1\276\1\u0cd6\15\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\2\276\1\u0cd7\14\276\1\u02c1\40\276\1\263\1\u03cf"+
+ "\1\u03d0\1\263\1\u0cd8\1\263\1\u0136\13\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\2\263\1\u0cd9\1\u0136\13\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\1\u0cda\12\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\1\263\1\u0cdb\11\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\2\263\1\u0cdc\10\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\3\263\1\u0cdd"+
+ "\7\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\4\263"+
+ "\1\u0cde\6\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\5\263\1\u0cdf\5\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\6\263\1\u0ce0\4\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\7\263\1\u0ce1\3\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\10\263\1\u0ce2\2\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\11\263\1\u0ce3\1\263\1\u03d2"+
+ "\40\263\1\344\1\u03de\1\u03df\1\344\1\u0ce4\1\344\1\u017c"+
+ "\13\344\1\u03e1\41\344\1\u03de\1\u03df\2\344\1\u0ce5\1\u017c"+
+ "\13\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\1\u0ce6"+
+ "\12\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\1\344"+
+ "\1\u0ce7\11\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\2\344\1\u0ce8\10\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\3\344\1\u0ce9\7\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\4\344\1\u0cea\6\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\5\344\1\u0ceb\5\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\6\344\1\u0cec\4\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\7\344\1\u0ced\3\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\10\344\1\u0cee"+
+ "\2\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\11\344"+
+ "\1\u0cef\1\344\1\u03e1\40\344\1\276\1\300\1\u02bf\3\276"+
+ "\1\u0cf0\13\276\1\u02c1\41\276\1\300\1\u02bf\4\276\1\u0cf1"+
+ "\12\276\1\u02c1\41\276\1\300\1\u02bf\5\276\1\u0cf2\11\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\6\276\1\u0cf3\10\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\7\276\1\u0cf4\7\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\10\276\1\u0cf5\6\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\11\276\1\u0cf6\5\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\12\276\1\u0cf7\4\276\1\u02c1\41\276\1\300\1\u02bf\13\276"+
+ "\1\u0cf8\3\276\1\u02c1\41\276\1\300\1\u02bf\14\276\1\u0cf9"+
+ "\2\276\1\u02c1\41\276\1\300\1\u02bf\15\276\1\u0cfa\1\276"+
+ "\1\u02c1\40\276\5\0\1\164\1\0\1\165\14\0\24\164"+
+ "\1\u03fb\2\164\3\0\1\164\1\0\1\164\3\0\2\u0384"+
+ "\1\0\1\u0cfb\15\0\1\u0386\41\0\2\u0384\2\0\1\u0cfc"+
+ "\14\0\1\u0386\41\0\2\u0384\3\0\1\u0cfd\13\0\1\u0386"+
+ "\41\0\2\u0384\4\0\1\u0cfe\12\0\1\u0386\41\0\2\u0384"+
+ "\5\0\1\u0cff\11\0\1\u0386\41\0\2\u0384\6\0\1\u0d00"+
+ "\10\0\1\u0386\41\0\2\u0384\7\0\1\u0d01\7\0\1\u0386"+
+ "\41\0\2\u0384\10\0\1\u0d02\6\0\1\u0386\41\0\2\u0384"+
+ "\11\0\1\u0d03\5\0\1\u0386\41\0\2\u0384\12\0\1\u0d04"+
+ "\4\0\1\u0386\41\0\2\u0384\13\0\1\u0d05\3\0\1\u0386"+
+ "\41\0\2\u0384\14\0\1\u0d06\2\0\1\u0386\41\0\2\u0384"+
+ "\15\0\1\u0d07\1\0\1\u0386\41\0\1\u0312\1\u0313\1\0"+
+ "\1\u0d08\15\0\1\u0315\41\0\1\u0312\1\u0313\2\0\1\u0d09"+
+ "\14\0\1\u0315\41\0\1\u0312\1\u0313\3\0\1\u0d0a\13\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\4\0\1\u0d0b\12\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\5\0\1\u0d0c\11\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\6\0\1\u0d0d\10\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\7\0\1\u0d0e\7\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\10\0\1\u0d0f\6\0\1\u0315\41\0\1\u0312\1\u0313\11\0"+
+ "\1\u0d10\5\0\1\u0315\41\0\1\u0312\1\u0313\12\0\1\u0d11"+
+ "\4\0\1\u0315\41\0\1\u0312\1\u0313\13\0\1\u0d12\3\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\14\0\1\u0d13\2\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\15\0\1\u0d14\1\0\1\u0315\41\0"+
+ "\2\u03a1\1\0\1\u0d15\15\0\1\u03a3\41\0\2\u03a1\2\0"+
+ "\1\u0d16\14\0\1\u03a3\41\0\2\u03a1\3\0\1\u0d17\13\0"+
+ "\1\u03a3\41\0\2\u03a1\4\0\1\u0d18\12\0\1\u03a3\41\0"+
+ "\2\u03a1\5\0\1\u0d19\11\0\1\u03a3\41\0\2\u03a1\6\0"+
+ "\1\u0d1a\10\0\1\u03a3\41\0\2\u03a1\7\0\1\u0d1b\7\0"+
+ "\1\u03a3\41\0\2\u03a1\10\0\1\u0d1c\6\0\1\u03a3\41\0"+
+ "\2\u03a1\11\0\1\u0d1d\5\0\1\u03a3\41\0\2\u03a1\12\0"+
+ "\1\u0d1e\4\0\1\u03a3\41\0\2\u03a1\13\0\1\u0d1f\3\0"+
+ "\1\u03a3\41\0\2\u03a1\14\0\1\u0d20\2\0\1\u03a3\41\0"+
+ "\2\u03a1\15\0\1\u0d21\1\0\1\u03a3\40\0\1\276\1\u03b0"+
+ "\1\u03b1\1\276\1\u0d22\15\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\2\276\1\u0d23\14\276\1\u03b3\41\276\1\u03b0\1\u03b1\3\276"+
+ "\1\u0d24\13\276\1\u03b3\41\276\1\u03b0\1\u03b1\4\276\1\u0d25"+
+ "\12\276\1\u03b3\41\276\1\u03b0\1\u03b1\5\276\1\u0d26\11\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\6\276\1\u0d27\10\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\7\276\1\u0d28\7\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\10\276\1\u0d29\6\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\11\276\1\u0d2a\5\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\12\276\1\u0d2b\4\276\1\u03b3\41\276\1\u03b0\1\u03b1\13\276"+
+ "\1\u0d2c\3\276\1\u03b3\41\276\1\u03b0\1\u03b1\14\276\1\u0d2d"+
+ "\2\276\1\u03b3\41\276\1\u03b0\1\u03b1\15\276\1\u0d2e\1\276"+
+ "\1\u03b3\41\276\1\u033d\1\u033e\1\276\1\u0d2f\15\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\2\276\1\u0d30\14\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\3\276\1\u0d31\13\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\4\276\1\u0d32\12\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\5\276\1\u0d33\11\276\1\u0340\41\276\1\u033d\1\u033e\6\276"+
+ "\1\u0d34\10\276\1\u0340\41\276\1\u033d\1\u033e\7\276\1\u0d35"+
+ "\7\276\1\u0340\41\276\1\u033d\1\u033e\10\276\1\u0d36\6\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\11\276\1\u0d37\5\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\12\276\1\u0d38\4\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\13\276\1\u0d39\3\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\14\276\1\u0d3a\2\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\15\276\1\u0d3b\1\276\1\u0340\41\276\1\300\1\u02bf\1\276"+
+ "\1\u0d3c\15\276\1\u02c1\41\276\1\300\1\u02bf\2\276\1\u0d3d"+
+ "\14\276\1\u02c1\40\276\1\263\1\u03cf\1\u03d0\1\263\1\u0d3e"+
+ "\1\263\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\2\263"+
+ "\1\u0d3f\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\1\u0d40\12\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\1\263\1\u0d41\11\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\2\263\1\u0d42\10\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\3\263\1\u0d43\7\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\4\263\1\u0d44\6\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\5\263\1\u0d45\5\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\6\263\1\u0d46"+
+ "\4\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\7\263"+
+ "\1\u0d47\3\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\10\263\1\u0d48\2\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\11\263\1\u0d49\1\263\1\u03d2\40\263\1\344\1\u03de"+
+ "\1\u03df\1\344\1\u0d4a\1\344\1\u017c\13\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\2\344\1\u0d4b\1\u017c\13\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\1\u0d4c\12\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\1\344\1\u0d4d\11\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\2\344\1\u0d4e\10\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\3\344\1\u0d4f"+
+ "\7\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\4\344"+
+ "\1\u0d50\6\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\5\344\1\u0d51\5\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\6\344\1\u0d52\4\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\7\344\1\u0d53\3\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\10\344\1\u0d54\2\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\11\344\1\u0d55\1\344\1\u03e1"+
+ "\40\344\1\276\1\300\1\u02bf\3\276\1\u0d56\13\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\4\276\1\u0d57\12\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\5\276\1\u0d58\11\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\6\276\1\u0d59\10\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\7\276\1\u0d5a\7\276\1\u02c1\41\276\1\300\1\u02bf\10\276"+
+ "\1\u0d5b\6\276\1\u02c1\41\276\1\300\1\u02bf\11\276\1\u0d5c"+
+ "\5\276\1\u02c1\41\276\1\300\1\u02bf\12\276\1\u0d5d\4\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\13\276\1\u0d5e\3\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\14\276\1\u0d5f\2\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\15\276\1\u0d60\1\276\1\u02c1\40\276\1\0"+
+ "\2\u0384\1\0\1\u0d61\15\0\1\u0386\41\0\2\u0384\2\0"+
+ "\1\u0d62\14\0\1\u0386\41\0\2\u0384\3\0\1\u0d63\13\0"+
+ "\1\u0386\41\0\2\u0384\4\0\1\u0d64\12\0\1\u0386\41\0"+
+ "\2\u0384\5\0\1\u0d65\11\0\1\u0386\41\0\2\u0384\6\0"+
+ "\1\u0d66\10\0\1\u0386\41\0\2\u0384\7\0\1\u0d67\7\0"+
+ "\1\u0386\41\0\2\u0384\10\0\1\u0d68\6\0\1\u0386\41\0"+
+ "\2\u0384\11\0\1\u0d69\5\0\1\u0386\41\0\2\u0384\12\0"+
+ "\1\u0d6a\4\0\1\u0386\41\0\2\u0384\13\0\1\u0d6b\3\0"+
+ "\1\u0386\41\0\2\u0384\14\0\1\u0d6c\2\0\1\u0386\41\0"+
+ "\2\u0384\15\0\1\u0d6d\1\0\1\u0386\41\0\1\u0312\1\u0313"+
+ "\1\0\1\u0d6e\15\0\1\u0315\41\0\1\u0312\1\u0313\2\0"+
+ "\1\u0d6f\14\0\1\u0315\41\0\1\u0312\1\u0313\3\0\1\u0d70"+
+ "\13\0\1\u0315\41\0\1\u0312\1\u0313\4\0\1\u0d71\12\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\5\0\1\u0d72\11\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\6\0\1\u0d73\10\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\7\0\1\u0d74\7\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\10\0\1\u0d75\6\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\11\0\1\u0d76\5\0\1\u0315\41\0\1\u0312\1\u0313\12\0"+
+ "\1\u0d77\4\0\1\u0315\41\0\1\u0312\1\u0313\13\0\1\u0d78"+
+ "\3\0\1\u0315\41\0\1\u0312\1\u0313\14\0\1\u0d79\2\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\15\0\1\u0d7a\1\0\1\u0315"+
+ "\41\0\2\u03a1\1\0\1\u0d7b\15\0\1\u03a3\41\0\2\u03a1"+
+ "\2\0\1\u0d7c\14\0\1\u03a3\41\0\2\u03a1\3\0\1\u0d7d"+
+ "\13\0\1\u03a3\41\0\2\u03a1\4\0\1\u0d7e\12\0\1\u03a3"+
+ "\41\0\2\u03a1\5\0\1\u0d7f\11\0\1\u03a3\41\0\2\u03a1"+
+ "\6\0\1\u0d80\10\0\1\u03a3\41\0\2\u03a1\7\0\1\u0d81"+
+ "\7\0\1\u03a3\41\0\2\u03a1\10\0\1\u0d82\6\0\1\u03a3"+
+ "\41\0\2\u03a1\11\0\1\u0d83\5\0\1\u03a3\41\0\2\u03a1"+
+ "\12\0\1\u0d84\4\0\1\u03a3\41\0\2\u03a1\13\0\1\u0d85"+
+ "\3\0\1\u03a3\41\0\2\u03a1\14\0\1\u0d86\2\0\1\u03a3"+
+ "\41\0\2\u03a1\15\0\1\u0d87\1\0\1\u03a3\40\0\1\276"+
+ "\1\u03b0\1\u03b1\1\276\1\u0d88\15\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\2\276\1\u0d89\14\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\3\276\1\u0d8a\13\276\1\u03b3\41\276\1\u03b0\1\u03b1\4\276"+
+ "\1\u0d8b\12\276\1\u03b3\41\276\1\u03b0\1\u03b1\5\276\1\u0d8c"+
+ "\11\276\1\u03b3\41\276\1\u03b0\1\u03b1\6\276\1\u0d8d\10\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\7\276\1\u0d8e\7\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\10\276\1\u0d8f\6\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\11\276\1\u0d90\5\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\12\276\1\u0d91\4\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\13\276\1\u0d92\3\276\1\u03b3\41\276\1\u03b0\1\u03b1\14\276"+
+ "\1\u0d93\2\276\1\u03b3\41\276\1\u03b0\1\u03b1\15\276\1\u0d94"+
+ "\1\276\1\u03b3\41\276\1\u033d\1\u033e\1\276\1\u0d95\15\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\2\276\1\u0d96\14\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\3\276\1\u0d97\13\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\4\276\1\u0d98\12\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\5\276\1\u0d99\11\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\6\276\1\u0d9a\10\276\1\u0340\41\276\1\u033d\1\u033e\7\276"+
+ "\1\u0d9b\7\276\1\u0340\41\276\1\u033d\1\u033e\10\276\1\u0d9c"+
+ "\6\276\1\u0340\41\276\1\u033d\1\u033e\11\276\1\u0d9d\5\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\12\276\1\u0d9e\4\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\13\276\1\u0d9f\3\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\14\276\1\u0da0\2\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\15\276\1\u0da1\1\276\1\u0340\41\276\1\300\1\u02bf"+
+ "\1\276\1\u0da2\15\276\1\u02c1\41\276\1\300\1\u02bf\2\276"+
+ "\1\u0da3\14\276\1\u02c1\40\276\1\263\1\u03cf\1\u03d0\1\263"+
+ "\1\u0da4\1\263\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\2\263\1\u0da5\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\1\u0da6\12\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\1\263\1\u0da7\11\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\2\263\1\u0da8\10\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\3\263\1\u0da9\7\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\4\263\1\u0daa\6\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\5\263\1\u0dab"+
+ "\5\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\6\263"+
+ "\1\u0dac\4\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\7\263\1\u0dad\3\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\10\263\1\u0dae\2\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\11\263\1\u0daf\1\263\1\u03d2\40\263\1\344"+
+ "\1\u03de\1\u03df\1\344\1\u0db0\1\344\1\u017c\13\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\2\344\1\u0db1\1\u017c\13\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\1\u0db2\12\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\1\344\1\u0db3\11\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\2\344\1\u0db4"+
+ "\10\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\3\344"+
+ "\1\u0db5\7\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\4\344\1\u0db6\6\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\5\344\1\u0db7\5\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\6\344\1\u0db8\4\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\7\344\1\u0db9\3\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\10\344\1\u0dba\2\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\11\344\1\u0dbb\1\344"+
+ "\1\u03e1\40\344\1\276\1\300\1\u02bf\3\276\1\u0dbc\13\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\4\276\1\u0dbd\12\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\5\276\1\u0dbe\11\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\6\276\1\u0dbf\10\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\7\276\1\u0dc0\7\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\10\276\1\u0dc1\6\276\1\u02c1\41\276\1\300\1\u02bf\11\276"+
+ "\1\u0dc2\5\276\1\u02c1\41\276\1\300\1\u02bf\12\276\1\u0dc3"+
+ "\4\276\1\u02c1\41\276\1\300\1\u02bf\13\276\1\u0dc4\3\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\14\276\1\u0dc5\2\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\15\276\1\u0dc6\1\276\1\u02c1\40\276"+
+ "\1\0\2\u0384\1\0\1\u0dc7\15\0\1\u0386\41\0\2\u0384"+
+ "\2\0\1\u0dc8\14\0\1\u0386\41\0\2\u0384\3\0\1\u0dc9"+
+ "\13\0\1\u0386\41\0\2\u0384\4\0\1\u0dca\12\0\1\u0386"+
+ "\41\0\2\u0384\5\0\1\u0dcb\11\0\1\u0386\41\0\2\u0384"+
+ "\6\0\1\u0dcc\10\0\1\u0386\41\0\2\u0384\7\0\1\u0dcd"+
+ "\7\0\1\u0386\41\0\2\u0384\10\0\1\u0dce\6\0\1\u0386"+
+ "\41\0\2\u0384\11\0\1\u0dcf\5\0\1\u0386\41\0\2\u0384"+
+ "\12\0\1\u0dd0\4\0\1\u0386\41\0\2\u0384\13\0\1\u0dd1"+
+ "\3\0\1\u0386\41\0\2\u0384\14\0\1\u0dd2\2\0\1\u0386"+
+ "\41\0\2\u0384\15\0\1\u0dd3\1\0\1\u0386\41\0\1\u0312"+
+ "\1\u0313\1\0\1\u0dd4\15\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\2\0\1\u0dd5\14\0\1\u0315\41\0\1\u0312\1\u0313\3\0"+
+ "\1\u0dd6\13\0\1\u0315\41\0\1\u0312\1\u0313\4\0\1\u0dd7"+
+ "\12\0\1\u0315\41\0\1\u0312\1\u0313\5\0\1\u0dd8\11\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\6\0\1\u0dd9\10\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\7\0\1\u0dda\7\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\10\0\1\u0ddb\6\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\11\0\1\u0ddc\5\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\12\0\1\u0ddd\4\0\1\u0315\41\0\1\u0312\1\u0313\13\0"+
+ "\1\u0dde\3\0\1\u0315\41\0\1\u0312\1\u0313\14\0\1\u0ddf"+
+ "\2\0\1\u0315\41\0\1\u0312\1\u0313\15\0\1\u0de0\1\0"+
+ "\1\u0315\41\0\2\u03a1\1\0\1\u0de1\15\0\1\u03a3\41\0"+
+ "\2\u03a1\2\0\1\u0de2\14\0\1\u03a3\41\0\2\u03a1\3\0"+
+ "\1\u0de3\13\0\1\u03a3\41\0\2\u03a1\4\0\1\u0de4\12\0"+
+ "\1\u03a3\41\0\2\u03a1\5\0\1\u0de5\11\0\1\u03a3\41\0"+
+ "\2\u03a1\6\0\1\u0de6\10\0\1\u03a3\41\0\2\u03a1\7\0"+
+ "\1\u0de7\7\0\1\u03a3\41\0\2\u03a1\10\0\1\u0de8\6\0"+
+ "\1\u03a3\41\0\2\u03a1\11\0\1\u0de9\5\0\1\u03a3\41\0"+
+ "\2\u03a1\12\0\1\u0dea\4\0\1\u03a3\41\0\2\u03a1\13\0"+
+ "\1\u0deb\3\0\1\u03a3\41\0\2\u03a1\14\0\1\u0dec\2\0"+
+ "\1\u03a3\41\0\2\u03a1\15\0\1\u0ded\1\0\1\u03a3\40\0"+
+ "\1\276\1\u03b0\1\u03b1\1\276\1\u0dee\15\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\2\276\1\u0def\14\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\3\276\1\u0df0\13\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\4\276\1\u0df1\12\276\1\u03b3\41\276\1\u03b0\1\u03b1\5\276"+
+ "\1\u0df2\11\276\1\u03b3\41\276\1\u03b0\1\u03b1\6\276\1\u0df3"+
+ "\10\276\1\u03b3\41\276\1\u03b0\1\u03b1\7\276\1\u0df4\7\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\10\276\1\u0df5\6\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\11\276\1\u0df6\5\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\12\276\1\u0df7\4\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\13\276\1\u0df8\3\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\14\276\1\u0df9\2\276\1\u03b3\41\276\1\u03b0\1\u03b1\15\276"+
+ "\1\u0dfa\1\276\1\u03b3\41\276\1\u033d\1\u033e\1\276\1\u0dfb"+
+ "\15\276\1\u0340\41\276\1\u033d\1\u033e\2\276\1\u0dfc\14\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\3\276\1\u0dfd\13\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\4\276\1\u0dfe\12\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\5\276\1\u0dff\11\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\6\276\1\u0e00\10\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\7\276\1\u0e01\7\276\1\u0340\41\276\1\u033d\1\u033e\10\276"+
+ "\1\u0e02\6\276\1\u0340\41\276\1\u033d\1\u033e\11\276\1\u0e03"+
+ "\5\276\1\u0340\41\276\1\u033d\1\u033e\12\276\1\u0e04\4\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\13\276\1\u0e05\3\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\14\276\1\u0e06\2\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\15\276\1\u0e07\1\276\1\u0340\41\276\1\300"+
+ "\1\u02bf\1\276\1\u0e08\15\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\2\276\1\u0e09\14\276\1\u02c1\40\276\1\263\1\u03cf\1\u03d0"+
+ "\1\263\1\u0e0a\1\263\1\u0136\13\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\2\263\1\u0e0b\1\u0136\13\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\1\u0e0c\12\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\1\263\1\u0e0d\11\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\2\263\1\u0e0e\10\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\3\263\1\u0e0f\7\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\4\263\1\u0e10"+
+ "\6\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\5\263"+
+ "\1\u0e11\5\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\6\263\1\u0e12\4\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\7\263\1\u0e13\3\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\10\263\1\u0e14\2\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\11\263\1\u0e15\1\263\1\u03d2\40\263"+
+ "\1\344\1\u03de\1\u03df\1\344\1\u0e16\1\344\1\u017c\13\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\2\344\1\u0e17\1\u017c\13\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\1\u0e18\12\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\1\344\1\u0e19"+
+ "\11\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\2\344"+
+ "\1\u0e1a\10\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\3\344\1\u0e1b\7\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\4\344\1\u0e1c\6\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\5\344\1\u0e1d\5\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\6\344\1\u0e1e\4\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\7\344\1\u0e1f\3\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\10\344\1\u0e20\2\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\11\344\1\u0e21"+
+ "\1\344\1\u03e1\40\344\1\276\1\300\1\u02bf\3\276\1\u0e22"+
+ "\13\276\1\u02c1\41\276\1\300\1\u02bf\4\276\1\u0e23\12\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\5\276\1\u0e24\11\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\6\276\1\u0e25\10\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\7\276\1\u0e26\7\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\10\276\1\u0e27\6\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\11\276\1\u0e28\5\276\1\u02c1\41\276\1\300\1\u02bf\12\276"+
+ "\1\u0e29\4\276\1\u02c1\41\276\1\300\1\u02bf\13\276\1\u0e2a"+
+ "\3\276\1\u02c1\41\276\1\300\1\u02bf\14\276\1\u0e2b\2\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\15\276\1\u0e2c\1\276\1\u02c1"+
+ "\40\276\1\0\2\u0384\1\0\1\u0e2d\15\0\1\u0386\41\0"+
+ "\2\u0384\2\0\1\u0e2e\14\0\1\u0386\41\0\2\u0384\3\0"+
+ "\1\u0e2f\13\0\1\u0386\41\0\2\u0384\4\0\1\u0e30\12\0"+
+ "\1\u0386\41\0\2\u0384\5\0\1\u0e31\11\0\1\u0386\41\0"+
+ "\2\u0384\6\0\1\u0e32\10\0\1\u0386\41\0\2\u0384\7\0"+
+ "\1\u0e33\7\0\1\u0386\41\0\2\u0384\10\0\1\u0e34\6\0"+
+ "\1\u0386\41\0\2\u0384\11\0\1\u0e35\5\0\1\u0386\41\0"+
+ "\2\u0384\12\0\1\u0e36\4\0\1\u0386\41\0\2\u0384\13\0"+
+ "\1\u0e37\3\0\1\u0386\41\0\2\u0384\14\0\1\u0e38\2\0"+
+ "\1\u0386\41\0\2\u0384\15\0\1\u0e39\1\0\1\u0386\41\0"+
+ "\1\u0312\1\u0313\1\0\1\u0e3a\15\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\2\0\1\u0e3b\14\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\3\0\1\u0e3c\13\0\1\u0315\41\0\1\u0312\1\u0313\4\0"+
+ "\1\u0e3d\12\0\1\u0315\41\0\1\u0312\1\u0313\5\0\1\u0e3e"+
+ "\11\0\1\u0315\41\0\1\u0312\1\u0313\6\0\1\u0e3f\10\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\7\0\1\u0e40\7\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\10\0\1\u0e41\6\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\11\0\1\u0e42\5\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\12\0\1\u0e43\4\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\13\0\1\u0e44\3\0\1\u0315\41\0\1\u0312\1\u0313\14\0"+
+ "\1\u0e45\2\0\1\u0315\41\0\1\u0312\1\u0313\15\0\1\u0e46"+
+ "\1\0\1\u0315\41\0\2\u03a1\1\0\1\u0e47\15\0\1\u03a3"+
+ "\41\0\2\u03a1\2\0\1\u0e48\14\0\1\u03a3\41\0\2\u03a1"+
+ "\3\0\1\u0e49\13\0\1\u03a3\41\0\2\u03a1\4\0\1\u0e4a"+
+ "\12\0\1\u03a3\41\0\2\u03a1\5\0\1\u0e4b\11\0\1\u03a3"+
+ "\41\0\2\u03a1\6\0\1\u0e4c\10\0\1\u03a3\41\0\2\u03a1"+
+ "\7\0\1\u0e4d\7\0\1\u03a3\41\0\2\u03a1\10\0\1\u0e4e"+
+ "\6\0\1\u03a3\41\0\2\u03a1\11\0\1\u0e4f\5\0\1\u03a3"+
+ "\41\0\2\u03a1\12\0\1\u0e50\4\0\1\u03a3\41\0\2\u03a1"+
+ "\13\0\1\u0e51\3\0\1\u03a3\41\0\2\u03a1\14\0\1\u0e52"+
+ "\2\0\1\u03a3\41\0\2\u03a1\15\0\1\u0e53\1\0\1\u03a3"+
+ "\40\0\1\276\1\u03b0\1\u03b1\1\276\1\u0e54\15\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\2\276\1\u0e55\14\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\3\276\1\u0e56\13\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\4\276\1\u0e57\12\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\5\276\1\u0e58\11\276\1\u03b3\41\276\1\u03b0\1\u03b1\6\276"+
+ "\1\u0e59\10\276\1\u03b3\41\276\1\u03b0\1\u03b1\7\276\1\u0e5a"+
+ "\7\276\1\u03b3\41\276\1\u03b0\1\u03b1\10\276\1\u0e5b\6\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\11\276\1\u0e5c\5\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\12\276\1\u0e5d\4\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\13\276\1\u0e5e\3\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\14\276\1\u0e5f\2\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\15\276\1\u0e60\1\276\1\u03b3\41\276\1\u033d\1\u033e\1\276"+
+ "\1\u0e61\15\276\1\u0340\41\276\1\u033d\1\u033e\2\276\1\u0e62"+
+ "\14\276\1\u0340\41\276\1\u033d\1\u033e\3\276\1\u0e63\13\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\4\276\1\u0e64\12\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\5\276\1\u0e65\11\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\6\276\1\u0e66\10\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\7\276\1\u0e67\7\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\10\276\1\u0e68\6\276\1\u0340\41\276\1\u033d\1\u033e\11\276"+
+ "\1\u0e69\5\276\1\u0340\41\276\1\u033d\1\u033e\12\276\1\u0e6a"+
+ "\4\276\1\u0340\41\276\1\u033d\1\u033e\13\276\1\u0e6b\3\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\14\276\1\u0e6c\2\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\15\276\1\u0e6d\1\276\1\u0340\41\276"+
+ "\1\300\1\u02bf\1\276\1\u0e6e\15\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\2\276\1\u0e6f\14\276\1\u02c1\40\276\1\263\1\u03cf"+
+ "\1\u03d0\1\263\1\u0e70\1\263\1\u0136\13\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\2\263\1\u0e71\1\u0136\13\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\1\u0e72\12\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\1\263\1\u0e73\11\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\2\263\1\u0e74\10\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\3\263\1\u0e75"+
+ "\7\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\4\263"+
+ "\1\u0e76\6\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\5\263\1\u0e77\5\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\6\263\1\u0e78\4\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\7\263\1\u0e79\3\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\10\263\1\u0e7a\2\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\11\263\1\u0e7b\1\263\1\u03d2"+
+ "\40\263\1\344\1\u03de\1\u03df\1\344\1\u0e7c\1\344\1\u017c"+
+ "\13\344\1\u03e1\41\344\1\u03de\1\u03df\2\344\1\u0e7d\1\u017c"+
+ "\13\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\1\u0e7e"+
+ "\12\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\1\344"+
+ "\1\u0e7f\11\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\2\344\1\u0e80\10\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\3\344\1\u0e81\7\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\4\344\1\u0e82\6\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\5\344\1\u0e83\5\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\6\344\1\u0e84\4\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\7\344\1\u0e85\3\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\10\344\1\u0e86"+
+ "\2\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\11\344"+
+ "\1\u0e87\1\344\1\u03e1\40\344\1\276\1\300\1\u02bf\3\276"+
+ "\1\u0e88\13\276\1\u02c1\41\276\1\300\1\u02bf\4\276\1\u0e89"+
+ "\12\276\1\u02c1\41\276\1\300\1\u02bf\5\276\1\u0e8a\11\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\6\276\1\u0e8b\10\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\7\276\1\u0e8c\7\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\10\276\1\u0e8d\6\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\11\276\1\u0e8e\5\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\12\276\1\u0e8f\4\276\1\u02c1\41\276\1\300\1\u02bf\13\276"+
+ "\1\u0e90\3\276\1\u02c1\41\276\1\300\1\u02bf\14\276\1\u0e91"+
+ "\2\276\1\u02c1\41\276\1\300\1\u02bf\15\276\1\u0e92\1\276"+
+ "\1\u02c1\40\276\1\0\2\u0384\1\0\1\u0e93\15\0\1\u0386"+
+ "\41\0\2\u0384\2\0\1\u0e94\14\0\1\u0386\41\0\2\u0384"+
+ "\3\0\1\u0e95\13\0\1\u0386\41\0\2\u0384\4\0\1\u0e96"+
+ "\12\0\1\u0386\41\0\2\u0384\5\0\1\u0e97\11\0\1\u0386"+
+ "\41\0\2\u0384\6\0\1\u0e98\10\0\1\u0386\41\0\2\u0384"+
+ "\7\0\1\u0e99\7\0\1\u0386\41\0\2\u0384\10\0\1\u0e9a"+
+ "\6\0\1\u0386\41\0\2\u0384\11\0\1\u0e9b\5\0\1\u0386"+
+ "\41\0\2\u0384\12\0\1\u0e9c\4\0\1\u0386\41\0\2\u0384"+
+ "\13\0\1\u0e9d\3\0\1\u0386\41\0\2\u0384\14\0\1\u0e9e"+
+ "\2\0\1\u0386\41\0\2\u0384\15\0\1\u0e9f\1\0\1\u0386"+
+ "\41\0\1\u0312\1\u0313\1\0\1\u0ea0\15\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\2\0\1\u0ea1\14\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\3\0\1\u0ea2\13\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\4\0\1\u0ea3\12\0\1\u0315\41\0\1\u0312\1\u0313\5\0"+
+ "\1\u0ea4\11\0\1\u0315\41\0\1\u0312\1\u0313\6\0\1\u0ea5"+
+ "\10\0\1\u0315\41\0\1\u0312\1\u0313\7\0\1\u0ea6\7\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\10\0\1\u0ea7\6\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\11\0\1\u0ea8\5\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\12\0\1\u0ea9\4\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\13\0\1\u0eaa\3\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\14\0\1\u0eab\2\0\1\u0315\41\0\1\u0312\1\u0313\15\0"+
+ "\1\u0eac\1\0\1\u0315\41\0\2\u03a1\1\0\1\u0ead\15\0"+
+ "\1\u03a3\41\0\2\u03a1\2\0\1\u0eae\14\0\1\u03a3\41\0"+
+ "\2\u03a1\3\0\1\u0eaf\13\0\1\u03a3\41\0\2\u03a1\4\0"+
+ "\1\u0eb0\12\0\1\u03a3\41\0\2\u03a1\5\0\1\u0eb1\11\0"+
+ "\1\u03a3\41\0\2\u03a1\6\0\1\u0eb2\10\0\1\u03a3\41\0"+
+ "\2\u03a1\7\0\1\u0eb3\7\0\1\u03a3\41\0\2\u03a1\10\0"+
+ "\1\u0eb4\6\0\1\u03a3\41\0\2\u03a1\11\0\1\u0eb5\5\0"+
+ "\1\u03a3\41\0\2\u03a1\12\0\1\u0eb6\4\0\1\u03a3\41\0"+
+ "\2\u03a1\13\0\1\u0eb7\3\0\1\u03a3\41\0\2\u03a1\14\0"+
+ "\1\u0eb8\2\0\1\u03a3\41\0\2\u03a1\15\0\1\u0eb9\1\0"+
+ "\1\u03a3\40\0\1\276\1\u03b0\1\u03b1\1\276\1\u0eba\15\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\2\276\1\u0ebb\14\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\3\276\1\u0ebc\13\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\4\276\1\u0ebd\12\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\5\276\1\u0ebe\11\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\6\276\1\u0ebf\10\276\1\u03b3\41\276\1\u03b0\1\u03b1\7\276"+
+ "\1\u0ec0\7\276\1\u03b3\41\276\1\u03b0\1\u03b1\10\276\1\u0ec1"+
+ "\6\276\1\u03b3\41\276\1\u03b0\1\u03b1\11\276\1\u0ec2\5\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\12\276\1\u0ec3\4\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\13\276\1\u0ec4\3\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\14\276\1\u0ec5\2\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\15\276\1\u0ec6\1\276\1\u03b3\41\276\1\u033d\1\u033e"+
+ "\1\276\1\u0ec7\15\276\1\u0340\41\276\1\u033d\1\u033e\2\276"+
+ "\1\u0ec8\14\276\1\u0340\41\276\1\u033d\1\u033e\3\276\1\u0ec9"+
+ "\13\276\1\u0340\41\276\1\u033d\1\u033e\4\276\1\u0eca\12\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\5\276\1\u0ecb\11\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\6\276\1\u0ecc\10\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\7\276\1\u0ecd\7\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\10\276\1\u0ece\6\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\11\276\1\u0ecf\5\276\1\u0340\41\276\1\u033d\1\u033e\12\276"+
+ "\1\u0ed0\4\276\1\u0340\41\276\1\u033d\1\u033e\13\276\1\u0ed1"+
+ "\3\276\1\u0340\41\276\1\u033d\1\u033e\14\276\1\u0ed2\2\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\15\276\1\u0ed3\1\276\1\u0340"+
+ "\41\276\1\300\1\u02bf\1\276\1\u0ed4\15\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\2\276\1\u0ed5\14\276\1\u02c1\40\276\1\263"+
+ "\1\u03cf\1\u03d0\1\263\1\u0ed6\1\263\1\u0136\13\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\2\263\1\u0ed7\1\u0136\13\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\u0ed8\12\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\263\1\u0ed9\11\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\2\263\1\u0eda"+
+ "\10\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\3\263"+
+ "\1\u0edb\7\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\4\263\1\u0edc\6\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\5\263\1\u0edd\5\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\6\263\1\u0ede\4\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\7\263\1\u0edf\3\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\10\263\1\u0ee0\2\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\11\263\1\u0ee1\1\263"+
+ "\1\u03d2\40\263\1\344\1\u03de\1\u03df\1\344\1\u0ee2\1\344"+
+ "\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df\2\344\1\u0ee3"+
+ "\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\1\u0ee4\12\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\1\344\1\u0ee5\11\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\2\344\1\u0ee6\10\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\3\344\1\u0ee7\7\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\4\344\1\u0ee8\6\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\5\344\1\u0ee9\5\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\6\344\1\u0eea\4\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\7\344\1\u0eeb"+
+ "\3\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\10\344"+
+ "\1\u0eec\2\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\11\344\1\u0eed\1\344\1\u03e1\40\344\1\276\1\300\1\u02bf"+
+ "\3\276\1\u0eee\13\276\1\u02c1\41\276\1\300\1\u02bf\4\276"+
+ "\1\u0eef\12\276\1\u02c1\41\276\1\300\1\u02bf\5\276\1\u0ef0"+
+ "\11\276\1\u02c1\41\276\1\300\1\u02bf\6\276\1\u0ef1\10\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\7\276\1\u0ef2\7\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\10\276\1\u0ef3\6\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\11\276\1\u0ef4\5\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\12\276\1\u0ef5\4\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\13\276\1\u0ef6\3\276\1\u02c1\41\276\1\300\1\u02bf\14\276"+
+ "\1\u0ef7\2\276\1\u02c1\41\276\1\300\1\u02bf\15\276\1\u0ef8"+
+ "\1\276\1\u02c1\40\276\1\0\2\u0384\1\0\1\u0ef9\15\0"+
+ "\1\u0386\41\0\2\u0384\2\0\1\u0efa\14\0\1\u0386\41\0"+
+ "\2\u0384\3\0\1\u0efb\13\0\1\u0386\41\0\2\u0384\4\0"+
+ "\1\u0efc\12\0\1\u0386\41\0\2\u0384\5\0\1\u0efd\11\0"+
+ "\1\u0386\41\0\2\u0384\6\0\1\u0efe\10\0\1\u0386\41\0"+
+ "\2\u0384\7\0\1\u0eff\7\0\1\u0386\41\0\2\u0384\10\0"+
+ "\1\u0f00\6\0\1\u0386\41\0\2\u0384\11\0\1\u0f01\5\0"+
+ "\1\u0386\41\0\2\u0384\12\0\1\u0f02\4\0\1\u0386\41\0"+
+ "\2\u0384\13\0\1\u0f03\3\0\1\u0386\41\0\2\u0384\14\0"+
+ "\1\u0f04\2\0\1\u0386\41\0\2\u0384\15\0\1\u0f05\1\0"+
+ "\1\u0386\41\0\1\u0312\1\u0313\1\0\1\u0f06\15\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\2\0\1\u0f07\14\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\3\0\1\u0f08\13\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\4\0\1\u0f09\12\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\5\0\1\u0f0a\11\0\1\u0315\41\0\1\u0312\1\u0313\6\0"+
+ "\1\u0f0b\10\0\1\u0315\41\0\1\u0312\1\u0313\7\0\1\u0f0c"+
+ "\7\0\1\u0315\41\0\1\u0312\1\u0313\10\0\1\u0f0d\6\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\11\0\1\u0f0e\5\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\12\0\1\u0f0f\4\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\13\0\1\u0f10\3\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\14\0\1\u0f11\2\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\15\0\1\u0f12\1\0\1\u0315\41\0\2\u03a1\1\0\1\u0f13"+
+ "\15\0\1\u03a3\41\0\2\u03a1\2\0\1\u0f14\14\0\1\u03a3"+
+ "\41\0\2\u03a1\3\0\1\u0f15\13\0\1\u03a3\41\0\2\u03a1"+
+ "\4\0\1\u0f16\12\0\1\u03a3\41\0\2\u03a1\5\0\1\u0f17"+
+ "\11\0\1\u03a3\41\0\2\u03a1\6\0\1\u0f18\10\0\1\u03a3"+
+ "\41\0\2\u03a1\7\0\1\u0f19\7\0\1\u03a3\41\0\2\u03a1"+
+ "\10\0\1\u0f1a\6\0\1\u03a3\41\0\2\u03a1\11\0\1\u0f1b"+
+ "\5\0\1\u03a3\41\0\2\u03a1\12\0\1\u0f1c\4\0\1\u03a3"+
+ "\41\0\2\u03a1\13\0\1\u0f1d\3\0\1\u03a3\41\0\2\u03a1"+
+ "\14\0\1\u0f1e\2\0\1\u03a3\41\0\2\u03a1\15\0\1\u0f1f"+
+ "\1\0\1\u03a3\40\0\1\276\1\u03b0\1\u03b1\1\276\1\u0f20"+
+ "\15\276\1\u03b3\41\276\1\u03b0\1\u03b1\2\276\1\u0f21\14\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\3\276\1\u0f22\13\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\4\276\1\u0f23\12\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\5\276\1\u0f24\11\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\6\276\1\u0f25\10\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\7\276\1\u0f26\7\276\1\u03b3\41\276\1\u03b0\1\u03b1\10\276"+
+ "\1\u0f27\6\276\1\u03b3\41\276\1\u03b0\1\u03b1\11\276\1\u0f28"+
+ "\5\276\1\u03b3\41\276\1\u03b0\1\u03b1\12\276\1\u0f29\4\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\13\276\1\u0f2a\3\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\14\276\1\u0f2b\2\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\15\276\1\u0f2c\1\276\1\u03b3\41\276\1\u033d"+
+ "\1\u033e\1\276\1\u0f2d\15\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\2\276\1\u0f2e\14\276\1\u0340\41\276\1\u033d\1\u033e\3\276"+
+ "\1\u0f2f\13\276\1\u0340\41\276\1\u033d\1\u033e\4\276\1\u0f30"+
+ "\12\276\1\u0340\41\276\1\u033d\1\u033e\5\276\1\u0f31\11\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\6\276\1\u0f32\10\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\7\276\1\u0f33\7\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\10\276\1\u0f34\6\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\11\276\1\u0f35\5\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\12\276\1\u0f36\4\276\1\u0340\41\276\1\u033d\1\u033e\13\276"+
+ "\1\u0f37\3\276\1\u0340\41\276\1\u033d\1\u033e\14\276\1\u0f38"+
+ "\2\276\1\u0340\41\276\1\u033d\1\u033e\15\276\1\u0f39\1\276"+
+ "\1\u0340\41\276\1\300\1\u02bf\1\276\1\u0f3a\15\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\2\276\1\u0f3b\14\276\1\u02c1\40\276"+
+ "\1\263\1\u03cf\1\u03d0\1\263\1\u0f3c\1\263\1\u0136\13\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\2\263\1\u0f3d\1\u0136\13\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\u0f3e\12\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\263\1\u0f3f"+
+ "\11\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\2\263"+
+ "\1\u0f40\10\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\3\263\1\u0f41\7\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\4\263\1\u0f42\6\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\5\263\1\u0f43\5\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\6\263\1\u0f44\4\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\7\263\1\u0f45\3\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\10\263\1\u0f46\2\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\11\263\1\u0f47"+
+ "\1\263\1\u03d2\40\263\1\344\1\u03de\1\u03df\1\344\1\u0f48"+
+ "\1\344\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df\2\344"+
+ "\1\u0f49\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\1\u0f4a\12\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\1\344\1\u0f4b\11\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\2\344\1\u0f4c\10\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\3\344\1\u0f4d\7\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\4\344\1\u0f4e\6\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\5\344\1\u0f4f\5\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\6\344\1\u0f50"+
+ "\4\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\7\344"+
+ "\1\u0f51\3\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\10\344\1\u0f52\2\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\11\344\1\u0f53\1\344\1\u03e1\40\344\1\276\1\300"+
+ "\1\u02bf\3\276\1\u0f54\13\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\4\276\1\u0f55\12\276\1\u02c1\41\276\1\300\1\u02bf\5\276"+
+ "\1\u0f56\11\276\1\u02c1\41\276\1\300\1\u02bf\6\276\1\u0f57"+
+ "\10\276\1\u02c1\41\276\1\300\1\u02bf\7\276\1\u0f58\7\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\10\276\1\u0f59\6\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\11\276\1\u0f5a\5\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\12\276\1\u0f5b\4\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\13\276\1\u0f5c\3\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\14\276\1\u0f5d\2\276\1\u02c1\41\276\1\300\1\u02bf\15\276"+
+ "\1\u0f5e\1\276\1\u02c1\40\276\1\0\2\u0384\1\0\1\u0f5f"+
+ "\15\0\1\u0386\41\0\2\u0384\2\0\1\u0f60\14\0\1\u0386"+
+ "\41\0\2\u0384\3\0\1\u0f61\13\0\1\u0386\41\0\2\u0384"+
+ "\4\0\1\u0f62\12\0\1\u0386\41\0\2\u0384\5\0\1\u0f63"+
+ "\11\0\1\u0386\41\0\2\u0384\6\0\1\u0f64\10\0\1\u0386"+
+ "\41\0\2\u0384\7\0\1\u0f65\7\0\1\u0386\41\0\2\u0384"+
+ "\10\0\1\u0f66\6\0\1\u0386\41\0\2\u0384\11\0\1\u0f67"+
+ "\5\0\1\u0386\41\0\2\u0384\12\0\1\u0f68\4\0\1\u0386"+
+ "\41\0\2\u0384\13\0\1\u0f69\3\0\1\u0386\41\0\2\u0384"+
+ "\14\0\1\u0f6a\2\0\1\u0386\41\0\2\u0384\15\0\1\u0f6b"+
+ "\1\0\1\u0386\41\0\1\u0312\1\u0313\1\0\1\u0f6c\15\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\2\0\1\u0f6d\14\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\3\0\1\u0f6e\13\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\4\0\1\u0f6f\12\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\5\0\1\u0f70\11\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\6\0\1\u0f71\10\0\1\u0315\41\0\1\u0312\1\u0313\7\0"+
+ "\1\u0f72\7\0\1\u0315\41\0\1\u0312\1\u0313\10\0\1\u0f73"+
+ "\6\0\1\u0315\41\0\1\u0312\1\u0313\11\0\1\u0f74\5\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\12\0\1\u0f75\4\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\13\0\1\u0f76\3\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\14\0\1\u0f77\2\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\15\0\1\u0f78\1\0\1\u0315\41\0\2\u03a1\1\0"+
+ "\1\u0f79\15\0\1\u03a3\41\0\2\u03a1\2\0\1\u0f7a\14\0"+
+ "\1\u03a3\41\0\2\u03a1\3\0\1\u0f7b\13\0\1\u03a3\41\0"+
+ "\2\u03a1\4\0\1\u0f7c\12\0\1\u03a3\41\0\2\u03a1\5\0"+
+ "\1\u0f7d\11\0\1\u03a3\41\0\2\u03a1\6\0\1\u0f7e\10\0"+
+ "\1\u03a3\41\0\2\u03a1\7\0\1\u0f7f\7\0\1\u03a3\41\0"+
+ "\2\u03a1\10\0\1\u0f80\6\0\1\u03a3\41\0\2\u03a1\11\0"+
+ "\1\u0f81\5\0\1\u03a3\41\0\2\u03a1\12\0\1\u0f82\4\0"+
+ "\1\u03a3\41\0\2\u03a1\13\0\1\u0f83\3\0\1\u03a3\41\0"+
+ "\2\u03a1\14\0\1\u0f84\2\0\1\u03a3\41\0\2\u03a1\15\0"+
+ "\1\u0f85\1\0\1\u03a3\40\0\1\276\1\u03b0\1\u03b1\1\276"+
+ "\1\u0f86\15\276\1\u03b3\41\276\1\u03b0\1\u03b1\2\276\1\u0f87"+
+ "\14\276\1\u03b3\41\276\1\u03b0\1\u03b1\3\276\1\u0f88\13\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\4\276\1\u0f89\12\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\5\276\1\u0f8a\11\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\6\276\1\u0f8b\10\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\7\276\1\u0f8c\7\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\10\276\1\u0f8d\6\276\1\u03b3\41\276\1\u03b0\1\u03b1\11\276"+
+ "\1\u0f8e\5\276\1\u03b3\41\276\1\u03b0\1\u03b1\12\276\1\u0f8f"+
+ "\4\276\1\u03b3\41\276\1\u03b0\1\u03b1\13\276\1\u0f90\3\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\14\276\1\u0f91\2\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\15\276\1\u0f92\1\276\1\u03b3\41\276"+
+ "\1\u033d\1\u033e\1\276\1\u0f93\15\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\2\276\1\u0f94\14\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\3\276\1\u0f95\13\276\1\u0340\41\276\1\u033d\1\u033e\4\276"+
+ "\1\u0f96\12\276\1\u0340\41\276\1\u033d\1\u033e\5\276\1\u0f97"+
+ "\11\276\1\u0340\41\276\1\u033d\1\u033e\6\276\1\u0f98\10\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\7\276\1\u0f99\7\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\10\276\1\u0f9a\6\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\11\276\1\u0f9b\5\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\12\276\1\u0f9c\4\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\13\276\1\u0f9d\3\276\1\u0340\41\276\1\u033d\1\u033e\14\276"+
+ "\1\u0f9e\2\276\1\u0340\41\276\1\u033d\1\u033e\15\276\1\u0f9f"+
+ "\1\276\1\u0340\41\276\1\300\1\u02bf\1\276\1\u0fa0\15\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\2\276\1\u0fa1\14\276\1\u02c1"+
+ "\40\276\1\263\1\u03cf\1\u03d0\1\263\1\u0fa2\1\263\1\u0136"+
+ "\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\2\263\1\u0fa3\1\u0136"+
+ "\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\u0fa4"+
+ "\12\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\263"+
+ "\1\u0fa5\11\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\2\263\1\u0fa6\10\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\3\263\1\u0fa7\7\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\4\263\1\u0fa8\6\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\5\263\1\u0fa9\5\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\6\263\1\u0faa\4\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\7\263\1\u0fab\3\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\10\263\1\u0fac"+
+ "\2\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\11\263"+
+ "\1\u0fad\1\263\1\u03d2\40\263\1\344\1\u03de\1\u03df\1\344"+
+ "\1\u0fae\1\344\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\2\344\1\u0faf\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\1\u0fb0\12\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\1\344\1\u0fb1\11\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\2\344\1\u0fb2\10\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\3\344\1\u0fb3\7\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\4\344\1\u0fb4\6\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\5\344\1\u0fb5"+
+ "\5\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\6\344"+
+ "\1\u0fb6\4\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\7\344\1\u0fb7\3\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\10\344\1\u0fb8\2\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\11\344\1\u0fb9\1\344\1\u03e1\40\344\1\276"+
+ "\1\300\1\u02bf\3\276\1\u0fba\13\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\4\276\1\u0fbb\12\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\5\276\1\u0fbc\11\276\1\u02c1\41\276\1\300\1\u02bf\6\276"+
+ "\1\u0fbd\10\276\1\u02c1\41\276\1\300\1\u02bf\7\276\1\u0fbe"+
+ "\7\276\1\u02c1\41\276\1\300\1\u02bf\10\276\1\u0fbf\6\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\11\276\1\u0fc0\5\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\12\276\1\u0fc1\4\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\13\276\1\u0fc2\3\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\14\276\1\u0fc3\2\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\15\276\1\u0fc4\1\276\1\u02c1\40\276\1\0\2\u0384\1\0"+
+ "\1\u0fc5\15\0\1\u0386\41\0\2\u0384\2\0\1\u0fc6\14\0"+
+ "\1\u0386\41\0\2\u0384\3\0\1\u0fc7\13\0\1\u0386\41\0"+
+ "\2\u0384\4\0\1\u0fc8\12\0\1\u0386\41\0\2\u0384\5\0"+
+ "\1\u0fc9\11\0\1\u0386\41\0\2\u0384\6\0\1\u0fca\10\0"+
+ "\1\u0386\41\0\2\u0384\7\0\1\u0fcb\7\0\1\u0386\41\0"+
+ "\2\u0384\10\0\1\u0fcc\6\0\1\u0386\41\0\2\u0384\11\0"+
+ "\1\u0fcd\5\0\1\u0386\41\0\2\u0384\12\0\1\u0fce\4\0"+
+ "\1\u0386\41\0\2\u0384\13\0\1\u0fcf\3\0\1\u0386\41\0"+
+ "\2\u0384\14\0\1\u0fd0\2\0\1\u0386\41\0\2\u0384\15\0"+
+ "\1\u0fd1\1\0\1\u0386\41\0\1\u0312\1\u0313\1\0\1\u0fd2"+
+ "\15\0\1\u0315\41\0\1\u0312\1\u0313\2\0\1\u0fd3\14\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\3\0\1\u0fd4\13\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\4\0\1\u0fd5\12\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\5\0\1\u0fd6\11\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\6\0\1\u0fd7\10\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\7\0\1\u0fd8\7\0\1\u0315\41\0\1\u0312\1\u0313\10\0"+
+ "\1\u0fd9\6\0\1\u0315\41\0\1\u0312\1\u0313\11\0\1\u0fda"+
+ "\5\0\1\u0315\41\0\1\u0312\1\u0313\12\0\1\u0fdb\4\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\13\0\1\u0fdc\3\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\14\0\1\u0fdd\2\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\15\0\1\u0fde\1\0\1\u0315\41\0\2\u03a1"+
+ "\1\0\1\u0fdf\15\0\1\u03a3\41\0\2\u03a1\2\0\1\u0fe0"+
+ "\14\0\1\u03a3\41\0\2\u03a1\3\0\1\u0fe1\13\0\1\u03a3"+
+ "\41\0\2\u03a1\4\0\1\u0fe2\12\0\1\u03a3\41\0\2\u03a1"+
+ "\5\0\1\u0fe3\11\0\1\u03a3\41\0\2\u03a1\6\0\1\u0fe4"+
+ "\10\0\1\u03a3\41\0\2\u03a1\7\0\1\u0fe5\7\0\1\u03a3"+
+ "\41\0\2\u03a1\10\0\1\u0fe6\6\0\1\u03a3\41\0\2\u03a1"+
+ "\11\0\1\u0fe7\5\0\1\u03a3\41\0\2\u03a1\12\0\1\u0fe8"+
+ "\4\0\1\u03a3\41\0\2\u03a1\13\0\1\u0fe9\3\0\1\u03a3"+
+ "\41\0\2\u03a1\14\0\1\u0fea\2\0\1\u03a3\41\0\2\u03a1"+
+ "\15\0\1\u0feb\1\0\1\u03a3\40\0\1\276\1\u03b0\1\u03b1"+
+ "\1\276\1\u0fec\15\276\1\u03b3\41\276\1\u03b0\1\u03b1\2\276"+
+ "\1\u0fed\14\276\1\u03b3\41\276\1\u03b0\1\u03b1\3\276\1\u0fee"+
+ "\13\276\1\u03b3\41\276\1\u03b0\1\u03b1\4\276\1\u0fef\12\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\5\276\1\u0ff0\11\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\6\276\1\u0ff1\10\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\7\276\1\u0ff2\7\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\10\276\1\u0ff3\6\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\11\276\1\u0ff4\5\276\1\u03b3\41\276\1\u03b0\1\u03b1\12\276"+
+ "\1\u0ff5\4\276\1\u03b3\41\276\1\u03b0\1\u03b1\13\276\1\u0ff6"+
+ "\3\276\1\u03b3\41\276\1\u03b0\1\u03b1\14\276\1\u0ff7\2\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\15\276\1\u0ff8\1\276\1\u03b3"+
+ "\41\276\1\u033d\1\u033e\1\276\1\u0ff9\15\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\2\276\1\u0ffa\14\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\3\276\1\u0ffb\13\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\4\276\1\u0ffc\12\276\1\u0340\41\276\1\u033d\1\u033e\5\276"+
+ "\1\u0ffd\11\276\1\u0340\41\276\1\u033d\1\u033e\6\276\1\u0ffe"+
+ "\10\276\1\u0340\41\276\1\u033d\1\u033e\7\276\1\u0fff\7\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\10\276\1\u1000\6\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\11\276\1\u1001\5\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\12\276\1\u1002\4\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\13\276\1\u1003\3\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\14\276\1\u1004\2\276\1\u0340\41\276\1\u033d\1\u033e\15\276"+
+ "\1\u1005\1\276\1\u0340\41\276\1\300\1\u02bf\1\276\1\u1006"+
+ "\15\276\1\u02c1\41\276\1\300\1\u02bf\2\276\1\u1007\14\276"+
+ "\1\u02c1\40\276\1\263\1\u03cf\1\u03d0\1\263\1\u1008\1\263"+
+ "\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\2\263\1\u1009"+
+ "\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\1\u100a\12\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\1\263\1\u100b\11\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\2\263\1\u100c\10\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\3\263\1\u100d\7\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\4\263\1\u100e\6\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\5\263\1\u100f\5\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\6\263\1\u1010\4\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\7\263\1\u1011"+
+ "\3\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\10\263"+
+ "\1\u1012\2\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\11\263\1\u1013\1\263\1\u03d2\40\263\1\344\1\u03de\1\u03df"+
+ "\1\344\1\u1014\1\344\1\u017c\13\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\2\344\1\u1015\1\u017c\13\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\1\u1016\12\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\1\344\1\u1017\11\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\2\344\1\u1018\10\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\3\344\1\u1019\7\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\4\344\1\u101a"+
+ "\6\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\5\344"+
+ "\1\u101b\5\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\6\344\1\u101c\4\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\7\344\1\u101d\3\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\10\344\1\u101e\2\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\11\344\1\u101f\1\344\1\u03e1\40\344"+
+ "\1\276\1\300\1\u02bf\3\276\1\u1020\13\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\4\276\1\u1021\12\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\5\276\1\u1022\11\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\6\276\1\u1023\10\276\1\u02c1\41\276\1\300\1\u02bf\7\276"+
+ "\1\u1024\7\276\1\u02c1\41\276\1\300\1\u02bf\10\276\1\u1025"+
+ "\6\276\1\u02c1\41\276\1\300\1\u02bf\11\276\1\u1026\5\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\12\276\1\u1027\4\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\13\276\1\u1028\3\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\14\276\1\u1029\2\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\15\276\1\u102a\1\276\1\u02c1\40\276\1\0\2\u0384"+
+ "\1\0\1\u102b\15\0\1\u0386\41\0\2\u0384\2\0\1\u102c"+
+ "\14\0\1\u0386\41\0\2\u0384\3\0\1\u102d\13\0\1\u0386"+
+ "\41\0\2\u0384\4\0\1\u102e\12\0\1\u0386\41\0\2\u0384"+
+ "\5\0\1\u102f\11\0\1\u0386\41\0\2\u0384\6\0\1\u1030"+
+ "\10\0\1\u0386\41\0\2\u0384\7\0\1\u1031\7\0\1\u0386"+
+ "\41\0\2\u0384\10\0\1\u1032\6\0\1\u0386\41\0\2\u0384"+
+ "\11\0\1\u1033\5\0\1\u0386\41\0\2\u0384\12\0\1\u1034"+
+ "\4\0\1\u0386\41\0\2\u0384\13\0\1\u1035\3\0\1\u0386"+
+ "\41\0\2\u0384\14\0\1\u1036\2\0\1\u0386\41\0\2\u0384"+
+ "\15\0\1\u1037\1\0\1\u0386\41\0\1\u0312\1\u0313\1\0"+
+ "\1\u1038\15\0\1\u0315\41\0\1\u0312\1\u0313\2\0\1\u1039"+
+ "\14\0\1\u0315\41\0\1\u0312\1\u0313\3\0\1\u103a\13\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\4\0\1\u103b\12\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\5\0\1\u103c\11\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\6\0\1\u103d\10\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\7\0\1\u103e\7\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\10\0\1\u103f\6\0\1\u0315\41\0\1\u0312\1\u0313\11\0"+
+ "\1\u1040\5\0\1\u0315\41\0\1\u0312\1\u0313\12\0\1\u1041"+
+ "\4\0\1\u0315\41\0\1\u0312\1\u0313\13\0\1\u1042\3\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\14\0\1\u1043\2\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\15\0\1\u1044\1\0\1\u0315\41\0"+
+ "\2\u03a1\1\0\1\u1045\15\0\1\u03a3\41\0\2\u03a1\2\0"+
+ "\1\u1046\14\0\1\u03a3\41\0\2\u03a1\3\0\1\u1047\13\0"+
+ "\1\u03a3\41\0\2\u03a1\4\0\1\u1048\12\0\1\u03a3\41\0"+
+ "\2\u03a1\5\0\1\u1049\11\0\1\u03a3\41\0\2\u03a1\6\0"+
+ "\1\u104a\10\0\1\u03a3\41\0\2\u03a1\7\0\1\u104b\7\0"+
+ "\1\u03a3\41\0\2\u03a1\10\0\1\u104c\6\0\1\u03a3\41\0"+
+ "\2\u03a1\11\0\1\u104d\5\0\1\u03a3\41\0\2\u03a1\12\0"+
+ "\1\u104e\4\0\1\u03a3\41\0\2\u03a1\13\0\1\u104f\3\0"+
+ "\1\u03a3\41\0\2\u03a1\14\0\1\u1050\2\0\1\u03a3\41\0"+
+ "\2\u03a1\15\0\1\u1051\1\0\1\u03a3\40\0\1\276\1\u03b0"+
+ "\1\u03b1\1\276\1\u1052\15\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\2\276\1\u1053\14\276\1\u03b3\41\276\1\u03b0\1\u03b1\3\276"+
+ "\1\u1054\13\276\1\u03b3\41\276\1\u03b0\1\u03b1\4\276\1\u1055"+
+ "\12\276\1\u03b3\41\276\1\u03b0\1\u03b1\5\276\1\u1056\11\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\6\276\1\u1057\10\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\7\276\1\u1058\7\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\10\276\1\u1059\6\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\11\276\1\u105a\5\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\12\276\1\u105b\4\276\1\u03b3\41\276\1\u03b0\1\u03b1\13\276"+
+ "\1\u105c\3\276\1\u03b3\41\276\1\u03b0\1\u03b1\14\276\1\u105d"+
+ "\2\276\1\u03b3\41\276\1\u03b0\1\u03b1\15\276\1\u105e\1\276"+
+ "\1\u03b3\41\276\1\u033d\1\u033e\1\276\1\u105f\15\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\2\276\1\u1060\14\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\3\276\1\u1061\13\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\4\276\1\u1062\12\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\5\276\1\u1063\11\276\1\u0340\41\276\1\u033d\1\u033e\6\276"+
+ "\1\u1064\10\276\1\u0340\41\276\1\u033d\1\u033e\7\276\1\u1065"+
+ "\7\276\1\u0340\41\276\1\u033d\1\u033e\10\276\1\u1066\6\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\11\276\1\u1067\5\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\12\276\1\u1068\4\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\13\276\1\u1069\3\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\14\276\1\u106a\2\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\15\276\1\u106b\1\276\1\u0340\41\276\1\300\1\u02bf\1\276"+
+ "\1\u106c\15\276\1\u02c1\41\276\1\300\1\u02bf\2\276\1\u106d"+
+ "\14\276\1\u02c1\40\276\1\263\1\u03cf\1\u03d0\1\263\1\u106e"+
+ "\1\263\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\2\263"+
+ "\1\u106f\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\1\u1070\12\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\1\263\1\u1071\11\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\2\263\1\u1072\10\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\3\263\1\u1073\7\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\4\263\1\u1074\6\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\5\263\1\u1075\5\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\6\263\1\u1076"+
+ "\4\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\7\263"+
+ "\1\u1077\3\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\10\263\1\u1078\2\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\11\263\1\u1079\1\263\1\u03d2\40\263\1\344\1\u03de"+
+ "\1\u03df\1\344\1\u107a\1\344\1\u017c\13\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\2\344\1\u107b\1\u017c\13\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\1\u107c\12\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\1\344\1\u107d\11\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\2\344\1\u107e\10\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\3\344\1\u107f"+
+ "\7\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\4\344"+
+ "\1\u1080\6\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\5\344\1\u1081\5\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\6\344\1\u1082\4\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\7\344\1\u1083\3\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\10\344\1\u1084\2\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\11\344\1\u1085\1\344\1\u03e1"+
+ "\40\344\1\276\1\300\1\u02bf\3\276\1\u1086\13\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\4\276\1\u1087\12\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\5\276\1\u1088\11\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\6\276\1\u1089\10\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\7\276\1\u108a\7\276\1\u02c1\41\276\1\300\1\u02bf\10\276"+
+ "\1\u108b\6\276\1\u02c1\41\276\1\300\1\u02bf\11\276\1\u108c"+
+ "\5\276\1\u02c1\41\276\1\300\1\u02bf\12\276\1\u108d\4\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\13\276\1\u108e\3\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\14\276\1\u108f\2\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\15\276\1\u1090\1\276\1\u02c1\40\276\1\0"+
+ "\2\u0384\1\0\1\u1091\15\0\1\u0386\41\0\2\u0384\2\0"+
+ "\1\u1092\14\0\1\u0386\41\0\2\u0384\3\0\1\u1093\13\0"+
+ "\1\u0386\41\0\2\u0384\4\0\1\u1094\12\0\1\u0386\41\0"+
+ "\2\u0384\5\0\1\u1095\11\0\1\u0386\41\0\2\u0384\6\0"+
+ "\1\u1096\10\0\1\u0386\41\0\2\u0384\7\0\1\u1097\7\0"+
+ "\1\u0386\41\0\2\u0384\10\0\1\u1098\6\0\1\u0386\41\0"+
+ "\2\u0384\11\0\1\u1099\5\0\1\u0386\41\0\2\u0384\12\0"+
+ "\1\u109a\4\0\1\u0386\41\0\2\u0384\13\0\1\u109b\3\0"+
+ "\1\u0386\41\0\2\u0384\14\0\1\u109c\2\0\1\u0386\41\0"+
+ "\2\u0384\15\0\1\u109d\1\0\1\u0386\41\0\1\u0312\1\u0313"+
+ "\1\0\1\u109e\15\0\1\u0315\41\0\1\u0312\1\u0313\2\0"+
+ "\1\u109f\14\0\1\u0315\41\0\1\u0312\1\u0313\3\0\1\u10a0"+
+ "\13\0\1\u0315\41\0\1\u0312\1\u0313\4\0\1\u10a1\12\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\5\0\1\u10a2\11\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\6\0\1\u10a3\10\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\7\0\1\u10a4\7\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\10\0\1\u10a5\6\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\11\0\1\u10a6\5\0\1\u0315\41\0\1\u0312\1\u0313\12\0"+
+ "\1\u10a7\4\0\1\u0315\41\0\1\u0312\1\u0313\13\0\1\u10a8"+
+ "\3\0\1\u0315\41\0\1\u0312\1\u0313\14\0\1\u10a9\2\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\15\0\1\u10aa\1\0\1\u0315"+
+ "\41\0\2\u03a1\1\0\1\u10ab\15\0\1\u03a3\41\0\2\u03a1"+
+ "\2\0\1\u10ac\14\0\1\u03a3\41\0\2\u03a1\3\0\1\u10ad"+
+ "\13\0\1\u03a3\41\0\2\u03a1\4\0\1\u10ae\12\0\1\u03a3"+
+ "\41\0\2\u03a1\5\0\1\u10af\11\0\1\u03a3\41\0\2\u03a1"+
+ "\6\0\1\u10b0\10\0\1\u03a3\41\0\2\u03a1\7\0\1\u10b1"+
+ "\7\0\1\u03a3\41\0\2\u03a1\10\0\1\u10b2\6\0\1\u03a3"+
+ "\41\0\2\u03a1\11\0\1\u10b3\5\0\1\u03a3\41\0\2\u03a1"+
+ "\12\0\1\u10b4\4\0\1\u03a3\41\0\2\u03a1\13\0\1\u10b5"+
+ "\3\0\1\u03a3\41\0\2\u03a1\14\0\1\u10b6\2\0\1\u03a3"+
+ "\41\0\2\u03a1\15\0\1\u10b7\1\0\1\u03a3\40\0\1\276"+
+ "\1\u03b0\1\u03b1\1\276\1\u10b8\15\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\2\276\1\u10b9\14\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\3\276\1\u10ba\13\276\1\u03b3\41\276\1\u03b0\1\u03b1\4\276"+
+ "\1\u10bb\12\276\1\u03b3\41\276\1\u03b0\1\u03b1\5\276\1\u10bc"+
+ "\11\276\1\u03b3\41\276\1\u03b0\1\u03b1\6\276\1\u10bd\10\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\7\276\1\u10be\7\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\10\276\1\u10bf\6\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\11\276\1\u10c0\5\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\12\276\1\u10c1\4\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\13\276\1\u10c2\3\276\1\u03b3\41\276\1\u03b0\1\u03b1\14\276"+
+ "\1\u10c3\2\276\1\u03b3\41\276\1\u03b0\1\u03b1\15\276\1\u10c4"+
+ "\1\276\1\u03b3\41\276\1\u033d\1\u033e\1\276\1\u10c5\15\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\2\276\1\u10c6\14\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\3\276\1\u10c7\13\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\4\276\1\u10c8\12\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\5\276\1\u10c9\11\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\6\276\1\u10ca\10\276\1\u0340\41\276\1\u033d\1\u033e\7\276"+
+ "\1\u10cb\7\276\1\u0340\41\276\1\u033d\1\u033e\10\276\1\u10cc"+
+ "\6\276\1\u0340\41\276\1\u033d\1\u033e\11\276\1\u10cd\5\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\12\276\1\u10ce\4\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\13\276\1\u10cf\3\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\14\276\1\u10d0\2\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\15\276\1\u10d1\1\276\1\u0340\41\276\1\300\1\u02bf"+
+ "\1\276\1\u10d2\15\276\1\u02c1\41\276\1\300\1\u02bf\2\276"+
+ "\1\u10d3\14\276\1\u02c1\40\276\1\263\1\u03cf\1\u03d0\1\263"+
+ "\1\u10d4\1\263\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\2\263\1\u10d5\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\1\u10d6\12\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\1\263\1\u10d7\11\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\2\263\1\u10d8\10\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\3\263\1\u10d9\7\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\4\263\1\u10da\6\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\5\263\1\u10db"+
+ "\5\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\6\263"+
+ "\1\u10dc\4\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\7\263\1\u10dd\3\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\10\263\1\u10de\2\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\11\263\1\u10df\1\263\1\u03d2\40\263\1\344"+
+ "\1\u03de\1\u03df\1\344\1\u10e0\1\344\1\u017c\13\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\2\344\1\u10e1\1\u017c\13\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\1\u10e2\12\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\1\344\1\u10e3\11\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\2\344\1\u10e4"+
+ "\10\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\3\344"+
+ "\1\u10e5\7\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\4\344\1\u10e6\6\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\5\344\1\u10e7\5\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\6\344\1\u10e8\4\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\7\344\1\u10e9\3\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\10\344\1\u10ea\2\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\11\344\1\u10eb\1\344"+
+ "\1\u03e1\40\344\1\276\1\300\1\u02bf\3\276\1\u10ec\13\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\4\276\1\u10ed\12\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\5\276\1\u10ee\11\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\6\276\1\u10ef\10\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\7\276\1\u10f0\7\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\10\276\1\u10f1\6\276\1\u02c1\41\276\1\300\1\u02bf\11\276"+
+ "\1\u10f2\5\276\1\u02c1\41\276\1\300\1\u02bf\12\276\1\u10f3"+
+ "\4\276\1\u02c1\41\276\1\300\1\u02bf\13\276\1\u10f4\3\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\14\276\1\u10f5\2\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\15\276\1\u10f6\1\276\1\u02c1\40\276"+
+ "\1\0\2\u0384\1\0\1\u10f7\15\0\1\u0386\41\0\2\u0384"+
+ "\2\0\1\u10f8\14\0\1\u0386\41\0\2\u0384\3\0\1\u10f9"+
+ "\13\0\1\u0386\41\0\2\u0384\4\0\1\u10fa\12\0\1\u0386"+
+ "\41\0\2\u0384\5\0\1\u10fb\11\0\1\u0386\41\0\2\u0384"+
+ "\6\0\1\u10fc\10\0\1\u0386\41\0\2\u0384\7\0\1\u10fd"+
+ "\7\0\1\u0386\41\0\2\u0384\10\0\1\u10fe\6\0\1\u0386"+
+ "\41\0\2\u0384\11\0\1\u10ff\5\0\1\u0386\41\0\2\u0384"+
+ "\12\0\1\u1100\4\0\1\u0386\41\0\2\u0384\13\0\1\u1101"+
+ "\3\0\1\u0386\41\0\2\u0384\14\0\1\u1102\2\0\1\u0386"+
+ "\41\0\2\u0384\15\0\1\u1103\1\0\1\u0386\41\0\1\u0312"+
+ "\1\u0313\1\0\1\u1104\15\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\2\0\1\u1105\14\0\1\u0315\41\0\1\u0312\1\u0313\3\0"+
+ "\1\u1106\13\0\1\u0315\41\0\1\u0312\1\u0313\4\0\1\u1107"+
+ "\12\0\1\u0315\41\0\1\u0312\1\u0313\5\0\1\u1108\11\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\6\0\1\u1109\10\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\7\0\1\u110a\7\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\10\0\1\u110b\6\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\11\0\1\u110c\5\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\12\0\1\u110d\4\0\1\u0315\41\0\1\u0312\1\u0313\13\0"+
+ "\1\u110e\3\0\1\u0315\41\0\1\u0312\1\u0313\14\0\1\u110f"+
+ "\2\0\1\u0315\41\0\1\u0312\1\u0313\15\0\1\u1110\1\0"+
+ "\1\u0315\41\0\2\u03a1\1\0\1\u1111\15\0\1\u03a3\41\0"+
+ "\2\u03a1\2\0\1\u1112\14\0\1\u03a3\41\0\2\u03a1\3\0"+
+ "\1\u1113\13\0\1\u03a3\41\0\2\u03a1\4\0\1\u1114\12\0"+
+ "\1\u03a3\41\0\2\u03a1\5\0\1\u1115\11\0\1\u03a3\41\0"+
+ "\2\u03a1\6\0\1\u1116\10\0\1\u03a3\41\0\2\u03a1\7\0"+
+ "\1\u1117\7\0\1\u03a3\41\0\2\u03a1\10\0\1\u1118\6\0"+
+ "\1\u03a3\41\0\2\u03a1\11\0\1\u1119\5\0\1\u03a3\41\0"+
+ "\2\u03a1\12\0\1\u111a\4\0\1\u03a3\41\0\2\u03a1\13\0"+
+ "\1\u111b\3\0\1\u03a3\41\0\2\u03a1\14\0\1\u111c\2\0"+
+ "\1\u03a3\41\0\2\u03a1\15\0\1\u111d\1\0\1\u03a3\40\0"+
+ "\1\276\1\u03b0\1\u03b1\1\276\1\u111e\15\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\2\276\1\u111f\14\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\3\276\1\u1120\13\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\4\276\1\u1121\12\276\1\u03b3\41\276\1\u03b0\1\u03b1\5\276"+
+ "\1\u1122\11\276\1\u03b3\41\276\1\u03b0\1\u03b1\6\276\1\u1123"+
+ "\10\276\1\u03b3\41\276\1\u03b0\1\u03b1\7\276\1\u1124\7\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\10\276\1\u1125\6\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\11\276\1\u1126\5\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\12\276\1\u1127\4\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\13\276\1\u1128\3\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\14\276\1\u1129\2\276\1\u03b3\41\276\1\u03b0\1\u03b1\15\276"+
+ "\1\u112a\1\276\1\u03b3\41\276\1\u033d\1\u033e\1\276\1\u112b"+
+ "\15\276\1\u0340\41\276\1\u033d\1\u033e\2\276\1\u112c\14\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\3\276\1\u112d\13\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\4\276\1\u112e\12\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\5\276\1\u112f\11\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\6\276\1\u1130\10\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\7\276\1\u1131\7\276\1\u0340\41\276\1\u033d\1\u033e\10\276"+
+ "\1\u1132\6\276\1\u0340\41\276\1\u033d\1\u033e\11\276\1\u1133"+
+ "\5\276\1\u0340\41\276\1\u033d\1\u033e\12\276\1\u1134\4\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\13\276\1\u1135\3\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\14\276\1\u1136\2\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\15\276\1\u1137\1\276\1\u0340\41\276\1\300"+
+ "\1\u02bf\1\276\1\u1138\15\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\2\276\1\u1139\14\276\1\u02c1\40\276\1\263\1\u03cf\1\u03d0"+
+ "\1\263\1\u113a\1\263\1\u0136\13\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\2\263\1\u113b\1\u0136\13\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\1\u113c\12\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\1\263\1\u113d\11\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\2\263\1\u113e\10\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\3\263\1\u113f\7\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\4\263\1\u1140"+
+ "\6\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\5\263"+
+ "\1\u1141\5\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\6\263\1\u1142\4\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\7\263\1\u1143\3\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\10\263\1\u1144\2\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\11\263\1\u1145\1\263\1\u03d2\40\263"+
+ "\1\344\1\u03de\1\u03df\1\344\1\u1146\1\344\1\u017c\13\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\2\344\1\u1147\1\u017c\13\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\1\u1148\12\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\1\344\1\u1149"+
+ "\11\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\2\344"+
+ "\1\u114a\10\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\3\344\1\u114b\7\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\4\344\1\u114c\6\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\5\344\1\u114d\5\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\6\344\1\u114e\4\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\7\344\1\u114f\3\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\10\344\1\u1150\2\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\11\344\1\u1151"+
+ "\1\344\1\u03e1\40\344\1\276\1\300\1\u02bf\3\276\1\u1152"+
+ "\13\276\1\u02c1\41\276\1\300\1\u02bf\4\276\1\u1153\12\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\5\276\1\u1154\11\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\6\276\1\u1155\10\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\7\276\1\u1156\7\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\10\276\1\u1157\6\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\11\276\1\u1158\5\276\1\u02c1\41\276\1\300\1\u02bf\12\276"+
+ "\1\u1159\4\276\1\u02c1\41\276\1\300\1\u02bf\13\276\1\u115a"+
+ "\3\276\1\u02c1\41\276\1\300\1\u02bf\14\276\1\u115b\2\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\15\276\1\u115c\1\276\1\u02c1"+
+ "\40\276\1\0\2\u0384\1\0\1\u115d\15\0\1\u0386\41\0"+
+ "\2\u0384\2\0\1\u115e\14\0\1\u0386\41\0\2\u0384\3\0"+
+ "\1\u115f\13\0\1\u0386\41\0\2\u0384\4\0\1\u1160\12\0"+
+ "\1\u0386\41\0\2\u0384\5\0\1\u1161\11\0\1\u0386\41\0"+
+ "\2\u0384\6\0\1\u1162\10\0\1\u0386\41\0\2\u0384\7\0"+
+ "\1\u1163\7\0\1\u0386\41\0\2\u0384\10\0\1\u1164\6\0"+
+ "\1\u0386\41\0\2\u0384\11\0\1\u1165\5\0\1\u0386\41\0"+
+ "\2\u0384\12\0\1\u1166\4\0\1\u0386\41\0\2\u0384\13\0"+
+ "\1\u1167\3\0\1\u0386\41\0\2\u0384\14\0\1\u1168\2\0"+
+ "\1\u0386\41\0\2\u0384\15\0\1\u1169\1\0\1\u0386\41\0"+
+ "\1\u0312\1\u0313\1\0\1\u116a\15\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\2\0\1\u116b\14\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\3\0\1\u116c\13\0\1\u0315\41\0\1\u0312\1\u0313\4\0"+
+ "\1\u116d\12\0\1\u0315\41\0\1\u0312\1\u0313\5\0\1\u116e"+
+ "\11\0\1\u0315\41\0\1\u0312\1\u0313\6\0\1\u116f\10\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\7\0\1\u1170\7\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\10\0\1\u1171\6\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\11\0\1\u1172\5\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\12\0\1\u1173\4\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\13\0\1\u1174\3\0\1\u0315\41\0\1\u0312\1\u0313\14\0"+
+ "\1\u1175\2\0\1\u0315\41\0\1\u0312\1\u0313\15\0\1\u1176"+
+ "\1\0\1\u0315\41\0\2\u03a1\1\0\1\u1177\15\0\1\u03a3"+
+ "\41\0\2\u03a1\2\0\1\u1178\14\0\1\u03a3\41\0\2\u03a1"+
+ "\3\0\1\u1179\13\0\1\u03a3\41\0\2\u03a1\4\0\1\u117a"+
+ "\12\0\1\u03a3\41\0\2\u03a1\5\0\1\u117b\11\0\1\u03a3"+
+ "\41\0\2\u03a1\6\0\1\u117c\10\0\1\u03a3\41\0\2\u03a1"+
+ "\7\0\1\u117d\7\0\1\u03a3\41\0\2\u03a1\10\0\1\u117e"+
+ "\6\0\1\u03a3\41\0\2\u03a1\11\0\1\u117f\5\0\1\u03a3"+
+ "\41\0\2\u03a1\12\0\1\u1180\4\0\1\u03a3\41\0\2\u03a1"+
+ "\13\0\1\u1181\3\0\1\u03a3\41\0\2\u03a1\14\0\1\u1182"+
+ "\2\0\1\u03a3\41\0\2\u03a1\15\0\1\u1183\1\0\1\u03a3"+
+ "\40\0\1\276\1\u03b0\1\u03b1\1\276\1\u1184\15\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\2\276\1\u1185\14\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\3\276\1\u1186\13\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\4\276\1\u1187\12\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\5\276\1\u1188\11\276\1\u03b3\41\276\1\u03b0\1\u03b1\6\276"+
+ "\1\u1189\10\276\1\u03b3\41\276\1\u03b0\1\u03b1\7\276\1\u118a"+
+ "\7\276\1\u03b3\41\276\1\u03b0\1\u03b1\10\276\1\u118b\6\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\11\276\1\u118c\5\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\12\276\1\u118d\4\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\13\276\1\u118e\3\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\14\276\1\u118f\2\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\15\276\1\u1190\1\276\1\u03b3\41\276\1\u033d\1\u033e\1\276"+
+ "\1\u1191\15\276\1\u0340\41\276\1\u033d\1\u033e\2\276\1\u1192"+
+ "\14\276\1\u0340\41\276\1\u033d\1\u033e\3\276\1\u1193\13\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\4\276\1\u1194\12\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\5\276\1\u1195\11\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\6\276\1\u1196\10\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\7\276\1\u1197\7\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\10\276\1\u1198\6\276\1\u0340\41\276\1\u033d\1\u033e\11\276"+
+ "\1\u1199\5\276\1\u0340\41\276\1\u033d\1\u033e\12\276\1\u119a"+
+ "\4\276\1\u0340\41\276\1\u033d\1\u033e\13\276\1\u119b\3\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\14\276\1\u119c\2\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\15\276\1\u119d\1\276\1\u0340\41\276"+
+ "\1\300\1\u02bf\1\276\1\u119e\15\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\2\276\1\u119f\14\276\1\u02c1\40\276\1\263\1\u03cf"+
+ "\1\u03d0\1\263\1\u11a0\1\263\1\u0136\13\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\2\263\1\u11a1\1\u0136\13\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\1\u11a2\12\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\1\263\1\u11a3\11\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\2\263\1\u11a4\10\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\3\263\1\u11a5"+
+ "\7\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\4\263"+
+ "\1\u11a6\6\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\5\263\1\u11a7\5\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\6\263\1\u11a8\4\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\7\263\1\u11a9\3\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\10\263\1\u11aa\2\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\11\263\1\u11ab\1\263\1\u03d2"+
+ "\40\263\1\344\1\u03de\1\u03df\1\344\1\u11ac\1\344\1\u017c"+
+ "\13\344\1\u03e1\41\344\1\u03de\1\u03df\2\344\1\u11ad\1\u017c"+
+ "\13\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\1\u11ae"+
+ "\12\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\1\344"+
+ "\1\u11af\11\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\2\344\1\u11b0\10\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\3\344\1\u11b1\7\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\4\344\1\u11b2\6\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\5\344\1\u11b3\5\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\6\344\1\u11b4\4\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\7\344\1\u11b5\3\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\10\344\1\u11b6"+
+ "\2\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\11\344"+
+ "\1\u11b7\1\344\1\u03e1\40\344\1\276\1\300\1\u02bf\3\276"+
+ "\1\u11b8\13\276\1\u02c1\41\276\1\300\1\u02bf\4\276\1\u11b9"+
+ "\12\276\1\u02c1\41\276\1\300\1\u02bf\5\276\1\u11ba\11\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\6\276\1\u11bb\10\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\7\276\1\u11bc\7\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\10\276\1\u11bd\6\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\11\276\1\u11be\5\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\12\276\1\u11bf\4\276\1\u02c1\41\276\1\300\1\u02bf\13\276"+
+ "\1\u11c0\3\276\1\u02c1\41\276\1\300\1\u02bf\14\276\1\u11c1"+
+ "\2\276\1\u02c1\41\276\1\300\1\u02bf\15\276\1\u11c2\1\276"+
+ "\1\u02c1\40\276\1\0\2\u0384\1\0\1\u11c3\15\0\1\u0386"+
+ "\41\0\2\u0384\2\0\1\u11c4\14\0\1\u0386\41\0\2\u0384"+
+ "\3\0\1\u11c5\13\0\1\u0386\41\0\2\u0384\4\0\1\u11c6"+
+ "\12\0\1\u0386\41\0\2\u0384\5\0\1\u11c7\11\0\1\u0386"+
+ "\41\0\2\u0384\6\0\1\u11c8\10\0\1\u0386\41\0\2\u0384"+
+ "\7\0\1\u11c9\7\0\1\u0386\41\0\2\u0384\10\0\1\u11ca"+
+ "\6\0\1\u0386\41\0\2\u0384\11\0\1\u11cb\5\0\1\u0386"+
+ "\41\0\2\u0384\12\0\1\u11cc\4\0\1\u0386\41\0\2\u0384"+
+ "\13\0\1\u11cd\3\0\1\u0386\41\0\2\u0384\14\0\1\u11ce"+
+ "\2\0\1\u0386\41\0\2\u0384\15\0\1\u11cf\1\0\1\u0386"+
+ "\41\0\1\u0312\1\u0313\1\0\1\u11d0\15\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\2\0\1\u11d1\14\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\3\0\1\u11d2\13\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\4\0\1\u11d3\12\0\1\u0315\41\0\1\u0312\1\u0313\5\0"+
+ "\1\u11d4\11\0\1\u0315\41\0\1\u0312\1\u0313\6\0\1\u11d5"+
+ "\10\0\1\u0315\41\0\1\u0312\1\u0313\7\0\1\u11d6\7\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\10\0\1\u11d7\6\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\11\0\1\u11d8\5\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\12\0\1\u11d9\4\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\13\0\1\u11da\3\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\14\0\1\u11db\2\0\1\u0315\41\0\1\u0312\1\u0313\15\0"+
+ "\1\u11dc\1\0\1\u0315\41\0\2\u03a1\1\0\1\u11dd\15\0"+
+ "\1\u03a3\41\0\2\u03a1\2\0\1\u11de\14\0\1\u03a3\41\0"+
+ "\2\u03a1\3\0\1\u11df\13\0\1\u03a3\41\0\2\u03a1\4\0"+
+ "\1\u11e0\12\0\1\u03a3\41\0\2\u03a1\5\0\1\u11e1\11\0"+
+ "\1\u03a3\41\0\2\u03a1\6\0\1\u11e2\10\0\1\u03a3\41\0"+
+ "\2\u03a1\7\0\1\u11e3\7\0\1\u03a3\41\0\2\u03a1\10\0"+
+ "\1\u11e4\6\0\1\u03a3\41\0\2\u03a1\11\0\1\u11e5\5\0"+
+ "\1\u03a3\41\0\2\u03a1\12\0\1\u11e6\4\0\1\u03a3\41\0"+
+ "\2\u03a1\13\0\1\u11e7\3\0\1\u03a3\41\0\2\u03a1\14\0"+
+ "\1\u11e8\2\0\1\u03a3\41\0\2\u03a1\15\0\1\u11e9\1\0"+
+ "\1\u03a3\40\0\1\276\1\u03b0\1\u03b1\1\276\1\u11ea\15\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\2\276\1\u11eb\14\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\3\276\1\u11ec\13\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\4\276\1\u11ed\12\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\5\276\1\u11ee\11\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\6\276\1\u11ef\10\276\1\u03b3\41\276\1\u03b0\1\u03b1\7\276"+
+ "\1\u11f0\7\276\1\u03b3\41\276\1\u03b0\1\u03b1\10\276\1\u11f1"+
+ "\6\276\1\u03b3\41\276\1\u03b0\1\u03b1\11\276\1\u11f2\5\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\12\276\1\u11f3\4\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\13\276\1\u11f4\3\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\14\276\1\u11f5\2\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\15\276\1\u11f6\1\276\1\u03b3\41\276\1\u033d\1\u033e"+
+ "\1\276\1\u11f7\15\276\1\u0340\41\276\1\u033d\1\u033e\2\276"+
+ "\1\u11f8\14\276\1\u0340\41\276\1\u033d\1\u033e\3\276\1\u11f9"+
+ "\13\276\1\u0340\41\276\1\u033d\1\u033e\4\276\1\u11fa\12\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\5\276\1\u11fb\11\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\6\276\1\u11fc\10\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\7\276\1\u11fd\7\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\10\276\1\u11fe\6\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\11\276\1\u11ff\5\276\1\u0340\41\276\1\u033d\1\u033e\12\276"+
+ "\1\u1200\4\276\1\u0340\41\276\1\u033d\1\u033e\13\276\1\u1201"+
+ "\3\276\1\u0340\41\276\1\u033d\1\u033e\14\276\1\u1202\2\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\15\276\1\u1203\1\276\1\u0340"+
+ "\41\276\1\300\1\u02bf\1\276\1\u1204\15\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\2\276\1\u1205\14\276\1\u02c1\40\276\1\263"+
+ "\1\u03cf\1\u03d0\1\263\1\u1206\1\263\1\u0136\13\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\2\263\1\u1207\1\u0136\13\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\u1208\12\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\263\1\u1209\11\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\2\263\1\u120a"+
+ "\10\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\3\263"+
+ "\1\u120b\7\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\4\263\1\u120c\6\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\5\263\1\u120d\5\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\6\263\1\u120e\4\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\7\263\1\u120f\3\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\10\263\1\u1210\2\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\11\263\1\u1211\1\263"+
+ "\1\u03d2\40\263\1\344\1\u03de\1\u03df\1\344\1\u1212\1\344"+
+ "\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df\2\344\1\u1213"+
+ "\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\1\u1214\12\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\1\344\1\u1215\11\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\2\344\1\u1216\10\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\3\344\1\u1217\7\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\4\344\1\u1218\6\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\5\344\1\u1219\5\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\6\344\1\u121a\4\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\7\344\1\u121b"+
+ "\3\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\10\344"+
+ "\1\u121c\2\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\11\344\1\u121d\1\344\1\u03e1\40\344\1\276\1\300\1\u02bf"+
+ "\3\276\1\u121e\13\276\1\u02c1\41\276\1\300\1\u02bf\4\276"+
+ "\1\u121f\12\276\1\u02c1\41\276\1\300\1\u02bf\5\276\1\u1220"+
+ "\11\276\1\u02c1\41\276\1\300\1\u02bf\6\276\1\u1221\10\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\7\276\1\u1222\7\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\10\276\1\u1223\6\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\11\276\1\u1224\5\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\12\276\1\u1225\4\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\13\276\1\u1226\3\276\1\u02c1\41\276\1\300\1\u02bf\14\276"+
+ "\1\u1227\2\276\1\u02c1\41\276\1\300\1\u02bf\15\276\1\u1228"+
+ "\1\276\1\u02c1\40\276\1\0\2\u0384\1\0\1\u1229\15\0"+
+ "\1\u0386\41\0\2\u0384\2\0\1\u122a\14\0\1\u0386\41\0"+
+ "\2\u0384\3\0\1\u122b\13\0\1\u0386\41\0\2\u0384\4\0"+
+ "\1\u122c\12\0\1\u0386\41\0\2\u0384\5\0\1\u122d\11\0"+
+ "\1\u0386\41\0\2\u0384\6\0\1\u122e\10\0\1\u0386\41\0"+
+ "\2\u0384\7\0\1\u122f\7\0\1\u0386\41\0\2\u0384\10\0"+
+ "\1\u1230\6\0\1\u0386\41\0\2\u0384\11\0\1\u1231\5\0"+
+ "\1\u0386\41\0\2\u0384\12\0\1\u1232\4\0\1\u0386\41\0"+
+ "\2\u0384\13\0\1\u1233\3\0\1\u0386\41\0\2\u0384\14\0"+
+ "\1\u1234\2\0\1\u0386\41\0\2\u0384\15\0\1\u1235\1\0"+
+ "\1\u0386\41\0\1\u0312\1\u0313\1\0\1\u1236\15\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\2\0\1\u1237\14\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\3\0\1\u1238\13\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\4\0\1\u1239\12\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\5\0\1\u123a\11\0\1\u0315\41\0\1\u0312\1\u0313\6\0"+
+ "\1\u123b\10\0\1\u0315\41\0\1\u0312\1\u0313\7\0\1\u123c"+
+ "\7\0\1\u0315\41\0\1\u0312\1\u0313\10\0\1\u123d\6\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\11\0\1\u123e\5\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\12\0\1\u123f\4\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\13\0\1\u1240\3\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\14\0\1\u1241\2\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\15\0\1\u1242\1\0\1\u0315\41\0\2\u03a1\1\0\1\u1243"+
+ "\15\0\1\u03a3\41\0\2\u03a1\2\0\1\u1244\14\0\1\u03a3"+
+ "\41\0\2\u03a1\3\0\1\u1245\13\0\1\u03a3\41\0\2\u03a1"+
+ "\4\0\1\u1246\12\0\1\u03a3\41\0\2\u03a1\5\0\1\u1247"+
+ "\11\0\1\u03a3\41\0\2\u03a1\6\0\1\u1248\10\0\1\u03a3"+
+ "\41\0\2\u03a1\7\0\1\u1249\7\0\1\u03a3\41\0\2\u03a1"+
+ "\10\0\1\u124a\6\0\1\u03a3\41\0\2\u03a1\11\0\1\u124b"+
+ "\5\0\1\u03a3\41\0\2\u03a1\12\0\1\u124c\4\0\1\u03a3"+
+ "\41\0\2\u03a1\13\0\1\u124d\3\0\1\u03a3\41\0\2\u03a1"+
+ "\14\0\1\u124e\2\0\1\u03a3\41\0\2\u03a1\15\0\1\u124f"+
+ "\1\0\1\u03a3\40\0\1\276\1\u03b0\1\u03b1\1\276\1\u1250"+
+ "\15\276\1\u03b3\41\276\1\u03b0\1\u03b1\2\276\1\u1251\14\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\3\276\1\u1252\13\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\4\276\1\u1253\12\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\5\276\1\u1254\11\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\6\276\1\u1255\10\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\7\276\1\u1256\7\276\1\u03b3\41\276\1\u03b0\1\u03b1\10\276"+
+ "\1\u1257\6\276\1\u03b3\41\276\1\u03b0\1\u03b1\11\276\1\u1258"+
+ "\5\276\1\u03b3\41\276\1\u03b0\1\u03b1\12\276\1\u1259\4\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\13\276\1\u125a\3\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\14\276\1\u125b\2\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\15\276\1\u125c\1\276\1\u03b3\41\276\1\u033d"+
+ "\1\u033e\1\276\1\u125d\15\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\2\276\1\u125e\14\276\1\u0340\41\276\1\u033d\1\u033e\3\276"+
+ "\1\u125f\13\276\1\u0340\41\276\1\u033d\1\u033e\4\276\1\u1260"+
+ "\12\276\1\u0340\41\276\1\u033d\1\u033e\5\276\1\u1261\11\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\6\276\1\u1262\10\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\7\276\1\u1263\7\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\10\276\1\u1264\6\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\11\276\1\u1265\5\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\12\276\1\u1266\4\276\1\u0340\41\276\1\u033d\1\u033e\13\276"+
+ "\1\u1267\3\276\1\u0340\41\276\1\u033d\1\u033e\14\276\1\u1268"+
+ "\2\276\1\u0340\41\276\1\u033d\1\u033e\15\276\1\u1269\1\276"+
+ "\1\u0340\41\276\1\300\1\u02bf\1\276\1\u126a\15\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\2\276\1\u126b\14\276\1\u02c1\40\276"+
+ "\1\263\1\u03cf\1\u03d0\1\263\1\u126c\1\263\1\u0136\13\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\2\263\1\u126d\1\u0136\13\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\u126e\12\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\263\1\u126f"+
+ "\11\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\2\263"+
+ "\1\u1270\10\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\3\263\1\u1271\7\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\4\263\1\u1272\6\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\5\263\1\u1273\5\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\6\263\1\u1274\4\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\7\263\1\u1275\3\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\10\263\1\u1276\2\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\11\263\1\u1277"+
+ "\1\263\1\u03d2\40\263\1\344\1\u03de\1\u03df\1\344\1\u1278"+
+ "\1\344\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df\2\344"+
+ "\1\u1279\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\1\u127a\12\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\1\344\1\u127b\11\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\2\344\1\u127c\10\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\3\344\1\u127d\7\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\4\344\1\u127e\6\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\5\344\1\u127f\5\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\6\344\1\u1280"+
+ "\4\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\7\344"+
+ "\1\u1281\3\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\10\344\1\u1282\2\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\11\344\1\u1283\1\344\1\u03e1\40\344\1\276\1\300"+
+ "\1\u02bf\3\276\1\u1284\13\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\4\276\1\u1285\12\276\1\u02c1\41\276\1\300\1\u02bf\5\276"+
+ "\1\u1286\11\276\1\u02c1\41\276\1\300\1\u02bf\6\276\1\u1287"+
+ "\10\276\1\u02c1\41\276\1\300\1\u02bf\7\276\1\u1288\7\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\10\276\1\u1289\6\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\11\276\1\u128a\5\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\12\276\1\u128b\4\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\13\276\1\u128c\3\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\14\276\1\u128d\2\276\1\u02c1\41\276\1\300\1\u02bf\15\276"+
+ "\1\u128e\1\276\1\u02c1\40\276\1\0\2\u0384\1\0\1\u128f"+
+ "\15\0\1\u0386\41\0\2\u0384\2\0\1\u1290\14\0\1\u0386"+
+ "\41\0\2\u0384\3\0\1\u1291\13\0\1\u0386\41\0\2\u0384"+
+ "\4\0\1\u1292\12\0\1\u0386\41\0\2\u0384\5\0\1\u1293"+
+ "\11\0\1\u0386\41\0\2\u0384\6\0\1\u1294\10\0\1\u0386"+
+ "\41\0\2\u0384\7\0\1\u1295\7\0\1\u0386\41\0\2\u0384"+
+ "\10\0\1\u1296\6\0\1\u0386\41\0\2\u0384\11\0\1\u1297"+
+ "\5\0\1\u0386\41\0\2\u0384\12\0\1\u1298\4\0\1\u0386"+
+ "\41\0\2\u0384\13\0\1\u1299\3\0\1\u0386\41\0\2\u0384"+
+ "\14\0\1\u129a\2\0\1\u0386\41\0\2\u0384\15\0\1\u129b"+
+ "\1\0\1\u0386\41\0\1\u0312\1\u0313\1\0\1\u129c\15\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\2\0\1\u129d\14\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\3\0\1\u129e\13\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\4\0\1\u129f\12\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\5\0\1\u12a0\11\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\6\0\1\u12a1\10\0\1\u0315\41\0\1\u0312\1\u0313\7\0"+
+ "\1\u12a2\7\0\1\u0315\41\0\1\u0312\1\u0313\10\0\1\u12a3"+
+ "\6\0\1\u0315\41\0\1\u0312\1\u0313\11\0\1\u12a4\5\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\12\0\1\u12a5\4\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\13\0\1\u12a6\3\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\14\0\1\u12a7\2\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\15\0\1\u12a8\1\0\1\u0315\41\0\2\u03a1\1\0"+
+ "\1\u12a9\15\0\1\u03a3\41\0\2\u03a1\2\0\1\u12aa\14\0"+
+ "\1\u03a3\41\0\2\u03a1\3\0\1\u12ab\13\0\1\u03a3\41\0"+
+ "\2\u03a1\4\0\1\u12ac\12\0\1\u03a3\41\0\2\u03a1\5\0"+
+ "\1\u12ad\11\0\1\u03a3\41\0\2\u03a1\6\0\1\u12ae\10\0"+
+ "\1\u03a3\41\0\2\u03a1\7\0\1\u12af\7\0\1\u03a3\41\0"+
+ "\2\u03a1\10\0\1\u12b0\6\0\1\u03a3\41\0\2\u03a1\11\0"+
+ "\1\u12b1\5\0\1\u03a3\41\0\2\u03a1\12\0\1\u12b2\4\0"+
+ "\1\u03a3\41\0\2\u03a1\13\0\1\u12b3\3\0\1\u03a3\41\0"+
+ "\2\u03a1\14\0\1\u12b4\2\0\1\u03a3\41\0\2\u03a1\15\0"+
+ "\1\u12b5\1\0\1\u03a3\40\0\1\276\1\u03b0\1\u03b1\1\276"+
+ "\1\u12b6\15\276\1\u03b3\41\276\1\u03b0\1\u03b1\2\276\1\u12b7"+
+ "\14\276\1\u03b3\41\276\1\u03b0\1\u03b1\3\276\1\u12b8\13\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\4\276\1\u12b9\12\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\5\276\1\u12ba\11\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\6\276\1\u12bb\10\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\7\276\1\u12bc\7\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\10\276\1\u12bd\6\276\1\u03b3\41\276\1\u03b0\1\u03b1\11\276"+
+ "\1\u12be\5\276\1\u03b3\41\276\1\u03b0\1\u03b1\12\276\1\u12bf"+
+ "\4\276\1\u03b3\41\276\1\u03b0\1\u03b1\13\276\1\u12c0\3\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\14\276\1\u12c1\2\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\15\276\1\u12c2\1\276\1\u03b3\41\276"+
+ "\1\u033d\1\u033e\1\276\1\u12c3\15\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\2\276\1\u12c4\14\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\3\276\1\u12c5\13\276\1\u0340\41\276\1\u033d\1\u033e\4\276"+
+ "\1\u12c6\12\276\1\u0340\41\276\1\u033d\1\u033e\5\276\1\u12c7"+
+ "\11\276\1\u0340\41\276\1\u033d\1\u033e\6\276\1\u12c8\10\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\7\276\1\u12c9\7\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\10\276\1\u12ca\6\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\11\276\1\u12cb\5\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\12\276\1\u12cc\4\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\13\276\1\u12cd\3\276\1\u0340\41\276\1\u033d\1\u033e\14\276"+
+ "\1\u12ce\2\276\1\u0340\41\276\1\u033d\1\u033e\15\276\1\u12cf"+
+ "\1\276\1\u0340\41\276\1\300\1\u02bf\1\276\1\u12d0\15\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\2\276\1\u12d1\14\276\1\u02c1"+
+ "\40\276\1\263\1\u03cf\1\u03d0\1\263\1\u12d2\1\263\1\u0136"+
+ "\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\2\263\1\u12d3\1\u0136"+
+ "\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\u12d4"+
+ "\12\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\263"+
+ "\1\u12d5\11\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\2\263\1\u12d6\10\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\3\263\1\u12d7\7\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\4\263\1\u12d8\6\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\5\263\1\u12d9\5\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\6\263\1\u12da\4\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\7\263\1\u12db\3\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\10\263\1\u12dc"+
+ "\2\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\11\263"+
+ "\1\u12dd\1\263\1\u03d2\40\263\1\344\1\u03de\1\u03df\1\344"+
+ "\1\u12de\1\344\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\2\344\1\u12df\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\1\u12e0\12\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\1\344\1\u12e1\11\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\2\344\1\u12e2\10\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\3\344\1\u12e3\7\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\4\344\1\u12e4\6\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\5\344\1\u12e5"+
+ "\5\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\6\344"+
+ "\1\u12e6\4\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\7\344\1\u12e7\3\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\10\344\1\u12e8\2\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\11\344\1\u12e9\1\344\1\u03e1\40\344\1\276"+
+ "\1\300\1\u02bf\3\276\1\u12ea\13\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\4\276\1\u12eb\12\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\5\276\1\u12ec\11\276\1\u02c1\41\276\1\300\1\u02bf\6\276"+
+ "\1\u12ed\10\276\1\u02c1\41\276\1\300\1\u02bf\7\276\1\u12ee"+
+ "\7\276\1\u02c1\41\276\1\300\1\u02bf\10\276\1\u12ef\6\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\11\276\1\u12f0\5\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\12\276\1\u12f1\4\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\13\276\1\u12f2\3\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\14\276\1\u12f3\2\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\15\276\1\u12f4\1\276\1\u02c1\40\276\1\0\2\u0384\1\0"+
+ "\1\u12f5\15\0\1\u0386\41\0\2\u0384\2\0\1\u12f6\14\0"+
+ "\1\u0386\41\0\2\u0384\3\0\1\u12f7\13\0\1\u0386\41\0"+
+ "\2\u0384\4\0\1\u12f8\12\0\1\u0386\41\0\2\u0384\5\0"+
+ "\1\u12f9\11\0\1\u0386\41\0\2\u0384\6\0\1\u12fa\10\0"+
+ "\1\u0386\41\0\2\u0384\7\0\1\u12fb\7\0\1\u0386\41\0"+
+ "\2\u0384\10\0\1\u12fc\6\0\1\u0386\41\0\2\u0384\11\0"+
+ "\1\u12fd\5\0\1\u0386\41\0\2\u0384\12\0\1\u12fe\4\0"+
+ "\1\u0386\41\0\2\u0384\13\0\1\u12ff\3\0\1\u0386\41\0"+
+ "\2\u0384\14\0\1\u1300\2\0\1\u0386\41\0\2\u0384\15\0"+
+ "\1\u1301\1\0\1\u0386\41\0\1\u0312\1\u0313\1\0\1\u1302"+
+ "\15\0\1\u0315\41\0\1\u0312\1\u0313\2\0\1\u1303\14\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\3\0\1\u1304\13\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\4\0\1\u1305\12\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\5\0\1\u1306\11\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\6\0\1\u1307\10\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\7\0\1\u1308\7\0\1\u0315\41\0\1\u0312\1\u0313\10\0"+
+ "\1\u1309\6\0\1\u0315\41\0\1\u0312\1\u0313\11\0\1\u130a"+
+ "\5\0\1\u0315\41\0\1\u0312\1\u0313\12\0\1\u130b\4\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\13\0\1\u130c\3\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\14\0\1\u130d\2\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\15\0\1\u130e\1\0\1\u0315\41\0\2\u03a1"+
+ "\1\0\1\u130f\15\0\1\u03a3\41\0\2\u03a1\2\0\1\u1310"+
+ "\14\0\1\u03a3\41\0\2\u03a1\3\0\1\u1311\13\0\1\u03a3"+
+ "\41\0\2\u03a1\4\0\1\u1312\12\0\1\u03a3\41\0\2\u03a1"+
+ "\5\0\1\u1313\11\0\1\u03a3\41\0\2\u03a1\6\0\1\u1314"+
+ "\10\0\1\u03a3\41\0\2\u03a1\7\0\1\u1315\7\0\1\u03a3"+
+ "\41\0\2\u03a1\10\0\1\u1316\6\0\1\u03a3\41\0\2\u03a1"+
+ "\11\0\1\u1317\5\0\1\u03a3\41\0\2\u03a1\12\0\1\u1318"+
+ "\4\0\1\u03a3\41\0\2\u03a1\13\0\1\u1319\3\0\1\u03a3"+
+ "\41\0\2\u03a1\14\0\1\u131a\2\0\1\u03a3\41\0\2\u03a1"+
+ "\15\0\1\u131b\1\0\1\u03a3\40\0\1\276\1\u03b0\1\u03b1"+
+ "\1\276\1\u131c\15\276\1\u03b3\41\276\1\u03b0\1\u03b1\2\276"+
+ "\1\u131d\14\276\1\u03b3\41\276\1\u03b0\1\u03b1\3\276\1\u131e"+
+ "\13\276\1\u03b3\41\276\1\u03b0\1\u03b1\4\276\1\u131f\12\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\5\276\1\u1320\11\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\6\276\1\u1321\10\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\7\276\1\u1322\7\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\10\276\1\u1323\6\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\11\276\1\u1324\5\276\1\u03b3\41\276\1\u03b0\1\u03b1\12\276"+
+ "\1\u1325\4\276\1\u03b3\41\276\1\u03b0\1\u03b1\13\276\1\u1326"+
+ "\3\276\1\u03b3\41\276\1\u03b0\1\u03b1\14\276\1\u1327\2\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\15\276\1\u1328\1\276\1\u03b3"+
+ "\41\276\1\u033d\1\u033e\1\276\1\u1329\15\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\2\276\1\u132a\14\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\3\276\1\u132b\13\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\4\276\1\u132c\12\276\1\u0340\41\276\1\u033d\1\u033e\5\276"+
+ "\1\u132d\11\276\1\u0340\41\276\1\u033d\1\u033e\6\276\1\u132e"+
+ "\10\276\1\u0340\41\276\1\u033d\1\u033e\7\276\1\u132f\7\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\10\276\1\u1330\6\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\11\276\1\u1331\5\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\12\276\1\u1332\4\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\13\276\1\u1333\3\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\14\276\1\u1334\2\276\1\u0340\41\276\1\u033d\1\u033e\15\276"+
+ "\1\u1335\1\276\1\u0340\41\276\1\300\1\u02bf\1\276\1\u1336"+
+ "\15\276\1\u02c1\41\276\1\300\1\u02bf\2\276\1\u1337\14\276"+
+ "\1\u02c1\40\276\1\263\1\u03cf\1\u03d0\1\263\1\u1338\1\263"+
+ "\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\2\263\1\u1339"+
+ "\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\1\u133a\12\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\1\263\1\u133b\11\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\2\263\1\u133c\10\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\3\263\1\u133d\7\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\4\263\1\u133e\6\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\5\263\1\u133f\5\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\6\263\1\u1340\4\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\7\263\1\u1341"+
+ "\3\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\10\263"+
+ "\1\u1342\2\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\11\263\1\u1343\1\263\1\u03d2\40\263\1\344\1\u03de\1\u03df"+
+ "\1\344\1\u1344\1\344\1\u017c\13\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\2\344\1\u1345\1\u017c\13\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\1\u1346\12\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\1\344\1\u1347\11\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\2\344\1\u1348\10\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\3\344\1\u1349\7\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\4\344\1\u134a"+
+ "\6\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\5\344"+
+ "\1\u134b\5\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\6\344\1\u134c\4\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\7\344\1\u134d\3\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\10\344\1\u134e\2\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\11\344\1\u134f\1\344\1\u03e1\40\344"+
+ "\1\276\1\300\1\u02bf\3\276\1\u1350\13\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\4\276\1\u1351\12\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\5\276\1\u1352\11\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\6\276\1\u1353\10\276\1\u02c1\41\276\1\300\1\u02bf\7\276"+
+ "\1\u1354\7\276\1\u02c1\41\276\1\300\1\u02bf\10\276\1\u1355"+
+ "\6\276\1\u02c1\41\276\1\300\1\u02bf\11\276\1\u1356\5\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\12\276\1\u1357\4\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\13\276\1\u1358\3\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\14\276\1\u1359\2\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\15\276\1\u135a\1\276\1\u02c1\40\276\1\0\2\u0384"+
+ "\1\0\1\u135b\15\0\1\u0386\41\0\2\u0384\2\0\1\u135c"+
+ "\14\0\1\u0386\41\0\2\u0384\3\0\1\u135d\13\0\1\u0386"+
+ "\41\0\2\u0384\4\0\1\u135e\12\0\1\u0386\41\0\2\u0384"+
+ "\5\0\1\u135f\11\0\1\u0386\41\0\2\u0384\6\0\1\u1360"+
+ "\10\0\1\u0386\41\0\2\u0384\7\0\1\u1361\7\0\1\u0386"+
+ "\41\0\2\u0384\10\0\1\u1362\6\0\1\u0386\41\0\2\u0384"+
+ "\11\0\1\u1363\5\0\1\u0386\41\0\2\u0384\12\0\1\u1364"+
+ "\4\0\1\u0386\41\0\2\u0384\13\0\1\u1365\3\0\1\u0386"+
+ "\41\0\2\u0384\14\0\1\u1366\2\0\1\u0386\41\0\2\u0384"+
+ "\15\0\1\u1367\1\0\1\u0386\41\0\1\u0312\1\u0313\1\0"+
+ "\1\u1368\15\0\1\u0315\41\0\1\u0312\1\u0313\2\0\1\u1369"+
+ "\14\0\1\u0315\41\0\1\u0312\1\u0313\3\0\1\u136a\13\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\4\0\1\u136b\12\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\5\0\1\u136c\11\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\6\0\1\u136d\10\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\7\0\1\u136e\7\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\10\0\1\u136f\6\0\1\u0315\41\0\1\u0312\1\u0313\11\0"+
+ "\1\u1370\5\0\1\u0315\41\0\1\u0312\1\u0313\12\0\1\u1371"+
+ "\4\0\1\u0315\41\0\1\u0312\1\u0313\13\0\1\u1372\3\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\14\0\1\u1373\2\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\15\0\1\u1374\1\0\1\u0315\41\0"+
+ "\2\u03a1\1\0\1\u1375\15\0\1\u03a3\41\0\2\u03a1\2\0"+
+ "\1\u1376\14\0\1\u03a3\41\0\2\u03a1\3\0\1\u1377\13\0"+
+ "\1\u03a3\41\0\2\u03a1\4\0\1\u1378\12\0\1\u03a3\41\0"+
+ "\2\u03a1\5\0\1\u1379\11\0\1\u03a3\41\0\2\u03a1\6\0"+
+ "\1\u137a\10\0\1\u03a3\41\0\2\u03a1\7\0\1\u137b\7\0"+
+ "\1\u03a3\41\0\2\u03a1\10\0\1\u137c\6\0\1\u03a3\41\0"+
+ "\2\u03a1\11\0\1\u137d\5\0\1\u03a3\41\0\2\u03a1\12\0"+
+ "\1\u137e\4\0\1\u03a3\41\0\2\u03a1\13\0\1\u137f\3\0"+
+ "\1\u03a3\41\0\2\u03a1\14\0\1\u1380\2\0\1\u03a3\41\0"+
+ "\2\u03a1\15\0\1\u1381\1\0\1\u03a3\40\0\1\276\1\u03b0"+
+ "\1\u03b1\1\276\1\u1382\15\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\2\276\1\u1383\14\276\1\u03b3\41\276\1\u03b0\1\u03b1\3\276"+
+ "\1\u1384\13\276\1\u03b3\41\276\1\u03b0\1\u03b1\4\276\1\u1385"+
+ "\12\276\1\u03b3\41\276\1\u03b0\1\u03b1\5\276\1\u1386\11\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\6\276\1\u1387\10\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\7\276\1\u1388\7\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\10\276\1\u1389\6\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\11\276\1\u138a\5\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\12\276\1\u138b\4\276\1\u03b3\41\276\1\u03b0\1\u03b1\13\276"+
+ "\1\u138c\3\276\1\u03b3\41\276\1\u03b0\1\u03b1\14\276\1\u138d"+
+ "\2\276\1\u03b3\41\276\1\u03b0\1\u03b1\15\276\1\u138e\1\276"+
+ "\1\u03b3\41\276\1\u033d\1\u033e\1\276\1\u138f\15\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\2\276\1\u1390\14\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\3\276\1\u1391\13\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\4\276\1\u1392\12\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\5\276\1\u1393\11\276\1\u0340\41\276\1\u033d\1\u033e\6\276"+
+ "\1\u1394\10\276\1\u0340\41\276\1\u033d\1\u033e\7\276\1\u1395"+
+ "\7\276\1\u0340\41\276\1\u033d\1\u033e\10\276\1\u1396\6\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\11\276\1\u1397\5\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\12\276\1\u1398\4\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\13\276\1\u1399\3\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\14\276\1\u139a\2\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\15\276\1\u139b\1\276\1\u0340\41\276\1\300\1\u02bf\1\276"+
+ "\1\u139c\15\276\1\u02c1\41\276\1\300\1\u02bf\2\276\1\u139d"+
+ "\14\276\1\u02c1\40\276\1\263\1\u03cf\1\u03d0\1\263\1\u139e"+
+ "\1\263\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\2\263"+
+ "\1\u139f\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\1\u13a0\12\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\1\263\1\u13a1\11\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\2\263\1\u13a2\10\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\3\263\1\u13a3\7\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\4\263\1\u13a4\6\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\5\263\1\u13a5\5\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\6\263\1\u13a6"+
+ "\4\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\7\263"+
+ "\1\u13a7\3\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\10\263\1\u13a8\2\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\11\263\1\u13a9\1\263\1\u03d2\40\263\1\344\1\u03de"+
+ "\1\u03df\1\344\1\u13aa\1\344\1\u017c\13\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\2\344\1\u13ab\1\u017c\13\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\1\u13ac\12\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\1\344\1\u13ad\11\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\2\344\1\u13ae\10\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\3\344\1\u13af"+
+ "\7\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\4\344"+
+ "\1\u13b0\6\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\5\344\1\u13b1\5\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\6\344\1\u13b2\4\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\7\344\1\u13b3\3\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\10\344\1\u13b4\2\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\11\344\1\u13b5\1\344\1\u03e1"+
+ "\40\344\1\276\1\300\1\u02bf\3\276\1\u13b6\13\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\4\276\1\u13b7\12\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\5\276\1\u13b8\11\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\6\276\1\u13b9\10\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\7\276\1\u13ba\7\276\1\u02c1\41\276\1\300\1\u02bf\10\276"+
+ "\1\u13bb\6\276\1\u02c1\41\276\1\300\1\u02bf\11\276\1\u13bc"+
+ "\5\276\1\u02c1\41\276\1\300\1\u02bf\12\276\1\u13bd\4\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\13\276\1\u13be\3\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\14\276\1\u13bf\2\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\15\276\1\u13c0\1\276\1\u02c1\40\276\1\0"+
+ "\2\u0384\1\0\1\u13c1\15\0\1\u0386\41\0\2\u0384\2\0"+
+ "\1\u13c2\14\0\1\u0386\41\0\2\u0384\3\0\1\u13c3\13\0"+
+ "\1\u0386\41\0\2\u0384\4\0\1\u13c4\12\0\1\u0386\41\0"+
+ "\2\u0384\5\0\1\u13c5\11\0\1\u0386\41\0\2\u0384\6\0"+
+ "\1\u13c6\10\0\1\u0386\41\0\2\u0384\7\0\1\u13c7\7\0"+
+ "\1\u0386\41\0\2\u0384\10\0\1\u13c8\6\0\1\u0386\41\0"+
+ "\2\u0384\11\0\1\u13c9\5\0\1\u0386\41\0\2\u0384\12\0"+
+ "\1\u13ca\4\0\1\u0386\41\0\2\u0384\13\0\1\u13cb\3\0"+
+ "\1\u0386\41\0\2\u0384\14\0\1\u13cc\2\0\1\u0386\41\0"+
+ "\2\u0384\15\0\1\u13cd\1\0\1\u0386\41\0\1\u0312\1\u0313"+
+ "\1\0\1\u13ce\15\0\1\u0315\41\0\1\u0312\1\u0313\2\0"+
+ "\1\u13cf\14\0\1\u0315\41\0\1\u0312\1\u0313\3\0\1\u13d0"+
+ "\13\0\1\u0315\41\0\1\u0312\1\u0313\4\0\1\u13d1\12\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\5\0\1\u13d2\11\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\6\0\1\u13d3\10\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\7\0\1\u13d4\7\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\10\0\1\u13d5\6\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\11\0\1\u13d6\5\0\1\u0315\41\0\1\u0312\1\u0313\12\0"+
+ "\1\u13d7\4\0\1\u0315\41\0\1\u0312\1\u0313\13\0\1\u13d8"+
+ "\3\0\1\u0315\41\0\1\u0312\1\u0313\14\0\1\u13d9\2\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\15\0\1\u13da\1\0\1\u0315"+
+ "\41\0\2\u03a1\1\0\1\u13db\15\0\1\u03a3\41\0\2\u03a1"+
+ "\2\0\1\u13dc\14\0\1\u03a3\41\0\2\u03a1\3\0\1\u13dd"+
+ "\13\0\1\u03a3\41\0\2\u03a1\4\0\1\u13de\12\0\1\u03a3"+
+ "\41\0\2\u03a1\5\0\1\u13df\11\0\1\u03a3\41\0\2\u03a1"+
+ "\6\0\1\u13e0\10\0\1\u03a3\41\0\2\u03a1\7\0\1\u13e1"+
+ "\7\0\1\u03a3\41\0\2\u03a1\10\0\1\u13e2\6\0\1\u03a3"+
+ "\41\0\2\u03a1\11\0\1\u13e3\5\0\1\u03a3\41\0\2\u03a1"+
+ "\12\0\1\u13e4\4\0\1\u03a3\41\0\2\u03a1\13\0\1\u13e5"+
+ "\3\0\1\u03a3\41\0\2\u03a1\14\0\1\u13e6\2\0\1\u03a3"+
+ "\41\0\2\u03a1\15\0\1\u13e7\1\0\1\u03a3\40\0\1\276"+
+ "\1\u03b0\1\u03b1\1\276\1\u13e8\15\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\2\276\1\u13e9\14\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\3\276\1\u13ea\13\276\1\u03b3\41\276\1\u03b0\1\u03b1\4\276"+
+ "\1\u13eb\12\276\1\u03b3\41\276\1\u03b0\1\u03b1\5\276\1\u13ec"+
+ "\11\276\1\u03b3\41\276\1\u03b0\1\u03b1\6\276\1\u13ed\10\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\7\276\1\u13ee\7\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\10\276\1\u13ef\6\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\11\276\1\u13f0\5\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\12\276\1\u13f1\4\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\13\276\1\u13f2\3\276\1\u03b3\41\276\1\u03b0\1\u03b1\14\276"+
+ "\1\u13f3\2\276\1\u03b3\41\276\1\u03b0\1\u03b1\15\276\1\u13f4"+
+ "\1\276\1\u03b3\41\276\1\u033d\1\u033e\1\276\1\u13f5\15\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\2\276\1\u13f6\14\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\3\276\1\u13f7\13\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\4\276\1\u13f8\12\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\5\276\1\u13f9\11\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\6\276\1\u13fa\10\276\1\u0340\41\276\1\u033d\1\u033e\7\276"+
+ "\1\u13fb\7\276\1\u0340\41\276\1\u033d\1\u033e\10\276\1\u13fc"+
+ "\6\276\1\u0340\41\276\1\u033d\1\u033e\11\276\1\u13fd\5\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\12\276\1\u13fe\4\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\13\276\1\u13ff\3\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\14\276\1\u1400\2\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\15\276\1\u1401\1\276\1\u0340\41\276\1\300\1\u02bf"+
+ "\1\276\1\u1402\15\276\1\u02c1\41\276\1\300\1\u02bf\2\276"+
+ "\1\u1403\14\276\1\u02c1\40\276\1\263\1\u03cf\1\u03d0\1\263"+
+ "\1\u1404\1\263\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\2\263\1\u1405\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\1\u1406\12\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\1\263\1\u1407\11\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\2\263\1\u1408\10\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\3\263\1\u1409\7\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\4\263\1\u140a\6\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\5\263\1\u140b"+
+ "\5\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\6\263"+
+ "\1\u140c\4\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\7\263\1\u140d\3\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\10\263\1\u140e\2\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\11\263\1\u140f\1\263\1\u03d2\40\263\1\344"+
+ "\1\u03de\1\u03df\1\344\1\u1410\1\344\1\u017c\13\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\2\344\1\u1411\1\u017c\13\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\1\u1412\12\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\1\344\1\u1413\11\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\2\344\1\u1414"+
+ "\10\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\3\344"+
+ "\1\u1415\7\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\4\344\1\u1416\6\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\5\344\1\u1417\5\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\6\344\1\u1418\4\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\7\344\1\u1419\3\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\10\344\1\u141a\2\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\11\344\1\u141b\1\344"+
+ "\1\u03e1\40\344\1\276\1\300\1\u02bf\3\276\1\u141c\13\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\4\276\1\u141d\12\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\5\276\1\u141e\11\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\6\276\1\u141f\10\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\7\276\1\u1420\7\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\10\276\1\u1421\6\276\1\u02c1\41\276\1\300\1\u02bf\11\276"+
+ "\1\u1422\5\276\1\u02c1\41\276\1\300\1\u02bf\12\276\1\u1423"+
+ "\4\276\1\u02c1\41\276\1\300\1\u02bf\13\276\1\u1424\3\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\14\276\1\u1425\2\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\15\276\1\u1426\1\276\1\u02c1\40\276"+
+ "\1\0\2\u0384\1\0\1\u1427\15\0\1\u0386\41\0\2\u0384"+
+ "\2\0\1\u1428\14\0\1\u0386\41\0\2\u0384\3\0\1\u1429"+
+ "\13\0\1\u0386\41\0\2\u0384\4\0\1\u142a\12\0\1\u0386"+
+ "\41\0\2\u0384\5\0\1\u142b\11\0\1\u0386\41\0\2\u0384"+
+ "\6\0\1\u142c\10\0\1\u0386\41\0\2\u0384\7\0\1\u142d"+
+ "\7\0\1\u0386\41\0\2\u0384\10\0\1\u142e\6\0\1\u0386"+
+ "\41\0\2\u0384\11\0\1\u142f\5\0\1\u0386\41\0\2\u0384"+
+ "\12\0\1\u1430\4\0\1\u0386\41\0\2\u0384\13\0\1\u1431"+
+ "\3\0\1\u0386\41\0\2\u0384\14\0\1\u1432\2\0\1\u0386"+
+ "\41\0\2\u0384\15\0\1\u1433\1\0\1\u0386\41\0\1\u0312"+
+ "\1\u0313\1\0\1\u1434\15\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\2\0\1\u1435\14\0\1\u0315\41\0\1\u0312\1\u0313\3\0"+
+ "\1\u1436\13\0\1\u0315\41\0\1\u0312\1\u0313\4\0\1\u1437"+
+ "\12\0\1\u0315\41\0\1\u0312\1\u0313\5\0\1\u1438\11\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\6\0\1\u1439\10\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\7\0\1\u143a\7\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\10\0\1\u143b\6\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\11\0\1\u143c\5\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\12\0\1\u143d\4\0\1\u0315\41\0\1\u0312\1\u0313\13\0"+
+ "\1\u143e\3\0\1\u0315\41\0\1\u0312\1\u0313\14\0\1\u143f"+
+ "\2\0\1\u0315\41\0\1\u0312\1\u0313\15\0\1\u1440\1\0"+
+ "\1\u0315\41\0\2\u03a1\1\0\1\u1441\15\0\1\u03a3\41\0"+
+ "\2\u03a1\2\0\1\u1442\14\0\1\u03a3\41\0\2\u03a1\3\0"+
+ "\1\u1443\13\0\1\u03a3\41\0\2\u03a1\4\0\1\u1444\12\0"+
+ "\1\u03a3\41\0\2\u03a1\5\0\1\u1445\11\0\1\u03a3\41\0"+
+ "\2\u03a1\6\0\1\u1446\10\0\1\u03a3\41\0\2\u03a1\7\0"+
+ "\1\u1447\7\0\1\u03a3\41\0\2\u03a1\10\0\1\u1448\6\0"+
+ "\1\u03a3\41\0\2\u03a1\11\0\1\u1449\5\0\1\u03a3\41\0"+
+ "\2\u03a1\12\0\1\u144a\4\0\1\u03a3\41\0\2\u03a1\13\0"+
+ "\1\u144b\3\0\1\u03a3\41\0\2\u03a1\14\0\1\u144c\2\0"+
+ "\1\u03a3\41\0\2\u03a1\15\0\1\u144d\1\0\1\u03a3\40\0"+
+ "\1\276\1\u03b0\1\u03b1\1\276\1\u144e\15\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\2\276\1\u144f\14\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\3\276\1\u1450\13\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\4\276\1\u1451\12\276\1\u03b3\41\276\1\u03b0\1\u03b1\5\276"+
+ "\1\u1452\11\276\1\u03b3\41\276\1\u03b0\1\u03b1\6\276\1\u1453"+
+ "\10\276\1\u03b3\41\276\1\u03b0\1\u03b1\7\276\1\u1454\7\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\10\276\1\u1455\6\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\11\276\1\u1456\5\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\12\276\1\u1457\4\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\13\276\1\u1458\3\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\14\276\1\u1459\2\276\1\u03b3\41\276\1\u03b0\1\u03b1\15\276"+
+ "\1\u145a\1\276\1\u03b3\41\276\1\u033d\1\u033e\1\276\1\u145b"+
+ "\15\276\1\u0340\41\276\1\u033d\1\u033e\2\276\1\u145c\14\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\3\276\1\u145d\13\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\4\276\1\u145e\12\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\5\276\1\u145f\11\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\6\276\1\u1460\10\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\7\276\1\u1461\7\276\1\u0340\41\276\1\u033d\1\u033e\10\276"+
+ "\1\u1462\6\276\1\u0340\41\276\1\u033d\1\u033e\11\276\1\u1463"+
+ "\5\276\1\u0340\41\276\1\u033d\1\u033e\12\276\1\u1464\4\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\13\276\1\u1465\3\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\14\276\1\u1466\2\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\15\276\1\u1467\1\276\1\u0340\41\276\1\300"+
+ "\1\u02bf\1\276\1\u1468\15\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\2\276\1\u1469\14\276\1\u02c1\40\276\1\263\1\u03cf\1\u03d0"+
+ "\1\263\1\u146a\1\263\1\u0136\13\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\2\263\1\u146b\1\u0136\13\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\1\u146c\12\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\1\263\1\u146d\11\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\2\263\1\u146e\10\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\3\263\1\u146f\7\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\4\263\1\u1470"+
+ "\6\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\5\263"+
+ "\1\u1471\5\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\6\263\1\u1472\4\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\7\263\1\u1473\3\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\10\263\1\u1474\2\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\11\263\1\u1475\1\263\1\u03d2\40\263"+
+ "\1\344\1\u03de\1\u03df\1\344\1\u1476\1\344\1\u017c\13\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\2\344\1\u1477\1\u017c\13\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\1\u1478\12\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\1\344\1\u1479"+
+ "\11\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\2\344"+
+ "\1\u147a\10\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\3\344\1\u147b\7\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\4\344\1\u147c\6\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\5\344\1\u147d\5\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\6\344\1\u147e\4\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\7\344\1\u147f\3\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\10\344\1\u1480\2\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\11\344\1\u1481"+
+ "\1\344\1\u03e1\40\344\1\276\1\300\1\u02bf\3\276\1\u1482"+
+ "\13\276\1\u02c1\41\276\1\300\1\u02bf\4\276\1\u1483\12\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\5\276\1\u1484\11\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\6\276\1\u1485\10\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\7\276\1\u1486\7\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\10\276\1\u1487\6\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\11\276\1\u1488\5\276\1\u02c1\41\276\1\300\1\u02bf\12\276"+
+ "\1\u1489\4\276\1\u02c1\41\276\1\300\1\u02bf\13\276\1\u148a"+
+ "\3\276\1\u02c1\41\276\1\300\1\u02bf\14\276\1\u148b\2\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\15\276\1\u148c\1\276\1\u02c1"+
+ "\40\276\1\0\2\u0384\1\0\1\u148d\15\0\1\u0386\41\0"+
+ "\2\u0384\2\0\1\u148e\14\0\1\u0386\41\0\2\u0384\3\0"+
+ "\1\u148f\13\0\1\u0386\41\0\2\u0384\4\0\1\u1490\12\0"+
+ "\1\u0386\41\0\2\u0384\5\0\1\u1491\11\0\1\u0386\41\0"+
+ "\2\u0384\6\0\1\u1492\10\0\1\u0386\41\0\2\u0384\7\0"+
+ "\1\u1493\7\0\1\u0386\41\0\2\u0384\10\0\1\u1494\6\0"+
+ "\1\u0386\41\0\2\u0384\11\0\1\u1495\5\0\1\u0386\41\0"+
+ "\2\u0384\12\0\1\u1496\4\0\1\u0386\41\0\2\u0384\13\0"+
+ "\1\u1497\3\0\1\u0386\41\0\2\u0384\14\0\1\u1498\2\0"+
+ "\1\u0386\41\0\2\u0384\15\0\1\u1499\1\0\1\u0386\41\0"+
+ "\1\u0312\1\u0313\1\0\1\u149a\15\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\2\0\1\u149b\14\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\3\0\1\u149c\13\0\1\u0315\41\0\1\u0312\1\u0313\4\0"+
+ "\1\u149d\12\0\1\u0315\41\0\1\u0312\1\u0313\5\0\1\u149e"+
+ "\11\0\1\u0315\41\0\1\u0312\1\u0313\6\0\1\u149f\10\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\7\0\1\u14a0\7\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\10\0\1\u14a1\6\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\11\0\1\u14a2\5\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\12\0\1\u14a3\4\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\13\0\1\u14a4\3\0\1\u0315\41\0\1\u0312\1\u0313\14\0"+
+ "\1\u14a5\2\0\1\u0315\41\0\1\u0312\1\u0313\15\0\1\u14a6"+
+ "\1\0\1\u0315\41\0\2\u03a1\1\0\1\u14a7\15\0\1\u03a3"+
+ "\41\0\2\u03a1\2\0\1\u14a8\14\0\1\u03a3\41\0\2\u03a1"+
+ "\3\0\1\u14a9\13\0\1\u03a3\41\0\2\u03a1\4\0\1\u14aa"+
+ "\12\0\1\u03a3\41\0\2\u03a1\5\0\1\u14ab\11\0\1\u03a3"+
+ "\41\0\2\u03a1\6\0\1\u14ac\10\0\1\u03a3\41\0\2\u03a1"+
+ "\7\0\1\u14ad\7\0\1\u03a3\41\0\2\u03a1\10\0\1\u14ae"+
+ "\6\0\1\u03a3\41\0\2\u03a1\11\0\1\u14af\5\0\1\u03a3"+
+ "\41\0\2\u03a1\12\0\1\u14b0\4\0\1\u03a3\41\0\2\u03a1"+
+ "\13\0\1\u14b1\3\0\1\u03a3\41\0\2\u03a1\14\0\1\u14b2"+
+ "\2\0\1\u03a3\41\0\2\u03a1\15\0\1\u14b3\1\0\1\u03a3"+
+ "\40\0\1\276\1\u03b0\1\u03b1\1\276\1\u14b4\15\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\2\276\1\u14b5\14\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\3\276\1\u14b6\13\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\4\276\1\u14b7\12\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\5\276\1\u14b8\11\276\1\u03b3\41\276\1\u03b0\1\u03b1\6\276"+
+ "\1\u14b9\10\276\1\u03b3\41\276\1\u03b0\1\u03b1\7\276\1\u14ba"+
+ "\7\276\1\u03b3\41\276\1\u03b0\1\u03b1\10\276\1\u14bb\6\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\11\276\1\u14bc\5\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\12\276\1\u14bd\4\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\13\276\1\u14be\3\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\14\276\1\u14bf\2\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\15\276\1\u14c0\1\276\1\u03b3\41\276\1\u033d\1\u033e\1\276"+
+ "\1\u14c1\15\276\1\u0340\41\276\1\u033d\1\u033e\2\276\1\u14c2"+
+ "\14\276\1\u0340\41\276\1\u033d\1\u033e\3\276\1\u14c3\13\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\4\276\1\u14c4\12\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\5\276\1\u14c5\11\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\6\276\1\u14c6\10\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\7\276\1\u14c7\7\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\10\276\1\u14c8\6\276\1\u0340\41\276\1\u033d\1\u033e\11\276"+
+ "\1\u14c9\5\276\1\u0340\41\276\1\u033d\1\u033e\12\276\1\u14ca"+
+ "\4\276\1\u0340\41\276\1\u033d\1\u033e\13\276\1\u14cb\3\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\14\276\1\u14cc\2\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\15\276\1\u14cd\1\276\1\u0340\41\276"+
+ "\1\300\1\u02bf\1\276\1\u14ce\15\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\2\276\1\u14cf\14\276\1\u02c1\40\276\1\263\1\u03cf"+
+ "\1\u03d0\1\263\1\u14d0\1\263\1\u0136\13\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\2\263\1\u14d1\1\u0136\13\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\1\u14d2\12\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\1\263\1\u14d3\11\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\2\263\1\u14d4\10\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\3\263\1\u14d5"+
+ "\7\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\4\263"+
+ "\1\u14d6\6\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\5\263\1\u14d7\5\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\6\263\1\u14d8\4\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\7\263\1\u14d9\3\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\10\263\1\u14da\2\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\11\263\1\u14db\1\263\1\u03d2"+
+ "\40\263\1\344\1\u03de\1\u03df\1\344\1\u14dc\1\344\1\u017c"+
+ "\13\344\1\u03e1\41\344\1\u03de\1\u03df\2\344\1\u14dd\1\u017c"+
+ "\13\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\1\u14de"+
+ "\12\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\1\344"+
+ "\1\u14df\11\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\2\344\1\u14e0\10\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\3\344\1\u14e1\7\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\4\344\1\u14e2\6\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\5\344\1\u14e3\5\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\6\344\1\u14e4\4\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\7\344\1\u14e5\3\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\10\344\1\u14e6"+
+ "\2\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\11\344"+
+ "\1\u14e7\1\344\1\u03e1\40\344\1\276\1\300\1\u02bf\3\276"+
+ "\1\u14e8\13\276\1\u02c1\41\276\1\300\1\u02bf\4\276\1\u14e9"+
+ "\12\276\1\u02c1\41\276\1\300\1\u02bf\5\276\1\u14ea\11\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\6\276\1\u14eb\10\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\7\276\1\u14ec\7\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\10\276\1\u14ed\6\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\11\276\1\u14ee\5\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\12\276\1\u14ef\4\276\1\u02c1\41\276\1\300\1\u02bf\13\276"+
+ "\1\u14f0\3\276\1\u02c1\41\276\1\300\1\u02bf\14\276\1\u14f1"+
+ "\2\276\1\u02c1\41\276\1\300\1\u02bf\15\276\1\u14f2\1\276"+
+ "\1\u02c1\40\276\1\0\2\u0384\1\0\1\u14f3\15\0\1\u0386"+
+ "\41\0\2\u0384\2\0\1\u14f4\14\0\1\u0386\41\0\2\u0384"+
+ "\3\0\1\u14f5\13\0\1\u0386\41\0\2\u0384\4\0\1\u14f6"+
+ "\12\0\1\u0386\41\0\2\u0384\5\0\1\u14f7\11\0\1\u0386"+
+ "\41\0\2\u0384\6\0\1\u14f8\10\0\1\u0386\41\0\2\u0384"+
+ "\7\0\1\u14f9\7\0\1\u0386\41\0\2\u0384\10\0\1\u14fa"+
+ "\6\0\1\u0386\41\0\2\u0384\11\0\1\u14fb\5\0\1\u0386"+
+ "\41\0\2\u0384\12\0\1\u14fc\4\0\1\u0386\41\0\2\u0384"+
+ "\13\0\1\u14fd\3\0\1\u0386\41\0\2\u0384\14\0\1\u14fe"+
+ "\2\0\1\u0386\41\0\2\u0384\15\0\1\u14ff\1\0\1\u0386"+
+ "\41\0\1\u0312\1\u0313\1\0\1\u1500\15\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\2\0\1\u1501\14\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\3\0\1\u1502\13\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\4\0\1\u1503\12\0\1\u0315\41\0\1\u0312\1\u0313\5\0"+
+ "\1\u1504\11\0\1\u0315\41\0\1\u0312\1\u0313\6\0\1\u1505"+
+ "\10\0\1\u0315\41\0\1\u0312\1\u0313\7\0\1\u1506\7\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\10\0\1\u1507\6\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\11\0\1\u1508\5\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\12\0\1\u1509\4\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\13\0\1\u150a\3\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\14\0\1\u150b\2\0\1\u0315\41\0\1\u0312\1\u0313\15\0"+
+ "\1\u150c\1\0\1\u0315\41\0\2\u03a1\1\0\1\u150d\15\0"+
+ "\1\u03a3\41\0\2\u03a1\2\0\1\u150e\14\0\1\u03a3\41\0"+
+ "\2\u03a1\3\0\1\u150f\13\0\1\u03a3\41\0\2\u03a1\4\0"+
+ "\1\u1510\12\0\1\u03a3\41\0\2\u03a1\5\0\1\u1511\11\0"+
+ "\1\u03a3\41\0\2\u03a1\6\0\1\u1512\10\0\1\u03a3\41\0"+
+ "\2\u03a1\7\0\1\u1513\7\0\1\u03a3\41\0\2\u03a1\10\0"+
+ "\1\u1514\6\0\1\u03a3\41\0\2\u03a1\11\0\1\u1515\5\0"+
+ "\1\u03a3\41\0\2\u03a1\12\0\1\u1516\4\0\1\u03a3\41\0"+
+ "\2\u03a1\13\0\1\u1517\3\0\1\u03a3\41\0\2\u03a1\14\0"+
+ "\1\u1518\2\0\1\u03a3\41\0\2\u03a1\15\0\1\u1519\1\0"+
+ "\1\u03a3\40\0\1\276\1\u03b0\1\u03b1\1\276\1\u151a\15\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\2\276\1\u151b\14\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\3\276\1\u151c\13\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\4\276\1\u151d\12\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\5\276\1\u151e\11\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\6\276\1\u151f\10\276\1\u03b3\41\276\1\u03b0\1\u03b1\7\276"+
+ "\1\u1520\7\276\1\u03b3\41\276\1\u03b0\1\u03b1\10\276\1\u1521"+
+ "\6\276\1\u03b3\41\276\1\u03b0\1\u03b1\11\276\1\u1522\5\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\12\276\1\u1523\4\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\13\276\1\u1524\3\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\14\276\1\u1525\2\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\15\276\1\u1526\1\276\1\u03b3\41\276\1\u033d\1\u033e"+
+ "\1\276\1\u1527\15\276\1\u0340\41\276\1\u033d\1\u033e\2\276"+
+ "\1\u1528\14\276\1\u0340\41\276\1\u033d\1\u033e\3\276\1\u1529"+
+ "\13\276\1\u0340\41\276\1\u033d\1\u033e\4\276\1\u152a\12\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\5\276\1\u152b\11\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\6\276\1\u152c\10\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\7\276\1\u152d\7\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\10\276\1\u152e\6\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\11\276\1\u152f\5\276\1\u0340\41\276\1\u033d\1\u033e\12\276"+
+ "\1\u1530\4\276\1\u0340\41\276\1\u033d\1\u033e\13\276\1\u1531"+
+ "\3\276\1\u0340\41\276\1\u033d\1\u033e\14\276\1\u1532\2\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\15\276\1\u1533\1\276\1\u0340"+
+ "\41\276\1\300\1\u02bf\1\276\1\u1534\15\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\2\276\1\u1535\14\276\1\u02c1\40\276\1\263"+
+ "\1\u03cf\1\u03d0\1\263\1\u1536\1\263\1\u0136\13\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\2\263\1\u1537\1\u0136\13\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\u1538\12\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\263\1\u1539\11\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\2\263\1\u153a"+
+ "\10\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\3\263"+
+ "\1\u153b\7\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\4\263\1\u153c\6\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\5\263\1\u153d\5\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\6\263\1\u153e\4\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\7\263\1\u153f\3\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\10\263\1\u1540\2\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\11\263\1\u1541\1\263"+
+ "\1\u03d2\40\263\1\344\1\u03de\1\u03df\1\344\1\u1542\1\344"+
+ "\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df\2\344\1\u1543"+
+ "\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\1\u1544\12\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\1\344\1\u1545\11\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\2\344\1\u1546\10\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\3\344\1\u1547\7\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\4\344\1\u1548\6\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\5\344\1\u1549\5\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\6\344\1\u154a\4\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\7\344\1\u154b"+
+ "\3\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\10\344"+
+ "\1\u154c\2\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\11\344\1\u154d\1\344\1\u03e1\40\344\1\276\1\300\1\u02bf"+
+ "\3\276\1\u154e\13\276\1\u02c1\41\276\1\300\1\u02bf\4\276"+
+ "\1\u154f\12\276\1\u02c1\41\276\1\300\1\u02bf\5\276\1\u1550"+
+ "\11\276\1\u02c1\41\276\1\300\1\u02bf\6\276\1\u1551\10\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\7\276\1\u1552\7\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\10\276\1\u1553\6\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\11\276\1\u1554\5\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\12\276\1\u1555\4\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\13\276\1\u1556\3\276\1\u02c1\41\276\1\300\1\u02bf\14\276"+
+ "\1\u1557\2\276\1\u02c1\41\276\1\300\1\u02bf\15\276\1\u1558"+
+ "\1\276\1\u02c1\40\276\1\0\2\u0384\1\0\1\u1559\15\0"+
+ "\1\u0386\41\0\2\u0384\2\0\1\u155a\14\0\1\u0386\41\0"+
+ "\2\u0384\3\0\1\u155b\13\0\1\u0386\41\0\2\u0384\4\0"+
+ "\1\u155c\12\0\1\u0386\41\0\2\u0384\5\0\1\u155d\11\0"+
+ "\1\u0386\41\0\2\u0384\6\0\1\u155e\10\0\1\u0386\41\0"+
+ "\2\u0384\7\0\1\u155f\7\0\1\u0386\41\0\2\u0384\10\0"+
+ "\1\u1560\6\0\1\u0386\41\0\2\u0384\11\0\1\u1561\5\0"+
+ "\1\u0386\41\0\2\u0384\12\0\1\u1562\4\0\1\u0386\41\0"+
+ "\2\u0384\13\0\1\u1563\3\0\1\u0386\41\0\2\u0384\14\0"+
+ "\1\u1564\2\0\1\u0386\41\0\2\u0384\15\0\1\u1565\1\0"+
+ "\1\u0386\41\0\1\u0312\1\u0313\1\0\1\u1566\15\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\2\0\1\u1567\14\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\3\0\1\u1568\13\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\4\0\1\u1569\12\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\5\0\1\u156a\11\0\1\u0315\41\0\1\u0312\1\u0313\6\0"+
+ "\1\u156b\10\0\1\u0315\41\0\1\u0312\1\u0313\7\0\1\u156c"+
+ "\7\0\1\u0315\41\0\1\u0312\1\u0313\10\0\1\u156d\6\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\11\0\1\u156e\5\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\12\0\1\u156f\4\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\13\0\1\u1570\3\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\14\0\1\u1571\2\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\15\0\1\u1572\1\0\1\u0315\41\0\2\u03a1\1\0\1\u1573"+
+ "\15\0\1\u03a3\41\0\2\u03a1\2\0\1\u1574\14\0\1\u03a3"+
+ "\41\0\2\u03a1\3\0\1\u1575\13\0\1\u03a3\41\0\2\u03a1"+
+ "\4\0\1\u1576\12\0\1\u03a3\41\0\2\u03a1\5\0\1\u1577"+
+ "\11\0\1\u03a3\41\0\2\u03a1\6\0\1\u1578\10\0\1\u03a3"+
+ "\41\0\2\u03a1\7\0\1\u1579\7\0\1\u03a3\41\0\2\u03a1"+
+ "\10\0\1\u157a\6\0\1\u03a3\41\0\2\u03a1\11\0\1\u157b"+
+ "\5\0\1\u03a3\41\0\2\u03a1\12\0\1\u157c\4\0\1\u03a3"+
+ "\41\0\2\u03a1\13\0\1\u157d\3\0\1\u03a3\41\0\2\u03a1"+
+ "\14\0\1\u157e\2\0\1\u03a3\41\0\2\u03a1\15\0\1\u157f"+
+ "\1\0\1\u03a3\40\0\1\276\1\u03b0\1\u03b1\1\276\1\u1580"+
+ "\15\276\1\u03b3\41\276\1\u03b0\1\u03b1\2\276\1\u1581\14\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\3\276\1\u1582\13\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\4\276\1\u1583\12\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\5\276\1\u1584\11\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\6\276\1\u1585\10\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\7\276\1\u1586\7\276\1\u03b3\41\276\1\u03b0\1\u03b1\10\276"+
+ "\1\u1587\6\276\1\u03b3\41\276\1\u03b0\1\u03b1\11\276\1\u1588"+
+ "\5\276\1\u03b3\41\276\1\u03b0\1\u03b1\12\276\1\u1589\4\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\13\276\1\u158a\3\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\14\276\1\u158b\2\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\15\276\1\u158c\1\276\1\u03b3\41\276\1\u033d"+
+ "\1\u033e\1\276\1\u158d\15\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\2\276\1\u158e\14\276\1\u0340\41\276\1\u033d\1\u033e\3\276"+
+ "\1\u158f\13\276\1\u0340\41\276\1\u033d\1\u033e\4\276\1\u1590"+
+ "\12\276\1\u0340\41\276\1\u033d\1\u033e\5\276\1\u1591\11\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\6\276\1\u1592\10\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\7\276\1\u1593\7\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\10\276\1\u1594\6\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\11\276\1\u1595\5\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\12\276\1\u1596\4\276\1\u0340\41\276\1\u033d\1\u033e\13\276"+
+ "\1\u1597\3\276\1\u0340\41\276\1\u033d\1\u033e\14\276\1\u1598"+
+ "\2\276\1\u0340\41\276\1\u033d\1\u033e\15\276\1\u1599\1\276"+
+ "\1\u0340\41\276\1\300\1\u02bf\1\276\1\u159a\15\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\2\276\1\u159b\14\276\1\u02c1\40\276"+
+ "\1\263\1\u03cf\1\u03d0\1\263\1\u159c\1\263\1\u0136\13\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\2\263\1\u159d\1\u0136\13\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\u159e\12\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\263\1\u159f"+
+ "\11\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\2\263"+
+ "\1\u15a0\10\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\3\263\1\u15a1\7\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\4\263\1\u15a2\6\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\5\263\1\u15a3\5\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\6\263\1\u15a4\4\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\7\263\1\u15a5\3\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\10\263\1\u15a6\2\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\11\263\1\u15a7"+
+ "\1\263\1\u03d2\40\263\1\344\1\u03de\1\u03df\1\344\1\u15a8"+
+ "\1\344\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df\2\344"+
+ "\1\u15a9\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\1\u15aa\12\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\1\344\1\u15ab\11\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\2\344\1\u15ac\10\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\3\344\1\u15ad\7\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\4\344\1\u15ae\6\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\5\344\1\u15af\5\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\6\344\1\u15b0"+
+ "\4\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\7\344"+
+ "\1\u15b1\3\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\10\344\1\u15b2\2\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\11\344\1\u15b3\1\344\1\u03e1\40\344\1\276\1\300"+
+ "\1\u02bf\3\276\1\u15b4\13\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\4\276\1\u15b5\12\276\1\u02c1\41\276\1\300\1\u02bf\5\276"+
+ "\1\u15b6\11\276\1\u02c1\41\276\1\300\1\u02bf\6\276\1\u15b7"+
+ "\10\276\1\u02c1\41\276\1\300\1\u02bf\7\276\1\u15b8\7\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\10\276\1\u15b9\6\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\11\276\1\u15ba\5\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\12\276\1\u15bb\4\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\13\276\1\u15bc\3\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\14\276\1\u15bd\2\276\1\u02c1\41\276\1\300\1\u02bf\15\276"+
+ "\1\u15be\1\276\1\u02c1\40\276\1\0\2\u0384\1\0\1\u15bf"+
+ "\15\0\1\u0386\41\0\2\u0384\2\0\1\u15c0\14\0\1\u0386"+
+ "\41\0\2\u0384\3\0\1\u15c1\13\0\1\u0386\41\0\2\u0384"+
+ "\4\0\1\u15c2\12\0\1\u0386\41\0\2\u0384\5\0\1\u15c3"+
+ "\11\0\1\u0386\41\0\2\u0384\6\0\1\u15c4\10\0\1\u0386"+
+ "\41\0\2\u0384\7\0\1\u15c5\7\0\1\u0386\41\0\2\u0384"+
+ "\10\0\1\u15c6\6\0\1\u0386\41\0\2\u0384\11\0\1\u15c7"+
+ "\5\0\1\u0386\41\0\2\u0384\12\0\1\u15c8\4\0\1\u0386"+
+ "\41\0\2\u0384\13\0\1\u15c9\3\0\1\u0386\41\0\2\u0384"+
+ "\14\0\1\u15ca\2\0\1\u0386\41\0\2\u0384\15\0\1\u15cb"+
+ "\1\0\1\u0386\41\0\1\u0312\1\u0313\1\0\1\u15cc\15\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\2\0\1\u15cd\14\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\3\0\1\u15ce\13\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\4\0\1\u15cf\12\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\5\0\1\u15d0\11\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\6\0\1\u15d1\10\0\1\u0315\41\0\1\u0312\1\u0313\7\0"+
+ "\1\u15d2\7\0\1\u0315\41\0\1\u0312\1\u0313\10\0\1\u15d3"+
+ "\6\0\1\u0315\41\0\1\u0312\1\u0313\11\0\1\u15d4\5\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\12\0\1\u15d5\4\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\13\0\1\u15d6\3\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\14\0\1\u15d7\2\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\15\0\1\u15d8\1\0\1\u0315\41\0\2\u03a1\1\0"+
+ "\1\u15d9\15\0\1\u03a3\41\0\2\u03a1\2\0\1\u15da\14\0"+
+ "\1\u03a3\41\0\2\u03a1\3\0\1\u15db\13\0\1\u03a3\41\0"+
+ "\2\u03a1\4\0\1\u15dc\12\0\1\u03a3\41\0\2\u03a1\5\0"+
+ "\1\u15dd\11\0\1\u03a3\41\0\2\u03a1\6\0\1\u15de\10\0"+
+ "\1\u03a3\41\0\2\u03a1\7\0\1\u15df\7\0\1\u03a3\41\0"+
+ "\2\u03a1\10\0\1\u15e0\6\0\1\u03a3\41\0\2\u03a1\11\0"+
+ "\1\u15e1\5\0\1\u03a3\41\0\2\u03a1\12\0\1\u15e2\4\0"+
+ "\1\u03a3\41\0\2\u03a1\13\0\1\u15e3\3\0\1\u03a3\41\0"+
+ "\2\u03a1\14\0\1\u15e4\2\0\1\u03a3\41\0\2\u03a1\15\0"+
+ "\1\u15e5\1\0\1\u03a3\40\0\1\276\1\u03b0\1\u03b1\1\276"+
+ "\1\u15e6\15\276\1\u03b3\41\276\1\u03b0\1\u03b1\2\276\1\u15e7"+
+ "\14\276\1\u03b3\41\276\1\u03b0\1\u03b1\3\276\1\u15e8\13\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\4\276\1\u15e9\12\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\5\276\1\u15ea\11\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\6\276\1\u15eb\10\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\7\276\1\u15ec\7\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\10\276\1\u15ed\6\276\1\u03b3\41\276\1\u03b0\1\u03b1\11\276"+
+ "\1\u15ee\5\276\1\u03b3\41\276\1\u03b0\1\u03b1\12\276\1\u15ef"+
+ "\4\276\1\u03b3\41\276\1\u03b0\1\u03b1\13\276\1\u15f0\3\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\14\276\1\u15f1\2\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\15\276\1\u15f2\1\276\1\u03b3\41\276"+
+ "\1\u033d\1\u033e\1\276\1\u15f3\15\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\2\276\1\u15f4\14\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\3\276\1\u15f5\13\276\1\u0340\41\276\1\u033d\1\u033e\4\276"+
+ "\1\u15f6\12\276\1\u0340\41\276\1\u033d\1\u033e\5\276\1\u15f7"+
+ "\11\276\1\u0340\41\276\1\u033d\1\u033e\6\276\1\u15f8\10\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\7\276\1\u15f9\7\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\10\276\1\u15fa\6\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\11\276\1\u15fb\5\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\12\276\1\u15fc\4\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\13\276\1\u15fd\3\276\1\u0340\41\276\1\u033d\1\u033e\14\276"+
+ "\1\u15fe\2\276\1\u0340\41\276\1\u033d\1\u033e\15\276\1\u15ff"+
+ "\1\276\1\u0340\41\276\1\300\1\u02bf\1\276\1\u1600\15\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\2\276\1\u1601\14\276\1\u02c1"+
+ "\40\276\1\263\1\u03cf\1\u03d0\1\263\1\u1602\1\263\1\u0136"+
+ "\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\2\263\1\u1603\1\u0136"+
+ "\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\u1604"+
+ "\12\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\263"+
+ "\1\u1605\11\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\2\263\1\u1606\10\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\3\263\1\u1607\7\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\4\263\1\u1608\6\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\5\263\1\u1609\5\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\6\263\1\u160a\4\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\7\263\1\u160b\3\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\10\263\1\u160c"+
+ "\2\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\11\263"+
+ "\1\u160d\1\263\1\u03d2\40\263\1\344\1\u03de\1\u03df\1\344"+
+ "\1\u160e\1\344\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\2\344\1\u160f\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\1\u1610\12\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\1\344\1\u1611\11\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\2\344\1\u1612\10\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\3\344\1\u1613\7\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\4\344\1\u1614\6\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\5\344\1\u1615"+
+ "\5\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\6\344"+
+ "\1\u1616\4\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\7\344\1\u1617\3\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\10\344\1\u1618\2\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\11\344\1\u1619\1\344\1\u03e1\40\344\1\276"+
+ "\1\300\1\u02bf\3\276\1\u161a\13\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\4\276\1\u161b\12\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\5\276\1\u161c\11\276\1\u02c1\41\276\1\300\1\u02bf\6\276"+
+ "\1\u161d\10\276\1\u02c1\41\276\1\300\1\u02bf\7\276\1\u161e"+
+ "\7\276\1\u02c1\41\276\1\300\1\u02bf\10\276\1\u161f\6\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\11\276\1\u1620\5\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\12\276\1\u1621\4\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\13\276\1\u1622\3\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\14\276\1\u1623\2\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\15\276\1\u1624\1\276\1\u02c1\40\276\1\0\2\u0384\1\0"+
+ "\1\u1625\15\0\1\u0386\41\0\2\u0384\2\0\1\u1626\14\0"+
+ "\1\u0386\41\0\2\u0384\3\0\1\u1627\13\0\1\u0386\41\0"+
+ "\2\u0384\4\0\1\u1628\12\0\1\u0386\41\0\2\u0384\5\0"+
+ "\1\u1629\11\0\1\u0386\41\0\2\u0384\6\0\1\u162a\10\0"+
+ "\1\u0386\41\0\2\u0384\7\0\1\u162b\7\0\1\u0386\41\0"+
+ "\2\u0384\10\0\1\u162c\6\0\1\u0386\41\0\2\u0384\11\0"+
+ "\1\u162d\5\0\1\u0386\41\0\2\u0384\12\0\1\u162e\4\0"+
+ "\1\u0386\41\0\2\u0384\13\0\1\u162f\3\0\1\u0386\41\0"+
+ "\2\u0384\14\0\1\u1630\2\0\1\u0386\41\0\2\u0384\15\0"+
+ "\1\u1631\1\0\1\u0386\41\0\1\u0312\1\u0313\1\0\1\u1632"+
+ "\15\0\1\u0315\41\0\1\u0312\1\u0313\2\0\1\u1633\14\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\3\0\1\u1634\13\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\4\0\1\u1635\12\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\5\0\1\u1636\11\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\6\0\1\u1637\10\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\7\0\1\u1638\7\0\1\u0315\41\0\1\u0312\1\u0313\10\0"+
+ "\1\u1639\6\0\1\u0315\41\0\1\u0312\1\u0313\11\0\1\u163a"+
+ "\5\0\1\u0315\41\0\1\u0312\1\u0313\12\0\1\u163b\4\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\13\0\1\u163c\3\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\14\0\1\u163d\2\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\15\0\1\u163e\1\0\1\u0315\41\0\2\u03a1"+
+ "\1\0\1\u163f\15\0\1\u03a3\41\0\2\u03a1\2\0\1\u1640"+
+ "\14\0\1\u03a3\41\0\2\u03a1\3\0\1\u1641\13\0\1\u03a3"+
+ "\41\0\2\u03a1\4\0\1\u1642\12\0\1\u03a3\41\0\2\u03a1"+
+ "\5\0\1\u1643\11\0\1\u03a3\41\0\2\u03a1\6\0\1\u1644"+
+ "\10\0\1\u03a3\41\0\2\u03a1\7\0\1\u1645\7\0\1\u03a3"+
+ "\41\0\2\u03a1\10\0\1\u1646\6\0\1\u03a3\41\0\2\u03a1"+
+ "\11\0\1\u1647\5\0\1\u03a3\41\0\2\u03a1\12\0\1\u1648"+
+ "\4\0\1\u03a3\41\0\2\u03a1\13\0\1\u1649\3\0\1\u03a3"+
+ "\41\0\2\u03a1\14\0\1\u164a\2\0\1\u03a3\41\0\2\u03a1"+
+ "\15\0\1\u164b\1\0\1\u03a3\40\0\1\276\1\u03b0\1\u03b1"+
+ "\1\276\1\u164c\15\276\1\u03b3\41\276\1\u03b0\1\u03b1\2\276"+
+ "\1\u164d\14\276\1\u03b3\41\276\1\u03b0\1\u03b1\3\276\1\u164e"+
+ "\13\276\1\u03b3\41\276\1\u03b0\1\u03b1\4\276\1\u164f\12\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\5\276\1\u1650\11\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\6\276\1\u1651\10\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\7\276\1\u1652\7\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\10\276\1\u1653\6\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\11\276\1\u1654\5\276\1\u03b3\41\276\1\u03b0\1\u03b1\12\276"+
+ "\1\u1655\4\276\1\u03b3\41\276\1\u03b0\1\u03b1\13\276\1\u1656"+
+ "\3\276\1\u03b3\41\276\1\u03b0\1\u03b1\14\276\1\u1657\2\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\15\276\1\u1658\1\276\1\u03b3"+
+ "\41\276\1\u033d\1\u033e\1\276\1\u1659\15\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\2\276\1\u165a\14\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\3\276\1\u165b\13\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\4\276\1\u165c\12\276\1\u0340\41\276\1\u033d\1\u033e\5\276"+
+ "\1\u165d\11\276\1\u0340\41\276\1\u033d\1\u033e\6\276\1\u165e"+
+ "\10\276\1\u0340\41\276\1\u033d\1\u033e\7\276\1\u165f\7\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\10\276\1\u1660\6\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\11\276\1\u1661\5\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\12\276\1\u1662\4\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\13\276\1\u1663\3\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\14\276\1\u1664\2\276\1\u0340\41\276\1\u033d\1\u033e\15\276"+
+ "\1\u1665\1\276\1\u0340\41\276\1\300\1\u02bf\1\276\1\u1666"+
+ "\15\276\1\u02c1\41\276\1\300\1\u02bf\2\276\1\u1667\14\276"+
+ "\1\u02c1\40\276\1\263\1\u03cf\1\u03d0\1\263\1\u1668\1\263"+
+ "\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\2\263\1\u1669"+
+ "\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\1\u166a\12\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\1\263\1\u166b\11\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\2\263\1\u166c\10\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\3\263\1\u166d\7\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\4\263\1\u166e\6\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\5\263\1\u166f\5\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\6\263\1\u1670\4\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\7\263\1\u1671"+
+ "\3\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\10\263"+
+ "\1\u1672\2\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\11\263\1\u1673\1\263\1\u03d2\40\263\1\344\1\u03de\1\u03df"+
+ "\1\344\1\u1674\1\344\1\u017c\13\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\2\344\1\u1675\1\u017c\13\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\1\u1676\12\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\1\344\1\u1677\11\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\2\344\1\u1678\10\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\3\344\1\u1679\7\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\4\344\1\u167a"+
+ "\6\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\5\344"+
+ "\1\u167b\5\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\6\344\1\u167c\4\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\7\344\1\u167d\3\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\10\344\1\u167e\2\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\11\344\1\u167f\1\344\1\u03e1\40\344"+
+ "\1\276\1\300\1\u02bf\3\276\1\u1680\13\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\4\276\1\u1681\12\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\5\276\1\u1682\11\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\6\276\1\u1683\10\276\1\u02c1\41\276\1\300\1\u02bf\7\276"+
+ "\1\u1684\7\276\1\u02c1\41\276\1\300\1\u02bf\10\276\1\u1685"+
+ "\6\276\1\u02c1\41\276\1\300\1\u02bf\11\276\1\u1686\5\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\12\276\1\u1687\4\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\13\276\1\u1688\3\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\14\276\1\u1689\2\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\15\276\1\u168a\1\276\1\u02c1\40\276\1\0\2\u0384"+
+ "\1\0\1\u168b\15\0\1\u0386\41\0\2\u0384\2\0\1\u168c"+
+ "\14\0\1\u0386\41\0\2\u0384\3\0\1\u168d\13\0\1\u0386"+
+ "\41\0\2\u0384\4\0\1\u168e\12\0\1\u0386\41\0\2\u0384"+
+ "\5\0\1\u168f\11\0\1\u0386\41\0\2\u0384\6\0\1\u1690"+
+ "\10\0\1\u0386\41\0\2\u0384\7\0\1\u1691\7\0\1\u0386"+
+ "\41\0\2\u0384\10\0\1\u1692\6\0\1\u0386\41\0\2\u0384"+
+ "\11\0\1\u1693\5\0\1\u0386\41\0\2\u0384\12\0\1\u1694"+
+ "\4\0\1\u0386\41\0\2\u0384\13\0\1\u1695\3\0\1\u0386"+
+ "\41\0\2\u0384\14\0\1\u1696\2\0\1\u0386\41\0\2\u0384"+
+ "\15\0\1\u1697\1\0\1\u0386\41\0\1\u0312\1\u0313\1\0"+
+ "\1\u1698\15\0\1\u0315\41\0\1\u0312\1\u0313\2\0\1\u1699"+
+ "\14\0\1\u0315\41\0\1\u0312\1\u0313\3\0\1\u169a\13\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\4\0\1\u169b\12\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\5\0\1\u169c\11\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\6\0\1\u169d\10\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\7\0\1\u169e\7\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\10\0\1\u169f\6\0\1\u0315\41\0\1\u0312\1\u0313\11\0"+
+ "\1\u16a0\5\0\1\u0315\41\0\1\u0312\1\u0313\12\0\1\u16a1"+
+ "\4\0\1\u0315\41\0\1\u0312\1\u0313\13\0\1\u16a2\3\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\14\0\1\u16a3\2\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\15\0\1\u16a4\1\0\1\u0315\41\0"+
+ "\2\u03a1\1\0\1\u16a5\15\0\1\u03a3\41\0\2\u03a1\2\0"+
+ "\1\u16a6\14\0\1\u03a3\41\0\2\u03a1\3\0\1\u16a7\13\0"+
+ "\1\u03a3\41\0\2\u03a1\4\0\1\u16a8\12\0\1\u03a3\41\0"+
+ "\2\u03a1\5\0\1\u16a9\11\0\1\u03a3\41\0\2\u03a1\6\0"+
+ "\1\u16aa\10\0\1\u03a3\41\0\2\u03a1\7\0\1\u16ab\7\0"+
+ "\1\u03a3\41\0\2\u03a1\10\0\1\u16ac\6\0\1\u03a3\41\0"+
+ "\2\u03a1\11\0\1\u16ad\5\0\1\u03a3\41\0\2\u03a1\12\0"+
+ "\1\u16ae\4\0\1\u03a3\41\0\2\u03a1\13\0\1\u16af\3\0"+
+ "\1\u03a3\41\0\2\u03a1\14\0\1\u16b0\2\0\1\u03a3\41\0"+
+ "\2\u03a1\15\0\1\u16b1\1\0\1\u03a3\40\0\1\276\1\u03b0"+
+ "\1\u03b1\1\276\1\u16b2\15\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\2\276\1\u16b3\14\276\1\u03b3\41\276\1\u03b0\1\u03b1\3\276"+
+ "\1\u16b4\13\276\1\u03b3\41\276\1\u03b0\1\u03b1\4\276\1\u16b5"+
+ "\12\276\1\u03b3\41\276\1\u03b0\1\u03b1\5\276\1\u16b6\11\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\6\276\1\u16b7\10\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\7\276\1\u16b8\7\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\10\276\1\u16b9\6\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\11\276\1\u16ba\5\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\12\276\1\u16bb\4\276\1\u03b3\41\276\1\u03b0\1\u03b1\13\276"+
+ "\1\u16bc\3\276\1\u03b3\41\276\1\u03b0\1\u03b1\14\276\1\u16bd"+
+ "\2\276\1\u03b3\41\276\1\u03b0\1\u03b1\15\276\1\u16be\1\276"+
+ "\1\u03b3\41\276\1\u033d\1\u033e\1\276\1\u16bf\15\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\2\276\1\u16c0\14\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\3\276\1\u16c1\13\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\4\276\1\u16c2\12\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\5\276\1\u16c3\11\276\1\u0340\41\276\1\u033d\1\u033e\6\276"+
+ "\1\u16c4\10\276\1\u0340\41\276\1\u033d\1\u033e\7\276\1\u16c5"+
+ "\7\276\1\u0340\41\276\1\u033d\1\u033e\10\276\1\u16c6\6\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\11\276\1\u16c7\5\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\12\276\1\u16c8\4\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\13\276\1\u16c9\3\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\14\276\1\u16ca\2\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\15\276\1\u16cb\1\276\1\u0340\41\276\1\300\1\u02bf\1\276"+
+ "\1\u16cc\15\276\1\u02c1\41\276\1\300\1\u02bf\2\276\1\u16cd"+
+ "\14\276\1\u02c1\40\276\1\263\1\u03cf\1\u03d0\1\263\1\u16ce"+
+ "\1\263\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\2\263"+
+ "\1\u16cf\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\1\u16d0\12\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\1\263\1\u16d1\11\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\2\263\1\u16d2\10\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\3\263\1\u16d3\7\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\4\263\1\u16d4\6\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\5\263\1\u16d5\5\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\6\263\1\u16d6"+
+ "\4\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\7\263"+
+ "\1\u16d7\3\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\10\263\1\u16d8\2\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\11\263\1\u16d9\1\263\1\u03d2\40\263\1\344\1\u03de"+
+ "\1\u03df\1\344\1\u16da\1\344\1\u017c\13\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\2\344\1\u16db\1\u017c\13\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\1\u16dc\12\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\1\344\1\u16dd\11\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\2\344\1\u16de\10\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\3\344\1\u16df"+
+ "\7\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\4\344"+
+ "\1\u16e0\6\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\5\344\1\u16e1\5\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\6\344\1\u16e2\4\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\7\344\1\u16e3\3\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\10\344\1\u16e4\2\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\11\344\1\u16e5\1\344\1\u03e1"+
+ "\40\344\1\276\1\300\1\u02bf\3\276\1\u16e6\13\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\4\276\1\u16e7\12\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\5\276\1\u16e8\11\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\6\276\1\u16e9\10\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\7\276\1\u16ea\7\276\1\u02c1\41\276\1\300\1\u02bf\10\276"+
+ "\1\u16eb\6\276\1\u02c1\41\276\1\300\1\u02bf\11\276\1\u16ec"+
+ "\5\276\1\u02c1\41\276\1\300\1\u02bf\12\276\1\u16ed\4\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\13\276\1\u16ee\3\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\14\276\1\u16ef\2\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\15\276\1\u16f0\1\276\1\u02c1\40\276\1\0"+
+ "\2\u0384\1\0\1\u16f1\15\0\1\u0386\41\0\2\u0384\2\0"+
+ "\1\u16f2\14\0\1\u0386\41\0\2\u0384\3\0\1\u16f3\13\0"+
+ "\1\u0386\41\0\2\u0384\4\0\1\u16f4\12\0\1\u0386\41\0"+
+ "\2\u0384\5\0\1\u16f5\11\0\1\u0386\41\0\2\u0384\6\0"+
+ "\1\u16f6\10\0\1\u0386\41\0\2\u0384\7\0\1\u16f7\7\0"+
+ "\1\u0386\41\0\2\u0384\10\0\1\u16f8\6\0\1\u0386\41\0"+
+ "\2\u0384\11\0\1\u16f9\5\0\1\u0386\41\0\2\u0384\12\0"+
+ "\1\u16fa\4\0\1\u0386\41\0\2\u0384\13\0\1\u16fb\3\0"+
+ "\1\u0386\41\0\2\u0384\14\0\1\u16fc\2\0\1\u0386\41\0"+
+ "\2\u0384\15\0\1\u16fd\1\0\1\u0386\41\0\1\u0312\1\u0313"+
+ "\1\0\1\u16fe\15\0\1\u0315\41\0\1\u0312\1\u0313\2\0"+
+ "\1\u16ff\14\0\1\u0315\41\0\1\u0312\1\u0313\3\0\1\u1700"+
+ "\13\0\1\u0315\41\0\1\u0312\1\u0313\4\0\1\u1701\12\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\5\0\1\u1702\11\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\6\0\1\u1703\10\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\7\0\1\u1704\7\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\10\0\1\u1705\6\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\11\0\1\u1706\5\0\1\u0315\41\0\1\u0312\1\u0313\12\0"+
+ "\1\u1707\4\0\1\u0315\41\0\1\u0312\1\u0313\13\0\1\u1708"+
+ "\3\0\1\u0315\41\0\1\u0312\1\u0313\14\0\1\u1709\2\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\15\0\1\u170a\1\0\1\u0315"+
+ "\41\0\2\u03a1\1\0\1\u170b\15\0\1\u03a3\41\0\2\u03a1"+
+ "\2\0\1\u170c\14\0\1\u03a3\41\0\2\u03a1\3\0\1\u170d"+
+ "\13\0\1\u03a3\41\0\2\u03a1\4\0\1\u170e\12\0\1\u03a3"+
+ "\41\0\2\u03a1\5\0\1\u170f\11\0\1\u03a3\41\0\2\u03a1"+
+ "\6\0\1\u1710\10\0\1\u03a3\41\0\2\u03a1\7\0\1\u1711"+
+ "\7\0\1\u03a3\41\0\2\u03a1\10\0\1\u1712\6\0\1\u03a3"+
+ "\41\0\2\u03a1\11\0\1\u1713\5\0\1\u03a3\41\0\2\u03a1"+
+ "\12\0\1\u1714\4\0\1\u03a3\41\0\2\u03a1\13\0\1\u1715"+
+ "\3\0\1\u03a3\41\0\2\u03a1\14\0\1\u1716\2\0\1\u03a3"+
+ "\41\0\2\u03a1\15\0\1\u1717\1\0";
private static final String ZZ_TRANS_PACKED_2 =
- "\15\276\1\u1e14\42\276\1\0\2\u0381\1\0\1\u1e15\57\0"+
- "\2\u0381\2\0\1\u1e16\56\0\2\u0381\3\0\1\u1e17\55\0"+
- "\2\u0381\4\0\1\u1e18\54\0\2\u0381\5\0\1\u1e19\53\0"+
- "\2\u0381\6\0\1\u1e1a\52\0\2\u0381\7\0\1\u1e1b\51\0"+
- "\2\u0381\10\0\1\u1e1c\50\0\2\u0381\11\0\1\u1e1d\47\0"+
- "\2\u0381\12\0\1\u1e1e\46\0\2\u0381\13\0\1\u1e1f\45\0"+
- "\2\u0381\14\0\1\u1e20\44\0\2\u0381\15\0\1\u1e21\43\0"+
- "\1\u0311\1\u0312\1\0\1\u1e22\57\0\1\u0311\1\u0312\2\0"+
- "\1\u1e23\56\0\1\u0311\1\u0312\3\0\1\u1e24\55\0\1\u0311"+
- "\1\u0312\4\0\1\u1e25\54\0\1\u0311\1\u0312\5\0\1\u1e26"+
- "\53\0\1\u0311\1\u0312\6\0\1\u1e27\52\0\1\u0311\1\u0312"+
- "\7\0\1\u1e28\51\0\1\u0311\1\u0312\10\0\1\u1e29\50\0"+
- "\1\u0311\1\u0312\11\0\1\u1e2a\47\0\1\u0311\1\u0312\12\0"+
- "\1\u1e2b\46\0\1\u0311\1\u0312\13\0\1\u1e2c\45\0\1\u0311"+
- "\1\u0312\14\0\1\u1e2d\44\0\1\u0311\1\u0312\15\0\1\u1e2e"+
- "\43\0\2\u039d\1\0\1\u1e2f\57\0\2\u039d\2\0\1\u1e30"+
- "\56\0\2\u039d\3\0\1\u1e31\55\0\2\u039d\4\0\1\u1e32"+
- "\54\0\2\u039d\5\0\1\u1e33\53\0\2\u039d\6\0\1\u1e34"+
- "\52\0\2\u039d\7\0\1\u1e35\51\0\2\u039d\10\0\1\u1e36"+
- "\50\0\2\u039d\11\0\1\u1e37\47\0\2\u039d\12\0\1\u1e38"+
- "\46\0\2\u039d\13\0\1\u1e39\45\0\2\u039d\14\0\1\u1e3a"+
- "\44\0\2\u039d\15\0\1\u1e3b\42\0\1\276\1\u03ab\1\u03ac"+
- "\1\276\1\u1e3c\57\276\1\u03ab\1\u03ac\2\276\1\u1e3d\56\276"+
- "\1\u03ab\1\u03ac\3\276\1\u1e3e\55\276\1\u03ab\1\u03ac\4\276"+
- "\1\u1e3f\54\276\1\u03ab\1\u03ac\5\276\1\u1e40\53\276\1\u03ab"+
- "\1\u03ac\6\276\1\u1e41\52\276\1\u03ab\1\u03ac\7\276\1\u1e42"+
- "\51\276\1\u03ab\1\u03ac\10\276\1\u1e43\50\276\1\u03ab\1\u03ac"+
- "\11\276\1\u1e44\47\276\1\u03ab\1\u03ac\12\276\1\u1e45\46\276"+
- "\1\u03ab\1\u03ac\13\276\1\u1e46\45\276\1\u03ab\1\u03ac\14\276"+
- "\1\u1e47\44\276\1\u03ab\1\u03ac\15\276\1\u1e48\43\276\1\u033b"+
- "\1\u033c\1\276\1\u1e49\57\276\1\u033b\1\u033c\2\276\1\u1e4a"+
- "\56\276\1\u033b\1\u033c\3\276\1\u1e4b\55\276\1\u033b\1\u033c"+
- "\4\276\1\u1e4c\54\276\1\u033b\1\u033c\5\276\1\u1e4d\53\276"+
- "\1\u033b\1\u033c\6\276\1\u1e4e\52\276\1\u033b\1\u033c\7\276"+
- "\1\u1e4f\51\276\1\u033b\1\u033c\10\276\1\u1e50\50\276\1\u033b"+
- "\1\u033c\11\276\1\u1e51\47\276\1\u033b\1\u033c\12\276\1\u1e52"+
- "\46\276\1\u033b\1\u033c\13\276\1\u1e53\45\276\1\u033b\1\u033c"+
- "\14\276\1\u1e54\44\276\1\u033b\1\u033c\15\276\1\u1e55\43\276"+
- "\1\300\1\u02bf\1\276\1\u1e56\57\276\1\300\1\u02bf\2\276"+
- "\1\u1e57\55\276\1\263\1\u03c9\1\u03ca\1\263\1\u1e58\1\263"+
- "\1\u0136\55\263\1\u03c9\1\u03ca\2\263\1\u1e59\1\u0136\55\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\1\u1e5a\54\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\1\263\1\u1e5b\53\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\2\263\1\u1e5c\52\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\3\263\1\u1e5d\51\263\1\u03c9\1\u03ca\3\263\1\u0136\4\263"+
- "\1\u1e5e\50\263\1\u03c9\1\u03ca\3\263\1\u0136\5\263\1\u1e5f"+
- "\47\263\1\u03c9\1\u03ca\3\263\1\u0136\6\263\1\u1e60\46\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\7\263\1\u1e61\45\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\10\263\1\u1e62\44\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\11\263\1\u1e63\42\263\1\344\1\u03d7\1\u03d8"+
- "\1\344\1\u1e64\1\344\1\u017c\55\344\1\u03d7\1\u03d8\2\344"+
- "\1\u1e65\1\u017c\55\344\1\u03d7\1\u03d8\3\344\1\u017c\1\u1e66"+
- "\54\344\1\u03d7\1\u03d8\3\344\1\u017c\1\344\1\u1e67\53\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\2\344\1\u1e68\52\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\3\344\1\u1e69\51\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\4\344\1\u1e6a\50\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\5\344\1\u1e6b\47\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\6\344\1\u1e6c\46\344\1\u03d7\1\u03d8\3\344\1\u017c\7\344"+
- "\1\u1e6d\45\344\1\u03d7\1\u03d8\3\344\1\u017c\10\344\1\u1e6e"+
- "\44\344\1\u03d7\1\u03d8\3\344\1\u017c\11\344\1\u1e6f\42\344"+
- "\1\276\1\300\1\u02bf\3\276\1\u1e70\55\276\1\300\1\u02bf"+
- "\4\276\1\u1e71\54\276\1\300\1\u02bf\5\276\1\u1e72\53\276"+
- "\1\300\1\u02bf\6\276\1\u1e73\52\276\1\300\1\u02bf\7\276"+
- "\1\u1e74\51\276\1\300\1\u02bf\10\276\1\u1e75\50\276\1\300"+
- "\1\u02bf\11\276\1\u1e76\47\276\1\300\1\u02bf\12\276\1\u1e77"+
- "\46\276\1\300\1\u02bf\13\276\1\u1e78\45\276\1\300\1\u02bf"+
- "\14\276\1\u1e79\44\276\1\300\1\u02bf\15\276\1\u1e7a\42\276"+
- "\1\0\2\u0381\1\0\1\u1e7b\57\0\2\u0381\2\0\1\u1e7c"+
- "\56\0\2\u0381\3\0\1\u1e7d\55\0\2\u0381\4\0\1\u1e7e"+
- "\54\0\2\u0381\5\0\1\u1e7f\53\0\2\u0381\6\0\1\u1e80"+
- "\52\0\2\u0381\7\0\1\u1e81\51\0\2\u0381\10\0\1\u1e82"+
- "\50\0\2\u0381\11\0\1\u1e83\47\0\2\u0381\12\0\1\u1e84"+
- "\46\0\2\u0381\13\0\1\u1e85\45\0\2\u0381\14\0\1\u1e86"+
- "\44\0\2\u0381\15\0\1\u1e87\43\0\1\u0311\1\u0312\1\0"+
- "\1\u1e88\57\0\1\u0311\1\u0312\2\0\1\u1e89\56\0\1\u0311"+
- "\1\u0312\3\0\1\u1e8a\55\0\1\u0311\1\u0312\4\0\1\u1e8b"+
- "\54\0\1\u0311\1\u0312\5\0\1\u1e8c\53\0\1\u0311\1\u0312"+
- "\6\0\1\u1e8d\52\0\1\u0311\1\u0312\7\0\1\u1e8e\51\0"+
- "\1\u0311\1\u0312\10\0\1\u1e8f\50\0\1\u0311\1\u0312\11\0"+
- "\1\u1e90\47\0\1\u0311\1\u0312\12\0\1\u1e91\46\0\1\u0311"+
- "\1\u0312\13\0\1\u1e92\45\0\1\u0311\1\u0312\14\0\1\u1e93"+
- "\44\0\1\u0311\1\u0312\15\0\1\u1e94\43\0\2\u039d\1\0"+
- "\1\u1e95\57\0\2\u039d\2\0\1\u1e96\56\0\2\u039d\3\0"+
- "\1\u1e97\55\0\2\u039d\4\0\1\u1e98\54\0\2\u039d\5\0"+
- "\1\u1e99\53\0\2\u039d\6\0\1\u1e9a\52\0\2\u039d\7\0"+
- "\1\u1e9b\51\0\2\u039d\10\0\1\u1e9c\50\0\2\u039d\11\0"+
- "\1\u1e9d\47\0\2\u039d\12\0\1\u1e9e\46\0\2\u039d\13\0"+
- "\1\u1e9f\45\0\2\u039d\14\0\1\u1ea0\44\0\2\u039d\15\0"+
- "\1\u1ea1\42\0\1\276\1\u03ab\1\u03ac\1\276\1\u1ea2\57\276"+
- "\1\u03ab\1\u03ac\2\276\1\u1ea3\56\276\1\u03ab\1\u03ac\3\276"+
- "\1\u1ea4\55\276\1\u03ab\1\u03ac\4\276\1\u1ea5\54\276\1\u03ab"+
- "\1\u03ac\5\276\1\u1ea6\53\276\1\u03ab\1\u03ac\6\276\1\u1ea7"+
- "\52\276\1\u03ab\1\u03ac\7\276\1\u1ea8\51\276\1\u03ab\1\u03ac"+
- "\10\276\1\u1ea9\50\276\1\u03ab\1\u03ac\11\276\1\u1eaa\47\276"+
- "\1\u03ab\1\u03ac\12\276\1\u1eab\46\276\1\u03ab\1\u03ac\13\276"+
- "\1\u1eac\45\276\1\u03ab\1\u03ac\14\276\1\u1ead\44\276\1\u03ab"+
- "\1\u03ac\15\276\1\u1eae\43\276\1\u033b\1\u033c\1\276\1\u1eaf"+
- "\57\276\1\u033b\1\u033c\2\276\1\u1eb0\56\276\1\u033b\1\u033c"+
- "\3\276\1\u1eb1\55\276\1\u033b\1\u033c\4\276\1\u1eb2\54\276"+
- "\1\u033b\1\u033c\5\276\1\u1eb3\53\276\1\u033b\1\u033c\6\276"+
- "\1\u1eb4\52\276\1\u033b\1\u033c\7\276\1\u1eb5\51\276\1\u033b"+
- "\1\u033c\10\276\1\u1eb6\50\276\1\u033b\1\u033c\11\276\1\u1eb7"+
- "\47\276\1\u033b\1\u033c\12\276\1\u1eb8\46\276\1\u033b\1\u033c"+
- "\13\276\1\u1eb9\45\276\1\u033b\1\u033c\14\276\1\u1eba\44\276"+
- "\1\u033b\1\u033c\15\276\1\u1ebb\43\276\1\300\1\u02bf\1\276"+
- "\1\u1ebc\57\276\1\300\1\u02bf\2\276\1\u1ebd\55\276\1\263"+
- "\1\u03c9\1\u03ca\1\263\1\u1ebe\1\263\1\u0136\55\263\1\u03c9"+
- "\1\u03ca\2\263\1\u1ebf\1\u0136\55\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\1\u1ec0\54\263\1\u03c9\1\u03ca\3\263\1\u0136\1\263"+
- "\1\u1ec1\53\263\1\u03c9\1\u03ca\3\263\1\u0136\2\263\1\u1ec2"+
- "\52\263\1\u03c9\1\u03ca\3\263\1\u0136\3\263\1\u1ec3\51\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\4\263\1\u1ec4\50\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\5\263\1\u1ec5\47\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\6\263\1\u1ec6\46\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\7\263\1\u1ec7\45\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\10\263\1\u1ec8\44\263\1\u03c9\1\u03ca\3\263\1\u0136\11\263"+
- "\1\u1ec9\42\263\1\344\1\u03d7\1\u03d8\1\344\1\u1eca\1\344"+
- "\1\u017c\55\344\1\u03d7\1\u03d8\2\344\1\u1ecb\1\u017c\55\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\1\u1ecc\54\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\1\344\1\u1ecd\53\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\2\344\1\u1ece\52\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\3\344\1\u1ecf\51\344\1\u03d7\1\u03d8\3\344\1\u017c\4\344"+
- "\1\u1ed0\50\344\1\u03d7\1\u03d8\3\344\1\u017c\5\344\1\u1ed1"+
- "\47\344\1\u03d7\1\u03d8\3\344\1\u017c\6\344\1\u1ed2\46\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\7\344\1\u1ed3\45\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\10\344\1\u1ed4\44\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\11\344\1\u1ed5\42\344\1\276\1\300\1\u02bf"+
- "\3\276\1\u1ed6\55\276\1\300\1\u02bf\4\276\1\u1ed7\54\276"+
- "\1\300\1\u02bf\5\276\1\u1ed8\53\276\1\300\1\u02bf\6\276"+
- "\1\u1ed9\52\276\1\300\1\u02bf\7\276\1\u1eda\51\276\1\300"+
- "\1\u02bf\10\276\1\u1edb\50\276\1\300\1\u02bf\11\276\1\u1edc"+
- "\47\276\1\300\1\u02bf\12\276\1\u1edd\46\276\1\300\1\u02bf"+
- "\13\276\1\u1ede\45\276\1\300\1\u02bf\14\276\1\u1edf\44\276"+
- "\1\300\1\u02bf\15\276\1\u1ee0\42\276\1\0\2\u0381\1\0"+
- "\1\u1ee1\57\0\2\u0381\2\0\1\u1ee2\56\0\2\u0381\3\0"+
- "\1\u1ee3\55\0\2\u0381\4\0\1\u1ee4\54\0\2\u0381\5\0"+
- "\1\u1ee5\53\0\2\u0381\6\0\1\u1ee6\52\0\2\u0381\7\0"+
- "\1\u1ee7\51\0\2\u0381\10\0\1\u1ee8\50\0\2\u0381\11\0"+
- "\1\u1ee9\47\0\2\u0381\12\0\1\u1eea\46\0\2\u0381\13\0"+
- "\1\u1eeb\45\0\2\u0381\14\0\1\u1eec\44\0\2\u0381\15\0"+
- "\1\u1eed\43\0\1\u0311\1\u0312\1\0\1\u1eee\57\0\1\u0311"+
- "\1\u0312\2\0\1\u1eef\56\0\1\u0311\1\u0312\3\0\1\u1ef0"+
- "\55\0\1\u0311\1\u0312\4\0\1\u1ef1\54\0\1\u0311\1\u0312"+
- "\5\0\1\u1ef2\53\0\1\u0311\1\u0312\6\0\1\u1ef3\52\0"+
- "\1\u0311\1\u0312\7\0\1\u1ef4\51\0\1\u0311\1\u0312\10\0"+
- "\1\u1ef5\50\0\1\u0311\1\u0312\11\0\1\u1ef6\47\0\1\u0311"+
- "\1\u0312\12\0\1\u1ef7\46\0\1\u0311\1\u0312\13\0\1\u1ef8"+
- "\45\0\1\u0311\1\u0312\14\0\1\u1ef9\44\0\1\u0311\1\u0312"+
- "\15\0\1\u1efa\43\0\2\u039d\1\0\1\u1efb\57\0\2\u039d"+
- "\2\0\1\u1efc\56\0\2\u039d\3\0\1\u1efd\55\0\2\u039d"+
- "\4\0\1\u1efe\54\0\2\u039d\5\0\1\u1eff\53\0\2\u039d"+
- "\6\0\1\u1f00\52\0\2\u039d\7\0\1\u1f01\51\0\2\u039d"+
- "\10\0\1\u1f02\50\0\2\u039d\11\0\1\u1f03\47\0\2\u039d"+
- "\12\0\1\u1f04\46\0\2\u039d\13\0\1\u1f05\45\0\2\u039d"+
- "\14\0\1\u1f06\44\0\2\u039d\15\0\1\u1f07\42\0\1\276"+
- "\1\u03ab\1\u03ac\1\276\1\u1f08\57\276\1\u03ab\1\u03ac\2\276"+
- "\1\u1f09\56\276\1\u03ab\1\u03ac\3\276\1\u1f0a\55\276\1\u03ab"+
- "\1\u03ac\4\276\1\u1f0b\54\276\1\u03ab\1\u03ac\5\276\1\u1f0c"+
- "\53\276\1\u03ab\1\u03ac\6\276\1\u1f0d\52\276\1\u03ab\1\u03ac"+
- "\7\276\1\u1f0e\51\276\1\u03ab\1\u03ac\10\276\1\u1f0f\50\276"+
- "\1\u03ab\1\u03ac\11\276\1\u1f10\47\276\1\u03ab\1\u03ac\12\276"+
- "\1\u1f11\46\276\1\u03ab\1\u03ac\13\276\1\u1f12\45\276\1\u03ab"+
- "\1\u03ac\14\276\1\u1f13\44\276\1\u03ab\1\u03ac\15\276\1\u1f14"+
- "\43\276\1\u033b\1\u033c\1\276\1\u1f15\57\276\1\u033b\1\u033c"+
- "\2\276\1\u1f16\56\276\1\u033b\1\u033c\3\276\1\u1f17\55\276"+
- "\1\u033b\1\u033c\4\276\1\u1f18\54\276\1\u033b\1\u033c\5\276"+
- "\1\u1f19\53\276\1\u033b\1\u033c\6\276\1\u1f1a\52\276\1\u033b"+
- "\1\u033c\7\276\1\u1f1b\51\276\1\u033b\1\u033c\10\276\1\u1f1c"+
- "\50\276\1\u033b\1\u033c\11\276\1\u1f1d\47\276\1\u033b\1\u033c"+
- "\12\276\1\u1f1e\46\276\1\u033b\1\u033c\13\276\1\u1f1f\45\276"+
- "\1\u033b\1\u033c\14\276\1\u1f20\44\276\1\u033b\1\u033c\15\276"+
- "\1\u1f21\43\276\1\300\1\u02bf\1\276\1\u1f22\57\276\1\300"+
- "\1\u02bf\2\276\1\u1f23\55\276\1\263\1\u03c9\1\u03ca\1\263"+
- "\1\u1f24\1\263\1\u0136\55\263\1\u03c9\1\u03ca\2\263\1\u1f25"+
- "\1\u0136\55\263\1\u03c9\1\u03ca\3\263\1\u0136\1\u1f26\54\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\1\263\1\u1f27\53\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\2\263\1\u1f28\52\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\3\263\1\u1f29\51\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\4\263\1\u1f2a\50\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\5\263\1\u1f2b\47\263\1\u03c9\1\u03ca\3\263\1\u0136\6\263"+
- "\1\u1f2c\46\263\1\u03c9\1\u03ca\3\263\1\u0136\7\263\1\u1f2d"+
- "\45\263\1\u03c9\1\u03ca\3\263\1\u0136\10\263\1\u1f2e\44\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\11\263\1\u1f2f\42\263\1\344"+
- "\1\u03d7\1\u03d8\1\344\1\u1f30\1\344\1\u017c\55\344\1\u03d7"+
- "\1\u03d8\2\344\1\u1f31\1\u017c\55\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\1\u1f32\54\344\1\u03d7\1\u03d8\3\344\1\u017c\1\344"+
- "\1\u1f33\53\344\1\u03d7\1\u03d8\3\344\1\u017c\2\344\1\u1f34"+
- "\52\344\1\u03d7\1\u03d8\3\344\1\u017c\3\344\1\u1f35\51\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\4\344\1\u1f36\50\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\5\344\1\u1f37\47\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\6\344\1\u1f38\46\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\7\344\1\u1f39\45\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\10\344\1\u1f3a\44\344\1\u03d7\1\u03d8\3\344\1\u017c\11\344"+
- "\1\u1f3b\42\344\1\276\1\300\1\u02bf\3\276\1\u1f3c\55\276"+
- "\1\300\1\u02bf\4\276\1\u1f3d\54\276\1\300\1\u02bf\5\276"+
- "\1\u1f3e\53\276\1\300\1\u02bf\6\276\1\u1f3f\52\276\1\300"+
- "\1\u02bf\7\276\1\u1f40\51\276\1\300\1\u02bf\10\276\1\u1f41"+
- "\50\276\1\300\1\u02bf\11\276\1\u1f42\47\276\1\300\1\u02bf"+
- "\12\276\1\u1f43\46\276\1\300\1\u02bf\13\276\1\u1f44\45\276"+
- "\1\300\1\u02bf\14\276\1\u1f45\44\276\1\300\1\u02bf\15\276"+
- "\1\u1f46\42\276\1\0\2\u0381\1\0\1\u1f47\57\0\2\u0381"+
- "\2\0\1\u1f48\56\0\2\u0381\3\0\1\u1f49\55\0\2\u0381"+
- "\4\0\1\u1f4a\54\0\2\u0381\5\0\1\u1f4b\53\0\2\u0381"+
- "\6\0\1\u1f4c\52\0\2\u0381\7\0\1\u1f4d\51\0\2\u0381"+
- "\10\0\1\u1f4e\50\0\2\u0381\11\0\1\u1f4f\47\0\2\u0381"+
- "\12\0\1\u1f50\46\0\2\u0381\13\0\1\u1f51\45\0\2\u0381"+
- "\14\0\1\u1f52\44\0\2\u0381\15\0\1\u1f53\43\0\1\u0311"+
- "\1\u0312\1\0\1\u1f54\57\0\1\u0311\1\u0312\2\0\1\u1f55"+
- "\56\0\1\u0311\1\u0312\3\0\1\u1f56\55\0\1\u0311\1\u0312"+
- "\4\0\1\u1f57\54\0\1\u0311\1\u0312\5\0\1\u1f58\53\0"+
- "\1\u0311\1\u0312\6\0\1\u1f59\52\0\1\u0311\1\u0312\7\0"+
- "\1\u1f5a\51\0\1\u0311\1\u0312\10\0\1\u1f5b\50\0\1\u0311"+
- "\1\u0312\11\0\1\u1f5c\47\0\1\u0311\1\u0312\12\0\1\u1f5d"+
- "\46\0\1\u0311\1\u0312\13\0\1\u1f5e\45\0\1\u0311\1\u0312"+
- "\14\0\1\u1f5f\44\0\1\u0311\1\u0312\15\0\1\u1f60\43\0"+
- "\2\u039d\1\0\1\u1f61\57\0\2\u039d\2\0\1\u1f62\56\0"+
- "\2\u039d\3\0\1\u1f63\55\0\2\u039d\4\0\1\u1f64\54\0"+
- "\2\u039d\5\0\1\u1f65\53\0\2\u039d\6\0\1\u1f66\52\0"+
- "\2\u039d\7\0\1\u1f67\51\0\2\u039d\10\0\1\u1f68\50\0"+
- "\2\u039d\11\0\1\u1f69\47\0\2\u039d\12\0\1\u1f6a\46\0"+
- "\2\u039d\13\0\1\u1f6b\45\0\2\u039d\14\0\1\u1f6c\44\0"+
- "\2\u039d\15\0\1\u1f6d\42\0\1\276\1\u03ab\1\u03ac\1\276"+
- "\1\u1f6e\57\276\1\u03ab\1\u03ac\2\276\1\u1f6f\56\276\1\u03ab"+
- "\1\u03ac\3\276\1\u1f70\55\276\1\u03ab\1\u03ac\4\276\1\u1f71"+
- "\54\276\1\u03ab\1\u03ac\5\276\1\u1f72\53\276\1\u03ab\1\u03ac"+
- "\6\276\1\u1f73\52\276\1\u03ab\1\u03ac\7\276\1\u1f74\51\276"+
- "\1\u03ab\1\u03ac\10\276\1\u1f75\50\276\1\u03ab\1\u03ac\11\276"+
- "\1\u1f76\47\276\1\u03ab\1\u03ac\12\276\1\u1f77\46\276\1\u03ab"+
- "\1\u03ac\13\276\1\u1f78\45\276\1\u03ab\1\u03ac\14\276\1\u1f79"+
- "\44\276\1\u03ab\1\u03ac\15\276\1\u1f7a\43\276\1\u033b\1\u033c"+
- "\1\276\1\u1f7b\57\276\1\u033b\1\u033c\2\276\1\u1f7c\56\276"+
- "\1\u033b\1\u033c\3\276\1\u1f7d\55\276\1\u033b\1\u033c\4\276"+
- "\1\u1f7e\54\276\1\u033b\1\u033c\5\276\1\u1f7f\53\276\1\u033b"+
- "\1\u033c\6\276\1\u1f80\52\276\1\u033b\1\u033c\7\276\1\u1f81"+
- "\51\276\1\u033b\1\u033c\10\276\1\u1f82\50\276\1\u033b\1\u033c"+
- "\11\276\1\u1f83\47\276\1\u033b\1\u033c\12\276\1\u1f84\46\276"+
- "\1\u033b\1\u033c\13\276\1\u1f85\45\276\1\u033b\1\u033c\14\276"+
- "\1\u1f86\44\276\1\u033b\1\u033c\15\276\1\u1f87\43\276\1\300"+
- "\1\u02bf\1\276\1\u1f88\57\276\1\300\1\u02bf\2\276\1\u1f89"+
- "\55\276\1\263\1\u03c9\1\u03ca\1\263\1\u1f8a\1\263\1\u0136"+
- "\55\263\1\u03c9\1\u03ca\2\263\1\u1f8b\1\u0136\55\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\1\u1f8c\54\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\1\263\1\u1f8d\53\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\2\263\1\u1f8e\52\263\1\u03c9\1\u03ca\3\263\1\u0136\3\263"+
- "\1\u1f8f\51\263\1\u03c9\1\u03ca\3\263\1\u0136\4\263\1\u1f90"+
- "\50\263\1\u03c9\1\u03ca\3\263\1\u0136\5\263\1\u1f91\47\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\6\263\1\u1f92\46\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\7\263\1\u1f93\45\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\10\263\1\u1f94\44\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\11\263\1\u1f95\42\263\1\344\1\u03d7\1\u03d8\1\344"+
- "\1\u1f96\1\344\1\u017c\55\344\1\u03d7\1\u03d8\2\344\1\u1f97"+
- "\1\u017c\55\344\1\u03d7\1\u03d8\3\344\1\u017c\1\u1f98\54\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\1\344\1\u1f99\53\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\2\344\1\u1f9a\52\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\3\344\1\u1f9b\51\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\4\344\1\u1f9c\50\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\5\344\1\u1f9d\47\344\1\u03d7\1\u03d8\3\344\1\u017c\6\344"+
- "\1\u1f9e\46\344\1\u03d7\1\u03d8\3\344\1\u017c\7\344\1\u1f9f"+
- "\45\344\1\u03d7\1\u03d8\3\344\1\u017c\10\344\1\u1fa0\44\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\11\344\1\u1fa1\42\344\1\276"+
- "\1\300\1\u02bf\3\276\1\u1fa2\55\276\1\300\1\u02bf\4\276"+
- "\1\u1fa3\54\276\1\300\1\u02bf\5\276\1\u1fa4\53\276\1\300"+
- "\1\u02bf\6\276\1\u1fa5\52\276\1\300\1\u02bf\7\276\1\u1fa6"+
- "\51\276\1\300\1\u02bf\10\276\1\u1fa7\50\276\1\300\1\u02bf"+
- "\11\276\1\u1fa8\47\276\1\300\1\u02bf\12\276\1\u1fa9\46\276"+
- "\1\300\1\u02bf\13\276\1\u1faa\45\276\1\300\1\u02bf\14\276"+
- "\1\u1fab\44\276\1\300\1\u02bf\15\276\1\u1fac\42\276\1\0"+
- "\2\u0381\1\0\1\u1fad\57\0\2\u0381\2\0\1\u1fae\56\0"+
- "\2\u0381\3\0\1\u1faf\55\0\2\u0381\4\0\1\u1fb0\54\0"+
- "\2\u0381\5\0\1\u1fb1\53\0\2\u0381\6\0\1\u1fb2\52\0"+
- "\2\u0381\7\0\1\u1fb3\51\0\2\u0381\10\0\1\u1fb4\50\0"+
- "\2\u0381\11\0\1\u1fb5\47\0\2\u0381\12\0\1\u1fb6\46\0"+
- "\2\u0381\13\0\1\u1fb7\45\0\2\u0381\14\0\1\u1fb8\44\0"+
- "\2\u0381\15\0\1\u1fb9\43\0\1\u0311\1\u0312\1\0\1\u1fba"+
- "\57\0\1\u0311\1\u0312\2\0\1\u1fbb\56\0\1\u0311\1\u0312"+
- "\3\0\1\u1fbc\55\0\1\u0311\1\u0312\4\0\1\u1fbd\54\0"+
- "\1\u0311\1\u0312\5\0\1\u1fbe\53\0\1\u0311\1\u0312\6\0"+
- "\1\u1fbf\52\0\1\u0311\1\u0312\7\0\1\u1fc0\51\0\1\u0311"+
- "\1\u0312\10\0\1\u1fc1\50\0\1\u0311\1\u0312\11\0\1\u1fc2"+
- "\47\0\1\u0311\1\u0312\12\0\1\u1fc3\46\0\1\u0311\1\u0312"+
- "\13\0\1\u1fc4\45\0\1\u0311\1\u0312\14\0\1\u1fc5\44\0"+
- "\1\u0311\1\u0312\15\0\1\u1fc6\43\0\2\u039d\1\0\1\u1fc7"+
- "\57\0\2\u039d\2\0\1\u1fc8\56\0\2\u039d\3\0\1\u1fc9"+
- "\55\0\2\u039d\4\0\1\u1fca\54\0\2\u039d\5\0\1\u1fcb"+
- "\53\0\2\u039d\6\0\1\u1fcc\52\0\2\u039d\7\0\1\u1fcd"+
- "\51\0\2\u039d\10\0\1\u1fce\50\0\2\u039d\11\0\1\u1fcf"+
- "\47\0\2\u039d\12\0\1\u1fd0\46\0\2\u039d\13\0\1\u1fd1"+
- "\45\0\2\u039d\14\0\1\u1fd2\44\0\2\u039d\15\0\1\u1fd3"+
- "\42\0\1\276\1\u03ab\1\u03ac\1\276\1\u1fd4\57\276\1\u03ab"+
- "\1\u03ac\2\276\1\u1fd5\56\276\1\u03ab\1\u03ac\3\276\1\u1fd6"+
- "\55\276\1\u03ab\1\u03ac\4\276\1\u1fd7\54\276\1\u03ab\1\u03ac"+
- "\5\276\1\u1fd8\53\276\1\u03ab\1\u03ac\6\276\1\u1fd9\52\276"+
- "\1\u03ab\1\u03ac\7\276\1\u1fda\51\276\1\u03ab\1\u03ac\10\276"+
- "\1\u1fdb\50\276\1\u03ab\1\u03ac\11\276\1\u1fdc\47\276\1\u03ab"+
- "\1\u03ac\12\276\1\u1fdd\46\276\1\u03ab\1\u03ac\13\276\1\u1fde"+
- "\45\276\1\u03ab\1\u03ac\14\276\1\u1fdf\44\276\1\u03ab\1\u03ac"+
- "\15\276\1\u1fe0\43\276\1\u033b\1\u033c\1\276\1\u1fe1\57\276"+
- "\1\u033b\1\u033c\2\276\1\u1fe2\56\276\1\u033b\1\u033c\3\276"+
- "\1\u1fe3\55\276\1\u033b\1\u033c\4\276\1\u1fe4\54\276\1\u033b"+
- "\1\u033c\5\276\1\u1fe5\53\276\1\u033b\1\u033c\6\276\1\u1fe6"+
- "\52\276\1\u033b\1\u033c\7\276\1\u1fe7\51\276\1\u033b\1\u033c"+
- "\10\276\1\u1fe8\50\276\1\u033b\1\u033c\11\276\1\u1fe9\47\276"+
- "\1\u033b\1\u033c\12\276\1\u1fea\46\276\1\u033b\1\u033c\13\276"+
- "\1\u1feb\45\276\1\u033b\1\u033c\14\276\1\u1fec\44\276\1\u033b"+
- "\1\u033c\15\276\1\u1fed\43\276\1\300\1\u02bf\1\276\1\u1fee"+
- "\57\276\1\300\1\u02bf\2\276\1\u1fef\55\276\1\263\1\u03c9"+
- "\1\u03ca\1\263\1\u1ff0\1\263\1\u0136\55\263\1\u03c9\1\u03ca"+
- "\2\263\1\u1ff1\1\u0136\55\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\1\u1ff2\54\263\1\u03c9\1\u03ca\3\263\1\u0136\1\263\1\u1ff3"+
- "\53\263\1\u03c9\1\u03ca\3\263\1\u0136\2\263\1\u1ff4\52\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\3\263\1\u1ff5\51\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\4\263\1\u1ff6\50\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\5\263\1\u1ff7\47\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\6\263\1\u1ff8\46\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\7\263\1\u1ff9\45\263\1\u03c9\1\u03ca\3\263\1\u0136\10\263"+
- "\1\u1ffa\44\263\1\u03c9\1\u03ca\3\263\1\u0136\11\263\1\u1ffb"+
- "\42\263\1\344\1\u03d7\1\u03d8\1\344\1\u1ffc\1\344\1\u017c"+
- "\55\344\1\u03d7\1\u03d8\2\344\1\u1ffd\1\u017c\55\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\1\u1ffe\54\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\1\344\1\u1fff\53\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\2\344\1\u2000\52\344\1\u03d7\1\u03d8\3\344\1\u017c\3\344"+
- "\1\u2001\51\344\1\u03d7\1\u03d8\3\344\1\u017c\4\344\1\u2002"+
- "\50\344\1\u03d7\1\u03d8\3\344\1\u017c\5\344\1\u2003\47\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\6\344\1\u2004\46\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\7\344\1\u2005\45\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\10\344\1\u2006\44\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\11\344\1\u2007\42\344\1\276\1\300\1\u02bf\3\276"+
- "\1\u2008\55\276\1\300\1\u02bf\4\276\1\u2009\54\276\1\300"+
- "\1\u02bf\5\276\1\u200a\53\276\1\300\1\u02bf\6\276\1\u200b"+
- "\52\276\1\300\1\u02bf\7\276\1\u200c\51\276\1\300\1\u02bf"+
- "\10\276\1\u200d\50\276\1\300\1\u02bf\11\276\1\u200e\47\276"+
- "\1\300\1\u02bf\12\276\1\u200f\46\276\1\300\1\u02bf\13\276"+
- "\1\u2010\45\276\1\300\1\u02bf\14\276\1\u2011\44\276\1\300"+
- "\1\u02bf\15\276\1\u2012\42\276\1\0\2\u0381\1\0\1\u2013"+
- "\57\0\2\u0381\2\0\1\u2014\56\0\2\u0381\3\0\1\u2015"+
- "\55\0\2\u0381\4\0\1\u2016\54\0\2\u0381\5\0\1\u2017"+
- "\53\0\2\u0381\6\0\1\u2018\52\0\2\u0381\7\0\1\u2019"+
- "\51\0\2\u0381\10\0\1\u201a\50\0\2\u0381\11\0\1\u201b"+
- "\47\0\2\u0381\12\0\1\u201c\46\0\2\u0381\13\0\1\u201d"+
- "\45\0\2\u0381\14\0\1\u201e\44\0\2\u0381\15\0\1\u201f"+
- "\43\0\1\u0311\1\u0312\1\0\1\u2020\57\0\1\u0311\1\u0312"+
- "\2\0\1\u2021\56\0\1\u0311\1\u0312\3\0\1\u2022\55\0"+
- "\1\u0311\1\u0312\4\0\1\u2023\54\0\1\u0311\1\u0312\5\0"+
- "\1\u2024\53\0\1\u0311\1\u0312\6\0\1\u2025\52\0\1\u0311"+
- "\1\u0312\7\0\1\u2026\51\0\1\u0311\1\u0312\10\0\1\u2027"+
- "\50\0\1\u0311\1\u0312\11\0\1\u2028\47\0\1\u0311\1\u0312"+
- "\12\0\1\u2029\46\0\1\u0311\1\u0312\13\0\1\u202a\45\0"+
- "\1\u0311\1\u0312\14\0\1\u202b\44\0\1\u0311\1\u0312\15\0"+
- "\1\u202c\43\0\2\u039d\1\0\1\u202d\57\0\2\u039d\2\0"+
- "\1\u202e\56\0\2\u039d\3\0\1\u202f\55\0\2\u039d\4\0"+
- "\1\u2030\54\0\2\u039d\5\0\1\u2031\53\0\2\u039d\6\0"+
- "\1\u2032\52\0\2\u039d\7\0\1\u2033\51\0\2\u039d\10\0"+
- "\1\u2034\50\0\2\u039d\11\0\1\u2035\47\0\2\u039d\12\0"+
- "\1\u2036\46\0\2\u039d\13\0\1\u2037\45\0\2\u039d\14\0"+
- "\1\u2038\44\0\2\u039d\15\0\1\u2039\42\0\1\276\1\u03ab"+
- "\1\u03ac\1\276\1\u203a\57\276\1\u03ab\1\u03ac\2\276\1\u203b"+
- "\56\276\1\u03ab\1\u03ac\3\276\1\u203c\55\276\1\u03ab\1\u03ac"+
- "\4\276\1\u203d\54\276\1\u03ab\1\u03ac\5\276\1\u203e\53\276"+
- "\1\u03ab\1\u03ac\6\276\1\u203f\52\276\1\u03ab\1\u03ac\7\276"+
- "\1\u2040\51\276\1\u03ab\1\u03ac\10\276\1\u2041\50\276\1\u03ab"+
- "\1\u03ac\11\276\1\u2042\47\276\1\u03ab\1\u03ac\12\276\1\u2043"+
- "\46\276\1\u03ab\1\u03ac\13\276\1\u2044\45\276\1\u03ab\1\u03ac"+
- "\14\276\1\u2045\44\276\1\u03ab\1\u03ac\15\276\1\u2046\43\276"+
- "\1\u033b\1\u033c\1\276\1\u2047\57\276\1\u033b\1\u033c\2\276"+
- "\1\u2048\56\276\1\u033b\1\u033c\3\276\1\u2049\55\276\1\u033b"+
- "\1\u033c\4\276\1\u204a\54\276\1\u033b\1\u033c\5\276\1\u204b"+
- "\53\276\1\u033b\1\u033c\6\276\1\u204c\52\276\1\u033b\1\u033c"+
- "\7\276\1\u204d\51\276\1\u033b\1\u033c\10\276\1\u204e\50\276"+
- "\1\u033b\1\u033c\11\276\1\u204f\47\276\1\u033b\1\u033c\12\276"+
- "\1\u2050\46\276\1\u033b\1\u033c\13\276\1\u2051\45\276\1\u033b"+
- "\1\u033c\14\276\1\u2052\44\276\1\u033b\1\u033c\15\276\1\u2053"+
- "\43\276\1\300\1\u02bf\1\276\1\u2054\57\276\1\300\1\u02bf"+
- "\2\276\1\u2055\55\276\1\263\1\u03c9\1\u03ca\1\263\1\u2056"+
- "\1\263\1\u0136\55\263\1\u03c9\1\u03ca\2\263\1\u2057\1\u0136"+
- "\55\263\1\u03c9\1\u03ca\3\263\1\u0136\1\u2058\54\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\1\263\1\u2059\53\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\2\263\1\u205a\52\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\3\263\1\u205b\51\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\4\263\1\u205c\50\263\1\u03c9\1\u03ca\3\263\1\u0136\5\263"+
- "\1\u205d\47\263\1\u03c9\1\u03ca\3\263\1\u0136\6\263\1\u205e"+
- "\46\263\1\u03c9\1\u03ca\3\263\1\u0136\7\263\1\u205f\45\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\10\263\1\u2060\44\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\11\263\1\u2061\42\263\1\344\1\u03d7"+
- "\1\u03d8\1\344\1\u2062\1\344\1\u017c\55\344\1\u03d7\1\u03d8"+
- "\2\344\1\u2063\1\u017c\55\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\1\u2064\54\344\1\u03d7\1\u03d8\3\344\1\u017c\1\344\1\u2065"+
- "\53\344\1\u03d7\1\u03d8\3\344\1\u017c\2\344\1\u2066\52\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\3\344\1\u2067\51\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\4\344\1\u2068\50\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\5\344\1\u2069\47\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\6\344\1\u206a\46\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\7\344\1\u206b\45\344\1\u03d7\1\u03d8\3\344\1\u017c\10\344"+
- "\1\u206c\44\344\1\u03d7\1\u03d8\3\344\1\u017c\11\344\1\u206d"+
- "\42\344\1\276\1\300\1\u02bf\3\276\1\u206e\55\276\1\300"+
- "\1\u02bf\4\276\1\u206f\54\276\1\300\1\u02bf\5\276\1\u2070"+
- "\53\276\1\300\1\u02bf\6\276\1\u2071\52\276\1\300\1\u02bf"+
- "\7\276\1\u2072\51\276\1\300\1\u02bf\10\276\1\u2073\50\276"+
- "\1\300\1\u02bf\11\276\1\u2074\47\276\1\300\1\u02bf\12\276"+
- "\1\u2075\46\276\1\300\1\u02bf\13\276\1\u2076\45\276\1\300"+
- "\1\u02bf\14\276\1\u2077\44\276\1\300\1\u02bf\15\276\1\u2078"+
- "\42\276\1\0\2\u0381\1\0\1\u2079\57\0\2\u0381\2\0"+
- "\1\u207a\56\0\2\u0381\3\0\1\u207b\55\0\2\u0381\4\0"+
- "\1\u207c\54\0\2\u0381\5\0\1\u207d\53\0\2\u0381\6\0"+
- "\1\u207e\52\0\2\u0381\7\0\1\u207f\51\0\2\u0381\10\0"+
- "\1\u2080\50\0\2\u0381\11\0\1\u2081\47\0\2\u0381\12\0"+
- "\1\u2082\46\0\2\u0381\13\0\1\u2083\45\0\2\u0381\14\0"+
- "\1\u2084\44\0\2\u0381\15\0\1\u2085\43\0\1\u0311\1\u0312"+
- "\1\0\1\u2086\57\0\1\u0311\1\u0312\2\0\1\u2087\56\0"+
- "\1\u0311\1\u0312\3\0\1\u2088\55\0\1\u0311\1\u0312\4\0"+
- "\1\u2089\54\0\1\u0311\1\u0312\5\0\1\u208a\53\0\1\u0311"+
- "\1\u0312\6\0\1\u208b\52\0\1\u0311\1\u0312\7\0\1\u208c"+
- "\51\0\1\u0311\1\u0312\10\0\1\u208d\50\0\1\u0311\1\u0312"+
- "\11\0\1\u208e\47\0\1\u0311\1\u0312\12\0\1\u208f\46\0"+
- "\1\u0311\1\u0312\13\0\1\u2090\45\0\1\u0311\1\u0312\14\0"+
- "\1\u2091\44\0\1\u0311\1\u0312\15\0\1\u2092\43\0\2\u039d"+
- "\1\0\1\u2093\57\0\2\u039d\2\0\1\u2094\56\0\2\u039d"+
- "\3\0\1\u2095\55\0\2\u039d\4\0\1\u2096\54\0\2\u039d"+
- "\5\0\1\u2097\53\0\2\u039d\6\0\1\u2098\52\0\2\u039d"+
- "\7\0\1\u2099\51\0\2\u039d\10\0\1\u209a\50\0\2\u039d"+
- "\11\0\1\u209b\47\0\2\u039d\12\0\1\u209c\46\0\2\u039d"+
- "\13\0\1\u209d\45\0\2\u039d\14\0\1\u209e\44\0\2\u039d"+
- "\15\0\1\u209f\42\0\1\276\1\u03ab\1\u03ac\1\276\1\u20a0"+
- "\57\276\1\u03ab\1\u03ac\2\276\1\u20a1\56\276\1\u03ab\1\u03ac"+
- "\3\276\1\u20a2\55\276\1\u03ab\1\u03ac\4\276\1\u20a3\54\276"+
- "\1\u03ab\1\u03ac\5\276\1\u20a4\53\276\1\u03ab\1\u03ac\6\276"+
- "\1\u20a5\52\276\1\u03ab\1\u03ac\7\276\1\u20a6\51\276\1\u03ab"+
- "\1\u03ac\10\276\1\u20a7\50\276\1\u03ab\1\u03ac\11\276\1\u20a8"+
- "\47\276\1\u03ab\1\u03ac\12\276\1\u20a9\46\276\1\u03ab\1\u03ac"+
- "\13\276\1\u20aa\45\276\1\u03ab\1\u03ac\14\276\1\u20ab\44\276"+
- "\1\u03ab\1\u03ac\15\276\1\u20ac\43\276\1\u033b\1\u033c\1\276"+
- "\1\u20ad\57\276\1\u033b\1\u033c\2\276\1\u20ae\56\276\1\u033b"+
- "\1\u033c\3\276\1\u20af\55\276\1\u033b\1\u033c\4\276\1\u20b0"+
- "\54\276\1\u033b\1\u033c\5\276\1\u20b1\53\276\1\u033b\1\u033c"+
- "\6\276\1\u20b2\52\276\1\u033b\1\u033c\7\276\1\u20b3\51\276"+
- "\1\u033b\1\u033c\10\276\1\u20b4\50\276\1\u033b\1\u033c\11\276"+
- "\1\u20b5\47\276\1\u033b\1\u033c\12\276\1\u20b6\46\276\1\u033b"+
- "\1\u033c\13\276\1\u20b7\45\276\1\u033b\1\u033c\14\276\1\u20b8"+
- "\44\276\1\u033b\1\u033c\15\276\1\u20b9\43\276\1\300\1\u02bf"+
- "\1\276\1\u20ba\57\276\1\300\1\u02bf\2\276\1\u20bb\55\276"+
- "\1\263\1\u03c9\1\u03ca\1\263\1\u20bc\1\263\1\u0136\55\263"+
- "\1\u03c9\1\u03ca\2\263\1\u20bd\1\u0136\55\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\1\u20be\54\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\1\263\1\u20bf\53\263\1\u03c9\1\u03ca\3\263\1\u0136\2\263"+
- "\1\u20c0\52\263\1\u03c9\1\u03ca\3\263\1\u0136\3\263\1\u20c1"+
- "\51\263\1\u03c9\1\u03ca\3\263\1\u0136\4\263\1\u20c2\50\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\5\263\1\u20c3\47\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\6\263\1\u20c4\46\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\7\263\1\u20c5\45\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\10\263\1\u20c6\44\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\11\263\1\u20c7\42\263\1\344\1\u03d7\1\u03d8\1\344\1\u20c8"+
- "\1\344\1\u017c\55\344\1\u03d7\1\u03d8\2\344\1\u20c9\1\u017c"+
- "\55\344\1\u03d7\1\u03d8\3\344\1\u017c\1\u20ca\54\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\1\344\1\u20cb\53\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\2\344\1\u20cc\52\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\3\344\1\u20cd\51\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\4\344\1\u20ce\50\344\1\u03d7\1\u03d8\3\344\1\u017c\5\344"+
- "\1\u20cf\47\344\1\u03d7\1\u03d8\3\344\1\u017c\6\344\1\u20d0"+
- "\46\344\1\u03d7\1\u03d8\3\344\1\u017c\7\344\1\u20d1\45\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\10\344\1\u20d2\44\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\11\344\1\u20d3\42\344\1\276\1\300"+
- "\1\u02bf\3\276\1\u20d4\55\276\1\300\1\u02bf\4\276\1\u20d5"+
- "\54\276\1\300\1\u02bf\5\276\1\u20d6\53\276\1\300\1\u02bf"+
- "\6\276\1\u20d7\52\276\1\300\1\u02bf\7\276\1\u20d8\51\276"+
- "\1\300\1\u02bf\10\276\1\u20d9\50\276\1\300\1\u02bf\11\276"+
- "\1\u20da\47\276\1\300\1\u02bf\12\276\1\u20db\46\276\1\300"+
- "\1\u02bf\13\276\1\u20dc\45\276\1\300\1\u02bf\14\276\1\u20dd"+
- "\44\276\1\300\1\u02bf\15\276\1\u20de\42\276\1\0\2\u0381"+
- "\1\0\1\u20df\57\0\2\u0381\2\0\1\u20e0\56\0\2\u0381"+
- "\3\0\1\u20e1\55\0\2\u0381\4\0\1\u20e2\54\0\2\u0381"+
- "\5\0\1\u20e3\53\0\2\u0381\6\0\1\u20e4\52\0\2\u0381"+
- "\7\0\1\u20e5\51\0\2\u0381\10\0\1\u20e6\50\0\2\u0381"+
- "\11\0\1\u20e7\47\0\2\u0381\12\0\1\u20e8\46\0\2\u0381"+
- "\13\0\1\u20e9\45\0\2\u0381\14\0\1\u20ea\44\0\2\u0381"+
- "\15\0\1\u20eb\43\0\1\u0311\1\u0312\1\0\1\u20ec\57\0"+
- "\1\u0311\1\u0312\2\0\1\u20ed\56\0\1\u0311\1\u0312\3\0"+
- "\1\u20ee\55\0\1\u0311\1\u0312\4\0\1\u20ef\54\0\1\u0311"+
- "\1\u0312\5\0\1\u20f0\53\0\1\u0311\1\u0312\6\0\1\u20f1"+
- "\52\0\1\u0311\1\u0312\7\0\1\u20f2\51\0\1\u0311\1\u0312"+
- "\10\0\1\u20f3\50\0\1\u0311\1\u0312\11\0\1\u20f4\47\0"+
- "\1\u0311\1\u0312\12\0\1\u20f5\46\0\1\u0311\1\u0312\13\0"+
- "\1\u20f6\45\0\1\u0311\1\u0312\14\0\1\u20f7\44\0\1\u0311"+
- "\1\u0312\15\0\1\u20f8\43\0\2\u039d\1\0\1\u20f9\57\0"+
- "\2\u039d\2\0\1\u20fa\56\0\2\u039d\3\0\1\u20fb\55\0"+
- "\2\u039d\4\0\1\u20fc\54\0\2\u039d\5\0\1\u20fd\53\0"+
- "\2\u039d\6\0\1\u20fe\52\0\2\u039d\7\0\1\u20ff\51\0"+
- "\2\u039d\10\0\1\u2100\50\0\2\u039d\11\0\1\u2101\47\0"+
- "\2\u039d\12\0\1\u2102\46\0\2\u039d\13\0\1\u2103\45\0"+
- "\2\u039d\14\0\1\u2104\44\0\2\u039d\15\0\1\u2105\42\0"+
- "\1\276\1\u03ab\1\u03ac\1\276\1\u2106\57\276\1\u03ab\1\u03ac"+
- "\2\276\1\u2107\56\276\1\u03ab\1\u03ac\3\276\1\u2108\55\276"+
- "\1\u03ab\1\u03ac\4\276\1\u2109\54\276\1\u03ab\1\u03ac\5\276"+
- "\1\u210a\53\276\1\u03ab\1\u03ac\6\276\1\u210b\52\276\1\u03ab"+
- "\1\u03ac\7\276\1\u210c\51\276\1\u03ab\1\u03ac\10\276\1\u210d"+
- "\50\276\1\u03ab\1\u03ac\11\276\1\u210e\47\276\1\u03ab\1\u03ac"+
- "\12\276\1\u210f\46\276\1\u03ab\1\u03ac\13\276\1\u2110\45\276"+
- "\1\u03ab\1\u03ac\14\276\1\u2111\44\276\1\u03ab\1\u03ac\15\276"+
- "\1\u2112\43\276\1\u033b\1\u033c\1\276\1\u2113\57\276\1\u033b"+
- "\1\u033c\2\276\1\u2114\56\276\1\u033b\1\u033c\3\276\1\u2115"+
- "\55\276\1\u033b\1\u033c\4\276\1\u2116\54\276\1\u033b\1\u033c"+
- "\5\276\1\u2117\53\276\1\u033b\1\u033c\6\276\1\u2118\52\276"+
- "\1\u033b\1\u033c\7\276\1\u2119\51\276\1\u033b\1\u033c\10\276"+
- "\1\u211a\50\276\1\u033b\1\u033c\11\276\1\u211b\47\276\1\u033b"+
- "\1\u033c\12\276\1\u211c\46\276\1\u033b\1\u033c\13\276\1\u211d"+
- "\45\276\1\u033b\1\u033c\14\276\1\u211e\44\276\1\u033b\1\u033c"+
- "\15\276\1\u211f\43\276\1\300\1\u02bf\1\276\1\u2120\57\276"+
- "\1\300\1\u02bf\2\276\1\u2120\55\276\1\263\1\u03c9\1\u03ca"+
- "\1\263\1\u2121\1\263\1\u0136\55\263\1\u03c9\1\u03ca\2\263"+
- "\1\u2122\1\u0136\55\263\1\u03c9\1\u03ca\3\263\1\u0136\1\u2123"+
- "\54\263\1\u03c9\1\u03ca\3\263\1\u0136\1\263\1\u2124\53\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\2\263\1\u2125\52\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\3\263\1\u2126\51\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\4\263\1\u2127\50\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\5\263\1\u2128\47\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\6\263\1\u2129\46\263\1\u03c9\1\u03ca\3\263\1\u0136\7\263"+
- "\1\u212a\45\263\1\u03c9\1\u03ca\3\263\1\u0136\10\263\1\u212b"+
- "\44\263\1\u03c9\1\u03ca\3\263\1\u0136\11\263\1\u212c\42\263"+
- "\1\344\1\u03d7\1\u03d8\1\344\1\u212d\1\344\1\u017c\55\344"+
- "\1\u03d7\1\u03d8\2\344\1\u212e\1\u017c\55\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\1\u212f\54\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\1\344\1\u2130\53\344\1\u03d7\1\u03d8\3\344\1\u017c\2\344"+
- "\1\u2131\52\344\1\u03d7\1\u03d8\3\344\1\u017c\3\344\1\u2132"+
- "\51\344\1\u03d7\1\u03d8\3\344\1\u017c\4\344\1\u2133\50\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\5\344\1\u2134\47\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\6\344\1\u2135\46\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\7\344\1\u2136\45\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\10\344\1\u2137\44\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\11\344\1\u2138\42\344\1\276\1\300\1\u02bf\3\276\1\u2120"+
- "\55\276\1\300\1\u02bf\4\276\1\u2120\54\276\1\300\1\u02bf"+
- "\5\276\1\u2120\53\276\1\300\1\u02bf\6\276\1\u2120\52\276"+
- "\1\300\1\u02bf\7\276\1\u2120\51\276\1\300\1\u02bf\10\276"+
- "\1\u2120\50\276\1\300\1\u02bf\11\276\1\u2120\47\276\1\300"+
- "\1\u02bf\12\276\1\u2120\46\276\1\300\1\u02bf\13\276\1\u2120"+
- "\45\276\1\300\1\u02bf\14\276\1\u2120\44\276\1\300\1\u02bf"+
- "\15\276\1\u2120\42\276\1\0\2\u0381\1\0\1\u2139\57\0"+
- "\2\u0381\2\0\1\u213a\56\0\2\u0381\3\0\1\u213b\55\0"+
- "\2\u0381\4\0\1\u213c\54\0\2\u0381\5\0\1\u213d\53\0"+
- "\2\u0381\6\0\1\u213e\52\0\2\u0381\7\0\1\u213f\51\0"+
- "\2\u0381\10\0\1\u2140\50\0\2\u0381\11\0\1\u2141\47\0"+
- "\2\u0381\12\0\1\u2142\46\0\2\u0381\13\0\1\u2143\45\0"+
- "\2\u0381\14\0\1\u2144\44\0\2\u0381\15\0\1\u2145\43\0"+
- "\1\u0311\1\u0312\1\0\1\u2146\57\0\1\u0311\1\u0312\2\0"+
- "\1\u2146\56\0\1\u0311\1\u0312\3\0\1\u2146\55\0\1\u0311"+
- "\1\u0312\4\0\1\u2146\54\0\1\u0311\1\u0312\5\0\1\u2146"+
- "\53\0\1\u0311\1\u0312\6\0\1\u2146\52\0\1\u0311\1\u0312"+
- "\7\0\1\u2146\51\0\1\u0311\1\u0312\10\0\1\u2146\50\0"+
- "\1\u0311\1\u0312\11\0\1\u2146\47\0\1\u0311\1\u0312\12\0"+
- "\1\u2146\46\0\1\u0311\1\u0312\13\0\1\u2146\45\0\1\u0311"+
- "\1\u0312\14\0\1\u2146\44\0\1\u0311\1\u0312\15\0\1\u2146"+
- "\43\0\2\u039d\1\0\1\u2147\57\0\2\u039d\2\0\1\u2148"+
- "\56\0\2\u039d\3\0\1\u2149\55\0\2\u039d\4\0\1\u214a"+
- "\54\0\2\u039d\5\0\1\u214b\53\0\2\u039d\6\0\1\u214c"+
- "\52\0\2\u039d\7\0\1\u214d\51\0\2\u039d\10\0\1\u214e"+
- "\50\0\2\u039d\11\0\1\u214f\47\0\2\u039d\12\0\1\u2150"+
- "\46\0\2\u039d\13\0\1\u2151\45\0\2\u039d\14\0\1\u2152"+
- "\44\0\2\u039d\15\0\1\u2153\42\0\1\276\1\u03ab\1\u03ac"+
- "\1\276\1\u2154\57\276\1\u03ab\1\u03ac\2\276\1\u2155\56\276"+
- "\1\u03ab\1\u03ac\3\276\1\u2156\55\276\1\u03ab\1\u03ac\4\276"+
- "\1\u2157\54\276\1\u03ab\1\u03ac\5\276\1\u2158\53\276\1\u03ab"+
- "\1\u03ac\6\276\1\u2159\52\276\1\u03ab\1\u03ac\7\276\1\u215a"+
- "\51\276\1\u03ab\1\u03ac\10\276\1\u215b\50\276\1\u03ab\1\u03ac"+
- "\11\276\1\u215c\47\276\1\u03ab\1\u03ac\12\276\1\u215d\46\276"+
- "\1\u03ab\1\u03ac\13\276\1\u215e\45\276\1\u03ab\1\u03ac\14\276"+
- "\1\u215f\44\276\1\u03ab\1\u03ac\15\276\1\u2160\43\276\1\u033b"+
- "\1\u033c\1\276\1\u2161\57\276\1\u033b\1\u033c\2\276\1\u2161"+
- "\56\276\1\u033b\1\u033c\3\276\1\u2161\55\276\1\u033b\1\u033c"+
- "\4\276\1\u2161\54\276\1\u033b\1\u033c\5\276\1\u2161\53\276"+
- "\1\u033b\1\u033c\6\276\1\u2161\52\276\1\u033b\1\u033c\7\276"+
- "\1\u2161\51\276\1\u033b\1\u033c\10\276\1\u2161\50\276\1\u033b"+
- "\1\u033c\11\276\1\u2161\47\276\1\u033b\1\u033c\12\276\1\u2161"+
- "\46\276\1\u033b\1\u033c\13\276\1\u2161\45\276\1\u033b\1\u033c"+
- "\14\276\1\u2161\44\276\1\u033b\1\u033c\15\276\1\u2161\43\276"+
- "\1\300\1\u02bf\60\276\1\263\1\u03c9\1\u03ca\1\263\1\u2162"+
- "\1\263\1\u0136\55\263\1\u03c9\1\u03ca\2\263\1\u2163\1\u0136"+
- "\55\263\1\u03c9\1\u03ca\3\263\1\u0136\1\u2164\54\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\1\263\1\u2165\53\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\2\263\1\u2166\52\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\3\263\1\u2167\51\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\4\263\1\u2168\50\263\1\u03c9\1\u03ca\3\263\1\u0136\5\263"+
- "\1\u2169\47\263\1\u03c9\1\u03ca\3\263\1\u0136\6\263\1\u216a"+
- "\46\263\1\u03c9\1\u03ca\3\263\1\u0136\7\263\1\u216b\45\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\10\263\1\u216c\44\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\11\263\1\u216d\42\263\1\344\1\u03d7"+
- "\1\u03d8\1\344\1\u216e\1\344\1\u017c\55\344\1\u03d7\1\u03d8"+
- "\2\344\1\u216f\1\u017c\55\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\1\u2170\54\344\1\u03d7\1\u03d8\3\344\1\u017c\1\344\1\u2171"+
- "\53\344\1\u03d7\1\u03d8\3\344\1\u017c\2\344\1\u2172\52\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\3\344\1\u2173\51\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\4\344\1\u2174\50\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\5\344\1\u2175\47\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\6\344\1\u2176\46\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\7\344\1\u2177\45\344\1\u03d7\1\u03d8\3\344\1\u017c\10\344"+
- "\1\u2178\44\344\1\u03d7\1\u03d8\3\344\1\u017c\11\344\1\u2179"+
- "\42\344\1\0\2\u0381\1\0\1\u217a\57\0\2\u0381\2\0"+
- "\1\u217a\56\0\2\u0381\3\0\1\u217a\55\0\2\u0381\4\0"+
- "\1\u217a\54\0\2\u0381\5\0\1\u217a\53\0\2\u0381\6\0"+
- "\1\u217a\52\0\2\u0381\7\0\1\u217a\51\0\2\u0381\10\0"+
- "\1\u217a\50\0\2\u0381\11\0\1\u217a\47\0\2\u0381\12\0"+
- "\1\u217a\46\0\2\u0381\13\0\1\u217a\45\0\2\u0381\14\0"+
- "\1\u217a\44\0\2\u0381\15\0\1\u217a\43\0\1\u0311\1\u0312"+
- "\61\0\2\u039d\1\0\1\u0381\57\0\2\u039d\2\0\1\u0381"+
- "\56\0\2\u039d\3\0\1\u0381\55\0\2\u039d\4\0\1\u0381"+
- "\54\0\2\u039d\5\0\1\u0381\53\0\2\u039d\6\0\1\u0381"+
- "\52\0\2\u039d\7\0\1\u0381\51\0\2\u039d\10\0\1\u0381"+
- "\50\0\2\u039d\11\0\1\u0381\47\0\2\u039d\12\0\1\u0381"+
- "\46\0\2\u039d\13\0\1\u0381\45\0\2\u039d\14\0\1\u0381"+
- "\44\0\2\u039d\15\0\1\u0381\42\0\1\276\1\u03ab\1\u03ac"+
- "\1\276\1\u217b\57\276\1\u03ab\1\u03ac\2\276\1\u217b\56\276"+
- "\1\u03ab\1\u03ac\3\276\1\u217b\55\276\1\u03ab\1\u03ac\4\276"+
- "\1\u217b\54\276\1\u03ab\1\u03ac\5\276\1\u217b\53\276\1\u03ab"+
- "\1\u03ac\6\276\1\u217b\52\276\1\u03ab\1\u03ac\7\276\1\u217b"+
- "\51\276\1\u03ab\1\u03ac\10\276\1\u217b\50\276\1\u03ab\1\u03ac"+
- "\11\276\1\u217b\47\276\1\u03ab\1\u03ac\12\276\1\u217b\46\276"+
- "\1\u03ab\1\u03ac\13\276\1\u217b\45\276\1\u03ab\1\u03ac\14\276"+
- "\1\u217b\44\276\1\u03ab\1\u03ac\15\276\1\u217b\43\276\1\u033b"+
- "\1\u033c\60\276\1\263\1\u03c9\1\u03ca\1\263\1\u217c\1\263"+
- "\1\u0136\55\263\1\u03c9\1\u03ca\2\263\1\u217c\1\u0136\55\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\1\u217c\54\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\1\263\1\u217c\53\263\1\u03c9\1\u03ca\3\263"+
- "\1\u0136\2\263\1\u217c\52\263\1\u03c9\1\u03ca\3\263\1\u0136"+
- "\3\263\1\u217c\51\263\1\u03c9\1\u03ca\3\263\1\u0136\4\263"+
- "\1\u217c\50\263\1\u03c9\1\u03ca\3\263\1\u0136\5\263\1\u217c"+
- "\47\263\1\u03c9\1\u03ca\3\263\1\u0136\6\263\1\u217c\46\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\7\263\1\u217c\45\263\1\u03c9"+
- "\1\u03ca\3\263\1\u0136\10\263\1\u217c\44\263\1\u03c9\1\u03ca"+
- "\3\263\1\u0136\11\263\1\u217c\42\263\1\344\1\u03d7\1\u03d8"+
- "\1\344\1\u217d\1\344\1\u017c\55\344\1\u03d7\1\u03d8\2\344"+
- "\1\u217d\1\u017c\55\344\1\u03d7\1\u03d8\3\344\1\u017c\1\u217d"+
- "\54\344\1\u03d7\1\u03d8\3\344\1\u017c\1\344\1\u217d\53\344"+
- "\1\u03d7\1\u03d8\3\344\1\u017c\2\344\1\u217d\52\344\1\u03d7"+
- "\1\u03d8\3\344\1\u017c\3\344\1\u217d\51\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\4\344\1\u217d\50\344\1\u03d7\1\u03d8\3\344"+
- "\1\u017c\5\344\1\u217d\47\344\1\u03d7\1\u03d8\3\344\1\u017c"+
- "\6\344\1\u217d\46\344\1\u03d7\1\u03d8\3\344\1\u017c\7\344"+
- "\1\u217d\45\344\1\u03d7\1\u03d8\3\344\1\u017c\10\344\1\u217d"+
- "\44\344\1\u03d7\1\u03d8\3\344\1\u017c\11\344\1\u217d\42\344"+
- "\1\0\2\u0381\60\0\1\276\1\u03ab\1\u03ac\60\276\1\263"+
- "\1\u03c9\1\u03ca\3\263\1\u0136\54\263\1\344\1\u03d7\1\u03d8"+
- "\3\344\1\u017c\54\344";
+ "\1\u03a3\40\0\1\276\1\u03b0\1\u03b1\1\276\1\u1718\15\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\2\276\1\u1719\14\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\3\276\1\u171a\13\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\4\276\1\u171b\12\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\5\276\1\u171c\11\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\6\276\1\u171d\10\276\1\u03b3\41\276\1\u03b0\1\u03b1\7\276"+
+ "\1\u171e\7\276\1\u03b3\41\276\1\u03b0\1\u03b1\10\276\1\u171f"+
+ "\6\276\1\u03b3\41\276\1\u03b0\1\u03b1\11\276\1\u1720\5\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\12\276\1\u1721\4\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\13\276\1\u1722\3\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\14\276\1\u1723\2\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\15\276\1\u1724\1\276\1\u03b3\41\276\1\u033d\1\u033e"+
+ "\1\276\1\u1725\15\276\1\u0340\41\276\1\u033d\1\u033e\2\276"+
+ "\1\u1726\14\276\1\u0340\41\276\1\u033d\1\u033e\3\276\1\u1727"+
+ "\13\276\1\u0340\41\276\1\u033d\1\u033e\4\276\1\u1728\12\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\5\276\1\u1729\11\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\6\276\1\u172a\10\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\7\276\1\u172b\7\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\10\276\1\u172c\6\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\11\276\1\u172d\5\276\1\u0340\41\276\1\u033d\1\u033e\12\276"+
+ "\1\u172e\4\276\1\u0340\41\276\1\u033d\1\u033e\13\276\1\u172f"+
+ "\3\276\1\u0340\41\276\1\u033d\1\u033e\14\276\1\u1730\2\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\15\276\1\u1731\1\276\1\u0340"+
+ "\41\276\1\300\1\u02bf\1\276\1\u1732\15\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\2\276\1\u1733\14\276\1\u02c1\40\276\1\263"+
+ "\1\u03cf\1\u03d0\1\263\1\u1734\1\263\1\u0136\13\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\2\263\1\u1735\1\u0136\13\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\u1736\12\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\263\1\u1737\11\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\2\263\1\u1738"+
+ "\10\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\3\263"+
+ "\1\u1739\7\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\4\263\1\u173a\6\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\5\263\1\u173b\5\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\6\263\1\u173c\4\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\7\263\1\u173d\3\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\10\263\1\u173e\2\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\11\263\1\u173f\1\263"+
+ "\1\u03d2\40\263\1\344\1\u03de\1\u03df\1\344\1\u1740\1\344"+
+ "\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df\2\344\1\u1741"+
+ "\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\1\u1742\12\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\1\344\1\u1743\11\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\2\344\1\u1744\10\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\3\344\1\u1745\7\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\4\344\1\u1746\6\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\5\344\1\u1747\5\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\6\344\1\u1748\4\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\7\344\1\u1749"+
+ "\3\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\10\344"+
+ "\1\u174a\2\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\11\344\1\u174b\1\344\1\u03e1\40\344\1\276\1\300\1\u02bf"+
+ "\3\276\1\u174c\13\276\1\u02c1\41\276\1\300\1\u02bf\4\276"+
+ "\1\u174d\12\276\1\u02c1\41\276\1\300\1\u02bf\5\276\1\u174e"+
+ "\11\276\1\u02c1\41\276\1\300\1\u02bf\6\276\1\u174f\10\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\7\276\1\u1750\7\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\10\276\1\u1751\6\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\11\276\1\u1752\5\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\12\276\1\u1753\4\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\13\276\1\u1754\3\276\1\u02c1\41\276\1\300\1\u02bf\14\276"+
+ "\1\u1755\2\276\1\u02c1\41\276\1\300\1\u02bf\15\276\1\u1756"+
+ "\1\276\1\u02c1\40\276\1\0\2\u0384\1\0\1\u1757\15\0"+
+ "\1\u0386\41\0\2\u0384\2\0\1\u1758\14\0\1\u0386\41\0"+
+ "\2\u0384\3\0\1\u1759\13\0\1\u0386\41\0\2\u0384\4\0"+
+ "\1\u175a\12\0\1\u0386\41\0\2\u0384\5\0\1\u175b\11\0"+
+ "\1\u0386\41\0\2\u0384\6\0\1\u175c\10\0\1\u0386\41\0"+
+ "\2\u0384\7\0\1\u175d\7\0\1\u0386\41\0\2\u0384\10\0"+
+ "\1\u175e\6\0\1\u0386\41\0\2\u0384\11\0\1\u175f\5\0"+
+ "\1\u0386\41\0\2\u0384\12\0\1\u1760\4\0\1\u0386\41\0"+
+ "\2\u0384\13\0\1\u1761\3\0\1\u0386\41\0\2\u0384\14\0"+
+ "\1\u1762\2\0\1\u0386\41\0\2\u0384\15\0\1\u1763\1\0"+
+ "\1\u0386\41\0\1\u0312\1\u0313\1\0\1\u1764\15\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\2\0\1\u1765\14\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\3\0\1\u1766\13\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\4\0\1\u1767\12\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\5\0\1\u1768\11\0\1\u0315\41\0\1\u0312\1\u0313\6\0"+
+ "\1\u1769\10\0\1\u0315\41\0\1\u0312\1\u0313\7\0\1\u176a"+
+ "\7\0\1\u0315\41\0\1\u0312\1\u0313\10\0\1\u176b\6\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\11\0\1\u176c\5\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\12\0\1\u176d\4\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\13\0\1\u176e\3\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\14\0\1\u176f\2\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\15\0\1\u1770\1\0\1\u0315\41\0\2\u03a1\1\0\1\u1771"+
+ "\15\0\1\u03a3\41\0\2\u03a1\2\0\1\u1772\14\0\1\u03a3"+
+ "\41\0\2\u03a1\3\0\1\u1773\13\0\1\u03a3\41\0\2\u03a1"+
+ "\4\0\1\u1774\12\0\1\u03a3\41\0\2\u03a1\5\0\1\u1775"+
+ "\11\0\1\u03a3\41\0\2\u03a1\6\0\1\u1776\10\0\1\u03a3"+
+ "\41\0\2\u03a1\7\0\1\u1777\7\0\1\u03a3\41\0\2\u03a1"+
+ "\10\0\1\u1778\6\0\1\u03a3\41\0\2\u03a1\11\0\1\u1779"+
+ "\5\0\1\u03a3\41\0\2\u03a1\12\0\1\u177a\4\0\1\u03a3"+
+ "\41\0\2\u03a1\13\0\1\u177b\3\0\1\u03a3\41\0\2\u03a1"+
+ "\14\0\1\u177c\2\0\1\u03a3\41\0\2\u03a1\15\0\1\u177d"+
+ "\1\0\1\u03a3\40\0\1\276\1\u03b0\1\u03b1\1\276\1\u177e"+
+ "\15\276\1\u03b3\41\276\1\u03b0\1\u03b1\2\276\1\u177f\14\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\3\276\1\u1780\13\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\4\276\1\u1781\12\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\5\276\1\u1782\11\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\6\276\1\u1783\10\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\7\276\1\u1784\7\276\1\u03b3\41\276\1\u03b0\1\u03b1\10\276"+
+ "\1\u1785\6\276\1\u03b3\41\276\1\u03b0\1\u03b1\11\276\1\u1786"+
+ "\5\276\1\u03b3\41\276\1\u03b0\1\u03b1\12\276\1\u1787\4\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\13\276\1\u1788\3\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\14\276\1\u1789\2\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\15\276\1\u178a\1\276\1\u03b3\41\276\1\u033d"+
+ "\1\u033e\1\276\1\u178b\15\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\2\276\1\u178c\14\276\1\u0340\41\276\1\u033d\1\u033e\3\276"+
+ "\1\u178d\13\276\1\u0340\41\276\1\u033d\1\u033e\4\276\1\u178e"+
+ "\12\276\1\u0340\41\276\1\u033d\1\u033e\5\276\1\u178f\11\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\6\276\1\u1790\10\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\7\276\1\u1791\7\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\10\276\1\u1792\6\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\11\276\1\u1793\5\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\12\276\1\u1794\4\276\1\u0340\41\276\1\u033d\1\u033e\13\276"+
+ "\1\u1795\3\276\1\u0340\41\276\1\u033d\1\u033e\14\276\1\u1796"+
+ "\2\276\1\u0340\41\276\1\u033d\1\u033e\15\276\1\u1797\1\276"+
+ "\1\u0340\41\276\1\300\1\u02bf\1\276\1\u1798\15\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\2\276\1\u1799\14\276\1\u02c1\40\276"+
+ "\1\263\1\u03cf\1\u03d0\1\263\1\u179a\1\263\1\u0136\13\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\2\263\1\u179b\1\u0136\13\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\u179c\12\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\263\1\u179d"+
+ "\11\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\2\263"+
+ "\1\u179e\10\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\3\263\1\u179f\7\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\4\263\1\u17a0\6\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\5\263\1\u17a1\5\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\6\263\1\u17a2\4\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\7\263\1\u17a3\3\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\10\263\1\u17a4\2\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\11\263\1\u17a5"+
+ "\1\263\1\u03d2\40\263\1\344\1\u03de\1\u03df\1\344\1\u17a6"+
+ "\1\344\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df\2\344"+
+ "\1\u17a7\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\1\u17a8\12\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\1\344\1\u17a9\11\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\2\344\1\u17aa\10\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\3\344\1\u17ab\7\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\4\344\1\u17ac\6\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\5\344\1\u17ad\5\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\6\344\1\u17ae"+
+ "\4\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\7\344"+
+ "\1\u17af\3\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\10\344\1\u17b0\2\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\11\344\1\u17b1\1\344\1\u03e1\40\344\1\276\1\300"+
+ "\1\u02bf\3\276\1\u17b2\13\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\4\276\1\u17b3\12\276\1\u02c1\41\276\1\300\1\u02bf\5\276"+
+ "\1\u17b4\11\276\1\u02c1\41\276\1\300\1\u02bf\6\276\1\u17b5"+
+ "\10\276\1\u02c1\41\276\1\300\1\u02bf\7\276\1\u17b6\7\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\10\276\1\u17b7\6\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\11\276\1\u17b8\5\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\12\276\1\u17b9\4\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\13\276\1\u17ba\3\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\14\276\1\u17bb\2\276\1\u02c1\41\276\1\300\1\u02bf\15\276"+
+ "\1\u17bc\1\276\1\u02c1\40\276\1\0\2\u0384\1\0\1\u17bd"+
+ "\15\0\1\u0386\41\0\2\u0384\2\0\1\u17be\14\0\1\u0386"+
+ "\41\0\2\u0384\3\0\1\u17bf\13\0\1\u0386\41\0\2\u0384"+
+ "\4\0\1\u17c0\12\0\1\u0386\41\0\2\u0384\5\0\1\u17c1"+
+ "\11\0\1\u0386\41\0\2\u0384\6\0\1\u17c2\10\0\1\u0386"+
+ "\41\0\2\u0384\7\0\1\u17c3\7\0\1\u0386\41\0\2\u0384"+
+ "\10\0\1\u17c4\6\0\1\u0386\41\0\2\u0384\11\0\1\u17c5"+
+ "\5\0\1\u0386\41\0\2\u0384\12\0\1\u17c6\4\0\1\u0386"+
+ "\41\0\2\u0384\13\0\1\u17c7\3\0\1\u0386\41\0\2\u0384"+
+ "\14\0\1\u17c8\2\0\1\u0386\41\0\2\u0384\15\0\1\u17c9"+
+ "\1\0\1\u0386\41\0\1\u0312\1\u0313\1\0\1\u17ca\15\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\2\0\1\u17cb\14\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\3\0\1\u17cc\13\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\4\0\1\u17cd\12\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\5\0\1\u17ce\11\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\6\0\1\u17cf\10\0\1\u0315\41\0\1\u0312\1\u0313\7\0"+
+ "\1\u17d0\7\0\1\u0315\41\0\1\u0312\1\u0313\10\0\1\u17d1"+
+ "\6\0\1\u0315\41\0\1\u0312\1\u0313\11\0\1\u17d2\5\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\12\0\1\u17d3\4\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\13\0\1\u17d4\3\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\14\0\1\u17d5\2\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\15\0\1\u17d6\1\0\1\u0315\41\0\2\u03a1\1\0"+
+ "\1\u17d7\15\0\1\u03a3\41\0\2\u03a1\2\0\1\u17d8\14\0"+
+ "\1\u03a3\41\0\2\u03a1\3\0\1\u17d9\13\0\1\u03a3\41\0"+
+ "\2\u03a1\4\0\1\u17da\12\0\1\u03a3\41\0\2\u03a1\5\0"+
+ "\1\u17db\11\0\1\u03a3\41\0\2\u03a1\6\0\1\u17dc\10\0"+
+ "\1\u03a3\41\0\2\u03a1\7\0\1\u17dd\7\0\1\u03a3\41\0"+
+ "\2\u03a1\10\0\1\u17de\6\0\1\u03a3\41\0\2\u03a1\11\0"+
+ "\1\u17df\5\0\1\u03a3\41\0\2\u03a1\12\0\1\u17e0\4\0"+
+ "\1\u03a3\41\0\2\u03a1\13\0\1\u17e1\3\0\1\u03a3\41\0"+
+ "\2\u03a1\14\0\1\u17e2\2\0\1\u03a3\41\0\2\u03a1\15\0"+
+ "\1\u17e3\1\0\1\u03a3\40\0\1\276\1\u03b0\1\u03b1\1\276"+
+ "\1\u17e4\15\276\1\u03b3\41\276\1\u03b0\1\u03b1\2\276\1\u17e5"+
+ "\14\276\1\u03b3\41\276\1\u03b0\1\u03b1\3\276\1\u17e6\13\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\4\276\1\u17e7\12\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\5\276\1\u17e8\11\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\6\276\1\u17e9\10\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\7\276\1\u17ea\7\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\10\276\1\u17eb\6\276\1\u03b3\41\276\1\u03b0\1\u03b1\11\276"+
+ "\1\u17ec\5\276\1\u03b3\41\276\1\u03b0\1\u03b1\12\276\1\u17ed"+
+ "\4\276\1\u03b3\41\276\1\u03b0\1\u03b1\13\276\1\u17ee\3\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\14\276\1\u17ef\2\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\15\276\1\u17f0\1\276\1\u03b3\41\276"+
+ "\1\u033d\1\u033e\1\276\1\u17f1\15\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\2\276\1\u17f2\14\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\3\276\1\u17f3\13\276\1\u0340\41\276\1\u033d\1\u033e\4\276"+
+ "\1\u17f4\12\276\1\u0340\41\276\1\u033d\1\u033e\5\276\1\u17f5"+
+ "\11\276\1\u0340\41\276\1\u033d\1\u033e\6\276\1\u17f6\10\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\7\276\1\u17f7\7\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\10\276\1\u17f8\6\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\11\276\1\u17f9\5\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\12\276\1\u17fa\4\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\13\276\1\u17fb\3\276\1\u0340\41\276\1\u033d\1\u033e\14\276"+
+ "\1\u17fc\2\276\1\u0340\41\276\1\u033d\1\u033e\15\276\1\u17fd"+
+ "\1\276\1\u0340\41\276\1\300\1\u02bf\1\276\1\u17fe\15\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\2\276\1\u17ff\14\276\1\u02c1"+
+ "\40\276\1\263\1\u03cf\1\u03d0\1\263\1\u1800\1\263\1\u0136"+
+ "\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\2\263\1\u1801\1\u0136"+
+ "\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\u1802"+
+ "\12\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\263"+
+ "\1\u1803\11\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\2\263\1\u1804\10\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\3\263\1\u1805\7\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\4\263\1\u1806\6\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\5\263\1\u1807\5\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\6\263\1\u1808\4\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\7\263\1\u1809\3\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\10\263\1\u180a"+
+ "\2\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\11\263"+
+ "\1\u180b\1\263\1\u03d2\40\263\1\344\1\u03de\1\u03df\1\344"+
+ "\1\u180c\1\344\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\2\344\1\u180d\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\1\u180e\12\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\1\344\1\u180f\11\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\2\344\1\u1810\10\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\3\344\1\u1811\7\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\4\344\1\u1812\6\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\5\344\1\u1813"+
+ "\5\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\6\344"+
+ "\1\u1814\4\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\7\344\1\u1815\3\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\10\344\1\u1816\2\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\11\344\1\u1817\1\344\1\u03e1\40\344\1\276"+
+ "\1\300\1\u02bf\3\276\1\u1818\13\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\4\276\1\u1819\12\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\5\276\1\u181a\11\276\1\u02c1\41\276\1\300\1\u02bf\6\276"+
+ "\1\u181b\10\276\1\u02c1\41\276\1\300\1\u02bf\7\276\1\u181c"+
+ "\7\276\1\u02c1\41\276\1\300\1\u02bf\10\276\1\u181d\6\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\11\276\1\u181e\5\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\12\276\1\u181f\4\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\13\276\1\u1820\3\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\14\276\1\u1821\2\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\15\276\1\u1822\1\276\1\u02c1\40\276\1\0\2\u0384\1\0"+
+ "\1\u1823\15\0\1\u0386\41\0\2\u0384\2\0\1\u1824\14\0"+
+ "\1\u0386\41\0\2\u0384\3\0\1\u1825\13\0\1\u0386\41\0"+
+ "\2\u0384\4\0\1\u1826\12\0\1\u0386\41\0\2\u0384\5\0"+
+ "\1\u1827\11\0\1\u0386\41\0\2\u0384\6\0\1\u1828\10\0"+
+ "\1\u0386\41\0\2\u0384\7\0\1\u1829\7\0\1\u0386\41\0"+
+ "\2\u0384\10\0\1\u182a\6\0\1\u0386\41\0\2\u0384\11\0"+
+ "\1\u182b\5\0\1\u0386\41\0\2\u0384\12\0\1\u182c\4\0"+
+ "\1\u0386\41\0\2\u0384\13\0\1\u182d\3\0\1\u0386\41\0"+
+ "\2\u0384\14\0\1\u182e\2\0\1\u0386\41\0\2\u0384\15\0"+
+ "\1\u182f\1\0\1\u0386\41\0\1\u0312\1\u0313\1\0\1\u1830"+
+ "\15\0\1\u0315\41\0\1\u0312\1\u0313\2\0\1\u1831\14\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\3\0\1\u1832\13\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\4\0\1\u1833\12\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\5\0\1\u1834\11\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\6\0\1\u1835\10\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\7\0\1\u1836\7\0\1\u0315\41\0\1\u0312\1\u0313\10\0"+
+ "\1\u1837\6\0\1\u0315\41\0\1\u0312\1\u0313\11\0\1\u1838"+
+ "\5\0\1\u0315\41\0\1\u0312\1\u0313\12\0\1\u1839\4\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\13\0\1\u183a\3\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\14\0\1\u183b\2\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\15\0\1\u183c\1\0\1\u0315\41\0\2\u03a1"+
+ "\1\0\1\u183d\15\0\1\u03a3\41\0\2\u03a1\2\0\1\u183e"+
+ "\14\0\1\u03a3\41\0\2\u03a1\3\0\1\u183f\13\0\1\u03a3"+
+ "\41\0\2\u03a1\4\0\1\u1840\12\0\1\u03a3\41\0\2\u03a1"+
+ "\5\0\1\u1841\11\0\1\u03a3\41\0\2\u03a1\6\0\1\u1842"+
+ "\10\0\1\u03a3\41\0\2\u03a1\7\0\1\u1843\7\0\1\u03a3"+
+ "\41\0\2\u03a1\10\0\1\u1844\6\0\1\u03a3\41\0\2\u03a1"+
+ "\11\0\1\u1845\5\0\1\u03a3\41\0\2\u03a1\12\0\1\u1846"+
+ "\4\0\1\u03a3\41\0\2\u03a1\13\0\1\u1847\3\0\1\u03a3"+
+ "\41\0\2\u03a1\14\0\1\u1848\2\0\1\u03a3\41\0\2\u03a1"+
+ "\15\0\1\u1849\1\0\1\u03a3\40\0\1\276\1\u03b0\1\u03b1"+
+ "\1\276\1\u184a\15\276\1\u03b3\41\276\1\u03b0\1\u03b1\2\276"+
+ "\1\u184b\14\276\1\u03b3\41\276\1\u03b0\1\u03b1\3\276\1\u184c"+
+ "\13\276\1\u03b3\41\276\1\u03b0\1\u03b1\4\276\1\u184d\12\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\5\276\1\u184e\11\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\6\276\1\u184f\10\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\7\276\1\u1850\7\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\10\276\1\u1851\6\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\11\276\1\u1852\5\276\1\u03b3\41\276\1\u03b0\1\u03b1\12\276"+
+ "\1\u1853\4\276\1\u03b3\41\276\1\u03b0\1\u03b1\13\276\1\u1854"+
+ "\3\276\1\u03b3\41\276\1\u03b0\1\u03b1\14\276\1\u1855\2\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\15\276\1\u1856\1\276\1\u03b3"+
+ "\41\276\1\u033d\1\u033e\1\276\1\u1857\15\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\2\276\1\u1858\14\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\3\276\1\u1859\13\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\4\276\1\u185a\12\276\1\u0340\41\276\1\u033d\1\u033e\5\276"+
+ "\1\u185b\11\276\1\u0340\41\276\1\u033d\1\u033e\6\276\1\u185c"+
+ "\10\276\1\u0340\41\276\1\u033d\1\u033e\7\276\1\u185d\7\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\10\276\1\u185e\6\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\11\276\1\u185f\5\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\12\276\1\u1860\4\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\13\276\1\u1861\3\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\14\276\1\u1862\2\276\1\u0340\41\276\1\u033d\1\u033e\15\276"+
+ "\1\u1863\1\276\1\u0340\41\276\1\300\1\u02bf\1\276\1\u1864"+
+ "\15\276\1\u02c1\41\276\1\300\1\u02bf\2\276\1\u1865\14\276"+
+ "\1\u02c1\40\276\1\263\1\u03cf\1\u03d0\1\263\1\u1866\1\263"+
+ "\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\2\263\1\u1867"+
+ "\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\1\u1868\12\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\1\263\1\u1869\11\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\2\263\1\u186a\10\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\3\263\1\u186b\7\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\4\263\1\u186c\6\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\5\263\1\u186d\5\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\6\263\1\u186e\4\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\7\263\1\u186f"+
+ "\3\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\10\263"+
+ "\1\u1870\2\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\11\263\1\u1871\1\263\1\u03d2\40\263\1\344\1\u03de\1\u03df"+
+ "\1\344\1\u1872\1\344\1\u017c\13\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\2\344\1\u1873\1\u017c\13\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\1\u1874\12\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\1\344\1\u1875\11\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\2\344\1\u1876\10\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\3\344\1\u1877\7\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\4\344\1\u1878"+
+ "\6\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\5\344"+
+ "\1\u1879\5\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\6\344\1\u187a\4\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\7\344\1\u187b\3\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\10\344\1\u187c\2\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\11\344\1\u187d\1\344\1\u03e1\40\344"+
+ "\1\276\1\300\1\u02bf\3\276\1\u187e\13\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\4\276\1\u187f\12\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\5\276\1\u1880\11\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\6\276\1\u1881\10\276\1\u02c1\41\276\1\300\1\u02bf\7\276"+
+ "\1\u1882\7\276\1\u02c1\41\276\1\300\1\u02bf\10\276\1\u1883"+
+ "\6\276\1\u02c1\41\276\1\300\1\u02bf\11\276\1\u1884\5\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\12\276\1\u1885\4\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\13\276\1\u1886\3\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\14\276\1\u1887\2\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\15\276\1\u1888\1\276\1\u02c1\40\276\1\0\2\u0384"+
+ "\1\0\1\u1889\15\0\1\u0386\41\0\2\u0384\2\0\1\u188a"+
+ "\14\0\1\u0386\41\0\2\u0384\3\0\1\u188b\13\0\1\u0386"+
+ "\41\0\2\u0384\4\0\1\u188c\12\0\1\u0386\41\0\2\u0384"+
+ "\5\0\1\u188d\11\0\1\u0386\41\0\2\u0384\6\0\1\u188e"+
+ "\10\0\1\u0386\41\0\2\u0384\7\0\1\u188f\7\0\1\u0386"+
+ "\41\0\2\u0384\10\0\1\u1890\6\0\1\u0386\41\0\2\u0384"+
+ "\11\0\1\u1891\5\0\1\u0386\41\0\2\u0384\12\0\1\u1892"+
+ "\4\0\1\u0386\41\0\2\u0384\13\0\1\u1893\3\0\1\u0386"+
+ "\41\0\2\u0384\14\0\1\u1894\2\0\1\u0386\41\0\2\u0384"+
+ "\15\0\1\u1895\1\0\1\u0386\41\0\1\u0312\1\u0313\1\0"+
+ "\1\u1896\15\0\1\u0315\41\0\1\u0312\1\u0313\2\0\1\u1897"+
+ "\14\0\1\u0315\41\0\1\u0312\1\u0313\3\0\1\u1898\13\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\4\0\1\u1899\12\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\5\0\1\u189a\11\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\6\0\1\u189b\10\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\7\0\1\u189c\7\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\10\0\1\u189d\6\0\1\u0315\41\0\1\u0312\1\u0313\11\0"+
+ "\1\u189e\5\0\1\u0315\41\0\1\u0312\1\u0313\12\0\1\u189f"+
+ "\4\0\1\u0315\41\0\1\u0312\1\u0313\13\0\1\u18a0\3\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\14\0\1\u18a1\2\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\15\0\1\u18a2\1\0\1\u0315\41\0"+
+ "\2\u03a1\1\0\1\u18a3\15\0\1\u03a3\41\0\2\u03a1\2\0"+
+ "\1\u18a4\14\0\1\u03a3\41\0\2\u03a1\3\0\1\u18a5\13\0"+
+ "\1\u03a3\41\0\2\u03a1\4\0\1\u18a6\12\0\1\u03a3\41\0"+
+ "\2\u03a1\5\0\1\u18a7\11\0\1\u03a3\41\0\2\u03a1\6\0"+
+ "\1\u18a8\10\0\1\u03a3\41\0\2\u03a1\7\0\1\u18a9\7\0"+
+ "\1\u03a3\41\0\2\u03a1\10\0\1\u18aa\6\0\1\u03a3\41\0"+
+ "\2\u03a1\11\0\1\u18ab\5\0\1\u03a3\41\0\2\u03a1\12\0"+
+ "\1\u18ac\4\0\1\u03a3\41\0\2\u03a1\13\0\1\u18ad\3\0"+
+ "\1\u03a3\41\0\2\u03a1\14\0\1\u18ae\2\0\1\u03a3\41\0"+
+ "\2\u03a1\15\0\1\u18af\1\0\1\u03a3\40\0\1\276\1\u03b0"+
+ "\1\u03b1\1\276\1\u18b0\15\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\2\276\1\u18b1\14\276\1\u03b3\41\276\1\u03b0\1\u03b1\3\276"+
+ "\1\u18b2\13\276\1\u03b3\41\276\1\u03b0\1\u03b1\4\276\1\u18b3"+
+ "\12\276\1\u03b3\41\276\1\u03b0\1\u03b1\5\276\1\u18b4\11\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\6\276\1\u18b5\10\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\7\276\1\u18b6\7\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\10\276\1\u18b7\6\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\11\276\1\u18b8\5\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\12\276\1\u18b9\4\276\1\u03b3\41\276\1\u03b0\1\u03b1\13\276"+
+ "\1\u18ba\3\276\1\u03b3\41\276\1\u03b0\1\u03b1\14\276\1\u18bb"+
+ "\2\276\1\u03b3\41\276\1\u03b0\1\u03b1\15\276\1\u18bc\1\276"+
+ "\1\u03b3\41\276\1\u033d\1\u033e\1\276\1\u18bd\15\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\2\276\1\u18be\14\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\3\276\1\u18bf\13\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\4\276\1\u18c0\12\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\5\276\1\u18c1\11\276\1\u0340\41\276\1\u033d\1\u033e\6\276"+
+ "\1\u18c2\10\276\1\u0340\41\276\1\u033d\1\u033e\7\276\1\u18c3"+
+ "\7\276\1\u0340\41\276\1\u033d\1\u033e\10\276\1\u18c4\6\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\11\276\1\u18c5\5\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\12\276\1\u18c6\4\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\13\276\1\u18c7\3\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\14\276\1\u18c8\2\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\15\276\1\u18c9\1\276\1\u0340\41\276\1\300\1\u02bf\1\276"+
+ "\1\u18ca\15\276\1\u02c1\41\276\1\300\1\u02bf\2\276\1\u18cb"+
+ "\14\276\1\u02c1\40\276\1\263\1\u03cf\1\u03d0\1\263\1\u18cc"+
+ "\1\263\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\2\263"+
+ "\1\u18cd\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\1\u18ce\12\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\1\263\1\u18cf\11\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\2\263\1\u18d0\10\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\3\263\1\u18d1\7\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\4\263\1\u18d2\6\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\5\263\1\u18d3\5\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\6\263\1\u18d4"+
+ "\4\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\7\263"+
+ "\1\u18d5\3\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\10\263\1\u18d6\2\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\11\263\1\u18d7\1\263\1\u03d2\40\263\1\344\1\u03de"+
+ "\1\u03df\1\344\1\u18d8\1\344\1\u017c\13\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\2\344\1\u18d9\1\u017c\13\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\1\u18da\12\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\1\344\1\u18db\11\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\2\344\1\u18dc\10\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\3\344\1\u18dd"+
+ "\7\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\4\344"+
+ "\1\u18de\6\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\5\344\1\u18df\5\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\6\344\1\u18e0\4\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\7\344\1\u18e1\3\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\10\344\1\u18e2\2\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\11\344\1\u18e3\1\344\1\u03e1"+
+ "\40\344\1\276\1\300\1\u02bf\3\276\1\u18e4\13\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\4\276\1\u18e5\12\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\5\276\1\u18e6\11\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\6\276\1\u18e7\10\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\7\276\1\u18e8\7\276\1\u02c1\41\276\1\300\1\u02bf\10\276"+
+ "\1\u18e9\6\276\1\u02c1\41\276\1\300\1\u02bf\11\276\1\u18ea"+
+ "\5\276\1\u02c1\41\276\1\300\1\u02bf\12\276\1\u18eb\4\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\13\276\1\u18ec\3\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\14\276\1\u18ed\2\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\15\276\1\u18ee\1\276\1\u02c1\40\276\1\0"+
+ "\2\u0384\1\0\1\u18ef\15\0\1\u0386\41\0\2\u0384\2\0"+
+ "\1\u18f0\14\0\1\u0386\41\0\2\u0384\3\0\1\u18f1\13\0"+
+ "\1\u0386\41\0\2\u0384\4\0\1\u18f2\12\0\1\u0386\41\0"+
+ "\2\u0384\5\0\1\u18f3\11\0\1\u0386\41\0\2\u0384\6\0"+
+ "\1\u18f4\10\0\1\u0386\41\0\2\u0384\7\0\1\u18f5\7\0"+
+ "\1\u0386\41\0\2\u0384\10\0\1\u18f6\6\0\1\u0386\41\0"+
+ "\2\u0384\11\0\1\u18f7\5\0\1\u0386\41\0\2\u0384\12\0"+
+ "\1\u18f8\4\0\1\u0386\41\0\2\u0384\13\0\1\u18f9\3\0"+
+ "\1\u0386\41\0\2\u0384\14\0\1\u18fa\2\0\1\u0386\41\0"+
+ "\2\u0384\15\0\1\u18fb\1\0\1\u0386\41\0\1\u0312\1\u0313"+
+ "\1\0\1\u18fc\15\0\1\u0315\41\0\1\u0312\1\u0313\2\0"+
+ "\1\u18fd\14\0\1\u0315\41\0\1\u0312\1\u0313\3\0\1\u18fe"+
+ "\13\0\1\u0315\41\0\1\u0312\1\u0313\4\0\1\u18ff\12\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\5\0\1\u1900\11\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\6\0\1\u1901\10\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\7\0\1\u1902\7\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\10\0\1\u1903\6\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\11\0\1\u1904\5\0\1\u0315\41\0\1\u0312\1\u0313\12\0"+
+ "\1\u1905\4\0\1\u0315\41\0\1\u0312\1\u0313\13\0\1\u1906"+
+ "\3\0\1\u0315\41\0\1\u0312\1\u0313\14\0\1\u1907\2\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\15\0\1\u1908\1\0\1\u0315"+
+ "\41\0\2\u03a1\1\0\1\u1909\15\0\1\u03a3\41\0\2\u03a1"+
+ "\2\0\1\u190a\14\0\1\u03a3\41\0\2\u03a1\3\0\1\u190b"+
+ "\13\0\1\u03a3\41\0\2\u03a1\4\0\1\u190c\12\0\1\u03a3"+
+ "\41\0\2\u03a1\5\0\1\u190d\11\0\1\u03a3\41\0\2\u03a1"+
+ "\6\0\1\u190e\10\0\1\u03a3\41\0\2\u03a1\7\0\1\u190f"+
+ "\7\0\1\u03a3\41\0\2\u03a1\10\0\1\u1910\6\0\1\u03a3"+
+ "\41\0\2\u03a1\11\0\1\u1911\5\0\1\u03a3\41\0\2\u03a1"+
+ "\12\0\1\u1912\4\0\1\u03a3\41\0\2\u03a1\13\0\1\u1913"+
+ "\3\0\1\u03a3\41\0\2\u03a1\14\0\1\u1914\2\0\1\u03a3"+
+ "\41\0\2\u03a1\15\0\1\u1915\1\0\1\u03a3\40\0\1\276"+
+ "\1\u03b0\1\u03b1\1\276\1\u1916\15\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\2\276\1\u1917\14\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\3\276\1\u1918\13\276\1\u03b3\41\276\1\u03b0\1\u03b1\4\276"+
+ "\1\u1919\12\276\1\u03b3\41\276\1\u03b0\1\u03b1\5\276\1\u191a"+
+ "\11\276\1\u03b3\41\276\1\u03b0\1\u03b1\6\276\1\u191b\10\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\7\276\1\u191c\7\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\10\276\1\u191d\6\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\11\276\1\u191e\5\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\12\276\1\u191f\4\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\13\276\1\u1920\3\276\1\u03b3\41\276\1\u03b0\1\u03b1\14\276"+
+ "\1\u1921\2\276\1\u03b3\41\276\1\u03b0\1\u03b1\15\276\1\u1922"+
+ "\1\276\1\u03b3\41\276\1\u033d\1\u033e\1\276\1\u1923\15\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\2\276\1\u1924\14\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\3\276\1\u1925\13\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\4\276\1\u1926\12\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\5\276\1\u1927\11\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\6\276\1\u1928\10\276\1\u0340\41\276\1\u033d\1\u033e\7\276"+
+ "\1\u1929\7\276\1\u0340\41\276\1\u033d\1\u033e\10\276\1\u192a"+
+ "\6\276\1\u0340\41\276\1\u033d\1\u033e\11\276\1\u192b\5\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\12\276\1\u192c\4\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\13\276\1\u192d\3\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\14\276\1\u192e\2\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\15\276\1\u192f\1\276\1\u0340\41\276\1\300\1\u02bf"+
+ "\1\276\1\u1930\15\276\1\u02c1\41\276\1\300\1\u02bf\2\276"+
+ "\1\u1931\14\276\1\u02c1\40\276\1\263\1\u03cf\1\u03d0\1\263"+
+ "\1\u1932\1\263\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\2\263\1\u1933\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\1\u1934\12\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\1\263\1\u1935\11\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\2\263\1\u1936\10\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\3\263\1\u1937\7\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\4\263\1\u1938\6\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\5\263\1\u1939"+
+ "\5\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\6\263"+
+ "\1\u193a\4\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\7\263\1\u193b\3\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\10\263\1\u193c\2\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\11\263\1\u193d\1\263\1\u03d2\40\263\1\344"+
+ "\1\u03de\1\u03df\1\344\1\u193e\1\344\1\u017c\13\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\2\344\1\u193f\1\u017c\13\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\1\u1940\12\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\1\344\1\u1941\11\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\2\344\1\u1942"+
+ "\10\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\3\344"+
+ "\1\u1943\7\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\4\344\1\u1944\6\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\5\344\1\u1945\5\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\6\344\1\u1946\4\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\7\344\1\u1947\3\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\10\344\1\u1948\2\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\11\344\1\u1949\1\344"+
+ "\1\u03e1\40\344\1\276\1\300\1\u02bf\3\276\1\u194a\13\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\4\276\1\u194b\12\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\5\276\1\u194c\11\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\6\276\1\u194d\10\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\7\276\1\u194e\7\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\10\276\1\u194f\6\276\1\u02c1\41\276\1\300\1\u02bf\11\276"+
+ "\1\u1950\5\276\1\u02c1\41\276\1\300\1\u02bf\12\276\1\u1951"+
+ "\4\276\1\u02c1\41\276\1\300\1\u02bf\13\276\1\u1952\3\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\14\276\1\u1953\2\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\15\276\1\u1954\1\276\1\u02c1\40\276"+
+ "\1\0\2\u0384\1\0\1\u1955\15\0\1\u0386\41\0\2\u0384"+
+ "\2\0\1\u1956\14\0\1\u0386\41\0\2\u0384\3\0\1\u1957"+
+ "\13\0\1\u0386\41\0\2\u0384\4\0\1\u1958\12\0\1\u0386"+
+ "\41\0\2\u0384\5\0\1\u1959\11\0\1\u0386\41\0\2\u0384"+
+ "\6\0\1\u195a\10\0\1\u0386\41\0\2\u0384\7\0\1\u195b"+
+ "\7\0\1\u0386\41\0\2\u0384\10\0\1\u195c\6\0\1\u0386"+
+ "\41\0\2\u0384\11\0\1\u195d\5\0\1\u0386\41\0\2\u0384"+
+ "\12\0\1\u195e\4\0\1\u0386\41\0\2\u0384\13\0\1\u195f"+
+ "\3\0\1\u0386\41\0\2\u0384\14\0\1\u1960\2\0\1\u0386"+
+ "\41\0\2\u0384\15\0\1\u1961\1\0\1\u0386\41\0\1\u0312"+
+ "\1\u0313\1\0\1\u1962\15\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\2\0\1\u1963\14\0\1\u0315\41\0\1\u0312\1\u0313\3\0"+
+ "\1\u1964\13\0\1\u0315\41\0\1\u0312\1\u0313\4\0\1\u1965"+
+ "\12\0\1\u0315\41\0\1\u0312\1\u0313\5\0\1\u1966\11\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\6\0\1\u1967\10\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\7\0\1\u1968\7\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\10\0\1\u1969\6\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\11\0\1\u196a\5\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\12\0\1\u196b\4\0\1\u0315\41\0\1\u0312\1\u0313\13\0"+
+ "\1\u196c\3\0\1\u0315\41\0\1\u0312\1\u0313\14\0\1\u196d"+
+ "\2\0\1\u0315\41\0\1\u0312\1\u0313\15\0\1\u196e\1\0"+
+ "\1\u0315\41\0\2\u03a1\1\0\1\u196f\15\0\1\u03a3\41\0"+
+ "\2\u03a1\2\0\1\u1970\14\0\1\u03a3\41\0\2\u03a1\3\0"+
+ "\1\u1971\13\0\1\u03a3\41\0\2\u03a1\4\0\1\u1972\12\0"+
+ "\1\u03a3\41\0\2\u03a1\5\0\1\u1973\11\0\1\u03a3\41\0"+
+ "\2\u03a1\6\0\1\u1974\10\0\1\u03a3\41\0\2\u03a1\7\0"+
+ "\1\u1975\7\0\1\u03a3\41\0\2\u03a1\10\0\1\u1976\6\0"+
+ "\1\u03a3\41\0\2\u03a1\11\0\1\u1977\5\0\1\u03a3\41\0"+
+ "\2\u03a1\12\0\1\u1978\4\0\1\u03a3\41\0\2\u03a1\13\0"+
+ "\1\u1979\3\0\1\u03a3\41\0\2\u03a1\14\0\1\u197a\2\0"+
+ "\1\u03a3\41\0\2\u03a1\15\0\1\u197b\1\0\1\u03a3\40\0"+
+ "\1\276\1\u03b0\1\u03b1\1\276\1\u197c\15\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\2\276\1\u197d\14\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\3\276\1\u197e\13\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\4\276\1\u197f\12\276\1\u03b3\41\276\1\u03b0\1\u03b1\5\276"+
+ "\1\u1980\11\276\1\u03b3\41\276\1\u03b0\1\u03b1\6\276\1\u1981"+
+ "\10\276\1\u03b3\41\276\1\u03b0\1\u03b1\7\276\1\u1982\7\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\10\276\1\u1983\6\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\11\276\1\u1984\5\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\12\276\1\u1985\4\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\13\276\1\u1986\3\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\14\276\1\u1987\2\276\1\u03b3\41\276\1\u03b0\1\u03b1\15\276"+
+ "\1\u1988\1\276\1\u03b3\41\276\1\u033d\1\u033e\1\276\1\u1989"+
+ "\15\276\1\u0340\41\276\1\u033d\1\u033e\2\276\1\u198a\14\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\3\276\1\u198b\13\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\4\276\1\u198c\12\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\5\276\1\u198d\11\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\6\276\1\u198e\10\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\7\276\1\u198f\7\276\1\u0340\41\276\1\u033d\1\u033e\10\276"+
+ "\1\u1990\6\276\1\u0340\41\276\1\u033d\1\u033e\11\276\1\u1991"+
+ "\5\276\1\u0340\41\276\1\u033d\1\u033e\12\276\1\u1992\4\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\13\276\1\u1993\3\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\14\276\1\u1994\2\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\15\276\1\u1995\1\276\1\u0340\41\276\1\300"+
+ "\1\u02bf\1\276\1\u1996\15\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\2\276\1\u1997\14\276\1\u02c1\40\276\1\263\1\u03cf\1\u03d0"+
+ "\1\263\1\u1998\1\263\1\u0136\13\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\2\263\1\u1999\1\u0136\13\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\1\u199a\12\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\1\263\1\u199b\11\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\2\263\1\u199c\10\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\3\263\1\u199d\7\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\4\263\1\u199e"+
+ "\6\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\5\263"+
+ "\1\u199f\5\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\6\263\1\u19a0\4\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\7\263\1\u19a1\3\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\10\263\1\u19a2\2\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\11\263\1\u19a3\1\263\1\u03d2\40\263"+
+ "\1\344\1\u03de\1\u03df\1\344\1\u19a4\1\344\1\u017c\13\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\2\344\1\u19a5\1\u017c\13\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\1\u19a6\12\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\1\344\1\u19a7"+
+ "\11\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\2\344"+
+ "\1\u19a8\10\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\3\344\1\u19a9\7\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\4\344\1\u19aa\6\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\5\344\1\u19ab\5\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\6\344\1\u19ac\4\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\7\344\1\u19ad\3\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\10\344\1\u19ae\2\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\11\344\1\u19af"+
+ "\1\344\1\u03e1\40\344\1\276\1\300\1\u02bf\3\276\1\u19b0"+
+ "\13\276\1\u02c1\41\276\1\300\1\u02bf\4\276\1\u19b1\12\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\5\276\1\u19b2\11\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\6\276\1\u19b3\10\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\7\276\1\u19b4\7\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\10\276\1\u19b5\6\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\11\276\1\u19b6\5\276\1\u02c1\41\276\1\300\1\u02bf\12\276"+
+ "\1\u19b7\4\276\1\u02c1\41\276\1\300\1\u02bf\13\276\1\u19b8"+
+ "\3\276\1\u02c1\41\276\1\300\1\u02bf\14\276\1\u19b9\2\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\15\276\1\u19ba\1\276\1\u02c1"+
+ "\40\276\1\0\2\u0384\1\0\1\u19bb\15\0\1\u0386\41\0"+
+ "\2\u0384\2\0\1\u19bc\14\0\1\u0386\41\0\2\u0384\3\0"+
+ "\1\u19bd\13\0\1\u0386\41\0\2\u0384\4\0\1\u19be\12\0"+
+ "\1\u0386\41\0\2\u0384\5\0\1\u19bf\11\0\1\u0386\41\0"+
+ "\2\u0384\6\0\1\u19c0\10\0\1\u0386\41\0\2\u0384\7\0"+
+ "\1\u19c1\7\0\1\u0386\41\0\2\u0384\10\0\1\u19c2\6\0"+
+ "\1\u0386\41\0\2\u0384\11\0\1\u19c3\5\0\1\u0386\41\0"+
+ "\2\u0384\12\0\1\u19c4\4\0\1\u0386\41\0\2\u0384\13\0"+
+ "\1\u19c5\3\0\1\u0386\41\0\2\u0384\14\0\1\u19c6\2\0"+
+ "\1\u0386\41\0\2\u0384\15\0\1\u19c7\1\0\1\u0386\41\0"+
+ "\1\u0312\1\u0313\1\0\1\u19c8\15\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\2\0\1\u19c9\14\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\3\0\1\u19ca\13\0\1\u0315\41\0\1\u0312\1\u0313\4\0"+
+ "\1\u19cb\12\0\1\u0315\41\0\1\u0312\1\u0313\5\0\1\u19cc"+
+ "\11\0\1\u0315\41\0\1\u0312\1\u0313\6\0\1\u19cd\10\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\7\0\1\u19ce\7\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\10\0\1\u19cf\6\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\11\0\1\u19d0\5\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\12\0\1\u19d1\4\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\13\0\1\u19d2\3\0\1\u0315\41\0\1\u0312\1\u0313\14\0"+
+ "\1\u19d3\2\0\1\u0315\41\0\1\u0312\1\u0313\15\0\1\u19d4"+
+ "\1\0\1\u0315\41\0\2\u03a1\1\0\1\u19d5\15\0\1\u03a3"+
+ "\41\0\2\u03a1\2\0\1\u19d6\14\0\1\u03a3\41\0\2\u03a1"+
+ "\3\0\1\u19d7\13\0\1\u03a3\41\0\2\u03a1\4\0\1\u19d8"+
+ "\12\0\1\u03a3\41\0\2\u03a1\5\0\1\u19d9\11\0\1\u03a3"+
+ "\41\0\2\u03a1\6\0\1\u19da\10\0\1\u03a3\41\0\2\u03a1"+
+ "\7\0\1\u19db\7\0\1\u03a3\41\0\2\u03a1\10\0\1\u19dc"+
+ "\6\0\1\u03a3\41\0\2\u03a1\11\0\1\u19dd\5\0\1\u03a3"+
+ "\41\0\2\u03a1\12\0\1\u19de\4\0\1\u03a3\41\0\2\u03a1"+
+ "\13\0\1\u19df\3\0\1\u03a3\41\0\2\u03a1\14\0\1\u19e0"+
+ "\2\0\1\u03a3\41\0\2\u03a1\15\0\1\u19e1\1\0\1\u03a3"+
+ "\40\0\1\276\1\u03b0\1\u03b1\1\276\1\u19e2\15\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\2\276\1\u19e3\14\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\3\276\1\u19e4\13\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\4\276\1\u19e5\12\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\5\276\1\u19e6\11\276\1\u03b3\41\276\1\u03b0\1\u03b1\6\276"+
+ "\1\u19e7\10\276\1\u03b3\41\276\1\u03b0\1\u03b1\7\276\1\u19e8"+
+ "\7\276\1\u03b3\41\276\1\u03b0\1\u03b1\10\276\1\u19e9\6\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\11\276\1\u19ea\5\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\12\276\1\u19eb\4\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\13\276\1\u19ec\3\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\14\276\1\u19ed\2\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\15\276\1\u19ee\1\276\1\u03b3\41\276\1\u033d\1\u033e\1\276"+
+ "\1\u19ef\15\276\1\u0340\41\276\1\u033d\1\u033e\2\276\1\u19f0"+
+ "\14\276\1\u0340\41\276\1\u033d\1\u033e\3\276\1\u19f1\13\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\4\276\1\u19f2\12\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\5\276\1\u19f3\11\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\6\276\1\u19f4\10\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\7\276\1\u19f5\7\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\10\276\1\u19f6\6\276\1\u0340\41\276\1\u033d\1\u033e\11\276"+
+ "\1\u19f7\5\276\1\u0340\41\276\1\u033d\1\u033e\12\276\1\u19f8"+
+ "\4\276\1\u0340\41\276\1\u033d\1\u033e\13\276\1\u19f9\3\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\14\276\1\u19fa\2\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\15\276\1\u19fb\1\276\1\u0340\41\276"+
+ "\1\300\1\u02bf\1\276\1\u19fc\15\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\2\276\1\u19fd\14\276\1\u02c1\40\276\1\263\1\u03cf"+
+ "\1\u03d0\1\263\1\u19fe\1\263\1\u0136\13\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\2\263\1\u19ff\1\u0136\13\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\1\u1a00\12\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\1\263\1\u1a01\11\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\2\263\1\u1a02\10\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\3\263\1\u1a03"+
+ "\7\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\4\263"+
+ "\1\u1a04\6\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\5\263\1\u1a05\5\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\6\263\1\u1a06\4\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\7\263\1\u1a07\3\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\10\263\1\u1a08\2\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\11\263\1\u1a09\1\263\1\u03d2"+
+ "\40\263\1\344\1\u03de\1\u03df\1\344\1\u1a0a\1\344\1\u017c"+
+ "\13\344\1\u03e1\41\344\1\u03de\1\u03df\2\344\1\u1a0b\1\u017c"+
+ "\13\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\1\u1a0c"+
+ "\12\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\1\344"+
+ "\1\u1a0d\11\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\2\344\1\u1a0e\10\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\3\344\1\u1a0f\7\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\4\344\1\u1a10\6\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\5\344\1\u1a11\5\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\6\344\1\u1a12\4\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\7\344\1\u1a13\3\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\10\344\1\u1a14"+
+ "\2\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\11\344"+
+ "\1\u1a15\1\344\1\u03e1\40\344\1\276\1\300\1\u02bf\3\276"+
+ "\1\u1a16\13\276\1\u02c1\41\276\1\300\1\u02bf\4\276\1\u1a17"+
+ "\12\276\1\u02c1\41\276\1\300\1\u02bf\5\276\1\u1a18\11\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\6\276\1\u1a19\10\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\7\276\1\u1a1a\7\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\10\276\1\u1a1b\6\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\11\276\1\u1a1c\5\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\12\276\1\u1a1d\4\276\1\u02c1\41\276\1\300\1\u02bf\13\276"+
+ "\1\u1a1e\3\276\1\u02c1\41\276\1\300\1\u02bf\14\276\1\u1a1f"+
+ "\2\276\1\u02c1\41\276\1\300\1\u02bf\15\276\1\u1a20\1\276"+
+ "\1\u02c1\40\276\1\0\2\u0384\1\0\1\u1a21\15\0\1\u0386"+
+ "\41\0\2\u0384\2\0\1\u1a22\14\0\1\u0386\41\0\2\u0384"+
+ "\3\0\1\u1a23\13\0\1\u0386\41\0\2\u0384\4\0\1\u1a24"+
+ "\12\0\1\u0386\41\0\2\u0384\5\0\1\u1a25\11\0\1\u0386"+
+ "\41\0\2\u0384\6\0\1\u1a26\10\0\1\u0386\41\0\2\u0384"+
+ "\7\0\1\u1a27\7\0\1\u0386\41\0\2\u0384\10\0\1\u1a28"+
+ "\6\0\1\u0386\41\0\2\u0384\11\0\1\u1a29\5\0\1\u0386"+
+ "\41\0\2\u0384\12\0\1\u1a2a\4\0\1\u0386\41\0\2\u0384"+
+ "\13\0\1\u1a2b\3\0\1\u0386\41\0\2\u0384\14\0\1\u1a2c"+
+ "\2\0\1\u0386\41\0\2\u0384\15\0\1\u1a2d\1\0\1\u0386"+
+ "\41\0\1\u0312\1\u0313\1\0\1\u1a2e\15\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\2\0\1\u1a2f\14\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\3\0\1\u1a30\13\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\4\0\1\u1a31\12\0\1\u0315\41\0\1\u0312\1\u0313\5\0"+
+ "\1\u1a32\11\0\1\u0315\41\0\1\u0312\1\u0313\6\0\1\u1a33"+
+ "\10\0\1\u0315\41\0\1\u0312\1\u0313\7\0\1\u1a34\7\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\10\0\1\u1a35\6\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\11\0\1\u1a36\5\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\12\0\1\u1a37\4\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\13\0\1\u1a38\3\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\14\0\1\u1a39\2\0\1\u0315\41\0\1\u0312\1\u0313\15\0"+
+ "\1\u1a3a\1\0\1\u0315\41\0\2\u03a1\1\0\1\u1a3b\15\0"+
+ "\1\u03a3\41\0\2\u03a1\2\0\1\u1a3c\14\0\1\u03a3\41\0"+
+ "\2\u03a1\3\0\1\u1a3d\13\0\1\u03a3\41\0\2\u03a1\4\0"+
+ "\1\u1a3e\12\0\1\u03a3\41\0\2\u03a1\5\0\1\u1a3f\11\0"+
+ "\1\u03a3\41\0\2\u03a1\6\0\1\u1a40\10\0\1\u03a3\41\0"+
+ "\2\u03a1\7\0\1\u1a41\7\0\1\u03a3\41\0\2\u03a1\10\0"+
+ "\1\u1a42\6\0\1\u03a3\41\0\2\u03a1\11\0\1\u1a43\5\0"+
+ "\1\u03a3\41\0\2\u03a1\12\0\1\u1a44\4\0\1\u03a3\41\0"+
+ "\2\u03a1\13\0\1\u1a45\3\0\1\u03a3\41\0\2\u03a1\14\0"+
+ "\1\u1a46\2\0\1\u03a3\41\0\2\u03a1\15\0\1\u1a47\1\0"+
+ "\1\u03a3\40\0\1\276\1\u03b0\1\u03b1\1\276\1\u1a48\15\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\2\276\1\u1a49\14\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\3\276\1\u1a4a\13\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\4\276\1\u1a4b\12\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\5\276\1\u1a4c\11\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\6\276\1\u1a4d\10\276\1\u03b3\41\276\1\u03b0\1\u03b1\7\276"+
+ "\1\u1a4e\7\276\1\u03b3\41\276\1\u03b0\1\u03b1\10\276\1\u1a4f"+
+ "\6\276\1\u03b3\41\276\1\u03b0\1\u03b1\11\276\1\u1a50\5\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\12\276\1\u1a51\4\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\13\276\1\u1a52\3\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\14\276\1\u1a53\2\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\15\276\1\u1a54\1\276\1\u03b3\41\276\1\u033d\1\u033e"+
+ "\1\276\1\u1a55\15\276\1\u0340\41\276\1\u033d\1\u033e\2\276"+
+ "\1\u1a56\14\276\1\u0340\41\276\1\u033d\1\u033e\3\276\1\u1a57"+
+ "\13\276\1\u0340\41\276\1\u033d\1\u033e\4\276\1\u1a58\12\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\5\276\1\u1a59\11\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\6\276\1\u1a5a\10\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\7\276\1\u1a5b\7\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\10\276\1\u1a5c\6\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\11\276\1\u1a5d\5\276\1\u0340\41\276\1\u033d\1\u033e\12\276"+
+ "\1\u1a5e\4\276\1\u0340\41\276\1\u033d\1\u033e\13\276\1\u1a5f"+
+ "\3\276\1\u0340\41\276\1\u033d\1\u033e\14\276\1\u1a60\2\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\15\276\1\u1a61\1\276\1\u0340"+
+ "\41\276\1\300\1\u02bf\1\276\1\u1a62\15\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\2\276\1\u1a63\14\276\1\u02c1\40\276\1\263"+
+ "\1\u03cf\1\u03d0\1\263\1\u1a64\1\263\1\u0136\13\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\2\263\1\u1a65\1\u0136\13\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\u1a66\12\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\263\1\u1a67\11\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\2\263\1\u1a68"+
+ "\10\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\3\263"+
+ "\1\u1a69\7\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\4\263\1\u1a6a\6\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\5\263\1\u1a6b\5\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\6\263\1\u1a6c\4\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\7\263\1\u1a6d\3\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\10\263\1\u1a6e\2\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\11\263\1\u1a6f\1\263"+
+ "\1\u03d2\40\263\1\344\1\u03de\1\u03df\1\344\1\u1a70\1\344"+
+ "\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df\2\344\1\u1a71"+
+ "\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\1\u1a72\12\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\1\344\1\u1a73\11\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\2\344\1\u1a74\10\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\3\344\1\u1a75\7\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\4\344\1\u1a76\6\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\5\344\1\u1a77\5\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\6\344\1\u1a78\4\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\7\344\1\u1a79"+
+ "\3\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\10\344"+
+ "\1\u1a7a\2\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\11\344\1\u1a7b\1\344\1\u03e1\40\344\1\276\1\300\1\u02bf"+
+ "\3\276\1\u1a7c\13\276\1\u02c1\41\276\1\300\1\u02bf\4\276"+
+ "\1\u1a7d\12\276\1\u02c1\41\276\1\300\1\u02bf\5\276\1\u1a7e"+
+ "\11\276\1\u02c1\41\276\1\300\1\u02bf\6\276\1\u1a7f\10\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\7\276\1\u1a80\7\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\10\276\1\u1a81\6\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\11\276\1\u1a82\5\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\12\276\1\u1a83\4\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\13\276\1\u1a84\3\276\1\u02c1\41\276\1\300\1\u02bf\14\276"+
+ "\1\u1a85\2\276\1\u02c1\41\276\1\300\1\u02bf\15\276\1\u1a86"+
+ "\1\276\1\u02c1\40\276\1\0\2\u0384\1\0\1\u1a87\15\0"+
+ "\1\u0386\41\0\2\u0384\2\0\1\u1a88\14\0\1\u0386\41\0"+
+ "\2\u0384\3\0\1\u1a89\13\0\1\u0386\41\0\2\u0384\4\0"+
+ "\1\u1a8a\12\0\1\u0386\41\0\2\u0384\5\0\1\u1a8b\11\0"+
+ "\1\u0386\41\0\2\u0384\6\0\1\u1a8c\10\0\1\u0386\41\0"+
+ "\2\u0384\7\0\1\u1a8d\7\0\1\u0386\41\0\2\u0384\10\0"+
+ "\1\u1a8e\6\0\1\u0386\41\0\2\u0384\11\0\1\u1a8f\5\0"+
+ "\1\u0386\41\0\2\u0384\12\0\1\u1a90\4\0\1\u0386\41\0"+
+ "\2\u0384\13\0\1\u1a91\3\0\1\u0386\41\0\2\u0384\14\0"+
+ "\1\u1a92\2\0\1\u0386\41\0\2\u0384\15\0\1\u1a93\1\0"+
+ "\1\u0386\41\0\1\u0312\1\u0313\1\0\1\u1a94\15\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\2\0\1\u1a95\14\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\3\0\1\u1a96\13\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\4\0\1\u1a97\12\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\5\0\1\u1a98\11\0\1\u0315\41\0\1\u0312\1\u0313\6\0"+
+ "\1\u1a99\10\0\1\u0315\41\0\1\u0312\1\u0313\7\0\1\u1a9a"+
+ "\7\0\1\u0315\41\0\1\u0312\1\u0313\10\0\1\u1a9b\6\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\11\0\1\u1a9c\5\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\12\0\1\u1a9d\4\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\13\0\1\u1a9e\3\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\14\0\1\u1a9f\2\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\15\0\1\u1aa0\1\0\1\u0315\41\0\2\u03a1\1\0\1\u1aa1"+
+ "\15\0\1\u03a3\41\0\2\u03a1\2\0\1\u1aa2\14\0\1\u03a3"+
+ "\41\0\2\u03a1\3\0\1\u1aa3\13\0\1\u03a3\41\0\2\u03a1"+
+ "\4\0\1\u1aa4\12\0\1\u03a3\41\0\2\u03a1\5\0\1\u1aa5"+
+ "\11\0\1\u03a3\41\0\2\u03a1\6\0\1\u1aa6\10\0\1\u03a3"+
+ "\41\0\2\u03a1\7\0\1\u1aa7\7\0\1\u03a3\41\0\2\u03a1"+
+ "\10\0\1\u1aa8\6\0\1\u03a3\41\0\2\u03a1\11\0\1\u1aa9"+
+ "\5\0\1\u03a3\41\0\2\u03a1\12\0\1\u1aaa\4\0\1\u03a3"+
+ "\41\0\2\u03a1\13\0\1\u1aab\3\0\1\u03a3\41\0\2\u03a1"+
+ "\14\0\1\u1aac\2\0\1\u03a3\41\0\2\u03a1\15\0\1\u1aad"+
+ "\1\0\1\u03a3\40\0\1\276\1\u03b0\1\u03b1\1\276\1\u1aae"+
+ "\15\276\1\u03b3\41\276\1\u03b0\1\u03b1\2\276\1\u1aaf\14\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\3\276\1\u1ab0\13\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\4\276\1\u1ab1\12\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\5\276\1\u1ab2\11\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\6\276\1\u1ab3\10\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\7\276\1\u1ab4\7\276\1\u03b3\41\276\1\u03b0\1\u03b1\10\276"+
+ "\1\u1ab5\6\276\1\u03b3\41\276\1\u03b0\1\u03b1\11\276\1\u1ab6"+
+ "\5\276\1\u03b3\41\276\1\u03b0\1\u03b1\12\276\1\u1ab7\4\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\13\276\1\u1ab8\3\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\14\276\1\u1ab9\2\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\15\276\1\u1aba\1\276\1\u03b3\41\276\1\u033d"+
+ "\1\u033e\1\276\1\u1abb\15\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\2\276\1\u1abc\14\276\1\u0340\41\276\1\u033d\1\u033e\3\276"+
+ "\1\u1abd\13\276\1\u0340\41\276\1\u033d\1\u033e\4\276\1\u1abe"+
+ "\12\276\1\u0340\41\276\1\u033d\1\u033e\5\276\1\u1abf\11\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\6\276\1\u1ac0\10\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\7\276\1\u1ac1\7\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\10\276\1\u1ac2\6\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\11\276\1\u1ac3\5\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\12\276\1\u1ac4\4\276\1\u0340\41\276\1\u033d\1\u033e\13\276"+
+ "\1\u1ac5\3\276\1\u0340\41\276\1\u033d\1\u033e\14\276\1\u1ac6"+
+ "\2\276\1\u0340\41\276\1\u033d\1\u033e\15\276\1\u1ac7\1\276"+
+ "\1\u0340\41\276\1\300\1\u02bf\1\276\1\u1ac8\15\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\2\276\1\u1ac9\14\276\1\u02c1\40\276"+
+ "\1\263\1\u03cf\1\u03d0\1\263\1\u1aca\1\263\1\u0136\13\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\2\263\1\u1acb\1\u0136\13\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\u1acc\12\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\263\1\u1acd"+
+ "\11\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\2\263"+
+ "\1\u1ace\10\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\3\263\1\u1acf\7\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\4\263\1\u1ad0\6\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\5\263\1\u1ad1\5\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\6\263\1\u1ad2\4\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\7\263\1\u1ad3\3\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\10\263\1\u1ad4\2\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\11\263\1\u1ad5"+
+ "\1\263\1\u03d2\40\263\1\344\1\u03de\1\u03df\1\344\1\u1ad6"+
+ "\1\344\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df\2\344"+
+ "\1\u1ad7\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\1\u1ad8\12\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\1\344\1\u1ad9\11\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\2\344\1\u1ada\10\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\3\344\1\u1adb\7\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\4\344\1\u1adc\6\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\5\344\1\u1add\5\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\6\344\1\u1ade"+
+ "\4\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\7\344"+
+ "\1\u1adf\3\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\10\344\1\u1ae0\2\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\11\344\1\u1ae1\1\344\1\u03e1\40\344\1\276\1\300"+
+ "\1\u02bf\3\276\1\u1ae2\13\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\4\276\1\u1ae3\12\276\1\u02c1\41\276\1\300\1\u02bf\5\276"+
+ "\1\u1ae4\11\276\1\u02c1\41\276\1\300\1\u02bf\6\276\1\u1ae5"+
+ "\10\276\1\u02c1\41\276\1\300\1\u02bf\7\276\1\u1ae6\7\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\10\276\1\u1ae7\6\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\11\276\1\u1ae8\5\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\12\276\1\u1ae9\4\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\13\276\1\u1aea\3\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\14\276\1\u1aeb\2\276\1\u02c1\41\276\1\300\1\u02bf\15\276"+
+ "\1\u1aec\1\276\1\u02c1\40\276\1\0\2\u0384\1\0\1\u1aed"+
+ "\15\0\1\u0386\41\0\2\u0384\2\0\1\u1aee\14\0\1\u0386"+
+ "\41\0\2\u0384\3\0\1\u1aef\13\0\1\u0386\41\0\2\u0384"+
+ "\4\0\1\u1af0\12\0\1\u0386\41\0\2\u0384\5\0\1\u1af1"+
+ "\11\0\1\u0386\41\0\2\u0384\6\0\1\u1af2\10\0\1\u0386"+
+ "\41\0\2\u0384\7\0\1\u1af3\7\0\1\u0386\41\0\2\u0384"+
+ "\10\0\1\u1af4\6\0\1\u0386\41\0\2\u0384\11\0\1\u1af5"+
+ "\5\0\1\u0386\41\0\2\u0384\12\0\1\u1af6\4\0\1\u0386"+
+ "\41\0\2\u0384\13\0\1\u1af7\3\0\1\u0386\41\0\2\u0384"+
+ "\14\0\1\u1af8\2\0\1\u0386\41\0\2\u0384\15\0\1\u1af9"+
+ "\1\0\1\u0386\41\0\1\u0312\1\u0313\1\0\1\u1afa\15\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\2\0\1\u1afb\14\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\3\0\1\u1afc\13\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\4\0\1\u1afd\12\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\5\0\1\u1afe\11\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\6\0\1\u1aff\10\0\1\u0315\41\0\1\u0312\1\u0313\7\0"+
+ "\1\u1b00\7\0\1\u0315\41\0\1\u0312\1\u0313\10\0\1\u1b01"+
+ "\6\0\1\u0315\41\0\1\u0312\1\u0313\11\0\1\u1b02\5\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\12\0\1\u1b03\4\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\13\0\1\u1b04\3\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\14\0\1\u1b05\2\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\15\0\1\u1b06\1\0\1\u0315\41\0\2\u03a1\1\0"+
+ "\1\u1b07\15\0\1\u03a3\41\0\2\u03a1\2\0\1\u1b08\14\0"+
+ "\1\u03a3\41\0\2\u03a1\3\0\1\u1b09\13\0\1\u03a3\41\0"+
+ "\2\u03a1\4\0\1\u1b0a\12\0\1\u03a3\41\0\2\u03a1\5\0"+
+ "\1\u1b0b\11\0\1\u03a3\41\0\2\u03a1\6\0\1\u1b0c\10\0"+
+ "\1\u03a3\41\0\2\u03a1\7\0\1\u1b0d\7\0\1\u03a3\41\0"+
+ "\2\u03a1\10\0\1\u1b0e\6\0\1\u03a3\41\0\2\u03a1\11\0"+
+ "\1\u1b0f\5\0\1\u03a3\41\0\2\u03a1\12\0\1\u1b10\4\0"+
+ "\1\u03a3\41\0\2\u03a1\13\0\1\u1b11\3\0\1\u03a3\41\0"+
+ "\2\u03a1\14\0\1\u1b12\2\0\1\u03a3\41\0\2\u03a1\15\0"+
+ "\1\u1b13\1\0\1\u03a3\40\0\1\276\1\u03b0\1\u03b1\1\276"+
+ "\1\u1b14\15\276\1\u03b3\41\276\1\u03b0\1\u03b1\2\276\1\u1b15"+
+ "\14\276\1\u03b3\41\276\1\u03b0\1\u03b1\3\276\1\u1b16\13\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\4\276\1\u1b17\12\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\5\276\1\u1b18\11\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\6\276\1\u1b19\10\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\7\276\1\u1b1a\7\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\10\276\1\u1b1b\6\276\1\u03b3\41\276\1\u03b0\1\u03b1\11\276"+
+ "\1\u1b1c\5\276\1\u03b3\41\276\1\u03b0\1\u03b1\12\276\1\u1b1d"+
+ "\4\276\1\u03b3\41\276\1\u03b0\1\u03b1\13\276\1\u1b1e\3\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\14\276\1\u1b1f\2\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\15\276\1\u1b20\1\276\1\u03b3\41\276"+
+ "\1\u033d\1\u033e\1\276\1\u1b21\15\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\2\276\1\u1b22\14\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\3\276\1\u1b23\13\276\1\u0340\41\276\1\u033d\1\u033e\4\276"+
+ "\1\u1b24\12\276\1\u0340\41\276\1\u033d\1\u033e\5\276\1\u1b25"+
+ "\11\276\1\u0340\41\276\1\u033d\1\u033e\6\276\1\u1b26\10\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\7\276\1\u1b27\7\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\10\276\1\u1b28\6\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\11\276\1\u1b29\5\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\12\276\1\u1b2a\4\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\13\276\1\u1b2b\3\276\1\u0340\41\276\1\u033d\1\u033e\14\276"+
+ "\1\u1b2c\2\276\1\u0340\41\276\1\u033d\1\u033e\15\276\1\u1b2d"+
+ "\1\276\1\u0340\41\276\1\300\1\u02bf\1\276\1\u1b2e\15\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\2\276\1\u1b2f\14\276\1\u02c1"+
+ "\40\276\1\263\1\u03cf\1\u03d0\1\263\1\u1b30\1\263\1\u0136"+
+ "\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\2\263\1\u1b31\1\u0136"+
+ "\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\u1b32"+
+ "\12\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\263"+
+ "\1\u1b33\11\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\2\263\1\u1b34\10\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\3\263\1\u1b35\7\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\4\263\1\u1b36\6\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\5\263\1\u1b37\5\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\6\263\1\u1b38\4\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\7\263\1\u1b39\3\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\10\263\1\u1b3a"+
+ "\2\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\11\263"+
+ "\1\u1b3b\1\263\1\u03d2\40\263\1\344\1\u03de\1\u03df\1\344"+
+ "\1\u1b3c\1\344\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\2\344\1\u1b3d\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\1\u1b3e\12\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\1\344\1\u1b3f\11\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\2\344\1\u1b40\10\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\3\344\1\u1b41\7\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\4\344\1\u1b42\6\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\5\344\1\u1b43"+
+ "\5\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\6\344"+
+ "\1\u1b44\4\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\7\344\1\u1b45\3\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\10\344\1\u1b46\2\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\11\344\1\u1b47\1\344\1\u03e1\40\344\1\276"+
+ "\1\300\1\u02bf\3\276\1\u1b48\13\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\4\276\1\u1b49\12\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\5\276\1\u1b4a\11\276\1\u02c1\41\276\1\300\1\u02bf\6\276"+
+ "\1\u1b4b\10\276\1\u02c1\41\276\1\300\1\u02bf\7\276\1\u1b4c"+
+ "\7\276\1\u02c1\41\276\1\300\1\u02bf\10\276\1\u1b4d\6\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\11\276\1\u1b4e\5\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\12\276\1\u1b4f\4\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\13\276\1\u1b50\3\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\14\276\1\u1b51\2\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\15\276\1\u1b52\1\276\1\u02c1\40\276\1\0\2\u0384\1\0"+
+ "\1\u1b53\15\0\1\u0386\41\0\2\u0384\2\0\1\u1b54\14\0"+
+ "\1\u0386\41\0\2\u0384\3\0\1\u1b55\13\0\1\u0386\41\0"+
+ "\2\u0384\4\0\1\u1b56\12\0\1\u0386\41\0\2\u0384\5\0"+
+ "\1\u1b57\11\0\1\u0386\41\0\2\u0384\6\0\1\u1b58\10\0"+
+ "\1\u0386\41\0\2\u0384\7\0\1\u1b59\7\0\1\u0386\41\0"+
+ "\2\u0384\10\0\1\u1b5a\6\0\1\u0386\41\0\2\u0384\11\0"+
+ "\1\u1b5b\5\0\1\u0386\41\0\2\u0384\12\0\1\u1b5c\4\0"+
+ "\1\u0386\41\0\2\u0384\13\0\1\u1b5d\3\0\1\u0386\41\0"+
+ "\2\u0384\14\0\1\u1b5e\2\0\1\u0386\41\0\2\u0384\15\0"+
+ "\1\u1b5f\1\0\1\u0386\41\0\1\u0312\1\u0313\1\0\1\u1b60"+
+ "\15\0\1\u0315\41\0\1\u0312\1\u0313\2\0\1\u1b61\14\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\3\0\1\u1b62\13\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\4\0\1\u1b63\12\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\5\0\1\u1b64\11\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\6\0\1\u1b65\10\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\7\0\1\u1b66\7\0\1\u0315\41\0\1\u0312\1\u0313\10\0"+
+ "\1\u1b67\6\0\1\u0315\41\0\1\u0312\1\u0313\11\0\1\u1b68"+
+ "\5\0\1\u0315\41\0\1\u0312\1\u0313\12\0\1\u1b69\4\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\13\0\1\u1b6a\3\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\14\0\1\u1b6b\2\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\15\0\1\u1b6c\1\0\1\u0315\41\0\2\u03a1"+
+ "\1\0\1\u1b6d\15\0\1\u03a3\41\0\2\u03a1\2\0\1\u1b6e"+
+ "\14\0\1\u03a3\41\0\2\u03a1\3\0\1\u1b6f\13\0\1\u03a3"+
+ "\41\0\2\u03a1\4\0\1\u1b70\12\0\1\u03a3\41\0\2\u03a1"+
+ "\5\0\1\u1b71\11\0\1\u03a3\41\0\2\u03a1\6\0\1\u1b72"+
+ "\10\0\1\u03a3\41\0\2\u03a1\7\0\1\u1b73\7\0\1\u03a3"+
+ "\41\0\2\u03a1\10\0\1\u1b74\6\0\1\u03a3\41\0\2\u03a1"+
+ "\11\0\1\u1b75\5\0\1\u03a3\41\0\2\u03a1\12\0\1\u1b76"+
+ "\4\0\1\u03a3\41\0\2\u03a1\13\0\1\u1b77\3\0\1\u03a3"+
+ "\41\0\2\u03a1\14\0\1\u1b78\2\0\1\u03a3\41\0\2\u03a1"+
+ "\15\0\1\u1b79\1\0\1\u03a3\40\0\1\276\1\u03b0\1\u03b1"+
+ "\1\276\1\u1b7a\15\276\1\u03b3\41\276\1\u03b0\1\u03b1\2\276"+
+ "\1\u1b7b\14\276\1\u03b3\41\276\1\u03b0\1\u03b1\3\276\1\u1b7c"+
+ "\13\276\1\u03b3\41\276\1\u03b0\1\u03b1\4\276\1\u1b7d\12\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\5\276\1\u1b7e\11\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\6\276\1\u1b7f\10\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\7\276\1\u1b80\7\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\10\276\1\u1b81\6\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\11\276\1\u1b82\5\276\1\u03b3\41\276\1\u03b0\1\u03b1\12\276"+
+ "\1\u1b83\4\276\1\u03b3\41\276\1\u03b0\1\u03b1\13\276\1\u1b84"+
+ "\3\276\1\u03b3\41\276\1\u03b0\1\u03b1\14\276\1\u1b85\2\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\15\276\1\u1b86\1\276\1\u03b3"+
+ "\41\276\1\u033d\1\u033e\1\276\1\u1b87\15\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\2\276\1\u1b88\14\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\3\276\1\u1b89\13\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\4\276\1\u1b8a\12\276\1\u0340\41\276\1\u033d\1\u033e\5\276"+
+ "\1\u1b8b\11\276\1\u0340\41\276\1\u033d\1\u033e\6\276\1\u1b8c"+
+ "\10\276\1\u0340\41\276\1\u033d\1\u033e\7\276\1\u1b8d\7\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\10\276\1\u1b8e\6\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\11\276\1\u1b8f\5\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\12\276\1\u1b90\4\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\13\276\1\u1b91\3\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\14\276\1\u1b92\2\276\1\u0340\41\276\1\u033d\1\u033e\15\276"+
+ "\1\u1b93\1\276\1\u0340\41\276\1\300\1\u02bf\1\276\1\u1b94"+
+ "\15\276\1\u02c1\41\276\1\300\1\u02bf\2\276\1\u1b95\14\276"+
+ "\1\u02c1\40\276\1\263\1\u03cf\1\u03d0\1\263\1\u1b96\1\263"+
+ "\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\2\263\1\u1b97"+
+ "\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\1\u1b98\12\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\1\263\1\u1b99\11\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\2\263\1\u1b9a\10\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\3\263\1\u1b9b\7\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\4\263\1\u1b9c\6\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\5\263\1\u1b9d\5\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\6\263\1\u1b9e\4\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\7\263\1\u1b9f"+
+ "\3\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\10\263"+
+ "\1\u1ba0\2\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\11\263\1\u1ba1\1\263\1\u03d2\40\263\1\344\1\u03de\1\u03df"+
+ "\1\344\1\u1ba2\1\344\1\u017c\13\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\2\344\1\u1ba3\1\u017c\13\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\1\u1ba4\12\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\1\344\1\u1ba5\11\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\2\344\1\u1ba6\10\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\3\344\1\u1ba7\7\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\4\344\1\u1ba8"+
+ "\6\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\5\344"+
+ "\1\u1ba9\5\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\6\344\1\u1baa\4\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\7\344\1\u1bab\3\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\10\344\1\u1bac\2\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\11\344\1\u1bad\1\344\1\u03e1\40\344"+
+ "\1\276\1\300\1\u02bf\3\276\1\u1bae\13\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\4\276\1\u1baf\12\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\5\276\1\u1bb0\11\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\6\276\1\u1bb1\10\276\1\u02c1\41\276\1\300\1\u02bf\7\276"+
+ "\1\u1bb2\7\276\1\u02c1\41\276\1\300\1\u02bf\10\276\1\u1bb3"+
+ "\6\276\1\u02c1\41\276\1\300\1\u02bf\11\276\1\u1bb4\5\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\12\276\1\u1bb5\4\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\13\276\1\u1bb6\3\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\14\276\1\u1bb7\2\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\15\276\1\u1bb8\1\276\1\u02c1\40\276\1\0\2\u0384"+
+ "\1\0\1\u1bb9\15\0\1\u0386\41\0\2\u0384\2\0\1\u1bba"+
+ "\14\0\1\u0386\41\0\2\u0384\3\0\1\u1bbb\13\0\1\u0386"+
+ "\41\0\2\u0384\4\0\1\u1bbc\12\0\1\u0386\41\0\2\u0384"+
+ "\5\0\1\u1bbd\11\0\1\u0386\41\0\2\u0384\6\0\1\u1bbe"+
+ "\10\0\1\u0386\41\0\2\u0384\7\0\1\u1bbf\7\0\1\u0386"+
+ "\41\0\2\u0384\10\0\1\u1bc0\6\0\1\u0386\41\0\2\u0384"+
+ "\11\0\1\u1bc1\5\0\1\u0386\41\0\2\u0384\12\0\1\u1bc2"+
+ "\4\0\1\u0386\41\0\2\u0384\13\0\1\u1bc3\3\0\1\u0386"+
+ "\41\0\2\u0384\14\0\1\u1bc4\2\0\1\u0386\41\0\2\u0384"+
+ "\15\0\1\u1bc5\1\0\1\u0386\41\0\1\u0312\1\u0313\1\0"+
+ "\1\u1bc6\15\0\1\u0315\41\0\1\u0312\1\u0313\2\0\1\u1bc7"+
+ "\14\0\1\u0315\41\0\1\u0312\1\u0313\3\0\1\u1bc8\13\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\4\0\1\u1bc9\12\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\5\0\1\u1bca\11\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\6\0\1\u1bcb\10\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\7\0\1\u1bcc\7\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\10\0\1\u1bcd\6\0\1\u0315\41\0\1\u0312\1\u0313\11\0"+
+ "\1\u1bce\5\0\1\u0315\41\0\1\u0312\1\u0313\12\0\1\u1bcf"+
+ "\4\0\1\u0315\41\0\1\u0312\1\u0313\13\0\1\u1bd0\3\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\14\0\1\u1bd1\2\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\15\0\1\u1bd2\1\0\1\u0315\41\0"+
+ "\2\u03a1\1\0\1\u1bd3\15\0\1\u03a3\41\0\2\u03a1\2\0"+
+ "\1\u1bd4\14\0\1\u03a3\41\0\2\u03a1\3\0\1\u1bd5\13\0"+
+ "\1\u03a3\41\0\2\u03a1\4\0\1\u1bd6\12\0\1\u03a3\41\0"+
+ "\2\u03a1\5\0\1\u1bd7\11\0\1\u03a3\41\0\2\u03a1\6\0"+
+ "\1\u1bd8\10\0\1\u03a3\41\0\2\u03a1\7\0\1\u1bd9\7\0"+
+ "\1\u03a3\41\0\2\u03a1\10\0\1\u1bda\6\0\1\u03a3\41\0"+
+ "\2\u03a1\11\0\1\u1bdb\5\0\1\u03a3\41\0\2\u03a1\12\0"+
+ "\1\u1bdc\4\0\1\u03a3\41\0\2\u03a1\13\0\1\u1bdd\3\0"+
+ "\1\u03a3\41\0\2\u03a1\14\0\1\u1bde\2\0\1\u03a3\41\0"+
+ "\2\u03a1\15\0\1\u1bdf\1\0\1\u03a3\40\0\1\276\1\u03b0"+
+ "\1\u03b1\1\276\1\u1be0\15\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\2\276\1\u1be1\14\276\1\u03b3\41\276\1\u03b0\1\u03b1\3\276"+
+ "\1\u1be2\13\276\1\u03b3\41\276\1\u03b0\1\u03b1\4\276\1\u1be3"+
+ "\12\276\1\u03b3\41\276\1\u03b0\1\u03b1\5\276\1\u1be4\11\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\6\276\1\u1be5\10\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\7\276\1\u1be6\7\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\10\276\1\u1be7\6\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\11\276\1\u1be8\5\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\12\276\1\u1be9\4\276\1\u03b3\41\276\1\u03b0\1\u03b1\13\276"+
+ "\1\u1bea\3\276\1\u03b3\41\276\1\u03b0\1\u03b1\14\276\1\u1beb"+
+ "\2\276\1\u03b3\41\276\1\u03b0\1\u03b1\15\276\1\u1bec\1\276"+
+ "\1\u03b3\41\276\1\u033d\1\u033e\1\276\1\u1bed\15\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\2\276\1\u1bee\14\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\3\276\1\u1bef\13\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\4\276\1\u1bf0\12\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\5\276\1\u1bf1\11\276\1\u0340\41\276\1\u033d\1\u033e\6\276"+
+ "\1\u1bf2\10\276\1\u0340\41\276\1\u033d\1\u033e\7\276\1\u1bf3"+
+ "\7\276\1\u0340\41\276\1\u033d\1\u033e\10\276\1\u1bf4\6\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\11\276\1\u1bf5\5\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\12\276\1\u1bf6\4\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\13\276\1\u1bf7\3\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\14\276\1\u1bf8\2\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\15\276\1\u1bf9\1\276\1\u0340\41\276\1\300\1\u02bf\1\276"+
+ "\1\u1bfa\15\276\1\u02c1\41\276\1\300\1\u02bf\2\276\1\u1bfb"+
+ "\14\276\1\u02c1\40\276\1\263\1\u03cf\1\u03d0\1\263\1\u1bfc"+
+ "\1\263\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\2\263"+
+ "\1\u1bfd\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\1\u1bfe\12\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\1\263\1\u1bff\11\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\2\263\1\u1c00\10\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\3\263\1\u1c01\7\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\4\263\1\u1c02\6\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\5\263\1\u1c03\5\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\6\263\1\u1c04"+
+ "\4\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\7\263"+
+ "\1\u1c05\3\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\10\263\1\u1c06\2\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\11\263\1\u1c07\1\263\1\u03d2\40\263\1\344\1\u03de"+
+ "\1\u03df\1\344\1\u1c08\1\344\1\u017c\13\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\2\344\1\u1c09\1\u017c\13\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\1\u1c0a\12\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\1\344\1\u1c0b\11\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\2\344\1\u1c0c\10\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\3\344\1\u1c0d"+
+ "\7\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\4\344"+
+ "\1\u1c0e\6\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\5\344\1\u1c0f\5\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\6\344\1\u1c10\4\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\7\344\1\u1c11\3\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\10\344\1\u1c12\2\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\11\344\1\u1c13\1\344\1\u03e1"+
+ "\40\344\1\276\1\300\1\u02bf\3\276\1\u1c14\13\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\4\276\1\u1c15\12\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\5\276\1\u1c16\11\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\6\276\1\u1c17\10\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\7\276\1\u1c18\7\276\1\u02c1\41\276\1\300\1\u02bf\10\276"+
+ "\1\u1c19\6\276\1\u02c1\41\276\1\300\1\u02bf\11\276\1\u1c1a"+
+ "\5\276\1\u02c1\41\276\1\300\1\u02bf\12\276\1\u1c1b\4\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\13\276\1\u1c1c\3\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\14\276\1\u1c1d\2\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\15\276\1\u1c1e\1\276\1\u02c1\40\276\1\0"+
+ "\2\u0384\1\0\1\u1c1f\15\0\1\u0386\41\0\2\u0384\2\0"+
+ "\1\u1c20\14\0\1\u0386\41\0\2\u0384\3\0\1\u1c21\13\0"+
+ "\1\u0386\41\0\2\u0384\4\0\1\u1c22\12\0\1\u0386\41\0"+
+ "\2\u0384\5\0\1\u1c23\11\0\1\u0386\41\0\2\u0384\6\0"+
+ "\1\u1c24\10\0\1\u0386\41\0\2\u0384\7\0\1\u1c25\7\0"+
+ "\1\u0386\41\0\2\u0384\10\0\1\u1c26\6\0\1\u0386\41\0"+
+ "\2\u0384\11\0\1\u1c27\5\0\1\u0386\41\0\2\u0384\12\0"+
+ "\1\u1c28\4\0\1\u0386\41\0\2\u0384\13\0\1\u1c29\3\0"+
+ "\1\u0386\41\0\2\u0384\14\0\1\u1c2a\2\0\1\u0386\41\0"+
+ "\2\u0384\15\0\1\u1c2b\1\0\1\u0386\41\0\1\u0312\1\u0313"+
+ "\1\0\1\u1c2c\15\0\1\u0315\41\0\1\u0312\1\u0313\2\0"+
+ "\1\u1c2d\14\0\1\u0315\41\0\1\u0312\1\u0313\3\0\1\u1c2e"+
+ "\13\0\1\u0315\41\0\1\u0312\1\u0313\4\0\1\u1c2f\12\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\5\0\1\u1c30\11\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\6\0\1\u1c31\10\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\7\0\1\u1c32\7\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\10\0\1\u1c33\6\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\11\0\1\u1c34\5\0\1\u0315\41\0\1\u0312\1\u0313\12\0"+
+ "\1\u1c35\4\0\1\u0315\41\0\1\u0312\1\u0313\13\0\1\u1c36"+
+ "\3\0\1\u0315\41\0\1\u0312\1\u0313\14\0\1\u1c37\2\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\15\0\1\u1c38\1\0\1\u0315"+
+ "\41\0\2\u03a1\1\0\1\u1c39\15\0\1\u03a3\41\0\2\u03a1"+
+ "\2\0\1\u1c3a\14\0\1\u03a3\41\0\2\u03a1\3\0\1\u1c3b"+
+ "\13\0\1\u03a3\41\0\2\u03a1\4\0\1\u1c3c\12\0\1\u03a3"+
+ "\41\0\2\u03a1\5\0\1\u1c3d\11\0\1\u03a3\41\0\2\u03a1"+
+ "\6\0\1\u1c3e\10\0\1\u03a3\41\0\2\u03a1\7\0\1\u1c3f"+
+ "\7\0\1\u03a3\41\0\2\u03a1\10\0\1\u1c40\6\0\1\u03a3"+
+ "\41\0\2\u03a1\11\0\1\u1c41\5\0\1\u03a3\41\0\2\u03a1"+
+ "\12\0\1\u1c42\4\0\1\u03a3\41\0\2\u03a1\13\0\1\u1c43"+
+ "\3\0\1\u03a3\41\0\2\u03a1\14\0\1\u1c44\2\0\1\u03a3"+
+ "\41\0\2\u03a1\15\0\1\u1c45\1\0\1\u03a3\40\0\1\276"+
+ "\1\u03b0\1\u03b1\1\276\1\u1c46\15\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\2\276\1\u1c47\14\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\3\276\1\u1c48\13\276\1\u03b3\41\276\1\u03b0\1\u03b1\4\276"+
+ "\1\u1c49\12\276\1\u03b3\41\276\1\u03b0\1\u03b1\5\276\1\u1c4a"+
+ "\11\276\1\u03b3\41\276\1\u03b0\1\u03b1\6\276\1\u1c4b\10\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\7\276\1\u1c4c\7\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\10\276\1\u1c4d\6\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\11\276\1\u1c4e\5\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\12\276\1\u1c4f\4\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\13\276\1\u1c50\3\276\1\u03b3\41\276\1\u03b0\1\u03b1\14\276"+
+ "\1\u1c51\2\276\1\u03b3\41\276\1\u03b0\1\u03b1\15\276\1\u1c52"+
+ "\1\276\1\u03b3\41\276\1\u033d\1\u033e\1\276\1\u1c53\15\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\2\276\1\u1c54\14\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\3\276\1\u1c55\13\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\4\276\1\u1c56\12\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\5\276\1\u1c57\11\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\6\276\1\u1c58\10\276\1\u0340\41\276\1\u033d\1\u033e\7\276"+
+ "\1\u1c59\7\276\1\u0340\41\276\1\u033d\1\u033e\10\276\1\u1c5a"+
+ "\6\276\1\u0340\41\276\1\u033d\1\u033e\11\276\1\u1c5b\5\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\12\276\1\u1c5c\4\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\13\276\1\u1c5d\3\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\14\276\1\u1c5e\2\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\15\276\1\u1c5f\1\276\1\u0340\41\276\1\300\1\u02bf"+
+ "\1\276\1\u1c60\15\276\1\u02c1\41\276\1\300\1\u02bf\2\276"+
+ "\1\u1c61\14\276\1\u02c1\40\276\1\263\1\u03cf\1\u03d0\1\263"+
+ "\1\u1c62\1\263\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\2\263\1\u1c63\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\1\u1c64\12\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\1\263\1\u1c65\11\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\2\263\1\u1c66\10\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\3\263\1\u1c67\7\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\4\263\1\u1c68\6\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\5\263\1\u1c69"+
+ "\5\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\6\263"+
+ "\1\u1c6a\4\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\7\263\1\u1c6b\3\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\10\263\1\u1c6c\2\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\11\263\1\u1c6d\1\263\1\u03d2\40\263\1\344"+
+ "\1\u03de\1\u03df\1\344\1\u1c6e\1\344\1\u017c\13\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\2\344\1\u1c6f\1\u017c\13\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\1\u1c70\12\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\1\344\1\u1c71\11\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\2\344\1\u1c72"+
+ "\10\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\3\344"+
+ "\1\u1c73\7\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\4\344\1\u1c74\6\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\5\344\1\u1c75\5\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\6\344\1\u1c76\4\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\7\344\1\u1c77\3\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\10\344\1\u1c78\2\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\11\344\1\u1c79\1\344"+
+ "\1\u03e1\40\344\1\276\1\300\1\u02bf\3\276\1\u1c7a\13\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\4\276\1\u1c7b\12\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\5\276\1\u1c7c\11\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\6\276\1\u1c7d\10\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\7\276\1\u1c7e\7\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\10\276\1\u1c7f\6\276\1\u02c1\41\276\1\300\1\u02bf\11\276"+
+ "\1\u1c80\5\276\1\u02c1\41\276\1\300\1\u02bf\12\276\1\u1c81"+
+ "\4\276\1\u02c1\41\276\1\300\1\u02bf\13\276\1\u1c82\3\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\14\276\1\u1c83\2\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\15\276\1\u1c84\1\276\1\u02c1\40\276"+
+ "\1\0\2\u0384\1\0\1\u1c85\15\0\1\u0386\41\0\2\u0384"+
+ "\2\0\1\u1c86\14\0\1\u0386\41\0\2\u0384\3\0\1\u1c87"+
+ "\13\0\1\u0386\41\0\2\u0384\4\0\1\u1c88\12\0\1\u0386"+
+ "\41\0\2\u0384\5\0\1\u1c89\11\0\1\u0386\41\0\2\u0384"+
+ "\6\0\1\u1c8a\10\0\1\u0386\41\0\2\u0384\7\0\1\u1c8b"+
+ "\7\0\1\u0386\41\0\2\u0384\10\0\1\u1c8c\6\0\1\u0386"+
+ "\41\0\2\u0384\11\0\1\u1c8d\5\0\1\u0386\41\0\2\u0384"+
+ "\12\0\1\u1c8e\4\0\1\u0386\41\0\2\u0384\13\0\1\u1c8f"+
+ "\3\0\1\u0386\41\0\2\u0384\14\0\1\u1c90\2\0\1\u0386"+
+ "\41\0\2\u0384\15\0\1\u1c91\1\0\1\u0386\41\0\1\u0312"+
+ "\1\u0313\1\0\1\u1c92\15\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\2\0\1\u1c93\14\0\1\u0315\41\0\1\u0312\1\u0313\3\0"+
+ "\1\u1c94\13\0\1\u0315\41\0\1\u0312\1\u0313\4\0\1\u1c95"+
+ "\12\0\1\u0315\41\0\1\u0312\1\u0313\5\0\1\u1c96\11\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\6\0\1\u1c97\10\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\7\0\1\u1c98\7\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\10\0\1\u1c99\6\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\11\0\1\u1c9a\5\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\12\0\1\u1c9b\4\0\1\u0315\41\0\1\u0312\1\u0313\13\0"+
+ "\1\u1c9c\3\0\1\u0315\41\0\1\u0312\1\u0313\14\0\1\u1c9d"+
+ "\2\0\1\u0315\41\0\1\u0312\1\u0313\15\0\1\u1c9e\1\0"+
+ "\1\u0315\41\0\2\u03a1\1\0\1\u1c9f\15\0\1\u03a3\41\0"+
+ "\2\u03a1\2\0\1\u1ca0\14\0\1\u03a3\41\0\2\u03a1\3\0"+
+ "\1\u1ca1\13\0\1\u03a3\41\0\2\u03a1\4\0\1\u1ca2\12\0"+
+ "\1\u03a3\41\0\2\u03a1\5\0\1\u1ca3\11\0\1\u03a3\41\0"+
+ "\2\u03a1\6\0\1\u1ca4\10\0\1\u03a3\41\0\2\u03a1\7\0"+
+ "\1\u1ca5\7\0\1\u03a3\41\0\2\u03a1\10\0\1\u1ca6\6\0"+
+ "\1\u03a3\41\0\2\u03a1\11\0\1\u1ca7\5\0\1\u03a3\41\0"+
+ "\2\u03a1\12\0\1\u1ca8\4\0\1\u03a3\41\0\2\u03a1\13\0"+
+ "\1\u1ca9\3\0\1\u03a3\41\0\2\u03a1\14\0\1\u1caa\2\0"+
+ "\1\u03a3\41\0\2\u03a1\15\0\1\u1cab\1\0\1\u03a3\40\0"+
+ "\1\276\1\u03b0\1\u03b1\1\276\1\u1cac\15\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\2\276\1\u1cad\14\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\3\276\1\u1cae\13\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\4\276\1\u1caf\12\276\1\u03b3\41\276\1\u03b0\1\u03b1\5\276"+
+ "\1\u1cb0\11\276\1\u03b3\41\276\1\u03b0\1\u03b1\6\276\1\u1cb1"+
+ "\10\276\1\u03b3\41\276\1\u03b0\1\u03b1\7\276\1\u1cb2\7\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\10\276\1\u1cb3\6\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\11\276\1\u1cb4\5\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\12\276\1\u1cb5\4\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\13\276\1\u1cb6\3\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\14\276\1\u1cb7\2\276\1\u03b3\41\276\1\u03b0\1\u03b1\15\276"+
+ "\1\u1cb8\1\276\1\u03b3\41\276\1\u033d\1\u033e\1\276\1\u1cb9"+
+ "\15\276\1\u0340\41\276\1\u033d\1\u033e\2\276\1\u1cba\14\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\3\276\1\u1cbb\13\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\4\276\1\u1cbc\12\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\5\276\1\u1cbd\11\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\6\276\1\u1cbe\10\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\7\276\1\u1cbf\7\276\1\u0340\41\276\1\u033d\1\u033e\10\276"+
+ "\1\u1cc0\6\276\1\u0340\41\276\1\u033d\1\u033e\11\276\1\u1cc1"+
+ "\5\276\1\u0340\41\276\1\u033d\1\u033e\12\276\1\u1cc2\4\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\13\276\1\u1cc3\3\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\14\276\1\u1cc4\2\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\15\276\1\u1cc5\1\276\1\u0340\41\276\1\300"+
+ "\1\u02bf\1\276\1\u1cc6\15\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\2\276\1\u1cc7\14\276\1\u02c1\40\276\1\263\1\u03cf\1\u03d0"+
+ "\1\263\1\u1cc8\1\263\1\u0136\13\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\2\263\1\u1cc9\1\u0136\13\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\1\u1cca\12\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\1\263\1\u1ccb\11\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\2\263\1\u1ccc\10\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\3\263\1\u1ccd\7\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\4\263\1\u1cce"+
+ "\6\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\5\263"+
+ "\1\u1ccf\5\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\6\263\1\u1cd0\4\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\7\263\1\u1cd1\3\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\10\263\1\u1cd2\2\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\11\263\1\u1cd3\1\263\1\u03d2\40\263"+
+ "\1\344\1\u03de\1\u03df\1\344\1\u1cd4\1\344\1\u017c\13\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\2\344\1\u1cd5\1\u017c\13\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\1\u1cd6\12\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\1\344\1\u1cd7"+
+ "\11\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\2\344"+
+ "\1\u1cd8\10\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\3\344\1\u1cd9\7\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\4\344\1\u1cda\6\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\5\344\1\u1cdb\5\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\6\344\1\u1cdc\4\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\7\344\1\u1cdd\3\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\10\344\1\u1cde\2\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\11\344\1\u1cdf"+
+ "\1\344\1\u03e1\40\344\1\276\1\300\1\u02bf\3\276\1\u1ce0"+
+ "\13\276\1\u02c1\41\276\1\300\1\u02bf\4\276\1\u1ce1\12\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\5\276\1\u1ce2\11\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\6\276\1\u1ce3\10\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\7\276\1\u1ce4\7\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\10\276\1\u1ce5\6\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\11\276\1\u1ce6\5\276\1\u02c1\41\276\1\300\1\u02bf\12\276"+
+ "\1\u1ce7\4\276\1\u02c1\41\276\1\300\1\u02bf\13\276\1\u1ce8"+
+ "\3\276\1\u02c1\41\276\1\300\1\u02bf\14\276\1\u1ce9\2\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\15\276\1\u1cea\1\276\1\u02c1"+
+ "\40\276\1\0\2\u0384\1\0\1\u1ceb\15\0\1\u0386\41\0"+
+ "\2\u0384\2\0\1\u1cec\14\0\1\u0386\41\0\2\u0384\3\0"+
+ "\1\u1ced\13\0\1\u0386\41\0\2\u0384\4\0\1\u1cee\12\0"+
+ "\1\u0386\41\0\2\u0384\5\0\1\u1cef\11\0\1\u0386\41\0"+
+ "\2\u0384\6\0\1\u1cf0\10\0\1\u0386\41\0\2\u0384\7\0"+
+ "\1\u1cf1\7\0\1\u0386\41\0\2\u0384\10\0\1\u1cf2\6\0"+
+ "\1\u0386\41\0\2\u0384\11\0\1\u1cf3\5\0\1\u0386\41\0"+
+ "\2\u0384\12\0\1\u1cf4\4\0\1\u0386\41\0\2\u0384\13\0"+
+ "\1\u1cf5\3\0\1\u0386\41\0\2\u0384\14\0\1\u1cf6\2\0"+
+ "\1\u0386\41\0\2\u0384\15\0\1\u1cf7\1\0\1\u0386\41\0"+
+ "\1\u0312\1\u0313\1\0\1\u1cf8\15\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\2\0\1\u1cf9\14\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\3\0\1\u1cfa\13\0\1\u0315\41\0\1\u0312\1\u0313\4\0"+
+ "\1\u1cfb\12\0\1\u0315\41\0\1\u0312\1\u0313\5\0\1\u1cfc"+
+ "\11\0\1\u0315\41\0\1\u0312\1\u0313\6\0\1\u1cfd\10\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\7\0\1\u1cfe\7\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\10\0\1\u1cff\6\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\11\0\1\u1d00\5\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\12\0\1\u1d01\4\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\13\0\1\u1d02\3\0\1\u0315\41\0\1\u0312\1\u0313\14\0"+
+ "\1\u1d03\2\0\1\u0315\41\0\1\u0312\1\u0313\15\0\1\u1d04"+
+ "\1\0\1\u0315\41\0\2\u03a1\1\0\1\u1d05\15\0\1\u03a3"+
+ "\41\0\2\u03a1\2\0\1\u1d06\14\0\1\u03a3\41\0\2\u03a1"+
+ "\3\0\1\u1d07\13\0\1\u03a3\41\0\2\u03a1\4\0\1\u1d08"+
+ "\12\0\1\u03a3\41\0\2\u03a1\5\0\1\u1d09\11\0\1\u03a3"+
+ "\41\0\2\u03a1\6\0\1\u1d0a\10\0\1\u03a3\41\0\2\u03a1"+
+ "\7\0\1\u1d0b\7\0\1\u03a3\41\0\2\u03a1\10\0\1\u1d0c"+
+ "\6\0\1\u03a3\41\0\2\u03a1\11\0\1\u1d0d\5\0\1\u03a3"+
+ "\41\0\2\u03a1\12\0\1\u1d0e\4\0\1\u03a3\41\0\2\u03a1"+
+ "\13\0\1\u1d0f\3\0\1\u03a3\41\0\2\u03a1\14\0\1\u1d10"+
+ "\2\0\1\u03a3\41\0\2\u03a1\15\0\1\u1d11\1\0\1\u03a3"+
+ "\40\0\1\276\1\u03b0\1\u03b1\1\276\1\u1d12\15\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\2\276\1\u1d13\14\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\3\276\1\u1d14\13\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\4\276\1\u1d15\12\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\5\276\1\u1d16\11\276\1\u03b3\41\276\1\u03b0\1\u03b1\6\276"+
+ "\1\u1d17\10\276\1\u03b3\41\276\1\u03b0\1\u03b1\7\276\1\u1d18"+
+ "\7\276\1\u03b3\41\276\1\u03b0\1\u03b1\10\276\1\u1d19\6\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\11\276\1\u1d1a\5\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\12\276\1\u1d1b\4\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\13\276\1\u1d1c\3\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\14\276\1\u1d1d\2\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\15\276\1\u1d1e\1\276\1\u03b3\41\276\1\u033d\1\u033e\1\276"+
+ "\1\u1d1f\15\276\1\u0340\41\276\1\u033d\1\u033e\2\276\1\u1d20"+
+ "\14\276\1\u0340\41\276\1\u033d\1\u033e\3\276\1\u1d21\13\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\4\276\1\u1d22\12\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\5\276\1\u1d23\11\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\6\276\1\u1d24\10\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\7\276\1\u1d25\7\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\10\276\1\u1d26\6\276\1\u0340\41\276\1\u033d\1\u033e\11\276"+
+ "\1\u1d27\5\276\1\u0340\41\276\1\u033d\1\u033e\12\276\1\u1d28"+
+ "\4\276\1\u0340\41\276\1\u033d\1\u033e\13\276\1\u1d29\3\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\14\276\1\u1d2a\2\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\15\276\1\u1d2b\1\276\1\u0340\41\276"+
+ "\1\300\1\u02bf\1\276\1\u1d2c\15\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\2\276\1\u1d2d\14\276\1\u02c1\40\276\1\263\1\u03cf"+
+ "\1\u03d0\1\263\1\u1d2e\1\263\1\u0136\13\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\2\263\1\u1d2f\1\u0136\13\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\1\u1d30\12\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\1\263\1\u1d31\11\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\2\263\1\u1d32\10\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\3\263\1\u1d33"+
+ "\7\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\4\263"+
+ "\1\u1d34\6\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\5\263\1\u1d35\5\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\6\263\1\u1d36\4\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\7\263\1\u1d37\3\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\10\263\1\u1d38\2\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\11\263\1\u1d39\1\263\1\u03d2"+
+ "\40\263\1\344\1\u03de\1\u03df\1\344\1\u1d3a\1\344\1\u017c"+
+ "\13\344\1\u03e1\41\344\1\u03de\1\u03df\2\344\1\u1d3b\1\u017c"+
+ "\13\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\1\u1d3c"+
+ "\12\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\1\344"+
+ "\1\u1d3d\11\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\2\344\1\u1d3e\10\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\3\344\1\u1d3f\7\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\4\344\1\u1d40\6\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\5\344\1\u1d41\5\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\6\344\1\u1d42\4\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\7\344\1\u1d43\3\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\10\344\1\u1d44"+
+ "\2\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\11\344"+
+ "\1\u1d45\1\344\1\u03e1\40\344\1\276\1\300\1\u02bf\3\276"+
+ "\1\u1d46\13\276\1\u02c1\41\276\1\300\1\u02bf\4\276\1\u1d47"+
+ "\12\276\1\u02c1\41\276\1\300\1\u02bf\5\276\1\u1d48\11\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\6\276\1\u1d49\10\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\7\276\1\u1d4a\7\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\10\276\1\u1d4b\6\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\11\276\1\u1d4c\5\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\12\276\1\u1d4d\4\276\1\u02c1\41\276\1\300\1\u02bf\13\276"+
+ "\1\u1d4e\3\276\1\u02c1\41\276\1\300\1\u02bf\14\276\1\u1d4f"+
+ "\2\276\1\u02c1\41\276\1\300\1\u02bf\15\276\1\u1d50\1\276"+
+ "\1\u02c1\40\276\1\0\2\u0384\1\0\1\u1d51\15\0\1\u0386"+
+ "\41\0\2\u0384\2\0\1\u1d52\14\0\1\u0386\41\0\2\u0384"+
+ "\3\0\1\u1d53\13\0\1\u0386\41\0\2\u0384\4\0\1\u1d54"+
+ "\12\0\1\u0386\41\0\2\u0384\5\0\1\u1d55\11\0\1\u0386"+
+ "\41\0\2\u0384\6\0\1\u1d56\10\0\1\u0386\41\0\2\u0384"+
+ "\7\0\1\u1d57\7\0\1\u0386\41\0\2\u0384\10\0\1\u1d58"+
+ "\6\0\1\u0386\41\0\2\u0384\11\0\1\u1d59\5\0\1\u0386"+
+ "\41\0\2\u0384\12\0\1\u1d5a\4\0\1\u0386\41\0\2\u0384"+
+ "\13\0\1\u1d5b\3\0\1\u0386\41\0\2\u0384\14\0\1\u1d5c"+
+ "\2\0\1\u0386\41\0\2\u0384\15\0\1\u1d5d\1\0\1\u0386"+
+ "\41\0\1\u0312\1\u0313\1\0\1\u1d5e\15\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\2\0\1\u1d5f\14\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\3\0\1\u1d60\13\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\4\0\1\u1d61\12\0\1\u0315\41\0\1\u0312\1\u0313\5\0"+
+ "\1\u1d62\11\0\1\u0315\41\0\1\u0312\1\u0313\6\0\1\u1d63"+
+ "\10\0\1\u0315\41\0\1\u0312\1\u0313\7\0\1\u1d64\7\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\10\0\1\u1d65\6\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\11\0\1\u1d66\5\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\12\0\1\u1d67\4\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\13\0\1\u1d68\3\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\14\0\1\u1d69\2\0\1\u0315\41\0\1\u0312\1\u0313\15\0"+
+ "\1\u1d6a\1\0\1\u0315\41\0\2\u03a1\1\0\1\u1d6b\15\0"+
+ "\1\u03a3\41\0\2\u03a1\2\0\1\u1d6c\14\0\1\u03a3\41\0"+
+ "\2\u03a1\3\0\1\u1d6d\13\0\1\u03a3\41\0\2\u03a1\4\0"+
+ "\1\u1d6e\12\0\1\u03a3\41\0\2\u03a1\5\0\1\u1d6f\11\0"+
+ "\1\u03a3\41\0\2\u03a1\6\0\1\u1d70\10\0\1\u03a3\41\0"+
+ "\2\u03a1\7\0\1\u1d71\7\0\1\u03a3\41\0\2\u03a1\10\0"+
+ "\1\u1d72\6\0\1\u03a3\41\0\2\u03a1\11\0\1\u1d73\5\0"+
+ "\1\u03a3\41\0\2\u03a1\12\0\1\u1d74\4\0\1\u03a3\41\0"+
+ "\2\u03a1\13\0\1\u1d75\3\0\1\u03a3\41\0\2\u03a1\14\0"+
+ "\1\u1d76\2\0\1\u03a3\41\0\2\u03a1\15\0\1\u1d77\1\0"+
+ "\1\u03a3\40\0\1\276\1\u03b0\1\u03b1\1\276\1\u1d78\15\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\2\276\1\u1d79\14\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\3\276\1\u1d7a\13\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\4\276\1\u1d7b\12\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\5\276\1\u1d7c\11\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\6\276\1\u1d7d\10\276\1\u03b3\41\276\1\u03b0\1\u03b1\7\276"+
+ "\1\u1d7e\7\276\1\u03b3\41\276\1\u03b0\1\u03b1\10\276\1\u1d7f"+
+ "\6\276\1\u03b3\41\276\1\u03b0\1\u03b1\11\276\1\u1d80\5\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\12\276\1\u1d81\4\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\13\276\1\u1d82\3\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\14\276\1\u1d83\2\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\15\276\1\u1d84\1\276\1\u03b3\41\276\1\u033d\1\u033e"+
+ "\1\276\1\u1d85\15\276\1\u0340\41\276\1\u033d\1\u033e\2\276"+
+ "\1\u1d86\14\276\1\u0340\41\276\1\u033d\1\u033e\3\276\1\u1d87"+
+ "\13\276\1\u0340\41\276\1\u033d\1\u033e\4\276\1\u1d88\12\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\5\276\1\u1d89\11\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\6\276\1\u1d8a\10\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\7\276\1\u1d8b\7\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\10\276\1\u1d8c\6\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\11\276\1\u1d8d\5\276\1\u0340\41\276\1\u033d\1\u033e\12\276"+
+ "\1\u1d8e\4\276\1\u0340\41\276\1\u033d\1\u033e\13\276\1\u1d8f"+
+ "\3\276\1\u0340\41\276\1\u033d\1\u033e\14\276\1\u1d90\2\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\15\276\1\u1d91\1\276\1\u0340"+
+ "\41\276\1\300\1\u02bf\1\276\1\u1d92\15\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\2\276\1\u1d93\14\276\1\u02c1\40\276\1\263"+
+ "\1\u03cf\1\u03d0\1\263\1\u1d94\1\263\1\u0136\13\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\2\263\1\u1d95\1\u0136\13\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\u1d96\12\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\263\1\u1d97\11\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\2\263\1\u1d98"+
+ "\10\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\3\263"+
+ "\1\u1d99\7\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\4\263\1\u1d9a\6\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\5\263\1\u1d9b\5\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\6\263\1\u1d9c\4\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\7\263\1\u1d9d\3\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\10\263\1\u1d9e\2\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\11\263\1\u1d9f\1\263"+
+ "\1\u03d2\40\263\1\344\1\u03de\1\u03df\1\344\1\u1da0\1\344"+
+ "\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df\2\344\1\u1da1"+
+ "\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\1\u1da2\12\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\1\344\1\u1da3\11\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\2\344\1\u1da4\10\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\3\344\1\u1da5\7\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\4\344\1\u1da6\6\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\5\344\1\u1da7\5\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\6\344\1\u1da8\4\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\7\344\1\u1da9"+
+ "\3\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\10\344"+
+ "\1\u1daa\2\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\11\344\1\u1dab\1\344\1\u03e1\40\344\1\276\1\300\1\u02bf"+
+ "\3\276\1\u1dac\13\276\1\u02c1\41\276\1\300\1\u02bf\4\276"+
+ "\1\u1dad\12\276\1\u02c1\41\276\1\300\1\u02bf\5\276\1\u1dae"+
+ "\11\276\1\u02c1\41\276\1\300\1\u02bf\6\276\1\u1daf\10\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\7\276\1\u1db0\7\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\10\276\1\u1db1\6\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\11\276\1\u1db2\5\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\12\276\1\u1db3\4\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\13\276\1\u1db4\3\276\1\u02c1\41\276\1\300\1\u02bf\14\276"+
+ "\1\u1db5\2\276\1\u02c1\41\276\1\300\1\u02bf\15\276\1\u1db6"+
+ "\1\276\1\u02c1\40\276\1\0\2\u0384\1\0\1\u1db7\15\0"+
+ "\1\u0386\41\0\2\u0384\2\0\1\u1db8\14\0\1\u0386\41\0"+
+ "\2\u0384\3\0\1\u1db9\13\0\1\u0386\41\0\2\u0384\4\0"+
+ "\1\u1dba\12\0\1\u0386\41\0\2\u0384\5\0\1\u1dbb\11\0"+
+ "\1\u0386\41\0\2\u0384\6\0\1\u1dbc\10\0\1\u0386\41\0"+
+ "\2\u0384\7\0\1\u1dbd\7\0\1\u0386\41\0\2\u0384\10\0"+
+ "\1\u1dbe\6\0\1\u0386\41\0\2\u0384\11\0\1\u1dbf\5\0"+
+ "\1\u0386\41\0\2\u0384\12\0\1\u1dc0\4\0\1\u0386\41\0"+
+ "\2\u0384\13\0\1\u1dc1\3\0\1\u0386\41\0\2\u0384\14\0"+
+ "\1\u1dc2\2\0\1\u0386\41\0\2\u0384\15\0\1\u1dc3\1\0"+
+ "\1\u0386\41\0\1\u0312\1\u0313\1\0\1\u1dc4\15\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\2\0\1\u1dc5\14\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\3\0\1\u1dc6\13\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\4\0\1\u1dc7\12\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\5\0\1\u1dc8\11\0\1\u0315\41\0\1\u0312\1\u0313\6\0"+
+ "\1\u1dc9\10\0\1\u0315\41\0\1\u0312\1\u0313\7\0\1\u1dca"+
+ "\7\0\1\u0315\41\0\1\u0312\1\u0313\10\0\1\u1dcb\6\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\11\0\1\u1dcc\5\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\12\0\1\u1dcd\4\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\13\0\1\u1dce\3\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\14\0\1\u1dcf\2\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\15\0\1\u1dd0\1\0\1\u0315\41\0\2\u03a1\1\0\1\u1dd1"+
+ "\15\0\1\u03a3\41\0\2\u03a1\2\0\1\u1dd2\14\0\1\u03a3"+
+ "\41\0\2\u03a1\3\0\1\u1dd3\13\0\1\u03a3\41\0\2\u03a1"+
+ "\4\0\1\u1dd4\12\0\1\u03a3\41\0\2\u03a1\5\0\1\u1dd5"+
+ "\11\0\1\u03a3\41\0\2\u03a1\6\0\1\u1dd6\10\0\1\u03a3"+
+ "\41\0\2\u03a1\7\0\1\u1dd7\7\0\1\u03a3\41\0\2\u03a1"+
+ "\10\0\1\u1dd8\6\0\1\u03a3\41\0\2\u03a1\11\0\1\u1dd9"+
+ "\5\0\1\u03a3\41\0\2\u03a1\12\0\1\u1dda\4\0\1\u03a3"+
+ "\41\0\2\u03a1\13\0\1\u1ddb\3\0\1\u03a3\41\0\2\u03a1"+
+ "\14\0\1\u1ddc\2\0\1\u03a3\41\0\2\u03a1\15\0\1\u1ddd"+
+ "\1\0\1\u03a3\40\0\1\276\1\u03b0\1\u03b1\1\276\1\u1dde"+
+ "\15\276\1\u03b3\41\276\1\u03b0\1\u03b1\2\276\1\u1ddf\14\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\3\276\1\u1de0\13\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\4\276\1\u1de1\12\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\5\276\1\u1de2\11\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\6\276\1\u1de3\10\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\7\276\1\u1de4\7\276\1\u03b3\41\276\1\u03b0\1\u03b1\10\276"+
+ "\1\u1de5\6\276\1\u03b3\41\276\1\u03b0\1\u03b1\11\276\1\u1de6"+
+ "\5\276\1\u03b3\41\276\1\u03b0\1\u03b1\12\276\1\u1de7\4\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\13\276\1\u1de8\3\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\14\276\1\u1de9\2\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\15\276\1\u1dea\1\276\1\u03b3\41\276\1\u033d"+
+ "\1\u033e\1\276\1\u1deb\15\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\2\276\1\u1dec\14\276\1\u0340\41\276\1\u033d\1\u033e\3\276"+
+ "\1\u1ded\13\276\1\u0340\41\276\1\u033d\1\u033e\4\276\1\u1dee"+
+ "\12\276\1\u0340\41\276\1\u033d\1\u033e\5\276\1\u1def\11\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\6\276\1\u1df0\10\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\7\276\1\u1df1\7\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\10\276\1\u1df2\6\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\11\276\1\u1df3\5\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\12\276\1\u1df4\4\276\1\u0340\41\276\1\u033d\1\u033e\13\276"+
+ "\1\u1df5\3\276\1\u0340\41\276\1\u033d\1\u033e\14\276\1\u1df6"+
+ "\2\276\1\u0340\41\276\1\u033d\1\u033e\15\276\1\u1df7\1\276"+
+ "\1\u0340\41\276\1\300\1\u02bf\1\276\1\u1df8\15\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\2\276\1\u1df9\14\276\1\u02c1\40\276"+
+ "\1\263\1\u03cf\1\u03d0\1\263\1\u1dfa\1\263\1\u0136\13\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\2\263\1\u1dfb\1\u0136\13\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\u1dfc\12\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\263\1\u1dfd"+
+ "\11\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\2\263"+
+ "\1\u1dfe\10\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\3\263\1\u1dff\7\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\4\263\1\u1e00\6\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\5\263\1\u1e01\5\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\6\263\1\u1e02\4\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\7\263\1\u1e03\3\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\10\263\1\u1e04\2\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\11\263\1\u1e05"+
+ "\1\263\1\u03d2\40\263\1\344\1\u03de\1\u03df\1\344\1\u1e06"+
+ "\1\344\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df\2\344"+
+ "\1\u1e07\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\1\u1e08\12\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\1\344\1\u1e09\11\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\2\344\1\u1e0a\10\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\3\344\1\u1e0b\7\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\4\344\1\u1e0c\6\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\5\344\1\u1e0d\5\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\6\344\1\u1e0e"+
+ "\4\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\7\344"+
+ "\1\u1e0f\3\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\10\344\1\u1e10\2\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\11\344\1\u1e11\1\344\1\u03e1\40\344\1\276\1\300"+
+ "\1\u02bf\3\276\1\u1e12\13\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\4\276\1\u1e13\12\276\1\u02c1\41\276\1\300\1\u02bf\5\276"+
+ "\1\u1e14\11\276\1\u02c1\41\276\1\300\1\u02bf\6\276\1\u1e15"+
+ "\10\276\1\u02c1\41\276\1\300\1\u02bf\7\276\1\u1e16\7\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\10\276\1\u1e17\6\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\11\276\1\u1e18\5\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\12\276\1\u1e19\4\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\13\276\1\u1e1a\3\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\14\276\1\u1e1b\2\276\1\u02c1\41\276\1\300\1\u02bf\15\276"+
+ "\1\u1e1c\1\276\1\u02c1\40\276\1\0\2\u0384\1\0\1\u1e1d"+
+ "\15\0\1\u0386\41\0\2\u0384\2\0\1\u1e1e\14\0\1\u0386"+
+ "\41\0\2\u0384\3\0\1\u1e1f\13\0\1\u0386\41\0\2\u0384"+
+ "\4\0\1\u1e20\12\0\1\u0386\41\0\2\u0384\5\0\1\u1e21"+
+ "\11\0\1\u0386\41\0\2\u0384\6\0\1\u1e22\10\0\1\u0386"+
+ "\41\0\2\u0384\7\0\1\u1e23\7\0\1\u0386\41\0\2\u0384"+
+ "\10\0\1\u1e24\6\0\1\u0386\41\0\2\u0384\11\0\1\u1e25"+
+ "\5\0\1\u0386\41\0\2\u0384\12\0\1\u1e26\4\0\1\u0386"+
+ "\41\0\2\u0384\13\0\1\u1e27\3\0\1\u0386\41\0\2\u0384"+
+ "\14\0\1\u1e28\2\0\1\u0386\41\0\2\u0384\15\0\1\u1e29"+
+ "\1\0\1\u0386\41\0\1\u0312\1\u0313\1\0\1\u1e2a\15\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\2\0\1\u1e2b\14\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\3\0\1\u1e2c\13\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\4\0\1\u1e2d\12\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\5\0\1\u1e2e\11\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\6\0\1\u1e2f\10\0\1\u0315\41\0\1\u0312\1\u0313\7\0"+
+ "\1\u1e30\7\0\1\u0315\41\0\1\u0312\1\u0313\10\0\1\u1e31"+
+ "\6\0\1\u0315\41\0\1\u0312\1\u0313\11\0\1\u1e32\5\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\12\0\1\u1e33\4\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\13\0\1\u1e34\3\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\14\0\1\u1e35\2\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\15\0\1\u1e36\1\0\1\u0315\41\0\2\u03a1\1\0"+
+ "\1\u1e37\15\0\1\u03a3\41\0\2\u03a1\2\0\1\u1e38\14\0"+
+ "\1\u03a3\41\0\2\u03a1\3\0\1\u1e39\13\0\1\u03a3\41\0"+
+ "\2\u03a1\4\0\1\u1e3a\12\0\1\u03a3\41\0\2\u03a1\5\0"+
+ "\1\u1e3b\11\0\1\u03a3\41\0\2\u03a1\6\0\1\u1e3c\10\0"+
+ "\1\u03a3\41\0\2\u03a1\7\0\1\u1e3d\7\0\1\u03a3\41\0"+
+ "\2\u03a1\10\0\1\u1e3e\6\0\1\u03a3\41\0\2\u03a1\11\0"+
+ "\1\u1e3f\5\0\1\u03a3\41\0\2\u03a1\12\0\1\u1e40\4\0"+
+ "\1\u03a3\41\0\2\u03a1\13\0\1\u1e41\3\0\1\u03a3\41\0"+
+ "\2\u03a1\14\0\1\u1e42\2\0\1\u03a3\41\0\2\u03a1\15\0"+
+ "\1\u1e43\1\0\1\u03a3\40\0\1\276\1\u03b0\1\u03b1\1\276"+
+ "\1\u1e44\15\276\1\u03b3\41\276\1\u03b0\1\u03b1\2\276\1\u1e45"+
+ "\14\276\1\u03b3\41\276\1\u03b0\1\u03b1\3\276\1\u1e46\13\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\4\276\1\u1e47\12\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\5\276\1\u1e48\11\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\6\276\1\u1e49\10\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\7\276\1\u1e4a\7\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\10\276\1\u1e4b\6\276\1\u03b3\41\276\1\u03b0\1\u03b1\11\276"+
+ "\1\u1e4c\5\276\1\u03b3\41\276\1\u03b0\1\u03b1\12\276\1\u1e4d"+
+ "\4\276\1\u03b3\41\276\1\u03b0\1\u03b1\13\276\1\u1e4e\3\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\14\276\1\u1e4f\2\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\15\276\1\u1e50\1\276\1\u03b3\41\276"+
+ "\1\u033d\1\u033e\1\276\1\u1e51\15\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\2\276\1\u1e52\14\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\3\276\1\u1e53\13\276\1\u0340\41\276\1\u033d\1\u033e\4\276"+
+ "\1\u1e54\12\276\1\u0340\41\276\1\u033d\1\u033e\5\276\1\u1e55"+
+ "\11\276\1\u0340\41\276\1\u033d\1\u033e\6\276\1\u1e56\10\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\7\276\1\u1e57\7\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\10\276\1\u1e58\6\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\11\276\1\u1e59\5\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\12\276\1\u1e5a\4\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\13\276\1\u1e5b\3\276\1\u0340\41\276\1\u033d\1\u033e\14\276"+
+ "\1\u1e5c\2\276\1\u0340\41\276\1\u033d\1\u033e\15\276\1\u1e5d"+
+ "\1\276\1\u0340\41\276\1\300\1\u02bf\1\276\1\u1e5e\15\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\2\276\1\u1e5f\14\276\1\u02c1"+
+ "\40\276\1\263\1\u03cf\1\u03d0\1\263\1\u1e60\1\263\1\u0136"+
+ "\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\2\263\1\u1e61\1\u0136"+
+ "\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\u1e62"+
+ "\12\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\263"+
+ "\1\u1e63\11\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\2\263\1\u1e64\10\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\3\263\1\u1e65\7\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\4\263\1\u1e66\6\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\5\263\1\u1e67\5\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\6\263\1\u1e68\4\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\7\263\1\u1e69\3\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\10\263\1\u1e6a"+
+ "\2\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\11\263"+
+ "\1\u1e6b\1\263\1\u03d2\40\263\1\344\1\u03de\1\u03df\1\344"+
+ "\1\u1e6c\1\344\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\2\344\1\u1e6d\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\1\u1e6e\12\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\1\344\1\u1e6f\11\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\2\344\1\u1e70\10\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\3\344\1\u1e71\7\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\4\344\1\u1e72\6\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\5\344\1\u1e73"+
+ "\5\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\6\344"+
+ "\1\u1e74\4\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\7\344\1\u1e75\3\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\10\344\1\u1e76\2\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\11\344\1\u1e77\1\344\1\u03e1\40\344\1\276"+
+ "\1\300\1\u02bf\3\276\1\u1e78\13\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\4\276\1\u1e79\12\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\5\276\1\u1e7a\11\276\1\u02c1\41\276\1\300\1\u02bf\6\276"+
+ "\1\u1e7b\10\276\1\u02c1\41\276\1\300\1\u02bf\7\276\1\u1e7c"+
+ "\7\276\1\u02c1\41\276\1\300\1\u02bf\10\276\1\u1e7d\6\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\11\276\1\u1e7e\5\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\12\276\1\u1e7f\4\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\13\276\1\u1e80\3\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\14\276\1\u1e81\2\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\15\276\1\u1e82\1\276\1\u02c1\40\276\1\0\2\u0384\1\0"+
+ "\1\u1e83\15\0\1\u0386\41\0\2\u0384\2\0\1\u1e84\14\0"+
+ "\1\u0386\41\0\2\u0384\3\0\1\u1e85\13\0\1\u0386\41\0"+
+ "\2\u0384\4\0\1\u1e86\12\0\1\u0386\41\0\2\u0384\5\0"+
+ "\1\u1e87\11\0\1\u0386\41\0\2\u0384\6\0\1\u1e88\10\0"+
+ "\1\u0386\41\0\2\u0384\7\0\1\u1e89\7\0\1\u0386\41\0"+
+ "\2\u0384\10\0\1\u1e8a\6\0\1\u0386\41\0\2\u0384\11\0"+
+ "\1\u1e8b\5\0\1\u0386\41\0\2\u0384\12\0\1\u1e8c\4\0"+
+ "\1\u0386\41\0\2\u0384\13\0\1\u1e8d\3\0\1\u0386\41\0"+
+ "\2\u0384\14\0\1\u1e8e\2\0\1\u0386\41\0\2\u0384\15\0"+
+ "\1\u1e8f\1\0\1\u0386\41\0\1\u0312\1\u0313\1\0\1\u1e90"+
+ "\15\0\1\u0315\41\0\1\u0312\1\u0313\2\0\1\u1e91\14\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\3\0\1\u1e92\13\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\4\0\1\u1e93\12\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\5\0\1\u1e94\11\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\6\0\1\u1e95\10\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\7\0\1\u1e96\7\0\1\u0315\41\0\1\u0312\1\u0313\10\0"+
+ "\1\u1e97\6\0\1\u0315\41\0\1\u0312\1\u0313\11\0\1\u1e98"+
+ "\5\0\1\u0315\41\0\1\u0312\1\u0313\12\0\1\u1e99\4\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\13\0\1\u1e9a\3\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\14\0\1\u1e9b\2\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\15\0\1\u1e9c\1\0\1\u0315\41\0\2\u03a1"+
+ "\1\0\1\u1e9d\15\0\1\u03a3\41\0\2\u03a1\2\0\1\u1e9e"+
+ "\14\0\1\u03a3\41\0\2\u03a1\3\0\1\u1e9f\13\0\1\u03a3"+
+ "\41\0\2\u03a1\4\0\1\u1ea0\12\0\1\u03a3\41\0\2\u03a1"+
+ "\5\0\1\u1ea1\11\0\1\u03a3\41\0\2\u03a1\6\0\1\u1ea2"+
+ "\10\0\1\u03a3\41\0\2\u03a1\7\0\1\u1ea3\7\0\1\u03a3"+
+ "\41\0\2\u03a1\10\0\1\u1ea4\6\0\1\u03a3\41\0\2\u03a1"+
+ "\11\0\1\u1ea5\5\0\1\u03a3\41\0\2\u03a1\12\0\1\u1ea6"+
+ "\4\0\1\u03a3\41\0\2\u03a1\13\0\1\u1ea7\3\0\1\u03a3"+
+ "\41\0\2\u03a1\14\0\1\u1ea8\2\0\1\u03a3\41\0\2\u03a1"+
+ "\15\0\1\u1ea9\1\0\1\u03a3\40\0\1\276\1\u03b0\1\u03b1"+
+ "\1\276\1\u1eaa\15\276\1\u03b3\41\276\1\u03b0\1\u03b1\2\276"+
+ "\1\u1eab\14\276\1\u03b3\41\276\1\u03b0\1\u03b1\3\276\1\u1eac"+
+ "\13\276\1\u03b3\41\276\1\u03b0\1\u03b1\4\276\1\u1ead\12\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\5\276\1\u1eae\11\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\6\276\1\u1eaf\10\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\7\276\1\u1eb0\7\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\10\276\1\u1eb1\6\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\11\276\1\u1eb2\5\276\1\u03b3\41\276\1\u03b0\1\u03b1\12\276"+
+ "\1\u1eb3\4\276\1\u03b3\41\276\1\u03b0\1\u03b1\13\276\1\u1eb4"+
+ "\3\276\1\u03b3\41\276\1\u03b0\1\u03b1\14\276\1\u1eb5\2\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\15\276\1\u1eb6\1\276\1\u03b3"+
+ "\41\276\1\u033d\1\u033e\1\276\1\u1eb7\15\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\2\276\1\u1eb8\14\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\3\276\1\u1eb9\13\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\4\276\1\u1eba\12\276\1\u0340\41\276\1\u033d\1\u033e\5\276"+
+ "\1\u1ebb\11\276\1\u0340\41\276\1\u033d\1\u033e\6\276\1\u1ebc"+
+ "\10\276\1\u0340\41\276\1\u033d\1\u033e\7\276\1\u1ebd\7\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\10\276\1\u1ebe\6\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\11\276\1\u1ebf\5\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\12\276\1\u1ec0\4\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\13\276\1\u1ec1\3\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\14\276\1\u1ec2\2\276\1\u0340\41\276\1\u033d\1\u033e\15\276"+
+ "\1\u1ec3\1\276\1\u0340\41\276\1\300\1\u02bf\1\276\1\u1ec4"+
+ "\15\276\1\u02c1\41\276\1\300\1\u02bf\2\276\1\u1ec5\14\276"+
+ "\1\u02c1\40\276\1\263\1\u03cf\1\u03d0\1\263\1\u1ec6\1\263"+
+ "\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\2\263\1\u1ec7"+
+ "\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\1\u1ec8\12\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\1\263\1\u1ec9\11\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\2\263\1\u1eca\10\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\3\263\1\u1ecb\7\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\4\263\1\u1ecc\6\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\5\263\1\u1ecd\5\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\6\263\1\u1ece\4\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\7\263\1\u1ecf"+
+ "\3\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\10\263"+
+ "\1\u1ed0\2\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\11\263\1\u1ed1\1\263\1\u03d2\40\263\1\344\1\u03de\1\u03df"+
+ "\1\344\1\u1ed2\1\344\1\u017c\13\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\2\344\1\u1ed3\1\u017c\13\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\1\u1ed4\12\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\1\344\1\u1ed5\11\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\2\344\1\u1ed6\10\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\3\344\1\u1ed7\7\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\4\344\1\u1ed8"+
+ "\6\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\5\344"+
+ "\1\u1ed9\5\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\6\344\1\u1eda\4\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\7\344\1\u1edb\3\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\10\344\1\u1edc\2\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\11\344\1\u1edd\1\344\1\u03e1\40\344"+
+ "\1\276\1\300\1\u02bf\3\276\1\u1ede\13\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\4\276\1\u1edf\12\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\5\276\1\u1ee0\11\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\6\276\1\u1ee1\10\276\1\u02c1\41\276\1\300\1\u02bf\7\276"+
+ "\1\u1ee2\7\276\1\u02c1\41\276\1\300\1\u02bf\10\276\1\u1ee3"+
+ "\6\276\1\u02c1\41\276\1\300\1\u02bf\11\276\1\u1ee4\5\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\12\276\1\u1ee5\4\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\13\276\1\u1ee6\3\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\14\276\1\u1ee7\2\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\15\276\1\u1ee8\1\276\1\u02c1\40\276\1\0\2\u0384"+
+ "\1\0\1\u1ee9\15\0\1\u0386\41\0\2\u0384\2\0\1\u1eea"+
+ "\14\0\1\u0386\41\0\2\u0384\3\0\1\u1eeb\13\0\1\u0386"+
+ "\41\0\2\u0384\4\0\1\u1eec\12\0\1\u0386\41\0\2\u0384"+
+ "\5\0\1\u1eed\11\0\1\u0386\41\0\2\u0384\6\0\1\u1eee"+
+ "\10\0\1\u0386\41\0\2\u0384\7\0\1\u1eef\7\0\1\u0386"+
+ "\41\0\2\u0384\10\0\1\u1ef0\6\0\1\u0386\41\0\2\u0384"+
+ "\11\0\1\u1ef1\5\0\1\u0386\41\0\2\u0384\12\0\1\u1ef2"+
+ "\4\0\1\u0386\41\0\2\u0384\13\0\1\u1ef3\3\0\1\u0386"+
+ "\41\0\2\u0384\14\0\1\u1ef4\2\0\1\u0386\41\0\2\u0384"+
+ "\15\0\1\u1ef5\1\0\1\u0386\41\0\1\u0312\1\u0313\1\0"+
+ "\1\u1ef6\15\0\1\u0315\41\0\1\u0312\1\u0313\2\0\1\u1ef7"+
+ "\14\0\1\u0315\41\0\1\u0312\1\u0313\3\0\1\u1ef8\13\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\4\0\1\u1ef9\12\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\5\0\1\u1efa\11\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\6\0\1\u1efb\10\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\7\0\1\u1efc\7\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\10\0\1\u1efd\6\0\1\u0315\41\0\1\u0312\1\u0313\11\0"+
+ "\1\u1efe\5\0\1\u0315\41\0\1\u0312\1\u0313\12\0\1\u1eff"+
+ "\4\0\1\u0315\41\0\1\u0312\1\u0313\13\0\1\u1f00\3\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\14\0\1\u1f01\2\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\15\0\1\u1f02\1\0\1\u0315\41\0"+
+ "\2\u03a1\1\0\1\u1f03\15\0\1\u03a3\41\0\2\u03a1\2\0"+
+ "\1\u1f04\14\0\1\u03a3\41\0\2\u03a1\3\0\1\u1f05\13\0"+
+ "\1\u03a3\41\0\2\u03a1\4\0\1\u1f06\12\0\1\u03a3\41\0"+
+ "\2\u03a1\5\0\1\u1f07\11\0\1\u03a3\41\0\2\u03a1\6\0"+
+ "\1\u1f08\10\0\1\u03a3\41\0\2\u03a1\7\0\1\u1f09\7\0"+
+ "\1\u03a3\41\0\2\u03a1\10\0\1\u1f0a\6\0\1\u03a3\41\0"+
+ "\2\u03a1\11\0\1\u1f0b\5\0\1\u03a3\41\0\2\u03a1\12\0"+
+ "\1\u1f0c\4\0\1\u03a3\41\0\2\u03a1\13\0\1\u1f0d\3\0"+
+ "\1\u03a3\41\0\2\u03a1\14\0\1\u1f0e\2\0\1\u03a3\41\0"+
+ "\2\u03a1\15\0\1\u1f0f\1\0\1\u03a3\40\0\1\276\1\u03b0"+
+ "\1\u03b1\1\276\1\u1f10\15\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\2\276\1\u1f11\14\276\1\u03b3\41\276\1\u03b0\1\u03b1\3\276"+
+ "\1\u1f12\13\276\1\u03b3\41\276\1\u03b0\1\u03b1\4\276\1\u1f13"+
+ "\12\276\1\u03b3\41\276\1\u03b0\1\u03b1\5\276\1\u1f14\11\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\6\276\1\u1f15\10\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\7\276\1\u1f16\7\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\10\276\1\u1f17\6\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\11\276\1\u1f18\5\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\12\276\1\u1f19\4\276\1\u03b3\41\276\1\u03b0\1\u03b1\13\276"+
+ "\1\u1f1a\3\276\1\u03b3\41\276\1\u03b0\1\u03b1\14\276\1\u1f1b"+
+ "\2\276\1\u03b3\41\276\1\u03b0\1\u03b1\15\276\1\u1f1c\1\276"+
+ "\1\u03b3\41\276\1\u033d\1\u033e\1\276\1\u1f1d\15\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\2\276\1\u1f1e\14\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\3\276\1\u1f1f\13\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\4\276\1\u1f20\12\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\5\276\1\u1f21\11\276\1\u0340\41\276\1\u033d\1\u033e\6\276"+
+ "\1\u1f22\10\276\1\u0340\41\276\1\u033d\1\u033e\7\276\1\u1f23"+
+ "\7\276\1\u0340\41\276\1\u033d\1\u033e\10\276\1\u1f24\6\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\11\276\1\u1f25\5\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\12\276\1\u1f26\4\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\13\276\1\u1f27\3\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\14\276\1\u1f28\2\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\15\276\1\u1f29\1\276\1\u0340\41\276\1\300\1\u02bf\1\276"+
+ "\1\u1f2a\15\276\1\u02c1\41\276\1\300\1\u02bf\2\276\1\u1f2b"+
+ "\14\276\1\u02c1\40\276\1\263\1\u03cf\1\u03d0\1\263\1\u1f2c"+
+ "\1\263\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\2\263"+
+ "\1\u1f2d\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\1\u1f2e\12\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\1\263\1\u1f2f\11\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\2\263\1\u1f30\10\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\3\263\1\u1f31\7\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\4\263\1\u1f32\6\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\5\263\1\u1f33\5\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\6\263\1\u1f34"+
+ "\4\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\7\263"+
+ "\1\u1f35\3\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\10\263\1\u1f36\2\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\11\263\1\u1f37\1\263\1\u03d2\40\263\1\344\1\u03de"+
+ "\1\u03df\1\344\1\u1f38\1\344\1\u017c\13\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\2\344\1\u1f39\1\u017c\13\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\1\u1f3a\12\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\1\344\1\u1f3b\11\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\2\344\1\u1f3c\10\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\3\344\1\u1f3d"+
+ "\7\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\4\344"+
+ "\1\u1f3e\6\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\5\344\1\u1f3f\5\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\6\344\1\u1f40\4\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\7\344\1\u1f41\3\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\10\344\1\u1f42\2\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\11\344\1\u1f43\1\344\1\u03e1"+
+ "\40\344\1\276\1\300\1\u02bf\3\276\1\u1f44\13\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\4\276\1\u1f45\12\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\5\276\1\u1f46\11\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\6\276\1\u1f47\10\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\7\276\1\u1f48\7\276\1\u02c1\41\276\1\300\1\u02bf\10\276"+
+ "\1\u1f49\6\276\1\u02c1\41\276\1\300\1\u02bf\11\276\1\u1f4a"+
+ "\5\276\1\u02c1\41\276\1\300\1\u02bf\12\276\1\u1f4b\4\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\13\276\1\u1f4c\3\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\14\276\1\u1f4d\2\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\15\276\1\u1f4e\1\276\1\u02c1\40\276\1\0"+
+ "\2\u0384\1\0\1\u1f4f\15\0\1\u0386\41\0\2\u0384\2\0"+
+ "\1\u1f50\14\0\1\u0386\41\0\2\u0384\3\0\1\u1f51\13\0"+
+ "\1\u0386\41\0\2\u0384\4\0\1\u1f52\12\0\1\u0386\41\0"+
+ "\2\u0384\5\0\1\u1f53\11\0\1\u0386\41\0\2\u0384\6\0"+
+ "\1\u1f54\10\0\1\u0386\41\0\2\u0384\7\0\1\u1f55\7\0"+
+ "\1\u0386\41\0\2\u0384\10\0\1\u1f56\6\0\1\u0386\41\0"+
+ "\2\u0384\11\0\1\u1f57\5\0\1\u0386\41\0\2\u0384\12\0"+
+ "\1\u1f58\4\0\1\u0386\41\0\2\u0384\13\0\1\u1f59\3\0"+
+ "\1\u0386\41\0\2\u0384\14\0\1\u1f5a\2\0\1\u0386\41\0"+
+ "\2\u0384\15\0\1\u1f5b\1\0\1\u0386\41\0\1\u0312\1\u0313"+
+ "\1\0\1\u1f5c\15\0\1\u0315\41\0\1\u0312\1\u0313\2\0"+
+ "\1\u1f5d\14\0\1\u0315\41\0\1\u0312\1\u0313\3\0\1\u1f5e"+
+ "\13\0\1\u0315\41\0\1\u0312\1\u0313\4\0\1\u1f5f\12\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\5\0\1\u1f60\11\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\6\0\1\u1f61\10\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\7\0\1\u1f62\7\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\10\0\1\u1f63\6\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\11\0\1\u1f64\5\0\1\u0315\41\0\1\u0312\1\u0313\12\0"+
+ "\1\u1f65\4\0\1\u0315\41\0\1\u0312\1\u0313\13\0\1\u1f66"+
+ "\3\0\1\u0315\41\0\1\u0312\1\u0313\14\0\1\u1f67\2\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\15\0\1\u1f68\1\0\1\u0315"+
+ "\41\0\2\u03a1\1\0\1\u1f69\15\0\1\u03a3\41\0\2\u03a1"+
+ "\2\0\1\u1f6a\14\0\1\u03a3\41\0\2\u03a1\3\0\1\u1f6b"+
+ "\13\0\1\u03a3\41\0\2\u03a1\4\0\1\u1f6c\12\0\1\u03a3"+
+ "\41\0\2\u03a1\5\0\1\u1f6d\11\0\1\u03a3\41\0\2\u03a1"+
+ "\6\0\1\u1f6e\10\0\1\u03a3\41\0\2\u03a1\7\0\1\u1f6f"+
+ "\7\0\1\u03a3\41\0\2\u03a1\10\0\1\u1f70\6\0\1\u03a3"+
+ "\41\0\2\u03a1\11\0\1\u1f71\5\0\1\u03a3\41\0\2\u03a1"+
+ "\12\0\1\u1f72\4\0\1\u03a3\41\0\2\u03a1\13\0\1\u1f73"+
+ "\3\0\1\u03a3\41\0\2\u03a1\14\0\1\u1f74\2\0\1\u03a3"+
+ "\41\0\2\u03a1\15\0\1\u1f75\1\0\1\u03a3\40\0\1\276"+
+ "\1\u03b0\1\u03b1\1\276\1\u1f76\15\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\2\276\1\u1f77\14\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\3\276\1\u1f78\13\276\1\u03b3\41\276\1\u03b0\1\u03b1\4\276"+
+ "\1\u1f79\12\276\1\u03b3\41\276\1\u03b0\1\u03b1\5\276\1\u1f7a"+
+ "\11\276\1\u03b3\41\276\1\u03b0\1\u03b1\6\276\1\u1f7b\10\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\7\276\1\u1f7c\7\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\10\276\1\u1f7d\6\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\11\276\1\u1f7e\5\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\12\276\1\u1f7f\4\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\13\276\1\u1f80\3\276\1\u03b3\41\276\1\u03b0\1\u03b1\14\276"+
+ "\1\u1f81\2\276\1\u03b3\41\276\1\u03b0\1\u03b1\15\276\1\u1f82"+
+ "\1\276\1\u03b3\41\276\1\u033d\1\u033e\1\276\1\u1f83\15\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\2\276\1\u1f84\14\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\3\276\1\u1f85\13\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\4\276\1\u1f86\12\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\5\276\1\u1f87\11\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\6\276\1\u1f88\10\276\1\u0340\41\276\1\u033d\1\u033e\7\276"+
+ "\1\u1f89\7\276\1\u0340\41\276\1\u033d\1\u033e\10\276\1\u1f8a"+
+ "\6\276\1\u0340\41\276\1\u033d\1\u033e\11\276\1\u1f8b\5\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\12\276\1\u1f8c\4\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\13\276\1\u1f8d\3\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\14\276\1\u1f8e\2\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\15\276\1\u1f8f\1\276\1\u0340\41\276\1\300\1\u02bf"+
+ "\1\276\1\u1f90\15\276\1\u02c1\41\276\1\300\1\u02bf\2\276"+
+ "\1\u1f91\14\276\1\u02c1\40\276\1\263\1\u03cf\1\u03d0\1\263"+
+ "\1\u1f92\1\263\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\2\263\1\u1f93\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\1\u1f94\12\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\1\263\1\u1f95\11\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\2\263\1\u1f96\10\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\3\263\1\u1f97\7\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\4\263\1\u1f98\6\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\5\263\1\u1f99"+
+ "\5\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\6\263"+
+ "\1\u1f9a\4\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\7\263\1\u1f9b\3\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\10\263\1\u1f9c\2\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\11\263\1\u1f9d\1\263\1\u03d2\40\263\1\344"+
+ "\1\u03de\1\u03df\1\344\1\u1f9e\1\344\1\u017c\13\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\2\344\1\u1f9f\1\u017c\13\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\1\u1fa0\12\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\1\344\1\u1fa1\11\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\2\344\1\u1fa2"+
+ "\10\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\3\344"+
+ "\1\u1fa3\7\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\4\344\1\u1fa4\6\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\5\344\1\u1fa5\5\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\6\344\1\u1fa6\4\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\7\344\1\u1fa7\3\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\10\344\1\u1fa8\2\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\11\344\1\u1fa9\1\344"+
+ "\1\u03e1\40\344\1\276\1\300\1\u02bf\3\276\1\u1faa\13\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\4\276\1\u1fab\12\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\5\276\1\u1fac\11\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\6\276\1\u1fad\10\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\7\276\1\u1fae\7\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\10\276\1\u1faf\6\276\1\u02c1\41\276\1\300\1\u02bf\11\276"+
+ "\1\u1fb0\5\276\1\u02c1\41\276\1\300\1\u02bf\12\276\1\u1fb1"+
+ "\4\276\1\u02c1\41\276\1\300\1\u02bf\13\276\1\u1fb2\3\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\14\276\1\u1fb3\2\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\15\276\1\u1fb4\1\276\1\u02c1\40\276"+
+ "\1\0\2\u0384\1\0\1\u1fb5\15\0\1\u0386\41\0\2\u0384"+
+ "\2\0\1\u1fb6\14\0\1\u0386\41\0\2\u0384\3\0\1\u1fb7"+
+ "\13\0\1\u0386\41\0\2\u0384\4\0\1\u1fb8\12\0\1\u0386"+
+ "\41\0\2\u0384\5\0\1\u1fb9\11\0\1\u0386\41\0\2\u0384"+
+ "\6\0\1\u1fba\10\0\1\u0386\41\0\2\u0384\7\0\1\u1fbb"+
+ "\7\0\1\u0386\41\0\2\u0384\10\0\1\u1fbc\6\0\1\u0386"+
+ "\41\0\2\u0384\11\0\1\u1fbd\5\0\1\u0386\41\0\2\u0384"+
+ "\12\0\1\u1fbe\4\0\1\u0386\41\0\2\u0384\13\0\1\u1fbf"+
+ "\3\0\1\u0386\41\0\2\u0384\14\0\1\u1fc0\2\0\1\u0386"+
+ "\41\0\2\u0384\15\0\1\u1fc1\1\0\1\u0386\41\0\1\u0312"+
+ "\1\u0313\1\0\1\u1fc2\15\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\2\0\1\u1fc3\14\0\1\u0315\41\0\1\u0312\1\u0313\3\0"+
+ "\1\u1fc4\13\0\1\u0315\41\0\1\u0312\1\u0313\4\0\1\u1fc5"+
+ "\12\0\1\u0315\41\0\1\u0312\1\u0313\5\0\1\u1fc6\11\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\6\0\1\u1fc7\10\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\7\0\1\u1fc8\7\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\10\0\1\u1fc9\6\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\11\0\1\u1fca\5\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\12\0\1\u1fcb\4\0\1\u0315\41\0\1\u0312\1\u0313\13\0"+
+ "\1\u1fcc\3\0\1\u0315\41\0\1\u0312\1\u0313\14\0\1\u1fcd"+
+ "\2\0\1\u0315\41\0\1\u0312\1\u0313\15\0\1\u1fce\1\0"+
+ "\1\u0315\41\0\2\u03a1\1\0\1\u1fcf\15\0\1\u03a3\41\0"+
+ "\2\u03a1\2\0\1\u1fd0\14\0\1\u03a3\41\0\2\u03a1\3\0"+
+ "\1\u1fd1\13\0\1\u03a3\41\0\2\u03a1\4\0\1\u1fd2\12\0"+
+ "\1\u03a3\41\0\2\u03a1\5\0\1\u1fd3\11\0\1\u03a3\41\0"+
+ "\2\u03a1\6\0\1\u1fd4\10\0\1\u03a3\41\0\2\u03a1\7\0"+
+ "\1\u1fd5\7\0\1\u03a3\41\0\2\u03a1\10\0\1\u1fd6\6\0"+
+ "\1\u03a3\41\0\2\u03a1\11\0\1\u1fd7\5\0\1\u03a3\41\0"+
+ "\2\u03a1\12\0\1\u1fd8\4\0\1\u03a3\41\0\2\u03a1\13\0"+
+ "\1\u1fd9\3\0\1\u03a3\41\0\2\u03a1\14\0\1\u1fda\2\0"+
+ "\1\u03a3\41\0\2\u03a1\15\0\1\u1fdb\1\0\1\u03a3\40\0"+
+ "\1\276\1\u03b0\1\u03b1\1\276\1\u1fdc\15\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\2\276\1\u1fdd\14\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\3\276\1\u1fde\13\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\4\276\1\u1fdf\12\276\1\u03b3\41\276\1\u03b0\1\u03b1\5\276"+
+ "\1\u1fe0\11\276\1\u03b3\41\276\1\u03b0\1\u03b1\6\276\1\u1fe1"+
+ "\10\276\1\u03b3\41\276\1\u03b0\1\u03b1\7\276\1\u1fe2\7\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\10\276\1\u1fe3\6\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\11\276\1\u1fe4\5\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\12\276\1\u1fe5\4\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\13\276\1\u1fe6\3\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\14\276\1\u1fe7\2\276\1\u03b3\41\276\1\u03b0\1\u03b1\15\276"+
+ "\1\u1fe8\1\276\1\u03b3\41\276\1\u033d\1\u033e\1\276\1\u1fe9"+
+ "\15\276\1\u0340\41\276\1\u033d\1\u033e\2\276\1\u1fea\14\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\3\276\1\u1feb\13\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\4\276\1\u1fec\12\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\5\276\1\u1fed\11\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\6\276\1\u1fee\10\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\7\276\1\u1fef\7\276\1\u0340\41\276\1\u033d\1\u033e\10\276"+
+ "\1\u1ff0\6\276\1\u0340\41\276\1\u033d\1\u033e\11\276\1\u1ff1"+
+ "\5\276\1\u0340\41\276\1\u033d\1\u033e\12\276\1\u1ff2\4\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\13\276\1\u1ff3\3\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\14\276\1\u1ff4\2\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\15\276\1\u1ff5\1\276\1\u0340\41\276\1\300"+
+ "\1\u02bf\1\276\1\u1ff6\15\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\2\276\1\u1ff7\14\276\1\u02c1\40\276\1\263\1\u03cf\1\u03d0"+
+ "\1\263\1\u1ff8\1\263\1\u0136\13\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\2\263\1\u1ff9\1\u0136\13\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\1\u1ffa\12\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\1\263\1\u1ffb\11\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\2\263\1\u1ffc\10\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\3\263\1\u1ffd\7\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\4\263\1\u1ffe"+
+ "\6\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\5\263"+
+ "\1\u1fff\5\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\6\263\1\u2000\4\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\7\263\1\u2001\3\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\10\263\1\u2002\2\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\11\263\1\u2003\1\263\1\u03d2\40\263"+
+ "\1\344\1\u03de\1\u03df\1\344\1\u2004\1\344\1\u017c\13\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\2\344\1\u2005\1\u017c\13\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\1\u2006\12\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\1\344\1\u2007"+
+ "\11\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\2\344"+
+ "\1\u2008\10\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\3\344\1\u2009\7\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\4\344\1\u200a\6\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\5\344\1\u200b\5\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\6\344\1\u200c\4\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\7\344\1\u200d\3\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\10\344\1\u200e\2\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\11\344\1\u200f"+
+ "\1\344\1\u03e1\40\344\1\276\1\300\1\u02bf\3\276\1\u2010"+
+ "\13\276\1\u02c1\41\276\1\300\1\u02bf\4\276\1\u2011\12\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\5\276\1\u2012\11\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\6\276\1\u2013\10\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\7\276\1\u2014\7\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\10\276\1\u2015\6\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\11\276\1\u2016\5\276\1\u02c1\41\276\1\300\1\u02bf\12\276"+
+ "\1\u2017\4\276\1\u02c1\41\276\1\300\1\u02bf\13\276\1\u2018"+
+ "\3\276\1\u02c1\41\276\1\300\1\u02bf\14\276\1\u2019\2\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\15\276\1\u201a\1\276\1\u02c1"+
+ "\40\276\1\0\2\u0384\1\0\1\u201b\15\0\1\u0386\41\0"+
+ "\2\u0384\2\0\1\u201c\14\0\1\u0386\41\0\2\u0384\3\0"+
+ "\1\u201d\13\0\1\u0386\41\0\2\u0384\4\0\1\u201e\12\0"+
+ "\1\u0386\41\0\2\u0384\5\0\1\u201f\11\0\1\u0386\41\0"+
+ "\2\u0384\6\0\1\u2020\10\0\1\u0386\41\0\2\u0384\7\0"+
+ "\1\u2021\7\0\1\u0386\41\0\2\u0384\10\0\1\u2022\6\0"+
+ "\1\u0386\41\0\2\u0384\11\0\1\u2023\5\0\1\u0386\41\0"+
+ "\2\u0384\12\0\1\u2024\4\0\1\u0386\41\0\2\u0384\13\0"+
+ "\1\u2025\3\0\1\u0386\41\0\2\u0384\14\0\1\u2026\2\0"+
+ "\1\u0386\41\0\2\u0384\15\0\1\u2027\1\0\1\u0386\41\0"+
+ "\1\u0312\1\u0313\1\0\1\u2028\15\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\2\0\1\u2029\14\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\3\0\1\u202a\13\0\1\u0315\41\0\1\u0312\1\u0313\4\0"+
+ "\1\u202b\12\0\1\u0315\41\0\1\u0312\1\u0313\5\0\1\u202c"+
+ "\11\0\1\u0315\41\0\1\u0312\1\u0313\6\0\1\u202d\10\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\7\0\1\u202e\7\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\10\0\1\u202f\6\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\11\0\1\u2030\5\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\12\0\1\u2031\4\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\13\0\1\u2032\3\0\1\u0315\41\0\1\u0312\1\u0313\14\0"+
+ "\1\u2033\2\0\1\u0315\41\0\1\u0312\1\u0313\15\0\1\u2034"+
+ "\1\0\1\u0315\41\0\2\u03a1\1\0\1\u2035\15\0\1\u03a3"+
+ "\41\0\2\u03a1\2\0\1\u2036\14\0\1\u03a3\41\0\2\u03a1"+
+ "\3\0\1\u2037\13\0\1\u03a3\41\0\2\u03a1\4\0\1\u2038"+
+ "\12\0\1\u03a3\41\0\2\u03a1\5\0\1\u2039\11\0\1\u03a3"+
+ "\41\0\2\u03a1\6\0\1\u203a\10\0\1\u03a3\41\0\2\u03a1"+
+ "\7\0\1\u203b\7\0\1\u03a3\41\0\2\u03a1\10\0\1\u203c"+
+ "\6\0\1\u03a3\41\0\2\u03a1\11\0\1\u203d\5\0\1\u03a3"+
+ "\41\0\2\u03a1\12\0\1\u203e\4\0\1\u03a3\41\0\2\u03a1"+
+ "\13\0\1\u203f\3\0\1\u03a3\41\0\2\u03a1\14\0\1\u2040"+
+ "\2\0\1\u03a3\41\0\2\u03a1\15\0\1\u2041\1\0\1\u03a3"+
+ "\40\0\1\276\1\u03b0\1\u03b1\1\276\1\u2042\15\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\2\276\1\u2043\14\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\3\276\1\u2044\13\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\4\276\1\u2045\12\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\5\276\1\u2046\11\276\1\u03b3\41\276\1\u03b0\1\u03b1\6\276"+
+ "\1\u2047\10\276\1\u03b3\41\276\1\u03b0\1\u03b1\7\276\1\u2048"+
+ "\7\276\1\u03b3\41\276\1\u03b0\1\u03b1\10\276\1\u2049\6\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\11\276\1\u204a\5\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\12\276\1\u204b\4\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\13\276\1\u204c\3\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\14\276\1\u204d\2\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\15\276\1\u204e\1\276\1\u03b3\41\276\1\u033d\1\u033e\1\276"+
+ "\1\u204f\15\276\1\u0340\41\276\1\u033d\1\u033e\2\276\1\u2050"+
+ "\14\276\1\u0340\41\276\1\u033d\1\u033e\3\276\1\u2051\13\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\4\276\1\u2052\12\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\5\276\1\u2053\11\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\6\276\1\u2054\10\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\7\276\1\u2055\7\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\10\276\1\u2056\6\276\1\u0340\41\276\1\u033d\1\u033e\11\276"+
+ "\1\u2057\5\276\1\u0340\41\276\1\u033d\1\u033e\12\276\1\u2058"+
+ "\4\276\1\u0340\41\276\1\u033d\1\u033e\13\276\1\u2059\3\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\14\276\1\u205a\2\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\15\276\1\u205b\1\276\1\u0340\41\276"+
+ "\1\300\1\u02bf\1\276\1\u205c\15\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\2\276\1\u205d\14\276\1\u02c1\40\276\1\263\1\u03cf"+
+ "\1\u03d0\1\263\1\u205e\1\263\1\u0136\13\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\2\263\1\u205f\1\u0136\13\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\1\u2060\12\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\1\263\1\u2061\11\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\2\263\1\u2062\10\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\3\263\1\u2063"+
+ "\7\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\4\263"+
+ "\1\u2064\6\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\5\263\1\u2065\5\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\6\263\1\u2066\4\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\7\263\1\u2067\3\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\10\263\1\u2068\2\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\11\263\1\u2069\1\263\1\u03d2"+
+ "\40\263\1\344\1\u03de\1\u03df\1\344\1\u206a\1\344\1\u017c"+
+ "\13\344\1\u03e1\41\344\1\u03de\1\u03df\2\344\1\u206b\1\u017c"+
+ "\13\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\1\u206c"+
+ "\12\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\1\344"+
+ "\1\u206d\11\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\2\344\1\u206e\10\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\3\344\1\u206f\7\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\4\344\1\u2070\6\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\5\344\1\u2071\5\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\6\344\1\u2072\4\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\7\344\1\u2073\3\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\10\344\1\u2074"+
+ "\2\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\11\344"+
+ "\1\u2075\1\344\1\u03e1\40\344\1\276\1\300\1\u02bf\3\276"+
+ "\1\u2076\13\276\1\u02c1\41\276\1\300\1\u02bf\4\276\1\u2077"+
+ "\12\276\1\u02c1\41\276\1\300\1\u02bf\5\276\1\u2078\11\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\6\276\1\u2079\10\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\7\276\1\u207a\7\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\10\276\1\u207b\6\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\11\276\1\u207c\5\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\12\276\1\u207d\4\276\1\u02c1\41\276\1\300\1\u02bf\13\276"+
+ "\1\u207e\3\276\1\u02c1\41\276\1\300\1\u02bf\14\276\1\u207f"+
+ "\2\276\1\u02c1\41\276\1\300\1\u02bf\15\276\1\u2080\1\276"+
+ "\1\u02c1\40\276\1\0\2\u0384\1\0\1\u2081\15\0\1\u0386"+
+ "\41\0\2\u0384\2\0\1\u2082\14\0\1\u0386\41\0\2\u0384"+
+ "\3\0\1\u2083\13\0\1\u0386\41\0\2\u0384\4\0\1\u2084"+
+ "\12\0\1\u0386\41\0\2\u0384\5\0\1\u2085\11\0\1\u0386"+
+ "\41\0\2\u0384\6\0\1\u2086\10\0\1\u0386\41\0\2\u0384"+
+ "\7\0\1\u2087\7\0\1\u0386\41\0\2\u0384\10\0\1\u2088"+
+ "\6\0\1\u0386\41\0\2\u0384\11\0\1\u2089\5\0\1\u0386"+
+ "\41\0\2\u0384\12\0\1\u208a\4\0\1\u0386\41\0\2\u0384"+
+ "\13\0\1\u208b\3\0\1\u0386\41\0\2\u0384\14\0\1\u208c"+
+ "\2\0\1\u0386\41\0\2\u0384\15\0\1\u208d\1\0\1\u0386"+
+ "\41\0\1\u0312\1\u0313\1\0\1\u208e\15\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\2\0\1\u208f\14\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\3\0\1\u2090\13\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\4\0\1\u2091\12\0\1\u0315\41\0\1\u0312\1\u0313\5\0"+
+ "\1\u2092\11\0\1\u0315\41\0\1\u0312\1\u0313\6\0\1\u2093"+
+ "\10\0\1\u0315\41\0\1\u0312\1\u0313\7\0\1\u2094\7\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\10\0\1\u2095\6\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\11\0\1\u2096\5\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\12\0\1\u2097\4\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\13\0\1\u2098\3\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\14\0\1\u2099\2\0\1\u0315\41\0\1\u0312\1\u0313\15\0"+
+ "\1\u209a\1\0\1\u0315\41\0\2\u03a1\1\0\1\u209b\15\0"+
+ "\1\u03a3\41\0\2\u03a1\2\0\1\u209c\14\0\1\u03a3\41\0"+
+ "\2\u03a1\3\0\1\u209d\13\0\1\u03a3\41\0\2\u03a1\4\0"+
+ "\1\u209e\12\0\1\u03a3\41\0\2\u03a1\5\0\1\u209f\11\0"+
+ "\1\u03a3\41\0\2\u03a1\6\0\1\u20a0\10\0\1\u03a3\41\0"+
+ "\2\u03a1\7\0\1\u20a1\7\0\1\u03a3\41\0\2\u03a1\10\0"+
+ "\1\u20a2\6\0\1\u03a3\41\0\2\u03a1\11\0\1\u20a3\5\0"+
+ "\1\u03a3\41\0\2\u03a1\12\0\1\u20a4\4\0\1\u03a3\41\0"+
+ "\2\u03a1\13\0\1\u20a5\3\0\1\u03a3\41\0\2\u03a1\14\0"+
+ "\1\u20a6\2\0\1\u03a3\41\0\2\u03a1\15\0\1\u20a7\1\0"+
+ "\1\u03a3\40\0\1\276\1\u03b0\1\u03b1\1\276\1\u20a8\15\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\2\276\1\u20a9\14\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\3\276\1\u20aa\13\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\4\276\1\u20ab\12\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\5\276\1\u20ac\11\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\6\276\1\u20ad\10\276\1\u03b3\41\276\1\u03b0\1\u03b1\7\276"+
+ "\1\u20ae\7\276\1\u03b3\41\276\1\u03b0\1\u03b1\10\276\1\u20af"+
+ "\6\276\1\u03b3\41\276\1\u03b0\1\u03b1\11\276\1\u20b0\5\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\12\276\1\u20b1\4\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\13\276\1\u20b2\3\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\14\276\1\u20b3\2\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\15\276\1\u20b4\1\276\1\u03b3\41\276\1\u033d\1\u033e"+
+ "\1\276\1\u20b5\15\276\1\u0340\41\276\1\u033d\1\u033e\2\276"+
+ "\1\u20b6\14\276\1\u0340\41\276\1\u033d\1\u033e\3\276\1\u20b7"+
+ "\13\276\1\u0340\41\276\1\u033d\1\u033e\4\276\1\u20b8\12\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\5\276\1\u20b9\11\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\6\276\1\u20ba\10\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\7\276\1\u20bb\7\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\10\276\1\u20bc\6\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\11\276\1\u20bd\5\276\1\u0340\41\276\1\u033d\1\u033e\12\276"+
+ "\1\u20be\4\276\1\u0340\41\276\1\u033d\1\u033e\13\276\1\u20bf"+
+ "\3\276\1\u0340\41\276\1\u033d\1\u033e\14\276\1\u20c0\2\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\15\276\1\u20c1\1\276\1\u0340"+
+ "\41\276\1\300\1\u02bf\1\276\1\u20c2\15\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\2\276\1\u20c3\14\276\1\u02c1\40\276\1\263"+
+ "\1\u03cf\1\u03d0\1\263\1\u20c4\1\263\1\u0136\13\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\2\263\1\u20c5\1\u0136\13\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\u20c6\12\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\263\1\u20c7\11\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\2\263\1\u20c8"+
+ "\10\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\3\263"+
+ "\1\u20c9\7\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\4\263\1\u20ca\6\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\5\263\1\u20cb\5\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\6\263\1\u20cc\4\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\7\263\1\u20cd\3\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\10\263\1\u20ce\2\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\11\263\1\u20cf\1\263"+
+ "\1\u03d2\40\263\1\344\1\u03de\1\u03df\1\344\1\u20d0\1\344"+
+ "\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df\2\344\1\u20d1"+
+ "\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\1\u20d2\12\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\1\344\1\u20d3\11\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\2\344\1\u20d4\10\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\3\344\1\u20d5\7\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\4\344\1\u20d6\6\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\5\344\1\u20d7\5\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\6\344\1\u20d8\4\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\7\344\1\u20d9"+
+ "\3\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\10\344"+
+ "\1\u20da\2\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\11\344\1\u20db\1\344\1\u03e1\40\344\1\276\1\300\1\u02bf"+
+ "\3\276\1\u20dc\13\276\1\u02c1\41\276\1\300\1\u02bf\4\276"+
+ "\1\u20dd\12\276\1\u02c1\41\276\1\300\1\u02bf\5\276\1\u20de"+
+ "\11\276\1\u02c1\41\276\1\300\1\u02bf\6\276\1\u20df\10\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\7\276\1\u20e0\7\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\10\276\1\u20e1\6\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\11\276\1\u20e2\5\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\12\276\1\u20e3\4\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\13\276\1\u20e4\3\276\1\u02c1\41\276\1\300\1\u02bf\14\276"+
+ "\1\u20e5\2\276\1\u02c1\41\276\1\300\1\u02bf\15\276\1\u20e6"+
+ "\1\276\1\u02c1\40\276\1\0\2\u0384\1\0\1\u20e7\15\0"+
+ "\1\u0386\41\0\2\u0384\2\0\1\u20e8\14\0\1\u0386\41\0"+
+ "\2\u0384\3\0\1\u20e9\13\0\1\u0386\41\0\2\u0384\4\0"+
+ "\1\u20ea\12\0\1\u0386\41\0\2\u0384\5\0\1\u20eb\11\0"+
+ "\1\u0386\41\0\2\u0384\6\0\1\u20ec\10\0\1\u0386\41\0"+
+ "\2\u0384\7\0\1\u20ed\7\0\1\u0386\41\0\2\u0384\10\0"+
+ "\1\u20ee\6\0\1\u0386\41\0\2\u0384\11\0\1\u20ef\5\0"+
+ "\1\u0386\41\0\2\u0384\12\0\1\u20f0\4\0\1\u0386\41\0"+
+ "\2\u0384\13\0\1\u20f1\3\0\1\u0386\41\0\2\u0384\14\0"+
+ "\1\u20f2\2\0\1\u0386\41\0\2\u0384\15\0\1\u20f3\1\0"+
+ "\1\u0386\41\0\1\u0312\1\u0313\1\0\1\u20f4\15\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\2\0\1\u20f5\14\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\3\0\1\u20f6\13\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\4\0\1\u20f7\12\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\5\0\1\u20f8\11\0\1\u0315\41\0\1\u0312\1\u0313\6\0"+
+ "\1\u20f9\10\0\1\u0315\41\0\1\u0312\1\u0313\7\0\1\u20fa"+
+ "\7\0\1\u0315\41\0\1\u0312\1\u0313\10\0\1\u20fb\6\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\11\0\1\u20fc\5\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\12\0\1\u20fd\4\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\13\0\1\u20fe\3\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\14\0\1\u20ff\2\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\15\0\1\u2100\1\0\1\u0315\41\0\2\u03a1\1\0\1\u2101"+
+ "\15\0\1\u03a3\41\0\2\u03a1\2\0\1\u2102\14\0\1\u03a3"+
+ "\41\0\2\u03a1\3\0\1\u2103\13\0\1\u03a3\41\0\2\u03a1"+
+ "\4\0\1\u2104\12\0\1\u03a3\41\0\2\u03a1\5\0\1\u2105"+
+ "\11\0\1\u03a3\41\0\2\u03a1\6\0\1\u2106\10\0\1\u03a3"+
+ "\41\0\2\u03a1\7\0\1\u2107\7\0\1\u03a3\41\0\2\u03a1"+
+ "\10\0\1\u2108\6\0\1\u03a3\41\0\2\u03a1\11\0\1\u2109"+
+ "\5\0\1\u03a3\41\0\2\u03a1\12\0\1\u210a\4\0\1\u03a3"+
+ "\41\0\2\u03a1\13\0\1\u210b\3\0\1\u03a3\41\0\2\u03a1"+
+ "\14\0\1\u210c\2\0\1\u03a3\41\0\2\u03a1\15\0\1\u210d"+
+ "\1\0\1\u03a3\40\0\1\276\1\u03b0\1\u03b1\1\276\1\u210e"+
+ "\15\276\1\u03b3\41\276\1\u03b0\1\u03b1\2\276\1\u210f\14\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\3\276\1\u2110\13\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\4\276\1\u2111\12\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\5\276\1\u2112\11\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\6\276\1\u2113\10\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\7\276\1\u2114\7\276\1\u03b3\41\276\1\u03b0\1\u03b1\10\276"+
+ "\1\u2115\6\276\1\u03b3\41\276\1\u03b0\1\u03b1\11\276\1\u2116"+
+ "\5\276\1\u03b3\41\276\1\u03b0\1\u03b1\12\276\1\u2117\4\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\13\276\1\u2118\3\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\14\276\1\u2119\2\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\15\276\1\u211a\1\276\1\u03b3\41\276\1\u033d"+
+ "\1\u033e\1\276\1\u211b\15\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\2\276\1\u211c\14\276\1\u0340\41\276\1\u033d\1\u033e\3\276"+
+ "\1\u211d\13\276\1\u0340\41\276\1\u033d\1\u033e\4\276\1\u211e"+
+ "\12\276\1\u0340\41\276\1\u033d\1\u033e\5\276\1\u211f\11\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\6\276\1\u2120\10\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\7\276\1\u2121\7\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\10\276\1\u2122\6\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\11\276\1\u2123\5\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\12\276\1\u2124\4\276\1\u0340\41\276\1\u033d\1\u033e\13\276"+
+ "\1\u2125\3\276\1\u0340\41\276\1\u033d\1\u033e\14\276\1\u2126"+
+ "\2\276\1\u0340\41\276\1\u033d\1\u033e\15\276\1\u2127\1\276"+
+ "\1\u0340\41\276\1\300\1\u02bf\1\276\1\u02c1\15\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\2\276\1\u02c1\14\276\1\u02c1\40\276"+
+ "\1\263\1\u03cf\1\u03d0\1\263\1\u2128\1\263\1\u0136\13\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\2\263\1\u2129\1\u0136\13\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\u212a\12\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\1\263\1\u212b"+
+ "\11\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\2\263"+
+ "\1\u212c\10\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\3\263\1\u212d\7\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\4\263\1\u212e\6\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\5\263\1\u212f\5\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\6\263\1\u2130\4\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\7\263\1\u2131\3\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\10\263\1\u2132\2\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\11\263\1\u2133"+
+ "\1\263\1\u03d2\40\263\1\344\1\u03de\1\u03df\1\344\1\u2134"+
+ "\1\344\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df\2\344"+
+ "\1\u2135\1\u017c\13\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\1\u2136\12\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\1\344\1\u2137\11\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\2\344\1\u2138\10\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\3\344\1\u2139\7\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\4\344\1\u213a\6\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\5\344\1\u213b\5\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\6\344\1\u213c"+
+ "\4\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\7\344"+
+ "\1\u213d\3\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\10\344\1\u213e\2\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\11\344\1\u213f\1\344\1\u03e1\40\344\1\276\1\300"+
+ "\1\u02bf\3\276\1\u02c1\13\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\4\276\1\u02c1\12\276\1\u02c1\41\276\1\300\1\u02bf\5\276"+
+ "\1\u02c1\11\276\1\u02c1\41\276\1\300\1\u02bf\6\276\1\u02c1"+
+ "\10\276\1\u02c1\41\276\1\300\1\u02bf\7\276\1\u02c1\7\276"+
+ "\1\u02c1\41\276\1\300\1\u02bf\10\276\1\u02c1\6\276\1\u02c1"+
+ "\41\276\1\300\1\u02bf\11\276\1\u02c1\5\276\1\u02c1\41\276"+
+ "\1\300\1\u02bf\12\276\1\u02c1\4\276\1\u02c1\41\276\1\300"+
+ "\1\u02bf\13\276\1\u02c1\3\276\1\u02c1\41\276\1\300\1\u02bf"+
+ "\14\276\1\u02c1\2\276\1\u02c1\41\276\1\300\1\u02bf\15\276"+
+ "\1\u02c1\1\276\1\u02c1\40\276\1\0\2\u0384\1\0\1\u2140"+
+ "\15\0\1\u0386\41\0\2\u0384\2\0\1\u2141\14\0\1\u0386"+
+ "\41\0\2\u0384\3\0\1\u2142\13\0\1\u0386\41\0\2\u0384"+
+ "\4\0\1\u2143\12\0\1\u0386\41\0\2\u0384\5\0\1\u2144"+
+ "\11\0\1\u0386\41\0\2\u0384\6\0\1\u2145\10\0\1\u0386"+
+ "\41\0\2\u0384\7\0\1\u2146\7\0\1\u0386\41\0\2\u0384"+
+ "\10\0\1\u2147\6\0\1\u0386\41\0\2\u0384\11\0\1\u2148"+
+ "\5\0\1\u0386\41\0\2\u0384\12\0\1\u2149\4\0\1\u0386"+
+ "\41\0\2\u0384\13\0\1\u214a\3\0\1\u0386\41\0\2\u0384"+
+ "\14\0\1\u214b\2\0\1\u0386\41\0\2\u0384\15\0\1\u214c"+
+ "\1\0\1\u0386\41\0\1\u0312\1\u0313\1\0\1\u0315\15\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\2\0\1\u0315\14\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\3\0\1\u0315\13\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\4\0\1\u0315\12\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\5\0\1\u0315\11\0\1\u0315\41\0\1\u0312\1\u0313"+
+ "\6\0\1\u0315\10\0\1\u0315\41\0\1\u0312\1\u0313\7\0"+
+ "\1\u0315\7\0\1\u0315\41\0\1\u0312\1\u0313\10\0\1\u0315"+
+ "\6\0\1\u0315\41\0\1\u0312\1\u0313\11\0\1\u0315\5\0"+
+ "\1\u0315\41\0\1\u0312\1\u0313\12\0\1\u0315\4\0\1\u0315"+
+ "\41\0\1\u0312\1\u0313\13\0\1\u0315\3\0\1\u0315\41\0"+
+ "\1\u0312\1\u0313\14\0\1\u0315\2\0\1\u0315\41\0\1\u0312"+
+ "\1\u0313\15\0\1\u0315\1\0\1\u0315\41\0\2\u03a1\1\0"+
+ "\1\u214d\15\0\1\u03a3\41\0\2\u03a1\2\0\1\u214e\14\0"+
+ "\1\u03a3\41\0\2\u03a1\3\0\1\u214f\13\0\1\u03a3\41\0"+
+ "\2\u03a1\4\0\1\u2150\12\0\1\u03a3\41\0\2\u03a1\5\0"+
+ "\1\u2151\11\0\1\u03a3\41\0\2\u03a1\6\0\1\u2152\10\0"+
+ "\1\u03a3\41\0\2\u03a1\7\0\1\u2153\7\0\1\u03a3\41\0"+
+ "\2\u03a1\10\0\1\u2154\6\0\1\u03a3\41\0\2\u03a1\11\0"+
+ "\1\u2155\5\0\1\u03a3\41\0\2\u03a1\12\0\1\u2156\4\0"+
+ "\1\u03a3\41\0\2\u03a1\13\0\1\u2157\3\0\1\u03a3\41\0"+
+ "\2\u03a1\14\0\1\u2158\2\0\1\u03a3\41\0\2\u03a1\15\0"+
+ "\1\u2159\1\0\1\u03a3\40\0\1\276\1\u03b0\1\u03b1\1\276"+
+ "\1\u215a\15\276\1\u03b3\41\276\1\u03b0\1\u03b1\2\276\1\u215b"+
+ "\14\276\1\u03b3\41\276\1\u03b0\1\u03b1\3\276\1\u215c\13\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\4\276\1\u215d\12\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\5\276\1\u215e\11\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\6\276\1\u215f\10\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\7\276\1\u2160\7\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\10\276\1\u2161\6\276\1\u03b3\41\276\1\u03b0\1\u03b1\11\276"+
+ "\1\u2162\5\276\1\u03b3\41\276\1\u03b0\1\u03b1\12\276\1\u2163"+
+ "\4\276\1\u03b3\41\276\1\u03b0\1\u03b1\13\276\1\u2164\3\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\14\276\1\u2165\2\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\15\276\1\u2166\1\276\1\u03b3\41\276"+
+ "\1\u033d\1\u033e\1\276\1\u0340\15\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\2\276\1\u0340\14\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\3\276\1\u0340\13\276\1\u0340\41\276\1\u033d\1\u033e\4\276"+
+ "\1\u0340\12\276\1\u0340\41\276\1\u033d\1\u033e\5\276\1\u0340"+
+ "\11\276\1\u0340\41\276\1\u033d\1\u033e\6\276\1\u0340\10\276"+
+ "\1\u0340\41\276\1\u033d\1\u033e\7\276\1\u0340\7\276\1\u0340"+
+ "\41\276\1\u033d\1\u033e\10\276\1\u0340\6\276\1\u0340\41\276"+
+ "\1\u033d\1\u033e\11\276\1\u0340\5\276\1\u0340\41\276\1\u033d"+
+ "\1\u033e\12\276\1\u0340\4\276\1\u0340\41\276\1\u033d\1\u033e"+
+ "\13\276\1\u0340\3\276\1\u0340\41\276\1\u033d\1\u033e\14\276"+
+ "\1\u0340\2\276\1\u0340\41\276\1\u033d\1\u033e\15\276\1\u0340"+
+ "\1\276\1\u0340\40\276\1\263\1\u03cf\1\u03d0\1\263\1\u2167"+
+ "\1\263\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\2\263"+
+ "\1\u2168\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\1\u2169\12\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\1\263\1\u216a\11\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\2\263\1\u216b\10\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\3\263\1\u216c\7\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\4\263\1\u216d\6\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\5\263\1\u216e\5\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\6\263\1\u216f"+
+ "\4\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\7\263"+
+ "\1\u2170\3\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\10\263\1\u2171\2\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\11\263\1\u2172\1\263\1\u03d2\40\263\1\344\1\u03de"+
+ "\1\u03df\1\344\1\u2173\1\344\1\u017c\13\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\2\344\1\u2174\1\u017c\13\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\1\u2175\12\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\1\344\1\u2176\11\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\2\344\1\u2177\10\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\3\344\1\u2178"+
+ "\7\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\4\344"+
+ "\1\u2179\6\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\5\344\1\u217a\5\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\6\344\1\u217b\4\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\7\344\1\u217c\3\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\10\344\1\u217d\2\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\11\344\1\u217e\1\344\1\u03e1"+
+ "\40\344\1\0\2\u0384\1\0\1\u0386\15\0\1\u0386\41\0"+
+ "\2\u0384\2\0\1\u0386\14\0\1\u0386\41\0\2\u0384\3\0"+
+ "\1\u0386\13\0\1\u0386\41\0\2\u0384\4\0\1\u0386\12\0"+
+ "\1\u0386\41\0\2\u0384\5\0\1\u0386\11\0\1\u0386\41\0"+
+ "\2\u0384\6\0\1\u0386\10\0\1\u0386\41\0\2\u0384\7\0"+
+ "\1\u0386\7\0\1\u0386\41\0\2\u0384\10\0\1\u0386\6\0"+
+ "\1\u0386\41\0\2\u0384\11\0\1\u0386\5\0\1\u0386\41\0"+
+ "\2\u0384\12\0\1\u0386\4\0\1\u0386\41\0\2\u0384\13\0"+
+ "\1\u0386\3\0\1\u0386\41\0\2\u0384\14\0\1\u0386\2\0"+
+ "\1\u0386\41\0\2\u0384\15\0\1\u0386\1\0\1\u0386\41\0"+
+ "\2\u03a1\1\0\1\u03a3\15\0\1\u03a3\41\0\2\u03a1\2\0"+
+ "\1\u03a3\14\0\1\u03a3\41\0\2\u03a1\3\0\1\u03a3\13\0"+
+ "\1\u03a3\41\0\2\u03a1\4\0\1\u03a3\12\0\1\u03a3\41\0"+
+ "\2\u03a1\5\0\1\u03a3\11\0\1\u03a3\41\0\2\u03a1\6\0"+
+ "\1\u03a3\10\0\1\u03a3\41\0\2\u03a1\7\0\1\u03a3\7\0"+
+ "\1\u03a3\41\0\2\u03a1\10\0\1\u03a3\6\0\1\u03a3\41\0"+
+ "\2\u03a1\11\0\1\u03a3\5\0\1\u03a3\41\0\2\u03a1\12\0"+
+ "\1\u03a3\4\0\1\u03a3\41\0\2\u03a1\13\0\1\u03a3\3\0"+
+ "\1\u03a3\41\0\2\u03a1\14\0\1\u03a3\2\0\1\u03a3\41\0"+
+ "\2\u03a1\15\0\1\u03a3\1\0\1\u03a3\40\0\1\276\1\u03b0"+
+ "\1\u03b1\1\276\1\u03b3\15\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\2\276\1\u03b3\14\276\1\u03b3\41\276\1\u03b0\1\u03b1\3\276"+
+ "\1\u03b3\13\276\1\u03b3\41\276\1\u03b0\1\u03b1\4\276\1\u03b3"+
+ "\12\276\1\u03b3\41\276\1\u03b0\1\u03b1\5\276\1\u03b3\11\276"+
+ "\1\u03b3\41\276\1\u03b0\1\u03b1\6\276\1\u03b3\10\276\1\u03b3"+
+ "\41\276\1\u03b0\1\u03b1\7\276\1\u03b3\7\276\1\u03b3\41\276"+
+ "\1\u03b0\1\u03b1\10\276\1\u03b3\6\276\1\u03b3\41\276\1\u03b0"+
+ "\1\u03b1\11\276\1\u03b3\5\276\1\u03b3\41\276\1\u03b0\1\u03b1"+
+ "\12\276\1\u03b3\4\276\1\u03b3\41\276\1\u03b0\1\u03b1\13\276"+
+ "\1\u03b3\3\276\1\u03b3\41\276\1\u03b0\1\u03b1\14\276\1\u03b3"+
+ "\2\276\1\u03b3\41\276\1\u03b0\1\u03b1\15\276\1\u03b3\1\276"+
+ "\1\u03b3\40\276\1\263\1\u03cf\1\u03d0\1\263\1\u03d2\1\263"+
+ "\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\2\263\1\u03d2"+
+ "\1\u0136\13\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\1\u03d2\12\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\1\263\1\u03d2\11\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263"+
+ "\1\u0136\2\263\1\u03d2\10\263\1\u03d2\41\263\1\u03cf\1\u03d0"+
+ "\3\263\1\u0136\3\263\1\u03d2\7\263\1\u03d2\41\263\1\u03cf"+
+ "\1\u03d0\3\263\1\u0136\4\263\1\u03d2\6\263\1\u03d2\41\263"+
+ "\1\u03cf\1\u03d0\3\263\1\u0136\5\263\1\u03d2\5\263\1\u03d2"+
+ "\41\263\1\u03cf\1\u03d0\3\263\1\u0136\6\263\1\u03d2\4\263"+
+ "\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\7\263\1\u03d2"+
+ "\3\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136\10\263"+
+ "\1\u03d2\2\263\1\u03d2\41\263\1\u03cf\1\u03d0\3\263\1\u0136"+
+ "\11\263\1\u03d2\1\263\1\u03d2\40\263\1\344\1\u03de\1\u03df"+
+ "\1\344\1\u03e1\1\344\1\u017c\13\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\2\344\1\u03e1\1\u017c\13\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\1\u03e1\12\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\1\344\1\u03e1\11\344\1\u03e1\41\344"+
+ "\1\u03de\1\u03df\3\344\1\u017c\2\344\1\u03e1\10\344\1\u03e1"+
+ "\41\344\1\u03de\1\u03df\3\344\1\u017c\3\344\1\u03e1\7\344"+
+ "\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\4\344\1\u03e1"+
+ "\6\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c\5\344"+
+ "\1\u03e1\5\344\1\u03e1\41\344\1\u03de\1\u03df\3\344\1\u017c"+
+ "\6\344\1\u03e1\4\344\1\u03e1\41\344\1\u03de\1\u03df\3\344"+
+ "\1\u017c\7\344\1\u03e1\3\344\1\u03e1\41\344\1\u03de\1\u03df"+
+ "\3\344\1\u017c\10\344\1\u03e1\2\344\1\u03e1\41\344\1\u03de"+
+ "\1\u03df\3\344\1\u017c\11\344\1\u03e1\1\344\1\u03e1\40\344";
private static int [] zzUnpackTrans() {
- int [] result = new int[433194];
+ int [] result = new int[433245];
int offset = 0;
offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
offset = zzUnpackTrans(ZZ_TRANS_PACKED_1, offset, result);
@@ -7220,18 +9144,18 @@
"\2\1\1\11\2\0\1\11\70\0\1\1\35\0\2\1"+
"\7\0\1\1\5\0\1\1\1\11\14\1\1\0\1\1"+
"\1\0\5\1\1\0\6\1\1\11\2\1\21\0\1\1"+
- "\127\0\3\1\15\0\7\1\1\0\1\1\1\0\4\1"+
- "\1\0\5\1\15\0\2\11\1\0\1\11\1\1\50\0"+
- "\2\1\47\0\1\1\10\0\1\1\5\0\3\1\1\0"+
- "\1\1\1\0\3\1\2\0\3\1\34\0\1\1\15\0"+
- "\2\1\34\0\2\1\14\0\2\1\34\0\2\1\3\0"+
+ "\130\0\3\1\15\0\7\1\1\0\1\1\1\0\4\1"+
+ "\1\0\5\1\15\0\2\11\1\0\1\11\1\1\51\0"+
+ "\2\1\50\0\1\1\10\0\1\1\5\0\3\1\1\0"+
+ "\1\1\1\0\3\1\2\0\3\1\35\0\1\1\16\0"+
+ "\2\1\35\0\2\1\15\0\2\1\35\0\2\1\3\0"+
"\1\1\15\0\1\1\131\0\1\1\4\0\2\1\2\0"+
"\1\1\150\0\1\1\3\0\1\1\147\0\2\1\150\0"+
"\1\1\150\0\1\1\150\0\1\1\147\0\1\1\147\0"+
- "\1\1\u1a31\0";
+ "\1\1\u1a2a\0";
private static int [] zzUnpackAttribute() {
- int [] result = new int[8573];
+ int [] result = new int[8574];
int offset = 0;
offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
return result;
@@ -7256,7 +9180,7 @@
private int zzLexicalState = YYINITIAL;
/** this buffer contains the current text to be matched and is
- the source of the yytext() string */
+ the source of the yytext() string */
private CharSequence zzBuffer = "";
/** this buffer may contains the current text array to be matched when it is cheap to acquire it */
@@ -7275,7 +9199,7 @@
private int zzStartRead;
/** endRead marks the last character in the buffer, that has been read
- from input */
+ from input */
private int zzEndRead;
/**
@@ -7293,14 +9217,14 @@
int myState = 0; //python=1;django=2;initial=0;
int myIndent = 0;
private IElementType chooseType () {if (myState == 2)
- return DJANGO_LINE;
- else if (myState == 3)
- return JAVASCRIPT_LINE;
- else if (myState == 1)
- return PYTHON_LINE;
- else
- return INLINE_LINE;
- }
+ return DJANGO_LINE;
+ else if (myState == 3)
+ return JAVASCRIPT_LINE;
+ else if (myState == 1)
+ return PYTHON_LINE;
+ else
+ return INLINE_LINE;
+ }
public _RestFlexLexer(java.io.Reader in) {
@@ -7317,7 +9241,7 @@
this(new java.io.InputStreamReader(in));
}
- /**
+ /**
* Unpacks the compressed character translation table.
*
* @param packed the packed character translation table
@@ -7466,7 +9390,7 @@
private void zzDoEOF() {
if (!zzEOFDone) {
zzEOFDone = true;
-
+
}
}
@@ -7498,33 +9422,33 @@
zzMarkedPosL = zzMarkedPos;
if (zzMarkedPosL > zzStartRead) {
- switch (zzBufferL.charAt(zzMarkedPosL-1)) {
- case '\n':
- case '\u000B':
- case '\u000C':
- case '\u0085':
- case '\u2028':
- case '\u2029':
- zzAtBOL = true;
- break;
- case '\r':
- if (zzMarkedPosL < zzEndReadL)
- zzAtBOL = zzBufferL.charAt(zzMarkedPosL) != '\n';
- else if (zzAtEOF)
- zzAtBOL = false;
- else {
- boolean eof = zzRefill();
- zzMarkedPosL = zzMarkedPos;
- zzEndReadL = zzEndRead;
- zzBufferL = zzBuffer;
- if (eof)
- zzAtBOL = false;
- else
- zzAtBOL = zzBufferL.charAt(zzMarkedPosL) != '\n';
- }
- break;
- default:
+ switch ((zzBufferArrayL != null ? zzBufferArrayL[zzMarkedPosL-1] : zzBufferL.charAt(zzMarkedPosL-1))) {
+ case '\n':
+ case '\u000B':
+ case '\u000C':
+ case '\u0085':
+ case '\u2028':
+ case '\u2029':
+ zzAtBOL = true;
+ break;
+ case '\r':
+ if (zzMarkedPosL < zzEndReadL)
+ zzAtBOL = (zzBufferArrayL != null ? zzBufferArrayL[zzMarkedPosL] : zzBufferL.charAt(zzMarkedPosL)) != '\n';
+ else if (zzAtEOF)
zzAtBOL = false;
+ else {
+ boolean eof = zzRefill();
+ zzMarkedPosL = zzMarkedPos;
+ zzEndReadL = zzEndRead;
+ zzBufferL = zzBuffer;
+ if (eof)
+ zzAtBOL = false;
+ else
+ zzAtBOL = (zzBufferArrayL != null ? zzBufferArrayL[zzMarkedPosL] : zzBufferL.charAt(zzMarkedPosL)) != '\n';
+ }
+ break;
+ default:
+ zzAtBOL = false;
}
}
zzAction = -1;
@@ -7541,7 +9465,7 @@
while (true) {
if (zzCurrentPosL < zzEndReadL)
- zzInput = zzBufferL.charAt(zzCurrentPosL++);
+ zzInput = (zzBufferArrayL != null ? zzBufferArrayL[zzCurrentPosL++] : zzBufferL.charAt(zzCurrentPosL++));
else if (zzAtEOF) {
zzInput = YYEOF;
break zzForAction;
@@ -7561,7 +9485,7 @@
break zzForAction;
}
else {
- zzInput = zzBufferL.charAt(zzCurrentPosL++);
+ zzInput = (zzBufferArrayL != null ? zzBufferArrayL[zzCurrentPosL++] : zzBufferL.charAt(zzCurrentPosL++));
}
}
int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
@@ -7582,198 +9506,198 @@
zzMarkedPos = zzMarkedPosL;
switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
- case 39:
- { return FIXED;
- }
+ case 39:
+ { return FIXED;
+ }
case 44: break;
- case 1:
- { yybegin(IN_COMMENT); return COMMENT;
- }
+ case 1:
+ { yybegin(IN_COMMENT); return COMMENT;
+ }
case 45: break;
- case 7:
- { yybegin(INIT); return ERROR;
- }
+ case 7:
+ { yybegin(INIT); return ERROR;
+ }
case 46: break;
- case 10:
- { yybegin(PRE_INDENTED); myIndent = yylength(); return chooseType();
- }
+ case 10:
+ { yybegin(PRE_INDENTED); myIndent = yylength(); return chooseType();
+ }
case 47: break;
- case 26:
- { yybegin(INIT); return FOOTNOTE;
- }
+ case 26:
+ { yybegin(INIT); return FOOTNOTE;
+ }
case 48: break;
- case 27:
- { yybegin(INIT); return CITATION;
- }
+ case 27:
+ { yybegin(INIT); return CITATION;
+ }
case 49: break;
- case 4:
- { yybegin(INIT); return LINE;
- }
+ case 4:
+ { yybegin(INIT); return LINE;
+ }
case 50: break;
- case 18:
- { return LINE;
- }
+ case 18:
+ { return LINE;
+ }
case 51: break;
- case 25:
- { return SUBSTITUTION;
- }
+ case 25:
+ { return SUBSTITUTION;
+ }
case 52: break;
- case 17:
- { yybegin(IN_FOOTNOTE); return LINE;
- }
+ case 17:
+ { yybegin(IN_FOOTNOTE); return LINE;
+ }
case 53: break;
- case 16:
- { yybegin(QUOTED); return chooseType();
- }
+ case 16:
+ { yybegin(QUOTED); return chooseType();
+ }
case 54: break;
- case 33:
- { return INTERPRETED;
- }
+ case 33:
+ { return INTERPRETED;
+ }
case 55: break;
- case 9:
- { return COMMENT;
- }
+ case 9:
+ { return COMMENT;
+ }
case 56: break;
- case 22:
- { yybegin(INIT); return COMMENT;
- }
+ case 22:
+ { yybegin(INIT); return COMMENT;
+ }
case 57: break;
- case 12:
- { yypushback(1); myIndent = 0; myState = 0; yybegin(INIT);
- }
+ case 12:
+ { yypushback(1); myIndent = 0; myState = 0; yybegin(INIT);
+ }
case 58: break;
- case 41:
- { return TITLE;
- }
+ case 41:
+ { return TITLE;
+ }
case 59: break;
- case 24:
- { yybegin(IN_VALUE); return ANONYMOUS_HYPERLINK;
- }
+ case 24:
+ { yybegin(IN_VALUE); return ANONYMOUS_HYPERLINK;
+ }
case 60: break;
- case 3:
- { return chooseType();
- }
+ case 3:
+ { return chooseType();
+ }
case 61: break;
- case 15:
- { yybegin(PRE_QUOTED); return chooseType();
- }
+ case 15:
+ { yybegin(PRE_QUOTED); return chooseType();
+ }
case 62: break;
- case 36:
- { yypushback(1); return FIELD;
- }
+ case 36:
+ { yypushback(1); return FIELD;
+ }
case 63: break;
- case 32:
- { yypushback(1); yybegin(INIT); return REFERENCE_NAME;
- }
+ case 32:
+ { yypushback(1); yybegin(INIT); return REFERENCE_NAME;
+ }
case 64: break;
- case 35:
- { return ITALIC;
- }
+ case 35:
+ { return ITALIC;
+ }
case 65: break;
- case 42:
- { return DIRECT_HYPERLINK;
- }
+ case 42:
+ { return DIRECT_HYPERLINK;
+ }
case 66: break;
- case 8:
- { return WHITESPACE;
- }
+ case 8:
+ { return WHITESPACE;
+ }
case 67: break;
- case 20:
- { yybegin(IN_LINEBEGIN); return WHITESPACE;
- }
+ case 20:
+ { yybegin(IN_LINEBEGIN); return WHITESPACE;
+ }
case 68: break;
- case 5:
- { yypushback(1); yybegin(INIT);
- }
+ case 5:
+ { yypushback(1); yybegin(INIT);
+ }
case 69: break;
- case 13:
- { if (yylength() >= myIndent) {
- yybegin(PRE_INDENTED); return chooseType();}
- else {
- myIndent = 0; yypushback(yylength()); yybegin(INIT);
- }
- }
+ case 13:
+ { if (yylength() >= myIndent) {
+ yybegin(PRE_INDENTED); return chooseType();}
+ else {
+ myIndent = 0; yypushback(yylength()); yybegin(INIT);
+ }
+ }
case 70: break;
- case 31:
- { yybegin(INIT); return HYPERLINK;
- }
+ case 31:
+ { yybegin(INIT); return HYPERLINK;
+ }
case 71: break;
- case 28:
- { String value = yytext().toString().trim();
- if ("python".equalsIgnoreCase(value)) {
- myState = 1;
- yybegin(IN_INLINE);
+ case 28:
+ { String value = yytext().toString().trim();
+ if ("python".equalsIgnoreCase(value)) {
+ myState = 1;
+ yybegin(IN_INLINE);
+ }
+ else if ("django".equalsIgnoreCase(value) ||
+ "html+django".equalsIgnoreCase(value)) {
+ myState = 2;
+ yybegin(IN_INLINE);
+ }
+ else if ("javascript".equalsIgnoreCase(value)) {
+ myState = 3;
+ yybegin(IN_INLINE);
+ }
+ else {
+ yybegin(INIT);
+ }
+ return LINE;
}
- else if ("django".equalsIgnoreCase(value) ||
- "html+django".equalsIgnoreCase(value)) {
- myState = 2;
- yybegin(IN_INLINE);
- }
- else if ("javascript".equalsIgnoreCase(value)) {
- myState = 3;
- yybegin(IN_INLINE);
- }
- else {
- yybegin(INIT);
- }
- return LINE;
- }
case 72: break;
- case 23:
- { yybegin(IN_VALUE); return CUSTOM_DIRECTIVE;
- }
+ case 23:
+ { yybegin(IN_VALUE); return CUSTOM_DIRECTIVE;
+ }
case 73: break;
- case 21:
- { yybegin(IN_LINE); return SPEC_SYMBOL;
- }
+ case 21:
+ { yybegin(IN_LINE); return SPEC_SYMBOL;
+ }
case 74: break;
- case 6:
- { yybegin(INIT); return WHITESPACE;
- }
+ case 6:
+ { yybegin(INIT); return WHITESPACE;
+ }
case 75: break;
- case 19:
- { yypushback(1); yybegin(IN_LINE);
- }
+ case 19:
+ { yypushback(1); yybegin(IN_LINE);
+ }
case 76: break;
- case 34:
- { yybegin(IN_INLINE);return LITERAL_BLOCK_START;
- }
+ case 34:
+ { yybegin(IN_INLINE);return LITERAL_BLOCK_START;
+ }
case 77: break;
- case 38:
- { yypushback(1); yybegin(INIT); return FIELD;
- }
+ case 38:
+ { yypushback(1); yybegin(INIT); return FIELD;
+ }
case 78: break;
- case 2:
- { yybegin(INDENTED); return chooseType();
- }
+ case 2:
+ { yybegin(INDENTED); return chooseType();
+ }
case 79: break;
- case 43:
- { yybegin(IN_HIGHLIGHT); return CUSTOM_DIRECTIVE;
- }
+ case 43:
+ { yybegin(IN_HIGHLIGHT); return CUSTOM_DIRECTIVE;
+ }
case 80: break;
- case 40:
- { return BOLD;
- }
+ case 40:
+ { return BOLD;
+ }
case 81: break;
- case 29:
- { yybegin(IN_EXPLISIT_MARKUP); return EXPLISIT_MARKUP_START;
- }
+ case 29:
+ { yybegin(IN_EXPLISIT_MARKUP); return EXPLISIT_MARKUP_START;
+ }
case 82: break;
- case 37:
- { yybegin(IN_VALUE); return DIRECTIVE;
- }
+ case 37:
+ { yybegin(IN_VALUE); return DIRECTIVE;
+ }
case 83: break;
- case 11:
- { yybegin(PRE_QUOTED); return SPEC_SYMBOL;
- }
+ case 11:
+ { yybegin(PRE_QUOTED); return SPEC_SYMBOL;
+ }
case 84: break;
- case 14:
- { yypushback(1); myState = 0; yybegin(INIT);
- }
+ case 14:
+ { yypushback(1); myState = 0; yybegin(INIT);
+ }
case 85: break;
- case 30:
- { yypushback(1); return REFERENCE_NAME;
- }
+ case 30:
+ { yypushback(1); return REFERENCE_NAME;
+ }
case 86: break;
default:
if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
@@ -7789,4 +9713,4 @@
}
-}
\ No newline at end of file
+}
diff --git a/python/rest/src/com/jetbrains/rest/lexer/rest.flex b/python/rest/src/com/jetbrains/rest/lexer/rest.flex
index 5790073..ee0b331 100644
--- a/python/rest/src/com/jetbrains/rest/lexer/rest.flex
+++ b/python/rest/src/com/jetbrains/rest/lexer/rest.flex
@@ -23,7 +23,7 @@
SPACE=[\ \t]
ADORNMENT_SYMBOL="="|"-"|"`"|":"|"."|"'"|\"|"~"|"^"|"_"|"*"|"+"|"#"|">"
-ADORNMENT=("="{4, 80}|"-"{4, 80}|"`"{4, 80}|":"{4, 80}|"."{4, 80}|"'"{4, 80}|\"{4, 80}|"~"{4, 80}|"^"{4, 80}|"_"{4, 80}|"*"{4, 80}|"+"{4, 80}|"#"{4, 80}){CRLF}
+ADORNMENT=("="{4, 80}|"-"{4, 80}|"`"{4, 80}|":"{4, 80}|"."{4, 80}|"'"{4, 80}|\"{4, 80}|"~"{4, 80}|"^"{4, 80}|"_"{4, 80}|"*"{4, 80}|"+"{4, 80}|"#"{4, 80})" "*{CRLF}
SEPARATOR=[\n .:,()\{\}\[\]\-]
USUAL_TYPES="attention"|"caution"|"danger"|"error"|"hint"|"important"|"note"|"tip"|"warning"|"admonition"|"image"|"figure"|"topic"|"sidebar"|"parsed-literal"|"rubric"|"epigraph"|"highlights"|"pull-quote"|"compound"|"container"|"table"|"csv-table"|"list-table"|"contents"|"sectnum"|"section-autonumbering"|"header"|"footer"|"target-notes"|"footnotes"|"citations"|"meta"|"replace"|"unicode"|"date"|"include"|"raw"|"class"|"role"|"default-role"|"title"|"restructuredtext-test-directive"
HIGHLIGHT_TYPES= "highlight" | "sourcecode" | "code-block"
diff --git a/python/rest/src/com/jetbrains/rest/psi/RestLineManipulator.java b/python/rest/src/com/jetbrains/rest/psi/RestLineManipulator.java
index 2f2202a..3fcb374 100644
--- a/python/rest/src/com/jetbrains/rest/psi/RestLineManipulator.java
+++ b/python/rest/src/com/jetbrains/rest/psi/RestLineManipulator.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,13 +17,15 @@
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.AbstractElementManipulator;
+import org.jetbrains.annotations.NotNull;
/**
* User : ktisha
*/
public class RestLineManipulator extends AbstractElementManipulator<RestLine> {
- public RestLine handleContentChange(RestLine element, TextRange range, String newContent) {
+ @Override
+ public RestLine handleContentChange(@NotNull RestLine element, @NotNull TextRange range, String newContent) {
final String oldText = element.getText();
final String newText = oldText.substring(0, range.getStartOffset()) + newContent + oldText.substring(range.getEndOffset());
element.updateText(newText);
diff --git a/python/rest/src/com/jetbrains/rest/psi/RestTitle.java b/python/rest/src/com/jetbrains/rest/psi/RestTitle.java
index eb93cbe..05c2e66 100644
--- a/python/rest/src/com/jetbrains/rest/psi/RestTitle.java
+++ b/python/rest/src/com/jetbrains/rest/psi/RestTitle.java
@@ -16,6 +16,7 @@
package com.jetbrains.rest.psi;
import com.intellij.lang.ASTNode;
+import com.jetbrains.rest.validation.RestElementVisitor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -37,15 +38,13 @@
@Nullable
public String getName() {
- final String text = getNode().getText();
- if (text.length() == 0) return null;
+ final String text = getNode().getText().trim();
+ if (text.length() < 2) return null;
final char adorn = text.charAt(text.length()-2);
final CharacterIterator it = new StringCharacterIterator(text);
int finish = 0;
for (char ch = it.last(); ch != CharacterIterator.DONE; ch = it.previous()) {
- if (finish == 0)
- finish++;
- else if (ch != adorn) {
+ if (ch != adorn) {
finish = it.getIndex();
break;
}
@@ -63,4 +62,25 @@
return null;
return text.substring(start, finish).trim();
}
+
+ @Nullable
+ public String getUnderline() {
+ final String text = getNode().getText().trim();
+ if (text.length() < 2) return null;
+ final char adorn = text.charAt(text.length()-2);
+ final CharacterIterator it = new StringCharacterIterator(text);
+ int start = 0;
+ for (char ch = it.last(); ch != CharacterIterator.DONE; ch = it.previous()) {
+ if (ch != adorn) {
+ start = it.getIndex() + 1;
+ break;
+ }
+ }
+ return text.substring(start, text.length());
+ }
+
+ @Override
+ protected void acceptRestVisitor(RestElementVisitor visitor) {
+ visitor.visitTitle(this);
+ }
}
diff --git a/python/rest/src/com/jetbrains/rest/structureView/RestStructureViewElement.java b/python/rest/src/com/jetbrains/rest/structureView/RestStructureViewElement.java
index 0ba21cc..bb22445 100644
--- a/python/rest/src/com/jetbrains/rest/structureView/RestStructureViewElement.java
+++ b/python/rest/src/com/jetbrains/rest/structureView/RestStructureViewElement.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -22,6 +22,7 @@
import com.intellij.psi.PsiElementVisitor;
import com.jetbrains.rest.psi.RestElement;
import com.jetbrains.rest.psi.RestTitle;
+import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
@@ -56,6 +57,7 @@
return myElement.canNavigateToSource();
}
+ @NotNull
public StructureViewTreeElement[] getChildren() {
final Set<RestElement> childrenElements = new LinkedHashSet<RestElement>();
myElement.acceptChildren(new PsiElementVisitor() {
@@ -77,6 +79,7 @@
return children;
}
+ @NotNull
public ItemPresentation getPresentation() {
return new ItemPresentation() {
public String getPresentableText() {
diff --git a/python/rest/src/com/jetbrains/rest/structureView/RestStructureViewModel.java b/python/rest/src/com/jetbrains/rest/structureView/RestStructureViewModel.java
index 0897b99..8d96f83 100644
--- a/python/rest/src/com/jetbrains/rest/structureView/RestStructureViewModel.java
+++ b/python/rest/src/com/jetbrains/rest/structureView/RestStructureViewModel.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -48,7 +48,7 @@
}
@Override
- public boolean isAutoExpand(StructureViewTreeElement element) {
+ public boolean isAutoExpand(@NotNull StructureViewTreeElement element) {
return element.getValue() instanceof PsiFile;
}
diff --git a/python/rest/src/com/jetbrains/rest/validation/RestTitleAnnotator.java b/python/rest/src/com/jetbrains/rest/validation/RestTitleAnnotator.java
new file mode 100644
index 0000000..c906e31
--- /dev/null
+++ b/python/rest/src/com/jetbrains/rest/validation/RestTitleAnnotator.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2000-2013 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.rest.validation;
+
+import com.jetbrains.rest.RestBundle;
+import com.jetbrains.rest.psi.RestTitle;
+
+public class RestTitleAnnotator extends RestAnnotator {
+ @Override
+ public void visitTitle(final RestTitle node) {
+ final String name = node.getName();
+ if (name == null) return;
+ int nameLen = name.length();
+ final String underline = node.getUnderline();
+ if (underline != null && nameLen != underline.length()) {
+ getHolder().createWarningAnnotation(node, RestBundle.message("ANN.title.length"));
+ }
+ }
+}
diff --git a/python/src/META-INF/IdeTipsAndTricks.xml b/python/src/META-INF/IdeTipsAndTricks.xml
new file mode 100644
index 0000000..41a5feb
--- /dev/null
+++ b/python/src/META-INF/IdeTipsAndTricks.xml
@@ -0,0 +1,113 @@
+<idea-plugin version="2">
+ <extensions defaultExtensionNs="com.intellij">
+ <tipAndTrick file="Welcome.html"/>
+ <tipAndTrick file="MultipleProjects.html"/>
+ <tipAndTrick file="GoToClass.html"/>
+ <tipAndTrick file="CodeCompletion.html"/>
+ <tipAndTrick file="ClassNameCompletion.html"/>
+ <tipAndTrick file="FindUsages.html"/>
+ <tipAndTrick file="QuickJavaDoc.html"/>
+ <tipAndTrick file="GoToDeclaration.html"/>
+ <tipAndTrick file="FileStructurePopup.html"/>
+ <tipAndTrick file="Rename.html"/>
+ <tipAndTrick file="TabInLookups.html"/>
+ <tipAndTrick file="TabInEditorClose.html"/>
+ <tipAndTrick file="SelectIn.html"/>
+ <tipAndTrick file="SpeedSearch.html"/>
+ <tipAndTrick file="Escape.html"/>
+ <tipAndTrick file="CtrlW.html"/>
+ <tipAndTrick file="ExtractVariable.html"/>
+ <tipAndTrick file="CtrlD.html"/>
+ <tipAndTrick file="MoveUpDown.html"/>
+ <tipAndTrick file="JoinLines.html"/>
+ <tipAndTrick file="ParameterInfo.html"/>
+ <tipAndTrick file="JumpToLastEdit.html"/>
+ <tipAndTrick file="HighlightUsagesInFile.html"/>
+ <tipAndTrick file="LocalVCS.html"/>
+ <tipAndTrick file="RecentFiles.html"/>
+ <tipAndTrick file="MethodSeparators.html"/>
+ <tipAndTrick file="CodeCompletionMiddle.html"/>
+ <tipAndTrick file="MethodUpDown.html"/>
+ <tipAndTrick file="ClipboardStack.html"/>
+ <tipAndTrick file="QuickJavaDocInLookups.html"/>
+ <tipAndTrick file="OverrideImplementMethods.html"/>
+ <tipAndTrick file="MenuItemsDescriptions.html"/>
+ <tipAndTrick file="GoToSymbol.html"/>
+ <tipAndTrick file="RecentChanges.html"/>
+ <tipAndTrick file="ImageFileCompletion.html"/>
+ <tipAndTrick file="QuickSwitchScheme.html"/>
+ <tipAndTrick file="CamelPrefixesInNavigationPopups.html"/>
+ <tipAndTrick file="ColumnSelection.html"/>
+ <tipAndTrick file="PyColorFiles.html"/>
+ <tipAndTrick file="CopyWithNoSelection.html"/>
+ <tipAndTrick file="MoveToChangelist.html"/>
+ <tipAndTrick file="moveFileToChangelist.html"/>
+ <tipAndTrick file="ShowUsages.html"/>
+ <tipAndTrick file="GoToAction.html"/>
+ <tipAndTrick file="GoToInspection.html"/>
+ <tipAndTrick file="SearchInSettings.html"/>
+ <tipAndTrick file="SelectRunDebugConfiguration.html"/>
+ <tipAndTrick file="ShowAppliedStyles.html"/>
+ <tipAndTrick file="ImagesLookup.html"/>
+ <tipAndTrick file="RenameCssSelector.html"/>
+ <tipAndTrick file="ColorEditingInCss.html"/>
+ <tipAndTrick file="Spellchecker.html"/>
+ <tipAndTrick file="SpellcheckerDictionaries.html"/>
+ <tipAndTrick file="TagNameCompletion.html"/>
+ <tipAndTrick file="WildcardsInNavigationPopups.html"/>
+ <tipAndTrick file="VcsQuickList.html"/>
+ <tipAndTrick file="Comment.html"/>
+ <tipAndTrick file="NavBar.html"/>
+ <tipAndTrick file="ChangesView.html"/>
+ <tipAndTrick file="Surround.html"/>
+ <tipAndTrick file="Consoles.html"/>
+ <tipAndTrick file="ConsolesCodeCompletion.html"/>
+ <tipAndTrick file="ConsolesHistory.html"/>
+ <tipAndTrick file="QuickFixRightArrow.html"/>
+ <tipAndTrick file="NavigateToFilePath.html"/>
+ <tipAndTrick file="IssueNavigation.html"/>
+ <tipAndTrick file="Managepy.html"/>
+ <tipAndTrick file="Templates.html"/>
+ <tipAndTrick file="Switcher.html"/>
+ <tipAndTrick file="DragToOpen.html"/>
+ <tipAndTrick file="CloseOthers.html"/>
+ <tipAndTrick file="EnterDirectoryInGotoFile.html"/>
+ <tipAndTrick file="GotoLineInFile.html"/>
+ <tipAndTrick file="LineEndings.html"/>
+ <tipAndTrick file="LineEndingsFolder.html"/>
+ <tipAndTrick file="HierarchyBrowser.html"/>
+ <tipAndTrick file="ShowHideSideBars.html"/>
+ <tipAndTrick file="ExcludeFromProject.html"/>
+ <tipAndTrick file="CodeCompletionNoShift.html"/>
+ <tipAndTrick file="CommitCtrlK.html"/>
+ <tipAndTrick file="FindReplaceToggle.html"/>
+ <tipAndTrick file="ScopesInTODO.html"/>
+ <tipAndTrick file="PreviewTODO.html"/>
+ <tipAndTrick file="SelectTasks.html"/>
+ <tipAndTrick file="RunConfigFolders.html"/>
+ <tipAndTrick file="LiveTemplatesDjango.html"/>
+ <tipAndTrick file="LiveTemplates.html"/>
+ <tipAndTrick file="SpeedSearchinLiveTemplates.html"/>
+ <tipAndTrick file="LaunchConsole.html"/>
+ <tipAndTrick file="Interpreter.html"/>
+ <tipAndTrick file="RemoteInterpreter.html"/>
+ <tipAndTrick file="BreakpointSpeedmenu.html"/>
+ <tipAndTrick file="BuiltInServer.html"/>
+ <tipAndTrick file="ConfiguringTerminal.html"/>
+ <tipAndTrick file="Terminal.html"/>
+ <tipAndTrick file="SearchEverywhere.html"/>
+ <tipAndTrick file="WideScreen.html"/>
+ <tipAndTrick file="WordCompletion.html"/>
+ <tipAndTrick file="Reopen.html"/>
+ <tipAndTrick file="Emmet.html"/>
+ <tipAndTrick file="RefactorThis.html"/>
+ <tipAndTrick file="ToolWindowsQuickAccess.html"/>
+ <tipAndTrick file="CamelHumpsInCodeCompletion.html"/>
+ <tipAndTrick file="CancelByControlArrows.html"/>
+ <tipAndTrick file="ChangeSorting.html"/>
+ <tipAndTrick file="CheckRegExp.html"/>
+ <tipAndTrick file="CtrlDotInLookups.html"/>
+ <tipAndTrick file="FinishByControlEnter.html"/>
+ <tipAndTrick file="HorizontalScrolling.html"/>
+ </extensions>
+</idea-plugin>
\ No newline at end of file
diff --git a/python/src/META-INF/pycharm-core.xml b/python/src/META-INF/pycharm-core.xml
index 7a4a9c6..dc95bd0 100644
--- a/python/src/META-INF/pycharm-core.xml
+++ b/python/src/META-INF/pycharm-core.xml
@@ -1,5 +1,6 @@
<idea-plugin version="2" xmlns:xi="http://www.w3.org/2001/XInclude">
<!-- Components and extensions declared in this file work ONLY in PyCharm, not in Python plugin. -->
+ <xi:include href="/META-INF/IdeTipsAndTricks.xml" xpointer="xpointer(/idea-plugin/*)"/>
<xi:include href="/META-INF/PlatformLangPlugin.xml" xpointer="xpointer(/idea-plugin/*)"/>
<xi:include href="/META-INF/XmlPlugin.xml" xpointer="xpointer(/idea-plugin/*)"/>
<xi:include href="/META-INF/ImagesPlugin.xml" xpointer="xpointer(/idea-plugin/*)">
@@ -24,14 +25,12 @@
</project-components>
<module value="com.intellij.modules.xml"/>
- <module value="com.intellij.modules.python"/>
<extensions defaultExtensionNs="com.intellij">
<projectViewPane implementation="com.intellij.ide.projectView.impl.ProjectViewPane"/>
<projectAttachProcessor implementation="com.intellij.platform.ModuleAttachProcessor"/>
- <!--<applicationConfigurable instance="com.jetbrains.python.configuration.PythonSdkConfigurable"/>-->
<projectConfigurable instance="com.jetbrains.python.configuration.PythonContentEntriesConfigurable"/>
<projectConfigurable instance="com.jetbrains.python.buildout.BuildoutModulesConfigurable"/>
<projectConfigurable instance="com.jetbrains.python.configuration.PyActiveSdkModuleConfigurable"/>
diff --git a/python/src/META-INF/python-core.xml b/python/src/META-INF/python-core.xml
index 6c02c7a..e402912 100644
--- a/python/src/META-INF/python-core.xml
+++ b/python/src/META-INF/python-core.xml
@@ -3,6 +3,8 @@
<resource-bundle>com.jetbrains.python.PyBundle</resource-bundle>
+ <module value="com.intellij.modules.python"/>
+
<extensions defaultExtensionNs="com.intellij">
<nameSuggestionProvider implementation="com.jetbrains.python.refactoring.PyNameSuggestionProvider"/>
<methodNavigationOffsetProvider implementation="com.jetbrains.python.codeInsight.PyMethodNavigationOffsetProvider"/>
@@ -18,6 +20,7 @@
<lang.foldingBuilder language="Python" implementationClass="com.jetbrains.python.PythonFoldingBuilder"/>
<lang.findUsagesProvider language="Python" implementationClass="com.jetbrains.python.findUsages.PythonFindUsagesProvider"/>
<lang.formatter language="Python" implementationClass="com.jetbrains.python.formatter.PythonFormattingModelBuilder"/>
+ <preFormatProcessor implementation="com.jetbrains.python.formatter.PyPreFormatProcessor"/>
<lang.whiteSpaceFormattingStrategy language="Python"
implementationClass="com.jetbrains.python.formatter.PyWhiteSpaceFormattingStrategy"/>
<lang.lineWrapStrategy language="Python" implementationClass="com.jetbrains.python.formatter.PyLineWrapPositionStrategy"/>
@@ -76,7 +79,7 @@
<applicationService serviceInterface="com.jetbrains.python.module.PyModuleService"
serviceImplementation="com.jetbrains.python.module.PyModuleServiceImpl"/>
- <typedHandler implementation="com.jetbrains.python.codeInsight.KeywordTypedHandler" id="pyCommaAfterKwd"/>
+ <typedHandler implementation="com.jetbrains.python.codeInsight.PyKeywordTypedHandler" id="pyCommaAfterKwd"/>
<typedHandler implementation="com.jetbrains.python.codeInsight.PyMethodNameTypedHandler" id="pyMethodNameTypedHandler"/>
<typedHandler implementation="com.jetbrains.python.editor.PythonSpaceHandler"/>
@@ -86,6 +89,7 @@
<stubIndex implementation="com.jetbrains.python.psi.stubs.PySuperClassIndex"/>
<stubIndex implementation="com.jetbrains.python.psi.stubs.PyVariableNameIndex"/>
<stubIndex implementation="com.jetbrains.python.psi.stubs.PyInstanceAttributeIndex"/>
+ <fileBasedIndex implementation="com.jetbrains.python.psi.stubs.PyModuleNameIndex"/>
<declarationRangeHandler key="com.jetbrains.python.psi.PyClass"
implementationClass="com.jetbrains.python.codeInsight.PyDeclarationRangeHandler"/>
@@ -114,6 +118,8 @@
<runConfigurationProducer implementation="com.jetbrains.python.testing.unittest.PythonUnitTestConfigurationProducer"/>
<testSrcLocator implementation="com.jetbrains.python.testing.PythonUnitTestTestIdUrlProvider"/>
+
+ <testSrcLocator implementation="com.jetbrains.python.testing.nosetest.PythonNoseTestUrlProvider"/>
<runConfigurationProducer implementation="com.jetbrains.python.testing.pytest.PyTestConfigurationProducer"/>
<runConfigurationProducer implementation="com.jetbrains.python.testing.doctest.PythonDocTestConfigurationProducer"/>
@@ -129,7 +135,6 @@
<highlightUsagesHandlerFactory implementation="com.jetbrains.python.codeInsight.highlighting.PyHighlightExitPointsHandlerFactory"/>
<joinLinesHandler implementation="com.jetbrains.python.editor.PyJoinLinesHandler"/>
- <duplicates.profile implementation="com.jetbrains.python.duplocator.PyDuplicatesProfile"/>
<intentionAction>
<className>com.jetbrains.python.codeInsight.intentions.PyConvertMethodToPropertyIntention</className>
@@ -328,11 +333,13 @@
<localInspection language="Python" shortName="PyShadowingNamesInspection" displayName="Shadowing names from outer scopes" groupKey="INSP.GROUP.python" enabledByDefault="true" level="WEAK WARNING" implementationClass="com.jetbrains.python.inspections.PyShadowingNamesInspection"/>
<localInspection language="Python" shortName="PyAbstractClassInspection" displayName="Class must implement all abstract methods" groupKey="INSP.GROUP.python" enabledByDefault="true" level="WARNING" implementationClass="com.jetbrains.python.inspections.PyAbstractClassInspection"/>
<localInspection language="Python" shortName="PyPep8NamingInspection" displayName="PEP 8 naming convention violation" groupKey="INSP.GROUP.python" enabledByDefault="true" level="WEAK WARNING" implementationClass="com.jetbrains.python.inspections.PyPep8NamingInspection"/>
+ <localInspection language="Python" shortName="PyAssignmentToLoopOrWithParameterInspection" displayName="Assignment to 'for' loop or 'with' statement parameter" groupKey="INSP.GROUP.python" enabledByDefault="true" level="WEAK WARNING" implementationClass="com.jetbrains.python.inspections.PyAssignmentToLoopOrWithParameterInspection"/>
<liveTemplateContext implementation="com.jetbrains.python.codeInsight.liveTemplates.PythonTemplateContextType"/>
<liveTemplateMacro implementation="com.jetbrains.python.codeInsight.liveTemplates.CollectionElementNameMacro"/>
<liveTemplateMacro implementation="com.jetbrains.python.codeInsight.liveTemplates.PyClassNameMacro"/>
<liveTemplateMacro implementation="com.jetbrains.python.codeInsight.liveTemplates.PyFunctionNameMacro"/>
+ <liveTemplateMacro implementation="com.jetbrains.python.codeInsight.liveTemplates.PyIterableVariableMacro"/>
<codeInsight.overrideMethod language="Python" implementationClass="com.jetbrains.python.codeInsight.override.PyOverrideMethodsHandler"/>
<lang.refactoringSupport language="Python" implementationClass="com.jetbrains.python.refactoring.PyRefactoringProvider"/>
@@ -363,12 +370,16 @@
<applicationService serviceInterface="com.jetbrains.python.codeInsight.PyCodeInsightSettings"
serviceImplementation="com.jetbrains.python.codeInsight.PyCodeInsightSettings"/>
+ <applicationService serviceInterface="com.jetbrains.python.testing.PyTestFrameworkService"
+ serviceImplementation="com.jetbrains.python.testing.PyTestFrameworkService"/>
<autoImportOptionsProvider instance="com.jetbrains.python.codeInsight.imports.PyAutoImportOptions"/>
<defaultLiveTemplatesProvider implementation="com.jetbrains.python.codeInsight.liveTemplates.PyDefaultLiveTemplatesProvider"/>
<completion.contributor language="Python"
implementationClass="com.jetbrains.python.codeInsight.completion.PyClassNameCompletionContributor"/>
+ <completion.contributor language="Python"
+ implementationClass="com.jetbrains.python.codeInsight.completion.PyBracketProtectingCompletionContributor"/>
<weigher key="completion" implementationClass="com.jetbrains.python.codeInsight.completion.PythonCompletionWeigher" order="first"/>
<completion.confidence language="Python" implementationClass="com.jetbrains.python.codeInsight.completion.PyCompletionConfidence"/>
<typedHandler implementation="com.jetbrains.python.console.completion.PythonConsoleAutopopupBlockingHandler" id="pydevBlockAutoPopup"
@@ -511,6 +522,7 @@
<extensionPoints>
<extensionPoint qualifiedName="Pythonid.importResolver" interface="com.jetbrains.python.psi.impl.PyImportResolver"/>
+ <extensionPoint qualifiedName="Pythonid.resolveResultRater" interface="com.jetbrains.python.psi.impl.PyResolveResultRater"/>
<extensionPoint qualifiedName="Pythonid.typeProvider" interface="com.jetbrains.python.psi.impl.PyTypeProvider"/>
<extensionPoint qualifiedName="Pythonid.pySuperMethodsSearch" interface="com.intellij.util.QueryExecutor"/>
<extensionPoint qualifiedName="Pythonid.pyClassInheritorsSearch" interface="com.intellij.util.QueryExecutor"/>
@@ -544,7 +556,6 @@
<pySuperMethodsSearch implementation="com.jetbrains.python.psi.search.PySuperMethodsSearchExecutor"/>
<pyClassInheritorsSearch implementation="com.jetbrains.python.psi.search.PyClassInheritorsSearchExecutor"/>
<pyOverridingMethodsSearch implementation="com.jetbrains.python.psi.search.PyOverridingMethodsSearchExecutor"/>
- <runnableScriptFilter implementation="com.jetbrains.python.testing.pytest.PyTestRunnableScriptFilter"/>
<runnableScriptFilter implementation="com.jetbrains.python.testing.PythonUnitTestRunnableScriptFilter"/>
<dumbAnnotator implementation="com.jetbrains.python.validation.DocStringAnnotator"/>
<dumbAnnotator implementation="com.jetbrains.python.validation.PyDefinitionsAnnotator"/>
diff --git a/python/src/com/jetbrains/NotNullPredicate.java b/python/src/com/jetbrains/NotNullPredicate.java
new file mode 100644
index 0000000..b34ab62
--- /dev/null
+++ b/python/src/com/jetbrains/NotNullPredicate.java
@@ -0,0 +1,29 @@
+package com.jetbrains;
+
+import com.google.common.base.Predicate;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Filters out nullable elements allowing children to filter not-null elements
+ *
+ * @author Ilya.Kazakevich
+ */
+public class NotNullPredicate<T> implements Predicate<T> {
+ /**
+ * Simply filters nulls
+ */
+ public static final Predicate<Object> INSTANCE = new NotNullPredicate<Object>();
+
+ @Override
+ public final boolean apply(@Nullable final T input) {
+ if (input == null) {
+ return false;
+ }
+ return applyNotNull(input);
+ }
+
+ protected boolean applyNotNull(@NotNull final T input) {
+ return true;
+ }
+}
diff --git a/python/src/com/jetbrains/python/PyBundle.java b/python/src/com/jetbrains/python/PyBundle.java
index 3cb565d..28b853e 100644
--- a/python/src/com/jetbrains/python/PyBundle.java
+++ b/python/src/com/jetbrains/python/PyBundle.java
@@ -18,33 +18,34 @@
import com.intellij.CommonBundle;
import com.intellij.reference.SoftReference;
import org.jetbrains.annotations.NonNls;
+import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.PropertyKey;
import java.lang.ref.Reference;
import java.util.ResourceBundle;
// A copy of Ruby's.
+
/**
* Resource bundle access.
* Date: Nov 25, 2008 2:36:10 AM
*/
public class PyBundle {
- private static Reference<ResourceBundle> ourBundle;
+ public static String message(@NotNull @PropertyKey(resourceBundle = BUNDLE) String key, @NotNull Object... params) {
+ return CommonBundle.message(getBundle(), key, params);
+ }
+
+ private static Reference<ResourceBundle> ourBundle;
@NonNls
private static final String BUNDLE = "com.jetbrains.python.PyBundle";
private PyBundle() {
}
- public static String message(@PropertyKey(resourceBundle = BUNDLE)String key, Object... params) {
- return CommonBundle.message(getBundle(), key, params);
- }
-
// Cached loading
private static ResourceBundle getBundle() {
- ResourceBundle bundle = null;
- if (ourBundle != null) bundle = ourBundle.get();
+ ResourceBundle bundle = SoftReference.dereference(ourBundle);
if (bundle == null) {
bundle = ResourceBundle.getBundle(BUNDLE);
ourBundle = new SoftReference<ResourceBundle>(bundle);
diff --git a/python/src/com/jetbrains/python/PyBundle.properties b/python/src/com/jetbrains/python/PyBundle.properties
index 5ee3ef7..2e280b4 100644
--- a/python/src/com/jetbrains/python/PyBundle.properties
+++ b/python/src/com/jetbrains/python/PyBundle.properties
@@ -511,7 +511,14 @@
INSP.NAME.global.undefined=Global variable is undefined at the module level
INSP.NAME.global.$0.undefined=Global variable ''{0}'' is undefined at the module level
+#PyAssignmentToLoopOrWithParameterInspection
+INSP.NAME.assignment.to.loop.or.with.parameter.display.name=Assignment to 'for' loop or 'with' statement parameter
+INSP.NAME.assignment.to.loop.or.with.parameter.display.message=Variable ''{0}'' already declared in ''for'' loop or ''with'' statement above
+
# Refactoring
+refactoring.will.not.be.accessible=Member, you are trying to move depends on ''{0}'' which will not be accessible after this refactoring
+
+
# introduce
refactoring.introduce.name.error=Incorrect name
refactoring.introduce.selection.error=Cannot perform refactoring using selected element(s)
@@ -529,9 +536,11 @@
# pull up
refactoring.pull.up.dialog.title=Pull members up to
+refactoring.pull.up.dialog.move.members.to.class=Move members to class
+refactoring.pull.up.dialog.members.to.be.moved=Following members would be moved
refactoring.pull.up.error.cannot.perform.refactoring.using.selected.elements=Cannot perform pull member up using selected element(s)
refactoring.pull.up.error.cannot.perform.refactoring.not.inside.class=Cannot perform pull member up: not inside the class
-refactoring.pull.up.error.cannot.perform.refactoring.no.base.classes=Class {0} has no super classes
+refactoring.pull.up.error.cannot.perform.refactoring.no.base.classes=Class {0} has no super classes or none of them could be used for refactoring
# push down
refactoring.push.down.dialog.title=Push members down from
@@ -553,8 +562,10 @@
refactoring.extract.method.error.cannot.perform.refactoring.with.local=Cannot perform refactoring from expression with local variables modifications and return instructions inside code fragment
# extract superclass
-refactoring.extract.super.target.path.outside.roots=Target directory is outside the project.<br>Must be within content roots
-refactoring.extract.super.name.0.must.be.ident=Name ''{0}'' is invalid.<br/>Must be a valid Python identifier
+refactoring.extract.super.target.path.outside.roots=Target directory is outside the project. Must be within content roots
+refactoring.extract.super.target.class.already.exists=Class ''{0}'' already exists in this module
+refactoring.extract.super.name.0.must.be.ident=Name ''{0}'' is invalid. Must be a valid Python identifier
+refactoring.extract.super.class.no.members.allowed=None of members could be extracted
# move
refactoring.move.class.or.function=Move class or function
@@ -585,26 +596,26 @@
refactoring.change.signature.error.wrong.caret.position.method.name=The caret should be positioned at the name of the method to be refactored.
### Annotators ###
-ANN.deleting.none=deleting None
-ANN.assign.to.none=assignment to None
-ANN.cant.assign.to.call=can't assign to function call
-ANN.cant.delete.call=can't delete function call
-ANN.cant.aug.assign.to.generator=augmented assign to generator expression not possible
-ANN.cant.aug.assign.to.tuple.or.generator=augmented assign to tuple literal or generator expression not possible
-ANN.cant.assign.to.generator=assign to generator expression not possible
-ANN.cant.assign.to.operator=can't assign to operator
-ANN.cant.assign.to.parens=can't assign to ()
-ANN.cant.assign.to.brackets=can't assign to []
-ANN.cant.aug.assign.to.list.or.comprh=augmented assign to list literal or comprehension not possible
-ANN.cant.assign.to.comprh=can't assign to list comprehension
-ANN.cant.assign.to.dict.comprh=can't assign to dict comprehension
-ANN.cant.assign.to.set.comprh=can't assign to set comprehension
-ANN.cant.aug.assign.to.comprh=augmented assign to list comprehension not possible
-ANN.cant.aug.assign.to.dict.comprh=augmented assign to dict comprehension not possible
-ANN.cant.aug.assign.to.set.comprh=augmented assign to set comprehension not possible
-ANN.cant.assign.to.literal=can't assign to literal
-ANN.cant.delete.literal=can't delete literal
-ANN.cant.assign.to.lambda=can't assign to lambda
+ANN.deleting.none=Deleting None
+ANN.assign.to.none=Assignment to None
+ANN.cant.assign.to.call=Can't assign to function call
+ANN.cant.delete.call=Can't delete function call
+ANN.cant.aug.assign.to.generator=Augmented assign to generator expression not possible
+ANN.cant.aug.assign.to.tuple.or.generator=Augmented assign to tuple literal or generator expression not possible
+ANN.cant.assign.to.generator=Assign to generator expression not possible
+ANN.cant.assign.to.operator=Can't assign to operator
+ANN.cant.assign.to.parens=Can't assign to ()
+ANN.cant.assign.to.brackets=Can't assign to []
+ANN.cant.aug.assign.to.list.or.comprh=Augmented assign to list literal or comprehension not possible
+ANN.cant.assign.to.comprh=Can't assign to list comprehension
+ANN.cant.assign.to.dict.comprh=Can't assign to dict comprehension
+ANN.cant.assign.to.set.comprh=Can't assign to set comprehension
+ANN.cant.aug.assign.to.comprh=Augmented assign to list comprehension not possible
+ANN.cant.aug.assign.to.dict.comprh=Augmented assign to dict comprehension not possible
+ANN.cant.aug.assign.to.set.comprh=Augmented assign to set comprehension not possible
+ANN.cant.assign.to.literal=Can't assign to literal
+ANN.cant.delete.literal=Can't delete literal
+ANN.cant.assign.to.lambda=Can't assign to lambda
ANN.break.outside.loop='break' outside loop
ANN.continue.outside.loop='continue' outside loop
@@ -637,13 +648,14 @@
PARSE.expected.colon=':' expected
PARSE.expected.rpar=')' expected
PARSE.expected.lpar='(' expected
+PARSE.expected.rbrace='}' expected
PARSE.expected.tick='`' (backtick) expected
PARSE.expected.name=name expected
PARSE.expected.colon.or.rbracket=':' or ']' expected
PARSE.expected.comma.or.rpar=',' or ')' expected
PARSE.expected.else='else' expected
-PARSE.expected.func.name=function name expected
+PARSE.expected.identifier=Identifier expected
PARSE.expected.comma.lpar.rpar=',' or '(' or ')' expected
PARSE.expected.statement.break=Statement break expected
PARSE.expected.@.or.def='@' or 'def' expected
@@ -769,9 +781,9 @@
sdk.error.dialog.failed.modules=Failed modules
sdk.error.dialog.were.blacklisted=Generation of skeletons for the modules above will be tried again when the modules are updated or a new version of generator is available.
sdk.gen.querying.$0=Querying skeleton generator for {0}...
-sdk.gen.updating.builtins.$0=Updating skeletons of builtins for {0}
-sdk.gen.updating.$0=Updating skeletons for {0}
-sdk.gen.cleaning.$0=Cleaning up skeletons for {0}
+sdk.gen.updating.builtins.$0=Updating skeletons of builtins for {0}...
+sdk.gen.updating.$0=Updating skeletons for {0}...
+sdk.gen.cleaning.$0=Cleaning up skeletons for {0}...
sdk.gen.reloading=Reloading generated skeletons...
sdk.gen.reading.versions.file=Reading versions file...
sdk.gen.notify.converting.old.skels=Converting old skeletons
diff --git a/python/src/com/jetbrains/python/PyGotoClassContributor.java b/python/src/com/jetbrains/python/PyGotoClassContributor.java
index 11b759e..2662f66 100644
--- a/python/src/com/jetbrains/python/PyGotoClassContributor.java
+++ b/python/src/com/jetbrains/python/PyGotoClassContributor.java
@@ -19,11 +19,14 @@
import com.intellij.navigation.NavigationItem;
import com.intellij.openapi.project.Project;
import com.intellij.util.ArrayUtil;
-import com.jetbrains.python.psi.PyClass;
+import com.intellij.util.containers.HashSet;
import com.jetbrains.python.psi.stubs.PyClassNameIndex;
+import com.jetbrains.python.psi.stubs.PyModuleNameIndex;
import org.jetbrains.annotations.NotNull;
-import java.util.Collection;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
/**
* @author yole
@@ -31,13 +34,18 @@
public class PyGotoClassContributor implements ChooseByNameContributor {
@NotNull
public String[] getNames(final Project project, final boolean includeNonProjectItems) {
- final Collection<String> classNames = PyClassNameIndex.allKeys(project);
- return ArrayUtil.toStringArray(classNames);
+ Set<String> results = new HashSet<String>();
+ results.addAll(PyClassNameIndex.allKeys(project));
+ results.addAll(PyModuleNameIndex.getAllKeys(project));
+ return ArrayUtil.toStringArray(results);
}
@NotNull
- public NavigationItem[] getItemsByName(final String name, final String pattern, final Project project, final boolean includeNonProjectItems) {
- final Collection<PyClass> classes = PyClassNameIndex.find(name, project, includeNonProjectItems);
- return classes.toArray(new NavigationItem[classes.size()]);
+ public NavigationItem[] getItemsByName(final String name, final String pattern, final Project project,
+ final boolean includeNonProjectItems) {
+ final List<NavigationItem> results = new ArrayList<NavigationItem>();
+ results.addAll(PyClassNameIndex.find(name, project, includeNonProjectItems));
+ results.addAll(PyModuleNameIndex.find(name, project, includeNonProjectItems));
+ return results.toArray(new NavigationItem[results.size()]);
}
}
diff --git a/python/src/com/jetbrains/python/PyGotoSymbolContributor.java b/python/src/com/jetbrains/python/PyGotoSymbolContributor.java
index 6a283fd..e5eb410 100644
--- a/python/src/com/jetbrains/python/PyGotoSymbolContributor.java
+++ b/python/src/com/jetbrains/python/PyGotoSymbolContributor.java
@@ -25,6 +25,7 @@
import com.jetbrains.python.psi.search.PyProjectScopeBuilder;
import com.jetbrains.python.psi.stubs.PyClassNameIndex;
import com.jetbrains.python.psi.stubs.PyFunctionNameIndex;
+import com.jetbrains.python.psi.stubs.PyModuleNameIndex;
import com.jetbrains.python.psi.stubs.PyVariableNameIndex;
import org.jetbrains.annotations.NotNull;
@@ -41,6 +42,7 @@
public String[] getNames(final Project project, final boolean includeNonProjectItems) {
Set<String> symbols = new HashSet<String>();
symbols.addAll(PyClassNameIndex.allKeys(project));
+ symbols.addAll(PyModuleNameIndex.getAllKeys(project));
symbols.addAll(StubIndex.getInstance().getAllKeys(PyFunctionNameIndex.KEY, project));
symbols.addAll(StubIndex.getInstance().getAllKeys(PyVariableNameIndex.KEY, project));
return ArrayUtil.toStringArray(symbols);
@@ -54,6 +56,7 @@
List<NavigationItem> symbols = new ArrayList<NavigationItem>();
symbols.addAll(PyClassNameIndex.find(name, project, scope));
+ symbols.addAll(PyModuleNameIndex.find(name, project, includeNonProjectItems));
symbols.addAll(PyFunctionNameIndex.find(name, project, scope));
symbols.addAll(PyVariableNameIndex.find(name, project, scope));
diff --git a/python/src/com/jetbrains/python/PyParameterInfoHandler.java b/python/src/com/jetbrains/python/PyParameterInfoHandler.java
index b3f99f2..5aec444 100644
--- a/python/src/com/jetbrains/python/PyParameterInfoHandler.java
+++ b/python/src/com/jetbrains/python/PyParameterInfoHandler.java
@@ -51,7 +51,7 @@
return ArrayUtil.EMPTY_OBJECT_ARRAY; // we don't
}
- public PyArgumentList findElementForParameterInfo(final CreateParameterInfoContext context) {
+ public PyArgumentList findElementForParameterInfo(@NotNull final CreateParameterInfoContext context) {
PyArgumentList arglist = findArgumentList(context);
if (arglist != null) {
final TypeEvalContext typeEvalContext = TypeEvalContext.userInitiated(arglist.getContainingFile());
@@ -69,11 +69,11 @@
return ParameterInfoUtils.findParentOfType(context.getFile(), context.getOffset(), PyArgumentList.class);
}
- public void showParameterInfo(@NotNull final PyArgumentList element, final CreateParameterInfoContext context) {
+ public void showParameterInfo(@NotNull final PyArgumentList element, @NotNull final CreateParameterInfoContext context) {
context.showHint(element, element.getTextOffset(), this);
}
- public PyArgumentList findElementForUpdatingParameterInfo(final UpdateParameterInfoContext context) {
+ public PyArgumentList findElementForUpdatingParameterInfo(@NotNull final UpdateParameterInfoContext context) {
return findArgumentList(context);
}
@@ -82,7 +82,7 @@
We cannot store an index since we cannot determine what is an argument until we actually map arguments to parameters.
This is because a tuple in arguments may be a whole argument or map to a tuple parameter.
*/
- public void updateParameterInfo(@NotNull final PyArgumentList arglist, final UpdateParameterInfoContext context) {
+ public void updateParameterInfo(@NotNull final PyArgumentList arglist, @NotNull final UpdateParameterInfoContext context) {
if (context.getParameterOwner() != arglist) {
context.removeHint();
return;
@@ -125,7 +125,7 @@
}
@Override
- public void updateUI(final CallArgumentsMapping prevResult, final ParameterInfoUIContext context) {
+ public void updateUI(final CallArgumentsMapping prevResult, @NotNull final ParameterInfoUIContext context) {
if (prevResult == null) return;
final PyArgumentList argList = prevResult.getArgumentList();
if (!argList.isValid()) return;
diff --git a/python/src/com/jetbrains/python/buildout/BuildoutFacet.java b/python/src/com/jetbrains/python/buildout/BuildoutFacet.java
index eaaa603..e5e607a 100644
--- a/python/src/com/jetbrains/python/buildout/BuildoutFacet.java
+++ b/python/src/com/jetbrains/python/buildout/BuildoutFacet.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -73,7 +73,7 @@
VirtualFileManager.getInstance().addVirtualFileListener(new VirtualFileAdapter() {
@Override
- public void contentsChanged(VirtualFileEvent event) {
+ public void contentsChanged(@NotNull VirtualFileEvent event) {
if (Comparing.equal(event.getFile(), getScript())) {
updatePaths();
attachLibrary(module);
diff --git a/python/src/com/jetbrains/python/codeInsight/KeywordTypedHandler.java b/python/src/com/jetbrains/python/codeInsight/KeywordTypedHandler.java
deleted file mode 100644
index 5e3e6ca..0000000
--- a/python/src/com/jetbrains/python/codeInsight/KeywordTypedHandler.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright 2000-2013 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.jetbrains.python.codeInsight;
-
-import com.intellij.codeInsight.editorActions.TypedHandlerDelegate;
-import com.intellij.openapi.editor.Document;
-import com.intellij.openapi.editor.Editor;
-import com.intellij.openapi.fileTypes.FileType;
-import com.intellij.openapi.project.Project;
-import com.intellij.psi.PsiElement;
-import com.intellij.psi.PsiFile;
-import com.jetbrains.python.PythonFileType;
-import com.jetbrains.python.psi.PyStringLiteralExpression;
-
-/**
- * Handles overtyping ':' in definitions.
- * User: dcheryasov
- * Date: May 29, 2009 4:42:03 AM
- */
-public class KeywordTypedHandler extends TypedHandlerDelegate {
- @Override
- public Result beforeCharTyped(char character, Project project, Editor editor, PsiFile file, FileType fileType) {
- if (!(fileType instanceof PythonFileType)) return Result.CONTINUE; // else we'd mess up with other file types!
- if (character == ':') {
- final Document document = editor.getDocument();
- final int offset = editor.getCaretModel().getOffset();
-
- PsiElement token = file.findElementAt(offset - 1);
- if (token == null || offset >= document.getTextLength()) return Result.CONTINUE; // sanity check: beyond EOL
-
- PsiElement here_elt = file.findElementAt(offset);
- if (here_elt == null) return Result.CONTINUE;
- if (here_elt instanceof PyStringLiteralExpression || here_elt.getParent() instanceof PyStringLiteralExpression) return Result.CONTINUE;
-
- // double colons aren't found in Python's syntax, so we can safely overtype a colon everywhere but strings.
- String here_text = here_elt.getText();
- if (":".equals(here_text)) {
- editor.getCaretModel().moveToOffset(offset + 1); // overtype, that is, jump over
- return Result.STOP;
- }
- UnindentingInsertHandler.unindentAsNeeded(project, editor, file);
- }
-
- return Result.CONTINUE; // the default
- }
-
-}
diff --git a/python/src/com/jetbrains/python/codeInsight/PyBreakContinueGotoProvider.java b/python/src/com/jetbrains/python/codeInsight/PyBreakContinueGotoProvider.java
index 51ff238..778999a 100644
--- a/python/src/com/jetbrains/python/codeInsight/PyBreakContinueGotoProvider.java
+++ b/python/src/com/jetbrains/python/codeInsight/PyBreakContinueGotoProvider.java
@@ -26,15 +26,15 @@
import com.jetbrains.python.PyTokenTypes;
import com.jetbrains.python.PythonLanguage;
import com.jetbrains.python.psi.*;
+import org.jetbrains.annotations.Nullable;
/**
* Provides reaction on ctrl+click for {@code break} and {@code continue} statements.
- * User: dcheryasov
- * Date: Nov 5, 2009 4:58:54 AM
+ * @author dcheryasov
*/
public class PyBreakContinueGotoProvider extends GotoDeclarationHandlerBase {
-
- public PsiElement getGotoDeclarationTarget(PsiElement source, Editor editor) {
+ @Override
+ public PsiElement getGotoDeclarationTarget(@Nullable PsiElement source, Editor editor) {
if (source != null && source.getLanguage() instanceof PythonLanguage) {
final PyLoopStatement loop = PsiTreeUtil.getParentOfType(source, PyLoopStatement.class, false, PyFunction.class, PyClass.class);
if (loop != null) {
@@ -66,6 +66,7 @@
}
}
}
+
return null;
}
}
diff --git a/python/src/com/jetbrains/python/codeInsight/PyContainerProvider.java b/python/src/com/jetbrains/python/codeInsight/PyContainerProvider.java
new file mode 100644
index 0000000..11a3fe5
--- /dev/null
+++ b/python/src/com/jetbrains/python/codeInsight/PyContainerProvider.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.codeInsight;
+
+import com.intellij.codeInsight.ContainerProvider;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.StubBasedPsiElement;
+import com.intellij.psi.stubs.StubElement;
+import com.jetbrains.python.psi.PyElement;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * @author vlan
+ */
+public class PyContainerProvider implements ContainerProvider {
+ @Nullable
+ @Override
+ public PsiElement getContainer(@NotNull PsiElement item) {
+ if (item instanceof PyElement && item instanceof StubBasedPsiElement) {
+ return getContainerByStub((StubBasedPsiElement)item);
+ }
+ return null;
+ }
+
+ @Nullable
+ private static PsiElement getContainerByStub(@NotNull StubBasedPsiElement element) {
+ final StubElement stub = element.getStub();
+ if (stub != null) {
+ final StubElement parentStub = stub.getParentStub();
+ if (parentStub != null) {
+ return parentStub.getPsi();
+ }
+ }
+ return null;
+ }
+}
diff --git a/python/src/com/jetbrains/python/codeInsight/PyInjectionUtil.java b/python/src/com/jetbrains/python/codeInsight/PyInjectionUtil.java
index d68e6c6..fe51d64 100644
--- a/python/src/com/jetbrains/python/codeInsight/PyInjectionUtil.java
+++ b/python/src/com/jetbrains/python/codeInsight/PyInjectionUtil.java
@@ -23,6 +23,7 @@
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import java.util.Arrays;
import java.util.List;
import static com.jetbrains.python.inspections.PyStringFormatParser.*;
@@ -31,43 +32,85 @@
* @author vlan
*/
public class PyInjectionUtil {
+
+ public static class InjectionResult {
+ public static InjectionResult EMPTY = new InjectionResult(false, true);
+
+ private final boolean myInjected;
+ private final boolean myStrict;
+
+ private InjectionResult(boolean injected, boolean strict) {
+ myInjected = injected;
+ myStrict = strict;
+ }
+
+ public boolean isInjected() {
+ return myInjected;
+ }
+
+ public boolean isStrict() {
+ return myStrict;
+ }
+
+ public InjectionResult append(@NotNull InjectionResult result) {
+ return new InjectionResult(myInjected || result.isInjected(), myStrict && result.isStrict());
+ }
+ }
+
+ public static final List<Class<? extends PyExpression>> ELEMENTS_TO_INJECT_IN =
+ Arrays.asList(PyStringLiteralExpression.class, PyParenthesizedExpression.class, PyBinaryExpression.class, PyCallExpression.class);
+
private PyInjectionUtil() {}
/**
- * Returns true if the element is the largest expression that represents a string literal, possibly with concatenation, parentheses,
- * or formatting.
+ * Returns the largest expression in the specified context that represents a string literal suitable for language injection, possibly
+ * with concatenation, parentheses, or formatting.
*/
- public static boolean isLargestStringLiteral(@NotNull PsiElement element) {
- final PsiElement parent = element.getParent();
- return isStringLiteralPart(element) && (parent == null || !isStringLiteralPart(parent));
+ @Nullable
+ public static PsiElement getLargestStringLiteral(@NotNull PsiElement context) {
+ PsiElement element = null;
+ for (PsiElement current = context; current != null && isStringLiteralPart(current, element); current = current.getParent()) {
+ element = current;
+ }
+ return element;
}
/**
* Registers language injections in the given registrar for the specified string literal element or its ancestor that contains
* string concatenations or formatting.
*/
- public static void registerStringLiteralInjection(@NotNull PsiElement element, @NotNull MultiHostRegistrar registrar) {
- processStringLiteral(element, registrar, "", "", Formatting.NONE);
+ @NotNull
+ public static InjectionResult registerStringLiteralInjection(@NotNull PsiElement element, @NotNull MultiHostRegistrar registrar) {
+ // Assume percent formatting since the MySQL parser cannot handle Python-style substitutions
+ return processStringLiteral(element, registrar, "", "", Formatting.PERCENT);
}
- private static boolean isStringLiteralPart(@NotNull PsiElement element) {
- if (element instanceof PyStringLiteralExpression) {
+ private static boolean isStringLiteralPart(@NotNull PsiElement element, @Nullable PsiElement context) {
+ if (element == context) {
+ return true;
+ }
+ else if (element instanceof PyStringLiteralExpression) {
return true;
}
else if (element instanceof PyParenthesizedExpression) {
final PyExpression contained = ((PyParenthesizedExpression)element).getContainedExpression();
- return contained != null && isStringLiteralPart(contained);
+ return contained != null && isStringLiteralPart(contained, context);
}
else if (element instanceof PyBinaryExpression) {
final PyBinaryExpression expr = (PyBinaryExpression)element;
final PyExpression left = expr.getLeftExpression();
final PyExpression right = expr.getRightExpression();
- return (expr.isOperator("+") && (isStringLiteralPart(left) || right != null && isStringLiteralPart(right))) ||
- expr.isOperator("%") && isStringLiteralPart(left);
+ if (expr.isOperator("+")) {
+ return isStringLiteralPart(left, context) || right != null && isStringLiteralPart(right, context);
+ }
+ else if (expr.isOperator("%")) {
+ return right != context && isStringLiteralPart(left, context);
+ }
+ return false;
}
else if (element instanceof PyCallExpression) {
final PyExpression qualifier = getFormatCallQualifier((PyCallExpression)element);
- return qualifier != null && isStringLiteralPart(qualifier);
+ return qualifier != null && isStringLiteralPart(qualifier, context);
}
return false;
}
@@ -85,10 +128,13 @@
return null;
}
- private static void processStringLiteral(@NotNull PsiElement element, @NotNull MultiHostRegistrar registrar, @NotNull String prefix,
- @NotNull String suffix, @NotNull Formatting formatting) {
- final String missingValue = "missing";
+ @NotNull
+ private static InjectionResult processStringLiteral(@NotNull PsiElement element, @NotNull MultiHostRegistrar registrar,
+ @NotNull String prefix, @NotNull String suffix, @NotNull Formatting formatting) {
+ final String missingValue = "missing_value";
if (element instanceof PyStringLiteralExpression) {
+ boolean injected = false;
+ boolean strict = true;
final PyStringLiteralExpression expr = (PyStringLiteralExpression)element;
final List<TextRange> ranges = expr.getStringValueTextRanges();
final String text = expr.getText();
@@ -96,53 +142,78 @@
if (formatting != Formatting.NONE) {
final String part = range.substring(text);
final List<FormatStringChunk> chunks = formatting == Formatting.NEW_STYLE ? parseNewStyleFormat(part) : parsePercentFormat(part);
+ if (!filterSubstitutions(chunks).isEmpty()) {
+ strict = false;
+ }
for (int i = 0; i < chunks.size(); i++) {
final FormatStringChunk chunk = chunks.get(i);
if (chunk instanceof ConstantChunk) {
final int nextIndex = i + 1;
- final String chunkPrefix = i == 1 && chunks.get(0) instanceof SubstitutionChunk ? missingValue : "";
- final String chunkSuffix = nextIndex < chunks.size() &&
- chunks.get(nextIndex) instanceof SubstitutionChunk ? missingValue : "";
+ final String chunkPrefix;
+ if (i == 1 && chunks.get(0) instanceof SubstitutionChunk) {
+ chunkPrefix = missingValue;
+ }
+ else if (i == 0) {
+ chunkPrefix = prefix;
+ } else {
+ chunkPrefix = "";
+ }
+ final String chunkSuffix;
+ if (nextIndex < chunks.size() && chunks.get(nextIndex) instanceof SubstitutionChunk) {
+ chunkSuffix = missingValue;
+ }
+ else if (nextIndex == chunks.size()) {
+ chunkSuffix = suffix;
+ }
+ else {
+ chunkSuffix = "";
+ }
final TextRange chunkRange = chunk.getTextRange().shiftRight(range.getStartOffset());
registrar.addPlace(chunkPrefix, chunkSuffix, expr, chunkRange);
+ injected = true;
}
}
}
else {
registrar.addPlace(prefix, suffix, expr, range);
+ injected = true;
}
}
+ return new InjectionResult(injected, strict);
}
else if (element instanceof PyParenthesizedExpression) {
final PyExpression contained = ((PyParenthesizedExpression)element).getContainedExpression();
if (contained != null) {
- processStringLiteral(contained, registrar, prefix, suffix, formatting);
+ return processStringLiteral(contained, registrar, prefix, suffix, formatting);
}
}
else if (element instanceof PyBinaryExpression) {
final PyBinaryExpression expr = (PyBinaryExpression)element;
final PyExpression left = expr.getLeftExpression();
final PyExpression right = expr.getRightExpression();
- final boolean isLeftString = isStringLiteralPart(left);
+ final boolean isLeftString = isStringLiteralPart(left, null);
if (expr.isOperator("+")) {
- final boolean isRightString = right != null && isStringLiteralPart(right);
+ final boolean isRightString = right != null && isStringLiteralPart(right, null);
+ InjectionResult result = InjectionResult.EMPTY;
if (isLeftString) {
- processStringLiteral(left, registrar, prefix, isRightString ? "" : missingValue, formatting);
+ result = result.append(processStringLiteral(left, registrar, prefix, isRightString ? "" : missingValue, formatting));
}
if (isRightString) {
- processStringLiteral(right, registrar, isLeftString ? "" : missingValue, suffix, formatting);
+ result = result.append(processStringLiteral(right, registrar, isLeftString ? "" : missingValue, suffix, formatting));
}
+ return result;
}
else if (expr.isOperator("%")) {
- processStringLiteral(left, registrar, prefix, suffix, Formatting.PERCENT);
+ return processStringLiteral(left, registrar, prefix, suffix, Formatting.PERCENT);
}
}
else if (element instanceof PyCallExpression) {
final PyExpression qualifier = getFormatCallQualifier((PyCallExpression)element);
if (qualifier != null) {
- processStringLiteral(qualifier, registrar, prefix, suffix, Formatting.NEW_STYLE);
+ return processStringLiteral(qualifier, registrar, prefix, suffix, Formatting.NEW_STYLE);
}
}
+ return InjectionResult.EMPTY;
}
private enum Formatting {
diff --git a/python/src/com/jetbrains/python/codeInsight/PyInjectorBase.java b/python/src/com/jetbrains/python/codeInsight/PyInjectorBase.java
new file mode 100644
index 0000000..4fd2560
--- /dev/null
+++ b/python/src/com/jetbrains/python/codeInsight/PyInjectorBase.java
@@ -0,0 +1,45 @@
+package com.jetbrains.python.codeInsight;
+
+import com.intellij.lang.Language;
+import com.intellij.lang.injection.MultiHostInjector;
+import com.intellij.lang.injection.MultiHostRegistrar;
+import com.intellij.psi.PsiElement;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+
+/**
+ * @author vlan
+ */
+public abstract class PyInjectorBase implements MultiHostInjector {
+ @Override
+ public void getLanguagesToInject(@NotNull MultiHostRegistrar registrar, @NotNull PsiElement context) {
+ registerInjection(registrar, context);
+ }
+
+ @NotNull
+ @Override
+ public List<? extends Class<? extends PsiElement>> elementsToInjectIn() {
+ return PyInjectionUtil.ELEMENTS_TO_INJECT_IN;
+ }
+
+ @Nullable
+ public abstract Language getInjectedLanguage(@NotNull PsiElement context);
+
+ protected PyInjectionUtil.InjectionResult registerInjection(@NotNull MultiHostRegistrar registrar, @NotNull PsiElement context) {
+ final Language language = getInjectedLanguage(context);
+ if (language != null) {
+ final PsiElement element = PyInjectionUtil.getLargestStringLiteral(context);
+ if (element != null) {
+ registrar.startInjecting(language);
+ final PyInjectionUtil.InjectionResult result = PyInjectionUtil.registerStringLiteralInjection(element, registrar);
+ if (result.isInjected()) {
+ registrar.doneInjecting();
+ }
+ return result;
+ }
+ }
+ return PyInjectionUtil.InjectionResult.EMPTY;
+ }
+}
diff --git a/python/src/com/jetbrains/python/codeInsight/PyKeywordTypedHandler.java b/python/src/com/jetbrains/python/codeInsight/PyKeywordTypedHandler.java
new file mode 100644
index 0000000..3bf094d
--- /dev/null
+++ b/python/src/com/jetbrains/python/codeInsight/PyKeywordTypedHandler.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2000-2013 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.codeInsight;
+
+import com.intellij.codeInsight.editorActions.TypedHandlerDelegate;
+import com.intellij.openapi.editor.Document;
+import com.intellij.openapi.editor.Editor;
+import com.intellij.openapi.fileTypes.FileType;
+import com.intellij.openapi.project.Project;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiFile;
+import com.jetbrains.python.PythonFileType;
+import com.jetbrains.python.psi.PyStringLiteralExpression;
+
+/**
+ * Handles overtyping ':' in definitions.
+ * User: dcheryasov
+ * Date: May 29, 2009 4:42:03 AM
+ */
+public class PyKeywordTypedHandler extends TypedHandlerDelegate {
+ @Override
+ public Result beforeCharTyped(char character, Project project, Editor editor, PsiFile file, FileType fileType) {
+ if (!(fileType instanceof PythonFileType)) return Result.CONTINUE; // else we'd mess up with other file types!
+ if (character == ':') {
+ final Document document = editor.getDocument();
+ final int offset = editor.getCaretModel().getOffset();
+
+ PsiElement token = file.findElementAt(offset - 1);
+ if (token == null || offset >= document.getTextLength()) return Result.CONTINUE; // sanity check: beyond EOL
+
+ PsiElement here_elt = file.findElementAt(offset);
+ if (here_elt == null) return Result.CONTINUE;
+ if (here_elt instanceof PyStringLiteralExpression || here_elt.getParent() instanceof PyStringLiteralExpression) return Result.CONTINUE;
+
+ // double colons aren't found in Python's syntax, so we can safely overtype a colon everywhere but strings.
+ String here_text = here_elt.getText();
+ if (":".equals(here_text)) {
+ editor.getCaretModel().moveToOffset(offset + 1); // overtype, that is, jump over
+ return Result.STOP;
+ }
+ PyUnindentingInsertHandler.unindentAsNeeded(project, editor, file);
+ }
+
+ return Result.CONTINUE; // the default
+ }
+
+}
diff --git a/python/src/com/jetbrains/python/codeInsight/PyUnindentingInsertHandler.java b/python/src/com/jetbrains/python/codeInsight/PyUnindentingInsertHandler.java
new file mode 100644
index 0000000..d932d71
--- /dev/null
+++ b/python/src/com/jetbrains/python/codeInsight/PyUnindentingInsertHandler.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright 2000-2013 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.codeInsight;
+
+import com.intellij.codeInsight.completion.InsertHandler;
+import com.intellij.codeInsight.completion.InsertionContext;
+import com.intellij.openapi.editor.Document;
+import com.intellij.openapi.editor.Editor;
+import com.intellij.openapi.editor.actions.EditorActionUtil;
+import com.intellij.openapi.project.Project;
+import com.intellij.psi.PsiDocumentManager;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiFile;
+import com.intellij.psi.util.PsiTreeUtil;
+import com.jetbrains.python.PyNames;
+import com.jetbrains.python.codeInsight.completion.PythonLookupElement;
+import com.jetbrains.python.psi.PyStatementWithElse;
+import com.jetbrains.python.psi.PyTryExceptStatement;
+
+/**
+ * Adjusts indentation after a final part keyword is inserted, e.g. an "else:".
+ * User: dcheryasov
+ * Date: Mar 2, 2010 6:48:40 PM
+ */
+public class PyUnindentingInsertHandler implements InsertHandler<PythonLookupElement> {
+ public final static PyUnindentingInsertHandler INSTANCE = new PyUnindentingInsertHandler();
+
+ private PyUnindentingInsertHandler() {
+ }
+
+ public void handleInsert(InsertionContext context, PythonLookupElement item) {
+ unindentAsNeeded(context.getProject(), context.getEditor(), context.getFile());
+ }
+
+ /**
+ * Unindent current line to be flush with a starting part, detecting the part if necessary.
+ *
+ * @param project
+ * @param editor
+ * @param file
+ * @return true if unindenting succeeded
+ */
+ public static boolean unindentAsNeeded(Project project, Editor editor, PsiFile file) {
+ // TODO: handle things other than "else"
+ final Document document = editor.getDocument();
+ int offset = editor.getCaretModel().getOffset();
+ CharSequence text = document.getCharsSequence();
+ if (offset >= text.length()) {
+ offset = text.length() - 1;
+ }
+
+ int line_start_offset = document.getLineStartOffset(document.getLineNumber(offset));
+ int nonspace_offset = findBeginning(line_start_offset, text);
+
+
+ Class<? extends PsiElement> parentClass = null;
+
+ int last_offset = nonspace_offset + PyNames.FINALLY.length(); // the longest of all
+ if (last_offset > offset) last_offset = offset;
+ int local_length = last_offset - nonspace_offset + 1;
+ if (local_length > 0) {
+ String piece = text.subSequence(nonspace_offset, last_offset + 1).toString();
+ final int else_len = PyNames.ELSE.length();
+ if (local_length >= else_len) {
+ if ((piece.startsWith(PyNames.ELSE) || piece.startsWith(PyNames.ELIF)) &&
+ (else_len == piece.length() || piece.charAt(else_len) < 'a' || piece.charAt(else_len) > 'z')) {
+ parentClass = PyStatementWithElse.class;
+ }
+ }
+ final int except_len = PyNames.EXCEPT.length();
+ if (local_length >= except_len) {
+ if (piece.startsWith(PyNames.EXCEPT) &&
+ (except_len == piece.length() || piece.charAt(except_len) < 'a' || piece.charAt(except_len) > 'z')) {
+ parentClass = PyTryExceptStatement.class;
+ }
+ }
+ final int finally_len = PyNames.FINALLY.length();
+ if (local_length >= finally_len) {
+ if (piece.startsWith(PyNames.FINALLY) &&
+ (finally_len == piece.length() || piece.charAt(finally_len) < 'a' || piece.charAt(finally_len) > 'z')) {
+ parentClass = PyTryExceptStatement.class;
+ }
+ }
+ }
+
+
+ if (parentClass == null) return false; // failed
+
+ PsiDocumentManager.getInstance(project).commitDocument(document); // reparse
+
+ PsiElement token = file.findElementAt(offset - 2); // -1 is our ':'; -2 is even safer.
+ PsiElement outer = PsiTreeUtil.getParentOfType(token, parentClass);
+ if (outer != null) {
+ int outer_offset = outer.getTextOffset();
+ int outer_indent = outer_offset - document.getLineStartOffset(document.getLineNumber(outer_offset));
+ assert outer_indent >= 0;
+ int current_indent = nonspace_offset - line_start_offset;
+ int indent = outer_indent - current_indent;
+ EditorActionUtil.indentLine(project, editor, document.getLineNumber(offset), editor.getSettings().isUseTabCharacter(project)
+ ? indent * editor.getSettings().getTabSize(project)
+ : indent);
+ return true;
+ }
+ return false;
+ }
+
+
+ // finds offset of first non-space in the line
+ private static int findBeginning(int start_offset, CharSequence text) {
+ int current_offset = start_offset;
+ int text_length = text.length();
+ while (current_offset < text_length) {
+ char current_char = text.charAt(current_offset);
+ if (current_char != ' ' && current_char != '\t' && current_char != '\n') break;
+ current_offset += 1;
+ }
+ return current_offset;
+ }
+}
diff --git a/python/src/com/jetbrains/python/codeInsight/UnindentingInsertHandler.java b/python/src/com/jetbrains/python/codeInsight/UnindentingInsertHandler.java
deleted file mode 100644
index cd29026..0000000
--- a/python/src/com/jetbrains/python/codeInsight/UnindentingInsertHandler.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright 2000-2013 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.jetbrains.python.codeInsight;
-
-import com.intellij.codeInsight.completion.InsertHandler;
-import com.intellij.codeInsight.completion.InsertionContext;
-import com.intellij.openapi.editor.Document;
-import com.intellij.openapi.editor.Editor;
-import com.intellij.openapi.editor.actions.EditorActionUtil;
-import com.intellij.openapi.project.Project;
-import com.intellij.psi.PsiDocumentManager;
-import com.intellij.psi.PsiElement;
-import com.intellij.psi.PsiFile;
-import com.intellij.psi.util.PsiTreeUtil;
-import com.jetbrains.python.codeInsight.completion.PythonLookupElement;
-import com.jetbrains.python.psi.PyStatementWithElse;
-import com.jetbrains.python.psi.PyTryExceptStatement;
-
-/**
- * Adjusts indentation after a final part keyword is inserted, e.g. an "else:".
- * User: dcheryasov
- * Date: Mar 2, 2010 6:48:40 PM
- */
-public class UnindentingInsertHandler implements InsertHandler<PythonLookupElement> {
- public final static UnindentingInsertHandler INSTANCE = new UnindentingInsertHandler();
-
- private UnindentingInsertHandler() {
- }
-
- public void handleInsert(InsertionContext context, PythonLookupElement item) {
- unindentAsNeeded(context.getProject(), context.getEditor(), context.getFile());
- }
-
- /**
- * Unindent current line to be flush with a starting part, detecting the part if necessary.
- * @param project
- * @param editor
- * @param file
- * @return true if unindenting succeeded
- */
- public static boolean unindentAsNeeded(Project project, Editor editor, PsiFile file) {
- // TODO: handle things other than "else"
- final Document document = editor.getDocument();
- int offset = editor.getCaretModel().getOffset();
- CharSequence text = document.getCharsSequence();
- if (offset >= text.length()) offset = text.length() - 1;
-
- int line_start_offset = document.getLineStartOffset(document.getLineNumber(offset));
- int nonspace_offset = findBeginning(line_start_offset, text);
-
-
- Class<? extends PsiElement> parentClass = null;
-
- int last_offset = nonspace_offset + "finally".length(); // the longest of all
- if (last_offset > offset) last_offset = offset;
- int local_length = last_offset - nonspace_offset + 1;
- if (local_length > 0) {
- String piece = text.subSequence(nonspace_offset, last_offset+1).toString();
- final int else_len = "else".length();
- if (local_length >= else_len) {
- if ((piece.startsWith("else") || piece.startsWith("elif")) && (else_len == piece.length() || piece.charAt(else_len) < 'a' || piece.charAt(else_len) > 'z')) {
- parentClass = PyStatementWithElse.class;
- }
- }
- final int except_len = "except".length();
- if (local_length >= except_len) {
- if (piece.startsWith("except") && (except_len == piece.length() || piece.charAt(except_len) < 'a' || piece.charAt(except_len) > 'z')) {
- parentClass = PyTryExceptStatement.class;
- }
- }
- final int finally_len = "finally".length();
- if (local_length >= finally_len) {
- if (piece.startsWith("finally") && (finally_len == piece.length() || piece.charAt(finally_len) < 'a' || piece.charAt(finally_len) > 'z')) {
- parentClass = PyTryExceptStatement.class;
- }
- }
- }
-
-
- if (parentClass == null) return false; // failed
-
- PsiDocumentManager.getInstance(project).commitDocument(document); // reparse
-
- PsiElement token = file.findElementAt(offset-2); // -1 is our ':'; -2 is even safer.
- PsiElement outer = PsiTreeUtil.getParentOfType(token, parentClass);
- if (outer != null) {
- int outer_offset = outer.getTextOffset();
- int outer_indent = outer_offset - document.getLineStartOffset(document.getLineNumber(outer_offset));
- assert outer_indent >= 0;
- int current_indent = nonspace_offset - line_start_offset;
- EditorActionUtil.indentLine(project, editor, document.getLineNumber(offset), outer_indent - current_indent);
- return true;
- }
- return false;
- }
-
-
- // finds offset of first non-space in the line
- private static int findBeginning(int start_offset, CharSequence text) {
- int current_offset = start_offset;
- int text_length = text.length();
- while (current_offset < text_length) {
- char current_char = text.charAt(current_offset);
- if (current_char != ' ' && current_char != '\t' && current_char != '\n') break;
- current_offset += 1;
- }
- return current_offset;
- }
-}
diff --git a/python/src/com/jetbrains/python/codeInsight/completion/OverwriteEqualsInsertHandler.java b/python/src/com/jetbrains/python/codeInsight/completion/OverwriteEqualsInsertHandler.java
index 1fb1070..e70d1e6 100644
--- a/python/src/com/jetbrains/python/codeInsight/completion/OverwriteEqualsInsertHandler.java
+++ b/python/src/com/jetbrains/python/codeInsight/completion/OverwriteEqualsInsertHandler.java
@@ -34,7 +34,7 @@
}
Document doc = context.getDocument();
int tailOffset = context.getTailOffset();
- if (doc.getCharsSequence().charAt(tailOffset) == '=') {
+ if (tailOffset < doc.getCharsSequence().length() && doc.getCharsSequence().charAt(tailOffset) == '=') {
doc.deleteString(tailOffset, tailOffset+1);
}
}
diff --git a/python/src/com/jetbrains/python/codeInsight/completion/PyBracketProtectingCompletionContributor.java b/python/src/com/jetbrains/python/codeInsight/completion/PyBracketProtectingCompletionContributor.java
new file mode 100644
index 0000000..766e5be
--- /dev/null
+++ b/python/src/com/jetbrains/python/codeInsight/completion/PyBracketProtectingCompletionContributor.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2000-2013 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.codeInsight.completion;
+
+import com.intellij.codeInsight.completion.CompletionContributor;
+import com.intellij.codeInsight.completion.CompletionInitializationContext;
+import com.intellij.psi.PsiReference;
+import com.jetbrains.python.psi.impl.references.PyOperatorReference;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * @author yole
+ */
+public class PyBracketProtectingCompletionContributor extends CompletionContributor {
+ @Override
+ public void beforeCompletion(@NotNull CompletionInitializationContext context) {
+ PsiReference ref = context.getFile().findReferenceAt(context.getSelectionEndOffset());
+ if (ref instanceof PyOperatorReference) {
+ context.setReplacementOffset(context.getIdentifierEndOffset());
+ }
+ }
+}
diff --git a/python/src/com/jetbrains/python/codeInsight/completion/PyClassNameCompletionContributor.java b/python/src/com/jetbrains/python/codeInsight/completion/PyClassNameCompletionContributor.java
index 7725203..24318f8 100644
--- a/python/src/com/jetbrains/python/codeInsight/completion/PyClassNameCompletionContributor.java
+++ b/python/src/com/jetbrains/python/codeInsight/completion/PyClassNameCompletionContributor.java
@@ -54,7 +54,7 @@
if (parameters.isExtendedCompletion()) {
final PsiElement element = parameters.getPosition();
final PsiElement parent = element.getParent();
- if (parent instanceof PyReferenceExpression && ((PyReferenceExpression)parent).getQualifier() != null) {
+ if (parent instanceof PyReferenceExpression && ((PyReferenceExpression)parent).isQualified()) {
return;
}
if (parent instanceof PyStringLiteralExpression) {
@@ -71,12 +71,12 @@
final PsiFile originalFile = parameters.getOriginalFile();
addVariantsFromIndex(result, originalFile, PyClassNameIndex.KEY,
parent instanceof PyStringLiteralExpression ? STRING_LITERAL_INSERT_HANDLER : IMPORTING_INSERT_HANDLER,
- Conditions.<PyClass>alwaysTrue());
+ Conditions.<PyClass>alwaysTrue(), PyClass.class);
addVariantsFromIndex(result, originalFile, PyFunctionNameIndex.KEY,
- getFunctionInsertHandler(parent), IS_TOPLEVEL);
+ getFunctionInsertHandler(parent), IS_TOPLEVEL, PyFunction.class);
addVariantsFromIndex(result, originalFile, PyVariableNameIndex.KEY,
parent instanceof PyStringLiteralExpression ? STRING_LITERAL_INSERT_HANDLER : IMPORTING_INSERT_HANDLER,
- IS_TOPLEVEL);
+ IS_TOPLEVEL, PyTargetExpression.class);
addVariantsFromModules(result, originalFile, parent instanceof PyStringLiteralExpression);
}
}
@@ -117,13 +117,13 @@
final PsiFile targetFile,
final StubIndexKey<String, T> key,
final InsertHandler<LookupElement> insertHandler,
- final Condition<? super T> condition) {
+ final Condition<? super T> condition, Class<T> elementClass) {
final Project project = targetFile.getProject();
GlobalSearchScope scope = PyProjectScopeBuilder.excludeSdkTestsScope(targetFile);
Collection<String> keys = StubIndex.getInstance().getAllKeys(key, project);
for (final String elementName : CompletionUtil.sortMatching(resultSet.getPrefixMatcher(), keys)) {
- for (T element : StubIndex.getInstance().get(key, elementName, project, scope)) {
+ for (T element : StubIndex.getElements(key, elementName, project, scope, elementClass)) {
if (condition.value(element)) {
resultSet.addElement(LookupElementBuilder.createWithIcon(element)
.withTailText(" " + ((NavigationItem)element).getPresentation().getLocationString(), true)
diff --git a/python/src/com/jetbrains/python/codeInsight/completion/PyDocstringCompletionContributor.java b/python/src/com/jetbrains/python/codeInsight/completion/PyDocstringCompletionContributor.java
index 84d4b88..272adfa 100644
--- a/python/src/com/jetbrains/python/codeInsight/completion/PyDocstringCompletionContributor.java
+++ b/python/src/com/jetbrains/python/codeInsight/completion/PyDocstringCompletionContributor.java
@@ -16,6 +16,7 @@
package com.jetbrains.python.codeInsight.completion;
import com.intellij.codeInsight.completion.*;
+import com.intellij.codeInsight.lookup.AutoCompletionPolicy;
import com.intellij.codeInsight.lookup.LookupElementBuilder;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleUtilCore;
@@ -23,8 +24,6 @@
import com.intellij.psi.PsiFile;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.ProcessingContext;
-import com.jetbrains.python.PyTokenTypes;
-import com.jetbrains.python.documentation.PyDocumentationSettings;
import com.jetbrains.python.psi.PyDocStringOwner;
import com.jetbrains.python.psi.PyStringLiteralExpression;
import com.jetbrains.python.refactoring.PyRefactoringUtil;
@@ -32,7 +31,9 @@
import java.util.Collection;
+import static com.intellij.patterns.PlatformPatterns.psiComment;
import static com.intellij.patterns.PlatformPatterns.psiElement;
+import static com.intellij.patterns.StandardPatterns.or;
/**
* User : ktisha
@@ -40,7 +41,7 @@
public class PyDocstringCompletionContributor extends CompletionContributor {
public PyDocstringCompletionContributor() {
extend(CompletionType.BASIC,
- psiElement().inside(PyStringLiteralExpression.class).withElementType(PyTokenTypes.DOCSTRING),
+ or(psiElement().inside(PyStringLiteralExpression.class), psiComment()),
new IdentifierCompletionProvider());
}
@@ -54,23 +55,22 @@
ProcessingContext context,
@NotNull CompletionResultSet result) {
if (parameters.isAutoPopup()) return;
- final PyDocStringOwner docStringOwner = PsiTreeUtil.getParentOfType(parameters.getOriginalPosition(), PyDocStringOwner.class);
- if (docStringOwner != null) {
- final PsiFile file = docStringOwner.getContainingFile();
- final Module module = ModuleUtilCore.findModuleForPsiElement(docStringOwner);
- if (module != null) {
- final PyDocumentationSettings settings = PyDocumentationSettings.getInstance(module);
- if (!settings.isPlain(file)) return;
- result = result.withPrefixMatcher(getPrefix(parameters.getOffset(), file));
- final Collection<String> identifiers = PyRefactoringUtil.collectUsedNames(docStringOwner);
- for (String identifier : identifiers)
- result.addElement(LookupElementBuilder.create(identifier));
+ final PsiElement element = parameters.getOriginalPosition();
+ if (element == null) return;
+ final PsiFile file = element.getContainingFile();
+ if (file.findReferenceAt(parameters.getOffset()) != null) return;
+ final PyDocStringOwner docStringOwner = PsiTreeUtil.getParentOfType(element, PyDocStringOwner.class);
+ final Module module = ModuleUtilCore.findModuleForPsiElement(element);
+ if (module != null) {
+ result = result.withPrefixMatcher(getPrefix(parameters.getOffset(), file));
+ final Collection<String> identifiers = PyRefactoringUtil.collectUsedNames(docStringOwner);
+ for (String identifier : identifiers)
+ result.addElement(LookupElementBuilder.create(identifier).withAutoCompletionPolicy(AutoCompletionPolicy.NEVER_AUTOCOMPLETE));
- final Collection<String> fileIdentifiers = PyRefactoringUtil.collectUsedNames(parameters.getOriginalFile());
- for (String identifier : fileIdentifiers)
- result.addElement(LookupElementBuilder.create(identifier));
- }
+ final Collection<String> fileIdentifiers = PyRefactoringUtil.collectUsedNames(parameters.getOriginalFile());
+ for (String identifier : fileIdentifiers)
+ result.addElement(LookupElementBuilder.create(identifier).withAutoCompletionPolicy(AutoCompletionPolicy.NEVER_AUTOCOMPLETE));
}
}
}
diff --git a/python/src/com/jetbrains/python/codeInsight/completion/PyKeywordCompletionContributor.java b/python/src/com/jetbrains/python/codeInsight/completion/PyKeywordCompletionContributor.java
index 44ef899..ed6f2e3 100644
--- a/python/src/com/jetbrains/python/codeInsight/completion/PyKeywordCompletionContributor.java
+++ b/python/src/com/jetbrains/python/codeInsight/completion/PyKeywordCompletionContributor.java
@@ -33,7 +33,7 @@
import com.jetbrains.python.PyNames;
import com.jetbrains.python.PyTokenTypes;
import com.jetbrains.python.PythonLanguage;
-import com.jetbrains.python.codeInsight.UnindentingInsertHandler;
+import com.jetbrains.python.codeInsight.PyUnindentingInsertHandler;
import com.jetbrains.python.documentation.doctest.PyDocstringFile;
import com.jetbrains.python.psi.*;
import org.jetbrains.annotations.NonNls;
@@ -286,9 +286,9 @@
psiElement()
.inside(PyConditionalStatementPart.class)
.andOr(
- psiElement().afterLeaf(psiElement().withText("if")),
- psiElement().afterLeaf(psiElement().withText("elif")),
- psiElement().afterLeaf(psiElement().withText("while"))
+ psiElement().afterLeaf(psiElement().withText(PyNames.IF)),
+ psiElement().afterLeaf(psiElement().withText(PyNames.ELIF)),
+ psiElement().afterLeaf(psiElement().withText(PyNames.WHILE))
);
private static final PsiElementPattern.Capture<PsiElement> IN_IMPORT_STMT =
@@ -308,6 +308,9 @@
private static final PsiElementPattern.Capture<PsiElement> IN_EXCEPT_BODY =
psiElement().inside(psiElement(PyStatementList.class).inside(psiElement(PyExceptPart.class)));
+ private static final PsiElementPattern.Capture<PsiElement> IN_ELSE_BODY_OF_TRY =
+ psiElement().inside(psiElement(PyStatementList.class).inside(psiElement(PyElsePart.class).inside(PyTryExceptStatement.class)));
+
private static final PsiElementPattern.Capture<PsiElement> AFTER_IF = afterStatement(psiElement(PyIfStatement.class).withLastChild(
psiElement(PyIfPart.class)));
private static final PsiElementPattern.Capture<PsiElement> AFTER_TRY = afterStatement(psiElement(PyTryExceptStatement.class));
@@ -378,8 +381,8 @@
protected void addCompletions(
@NotNull final CompletionParameters parameters, final ProcessingContext context, @NotNull final CompletionResultSet result
) {
- putKeywords(result, TailType.NONE, "def", "class", "for", "if", "while", "with");
- putKeywords(result, TailType.CASE_COLON, "try");
+ putKeywords(result, TailType.NONE, PyNames.DEF, PyNames.CLASS, PyNames.FOR, PyNames.IF, PyNames.WHILE, PyNames.WITH);
+ putKeywords(result, TailType.CASE_COLON, PyNames.TRY);
}
}
);
@@ -402,13 +405,13 @@
protected void addCompletions(
@NotNull final CompletionParameters parameters, final ProcessingContext context, @NotNull final CompletionResultSet result
) {
- putKeywords(result, TailType.SPACE, "assert", "del", "exec", "from", "import", "raise");
+ putKeywords(result, TailType.SPACE, PyNames.ASSERT, PyNames.DEL, PyNames.EXEC, PyNames.FROM, PyNames.IMPORT, PyNames.RAISE);
putKeywords(result, TailType.NONE, PyNames.PASS);
}
}
);
- extend(CompletionType.BASIC, inStatement.andNot(PY3K), new PyKeywordCompletionProvider(TailType.SPACE, "print"));
+ extend(CompletionType.BASIC, inStatement.andNot(PY3K), new PyKeywordCompletionProvider(TailType.SPACE, PyNames.PRINT));
}
private void addBreak() {
@@ -421,7 +424,7 @@
.andNot(IN_ARG_LIST)
.and(IN_LOOP)
,
- new PyKeywordCompletionProvider(TailType.NONE, "break")
+ new PyKeywordCompletionProvider(TailType.NONE, PyNames.BREAK)
);
}
@@ -436,7 +439,7 @@
.andNot(IN_FINALLY_NO_LOOP)
.and(IN_LOOP)
,
- new PyKeywordCompletionProvider(TailType.NONE, "continue")
+ new PyKeywordCompletionProvider(TailType.NONE, PyNames.CONTINUE)
);
}
@@ -448,7 +451,7 @@
.and(IN_BEGIN_STMT)
.andNot(AFTER_QUALIFIER)
,
- new PyKeywordCompletionProvider("global", "return", "yield")
+ new PyKeywordCompletionProvider(PyNames.GLOBAL, PyNames.RETURN, PyNames.YIELD)
);
extend(
@@ -459,7 +462,7 @@
.and(PY3K)
.andNot(AFTER_QUALIFIER)
,
- new PyKeywordCompletionProvider("nonlocal")
+ new PyKeywordCompletionProvider(PyNames.NONLOCAL)
);
}
@@ -471,7 +474,7 @@
.andOr(IN_IF_BODY, AFTER_IF)
.andNot(AFTER_QUALIFIER).andNot(IN_STRING_LITERAL)
,
- new PyKeywordCompletionProvider(TailType.NONE, UnindentingInsertHandler.INSTANCE, "elif"));
+ new PyKeywordCompletionProvider(TailType.NONE, PyUnindentingInsertHandler.INSTANCE, PyNames.ELIF));
}
private void addWithinTry() {
@@ -479,7 +482,7 @@
CompletionType.BASIC, psiElement()
.withLanguage(PythonLanguage.getInstance())
.and(FIRST_ON_LINE)
- .andOr(IN_TRY_BODY, IN_EXCEPT_BODY, AFTER_TRY)
+ .andOr(IN_TRY_BODY, IN_EXCEPT_BODY, AFTER_TRY, IN_ELSE_BODY_OF_TRY)
//.andNot(RIGHT_AFTER_COLON)
.andNot(AFTER_QUALIFIER).andNot(IN_STRING_LITERAL)
,
@@ -487,8 +490,8 @@
protected void addCompletions(
@NotNull final CompletionParameters parameters, final ProcessingContext context, @NotNull final CompletionResultSet result
) {
- putKeyword("except", UnindentingInsertHandler.INSTANCE, TailType.NONE, result);
- putKeyword("finally", UnindentingInsertHandler.INSTANCE, TailType.CASE_COLON, result);
+ putKeyword(PyNames.EXCEPT, PyUnindentingInsertHandler.INSTANCE, TailType.NONE, result);
+ putKeyword(PyNames.FINALLY, PyUnindentingInsertHandler.INSTANCE, TailType.CASE_COLON, result);
}
}
);
@@ -502,7 +505,7 @@
.andOr(IN_COND_STMT, IN_EXCEPT_BODY, AFTER_COND_STMT_NO_ELSE, AFTER_LOOP_NO_ELSE, AFTER_EXCEPT)
.andNot(AFTER_QUALIFIER).andNot(IN_STRING_LITERAL)
,
- new PyKeywordCompletionProvider(TailType.CASE_COLON, UnindentingInsertHandler.INSTANCE, "else"));
+ new PyKeywordCompletionProvider(TailType.CASE_COLON, PyUnindentingInsertHandler.INSTANCE, PyNames.ELSE));
}
private void addInfixOperators() {
@@ -516,7 +519,7 @@
.andNot(AFTER_QUALIFIER).
andNot(IN_STRING_LITERAL).and(IN_BEGIN_STMT)
,
- new PyKeywordCompletionProvider("and", "or", "is", "in")
+ new PyKeywordCompletionProvider(PyNames.AND, PyNames.OR, PyNames.IS, PyNames.IN)
);
}
@@ -530,7 +533,7 @@
.andNot(IN_FUNCTION_HEADER)
.andNot(AFTER_QUALIFIER).andNot(IN_STRING_LITERAL)
,
- new PyKeywordCompletionProvider("not", "lambda")
+ new PyKeywordCompletionProvider(PyNames.NOT, PyNames.LAMBDA)
);
}
@@ -545,7 +548,7 @@
.andNot(AFTER_QUALIFIER)
.andNot(IN_FUNCTION_HEADER)
,
- new PyKeywordCompletionProvider(TailType.NONE, "True", "False", "None")
+ new PyKeywordCompletionProvider(TailType.NONE, PyNames.TRUE, PyNames.FALSE, PyNames.NONE)
);
}
@@ -556,7 +559,7 @@
.andOr(IN_IMPORT_AFTER_REF, IN_WITH_AFTER_REF, IN_EXCEPT_AFTER_REF)
.andNot(AFTER_QUALIFIER)
,
- new PyKeywordCompletionProvider("as")
+ new PyKeywordCompletionProvider(PyNames.AS)
);
}
@@ -567,7 +570,7 @@
.and(IN_FROM_IMPORT_AFTER_REF)
.andNot(AFTER_QUALIFIER)
,
- new PyKeywordCompletionProvider("import")
+ new PyKeywordCompletionProvider(PyNames.IMPORT)
);
}
@@ -603,9 +606,9 @@
.withLanguage(PythonLanguage.getInstance())
.afterLeafSkipping(psiElement().whitespace(),
psiElement().inside(psiElement(PyConditionalExpression.class))
- .and(psiElement().afterLeaf("if")))
+ .and(psiElement().afterLeaf(PyNames.IF)))
,
- new PyKeywordCompletionProvider(TailType.SPACE, "else"));
+ new PyKeywordCompletionProvider(TailType.SPACE, PyNames.ELSE));
}
private void addRaiseFrom() {
@@ -614,7 +617,7 @@
.withLanguage(PythonLanguage.getInstance())
.and(PY3K)
.afterLeaf(psiElement().inside(PyRaiseStatement.class)),
- new PyKeywordCompletionProvider("from"));
+ new PyKeywordCompletionProvider(PyNames.FROM));
}
private void addYieldFrom() {
@@ -623,7 +626,7 @@
.withLanguage(PythonLanguage.getInstance())
.and(PY3K)
.afterLeaf(psiElement().withElementType(PyTokenTypes.YIELD_KEYWORD)),
- new PyKeywordCompletionProvider("from"));
+ new PyKeywordCompletionProvider(PyNames.FROM));
}
public PyKeywordCompletionContributor() {
@@ -654,14 +657,14 @@
.withLanguage(PythonLanguage.getInstance())
.inside(psiElement(PySequenceExpression.class))
.andNot(psiElement().afterLeaf(or(psiElement(PyTokenTypes.LBRACE), psiElement(PyTokenTypes.LBRACKET), psiElement(PyTokenTypes.LPAR)))),
- new PyKeywordCompletionProvider("for"));
+ new PyKeywordCompletionProvider(PyNames.FOR));
}
private void addInToFor() {
extend(CompletionType.BASIC,
psiElement()
.withLanguage(PythonLanguage.getInstance())
- .and(psiElement()).afterLeaf(psiElement().afterLeaf("for")),
+ .and(psiElement()).afterLeaf(psiElement().afterLeaf(PyNames.FOR)),
new PyKeywordCompletionProvider("in"));
}
diff --git a/python/src/com/jetbrains/python/codeInsight/controlflow/ControlFlowCache.java b/python/src/com/jetbrains/python/codeInsight/controlflow/ControlFlowCache.java
index 02b7040..a8db9b6 100644
--- a/python/src/com/jetbrains/python/codeInsight/controlflow/ControlFlowCache.java
+++ b/python/src/com/jetbrains/python/codeInsight/controlflow/ControlFlowCache.java
@@ -39,7 +39,7 @@
public static ControlFlow getControlFlow(@NotNull ScopeOwner element) {
SoftReference<ControlFlow> ref = element.getUserData(CONTROL_FLOW_KEY);
- ControlFlow flow = ref != null ? ref.get() : null;
+ ControlFlow flow = SoftReference.dereference(ref);
if (flow == null) {
flow = new PyControlFlowBuilder().buildControlFlow(element);
element.putUserData(CONTROL_FLOW_KEY, new SoftReference<ControlFlow>(flow));
@@ -50,7 +50,7 @@
@NotNull
public static Scope getScope(@NotNull ScopeOwner element) {
SoftReference<Scope> ref = element.getUserData(SCOPE_KEY);
- Scope scope = ref != null ? ref.get() : null;
+ Scope scope = SoftReference.dereference(ref);
if (scope == null) {
scope = new ScopeImpl(element);
element.putUserData(SCOPE_KEY, new SoftReference<Scope>(scope));
diff --git a/python/src/com/jetbrains/python/codeInsight/dataflow/scope/Scope.java b/python/src/com/jetbrains/python/codeInsight/dataflow/scope/Scope.java
index 5cf0286..eedf3a6 100644
--- a/python/src/com/jetbrains/python/codeInsight/dataflow/scope/Scope.java
+++ b/python/src/com/jetbrains/python/codeInsight/dataflow/scope/Scope.java
@@ -19,6 +19,7 @@
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiNamedElement;
import com.jetbrains.python.psi.PyImportedNameDefiner;
+import com.jetbrains.python.psi.PyTargetExpression;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -49,4 +50,7 @@
@NotNull
Collection<PsiNamedElement> getNamedElements();
+
+ @NotNull
+ Collection<PyTargetExpression> getTargetExpressions();
}
diff --git a/python/src/com/jetbrains/python/codeInsight/dataflow/scope/impl/ScopeImpl.java b/python/src/com/jetbrains/python/codeInsight/dataflow/scope/impl/ScopeImpl.java
index d0eb376..19a947f 100644
--- a/python/src/com/jetbrains/python/codeInsight/dataflow/scope/impl/ScopeImpl.java
+++ b/python/src/com/jetbrains/python/codeInsight/dataflow/scope/impl/ScopeImpl.java
@@ -47,6 +47,7 @@
private volatile Map<String, PsiNamedElement> myNamedElements;
private volatile List<PyImportedNameDefiner> myImportedNameDefiners; // Declarations which declare unknown set of imported names
private volatile Set<String> myAugAssignments;
+ private List<PyTargetExpression> myTargetExpressions;
public ScopeImpl(final ScopeOwner flowOwner) {
myFlowOwner = flowOwner;
@@ -170,6 +171,15 @@
return myNamedElements.values();
}
+ @NotNull
+ @Override
+ public Collection<PyTargetExpression> getTargetExpressions() {
+ if (myTargetExpressions == null) {
+ collectDeclarations();
+ }
+ return myTargetExpressions;
+ }
+
private void collectDeclarations() {
final Map<String, PsiNamedElement> namedElements = new HashMap<String, PsiNamedElement>();
final List<PyImportedNameDefiner> importedNameDefiners = new ArrayList<PyImportedNameDefiner>();
@@ -177,11 +187,13 @@
final Set<String> globals = new HashSet<String>();
final Set<String> nonlocals = new HashSet<String>();
final Set<String> augAssignments = new HashSet<String>();
+ final List<PyTargetExpression> targetExpressions = new ArrayList<PyTargetExpression>();
myFlowOwner.acceptChildren(new PyRecursiveElementVisitor() {
@Override
public void visitPyTargetExpression(PyTargetExpression node) {
+ targetExpressions.add(node);
final PsiElement parent = node.getParent();
- if (node.getQualifier() == null && !(parent instanceof PyImportElement)) {
+ if (!node.isQualified() && !(parent instanceof PyImportElement)) {
super.visitPyTargetExpression(node);
}
}
@@ -249,5 +261,6 @@
myGlobals = globals;
myNonlocals = nonlocals;
myAugAssignments = augAssignments;
+ myTargetExpressions = targetExpressions;
}
}
diff --git a/python/src/com/jetbrains/python/codeInsight/editorActions/moveUpDown/PyStatementMover.java b/python/src/com/jetbrains/python/codeInsight/editorActions/moveUpDown/PyStatementMover.java
index f527506..17b5f5b 100644
--- a/python/src/com/jetbrains/python/codeInsight/editorActions/moveUpDown/PyStatementMover.java
+++ b/python/src/com/jetbrains/python/codeInsight/editorActions/moveUpDown/PyStatementMover.java
@@ -23,12 +23,14 @@
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.SelectionModel;
import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.CodeStyleManager;
import com.intellij.psi.impl.source.PostprocessReformattingAspect;
import com.intellij.psi.util.PsiTreeUtil;
+import com.jetbrains.python.PythonStringUtil;
import com.jetbrains.python.psi.*;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -54,6 +56,9 @@
PsiElement elementToMove1 = PyUtil.findNonWhitespaceAtOffset(file, start);
PsiElement elementToMove2 = PyUtil.findNonWhitespaceAtOffset(file, end);
if (elementToMove1 == null || elementToMove2 == null) return false;
+
+ if (ifInsideString(document, lineNumber, elementToMove1, down)) return false;
+
elementToMove1 = getCommentOrStatement(document, elementToMove1);
elementToMove2 = getCommentOrStatement(document, elementToMove2);
@@ -72,6 +77,24 @@
return true;
}
+ private static boolean ifInsideString(@NotNull final Document document, int lineNumber, @NotNull final PsiElement elementToMove1, boolean down) {
+ int start = document.getLineStartOffset(lineNumber);
+ final int end = document.getLineEndOffset(lineNumber);
+ int nearLine = down ? lineNumber + 1 : lineNumber - 1;
+ if (nearLine >= document.getLineCount() || nearLine <= 0) return false;
+ final PyStringLiteralExpression stringLiteralExpression = PsiTreeUtil.getParentOfType(elementToMove1, PyStringLiteralExpression.class);
+ if (stringLiteralExpression != null) {
+ final Pair<String,String> quotes = PythonStringUtil.getQuotes(stringLiteralExpression.getText());
+ if (quotes != null && (quotes.first.equals("'''") || quotes.first.equals("\"\"\""))) {
+ final String text1 = document.getText(TextRange.create(start, end)).trim();
+ final String text2 = document.getText(TextRange.create(document.getLineStartOffset(nearLine), document.getLineEndOffset(nearLine))).trim();
+ if (!text1.startsWith(quotes.first) && !text1.endsWith(quotes.second) && !text2.startsWith(quotes.first) && !text2.endsWith(quotes.second))
+ return true;
+ }
+ }
+ return false;
+ }
+
@Nullable
private static LineRange getDestinationScope(@NotNull final PsiFile file, @NotNull final Editor editor,
@NotNull final PsiElement elementToMove, boolean down) {
@@ -80,7 +103,7 @@
final int offset = down ? elementToMove.getTextRange().getEndOffset() : elementToMove.getTextRange().getStartOffset();
int lineNumber = down ? document.getLineNumber(offset) + 1 : document.getLineNumber(offset) - 1;
- if (moveOutsideFile(elementToMove, document, lineNumber)) return null;
+ if (moveOutsideFile(document, lineNumber)) return null;
int lineEndOffset = document.getLineEndOffset(lineNumber);
final int startOffset = document.getLineStartOffset(lineNumber);
lineEndOffset = startOffset != lineEndOffset ? lineEndOffset - 1 : lineEndOffset;
@@ -118,24 +141,8 @@
return new LineRange(startLine, endLine + 1);
}
- private static boolean moveOutsideFile(@NotNull final PsiElement elementToMove, @NotNull final Document document, int lineNumber) {
- if (lineNumber < 0) return true;
- if (lineNumber >= document.getLineCount()) {
- final int elementOffset = elementToMove.getTextRange().getStartOffset();
- final int lineStartOffset = document.getLineStartOffset(document.getLineNumber(elementOffset));
- final int insertIndex = lineNumber < 0 ? 0 : document.getTextLength();
- if (elementOffset != lineStartOffset) {
- ApplicationManager.getApplication().runWriteAction(new Runnable() {
- @Override
- public void run() {
- document.insertString(insertIndex, "\n");
- PsiDocumentManager.getInstance(elementToMove.getProject()).commitAllDocuments();
- }
- });
- }
- else return true;
- }
- return false;
+ private static boolean moveOutsideFile(@NotNull final Document document, int lineNumber) {
+ return lineNumber < 0 || lineNumber >= document.getLineCount();
}
private static boolean moveToEmptyLine(@NotNull final PsiElement elementToMove, boolean down) {
diff --git a/python/src/com/jetbrains/python/codeInsight/imports/AddImportHelper.java b/python/src/com/jetbrains/python/codeInsight/imports/AddImportHelper.java
index aa6563f..1c09ee2 100644
--- a/python/src/com/jetbrains/python/codeInsight/imports/AddImportHelper.java
+++ b/python/src/com/jetbrains/python/codeInsight/imports/AddImportHelper.java
@@ -21,6 +21,7 @@
import com.intellij.openapi.module.ModuleUtilCore;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.roots.ProjectRootManager;
+import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.util.IncorrectOperationException;
@@ -179,7 +180,6 @@
}
return true;
}
-
/**
* Adds an "import ... from ..." statement below other top-level imports.
*
diff --git a/python/src/com/jetbrains/python/codeInsight/imports/AutoImportQuickFix.java b/python/src/com/jetbrains/python/codeInsight/imports/AutoImportQuickFix.java
index 4b46413..47c9ca9 100644
--- a/python/src/com/jetbrains/python/codeInsight/imports/AutoImportQuickFix.java
+++ b/python/src/com/jetbrains/python/codeInsight/imports/AutoImportQuickFix.java
@@ -129,7 +129,7 @@
if (HintManager.getInstance().hasShownHintsThatWillHideByOtherHint(true)) {
return false;
}
- if ((myNode instanceof PyQualifiedExpression) && ((((PyQualifiedExpression)myNode).getQualifier() != null))) return false; // we cannot be qualified
+ if ((myNode instanceof PyQualifiedExpression) && ((((PyQualifiedExpression)myNode).isQualified()))) return false; // we cannot be qualified
String name = getNameToImport();
if (!name.equals(myInitialName)) {
return false;
diff --git a/python/src/com/jetbrains/python/codeInsight/imports/ImportFromExistingAction.java b/python/src/com/jetbrains/python/codeInsight/imports/ImportFromExistingAction.java
index f90ce61..58254d9 100644
--- a/python/src/com/jetbrains/python/codeInsight/imports/ImportFromExistingAction.java
+++ b/python/src/com/jetbrains/python/codeInsight/imports/ImportFromExistingAction.java
@@ -82,7 +82,7 @@
// check if the tree is sane
PsiDocumentManager.getInstance(myTarget.getProject()).commitAllDocuments();
if (!myTarget.isValid()) return false;
- if ((myTarget instanceof PyQualifiedExpression) && ((((PyQualifiedExpression)myTarget).getQualifier() != null))) return false; // we cannot be qualified
+ if ((myTarget instanceof PyQualifiedExpression) && ((((PyQualifiedExpression)myTarget).isQualified()))) return false; // we cannot be qualified
for (ImportCandidateHolder item : mySources) {
if (!item.getImportable().isValid()) return false;
if (!item.getFile().isValid()) return false;
diff --git a/python/src/com/jetbrains/python/codeInsight/imports/PythonReferenceImporter.java b/python/src/com/jetbrains/python/codeInsight/imports/PythonReferenceImporter.java
index 06e4f89..ae96ac5 100644
--- a/python/src/com/jetbrains/python/codeInsight/imports/PythonReferenceImporter.java
+++ b/python/src/com/jetbrains/python/codeInsight/imports/PythonReferenceImporter.java
@@ -69,7 +69,7 @@
for (PsiElement element : elements) {
if (element instanceof PyReferenceExpression && isImportable(element)) {
final PyReferenceExpression refExpr = (PyReferenceExpression)element;
- if (refExpr.getQualifier() == null) {
+ if (!refExpr.isQualified()) {
final PsiPolyVariantReference reference = refExpr.getReference();
if (reference.resolve() == null) {
AutoImportQuickFix fix = proposeImportFix(refExpr, reference);
@@ -92,7 +92,7 @@
PsiReference element = file.findReferenceAt(offset);
if (element instanceof PyReferenceExpression && isImportable((PsiElement)element)) {
final PyReferenceExpression refExpr = (PyReferenceExpression)element;
- if (refExpr.getQualifier() == null) {
+ if (!refExpr.isQualified()) {
final PsiPolyVariantReference reference = refExpr.getReference();
if (reference.resolve() == null) {
AutoImportQuickFix fix = proposeImportFix(refExpr, reference);
diff --git a/python/src/com/jetbrains/python/codeInsight/intentions/ImportFromToImportIntention.java b/python/src/com/jetbrains/python/codeInsight/intentions/ImportFromToImportIntention.java
index 9f1c366..0170b8b 100644
--- a/python/src/com/jetbrains/python/codeInsight/intentions/ImportFromToImportIntention.java
+++ b/python/src/com/jetbrains/python/codeInsight/intentions/ImportFromToImportIntention.java
@@ -28,7 +28,7 @@
import com.intellij.util.containers.HashMap;
import com.jetbrains.python.PyBundle;
import com.jetbrains.python.psi.*;
-import com.jetbrains.python.psi.resolve.PyResolveUtil;
+import com.jetbrains.python.psi.impl.PyPsiUtils;
import com.jetbrains.python.psi.types.PyModuleType;
import com.jetbrains.python.psi.types.TypeEvalContext;
import org.jetbrains.annotations.NotNull;
@@ -84,7 +84,7 @@
ret.myModuleReference = ret.myFromImportStatement.getImportSource();
}
if (ret.myModuleReference != null) {
- ret.myModuleName = PyResolveUtil.toPath(ret.myModuleReference);
+ ret.myModuleName = PyPsiUtils.toPath(ret.myModuleReference);
}
return ret;
}
@@ -117,7 +117,7 @@
if (info.myModuleReference != null) {
PyExpression remaining_module = info.myModuleReference.getQualifier();
if (remaining_module instanceof PyQualifiedExpression) {
- remaining_name = PyResolveUtil.toPath((PyQualifiedExpression)remaining_module);
+ remaining_name = PyPsiUtils.toPath((PyQualifiedExpression)remaining_module);
}
else remaining_name = ""; // unqualified name: "...module"
separated_name = info.myModuleReference.getReferencedName();
@@ -169,7 +169,7 @@
}
}
if (info.myModuleReference != null) {
- info.myModuleName = PyResolveUtil.toPath(info.myModuleReference);
+ info.myModuleName = PyPsiUtils.toPath(info.myModuleReference);
}
if (info.myModuleReference != null && info.myModuleName != null && info.myFromImportStatement != null) {
myText = info.getText();
@@ -211,7 +211,7 @@
public boolean execute(@NotNull PsiElement element) {
if (element instanceof PyReferenceExpression && PsiTreeUtil.getParentOfType(element, PyImportElement.class) == null && element.isValid()) {
PyReferenceExpression ref = (PyReferenceExpression)element;
- if (ref.getQualifier() == null) {
+ if (!ref.isQualified()) {
ResolveResult[] resolved = ref.getReference().multiResolve(false);
for (ResolveResult rr : resolved) {
if (rr.isValidResult()) {
diff --git a/python/src/com/jetbrains/python/codeInsight/intentions/ImportToImportFromIntention.java b/python/src/com/jetbrains/python/codeInsight/intentions/ImportToImportFromIntention.java
index 453c289..fc35833 100644
--- a/python/src/com/jetbrains/python/codeInsight/intentions/ImportToImportFromIntention.java
+++ b/python/src/com/jetbrains/python/codeInsight/intentions/ImportToImportFromIntention.java
@@ -30,7 +30,7 @@
import com.intellij.util.containers.HashSet;
import com.jetbrains.python.PyBundle;
import com.jetbrains.python.psi.*;
-import com.jetbrains.python.psi.resolve.PyResolveUtil;
+import com.jetbrains.python.psi.impl.PyPsiUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -94,7 +94,7 @@
// usages of imported name are qualifiers; what they refer to?
PyReferenceExpression reference = myImportElement.getImportReferenceExpression();
if (reference != null) {
- myModuleName = PyResolveUtil.toPath(reference);
+ myModuleName = PyPsiUtils.toPath(reference);
myQualifierName = myImportElement.getVisibleName();
myReferee = reference.getReference().resolve();
myHasModuleReference = false;
@@ -104,7 +104,7 @@
public boolean execute(@NotNull PsiElement element) {
if (element instanceof PyReferenceExpression && PsiTreeUtil.getParentOfType(element, PyImportElement.class) == null) {
PyReferenceExpression ref = (PyReferenceExpression)element;
- if (myQualifierName.equals(PyResolveUtil.toPath(ref))) { // filter out other names that might resolve to our target
+ if (myQualifierName.equals(PyPsiUtils.toPath(ref))) { // filter out other names that might resolve to our target
PsiElement parent_elt = ref.getParent();
if (parent_elt instanceof PyQualifiedExpression) { // really qualified by us, not just referencing?
PsiElement resolved = ref.getReference().resolve();
@@ -197,7 +197,7 @@
String module_name = "?";
if (myImportElement != null) {
PyReferenceExpression reference = myImportElement.getImportReferenceExpression();
- if (reference != null) module_name = PyResolveUtil.toPath(reference);
+ if (reference != null) module_name = PyPsiUtils.toPath(reference);
}
return PyBundle.message("INTN.convert.to.from.$0.import.$1", getDots()+module_name, "...");
}
diff --git a/python/src/com/jetbrains/python/codeInsight/intentions/ImportToggleAliasIntention.java b/python/src/com/jetbrains/python/codeInsight/intentions/ImportToggleAliasIntention.java
index f9f1ee1..621adf8 100644
--- a/python/src/com/jetbrains/python/codeInsight/intentions/ImportToggleAliasIntention.java
+++ b/python/src/com/jetbrains/python/codeInsight/intentions/ImportToggleAliasIntention.java
@@ -38,7 +38,7 @@
import com.jetbrains.python.PyNames;
import com.jetbrains.python.codeInsight.controlflow.ScopeOwner;
import com.jetbrains.python.psi.*;
-import com.jetbrains.python.psi.resolve.PyResolveUtil;
+import com.jetbrains.python.psi.impl.PyPsiUtils;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
@@ -136,7 +136,7 @@
PyReferenceExpression reference = sure(state.myImportElement.getImportReferenceExpression());
// search for references to us with the right name
try {
- String imported_name = PyResolveUtil.toPath(reference);
+ String imported_name = PyPsiUtils.toPath(reference);
if (state.myAlias != null) {
// have to remove alias, rename everything to original
target_name = imported_name;
@@ -181,13 +181,16 @@
InjectedLanguageManager.getInstance(project).getInjectedPsiFiles(host);
if (files != null) {
for (Pair<PsiElement, TextRange> pair : files) {
- final ScopeOwner scopeOwner = (ScopeOwner)pair.getFirst();
- PsiTreeUtil.processElements(scopeOwner, new PsiElementProcessor() {
- public boolean execute(@NotNull PsiElement element) {
- getReferences(element);
- return true;
- }
- });
+ final PsiElement first = pair.getFirst();
+ if (first instanceof ScopeOwner) {
+ final ScopeOwner scopeOwner = (ScopeOwner)first;
+ PsiTreeUtil.processElements(scopeOwner, new PsiElementProcessor() {
+ public boolean execute(@NotNull PsiElement element) {
+ getReferences(element);
+ return true;
+ }
+ });
+ }
}
}
}
@@ -198,7 +201,7 @@
if (element instanceof PyReferenceExpression && PsiTreeUtil.getParentOfType(element,
PyImportElement.class) == null) {
PyReferenceExpression ref = (PyReferenceExpression)element;
- if (remove_name.equals(PyResolveUtil.toPath(ref))) { // filter out other names that might resolve to our target
+ if (remove_name.equals(PyPsiUtils.toPath(ref))) { // filter out other names that might resolve to our target
PsiElement resolved = ref.getReference().resolve();
if (resolved == referee) references.add(ref.getReference());
}
diff --git a/python/src/com/jetbrains/python/codeInsight/liveTemplates/PyIterableVariableMacro.java b/python/src/com/jetbrains/python/codeInsight/liveTemplates/PyIterableVariableMacro.java
new file mode 100644
index 0000000..68eec70
--- /dev/null
+++ b/python/src/com/jetbrains/python/codeInsight/liveTemplates/PyIterableVariableMacro.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.codeInsight.liveTemplates;
+
+import com.intellij.codeInsight.lookup.LookupElement;
+import com.intellij.codeInsight.lookup.LookupElementBuilder;
+import com.intellij.codeInsight.template.*;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiNamedElement;
+import com.jetbrains.python.PyNames;
+import com.jetbrains.python.codeInsight.controlflow.ControlFlowCache;
+import com.jetbrains.python.codeInsight.controlflow.ScopeOwner;
+import com.jetbrains.python.codeInsight.dataflow.scope.Scope;
+import com.jetbrains.python.codeInsight.dataflow.scope.ScopeUtil;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.psi.PyImportedNameDefiner;
+import com.jetbrains.python.psi.PyTypedElement;
+import com.jetbrains.python.psi.types.PyABCUtil;
+import com.jetbrains.python.psi.types.PyType;
+import com.jetbrains.python.psi.types.TypeEvalContext;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author vlan
+ */
+public class PyIterableVariableMacro extends Macro {
+ @Override
+ public String getName() {
+ return "pyIterableVariable";
+ }
+
+ @Override
+ public String getPresentableName() {
+ return "pyIterableVariable()";
+ }
+
+ @Nullable
+ @Override
+ public Result calculateResult(@NotNull Expression[] params, @NotNull ExpressionContext context) {
+ final PsiElement element = context.getPsiElementAtStartOffset();
+ if (element != null) {
+ final List<PsiNamedElement> components = getIterableElements(element);
+ if (!components.isEmpty()) {
+ return new PsiElementResult(components.get(0));
+ }
+ }
+ return null;
+ }
+
+ @Nullable
+ @Override
+ public LookupElement[] calculateLookupItems(@NotNull Expression[] params, ExpressionContext context) {
+ final List<LookupElement> results = new ArrayList<LookupElement>();
+ final PsiElement element = context.getPsiElementAtStartOffset();
+ if (element != null) {
+ for (PsiNamedElement iterableElement : getIterableElements(element)) {
+ results.add(LookupElementBuilder.create(iterableElement));
+ }
+ }
+ return results.toArray(new LookupElement[results.size()]);
+ }
+
+ @Override
+ public boolean isAcceptableInContext(TemplateContextType context) {
+ return context instanceof PythonTemplateContextType;
+ }
+
+ @NotNull
+ protected List<PsiNamedElement> getIterableElements(@NotNull PsiElement element) {
+ final TypeEvalContext typeEvalContext = TypeEvalContext.userInitiated(element.getContainingFile());
+ final List<PsiNamedElement> components = new ArrayList<PsiNamedElement>();
+ for (PsiNamedElement namedElement : getVisibleNamedElements(element)) {
+ if (namedElement instanceof PyTypedElement) {
+ final PyType type = typeEvalContext.getType((PyTypedElement)namedElement);
+ if (type != null && PyABCUtil.isSubtype(type, PyNames.ITERABLE, typeEvalContext)) {
+ components.add(namedElement);
+ }
+ }
+ }
+ return components;
+ }
+
+ @NotNull
+ private static List<PsiNamedElement> getVisibleNamedElements(@NotNull PsiElement anchor) {
+ final List<PsiNamedElement> results = new ArrayList<PsiNamedElement>();
+ for (ScopeOwner owner = ScopeUtil.getScopeOwner(anchor); owner != null; owner = ScopeUtil.getScopeOwner(owner)) {
+ final Scope scope = ControlFlowCache.getScope(owner);
+ results.addAll(scope.getNamedElements());
+ for (PyImportedNameDefiner importedNameDefiner : scope.getImportedNameDefiners()) {
+ for (PyElement importedElement : importedNameDefiner.iterateNames()) {
+ if (importedElement instanceof PsiNamedElement) {
+ results.add((PsiNamedElement)importedElement);
+ }
+ }
+ }
+ }
+ return results;
+ }
+}
diff --git a/python/src/com/jetbrains/python/codeInsight/liveTemplates/PythonTemplateContextType.java b/python/src/com/jetbrains/python/codeInsight/liveTemplates/PythonTemplateContextType.java
index d381562..4ae7abe 100644
--- a/python/src/com/jetbrains/python/codeInsight/liveTemplates/PythonTemplateContextType.java
+++ b/python/src/com/jetbrains/python/codeInsight/liveTemplates/PythonTemplateContextType.java
@@ -16,7 +16,15 @@
package com.jetbrains.python.codeInsight.liveTemplates;
import com.intellij.codeInsight.template.FileTypeBasedContextType;
+import com.intellij.patterns.PsiElementPattern;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiFile;
+import com.intellij.util.ProcessingContext;
+import com.jetbrains.python.PyTokenTypes;
import com.jetbrains.python.PythonFileType;
+import org.jetbrains.annotations.NotNull;
+
+import static com.intellij.patterns.PlatformPatterns.psiElement;
/**
* @author yole
@@ -25,4 +33,22 @@
public PythonTemplateContextType() {
super("Python", "Python", PythonFileType.INSTANCE);
}
+
+ @Override
+ public boolean isInContext(@NotNull PsiFile file, int offset) {
+ if (super.isInContext(file, offset)) {
+ final PsiElement element = file.findElementAt(offset);
+ if (element != null) {
+ return !isAfterDot(element);
+ }
+ }
+ return false;
+ }
+
+ private static boolean isAfterDot(@NotNull PsiElement element) {
+ ProcessingContext context = new ProcessingContext();
+ final PsiElementPattern.Capture<PsiElement> capture = psiElement().afterLeafSkipping(psiElement().whitespace(),
+ psiElement().withElementType(PyTokenTypes.DOT));
+ return capture.accepts(element, context);
+ }
}
diff --git a/python/src/com/jetbrains/python/codeInsight/override/PyOverrideImplementUtil.java b/python/src/com/jetbrains/python/codeInsight/override/PyOverrideImplementUtil.java
index e49b0bd..8783a7a 100644
--- a/python/src/com/jetbrains/python/codeInsight/override/PyOverrideImplementUtil.java
+++ b/python/src/com/jetbrains/python/codeInsight/override/PyOverrideImplementUtil.java
@@ -156,7 +156,8 @@
final int offset = editor.getCaretModel().getOffset();
PsiElement anchor = null;
for (PyStatement statement: statementList.getStatements()) {
- if (statement.getTextRange().getStartOffset() < offset) {
+ if (statement.getTextRange().getStartOffset() < offset ||
+ (statement instanceof PyExpressionStatement && ((PyExpressionStatement)statement).getExpression() instanceof PyStringLiteralExpression)) {
anchor = statement;
}
}
diff --git a/python/src/com/jetbrains/python/codeInsight/regexp/PythonRegexpInjector.java b/python/src/com/jetbrains/python/codeInsight/regexp/PythonRegexpInjector.java
index 39c9aff..029eabc 100644
--- a/python/src/com/jetbrains/python/codeInsight/regexp/PythonRegexpInjector.java
+++ b/python/src/com/jetbrains/python/codeInsight/regexp/PythonRegexpInjector.java
@@ -18,12 +18,17 @@
import com.intellij.lang.Language;
import com.intellij.lang.injection.MultiHostInjector;
import com.intellij.lang.injection.MultiHostRegistrar;
+import com.intellij.openapi.util.Pair;
import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiPolyVariantReference;
+import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil;
+import com.intellij.psi.impl.source.tree.injected.MultiHostRegistrarImpl;
+import com.intellij.psi.impl.source.tree.injected.Place;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.ArrayUtil;
import com.jetbrains.python.codeInsight.PyInjectionUtil;
-import com.jetbrains.python.codeInsight.controlflow.ScopeOwner;
+import com.jetbrains.python.codeInsight.dataflow.scope.ScopeUtil;
import com.jetbrains.python.psi.*;
import com.jetbrains.python.psi.resolve.PyResolveContext;
import org.jetbrains.annotations.NotNull;
@@ -67,7 +72,7 @@
@Override
public void getLanguagesToInject(@NotNull MultiHostRegistrar registrar, @NotNull PsiElement context) {
final PsiElement contextParent = context.getParent();
- if (PyInjectionUtil.isLargestStringLiteral(context) && contextParent instanceof PyArgumentList) {
+ if (PyInjectionUtil.getLargestStringLiteral(context) == context && contextParent instanceof PyArgumentList) {
final PyExpression[] args = ((PyArgumentList)contextParent).getArguments();
int index = ArrayUtil.indexOf(args, context);
PyCallExpression call = PsiTreeUtil.getParentOfType(context, PyCallExpression.class);
@@ -77,12 +82,20 @@
final PsiPolyVariantReference ref = ((PyReferenceExpression)callee).getReference(PyResolveContext.noImplicits());
if (ref != null) {
final PsiElement element = ref.resolve();
- if (element != null && PsiTreeUtil.getParentOfType(element, ScopeOwner.class) instanceof PyFile &&
+ if (element != null && ScopeUtil.getScopeOwner(element) instanceof PyFile &&
element.getContainingFile().getName().equals("re.py") && isRegexpMethod(element, index)) {
final Language language = isVerbose(call) ? PythonVerboseRegexpLanguage.INSTANCE : PythonRegexpLanguage.INSTANCE;
registrar.startInjecting(language);
- PyInjectionUtil.registerStringLiteralInjection(context, registrar);
- registrar.doneInjecting();
+ final PyInjectionUtil.InjectionResult result = PyInjectionUtil.registerStringLiteralInjection(context, registrar);
+ if (result.isInjected()) {
+ registrar.doneInjecting();
+ if (!result.isStrict()) {
+ final PsiFile file = getInjectedFile(registrar);
+ if (file != null) {
+ file.putUserData(InjectedLanguageUtil.FRANKENSTEIN_INJECTION, Boolean.TRUE);
+ }
+ }
+ }
}
}
}
@@ -90,6 +103,13 @@
}
}
+ @Nullable
+ private static PsiFile getInjectedFile(@NotNull MultiHostRegistrar registrar) {
+ // Don't add a dependency on IntelliLang here now, but this injector should become IntelliLang-based in the future
+ final List<Pair<Place,PsiFile>> result = ((MultiHostRegistrarImpl)registrar).getResult();
+ return result == null || result.isEmpty() ? null : result.get(result.size() - 1).second;
+ }
+
@NotNull
@Override
public List<? extends Class<? extends PsiElement>> elementsToInjectIn() {
diff --git a/python/src/com/jetbrains/python/codeInsight/stdlib/PyStdlibTypeProvider.java b/python/src/com/jetbrains/python/codeInsight/stdlib/PyStdlibTypeProvider.java
index cf6b9ef..9cdf4c3 100644
--- a/python/src/com/jetbrains/python/codeInsight/stdlib/PyStdlibTypeProvider.java
+++ b/python/src/com/jetbrains/python/codeInsight/stdlib/PyStdlibTypeProvider.java
@@ -21,6 +21,8 @@
import com.intellij.psi.PsiElement;
import com.intellij.psi.util.QualifiedName;
import com.jetbrains.python.PyNames;
+import com.jetbrains.python.codeInsight.controlflow.ScopeOwner;
+import com.jetbrains.python.codeInsight.dataflow.scope.ScopeUtil;
import com.jetbrains.python.psi.*;
import com.jetbrains.python.psi.impl.PyBuiltinCache;
import com.jetbrains.python.psi.impl.PyTypeProvider;
@@ -30,6 +32,7 @@
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -37,7 +40,8 @@
* @author yole
*/
public class PyStdlibTypeProvider extends PyTypeProviderBase {
- private static final Set<String> OPEN_FUNCTIONS = ImmutableSet.of("__builtin__.open", "io.open", "os.fdopen");
+ private static final Set<String> OPEN_FUNCTIONS = ImmutableSet.of("__builtin__.open", "io.open", "os.fdopen",
+ "pathlib.Path.open");
private static final String BINARY_FILE_TYPE = "io.FileIO[bytes]";
private static final String TEXT_FILE_TYPE = "io.TextIOWrapper[unicode]";
@@ -53,6 +57,103 @@
@Override
public PyType getReferenceType(@NotNull PsiElement referenceTarget, @NotNull TypeEvalContext context, @Nullable PsiElement anchor) {
+ PyType type = getNamedTupleType(referenceTarget, anchor);
+ if (type != null) {
+ return type;
+ }
+ type = getEnumType(referenceTarget, context, anchor);
+ if (type != null) {
+ return type;
+ }
+ return null;
+ }
+
+ @Nullable
+ private static PyType getEnumType(@NotNull PsiElement referenceTarget, @NotNull TypeEvalContext context,
+ @Nullable PsiElement anchor) {
+ if (referenceTarget instanceof PyTargetExpression) {
+ final PyTargetExpression target = (PyTargetExpression)referenceTarget;
+ final ScopeOwner owner = ScopeUtil.getScopeOwner(target);
+ if (owner instanceof PyClass) {
+ final PyClass cls = (PyClass)owner;
+ final List<PyClassLikeType> types = cls.getAncestorTypes(context);
+ for (PyClassLikeType type : types) {
+ if (type != null && "enum.Enum".equals(type.getClassQName())) {
+ final PyType classType = context.getType(cls);
+ if (classType instanceof PyClassType) {
+ return ((PyClassType)classType).toInstance();
+ }
+ }
+ }
+ }
+ }
+ if (referenceTarget instanceof PyQualifiedNameOwner) {
+ final PyQualifiedNameOwner qualifiedNameOwner = (PyQualifiedNameOwner)referenceTarget;
+ final String name = qualifiedNameOwner.getQualifiedName();
+ if ("enum.Enum.name".equals(name)) {
+ return PyBuiltinCache.getInstance(referenceTarget).getStrType();
+ }
+ else if ("enum.Enum.value".equals(name) && anchor instanceof PyReferenceExpression && context.maySwitchToAST(anchor)) {
+ final PyReferenceExpression anchorExpr = (PyReferenceExpression)anchor;
+ final PyExpression qualifier = anchorExpr.getQualifier();
+ if (qualifier instanceof PyReferenceExpression) {
+ final PyReferenceExpression qualifierExpr = (PyReferenceExpression)qualifier;
+ final PsiElement resolvedQualifier = qualifierExpr.getReference().resolve();
+ if (resolvedQualifier instanceof PyTargetExpression) {
+ final PyTargetExpression qualifierTarget = (PyTargetExpression)resolvedQualifier;
+ // Requires switching to AST, we cannot use getType(qualifierTarget) here, because its type is overridden by this type provider
+ if (context.maySwitchToAST(qualifierTarget)) {
+ final PyExpression value = qualifierTarget.findAssignedValue();
+ if (value != null) {
+ return context.getType(value);
+ }
+ }
+ }
+ }
+ }
+ else if ("enum.EnumMeta.__members__".equals(name)) {
+ return PyTypeParser.getTypeByName(referenceTarget, "dict[str, unknown]");
+ }
+ }
+ return null;
+ }
+
+ @Nullable
+ @Override
+ public PyType getReturnType(@NotNull PyFunction function, @Nullable PyQualifiedExpression callSite, @NotNull TypeEvalContext context) {
+ final String qname = getQualifiedName(function, callSite);
+ if (qname != null) {
+ if (OPEN_FUNCTIONS.contains(qname) && callSite != null) {
+ final PyTypeChecker.AnalyzeCallResults results = PyTypeChecker.analyzeCallSite(callSite, context);
+ if (results != null) {
+ final PyType type = getOpenFunctionType(qname, results.getArguments(), callSite);
+ if (type != null) {
+ return type;
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ @Nullable
+ @Override
+ public PyType getContextManagerVariableType(@NotNull PyClass contextManager, @NotNull PyExpression withExpression, @NotNull TypeEvalContext context) {
+ if ("contextlib.closing".equals(contextManager.getQualifiedName()) && withExpression instanceof PyCallExpression) {
+ PyExpression closee = ((PyCallExpression)withExpression).getArgument(0, PyExpression.class);
+ if (closee != null) {
+ return context.getType(closee);
+ }
+ }
+ final String name = contextManager.getName();
+ if ("FileIO".equals(name) || "TextIOWrapper".equals(name) || "IOBase".equals(name) || "_IOBase".equals(name)) {
+ return context.getType(withExpression);
+ }
+ return null;
+ }
+
+ @Nullable
+ private static PyType getNamedTupleType(@NotNull PsiElement referenceTarget, @Nullable PsiElement anchor) {
if (referenceTarget instanceof PyTargetExpression) {
final PyTargetExpression target = (PyTargetExpression)referenceTarget;
final QualifiedName calleeName = target.getCalleeName();
@@ -81,52 +182,6 @@
}
@Nullable
- @Override
- public PyType getReturnType(@NotNull PyFunction function, @Nullable PyQualifiedExpression callSite, @NotNull TypeEvalContext context) {
- final String qname = getQualifiedName(function, callSite);
- if (qname != null) {
- if (OPEN_FUNCTIONS.contains(qname) && callSite != null) {
- final PyTypeChecker.AnalyzeCallResults results = PyTypeChecker.analyzeCallSite(callSite, context);
- if (results != null) {
- final PyType type = getOpenFunctionType(qname, results.getArguments(), callSite);
- if (type != null) {
- return type;
- }
- }
- }
- }
- return null;
- }
-
- @Nullable
- @Override
- public PyType getIterationType(@NotNull PyClass iterable) {
- final PyBuiltinCache builtinCache = PyBuiltinCache.getInstance(iterable);
- if (builtinCache.hasInBuiltins(iterable)) {
- if ("file".equals(iterable.getName())) {
- return builtinCache.getStrType();
- }
- }
- return null;
- }
-
- @Nullable
- @Override
- public PyType getContextManagerVariableType(@NotNull PyClass contextManager, @NotNull PyExpression withExpression, @NotNull TypeEvalContext context) {
- if ("contextlib.closing".equals(contextManager.getQualifiedName()) && withExpression instanceof PyCallExpression) {
- PyExpression closee = ((PyCallExpression)withExpression).getArgument(0, PyExpression.class);
- if (closee != null) {
- return context.getType(closee);
- }
- }
- final String name = contextManager.getName();
- if ("FileIO".equals(name) || "TextIOWrapper".equals(name) || "IOBase".equals(name) || "_IOBase".equals(name)) {
- return context.getType(withExpression);
- }
- return null;
- }
-
- @Nullable
private static PyType getOpenFunctionType(@NotNull String callQName,
@NotNull Map<PyExpression, PyNamedParameter> arguments,
@NotNull PsiElement anchor) {
@@ -134,7 +189,10 @@
for (Map.Entry<PyExpression, PyNamedParameter> entry : arguments.entrySet()) {
final PyNamedParameter parameter = entry.getValue();
if ("mode".equals(parameter.getName())) {
- final PyExpression argument = entry.getKey();
+ PyExpression argument = entry.getKey();
+ if (argument instanceof PyKeywordArgument) {
+ argument = ((PyKeywordArgument)argument).getValueExpression();
+ }
if (argument instanceof PyStringLiteralExpression) {
mode = ((PyStringLiteralExpression)argument).getStringValue();
break;
diff --git a/python/src/com/jetbrains/python/codeInsight/testIntegration/CreateTestDialog.java b/python/src/com/jetbrains/python/codeInsight/testIntegration/CreateTestDialog.java
index 08f3d19..c01a1b2 100644
--- a/python/src/com/jetbrains/python/codeInsight/testIntegration/CreateTestDialog.java
+++ b/python/src/com/jetbrains/python/codeInsight/testIntegration/CreateTestDialog.java
@@ -22,6 +22,7 @@
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.ui.BooleanTableCellRenderer;
+import com.intellij.ui.TableUtil;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
@@ -29,7 +30,6 @@
import javax.swing.event.DocumentListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
-import javax.swing.table.TableColumnModel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
@@ -72,14 +72,12 @@
myTableModel = new DefaultTableModel(methods, 2);
myMethodsTable.setModel(myTableModel);
- TableColumnModel model = myMethodsTable.getColumnModel();
- model.getColumn(0).setMaxWidth(new JCheckBox().getPreferredSize().width);
-
TableColumn checkColumn = myMethodsTable.getColumnModel().getColumn(0);
+ TableUtil.setupCheckboxColumn(checkColumn);
checkColumn.setCellRenderer(new BooleanTableCellRenderer());
checkColumn.setCellEditor(new DefaultCellEditor(new JCheckBox()));
- model.getColumn(1).setHeaderValue("Test method");
+ myMethodsTable.getColumnModel().getColumn(1).setHeaderValue("Test method");
checkColumn.setHeaderValue("");
getOKAction().setEnabled(true);
}
diff --git a/python/src/com/jetbrains/python/codeInsight/userSkeletons/PyUserSkeletonsClassMembersProvider.java b/python/src/com/jetbrains/python/codeInsight/userSkeletons/PyUserSkeletonsClassMembersProvider.java
index a35d8fd..5ac7fc1 100644
--- a/python/src/com/jetbrains/python/codeInsight/userSkeletons/PyUserSkeletonsClassMembersProvider.java
+++ b/python/src/com/jetbrains/python/codeInsight/userSkeletons/PyUserSkeletonsClassMembersProvider.java
@@ -22,6 +22,7 @@
import com.jetbrains.python.psi.PyTargetExpression;
import com.jetbrains.python.psi.types.PyClassMembersProviderBase;
import com.jetbrains.python.psi.types.PyClassType;
+import com.jetbrains.python.psi.types.PyOverridingAncestorsClassMembersProvider;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -33,7 +34,7 @@
/**
* @author vlan
*/
-public class PyUserSkeletonsClassMembersProvider extends PyClassMembersProviderBase {
+public class PyUserSkeletonsClassMembersProvider extends PyClassMembersProviderBase implements PyOverridingAncestorsClassMembersProvider {
@NotNull
@Override
public Collection<PyDynamicMember> getMembers(@NotNull PyClassType classType, PsiElement location) {
diff --git a/python/src/com/jetbrains/python/codeInsight/userSkeletons/PyUserSkeletonsUtil.java b/python/src/com/jetbrains/python/codeInsight/userSkeletons/PyUserSkeletonsUtil.java
index da0ad54..ea6db07 100644
--- a/python/src/com/jetbrains/python/codeInsight/userSkeletons/PyUserSkeletonsUtil.java
+++ b/python/src/com/jetbrains/python/codeInsight/userSkeletons/PyUserSkeletonsUtil.java
@@ -17,11 +17,13 @@
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.PathManager;
+import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.projectRoots.SdkModificator;
import com.intellij.openapi.roots.OrderRootType;
+import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VfsUtilCore;
@@ -53,7 +55,11 @@
*/
public class PyUserSkeletonsUtil {
public static final String USER_SKELETONS_DIR = "python-skeletons";
+ private static final Logger LOG = Logger.getInstance("#com.jetbrains.python.codeInsight.userSkeletons.PyUserSkeletonsUtil");
+ public static final Key<Boolean> HAS_SKELETON = Key.create("PyUserSkeleton.hasSkeleton");
+
@Nullable private static VirtualFile ourUserSkeletonsDirectory;
+ private static boolean ourNoSkeletonsErrorReported = false;
@NotNull
private static List<String> getPossibleUserSkeletonsPaths() {
@@ -75,6 +81,10 @@
}
}
}
+ if (!ourNoSkeletonsErrorReported && ourUserSkeletonsDirectory == null) {
+ ourNoSkeletonsErrorReported = true;
+ LOG.warn("python-skeletons directory not found in paths: " + getPossibleUserSkeletonsPaths());
+ }
return ourUserSkeletonsDirectory;
}
@@ -169,6 +179,10 @@
@Nullable
private static PyFile getUserSkeletonForFile(@NotNull PyFile file) {
+ final Boolean hasSkeleton = file.getUserData(HAS_SKELETON);
+ if (hasSkeleton != null && !hasSkeleton) {
+ return null;
+ }
final VirtualFile moduleVirtualFile = file.getVirtualFile();
if (moduleVirtualFile != null) {
String moduleName = QualifiedNameFinder.findShortestImportableName(file, moduleVirtualFile);
@@ -180,7 +194,9 @@
moduleName = restored.toString();
}
}
- return getUserSkeletonForModuleQName(moduleName, file);
+ final PyFile skeletonFile = getUserSkeletonForModuleQName(moduleName, file);
+ file.putUserData(HAS_SKELETON, skeletonFile != null);
+ return skeletonFile;
}
}
return null;
diff --git a/python/src/com/jetbrains/python/configuration/PyIntegratedToolsConfigurable.form b/python/src/com/jetbrains/python/configuration/PyIntegratedToolsConfigurable.form
index 5aacd41..b6a71ee 100644
--- a/python/src/com/jetbrains/python/configuration/PyIntegratedToolsConfigurable.form
+++ b/python/src/com/jetbrains/python/configuration/PyIntegratedToolsConfigurable.form
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="com.jetbrains.python.configuration.PyIntegratedToolsConfigurable">
- <grid id="27dc6" binding="myMainPanel" layout-manager="GridLayoutManager" row-count="8" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
+ <grid id="27dc6" binding="myMainPanel" layout-manager="GridLayoutManager" row-count="9" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
<xy x="20" y="20" width="657" height="302"/>
@@ -24,12 +24,12 @@
</component>
<vspacer id="fc19e">
<constraints>
- <grid row="7" column="0" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
+ <grid row="8" column="0" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
</constraints>
</vspacer>
<grid id="728f8" binding="myErrorPanel" layout-manager="BorderLayout" hgap="0" vgap="0">
<constraints>
- <grid row="6" column="0" row-span="1" col-span="2" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
+ <grid row="7" column="0" row-span="1" col-span="2" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
<border type="none"/>
@@ -52,7 +52,7 @@
<grid id="e7a5f" binding="myDocStringsPanel" layout-manager="GridLayoutManager" row-count="2" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
- <grid row="2" column="0" row-span="2" col-span="2" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
+ <grid row="3" column="0" row-span="2" col-span="2" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
<border type="none"/>
@@ -87,7 +87,7 @@
<grid id="9f040" binding="myRestPanel" layout-manager="GridLayoutManager" row-count="2" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
- <grid row="4" column="0" row-span="2" col-span="2" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
+ <grid row="5" column="0" row-span="2" col-span="2" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
<border type="none"/>
@@ -117,6 +117,20 @@
</component>
</children>
</grid>
+ <component id="a95d2" class="javax.swing.JComboBox" binding="myTemplateLanguage">
+ <constraints>
+ <grid row="2" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="2" anchor="8" fill="1" indent="0" use-parent-layout="false"/>
+ </constraints>
+ <properties/>
+ </component>
+ <component id="36fa5" class="javax.swing.JLabel">
+ <constraints>
+ <grid row="2" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+ </constraints>
+ <properties>
+ <text value="Template language:"/>
+ </properties>
+ </component>
</children>
</grid>
</form>
diff --git a/python/src/com/jetbrains/python/configuration/PyIntegratedToolsConfigurable.java b/python/src/com/jetbrains/python/configuration/PyIntegratedToolsConfigurable.java
index 9637706..63d88c8 100644
--- a/python/src/com/jetbrains/python/configuration/PyIntegratedToolsConfigurable.java
+++ b/python/src/com/jetbrains/python/configuration/PyIntegratedToolsConfigurable.java
@@ -21,6 +21,12 @@
import com.intellij.facet.ui.FacetConfigurationQuickFix;
import com.intellij.facet.ui.FacetEditorValidator;
import com.intellij.facet.ui.ValidationResult;
+import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.editor.Editor;
+import com.intellij.openapi.editor.EditorFactory;
+import com.intellij.openapi.editor.ex.EditorEx;
+import com.intellij.openapi.editor.highlighter.EditorHighlighter;
+import com.intellij.openapi.editor.highlighter.EditorHighlighterFactory;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
import com.intellij.openapi.fileTypes.PlainTextFileType;
@@ -48,6 +54,7 @@
import com.jetbrains.python.documentation.PyDocumentationSettings;
import com.jetbrains.python.packaging.*;
import com.jetbrains.python.sdk.PythonSdkType;
+import com.jetbrains.python.templateLanguages.TemplatesService;
import com.jetbrains.python.testing.PythonTestConfigurationsModel;
import com.jetbrains.python.testing.TestRunnerService;
import com.jetbrains.python.testing.VFSTestFrameworkListener;
@@ -56,6 +63,7 @@
import javax.swing.*;
import java.awt.*;
+import java.util.Arrays;
import java.util.Collections;
import java.util.List;
@@ -77,6 +85,9 @@
private JCheckBox analyzeDoctest;
private JPanel myDocStringsPanel;
private JPanel myRestPanel;
+ private JComboBox myTemplateLanguage;
+ private TemplatesConfigurationsModel myTemplatesModel;
+ private TemplatesService myTemplatesService;
public PyIntegratedToolsConfigurable(@NotNull Module module) {
myModule = module;
@@ -96,6 +107,7 @@
myDocStringsPanel.setBorder(IdeBorderFactory.createTitledBorder("Docstrings"));
myRestPanel.setBorder(IdeBorderFactory.createTitledBorder("reStructuredText"));
+ myTemplatesService = TemplatesService.getInstance(module);
}
@NotNull
@@ -186,6 +198,10 @@
myModel = new PythonTestConfigurationsModel(configurations,
TestRunnerService.getInstance(myModule).getProjectConfiguration(), myModule);
+ List<String> templateConfigurations = TemplatesService.getAllTemplateLanguages();
+ myTemplatesModel = new TemplatesConfigurationsModel(templateConfigurations, myTemplatesService);
+ //noinspection unchecked
+ myTemplateLanguage.setModel(myTemplatesModel);
updateConfigurations();
initErrorValidation();
return myMainPanel;
@@ -215,6 +231,9 @@
if (!getRequirementsPath().equals(myRequirementsPathField.getText())) {
return true;
}
+ if (myTemplateLanguage.getSelectedItem() != myTemplatesModel.getTemplateLanguage()) {
+ return true;
+ }
return false;
}
@@ -223,6 +242,11 @@
if (!Comparing.equal(myDocstringFormatComboBox.getSelectedItem(), myDocumentationSettings.myDocStringFormat)) {
DaemonCodeAnalyzer.getInstance(myProject).restart();
}
+ if (myTemplateLanguage.getSelectedItem() != myTemplatesModel.getTemplateLanguage()) {
+ myTemplatesModel.apply();
+ reparseFiles(Arrays.asList("html", "xml", "js")); //TODO: get from file extensions
+ }
+
if (analyzeDoctest.isSelected() != myDocumentationSettings.analyzeDoctest) {
final List<VirtualFile> files = Lists.newArrayList();
ProjectRootManager.getInstance(myProject).getFileIndex().iterateContent(new ContentIterator() {
@@ -242,25 +266,43 @@
reSTService.setWorkdir(myWorkDir.getText());
if (txtIsRst.isSelected() != reSTService.txtIsRst()) {
reSTService.setTxtIsRst(txtIsRst.isSelected());
- reparseRstFiles();
+ reparseFiles(Collections.singletonList(PlainTextFileType.INSTANCE.getDefaultExtension()));
}
myDocumentationSettings.analyzeDoctest = analyzeDoctest.isSelected();
PyPackageRequirementsSettings.getInstance(myModule).setRequirementsPath(myRequirementsPathField.getText());
DaemonCodeAnalyzer.getInstance(myProject).restart();
}
- public void reparseRstFiles() {
+ public void reparseFiles(final List<String> extensions) {
final List<VirtualFile> filesToReparse = Lists.newArrayList();
ProjectRootManager.getInstance(myProject).getFileIndex().iterateContent(new ContentIterator() {
@Override
public boolean processFile(VirtualFile fileOrDir) {
- if (!fileOrDir.isDirectory() && PlainTextFileType.INSTANCE.getDefaultExtension().equals(fileOrDir.getExtension())) {
+ if (!fileOrDir.isDirectory() && extensions.contains(fileOrDir.getExtension())) {
filesToReparse.add(fileOrDir);
}
return true;
}
});
FileContentUtilCore.reparseFiles(filesToReparse);
+
+ ApplicationManager.getApplication().runWriteAction(new Runnable() {
+ @Override
+ public void run() {
+
+ for (Editor editor : EditorFactory.getInstance().getAllEditors()) {
+ if (editor instanceof EditorEx && editor.getProject() == myProject) {
+ final VirtualFile vFile = ((EditorEx)editor).getVirtualFile();
+ if (vFile != null) {
+ final EditorHighlighter highlighter = EditorHighlighterFactory.getInstance().createEditorHighlighter(myProject, vFile);
+ ((EditorEx)editor).setHighlighter(highlighter);
+ }
+ }
+ }
+ }
+ });
+
+ DaemonCodeAnalyzer.getInstance(myProject).restart();
}
@Override
@@ -273,6 +315,9 @@
txtIsRst.setSelected(ReSTService.getInstance(myModule).txtIsRst());
analyzeDoctest.setSelected(myDocumentationSettings.analyzeDoctest);
myRequirementsPathField.setText(getRequirementsPath());
+ myTemplateLanguage.setSelectedItem(myTemplatesModel.getTemplateLanguage());
+ myTemplatesModel.reset();
+
}
@Override
diff --git a/python/src/com/jetbrains/python/configuration/TemplatesConfigurationsModel.java b/python/src/com/jetbrains/python/configuration/TemplatesConfigurationsModel.java
new file mode 100644
index 0000000..0722b36
--- /dev/null
+++ b/python/src/com/jetbrains/python/configuration/TemplatesConfigurationsModel.java
@@ -0,0 +1,33 @@
+package com.jetbrains.python.configuration;
+
+import com.intellij.ui.CollectionComboBoxModel;
+import com.jetbrains.python.templateLanguages.TemplatesService;
+
+import java.util.List;
+
+/**
+ * User: catherine
+ */
+public class TemplatesConfigurationsModel extends CollectionComboBoxModel {
+ private String myTemplateLanguage;
+ private final TemplatesService myTemplatesService;
+
+ public TemplatesConfigurationsModel(final List items, TemplatesService templatesService) {
+ super(items, templatesService.getTemplateLanguage());
+ myTemplatesService = templatesService;
+ myTemplateLanguage = myTemplatesService.getTemplateLanguage();
+ }
+
+ public void reset() {
+ setSelectedItem(myTemplateLanguage);
+ }
+
+ public void apply() {
+ myTemplateLanguage = (String)getSelectedItem();
+ myTemplatesService.setTemplateLanguage(myTemplateLanguage);
+ }
+
+ public Object getTemplateLanguage() {
+ return myTemplateLanguage;
+ }
+}
\ No newline at end of file
diff --git a/python/src/com/jetbrains/python/console/PyConsoleOptions.java b/python/src/com/jetbrains/python/console/PyConsoleOptions.java
index 6816b93..d02b670 100644
--- a/python/src/com/jetbrains/python/console/PyConsoleOptions.java
+++ b/python/src/com/jetbrains/python/console/PyConsoleOptions.java
@@ -19,8 +19,12 @@
import com.intellij.openapi.components.*;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.project.Project;
+import com.intellij.util.PathMappingSettings;
import com.intellij.util.containers.ComparatorUtil;
+import com.intellij.util.xmlb.annotations.*;
import com.jetbrains.python.run.AbstractPyCommonOptionsForm;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
import java.util.Map;
@@ -80,6 +84,7 @@
public boolean myShowSeparatorLine = true;
}
+ @Tag("console-settings")
public static class PyConsoleSettings {
public String myCustomStartScript = "";
public String mySdkHome = null;
@@ -90,14 +95,8 @@
public String myWorkingDirectory = "";
public boolean myAddContentRoots = true;
public boolean myAddSourceRoots;
-
- public String getCustomStartScript() {
- return myCustomStartScript;
- }
-
- public String getSdkHome() {
- return mySdkHome;
- }
+ @NotNull
+ private PathMappingSettings myMappings = new PathMappingSettings();
public void apply(AbstractPyCommonOptionsForm form) {
mySdkHome = form.getSdkHome();
@@ -109,6 +108,7 @@
myAddContentRoots = form.addContentRoots();
myAddSourceRoots = form.addSourceRoots();
+ myMappings = form.getMappingSettings() == null ? new PathMappingSettings() : form.getMappingSettings();
}
public boolean isModified(AbstractPyCommonOptionsForm form) {
@@ -119,7 +119,8 @@
myAddContentRoots != form.addContentRoots() ||
myAddSourceRoots != form.addSourceRoots()
|| !ComparatorUtil.equalsNullable(myModuleName, form.getModule() == null ? null : form.getModule().getName())
- || !myWorkingDirectory.equals(form.getWorkingDirectory());
+ || !myWorkingDirectory.equals(form.getWorkingDirectory())
+ || !myMappings.equals(form.getMappingSettings());
}
public void reset(Project project, AbstractPyCommonOptionsForm form) {
@@ -143,33 +144,103 @@
myModuleName = form.getModule().getName();
}
- form.setWorkingDirectory(form.getWorkingDirectory());
+ form.setWorkingDirectory(myWorkingDirectory);
+
+ form.setMappingSettings(myMappings);
}
+ @Attribute("custom-start-script")
+ public String getCustomStartScript() {
+ return myCustomStartScript;
+ }
+
+ @Attribute("sdk-home")
+ public String getSdkHome() {
+ return mySdkHome;
+ }
+
+ @Attribute("module-name")
public String getModuleName() {
return myModuleName;
}
+ @Attribute("working-directory")
public String getWorkingDirectory() {
return myWorkingDirectory;
}
+ @Attribute("is-module-sdk")
public boolean isUseModuleSdk() {
return myUseModuleSdk;
}
+ @Tag("envs")
+ @Property(surroundWithTag = false)
+ @MapAnnotation(surroundWithTag = false, surroundKeyWithTag = false, keyAttributeName = "key",
+ entryTagName = "env", valueAttributeName = "value", surroundValueWithTag = false)
public Map<String, String> getEnvs() {
return myEnvs;
}
+ @Attribute("add-content-roots")
public boolean addContentRoots() {
return myAddContentRoots;
}
+ @Attribute("add-source-roots")
public boolean addSourceRoots() {
return myAddSourceRoots;
}
+ @Attribute("interpreter-options")
+ public String getInterpreterOptions() {
+ return myInterpreterOptions;
+ }
+
+ @AbstractCollection(surroundWithTag = false)
+ public PathMappingSettings getMappings() {
+ return myMappings;
+ }
+
+ public void setCustomStartScript(String customStartScript) {
+ myCustomStartScript = customStartScript;
+ }
+
+ public void setSdkHome(String sdkHome) {
+ mySdkHome = sdkHome;
+ }
+
+ public void setInterpreterOptions(String interpreterOptions) {
+ myInterpreterOptions = interpreterOptions;
+ }
+
+ public void setUseModuleSdk(boolean useModuleSdk) {
+ myUseModuleSdk = useModuleSdk;
+ }
+
+ public void setModuleName(String moduleName) {
+ myModuleName = moduleName;
+ }
+
+ public void setEnvs(Map<String, String> envs) {
+ myEnvs = envs;
+ }
+
+ public void setWorkingDirectory(String workingDirectory) {
+ myWorkingDirectory = workingDirectory;
+ }
+
+ public void setAddContentRoots(boolean addContentRoots) {
+ myAddContentRoots = addContentRoots;
+ }
+
+ public void setAddSourceRoots(boolean addSourceRoots) {
+ myAddSourceRoots = addSourceRoots;
+ }
+
+ public void setMappings(@Nullable PathMappingSettings mappings) {
+ myMappings = mappings != null ? mappings : new PathMappingSettings();
+ }
}
}
diff --git a/python/src/com/jetbrains/python/console/PyConsoleProcessHandler.java b/python/src/com/jetbrains/python/console/PyConsoleProcessHandler.java
index 4ea06d6..c0c65fc 100644
--- a/python/src/com/jetbrains/python/console/PyConsoleProcessHandler.java
+++ b/python/src/com/jetbrains/python/console/PyConsoleProcessHandler.java
@@ -24,7 +24,7 @@
import java.nio.charset.Charset;
/**
- * @author oleg
+ * @author traff
*/
public class PyConsoleProcessHandler extends PythonProcessHandler {
private final PythonConsoleView myConsoleView;
@@ -57,6 +57,11 @@
return !myPydevConsoleCommunication.isExecuting();
}
+ @Override
+ protected boolean shouldKillProcessSoftly() {
+ return false;
+ }
+
private void doCloseCommunication() {
if (myPydevConsoleCommunication != null) {
diff --git a/python/src/com/jetbrains/python/console/PyOpenDebugConsoleAction.java b/python/src/com/jetbrains/python/console/PyOpenDebugConsoleAction.java
index 3f4e801..45906d5 100644
--- a/python/src/com/jetbrains/python/console/PyOpenDebugConsoleAction.java
+++ b/python/src/com/jetbrains/python/console/PyOpenDebugConsoleAction.java
@@ -22,7 +22,6 @@
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.actionSystem.DataContext;
-import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.wm.IdeFocusManager;
@@ -53,6 +52,7 @@
}
}
+ @Override
public void actionPerformed(final AnActionEvent e) {
final Project project = e.getData(CommonDataKeys.PROJECT);
if (project != null) {
diff --git a/python/src/com/jetbrains/python/console/PydevConsoleCommunication.java b/python/src/com/jetbrains/python/console/PydevConsoleCommunication.java
index b0ef1d3..6af6c13 100644
--- a/python/src/com/jetbrains/python/console/PydevConsoleCommunication.java
+++ b/python/src/com/jetbrains/python/console/PydevConsoleCommunication.java
@@ -53,10 +53,11 @@
*
* @author Fabio
*/
-public class PydevConsoleCommunication extends AbstractConsoleCommunication implements IScriptConsoleCommunication, XmlRpcHandler,
+public class PydevConsoleCommunication extends AbstractConsoleCommunication implements XmlRpcHandler,
PyFrameAccessor {
private static final String EXEC_LINE = "execLine";
+ private static final String EXEC_MULTILINE = "execMultipleLines";
private static final String GET_COMPLETIONS = "getCompletions";
private static final String GET_DESCRIPTION = "getDescription";
private static final String GET_FRAME = "getFrame";
@@ -64,6 +65,7 @@
private static final String CHANGE_VARIABLE = "changeVariable";
private static final String HANDSHAKE = "handshake";
private static final String CLOSE = "close";
+
/**
* XML-RPC client for sending messages to the server.
*/
@@ -167,7 +169,7 @@
*/
public Object execute(String method, Vector params) throws Exception {
if ("NotifyFinished".equals(method)) {
- return execNotifyFinished();
+ return execNotifyFinished((Boolean)params.get(0));
}
else if ("RequestInput".equals(method)) {
return execRequestInput();
@@ -223,9 +225,9 @@
return Boolean.FALSE;
}
- private Object execNotifyFinished() {
+ private Object execNotifyFinished(boolean more) {
setExecuting(false);
- notifyCommandExecuted();
+ notifyCommandExecuted(more);
return true;
}
@@ -261,12 +263,13 @@
/**
* Executes the needed command
*
+ * @param command
* @return a Pair with (null, more) or (error, false)
* @throws XmlRpcException
*/
- protected Pair<String, Boolean> exec(final String command) throws XmlRpcException {
+ protected Pair<String, Boolean> exec(final ConsoleCodeFragment command) throws XmlRpcException {
setExecuting(true);
- Object execute = myClient.execute(EXEC_LINE, new Object[]{command});
+ Object execute = myClient.execute(command.isSingleLine() ? EXEC_LINE : EXEC_MULTILINE, new Object[]{command.getText()});
Object object;
if (execute instanceof Vector) {
@@ -278,6 +281,15 @@
else {
object = execute;
}
+ Pair<String, Boolean> result = parseResult(object);
+ if (result.second) {
+ setExecuting(false);
+ }
+
+ return result;
+ }
+
+ private Pair<String, Boolean> parseResult(Object object) {
if (object instanceof Boolean) {
return new Pair<String, Boolean>(null, (Boolean)object);
}
@@ -314,10 +326,10 @@
*
* @param command the command to be executed in the client
*/
- public void execInterpreter(final String command, final Function<InterpreterResponse, Object> onResponseReceived) {
+ public void execInterpreter(final ConsoleCodeFragment command, final Function<InterpreterResponse, Object> onResponseReceived) {
nextResponse = null;
if (waitingForInput) {
- inputReceived = command;
+ inputReceived = command.getText();
waitingForInput = false;
//the thread that we started in the last exec is still alive if we were waiting for an input.
}
diff --git a/python/src/com/jetbrains/python/console/PydevConsoleExecuteActionHandler.java b/python/src/com/jetbrains/python/console/PydevConsoleExecuteActionHandler.java
index 20e8655..b4d8360 100644
--- a/python/src/com/jetbrains/python/console/PydevConsoleExecuteActionHandler.java
+++ b/python/src/com/jetbrains/python/console/PydevConsoleExecuteActionHandler.java
@@ -18,11 +18,10 @@
import com.intellij.codeInsight.hint.HintManager;
import com.intellij.execution.console.LanguageConsoleImpl;
import com.intellij.execution.console.LanguageConsoleView;
+import com.intellij.execution.console.ProcessBackedConsoleExecuteActionHandler;
import com.intellij.execution.process.ProcessHandler;
-import com.intellij.execution.runners.ConsoleExecuteActionHandler;
import com.intellij.openapi.application.Result;
import com.intellij.openapi.command.WriteCommandAction;
-import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.EditorModificationUtil;
import com.intellij.openapi.fileTypes.PlainTextLanguage;
@@ -32,6 +31,7 @@
import com.intellij.psi.codeStyle.CodeStyleSettingsManager;
import com.intellij.psi.impl.source.codeStyle.IndentHelperImpl;
import com.intellij.util.Function;
+import com.intellij.util.ui.UIUtil;
import com.jetbrains.python.PythonFileType;
import com.jetbrains.python.PythonLanguage;
import com.jetbrains.python.console.pydev.ConsoleCommunication;
@@ -40,13 +40,10 @@
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-import java.util.Scanner;
-
/**
* @author traff
*/
-public class PydevConsoleExecuteActionHandler extends ConsoleExecuteActionHandler implements ConsoleCommunicationListener {
-
+public class PydevConsoleExecuteActionHandler extends ProcessBackedConsoleExecuteActionHandler implements ConsoleCommunicationListener {
private final LanguageConsoleView myConsoleView;
private String myInMultilineStringState = null;
@@ -66,20 +63,21 @@
}
@Override
- public void processLine(final String text) {
- processLine(text, true);
+ public void processLine(@NotNull final String text) {
+ processLine(text, false);
}
- public void processLine(final String text, boolean execAnyway) {
+ public void processLine(@NotNull final String text, boolean execAnyway) {
int indentBefore = myCurrentIndentSize;
if (text.isEmpty()) {
processOneLine(text);
}
else {
- Scanner s = new Scanner(text);
- while (s.hasNextLine()) {
- String line = s.nextLine();
- processOneLine(line);
+ if (StringUtil.countNewLines(text.trim()) > 0) {
+ executeMultiLine(text);
+ }
+ else {
+ processOneLine(text);
}
}
if (execAnyway && myCurrentIndentSize > 0 && indentBefore == 0) { //if code was indented and we need to exec anyway
@@ -87,6 +85,19 @@
}
}
+ private void executeMultiLine(@NotNull String text) {
+ if (myInputBuffer == null) {
+ myInputBuffer = new StringBuilder();
+ }
+
+ myInputBuffer.append(text);
+
+ final LanguageConsoleImpl console = myConsoleView.getConsole();
+ final Editor currentEditor = console.getConsoleEditor();
+
+ sendLineToConsole(new ConsoleCommunication.ConsoleCodeFragment(myInputBuffer.toString(), false), console, currentEditor);
+ }
+
private void processOneLine(String line) {
int indentSize = IndentHelperImpl.getIndent(getProject(), PythonFileType.INSTANCE, line, false);
line = StringUtil.trimTrailing(line);
@@ -169,21 +180,28 @@
indentEditor(currentEditor, indent);
more(console, currentEditor);
+ myConsoleCommunication.notifyCommandExecuted(true);
return;
}
}
+ sendLineToConsole(new ConsoleCommunication.ConsoleCodeFragment(myInputBuffer.toString(), true), console, currentEditor);
+ }
+
+ private void sendLineToConsole(@NotNull final ConsoleCommunication.ConsoleCodeFragment code,
+ @NotNull final LanguageConsoleImpl console,
+ @NotNull final Editor currentEditor) {
if (myConsoleCommunication != null) {
final boolean waitedForInputBefore = myConsoleCommunication.isWaitingForInput();
- final String command = myInputBuffer.toString();
if (myConsoleCommunication.isWaitingForInput()) {
myInputBuffer.setLength(0);
}
else {
executingPrompt(console);
}
- myConsoleCommunication.execInterpreter(command, new Function<InterpreterResponse, Object>() {
+ myConsoleCommunication.execInterpreter(code, new Function<InterpreterResponse, Object>() {
+ @Override
public Object fun(final InterpreterResponse interpreterResponse) {
// clear
myInputBuffer = null;
@@ -192,9 +210,15 @@
more(console, currentEditor);
if (myCurrentIndentSize == 0) {
// compute current indentation
- setCurrentIndentSize(IndentHelperImpl.getIndent(getProject(), PythonFileType.INSTANCE, line, false) + getPythonIndent());
+ setCurrentIndentSize(
+ IndentHelperImpl.getIndent(getProject(), PythonFileType.INSTANCE, lastLine(code.getText()), false) + getPythonIndent());
// In this case we can insert indent automatically
- indentEditor(currentEditor, myCurrentIndentSize);
+ UIUtil.invokeLaterIfNeeded(new Runnable() {
+ @Override
+ public void run() {
+ indentEditor(currentEditor, myCurrentIndentSize);
+ }
+ });
}
}
else {
@@ -215,6 +239,11 @@
}
}
+ private static String lastLine(@NotNull String text) {
+ String[] lines = StringUtil.splitByLinesDontTrim(text);
+ return lines[lines.length - 1];
+ }
+
private void ordinaryPrompt(LanguageConsoleImpl console, Editor currentEditor) {
if (!myConsoleCommunication.isExecuting()) {
if (!PyConsoleUtil.ORDINARY_PROMPT.equals(console.getPrompt())) {
@@ -243,10 +272,13 @@
}
@Override
- public void commandExecuted() {
- final LanguageConsoleImpl console = myConsoleView.getConsole();
- final Editor currentEditor = console.getConsoleEditor();
- ordinaryPrompt(console, currentEditor);
+ public void commandExecuted(boolean more) {
+ if (!more) {
+ final LanguageConsoleImpl console = myConsoleView.getConsole();
+ final Editor currentEditor = console.getConsoleEditor();
+
+ ordinaryPrompt(console, currentEditor);
+ }
}
@Override
@@ -261,7 +293,7 @@
setCurrentIndentSize(1);
}
- @Override
+ @SuppressWarnings({"override", "deprecation"})
public void finishExecution() {
final LanguageConsoleImpl console = myConsoleView.getConsole();
final Editor currentEditor = console.getConsoleEditor();
@@ -303,7 +335,7 @@
private void indentEditor(final Editor editor, final int indentSize) {
new WriteCommandAction(getProject()) {
@Override
- protected void run(Result result) throws Throwable {
+ protected void run(@NotNull Result result) throws Throwable {
EditorModificationUtil.insertStringAtCaret(editor, IndentHelperImpl.fillIndent(getProject(), PythonFileType.INSTANCE, indentSize));
}
}.execute();
@@ -312,7 +344,7 @@
private void cleanEditor(final Editor editor) {
new WriteCommandAction(getProject()) {
@Override
- protected void run(Result result) throws Throwable {
+ protected void run(@NotNull Result result) throws Throwable {
editor.getDocument().setText("");
}
}.execute();
@@ -335,27 +367,26 @@
}
@Override
- public void runExecuteAction(LanguageConsoleImpl languageConsole) {
+ public void runExecuteAction(@NotNull LanguageConsoleView console) {
if (isEnabled()) {
if (!canExecuteNow()) {
- HintManager.getInstance().showErrorHint(languageConsole.getConsoleEditor(), getPrevCommandRunningMessage());
+ HintManager.getInstance().showErrorHint(console.getConsole().getConsoleEditor(), getPrevCommandRunningMessage());
}
else {
- doRunExecuteAction(languageConsole);
+ doRunExecuteAction(console);
}
}
else {
- HintManager.getInstance().showErrorHint(languageConsole.getConsoleEditor(), getConsoleIsNotEnabledMessage());
+ HintManager.getInstance().showErrorHint(console.getConsole().getConsoleEditor(), getConsoleIsNotEnabledMessage());
}
}
- private void doRunExecuteAction(LanguageConsoleImpl languageConsole) {
- if (shouldCopyToHistory(languageConsole)) {
- copyToHistoryAndExecute(languageConsole);
+ private void doRunExecuteAction(LanguageConsoleView console) {
+ if (shouldCopyToHistory(console.getConsole())) {
+ copyToHistoryAndExecute(console);
}
else {
- final Document document = languageConsole.getConsoleEditor().getDocument();
- processLine(document.getText());
+ processLine(console.getConsole().getConsoleEditor().getDocument().getText());
}
}
@@ -363,8 +394,8 @@
return !PyConsoleUtil.isPagingPrompt(console.getPrompt());
}
- private void copyToHistoryAndExecute(LanguageConsoleImpl languageConsole) {
- super.runExecuteAction(languageConsole);
+ private void copyToHistoryAndExecute(LanguageConsoleView console) {
+ super.runExecuteAction(console);
}
public boolean canExecuteNow() {
diff --git a/python/src/com/jetbrains/python/console/PydevConsoleRunner.java b/python/src/com/jetbrains/python/console/PydevConsoleRunner.java
index 947b3c9..213f635 100644
--- a/python/src/com/jetbrains/python/console/PydevConsoleRunner.java
+++ b/python/src/com/jetbrains/python/console/PydevConsoleRunner.java
@@ -23,12 +23,12 @@
import com.intellij.execution.configurations.GeneralCommandLine;
import com.intellij.execution.console.ConsoleHistoryController;
import com.intellij.execution.console.LanguageConsoleView;
+import com.intellij.execution.console.ProcessBackedConsoleExecuteActionHandler;
import com.intellij.execution.process.CommandLineArgumentsProvider;
import com.intellij.execution.process.ProcessAdapter;
import com.intellij.execution.process.ProcessEvent;
import com.intellij.execution.process.ProcessOutputTypes;
import com.intellij.execution.runners.AbstractConsoleRunnerWithHistory;
-import com.intellij.execution.runners.ConsoleExecuteActionHandler;
import com.intellij.execution.ui.RunContentDescriptor;
import com.intellij.icons.AllIcons;
import com.intellij.openapi.actionSystem.*;
@@ -50,10 +50,11 @@
import com.intellij.openapi.util.io.StreamUtil;
import com.intellij.openapi.vfs.CharsetToolkit;
import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.openapi.vfs.encoding.EncodingManager;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.impl.source.tree.FileElement;
-import com.intellij.remotesdk.RemoteSdkData;
+import com.intellij.remotesdk.RemoteSdkCredentials;
import com.intellij.remotesdk.RemoteSshProcess;
import com.intellij.testFramework.LightVirtualFile;
import com.intellij.util.ArrayUtil;
@@ -61,16 +62,11 @@
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.net.NetUtils;
import com.intellij.util.ui.UIUtil;
-import com.intellij.xdebugger.impl.frame.XStandaloneVariablesView;
import com.jetbrains.python.PythonHelpersLocator;
import com.jetbrains.python.console.completion.PydevConsoleElement;
import com.jetbrains.python.console.parsing.PythonConsoleData;
import com.jetbrains.python.console.pydev.ConsoleCommunication;
-import com.jetbrains.python.console.pydev.ConsoleCommunicationListener;
-import com.jetbrains.python.debugger.PyDebuggerEditorsProvider;
import com.jetbrains.python.debugger.PySourcePosition;
-import com.jetbrains.python.debugger.PyStackFrame;
-import com.jetbrains.python.debugger.PyStackFrameInfo;
import com.jetbrains.python.remote.PythonRemoteInterpreterManager;
import com.jetbrains.python.run.ProcessRunner;
import com.jetbrains.python.run.PythonCommandLineState;
@@ -81,11 +77,12 @@
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.io.File;
import java.io.IOException;
+import java.nio.charset.Charset;
import java.util.*;
-import java.util.List;
import static com.jetbrains.python.sdk.PythonEnvUtil.setPythonIOEncoding;
import static com.jetbrains.python.sdk.PythonEnvUtil.setPythonUnbuffered;
@@ -95,6 +92,7 @@
*/
public class PydevConsoleRunner extends AbstractConsoleRunnerWithHistory<PythonConsoleView> {
private static final Logger LOG = Logger.getInstance(PydevConsoleRunner.class.getName());
+ @SuppressWarnings("SpellCheckingInspection")
public static final String PYDEV_PYDEVCONSOLE_PY = "pydev/pydevconsole.py";
public static final int PORTS_WAITING_TIMEOUT = 20000;
@@ -134,7 +132,11 @@
}
public static Map<String, String> addDefaultEnvironments(Sdk sdk, Map<String, String> envs) {
- setPythonIOEncoding(setPythonUnbuffered(envs), "utf-8");
+ Charset defaultCharset = EncodingManager.getInstance().getDefaultCharset();
+
+ final String encoding = defaultCharset != null ? defaultCharset.name() : "utf-8";
+ setPythonIOEncoding(setPythonUnbuffered(envs), encoding);
+
PythonSdkFlavor.initPythonPath(envs, true, PythonCommandLineState.getAddedPaths(sdk));
return envs;
}
@@ -188,6 +190,7 @@
@Override
public void run() {
ProgressManager.getInstance().run(new Task.Backgroundable(getProject(), "Connecting to console", false) {
+ @Override
public void run(@NotNull final ProgressIndicator indicator) {
indicator.setText("Connecting to console...");
try {
@@ -195,6 +198,7 @@
}
catch (ExecutionException e) {
LOG.warn("Error running console", e);
+ assert myProject != null;
ExecutionHelper.showErrors(myProject, Arrays.<Exception>asList(e), getTitle(), null);
}
}
@@ -247,14 +251,17 @@
args.add(String.valueOf(port));
}
return new CommandLineArgumentsProvider() {
+ @Override
public String[] getArguments() {
return ArrayUtil.toStringArray(args);
}
+ @Override
public boolean passParentEnvs() {
return false;
}
+ @Override
public Map<String, String> getAdditionalEnvs() {
return addDefaultEnvironments(sdk, environmentVariables);
}
@@ -295,22 +302,25 @@
private Process createRemoteConsoleProcess(PythonRemoteInterpreterManager manager, String[] command, Map<String, String> env)
throws ExecutionException {
- RemoteSdkData data = (RemoteSdkData)mySdk.getSdkAdditionalData();
+ RemoteSdkCredentials data = (RemoteSdkCredentials)mySdk.getSdkAdditionalData();
+ assert data != null;
GeneralCommandLine commandLine = new GeneralCommandLine(command);
+
+
commandLine.getEnvironment().putAll(env);
commandLine.getParametersList().set(1, PythonRemoteInterpreterManager.toSystemDependent(new File(data.getHelpersPath(),
PYDEV_PYDEVCONSOLE_PY)
.getPath(),
PySourcePosition.isWindowsPath(
- data.getInterpreterPath())));
+ data.getInterpreterPath())
+ ));
commandLine.getParametersList().set(2, "0");
commandLine.getParametersList().set(3, "0");
myCommandLine = commandLine.getCommandLineString();
-
RemoteSshProcess remoteProcess =
manager.createRemoteProcess(getProject(), data, commandLine, true);
@@ -345,7 +355,7 @@
try {
return Integer.parseInt(line);
}
- catch (NumberFormatException e) {
+ catch (NumberFormatException ignored) {
continue;
}
}
@@ -354,7 +364,7 @@
Thread.sleep(200);
}
- catch (InterruptedException e1) {
+ catch (InterruptedException ignored) {
}
if (process.exitValue() != 0) {
@@ -362,7 +372,7 @@
try {
error = "Console process terminated with error:\n" + StreamUtil.readText(process.getErrorStream());
}
- catch (Exception e) {
+ catch (Exception ignored) {
error = "Console process terminated with exit code " + process.exitValue();
}
throw new ExecutionException(error);
@@ -444,7 +454,7 @@
e.getPresentation().setEnabled(enabled);
}
};
- anAction.registerCustomShortcutSet(KeyEvent.VK_C, KeyEvent.CTRL_MASK, getConsoleView().getConsole().getConsoleEditor().getComponent());
+ anAction.registerCustomShortcutSet(KeyEvent.VK_C, InputEvent.CTRL_MASK, getConsoleView().getConsole().getConsoleEditor().getComponent());
anAction.getTemplatePresentation().setVisible(false);
return anAction;
}
@@ -455,7 +465,8 @@
@Override
public void actionPerformed(final AnActionEvent e) {
new WriteCommandAction(getLanguageConsole().getProject(), getLanguageConsole().getFile()) {
- protected void run(final Result result) throws Throwable {
+ @Override
+ protected void run(@NotNull final Result result) throws Throwable {
String text = getLanguageConsole().getEditorDocument().getText();
String newText = text.substring(0, text.length() - myConsoleExecuteActionHandler.getPythonIndent());
getLanguageConsole().getEditorDocument().setText(newText);
@@ -492,7 +503,7 @@
try {
res = myPydevConsoleCommunication.handshake();
}
- catch (XmlRpcException e) {
+ catch (XmlRpcException ignored) {
res = false;
}
if (res) {
@@ -507,7 +518,7 @@
try {
Thread.sleep(100);
}
- catch (InterruptedException e) {
+ catch (InterruptedException ignored) {
}
}
}
@@ -546,7 +557,7 @@
// waiting for REPL communication before destroying process handler
Thread.sleep(300);
}
- catch (Exception e1) {
+ catch (Exception ignored) {
// Ignore
}
generalStopAction.actionPerformed(furtherActionEvent);
@@ -565,12 +576,12 @@
@NotNull
@Override
- protected ConsoleExecuteActionHandler createConsoleExecuteActionHandler() {
+ protected ProcessBackedConsoleExecuteActionHandler createExecuteActionHandler() {
myConsoleExecuteActionHandler =
new PydevConsoleExecuteActionHandler(getConsoleView(), getProcessHandler(), myPydevConsoleCommunication);
myConsoleExecuteActionHandler.setEnabled(false);
myHistoryController = new ConsoleHistoryController(myConsoleType.getTypeId(), "", getLanguageConsole(),
- myConsoleExecuteActionHandler.getConsoleHistoryModel());
+ myConsoleExecuteActionHandler.getConsoleHistoryModel());
myHistoryController.install();
return myConsoleExecuteActionHandler;
}
@@ -670,8 +681,9 @@
@Override
public void run(@NotNull ProgressIndicator indicator) {
UIUtil.invokeLaterIfNeeded(new Runnable() {
+ @Override
public void run() {
- PydevConsoleRunner.this.closeCommunication();
+ closeCommunication();
}
});
diff --git a/python/src/com/jetbrains/python/console/PythonConsoleView.java b/python/src/com/jetbrains/python/console/PythonConsoleView.java
index ddf62ed..a32f3fc 100644
--- a/python/src/com/jetbrains/python/console/PythonConsoleView.java
+++ b/python/src/com/jetbrains/python/console/PythonConsoleView.java
@@ -67,22 +67,31 @@
private static final Logger LOG = Logger.getInstance(PythonConsoleView.class);
- private Project myProject;
+ private final Project myProject;
private PydevConsoleExecuteActionHandler myExecuteActionHandler;
private PyConsoleSourceHighlighter mySourceHighlighter;
private boolean myIsIPythonOutput = false;
- private PyHighlighter myPyHighlighter;
- private EditorColorsScheme myScheme;
+ private final PyHighlighter myPyHighlighter;
+ private final EditorColorsScheme myScheme;
private boolean myHyperlink;
private final LanguageConsoleViewImpl myLanguageConsoleView;
- private Disposable mySplittedDisposable;
+ private Disposable mySplitDisposable;
- public PythonConsoleView(final Project project, final String title, Sdk sdk) {
+ public PythonConsoleView(final Project project, final String title, final Sdk sdk) {
super(new BorderLayout());
- myLanguageConsoleView = new LanguageConsoleViewImpl(new PythonLanguageConsole(project, title, sdk));
+ LanguageConsoleImpl languageConsole = new LanguageConsoleImpl(project, title, PythonLanguage.getInstance(), false);
+ if (languageConsole.getFile().getVirtualFile() != null) {
+ languageConsole.getFile().getVirtualFile().putUserData(LanguageLevel.KEY, PythonSdkType.getLanguageLevelForSdk(sdk));
+ }
+ // Mark editor as console one, to prevent autopopup completion
+ languageConsole.getConsoleEditor().putUserData(PythonConsoleAutopopupBlockingHandler.REPL_KEY, new Object());
+ languageConsole.setShowSeparatorLine(PyConsoleOptions.getInstance(project).isShowSeparatorLine());
+ languageConsole.initComponents();
+
+ myLanguageConsoleView = new LanguageConsoleViewImpl(languageConsole);
add(myLanguageConsoleView.getComponent(), BorderLayout.CENTER);
@@ -96,21 +105,22 @@
}
public void setConsoleCommunication(final ConsoleCommunication communication) {
- getPythonLanguageConsole().setConsoleCommunication(communication);
+ getPythonLanguageConsole().getFile().putCopyableUserData(PydevConsoleRunner.CONSOLE_KEY, communication);
}
public void setExecutionHandler(@NotNull PydevConsoleExecuteActionHandler consoleExecuteActionHandler) {
myExecuteActionHandler = consoleExecuteActionHandler;
}
+ @Override
public void requestFocus() {
IdeFocusManager.findInstance().requestFocus(getPythonLanguageConsole().getConsoleEditor().getContentComponent(), true);
myLanguageConsoleView.updateUI();
getLanguageConsole().getHistoryViewer().getComponent().updateUI();
}
- private PythonLanguageConsole getPythonLanguageConsole() {
- return ((PythonLanguageConsole)getLanguageConsole());
+ private LanguageConsoleImpl getPythonLanguageConsole() {
+ return getLanguageConsole();
}
public LanguageConsoleImpl getLanguageConsole() {
@@ -120,6 +130,7 @@
@Override
public void executeCode(final @NotNull String code, @Nullable final Editor editor) {
ProgressManager.getInstance().run(new Task.Backgroundable(null, "Executing code in console...", false) {
+ @Override
public void run(@NotNull final ProgressIndicator indicator) {
long time = System.currentTimeMillis();
while (!myExecuteActionHandler.isEnabled() || !myExecuteActionHandler.canExecuteNow()) {
@@ -140,7 +151,7 @@
try {
Thread.sleep(300);
}
- catch (InterruptedException e) {
+ catch (InterruptedException ignored) {
}
}
if (!indicator.isCanceled()) {
@@ -152,7 +163,9 @@
private void doExecute(String code) {
- executeInConsole(PyConsoleIndentUtil.normalize(code, myExecuteActionHandler.getCurrentIndentSize()));
+ String codeFragment = PyConsoleIndentUtil.normalize(code, myExecuteActionHandler.getCurrentIndentSize());
+ codeFragment += "\n";
+ executeInConsole(codeFragment);
}
public void executeInConsole(final String code) {
@@ -161,11 +174,11 @@
public void run() {
String text = getPythonLanguageConsole().getConsoleEditor().getDocument().getText();
- getPythonLanguageConsole().setTextToEditor(code);
- myExecuteActionHandler.runExecuteAction(getPythonLanguageConsole());
+ getPythonLanguageConsole().setInputText(code);
+ myExecuteActionHandler.runExecuteAction(myLanguageConsoleView);
if (!StringUtil.isEmpty(text)) {
- getPythonLanguageConsole().setTextToEditor(text);
+ getPythonLanguageConsole().setInputText(text);
}
}
});
@@ -184,7 +197,8 @@
myLanguageConsoleView.print(text, outputType);
}
- public void print(String text, final ConsoleViewContentType outputType) {
+ @Override
+ public void print(@NotNull String text, @NotNull final ConsoleViewContentType outputType) {
detectIPython(text, outputType);
if (PyConsoleUtil.detectIPythonEnd(text)) {
myIsIPythonOutput = false;
@@ -343,7 +357,7 @@
}
public void setSdk(Sdk sdk) {
- getPythonLanguageConsole().setSdk(sdk);
+ getPythonLanguageConsole().getFile().putCopyableUserData(PydevConsoleRunner.CONSOLE_SDK, sdk);
}
@Override
@@ -383,7 +397,7 @@
final XStandaloneVariablesView view = new XStandaloneVariablesView(myProject, new PyDebuggerEditorsProvider(), stackFrame);
consoleCommunication.addCommunicationListener(new ConsoleCommunicationListener() {
@Override
- public void commandExecuted() {
+ public void commandExecuted(boolean more) {
view.rebuildView();
}
@@ -398,7 +412,7 @@
removeAll();
JSplitPane p = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
p.add(myLanguageConsoleView.getComponent(), JSplitPane.LEFT);
- mySplittedDisposable = componentDisposable;
+ mySplitDisposable = componentDisposable;
p.add(component, JSplitPane.RIGHT);
p.setDividerLocation((int)getSize().getWidth()*2/3);
add(p, BorderLayout.CENTER);
@@ -412,38 +426,9 @@
add(myLanguageConsoleView.getComponent(), BorderLayout.CENTER);
validate();
repaint();
- if (mySplittedDisposable != null) {
- Disposer.dispose(mySplittedDisposable);
- mySplittedDisposable = null;
- }
- }
-
- private static class PythonLanguageConsole extends LanguageConsoleImpl {
-
- public PythonLanguageConsole(final Project project, final String title, final Sdk sdk) {
- super(project, title, PythonLanguage.getInstance(), false);
- initLanguageLevel(sdk);
- // Mark editor as console one, to prevent autopopup completion
- getConsoleEditor().putUserData(PythonConsoleAutopopupBlockingHandler.REPL_KEY, new Object());
-
- setShowSeparatorLine(PyConsoleOptions.getInstance(project).isShowSeparatorLine());
-
- initComponents();
- }
-
- private void initLanguageLevel(@Nullable Sdk sdk) {
- if (myFile.getVirtualFile() != null) {
- //noinspection ConstantConditions
- myFile.getVirtualFile().putUserData(LanguageLevel.KEY, PythonSdkType.getLanguageLevelForSdk(sdk));
- }
- }
-
- public void setConsoleCommunication(final ConsoleCommunication communication) {
- myFile.putCopyableUserData(PydevConsoleRunner.CONSOLE_KEY, communication);
- }
-
- public void setSdk(Sdk sdk) {
- myFile.putCopyableUserData(PydevConsoleRunner.CONSOLE_SDK, sdk);
+ if (mySplitDisposable != null) {
+ Disposer.dispose(mySplitDisposable);
+ mySplitDisposable = null;
}
}
}
diff --git a/python/src/com/jetbrains/python/console/PythonDebugConsoleCommunication.java b/python/src/com/jetbrains/python/console/PythonDebugConsoleCommunication.java
index 8f55aed..d24a2a8a 100644
--- a/python/src/com/jetbrains/python/console/PythonDebugConsoleCommunication.java
+++ b/python/src/com/jetbrains/python/console/PythonDebugConsoleCommunication.java
@@ -63,8 +63,8 @@
return false;
}
- protected void exec(final String command, final ProcessDebugger.DebugCallback<Pair<String, Boolean>> callback) {
- myDebugProcess.consoleExec(command, new ProcessDebugger.DebugCallback<String>() {
+ protected void exec(final ConsoleCodeFragment command, final ProcessDebugger.DebugCallback<Pair<String, Boolean>> callback) {
+ myDebugProcess.consoleExec(command.getText(), new ProcessDebugger.DebugCallback<String>() {
@Override
public void ok(String value) {
callback.ok(parseExecResponseString(value));
@@ -77,9 +77,9 @@
});
}
- public void execInterpreter(String s, final Function<InterpreterResponse, Object> callback) {
- myExpression.append(s);
- exec(myExpression.toString(), new ProcessDebugger.DebugCallback<Pair<String, Boolean>>() {
+ public void execInterpreter(ConsoleCodeFragment code, final Function<InterpreterResponse, Object> callback) {
+ myExpression.append(code.getText());
+ exec(new ConsoleCodeFragment(myExpression.toString(), false), new ProcessDebugger.DebugCallback<Pair<String, Boolean>>() {
@Override
public void ok(Pair<String, Boolean> executed) {
boolean more = executed.second;
diff --git a/python/src/com/jetbrains/python/console/PythonDebugLanguageConsoleView.java b/python/src/com/jetbrains/python/console/PythonDebugLanguageConsoleView.java
index 71b4e21..495c26d 100644
--- a/python/src/com/jetbrains/python/console/PythonDebugLanguageConsoleView.java
+++ b/python/src/com/jetbrains/python/console/PythonDebugLanguageConsoleView.java
@@ -63,7 +63,7 @@
public PythonDebugLanguageConsoleView(final Project project, Sdk sdk, ConsoleView consoleView) {
super(new CardLayout());
- myPydevConsoleView = createConsoleView(project, sdk);
+ myPydevConsoleView = new PythonConsoleView(project, "Python Console", sdk);
myTextConsole = consoleView;
add(myTextConsole.getComponent(), TEXT_CONSOLE_PANEL);
@@ -85,10 +85,6 @@
getPydevConsoleView().executeCode(code, e);
}
- private static PythonConsoleView createConsoleView(Project project, Sdk sdk) {
- return new PythonConsoleView(project, "Python Console", sdk);
- }
-
private void doShowConsole(String type) {
CardLayout cl = (CardLayout)(getLayout());
cl.show(this, type);
@@ -141,7 +137,7 @@
}
@Override
- public void print(String s, ConsoleViewContentType contentType) {
+ public void print(@NotNull String s, @NotNull ConsoleViewContentType contentType) {
myPydevConsoleView.print(s, contentType);
myTextConsole.print(s, contentType);
}
@@ -242,19 +238,23 @@
myConsole = console;
}
+ @Override
public boolean isSelected(final AnActionEvent event) {
return myConsole.isDebugConsole();
}
+ @Override
public void setSelected(final AnActionEvent event, final boolean flag) {
myConsole.showDebugConsole(flag);
ApplicationManager.getApplication().invokeLater(new Runnable() {
+ @Override
public void run() {
update(event);
}
});
}
+ @Override
public void update(final AnActionEvent event) {
super.update(event);
final Presentation presentation = event.getPresentation();
diff --git a/python/src/com/jetbrains/python/console/RunPythonConsoleAction.java b/python/src/com/jetbrains/python/console/RunPythonConsoleAction.java
index c21288e..9c610e7 100644
--- a/python/src/com/jetbrains/python/console/RunPythonConsoleAction.java
+++ b/python/src/com/jetbrains/python/console/RunPythonConsoleAction.java
@@ -23,7 +23,6 @@
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.actionSystem.LangDataKeys;
-import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
@@ -36,7 +35,7 @@
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.PathMappingSettings;
import com.jetbrains.python.buildout.BuildoutFacet;
-import com.jetbrains.python.remote.PyRemoteSdkData;
+import com.jetbrains.python.remote.PyRemoteSdkCredentials;
import com.jetbrains.python.remote.PythonRemoteInterpreterManager;
import com.jetbrains.python.run.PythonCommandLineState;
import com.jetbrains.python.sdk.PySdkUtil;
@@ -154,7 +153,7 @@
PythonRemoteInterpreterManager instance = PythonRemoteInterpreterManager.getInstance();
if (instance != null) {
mappingSettings =
- instance.setupMappings(project, (PyRemoteSdkData)sdk.getSdkAdditionalData(), null);
+ instance.setupMappings(project, (PyRemoteSdkCredentials)sdk.getSdkAdditionalData(), null);
}
}
return mappingSettings;
diff --git a/python/src/com/jetbrains/python/debugger/PyDebugProcess.java b/python/src/com/jetbrains/python/debugger/PyDebugProcess.java
index 759bf71..312db25 100644
--- a/python/src/com/jetbrains/python/debugger/PyDebugProcess.java
+++ b/python/src/com/jetbrains/python/debugger/PyDebugProcess.java
@@ -77,6 +77,7 @@
private final List<PyThreadInfo> mySuspendedThreads = Collections.synchronizedList(Lists.<PyThreadInfo>newArrayList());
private final Map<String, XValueChildrenList> myStackFrameCache = Maps.newHashMap();
private final Map<String, PyDebugValue> myNewVariableValue = Maps.newHashMap();
+ private boolean myDownloadSources = false;
private boolean myClosing = false;
@@ -185,6 +186,7 @@
return myPositionConverter;
}
+ @NotNull
@Override
public XBreakpointHandler<?>[] getBreakpointHandlers() {
return myBreakpointHandlers;
@@ -422,8 +424,17 @@
cleanUp();
}
+ public boolean isDownloadSources() {
+ return myDownloadSources;
+ }
+
+ public void setDownloadSources(boolean downloadSources) {
+ myDownloadSources = downloadSources;
+ }
+
protected void cleanUp() {
mySuspendedThreads.clear();
+ myDownloadSources = false;
}
@Override
@@ -662,7 +673,7 @@
}
public PyStackFrame createStackFrame(PyStackFrameInfo frameInfo) {
- return new PyStackFrame(this.getSession().getProject(), this, frameInfo,
+ return new PyStackFrame(getSession().getProject(), this, frameInfo,
getPositionConverter().convertFromPython(frameInfo.getPosition()));
}
diff --git a/python/src/com/jetbrains/python/debugger/PyDebugRunner.java b/python/src/com/jetbrains/python/debugger/PyDebugRunner.java
index 7ca044b..3199200 100644
--- a/python/src/com/jetbrains/python/debugger/PyDebugRunner.java
+++ b/python/src/com/jetbrains/python/debugger/PyDebugRunner.java
@@ -19,11 +19,11 @@
import com.intellij.execution.ExecutionException;
import com.intellij.execution.ExecutionResult;
import com.intellij.execution.configurations.*;
+import com.intellij.execution.console.LanguageConsoleBuilder;
import com.intellij.execution.executors.DefaultDebugExecutor;
import com.intellij.execution.process.ProcessHandler;
import com.intellij.execution.runners.ExecutionEnvironment;
import com.intellij.execution.runners.GenericProgramRunner;
-import com.intellij.execution.runners.LanguageConsoleBuilder;
import com.intellij.execution.ui.ExecutionConsole;
import com.intellij.execution.ui.RunContentDescriptor;
import com.intellij.openapi.application.ApplicationManager;
@@ -40,7 +40,6 @@
import com.jetbrains.python.console.PythonConsoleView;
import com.jetbrains.python.console.PythonDebugConsoleCommunication;
import com.jetbrains.python.console.PythonDebugLanguageConsoleView;
-import com.jetbrains.python.console.pydev.ConsoleCommunication;
import com.jetbrains.python.run.AbstractPythonRunConfiguration;
import com.jetbrains.python.run.CommandLinePatcher;
import com.jetbrains.python.run.PythonCommandLineState;
@@ -58,27 +57,32 @@
public class PyDebugRunner extends GenericProgramRunner {
public static final String PY_DEBUG_RUNNER = "PyDebugRunner";
+ @SuppressWarnings("SpellCheckingInspection")
public static final String DEBUGGER_MAIN = "pydev/pydevd.py";
public static final String CLIENT_PARAM = "--client";
public static final String PORT_PARAM = "--port";
public static final String FILE_PARAM = "--file";
public static final String PYCHARM_PROJECT_ROOTS = "PYCHARM_PROJECT_ROOTS";
+ @SuppressWarnings("SpellCheckingInspection")
public static final String GEVENT_SUPPORT = "GEVENT_SUPPORT";
+ @Override
@NotNull
public String getRunnerId() {
return PY_DEBUG_RUNNER;
}
+ @Override
public boolean canRun(@NotNull String executorId, @NotNull RunProfile profile) {
return DefaultDebugExecutor.EXECUTOR_ID.equals(executorId) &&
profile instanceof AbstractPythonRunConfiguration &&
((AbstractPythonRunConfiguration)profile).canRunWithCoverage();
}
- protected RunContentDescriptor doExecute(final Project project, RunProfileState profileState,
+ @Override
+ protected RunContentDescriptor doExecute(@NotNull final Project project, @NotNull RunProfileState profileState,
RunContentDescriptor contentToReuse,
- ExecutionEnvironment env) throws ExecutionException {
+ @NotNull ExecutionEnvironment env) throws ExecutionException {
FileDocumentManager.getInstance().saveAllDocuments();
final PythonCommandLineState pyState = (PythonCommandLineState)profileState;
@@ -89,6 +93,7 @@
final XDebugSession session = XDebuggerManager.getInstance(project).
startSession(this, env, contentToReuse, new XDebugProcessStarter() {
+ @Override
@NotNull
public XDebugProcess start(@NotNull final XDebugSession session) {
PyDebugProcess pyDebugProcess =
@@ -117,23 +122,18 @@
@NotNull final ExecutionResult result,
@NotNull PyDebugProcess debugProcess) {
ExecutionConsole console = result.getExecutionConsole();
- ProcessHandler processHandler = result.getProcessHandler();
-
if (console instanceof PythonDebugLanguageConsoleView) {
PythonConsoleView pythonConsoleView = ((PythonDebugLanguageConsoleView)console).getPydevConsoleView();
+ pythonConsoleView.setConsoleCommunication(new PythonDebugConsoleCommunication(project, debugProcess));
-
- ConsoleCommunication consoleCommunication = new PythonDebugConsoleCommunication(project, debugProcess);
- pythonConsoleView.setConsoleCommunication(consoleCommunication);
-
+ ProcessHandler processHandler = result.getProcessHandler();
PydevDebugConsoleExecuteActionHandler consoleExecuteActionHandler = new PydevDebugConsoleExecuteActionHandler(pythonConsoleView,
processHandler,
- consoleCommunication);
-
+ new PythonDebugConsoleCommunication(project, debugProcess));
pythonConsoleView.setExecutionHandler(consoleExecuteActionHandler);
debugProcess.getSession().addSessionListener(consoleExecuteActionHandler);
- new LanguageConsoleBuilder().console(pythonConsoleView).processHandler(processHandler).initActions(consoleExecuteActionHandler, "py");
+ new LanguageConsoleBuilder(pythonConsoleView).processHandler(processHandler).initActions(consoleExecuteActionHandler, "py");
}
}
@@ -156,9 +156,8 @@
final PythonCommandLineState pyState,
final int serverLocalPort) {
return new CommandLinePatcher() {
+ @Override
public void patchCommandLine(GeneralCommandLine commandLine) {
-
-
// script name is the last parameter; all other params are for python interpreter; insert just before name
final ParametersList parametersList = commandLine.getParametersList();
@@ -170,11 +169,13 @@
final PythonSdkFlavor flavor = pyState.getSdkFlavor();
if (flavor != null) {
+ assert exeParams != null;
for (String option : flavor.getExtraDebugOptions()) {
exeParams.addParameter(option);
}
}
+ assert debugParams != null;
fillDebugParameters(project, debugParams, serverLocalPort, pyState, commandLine);
}
};
@@ -187,6 +188,7 @@
@NotNull GeneralCommandLine generalCommandLine) {
debugParams.addParameter(PythonHelpersLocator.getHelperPath(DEBUGGER_MAIN));
if (pyState.isMultiprocessDebug()) {
+ //noinspection SpellCheckingInspection
debugParams.addParameter("--multiproc");
}
diff --git a/python/src/com/jetbrains/python/documentation/DocStringParameterReference.java b/python/src/com/jetbrains/python/documentation/DocStringParameterReference.java
index 9e4e63d..968d413 100644
--- a/python/src/com/jetbrains/python/documentation/DocStringParameterReference.java
+++ b/python/src/com/jetbrains/python/documentation/DocStringParameterReference.java
@@ -17,14 +17,17 @@
import com.google.common.collect.Lists;
import com.intellij.lang.annotation.HighlightSeverity;
+import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiReference;
import com.intellij.psi.PsiReferenceBase;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.ArrayUtil;
+import com.intellij.util.IncorrectOperationException;
import com.intellij.util.containers.HashSet;
import com.jetbrains.python.PyNames;
+import com.jetbrains.python.PythonStringUtil;
import com.jetbrains.python.psi.*;
import com.jetbrains.python.psi.impl.ParamHelper;
import com.jetbrains.python.psi.types.TypeEvalContext;
@@ -37,10 +40,10 @@
/**
* @author yole
*/
-public class DocStringParameterReference extends PsiReferenceBase<PsiElement> implements PsiReferenceEx {
- private final String myType;
+public class DocStringParameterReference extends PsiReferenceBase<PyStringLiteralExpression> implements PsiReferenceEx {
+ private final StructuredDocStringBase.ReferenceType myType;
- public DocStringParameterReference(PsiElement element, TextRange range, String refType) {
+ public DocStringParameterReference(PyStringLiteralExpression element, TextRange range, StructuredDocStringBase.ReferenceType refType) {
super(element, range);
myType = refType;
}
@@ -55,26 +58,42 @@
final PyFunction init = ((PyClass)owner).findMethodByName(PyNames.INIT, false);
if (init != null) {
PsiElement element = resolveParameter(init);
- if (element == null)
- element = resolveClassVariable(owner);
+ if (element == null && (myType.equals(StructuredDocStringBase.ReferenceType.CLASS_VARIABLE) ||
+ myType.equals(StructuredDocStringBase.ReferenceType.PARAMETER_TYPE)))
+ element = resolveClassVariable((PyClass)owner);
+ if (element == null && (myType.equals(StructuredDocStringBase.ReferenceType.INSTANCE_VARIABLE) ||
+ myType.equals(StructuredDocStringBase.ReferenceType.PARAMETER_TYPE)))
+ element = resolveInstanceVariable((PyClass)owner);
return element;
}
else {
- return resolveClassVariable(owner);
+ if (myType.equals(StructuredDocStringBase.ReferenceType.CLASS_VARIABLE) ||
+ myType.equals(StructuredDocStringBase.ReferenceType.PARAMETER_TYPE))
+ return resolveClassVariable((PyClass)owner);
+ if (myType.equals(StructuredDocStringBase.ReferenceType.INSTANCE_VARIABLE) ||
+ myType.equals(StructuredDocStringBase.ReferenceType.PARAMETER_TYPE))
+ return resolveInstanceVariable((PyClass)owner);
}
}
return null;
}
@Nullable
- private PsiElement resolveClassVariable(final PyDocStringOwner owner) {
- final PyStatementList statementList = ((PyClass)owner).getStatementList();
- for (PsiElement element : statementList.getChildren()) {
- if (element instanceof PyAssignmentStatement) {
- final PyExpression[] targets = ((PyAssignmentStatement)element).getTargets();
- if (targets.length > 0 && targets[0].getText().equals(getCanonicalText()))
- return targets[0];
- }
+ private PsiElement resolveInstanceVariable(final PyClass owner) {
+ final List<PyTargetExpression> attributes = owner.getInstanceAttributes();
+ for (PyTargetExpression element : attributes) {
+ if (getCanonicalText().equals(element.getName()))
+ return element;
+ }
+ return null;
+ }
+
+ @Nullable
+ private PsiElement resolveClassVariable(@NotNull final PyClass owner) {
+ final List<PyTargetExpression> attributes = owner.getClassAttributes();
+ for (PyTargetExpression element : attributes) {
+ if (getCanonicalText().equals(element.getName()))
+ return element;
}
return null;
}
@@ -123,7 +142,7 @@
return ArrayUtil.EMPTY_OBJECT_ARRAY;
}
- public String getType() {
+ public StructuredDocStringBase.ReferenceType getType() {
return myType;
}
@@ -143,4 +162,18 @@
}
return null;
}
+
+ @Override
+ public PsiElement handleElementRename(String newElementName) throws IncorrectOperationException {
+ TextRange range = getRangeInElement();
+ Pair<String, String> quotes = PythonStringUtil.getQuotes(range.substring(myElement.getText()));
+
+ if (quotes != null) {
+ range = TextRange.create(range.getStartOffset() + quotes.first.length(), range.getEndOffset() - quotes.second.length());
+ }
+
+ String newName = range.replace(myElement.getText(), newElementName);
+ myElement.updateText(newName);
+ return myElement;
+ }
}
diff --git a/python/src/com/jetbrains/python/documentation/DocStringReferenceProvider.java b/python/src/com/jetbrains/python/documentation/DocStringReferenceProvider.java
index 2891726..9eea80c 100644
--- a/python/src/com/jetbrains/python/documentation/DocStringReferenceProvider.java
+++ b/python/src/com/jetbrains/python/documentation/DocStringReferenceProvider.java
@@ -59,18 +59,24 @@
// XXX: It does not work with multielement docstrings
StructuredDocString docString = DocStringUtil.parse(text);
if (docString != null) {
- result.addAll(referencesFromNames(element, offset, docString,
+ result.addAll(referencesFromNames(expr, offset, docString,
docString.getTagArguments(StructuredDocStringBase.PARAM_TAGS),
- StructuredDocStringBase.PARAMETER));
- result.addAll(referencesFromNames(element, offset, docString,
+ StructuredDocStringBase.ReferenceType.PARAMETER));
+ result.addAll(referencesFromNames(expr, offset, docString,
docString.getTagArguments(StructuredDocStringBase.PARAM_TYPE_TAGS),
- StructuredDocStringBase.PARAMETER_TYPE));
- result.addAll(referencesFromNames(element, offset, docString,
- docString.getKeywordArgumentSubstrings(), StructuredDocStringBase.KEYWORD));
+ StructuredDocStringBase.ReferenceType.PARAMETER_TYPE));
+ result.addAll(referencesFromNames(expr, offset, docString,
+ docString.getKeywordArgumentSubstrings(), StructuredDocStringBase.ReferenceType.KEYWORD));
- result.addAll(referencesFromNames(element, offset, docString,
- docString.getTagArguments(StructuredDocStringBase.VARIABLE_TAGS),
- StructuredDocStringBase.VARIABLE));
+ result.addAll(referencesFromNames(expr, offset, docString,
+ docString.getTagArguments("var"),
+ StructuredDocStringBase.ReferenceType.VARIABLE));
+ result.addAll(referencesFromNames(expr, offset, docString,
+ docString.getTagArguments("cvar"),
+ StructuredDocStringBase.ReferenceType.CLASS_VARIABLE));
+ result.addAll(referencesFromNames(expr, offset, docString,
+ docString.getTagArguments("ivar"),
+ StructuredDocStringBase.ReferenceType.INSTANCE_VARIABLE));
result.addAll(returnTypes(element, docString, offset));
}
return result.toArray(new PsiReference[result.size()]);
@@ -90,11 +96,11 @@
}
return result;
}
- private static List<PsiReference> referencesFromNames(PsiElement element,
+ private static List<PsiReference> referencesFromNames(PyStringLiteralExpression element,
int offset,
StructuredDocString docString,
List<Substring> paramNames,
- String refType) {
+ StructuredDocStringBase.ReferenceType refType) {
List<PsiReference> result = new ArrayList<PsiReference>();
for (Substring name : paramNames) {
final String s = name.toString();
@@ -102,7 +108,7 @@
final TextRange range = name.getTextRange().shiftRight(offset);
result.add(new DocStringParameterReference(element, range, refType));
}
- if (refType.equals(StructuredDocStringBase.PARAMETER_TYPE)) {
+ if (refType.equals(StructuredDocStringBase.ReferenceType.PARAMETER_TYPE)) {
final Substring type = docString.getParamTypeSubstring(s);
if (type != null) {
result.addAll(parseTypeReferences(element, type, offset));
diff --git a/python/src/com/jetbrains/python/documentation/PyDocstringGenerator.java b/python/src/com/jetbrains/python/documentation/PyDocstringGenerator.java
index d7358f1..d09af58 100644
--- a/python/src/com/jetbrains/python/documentation/PyDocstringGenerator.java
+++ b/python/src/com/jetbrains/python/documentation/PyDocstringGenerator.java
@@ -222,8 +222,9 @@
}
replacementText.append(line);
}
- if (replacementText.length() > 0)
- replacementText.deleteCharAt(replacementText.length()-1);
+ if (replacementText.length() > 0) {
+ replacementText.deleteCharAt(replacementText.length() - 1);
+ }
addParams(replacementText, false, paramsToAdd);
for (int i = ind; i != lines.length; ++i) {
String line = lines[i];
@@ -250,7 +251,7 @@
final Module module = ModuleUtilCore.findModuleForPsiElement(myDocStringOwner);
if (module != null) {
PyDocumentationSettings documentationSettings = PyDocumentationSettings.getInstance(module);
- if (documentationSettings.isPlain(getFile())) return replacementText.length()-1;
+ if (documentationSettings.isPlain(getFile())) return replacementText.length() - 1;
}
int i = 0;
@@ -418,7 +419,8 @@
"def " + myFunction.getName() + myFunction.getParameterList().getText()
+ ":\n" + StringUtil.repeat(" ", getIndentSize(myFunction))
+ replacement + "\n" +
- StringUtil.repeat(" ", getIndentSize(myFunction)) + list.getText());
+ StringUtil.repeat(" ", getIndentSize(myFunction)) + list.getText()
+ );
myFunction = (PyFunction)myFunction.replace(func);
}
@@ -429,7 +431,9 @@
}
myFunction = CodeInsightUtilCore.forcePsiPostprocessAndRestoreElement(myFunction);
- myDocStringExpression = myFunction.getDocStringExpression();
+ if (myFunction != null) {
+ myDocStringExpression = myFunction.getDocStringExpression();
+ }
}
}
diff --git a/python/src/com/jetbrains/python/documentation/PyDocumentationBuilder.java b/python/src/com/jetbrains/python/documentation/PyDocumentationBuilder.java
index ec4becc..4c3432c 100644
--- a/python/src/com/jetbrains/python/documentation/PyDocumentationBuilder.java
+++ b/python/src/com/jetbrains/python/documentation/PyDocumentationBuilder.java
@@ -95,7 +95,7 @@
PyType type = context.getType(qual);
if (type instanceof PyClassType) {
cls = ((PyClassType)type).getPyClass();
- Property property = cls.findProperty(elementName);
+ Property property = cls.findProperty(elementName, true);
if (property != null) {
is_property = true;
final AccessDirection dir = AccessDirection.of((PyElement)outer);
diff --git a/python/src/com/jetbrains/python/documentation/PyDocumentationSettings.java b/python/src/com/jetbrains/python/documentation/PyDocumentationSettings.java
index edde7f2..6ea6540 100644
--- a/python/src/com/jetbrains/python/documentation/PyDocumentationSettings.java
+++ b/python/src/com/jetbrains/python/documentation/PyDocumentationSettings.java
@@ -37,7 +37,7 @@
storages = {@Storage(file = "$MODULE_FILE$")}
)
public class PyDocumentationSettings implements PersistentStateComponent<PyDocumentationSettings> {
- public String myDocStringFormat = "";
+ public String myDocStringFormat = DocStringFormat.REST;
public boolean analyzeDoctest = true;
public boolean isEpydocFormat(PsiFile file) {
diff --git a/python/src/com/jetbrains/python/documentation/PythonDocumentationProvider.java b/python/src/com/jetbrains/python/documentation/PythonDocumentationProvider.java
index 3a504aa..55bc1e4 100644
--- a/python/src/com/jetbrains/python/documentation/PythonDocumentationProvider.java
+++ b/python/src/com/jetbrains/python/documentation/PythonDocumentationProvider.java
@@ -487,7 +487,7 @@
".\nWould you like to configure it now?",
"Python External Documentation",
Messages.getQuestionIcon());
- if (rc == 0) {
+ if (rc == Messages.OK) {
ShowSettingsUtilImpl.showSettingsDialog(project, PythonDocumentationConfigurable.ID, "");
}
}
diff --git a/python/src/com/jetbrains/python/documentation/StructuredDocStringBase.java b/python/src/com/jetbrains/python/documentation/StructuredDocStringBase.java
index 0e3d9e3..9f6cecb 100644
--- a/python/src/com/jetbrains/python/documentation/StructuredDocStringBase.java
+++ b/python/src/com/jetbrains/python/documentation/StructuredDocStringBase.java
@@ -50,11 +50,9 @@
public static String[] RAISES_TAGS = new String[] { "raises", "raise", "except", "exception" };
public static String[] RETURN_TAGS = new String[] { "return", "returns" };
- public static String PARAMETER = "parameter";
+ public enum ReferenceType {PARAMETER, PARAMETER_TYPE, KEYWORD, VARIABLE, CLASS_VARIABLE, INSTANCE_VARIABLE}
+
public static String TYPE = "type";
- public static String PARAMETER_TYPE = "parameter_type";
- public static String KEYWORD = "keyword";
- public static String VARIABLE = "variable";
protected StructuredDocStringBase(@NotNull String docStringText, String tagPrefix) {
final Substring docString = new Substring(docStringText);
diff --git a/python/src/com/jetbrains/python/documentation/doctest/PyDocReferenceExpression.java b/python/src/com/jetbrains/python/documentation/doctest/PyDocReferenceExpression.java
index 1199583..62356d2 100644
--- a/python/src/com/jetbrains/python/documentation/doctest/PyDocReferenceExpression.java
+++ b/python/src/com/jetbrains/python/documentation/doctest/PyDocReferenceExpression.java
@@ -19,7 +19,6 @@
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiPolyVariantReference;
import com.intellij.psi.util.PsiTreeUtil;
-import com.jetbrains.python.psi.PyExpression;
import com.jetbrains.python.psi.PyFromImportStatement;
import com.jetbrains.python.psi.PyImportElement;
import com.jetbrains.python.psi.impl.PyReferenceExpressionImpl;
@@ -40,8 +39,7 @@
@NotNull
public PsiPolyVariantReference getReference(PyResolveContext context) {
- final PyExpression qualifier = getQualifier();
- if (qualifier != null) {
+ if (isQualified()) {
return new PyQualifiedReference(this, context);
}
final PsiElement importParent = PsiTreeUtil.getParentOfType(this, PyImportElement.class, PyFromImportStatement.class);
diff --git a/python/src/com/jetbrains/python/editor/PythonEnterHandler.java b/python/src/com/jetbrains/python/editor/PythonEnterHandler.java
index c29817a..c055606 100644
--- a/python/src/com/jetbrains/python/editor/PythonEnterHandler.java
+++ b/python/src/com/jetbrains/python/editor/PythonEnterHandler.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,6 +20,7 @@
import com.intellij.codeInsight.editorActions.enter.EnterHandlerDelegateAdapter;
import com.intellij.ide.DataManager;
import com.intellij.injected.editor.EditorWindow;
+import com.intellij.lang.ASTNode;
import com.intellij.lang.injection.InjectedLanguageManager;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Document;
@@ -29,6 +30,7 @@
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.*;
+import com.intellij.psi.impl.source.tree.TreeUtil;
import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil;
import com.intellij.psi.util.PsiTreeUtil;
import com.jetbrains.python.PyTokenTypes;
@@ -67,6 +69,7 @@
PyFunction.class,
PySliceExpression.class,
PySubscriptionExpression.class,
+ PyGeneratorExpression.class
};
@Override
@@ -192,8 +195,17 @@
return false;
}
}
- PsiElement statementBefore = findStatementBeforeCaret(file, offset);
- PsiElement statementAfter = findStatementAfterCaret(file, offset);
+ PsiElement atCaret = file.findElementAt(offset);
+ if (atCaret == null) {
+ return false;
+ }
+ ASTNode nodeAtCaret = atCaret.getNode();
+ return needInsertBackslash(nodeAtCaret, autoWrapInProgress);
+ }
+
+ public static boolean needInsertBackslash(ASTNode nodeAtCaret, boolean autoWrapInProgress) {
+ PsiElement statementBefore = findStatementBeforeCaret(nodeAtCaret);
+ PsiElement statementAfter = findStatementAfterCaret(nodeAtCaret);
if (statementBefore != statementAfter) { // Enter pressed at statement break
return false;
}
@@ -209,12 +221,12 @@
// if we're in middle of typing, it's expected that we will have error elements
}
- if (inFromImportParentheses(statementBefore, offset)) {
+ if (inFromImportParentheses(statementBefore, nodeAtCaret.getTextRange().getStartOffset())) {
return false;
}
- PsiElement wrappableBefore = findWrappable(file, offset, true);
- PsiElement wrappableAfter = findWrappable(file, offset, false);
+ PsiElement wrappableBefore = findWrappable(nodeAtCaret, true);
+ PsiElement wrappableAfter = findWrappable(nodeAtCaret, false);
if (!(wrappableBefore instanceof PsiComment)) {
while (wrappableBefore != null) {
PsiElement next = PsiTreeUtil.getParentOfType(wrappableBefore, WRAPPABLE_CLASSES);
@@ -258,14 +270,14 @@
}
@Nullable
- private static PsiElement findWrappable(PsiFile file, int offset, boolean before) {
+ private static PsiElement findWrappable(ASTNode nodeAtCaret, boolean before) {
PsiElement wrappable = before
- ? findBeforeCaret(file, offset, WRAPPABLE_CLASSES)
- : findAfterCaret(file, offset, WRAPPABLE_CLASSES);
+ ? findBeforeCaret(nodeAtCaret, WRAPPABLE_CLASSES)
+ : findAfterCaret(nodeAtCaret, WRAPPABLE_CLASSES);
if (wrappable == null) {
PsiElement emptyTuple = before
- ? findBeforeCaret(file, offset, PyTupleExpression.class)
- : findAfterCaret(file, offset, PyTupleExpression.class);
+ ? findBeforeCaret(nodeAtCaret, PyTupleExpression.class)
+ : findAfterCaret(nodeAtCaret, PyTupleExpression.class);
if (emptyTuple != null && emptyTuple.getNode().getFirstChildNode().getElementType() == PyTokenTypes.LPAR) {
wrappable = emptyTuple;
}
@@ -274,35 +286,31 @@
}
@Nullable
- private static PsiElement findStatementBeforeCaret(PsiFile file, int offset) {
- return findBeforeCaret(file, offset, PyStatement.class);
+ private static PsiElement findStatementBeforeCaret(ASTNode node) {
+ return findBeforeCaret(node, PyStatement.class);
}
@Nullable
- private static PsiElement findStatementAfterCaret(PsiFile file, int offset) {
- return findAfterCaret(file, offset, PyStatement.class);
+ private static PsiElement findStatementAfterCaret(ASTNode node) {
+ return findAfterCaret(node, PyStatement.class);
}
- @Nullable
- private static PsiElement findBeforeCaret(PsiFile file, int offset, Class<? extends PsiElement>... classes) {
- while(offset > 0) {
- offset--;
- final PsiElement element = file.findElementAt(offset);
- if (element != null && !(element instanceof PsiWhiteSpace)) {
- return getNonStrictParentOfType(element, classes);
+ private static PsiElement findBeforeCaret(ASTNode atCaret, Class<? extends PsiElement>... classes) {
+ while (atCaret != null) {
+ atCaret = TreeUtil.prevLeaf(atCaret);
+ if (atCaret != null && atCaret.getElementType() != TokenType.WHITE_SPACE) {
+ return getNonStrictParentOfType(atCaret.getPsi(), classes);
}
}
return null;
}
- @Nullable
- private static PsiElement findAfterCaret(PsiFile file, int offset, Class<? extends PsiElement>... classes) {
- while(offset < file.getTextLength()) {
- final PsiElement element = file.findElementAt(offset);
- if (element != null && !(element instanceof PsiWhiteSpace)) {
- return getNonStrictParentOfType(element, classes);
+ private static PsiElement findAfterCaret(ASTNode atCaret, Class<? extends PsiElement>... classes) {
+ while (atCaret != null) {
+ if (atCaret.getElementType() != TokenType.WHITE_SPACE) {
+ return getNonStrictParentOfType(atCaret.getPsi(), classes);
}
- offset++;
+ atCaret = TreeUtil.nextLeaf(atCaret);
}
return null;
}
diff --git a/python/src/com/jetbrains/python/editor/selectWord/PyListSelectionHandler.java b/python/src/com/jetbrains/python/editor/selectWord/PyListSelectionHandler.java
index a45c8c2..b394203 100644
--- a/python/src/com/jetbrains/python/editor/selectWord/PyListSelectionHandler.java
+++ b/python/src/com/jetbrains/python/editor/selectWord/PyListSelectionHandler.java
@@ -19,6 +19,7 @@
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiErrorElement;
import com.intellij.psi.PsiWhiteSpace;
import com.jetbrains.python.psi.PyArgumentList;
import com.jetbrains.python.psi.PyListLiteralExpression;
@@ -42,6 +43,9 @@
public List<TextRange> select(PsiElement e, CharSequence editorText, int cursorOffset, Editor editor) {
TextRange stringRange = e.getTextRange();
PsiElement firstChild = e.getFirstChild().getNextSibling();
+ if (firstChild instanceof PsiErrorElement) {
+ return Collections.emptyList();
+ }
int startShift = 1;
if (firstChild instanceof PsiWhiteSpace)
startShift += firstChild.getTextLength();
@@ -50,7 +54,7 @@
if (lastChild instanceof PsiWhiteSpace)
endShift += lastChild.getTextLength();
- TextRange offsetRange = new TextRange(stringRange.getStartOffset() + startShift, stringRange.getEndOffset() - endShift );
+ final TextRange offsetRange = new TextRange(stringRange.getStartOffset() + startShift, stringRange.getEndOffset() - endShift);
if (offsetRange.contains(cursorOffset) && offsetRange.getLength() > 1) {
return Collections.singletonList(offsetRange);
}
diff --git a/python/src/com/jetbrains/python/findUsages/PyFindUsagesHandlerFactory.java b/python/src/com/jetbrains/python/findUsages/PyFindUsagesHandlerFactory.java
index efc1e68..78d9d65 100644
--- a/python/src/com/jetbrains/python/findUsages/PyFindUsagesHandlerFactory.java
+++ b/python/src/com/jetbrains/python/findUsages/PyFindUsagesHandlerFactory.java
@@ -71,13 +71,13 @@
" overrides method of class " +
((PyFunction)next).getContainingClass().getName() +
".\nDo you want to find usages of the base method?", "Find Usages", Messages.getQuestionIcon());
- if (rc == 0) {
+ if (rc == Messages.YES) {
List<PsiElement> allMethods = new ArrayList<PsiElement>();
allMethods.add(element);
allMethods.addAll(superMethods);
return new PyFunctionFindUsagesHandler(element, allMethods);
}
- if (rc == 1) {
+ if (rc == Messages.NO) {
return new PyFunctionFindUsagesHandler(element);
}
return FindUsagesHandler.NULL_HANDLER;
diff --git a/python/src/com/jetbrains/python/formatter/PyBlock.java b/python/src/com/jetbrains/python/formatter/PyBlock.java
index 6d343e2..0c535c1 100644
--- a/python/src/com/jetbrains/python/formatter/PyBlock.java
+++ b/python/src/com/jetbrains/python/formatter/PyBlock.java
@@ -141,39 +141,65 @@
Wrap wrap = null;
Indent childIndent = Indent.getNoneIndent();
Alignment childAlignment = null;
+
+ if (parentType == PyElementTypes.BINARY_EXPRESSION && !isInControlStatement()) {
+ //Setup alignments for binary expression
+ childAlignment = getAlignmentForChildren();
+
+ PyBlock p = myParent; //Check grandparents
+ while (p != null) {
+ ASTNode pNode = p.getNode();
+ if (ourListElementTypes.contains(pNode.getElementType())) {
+ if (needListAlignment(child) && !isEmptyList(_node.getPsi())) {
+
+ childAlignment = p.getChildAlignment();
+ break;
+ }
+ }
+ else if (pNode == PyElementTypes.BINARY_EXPRESSION) {
+ childAlignment = p.getChildAlignment();
+ }
+ if (!breaksAlignment(pNode.getElementType())) {
+ p = p.myParent;
+ }
+ else {
+ break;
+ }
+ }
+ }
+
if (childType == PyElementTypes.STATEMENT_LIST) {
if (hasLineBreaksBefore(child, 1) || needLineBreakInStatement()) {
childIndent = Indent.getNormalIndent();
}
}
- else if (childType == PyElementTypes.IMPORT_ELEMENT && hasLineBreaksBefore(child, 1)) {
+ else if (childType == PyElementTypes.IMPORT_ELEMENT) {
+ wrap = Wrap.createWrap(WrapType.NORMAL, true);
childIndent = Indent.getNormalIndent();
}
if (ourListElementTypes.contains(parentType)) {
// wrapping in non-parenthesized tuple expression is not allowed (PY-1792)
if ((parentType != PyElementTypes.TUPLE_EXPRESSION || grandparentType == PyElementTypes.PARENTHESIZED_EXPRESSION) &&
- !ourBrackets.contains(childType) && childType != PyTokenTypes.COMMA && !isSliceOperand(child) /*&& !isSubscriptionOperand(child)*/) {
+ !ourBrackets.contains(childType) &&
+ childType != PyTokenTypes.COMMA &&
+ !isSliceOperand(child) /*&& !isSubscriptionOperand(child)*/) {
wrap = Wrap.createWrap(WrapType.NORMAL, true);
}
if (needListAlignment(child) && !isEmptyList(_node.getPsi())) {
childAlignment = getAlignmentForChildren();
}
+ if (childType == PyTokenTypes.END_OF_LINE_COMMENT) {
+ childIndent = Indent.getNormalIndent();
+ }
}
else if (parentType == PyElementTypes.BINARY_EXPRESSION &&
- (PythonDialectsTokenSetProvider.INSTANCE.getExpressionTokens().contains(childType) || PyTokenTypes.OPERATIONS.contains(childType))) {
- if (isInControlStatement() ) {
+ (PythonDialectsTokenSetProvider.INSTANCE.getExpressionTokens().contains(childType) ||
+ PyTokenTypes.OPERATIONS.contains(childType))) {
+ if (isInControlStatement()) {
PyParenthesizedExpression parens = PsiTreeUtil.getParentOfType(_node.getPsi(), PyParenthesizedExpression.class, true,
PyStatementPart.class);
childIndent = parens != null ? Indent.getNormalIndent() : Indent.getContinuationIndent();
}
- else {
- if (grandparentType == PyElementTypes.BINARY_EXPRESSION && myParent != null) {
- childAlignment = myParent.getAlignmentForChildren();
- }
- else {
- childAlignment = getAlignmentForChildren();
- }
- }
}
if (parentType == PyElementTypes.LIST_LITERAL_EXPRESSION || parentType == PyElementTypes.LIST_COMP_EXPRESSION) {
@@ -184,18 +210,8 @@
childIndent = Indent.getNormalIndent();
}
}
- else if (parentType == PyElementTypes.ARGUMENT_LIST || parentType == PyElementTypes.PARAMETER_LIST) {
- if (childType == PyTokenTypes.RPAR) {
- childIndent = Indent.getNoneIndent();
- }
- else {
- childIndent = parentType == PyElementTypes.PARAMETER_LIST || isInControlStatement()
- ? Indent.getContinuationIndent()
- : Indent.getNormalIndent(/*true*/);
- }
- }
else if (parentType == PyElementTypes.DICT_LITERAL_EXPRESSION || parentType == PyElementTypes.SET_LITERAL_EXPRESSION ||
- parentType == PyElementTypes.SET_COMP_EXPRESSION || parentType == PyElementTypes.DICT_COMP_EXPRESSION) {
+ parentType == PyElementTypes.SET_COMP_EXPRESSION || parentType == PyElementTypes.DICT_COMP_EXPRESSION) {
if (childType == PyTokenTypes.RBRACE || !hasLineBreaksBefore(child, 1)) {
childIndent = Indent.getNoneIndent();
}
@@ -209,28 +225,60 @@
}
}
else if (parentType == PyElementTypes.FROM_IMPORT_STATEMENT) {
- if ((childType == PyElementTypes.IMPORT_ELEMENT || childType == PyTokenTypes.RPAR) &&
- _node.findChildByType(PyTokenTypes.LPAR) != null) {
- if (myContext.getPySettings().ALIGN_MULTILINE_IMPORTS) {
- childAlignment = getAlignmentForChildren();
+ if (_node.findChildByType(PyTokenTypes.LPAR) != null) {
+ if (childType == PyElementTypes.IMPORT_ELEMENT) {
+ if (myContext.getPySettings().ALIGN_MULTILINE_IMPORTS) {
+ childAlignment = getAlignmentForChildren();
+ }
+ else {
+ childIndent = Indent.getNormalIndent();
+ }
}
- else {
- childIndent = Indent.getNormalIndent();
+ if (childType == PyTokenTypes.RPAR) {
+ childIndent = Indent.getNoneIndent();
}
}
}
else if (parentType == PyElementTypes.KEY_VALUE_EXPRESSION) {
- PyKeyValueExpression keyValue = (PyKeyValueExpression) _node.getPsi();
+ PyKeyValueExpression keyValue = (PyKeyValueExpression)_node.getPsi();
if (keyValue != null && child.getPsi() == keyValue.getValue()) {
childIndent = Indent.getNormalIndent();
}
}
- else if (parentType == PyElementTypes.PARENTHESIZED_EXPRESSION || parentType == PyElementTypes.GENERATOR_EXPRESSION) {
+ //Align elements vertically if there is an argument in the first line of parenthesized expression
+ else if (((parentType == PyElementTypes.PARENTHESIZED_EXPRESSION && myContext.getSettings().ALIGN_MULTILINE_PARENTHESIZED_EXPRESSION)
+ || (parentType == PyElementTypes.ARGUMENT_LIST && myContext.getSettings().ALIGN_MULTILINE_PARAMETERS_IN_CALLS)
+ || (parentType == PyElementTypes.PARAMETER_LIST && myContext.getSettings().ALIGN_MULTILINE_PARAMETERS)) &&
+ !isIndentNext(child) &&
+ !hasLineBreaksBefore(_node.getFirstChildNode(), 1)
+ && !ourListElementTypes.contains(childType)) {
+
+ if (!ourBrackets.contains(childType)) {
+ childAlignment = getAlignmentForChildren();
+ if (parentType != PyElementTypes.CALL_EXPRESSION) {
+ childIndent = Indent.getNormalIndent();
+ }
+ }
+ else if (childType == PyTokenTypes.RPAR) {
+ childIndent = Indent.getNoneIndent();
+ }
+ }
+ else if (parentType == PyElementTypes.GENERATOR_EXPRESSION || parentType == PyElementTypes.PARENTHESIZED_EXPRESSION) {
if (childType == PyTokenTypes.RPAR || !hasLineBreaksBefore(child, 1)) {
childIndent = Indent.getNoneIndent();
}
else {
- childIndent = Indent.getNormalIndent();
+ childIndent = isIndentNext(child) ? Indent.getContinuationIndent() : Indent.getNormalIndent();
+ }
+ }
+ else if (parentType == PyElementTypes.ARGUMENT_LIST || parentType == PyElementTypes.PARAMETER_LIST) {
+ if (childType == PyTokenTypes.RPAR) {
+ childIndent = Indent.getNoneIndent();
+ }
+ else {
+ childIndent = parentType == PyElementTypes.PARAMETER_LIST || isInControlStatement()
+ ? Indent.getContinuationIndent()
+ : Indent.getNormalIndent(/*true*/);
}
}
else if (parentType == PyElementTypes.SUBSCRIPTION_EXPRESSION) {
@@ -239,8 +287,31 @@
childIndent = Indent.getNormalIndent();
}
}
+ else if (parentType == PyElementTypes.REFERENCE_EXPRESSION) {
+ if (child != _node.getFirstChildNode()) {
+ childIndent = Indent.getNormalIndent();
+ if (hasLineBreaksBefore(child, 1)) {
+ if (isInControlStatement()) {
+ childIndent = Indent.getContinuationIndent();
+ }
+ else {
+ PyBlock b = myParent;
+ while (b != null) {
+ if (b.getNode().getPsi() instanceof PyParenthesizedExpression ||
+ b.getNode().getPsi() instanceof PyArgumentList ||
+ b.getNode().getPsi() instanceof PyParameterList) {
+ childAlignment = getAlignmentOfChild(b, 1);
+ break;
+ }
+ b = b.myParent;
+ }
+ }
+ }
+ }
+ }
- if (isAfterStatementList(child) && !hasLineBreaksBefore(child, 2)) { // maybe enter was pressed and cut us from a previous (nested) statement list
+ if (isAfterStatementList(child) && !hasLineBreaksBefore(child, 2) && child.getElementType() != PyTokenTypes.END_OF_LINE_COMMENT) {
+ // maybe enter was pressed and cut us from a previous (nested) statement list
childIndent = Indent.getNormalIndent();
}
@@ -248,7 +319,7 @@
while (prev != null && prev.getElementType() == TokenType.WHITE_SPACE) {
if (prev.getText().contains("\\") && !childIndent.equals(Indent.getContinuationIndent()) &&
!childIndent.equals(Indent.getContinuationIndent(true))) {
- childIndent = Indent.getNormalIndent();
+ childIndent = isIndentNext(child) ? Indent.getContinuationIndent() : Indent.getNormalIndent();
break;
}
prev = prev.getTreePrev();
@@ -257,9 +328,35 @@
return new PyBlock(this, child, childAlignment, childIndent, wrap, myContext);
}
+ private static boolean breaksAlignment(IElementType type) {
+ return type != PyElementTypes.BINARY_EXPRESSION;
+ }
+
+ private static Alignment getAlignmentOfChild(PyBlock b, int childNum) {
+ if (b.getSubBlocks().size() > childNum) {
+ ChildAttributes attributes = b.getChildAttributes(childNum);
+ return attributes.getAlignment();
+ }
+ return null;
+ }
+
+ private static boolean isIndentNext(ASTNode child) {
+ PsiElement psi = PsiTreeUtil.getParentOfType(child.getPsi(), PyStatement.class);
+
+ return psi instanceof PyIfStatement ||
+ psi instanceof PyForStatement ||
+ psi instanceof PyWithStatement ||
+ psi instanceof PyClass ||
+ psi instanceof PyFunction ||
+ psi instanceof PyTryExceptStatement ||
+ psi instanceof PyElsePart ||
+ psi instanceof PyIfPart ||
+ psi instanceof PyWhileStatement;
+ }
+
private static boolean isSubscriptionOperand(ASTNode child) {
return child.getTreeParent().getElementType() == PyElementTypes.SUBSCRIPTION_EXPRESSION &&
- child.getPsi() == ((PySubscriptionExpression) child.getTreeParent().getPsi()).getOperand();
+ child.getPsi() == ((PySubscriptionExpression)child.getTreeParent().getPsi()).getOperand();
}
private boolean isInControlStatement() {
@@ -278,10 +375,10 @@
private static boolean isEmptyList(PsiElement psi) {
if (psi instanceof PyDictLiteralExpression) {
- return ((PyDictLiteralExpression) psi).getElements().length == 0;
+ return ((PyDictLiteralExpression)psi).getElements().length == 0;
}
if (psi instanceof PySequenceExpression) {
- return ((PySequenceExpression) psi).getElements().length == 0;
+ return ((PySequenceExpression)psi).getElements().length == 0;
}
return false;
}
@@ -315,7 +412,9 @@
}
if (PyTokenTypes.CLOSE_BRACES.contains(childType)) {
ASTNode prevNonSpace = findPrevNonSpaceNode(child);
- if (prevNonSpace != null && prevNonSpace.getElementType() == PyTokenTypes.COMMA && myContext.getMode() == FormattingMode.ADJUST_INDENT) {
+ if (prevNonSpace != null &&
+ prevNonSpace.getElementType() == PyTokenTypes.COMMA &&
+ myContext.getMode() == FormattingMode.ADJUST_INDENT) {
return true;
}
return false;
@@ -351,7 +450,8 @@
private static ASTNode findPrevNonSpaceNode(ASTNode node) {
do {
node = node.getTreePrev();
- } while(node != null && (node.getElementType() == TokenType.WHITE_SPACE || PyTokenTypes.WHITESPACE.contains(node.getElementType())));
+ }
+ while (node != null && (node.getElementType() == TokenType.WHITE_SPACE || PyTokenTypes.WHITESPACE.contains(node.getElementType())));
return node;
}
@@ -365,7 +465,7 @@
if (node != null && node.getElementType() == TokenType.WHITE_SPACE) {
String prevNodeText = node.getText();
int count = 0;
- for(int i=0; i<prevNodeText.length(); i++) {
+ for (int i = 0; i < prevNodeText.length(); i++) {
if (prevNodeText.charAt(i) == '\n') {
count++;
if (count == minCount) {
@@ -422,10 +522,36 @@
return Spacing.createSpacing(0, 0, 1, true, myContext.getSettings().KEEP_BLANK_LINES_IN_CODE);
}
}
+
+ if ((node1.getElementType() == PyElementTypes.FUNCTION_DECLARATION || node1.getElementType() == PyElementTypes.CLASS_DECLARATION)
+ && _node.getElementType() instanceof PyFileElementType) {
+
+ if (psi2 instanceof PsiComment) {
+ final PsiElement psi3 = PsiTreeUtil.getNextSiblingOfType(psi2, PyElement.class);
+
+ if (psi3 != null) {
+ IElementType type3 = psi3.getNode().getElementType();
+
+ if (type3 == PyElementTypes.CLASS_DECLARATION || type3 == PyElementTypes.FUNCTION_DECLARATION) {
+ return getBlankLinesForOption(myContext.getPySettings().BLANK_LINES_AROUND_TOP_LEVEL_CLASSES_FUNCTIONS);
+ }
+ }
+ }
+ }
+
+ if (psi2 instanceof PsiComment && !hasLineBreaksBefore(psi2.getNode(), 1) && myContext.getPySettings().SPACE_BEFORE_NUMBER_SIGN) {
+ return Spacing.createSpacing(2, 0, 0, false, 0);
+ }
}
return myContext.getSpacingBuilder().getSpacing(this, child1, child2);
}
+ private Spacing getBlankLinesForOption(final int option) {
+ int blankLines = option + 1;
+ return Spacing
+ .createSpacing(0, 0, blankLines, myContext.getSettings().KEEP_LINE_BREAKS, myContext.getSettings().KEEP_BLANK_LINES_IN_DECLARATIONS);
+ }
+
private boolean needLineBreakInStatement() {
PyStatement statement = PsiTreeUtil.getParentOfType(_node.getPsi(), PyStatement.class);
if (statement != null) {
@@ -607,7 +733,7 @@
}
if (afterNode != null && afterNode.getElementType() == PyElementTypes.KEY_VALUE_EXPRESSION) {
- PyKeyValueExpression keyValue = (PyKeyValueExpression) afterNode.getPsi();
+ PyKeyValueExpression keyValue = (PyKeyValueExpression)afterNode.getPsi();
if (keyValue != null && keyValue.getValue() == null) { // incomplete
return Indent.getContinuationIndent();
}
diff --git a/python/src/com/jetbrains/python/formatter/PyCodeStyleSettings.java b/python/src/com/jetbrains/python/formatter/PyCodeStyleSettings.java
index 961ca72..88ddd41 100644
--- a/python/src/com/jetbrains/python/formatter/PyCodeStyleSettings.java
+++ b/python/src/com/jetbrains/python/formatter/PyCodeStyleSettings.java
@@ -38,6 +38,9 @@
public boolean NEW_LINE_AFTER_COLON = false;
public boolean NEW_LINE_AFTER_COLON_MULTI_CLAUSE = true;
+ public boolean SPACE_AFTER_NUMBER_SIGN = true;
+ public boolean SPACE_BEFORE_NUMBER_SIGN = true;
+
public PyCodeStyleSettings(CodeStyleSettings container) {
super("Python", container);
}
diff --git a/python/src/com/jetbrains/python/formatter/PyLanguageCodeStyleSettingsProvider.java b/python/src/com/jetbrains/python/formatter/PyLanguageCodeStyleSettingsProvider.java
index c26a1a1..9e7f97d 100644
--- a/python/src/com/jetbrains/python/formatter/PyLanguageCodeStyleSettingsProvider.java
+++ b/python/src/com/jetbrains/python/formatter/PyLanguageCodeStyleSettingsProvider.java
@@ -72,9 +72,12 @@
consumer.showCustomOption(PyCodeStyleSettings.class, "SPACE_AROUND_EQ_IN_KEYWORD_ARGUMENT", "Around = in keyword argument",
SPACES_AROUND_OPERATORS);
consumer.showCustomOption(PyCodeStyleSettings.class, "SPACE_WITHIN_BRACES", "Braces", SPACES_WITHIN);
- consumer.showCustomOption(PyCodeStyleSettings.class, "SPACE_BEFORE_PY_COLON", ApplicationBundle.message("checkbox.spaces.before.colon"), SPACES_OTHER);
+ consumer.showCustomOption(PyCodeStyleSettings.class, "SPACE_BEFORE_PY_COLON",
+ ApplicationBundle.message("checkbox.spaces.before.colon"), SPACES_OTHER);
consumer.showCustomOption(PyCodeStyleSettings.class, "SPACE_AFTER_PY_COLON", ApplicationBundle.message("checkbox.spaces.after.colon"), SPACES_OTHER);
consumer.showCustomOption(PyCodeStyleSettings.class, "SPACE_BEFORE_BACKSLASH", "Before '\\'", SPACES_OTHER);
+ consumer.showCustomOption(PyCodeStyleSettings.class, "SPACE_BEFORE_NUMBER_SIGN", "Before '#'", SPACES_OTHER);
+ consumer.showCustomOption(PyCodeStyleSettings.class, "SPACE_AFTER_NUMBER_SIGN", "After '#'", SPACES_OTHER);
}
else if (settingsType == SettingsType.BLANK_LINES_SETTINGS) {
consumer.showStandardOptions("BLANK_LINES_AROUND_CLASS",
@@ -112,7 +115,7 @@
CommonCodeStyleSettings.IndentOptions indentOptions = defaultSettings.initIndentOptions();
indentOptions.INDENT_SIZE = 4;
defaultSettings.ALIGN_MULTILINE_PARAMETERS_IN_CALLS = true;
- return defaultSettings;
+ return defaultSettings;
}
@Override
diff --git a/python/src/com/jetbrains/python/formatter/PyLineWrapPositionStrategy.java b/python/src/com/jetbrains/python/formatter/PyLineWrapPositionStrategy.java
index d7fa5f0..47b6b7c 100644
--- a/python/src/com/jetbrains/python/formatter/PyLineWrapPositionStrategy.java
+++ b/python/src/com/jetbrains/python/formatter/PyLineWrapPositionStrategy.java
@@ -24,6 +24,7 @@
import com.intellij.psi.PsiFile;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.text.CharArrayUtil;
+import com.jetbrains.python.PyTokenTypes;
import com.jetbrains.python.psi.StringLiteralExpression;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -44,9 +45,6 @@
addRule(new Rule('(', WrapCondition.AFTER));
addRule(new Rule('[', WrapCondition.AFTER));
addRule(new Rule('{', WrapCondition.AFTER));
-
- // Symbols to wrap before
- addRule(new Rule('.', WrapCondition.BEFORE));
}
@Override
@@ -75,11 +73,20 @@
int maxPreferredOffset,
boolean allowToBeyondMaxPreferredOffset,
boolean virtual) {
+
int wrapPosition =
super.calculateWrapPosition(document, project, startOffset, endOffset, maxPreferredOffset, allowToBeyondMaxPreferredOffset, virtual);
if (wrapPosition < 0) return wrapPosition;
final CharSequence text = document.getCharsSequence();
+ if (wrapPosition > 0) {
+ char charBefore = text.charAt(wrapPosition - 1);
+ if (charBefore == '\'' || charBefore == '"') {
+ //don't wrap the first char of string literal
+ return wrapPosition + 1;
+ }
+ }
+
char c = text.charAt(wrapPosition);
if (!StringUtil.isWhiteSpace(c) || project == null) {
return wrapPosition;
diff --git a/python/src/com/jetbrains/python/formatter/PyPreFormatProcessor.java b/python/src/com/jetbrains/python/formatter/PyPreFormatProcessor.java
new file mode 100644
index 0000000..ee56016
--- /dev/null
+++ b/python/src/com/jetbrains/python/formatter/PyPreFormatProcessor.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.formatter;
+
+import com.intellij.lang.ASTNode;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.TextRange;
+import com.intellij.openapi.util.text.StringUtil;
+import com.intellij.psi.PsiComment;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiFile;
+import com.intellij.psi.codeStyle.CodeStyleSettings;
+import com.intellij.psi.codeStyle.CodeStyleSettingsManager;
+import com.intellij.psi.impl.source.codeStyle.PreFormatProcessor;
+import com.jetbrains.python.PythonLanguage;
+import com.jetbrains.python.psi.LanguageLevel;
+import com.jetbrains.python.psi.PyElementGenerator;
+import com.jetbrains.python.psi.PyRecursiveElementVisitor;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * @author traff
+ */
+public class PyPreFormatProcessor implements PreFormatProcessor {
+ @NotNull
+ @Override
+ public TextRange process(@NotNull ASTNode element, @NotNull TextRange range) {
+ PsiElement psiElement = element.getPsi();
+ if (psiElement == null) return range;
+
+ if (!psiElement.getLanguage().is(PythonLanguage.getInstance())) return range;
+
+ PsiFile file = psiElement.isValid() ? psiElement.getContainingFile() : null;
+ if (file == null) return range;
+
+ Project project = psiElement.getProject();
+
+ return new PyCommentFormatter(project).process(psiElement, range);
+ }
+
+ /**
+ * @author traff
+ */
+ public static class PyCommentFormatter extends PyRecursiveElementVisitor {
+ private final Project myProject;
+ private final CodeStyleSettings mySettings;
+ private final PyCodeStyleSettings myPyCodeStyleSettings;
+ private TextRange myRange;
+ private int myDelta = 0;
+
+ public PyCommentFormatter(Project project) {
+ myProject = project;
+ mySettings = CodeStyleSettingsManager.getSettings(project);
+ myPyCodeStyleSettings = mySettings.getCustomSettings(PyCodeStyleSettings.class);
+ }
+
+ public TextRange process(PsiElement element, TextRange range) {
+ if (!myPyCodeStyleSettings.SPACE_AFTER_NUMBER_SIGN) {
+ return range;
+ }
+ myRange = range;
+ element.accept(this);
+ return TextRange.create(range.getStartOffset(), range.getEndOffset() + myDelta);
+ }
+
+ @Override
+ public void visitComment(PsiComment element) {
+ if (!myRange.contains(element.getTextRange())) {
+ return;
+ }
+ String text = element.getText();
+ int commentStart = text.indexOf('#');
+ if (commentStart != -1 && (commentStart + 1) < text.length()) {
+ String commentText = StringUtil.trimLeading(text.substring(commentStart + 1));
+
+ String newText = "# " + commentText;
+ if (!newText.equals(text)) {
+ myDelta += newText.length() - text.length();
+ element.replace(
+ PyElementGenerator.getInstance(myProject).createFromText(LanguageLevel.getDefault(), PsiComment.class, newText));
+ }
+ }
+ }
+ }
+}
diff --git a/python/src/com/jetbrains/python/formatter/PyWhiteSpaceFormattingStrategy.java b/python/src/com/jetbrains/python/formatter/PyWhiteSpaceFormattingStrategy.java
index c78e490..6a09e9c 100644
--- a/python/src/com/jetbrains/python/formatter/PyWhiteSpaceFormattingStrategy.java
+++ b/python/src/com/jetbrains/python/formatter/PyWhiteSpaceFormattingStrategy.java
@@ -15,6 +15,7 @@
*/
package com.jetbrains.python.formatter;
+import com.intellij.lang.ASTNode;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiElement;
import com.intellij.psi.codeStyle.CodeStyleSettings;
@@ -44,12 +45,16 @@
CharSequence whiteSpace = super.adjustWhiteSpaceIfNecessary(whiteSpaceText, startElement, startOffset, endOffset, codeStyleSettings);
if (whiteSpace.length() > 0 && whiteSpace.charAt(0) == '\n' && !StringUtil.contains(whiteSpace, 0, whiteSpace.length(), '\\') &&
PythonEnterHandler.needInsertBackslash(startElement.getContainingFile(), startOffset, false)) {
- PyCodeStyleSettings settings = codeStyleSettings.getCustomSettings(PyCodeStyleSettings.class);
- return (settings.SPACE_BEFORE_BACKSLASH ? " \\" : "\\") + whiteSpace.toString();
+ return addBackslashPrefix(whiteSpace, codeStyleSettings);
}
return whiteSpace;
}
+ private static String addBackslashPrefix(CharSequence whiteSpace, CodeStyleSettings settings) {
+ PyCodeStyleSettings pySettings = settings.getCustomSettings(PyCodeStyleSettings.class);
+ return (pySettings.SPACE_BEFORE_BACKSLASH ? " \\" : "\\") + whiteSpace.toString();
+ }
+
/**
* Python uses backslashes at the end of the line as indication that next line is an extension of the current one.
* <p/>
@@ -61,6 +66,7 @@
* @param startOffset start offset to use with the given text (inclusive)
* @param endOffset end offset to use with the given text (exclusive)
* @param codeStyleSettings the code style settings
+ * @param nodeAfter
* @return symbols to use for replacing <code>[startOffset; endOffset)</code> sub-sequence of the given text
*/
@NotNull
@@ -69,11 +75,15 @@
@NotNull CharSequence text,
int startOffset,
int endOffset,
- CodeStyleSettings codeStyleSettings)
+ CodeStyleSettings codeStyleSettings, ASTNode nodeAfter)
{
// The general idea is that '\' symbol before line feed should be preserved.
TIntIntHashMap initialBackSlashes = countBackSlashes(text, startOffset, endOffset);
if (initialBackSlashes.isEmpty()) {
+ if (nodeAfter != null && whiteSpaceText.length() > 0 && whiteSpaceText.charAt(0) == '\n' &&
+ PythonEnterHandler.needInsertBackslash(nodeAfter, false)) {
+ return addBackslashPrefix(whiteSpaceText, codeStyleSettings);
+ }
return whiteSpaceText;
}
@@ -124,6 +134,9 @@
static TIntIntHashMap countBackSlashes(CharSequence text, int start, int end) {
TIntIntHashMap result = new TIntIntHashMap();
int line = 0;
+ if (end > text.length()) {
+ end = text.length();
+ }
for (int i = start; i < end; i++) {
char c = text.charAt(i);
switch (c) {
diff --git a/python/src/com/jetbrains/python/inspections/PyArgumentEqualDefaultInspection.java b/python/src/com/jetbrains/python/inspections/PyArgumentEqualDefaultInspection.java
index 82013d3..6a06f87 100644
--- a/python/src/com/jetbrains/python/inspections/PyArgumentEqualDefaultInspection.java
+++ b/python/src/com/jetbrains/python/inspections/PyArgumentEqualDefaultInspection.java
@@ -131,6 +131,10 @@
if (key.getText().equals(defaultValue.getText()))
return true;
}
+ if (key instanceof PyBinaryExpression && defaultValue instanceof PyBinaryExpression) {
+ if (key.getText().equals(defaultValue.getText()))
+ return true;
+ }
else if (key instanceof PyStringLiteralExpression && defaultValue instanceof PyStringLiteralExpression) {
if (((PyStringLiteralExpression)key).getStringValue().equals(((PyStringLiteralExpression)defaultValue).getStringValue()))
return true;
diff --git a/python/src/com/jetbrains/python/inspections/PyArgumentListInspection.java b/python/src/com/jetbrains/python/inspections/PyArgumentListInspection.java
index 97a5a36..9a87959 100644
--- a/python/src/com/jetbrains/python/inspections/PyArgumentListInspection.java
+++ b/python/src/com/jetbrains/python/inspections/PyArgumentListInspection.java
@@ -68,32 +68,29 @@
@Override
public void visitPyDecoratorList(final PyDecoratorList node) {
- PyDecorator[] decos = node.getDecorators();
- for (PyDecorator deco : decos) {
- if (! deco.hasArgumentList()) {
- // empty arglist; deco function must have a non-kwarg first arg
- PyCallExpression.PyMarkedCallee mkfunc = deco.resolveCallee(resolveWithoutImplicits());
- if (mkfunc != null && !mkfunc.isImplicitlyResolved()) {
- Callable callable = mkfunc.getCallable();
- int first_param_offset = mkfunc.getImplicitOffset();
- final List<PyParameter> params = PyUtil.getParameters(callable, myTypeEvalContext);
- final PyNamedParameter alleged_first_param = params.size() < first_param_offset ?
- null : params.get(first_param_offset-1).getAsNamed();
- if (alleged_first_param == null || alleged_first_param.isKeywordContainer()) {
- // no parameters left to pass function implicitly, or wrong param type
- registerProblem(deco, PyBundle.message("INSP.func.$0.lacks.first.arg", callable.getName())); // TODO: better names for anon lambdas
- }
- else {
- // possible unfilled params
- for (int i=first_param_offset; i < params.size(); i += 1) {
- PyNamedParameter par = params.get(i).getAsNamed();
- // param tuples, non-starred or non-default won't do
- if (par == null || (! par.isKeywordContainer() && ! par.isPositionalContainer() && !par.hasDefaultValue())) {
- String par_name;
- if (par != null) par_name = par.getName();
- else par_name = "(...)"; // can't be bothered to find the first non-tuple inside it
- registerProblem(deco, PyBundle.message("INSP.parameter.$0.unfilled", par_name));
- }
+ PyDecorator[] decorators = node.getDecorators();
+ for (PyDecorator deco : decorators) {
+ if (deco.hasArgumentList()) continue;
+ final PyCallExpression.PyMarkedCallee markedCallee = deco.resolveCallee(resolveWithoutImplicits());
+ if (markedCallee != null && !markedCallee.isImplicitlyResolved()) {
+ final Callable callable = markedCallee.getCallable();
+ int firstParamOffset = markedCallee.getImplicitOffset();
+ final List<PyParameter> params = PyUtil.getParameters(callable, myTypeEvalContext);
+ final PyNamedParameter allegedFirstParam = params.size() < firstParamOffset ?
+ null : params.get(firstParamOffset-1).getAsNamed();
+ if (allegedFirstParam == null || allegedFirstParam.isKeywordContainer()) {
+ // no parameters left to pass function implicitly, or wrong param type
+ registerProblem(deco, PyBundle.message("INSP.func.$0.lacks.first.arg", callable.getName())); // TODO: better names for anon lambdas
+ }
+ else { // possible unfilled params
+ for (int i = firstParamOffset; i < params.size(); i += 1) {
+ final PyParameter parameter = params.get(i);
+ if (parameter instanceof PySingleStarParameter) continue;
+ final PyNamedParameter par = parameter.getAsNamed();
+ // param tuples, non-starred or non-default won't do
+ if (par == null || (!par.isKeywordContainer() && !par.isPositionalContainer() &&!par.hasDefaultValue())) {
+ String parameterName = par != null ? par.getName() : "(...)";
+ registerProblem(deco, PyBundle.message("INSP.parameter.$0.unfilled", parameterName));
}
}
}
@@ -176,12 +173,12 @@
PyType inside_type = context.getType(content);
if (inside_type != null && !PyTypeChecker.isUnknown(inside_type)) {
if (((PyStarArgument)arg).isKeyword()) {
- if (!PyABCUtil.isSubtype(inside_type, PyNames.MAPPING)) {
+ if (!PyABCUtil.isSubtype(inside_type, PyNames.MAPPING, context)) {
holder.registerProblem(arg, PyBundle.message("INSP.expected.dict.got.$0", inside_type.getName()));
}
}
else { // * arg
- if (!PyABCUtil.isSubtype(inside_type, PyNames.ITERABLE)) {
+ if (!PyABCUtil.isSubtype(inside_type, PyNames.ITERABLE, context)) {
holder.registerProblem(arg, PyBundle.message("INSP.expected.iter.got.$0", inside_type.getName()));
}
}
diff --git a/python/src/com/jetbrains/python/inspections/PyAssignmentToLoopOrWithParameterInspection.java b/python/src/com/jetbrains/python/inspections/PyAssignmentToLoopOrWithParameterInspection.java
new file mode 100644
index 0000000..2efaf98
--- /dev/null
+++ b/python/src/com/jetbrains/python/inspections/PyAssignmentToLoopOrWithParameterInspection.java
@@ -0,0 +1,149 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.inspections;
+
+import com.intellij.codeInspection.LocalInspectionToolSession;
+import com.intellij.codeInspection.ProblemsHolder;
+import com.intellij.openapi.util.Condition;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiElementVisitor;
+import com.intellij.psi.PsiReference;
+import com.intellij.psi.util.PsiTreeUtil;
+import com.jetbrains.python.PyBundle;
+import com.jetbrains.python.codeInsight.controlflow.ScopeOwner;
+import com.jetbrains.python.psi.*;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+//TODO: Try to share logic with AssignmentToForLoopParameterInspection
+
+/**
+ * Checks for cases when you rewrite loop variable with inner loop.
+ * It finds all <code>with</code> and <code>for</code> statements, takes variables declared by them and ensures none of parent
+ * <code>with</code> or <code>for</code> declares variable with the same name
+ *
+ * @author link
+ */
+public class PyAssignmentToLoopOrWithParameterInspection extends PyInspection {
+
+ private static final String NAME = PyBundle.message("INSP.NAME.assignment.to.loop.or.with.parameter.display.name");
+
+ @NotNull
+ @Override
+ public String getDisplayName() {
+ return NAME;
+ }
+
+
+ @NotNull
+ @Override
+ public PsiElementVisitor buildVisitor(@NotNull final ProblemsHolder holder,
+ boolean isOnTheFly,
+ @NotNull final LocalInspectionToolSession session) {
+ return new Visitor(holder, session);
+ }
+
+ private static class Visitor extends PyInspectionVisitor {
+ private Visitor(@Nullable ProblemsHolder holder, @NotNull LocalInspectionToolSession session) {
+ super(holder, session);
+ }
+
+ @Override
+ public void visitPyWithStatement(PyWithStatement node) {
+ checkNotReDeclaringUpperLoopOrStatement(node);
+ }
+
+ @Override
+ public void visitPyForStatement(PyForStatement node) {
+ checkNotReDeclaringUpperLoopOrStatement(node);
+ }
+
+ /**
+ * Finds first parent of specific type (See {@link #isRequiredStatement(com.intellij.psi.PsiElement)})
+ * that declares one of names, declared in this statement
+ */
+ private void checkNotReDeclaringUpperLoopOrStatement(NameDefiner statement) {
+ for (PsiElement declaredVar : statement.iterateNames()) {
+ Filter filter = new Filter(handleSubscriptionsAndResolveSafely(declaredVar));
+ PsiElement firstParent = PsiTreeUtil.findFirstParent(statement, true, filter);
+ if (firstParent != null && isRequiredStatement(firstParent)) {
+ registerProblem(declaredVar,
+ PyBundle.message("INSP.NAME.assignment.to.loop.or.with.parameter.display.message", declaredVar.getText()));
+ }
+ }
+ }
+ }
+
+ /**
+ * Filters list of parents trying to find parent that declares var that refers to {@link #node}
+ * Returns {@link com.jetbrains.python.codeInsight.controlflow.ScopeOwner} if nothing found.
+ * Returns parent otherwise.
+ */
+ private static class Filter implements Condition<PsiElement> {
+ private final PsiElement node;
+
+ private Filter(PsiElement node) {
+ this.node = node;
+ }
+
+ @Override
+ public boolean value(PsiElement psiElement) {
+ if (psiElement instanceof ScopeOwner) {
+ return true; //Do not go any further
+ }
+ if (!(isRequiredStatement(psiElement))) {
+ return false; //Parent has wrong type, skip
+ }
+ Iterable<PyElement> varsDeclaredInStatement = ((NameDefiner)psiElement).iterateNames();
+ for (PsiElement varDeclaredInStatement : varsDeclaredInStatement) {
+ //For each variable, declared by this parent take first declaration and open subscription list if any
+ PsiReference reference = handleSubscriptionsAndResolveSafely(varDeclaredInStatement).getReference();
+ if (reference != null && reference.isReferenceTo(node)) {
+ return true; //One of variables declared by this parent refers to node
+ }
+ }
+ return false;
+ }
+
+ }
+
+ /**
+ * Opens subscription list (<code>i[n][q][f] --> i</code>) and resolves ref recursively to the topmost element,
+ * but not further than file borders (to prevent Stub to AST conversion)
+ *
+ * @param element element to open and resolve
+ * @return opened and resolved element
+ */
+ private static PsiElement handleSubscriptionsAndResolveSafely(PsiElement element) {
+ assert element != null;
+ if (element instanceof PySubscriptionExpression) {
+ element = ((PySubscriptionExpression)element).getRootOperand();
+ }
+ element = PyUtil.resolveToTheTop(element);
+ return element;
+ }
+
+ /**
+ * Checks if element is statement this inspection should work with
+ *
+ * @param element to check
+ * @return true if inspection should work with this element
+ */
+ private static boolean isRequiredStatement(PsiElement element) {
+ assert element != null;
+ return element instanceof PyWithStatement || element instanceof PyForStatement;
+ }
+}
diff --git a/python/src/com/jetbrains/python/inspections/PyAttributeOutsideInitInspection.java b/python/src/com/jetbrains/python/inspections/PyAttributeOutsideInitInspection.java
index db3b137..791a1b5 100644
--- a/python/src/com/jetbrains/python/inspections/PyAttributeOutsideInitInspection.java
+++ b/python/src/com/jetbrains/python/inspections/PyAttributeOutsideInitInspection.java
@@ -70,6 +70,9 @@
if (!isApplicable(containingClass)) {
return;
}
+
+ final PyFunction.Modifier modifier = node.getModifier();
+ if (modifier != null) return;
final List<PyTargetExpression> classAttributes = containingClass.getClassAttributes();
Map<String, PyTargetExpression> attributesInInit = new HashMap<String, PyTargetExpression>();
@@ -97,7 +100,7 @@
for (Map.Entry<String, PyTargetExpression> attribute : attributes.entrySet()) {
String attributeName = attribute.getKey();
if (attributeName == null) continue;
- final Property property = containingClass.findProperty(attributeName);
+ final Property property = containingClass.findProperty(attributeName, true);
if (!attributesInInit.containsKey(attributeName) && property == null) {
registerProblem(attribute.getValue(), PyBundle.message("INSP.attribute.$0.outside.init", attributeName),
new PyMoveAttributeToInitQuickFix());
diff --git a/python/src/com/jetbrains/python/inspections/PyCallingNonCallableInspection.java b/python/src/com/jetbrains/python/inspections/PyCallingNonCallableInspection.java
index 47f55a4..4af6767 100644
--- a/python/src/com/jetbrains/python/inspections/PyCallingNonCallableInspection.java
+++ b/python/src/com/jetbrains/python/inspections/PyCallingNonCallableInspection.java
@@ -20,7 +20,10 @@
import com.intellij.psi.PsiElementVisitor;
import com.jetbrains.python.PyNames;
import com.jetbrains.python.psi.*;
-import com.jetbrains.python.psi.types.*;
+import com.jetbrains.python.psi.types.PyClassType;
+import com.jetbrains.python.psi.types.PyType;
+import com.jetbrains.python.psi.types.PyTypeChecker;
+import com.jetbrains.python.psi.types.TypeEvalContext;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -89,7 +92,7 @@
@Nullable
private static Boolean isCallable(@NotNull PyExpression element, @NotNull TypeEvalContext context) {
- if (element instanceof PyQualifiedExpression && PyNames.CLASS.equals(element.getName())) {
+ if (element instanceof PyQualifiedExpression && PyNames.__CLASS__.equals(element.getName())) {
return true;
}
return PyTypeChecker.isCallable(context.getType(element));
diff --git a/python/src/com/jetbrains/python/inspections/PyMethodFirstArgAssignmentInspection.java b/python/src/com/jetbrains/python/inspections/PyMethodFirstArgAssignmentInspection.java
index bb5dfab..0d29a05 100644
--- a/python/src/com/jetbrains/python/inspections/PyMethodFirstArgAssignmentInspection.java
+++ b/python/src/com/jetbrains/python/inspections/PyMethodFirstArgAssignmentInspection.java
@@ -57,7 +57,7 @@
}
private void handleTarget(PyQualifiedExpression target, String name) {
- if (target.getQualifier() == null && name.equals(target.getText())) {
+ if (!target.isQualified() && name.equals(target.getText())) {
complain(target, name);
}
}
diff --git a/python/src/com/jetbrains/python/inspections/PyMethodMayBeStaticInspection.java b/python/src/com/jetbrains/python/inspections/PyMethodMayBeStaticInspection.java
index 2bc6424..71f2772 100644
--- a/python/src/com/jetbrains/python/inspections/PyMethodMayBeStaticInspection.java
+++ b/python/src/com/jetbrains/python/inspections/PyMethodMayBeStaticInspection.java
@@ -70,7 +70,9 @@
if (!supers.isEmpty()) return;
final Collection<PyFunction> overrides = PyOverridingMethodsSearch.search(node, true).findAll();
if (!overrides.isEmpty()) return;
- if (PyUtil.isDecoratedAsAbstract(node) || node.getModifier() != null) return;
+ final PyDecoratorList decoratorList = node.getDecoratorList();
+ if (decoratorList != null) return;
+ if (node.getModifier() != null) return;
final Property property = containingClass.findPropertyByCallable(node);
if (property != null) return;
diff --git a/python/src/com/jetbrains/python/inspections/PyMissingConstructorInspection.java b/python/src/com/jetbrains/python/inspections/PyMissingConstructorInspection.java
index 0a4c362..9087180 100644
--- a/python/src/com/jetbrains/python/inspections/PyMissingConstructorInspection.java
+++ b/python/src/com/jetbrains/python/inspections/PyMissingConstructorInspection.java
@@ -139,7 +139,7 @@
if (args.length > 0) {
String firstArg = args[0].getText();
final String qualifiedName = cl.getQualifiedName();
- if (firstArg.equals(cl.getName()) || firstArg.equals(CANONICAL_SELF+"."+ CLASS) ||
+ if (firstArg.equals(cl.getName()) || firstArg.equals(CANONICAL_SELF+"."+ __CLASS__) ||
(qualifiedName != null && qualifiedName.endsWith(firstArg)))
return true;
for (PyClass s : cl.getAncestorClasses(myTypeEvalContext)) {
diff --git a/python/src/com/jetbrains/python/inspections/PyPackageRequirementsInspection.java b/python/src/com/jetbrains/python/inspections/PyPackageRequirementsInspection.java
index 5a3bdce..ec37611 100644
--- a/python/src/com/jetbrains/python/inspections/PyPackageRequirementsInspection.java
+++ b/python/src/com/jetbrains/python/inspections/PyPackageRequirementsInspection.java
@@ -41,7 +41,7 @@
import com.jetbrains.python.packaging.*;
import com.jetbrains.python.packaging.ui.PyChooseRequirementsDialog;
import com.jetbrains.python.psi.*;
-import com.jetbrains.python.psi.resolve.PyResolveUtil;
+import com.jetbrains.python.psi.impl.PyPsiUtils;
import com.jetbrains.python.sdk.PythonSdkType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -147,9 +147,8 @@
return;
}
}
- final List<PyExpression> expressions = PyResolveUtil.unwindQualifiers(importedExpression);
- if (!expressions.isEmpty()) {
- final PyExpression packageReferenceExpression = expressions.get(0);
+ final PyExpression packageReferenceExpression = PyPsiUtils.getFirstQualifier(importedExpression);
+ if (packageReferenceExpression != null) {
final String packageName = packageReferenceExpression.getName();
if (packageName != null && !myIgnoredPackages.contains(packageName)) {
if (!ApplicationManager.getApplication().isUnitTestMode() && !PyPIPackageUtil.INSTANCE.isInPyPI(packageName)) {
diff --git a/python/src/com/jetbrains/python/inspections/PyPep8NamingInspection.java b/python/src/com/jetbrains/python/inspections/PyPep8NamingInspection.java
index 9b26d94..f3fddba 100644
--- a/python/src/com/jetbrains/python/inspections/PyPep8NamingInspection.java
+++ b/python/src/com/jetbrains/python/inspections/PyPep8NamingInspection.java
@@ -22,9 +22,10 @@
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.psi.PsiElementVisitor;
import com.intellij.psi.util.PsiTreeUtil;
-import com.intellij.util.containers.hash.HashMap;
-import com.jetbrains.python.psi.*;
import com.intellij.psi.util.QualifiedName;
+import com.intellij.util.containers.hash.HashMap;
+import com.intellij.util.containers.hash.HashSet;
+import com.jetbrains.python.psi.*;
import com.jetbrains.python.psi.search.PySuperMethodsSearch;
import com.jetbrains.python.psi.types.PyModuleType;
import com.jetbrains.python.psi.types.PyType;
@@ -33,7 +34,9 @@
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
+import java.util.Collection;
import java.util.Map;
+import java.util.Set;
import java.util.regex.Pattern;
/**
@@ -68,9 +71,17 @@
public void visitPyAssignmentStatement(PyAssignmentStatement node) {
final PyFunction function = PsiTreeUtil.getParentOfType(node, PyFunction.class, true, PyClass.class);
if (function == null) return;
+ final Collection<PyGlobalStatement> globalStatements = PsiTreeUtil.findChildrenOfType(function, PyGlobalStatement.class);
+ final Set<String> globals = new HashSet<String>();
+ for (PyGlobalStatement statement : globalStatements) {
+ final PyTargetExpression[] statementGlobals = statement.getGlobals();
+ for (PyTargetExpression global : statementGlobals) {
+ globals.add(global.getName());
+ }
+ }
for (PyExpression expression : node.getTargets()) {
final String name = expression.getName();
- if (name == null) continue;
+ if (name == null || globals.contains(name)) continue;
if (expression instanceof PyTargetExpression) {
final PyExpression qualifier = ((PyTargetExpression)expression).getQualifier();
if (qualifier != null) {
@@ -126,7 +137,7 @@
final String asName = node.getAsName();
final QualifiedName importedQName = node.getImportedQName();
if (importedQName == null) return;
- final String name = importedQName.toString();
+ final String name = importedQName.getLastComponent();
if (asName == null || name == null) return;
if (UPPERCASE_REGEX.matcher(name).matches()) {
diff --git a/python/src/com/jetbrains/python/inspections/PyPropertyAccessInspection.java b/python/src/com/jetbrains/python/inspections/PyPropertyAccessInspection.java
index 425c585..8e48067 100644
--- a/python/src/com/jetbrains/python/inspections/PyPropertyAccessInspection.java
+++ b/python/src/com/jetbrains/python/inspections/PyPropertyAccessInspection.java
@@ -86,7 +86,7 @@
property = myPropertyCache.get(key);
}
else {
- property = cls.findProperty(name);
+ property = cls.findProperty(name, true);
}
myPropertyCache.put(key, property); // we store nulls, too, to know that a property does not exist
if (property != null) {
diff --git a/python/src/com/jetbrains/python/inspections/PyProtectedMemberInspection.java b/python/src/com/jetbrains/python/inspections/PyProtectedMemberInspection.java
index 8daea86..fe9ac7f 100644
--- a/python/src/com/jetbrains/python/inspections/PyProtectedMemberInspection.java
+++ b/python/src/com/jetbrains/python/inspections/PyProtectedMemberInspection.java
@@ -20,9 +20,10 @@
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiElementVisitor;
import com.intellij.psi.PsiReference;
-import com.intellij.psi.util.PsiTreeUtil;
import com.jetbrains.python.PyBundle;
import com.jetbrains.python.PyNames;
+import com.jetbrains.python.codeInsight.controlflow.ScopeOwner;
+import com.jetbrains.python.codeInsight.dataflow.scope.ScopeUtil;
import com.jetbrains.python.psi.PyClass;
import com.jetbrains.python.psi.PyExpression;
import com.jetbrains.python.psi.PyReferenceExpression;
@@ -67,20 +68,20 @@
if (qualifier == null || PyNames.CANONICAL_SELF.equals(qualifier.getText())) return;
final String name = node.getName();
if (name != null && name.startsWith("_") && !name.startsWith("__") && !name.endsWith("__")) {
- final PyClass parentClass = PsiTreeUtil.getParentOfType(node, PyClass.class);
+ final PyClass parentClass = getClassOwner(node);
if (parentClass != null) {
final PsiReference reference = node.getReference();
final PsiElement resolvedExpression = reference.resolve();
- final PyClass resolvedClass = PsiTreeUtil.getParentOfType(resolvedExpression, PyClass.class);
+ final PyClass resolvedClass = getClassOwner(resolvedExpression);
if (parentClass.isSubclass(resolvedClass))
return;
- PyClass outerClass = PsiTreeUtil.getParentOfType(parentClass, PyClass.class);
+ PyClass outerClass = getClassOwner(parentClass);
while (outerClass != null) {
if (outerClass.isSubclass(resolvedClass))
return;
- outerClass = PsiTreeUtil.getParentOfType(outerClass, PyClass.class);
+ outerClass = getClassOwner(outerClass);
}
}
final PyType type = myTypeEvalContext.getType(qualifier);
@@ -91,5 +92,14 @@
}
}
+ @Nullable
+ private static PyClass getClassOwner(@Nullable PsiElement element) {
+ for (ScopeOwner owner = ScopeUtil.getScopeOwner(element); owner != null; owner = ScopeUtil.getScopeOwner(owner)) {
+ if (owner instanceof PyClass) {
+ return (PyClass)owner;
+ }
+ }
+ return null;
+ }
}
}
diff --git a/python/src/com/jetbrains/python/inspections/PySetFunctionToLiteralInspection.java b/python/src/com/jetbrains/python/inspections/PySetFunctionToLiteralInspection.java
index aaebc16..f0bdeb3 100644
--- a/python/src/com/jetbrains/python/inspections/PySetFunctionToLiteralInspection.java
+++ b/python/src/com/jetbrains/python/inspections/PySetFunctionToLiteralInspection.java
@@ -93,7 +93,7 @@
}
private static boolean isInBuiltins(PyExpression callee) {
- if (callee instanceof PyQualifiedExpression && (((PyQualifiedExpression)callee).getQualifier() != null)) {
+ if (callee instanceof PyQualifiedExpression && (((PyQualifiedExpression)callee).isQualified())) {
return false;
}
PsiReference reference = callee.getReference();
diff --git a/python/src/com/jetbrains/python/inspections/PyShadowingBuiltinsInspection.java b/python/src/com/jetbrains/python/inspections/PyShadowingBuiltinsInspection.java
index 8f6b5af..fa7a1b9 100644
--- a/python/src/com/jetbrains/python/inspections/PyShadowingBuiltinsInspection.java
+++ b/python/src/com/jetbrains/python/inspections/PyShadowingBuiltinsInspection.java
@@ -92,7 +92,7 @@
@Override
public void visitPyTargetExpression(@NotNull PyTargetExpression node) {
- if (node.getQualifier() == null) {
+ if (!node.isQualified()) {
processElement(node);
}
}
diff --git a/python/src/com/jetbrains/python/inspections/PyShadowingNamesInspection.java b/python/src/com/jetbrains/python/inspections/PyShadowingNamesInspection.java
index 82b3cdc..07f92ff 100644
--- a/python/src/com/jetbrains/python/inspections/PyShadowingNamesInspection.java
+++ b/python/src/com/jetbrains/python/inspections/PyShadowingNamesInspection.java
@@ -77,7 +77,7 @@
@Override
public void visitPyTargetExpression(@NotNull PyTargetExpression node) {
- if (node.getQualifier() == null) {
+ if (!node.isQualified()) {
processElement(node);
}
}
diff --git a/python/src/com/jetbrains/python/inspections/PyStatementEffectInspection.java b/python/src/com/jetbrains/python/inspections/PyStatementEffectInspection.java
index b35a6f7..28ccafd 100644
--- a/python/src/com/jetbrains/python/inspections/PyStatementEffectInspection.java
+++ b/python/src/com/jetbrains/python/inspections/PyStatementEffectInspection.java
@@ -21,8 +21,6 @@
import com.intellij.psi.ResolveResult;
import com.intellij.psi.util.PsiTreeUtil;
import com.jetbrains.python.PyBundle;
-import com.jetbrains.python.documentation.DocStringUtil;
-import com.jetbrains.python.inspections.quickfix.StatementEffectDocstringQuickFix;
import com.jetbrains.python.inspections.quickfix.StatementEffectFunctionCallQuickFix;
import com.jetbrains.python.inspections.quickfix.StatementEffectIntroduceVariableQuickFix;
import com.jetbrains.python.psi.*;
@@ -66,6 +64,11 @@
return;
if (hasEffect(expression)) return;
+ // https://twitter.com/gvanrossum/status/112670605505077248
+ if (expression instanceof PyStringLiteralExpression) {
+ return;
+ }
+
final PyTryPart tryPart = PsiTreeUtil.getParentOfType(node, PyTryPart.class);
if (tryPart != null) {
final PyStatementList statementList = tryPart.getStatementList();
@@ -76,10 +79,7 @@
return;
}
}
- if (checkStringLiteral(expression)) {
- return;
- }
- if (expression instanceof PyReferenceExpression && ((PyReferenceExpression)expression).getQualifier() == null) {
+ if (expression instanceof PyReferenceExpression && !((PyReferenceExpression)expression).isQualified()) {
registerProblem(expression, PyBundle.message("INSP.NAME.statement.message"));
}
else {
@@ -87,18 +87,6 @@
}
}
- private boolean checkStringLiteral(PyExpression expression) {
- if (expression instanceof PyStringLiteralExpression) {
- PyDocStringOwner parent = PsiTreeUtil.getParentOfType(expression, PyFunction.class, PyClass.class);
- if (parent != null && parent.getDocStringExpression() == null) {
- registerProblem(expression, "Docstring seems to be misplaced",
- new StatementEffectDocstringQuickFix());
- return true;
- }
- }
- return false;
- }
-
private boolean hasEffect(@Nullable PyExpression expression) {
if (expression == null) {
return false;
@@ -106,10 +94,6 @@
if (expression instanceof PyCallExpression || expression instanceof PyYieldExpression) {
return true;
}
-
- if (expression instanceof PyStringLiteralExpression) {
- if (DocStringUtil.isDocStringExpression(expression)) return true;
- }
else if (expression instanceof PyListCompExpression) {
if (hasEffect(((PyListCompExpression)expression).getResultExpression())) {
return true;
diff --git a/python/src/com/jetbrains/python/inspections/PyStringFormatParser.java b/python/src/com/jetbrains/python/inspections/PyStringFormatParser.java
index 5f935cf..158206c 100644
--- a/python/src/com/jetbrains/python/inspections/PyStringFormatParser.java
+++ b/python/src/com/jetbrains/python/inspections/PyStringFormatParser.java
@@ -29,11 +29,14 @@
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
+import java.util.regex.Pattern;
/**
* @author yole
*/
public class PyStringFormatParser {
+ private static final Pattern NEW_STYLE_FORMAT_TOKENS = Pattern.compile("(\\{\\{)|(\\}\\})|(\\{[^\\{\\}]*\\})|([^\\{\\}]+)");
+
public static abstract class FormatStringChunk {
private final int myStartIndex;
protected int myEndIndex;
@@ -173,30 +176,22 @@
@NotNull
public static List<FormatStringChunk> parseNewStyleFormat(@NotNull String s) {
final List<FormatStringChunk> results = new ArrayList<FormatStringChunk>();
- int pos = 0;
- final int n = s.length();
- while (pos < n) {
- int next = s.indexOf('{', pos);
- while (next > 0 && next < n - 1 && s.charAt(next + 1) == '{') {
- next = s.indexOf('{', next + 2);
+ final Matcher matcher = NEW_STYLE_FORMAT_TOKENS.matcher(s);
+ while (matcher.find()) {
+ final String group = matcher.group();
+ final int start = matcher.start();
+ final int end = matcher.end();
+ if ("{{".equals(group)) {
+ results.add(new ConstantChunk(start, end));
}
- if (next < 0) {
- break;
+ else if ("}}".equals(group)) {
+ results.add(new ConstantChunk(start, end));
}
- if (next > pos) {
- results.add(new ConstantChunk(pos, next));
- }
- pos = next;
- next = s.indexOf('}', pos);
- while (next > 0 && next < n - 1 && s.charAt(next + 1) == '}') {
- next = s.indexOf('}', next + 2);
- }
- if (next > pos) {
- final SubstitutionChunk chunk = new SubstitutionChunk(pos);
- final int nameStart = pos + 1;
- final int chunkEnd = next + 1;
- chunk.setEndIndex(chunkEnd);
- final int nameEnd = StringUtil.indexOfAny(s, "!:.[}", nameStart, chunkEnd);
+ else if (group.startsWith("{") && group.endsWith("}")) {
+ final SubstitutionChunk chunk = new SubstitutionChunk(start);
+ chunk.setEndIndex(end);
+ final int nameStart = start + 1;
+ final int nameEnd = StringUtil.indexOfAny(s, "!:.[}", nameStart, end);
if (nameEnd > 0 && nameStart < nameEnd) {
final String name = s.substring(nameStart, nameEnd);
try {
@@ -209,10 +204,9 @@
// TODO: Parse substitution details
results.add(chunk);
}
- pos = next + 1;
- }
- if (pos < n) {
- results.add(new ConstantChunk(pos, n));
+ else {
+ results.add(new ConstantChunk(start, end));
+ }
}
return results;
}
diff --git a/python/src/com/jetbrains/python/inspections/PyTypeCheckerInspection.java b/python/src/com/jetbrains/python/inspections/PyTypeCheckerInspection.java
index 484ac05..45df382 100644
--- a/python/src/com/jetbrains/python/inspections/PyTypeCheckerInspection.java
+++ b/python/src/com/jetbrains/python/inspections/PyTypeCheckerInspection.java
@@ -78,7 +78,7 @@
final PyExpression source = node.getForPart().getSource();
if (source != null) {
final PyType type = myTypeEvalContext.getType(source);
- if (type != null && !PyTypeChecker.isUnknown(type) && !PyABCUtil.isSubtype(type, PyNames.ITERABLE)) {
+ if (type != null && !PyTypeChecker.isUnknown(type) && !PyABCUtil.isSubtype(type, PyNames.ITERABLE, myTypeEvalContext)) {
registerProblem(source, String.format("Expected 'collections.Iterable', got '%s' instead",
PythonDocumentationProvider.getTypeName(type, myTypeEvalContext)));
}
diff --git a/python/src/com/jetbrains/python/inspections/PyUnboundLocalVariableInspection.java b/python/src/com/jetbrains/python/inspections/PyUnboundLocalVariableInspection.java
index 38b0a47..abec5b1 100644
--- a/python/src/com/jetbrains/python/inspections/PyUnboundLocalVariableInspection.java
+++ b/python/src/com/jetbrains/python/inspections/PyUnboundLocalVariableInspection.java
@@ -79,7 +79,7 @@
return;
}
// Ignore qualifier inspections
- if (node.getQualifier() != null) {
+ if (node.isQualified()) {
return;
}
// Ignore import subelements
diff --git a/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java b/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java
index 0739893..9e08a47 100644
--- a/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java
+++ b/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java
@@ -29,7 +29,9 @@
import com.intellij.profile.codeInspection.InspectionProjectProfileManager;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiTreeUtil;
+import com.intellij.psi.util.QualifiedName;
import com.intellij.util.Consumer;
+import com.intellij.util.PlatformUtils;
import com.jetbrains.python.PyBundle;
import com.jetbrains.python.PyNames;
import com.jetbrains.python.codeInsight.PyCodeInsightSettings;
@@ -51,7 +53,6 @@
import com.jetbrains.python.psi.impl.PyBuiltinCache;
import com.jetbrains.python.psi.impl.PyImportStatementNavigator;
import com.jetbrains.python.psi.impl.PyImportedModule;
-import com.intellij.psi.util.QualifiedName;
import com.jetbrains.python.psi.impl.references.PyImportReference;
import com.jetbrains.python.psi.impl.references.PyOperatorReference;
import com.jetbrains.python.psi.resolve.ImportedResolveResult;
@@ -60,6 +61,7 @@
import com.jetbrains.python.psi.resolve.RatedResolveResult;
import com.jetbrains.python.psi.types.*;
import com.jetbrains.python.sdk.PythonSdkType;
+import com.jetbrains.python.sdk.skeletons.PySkeletonRefresher;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -125,12 +127,22 @@
private Set<PsiElement> myUsedImports = Collections.synchronizedSet(new HashSet<PsiElement>());
private Set<NameDefiner> myAllImports = Collections.synchronizedSet(new HashSet<NameDefiner>());
private final ImmutableSet<String> myIgnoredIdentifiers;
+ private volatile Boolean myIsEnabled = null;
public Visitor(@Nullable ProblemsHolder holder, @NotNull LocalInspectionToolSession session, List<String> ignoredIdentifiers) {
super(holder, session);
myIgnoredIdentifiers = ImmutableSet.copyOf(ignoredIdentifiers);
}
+ public boolean isEnabled(@NotNull PsiElement anchor) {
+ if (myIsEnabled == null) {
+ final boolean isPyCharm = PlatformUtils.isPyCharm();
+ myIsEnabled = (isPyCharm && PythonSdkType.getSdk(anchor) != null || !isPyCharm) &&
+ !PySkeletonRefresher.isGeneratingSkeletons();
+ }
+ return myIsEnabled;
+ }
+
@Override
public void visitPyTargetExpression(PyTargetExpression node) {
checkSlots(node);
@@ -174,7 +186,7 @@
public void visitPyImportElement(PyImportElement node) {
super.visitPyImportElement(node);
final PyFromImportStatement fromImport = PsiTreeUtil.getParentOfType(node, PyFromImportStatement.class);
- if (fromImport == null || !fromImport.isFromFuture()) {
+ if (isEnabled(node) && (fromImport == null || !fromImport.isFromFuture())) {
myAllImports.add(node);
}
}
@@ -182,7 +194,9 @@
@Override
public void visitPyStarImportElement(PyStarImportElement node) {
super.visitPyStarImportElement(node);
- myAllImports.add(node);
+ if (isEnabled(node)) {
+ myAllImports.add(node);
+ }
}
@Nullable
@@ -223,9 +237,9 @@
calls.add((PyCallExpression)cond);
}
if (cond != null) {
- final PyCallExpression[] callExprs = PsiTreeUtil.getChildrenOfType(cond, PyCallExpression.class);
- if (callExprs != null) {
- calls.addAll(Arrays.asList(callExprs));
+ final PyCallExpression[] callExpressions = PsiTreeUtil.getChildrenOfType(cond, PyCallExpression.class);
+ if (callExpressions != null) {
+ calls.addAll(Arrays.asList(callExpressions));
}
for (PyCallExpression call : calls) {
final PyExpression callee = call.getCallee();
@@ -298,7 +312,9 @@
}
private void processReference(PyElement node, @Nullable PsiReference reference) {
- if (reference == null || reference.isSoft()) return;
+ if (!isEnabled(node) || reference == null || reference.isSoft()) {
+ return;
+ }
HighlightSeverity severity = HighlightSeverity.ERROR;
if (reference instanceof PsiReferenceEx) {
severity = ((PsiReferenceEx)reference).getUnresolvedHighlightSeverity(myTypeEvalContext);
@@ -411,9 +427,9 @@
}
final PsiElement element = reference.getElement();
final List<LocalQuickFix> actions = new ArrayList<LocalQuickFix>(2);
- final String refname = (element instanceof PyQualifiedExpression) ? ((PyQualifiedExpression)element).getReferencedName() : ref_text;
+ final String refName = (element instanceof PyQualifiedExpression) ? ((PyQualifiedExpression)element).getReferencedName() : ref_text;
// Empty text, nothing to highlight
- if (refname == null || refname.length() <= 0) {
+ if (refName == null || refName.length() <= 0) {
return;
}
@@ -433,47 +449,48 @@
}
}
// Legacy non-qualified ignore patterns
- if (myIgnoredIdentifiers.contains(refname)) {
+ if (myIgnoredIdentifiers.contains(refName)) {
return;
}
if (element instanceof PyReferenceExpression) {
- PyReferenceExpression refex = (PyReferenceExpression)element;
- if (PyNames.COMPARISON_OPERATORS.contains(refname)) {
+ PyReferenceExpression expr = (PyReferenceExpression)element;
+ if (PyNames.COMPARISON_OPERATORS.contains(refName)) {
return;
}
- if (refex.getQualifier() != null) {
+ if (expr.isQualified()) {
final PyClassTypeImpl object_type = (PyClassTypeImpl)PyBuiltinCache.getInstance(node).getObjectType();
- if ((object_type != null) && object_type.getPossibleInstanceMembers().contains(refname)) return;
+ if ((object_type != null) && object_type.getPossibleInstanceMembers().contains(refName)) return;
}
else {
- if (PyUnreachableCodeInspection.hasAnyInterruptedControlFlowPaths(refex)) {
+ if (PyUnreachableCodeInspection.hasAnyInterruptedControlFlowPaths(expr)) {
return;
}
if (LanguageLevel.forElement(node).isOlderThan(LanguageLevel.PYTHON26)) {
- if ("with".equals(refname)) {
+ if ("with".equals(refName)) {
actions.add(new UnresolvedRefAddFutureImportQuickFix());
}
}
if (ref_text.equals("true") || ref_text.equals("false")) {
actions.add(new UnresolvedRefTrueFalseQuickFix(element));
}
- addAddSelfFix(node, refex, actions);
+ addAddSelfFix(node, expr, actions);
PyCallExpression callExpression = PsiTreeUtil.getParentOfType(element, PyCallExpression.class);
- if (callExpression != null) {
- actions.add(new UnresolvedRefCreateFunctionQuickFix(callExpression, refex));
+ if (callExpression != null && (!(callExpression.getCallee() instanceof PyQualifiedExpression) ||
+ ((PyQualifiedExpression)callExpression.getCallee()).getQualifier() == null)) {
+ actions.add(new UnresolvedRefCreateFunctionQuickFix(callExpression, expr));
}
PyFunction parentFunction = PsiTreeUtil.getParentOfType(element, PyFunction.class);
PyDecorator decorator = PsiTreeUtil.getParentOfType(element, PyDecorator.class);
PyImportStatement importStatement = PsiTreeUtil.getParentOfType(element, PyImportStatement.class);
if (parentFunction != null && decorator == null && importStatement == null) {
- actions.add(new UnresolvedReferenceAddParameterQuickFix(refname));
+ actions.add(new UnresolvedReferenceAddParameterQuickFix(refName));
}
actions.add(new PyRenameUnresolvedRefQuickFix());
}
// unqualified:
// may be module's
- if (PyModuleType.getPossibleInstanceMembers().contains(refname)) return;
+ if (PyModuleType.getPossibleInstanceMembers().contains(refName)) return;
// may be a "try: import ..."; not an error not to resolve
if ((
PsiTreeUtil.getParentOfType(
@@ -496,31 +513,31 @@
if ("__qualname__".equals(ref_text) && LanguageLevel.forElement(element).isAtLeast(LanguageLevel.PYTHON33)) {
return;
}
- final PyQualifiedExpression qexpr = (PyQualifiedExpression)element;
- if (PyNames.COMPARISON_OPERATORS.contains(qexpr.getReferencedName()) || refname == null) {
+ final PyQualifiedExpression expr = (PyQualifiedExpression)element;
+ if (PyNames.COMPARISON_OPERATORS.contains(expr.getReferencedName())) {
return;
}
- final PyExpression qualifier = qexpr.getQualifier();
+ final PyExpression qualifier = expr.getQualifier();
if (qualifier != null) {
- PyType qtype = myTypeEvalContext.getType(qualifier);
- if (qtype != null) {
- if (ignoreUnresolvedMemberForType(qtype, reference, refname)) {
+ PyType type = myTypeEvalContext.getType(qualifier);
+ if (type != null) {
+ if (ignoreUnresolvedMemberForType(type, reference, refName)) {
return;
}
- addCreateMemberFromUsageFixes(qtype, reference, ref_text, actions);
- if (qtype instanceof PyClassTypeImpl) {
+ addCreateMemberFromUsageFixes(type, reference, ref_text, actions);
+ if (type instanceof PyClassTypeImpl) {
if (reference instanceof PyOperatorReference) {
description = PyBundle.message("INSP.unresolved.operator.ref",
- qtype.getName(), refname,
+ type.getName(), refName,
((PyOperatorReference)reference).getReadableOperatorName());
}
else {
- description = PyBundle.message("INSP.unresolved.ref.$0.for.class.$1", ref_text, qtype.getName());
+ description = PyBundle.message("INSP.unresolved.ref.$0.for.class.$1", ref_text, type.getName());
}
marked_qualified = true;
}
else {
- description = PyBundle.message("INSP.cannot.find.$0.in.$1", ref_text, qtype.getName());
+ description = PyBundle.message("INSP.cannot.find.$0.in.$1", ref_text, type.getName());
marked_qualified = true;
}
}
@@ -559,20 +576,9 @@
}
addPluginQuickFixes(reference, actions);
- final PsiElement point;
- final TextRange range;
- final PsiElement lastChild = node.getLastChild();
- if (reference instanceof PyOperatorReference || lastChild == null) {
- point = node;
- range = rangeInElement;
- }
- else {
- point = lastChild; // usually the identifier at the end of qual ref
- range = rangeInElement.shiftRight(-point.getStartOffsetInParent());
- }
- if (reference instanceof PyImportReference && refname != null) {
+ if (reference instanceof PyImportReference) {
// TODO: Ignore references in the second part of the 'from ... import ...' expression
- final QualifiedName qname = QualifiedName.fromDottedString(refname);
+ final QualifiedName qname = QualifiedName.fromDottedString(refName);
final List<String> components = qname.getComponents();
if (!components.isEmpty()) {
final String packageName = components.get(0);
@@ -589,7 +595,7 @@
}
}
}
- registerProblem(point, description, hl_type, null, range, actions.toArray(new LocalQuickFix[actions.size()]));
+ registerProblem(node, description, hl_type, null, rangeInElement, actions.toArray(new LocalQuickFix[actions.size()]));
}
/**
@@ -663,23 +669,23 @@
return null;
}
- private boolean ignoreUnresolvedMemberForType(@NotNull PyType qtype, PsiReference reference, String name) {
- if (qtype instanceof PyNoneType || PyTypeChecker.isUnknown(qtype)) {
+ private boolean ignoreUnresolvedMemberForType(@NotNull PyType type, PsiReference reference, String name) {
+ if (type instanceof PyNoneType || PyTypeChecker.isUnknown(type)) {
// this almost always means that we don't know the type, so don't show an error in this case
return true;
}
- if (qtype instanceof PyImportedModuleType) {
- PyImportedModule module = ((PyImportedModuleType)qtype).getImportedModule();
+ if (type instanceof PyImportedModuleType) {
+ PyImportedModule module = ((PyImportedModuleType)type).getImportedModule();
if (module.resolve() == null) {
return true;
}
}
- if (qtype instanceof PyClassTypeImpl) {
- PyClass cls = ((PyClassType)qtype).getPyClass();
+ if (type instanceof PyClassTypeImpl) {
+ PyClass cls = ((PyClassType)type).getPyClass();
if (overridesGetAttr(cls, myTypeEvalContext)) {
return true;
}
- if (cls.findProperty(name) != null) {
+ if (cls.findProperty(name, true) != null) {
return true;
}
if (PyUtil.hasUnresolvedAncestors(cls, myTypeEvalContext)) {
@@ -688,27 +694,27 @@
if (isDecoratedAsDynamic(cls, true)) {
return true;
}
- if (hasUnresolvedDynamicMember((PyClassType)qtype, reference, name)) return true;
+ if (hasUnresolvedDynamicMember((PyClassType)type, reference, name)) return true;
}
- if (qtype instanceof PyFunctionType) {
- final Callable callable = ((PyFunctionType)qtype).getCallable();
+ if (type instanceof PyFunctionType) {
+ final Callable callable = ((PyFunctionType)type).getCallable();
if (callable instanceof PyFunction && ((PyFunction)callable).getDecoratorList() != null) {
return true;
}
}
for (PyInspectionExtension extension : Extensions.getExtensions(PyInspectionExtension.EP_NAME)) {
- if (extension.ignoreUnresolvedMember(qtype, name)) {
+ if (extension.ignoreUnresolvedMember(type, name)) {
return true;
}
}
return false;
}
- private static boolean hasUnresolvedDynamicMember(@NotNull final PyClassType qtype,
+ private static boolean hasUnresolvedDynamicMember(@NotNull final PyClassType type,
PsiReference reference,
@NotNull final String name) {
for (PyClassMembersProvider provider : Extensions.getExtensions(PyClassMembersProvider.EP_NAME)) {
- final Collection<PyDynamicMember> resolveResult = provider.getMembers(qtype, reference.getElement());
+ final Collection<PyDynamicMember> resolveResult = provider.getMembers(type, reference.getElement());
for (PyDynamicMember member : resolveResult) {
if (member.getName().equals(name)) return true;
}
@@ -739,26 +745,26 @@
return false;
}
- private static void addCreateMemberFromUsageFixes(PyType qtype, PsiReference reference, String refText, List<LocalQuickFix> actions) {
+ private static void addCreateMemberFromUsageFixes(PyType type, PsiReference reference, String refText, List<LocalQuickFix> actions) {
PsiElement element = reference.getElement();
- if (qtype instanceof PyClassTypeImpl) {
- PyClass cls = ((PyClassType)qtype).getPyClass();
+ if (type instanceof PyClassTypeImpl) {
+ PyClass cls = ((PyClassType)type).getPyClass();
if (!PyBuiltinCache.getInstance(element).hasInBuiltins(cls)) {
if (element.getParent() instanceof PyCallExpression) {
- actions.add(new AddMethodQuickFix(refText, (PyClassType)qtype, true));
+ actions.add(new AddMethodQuickFix(refText, (PyClassType)type, true));
}
else if (!(reference instanceof PyOperatorReference)) {
- actions.add(new AddFieldQuickFix(refText, (PyClassType)qtype, "None"));
+ actions.add(new AddFieldQuickFix(refText, (PyClassType)type, "None"));
}
}
}
- else if (qtype instanceof PyModuleType) {
- PyFile file = ((PyModuleType)qtype).getModule();
+ else if (type instanceof PyModuleType) {
+ PyFile file = ((PyModuleType)type).getModule();
actions.add(new AddFunctionQuickFix(refText, file));
}
}
- private void addAddSelfFix(PyElement node, PyReferenceExpression refex, List<LocalQuickFix> actions) {
+ private void addAddSelfFix(PyElement node, PyReferenceExpression expr, List<LocalQuickFix> actions) {
final PyClass containedClass = PsiTreeUtil.getParentOfType(node, PyClass.class);
final PyFunction function = PsiTreeUtil.getParentOfType(node, PyFunction.class);
if (containedClass != null && function != null) {
@@ -766,29 +772,29 @@
if (parameters.length == 0) return;
final String qualifier = parameters[0].getText();
final PyDecoratorList decoratorList = function.getDecoratorList();
- boolean isClassmethod = false;
+ boolean isClassMethod = false;
if (decoratorList != null) {
for (PyDecorator decorator : decoratorList.getDecorators()) {
final PyExpression callee = decorator.getCallee();
if (callee != null && PyNames.CLASSMETHOD.equals(callee.getText()))
- isClassmethod = true;
+ isClassMethod = true;
}
}
for (PyTargetExpression target : containedClass.getInstanceAttributes()) {
- if (!isClassmethod && Comparing.strEqual(node.getName(), target.getName())) {
- actions.add(new UnresolvedReferenceAddSelfQuickFix(refex, qualifier));
+ if (!isClassMethod && Comparing.strEqual(node.getName(), target.getName())) {
+ actions.add(new UnresolvedReferenceAddSelfQuickFix(expr, qualifier));
}
}
for (PyStatement statement : containedClass.getStatementList().getStatements()) {
if (statement instanceof PyAssignmentStatement) {
PyExpression lhsExpression = ((PyAssignmentStatement)statement).getLeftHandSideExpression();
- if (lhsExpression != null && lhsExpression.getText().equals(refex.getText())) {
- PyExpression callexpr = ((PyAssignmentStatement)statement).getAssignedValue();
- if (callexpr instanceof PyCallExpression) {
- PyType type = myTypeEvalContext.getType(callexpr);
+ if (lhsExpression != null && lhsExpression.getText().equals(expr.getText())) {
+ PyExpression assignedValue = ((PyAssignmentStatement)statement).getAssignedValue();
+ if (assignedValue instanceof PyCallExpression) {
+ PyType type = myTypeEvalContext.getType(assignedValue);
if (type != null && type instanceof PyClassTypeImpl) {
- if (((PyCallExpression)callexpr).isCalleeText(PyNames.PROPERTY)) {
- actions.add(new UnresolvedReferenceAddSelfQuickFix(refex, qualifier));
+ if (((PyCallExpression)assignedValue).isCalleeText(PyNames.PROPERTY)) {
+ actions.add(new UnresolvedReferenceAddSelfQuickFix(expr, qualifier));
}
}
}
@@ -796,8 +802,8 @@
}
}
for (PyFunction method : containedClass.getMethods()) {
- if (refex.getText().equals(method.getName())) {
- actions.add(new UnresolvedReferenceAddSelfQuickFix(refex, qualifier));
+ if (expr.getText().equals(method.getName())) {
+ actions.add(new UnresolvedReferenceAddSelfQuickFix(expr, qualifier));
}
}
}
@@ -839,9 +845,9 @@
PsiTreeUtil.getParentOfType(element, PyImportStatementBase.class) == null) {
PsiElement anchor = element;
if (element instanceof PyQualifiedExpression) {
- final PyExpression qexpr = ((PyQualifiedExpression)element).getQualifier();
- if (qexpr != null) {
- final PyType type = myTypeEvalContext.getType(qexpr);
+ final PyExpression expr = ((PyQualifiedExpression)element).getQualifier();
+ if (expr != null) {
+ final PyType type = myTypeEvalContext.getType(expr);
if (type instanceof PyModuleType) {
anchor = ((PyModuleType)type).getModule();
}
@@ -909,7 +915,7 @@
if (myAllImports.isEmpty()) {
return Collections.emptyList();
}
- // PY-1315 Unused imports inspection shouldn't work in python repl console
+ // PY-1315 Unused imports inspection shouldn't work in python REPL console
final NameDefiner first = myAllImports.iterator().next();
if (first.getContainingFile() instanceof PyExpressionCodeFragment || PydevConsoleRunner.isInPydevConsole(first)) {
return Collections.emptyList();
@@ -968,6 +974,10 @@
final PyImportElement importElement = (PyImportElement)unusedImport;
final PsiElement element = importElement.resolve();
if (element == null) {
+ if (importElement.getImportedQName() != null) {
+ //Mark import as unused even if it can't be resolved
+ result.add(importElement.getParent());
+ }
continue;
}
if (dunderAll != null && dunderAll.contains(importElement.getVisibleName())) {
diff --git a/python/src/com/jetbrains/python/inspections/PyUnusedLocalInspectionVisitor.java b/python/src/com/jetbrains/python/inspections/PyUnusedLocalInspectionVisitor.java
index f770c5d..f788353 100644
--- a/python/src/com/jetbrains/python/inspections/PyUnusedLocalInspectionVisitor.java
+++ b/python/src/com/jetbrains/python/inspections/PyUnusedLocalInspectionVisitor.java
@@ -207,7 +207,8 @@
owner.acceptChildren(new PyRecursiveElementVisitor(){
@Override
public void visitPyCallExpression(final PyCallExpression node) {
- if ("locals".equals(node.getCallee().getName())){
+ final PyExpression callee = node.getCallee();
+ if (callee != null && "locals".equals(callee.getName())){
throw new DontPerformException();
}
node.acceptChildren(this); // look at call expr in arguments
@@ -290,7 +291,7 @@
isEmpty = isEmptyFunction(func);
emptyFunctions.put(func, isEmpty);
}
- if (isEmpty) {
+ if (isEmpty && !mayBeField) {
continue;
}
}
diff --git a/python/src/com/jetbrains/python/inspections/quickfix/AddCallSuperQuickFix.java b/python/src/com/jetbrains/python/inspections/quickfix/AddCallSuperQuickFix.java
index b3e9e2d..2306a47 100644
--- a/python/src/com/jetbrains/python/inspections/quickfix/AddCallSuperQuickFix.java
+++ b/python/src/com/jetbrains/python/inspections/quickfix/AddCallSuperQuickFix.java
@@ -149,15 +149,15 @@
for (int i = 1; i != parameters.length; i++) {
PyParameter p = parameters[i];
if (p.getDefaultValue() != null) continue;
- String param;
- param = p.getText();
- if (param.startsWith("**")) {
+ final String param = p.getName();
+ String paramText = p.getText();
+ if (paramText.startsWith("**")) {
addDouble = true;
if (doubleStarName == null)
doubleStarName = p.getText();
continue;
}
- if (param.startsWith("*")) {
+ if (paramText.startsWith("*")) {
addStar = true;
if (starName == null)
starName = p.getText();
diff --git a/python/src/com/jetbrains/python/inspections/quickfix/AddFieldQuickFix.java b/python/src/com/jetbrains/python/inspections/quickfix/AddFieldQuickFix.java
index e888add..89de355 100644
--- a/python/src/com/jetbrains/python/inspections/quickfix/AddFieldQuickFix.java
+++ b/python/src/com/jetbrains/python/inspections/quickfix/AddFieldQuickFix.java
@@ -66,20 +66,18 @@
@Nullable
public static PsiElement appendToMethod(PyFunction init, Function<String, PyStatement> callback) {
// add this field as the last stmt of the constructor
- final PyStatementList stmt_list = init.getStatementList();
- PyStatement[] stmts = stmt_list.getStatements(); // NOTE: rather wasteful, consider iterable stmt list
- PyStatement last_stmt = null;
- if (stmts.length > 0) last_stmt = stmts[stmts.length-1];
+ final PyStatementList statementList = init.getStatementList();
+ assert statementList != null;
// name of 'self' may be different for fancier styles
PyParameter[] params = init.getParameterList().getParameters();
- String self_name = PyNames.CANONICAL_SELF;
+ String selfName = PyNames.CANONICAL_SELF;
if (params.length > 0) {
- self_name = params[0].getName();
+ selfName = params[0].getName();
}
- PyStatement new_stmt = callback.fun(self_name);
- if (!FileModificationService.getInstance().preparePsiElementForWrite(stmt_list)) return null;
- final PsiElement result = stmt_list.addAfter(new_stmt, last_stmt);
- PyPsiUtils.removeRedundantPass(stmt_list);
+ PyStatement newStmt = callback.fun(selfName);
+ if (!FileModificationService.getInstance().preparePsiElementForWrite(statementList)) return null;
+ final PsiElement result = PyUtil.addElementToStatementList(newStmt, statementList, true);
+ PyPsiUtils.removeRedundantPass(statementList);
return result;
}
diff --git a/python/src/com/jetbrains/python/inspections/quickfix/AddFunctionQuickFix.java b/python/src/com/jetbrains/python/inspections/quickfix/AddFunctionQuickFix.java
index fbd22d7..4d71b42 100644
--- a/python/src/com/jetbrains/python/inspections/quickfix/AddFunctionQuickFix.java
+++ b/python/src/com/jetbrains/python/inspections/quickfix/AddFunctionQuickFix.java
@@ -66,9 +66,7 @@
public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) {
try {
- // descriptor points to the unresolved identifier
- // there can be no name clash, else the name would have resolved, and it hasn't.
- PsiElement problem_elt = descriptor.getPsiElement().getParent(); // id -> ref expr
+ final PsiElement problem_elt = descriptor.getPsiElement();
sure(myPyFile);
sure(FileModificationService.getInstance().preparePsiElementForWrite(myPyFile));
// try to at least match parameter count
diff --git a/python/src/com/jetbrains/python/inspections/quickfix/AddGlobalQuickFix.java b/python/src/com/jetbrains/python/inspections/quickfix/AddGlobalQuickFix.java
index 349a911..9bf3df0 100644
--- a/python/src/com/jetbrains/python/inspections/quickfix/AddGlobalQuickFix.java
+++ b/python/src/com/jetbrains/python/inspections/quickfix/AddGlobalQuickFix.java
@@ -80,6 +80,7 @@
statementList = ((PyFunction)owner).getStatementList();
if (((PyFunction)owner).getDocStringExpression() != null) hasDocString = true;
}
+ assert statementList != null;
PyStatement first = statementList.getStatements()[0];
if (hasDocString)
first = statementList.getStatements()[1];
diff --git a/python/src/com/jetbrains/python/inspections/quickfix/AddMethodQuickFix.java b/python/src/com/jetbrains/python/inspections/quickfix/AddMethodQuickFix.java
index f2246b1..30d9910 100644
--- a/python/src/com/jetbrains/python/inspections/quickfix/AddMethodQuickFix.java
+++ b/python/src/com/jetbrains/python/inspections/quickfix/AddMethodQuickFix.java
@@ -67,9 +67,8 @@
public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) {
try {
- // descriptor points to the unresolved identifier
// there can be no name clash, else the name would have resolved, and it hasn't.
- PsiElement problem_elt = descriptor.getPsiElement().getParent(); // id -> ref expr
+ PsiElement problem_elt = descriptor.getPsiElement();
PyClass cls = myQualifierType.getPyClass();
boolean call_by_class = myQualifierType.isDefinition();
String item_name = myIdentifier;
diff --git a/python/src/com/jetbrains/python/inspections/quickfix/ConvertDictCompQuickFix.java b/python/src/com/jetbrains/python/inspections/quickfix/ConvertDictCompQuickFix.java
index 45f20be..67a2bdd 100644
--- a/python/src/com/jetbrains/python/inspections/quickfix/ConvertDictCompQuickFix.java
+++ b/python/src/com/jetbrains/python/inspections/quickfix/ConvertDictCompQuickFix.java
@@ -52,16 +52,38 @@
}
private static void replaceComprehension(Project project, PyDictCompExpression expression) {
- List<ComprhForComponent> forComponents = expression.getForComponents();
if (expression.getResultExpression() instanceof PyKeyValueExpression) {
- PyKeyValueExpression keyValueExpression = (PyKeyValueExpression)expression.getResultExpression();
- PyElementGenerator elementGenerator = PyElementGenerator.getInstance(project);
+ final PyKeyValueExpression keyValueExpression = (PyKeyValueExpression)expression.getResultExpression();
+ final PyElementGenerator elementGenerator = PyElementGenerator.getInstance(project);
assert keyValueExpression.getValue() != null;
- expression.replace(elementGenerator.createFromText(LanguageLevel.getDefault(), PyExpressionStatement.class,
- "dict([(" + keyValueExpression.getKey().getText() + ", " +
- keyValueExpression.getValue().getText() + ") for " +
- forComponents.get(0).getIteratorVariable().getText() + " in " +
- forComponents.get(0).getIteratedList().getText() + "])"));
+
+ final List<ComprehensionComponent> components = expression.getComponents();
+ final StringBuilder replacement = new StringBuilder("dict([(" + keyValueExpression.getKey().getText() + ", " +
+ keyValueExpression.getValue().getText() + ")");
+ int slashNum = 1;
+ for (ComprehensionComponent component : components) {
+ if (component instanceof ComprhForComponent) {
+ replacement.append("for ");
+ replacement.append(((ComprhForComponent)component).getIteratorVariable().getText());
+ replacement.append(" in ");
+ replacement.append(((ComprhForComponent)component).getIteratedList().getText());
+ replacement.append(" ");
+ }
+ if (component instanceof ComprhIfComponent) {
+ final PyExpression test = ((ComprhIfComponent)component).getTest();
+ if (test != null) {
+ replacement.append("if ");
+ replacement.append(test.getText());
+ replacement.append(" ");
+ }
+ }
+ for (int i = 0; i != slashNum; ++i)
+ replacement.append("\t");
+ ++slashNum;
+ }
+ replacement.append("])");
+
+ expression.replace(elementGenerator.createFromText(LanguageLevel.getDefault(), PyExpressionStatement.class, replacement.toString()));
}
}
diff --git a/python/src/com/jetbrains/python/inspections/quickfix/GenerateBinaryStubsFix.java b/python/src/com/jetbrains/python/inspections/quickfix/GenerateBinaryStubsFix.java
index c6d670c..5dd76ec 100644
--- a/python/src/com/jetbrains/python/inspections/quickfix/GenerateBinaryStubsFix.java
+++ b/python/src/com/jetbrains/python/inspections/quickfix/GenerateBinaryStubsFix.java
@@ -19,7 +19,7 @@
import com.intellij.codeInspection.LocalQuickFix;
import com.intellij.codeInspection.ProblemDescriptor;
import com.intellij.execution.process.ProcessOutput;
-import com.intellij.notification.Notification;
+import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleUtilCore;
import com.intellij.openapi.progress.ProgressIndicator;
@@ -34,10 +34,10 @@
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiReference;
import com.intellij.psi.util.PsiTreeUtil;
+import com.intellij.psi.util.QualifiedName;
import com.intellij.util.Consumer;
import com.jetbrains.python.PythonHelpersLocator;
import com.jetbrains.python.psi.*;
-import com.intellij.psi.util.QualifiedName;
import com.jetbrains.python.psi.impl.references.PyImportReference;
import com.jetbrains.python.sdk.InvalidSdkException;
import com.jetbrains.python.sdk.PySdkUtil;
@@ -58,6 +58,8 @@
* @author yole
*/
public class GenerateBinaryStubsFix implements LocalQuickFix {
+ private static final Logger LOG = Logger.getInstance("#" + GenerateBinaryStubsFix.class.getName());
+
private String myQualifiedName;
private Sdk mySdk;
@@ -119,8 +121,7 @@
}
}
catch (InvalidSdkException e) {
- final Notification notification = PythonSdkType.createInvalidSdkNotification(project);
- notification.notify(project);
+ LOG.error(e);
}
}
};
diff --git a/python/src/com/jetbrains/python/inspections/quickfix/PyRenameUnresolvedRefQuickFix.java b/python/src/com/jetbrains/python/inspections/quickfix/PyRenameUnresolvedRefQuickFix.java
index 4726aaa..ec198aa 100644
--- a/python/src/com/jetbrains/python/inspections/quickfix/PyRenameUnresolvedRefQuickFix.java
+++ b/python/src/com/jetbrains/python/inspections/quickfix/PyRenameUnresolvedRefQuickFix.java
@@ -30,7 +30,6 @@
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiReference;
import com.intellij.psi.ResolveResult;
-import com.intellij.psi.util.PsiTreeUtil;
import com.jetbrains.python.PyBundle;
import com.jetbrains.python.codeInsight.controlflow.ScopeOwner;
import com.jetbrains.python.codeInsight.dataflow.scope.ScopeUtil;
@@ -65,8 +64,10 @@
@Override
public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) {
final PsiElement element = descriptor.getPsiElement();
- final PyReferenceExpression referenceExpression = PsiTreeUtil.getParentOfType(element, PyReferenceExpression.class);
- if (referenceExpression == null) return;
+ if (!(element instanceof PyReferenceExpression)) {
+ return;
+ }
+ final PyReferenceExpression referenceExpression = (PyReferenceExpression)element;
ScopeOwner parentScope = ScopeUtil.getScopeOwner(referenceExpression);
if (parentScope == null) return;
diff --git a/python/src/com/jetbrains/python/inspections/quickfix/StatementEffectDocstringQuickFix.java b/python/src/com/jetbrains/python/inspections/quickfix/StatementEffectDocstringQuickFix.java
deleted file mode 100644
index fa944a9..0000000
--- a/python/src/com/jetbrains/python/inspections/quickfix/StatementEffectDocstringQuickFix.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright 2000-2013 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.jetbrains.python.inspections.quickfix;
-
-import com.intellij.codeInspection.LocalQuickFix;
-import com.intellij.codeInspection.ProblemDescriptor;
-import com.intellij.openapi.project.Project;
-import com.intellij.psi.PsiElement;
-import com.intellij.psi.util.PsiTreeUtil;
-import com.jetbrains.python.PyBundle;
-import com.jetbrains.python.psi.*;
-import org.jetbrains.annotations.NotNull;
-
-/**
- * User: catherine
- *
- * QuickFix to move misplaced docstring
- */
-public class StatementEffectDocstringQuickFix implements LocalQuickFix {
- @NotNull
- public String getName() {
- return PyBundle.message("QFIX.statement.effect.move.docstring");
- }
-
- @NotNull
- public String getFamilyName() {
- return getName();
- }
-
- public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) {
- PsiElement expression = descriptor.getPsiElement();
- if (expression instanceof PyStringLiteralExpression) {
- PyStatement st = PsiTreeUtil.getParentOfType(expression, PyStatement.class);
- if (st != null) {
- PyDocStringOwner parent = PsiTreeUtil.getParentOfType(expression, PyDocStringOwner.class);
-
- if (parent instanceof PyClass || parent instanceof PyFunction) {
- PyStatementList statementList = PsiTreeUtil.findChildOfType(parent, PyStatementList.class);
- if (statementList != null) {
- PyStatement[] statements = statementList.getStatements();
- if (statements.length > 0) {
- statementList.addBefore(st, statements[0]);
- st.delete();
- }
- }
- }
- }
- }
- }
-
-}
diff --git a/python/src/com/jetbrains/python/lexer/PyStringLiteralLexer.java b/python/src/com/jetbrains/python/lexer/PyStringLiteralLexer.java
index 10c8c9b..4ed6435 100644
--- a/python/src/com/jetbrains/python/lexer/PyStringLiteralLexer.java
+++ b/python/src/com/jetbrains/python/lexer/PyStringLiteralLexer.java
@@ -57,7 +57,6 @@
*/
public PyStringLiteralLexer(final IElementType originalLiteralToken) {
myOriginalLiteralToken = originalLiteralToken;
- myIsTriple = PyTokenTypes.TRIPLE_NODES.contains(myOriginalLiteralToken);
}
public void start(@NotNull CharSequence buffer, int startOffset, int endOffset, int initialState) {
@@ -85,6 +84,8 @@
assert (c == '"') || (c == '\'') : "String must be quoted by single or double quote. Found '" + c + "' in string " + buffer;
myQuoteChar = c;
+ myIsTriple = (buffer.length() > i + 2) && (buffer.charAt(i + 1) == c) && (buffer.charAt(i + 2) == c);
+
// calculate myEnd at last
myEnd = locateToken(myStart);
}
diff --git a/python/src/com/jetbrains/python/lexer/PythonEditorHighlighter.java b/python/src/com/jetbrains/python/lexer/PythonEditorHighlighter.java
index d0e3de6..9893d4f 100644
--- a/python/src/com/jetbrains/python/lexer/PythonEditorHighlighter.java
+++ b/python/src/com/jetbrains/python/lexer/PythonEditorHighlighter.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -80,7 +80,7 @@
}
@Override
- public void setEditor(HighlighterClient editor) {
+ public void setEditor(@NotNull HighlighterClient editor) {
Lexer l = getLexer();
if (l instanceof LayeredLexer) {
editor.getDocument().putUserData(KEY, editor.getDocument().getText().indexOf(PyNames.UNICODE_LITERALS) == -1);
diff --git a/python/src/com/jetbrains/python/lexer/PythonIndentingProcessor.java b/python/src/com/jetbrains/python/lexer/PythonIndentingProcessor.java
index 546724f..29fb657 100644
--- a/python/src/com/jetbrains/python/lexer/PythonIndentingProcessor.java
+++ b/python/src/com/jetbrains/python/lexer/PythonIndentingProcessor.java
@@ -194,9 +194,6 @@
if (DUMP_TOKENS) {
System.out.println("\n--- LEXER START---");
}
- if (startOffset != 0 || initialState != 0) {
- throw new RuntimeException("Indenting lexer does not support incremental lexing");
- }
}
private void setStartState() {
diff --git a/python/src/com/jetbrains/python/packaging/PyPackageManagerImpl.java b/python/src/com/jetbrains/python/packaging/PyPackageManagerImpl.java
index fecce4f..82a5fd9 100644
--- a/python/src/com/jetbrains/python/packaging/PyPackageManagerImpl.java
+++ b/python/src/com/jetbrains/python/packaging/PyPackageManagerImpl.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -50,7 +50,7 @@
import com.intellij.openapi.vfs.newvfs.BulkFileListener;
import com.intellij.openapi.vfs.newvfs.events.VFileEvent;
import com.intellij.remotesdk.RemoteFile;
-import com.intellij.remotesdk.RemoteSdkData;
+import com.intellij.remotesdk.RemoteSdkCredentials;
import com.intellij.util.ArrayUtil;
import com.intellij.util.Function;
import com.intellij.util.SystemProperties;
@@ -261,7 +261,7 @@
}
}, ModalityState.current());
}
- if (warning[0] != 0) return true;
+ if (warning[0] != Messages.YES) return true;
}
catch (PyExternalProcessException e) {
LOG.info("Error loading packages dependents: " + e.getMessage(), e);
@@ -752,10 +752,10 @@
private String getHelperPath(String helper) {
String helperPath;
final SdkAdditionalData sdkData = mySdk.getSdkAdditionalData();
- if (sdkData instanceof RemoteSdkData) {
- final RemoteSdkData remoteSdkData = (RemoteSdkData)sdkData;
- if (!StringUtil.isEmpty(remoteSdkData.getHelpersPath())) {
- helperPath = new RemoteFile(remoteSdkData.getHelpersPath(),
+ if (sdkData instanceof RemoteSdkCredentials) {
+ final RemoteSdkCredentials remoteSdkCredentials = (RemoteSdkCredentials)sdkData;
+ if (!StringUtil.isEmpty(remoteSdkCredentials.getHelpersPath())) {
+ helperPath = new RemoteFile(remoteSdkCredentials.getHelpersPath(),
helper).getPath();
}
else {
@@ -778,8 +778,8 @@
if (homePath == null) {
throw new PyExternalProcessException(ERROR_INVALID_SDK, helperPath, args, "Cannot find interpreter for SDK");
}
- if (sdkData instanceof RemoteSdkData) { //remote interpreter
- final RemoteSdkData remoteSdkData = (RemoteSdkData)sdkData;
+ if (sdkData instanceof RemoteSdkCredentials) { //remote interpreter
+ final RemoteSdkCredentials remoteSdkCredentials = (RemoteSdkCredentials)sdkData;
final PythonRemoteInterpreterManager manager = PythonRemoteInterpreterManager.getInstance();
if (manager != null) {
final List<String> cmdline = new ArrayList<String>();
@@ -793,11 +793,11 @@
}));
try {
if (askForSudo) {
- askForSudo = !manager.ensureCanWrite(null, remoteSdkData, remoteSdkData.getInterpreterPath());
+ askForSudo = !manager.ensureCanWrite(null, remoteSdkCredentials, remoteSdkCredentials.getInterpreterPath());
}
ProcessOutput processOutput;
do {
- processOutput = manager.runRemoteProcess(null, remoteSdkData, ArrayUtil.toStringArray(cmdline), workingDir, askForSudo);
+ processOutput = manager.runRemoteProcess(null, remoteSdkCredentials, ArrayUtil.toStringArray(cmdline), workingDir, askForSudo);
if (askForSudo && processOutput.getStderr().contains("sudo: 3 incorrect password attempts")) {
continue;
}
diff --git a/python/src/com/jetbrains/python/packaging/ui/PyInstalledPackagesPanel.java b/python/src/com/jetbrains/python/packaging/ui/PyInstalledPackagesPanel.java
index 3f30b1d..d894786 100644
--- a/python/src/com/jetbrains/python/packaging/ui/PyInstalledPackagesPanel.java
+++ b/python/src/com/jetbrains/python/packaging/ui/PyInstalledPackagesPanel.java
@@ -34,6 +34,7 @@
import com.jetbrains.python.sdk.flavors.PythonSdkFlavor;
import org.jetbrains.annotations.NotNull;
+import java.awt.*;
import java.util.List;
import java.util.Set;
@@ -50,6 +51,7 @@
public PyInstalledPackagesPanel(Project project, PackagesNotificationPanel area) {
super(project, area);
+ setPreferredSize(new Dimension(500, 500));
myNotificationArea.addLinkHandler(INSTALL_SETUPTOOLS, new Runnable() {
@Override
diff --git a/python/src/com/jetbrains/python/parsing/ExpressionParsing.java b/python/src/com/jetbrains/python/parsing/ExpressionParsing.java
index 65c791a..790b155 100644
--- a/python/src/com/jetbrains/python/parsing/ExpressionParsing.java
+++ b/python/src/com/jetbrains/python/parsing/ExpressionParsing.java
@@ -236,7 +236,7 @@
break;
}
}
- myBuilder.advanceLexer();
+ checkMatches(PyTokenTypes.RBRACE, message("PARSE.expected.rbrace"));
startMarker.done(PyElementTypes.DICT_LITERAL_EXPRESSION);
}
}
@@ -264,7 +264,7 @@
break;
}
}
- myBuilder.advanceLexer();
+ checkMatches(PyTokenTypes.RBRACE, message("PARSE.expected.rbrace"));
startMarker.done(PyElementTypes.SET_LITERAL_EXPRESSION);
}
diff --git a/python/src/com/jetbrains/python/parsing/FollowingCommentBinder.java b/python/src/com/jetbrains/python/parsing/FollowingCommentBinder.java
index 0df9269..6133be9 100644
--- a/python/src/com/jetbrains/python/parsing/FollowingCommentBinder.java
+++ b/python/src/com/jetbrains/python/parsing/FollowingCommentBinder.java
@@ -29,6 +29,7 @@
@Override
public int getEdgePosition(List<IElementType> tokens, boolean atStreamEdge, TokenTextGetter getter) {
+ if (tokens.size() <= 1) return 0;
int pos = 0;
// TODO[yole] handle more cases?
while (pos < tokens.size() && tokens.get(pos) == PyTokenTypes.LINE_BREAK) {
diff --git a/python/src/com/jetbrains/python/parsing/FunctionParsing.java b/python/src/com/jetbrains/python/parsing/FunctionParsing.java
index 768fa0a..3fb67a8 100644
--- a/python/src/com/jetbrains/python/parsing/FunctionParsing.java
+++ b/python/src/com/jetbrains/python/parsing/FunctionParsing.java
@@ -16,6 +16,7 @@
package com.jetbrains.python.parsing;
import com.intellij.lang.PsiBuilder;
+import com.intellij.lang.WhitespacesBinders;
import com.intellij.psi.tree.IElementType;
import com.jetbrains.python.PyElementTypes;
import com.jetbrains.python.PyTokenTypes;
@@ -44,7 +45,7 @@
protected void parseFunctionInnards(PsiBuilder.Marker functionMarker) {
myBuilder.advanceLexer();
- checkMatchesOrSkip(PyTokenTypes.IDENTIFIER, message("PARSE.expected.func.name"));
+ parseIdentifierOrSkip();
parseParameterList();
parseReturnTypeAnnotation();
checkMatches(PyTokenTypes.COLON, message("PARSE.expected.colon"));
@@ -81,7 +82,7 @@
}
else { // empty arglist node, so we always have it
PsiBuilder.Marker argListMarker = myBuilder.mark();
- argListMarker.setCustomEdgeTokenBinders(LeftBiasedWhitespaceBinder.INSTANCE, null);
+ argListMarker.setCustomEdgeTokenBinders(WhitespacesBinders.GREEDY_LEFT_BINDER, null);
argListMarker.done(PyElementTypes.ARGUMENT_LIST);
}
if (atToken(PyTokenTypes.STATEMENT_BREAK)) {
@@ -110,6 +111,7 @@
myBuilder.error(message("PARSE.expected.@.or.def"));
PsiBuilder.Marker parameterList = myBuilder.mark(); // To have non-empty parameters list at all the time.
parameterList.done(PyElementTypes.PARAMETER_LIST);
+ myBuilder.mark().done(PyElementTypes.STATEMENT_LIST); // To have non-empty empty statement list
endMarker.done(getFunctionType());
}
}
diff --git a/python/src/com/jetbrains/python/parsing/LeadingCommentsBinder.java b/python/src/com/jetbrains/python/parsing/LeadingCommentsBinder.java
new file mode 100644
index 0000000..dde4c7a
--- /dev/null
+++ b/python/src/com/jetbrains/python/parsing/LeadingCommentsBinder.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2000-2013 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.parsing;
+
+import com.intellij.lang.WhitespacesAndCommentsBinder;
+import com.intellij.psi.tree.IElementType;
+import com.jetbrains.python.PyTokenTypes;
+
+import java.util.List;
+
+/**
+ * @author yole
+ */
+public class LeadingCommentsBinder implements WhitespacesAndCommentsBinder {
+ public static final LeadingCommentsBinder INSTANCE = new LeadingCommentsBinder();
+
+ @Override
+ public int getEdgePosition(List<IElementType> tokens, boolean atStreamEdge, TokenTextGetter getter) {
+ if (tokens.size() > 1) {
+ boolean seenLF = false;
+ for (int i = 0; i < tokens.size(); i++) {
+ IElementType token = tokens.get(i);
+ if (token == PyTokenTypes.LINE_BREAK) {
+ seenLF = true;
+ }
+ else if (token == PyTokenTypes.END_OF_LINE_COMMENT && seenLF) {
+ return i;
+ }
+ }
+ }
+ return tokens.size();
+ }
+}
diff --git a/python/src/com/jetbrains/python/parsing/LeftBiasedWhitespaceBinder.java b/python/src/com/jetbrains/python/parsing/LeftBiasedWhitespaceBinder.java
deleted file mode 100644
index 38bd079..0000000
--- a/python/src/com/jetbrains/python/parsing/LeftBiasedWhitespaceBinder.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright 2000-2013 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.jetbrains.python.parsing;
-
-import com.intellij.lang.WhitespacesAndCommentsBinder;
-import com.intellij.psi.tree.IElementType;
-
-import java.util.List;
-
-/**
- * @author yole
- */
-public class LeftBiasedWhitespaceBinder implements WhitespacesAndCommentsBinder {
- public static LeftBiasedWhitespaceBinder INSTANCE = new LeftBiasedWhitespaceBinder();
-
- @Override
- public int getEdgePosition(List<IElementType> tokens, boolean atStreamEdge, TokenTextGetter getter) {
- return 0;
- }
-}
diff --git a/python/src/com/jetbrains/python/parsing/Parsing.java b/python/src/com/jetbrains/python/parsing/Parsing.java
index 99eab6f..5550589 100644
--- a/python/src/com/jetbrains/python/parsing/Parsing.java
+++ b/python/src/com/jetbrains/python/parsing/Parsing.java
@@ -18,7 +18,9 @@
import com.intellij.lang.PsiBuilder;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.psi.tree.IElementType;
+import com.jetbrains.python.PyBundle;
import com.jetbrains.python.PyElementTypes;
+import com.jetbrains.python.PyTokenTypes;
import com.jetbrains.python.psi.PyElementType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -61,15 +63,19 @@
return false;
}
- protected boolean checkMatchesOrSkip(final IElementType token, final String message) {
- if (myBuilder.getTokenType() == token) {
+ protected boolean parseIdentifierOrSkip() {
+ if (myBuilder.getTokenType() == PyTokenTypes.IDENTIFIER) {
myBuilder.advanceLexer();
return true;
}
- PsiBuilder.Marker mark = myBuilder.mark();
- myBuilder.advanceLexer();
- mark.error(message);
- return false;
+ else {
+ final PsiBuilder.Marker nameExpected = myBuilder.mark();
+ if (myBuilder.getTokenType() != PyTokenTypes.STATEMENT_BREAK) {
+ myBuilder.advanceLexer();
+ }
+ nameExpected.error(PyBundle.message("PARSE.expected.identifier"));
+ return false;
+ }
}
protected void assertCurrentToken(final PyElementType tokenType) {
@@ -95,7 +101,7 @@
protected boolean matchToken(final IElementType tokenType) {
if (myBuilder.getTokenType() == tokenType) {
myBuilder.advanceLexer();
- return true;
+ return true;
}
return false;
}
diff --git a/python/src/com/jetbrains/python/parsing/StatementParsing.java b/python/src/com/jetbrains/python/parsing/StatementParsing.java
index 518caa7..9c5a9d8 100644
--- a/python/src/com/jetbrains/python/parsing/StatementParsing.java
+++ b/python/src/com/jetbrains/python/parsing/StatementParsing.java
@@ -631,6 +631,10 @@
myBuilder.advanceLexer();
return true;
}
+ else if (myBuilder.getTokenType() == PyTokenTypes.STATEMENT_BREAK) {
+ myBuilder.error("Colon expected");
+ return true;
+ }
final PsiBuilder.Marker marker = myBuilder.mark();
while (!atAnyOfTokens(null, PyTokenTypes.DEDENT, PyTokenTypes.STATEMENT_BREAK, PyTokenTypes.COLON)) {
myBuilder.advanceLexer();
@@ -767,7 +771,7 @@
if (myBuilder.getTokenType() == PyTokenTypes.AS_KEYWORD) {
myBuilder.advanceLexer();
if (!getExpressionParser().parseSingleExpression(true)) {
- myBuilder.error("identifier expected");
+ myBuilder.error("Identifier expected");
// 'as' is followed by a target
}
}
@@ -788,7 +792,7 @@
public void parseClassDeclaration(PsiBuilder.Marker classMarker, ParsingScope scope) {
assertCurrentToken(PyTokenTypes.CLASS_KEYWORD);
myBuilder.advanceLexer();
- checkMatchesOrSkip(PyTokenTypes.IDENTIFIER, IDENTIFIER_EXPECTED);
+ parseIdentifierOrSkip();
if (myBuilder.getTokenType() == PyTokenTypes.LPAR) {
getExpressionParser().parseArgumentList();
}
@@ -809,10 +813,8 @@
myBuilder.advanceLexer();
final PsiBuilder.Marker marker = myBuilder.mark();
- if (myBuilder.getTokenType() != PyTokenTypes.INDENT) {
- myBuilder.error("Indent expected");
- }
- else {
+ final boolean indentFound = myBuilder.getTokenType() == PyTokenTypes.INDENT;
+ if (indentFound) {
myBuilder.advanceLexer();
if (myBuilder.eof()) {
myBuilder.error("Indented block expected");
@@ -823,13 +825,16 @@
}
}
}
+ else {
+ myBuilder.error("Indent expected");
+ }
marker.done(PyElementTypes.STATEMENT_LIST);
- marker.setCustomEdgeTokenBinders(null, FollowingCommentBinder.INSTANCE);
+ marker.setCustomEdgeTokenBinders(LeadingCommentsBinder.INSTANCE, FollowingCommentBinder.INSTANCE);
if (endMarker != null) {
endMarker.done(elType);
}
- if (!myBuilder.eof()) {
+ if (indentFound && !myBuilder.eof()) {
checkMatches(PyTokenTypes.DEDENT, "Dedent expected");
}
// NOTE: the following line advances the PsiBuilder lexer and thus
diff --git a/python/src/com/jetbrains/python/patterns/PythonPatterns.java b/python/src/com/jetbrains/python/patterns/PythonPatterns.java
index f4ce5e7..1ce1d75 100644
--- a/python/src/com/jetbrains/python/patterns/PythonPatterns.java
+++ b/python/src/com/jetbrains/python/patterns/PythonPatterns.java
@@ -22,11 +22,14 @@
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.ProcessingContext;
import com.jetbrains.python.codeInsight.controlflow.ScopeOwner;
+import com.jetbrains.python.documentation.DocStringUtil;
import com.jetbrains.python.psi.*;
import com.jetbrains.python.psi.resolve.PyResolveContext;
import com.jetbrains.python.psi.types.TypeEvalContext;
import org.jetbrains.annotations.Nullable;
+import java.util.regex.Pattern;
+
/**
* @author yole
*/
@@ -39,6 +42,23 @@
});
}
+ public static PyElementPattern.Capture<PyStringLiteralExpression> pyStringLiteralMatches(final String regexp) {
+ final Pattern pattern = Pattern.compile(regexp, Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
+ return new PyElementPattern.Capture<PyStringLiteralExpression>(new InitialPatternCondition<PyStringLiteralExpression>(PyStringLiteralExpression.class) {
+ @Override
+ public boolean accepts(@Nullable Object o, ProcessingContext context) {
+ if (o instanceof PyStringLiteralExpression) {
+ final PyStringLiteralExpression expr = (PyStringLiteralExpression)o;
+ if (!DocStringUtil.isDocStringExpression(expr)) {
+ final String value = expr.getStringValue();
+ return pattern.matcher(value).matches();
+ }
+ }
+ return false;
+ }
+ });
+ }
+
public static PyElementPattern.Capture<PyExpression> pyArgument(final String functionName, final int index) {
return new PyElementPattern.Capture<PyExpression>(new InitialPatternCondition<PyExpression>(PyExpression.class) {
public boolean accepts(@Nullable final Object o, final ProcessingContext context) {
diff --git a/python/src/com/jetbrains/python/projectView/PyTreeStructureProvider.java b/python/src/com/jetbrains/python/projectView/PyTreeStructureProvider.java
index ae923ed..cb9e257 100644
--- a/python/src/com/jetbrains/python/projectView/PyTreeStructureProvider.java
+++ b/python/src/com/jetbrains/python/projectView/PyTreeStructureProvider.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -32,6 +32,7 @@
import com.jetbrains.python.psi.PyFile;
import com.jetbrains.python.psi.PyFunction;
import com.jetbrains.python.sdk.PythonSdkType;
+import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Collection;
@@ -41,8 +42,9 @@
* @author yole
*/
public class PyTreeStructureProvider implements SelectableTreeStructureProvider, DumbAware {
+ @NotNull
@Override
- public Collection<AbstractTreeNode> modify(AbstractTreeNode parent, Collection<AbstractTreeNode> children, ViewSettings settings) {
+ public Collection<AbstractTreeNode> modify(@NotNull AbstractTreeNode parent, @NotNull Collection<AbstractTreeNode> children, ViewSettings settings) {
if (parent instanceof NamedLibraryElementNode) {
return hideSkeletons((NamedLibraryElementNode)parent, children);
}
diff --git a/python/src/com/jetbrains/python/psi/PyFileElementType.java b/python/src/com/jetbrains/python/psi/PyFileElementType.java
index 07d87c9..150745e 100644
--- a/python/src/com/jetbrains/python/psi/PyFileElementType.java
+++ b/python/src/com/jetbrains/python/psi/PyFileElementType.java
@@ -63,7 +63,7 @@
@Override
public int getStubVersion() {
// Don't forget to update versions of indexes that use the updated stub-based elements
- return 48;
+ return 49;
}
@Nullable
diff --git a/python/src/com/jetbrains/python/psi/PyUtil.java b/python/src/com/jetbrains/python/psi/PyUtil.java
index e939857..83036ee 100644
--- a/python/src/com/jetbrains/python/psi/PyUtil.java
+++ b/python/src/com/jetbrains/python/psi/PyUtil.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,6 +15,7 @@
*/
package com.jetbrains.python.psi;
+import com.google.common.collect.Collections2;
import com.google.common.collect.Maps;
import com.intellij.codeInsight.FileModificationService;
import com.intellij.codeInsight.completion.PrioritizedLookupElement;
@@ -44,13 +45,14 @@
import com.intellij.psi.stubs.StubElement;
import com.intellij.psi.tree.TokenSet;
import com.intellij.psi.util.PsiTreeUtil;
+import com.intellij.psi.util.QualifiedName;
import com.intellij.ui.awt.RelativePoint;
import com.intellij.util.ArrayUtil;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.PlatformIcons;
import com.intellij.util.SmartList;
import com.intellij.util.containers.ContainerUtil;
-import com.intellij.util.containers.HashSet;
+import com.jetbrains.NotNullPredicate;
import com.jetbrains.python.PyBundle;
import com.jetbrains.python.PyNames;
import com.jetbrains.python.PyTokenTypes;
@@ -60,11 +62,10 @@
import com.jetbrains.python.codeInsight.stdlib.PyNamedTupleType;
import com.jetbrains.python.psi.impl.PyBuiltinCache;
import com.jetbrains.python.psi.impl.PyPsiUtils;
-import com.intellij.psi.util.QualifiedName;
-import com.jetbrains.python.psi.resolve.PyResolveContext;
-import com.jetbrains.python.psi.resolve.QualifiedResolveResult;
import com.jetbrains.python.psi.types.*;
+import com.jetbrains.python.refactoring.classes.PyDependenciesComparator;
import com.jetbrains.python.refactoring.classes.extractSuperclass.PyExtractSuperclassHelper;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -106,21 +107,6 @@
return node != null && node.getElementType().equals(TokenType.WHITE_SPACE);
}
-
- @NotNull
- public static Set<PsiElement> getComments(PsiElement start) {
- final Set<PsiElement> comments = new HashSet<PsiElement>();
- PsiElement seeker = start.getPrevSibling();
- if (seeker == null) seeker = start.getParent().getPrevSibling();
- while (seeker instanceof PsiWhiteSpace || seeker instanceof PsiComment) {
- if (seeker instanceof PsiComment) {
- comments.add(seeker);
- }
- seeker = seeker.getPrevSibling();
- }
- return comments;
- }
-
@Nullable
public static PsiElement getFirstNonCommentAfter(PsiElement start) {
PsiElement seeker = start;
@@ -415,7 +401,7 @@
PyExpression qualifier = ref.getQualifier();
if (qualifier != null) {
String attr_name = ref.getReferencedName();
- if (PyNames.CLASS.equals(attr_name)) {
+ if (PyNames.__CLASS__.equals(attr_name)) {
PyType qualifierType = context.getType(qualifier);
if (qualifierType instanceof PyClassType) {
return new PyClassTypeImpl(((PyClassType)qualifierType).getPyClass(), true); // always as class, never instance
@@ -700,14 +686,11 @@
return false;
}
for (PyDecorator decorator : decoratorList.getDecorators()) {
- final PyExpression callee = decorator.getCallee();
- if (callee instanceof PyReferenceExpression) {
- final PsiReference reference = callee.getReference();
- if (reference == null) continue;
- final PsiElement resolved = reference.resolve();
- if (resolved instanceof PyQualifiedNameOwner) {
- final String name = ((PyQualifiedNameOwner)resolved).getQualifiedName();
- return PyNames.ABSTRACTMETHOD.equals(name) || PyNames.ABSTRACTPROPERTY.equals(name);
+ final QualifiedName qualifiedName = decorator.getQualifiedName();
+ if (qualifiedName != null) {
+ final String name = qualifiedName.toString();
+ if (name.endsWith(PyNames.ABSTRACTMETHOD) || name.endsWith(PyNames.ABSTRACTPROPERTY)) {
+ return true;
}
}
}
@@ -718,6 +701,38 @@
return PyElementGenerator.getInstance(element.getProject()).createNameIdentifier(name, LanguageLevel.forElement(element));
}
+ /**
+ * Finds element declaration by resolving its references top the top but not further than file (to prevent unstubing)
+ * @param element element to resolve
+ * @return its declaration
+ */
+ @NotNull
+ public static PsiElement resolveToTheTop(@NotNull final PsiElement elementToResolve) {
+ PsiElement currentElement = elementToResolve;
+ while (true) {
+ final PsiReference reference = currentElement.getReference();
+ if (reference == null) {
+ break;
+ }
+ final PsiElement resolve = reference.resolve();
+ if ((resolve == null) || resolve.equals(currentElement) || !inSameFile(resolve, currentElement)) {
+ break;
+ }
+ currentElement = resolve;
+ }
+ return currentElement;
+ }
+
+ /**
+ * Gets class init method
+ * @param pyClass class where to find init
+ * @return class init method if any
+ */
+ @Nullable
+ public static PyFunction getInitMethod(@NotNull final PyClass pyClass) {
+ return pyClass.findMethodByName(PyNames.INIT, false);
+ }
+
public static class KnownDecoratorProviderHolder {
public static PyKnownDecoratorProvider[] KNOWN_DECORATOR_PROVIDERS = Extensions.getExtensions(PyKnownDecoratorProvider.EP_NAME);
@@ -920,6 +935,10 @@
return selfName;
}
+ /**
+ *
+ * @return Source roots <strong>and</strong> content roots for element's project
+ */
@NotNull
public static Collection<VirtualFile> getSourceRoots(@NotNull PsiElement foothold) {
final Module module = ModuleUtilCore.findModuleForPsiElement(foothold);
@@ -929,6 +948,10 @@
return Collections.emptyList();
}
+ /**
+ *
+ * @return Source roots <strong>and</strong> content roots for module
+ */
@NotNull
public static Collection<VirtualFile> getSourceRoots(@NotNull Module module) {
final Set<VirtualFile> result = new LinkedHashSet<VirtualFile>();
@@ -1097,6 +1120,11 @@
}
return null;
}
+
+ //TODO: Doc
+ public boolean isInstanceMethod() {
+ return ! (myIsClassMethod || myIsStaticMethod);
+ }
}
public static boolean isSuperCall(@NotNull PyCallExpression node) {
@@ -1114,7 +1142,7 @@
PyExpression[] args = node.getArguments();
if (args.length > 0) {
String firstArg = args[0].getText();
- if (firstArg.equals(klass.getName()) || firstArg.equals(PyNames.CANONICAL_SELF + "." + PyNames.CLASS)) {
+ if (firstArg.equals(klass.getName()) || firstArg.equals(PyNames.CANONICAL_SELF + "." + PyNames.__CLASS__)) {
return true;
}
for (PyClass s : klass.getAncestorClasses()) {
@@ -1204,49 +1232,6 @@
}
@Nullable
- public static PyClass getMetaClass(@NotNull final PyClass pyClass) {
- final PyTargetExpression metaClassAttribute = pyClass.findClassAttribute(PyNames.DUNDER_METACLASS, false);
- if (metaClassAttribute != null) {
- final PyExpression expression = metaClassAttribute.findAssignedValue();
- final PyClass metaclass = getMetaFromExpression(expression);
- if (metaclass != null) return metaclass;
- }
- final PsiFile containingFile = pyClass.getContainingFile();
- if (containingFile instanceof PyFile) {
- final PsiElement element = ((PyFile)containingFile).getElementNamed(PyNames.DUNDER_METACLASS);
- if (element instanceof PyTargetExpression) {
- final PyExpression expression = ((PyTargetExpression)element).findAssignedValue();
- final PyClass metaclass = getMetaFromExpression(expression);
- if (metaclass != null) return metaclass;
- }
- }
-
- if (LanguageLevel.forElement(pyClass).isPy3K()) {
- final PyExpression[] superClassExpressions = pyClass.getSuperClassExpressions();
- for (PyExpression superClassExpression : superClassExpressions) {
- if (superClassExpression instanceof PyKeywordArgument &&
- PyNames.METACLASS.equals(((PyKeywordArgument)superClassExpression).getKeyword())) {
- final PyExpression expression = ((PyKeywordArgument)superClassExpression).getValueExpression();
- final PyClass metaclass = getMetaFromExpression(expression);
- if (metaclass != null) return metaclass;
- }
- }
- }
- return null;
- }
-
- @Nullable
- private static PyClass getMetaFromExpression(final PyExpression metaclass) {
- if (metaclass instanceof PyReferenceExpression) {
- final QualifiedResolveResult result = ((PyReferenceExpression)metaclass).followAssignmentsChain(PyResolveContext.noImplicits());
- if (result.getElement() instanceof PyClass) {
- return (PyClass)result.getElement();
- }
- }
- return null;
- }
-
- @Nullable
public static PsiElement findPrevAtOffset(PsiFile psiFile, int caretOffset, Class ... toSkip) {
PsiElement element = psiFile.findElementAt(caretOffset);
if (element == null || caretOffset < 0) {
@@ -1301,6 +1286,36 @@
return instanceOf(element, toSkip) ? null : element;
}
+ /**
+ * Adds element to statement list to the correct place according to its dependencies.
+ * @param element to insert
+ * @param statementList where element should be inserted
+ * @return inserted element
+ */
+ public static <T extends PyElement>T addElementToStatementList(@NotNull final T element,
+ @NotNull final PyStatementList statementList) {
+ PsiElement before = null;
+ PsiElement after = null;
+ for (final PyStatement statement : statementList.getStatements()) {
+ if (PyDependenciesComparator.depends(element, statement)) {
+ after = statement;
+ }else if (PyDependenciesComparator.depends(statement, element)) {
+ before = statement;
+ }
+ }
+ final PsiElement result;
+ if (after != null) {
+
+ result = statementList.addAfter(element, after);
+ }else if (before != null) {
+ result = statementList.addBefore(element, before);
+ } else {
+ result = addElementToStatementList(element, statementList, true);
+ }
+ @SuppressWarnings("unchecked") // Inserted element can't have different type
+ final T resultCasted = (T)result;
+ return resultCasted;
+ }
public static PsiElement addElementToStatementList(@NotNull PsiElement element,
@NotNull PyStatementList statementList,
@@ -1313,13 +1328,31 @@
final PyStatement[] statements = statementList.getStatements();
if (toTheBeginning && statements.length > 0) {
final PyDocStringOwner docStringOwner = PsiTreeUtil.getParentOfType(statementList, PyDocStringOwner.class);
- final PyStatement firstStatement = statements[0];
- if (docStringOwner != null && firstStatement instanceof PyExpressionStatement &&
- ((PyExpressionStatement)firstStatement).getExpression() == docStringOwner.getDocStringExpression()) {
- element = statementList.addAfter(element, firstStatement);
+ PyStatement anchor = statements[0];
+ if (docStringOwner != null && anchor instanceof PyExpressionStatement &&
+ ((PyExpressionStatement)anchor).getExpression() == docStringOwner.getDocStringExpression()) {
+ final PyStatement next = PsiTreeUtil.getNextSiblingOfType(anchor, PyStatement.class);
+ if (next == null) {
+ return statementList.addAfter(element, anchor);
+ }
+ anchor = next;
}
- else
- element = statementList.addBefore(element, firstStatement);
+ while (anchor instanceof PyExpressionStatement) {
+ final PyExpression expression = ((PyExpressionStatement)anchor).getExpression();
+ if (expression instanceof PyCallExpression) {
+ final PyExpression callee = ((PyCallExpression)expression).getCallee();
+ if ((isSuperCall((PyCallExpression)expression) || (callee != null && PyNames.INIT.equals(callee.getName())))) {
+ final PyStatement next = PsiTreeUtil.getNextSiblingOfType(anchor, PyStatement.class);
+ if (next == null) {
+ return statementList.addAfter(element, anchor);
+ }
+ anchor = next;
+ }
+ else break;
+ }
+ else break;
+ }
+ element = statementList.addBefore(element, anchor);
}
else {
element = statementList.add(element);
@@ -1378,7 +1411,7 @@
private static int optionalParametersCount(@NotNull List<PyParameter> parameters) {
int n = 0;
for (PyParameter parameter : parameters) {
- if (parameter.getDefaultValue() != null) {
+ if (parameter.hasDefaultValue()) {
n++;
}
}
@@ -1428,4 +1461,57 @@
}
return false;
}
+
+ public static boolean isInit(@NotNull final PyFunction function) {
+ return PyNames.INIT.equals(function.getName());
+ }
+
+
+ private static boolean isObject(@NotNull final PyMemberInfo<PyElement> classMemberInfo) {
+ final PyElement element = classMemberInfo.getMember();
+ if ((element instanceof PyClass) && PyNames.OBJECT.equals(element.getName())) {
+ return true;
+ }
+ return false;
+
+ }
+
+ /**
+ * Filters out {@link com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo}
+ * that should not be displayed in this refactoring (like object)
+ *
+ * @param pyMemberInfos collection to sort
+ * @return sorted collection
+ */
+ @NotNull
+ public static Collection<PyMemberInfo<PyElement>> filterOutObject(@NotNull final Collection<PyMemberInfo<PyElement>> pyMemberInfos) {
+ return Collections2.filter(pyMemberInfos, new ObjectPredicate(false));
+ }
+
+ /**
+ * Filters only pyclass object (new class)
+ */
+ public static class ObjectPredicate extends NotNullPredicate<PyMemberInfo<PyElement>> {
+ private final boolean myAllowObjects;
+
+ /**
+ * @param allowObjects allows only objects if true. Allows all but objects otherwise.
+ */
+ public ObjectPredicate(final boolean allowObjects) {
+ myAllowObjects = allowObjects;
+ }
+
+ @Override
+ public boolean applyNotNull(@NotNull final PyMemberInfo<PyElement> input) {
+ return myAllowObjects == isObject(input);
+ }
+
+ private static boolean isObject(@NotNull final PyMemberInfo<PyElement> classMemberInfo) {
+ final PyElement element = classMemberInfo.getMember();
+ if ((element instanceof PyClass) && PyNames.OBJECT.equals(element.getName())) {
+ return true;
+ }
+ return false;
+ }
+ }
}
diff --git a/python/src/com/jetbrains/python/psi/impl/PropertyBunch.java b/python/src/com/jetbrains/python/psi/impl/PropertyBunch.java
index 64f8986..59cc287 100644
--- a/python/src/com/jetbrains/python/psi/impl/PropertyBunch.java
+++ b/python/src/com/jetbrains/python/psi/impl/PropertyBunch.java
@@ -74,7 +74,7 @@
PyExpression callee = call.getCallee();
if (callee instanceof PyReferenceExpression) {
PyReferenceExpression ref = (PyReferenceExpression)callee;
- if (ref.getQualifier() != null) return null;
+ if (ref.isQualified()) return null;
if (PyNames.PROPERTY.equals(callee.getName())) {
PsiFile file = source.getContainingFile();
if (isBuiltinFile(file) || !resolvesLocally(ref)) {
diff --git a/python/src/com/jetbrains/python/psi/impl/PyArgumentListImpl.java b/python/src/com/jetbrains/python/psi/impl/PyArgumentListImpl.java
index 50ba541..dfe12ca 100644
--- a/python/src/com/jetbrains/python/psi/impl/PyArgumentListImpl.java
+++ b/python/src/com/jetbrains/python/psi/impl/PyArgumentListImpl.java
@@ -15,13 +15,15 @@
*/
package com.jetbrains.python.psi.impl;
+import com.google.common.collect.Collections2;
+import com.google.common.collect.Queues;
import com.intellij.lang.ASTFactory;
import com.intellij.lang.ASTNode;
-import com.intellij.psi.PsiElement;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.tree.TokenSet;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.IncorrectOperationException;
+import com.jetbrains.NotNullPredicate;
import com.jetbrains.python.PyElementTypes;
import com.jetbrains.python.PyTokenTypes;
import com.jetbrains.python.PythonDialectsTokenSetProvider;
@@ -30,9 +32,13 @@
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-import java.util.Arrays;
+import java.util.*;
public class PyArgumentListImpl extends PyElementImpl implements PyArgumentList {
+
+ // Filters all expressions but keyword arguments
+ private static final NoKeyArguments NO_KEY_ARGUMENTS = new NoKeyArguments();
+
public PyArgumentListImpl(ASTNode astNode) {
super(astNode);
}
@@ -61,47 +67,64 @@
return null;
}
- public void addArgument(PyExpression arg) {
- // it should find the comma after the argument to add after, and add after
- // that. otherwise it won't deal with comments nicely
+ @Override
+ public void addArgument(@NotNull final PyExpression arg) {
+ final PyElementGenerator generator = new PyElementGeneratorImpl(getProject());
+
+ // Adds param to appropriate place
+ final Deque<PyKeywordArgument> keywordArguments = getKeyWordArguments();
+ final Deque<PyExpression> parameters = getParameters();
+
+ if (keywordArguments.isEmpty() && parameters.isEmpty()) {
+ generator.insertItemIntoListRemoveRedundantCommas(this, null, arg);
+ return;
+ }
+
+
if (arg instanceof PyKeywordArgument) {
- PyKeywordArgument keywordArgument = (PyKeywordArgument)arg;
- PyKeywordArgument lastKeyArg = null;
- PyExpression firstNonKeyArg = null;
- for (PsiElement element : getChildren()) {
- if (element instanceof PyKeywordArgument) {
- lastKeyArg = (PyKeywordArgument)element;
- }
- else if (element instanceof PyExpression && firstNonKeyArg == null) {
- firstNonKeyArg = (PyExpression)element;
- }
- }
- if (lastKeyArg != null) {
- // add after last key arg
- addArgumentNode(keywordArgument, lastKeyArg.getNode().getTreeNext(), true);
-
- }
- else if (firstNonKeyArg != null) {
- // add before first non key arg
- addArgumentNode(keywordArgument, firstNonKeyArg.getNode(), true);
-
+ if (parameters.isEmpty()) {
+ generator.insertItemIntoListRemoveRedundantCommas(this, keywordArguments.getLast(), arg);
}
else {
- // add as only argument
- addArgumentLastWithoutComma(arg);
+ if (keywordArguments.isEmpty()) {
+ generator.insertItemIntoListRemoveRedundantCommas(this, parameters.getLast(), arg);
+ }
+ else {
+ generator.insertItemIntoListRemoveRedundantCommas(this, keywordArguments.getLast(), arg);
+ }
}
}
else {
- final PyExpression[] args = getArguments();
- if (args.length > 0) {
- addArgumentAfter(arg, args [args.length-1]);
+ if (parameters.isEmpty()) {
+ generator.insertItemIntoListRemoveRedundantCommas(this, null, arg);
}
else {
- addArgumentLastWithoutComma(arg);
+ generator.insertItemIntoListRemoveRedundantCommas(this, parameters.getLast(), arg);
}
}
}
+
+ /**
+ * @return parameters (as opposite to keyword arguments)
+ */
+ @NotNull
+ private Deque<PyExpression> getParameters() {
+ final PyExpression[] childrenOfType = PsiTreeUtil.getChildrenOfType(this, PyExpression.class);
+ if (childrenOfType == null) {
+ return new ArrayDeque<PyExpression>(0);
+ }
+ return Queues.newArrayDeque(Collections2.filter(Arrays.asList(childrenOfType), NO_KEY_ARGUMENTS));
+ }
+
+ /**
+ * @return keyword arguments (as opposite to parameters)
+ */
+ @NotNull
+ private Deque<PyKeywordArgument> getKeyWordArguments() {
+ return Queues.newArrayDeque(PsiTreeUtil.findChildrenOfType(this, PyKeywordArgument.class));
+ }
+
public void addArgumentFirst(PyExpression arg) {
ASTNode node = getNode();
ASTNode[] pars = node.getChildren(TokenSet.create(PyTokenTypes.LPAR));
@@ -113,13 +136,12 @@
catch (IncorrectOperationException e1) {
throw new IllegalStateException(e1);
}
-
}
else {
ASTNode before = PyUtil.getNextNonWhitespace(pars[0]);
ASTNode anchorBefore;
if (before != null && elementPrecedesElementsOfType(before, PythonDialectsTokenSetProvider.INSTANCE.getExpressionTokens())) {
- ASTNode comma = PyElementGenerator.getInstance(getProject()).createComma();
+ ASTNode comma = createComma();
node.addChild(comma, before);
node.addChild(ASTFactory.whitespace(" "), before);
anchorBefore = comma;
@@ -137,6 +159,14 @@
}
}
+ /**
+ * @return newly created comma
+ */
+ @NotNull
+ private ASTNode createComma() {
+ return PyElementGenerator.getInstance(getProject()).createComma();
+ }
+
private static boolean elementPrecedesElementsOfType(ASTNode before, TokenSet expressions) {
ASTNode node = before;
while (node != null) {
@@ -279,4 +309,11 @@
}
return ret;
}
+
+ private static class NoKeyArguments extends NotNullPredicate<PyExpression> {
+ @Override
+ protected boolean applyNotNull(@NotNull final PyExpression input) {
+ return (PsiTreeUtil.getParentOfType(input, PyKeywordArgument.class) == null) && !(input instanceof PyKeywordArgument);
+ }
+ }
}
diff --git a/python/src/com/jetbrains/python/psi/impl/PyAssignmentStatementImpl.java b/python/src/com/jetbrains/python/psi/impl/PyAssignmentStatementImpl.java
index 1ee93e2..9f76798 100644
--- a/python/src/com/jetbrains/python/psi/impl/PyAssignmentStatementImpl.java
+++ b/python/src/com/jetbrains/python/psi/impl/PyAssignmentStatementImpl.java
@@ -209,7 +209,7 @@
final List<PyExpression> expressions = PyUtil.flattenedParensAndStars(getTargets());
List<PyElement> result = new ArrayList<PyElement>();
for (PyExpression expression : expressions) {
- if (expression instanceof PyQualifiedExpression && ((PyQualifiedExpression)expression).getQualifier() != null) {
+ if (expression instanceof PyQualifiedExpression && ((PyQualifiedExpression)expression).isQualified()) {
continue;
}
result.add(expression);
@@ -223,7 +223,7 @@
PyExpression[] targets = getTargets();
if (targets.length == 1 && targets[0] instanceof PyTargetExpression) {
PyTargetExpression target = (PyTargetExpression)targets[0];
- return target.getQualifier() == null && the_name.equals(target.getName()) ? target : null;
+ return !target.isQualified() && the_name.equals(target.getName()) ? target : null;
}
return IterHelper.findName(iterateNames(), the_name);
}
diff --git a/python/src/com/jetbrains/python/psi/impl/PyBinaryExpressionImpl.java b/python/src/com/jetbrains/python/psi/impl/PyBinaryExpressionImpl.java
index 095e322..bee876a 100644
--- a/python/src/com/jetbrains/python/psi/impl/PyBinaryExpressionImpl.java
+++ b/python/src/com/jetbrains/python/psi/impl/PyBinaryExpressionImpl.java
@@ -20,10 +20,14 @@
import com.intellij.psi.PsiPolyVariantReference;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.util.PsiTreeUtil;
+import com.intellij.psi.util.QualifiedName;
import com.intellij.util.IncorrectOperationException;
import com.jetbrains.python.PyElementTypes;
import com.jetbrains.python.PyNames;
-import com.jetbrains.python.psi.*;
+import com.jetbrains.python.psi.PyBinaryExpression;
+import com.jetbrains.python.psi.PyElementType;
+import com.jetbrains.python.psi.PyElementVisitor;
+import com.jetbrains.python.psi.PyExpression;
import com.jetbrains.python.psi.impl.references.PyOperatorReference;
import com.jetbrains.python.psi.resolve.PyResolveContext;
import com.jetbrains.python.psi.types.*;
@@ -149,6 +153,17 @@
return getLeftExpression();
}
+ @Nullable
+ @Override
+ public QualifiedName asQualifiedName() {
+ return PyPsiUtils.asQualifiedName(this);
+ }
+
+ @Override
+ public boolean isQualified() {
+ return getQualifier() != null;
+ }
+
@Override
public String getReferencedName() {
final PyElementType t = getOperator();
diff --git a/python/src/com/jetbrains/python/psi/impl/PyBlockEvaluator.java b/python/src/com/jetbrains/python/psi/impl/PyBlockEvaluator.java
index 83b2949..c561eb6 100644
--- a/python/src/com/jetbrains/python/psi/impl/PyBlockEvaluator.java
+++ b/python/src/com/jetbrains/python/psi/impl/PyBlockEvaluator.java
@@ -93,7 +93,7 @@
public void visitPyAugAssignmentStatement(PyAugAssignmentStatement node) {
PyExpression target = node.getTarget();
String name = target.getName();
- if (target instanceof PyReferenceExpression && ((PyReferenceExpression)target).getQualifier() == null && name != null) {
+ if (target instanceof PyReferenceExpression && !((PyReferenceExpression)target).isQualified() && name != null) {
Object currentValue = myNamespace.get(name);
if (currentValue != null) {
Object rhs = prepareEvaluator().evaluate(node.getValue());
@@ -121,7 +121,7 @@
PyExpression qualifier = calleeRef.getQualifier();
if (qualifier instanceof PyReferenceExpression) {
PyReferenceExpression qualifierRef = (PyReferenceExpression)qualifier;
- if (qualifierRef.getQualifier() == null) {
+ if (!qualifierRef.isQualified()) {
if (PyNames.EXTEND.equals(calleeRef.getReferencedName()) && node.getArguments().length == 1) {
processExtendCall(node, qualifierRef.getReferencedName());
}
diff --git a/python/src/com/jetbrains/python/psi/impl/PyBuiltinCache.java b/python/src/com/jetbrains/python/psi/impl/PyBuiltinCache.java
index a785911..b545290 100644
--- a/python/src/com/jetbrains/python/psi/impl/PyBuiltinCache.java
+++ b/python/src/com/jetbrains/python/psi/impl/PyBuiltinCache.java
@@ -16,7 +16,7 @@
package com.jetbrains.python.psi.impl;
import com.intellij.openapi.module.Module;
-import com.intellij.openapi.module.ModuleUtil;
+import com.intellij.openapi.module.ModuleUtilCore;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.projectRoots.SdkTypeId;
@@ -24,9 +24,8 @@
import com.intellij.openapi.roots.OrderEntry;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.roots.impl.ModuleLibraryOrderEntryImpl;
-import com.intellij.openapi.util.Ref;
import com.intellij.openapi.vfs.LocalFileSystem;
-import com.intellij.openapi.vfs.VfsUtil;
+import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
@@ -53,11 +52,28 @@
* Provides access to Python builtins via skeletons.
*/
public class PyBuiltinCache {
- public static final @NonNls String BUILTIN_FILE = "__builtin__.py";
- @NonNls public static final String BUILTIN_FILE_3K = "builtins.py";
+ public static final String BUILTIN_FILE = "__builtin__.py";
+ public static final String BUILTIN_FILE_3K = "builtins.py";
public static final String EXCEPTIONS_FILE = "exceptions.py";
- private PyType STRING_TYPE_PY2 = null;
+ private static final PyBuiltinCache DUD_INSTANCE = new PyBuiltinCache(null, null);
+
+ /**
+ * Stores the most often used types, returned by getNNNType().
+ */
+ @NotNull private final Map<String, PyClassTypeImpl> myTypeCache = new HashMap<String, PyClassTypeImpl>();
+
+ @Nullable private PyFile myBuiltinsFile;
+ @Nullable private PyFile myExceptionsFile;
+ private long myModStamp = -1;
+
+ public PyBuiltinCache() {
+ }
+
+ public PyBuiltinCache(@Nullable final PyFile builtins, @Nullable PyFile exceptions) {
+ myBuiltinsFile = builtins;
+ myExceptionsFile = exceptions;
+ }
/**
* Returns an instance of builtin cache. Instances differ per module and are cached.
@@ -80,7 +96,7 @@
if (psifile == null) {
return null;
}
- Module module = ModuleUtil.findModuleForPsiElement(psifile);
+ Module module = ModuleUtilCore.findModuleForPsiElement(psifile);
if (module != null) {
return PythonSdkType.findPythonSdk(module);
}
@@ -124,7 +140,7 @@
for (String url : urls) {
if (url.contains(PythonSdkType.SKELETON_DIR_NAME)) {
final String builtins_url = url + "/" + name;
- File builtins = new File(VfsUtil.urlToPath(builtins_url));
+ File builtins = new File(VfsUtilCore.urlToPath(builtins_url));
if (builtins.isFile() && builtins.canRead()) {
VirtualFile builtins_vfile = LocalFileSystem.getInstance().findFileByIoFile(builtins);
if (builtins_vfile != null) {
@@ -140,8 +156,6 @@
return null;
}
- private static final PyBuiltinCache DUD_INSTANCE = new PyBuiltinCache(null, null);
-
@Nullable
static PyType createLiteralCollectionType(final PySequenceExpression sequence, final String name) {
final PyBuiltinCache builtinCache = getInstance(sequence);
@@ -152,26 +166,13 @@
return null;
}
-
- @Nullable private PyFile myBuiltinsFile;
- @Nullable private PyFile myExceptionsFile;
-
-
- public PyBuiltinCache() {
- }
-
- public PyBuiltinCache(@Nullable final PyFile builtins, @Nullable PyFile exceptions) {
- myBuiltinsFile = builtins;
- myExceptionsFile = exceptions;
- }
-
@Nullable
public PyFile getBuiltinsFile() {
return myBuiltinsFile;
}
public boolean isValid() {
- return myBuiltinsFile == null || myBuiltinsFile.isValid();
+ return myBuiltinsFile != null && myBuiltinsFile.isValid();
}
/**
@@ -195,13 +196,6 @@
return null;
}
- /**
- * Stores the most often used types, returned by getNNNType().
- */
- private final Map<String, PyClassTypeImpl> myTypeCache = new HashMap<String, PyClassTypeImpl>();
- private final Map<String, Ref<PyType>> myStdlibTypeCache = new HashMap<String, Ref<PyType>>();
- private long myModStamp = -1;
-
@Nullable
public PyClassTypeImpl getObjectType(@NonNls String name) {
PyClassTypeImpl val;
@@ -316,10 +310,7 @@
}
private PyType getStrOrUnicodeType() {
- if (STRING_TYPE_PY2 == null) {
- STRING_TYPE_PY2 = PyUnionType.union(getObjectType("str"), getObjectType("unicode"));
- }
- return STRING_TYPE_PY2;
+ return PyUnionType.union(getObjectType("str"), getObjectType("unicode"));
}
@Nullable
@@ -342,51 +333,6 @@
return getObjectType("staticmethod");
}
- @Nullable
- public Ref<PyType> getStdlibType(@NotNull String key, @NotNull TypeEvalContext context) {
- synchronized (myStdlibTypeCache) {
- final Ref<PyType> ref = myStdlibTypeCache.get(key);
- if (ref != null) {
- if (!isValid(ref.get(), context)) {
- myStdlibTypeCache.clear();
- return null;
- }
- }
- return ref;
- }
- }
-
- private static boolean isValid(@Nullable PyType type, @NotNull TypeEvalContext context) {
- if (type instanceof PyCollectionType) {
- final PyType elementType = ((PyCollectionType)type).getElementType(context);
- if (!isValid(elementType, context)) {
- return false;
- }
- }
-
- if (type instanceof PyClassType) {
- return ((PyClassType)type).isValid();
- }
- else if (type instanceof PyUnionType) {
- for (PyType member : ((PyUnionType)type).getMembers()) {
- if (!isValid(member, context)) {
- return false;
- }
- }
- return true;
- }
- else if (type instanceof PyFunctionType) {
- return ((PyFunctionType)type).getCallable().isValid();
- }
- return true;
- }
-
- public void storeStdlibType(@NotNull String key, @Nullable PyType result) {
- synchronized (myStdlibTypeCache) {
- myStdlibTypeCache.put(key, new Ref<PyType>(result));
- }
- }
-
/**
* @param target an element to check.
* @return true iff target is inside the __builtins__.py
diff --git a/python/src/com/jetbrains/python/psi/impl/PyCallExpressionHelper.java b/python/src/com/jetbrains/python/psi/impl/PyCallExpressionHelper.java
index 506fdb0..781dc28 100644
--- a/python/src/com/jetbrains/python/psi/impl/PyCallExpressionHelper.java
+++ b/python/src/com/jetbrains/python/psi/impl/PyCallExpressionHelper.java
@@ -43,6 +43,7 @@
}
/**
+ * TODO: Copy/Paste with {@link com.jetbrains.python.psi.PyArgumentList#addArgument(com.jetbrains.python.psi.PyExpression)}
* Adds an argument to the end of argument list.
* @param us the arg list
* @param expression what to add
@@ -490,7 +491,7 @@
if (first_arg instanceof PyReferenceExpression) {
final PyReferenceExpression firstArgRef = (PyReferenceExpression)first_arg;
final PyExpression qualifier = firstArgRef.getQualifier();
- if (qualifier != null && PyNames.CLASS.equals(firstArgRef.getReferencedName())) {
+ if (qualifier != null && PyNames.__CLASS__.equals(firstArgRef.getReferencedName())) {
final PsiReference qRef = qualifier.getReference();
final PsiElement element = qRef == null ? null : qRef.resolve();
if (element instanceof PyParameter) {
@@ -507,7 +508,9 @@
}
}
}
- else if (((PyFile)call.getContainingFile()).getLanguageLevel().isPy3K() && containingClass != null) {
+ else if ((call.getContainingFile() instanceof PyFile) &&
+ ((PyFile)call.getContainingFile()).getLanguageLevel().isPy3K() &&
+ (containingClass != null)) {
return new Maybe<PyType>(getSuperClassUnionType(containingClass));
}
}
diff --git a/python/src/com/jetbrains/python/psi/impl/PyClassImpl.java b/python/src/com/jetbrains/python/psi/impl/PyClassImpl.java
index 0a9959d..bea0e10 100644
--- a/python/src/com/jetbrains/python/psi/impl/PyClassImpl.java
+++ b/python/src/com/jetbrains/python/psi/impl/PyClassImpl.java
@@ -148,6 +148,7 @@
pyVisitor.visitPyClass(this);
}
+ @Override
@NotNull
public PyStatementList getStatementList() {
final PyStatementList statementList = childToPsi(PyElementTypes.STATEMENT_LIST);
@@ -585,7 +586,7 @@
@Nullable
@Override
- public Property findProperty(@NotNull final String name) {
+ public Property findProperty(@NotNull final String name, boolean inherited) {
Property property = findLocalProperty(name);
if (property != null) {
return property;
@@ -593,10 +594,12 @@
if (findMethodByName(name, false) != null || findClassAttribute(name, false) != null) {
return null;
}
- for (PyClass aClass : getAncestorClasses()) {
- final Property ancestorProperty = ((PyClassImpl)aClass).findLocalProperty(name);
- if (ancestorProperty != null) {
- return ancestorProperty;
+ if (inherited) {
+ for (PyClass aClass : getAncestorClasses()) {
+ final Property ancestorProperty = ((PyClassImpl)aClass).findLocalProperty(name);
+ if (ancestorProperty != null) {
+ return ancestorProperty;
+ }
}
}
return null;
@@ -1167,6 +1170,67 @@
return manager.getParameterizedCachedValue(this, myCachedValueKey, myCachedAncestorsProvider, false, context);
}
+ @Nullable
+ @Override
+ public PyType getMetaClassType(@NotNull TypeEvalContext context) {
+ if (context.maySwitchToAST(this)) {
+ final PyExpression expression = getMetaClassExpression();
+ if (expression != null) {
+ final PyType type = context.getType(expression);
+ if (type != null) {
+ return type;
+ }
+ }
+ }
+ else {
+ final PyClassStub stub = getStub();
+ final QualifiedName name = stub != null ? stub.getMetaClass() : PyPsiUtils.asQualifiedName(getMetaClassExpression());
+ final PsiFile file = getContainingFile();
+ if (file instanceof PyFile) {
+ final PyFile pyFile = (PyFile)file;
+ if (name != null) {
+ return classTypeFromQName(name, pyFile, context);
+ }
+ }
+ }
+ final LanguageLevel level = LanguageLevel.forElement(this);
+ if (level.isOlderThan(LanguageLevel.PYTHON30)) {
+ final PsiFile file = getContainingFile();
+ if (file instanceof PyFile) {
+ final PyFile pyFile = (PyFile)file;
+ final PsiElement element = pyFile.getElementNamed(PyNames.DUNDER_METACLASS);
+ if (element instanceof PyTypedElement) {
+ return context.getType((PyTypedElement)element);
+ }
+ }
+ }
+ return null;
+ }
+
+ @Nullable
+ @Override
+ public PyExpression getMetaClassExpression() {
+ final LanguageLevel level = LanguageLevel.forElement(this);
+ if (level.isAtLeast(LanguageLevel.PYTHON30)) {
+ // Requires AST access
+ for (PyExpression expression : getSuperClassExpressions()) {
+ if (expression instanceof PyKeywordArgument) {
+ final PyKeywordArgument argument = (PyKeywordArgument)expression;
+ if (PyNames.METACLASS.equals(argument.getKeyword())) {
+ return argument.getValueExpression();
+ }
+ }
+ }
+ }
+ else {
+ final PyTargetExpression attribute = findClassAttribute(PyNames.DUNDER_METACLASS, false);
+ if (attribute != null) {
+ return attribute;
+ }
+ }
+ return null;
+ }
+
@NotNull
private List<PyClassLikeType> getMROAncestorTypes(@NotNull TypeEvalContext context) {
final PyType thisType = context.getType(this);
diff --git a/python/src/com/jetbrains/python/psi/impl/PyDecoratorImpl.java b/python/src/com/jetbrains/python/psi/impl/PyDecoratorImpl.java
index f15a664..92e75ed 100644
--- a/python/src/com/jetbrains/python/psi/impl/PyDecoratorImpl.java
+++ b/python/src/com/jetbrains/python/psi/impl/PyDecoratorImpl.java
@@ -26,7 +26,6 @@
import com.jetbrains.python.PythonDialectsTokenSetProvider;
import com.jetbrains.python.psi.*;
import com.jetbrains.python.psi.resolve.PyResolveContext;
-import com.jetbrains.python.psi.resolve.PyResolveUtil;
import com.jetbrains.python.psi.stubs.PyDecoratorStub;
import com.jetbrains.python.psi.types.PyType;
import com.jetbrains.python.psi.types.TypeEvalContext;
@@ -34,8 +33,6 @@
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-import java.util.List;
-
/**
* @author dcheryasov
*/
@@ -74,8 +71,8 @@
}
public boolean hasArgumentList() {
- ASTNode arglist_node = getNode().findChildByType(PyElementTypes.ARGUMENT_LIST);
- return (arglist_node != null) && (arglist_node.findChildByType(PyTokenTypes.LPAR) != null);
+ final ASTNode arglistNode = getNode().findChildByType(PyElementTypes.ARGUMENT_LIST);
+ return (arglistNode != null) && (arglistNode.findChildByType(PyTokenTypes.LPAR) != null);
}
public QualifiedName getQualifiedName() {
@@ -84,13 +81,9 @@
return stub.getQualifiedName();
}
else {
- PyReferenceExpression node = PsiTreeUtil.getChildOfType(this, PyReferenceExpression.class);
+ final PyReferenceExpression node = PsiTreeUtil.getChildOfType(this, PyReferenceExpression.class);
if (node != null) {
- List<PyExpression> parts = PyResolveUtil.unwindQualifiers(node);
- if (parts != null) {
- //Collections.reverse(parts);
- return PyQualifiedNameFactory.fromReferenceChain(parts);
- }
+ return node.asQualifiedName();
}
return null;
}
@@ -122,7 +115,7 @@
@Override
public <T extends PsiElement> T getArgument(int index, Class<T> argClass) {
PyExpression[] args = getArguments();
- return args.length >= index && argClass.isInstance(args[index]) ? argClass.cast(args[index]) : null;
+ return args.length > index && argClass.isInstance(args[index]) ? argClass.cast(args[index]) : null;
}
@Override
diff --git a/python/src/com/jetbrains/python/psi/impl/PyElementGeneratorImpl.java b/python/src/com/jetbrains/python/psi/impl/PyElementGeneratorImpl.java
index 1a8f123..c306116 100644
--- a/python/src/com/jetbrains/python/psi/impl/PyElementGeneratorImpl.java
+++ b/python/src/com/jetbrains/python/psi/impl/PyElementGeneratorImpl.java
@@ -15,6 +15,8 @@
*/
package com.jetbrains.python.psi.impl;
+import com.google.common.collect.Collections2;
+import com.google.common.collect.Queues;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Pair;
@@ -23,9 +25,12 @@
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiFileFactory;
import com.intellij.psi.impl.PsiFileFactoryImpl;
+import com.intellij.psi.impl.source.tree.LeafPsiElement;
import com.intellij.psi.tree.TokenSet;
+import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.testFramework.LightVirtualFile;
import com.intellij.util.IncorrectOperationException;
+import com.jetbrains.NotNullPredicate;
import com.jetbrains.python.PyTokenTypes;
import com.jetbrains.python.PythonFileType;
import com.jetbrains.python.PythonLanguage;
@@ -37,12 +42,15 @@
import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;
import java.util.Arrays;
+import java.util.Collection;
+import java.util.Deque;
import java.util.Formatter;
/**
* @author yole
*/
public class PyElementGeneratorImpl extends PyElementGenerator {
+ private static final CommasOnly COMMAS_ONLY = new CommasOnly();
private final Project myProject;
public PyElementGeneratorImpl(Project project) {
@@ -173,6 +181,30 @@
return dot.copyElement();
}
+ @Override
+ @NotNull
+ public PsiElement insertItemIntoListRemoveRedundantCommas(
+ @NotNull final PyElement list,
+ @Nullable final PyExpression afterThis,
+ @NotNull final PyExpression toInsert) {
+ // TODO: #insertItemIntoList is probably buggy. In such case, fix it and get rid of this method
+ final PsiElement result = insertItemIntoList(list, afterThis, toInsert);
+ final LeafPsiElement[] leafs = PsiTreeUtil.getChildrenOfType(list, LeafPsiElement.class);
+ if (leafs != null) {
+ final Deque<LeafPsiElement> commas = Queues.newArrayDeque(Collections2.filter(Arrays.asList(leafs), COMMAS_ONLY));
+ if (! commas.isEmpty()) {
+ final LeafPsiElement lastComma = commas.getLast();
+ if (PsiTreeUtil.getNextSiblingOfType(lastComma, PyExpression.class) == null) { //Comma has no expression after it
+ lastComma.delete();
+ }
+ }
+ }
+
+ return result;
+ }
+
+ // TODO: Adds comma to empty list: adding "foo" to () will create (foo,). That is why "insertItemIntoListRemoveRedundantCommas" was created.
+ // We probably need to fix this method and delete insertItemIntoListRemoveRedundantCommas
public PsiElement insertItemIntoList(PyElement list, @Nullable PyExpression afterThis, PyExpression toInsert)
throws IncorrectOperationException {
ASTNode add = toInsert.getNode().copyElement();
@@ -225,6 +257,7 @@
return createExpressionFromText(LanguageLevel.getDefault(), text);
}
+ @NotNull
public PyExpression createExpressionFromText(final LanguageLevel languageLevel, final String text) {
final PsiFile dummyFile = createDummyFile(languageLevel, text);
final PsiElement element = dummyFile.getFirstChild();
@@ -364,4 +397,11 @@
return createFromText(LanguageLevel.getDefault(),
PyExpressionStatement.class, content + "\n");
}
+
+ private static class CommasOnly extends NotNullPredicate<LeafPsiElement> {
+ @Override
+ protected boolean applyNotNull(@NotNull final LeafPsiElement input) {
+ return input.getNode().getElementType().equals(PyTokenTypes.COMMA);
+ }
+ }
}
diff --git a/python/src/com/jetbrains/python/psi/impl/PyEvaluator.java b/python/src/com/jetbrains/python/psi/impl/PyEvaluator.java
index db114df..321ffc4 100644
--- a/python/src/com/jetbrains/python/psi/impl/PyEvaluator.java
+++ b/python/src/com/jetbrains/python/psi/impl/PyEvaluator.java
@@ -105,7 +105,7 @@
}
protected Object evaluateReferenceExpression(PyReferenceExpression expr) {
- if (expr.getQualifier() == null) {
+ if (!expr.isQualified()) {
if (myNamespace != null) {
return myNamespace.get(expr.getReferencedName());
}
diff --git a/python/src/com/jetbrains/python/psi/impl/PyExceptPartImpl.java b/python/src/com/jetbrains/python/psi/impl/PyExceptPartImpl.java
index 812072d..c051d1b 100644
--- a/python/src/com/jetbrains/python/psi/impl/PyExceptPartImpl.java
+++ b/python/src/com/jetbrains/python/psi/impl/PyExceptPartImpl.java
@@ -63,6 +63,7 @@
}
public PyElement getElementNamed(final String the_name) {
+ // Requires switching from stubs to AST in getTarget()
return IterHelper.findName(iterateNames(), the_name);
}
diff --git a/python/src/com/jetbrains/python/psi/impl/PyFileImpl.java b/python/src/com/jetbrains/python/psi/impl/PyFileImpl.java
index f16850e..c1aa84c 100644
--- a/python/src/com/jetbrains/python/psi/impl/PyFileImpl.java
+++ b/python/src/com/jetbrains/python/psi/impl/PyFileImpl.java
@@ -16,15 +16,19 @@
package com.jetbrains.python.psi.impl;
import com.intellij.extapi.psi.PsiFileBase;
+import com.intellij.icons.AllIcons;
import com.intellij.lang.ASTNode;
import com.intellij.lang.Language;
+import com.intellij.navigation.ItemPresentation;
import com.intellij.openapi.fileTypes.FileType;
+import com.intellij.openapi.roots.ProjectFileIndex;
import com.intellij.openapi.util.Key;
+import com.intellij.openapi.util.io.FileUtil;
+import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.psi.scope.PsiScopeProcessor;
import com.intellij.psi.stubs.StubElement;
-import com.intellij.psi.templateLanguages.TemplateLanguageFileViewProvider;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.util.PsiModificationTracker;
import com.intellij.psi.util.QualifiedName;
@@ -33,11 +37,15 @@
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.MultiMap;
import com.intellij.util.indexing.IndexingDataKeys;
-import com.jetbrains.python.*;
+import com.jetbrains.python.PyElementTypes;
+import com.jetbrains.python.PyNames;
+import com.jetbrains.python.PythonFileType;
+import com.jetbrains.python.PythonLanguage;
import com.jetbrains.python.codeInsight.controlflow.ControlFlowCache;
import com.jetbrains.python.documentation.DocStringUtil;
import com.jetbrains.python.inspections.PythonVisitorFilter;
import com.jetbrains.python.psi.*;
+import com.jetbrains.python.psi.resolve.QualifiedNameFinder;
import com.jetbrains.python.psi.resolve.RatedResolveResult;
import com.jetbrains.python.psi.resolve.ResolveImportUtil;
import com.jetbrains.python.psi.resolve.VariantsProcessor;
@@ -49,6 +57,7 @@
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
+import java.io.File;
import java.util.*;
public class PyFileImpl extends PsiFileBase implements PyFile, PyExpression {
@@ -59,8 +68,7 @@
private final Map<FutureFeature, Boolean> myFutureFeatures;
private List<String> myDunderAll;
private boolean myDunderAllCalculated;
- private SoftReference<ExportedNameCache> myExportedNameCache = new SoftReference<ExportedNameCache>(null);
- private final Object myENCLock = new Object();
+ private volatile SoftReference<ExportedNameCache> myExportedNameCache = new SoftReference<ExportedNameCache>(null);
private final PsiModificationTracker myModificationTracker;
private class ExportedNameCache {
@@ -305,19 +313,12 @@
}
public boolean isAcceptedFor(@NotNull Class visitorClass) {
- final FileViewProvider viewProvider = getViewProvider();
- final Language lang;
- if (viewProvider instanceof TemplateLanguageFileViewProvider) {
- lang = viewProvider.getBaseLanguage();
- }
- else {
- lang = getLanguage();
- }
- final List<PythonVisitorFilter> filters = PythonVisitorFilter.INSTANCE.allForLanguage(lang);
- if (filters.isEmpty()) return true;
- for (PythonVisitorFilter filter : filters) {
- if (!filter.isSupported(visitorClass, this))
- return false;
+ for (Language lang : getViewProvider().getLanguages()) {
+ final List<PythonVisitorFilter> filters = PythonVisitorFilter.INSTANCE.allForLanguage(lang);
+ for (PythonVisitorFilter filter : filters) {
+ if (!filter.isSupported(visitorClass, this))
+ return false;
+ }
}
return true;
}
@@ -441,17 +442,15 @@
private ExportedNameCache getExportedNameCache() {
ExportedNameCache cache;
- synchronized (myENCLock) {
- cache = myExportedNameCache != null ? myExportedNameCache.get() : null;
- final long modificationStamp = getModificationStamp();
- if (myExportedNameCache != null && cache != null && modificationStamp != cache.getModificationStamp()) {
- myExportedNameCache.clear();
- cache = null;
- }
- if (cache == null) {
- cache = new ExportedNameCache(modificationStamp);
- myExportedNameCache = new SoftReference<ExportedNameCache>(cache);
- }
+ cache = myExportedNameCache != null ? myExportedNameCache.get() : null;
+ final long modificationStamp = getModificationStamp();
+ if (myExportedNameCache != null && cache != null && modificationStamp != cache.getModificationStamp()) {
+ myExportedNameCache.clear();
+ cache = null;
+ }
+ if (cache == null) {
+ cache = new ExportedNameCache(modificationStamp);
+ myExportedNameCache = new SoftReference<ExportedNameCache>(cache);
}
return cache;
}
@@ -614,7 +613,7 @@
@Nullable
private List<String> getStringListFromValue(PyExpression expression) {
- if (expression instanceof PyReferenceExpression && ((PyReferenceExpression)expression).getQualifier() == null) {
+ if (expression instanceof PyReferenceExpression && !((PyReferenceExpression)expression).isQualified()) {
return myDunderLike.get(((PyReferenceExpression)expression).getReferencedName());
}
return PyUtil.strListValue(expression);
@@ -747,9 +746,7 @@
ControlFlowCache.clear(this);
myDunderAllCalculated = false;
myFutureFeatures.clear(); // probably no need to synchronize
- synchronized (myENCLock) {
- myExportedNameCache.clear();
- }
+ myExportedNameCache.clear();
}
@Override
@@ -782,4 +779,78 @@
}
return elementType == PyElementTypes.IMPORT_STATEMENT || elementType == PyElementTypes.FROM_IMPORT_STATEMENT;
}
+
+ @Override
+ public ItemPresentation getPresentation() {
+ return new ItemPresentation() {
+ @Override
+ public String getPresentableText() {
+ return getModuleName(PyFileImpl.this);
+ }
+
+ @Override
+ public String getLocationString() {
+ final String name = getLocationName();
+ return name != null ? "(" + name + ")" : null;
+ }
+
+ @Override
+ public Icon getIcon(final boolean open) {
+ if (PyUtil.isPackage(PyFileImpl.this)) {
+ return AllIcons.Modules.SourceFolder;
+ }
+ return PyFileImpl.this.getIcon(0);
+ }
+
+ @NotNull
+ private String getModuleName(@NotNull PyFile file) {
+ if (PyUtil.isPackage(file)) {
+ final PsiDirectory dir = file.getContainingDirectory();
+ if (dir != null) {
+ return dir.getName();
+ }
+ }
+ return FileUtil.getNameWithoutExtension(file.getName());
+ }
+
+ @Nullable
+ private String getLocationName() {
+ final QualifiedName name = QualifiedNameFinder.findShortestImportableQName(PyFileImpl.this);
+ if (name != null) {
+ final QualifiedName prefix = name.removeTail(1);
+ if (prefix.getComponentCount() > 0) {
+ return prefix.toString();
+ }
+ }
+ final String relativePath = getRelativeContainerPath();
+ if (relativePath != null) {
+ return relativePath;
+ }
+ final PsiDirectory psiDirectory = getParent();
+ if (psiDirectory != null) {
+ return psiDirectory.getVirtualFile().getPresentableUrl();
+ }
+ return null;
+ }
+
+ @Nullable
+ private String getRelativeContainerPath() {
+ final PsiDirectory psiDirectory = getParent();
+ if (psiDirectory != null) {
+ final VirtualFile virtualFile = getVirtualFile();
+ if (virtualFile != null) {
+ final VirtualFile root = ProjectFileIndex.SERVICE.getInstance(getProject()).getContentRootForFile(virtualFile);
+ if (root != null) {
+ final VirtualFile parent = virtualFile.getParent();
+ final VirtualFile rootParent = root.getParent();
+ if (rootParent != null && parent != null) {
+ return VfsUtilCore.getRelativePath(parent, rootParent, File.separatorChar);
+ }
+ }
+ }
+ }
+ return null;
+ }
+ };
+ }
}
diff --git a/python/src/com/jetbrains/python/psi/impl/PyFunctionBuilder.java b/python/src/com/jetbrains/python/psi/impl/PyFunctionBuilder.java
index 82b21ad..53dea09 100644
--- a/python/src/com/jetbrains/python/psi/impl/PyFunctionBuilder.java
+++ b/python/src/com/jetbrains/python/psi/impl/PyFunctionBuilder.java
@@ -20,25 +20,78 @@
import com.intellij.psi.PsiElement;
import com.intellij.psi.codeStyle.CodeStyleSettings;
import com.intellij.psi.codeStyle.CodeStyleSettingsManager;
+import com.intellij.util.ArrayUtil;
import com.jetbrains.python.PyNames;
import com.jetbrains.python.PythonFileType;
-import com.jetbrains.python.psi.LanguageLevel;
-import com.jetbrains.python.psi.PyElementGenerator;
-import com.jetbrains.python.psi.PyFunction;
+import com.jetbrains.python.psi.*;
+
+import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.List;
+import java.util.regex.Pattern;
/**
* @author yole
*/
public class PyFunctionBuilder {
+ private static final String COMMENTS_BOUNDARY = "\"\"\"";
+ private static final Pattern INDENT_REMOVE_PATTERN = Pattern.compile("^\\s+", Pattern.MULTILINE);
private final String myName;
private final List<String> myParameters = new ArrayList<String>();
private final List<String> myStatements = new ArrayList<String>();
private final List<String> myDecorators = new ArrayList<String>();
private String myAnnotation = null;
+ private String[] myDocStringLines = null;
+
+ /**
+ * Creates builder copying signature and doc from another one.
+ * @param source what to copy
+ * @param decoratorsToCopyIfExist list of decorator names to be copied to new function.
+ * @return builder configured by this function
+ */
+ @NotNull
+ public static PyFunctionBuilder copySignature(@NotNull final PyFunction source, @NotNull final String... decoratorsToCopyIfExist) {
+ final String name = source.getName();
+ final PyFunctionBuilder functionBuilder = new PyFunctionBuilder((name != null) ? name : "");
+ for (final PyParameter parameter : source.getParameterList().getParameters()) {
+ final String parameterName = parameter.getName();
+ if (parameterName != null) {
+ functionBuilder.parameter(parameterName);
+ }
+ }
+ final PyDecoratorList decoratorList = source.getDecoratorList();
+ if (decoratorList != null) {
+ for (final PyDecorator decorator : decoratorList.getDecorators()) {
+ final String decoratorName = decorator.getName();
+ if (decoratorName != null) {
+ if (ArrayUtil.contains(decoratorName, decoratorsToCopyIfExist)) {
+ functionBuilder.decorate(decoratorName);
+ }
+ }
+ }
+ }
+ final String docString = source.getDocStringValue();
+ if (docString != null) {
+ functionBuilder.docString(docString);
+ }
+ return functionBuilder;
+ }
+
+ /**
+ * Adds docstring to function. Provide doc with out of comment blocks.
+ * @param docString doc
+ */
+ public void docString(@NotNull final String docString) {
+ myDocStringLines = StringUtil.splitByLines(removeIndent(docString));
+ }
+
+ @NotNull
+ private String removeIndent(@NotNull final String string) {
+ return INDENT_REMOVE_PATTERN.matcher(string).replaceAll("");
+ }
public PyFunctionBuilder(String name) {
myName = name;
@@ -47,7 +100,7 @@
public PyFunctionBuilder parameter(String baseName) {
String name = baseName;
int uniqueIndex = 0;
- while(myParameters.contains(name)) {
+ while (myParameters.contains(name)) {
uniqueIndex++;
name = baseName + uniqueIndex;
}
@@ -66,11 +119,11 @@
}
public PyFunction addFunction(PsiElement target, final LanguageLevel languageLevel) {
- return (PyFunction) target.add(buildFunction(target.getProject(), languageLevel));
+ return (PyFunction)target.add(buildFunction(target.getProject(), languageLevel));
}
public PyFunction addFunctionAfter(PsiElement target, PsiElement anchor, final LanguageLevel languageLevel) {
- return (PyFunction) target.addAfter(buildFunction(target.getProject(), languageLevel), anchor);
+ return (PyFunction)target.addAfter(buildFunction(target.getProject(), languageLevel), anchor);
}
public PyFunction buildFunction(Project project, final LanguageLevel languageLevel) {
@@ -93,6 +146,16 @@
}
builder.append(":");
List<String> statements = myStatements.isEmpty() ? Collections.singletonList(PyNames.PASS) : myStatements;
+
+ if (myDocStringLines != null) {
+ final List<String> comments = new ArrayList<String>(myDocStringLines.length + 2);
+ comments.add(COMMENTS_BOUNDARY);
+ comments.addAll(Arrays.asList(myDocStringLines));
+ comments.add(COMMENTS_BOUNDARY);
+ statements = new ArrayList<String>(statements);
+ statements.addAll(0, comments);
+ }
+
final CodeStyleSettings codeStyleSettings = CodeStyleSettingsManager.getInstance(project).getCurrentSettings();
int indentSize = codeStyleSettings.getIndentOptions(PythonFileType.INSTANCE).INDENT_SIZE;
String indent = StringUtil.repeatSymbol(' ', indentSize);
@@ -105,4 +168,11 @@
public void decorate(String decoratorName) {
myDecorators.add("@" + decoratorName);
}
+
+ @NotNull
+ private static String getIndent(@NotNull final Project project) {
+ final CodeStyleSettings codeStyleSettings = CodeStyleSettingsManager.getInstance(project).getCurrentSettings();
+ final int indentSize = codeStyleSettings.getIndentOptions(PythonFileType.INSTANCE).INDENT_SIZE;
+ return StringUtil.repeatSymbol(' ', indentSize);
+ }
}
diff --git a/python/src/com/jetbrains/python/psi/impl/PyFunctionImpl.java b/python/src/com/jetbrains/python/psi/impl/PyFunctionImpl.java
index 93469c6..2ffc8e6 100644
--- a/python/src/com/jetbrains/python/psi/impl/PyFunctionImpl.java
+++ b/python/src/com/jetbrains/python/psi/impl/PyFunctionImpl.java
@@ -143,9 +143,12 @@
return getRequiredStubOrPsiChild(PyElementTypes.PARAMETER_LIST);
}
- @Nullable
+ @Override
+ @NotNull
public PyStatementList getStatementList() {
- return childToPsi(PyElementTypes.STATEMENT_LIST);
+ final PyStatementList statementList = childToPsi(PyElementTypes.STATEMENT_LIST);
+ assert statementList != null : "Statement list missing for function " + getText();
+ return statementList;
}
public PyClass getContainingClass() {
@@ -174,29 +177,28 @@
@Nullable
@Override
public PyType getReturnType(@NotNull TypeEvalContext context, @Nullable PyQualifiedExpression callSite) {
- final PyType type = getGenericReturnType(context, callSite);
-
+ PyType type = getGenericReturnType(context, callSite);
if (callSite == null) {
return type;
}
final PyTypeChecker.AnalyzeCallResults results = PyTypeChecker.analyzeCallSite(callSite, context);
-
if (PyTypeChecker.hasGenerics(type, context)) {
if (results != null) {
final Map<PyGenericType, PyType> substitutions = PyTypeChecker.unifyGenericCall(this, results.getReceiver(), results.getArguments(),
context);
- if (substitutions != null) {
- return PyTypeChecker.substitute(type, substitutions, context);
- }
+ type = substitutions != null ? PyTypeChecker.substitute(type, substitutions, context) : null;
}
- return null;
+ else {
+ type = null;
+ }
+ }
+ if (results != null) {
+ type = replaceSelf(type, results.getReceiver(), context);
}
if (results != null && isDynamicallyEvaluated(results.getArguments().values(), context)) {
return PyUnionType.createWeakType(type);
}
- else {
- return type;
- }
+ return type;
}
@Nullable
@@ -205,16 +207,36 @@
*/
public PyType getReturnTypeWithoutCallSite(@NotNull TypeEvalContext context,
@Nullable PyExpression receiver) {
- final PyType type = getGenericReturnType(context, null);
+ PyType type = getGenericReturnType(context, null);
if (PyTypeChecker.hasGenerics(type, context)) {
- final Map<PyGenericType, PyType> substitutions =
- PyTypeChecker.unifyGenericCall(this, receiver, Maps.<PyExpression, PyNamedParameter>newHashMap(), context);
+ final Map<PyGenericType, PyType> substitutions = PyTypeChecker.unifyGenericCall(this, receiver,
+ Maps.<PyExpression, PyNamedParameter>newHashMap(),
+ context);
if (substitutions != null) {
- return PyTypeChecker.substitute(type, substitutions, context);
+ type = PyTypeChecker.substitute(type, substitutions, context);
}
- return null;
+ else {
+ type = null;
+ }
}
- return type;
+ return replaceSelf(type, receiver, context);
+ }
+
+ @Nullable
+ private PyType replaceSelf(@Nullable PyType returnType, @Nullable PyExpression receiver, @NotNull TypeEvalContext context) {
+ if (receiver != null) {
+ // TODO: Currently we substitute only simple subclass types, but we could handle union and collection types as well
+ if (returnType instanceof PyClassType) {
+ final PyClassType returnClassType = (PyClassType)returnType;
+ if (returnClassType.getPyClass() == getContainingClass()) {
+ final PyType receiverType = context.getType(receiver);
+ if (receiverType instanceof PyClassType && PyTypeChecker.match(returnType, receiverType, context)) {
+ return returnClassType.isDefinition() ? receiverType : ((PyClassType)receiverType).toInstance();
+ }
+ }
+ }
+ }
+ return returnType;
}
private static boolean isDynamicallyEvaluated(@NotNull Collection<PyNamedParameter> parameters, @NotNull TypeEvalContext context) {
@@ -251,9 +273,9 @@
return docStringType;
}
if (typeEvalContext.allowReturnTypes(this)) {
- final PyType yieldType = getYieldStatementType(typeEvalContext);
- if (yieldType != null) {
- return yieldType;
+ final Ref<? extends PyType> yieldTypeRef = getYieldStatementType(typeEvalContext);
+ if (yieldTypeRef != null) {
+ return yieldTypeRef.get();
}
return getReturnStatementType(typeEvalContext);
}
@@ -261,13 +283,12 @@
}
@Nullable
- private PyType getYieldStatementType(@NotNull final TypeEvalContext context) {
+ private Ref<? extends PyType> getYieldStatementType(@NotNull final TypeEvalContext context) {
Ref<PyType> elementType = null;
final PyBuiltinCache cache = PyBuiltinCache.getInstance(this);
- final PyClass listClass = cache.getClass("list");
final PyStatementList statements = getStatementList();
final Set<PyType> types = new LinkedHashSet<PyType>();
- if (statements != null && listClass != null) {
+ if (statements != null) {
statements.accept(new PyRecursiveElementVisitor() {
@Override
public void visitPyYieldExpression(PyYieldExpression node) {
@@ -297,9 +318,12 @@
if (elementType != null) {
final PyClass generator = cache.getClass(PyNames.FAKE_GENERATOR);
if (generator != null) {
- return new PyCollectionTypeImpl(generator, false, elementType.get());
+ return Ref.create(new PyCollectionTypeImpl(generator, false, elementType.get()));
}
}
+ if (!types.isEmpty()) {
+ return Ref.create(null);
+ }
return null;
}
diff --git a/python/src/com/jetbrains/python/psi/impl/PyImportElementImpl.java b/python/src/com/jetbrains/python/psi/impl/PyImportElementImpl.java
index ddeaf12..70e3ecf 100644
--- a/python/src/com/jetbrains/python/psi/impl/PyImportElementImpl.java
+++ b/python/src/com/jetbrains/python/psi/impl/PyImportElementImpl.java
@@ -28,7 +28,6 @@
import com.jetbrains.python.PyElementTypes;
import com.jetbrains.python.PythonDialectsTokenSetProvider;
import com.jetbrains.python.psi.*;
-import com.jetbrains.python.psi.resolve.PyResolveUtil;
import com.jetbrains.python.psi.resolve.ResolveImportUtil;
import com.jetbrains.python.psi.stubs.PyImportElementStub;
import org.jetbrains.annotations.NotNull;
@@ -36,7 +35,6 @@
import javax.swing.*;
import java.util.Collections;
-import java.util.List;
/**
* The "import foo" or "import foo as bar" parts.
@@ -150,7 +148,7 @@
buf.append("from ");
PyReferenceExpression imp_src = ((PyFromImportStatement)elt).getImportSource();
if (imp_src != null) {
- buf.append(PyResolveUtil.toPath(imp_src));
+ buf.append(PyPsiUtils.toPath(imp_src));
}
else {
buf.append("<?>");
@@ -185,10 +183,7 @@
if (ret == null) {
final PyReferenceExpression importReference = getImportReferenceExpression();
if (importReference != null) {
- final List<PyExpression> qualifiers = PyResolveUtil.unwindQualifiers(importReference);
- if (qualifiers.size() > 0) {
- ret = qualifiers.get(0);
- }
+ ret = PyPsiUtils.getFirstQualifier(importReference);
}
}
if (ret == null) {
diff --git a/python/src/com/jetbrains/python/psi/impl/PyKeywordArgumentManipulator.java b/python/src/com/jetbrains/python/psi/impl/PyKeywordArgumentManipulator.java
index fb4538e..5b56518 100644
--- a/python/src/com/jetbrains/python/psi/impl/PyKeywordArgumentManipulator.java
+++ b/python/src/com/jetbrains/python/psi/impl/PyKeywordArgumentManipulator.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -23,13 +23,14 @@
import com.jetbrains.python.psi.PyCallExpression;
import com.jetbrains.python.psi.PyElementGenerator;
import com.jetbrains.python.psi.PyKeywordArgument;
+import org.jetbrains.annotations.NotNull;
/**
* @author yole
*/
public class PyKeywordArgumentManipulator extends AbstractElementManipulator<PyKeywordArgument> {
@Override
- public PyKeywordArgument handleContentChange(PyKeywordArgument element, TextRange range, String newContent) throws IncorrectOperationException {
+ public PyKeywordArgument handleContentChange(@NotNull PyKeywordArgument element, @NotNull TextRange range, String newContent) throws IncorrectOperationException {
final ASTNode keywordNode = element.getKeywordNode();
if (keywordNode != null && keywordNode.getTextRange().shiftRight(-element.getTextRange().getStartOffset()).equals(range)) {
final LanguageLevel langLevel = LanguageLevel.forElement(element);
diff --git a/python/src/com/jetbrains/python/psi/impl/PyNamedParameterImpl.java b/python/src/com/jetbrains/python/psi/impl/PyNamedParameterImpl.java
index b0a0367..6ad33d6 100644
--- a/python/src/com/jetbrains/python/psi/impl/PyNamedParameterImpl.java
+++ b/python/src/com/jetbrains/python/psi/impl/PyNamedParameterImpl.java
@@ -31,6 +31,8 @@
import com.jetbrains.python.PyNames;
import com.jetbrains.python.PyTokenTypes;
import com.jetbrains.python.PythonDialectsTokenSetProvider;
+import com.jetbrains.python.codeInsight.controlflow.ScopeOwner;
+import com.jetbrains.python.codeInsight.dataflow.scope.ScopeUtil;
import com.jetbrains.python.psi.*;
import com.jetbrains.python.psi.resolve.PyResolveContext;
import com.jetbrains.python.psi.stubs.PyNamedParameterStub;
@@ -236,6 +238,9 @@
if (defaultValue != null) {
final PyType type = context.getType(defaultValue);
if (type != null && !(type instanceof PyNoneType)) {
+ if (type instanceof PyTupleType) {
+ return PyTypeParser.getTypeByName(this, "collections.Iterable");
+ }
return type;
}
}
@@ -247,15 +252,18 @@
@Override
public boolean process(@NotNull PyCallExpression call) {
final PyResolveContext resolveContext = PyResolveContext.noImplicits().withTypeEvalContext(context);
- final CallArgumentsMapping mapping = call.getArgumentList().analyzeCall(resolveContext);
- for (Map.Entry<PyExpression, PyNamedParameter> entry : mapping.getPlainMappedParams().entrySet()) {
- if (entry.getValue() == PyNamedParameterImpl.this) {
- final PyExpression argument = entry.getKey();
- if (argument != null) {
- final PyType type = context.getType(argument);
- if (type != null) {
- types.add(type);
- return true;
+ final PyArgumentList argumentList = call.getArgumentList();
+ if (argumentList != null) {
+ final CallArgumentsMapping mapping = argumentList.analyzeCall(resolveContext);
+ for (Map.Entry<PyExpression, PyNamedParameter> entry : mapping.getPlainMappedParams().entrySet()) {
+ if (entry.getValue() == PyNamedParameterImpl.this) {
+ final PyExpression argument = entry.getKey();
+ if (argument != null) {
+ final PyType type = context.getType(argument);
+ if (type != null) {
+ types.add(type);
+ return true;
+ }
}
}
}
@@ -298,9 +306,9 @@
@NotNull
@Override
public SearchScope getUseScope() {
- PyFunction func = PsiTreeUtil.getParentOfType(this, PyFunction.class);
- if (func != null) {
- return new LocalSearchScope(func);
+ final ScopeOwner owner = ScopeUtil.getScopeOwner(this);
+ if (owner instanceof PyFunction) {
+ return new LocalSearchScope(owner);
}
return new LocalSearchScope(getContainingFile());
}
diff --git a/python/src/com/jetbrains/python/psi/impl/PyPathEvaluator.java b/python/src/com/jetbrains/python/psi/impl/PyPathEvaluator.java
index d5e1527..7a22165 100644
--- a/python/src/com/jetbrains/python/psi/impl/PyPathEvaluator.java
+++ b/python/src/com/jetbrains/python/psi/impl/PyPathEvaluator.java
@@ -85,7 +85,7 @@
else if (PyNames.CURDIR.equals(expr.getName())) {
return ".";
}
- if (expr.getQualifier() == null && PyNames.FILE.equals(expr.getReferencedName())) {
+ if (!expr.isQualified() && PyNames.FILE.equals(expr.getReferencedName())) {
return myContainingFilePath;
}
return super.evaluateReferenceExpression(expr);
diff --git a/python/src/com/jetbrains/python/psi/impl/PyPrefixExpressionImpl.java b/python/src/com/jetbrains/python/psi/impl/PyPrefixExpressionImpl.java
index 946e719..71658f0 100644
--- a/python/src/com/jetbrains/python/psi/impl/PyPrefixExpressionImpl.java
+++ b/python/src/com/jetbrains/python/psi/impl/PyPrefixExpressionImpl.java
@@ -19,6 +19,7 @@
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiPolyVariantReference;
import com.intellij.psi.PsiReference;
+import com.intellij.psi.util.QualifiedName;
import com.jetbrains.python.PyElementTypes;
import com.jetbrains.python.PyNames;
import com.jetbrains.python.PyTokenTypes;
@@ -98,6 +99,17 @@
return getOperand();
}
+ @Nullable
+ @Override
+ public QualifiedName asQualifiedName() {
+ return PyPsiUtils.asQualifiedName(this);
+ }
+
+ @Override
+ public boolean isQualified() {
+ return getQualifier() != null;
+ }
+
@Override
public String getReferencedName() {
PyElementType t = getOperator();
diff --git a/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java b/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java
index 7b778a5..47ae589 100644
--- a/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java
+++ b/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java
@@ -17,6 +17,7 @@
import com.intellij.lang.ASTNode;
import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.extensions.ExtensionException;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.util.Ref;
import com.intellij.psi.*;
@@ -50,6 +51,7 @@
*/
public class PyReferenceExpressionImpl extends PyElementImpl implements PyReferenceExpression {
private static final Logger LOG = Logger.getInstance("#com.jetbrains.python.psi.impl.PyReferenceExpressionImpl");
+ private QualifiedName myQualifiedName = null;
public PyReferenceExpressionImpl(ASTNode astNode) {
super(astNode);
@@ -99,6 +101,11 @@
return (PyExpression)(nodes.length == 1 ? nodes[0].getPsi() : null);
}
+ @Override
+ public boolean isQualified() {
+ return getQualifier() != null;
+ }
+
@Nullable
public String getReferencedName() {
final ASTNode nameElement = getNameElement();
@@ -173,7 +180,10 @@
@Nullable
public QualifiedName asQualifiedName() {
- return PyQualifiedNameFactory.fromReferenceChain(PyResolveUtil.unwindQualifiers(this));
+ if (myQualifiedName == null) {
+ myQualifiedName = PyPsiUtils.asQualifiedName(this);
+ }
+ return myQualifiedName;
}
@Override
@@ -186,8 +196,8 @@
return null;
}
try {
- final PyExpression qualifier = getQualifier();
- if (qualifier == null) {
+ final boolean qualified = isQualified();
+ if (!qualified) {
String name = getReferencedName();
if (PyNames.NONE.equals(name)) {
return PyNoneType.INSTANCE;
@@ -197,7 +207,7 @@
if (type != null) {
return type;
}
- if (qualifier != null) {
+ if (qualified) {
PyType maybe_type = PyUtil.getSpecialAttributeType(this, context);
if (maybe_type != null) return maybe_type;
Ref<PyType> typeOfProperty = getTypeOfProperty(context);
@@ -264,7 +274,7 @@
if (qualifierType instanceof PyClassType) {
final PyClassType classType = (PyClassType)qualifierType;
PyClass pyClass = classType.getPyClass();
- Property property = pyClass.findProperty(name);
+ Property property = pyClass.findProperty(name, true);
if (property != null) {
if (classType.isDefinition()) {
return Ref.<PyType>create(PyBuiltinCache.getInstance(pyClass).getObjectType(PyNames.PROPERTY));
@@ -291,7 +301,7 @@
}
@Nullable
- private PyType getTypeFromProviders(TypeEvalContext context) {
+ private PyType getTypeFromProviders(@NotNull TypeEvalContext context) {
for (PyTypeProvider provider : Extensions.getExtensions(PyTypeProvider.EP_NAME)) {
try {
final PyType type = provider.getReferenceExpressionType(this, context);
@@ -300,7 +310,7 @@
}
}
catch (AbstractMethodError e) {
- LOG.info(e);
+ LOG.info(new ExtensionException(provider.getClass()));
}
}
return null;
@@ -404,6 +414,12 @@
return null;
}
+ @Override
+ public void subtreeChanged() {
+ super.subtreeChanged();
+ myQualifiedName = null;
+ }
+
private static class QualifiedResolveResultImpl extends RatedResolveResult implements QualifiedResolveResult {
// a trivial implementation
private List<PyExpression> myQualifiers;
diff --git a/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionManipulator.java b/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionManipulator.java
index 5ea4583..9e20ba5 100644
--- a/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionManipulator.java
+++ b/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionManipulator.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,18 +20,21 @@
import com.intellij.psi.AbstractElementManipulator;
import com.intellij.util.IncorrectOperationException;
import com.jetbrains.python.psi.PyReferenceExpression;
+import org.jetbrains.annotations.NotNull;
/**
* @author oleg
*/
public class PyReferenceExpressionManipulator extends AbstractElementManipulator<PyReferenceExpression> {
- public PyReferenceExpression handleContentChange(final PyReferenceExpression element, final TextRange range, final String newContent)
+ @Override
+ public PyReferenceExpression handleContentChange(@NotNull final PyReferenceExpression element, @NotNull final TextRange range, final String newContent)
throws IncorrectOperationException {
return null;
}
+ @NotNull
@Override
- public TextRange getRangeInElement(final PyReferenceExpression element) {
+ public TextRange getRangeInElement(@NotNull final PyReferenceExpression element) {
final ASTNode nameElement = element.getNameElement();
final int startOffset = nameElement != null ? nameElement.getStartOffset() : element.getTextRange().getEndOffset();
return new TextRange(startOffset - element.getTextOffset(), element.getTextLength());
diff --git a/python/src/com/jetbrains/python/psi/impl/PyStarImportElementImpl.java b/python/src/com/jetbrains/python/psi/impl/PyStarImportElementImpl.java
index a30a2de..307ac8e 100644
--- a/python/src/com/jetbrains/python/psi/impl/PyStarImportElementImpl.java
+++ b/python/src/com/jetbrains/python/psi/impl/PyStarImportElementImpl.java
@@ -22,7 +22,6 @@
import com.intellij.util.containers.HashSet;
import com.jetbrains.python.psi.*;
import com.jetbrains.python.psi.resolve.PyResolveContext;
-import com.jetbrains.python.psi.resolve.PyResolveUtil;
import com.jetbrains.python.psi.resolve.RatedResolveResult;
import com.jetbrains.python.psi.types.PyModuleType;
import com.jetbrains.python.toolbox.ChainIterable;
@@ -101,7 +100,7 @@
if (elt != null) { // always? who knows :)
PyReferenceExpression imp_src = elt.getImportSource();
if (imp_src != null) {
- return PyResolveUtil.toPath(imp_src);
+ return PyPsiUtils.toPath(imp_src);
}
}
return "<?>";
diff --git a/python/src/com/jetbrains/python/psi/impl/PyStringLiteralExpressionImpl.java b/python/src/com/jetbrains/python/psi/impl/PyStringLiteralExpressionImpl.java
index 7f03dcd..bf51973 100644
--- a/python/src/com/jetbrains/python/psi/impl/PyStringLiteralExpressionImpl.java
+++ b/python/src/com/jetbrains/python/psi/impl/PyStringLiteralExpressionImpl.java
@@ -21,7 +21,6 @@
import com.intellij.lang.injection.InjectedLanguageManager;
import com.intellij.navigation.ItemPresentation;
import com.intellij.openapi.util.Pair;
-import com.intellij.openapi.util.Ref;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.*;
import com.intellij.psi.impl.source.resolve.reference.ReferenceProvidersRegistry;
@@ -50,9 +49,21 @@
public static final Pattern PATTERN_ESCAPE = Pattern
.compile("\\\\(\n|\\\\|'|\"|a|b|f|n|r|t|v|([0-7]{1,3})|x([0-9a-fA-F]{1,2})" + "|N(\\{.*?\\})|u([0-9a-fA-F]{4})|U([0-9a-fA-F]{8}))");
// -> 1 -> 2 <--> 3 <- -> 4 <--> 5 <- -> 6 <-<-
+
+ private enum EscapeRegexGroup {
+ WHOLE_MATCH,
+ ESCAPED_SUBSTRING,
+ OCTAL,
+ HEXADECIMAL,
+ UNICODE_NAMED,
+ UNICODE_16BIT,
+ UNICODE_32BIT
+ }
+
private static final Map<String, String> escapeMap = initializeEscapeMap();
private String stringValue;
private List<TextRange> valueTextRanges;
+ @Nullable private List<Pair<TextRange, String>> myDecodedFragments;
private final DefaultRegExpPropertiesProvider myPropertiesProvider;
private static Map<String, String> initializeEscapeMap() {
@@ -85,6 +96,7 @@
super.subtreeChanged();
stringValue = null;
valueTextRanges = null;
+ myDecodedFragments = null;
}
public List<TextRange> getStringValueTextRanges() {
@@ -133,7 +145,19 @@
private static boolean isUnicode(String text) {
return text.length() > 0 && Character.toUpperCase(text.charAt(0)) == 'U'; //TODO[ktisha]
- }
+ }
+
+ private boolean isUnicodeByDefault() {
+ if (LanguageLevel.forElement(this).isAtLeast(LanguageLevel.PYTHON30)) {
+ return true;
+ }
+ final PsiFile file = getContainingFile();
+ if (file instanceof PyFile) {
+ final PyFile pyFile = (PyFile)file;
+ return pyFile.hasImportFromFuture(FutureFeature.UNICODE_LITERALS);
+ }
+ return false;
+ }
private static boolean isBytes(String text) {
return text.length() > 0 && Character.toUpperCase(text.charAt(0)) == 'B';
@@ -143,20 +167,92 @@
return text.length() > 0 && Character.toUpperCase(text.charAt(0)) == 'C';
}
- public void iterateCharacterRanges(TextRangeConsumer consumer) {
- int elStart = getTextRange().getStartOffset();
- for (ASTNode child : getStringNodes()) {
- final String text = child.getText();
- TextRange textRange = getNodeTextRange(text);
- int offset = child.getTextRange().getStartOffset() - elStart + textRange.getStartOffset();
- String undecoded = textRange.substring(text);
- if (!iterateCharacterRanges(consumer, undecoded, offset, isRaw(text), isUnicode(text))) {
- break;
+ @Override
+ @NotNull
+ public List<Pair<TextRange, String>> getDecodedFragments() {
+ if (myDecodedFragments == null) {
+ final List<Pair<TextRange, String>> result = new ArrayList<Pair<TextRange, String>>();
+ final int elementStart = getTextRange().getStartOffset();
+ final boolean unicodeByDefault = isUnicodeByDefault();
+ for (ASTNode node : getStringNodes()) {
+ final String text = node.getText();
+ final TextRange textRange = getNodeTextRange(text);
+ final int offset = node.getTextRange().getStartOffset() - elementStart + textRange.getStartOffset();
+ final String encoded = textRange.substring(text);
+ result.addAll(getDecodedFragments(encoded, offset, isRaw(text), unicodeByDefault || isUnicode(text)));
}
+ myDecodedFragments = result;
}
+ return myDecodedFragments;
}
+ @NotNull
+ private static List<Pair<TextRange, String>> getDecodedFragments(@NotNull String encoded, int offset, boolean raw, boolean unicode) {
+ final List<Pair<TextRange, String>> result = new ArrayList<Pair<TextRange, String>>();
+ final Matcher escMatcher = PATTERN_ESCAPE.matcher(encoded);
+ int index = 0;
+ while (escMatcher.find(index)) {
+ if (index < escMatcher.start()) {
+ final TextRange range = TextRange.create(index, escMatcher.start());
+ final TextRange offsetRange = range.shiftRight(offset);
+ result.add(Pair.create(offsetRange, range.substring(encoded)));
+ }
+ final String octal = escapeRegexGroup(escMatcher, EscapeRegexGroup.OCTAL);
+ final String hex = escapeRegexGroup(escMatcher, EscapeRegexGroup.HEXADECIMAL);
+ // TODO: Implement unicode character name escapes: EscapeRegexGroup.UNICODE_NAMED
+ final String unicode16 = escapeRegexGroup(escMatcher, EscapeRegexGroup.UNICODE_16BIT);
+ final String unicode32 = escapeRegexGroup(escMatcher, EscapeRegexGroup.UNICODE_32BIT);
+ final String wholeMatch = escapeRegexGroup(escMatcher, EscapeRegexGroup.WHOLE_MATCH);
+
+ final boolean escapedUnicode = raw && unicode || !raw;
+
+ final String str;
+ if (!raw && octal != null) {
+ str = new String(new char[]{(char)Integer.parseInt(octal, 8)});
+ }
+ else if (!raw && hex != null) {
+ str = new String(new char[]{(char)Integer.parseInt(hex, 16)});
+ }
+ else if (escapedUnicode && unicode16 != null) {
+ str = unicode ? new String(new char[]{(char)Integer.parseInt(unicode16, 16)}) : wholeMatch;
+ }
+ else if (escapedUnicode && unicode32 != null) {
+ String s = wholeMatch;
+ if (unicode) {
+ try {
+ s = new String(Character.toChars((int)Long.parseLong(unicode32, 16)));
+ }
+ catch (IllegalArgumentException ignored) {
+ }
+ }
+ str = s;
+ }
+ else if (raw) {
+ str = wholeMatch;
+ }
+ else {
+ final String toReplace = escapeRegexGroup(escMatcher, EscapeRegexGroup.ESCAPED_SUBSTRING);
+ str = escapeMap.get(toReplace);
+ }
+
+ if (str != null) {
+ final TextRange wholeMatchRange = TextRange.create(escMatcher.start(), escMatcher.end());
+ result.add(Pair.create(wholeMatchRange.shiftRight(offset), str));
+ }
+
+ index = escMatcher.end();
+ }
+ final TextRange range = TextRange.create(index, encoded.length());
+ final TextRange offRange = range.shiftRight(offset);
+ result.add(Pair.create(offRange, range.substring(encoded)));
+ return result;
+ }
+
+ @Nullable
+ private static String escapeRegexGroup(@NotNull Matcher matcher, EscapeRegexGroup group) {
+ return matcher.group(group.ordinal());
+ }
public List<ASTNode> getStringNodes() {
return Arrays.asList(getNode().getChildren(PyTokenTypes.STRING_NODES));
@@ -165,14 +261,11 @@
public String getStringValue() {
//ASTNode child = getNode().getFirstChildNode();
//assert child != null;
- if (stringValue == null) {
+ if (stringValue == null) {
final StringBuilder out = new StringBuilder();
- iterateCharacterRanges(new TextRangeConsumer() {
- public boolean process(int startOffset, int endOffset, String value) {
- out.append(value);
- return true;
- }
- });
+ for (Pair<TextRange, String> fragment : getDecodedFragments()) {
+ out.append(fragment.getSecond());
+ }
stringValue = out.toString();
}
return stringValue;
@@ -190,106 +283,6 @@
return new TextRange(0, getTextLength());
}
- private static boolean iterateCharacterRanges(TextRangeConsumer consumer, String undecoded, int off, boolean raw, boolean unicode) {
- if (raw) {
- return iterateRawCharacterRanges(consumer, undecoded, off, unicode);
- }
- Matcher escMatcher = PATTERN_ESCAPE.matcher(undecoded);
- int index = 0;
- while (escMatcher.find(index)) {
- for (int i = index; i < escMatcher.start(); i++) {
- if (!consumer.process(off + i, off + i + 1, Character.toString(undecoded.charAt(i)))) {
- return false;
- }
- }
- String octal = escMatcher.group(2);
- String hex = escMatcher.group(3);
- String str = null;
- if (octal != null) {
- str = new String(new char[]{(char)Integer.parseInt(octal, 8)});
-
- }
- else if (hex != null) {
- str = new String(new char[]{(char)Integer.parseInt(hex, 16)});
-
- }
- else {
- String toReplace = escMatcher.group(1);
- String replacement = escapeMap.get(toReplace);
- if (replacement != null) {
- str = replacement;
- }
- }
- String unicodeName = escMatcher.group(4);
- String unicode32 = escMatcher.group(6);
-
- if (unicode32 != null) {
- str = unicode ? new String(Character.toChars((int)Long.parseLong(unicode32, 16))) : unicode32;
- }
- if (unicodeName != null) {
- //TOLATER: implement unicode character name escapes
- }
- String unicode16 = escMatcher.group(5);
- if (unicode16 != null) {
- str = unicode ? new String(new char[]{(char)Integer.parseInt(unicode16, 16)}) : unicode16;
- }
-
- if (str != null) {
- int start = escMatcher.start();
- int end = escMatcher.end();
- if (!consumer.process(off + start, off + end, str)) {
- return false;
- }
- }
- index = escMatcher.end();
- }
- for (int i = index; i < undecoded.length(); i++) {
- if (!consumer.process(off + i, off + i + 1, Character.toString(undecoded.charAt(i)))) {
- return false;
- }
- }
- return true;
- }
-
- private static boolean iterateRawCharacterRanges(TextRangeConsumer consumer, String undecoded, int off, boolean unicode) {
- for (int i = 0; i < undecoded.length(); i++) {
- char c = undecoded.charAt(i);
- if (unicode && c == '\\' && i < undecoded.length()-1) {
- char c2 = undecoded.charAt(i+1);
- if (c2 == 'u' && i < undecoded.length()-5) {
- try {
- char u = (char) Integer.parseInt(undecoded.substring(i+2, i+6), 16);
- if (!consumer.process(off+i, off+i+ 6, Character.toString(u))) {
- return false;
- }
- }
- catch (NumberFormatException ignore) { }
- //noinspection AssignmentToForLoopParameter
- i += 5;
- continue;
- }
- if (c2 == 'U' && i < undecoded.length()-9) {
- // note: Java has 16-bit chars, so this code will truncate characters which don't fit in 16 bits
- try {
- char u = (char) Long.parseLong(undecoded.substring(i+2, i+10), 16);
- if (!consumer.process(off+i, off+i+10, Character.toString(u))) {
- return false;
- }
- }
- catch (NumberFormatException ignore) { }
- //noinspection AssignmentToForLoopParameter
- i += 9;
- continue;
- }
- }
- if (!consumer.process(off + i, off + i + 1, Character.toString(c))) {
- return false;
- }
- }
-
- return true;
- }
-
@Override
public String toString() {
return super.toString() + ": " + getStringValue();
@@ -368,57 +361,60 @@
@Override
public boolean decode(@NotNull final TextRange rangeInsideHost, @NotNull final StringBuilder outChars) {
- final PyDocStringOwner
- docStringOwner = PsiTreeUtil.getParentOfType(myHost, PyDocStringOwner.class);
- if (docStringOwner != null && myHost.equals(docStringOwner.getDocStringExpression())) {
- outChars.append(myHost.getText(), rangeInsideHost.getStartOffset(), rangeInsideHost.getEndOffset());
- }
- else {
- myHost.iterateCharacterRanges(new TextRangeConsumer() {
- public boolean process(int startOffset, int endOffset, String value) {
- int xsectStart = Math.max(startOffset, rangeInsideHost.getStartOffset());
- int xsectEnd = Math.min(endOffset, rangeInsideHost.getEndOffset());
- if (xsectEnd > xsectStart) {
- outChars.append(value);
- }
- return endOffset < rangeInsideHost.getEndOffset();
+ for (Pair<TextRange, String> fragment : myHost.getDecodedFragments()) {
+ final TextRange encodedTextRange = fragment.getFirst();
+ final TextRange intersection = encodedTextRange.intersection(rangeInsideHost);
+ if (intersection != null && !intersection.isEmpty()) {
+ final String value = fragment.getSecond();
+ final String intersectedValue;
+ if (value.length() == 1 || value.length() == intersection.getLength()) {
+ intersectedValue = value;
}
- });
+ else {
+ final int start = Math.max(0, rangeInsideHost.getStartOffset() - encodedTextRange.getStartOffset());
+ final int end = Math.min(value.length(), start + intersection.getLength());
+ intersectedValue = value.substring(start, end);
+ }
+ outChars.append(intersectedValue);
+ }
}
return true;
}
@Override
public int getOffsetInHost(final int offsetInDecoded, @NotNull final TextRange rangeInsideHost) {
- final Ref<Integer> resultRef = Ref.create(-1);
- final Ref<Integer> indexRef = Ref.create(0);
- final Ref<Integer> lastEndOffsetRef = Ref.create(-1);
- myHost.iterateCharacterRanges(new TextRangeConsumer() {
- @Override
- public boolean process(int startOffset, int endOffset, String value) {
- if (startOffset > rangeInsideHost.getEndOffset()) {
- return false;
+ int offset = 0;
+ int endOffset = -1;
+ for (Pair<TextRange, String> fragment : myHost.getDecodedFragments()) {
+ final TextRange encodedTextRange = fragment.getFirst();
+ final TextRange intersection = encodedTextRange.intersection(rangeInsideHost);
+ if (intersection != null && !intersection.isEmpty()) {
+ final String value = fragment.getSecond();
+ final int valueLength = value.length();
+ final int intersectionLength = intersection.getLength();
+ if (valueLength == 0) {
+ return -1;
}
- lastEndOffsetRef.set(endOffset);
- if (startOffset >= rangeInsideHost.getStartOffset()) {
- final int i = indexRef.get();
- if (i == offsetInDecoded) {
- resultRef.set(startOffset);
- return false;
+ else if (valueLength == 1) {
+ if (offset == offsetInDecoded) {
+ return intersection.getStartOffset();
}
- indexRef.set(i + 1);
+ offset++;
}
- return true;
+ else {
+ if (offset + intersectionLength >= offsetInDecoded) {
+ final int delta = offsetInDecoded - offset;
+ return intersection.getStartOffset() + delta;
+ }
+ offset += intersectionLength;
+ }
+ endOffset = intersection.getEndOffset();
}
- });
- final int result = resultRef.get();
- if (result != -1) {
- return result;
}
- // We should handle the position of a character at the end of rangeInsideHost, because LeafPatcher expects it to be valid
- final int lastEndOffset = lastEndOffsetRef.get();
- if (indexRef.get() == offsetInDecoded && lastEndOffset == rangeInsideHost.getEndOffset()) {
- return lastEndOffset;
+ // XXX: According to the real use of getOffsetInHost() it should return the correct host offset for the offset in decoded at the
+ // end of the range inside host, not -1
+ if (offset == offsetInDecoded) {
+ return endOffset;
}
return -1;
}
@@ -431,23 +427,7 @@
@Override
public int valueOffsetToTextOffset(int valueOffset) {
- final Ref<Integer> offsetInDecodedRef = new Ref<Integer>(valueOffset);
- final Ref<Integer> result = new Ref<Integer>(-1);
- iterateCharacterRanges(new TextRangeConsumer() {
- public boolean process(int startOffset, int endOffset, String value) {
- if (value.length() > offsetInDecodedRef.get()) {
- result.set(startOffset + offsetInDecodedRef.get());
- return false;
- }
- offsetInDecodedRef.set(offsetInDecodedRef.get() - value.length());
- if (offsetInDecodedRef.get() == 0) {
- result.set(endOffset);
- return false;
- }
- return true;
- }
- });
- return result.get();
+ return createLiteralTextEscaper().getOffsetInHost(valueOffset, getStringValueTextRange());
}
public boolean characterNeedsEscaping(char c) {
diff --git a/python/src/com/jetbrains/python/psi/impl/PyStringLiteralExpressionManipulator.java b/python/src/com/jetbrains/python/psi/impl/PyStringLiteralExpressionManipulator.java
index f98acde..5032d12 100644
--- a/python/src/com/jetbrains/python/psi/impl/PyStringLiteralExpressionManipulator.java
+++ b/python/src/com/jetbrains/python/psi/impl/PyStringLiteralExpressionManipulator.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,13 +20,15 @@
import com.intellij.psi.AbstractElementManipulator;
import com.jetbrains.python.PythonStringUtil;
import com.jetbrains.python.psi.PyElementGenerator;
+import org.jetbrains.annotations.NotNull;
/**
* @author traff
*/
public class PyStringLiteralExpressionManipulator extends AbstractElementManipulator<PyStringLiteralExpressionImpl> {
- public PyStringLiteralExpressionImpl handleContentChange(PyStringLiteralExpressionImpl element, TextRange range, String newContent) {
+ @Override
+ public PyStringLiteralExpressionImpl handleContentChange(@NotNull PyStringLiteralExpressionImpl element, @NotNull TextRange range, String newContent) {
Pair<String, String> quotes = PythonStringUtil.getQuotes(range.substring(element.getText()));
if (quotes != null) {
@@ -39,8 +41,9 @@
.replace(PyElementGenerator.getInstance(element.getProject()).createStringLiteralAlreadyEscaped(newName));
}
+ @NotNull
@Override
- public TextRange getRangeInElement(PyStringLiteralExpressionImpl element) {
+ public TextRange getRangeInElement(@NotNull PyStringLiteralExpressionImpl element) {
Pair<String, String> pair = PythonStringUtil.getQuotes(element.getText());
if (pair != null) {
return TextRange.from(pair.first.length(), element.getTextLength() - pair.first.length() - pair.second.length());
diff --git a/python/src/com/jetbrains/python/psi/impl/PySubscriptionExpressionImpl.java b/python/src/com/jetbrains/python/psi/impl/PySubscriptionExpressionImpl.java
index c19e9ad..6143828 100644
--- a/python/src/com/jetbrains/python/psi/impl/PySubscriptionExpressionImpl.java
+++ b/python/src/com/jetbrains/python/psi/impl/PySubscriptionExpressionImpl.java
@@ -19,6 +19,7 @@
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiPolyVariantReference;
import com.intellij.psi.PsiReference;
+import com.intellij.psi.util.QualifiedName;
import com.jetbrains.python.PyNames;
import com.jetbrains.python.PyTokenTypes;
import com.jetbrains.python.PythonDialectsTokenSetProvider;
@@ -37,10 +38,21 @@
super(astNode);
}
+ @NotNull
public PyExpression getOperand() {
return childToPsiNotNull(PythonDialectsTokenSetProvider.INSTANCE.getExpressionTokens(), 0);
}
+ @NotNull
+ @Override
+ public PyExpression getRootOperand() {
+ PyExpression operand = getOperand();
+ while (operand instanceof PySubscriptionExpression) {
+ operand = ((PySubscriptionExpression)operand).getOperand();
+ }
+ return operand;
+ }
+
@Nullable
public PyExpression getIndexExpression() {
return childToPsi(PythonDialectsTokenSetProvider.INSTANCE.getExpressionTokens(), 1);
@@ -74,7 +86,7 @@
res = ((PySubscriptableType)type).getElementType(indexExpression, context);
}
else if (type instanceof PyCollectionType) {
- res = ((PyCollectionType) type).getElementType(context);
+ res = ((PyCollectionType)type).getElementType(context);
}
}
}
@@ -96,6 +108,17 @@
return getOperand();
}
+ @Nullable
+ @Override
+ public QualifiedName asQualifiedName() {
+ return PyPsiUtils.asQualifiedName(this);
+ }
+
+ @Override
+ public boolean isQualified() {
+ return getQualifier() != null;
+ }
+
@Override
public String getReferencedName() {
String res = PyNames.GETITEM;
diff --git a/python/src/com/jetbrains/python/psi/impl/PyTargetExpressionImpl.java b/python/src/com/jetbrains/python/psi/impl/PyTargetExpressionImpl.java
index fd49c25..c56111e 100644
--- a/python/src/com/jetbrains/python/psi/impl/PyTargetExpressionImpl.java
+++ b/python/src/com/jetbrains/python/psi/impl/PyTargetExpressionImpl.java
@@ -60,6 +60,8 @@
* @author yole
*/
public class PyTargetExpressionImpl extends PyPresentableElementImpl<PyTargetExpressionStub> implements PyTargetExpression {
+ QualifiedName myQualifiedName;
+
public PyTargetExpressionImpl(ASTNode astNode) {
super(astNode);
}
@@ -241,8 +243,8 @@
if (exprType instanceof PyClassType) {
final PyClass cls = ((PyClassType)exprType).getPyClass();
final PyFunction enter = cls.findMethodByName(PyNames.ENTER, true);
- if (enter != null) {
- final PyType enterType = enter.getReturnType(context, null);
+ if (enter instanceof PyFunctionImpl) {
+ final PyType enterType = ((PyFunctionImpl)enter).getReturnTypeWithoutCallSite(context, expression);
if (enterType != null) {
return enterType;
}
@@ -356,7 +358,7 @@
}
if (source != null) {
final PyType sourceType = context.getType(source);
- final PyType type = getIterationType(sourceType, source, context);
+ final PyType type = getIterationType(sourceType, source, this, context);
if (type instanceof PyTupleType && target instanceof PyTupleExpression) {
return getTypeFromTupleAssignment((PyTupleExpression)target, (PyTupleType)type);
}
@@ -368,7 +370,8 @@
}
@Nullable
- private static PyType getIterationType(@Nullable PyType iterableType, @Nullable PyExpression source, @NotNull TypeEvalContext context) {
+ private static PyType getIterationType(@Nullable PyType iterableType, @Nullable PyExpression source, @NotNull PsiElement anchor,
+ @NotNull TypeEvalContext context) {
PyType result = null;
if (iterableType instanceof PyCollectionType) {
result = ((PyCollectionType)iterableType).getElementType(context);
@@ -386,43 +389,32 @@
final Collection<PyType> members = ((PyUnionType)iterableType).getMembers();
final List<PyType> iterationTypes = new ArrayList<PyType>();
for (PyType member : members) {
- iterationTypes.add(getIterationType(member, source, context));
+ iterationTypes.add(getIterationType(member, source, anchor, context));
}
return PyUnionType.union(iterationTypes);
}
- else if (iterableType instanceof PyClassType) {
- final PyClass pyClass = ((PyClassType)iterableType).getPyClass();
- for (PyTypeProvider provider: Extensions.getExtensions(PyTypeProvider.EP_NAME)) {
- final PyType iterationType = provider.getIterationType(pyClass);
- if (iterationType != null) {
- result = iterationType;
- break;
+ else if (iterableType != null && PyABCUtil.isSubtype(iterableType, PyNames.ITERATOR, context)) {
+ final PyFunction iterateMethod = findMethodByName(iterableType, PyNames.ITER, context);
+ PyType iterateMethodType = null;
+ if (iterateMethod != null) {
+ iterateMethodType = getContextSensitiveType(iterateMethod, context, source);
+ }
+ if (iterateMethodType instanceof PyCollectionType) {
+ final PyCollectionType collectionType = (PyCollectionType)iterateMethodType;
+ result = collectionType.getElementType(context);
+ }
+ if (result == null) {
+ final String nextMethodName = LanguageLevel.forElement(anchor).isAtLeast(LanguageLevel.PYTHON30) ?
+ PyNames.DUNDER_NEXT : PyNames.NEXT;
+ final PyFunction next = findMethodByName(iterableType, nextMethodName, context);
+ if (next != null) {
+ result = getContextSensitiveType(next, context, source);
}
}
- if (PyABCUtil.isSubclass(pyClass, PyNames.ITERATOR)) {
- final PyFunction iterateMethod = pyClass.findMethodByName(PyNames.ITER, true);
- PyType iterateMethodType = null;
- if (iterateMethod != null) {
- iterateMethodType = getContextSensitiveType(iterateMethod, context, source);
- }
- if (iterateMethodType instanceof PyCollectionType) {
- final PyCollectionType collectionType = (PyCollectionType)iterateMethodType;
- result = collectionType.getElementType(context);
- }
- if (result == null) {
- PyFunction next = pyClass.findMethodByName(PyNames.NEXT, true);
- if (next == null) {
- next = pyClass.findMethodByName(PyNames.DUNDER_NEXT, true);
- }
- if (next != null) {
- result = getContextSensitiveType(next, context, source);
- }
- }
- if (result == null) {
- final PyFunction getItem = pyClass.findMethodByName(PyNames.GETITEM, true);
- if (getItem != null) {
- result = getContextSensitiveType(getItem, context, source);
- }
+ if (result == null) {
+ final PyFunction getItem = findMethodByName(iterableType, PyNames.GETITEM, context);
+ if (getItem != null) {
+ result = getContextSensitiveType(getItem, context, source);
}
}
}
@@ -430,6 +422,20 @@
}
@Nullable
+ private static PyFunction findMethodByName(@NotNull PyType type, @NotNull String name, @NotNull TypeEvalContext context) {
+ final PyResolveContext resolveContext = PyResolveContext.defaultContext().withTypeEvalContext(context);
+ final List<? extends RatedResolveResult> results = type.resolveMember(name, null, AccessDirection.READ, resolveContext);
+ if (results != null && !results.isEmpty()) {
+ final RatedResolveResult result = results.get(0);
+ final PsiElement element = result.getElement();
+ if (element instanceof PyFunction) {
+ return (PyFunction)element;
+ }
+ }
+ return null;
+ }
+
+ @Nullable
private static PyType getContextSensitiveType(@NotNull PyFunction function, @NotNull TypeEvalContext context,
@Nullable PyExpression source) {
if (function instanceof PyFunctionImpl) {
@@ -459,6 +465,15 @@
return qualifier != null ? (PyExpression) qualifier.getPsi() : null;
}
+ @Nullable
+ @Override
+ public QualifiedName asQualifiedName() {
+ if (myQualifiedName == null) {
+ myQualifiedName = PyPsiUtils.asQualifiedName(this);
+ }
+ return myQualifiedName;
+ }
+
public String toString() {
return super.toString() + ": " + getName();
}
@@ -501,7 +516,7 @@
}
return null;
}
- return PyQualifiedNameFactory.fromExpression(findAssignedValue());
+ return PyPsiUtils.asQualifiedName(findAssignedValue());
}
@Nullable
@@ -552,7 +567,7 @@
final PyExpression value = findAssignedValue();
if (value instanceof PyCallExpression) {
final PyExpression callee = ((PyCallExpression)value).getCallee();
- return PyQualifiedNameFactory.fromExpression(callee);
+ return PyPsiUtils.asQualifiedName(callee);
}
return null;
}
@@ -565,7 +580,7 @@
@NotNull
public PsiPolyVariantReference getReference(final PyResolveContext resolveContext) {
- if (getQualifier() != null) {
+ if (isQualified()) {
return new PyQualifiedReference(this, resolveContext);
}
return new PyTargetReference(this, resolveContext);
@@ -574,6 +589,9 @@
@NotNull
@Override
public SearchScope getUseScope() {
+ if (isQualified()) {
+ return super.getUseScope();
+ }
final ScopeOwner owner = ScopeUtil.getScopeOwner(this);
if (owner != null) {
final Scope scope = ControlFlowCache.getScope(owner);
@@ -590,7 +608,7 @@
while(true) {
PyElement parentContainer = PsiTreeUtil.getParentOfType(container, PyFunction.class, PyClass.class);
if (parentContainer instanceof PyClass) {
- if (getQualifier() != null) {
+ if (isQualified()) {
return super.getUseScope();
}
break;
@@ -677,4 +695,10 @@
}
return null;
}
+
+ @Override
+ public void subtreeChanged() {
+ super.subtreeChanged();
+ myQualifiedName = null;
+ }
}
diff --git a/python/src/com/jetbrains/python/psi/impl/references/PyFromImportSourceReference.java b/python/src/com/jetbrains/python/psi/impl/references/PyFromImportSourceReference.java
index 61ffb43..8cba7fb 100644
--- a/python/src/com/jetbrains/python/psi/impl/references/PyFromImportSourceReference.java
+++ b/python/src/com/jetbrains/python/psi/impl/references/PyFromImportSourceReference.java
@@ -18,7 +18,6 @@
import com.intellij.lang.annotation.HighlightSeverity;
import com.intellij.psi.PsiElement;
import com.intellij.psi.util.PsiTreeUtil;
-import com.jetbrains.python.psi.PyExpression;
import com.jetbrains.python.psi.PyFromImportStatement;
import com.jetbrains.python.psi.impl.PyReferenceExpressionImpl;
import com.jetbrains.python.psi.resolve.PyResolveContext;
@@ -53,7 +52,6 @@
@Override
public HighlightSeverity getUnresolvedHighlightSeverity(TypeEvalContext context) {
- PyExpression qualifier = myElement.getQualifier();
- return qualifier == null ? HighlightSeverity.ERROR : HighlightSeverity.WARNING;
+ return myElement.isQualified() ? HighlightSeverity.WARNING : HighlightSeverity.ERROR;
}
}
diff --git a/python/src/com/jetbrains/python/psi/impl/references/PyQualifiedReference.java b/python/src/com/jetbrains/python/psi/impl/references/PyQualifiedReference.java
index 750c20f..e66a219 100644
--- a/python/src/com/jetbrains/python/psi/impl/references/PyQualifiedReference.java
+++ b/python/src/com/jetbrains/python/psi/impl/references/PyQualifiedReference.java
@@ -35,9 +35,14 @@
import com.intellij.util.ProcessingContext;
import com.intellij.util.indexing.FileBasedIndex;
import com.jetbrains.python.PyNames;
+import com.jetbrains.python.codeInsight.controlflow.ControlFlowCache;
import com.jetbrains.python.codeInsight.controlflow.ScopeOwner;
+import com.jetbrains.python.codeInsight.dataflow.scope.Scope;
+import com.jetbrains.python.codeInsight.dataflow.scope.ScopeUtil;
import com.jetbrains.python.psi.*;
-import com.jetbrains.python.psi.impl.*;
+import com.jetbrains.python.psi.impl.PyBuiltinCache;
+import com.jetbrains.python.psi.impl.PyImportedModule;
+import com.jetbrains.python.psi.impl.ResolveResultList;
import com.jetbrains.python.psi.resolve.*;
import com.jetbrains.python.psi.search.PyProjectScopeBuilder;
import com.jetbrains.python.psi.stubs.PyClassNameIndexInsensitive;
@@ -372,15 +377,28 @@
}
private static Collection<PyExpression> collectAssignedAttributes(PyQualifiedExpression qualifier) {
- QualifiedName qualifierPath = PyQualifiedNameFactory.fromReferenceChain(PyResolveUtil.unwindQualifiers(qualifier));
- if (qualifierPath != null) {
- AssignmentCollectProcessor proc = new AssignmentCollectProcessor(qualifierPath);
- PyResolveUtil.treeCrawlUp(proc, qualifier);
- return proc.getResult();
+ final Set<String> names = new HashSet<String>();
+ final QualifiedName qualifierQName = qualifier.asQualifiedName();
+ if (qualifierQName != null) {
+ final List<PyExpression> results = new ArrayList<PyExpression>();
+ for (ScopeOwner owner = ScopeUtil.getScopeOwner(qualifier); owner != null; owner = ScopeUtil.getScopeOwner(owner)) {
+ final Scope scope = ControlFlowCache.getScope(owner);
+ for (PyTargetExpression target : scope.getTargetExpressions()) {
+ final QualifiedName targetQName = target.asQualifiedName();
+ if (targetQName != null) {
+ if (targetQName.getComponentCount() == qualifierQName.getComponentCount() + 1 && targetQName.matchesPrefix(qualifierQName)) {
+ final String name = target.getName();
+ if (!names.contains(name)) {
+ names.add(name);
+ results.add(target);
+ }
+ }
+ }
+ }
+ }
+ return results;
}
- else {
- return Collections.emptyList();
- }
+ return Collections.emptyList();
}
@Override
@@ -468,8 +486,8 @@
return true;
}
if (element instanceof PyTargetExpression) {
- return ((PyTargetExpression)element).getQualifier() == null &&
- PsiTreeUtil.getParentOfType(element, ScopeOwner.class) instanceof PyFunction;
+ final PyTargetExpression target = (PyTargetExpression)element;
+ return !target.isQualified() && ScopeUtil.getScopeOwner(target) instanceof PyFunction;
}
return false;
}
diff --git a/python/src/com/jetbrains/python/psi/impl/references/PyReferenceImpl.java b/python/src/com/jetbrains/python/psi/impl/references/PyReferenceImpl.java
index 6a1b116..df4fb34 100644
--- a/python/src/com/jetbrains/python/psi/impl/references/PyReferenceImpl.java
+++ b/python/src/com/jetbrains/python/psi/impl/references/PyReferenceImpl.java
@@ -550,10 +550,10 @@
}
private boolean haveQualifiers(PsiElement element) {
- if (myElement.getQualifier() != null) {
+ if (myElement.isQualified()) {
return true;
}
- if (element instanceof PyQualifiedExpression && ((PyQualifiedExpression)element).getQualifier() != null) {
+ if (element instanceof PyQualifiedExpression && ((PyQualifiedExpression)element).isQualified()) {
return true;
}
return false;
diff --git a/python/src/com/jetbrains/python/psi/impl/stubs/PyClassElementType.java b/python/src/com/jetbrains/python/psi/impl/stubs/PyClassElementType.java
index 813fb5c..e3d399c 100644
--- a/python/src/com/jetbrains/python/psi/impl/stubs/PyClassElementType.java
+++ b/python/src/com/jetbrains/python/psi/impl/stubs/PyClassElementType.java
@@ -24,7 +24,6 @@
import com.jetbrains.python.psi.impl.PyClassImpl;
import com.jetbrains.python.psi.impl.PyPsiUtils;
import com.intellij.psi.util.QualifiedName;
-import com.jetbrains.python.psi.impl.PyQualifiedNameFactory;
import com.jetbrains.python.psi.stubs.PyClassNameIndex;
import com.jetbrains.python.psi.stubs.PyClassNameIndexInsensitive;
import com.jetbrains.python.psi.stubs.PyClassStub;
@@ -59,12 +58,16 @@
final PyExpression[] exprs = psi.getSuperClassExpressions();
List<QualifiedName> superClasses = new ArrayList<QualifiedName>();
for (PyExpression expression : exprs) {
+ if (expression instanceof PyKeywordArgument) {
+ continue;
+ }
expression = PyClassImpl.unfoldClass(expression);
- superClasses.add(PyQualifiedNameFactory.fromExpression(expression));
+ superClasses.add(PyPsiUtils.asQualifiedName(expression));
}
final PyStringLiteralExpression docStringExpression = psi.getDocStringExpression();
return new PyClassStubImpl(psi.getName(), parentStub,
superClasses.toArray(new QualifiedName[superClasses.size()]),
+ PyPsiUtils.asQualifiedName(psi.getMetaClassExpression()),
psi.getOwnSlots(),
PyPsiUtils.strValue(docStringExpression),
getStubElementType());
@@ -77,6 +80,7 @@
for (QualifiedName s : classes) {
QualifiedName.serialize(s, dataStream);
}
+ QualifiedName.serialize(pyClassStub.getMetaClass(), dataStream);
PyFileElementType.writeNullableList(dataStream, pyClassStub.getSlots());
final String docString = pyClassStub.getDocString();
dataStream.writeUTFFast(docString != null ? docString : "");
@@ -90,9 +94,11 @@
for (int i = 0; i < superClassCount; i++) {
superClasses[i] = QualifiedName.deserialize(dataStream);
}
+ final QualifiedName metaClass = QualifiedName.deserialize(dataStream);
List<String> slots = PyFileElementType.readNullableList(dataStream);
final String docString = dataStream.readUTFFast();
- return new PyClassStubImpl(name, parentStub, superClasses, slots, docString.length() > 0 ? docString : null, getStubElementType());
+ return new PyClassStubImpl(name, parentStub, superClasses, metaClass, slots, docString.length() > 0 ? docString : null,
+ getStubElementType());
}
public void indexStub(@NotNull final PyClassStub stub, @NotNull final IndexSink sink) {
diff --git a/python/src/com/jetbrains/python/psi/impl/stubs/PyClassStubImpl.java b/python/src/com/jetbrains/python/psi/impl/stubs/PyClassStubImpl.java
index e607478..0de9181 100644
--- a/python/src/com/jetbrains/python/psi/impl/stubs/PyClassStubImpl.java
+++ b/python/src/com/jetbrains/python/psi/impl/stubs/PyClassStubImpl.java
@@ -21,6 +21,7 @@
import com.jetbrains.python.psi.PyClass;
import com.intellij.psi.util.QualifiedName;
import com.jetbrains.python.psi.stubs.PyClassStub;
+import org.jetbrains.annotations.Nullable;
import java.util.List;
@@ -30,14 +31,16 @@
public class PyClassStubImpl extends StubBase<PyClass> implements PyClassStub {
private final String myName;
private final QualifiedName[] mySuperClasses;
+ @Nullable private final QualifiedName myMetaClass;
private final List<String> mySlots;
private final String myDocString;
- public PyClassStubImpl(final String name, StubElement parentStub, final QualifiedName[] superClasses, final List<String> slots,
- String docString, IStubElementType stubElementType) {
+ public PyClassStubImpl(final String name, StubElement parentStub, final QualifiedName[] superClasses, @Nullable QualifiedName metaClass,
+ final List<String> slots, String docString, IStubElementType stubElementType) {
super(parentStub, stubElementType);
myName = name;
mySuperClasses = superClasses;
+ myMetaClass = metaClass;
mySlots = slots;
myDocString = docString;
}
@@ -50,6 +53,12 @@
return mySuperClasses;
}
+ @Nullable
+ @Override
+ public QualifiedName getMetaClass() {
+ return myMetaClass;
+ }
+
@Override
public List<String> getSlots() {
return mySlots;
diff --git a/python/src/com/jetbrains/python/psi/impl/stubs/PyTargetExpressionElementType.java b/python/src/com/jetbrains/python/psi/impl/stubs/PyTargetExpressionElementType.java
index f2a0678..aa535e8 100644
--- a/python/src/com/jetbrains/python/psi/impl/stubs/PyTargetExpressionElementType.java
+++ b/python/src/com/jetbrains/python/psi/impl/stubs/PyTargetExpressionElementType.java
@@ -85,7 +85,7 @@
initializer = ((PyReferenceExpression) callee).asQualifiedName();
}
}
- return new PyTargetExpressionStubImpl(name, docString, initializerType, initializer, psi.getQualifier() != null, parentStub);
+ return new PyTargetExpressionStubImpl(name, docString, initializerType, initializer, psi.isQualified(), parentStub);
}
public void serialize(@NotNull final PyTargetExpressionStub stub, @NotNull final StubOutputStream stream)
diff --git a/python/src/com/jetbrains/python/psi/resolve/AssignmentCollectProcessor.java b/python/src/com/jetbrains/python/psi/resolve/AssignmentCollectProcessor.java
index 0dde395..1f02473 100644
--- a/python/src/com/jetbrains/python/psi/resolve/AssignmentCollectProcessor.java
+++ b/python/src/com/jetbrains/python/psi/resolve/AssignmentCollectProcessor.java
@@ -19,11 +19,10 @@
import com.intellij.psi.PsiElement;
import com.intellij.psi.ResolveState;
import com.intellij.psi.scope.PsiScopeProcessor;
+import com.intellij.psi.util.QualifiedName;
import com.jetbrains.python.psi.PyAssignmentStatement;
import com.jetbrains.python.psi.PyExpression;
import com.jetbrains.python.psi.PyTargetExpression;
-import com.intellij.psi.util.QualifiedName;
-import com.jetbrains.python.psi.impl.PyQualifiedNameFactory;
import org.jetbrains.annotations.NotNull;
import java.util.*;
@@ -56,15 +55,12 @@
for (PyExpression ex : assignment.getTargets()) {
if (ex instanceof PyTargetExpression) {
final PyTargetExpression target = (PyTargetExpression)ex;
- List<PyExpression> qualsExpr = PyResolveUtil.unwindQualifiers(target);
- QualifiedName qualifiedName = PyQualifiedNameFactory.fromReferenceChain(qualsExpr);
+ final QualifiedName qualifiedName = target.asQualifiedName();
if (qualifiedName != null) {
if (qualifiedName.getComponentCount() == myQualifier.getComponentCount() + 1 && qualifiedName.matchesPrefix(myQualifier)) {
- // a new attribute follows last qualifier; collect it.
- PyExpression last_elt = qualsExpr.get(qualsExpr.size() - 1); // last item is the outermost, new, attribute.
- String last_elt_name = last_elt.getName();
+ String last_elt_name = target.getName();
if (!mySeenNames.contains(last_elt_name)) { // no dupes, only remember the latest
- myResult.add(last_elt);
+ myResult.add(target);
mySeenNames.add(last_elt_name);
}
}
diff --git a/python/src/com/jetbrains/python/psi/resolve/PyResolveUtil.java b/python/src/com/jetbrains/python/psi/resolve/PyResolveUtil.java
index 9646170..da8c0d6 100644
--- a/python/src/com/jetbrains/python/psi/resolve/PyResolveUtil.java
+++ b/python/src/com/jetbrains/python/psi/resolve/PyResolveUtil.java
@@ -35,14 +35,9 @@
import com.jetbrains.python.codeInsight.dataflow.scope.ScopeUtil;
import com.jetbrains.python.psi.*;
import com.jetbrains.python.psi.impl.PyPsiUtils;
-import com.intellij.psi.util.QualifiedName;
-import com.jetbrains.python.psi.impl.PyQualifiedNameFactory;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-import java.util.LinkedList;
-import java.util.List;
-
/**
* Ref resolution routines.
* User: dcheryasov
@@ -62,7 +57,7 @@
* @return previous statement, or null.
*/
@Nullable
- public static PsiElement getPrevNodeOf(PsiElement elt, TokenSet elementTypes) {
+ private static PsiElement getPrevNodeOf(PsiElement elt, TokenSet elementTypes) {
ASTNode seeker = elt.getNode();
while (seeker != null) {
ASTNode feeler = seeker.getTreePrev();
@@ -89,7 +84,7 @@
}
@Nullable
- public static PsiElement getPrevNodeOf(PsiElement elt) {
+ private static PsiElement getPrevNodeOf(PsiElement elt) {
if (elt instanceof PsiFile) return null; // no sense to get the previous node of a file
return getPrevNodeOf(elt, PythonDialectsTokenSetProvider.INSTANCE.getNameDefinerTokens());
}
@@ -164,7 +159,10 @@
* @param processor a visitor that says when the crawl is done and collects info.
* @param elt element from which we start (not checked by processor); if null, the search immediately returns null.
* @return first element that the processor accepted.
+ *
+ * @deprecated Use {@link #scopeCrawlUp} instead.
*/
+ @Deprecated
@Nullable
public static PsiElement treeCrawlUp(PsiScopeProcessor processor, PsiElement elt) {
if (elt == null || !elt.isValid()) return null; // can't find anyway.
@@ -231,7 +229,7 @@
* @return true if an outer element is in a class context, while the inner is a method or function inside it.
* @see com.jetbrains.python.psi.PyUtil#getConcealingParent(com.intellij.psi.PsiElement)
*/
- protected static boolean refersFromMethodToClass(final PyFunction innerFunction, final PsiElement outer) {
+ private static boolean refersFromMethodToClass(final PyFunction innerFunction, final PsiElement outer) {
if (innerFunction == null) {
return false;
}
@@ -244,49 +242,6 @@
}
/**
- * Unwinds a multi-level qualified expression into a path, as seen in source text, i.e. outermost qualifier first.
- *
- * @param expr an expression to unwind.
- * @return path as a list of ref expressions.
- */
- @NotNull
- public static List<PyExpression> unwindQualifiers(@NotNull final PyQualifiedExpression expr) {
- final List<PyExpression> path = new LinkedList<PyExpression>();
- PyQualifiedExpression e = expr;
- while (e != null) {
- path.add(0, e);
- final PyExpression q = e.getQualifier();
- e = q instanceof PyQualifiedExpression ? (PyQualifiedExpression)q : null;
- }
- return path;
- }
-
- public static List<String> unwindQualifiersAsStrList(final PyQualifiedExpression expr) {
- final List<String> path = new LinkedList<String>();
- PyQualifiedExpression e = expr;
- while (e != null) {
- path.add(0, e.getText());
- final PyExpression q = e.getQualifier();
- e = q instanceof PyQualifiedExpression ? (PyQualifiedExpression)q : null;
- }
- return path;
- }
-
- public static String toPath(PyQualifiedExpression expr) {
- if (expr == null) return "";
- List<PyExpression> path = unwindQualifiers(expr);
- final QualifiedName qName = PyQualifiedNameFactory.fromReferenceChain(path);
- if (qName != null) {
- return qName.toString();
- }
- String name = expr.getName();
- if (name != null) {
- return name;
- }
- return "";
- }
-
- /**
* Accepts only targets that are not the given object.
*/
public static class FilterNotInstance implements Condition<PsiElement> {
diff --git a/python/src/com/jetbrains/python/psi/resolve/PythonPathCache.java b/python/src/com/jetbrains/python/psi/resolve/PythonPathCache.java
index 28413c3..d2c0aa6 100644
--- a/python/src/com/jetbrains/python/psi/resolve/PythonPathCache.java
+++ b/python/src/com/jetbrains/python/psi/resolve/PythonPathCache.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@
import com.intellij.openapi.vfs.*;
import com.intellij.psi.PsiElement;
import com.intellij.psi.util.QualifiedName;
+import org.jetbrains.annotations.NotNull;
import java.util.HashMap;
import java.util.List;
@@ -53,27 +54,27 @@
protected class MyVirtualFileAdapter extends VirtualFileAdapter {
@Override
- public void fileCreated(VirtualFileEvent event) {
+ public void fileCreated(@NotNull VirtualFileEvent event) {
clearCache();
}
@Override
- public void fileDeleted(VirtualFileEvent event) {
+ public void fileDeleted(@NotNull VirtualFileEvent event) {
clearCache();
}
@Override
- public void fileMoved(VirtualFileMoveEvent event) {
+ public void fileMoved(@NotNull VirtualFileMoveEvent event) {
clearCache();
}
@Override
- public void fileCopied(VirtualFileCopyEvent event) {
+ public void fileCopied(@NotNull VirtualFileCopyEvent event) {
clearCache();
}
@Override
- public void propertyChanged(VirtualFilePropertyEvent event) {
+ public void propertyChanged(@NotNull VirtualFilePropertyEvent event) {
if (event.getPropertyName().equals(VirtualFile.PROP_NAME)) {
clearCache();
}
diff --git a/python/src/com/jetbrains/python/psi/resolve/ResolveImportUtil.java b/python/src/com/jetbrains/python/psi/resolve/ResolveImportUtil.java
index 57fe1a6..6a80851 100644
--- a/python/src/com/jetbrains/python/psi/resolve/ResolveImportUtil.java
+++ b/python/src/com/jetbrains/python/psi/resolve/ResolveImportUtil.java
@@ -15,6 +15,7 @@
*/
package com.jetbrains.python.psi.resolve;
+import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleUtilCore;
import com.intellij.openapi.projectRoots.Sdk;
@@ -366,6 +367,9 @@
if (vFile != null && vFile.getLength() > 0) {
rate += 100;
}
+ for (PyResolveResultRater rater : Extensions.getExtensions(PyResolveResultRater.EP_NAME)) {
+ rate += rater.getRate(target);
+ }
}
ret.poke(target, rate);
}
diff --git a/python/src/com/jetbrains/python/psi/search/PyClassInheritorsSearchExecutor.java b/python/src/com/jetbrains/python/psi/search/PyClassInheritorsSearchExecutor.java
index 4a7f084..bb29b7a 100644
--- a/python/src/com/jetbrains/python/psi/search/PyClassInheritorsSearchExecutor.java
+++ b/python/src/com/jetbrains/python/psi/search/PyClassInheritorsSearchExecutor.java
@@ -56,8 +56,8 @@
if (processed.contains(superClass)) return true;
processed.add(superClass);
Project project = superClass.getProject();
- final Collection<PyClass> candidates = StubIndex.getInstance().get(PySuperClassIndex.KEY, superClassName, project,
- ProjectScope.getAllScope(project));
+ final Collection<PyClass> candidates = StubIndex.getElements(PySuperClassIndex.KEY, superClassName, project,
+ ProjectScope.getAllScope(project), PyClass.class);
for (PyClass candidate : candidates) {
final PyClass[] classes = candidate.getSuperClasses();
for (PyClass superClassCandidate : classes) {
diff --git a/python/src/com/jetbrains/python/psi/search/PyKeywordArgumentSearchExecutor.java b/python/src/com/jetbrains/python/psi/search/PyKeywordArgumentSearchExecutor.java
index f8becd8..1b4fd6a 100644
--- a/python/src/com/jetbrains/python/psi/search/PyKeywordArgumentSearchExecutor.java
+++ b/python/src/com/jetbrains/python/psi/search/PyKeywordArgumentSearchExecutor.java
@@ -21,6 +21,8 @@
import com.intellij.psi.search.searches.ReferencesSearch;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.Processor;
+import com.jetbrains.python.codeInsight.controlflow.ScopeOwner;
+import com.jetbrains.python.codeInsight.dataflow.scope.ScopeUtil;
import com.jetbrains.python.psi.*;
import org.jetbrains.annotations.NotNull;
@@ -34,8 +36,8 @@
if (!(element instanceof PyNamedParameter)) {
return;
}
- PyFunction owner = PsiTreeUtil.getParentOfType(element, PyFunction.class);
- if (owner == null) {
+ final ScopeOwner owner = ScopeUtil.getScopeOwner(element);
+ if (!(owner instanceof PyFunction)) {
return;
}
ReferencesSearch.search(owner, queryParameters.getScope()).forEach(new Processor<PsiReference>() {
diff --git a/python/src/com/jetbrains/python/psi/search/PyStringReferenceSearch.java b/python/src/com/jetbrains/python/psi/search/PyStringReferenceSearch.java
index fa92691..dabd591 100644
--- a/python/src/com/jetbrains/python/psi/search/PyStringReferenceSearch.java
+++ b/python/src/com/jetbrains/python/psi/search/PyStringReferenceSearch.java
@@ -15,8 +15,6 @@
*/
package com.jetbrains.python.psi.search;
-import com.intellij.openapi.application.AccessToken;
-import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.QueryExecutorBase;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiDirectory;
@@ -36,6 +34,11 @@
* @author traff
*/
public class PyStringReferenceSearch extends QueryExecutorBase<PsiReference, ReferencesSearch.SearchParameters> {
+
+ public PyStringReferenceSearch() {
+ super(true);
+ }
+
public void processQuery(@NotNull final ReferencesSearch.SearchParameters params,
@NotNull final Processor<PsiReference> consumer) {
final PsiElement element = params.getElementToSearch();
@@ -43,20 +46,12 @@
return;
}
- AccessToken token = ApplicationManager.getApplication().acquireReadActionLock();
- String name;
- SearchScope searchScope;
- try {
- searchScope = params.getEffectiveSearchScope();
- if (searchScope instanceof GlobalSearchScope) {
- searchScope = GlobalSearchScope.getScopeRestrictedByFileTypes((GlobalSearchScope)searchScope, PythonFileType.INSTANCE);
- }
+ SearchScope searchScope = params.getEffectiveSearchScope();
+ if (searchScope instanceof GlobalSearchScope) {
+ searchScope = GlobalSearchScope.getScopeRestrictedByFileTypes((GlobalSearchScope)searchScope, PythonFileType.INSTANCE);
+ }
- name = PyUtil.computeElementNameForStringSearch(element);
- }
- finally {
- token.finish();
- }
+ String name = PyUtil.computeElementNameForStringSearch(element);
if (StringUtil.isEmpty(name)) {
return;
diff --git a/python/src/com/jetbrains/python/psi/stubs/PyClassNameIndex.java b/python/src/com/jetbrains/python/psi/stubs/PyClassNameIndex.java
index 8aed157..814f450 100644
--- a/python/src/com/jetbrains/python/psi/stubs/PyClassNameIndex.java
+++ b/python/src/com/jetbrains/python/psi/stubs/PyClassNameIndex.java
@@ -41,7 +41,7 @@
}
public static Collection<PyClass> find(String name, Project project, GlobalSearchScope scope) {
- return StubIndex.getInstance().get(KEY, name, project, scope);
+ return StubIndex.getElements(KEY, name, project, scope, PyClass.class);
}
public static Collection<PyClass> find(String name, Project project, boolean includeNonProjectItems) {
diff --git a/python/src/com/jetbrains/python/psi/stubs/PyClassNameIndexInsensitive.java b/python/src/com/jetbrains/python/psi/stubs/PyClassNameIndexInsensitive.java
index e65ba65..a275426 100644
--- a/python/src/com/jetbrains/python/psi/stubs/PyClassNameIndexInsensitive.java
+++ b/python/src/com/jetbrains/python/psi/stubs/PyClassNameIndexInsensitive.java
@@ -38,6 +38,6 @@
}
public static Collection<PyClass> find(String name, Project project) {
- return StubIndex.getInstance().get(KEY, name.toLowerCase(), project, ProjectScope.getProjectScope(project));
+ return StubIndex.getElements(KEY, name.toLowerCase(), project, ProjectScope.getProjectScope(project), PyClass.class);
}
}
diff --git a/python/src/com/jetbrains/python/psi/stubs/PyFunctionNameIndex.java b/python/src/com/jetbrains/python/psi/stubs/PyFunctionNameIndex.java
index 8b01c2b..ba87608 100644
--- a/python/src/com/jetbrains/python/psi/stubs/PyFunctionNameIndex.java
+++ b/python/src/com/jetbrains/python/psi/stubs/PyFunctionNameIndex.java
@@ -39,11 +39,11 @@
}
public static Collection<PyFunction> find(String name, Project project, GlobalSearchScope scope) {
- return StubIndex.getInstance().get(KEY, name, project, scope);
+ return StubIndex.getElements(KEY, name, project, scope, PyFunction.class);
}
public static Collection<PyFunction> find(String name, Project project) {
- return StubIndex.getInstance().get(KEY, name, project, ProjectScope.getAllScope(project));
+ return StubIndex.getElements(KEY, name, project, ProjectScope.getAllScope(project), PyFunction.class);
}
public static Collection<String> allKeys(Project project) {
diff --git a/python/src/com/jetbrains/python/psi/stubs/PyInstanceAttributeIndex.java b/python/src/com/jetbrains/python/psi/stubs/PyInstanceAttributeIndex.java
index 94b196f..58ea933 100644
--- a/python/src/com/jetbrains/python/psi/stubs/PyInstanceAttributeIndex.java
+++ b/python/src/com/jetbrains/python/psi/stubs/PyInstanceAttributeIndex.java
@@ -43,6 +43,6 @@
}
public static Collection<PyTargetExpression> find(String name, Project project, GlobalSearchScope scope) {
- return StubIndex.getInstance().get(KEY, name, project, scope);
+ return StubIndex.getElements(KEY, name, project, scope, PyTargetExpression.class);
}
}
diff --git a/python/src/com/jetbrains/python/psi/stubs/PyModuleNameIndex.java b/python/src/com/jetbrains/python/psi/stubs/PyModuleNameIndex.java
new file mode 100644
index 0000000..105aec5
--- /dev/null
+++ b/python/src/com/jetbrains/python/psi/stubs/PyModuleNameIndex.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.psi.stubs;
+
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.io.FileUtil;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.psi.PsiFile;
+import com.intellij.psi.PsiManager;
+import com.intellij.psi.search.GlobalSearchScope;
+import com.intellij.util.indexing.*;
+import com.intellij.util.io.EnumeratorStringDescriptor;
+import com.intellij.util.io.KeyDescriptor;
+import com.jetbrains.python.PyNames;
+import com.jetbrains.python.PythonFileType;
+import com.jetbrains.python.psi.PyFile;
+import com.jetbrains.python.psi.search.PyProjectScopeBuilder;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.*;
+
+/**
+ * @author vlan
+ */
+public class PyModuleNameIndex extends ScalarIndexExtension<String> {
+ public static final ID<String, Void> NAME = ID.create("Py.module.name");
+
+ private final EnumeratorStringDescriptor myKeyDescriptor = new EnumeratorStringDescriptor();
+ private final DataIndexer<String, Void, FileContent> myDataIndexer = new DataIndexer<String, Void, FileContent>() {
+ @NotNull
+ @Override
+ public Map<String, Void> map(FileContent inputData) {
+ final VirtualFile file = inputData.getFile();
+ final String name = file.getName();
+ if (PyNames.INIT_DOT_PY.equals(name)) {
+ final VirtualFile parent = file.getParent();
+ if (parent != null && parent.isDirectory()) {
+ return Collections.singletonMap(parent.getName(), null);
+ }
+ }
+ else {
+ return Collections.singletonMap(FileUtil.getNameWithoutExtension(name), null);
+ }
+ return Collections.emptyMap();
+ }
+ };
+
+ @NotNull
+ @Override
+ public ID<String, Void> getName() {
+ return NAME;
+ }
+
+ @NotNull
+ @Override
+ public DataIndexer<String, Void, FileContent> getIndexer() {
+ return myDataIndexer;
+ }
+
+ @Override
+ public KeyDescriptor<String> getKeyDescriptor() {
+ return myKeyDescriptor;
+ }
+
+ @Override
+ public FileBasedIndex.InputFilter getInputFilter() {
+ return new DefaultFileTypeSpecificInputFilter(PythonFileType.INSTANCE);
+ }
+
+ @Override
+ public boolean dependsOnFileContent() {
+ return true;
+ }
+
+ @Override
+ public int getVersion() {
+ return 0;
+ }
+
+ @NotNull
+ public static Collection<String> getAllKeys(@NotNull Project project) {
+ return FileBasedIndex.getInstance().getAllKeys(NAME, project);
+ }
+
+ @NotNull
+ public static List<PyFile> find(@NotNull String name, @NotNull Project project, boolean includeNonProjectItems) {
+ final List<PyFile> results = new ArrayList<PyFile>();
+ final GlobalSearchScope scope = includeNonProjectItems
+ ? PyProjectScopeBuilder.excludeSdkTestsScope(project)
+ : GlobalSearchScope.projectScope(project);
+ final Collection<VirtualFile> files = FileBasedIndex.getInstance().getContainingFiles(NAME, name, scope);
+ for (VirtualFile virtualFile : files) {
+ final PsiFile psiFile = PsiManager.getInstance(project).findFile(virtualFile);
+ if (psiFile instanceof PyFile) {
+ results.add((PyFile)psiFile);
+ }
+ }
+ return results;
+ }
+}
diff --git a/python/src/com/jetbrains/python/psi/stubs/PyVariableNameIndex.java b/python/src/com/jetbrains/python/psi/stubs/PyVariableNameIndex.java
index ca7b420..1fce6df 100644
--- a/python/src/com/jetbrains/python/psi/stubs/PyVariableNameIndex.java
+++ b/python/src/com/jetbrains/python/psi/stubs/PyVariableNameIndex.java
@@ -42,6 +42,6 @@
}
public static Collection<PyTargetExpression> find(String name, Project project, GlobalSearchScope scope) {
- return StubIndex.getInstance().get(KEY, name, project, scope);
+ return StubIndex.getElements(KEY, name, project, scope, PyTargetExpression.class);
}
}
diff --git a/python/src/com/jetbrains/python/psi/types/PyABCUtil.java b/python/src/com/jetbrains/python/psi/types/PyABCUtil.java
index faf10ba..fcd3289 100644
--- a/python/src/com/jetbrains/python/psi/types/PyABCUtil.java
+++ b/python/src/com/jetbrains/python/psi/types/PyABCUtil.java
@@ -83,16 +83,26 @@
return false;
}
- public static boolean isSubtype(@NotNull PyType type, @NotNull String superClassName) {
+ public static boolean isSubtype(@NotNull PyType type, @NotNull String superClassName, @NotNull TypeEvalContext context) {
if (type instanceof PyClassType) {
- final PyClass pyClass = ((PyClassType)type).getPyClass();
- return isSubclass(pyClass, superClassName, true);
+ final PyClassType classType = (PyClassType)type;
+ final PyClass pyClass = classType.getPyClass();
+ if (classType.isDefinition()) {
+ final PyClassLikeType metaClassType = classType.getMetaClassType(context, true);
+ if (metaClassType instanceof PyClassType) {
+ final PyClassType metaClass = (PyClassType)metaClassType;
+ return isSubclass(metaClass.getPyClass(), superClassName, true);
+ }
+ }
+ else {
+ return isSubclass(pyClass, superClassName, true);
+ }
}
if (type instanceof PyUnionType) {
final PyUnionType unionType = (PyUnionType)type;
for (PyType m : unionType.getMembers()) {
if (m != null) {
- if (!isSubtype(m, superClassName)) {
+ if (!isSubtype(m, superClassName, context)) {
return false;
}
}
diff --git a/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java b/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java
index 7be077f..715421a 100644
--- a/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java
+++ b/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java
@@ -23,6 +23,7 @@
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.Pair;
+import com.intellij.openapi.util.Ref;
import com.intellij.openapi.util.UserDataHolderBase;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiInvalidElementAccessException;
@@ -156,22 +157,9 @@
}
if (resolveContext.allowProperties()) {
- Property property = myClass.findProperty(name);
- if (property != null) {
- Maybe<Callable> accessor = property.getByDirection(direction);
- if (accessor.isDefined()) {
- Callable accessor_code = accessor.value();
- ResolveResultList ret = new ResolveResultList();
- if (accessor_code != null) ret.poke(accessor_code, RatedResolveResult.RATE_NORMAL);
- PyTargetExpression site = property.getDefinitionSite();
- if (site != null) ret.poke(site, RatedResolveResult.RATE_LOW);
- if (ret.size() > 0) {
- return ret;
- }
- else {
- return null;
- } // property is found, but the required accessor is explicitly absent
- }
+ final Ref<ResolveResultList> resultRef = findProperty(name, direction, true);
+ if (resultRef != null) {
+ return resultRef.get();
}
}
@@ -198,6 +186,11 @@
return ResolveResultList.to(classMember);
}
+ classMember = resolveByOverridingAncestorsMembersProviders(this, name, location);
+ if (classMember != null) {
+ return ResolveResultList.to(classMember);
+ }
+
if (inherited) {
for (PyClassLikeType type : myClass.getAncestorTypes(context)) {
if (type instanceof PyClassType) {
@@ -216,7 +209,7 @@
}
if (isDefinition() && myClass.isNewStyleClass()) {
- PyClassType typeType = getMetaclassType();
+ final PyClassLikeType typeType = getMetaClassType(context, inherited);
if (typeType != null) {
List<? extends RatedResolveResult> typeMembers = typeType.resolveMember(name, location, direction, resolveContext);
if (typeMembers != null && !typeMembers.isEmpty()) {
@@ -237,12 +230,10 @@
for (PyClassLikeType type : myClass.getAncestorTypes(context)) {
if (type instanceof PyClassType) {
final PyClass pyClass = ((PyClassType)type).getPyClass();
- if (pyClass != null) {
- PsiElement superMember = resolveByMembersProviders(new PyClassTypeImpl(pyClass, isDefinition()), name, location);
+ PsiElement superMember = resolveByMembersProviders(new PyClassTypeImpl(pyClass, isDefinition()), name, location);
- if (superMember != null) {
- return ResolveResultList.to(superMember);
- }
+ if (superMember != null) {
+ return ResolveResultList.to(superMember);
}
}
}
@@ -251,13 +242,47 @@
return Collections.emptyList();
}
- @Nullable
- private PyClassType getMetaclassType() {
- final PyClass metaClass = PyUtil.getMetaClass(myClass);
- if (metaClass != null) {
- return new PyClassTypeImpl(metaClass, false);
+ private Ref<ResolveResultList> findProperty(String name, AccessDirection direction, boolean inherited) {
+ Ref<ResolveResultList> resultRef = null;
+ Property property = myClass.findProperty(name, inherited);
+ if (property != null) {
+ Maybe<Callable> accessor = property.getByDirection(direction);
+ if (accessor.isDefined()) {
+ Callable accessor_code = accessor.value();
+ ResolveResultList ret = new ResolveResultList();
+ if (accessor_code != null) ret.poke(accessor_code, RatedResolveResult.RATE_NORMAL);
+ PyTargetExpression site = property.getDefinitionSite();
+ if (site != null) ret.poke(site, RatedResolveResult.RATE_LOW);
+ if (ret.size() > 0) {
+ resultRef = Ref.create(ret);
+ }
+ else {
+ resultRef = Ref.create();
+ } // property is found, but the required accessor is explicitly absent
+ }
}
- return PyBuiltinCache.getInstance(myClass).getObjectType("type");
+ return resultRef;
+ }
+
+ @Nullable
+ @Override
+ public PyClassLikeType getMetaClassType(@NotNull TypeEvalContext context, boolean inherited) {
+ final PyType ownMeta = myClass.getMetaClassType(context);
+ if (ownMeta != null) {
+ return (ownMeta instanceof PyClassLikeType) ? (PyClassLikeType)ownMeta : null;
+ }
+ if (inherited) {
+ for (PyClassLikeType ancestor : myClass.getAncestorTypes(context)) {
+ if (ancestor != null) {
+ final PyClassLikeType ancestorMeta = ancestor.getMetaClassType(context, false);
+ if (ancestorMeta != null) {
+ return ancestorMeta;
+ }
+ }
+ }
+ return PyBuiltinCache.getInstance(myClass).getObjectType("type");
+ }
+ return null;
}
@Override
@@ -330,6 +355,17 @@
}
@Nullable
+ private static PsiElement resolveByOverridingAncestorsMembersProviders(PyClassType type, String name, @Nullable PyExpression location) {
+ for (PyClassMembersProvider provider : Extensions.getExtensions(PyClassMembersProvider.EP_NAME)) {
+ if (provider instanceof PyOverridingAncestorsClassMembersProvider) {
+ final PsiElement resolveResult = provider.resolveMember(type, name, location);
+ if (resolveResult != null) return resolveResult;
+ }
+ }
+ return null;
+ }
+
+ @Nullable
private static PsiElement resolveInner(@NotNull PyClass cls,
boolean isDefinition,
@NotNull String name,
@@ -395,7 +431,7 @@
}
if (isDefinition() && myClass.isNewStyleClass()) {
- final PyClassType typeType = getMetaclassType();
+ final PyClassLikeType typeType = getMetaClassType(typeEvalContext, true);
if (typeType != null) {
Collections.addAll(ret, typeType.getCompletionVariants(prefix, location, context));
}
diff --git a/python/src/com/jetbrains/python/psi/types/functionalParser/FunctionalParserBase.java b/python/src/com/jetbrains/python/psi/types/functionalParser/FunctionalParserBase.java
index bde4559..6d33b68 100644
--- a/python/src/com/jetbrains/python/psi/types/functionalParser/FunctionalParserBase.java
+++ b/python/src/com/jetbrains/python/psi/types/functionalParser/FunctionalParserBase.java
@@ -203,11 +203,9 @@
myCache.clear();
}
final SoftReference<Pair<R, State>> ref = myCache.get(state.getPos());
- if (ref != null) {
- final Pair<R, State> cached = ref.get();
- if (cached != null) {
- return cached;
- }
+ final Pair<R, State> cached = SoftReference.dereference(ref);
+ if (cached != null) {
+ return cached;
}
final Pair<R, State> result = myParser.parse(tokens, state);
myCache.put(state.getPos(), new SoftReference<Pair<R, State>>(result));
diff --git a/python/src/com/jetbrains/python/quickFixes/RemoveTrailingBlankLinesFix.java b/python/src/com/jetbrains/python/quickFixes/RemoveTrailingBlankLinesFix.java
new file mode 100644
index 0000000..318c129
--- /dev/null
+++ b/python/src/com/jetbrains/python/quickFixes/RemoveTrailingBlankLinesFix.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2000-2013 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.quickFixes;
+
+import com.intellij.codeInsight.intention.HighPriorityAction;
+import com.intellij.codeInsight.intention.IntentionAction;
+import com.intellij.codeInspection.LocalQuickFix;
+import com.intellij.codeInspection.ProblemDescriptor;
+import com.intellij.openapi.editor.Document;
+import com.intellij.openapi.editor.Editor;
+import com.intellij.openapi.project.Project;
+import com.intellij.psi.PsiDocumentManager;
+import com.intellij.psi.PsiFile;
+import com.intellij.util.IncorrectOperationException;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * @author yole
+ */
+public class RemoveTrailingBlankLinesFix implements LocalQuickFix, IntentionAction, HighPriorityAction {
+ @NotNull
+ @Override
+ public String getText() {
+ return "Remove trailing blank lines";
+ }
+
+ @Override
+ public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) {
+ return true;
+ }
+
+ @Override
+ public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException {
+ removeTrailingBlankLines(file);
+ }
+
+ @Override
+ public boolean startInWriteAction() {
+ return true;
+ }
+
+ @NotNull
+ @Override
+ public String getName() {
+ return getText();
+ }
+
+ @NotNull
+ @Override
+ public String getFamilyName() {
+ return getText();
+ }
+
+ @Override
+ public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) {
+ removeTrailingBlankLines(descriptor.getPsiElement().getContainingFile());
+ }
+
+ private static void removeTrailingBlankLines(PsiFile file) {
+ Document document = PsiDocumentManager.getInstance(file.getProject()).getDocument(file);
+ if (document == null) {
+ return;
+ }
+ int lastBlankLineOffset = -1;
+ for (int i = document.getLineCount() - 1; i >= 0; i--) {
+ int lineStart = document.getLineStartOffset(i);
+ String trimmed = document.getCharsSequence().subSequence(lineStart, document.getLineEndOffset(i)).toString().trim();
+ if (trimmed.length() > 0) {
+ break;
+ }
+ lastBlankLineOffset = lineStart;
+ }
+ if (lastBlankLineOffset > 0) {
+ document.deleteString(lastBlankLineOffset, document.getTextLength());
+ }
+ }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/changeSignature/PyChangeSignatureHandler.java b/python/src/com/jetbrains/python/refactoring/changeSignature/PyChangeSignatureHandler.java
index 200c11e..719bc83 100644
--- a/python/src/com/jetbrains/python/refactoring/changeSignature/PyChangeSignatureHandler.java
+++ b/python/src/com/jetbrains/python/refactoring/changeSignature/PyChangeSignatureHandler.java
@@ -17,8 +17,6 @@
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.actionSystem.DataContext;
-import com.intellij.openapi.actionSystem.LangDataKeys;
-import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.application.ex.ApplicationManagerEx;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
@@ -171,9 +169,9 @@
REFACTORING_NAME, Messages.getQuestionIcon());
}
switch (choice) {
- case 0:
+ case Messages.YES:
return deepestSuperMethod;
- case 1:
+ case Messages.NO:
return function;
default:
return null;
diff --git a/python/src/com/jetbrains/python/refactoring/classes/DependencyVisitor.java b/python/src/com/jetbrains/python/refactoring/classes/DependencyVisitor.java
new file mode 100644
index 0000000..b22449d
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/DependencyVisitor.java
@@ -0,0 +1,87 @@
+package com.jetbrains.python.refactoring.classes;
+
+import com.intellij.openapi.util.Condition;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiPolyVariantReference;
+import com.intellij.psi.PsiReference;
+import com.intellij.psi.util.PsiTreeUtil;
+import com.jetbrains.python.psi.*;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * Searches for element in another element's usages.
+ * Parametrize it with needle and make stack to accept it.
+ *
+ * @author Ilya.Kazakevich
+ */
+class DependencyVisitor extends PyRecursiveElementVisitor {
+
+ @NotNull
+ private final PyElement myElementToFind;
+ private boolean myDependencyFound;
+
+ /**
+ * @param elementToFind what to find
+ */
+ DependencyVisitor(@NotNull final PyElement elementToFind) {
+ myElementToFind = elementToFind;
+ }
+
+ @Override
+ public void visitPyCallExpression(@NotNull final PyCallExpression node) {
+ final PyExpression callee = node.getCallee();
+ if (callee != null) {
+ final PsiReference calleeReference = callee.getReference();
+ if ((calleeReference != null) && calleeReference.isReferenceTo(myElementToFind)) {
+ myDependencyFound = true;
+ return;
+ }
+ final String calleeName = callee.getName();
+
+ if ((calleeName != null) && calleeName.equals(myElementToFind.getName())) { // Check by name also
+ myDependencyFound = true;
+ }
+ }
+ }
+
+ @Override
+ public void visitPyReferenceExpression(final PyReferenceExpression node) {
+
+ final PsiPolyVariantReference reference = node.getReference();
+ if (reference.isReferenceTo(myElementToFind)) {
+ myDependencyFound = true;
+ return;
+ }
+ // TODO: This step is member-type specific. Move to MemberManagers?
+ if (myElementToFind instanceof PyAssignmentStatement) {
+ final PyExpression[] targets = ((PyAssignmentStatement)myElementToFind).getTargets();
+
+ if (targets.length != 1) {
+ return;
+ }
+ final PyExpression expression = targets[0];
+
+ if (reference.isReferenceTo(expression)) {
+ myDependencyFound = true;
+ return;
+ }
+ if (node.getText().equals(expression.getText())) { // Check by name also
+ myDependencyFound = true;
+ }
+ return;
+ }
+ final PsiElement declaration = reference.resolve();
+ myDependencyFound = PsiTreeUtil.findFirstParent(declaration, new PsiElementCondition()) != null;
+ }
+
+ public boolean isDependencyFound() {
+ return myDependencyFound;
+ }
+
+ private class PsiElementCondition implements Condition<PsiElement> {
+ @Override
+ public boolean value(final PsiElement psiElement) {
+ return psiElement.equals(myElementToFind);
+ }
+ }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/PyClassMembersRefactoringSupport.java b/python/src/com/jetbrains/python/refactoring/classes/PyClassMembersRefactoringSupport.java
index 71f920c..d2a0b0a 100644
--- a/python/src/com/jetbrains/python/refactoring/classes/PyClassMembersRefactoringSupport.java
+++ b/python/src/com/jetbrains/python/refactoring/classes/PyClassMembersRefactoringSupport.java
@@ -22,6 +22,7 @@
import com.intellij.refactoring.classMembers.MemberInfoBase;
import com.jetbrains.python.psi.PyClass;
import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
/**
* @author Dennis.Ushakov
@@ -30,7 +31,7 @@
public static PyMemberInfoStorage getSelectedMemberInfos(PyClass clazz, PsiElement element1, PsiElement element2) {
final PyMemberInfoStorage infoStorage = new PyMemberInfoStorage(clazz);
- for (PyMemberInfo member : infoStorage.getClassMemberInfos(clazz)) {
+ for (PyMemberInfo<PyElement> member : infoStorage.getClassMemberInfos(clazz)) {
final PyElement function = member.getMember();
member.setChecked(PsiTreeUtil.isAncestor(function, element1, false) ||
PsiTreeUtil.isAncestor(function, element2, false));
diff --git a/python/src/com/jetbrains/python/refactoring/classes/PyClassRefactoringHandler.java b/python/src/com/jetbrains/python/refactoring/classes/PyClassRefactoringHandler.java
index ebb20ff..54c5dd1 100644
--- a/python/src/com/jetbrains/python/refactoring/classes/PyClassRefactoringHandler.java
+++ b/python/src/com/jetbrains/python/refactoring/classes/PyClassRefactoringHandler.java
@@ -19,6 +19,7 @@
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.actionSystem.LangDataKeys;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
+import com.intellij.openapi.application.ex.ApplicationManagerEx;
import com.intellij.openapi.editor.CaretModel;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
@@ -31,6 +32,7 @@
import com.intellij.refactoring.util.CommonRefactoringUtil;
import com.jetbrains.python.PyBundle;
import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyUtil;
import org.jetbrains.annotations.NotNull;
/**
@@ -68,7 +70,27 @@
doRefactor(project, elements[0], elements[elements.length - 1], editor, file, dataContext);
}
- protected abstract void doRefactor(Project project, PsiElement element1, PsiElement element2, Editor editor, PsiFile file, DataContext dataContext);
+ private void doRefactor(Project project, PsiElement element1, PsiElement element2, Editor editor, PsiFile file, DataContext dataContext) {
+ if (ApplicationManagerEx.getApplicationEx().isUnitTestMode()) return;
+
+ CommonRefactoringUtil.checkReadOnlyStatus(project, file);
+
+ final PyClass clazz = PyUtil.getContainingClassOrSelf(element1);
+ if (!inClass(clazz, project, editor, "refactoring.pull.up.error.cannot.perform.refactoring.not.inside.class")) return;
+ assert clazz != null;
+
+ final PyMemberInfoStorage infoStorage = PyClassMembersRefactoringSupport.getSelectedMemberInfos(clazz, element1, element2);
+
+ doRefactorImpl(project, clazz, infoStorage, editor);
+ }
+
+
+ protected abstract void doRefactorImpl(@NotNull final Project project,
+ @NotNull final PyClass classUnderRefactoring,
+ @NotNull final PyMemberInfoStorage infoStorage,
+ @NotNull final Editor editor);
+
+
protected boolean inClass(PyClass clazz, Project project, Editor editor, String errorMessageId) {
if (clazz == null) {
diff --git a/python/src/com/jetbrains/python/refactoring/classes/PyClassRefactoringUtil.java b/python/src/com/jetbrains/python/refactoring/classes/PyClassRefactoringUtil.java
index f5ba918..79f0382 100644
--- a/python/src/com/jetbrains/python/refactoring/classes/PyClassRefactoringUtil.java
+++ b/python/src/com/jetbrains/python/refactoring/classes/PyClassRefactoringUtil.java
@@ -15,26 +15,28 @@
*/
package com.jetbrains.python.refactoring.classes;
+import com.google.common.collect.Collections2;
+import com.intellij.lang.ASTNode;
import com.intellij.lang.injection.InjectedLanguageManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
-import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.Key;
+import com.intellij.openapi.util.Pair;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtilBase;
-import com.intellij.psi.util.PsiUtilCore;
+import com.intellij.psi.util.QualifiedName;
+import com.intellij.util.ArrayUtil;
+import com.jetbrains.NotNullPredicate;
import com.jetbrains.python.PyNames;
-import com.jetbrains.python.PythonFileType;
import com.jetbrains.python.codeInsight.PyCodeInsightSettings;
import com.jetbrains.python.codeInsight.imports.AddImportHelper;
-import com.jetbrains.python.documentation.DocStringTypeReference;
+import com.jetbrains.python.codeInsight.imports.PyImportOptimizer;
import com.jetbrains.python.psi.*;
import com.jetbrains.python.psi.impl.PyBuiltinCache;
import com.jetbrains.python.psi.impl.PyImportedModule;
import com.jetbrains.python.psi.impl.PyPsiUtils;
-import com.intellij.psi.util.QualifiedName;
import com.jetbrains.python.psi.resolve.QualifiedNameFinder;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -44,137 +46,176 @@
/**
* @author Dennis.Ushakov
*/
-public class PyClassRefactoringUtil {
+public final class PyClassRefactoringUtil {
private static final Logger LOG = Logger.getInstance(PyClassRefactoringUtil.class.getName());
private static final Key<PsiNamedElement> ENCODED_IMPORT = Key.create("PyEncodedImport");
private static final Key<Boolean> ENCODED_USE_FROM_IMPORT = Key.create("PyEncodedUseFromImport");
private static final Key<String> ENCODED_IMPORT_AS = Key.create("PyEncodedImportAs");
- private PyClassRefactoringUtil() {}
- public static void moveSuperclasses(PyClass clazz, Set<String> superClasses, PyClass superClass) {
- if (superClasses.size() == 0) return;
- final Project project = clazz.getProject();
- final List<PyExpression> toAdd = removeAndGetSuperClasses(clazz, superClasses);
- addSuperclasses(project, superClass, toAdd, superClasses);
+ private PyClassRefactoringUtil() {
}
- public static void addSuperclasses(Project project, PyClass superClass,
- @Nullable Collection<PyExpression> superClassesAsPsi,
- Collection<String> superClassesAsStrings) {
- if (superClassesAsStrings.size() == 0) return;
- PyArgumentList argList = superClass.getSuperClassExpressionList();
- if (argList != null) {
- if (superClassesAsPsi != null) {
- for (PyExpression element : superClassesAsPsi) {
- argList.addArgument(element);
- }
+
+ /**
+ * Copies class field declarations to some other place
+ *
+ * @param assignmentStatements list of class fields
+ * @param dequalifyIfDeclaredInClass If not null method will check if field declared in this class.
+ * If declared -- qualifier will be removed.
+ * For example: MyClass.Foo will become Foo it this param is MyClass.
+ * @return new (copied) fields
+ */
+ @NotNull
+ public static List<PyAssignmentStatement> copyFieldDeclarationToStatement(@NotNull final Collection<PyAssignmentStatement> assignmentStatements,
+ @NotNull final PyStatementList superClassStatement,
+ @Nullable final PyClass dequalifyIfDeclaredInClass) {
+ final List<PyAssignmentStatement> declarations = new ArrayList<PyAssignmentStatement>(assignmentStatements.size());
+ Collections.sort(declarations, PyDependenciesComparator.INSTANCE);
+
+
+ for (final PyAssignmentStatement pyAssignmentStatement : assignmentStatements) {
+ final PyElement value = pyAssignmentStatement.getAssignedValue();
+ final PyAssignmentStatement newDeclaration = (PyAssignmentStatement)pyAssignmentStatement.copy();
+
+ if (value instanceof PyReferenceExpression && dequalifyIfDeclaredInClass != null) {
+ final String newValue = getNewValueToAssign((PyReferenceExpression)value, dequalifyIfDeclaredInClass);
+
+ setNewAssigneeValue(newDeclaration, newValue);
+
}
- else {
- for (String s : superClassesAsStrings) {
- argList.addArgument(PyElementGenerator.getInstance(project).createExpressionFromText(s));
- }
- }
+
+ declarations.add(PyUtil.addElementToStatementList(newDeclaration, superClassStatement));
+ PyPsiUtils.removeRedundantPass(superClassStatement);
+ }
+ return declarations;
+ }
+
+ /**
+ * Sets new value to assignment statement.
+ * @param assignmentStatement statement to change
+ * @param newValue new value
+ */
+ private static void setNewAssigneeValue(@NotNull final PyAssignmentStatement assignmentStatement, @NotNull final String newValue) {
+ final PyExpression oldValue = assignmentStatement.getAssignedValue();
+ final PyExpression newExpression =
+ PyElementGenerator.getInstance(assignmentStatement.getProject()).createExpressionFromText(LanguageLevel.forElement(assignmentStatement), newValue);
+ if (oldValue != null) {
+ oldValue.replace(newExpression);
} else {
- addSuperclasses(project, superClass, superClassesAsStrings);
+ assignmentStatement.add(newExpression);
}
}
- public static List<PyExpression> removeAndGetSuperClasses(PyClass clazz, Set<String> superClasses) {
- if (superClasses.size() == 0) return Collections.emptyList();
- final List<PyExpression> toAdd = new ArrayList<PyExpression>();
- final PyExpression[] elements = clazz.getSuperClassExpressions();
- for (PyExpression element : elements) {
- if (superClasses.contains(element.getText())) {
- toAdd.add(element);
- PyUtil.removeListNode(element);
- }
+ /**
+ * Checks if current value declared in provided class and removes class qualifier if true
+ * @param currentValue current value
+ * @param dequalifyIfDeclaredInClass class to check
+ * @return value as string
+ */
+ @NotNull
+ private static String getNewValueToAssign(@NotNull final PyReferenceExpression currentValue, @NotNull final PyClass dequalifyIfDeclaredInClass) {
+ final PyExpression qualifier = currentValue.getQualifier();
+ if ((qualifier instanceof PyReferenceExpression) &&
+ ((PyReferenceExpression)qualifier).getReference().isReferenceTo(dequalifyIfDeclaredInClass)) {
+ final String name = currentValue.getName();
+ return ((name != null) ? name : currentValue.getText());
}
- return toAdd;
+ return currentValue.getText();
}
- public static void addSuperclasses(Project project, PyClass superClass, Collection<String> superClasses) {
- if (superClasses.size() == 0) return;
- final StringBuilder builder = new StringBuilder("(");
- boolean hasChanges = false;
- for (String element : superClasses) {
- if (builder.length() > 1) builder.append(",");
- if (!alreadyHasSuperClass(superClass, element)) {
- builder.append(element);
- hasChanges = true;
- }
+ @NotNull
+ public static List<PyFunction> copyMethods(Collection<PyFunction> methods, PyClass superClass) {
+ if (methods.isEmpty()) {
+ return Collections.emptyList();
}
- builder.append(")");
- if (!hasChanges) return;
-
- final PsiFile file = PsiFileFactory.getInstance(project).createFileFromText(superClass.getName() + "temp", PythonFileType.INSTANCE, builder.toString());
- final PsiElement expression = file.getFirstChild().getFirstChild();
- PsiElement colon = superClass.getFirstChild();
- while (colon != null && !colon.getText().equals(":")) {
- colon = colon.getNextSibling();
- }
- LOG.assertTrue(colon != null && expression != null);
- PyPsiUtils.addBeforeInParent(colon, expression);
- }
-
- private static boolean alreadyHasSuperClass(PyClass superClass, String className) {
- for (PyClass aClass : superClass.getSuperClasses()) {
- if (Comparing.strEqual(aClass.getName(), className)) {
- return true;
- }
- }
- return false;
- }
-
- public static void moveMethods(Collection<PyFunction> methods, PyClass superClass) {
- if (methods.size() == 0) return;
- for (PsiElement e : methods) {
+ for (final PsiElement e : methods) {
rememberNamedReferences(e);
}
- final PyElement[] elements = methods.toArray(new PyElement[methods.size()]);
- addMethods(superClass, elements, true);
- removeMethodsWithComments(elements);
+ final PyFunction[] elements = methods.toArray(new PyFunction[methods.size()]);
+ return addMethods(superClass, true, elements);
}
- private static void removeMethodsWithComments(PyElement[] elements) {
- for (PyElement element : elements) {
- final Set<PsiElement> comments = PyUtil.getComments(element);
- if (comments.size() > 0) {
- PyPsiUtils.removeElements(PsiUtilCore.toPsiElementArray(comments));
+ /**
+ * Adds methods to class.
+ *
+ * @param destination where to add methods
+ * @param methods methods
+ * @param skipIfExist do not add anything if method already exists
+ * @return newly added methods or existing one (if skipIfExists is true and method already exists)
+ */
+ @NotNull
+ public static List<PyFunction> addMethods(@NotNull final PyClass destination, final boolean skipIfExist, @NotNull final PyFunction... methods) {
+
+ final PyStatementList destStatementList = destination.getStatementList();
+ final List<PyFunction> result = new ArrayList<PyFunction>(methods.length);
+
+ for (final PyFunction method : methods) {
+
+ final PyFunction existingMethod = destination.findMethodByName(method.getName(), false);
+ if ((existingMethod != null) && skipIfExist) {
+ result.add(existingMethod);
+ continue; //We skip adding if class already has this method.
+ }
+
+
+ final PyFunction newMethod = insertMethodInProperPlace(destStatementList, method);
+ result.add(newMethod);
+ restoreNamedReferences(newMethod);
+ }
+
+ PyPsiUtils.removeRedundantPass(destStatementList);
+ return result;
+ }
+
+ /**
+ * Adds init methods before all other methods (but after class vars and docs).
+ * Adds all other methods to the bottom
+ *
+ * @param destStatementList where to add methods
+ * @param method method to add
+ * @return newlty added method
+ */
+ @NotNull
+ private static PyFunction insertMethodInProperPlace(
+ @NotNull final PyStatementList destStatementList,
+ @NotNull final PyFunction method) {
+ boolean methodIsInit = PyUtil.isInit(method);
+ if (!methodIsInit) {
+ //Not init method could be inserted in the bottom
+ return (PyFunction)destStatementList.add(method);
+ }
+
+ //We should find appropriate place for init
+ for (final PsiElement element : destStatementList.getChildren()) {
+ final boolean elementComment = element instanceof PyExpressionStatement;
+ final boolean elementClassField = element instanceof PyAssignmentStatement;
+
+ if (!(elementComment || elementClassField)) {
+ return (PyFunction)destStatementList.addBefore(method, element);
}
}
- PyPsiUtils.removeElements(elements);
+ return (PyFunction)destStatementList.add(method);
}
- public static void insertPassIfNeeded(PyClass clazz) {
- final PyStatementList statements = clazz.getStatementList();
+
+ public static <T extends PyElement & PyStatementListContainer> void insertPassIfNeeded(@NotNull T element) {
+ final PyStatementList statements = element.getStatementList();
if (statements.getStatements().length == 0) {
- statements.add(PyElementGenerator.getInstance(clazz.getProject()).createFromText(LanguageLevel.getDefault(), PyPassStatement.class, PyNames.PASS));
+ statements.add(
+ PyElementGenerator.getInstance(element.getProject())
+ .createFromText(LanguageLevel.getDefault(), PyPassStatement.class, PyNames.PASS)
+ );
}
}
- public static void addMethods(final PyClass superClass, final PyElement[] elements, final boolean up) {
- if (elements.length == 0) return;
- final PyStatementList statements = superClass.getStatementList();
- for (PyElement newStatement : elements) {
- if (up && newStatement instanceof PyFunction) {
- final String name = newStatement.getName();
- if (name != null && superClass.findMethodByName(name, false) != null) {
- continue;
- }
- }
- if (newStatement instanceof PyExpressionStatement && newStatement.getFirstChild() instanceof PyStringLiteralExpression) continue;
- final PsiElement anchor = statements.add(newStatement);
- restoreNamedReferences(anchor);
- final Set<PsiElement> comments = PyUtil.getComments(newStatement);
- for (PsiElement comment : comments) {
- statements.addBefore(comment, anchor);
- }
- }
- PyPsiUtils.removeRedundantPass(statements);
- }
-
- public static void restoreNamedReferences(@NotNull PsiElement element) {
+ /**
+ * Restores references saved by {@link #rememberNamedReferences(com.intellij.psi.PsiElement, String...)}.
+ *
+ * @param element newly created element to restore references
+ * @see #rememberNamedReferences(com.intellij.psi.PsiElement, String...)
+ */
+ public static void restoreNamedReferences(@NotNull final PsiElement element) {
restoreNamedReferences(element, null);
}
@@ -190,7 +231,7 @@
public void visitPyStringLiteralExpression(PyStringLiteralExpression node) {
super.visitPyStringLiteralExpression(node);
for (PsiReference ref : node.getReferences()) {
- if (ref instanceof DocStringTypeReference && ref.isReferenceTo(oldElement)) {
+ if (ref.isReferenceTo(oldElement)) {
ref.bindToElement(newElement);
}
}
@@ -198,6 +239,7 @@
});
}
+
private static void restoreReference(final PyReferenceExpression node) {
PsiNamedElement target = node.getCopyableUserData(ENCODED_IMPORT);
final String asName = node.getCopyableUserData(ENCODED_IMPORT_AS);
@@ -239,7 +281,7 @@
if (components.isEmpty()) {
return false;
}
- for (String s: components) {
+ for (String s : components) {
if (!PyNames.isIdentifier(s) || PyNames.isReserved(s)) {
return false;
}
@@ -283,7 +325,16 @@
}
}
- public static void rememberNamedReferences(@NotNull final PsiElement element) {
+ /**
+ * Searches for references inside some element (like {@link com.jetbrains.python.psi.PyAssignmentStatement}, {@link com.jetbrains.python.psi.PyFunction} etc
+ * and stored them.
+ * After that you can add element to some new parent. Newly created element then should be processed via {@link #restoreNamedReferences(com.intellij.psi.PsiElement)}
+ * and all references would be restored.
+ *
+ * @param element element to store references for
+ * @param namesToSkip if reference inside of element has one of this names, it will not be saved.
+ */
+ public static void rememberNamedReferences(@NotNull final PsiElement element, @NotNull final String... namesToSkip) {
element.acceptChildren(new PyRecursiveElementVisitor() {
@Override
public void visitPyReferenceExpression(PyReferenceExpression node) {
@@ -295,7 +346,9 @@
if (importElement != null && PsiTreeUtil.isAncestor(element, importElement, false)) {
return;
}
- rememberReference(node, element);
+ if (!ArrayUtil.contains(node.getText(), namesToSkip)) { //Do not remember name if it should be skipped
+ rememberReference(node, element);
+ }
}
});
}
@@ -347,7 +400,7 @@
final String name = getOriginalName(element);
if (name != null) {
PyImportElement importElement = null;
- for (PyImportElement e: importStatement.getImportElements()) {
+ for (PyImportElement e : importStatement.getImportElements()) {
if (name.equals(getOriginalName(e))) {
importElement = e;
}
@@ -364,11 +417,14 @@
}
if (deleteImportElement) {
if (importStatement.getImportElements().length == 1) {
- final boolean isInjected = InjectedLanguageManager.getInstance(importElement.getProject()).isInjectedFragment(importElement.getContainingFile());
- if (!isInjected)
+ final boolean isInjected =
+ InjectedLanguageManager.getInstance(importElement.getProject()).isInjectedFragment(importElement.getContainingFile());
+ if (!isInjected) {
importStatement.delete();
- else
+ }
+ else {
deleteImportStatementFromInjected(importStatement);
+ }
}
else {
importElement.delete();
@@ -381,8 +437,7 @@
private static void deleteImportStatementFromInjected(@NotNull final PyImportStatementBase importStatement) {
final PsiElement sibling = importStatement.getPrevSibling();
importStatement.delete();
- if (sibling instanceof PsiWhiteSpace)
- sibling.delete();
+ if (sibling instanceof PsiWhiteSpace) sibling.delete();
}
@Nullable
@@ -405,4 +460,108 @@
}
return null;
}
+
+ /**
+ * Adds super classes to certain class.
+ *
+ * @param project project where refactoring takes place
+ * @param clazz destination
+ * @param superClasses classes to add
+ */
+ public static void addSuperclasses(@NotNull final Project project,
+ @NotNull final PyClass clazz,
+ @NotNull final PyClass... superClasses) {
+
+ final Collection<String> superClassNames = new ArrayList<String>();
+
+
+ for (final PyClass superClass : Collections2.filter(Arrays.asList(superClasses), NotNullPredicate.INSTANCE)) {
+ if (superClass.getName() != null) {
+ superClassNames.add(superClass.getName());
+ insertImport(clazz, superClass);
+ }
+ }
+
+ addSuperClassExpressions(project, clazz, superClassNames, null);
+ }
+
+
+ /**
+ * Adds expressions to superclass list
+ *
+ * @param project project
+ * @param clazz class to add expressions to superclass list
+ * @param paramExpressions param expressions. Like "object" or "MySuperClass". Will not add any param exp. if null.
+ * @param keywordArguments keyword args like "metaclass=ABCMeta". key-value pairs. Will not add any keyword arg. if null.
+ */
+ public static void addSuperClassExpressions(@NotNull final Project project,
+ @NotNull final PyClass clazz,
+ @Nullable final Collection<String> paramExpressions,
+ @Nullable final Collection<Pair<String, String>> keywordArguments) {
+ final PyElementGenerator generator = PyElementGenerator.getInstance(project);
+ final LanguageLevel languageLevel = LanguageLevel.forElement(clazz);
+
+ PyArgumentList superClassExpressionList = clazz.getSuperClassExpressionList();
+ boolean addExpression = false;
+ if (superClassExpressionList == null) {
+ superClassExpressionList = generator.createFromText(languageLevel, PyClass.class, "class foo():pass").getSuperClassExpressionList();
+ assert superClassExpressionList != null : "expression not created";
+ addExpression = true;
+ }
+
+
+ generator.createFromText(LanguageLevel.PYTHON34, PyClass.class, "class foo(object, metaclass=Foo): pass").getSuperClassExpressionList();
+ if (paramExpressions != null) {
+ for (final String paramExpression : paramExpressions) {
+ superClassExpressionList.addArgument(generator.createParameter(paramExpression));
+ }
+ }
+
+ if (keywordArguments != null) {
+ for (final Pair<String, String> keywordArgument : keywordArguments) {
+ superClassExpressionList.addArgument(generator.createKeywordArgument(languageLevel, keywordArgument.first, keywordArgument.second));
+ }
+ }
+
+ // If class has no expression list, then we need to add it manually.
+ if (addExpression) {
+ final ASTNode classNameNode = clazz.getNameNode(); // For nameless classes we simply add expression list directly to them
+ final PsiElement elementToAddAfter = (classNameNode == null) ? clazz.getFirstChild() : classNameNode.getPsi();
+ clazz.addAfter(superClassExpressionList, elementToAddAfter);
+ }
+ }
+
+ /**
+ * Optimizes imports resorting them and removing unneeded
+ *
+ * @param file file to optimize imports
+ */
+ public static void optimizeImports(@NotNull final PsiFile file) {
+ new PyImportOptimizer().processFile(file).run();
+ }
+
+ /**
+ * Adds class attributeName (field) if it does not exist. like __metaclass__ = ABCMeta. Or CLASS_FIELD = 42.
+ *
+ * @param aClass where to add
+ * @param attributeName attribute's name. Like __metaclass__ or CLASS_FIELD
+ * @param value it's value. Like ABCMeta or 42.
+ * @return newly inserted attribute
+ */
+ @Nullable
+ public static PsiElement addClassAttributeIfNotExist(
+ @NotNull final PyClass aClass,
+ @NotNull final String attributeName,
+ @NotNull final String value) {
+ if (aClass.findClassAttribute(attributeName, false) != null) {
+ return null; //Do not add any if exist already
+ }
+ final PyElementGenerator generator = PyElementGenerator.getInstance(aClass.getProject());
+ final String text = String.format("%s = %s", attributeName, value);
+ final LanguageLevel level = LanguageLevel.forElement(aClass);
+
+ final PyAssignmentStatement assignmentStatement = generator.createFromText(level, PyAssignmentStatement.class, text);
+ //TODO: Add metaclass to the top. Add others between last attributeName and first method
+ return PyUtil.addElementToStatementList(assignmentStatement, aClass.getStatementList(), true);
+ }
}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/PyDependenciesComparator.java b/python/src/com/jetbrains/python/refactoring/classes/PyDependenciesComparator.java
new file mode 100644
index 0000000..700a300
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/PyDependenciesComparator.java
@@ -0,0 +1,70 @@
+package com.jetbrains.python.refactoring.classes;
+
+import com.jetbrains.python.psi.*;
+import org.jetbrains.annotations.NotNull;
+
+import java.io.Serializable;
+import java.util.Comparator;
+
+/**
+ * Compares elements by their dependencies.
+ * If A depends on B, then A < B
+ */
+public class PyDependenciesComparator implements Comparator<PyElement>, Serializable {
+
+ /**
+ * Singleton comparator instance
+ */
+ public static final PyDependenciesComparator INSTANCE = new PyDependenciesComparator();
+
+ private PyDependenciesComparator() {
+ }
+
+ @Override
+ public int compare(@NotNull final PyElement o1, @NotNull final PyElement o2) {
+ if (depends(o1, o2)) {
+ return 1;
+ }
+ if (depends(o2, o1)) {
+ return -1;
+ }
+ return getBlockType(o1).compareTo(getBlockType(o2));
+ }
+
+ @NotNull
+ private static BlockType getBlockType(@NotNull final PyElement statement) {
+ for (BlockType type : BlockType.values()) {
+ if (type.myClass.isAssignableFrom(statement.getClass())) {
+ return type;
+ }
+ }
+
+ return BlockType.OTHER;
+ }
+
+ /**
+ * @return true if first param depends on second.
+ */
+ public static boolean depends(@NotNull final PyElement o1, @NotNull final PyElement o2) {
+ final DependencyVisitor visitor = new DependencyVisitor(o2);
+ o1.accept(visitor);
+ return visitor.isDependencyFound();
+ }
+
+ /**
+ * Types of class members in order, they should appear
+ */
+ private enum BlockType {
+ DOC(PyExpressionStatement.class),
+ DECLARATION(PyAssignmentStatement.class),
+ METHOD(PyFunction.class),
+ OTHER(PyElement.class);
+
+ @NotNull
+ private final Class<? extends PyElement> myClass;
+
+ BlockType(@NotNull final Class<? extends PyElement> aClass) {
+ myClass = aClass;
+ }
+ }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/PyDependentMembersCollector.java b/python/src/com/jetbrains/python/refactoring/classes/PyDependentMembersCollector.java
index 5c51118..c47c474 100644
--- a/python/src/com/jetbrains/python/refactoring/classes/PyDependentMembersCollector.java
+++ b/python/src/com/jetbrains/python/refactoring/classes/PyDependentMembersCollector.java
@@ -17,7 +17,7 @@
import com.intellij.refactoring.classMembers.DependentMembersCollectorBase;
import com.jetbrains.python.psi.*;
-import com.jetbrains.python.psi.resolve.PyResolveContext;
+import com.jetbrains.python.refactoring.classes.membersManager.MembersManager;
/**
* @author Dennis.Ushakov
@@ -28,25 +28,7 @@
}
@Override
- public void collect(PyElement member) {
- final PyRecursiveElementVisitor visitor = new PyRecursiveElementVisitor() {
- @Override
- public void visitPyCallExpression(PyCallExpression node) {
- final Callable markedFunction = node.resolveCalleeFunction(PyResolveContext.noImplicits());
- final PyFunction function = markedFunction != null ? markedFunction.asMethod() : null;
- if (!existsInSuperClass(function)) {
- myCollection.add(function);
- }
- }
- };
- member.accept(visitor);
- }
-
- private boolean existsInSuperClass(PyFunction classMember) {
- if (getSuperClass() == null) return false;
- final String name = classMember != null ? classMember.getName() : null;
- if (name == null) return false;
- final PyFunction methodBySignature = (getSuperClass()).findMethodByName(name, true);
- return methodBySignature != null;
+ public void collect(final PyElement member) {
+ myCollection.addAll(MembersManager.getAllDependencies(myClass, member, getSuperClass()));
}
}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/PyMemberInfo.java b/python/src/com/jetbrains/python/refactoring/classes/PyMemberInfo.java
deleted file mode 100644
index 405e6e5..0000000
--- a/python/src/com/jetbrains/python/refactoring/classes/PyMemberInfo.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright 2000-2013 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.jetbrains.python.refactoring.classes;
-
-import com.intellij.refactoring.RefactoringBundle;
-import com.intellij.refactoring.classMembers.MemberInfoBase;
-import com.jetbrains.python.psi.*;
-import com.jetbrains.python.refactoring.classes.ui.PyClassCellRenderer;
-
-/**
- * @author Dennis.Ushakov
- */
-public class PyMemberInfo extends MemberInfoBase<PyElement> {
- public PyMemberInfo(PyElement member) {
- super(member);
- final PyClass clazz = PyUtil.getContainingClassOrSelf(member);
- assert clazz != null;
-
- if (member instanceof PyFunction) {
- PyFunction function = (PyFunction)member;
- displayName = buildDisplayMethodName(function);
- for (PyClass aClass : clazz.getSuperClasses()) {
- final PyFunction parentMethod = aClass.findMethodByName(function.getName(), true);
- if (parentMethod != null) {
- overrides = true;
- }
- }
- } else if (member instanceof PyClass) {
- displayName = RefactoringBundle.message("member.info.extends.0", PyClassCellRenderer.getClassText((PyClass)member));
- }
- }
-
- private static String buildDisplayMethodName(PyFunction method) {
- final StringBuilder builder = new StringBuilder(method.getName());
- builder.append("(");
- final PyParameter[] arguments = method.getParameterList().getParameters();
- for (PyParameter parameter : arguments) {
- builder.append(parameter.getName());
- if (arguments.length > 1 && parameter != arguments[arguments.length - 1]) {
- builder.append(", ");
- }
- }
- builder.append(")");
- return builder.toString();
- }
-
- @Override
- public boolean equals(Object obj) {
- if (obj instanceof PyMemberInfo) {
- return getMember().equals(((PyMemberInfo)obj).getMember());
- }
- return false;
- }
-
- @Override
- public int hashCode() {
- return getMember().hashCode();
- }
-}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/PyMemberInfoStorage.java b/python/src/com/jetbrains/python/refactoring/classes/PyMemberInfoStorage.java
index e5c050a..91d9093 100644
--- a/python/src/com/jetbrains/python/refactoring/classes/PyMemberInfoStorage.java
+++ b/python/src/com/jetbrains/python/refactoring/classes/PyMemberInfoStorage.java
@@ -15,23 +15,22 @@
*/
package com.jetbrains.python.refactoring.classes;
-import com.intellij.psi.PsiElement;
import com.intellij.refactoring.classMembers.AbstractMemberInfoStorage;
import com.intellij.refactoring.classMembers.MemberInfoBase;
+import com.intellij.util.containers.HashSet;
import com.jetbrains.python.psi.PyClass;
import com.jetbrains.python.psi.PyElement;
import com.jetbrains.python.psi.PyFunction;
import com.jetbrains.python.refactoring.PyRefactoringUtil;
+import com.jetbrains.python.refactoring.classes.membersManager.MembersManager;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
/**
* @author Dennis.Ushakov
*/
-public class PyMemberInfoStorage extends AbstractMemberInfoStorage<PyElement, PyClass, PyMemberInfo> {
- private Collection<PyClass> myClasses;
+public class PyMemberInfoStorage extends AbstractMemberInfoStorage<PyElement, PyClass, PyMemberInfo<PyElement>> {
public PyMemberInfoStorage(PyClass aClass) {
this(aClass, new MemberInfoBase.EmptyFilter<PyElement>());
@@ -53,12 +52,8 @@
private void buildSubClassesMapImpl(PyClass aClass, HashSet<PyClass> visited) {
visited.add(aClass);
- if (myClasses == null) {
- myClasses = new HashSet<PyClass>();
- }
for (PyClass clazz : aClass.getSuperClasses()) {
getSubclasses(clazz).add(aClass);
- myClasses.add(clazz);
if (!visited.contains(clazz)) {
buildSubClassesMapImpl(clazz, visited);
}
@@ -66,13 +61,8 @@
}
@Override
- protected void extractClassMembers(PyClass aClass, ArrayList<PyMemberInfo> temp) {
- for (PyFunction function : aClass.getMethods()) {
- temp.add(new PyMemberInfo(function));
- }
- for (PyClass pyClass : aClass.getSuperClasses()) {
- temp.add(new PyMemberInfo(pyClass));
- }
+ protected void extractClassMembers(PyClass aClass, ArrayList<PyMemberInfo<PyElement>> temp) {
+ temp.addAll(MembersManager.getAllMembersCouldBeMoved(aClass));
}
@Override
@@ -80,8 +70,4 @@
return member1 instanceof PyFunction && member instanceof PyFunction &&
PyRefactoringUtil.areConflictingMethods((PyFunction)member, (PyFunction)member1);
}
-
- public Collection<PyClass> getClasses() {
- return myClasses;
- }
}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassDialog.java b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassDialog.java
deleted file mode 100644
index c0bc437..0000000
--- a/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassDialog.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- * Copyright 2000-2013 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.jetbrains.python.refactoring.classes.extractSuperclass;
-
-import com.intellij.lang.LanguageNamesValidation;
-import com.intellij.lang.refactoring.NamesValidator;
-import com.intellij.openapi.fileChooser.FileChooserDescriptor;
-import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
-import com.intellij.openapi.project.Project;
-import com.intellij.openapi.roots.ProjectRootManager;
-import com.intellij.openapi.ui.TextComponentAccessor;
-import com.intellij.openapi.ui.TextFieldWithBrowseButton;
-import com.intellij.openapi.util.io.FileUtil;
-import com.intellij.openapi.util.text.StringUtil;
-import com.intellij.openapi.vfs.VirtualFile;
-import com.intellij.refactoring.RefactoringBundle;
-import com.intellij.refactoring.classMembers.AbstractUsesDependencyMemberInfoModel;
-import com.intellij.refactoring.classMembers.DependencyMemberInfoModel;
-import com.intellij.refactoring.ui.ConflictsDialog;
-import com.jetbrains.python.PyBundle;
-import com.jetbrains.python.PythonLanguage;
-import com.jetbrains.python.psi.PyClass;
-import com.jetbrains.python.psi.PyElement;
-import com.jetbrains.python.refactoring.classes.PyMemberInfo;
-import com.jetbrains.python.refactoring.classes.PyMemberInfoStorage;
-import com.jetbrains.python.refactoring.classes.ui.UpDirectedMembersMovingDialog;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-import javax.swing.*;
-import java.awt.*;
-import java.io.File;
-import java.io.IOException;
-import java.util.Collection;
-
-/**
- * @author Dennis.Ushakov
- */
-public class PyExtractSuperclassDialog extends UpDirectedMembersMovingDialog {
- private final NamesValidator myNamesValidator = LanguageNamesValidation.INSTANCE.forLanguage(PythonLanguage.getInstance());
- protected JTextField mySourceClassField;
- protected JLabel mySuperNameLabel;
- protected JTextField myExtractedSuperNameField;
- protected TextFieldWithBrowseButton myTargetDirField;
- protected JLabel myDirLabel;
- private static final String FILE_BROWSER_TITLE = "Extract superclass to file or directory:";
-
- public PyExtractSuperclassDialog(Project project, PyClass clazz, PyMemberInfoStorage infoStorage) {
- super(project, clazz);
- myMemberInfos = infoStorage.getClassMemberInfos(myClass);
-
- myExtractedSuperNameField = new JTextField();
- myTargetDirField = new TextFieldWithBrowseButton();
- initSourceClassField();
-
- setTitle(PyExtractSuperclassHandler.REFACTORING_NAME);
-
- init();
- }
-
- protected void initSourceClassField() {
- mySourceClassField = new JTextField();
- mySourceClassField.setEditable(false);
- mySourceClassField.setText(myClass.getName());
- }
-
- @Override
- protected void doOKAction() {
- final String name = getSuperBaseName();
- if (!myNamesValidator.isIdentifier(name, myClass.getProject())) {
- setErrorText(PyBundle.message("refactoring.extract.super.name.0.must.be.ident", name));
- return;
- }
- boolean found_root = false;
- try {
- String target_dir = FileUtil.toSystemIndependentName(new File(myTargetDirField.getText()).getCanonicalPath());
- for (VirtualFile file : ProjectRootManager.getInstance(myClass.getProject()).getContentRoots()) {
- if (StringUtil.startsWithIgnoreCase(target_dir, file.getPath())) {
- found_root = true;
- break;
- }
- }
- }
- catch (IOException ignore) {
- }
- if (! found_root) {
- setErrorText(PyBundle.message("refactoring.extract.super.target.path.outside.roots"));
- return;
- }
- super.doOKAction();
- }
-
- @Override
- public JComponent getPreferredFocusedComponent() {
- return myExtractedSuperNameField;
- }
-
- protected JPanel createNorthPanel() {
- Box box = createBox();
- box.add(Box.createVerticalStrut(10));
-
- JPanel panel = new JPanel(new BorderLayout());
- panel.add(box, BorderLayout.CENTER);
- return panel;
- }
-
- protected Box createBox() {
- Box box = Box.createVerticalBox();
-
- JPanel _panel = new JPanel(new BorderLayout());
- _panel.add(new JLabel(RefactoringBundle.message("extract.superclass.from")), BorderLayout.NORTH);
- _panel.add(mySourceClassField, BorderLayout.CENTER);
- box.add(_panel);
-
- box.add(Box.createVerticalStrut(10));
-
- mySuperNameLabel = new JLabel();
- mySuperNameLabel.setText(RefactoringBundle.message("superclass.name"));
-
- _panel = new JPanel(new BorderLayout());
- _panel.add(mySuperNameLabel, BorderLayout.NORTH);
- _panel.add(myExtractedSuperNameField, BorderLayout.CENTER);
- box.add(_panel);
- box.add(Box.createVerticalStrut(5));
-
- final FileChooserDescriptor descriptor = FileChooserDescriptorFactory.createSingleFileOrFolderDescriptor();
- final VirtualFile root = getRoot();
- assert root != null;
-
- final Project project = myClass.getProject();
- descriptor.setRoots(ProjectRootManager.getInstance(project).getContentRoots());
- descriptor.setIsTreeRootVisible(true);
- myTargetDirField.setText(FileUtil.toSystemDependentName(root.getPath()));
- myTargetDirField.addBrowseFolderListener(FILE_BROWSER_TITLE,
- null, project, descriptor, TextComponentAccessor.TEXT_FIELD_WHOLE_TEXT);
-
- _panel = new JPanel(new BorderLayout());
- myDirLabel = new JLabel();
- myDirLabel.setText(FILE_BROWSER_TITLE);
-
- _panel.add(myDirLabel, BorderLayout.NORTH);
- _panel.add(myTargetDirField, BorderLayout.CENTER);
- box.add(_panel);
- return box;
- }
-
- @Nullable
- protected VirtualFile getRoot() {
- return myClass.getContainingFile().getVirtualFile();
- }
-
- @Override
- protected String getMembersBorderTitle() {
- return RefactoringBundle.message("members.to.form.superclass");
- }
-
- @Override
- protected String getHelpId() {
- return "python.reference.extractSuperclass";
- }
-
- @Override
- protected DependencyMemberInfoModel<PyElement, PyMemberInfo> createMemberInfoModel() {
- return new MyMemberInfoModel(myClass);
- }
-
- @Override
- public boolean checkConflicts() {
- final Collection<PyMemberInfo> infos = getSelectedMemberInfos();
- if (!checkWritable(myClass, infos)) return false;
- if (infos.size() == 0) {
- ConflictsDialog conflictsDialog = new ConflictsDialog(myClass.getProject(), RefactoringBundle.message("no.members.selected"));
- conflictsDialog.show();
- return conflictsDialog.isOK();
- }
- return true;
- }
-
- public String getSuperBaseName() {
- return myExtractedSuperNameField.getText();
- }
-
- public String getTargetFile() {
- return myTargetDirField.getText();
- }
-
- private static class MyMemberInfoModel extends AbstractUsesDependencyMemberInfoModel<PyElement, PyClass, PyMemberInfo> {
- public MyMemberInfoModel(PyClass clazz) {
- super(clazz, null, false);
- }
-
- public boolean isAbstractEnabled(PyMemberInfo member) {
- return false;
- }
-
- public int checkForProblems(@NotNull PyMemberInfo member) {
- return member.isChecked() ? OK : super.checkForProblems(member);
- }
-
- @Override
- protected int doCheck(@NotNull PyMemberInfo memberInfo, int problem) {
- return problem;
- }
- }
-}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassHandler.java b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassHandler.java
index a68860d..747d9bf 100644
--- a/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassHandler.java
+++ b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassHandler.java
@@ -15,23 +15,18 @@
*/
package com.jetbrains.python.refactoring.classes.extractSuperclass;
-import com.intellij.openapi.actionSystem.DataContext;
-import com.intellij.openapi.application.ex.ApplicationManagerEx;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
-import com.intellij.psi.PsiElement;
-import com.intellij.psi.PsiFile;
import com.intellij.refactoring.RefactoringBundle;
import com.intellij.refactoring.util.CommonRefactoringUtil;
-import com.intellij.util.PsiNavigateUtil;
+import com.jetbrains.python.PyBundle;
import com.jetbrains.python.psi.PyClass;
import com.jetbrains.python.psi.PyUtil;
-import com.jetbrains.python.refactoring.classes.PyClassMembersRefactoringSupport;
import com.jetbrains.python.refactoring.classes.PyClassRefactoringHandler;
-import com.jetbrains.python.refactoring.classes.PyMemberInfo;
import com.jetbrains.python.refactoring.classes.PyMemberInfoStorage;
-
-import java.util.Collection;
+import com.jetbrains.python.vp.Creator;
+import com.jetbrains.python.vp.ViewPresenterUtils;
+import org.jetbrains.annotations.NotNull;
/**
* @author Dennis.Ushakov
@@ -39,27 +34,39 @@
public class PyExtractSuperclassHandler extends PyClassRefactoringHandler {
public static final String REFACTORING_NAME = RefactoringBundle.message("extract.superclass.title");
+
@Override
- protected void doRefactor(Project project, PsiElement element1, PsiElement element2, Editor editor, PsiFile file, DataContext dataContext) {
- CommonRefactoringUtil.checkReadOnlyStatus(project, file);
-
- final PyClass clazz = PyUtil.getContainingClassOrSelf(element1);
- if (!inClass(clazz, project, editor, "refactoring.pull.up.error.cannot.perform.refactoring.not.inside.class")) return;
-
- final PyMemberInfoStorage infoStorage = PyClassMembersRefactoringSupport.getSelectedMemberInfos(clazz, element1, element2);
-
- if (ApplicationManagerEx.getApplicationEx().isUnitTestMode()) return;
-
- final PyExtractSuperclassDialog dialog = new PyExtractSuperclassDialog(project, clazz, infoStorage);
- dialog.show();
- if(dialog.isOK()) {
- extractWithHelper(clazz, dialog.getSelectedMemberInfos(), dialog.getSuperBaseName(), dialog.getTargetFile());
+ protected void doRefactorImpl(@NotNull final Project project,
+ @NotNull final PyClass classUnderRefactoring,
+ @NotNull final PyMemberInfoStorage infoStorage,
+ @NotNull final Editor editor) {
+ //TODO: Move to presenter
+ if (PyUtil.filterOutObject(infoStorage.getClassMemberInfos(classUnderRefactoring)).isEmpty()) {
+ CommonRefactoringUtil.showErrorHint(project, editor, PyBundle
+ .message("refactoring.extract.super.class.no.members.allowed"), RefactoringBundle.message("extract.superclass.elements.header"),
+ null);
+ return;
}
+
+ ViewPresenterUtils.linkViewWithPresenterAndLaunch(PyExtractSuperclassPresenter.class, PyExtractSuperclassView.class,
+ new Creator<PyExtractSuperclassView, PyExtractSuperclassPresenter>() {
+ @NotNull
+ @Override
+ public PyExtractSuperclassPresenter createPresenter(@NotNull final PyExtractSuperclassView view) {
+ return new PyExtractSuperclassPresenterImpl(view, classUnderRefactoring,
+ infoStorage);
+ }
+
+ @NotNull
+ @Override
+ public PyExtractSuperclassView createView(@NotNull final PyExtractSuperclassPresenter presenter) {
+ return new PyExtractSuperclassViewSwingImpl(classUnderRefactoring, project,
+ presenter);
+ }
+ }
+ );
}
- private static void extractWithHelper(PyClass clazz, Collection<PyMemberInfo> selectedMemberInfos, String superBaseName, String targetFile) {
- PsiNavigateUtil.navigate(PyExtractSuperclassHelper.extractSuperclass(clazz, selectedMemberInfos, superBaseName, targetFile));
- }
@Override
protected String getTitle() {
diff --git a/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassHelper.java b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassHelper.java
index 0d80337..52657c6 100644
--- a/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassHelper.java
+++ b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassHelper.java
@@ -15,95 +15,89 @@
*/
package com.jetbrains.python.refactoring.classes.extractSuperclass;
-import com.intellij.openapi.application.ApplicationManager;
+import com.google.common.base.Predicate;
import com.intellij.openapi.application.ex.ApplicationManagerEx;
-import com.intellij.openapi.command.CommandProcessor;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.util.Comparing;
-import com.intellij.openapi.util.Ref;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
-import com.intellij.openapi.vfs.VfsUtil;
+import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileManager;
import com.intellij.psi.*;
-import com.intellij.refactoring.RefactoringBundle;
import com.intellij.util.PathUtil;
import com.jetbrains.python.PyNames;
import com.jetbrains.python.PythonFileType;
import com.jetbrains.python.psi.*;
-import com.jetbrains.python.psi.impl.PyPsiUtils;
import com.jetbrains.python.refactoring.classes.PyClassRefactoringUtil;
-import com.jetbrains.python.refactoring.classes.PyMemberInfo;
+import com.jetbrains.python.refactoring.classes.membersManager.MembersManager;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.IOException;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
/**
* @author Dennis.Ushakov
*/
-public class PyExtractSuperclassHelper {
+public final class PyExtractSuperclassHelper {
private static final Logger LOG = Logger.getInstance(PyExtractSuperclassHelper.class.getName());
+ /**
+ * Accepts only those members whose element is PyClass object (new classes)
+ */
+ private static final Predicate<PyMemberInfo<PyElement>> ALLOW_OBJECT = new PyUtil.ObjectPredicate(true);
- private PyExtractSuperclassHelper() {}
+ private PyExtractSuperclassHelper() {
+ }
- public static PsiElement extractSuperclass(final PyClass clazz,
- final Collection<PyMemberInfo> selectedMemberInfos,
- final String superBaseName,
- final String targetFile) {
- final Set<String> superClasses = new HashSet<String>();
- final Set<PsiNamedElement> extractedClasses = new HashSet<PsiNamedElement>();
- final List<PyFunction> methods = new ArrayList<PyFunction>();
- for (PyMemberInfo member : selectedMemberInfos) {
- final PyElement element = member.getMember();
- if (element instanceof PyFunction) methods.add((PyFunction)element);
- else if (element instanceof PyClass) {
- extractedClasses.add((PyClass)element);
- superClasses.add(element.getName());
+ static void extractSuperclass(final PyClass clazz,
+ @NotNull Collection<PyMemberInfo<PyElement>> selectedMemberInfos,
+ final String superBaseName,
+ final String targetFile) {
+ //We will need to change it probably while param may be read-only
+ //noinspection AssignmentToMethodParameter
+ selectedMemberInfos = new ArrayList<PyMemberInfo<PyElement>>(selectedMemberInfos);
+
+ // PY-12171
+ final PyMemberInfo<PyElement> objectMember = MembersManager.findMember(selectedMemberInfos, ALLOW_OBJECT);
+ if (LanguageLevel.forElement(clazz).isPy3K()) {
+ // Remove object from list if Py3
+ if (objectMember != null) {
+ selectedMemberInfos.remove(objectMember);
}
- else LOG.error("unmatched member class " + element.getClass());
- }
-
- // 'object' superclass is always pulled up, even if not selected explicitly
- for (PyExpression expr : clazz.getSuperClassExpressions()) {
- if (PyNames.OBJECT.equals(expr.getText()) && !superClasses.contains(PyNames.OBJECT)) {
- superClasses.add(PyNames.OBJECT);
+ } else {
+ // Always add object if < Py3
+ if (objectMember == null) {
+ final PyMemberInfo<PyElement> object = MembersManager.findMember(clazz, ALLOW_OBJECT);
+ if (object != null) {
+ selectedMemberInfos.add(object);
+ }
}
}
final Project project = clazz.getProject();
- final Ref<PyClass> newClassRef = new Ref<PyClass>();
- CommandProcessor.getInstance().executeCommand(project, new Runnable() {
- public void run() {
- ApplicationManager.getApplication().runWriteAction(new Runnable() {
- public void run() {
- final PyElement[] elements = methods.toArray(new PyElement[methods.size()]);
- final String text = "class " + superBaseName + ":\n pass" + "\n";
- PyClass newClass = PyElementGenerator.getInstance(project).createFromText(LanguageLevel.getDefault(), PyClass.class, text);
- newClass = placeNewClass(project, newClass, clazz, targetFile);
- newClassRef.set(newClass);
- PyClassRefactoringUtil.moveMethods(methods, newClass);
- PyClassRefactoringUtil.moveSuperclasses(clazz, superClasses, newClass);
- PyClassRefactoringUtil.addSuperclasses(project, clazz, null, Collections.singleton(superBaseName));
- PyClassRefactoringUtil.insertImport(newClass, extractedClasses);
- if (elements.length > 0) {
- PyPsiUtils.removeElements(elements);
- }
- PyClassRefactoringUtil.insertPassIfNeeded(clazz);
- }
- });
- }
- }, RefactoringBundle.message("extract.superclass.command.name", superBaseName, clazz.getName()), null);
- return newClassRef.get();
+
+ final String text = "class " + superBaseName + ":\n pass" + "\n";
+ PyClass newClass = PyElementGenerator.getInstance(project).createFromText(LanguageLevel.getDefault(), PyClass.class, text);
+
+ newClass = placeNewClass(project, newClass, clazz, targetFile);
+ MembersManager.moveAllMembers(selectedMemberInfos, clazz, newClass);
+ if (! newClass.getContainingFile().equals(clazz.getContainingFile())) {
+ PyClassRefactoringUtil.optimizeImports(clazz.getContainingFile()); // To remove unneeded imports only if user used different file
+ }
+ PyClassRefactoringUtil.addSuperclasses(project, clazz, null, newClass);
+
}
- private static PyClass placeNewClass(Project project, PyClass newClass, @NotNull PyClass clazz, String targetFile) {
- VirtualFile file = VirtualFileManager.getInstance().findFileByUrl(ApplicationManagerEx.getApplicationEx().isUnitTestMode() ? targetFile : VfsUtil.pathToUrl(targetFile));
+ private static PyClass placeNewClass(final Project project, PyClass newClass, @NotNull final PyClass clazz, final String targetFile) {
+ VirtualFile file = VirtualFileManager.getInstance()
+ .findFileByUrl(ApplicationManagerEx.getApplicationEx().isUnitTestMode() ? targetFile : VfsUtilCore.pathToUrl(targetFile));
// file is the same as the source
if (Comparing.equal(file, clazz.getContainingFile().getVirtualFile())) {
return (PyClass)clazz.getParent().addBefore(newClass, clazz);
@@ -131,7 +125,8 @@
else { // existing file
psiFile = PsiManager.getInstance(project).findFile(file);
}
- } catch (IOException e) {
+ }
+ catch (IOException e) {
LOG.error(e);
}
@@ -147,6 +142,7 @@
/**
* Places a file at the end of given path, creating intermediate dirs and inits.
+ *
* @param project
* @param path
* @param filename
@@ -157,6 +153,7 @@
return placeFile(project, path, filename, null);
}
+ //TODO: Mover to the other class? That is not good to dependent PyUtils on this class
public static PsiFile placeFile(Project project, String path, String filename, @Nullable String content) throws IOException {
PsiDirectory psiDir = createDirectories(project, path);
LOG.assertTrue(psiDir != null);
@@ -177,8 +174,9 @@
/**
* Create all intermediate dirs with inits from one of roots up to target dir.
+ *
* @param project
- * @param target a full path to target dir
+ * @param target a full path to target dir
* @return deepest child directory, or null if target is not in roots or process fails at some point.
*/
@Nullable
@@ -198,7 +196,7 @@
}
}
if (the_root == null) {
- throw new IOException("Can't find '"+ target +"' among roots");
+ throw new IOException("Can't find '" + target + "' among roots");
}
if (the_rest != null) {
final LocalFileSystem lfs = LocalFileSystem.getInstance();
@@ -213,7 +211,9 @@
throw new IOException("Expected dir, but got non-dir: " + subdir.getPath());
}
}
- else subdir = the_root.createChildDirectory(lfs, dirs[i]);
+ else {
+ subdir = the_root.createChildDirectory(lfs, dirs[i]);
+ }
VirtualFile init_vfile = subdir.findChild(PyNames.INIT_DOT_PY);
if (init_vfile == null) init_vfile = subdir.createChildData(lfs, PyNames.INIT_DOT_PY);
/*
@@ -235,5 +235,4 @@
}
return ret;
}
-
}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassInfoModel.java b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassInfoModel.java
new file mode 100644
index 0000000..2bae38a
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassInfoModel.java
@@ -0,0 +1,31 @@
+package com.jetbrains.python.refactoring.classes.extractSuperclass;
+
+import com.intellij.refactoring.classMembers.AbstractUsesDependencyMemberInfoModel;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * @author Ilya.Kazakevich
+ */
+class PyExtractSuperclassInfoModel extends AbstractUsesDependencyMemberInfoModel<PyElement, PyClass, PyMemberInfo<PyElement>> {
+ PyExtractSuperclassInfoModel(@NotNull final PyClass clazz) {
+ super(clazz, null, false);
+ }
+
+ @Override
+ public boolean isAbstractEnabled(final PyMemberInfo<PyElement> member) {
+ return member.isCouldBeAbstract() && isMemberEnabled(member);
+ }
+
+ @Override
+ public int checkForProblems(@NotNull final PyMemberInfo<PyElement> member) {
+ return member.isChecked() ? OK : super.checkForProblems(member);
+ }
+
+ @Override
+ protected int doCheck(@NotNull final PyMemberInfo<PyElement> memberInfo, final int problem) {
+ return problem;
+ }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassInitializationInfo.java b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassInitializationInfo.java
new file mode 100644
index 0000000..9ba93c2
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassInitializationInfo.java
@@ -0,0 +1,46 @@
+package com.jetbrains.python.refactoring.classes.extractSuperclass;
+
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.refactoring.classMembers.MemberInfoModel;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
+import com.jetbrains.python.refactoring.classes.membersManager.vp.MembersViewInitializationInfo;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Collection;
+
+/**
+ * View configuration for "extract superclass"
+ *
+ * @author Ilya.Kazakevich
+ */
+class PyExtractSuperclassInitializationInfo extends MembersViewInitializationInfo {
+
+ @NotNull
+ private final String myDefaultFilePath;
+ @NotNull
+ private final VirtualFile[] myRoots;
+
+ /**
+ * @param defaultFilePath module file path to display. User will be able to change it later.
+ * @param roots virtual files where user may add new module
+ */
+ PyExtractSuperclassInitializationInfo(@NotNull final MemberInfoModel<PyElement, PyMemberInfo<PyElement>> memberInfoModel,
+ @NotNull final Collection<PyMemberInfo<PyElement>> memberInfos,
+ @NotNull final String defaultFilePath,
+ @NotNull final VirtualFile... roots) {
+ super(memberInfoModel, memberInfos);
+ myDefaultFilePath = defaultFilePath;
+ myRoots = roots.clone();
+ }
+
+ @NotNull
+ public String getDefaultFilePath() {
+ return myDefaultFilePath;
+ }
+
+ @NotNull
+ public VirtualFile[] getRoots() {
+ return myRoots.clone();
+ }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassPresenter.java b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassPresenter.java
new file mode 100644
index 0000000..4e5edf7
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassPresenter.java
@@ -0,0 +1,10 @@
+package com.jetbrains.python.refactoring.classes.extractSuperclass;
+
+import com.jetbrains.python.refactoring.classes.membersManager.vp.MembersBasedPresenter;
+
+/**
+ * @author Ilya.Kazakevich
+ */
+public interface PyExtractSuperclassPresenter extends MembersBasedPresenter {
+ //TODO: Remove?
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassPresenterImpl.java b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassPresenterImpl.java
new file mode 100644
index 0000000..87ec445
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassPresenterImpl.java
@@ -0,0 +1,114 @@
+package com.jetbrains.python.refactoring.classes.extractSuperclass;
+
+import com.intellij.lang.LanguageNamesValidation;
+import com.intellij.lang.refactoring.NamesValidator;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.roots.ProjectRootManager;
+import com.intellij.openapi.util.io.FileUtil;
+import com.intellij.openapi.util.text.StringUtil;
+import com.intellij.openapi.vfs.LocalFileSystem;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.psi.PsiFile;
+import com.intellij.psi.PsiManager;
+import com.intellij.refactoring.RefactoringBundle;
+import com.intellij.refactoring.classMembers.MemberInfoModel;
+import com.jetbrains.python.PyBundle;
+import com.jetbrains.python.PythonLanguage;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.psi.PyFile;
+import com.jetbrains.python.psi.PyUtil;
+import com.jetbrains.python.refactoring.classes.PyMemberInfoStorage;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
+import com.jetbrains.python.refactoring.classes.membersManager.vp.BadDataException;
+import com.jetbrains.python.refactoring.classes.membersManager.vp.MembersBasedPresenterNoPreviewImpl;
+import org.jetbrains.annotations.NotNull;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Collections;
+
+/**
+ * @author Ilya.Kazakevich
+ */
+class PyExtractSuperclassPresenterImpl extends MembersBasedPresenterNoPreviewImpl<PyExtractSuperclassView,
+ MemberInfoModel<PyElement, PyMemberInfo<PyElement>>>
+ implements PyExtractSuperclassPresenter {
+ private final NamesValidator myNamesValidator = LanguageNamesValidation.INSTANCE.forLanguage(PythonLanguage.getInstance());
+
+ PyExtractSuperclassPresenterImpl(@NotNull final PyExtractSuperclassView view,
+ @NotNull final PyClass classUnderRefactoring,
+ @NotNull final PyMemberInfoStorage infoStorage) {
+ super(view, classUnderRefactoring, infoStorage, new PyExtractSuperclassInfoModel(classUnderRefactoring));
+ }
+
+ @Override
+ protected void validateView() throws BadDataException {
+ super.validateView();
+ final Project project = myClassUnderRefactoring.getProject();
+ if (!myNamesValidator.isIdentifier(myView.getSuperClassName(), project)) {
+ throw new BadDataException(PyBundle.message("refactoring.extract.super.name.0.must.be.ident", myView.getSuperClassName()));
+ }
+ boolean rootFound = false;
+ final File moduleFile = new File(myView.getModuleFile());
+ try {
+ final String targetDir = FileUtil.toSystemIndependentName(moduleFile.getCanonicalPath());
+ for (final VirtualFile file : ProjectRootManager.getInstance(project).getContentRoots()) {
+ if (StringUtil.startsWithIgnoreCase(targetDir, file.getPath())) {
+ rootFound = true;
+ break;
+ }
+ }
+ }
+ catch (final IOException ignore) {
+ }
+ if (!rootFound) {
+ throw new BadDataException(PyBundle.message("refactoring.extract.super.target.path.outside.roots"));
+ }
+
+ // TODO: Cover with test. It can't be done for now, because testFixture reports root path incorrectly
+ // PY-12173
+ myView.getModuleFile();
+ final VirtualFile moduleVirtualFile = LocalFileSystem.getInstance().findFileByIoFile(moduleFile);
+ if (moduleVirtualFile != null) {
+ final PsiFile psiFile = PsiManager.getInstance(project).findFile(moduleVirtualFile);
+ if (psiFile instanceof PyFile) {
+ if (((PyFile)psiFile).findTopLevelClass(myView.getSuperClassName()) != null) {
+ throw new BadDataException(PyBundle.message("refactoring.extract.super.target.class.already.exists", myView.getSuperClassName()));
+ }
+ }
+ }
+ }
+
+ @Override
+ public void launch() {
+ final String defaultFilePath = FileUtil.toSystemDependentName(myClassUnderRefactoring.getContainingFile().getVirtualFile().getPath());
+ final VirtualFile[] roots = ProjectRootManager.getInstance(myClassUnderRefactoring.getProject()).getContentRoots();
+ final Collection<PyMemberInfo<PyElement>> pyMemberInfos =
+ PyUtil.filterOutObject(myStorage.getClassMemberInfos(myClassUnderRefactoring));
+ myView.configure(
+ new PyExtractSuperclassInitializationInfo(myModel, pyMemberInfos, defaultFilePath,
+ roots)
+ );
+ myView.initAndShow();
+ }
+
+ @NotNull
+ @Override
+ protected String getCommandName() {
+ return RefactoringBundle.message("extract.superclass.command.name", myView.getSuperClassName(), myClassUnderRefactoring.getName());
+ }
+
+ @Override
+ protected void refactorNoPreview() {
+ PyExtractSuperclassHelper
+ .extractSuperclass(myClassUnderRefactoring, myView.getSelectedMemberInfos(), myView.getSuperClassName(), myView.getModuleFile());
+ }
+
+ @NotNull
+ @Override
+ protected Iterable<? extends PyClass> getDestClassesToCheckConflicts() {
+ return Collections.emptyList(); // No conflict can take place in newly created classes
+ }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassView.java b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassView.java
new file mode 100644
index 0000000..d4dd249
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassView.java
@@ -0,0 +1,25 @@
+package com.jetbrains.python.refactoring.classes.extractSuperclass;
+
+import com.jetbrains.python.refactoring.classes.membersManager.vp.MembersBasedView;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * @author Ilya.Kazakevich
+ */
+public interface PyExtractSuperclassView extends MembersBasedView<PyExtractSuperclassInitializationInfo> {
+
+ /**
+ *
+ * @return path to destination file (module) where user wants to create new class
+ */
+ @NotNull
+ String getModuleFile();
+
+ /**
+ *
+ * @return name user wants to give to new class
+ */
+ @NotNull
+ String getSuperClassName();
+
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassViewSwingImpl.java b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassViewSwingImpl.java
new file mode 100644
index 0000000..aed7301
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassViewSwingImpl.java
@@ -0,0 +1,108 @@
+package com.jetbrains.python.refactoring.classes.extractSuperclass;
+
+import com.intellij.openapi.fileChooser.FileChooserDescriptor;
+import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.roots.ProjectRootManager;
+import com.intellij.openapi.ui.TextComponentAccessor;
+import com.intellij.openapi.ui.TextFieldWithBrowseButton;
+import com.intellij.refactoring.RefactoringBundle;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.refactoring.classes.membersManager.vp.MembersBasedViewSwingImpl;
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import java.awt.*;
+
+/**
+ * @author Ilya.Kazakevich
+ */
+class PyExtractSuperclassViewSwingImpl
+ extends MembersBasedViewSwingImpl<PyExtractSuperclassPresenter, PyExtractSuperclassInitializationInfo>
+ implements PyExtractSuperclassView {
+
+ private static final String FILE_OR_DIRECTORY = RefactoringBundle.message("extract.superclass.elements.header");
+ @NotNull
+ private final JTextArea myExtractedSuperNameField = new JTextArea();
+ @NotNull
+ private final FileChooserDescriptor myFileChooserDescriptor;
+ @NotNull
+ private final TextFieldWithBrowseButton myTargetDirField;
+
+ PyExtractSuperclassViewSwingImpl(@NotNull final PyClass classUnderRefactoring,
+ @NotNull final Project project,
+ @NotNull final PyExtractSuperclassPresenter presenter) {
+ super(project, presenter, RefactoringBundle.message("extract.superclass.from"), true);
+ setTitle(PyExtractSuperclassHandler.REFACTORING_NAME);
+
+
+ final Box box = Box.createVerticalBox();
+
+ JPanel panel = new JPanel(new BorderLayout());
+ panel.add(new JLabel(RefactoringBundle.message("extract.superclass.from")), BorderLayout.NORTH);
+ final JTextField sourceClassField = new JTextField();
+ sourceClassField.setEditable(false);
+ sourceClassField.setText(classUnderRefactoring.getName());
+ panel.add(sourceClassField, BorderLayout.CENTER);
+ box.add(panel);
+
+ box.add(Box.createVerticalStrut(10));
+
+ final JLabel superNameLabel = new JLabel();
+ superNameLabel.setText(RefactoringBundle.message("superclass.name"));
+
+ panel = new JPanel(new BorderLayout());
+ panel.add(superNameLabel, BorderLayout.NORTH);
+ panel.add(myExtractedSuperNameField, BorderLayout.CENTER);
+ box.add(panel);
+ box.add(Box.createVerticalStrut(5));
+
+ myFileChooserDescriptor = FileChooserDescriptorFactory.createSingleFileOrFolderDescriptor();
+
+
+ myFileChooserDescriptor.setRoots(ProjectRootManager.getInstance(project).getContentRoots());
+ myFileChooserDescriptor.setIsTreeRootVisible(true);
+ myTargetDirField = new TextFieldWithBrowseButton();
+ myTargetDirField
+ .addBrowseFolderListener(FILE_OR_DIRECTORY, null, project, myFileChooserDescriptor, TextComponentAccessor.TEXT_FIELD_WHOLE_TEXT);
+
+ panel = new JPanel(new BorderLayout());
+ final JLabel dirLabel = new JLabel();
+ dirLabel.setText(FILE_OR_DIRECTORY); //u18n
+
+ panel.add(dirLabel, BorderLayout.NORTH);
+ panel.add(myTargetDirField, BorderLayout.CENTER);
+ box.add(panel);
+
+ box.add(Box.createVerticalStrut(10));
+
+
+ myTopPanel.add(box, BorderLayout.CENTER);
+ myCenterPanel.add(myPyMemberSelectionPanel, BorderLayout.CENTER);
+ setPreviewResults(false);
+ }
+
+ @Override
+ public JComponent getPreferredFocusedComponent() {
+ return myExtractedSuperNameField;
+ }
+
+ @Override
+ public void configure(@NotNull final PyExtractSuperclassInitializationInfo configInfo) {
+ super.configure(configInfo);
+ myFileChooserDescriptor.setRoots(configInfo.getRoots());
+ myTargetDirField.setText(configInfo.getDefaultFilePath());
+ }
+
+ @NotNull
+ @Override
+ public String getModuleFile() {
+ return myTargetDirField.getText();
+ }
+
+ @NotNull
+ @Override
+ public String getSuperClassName() {
+ return myExtractedSuperNameField.getText();
+ }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/package-info.java b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/package-info.java
new file mode 100644
index 0000000..32852cb
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/extractSuperclass/package-info.java
@@ -0,0 +1,5 @@
+/**
+ * "Extract superclass" refactoring
+ * @author Ilya.Kazakevich
+ */
+package com.jetbrains.python.refactoring.classes.extractSuperclass;
\ No newline at end of file
diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/ClassFieldsManager.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/ClassFieldsManager.java
new file mode 100644
index 0000000..3bf4f00
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/ClassFieldsManager.java
@@ -0,0 +1,54 @@
+package com.jetbrains.python.refactoring.classes.membersManager;
+
+import com.jetbrains.python.psi.PyAssignmentStatement;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.psi.PyTargetExpression;
+import com.jetbrains.python.refactoring.classes.PyClassRefactoringUtil;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Moves class attributes up
+ *
+ * @author Ilya.Kazakevich
+ */
+class ClassFieldsManager extends FieldsManager {
+
+ ClassFieldsManager() {
+ super(true);
+ }
+
+ @Override
+ public boolean hasConflict(@NotNull final PyTargetExpression member, @NotNull final PyClass aClass) {
+ return NamePredicate.hasElementWithSameName(member, aClass.getClassAttributes());
+ }
+
+ @Override
+ protected Collection<PyElement> moveAssignments(@NotNull final PyClass from,
+ @NotNull final Collection<PyAssignmentStatement> statements,
+ @NotNull final PyClass... to) {
+ //TODO: Copy/paste with InstanceFieldsManager. Move to parent?
+ final List<PyElement> result = new ArrayList<PyElement>();
+ for (final PyClass destClass : to) {
+ result.addAll(PyClassRefactoringUtil.copyFieldDeclarationToStatement(statements, destClass.getStatementList(), destClass));
+ }
+ deleteElements(statements);
+ PyClassRefactoringUtil.insertPassIfNeeded(from);
+ return result;
+ }
+
+ @Override
+ protected boolean classHasField(@NotNull final PyClass pyClass, @NotNull final String fieldName) {
+ return pyClass.findClassAttribute(fieldName, true) != null;
+ }
+
+ @NotNull
+ @Override
+ protected List<PyTargetExpression> getFieldsByClass(@NotNull final PyClass pyClass) {
+ return pyClass.getClassAttributes();
+ }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/FieldsManager.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/FieldsManager.java
new file mode 100644
index 0000000..cb15b2b
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/FieldsManager.java
@@ -0,0 +1,157 @@
+package com.jetbrains.python.refactoring.classes.membersManager;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Collections2;
+import com.google.common.collect.Lists;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.util.PsiTreeUtil;
+import com.intellij.util.containers.MultiMap;
+import com.jetbrains.NotNullPredicate;
+import com.jetbrains.python.psi.*;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Parent of all field-based plugins (like class fields, instance fields and so on)
+ *
+ * @author Ilya.Kazakevich
+ */
+abstract class FieldsManager extends MembersManager<PyTargetExpression> {
+ private static final SimpleAssignmentsOnly SIMPLE_ASSIGNMENTS_ONLY = new SimpleAssignmentsOnly();
+ private static final AssignmentTransform ASSIGNMENT_TRANSFORM = new AssignmentTransform();
+ private final boolean myStatic;
+
+ /**
+ * @param isStatic is field static or not?
+ */
+ protected FieldsManager(final boolean isStatic) {
+ super(PyTargetExpression.class);
+ myStatic = isStatic;
+ }
+
+
+ @NotNull
+ @Override
+ protected Collection<PyElement> getDependencies(@NotNull final MultiMap<PyClass, PyElement> usedElements) {
+ return Collections.emptyList();
+ }
+
+ @NotNull
+ @Override
+ protected MultiMap<PyClass, PyElement> getDependencies(@NotNull final PyElement member) {
+ final MultiMap<PyClass, PyElement> result = new MultiMap<PyClass, PyElement>();
+ member.accept(new MyPyRecursiveElementVisitor(result));
+ return result;
+ }
+
+ @Override
+ protected Collection<? extends PyElement> getElementsToStoreReferences(@NotNull final Collection<PyTargetExpression> elements) {
+ // We need to save references from assignments
+ return Collections2.transform(elements, ASSIGNMENT_TRANSFORM);
+ }
+
+ @NotNull
+ @Override
+ protected List<PyElement> getMembersCouldBeMoved(@NotNull final PyClass pyClass) {
+ return Lists.<PyElement>newArrayList(Collections2.filter(getFieldsByClass(pyClass), SIMPLE_ASSIGNMENTS_ONLY));
+ }
+
+ @Override
+ protected Collection<PyElement> moveMembers(@NotNull final PyClass from,
+ @NotNull final Collection<PyMemberInfo<PyTargetExpression>> members,
+ @NotNull final PyClass... to) {
+ return moveAssignments(from, Collections2
+ .filter(Collections2.transform(fetchElements(members), ASSIGNMENT_TRANSFORM), NotNullPredicate.INSTANCE),
+ to);
+ }
+
+ protected abstract Collection<PyElement> moveAssignments(@NotNull PyClass from,
+ @NotNull Collection<PyAssignmentStatement> statements,
+ @NotNull PyClass... to);
+
+ /**
+ * Checks if class has fields. Only child may know how to obtain field
+ *
+ * @param pyClass class to check
+ * @param fieldName field name
+ * @return true if has one
+ */
+ protected abstract boolean classHasField(@NotNull PyClass pyClass, @NotNull String fieldName);
+
+ /**
+ * Returns all fields by class. Only child may know how to obtain fields
+ *
+ * @param pyClass class to check
+ * @return list of fields in target expression (declaration) form
+ */
+ @NotNull
+ protected abstract List<PyTargetExpression> getFieldsByClass(@NotNull PyClass pyClass);
+
+
+ @NotNull
+ @Override
+ public PyMemberInfo<PyTargetExpression> apply(@NotNull final PyTargetExpression input) {
+ return new PyMemberInfo<PyTargetExpression>(input, myStatic, input.getText(), isOverrides(input), this, false);
+ }
+
+ @Nullable
+ private Boolean isOverrides(@NotNull final PyTargetExpression input) {
+ final PyClass aClass = input.getContainingClass();
+ final String name = input.getName();
+ if (name == null) {
+ return null; //Field with out of name can't override something
+ }
+
+ assert aClass != null : "Target expression declared outside of class:" + input;
+
+ return classHasField(aClass, name) ? true : null;
+ }
+
+
+ private static class SimpleAssignmentsOnly extends NotNullPredicate<PyTargetExpression> {
+ //Support only simplest cases like CLASS_VAR = 42.
+ //Tuples (CLASS_VAR_1, CLASS_VAR_2) = "spam", "eggs" are not supported by now
+ @Override
+ public boolean applyNotNull(@NotNull final PyTargetExpression input) {
+ final PsiElement parent = input.getParent();
+ return (parent != null) && PyAssignmentStatement.class.isAssignableFrom(parent.getClass());
+ }
+ }
+
+
+ //Transforms expressions to its assignment step
+ private static class AssignmentTransform implements Function<PyTargetExpression, PyAssignmentStatement> {
+ @Nullable
+ @Override
+ public PyAssignmentStatement apply(@NotNull final PyTargetExpression input) {
+ return PsiTreeUtil.getParentOfType(input, PyAssignmentStatement.class);
+ }
+ }
+
+ /**
+ * Fetches field declarations
+ */
+ private static class MyPyRecursiveElementVisitor extends PyRecursiveElementVisitor {
+ @NotNull
+ private final MultiMap<PyClass, PyElement> myResult;
+
+ private MyPyRecursiveElementVisitor(@NotNull final MultiMap<PyClass, PyElement> result) {
+ myResult = result;
+ }
+
+ @Override
+ public void visitPyReferenceExpression(final PyReferenceExpression node) {
+ final PsiElement declaration = node.getReference().resolve();
+ if (declaration instanceof PyElement) {
+ final PyClass parent = PsiTreeUtil.getParentOfType(declaration, PyClass.class);
+ if (parent != null) {
+ myResult.putValue(parent, (PyElement)declaration);
+ }
+ }
+ }
+ }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/InstanceFieldsManager.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/InstanceFieldsManager.java
new file mode 100644
index 0000000..a1e19c4
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/InstanceFieldsManager.java
@@ -0,0 +1,118 @@
+package com.jetbrains.python.refactoring.classes.membersManager;
+
+import com.google.common.collect.Collections2;
+import com.intellij.psi.util.PsiTreeUtil;
+import com.jetbrains.NotNullPredicate;
+import com.jetbrains.python.PyNames;
+import com.jetbrains.python.psi.*;
+import com.jetbrains.python.psi.impl.PyFunctionBuilder;
+import com.jetbrains.python.refactoring.classes.PyClassRefactoringUtil;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * @author Ilya.Kazakevich
+ */
+class InstanceFieldsManager extends FieldsManager {
+
+ // PY-12170
+
+ InstanceFieldsManager() {
+ super(false);
+ }
+
+ @Override
+ public boolean hasConflict(@NotNull final PyTargetExpression member, @NotNull final PyClass aClass) {
+ return NamePredicate.hasElementWithSameName(member, aClass.getInstanceAttributes());
+ }
+
+ @Override
+ protected Collection<PyElement> moveAssignments(@NotNull final PyClass from,
+ @NotNull final Collection<PyAssignmentStatement> statements,
+ @NotNull final PyClass... to) {
+ //TODO: Copy/paste with ClassFieldsManager. Move to parent?
+
+ final List<PyElement> result = new ArrayList<PyElement>();
+ for (final PyClass destClass : to) {
+ result.addAll(copyInstanceFields(statements, destClass));
+ }
+ // Delete only declarations made in __init__ to prevent PY-12170
+ final PyFunction fromInitMethod = PyUtil.getInitMethod(from);
+ if (fromInitMethod != null) { // If class has no init method that means all its fields declared in other methods, so nothing to remove
+ deleteElements(Collections2.filter(statements, new InitsOnly(fromInitMethod)));
+ //We can't leave class constructor with empty body
+ PyClassRefactoringUtil.insertPassIfNeeded(fromInitMethod);
+ }
+ return result;
+ }
+
+ /**
+ * Copies class' fields in form of assignments (instance fields) to another class.
+ * Creates init method if there is no any
+ *
+ * @param members assignments to copy
+ * @param to destination
+ * @return newly created fields
+ */
+ @NotNull
+ private static List<PyAssignmentStatement> copyInstanceFields(@NotNull final Collection<PyAssignmentStatement> members,
+ @NotNull final PyClass to) {
+ //We need __init__ method, and if there is no any -- we need to create it
+ PyFunction toInitMethod = PyUtil.getInitMethod(to);
+ if (toInitMethod == null) {
+ toInitMethod = createInitMethod(to);
+ }
+ final PyStatementList statementList = toInitMethod.getStatementList();
+ return PyClassRefactoringUtil.copyFieldDeclarationToStatement(members, statementList, null);
+ }
+
+ /**
+ * Creates init method and adds it to certain class.
+ *
+ * @param to Class where method should be added
+ * @return newly created method
+ */
+ //TODO: Move to utils?
+ @NotNull
+ private static PyFunction createInitMethod(@NotNull final PyClass to) {
+ final PyFunctionBuilder functionBuilder = new PyFunctionBuilder(PyNames.INIT);
+ functionBuilder.parameter(PyNames.CANONICAL_SELF); //TODO: Take param from codestyle?
+ final PyFunction function = functionBuilder.buildFunction(to.getProject(), LanguageLevel.forElement(to));
+ return PyClassRefactoringUtil.addMethods(to, true, function).get(0);
+ }
+
+ @Override
+ protected boolean classHasField(@NotNull final PyClass pyClass, @NotNull final String fieldName) {
+ return pyClass.findInstanceAttribute(fieldName, true) != null;
+ }
+
+ @NotNull
+ @Override
+ protected List<PyTargetExpression> getFieldsByClass(@NotNull final PyClass pyClass) {
+ return pyClass.getInstanceAttributes();
+ }
+
+ private static class InitsOnly extends NotNullPredicate<PyAssignmentStatement> {
+ @NotNull
+ private final PyFunction myInitMethod;
+
+ private InitsOnly(@NotNull final PyFunction initMethod) {
+ myInitMethod = initMethod;
+ }
+
+ @Override
+ protected boolean applyNotNull(@NotNull final PyAssignmentStatement input) {
+ final PyExpression expression = input.getLeftHandSideExpression();
+ if (expression == null) {
+ return false;
+ }
+
+ final PyFunction functionWhereDeclared = PsiTreeUtil.getParentOfType(PyUtil.resolveToTheTop(expression), PyFunction.class);
+ return myInitMethod.equals(functionWhereDeclared);
+ }
+ }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/MembersConflictDialog.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/MembersConflictDialog.java
new file mode 100644
index 0000000..b288f95
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/MembersConflictDialog.java
@@ -0,0 +1,62 @@
+package com.jetbrains.python.refactoring.classes.membersManager;
+
+import com.intellij.openapi.project.Project;
+import com.intellij.psi.PsiElement;
+import com.intellij.refactoring.RefactoringBundle;
+import com.intellij.refactoring.ui.ConflictsDialog;
+import com.intellij.refactoring.util.RefactoringUIUtil;
+import com.intellij.util.containers.MultiMap;
+import com.jetbrains.python.PyBundle;
+import com.jetbrains.python.psi.PyClass;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Collection;
+
+/**
+ * Displays error messages about fact that destination class already contains some member infos
+ * or members under refactoring would not be available at the new place.
+ *
+ * @author Ilya.Kazakevich
+ */
+public class MembersConflictDialog extends ConflictsDialog {
+ /**
+ * @param project project under refactoring
+ * @param duplicatesConflict duplicates conflicts : that means destination class has the same member.
+ * If member "foo" already exists in class "bar": pass [bar] -] [foo].
+ * @param dependenciesConflicts dependency conflict: list of elements used by member under refactoring and would not be available
+ * at new destination. If user wants to move method, that uses field "bar" which would not be available at new class,
+ * pass [bar] field
+ */
+ public MembersConflictDialog(
+ @NotNull final Project project,
+ @NotNull final MultiMap<PyClass, PyMemberInfo<?>> duplicatesConflict,
+ @NotNull final Collection<PyMemberInfo<?>> dependenciesConflicts) {
+ super(project, convertDescription(duplicatesConflict, dependenciesConflicts), null, true, false);
+ }
+
+ @NotNull
+ private static MultiMap<PsiElement, String> convertDescription(
+ @NotNull final MultiMap<PyClass, PyMemberInfo<?>> duplicateConflictDescriptions,
+ @NotNull final Collection<PyMemberInfo<?>> dependenciesConflicts) {
+ final MultiMap<PsiElement, String> result = new MultiMap<PsiElement, String>();
+ for (final PyClass aClass : duplicateConflictDescriptions.keySet()) {
+ for (final PyMemberInfo<?> pyMemberInfo : duplicateConflictDescriptions.get(aClass)) {
+ final String message = RefactoringBundle.message("0.already.contains.a.1",
+ RefactoringUIUtil.getDescription(aClass, false),
+ RefactoringUIUtil.getDescription(pyMemberInfo.getMember(), false));
+ result.putValue(aClass, message);
+ }
+ }
+
+ for (final PyMemberInfo<?> memberUnderConflict : dependenciesConflicts) {
+ result.putValue(memberUnderConflict.getMember(), PyBundle.message(
+ "refactoring.will.not.be.accessible",
+ RefactoringUIUtil.getDescription(memberUnderConflict.getMember(), false)
+ )
+ );
+ }
+
+
+ return result;
+ }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/MembersManager.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/MembersManager.java
new file mode 100644
index 0000000..437b808
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/MembersManager.java
@@ -0,0 +1,381 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.refactoring.classes.membersManager;
+
+import com.google.common.base.Function;
+import com.google.common.base.Preconditions;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Collections2;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiNamedElement;
+import com.intellij.util.ArrayUtil;
+import com.intellij.util.containers.MultiMap;
+import com.jetbrains.NotNullPredicate;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.refactoring.classes.PyClassRefactoringUtil;
+import com.jetbrains.python.refactoring.classes.PyDependenciesComparator;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.*;
+
+/**
+ * Moves members between classes via its plugins (managers).
+ * To move members use {@link #getAllMembersCouldBeMoved(com.jetbrains.python.psi.PyClass)} and {@link #moveAllMembers(java.util.Collection, com.jetbrains.python.psi.PyClass, com.jetbrains.python.psi.PyClass...)}
+ * To add new manager, extend this class and add it to {@link #MANAGERS}
+ *
+ * @author Ilya.Kazakevich
+ */
+public abstract class MembersManager<T extends PyElement> implements Function<T, PyMemberInfo<T>> {
+ /**
+ * List of managers. Class delegates all logic to them.
+ */
+ private static final Collection<? extends MembersManager<? extends PyElement>> MANAGERS =
+ Arrays.asList(new MethodsManager(), new SuperClassesManager(), new ClassFieldsManager(), new InstanceFieldsManager());
+
+ @NotNull
+ private final Class<T> myExpectedClass;
+
+ protected MembersManager(@NotNull final Class<T> expectedClass) {
+ myExpectedClass = expectedClass;
+ }
+
+ /**
+ * Get all members that could be moved out of certain class
+ *
+ * @param pyClass class to find members
+ * @return list of members could be moved
+ */
+ @NotNull
+ public static List<PyMemberInfo<PyElement>> getAllMembersCouldBeMoved(@NotNull final PyClass pyClass) {
+ final List<PyMemberInfo<PyElement>> result = new ArrayList<PyMemberInfo<PyElement>>();
+
+ for (final MembersManager<? extends PyElement> manager : MANAGERS) {
+ result.addAll(transformSafely(pyClass, manager));
+ }
+ return result;
+ }
+
+
+ /**
+ * Transforms elements, manager says it could move to appropriate {@link com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo}.
+ * Types are checked at runtime.
+ *
+ * @param pyClass class whose members we want to move
+ * @param manager manager that should check class and report list of memebers
+ * @return member infos
+ */
+ //TODO: Move to TypeSafeMovingStrategy
+ @NotNull
+ @SuppressWarnings({"unchecked", "rawtypes"}) //We check type at runtime
+ private static Collection<PyMemberInfo<PyElement>> transformSafely(@NotNull final PyClass pyClass,
+ @NotNull final MembersManager<?> manager) {
+ final List<PyElement> membersCouldBeMoved = manager.getMembersCouldBeMoved(pyClass);
+ manager.checkElementTypes((Iterable)membersCouldBeMoved);
+ return (Collection<PyMemberInfo<PyElement>>)Collections2.transform(membersCouldBeMoved, (Function)manager);
+ }
+
+
+ /**
+ * Moves members from one class to another
+ *
+ * @param memberInfos members to move
+ * @param from source
+ * @param to destination
+ */
+ public static void moveAllMembers(
+ @NotNull final Collection<PyMemberInfo<PyElement>> memberInfos,
+ @NotNull final PyClass from,
+ @NotNull final PyClass... to
+ ) {
+ List<PyMemberInfo<PyElement>> memberInfosSorted = new ArrayList<PyMemberInfo<PyElement>>(memberInfos);
+ Collections.sort(memberInfosSorted, new Comparator<PyMemberInfo<PyElement>>() {
+ @Override
+ public int compare(PyMemberInfo<PyElement> o1, PyMemberInfo<PyElement> o2) {
+ return PyDependenciesComparator.INSTANCE.compare(o1.getMember(), o2.getMember());
+ }
+ });
+
+ for (PyMemberInfo<PyElement> info : memberInfosSorted) {
+ TypeSafeMovingStrategy.moveCheckingTypesAtRunTime(from, info.getMembersManager(), Collections.singleton(info), to);
+ }
+
+
+ /*//Move at once, sort
+ final Multimap<MembersManager<PyElement>, PyMemberInfo<PyElement>> managerToMember = ArrayListMultimap.create();
+ //Collect map (manager)->(list_of_memebers)
+ for (final PyMemberInfo<PyElement> memberInfo : memberInfos) {
+ managerToMember.put(memberInfo.getMembersManager(), memberInfo);
+ }
+ //Move members via manager
+ for (final MembersManager<PyElement> membersManager : managerToMember.keySet()) {
+ final Collection<PyMemberInfo<PyElement>> members = managerToMember.get(membersManager);
+ TypeSafeMovingStrategy.moveCheckingTypesAtRunTime(from, membersManager, members, to);
+ }*/
+ PyClassRefactoringUtil.insertPassIfNeeded(from);
+ }
+
+
+ /**
+ * Checks that all elements has allowed type for manager
+ *
+ * @param elements elements to check against manager
+ */
+ void checkElementTypes(@NotNull final Iterable<T> elements) {
+ for (final PyElement pyElement : elements) {
+ Preconditions.checkArgument(myExpectedClass.isAssignableFrom(pyElement.getClass()),
+ String.format("Manager %s expected %s but got %s", this, myExpectedClass, pyElement));
+ }
+ }
+
+ /**
+ * Finds member by predicate
+ *
+ * @param members where to find
+ * @param predicate what to find
+ * @return member or null if not found
+ */
+ @Nullable
+ public static PyMemberInfo<PyElement> findMember(@NotNull final Collection<PyMemberInfo<PyElement>> members,
+ @NotNull final Predicate<PyMemberInfo<PyElement>> predicate) {
+ for (final PyMemberInfo<PyElement> pyMemberInfo : members) {
+ if (predicate.apply(pyMemberInfo)) {
+ return pyMemberInfo;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Finds member of class by predicate
+ *
+ * @param predicate what to find
+ * @param pyClass class to find members
+ * @return member or null if not found
+ */
+ @Nullable
+ public static PyMemberInfo<PyElement> findMember(@NotNull final PyClass pyClass,
+ @NotNull final Predicate<PyMemberInfo<PyElement>> predicate) {
+ return findMember(getAllMembersCouldBeMoved(pyClass), predicate);
+ }
+
+ /**
+ * Finds member in class.
+ * @param pyClass class to find member in
+ * @param pyElement element to find
+ * @return member info with element
+ */
+ @NotNull
+ public static PyMemberInfo<PyElement> findMember(@NotNull final PyClass pyClass, @NotNull final PyElement pyElement) {
+ final PyMemberInfo<PyElement> result = findMember(pyClass, new FindByElement(pyElement));
+ if (result != null) {
+ return result;
+ }
+ throw new IllegalArgumentException(String.format("Element %s not found in class %s or can't be moved", pyElement, pyClass));
+ }
+
+ /**
+ * Get list of elements certain plugin could move out of the class
+ *
+ * @param pyClass class with members
+ * @return list of members
+ */
+ @NotNull
+ protected abstract List<PyElement> getMembersCouldBeMoved(@NotNull PyClass pyClass);
+
+
+ /**
+ * Filters out named elements (ones that subclasses {@link com.intellij.psi.PsiNamedElement}) and {@link com.jetbrains.python.psi.PyElement})
+ * that are null or has null name.
+ * You need it sometimes when code has errors (i.e. bad formatted code with annotation may treat annotation as method with null name.
+ * note: we should probably throw exceptions in such cases and display "refactoring not available" window in handler)
+ *
+ * @param elementsToFilter collection of elements to filter
+ * @param <T> element type
+ * @return collection of T with out of nulls and elemens whos {@link com.intellij.psi.PsiNamedElement#getName()} returns null
+ */
+ @NotNull
+ protected static <T extends PsiNamedElement & PyElement> Collection<T> filterNameless(@NotNull final Collection<T> elementsToFilter) {
+ return Collections2.filter(elementsToFilter, new NamelessFilter<T>());
+ }
+
+ /**
+ * Returns list of elements that may require reference storing aid from {@link com.jetbrains.python.refactoring.classes.PyClassRefactoringUtil#rememberNamedReferences(com.intellij.psi.PsiElement, String...)}
+ *
+ * @param elements members chosen by user. In most cases members their selves could be stored, but different managers may support other strategies
+ * @return elements to store
+ * @see #moveAllMembers(java.util.Collection, com.jetbrains.python.psi.PyClass, com.jetbrains.python.psi.PyClass...)
+ */
+ protected Collection<? extends PyElement> getElementsToStoreReferences(@NotNull final Collection<T> elements) {
+ return elements;
+ }
+
+ /**
+ * Moves element from one class to another. Returns members that may require reference restoring aid from
+ * ({@link com.jetbrains.python.refactoring.classes.PyClassRefactoringUtil#restoreNamedReferences(com.intellij.psi.PsiElement)})
+ *
+ * @see #getElementsToStoreReferences(java.util.Collection)
+ */
+ protected abstract Collection<PyElement> moveMembers(
+ @NotNull PyClass from,
+ @NotNull Collection<PyMemberInfo<T>> members,
+ @NotNull PyClass... to);
+
+
+ /**
+ * Creates {@link com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo} from {@link com.jetbrains.python.psi.PyElement}
+ * This process is plugin-specific and should be implemented in each plugin
+ *
+ * @param input element
+ * @return member info
+ */
+ @SuppressWarnings("NullableProblems") //IDEA-120100
+ @NotNull
+ @Override
+ public abstract PyMemberInfo<T> apply(@NotNull T input);
+
+ /**
+ * Deletes all elements
+ *
+ * @param pyElementsToDelete elements to delete
+ */
+ protected static void deleteElements(@NotNull final Collection<? extends PsiElement> pyElementsToDelete) {
+ for (final PsiElement element : pyElementsToDelete) {
+ element.delete();
+ }
+ }
+
+ /**
+ * Fetches elements from member info.
+ *
+ * @param memberInfos member info to fetch elements from
+ * @param <T> type of element
+ * @return list of elements
+ */
+ @NotNull
+ protected static <T extends PyElement> Collection<T> fetchElements(@NotNull final Collection<PyMemberInfo<T>> memberInfos) {
+ return Collections2.transform(memberInfos, new PyMemberExtractor<T>());
+ }
+
+ /**
+ * Checks if moving certain member to certain class may lead to conflict (actually that means
+ * that class already has this member)
+ *
+ * @param member member to check
+ * @param aClass class where this member wanna be moved
+ * @return true if conflict exists.
+ */
+ public abstract boolean hasConflict(@NotNull T member, @NotNull PyClass aClass);
+
+ /**
+ * Returns all elements this member depends on.
+ *
+ * @param classWhereMemberDeclared class where member declared
+ * @param member member itself
+ * @param destinationClass where this member would be moved (or null if new class is unknown)
+ * @return collection of elements this member depends on excluding those, would be available in destination class
+ */
+ @NotNull
+ public static Collection<? extends PyElement> getAllDependencies(
+ @NotNull final PyClass classWhereMemberDeclared,
+ @NotNull final PyElement member,
+ @Nullable final PyClass destinationClass) {
+ final PyMemberInfo<PyElement> memberInfo = findMember(classWhereMemberDeclared, member);
+
+
+ final Collection<? extends PyElement> elementsToCheckDependency =
+ memberInfo.getMembersManager().getElementsToStoreReferences(Collections.singleton(member));
+
+ final MultiMap<PyClass, PyElement> dependencies = new MultiMap<PyClass, PyElement>();
+
+ final Collection<PyElement> result = new HashSet<PyElement>();
+ for (final MembersManager<? extends PyElement> manager : MANAGERS) {
+ for (final PyElement elementToCheckDependency : elementsToCheckDependency) {
+ dependencies.putAllValues(manager.getDependencies(elementToCheckDependency));
+ }
+ }
+
+ if (destinationClass != null) {
+ final Iterator<PyClass> classesIterator = dependencies.keySet().iterator();
+ while (classesIterator.hasNext()) {
+ final PyClass memberClass = classesIterator.next();
+ if (memberClass.equals(destinationClass) ||
+ ArrayUtil.contains(memberClass, destinationClass.getSuperClasses())) { // IF still would be available
+ classesIterator.remove();
+ }
+ }
+ }
+
+ for (final MembersManager<? extends PyElement> manager : MANAGERS) {
+ result.addAll(manager.getDependencies(dependencies));
+ }
+ result.addAll(dependencies.values());
+ return result;
+ }
+
+ /**
+ * Fetch dependencies this element depends on.
+ * Manager should return them in format "class, where member declared" -- "member itself".
+ * For example: if parameter is function, and this function uses field "foo" declared in class "bar", then manager (responsible for fields)
+ * returns "bar" -] reference to "foo"
+ *
+ * @param member member to check dependencies for
+ * @return dependencies
+ */
+ @NotNull
+ protected abstract MultiMap<PyClass, PyElement> getDependencies(@NotNull PyElement member);
+
+ /**
+ * Get dependencies by members and classes they declared in (obtained from {@link #getDependencies(com.jetbrains.python.psi.PyElement)})
+ * For example manager, responsible for "extends SomeClass" members may return list of classes
+ *
+ * @param usedElements class-to-element dependencies
+ * @return dependencies
+ */
+ @NotNull
+ protected abstract Collection<PyElement> getDependencies(@NotNull MultiMap<PyClass, PyElement> usedElements);
+
+ private static class PyMemberExtractor<T extends PyElement> implements Function<PyMemberInfo<T>, T> {
+ @SuppressWarnings("NullableProblems") //IDEA-120100
+ @Override
+ public T apply(@NotNull final PyMemberInfo<T> input) {
+ return input.getMember();
+ }
+ }
+
+ private static class NamelessFilter<T extends PyElement & PsiNamedElement> extends NotNullPredicate<T> {
+ @Override
+ public boolean applyNotNull(@NotNull final T input) {
+ return input.getName() != null;
+ }
+ }
+
+ private static class FindByElement extends NotNullPredicate<PyMemberInfo<PyElement>> {
+ private final PyElement myPyElement;
+
+ private FindByElement(final PyElement pyElement) {
+ myPyElement = pyElement;
+ }
+
+ @Override
+ public boolean applyNotNull(@NotNull final PyMemberInfo<PyElement> input) {
+ return input.getMember().equals(myPyElement);
+ }
+ }
+}
+
+
diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/MethodsManager.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/MethodsManager.java
new file mode 100644
index 0000000..7cba0a2
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/MethodsManager.java
@@ -0,0 +1,284 @@
+package com.jetbrains.python.refactoring.classes.membersManager;
+
+import com.google.common.collect.Collections2;
+import com.google.common.collect.Lists;
+import com.intellij.openapi.util.Pair;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiFile;
+import com.intellij.psi.PsiReference;
+import com.intellij.util.containers.MultiMap;
+import com.jetbrains.NotNullPredicate;
+import com.jetbrains.python.PyNames;
+import com.jetbrains.python.codeInsight.imports.AddImportHelper;
+import com.jetbrains.python.psi.*;
+import com.jetbrains.python.psi.impl.PyFunctionBuilder;
+import com.jetbrains.python.psi.types.PyType;
+import com.jetbrains.python.psi.types.TypeEvalContext;
+import com.jetbrains.python.refactoring.classes.PyClassRefactoringUtil;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.*;
+
+/**
+ * Plugin that moves class methods
+ *
+ * @author Ilya.Kazakevich
+ */
+class MethodsManager extends MembersManager<PyFunction> {
+ private static final String ABC_META_CLASS = "ABCMeta";
+
+ /**
+ * Some decorators should be copied with methods if method is marked abstract. Here is list.
+ */
+ private static final String[] DECORATORS_MAY_BE_COPIED_TO_ABSTRACT =
+ {PyNames.PROPERTY, PyNames.CLASSMETHOD, PyNames.STATICMETHOD};
+
+ public static final String ABC_META_PACKAGE = "abc";
+
+ MethodsManager() {
+ super(PyFunction.class);
+ }
+
+ @Override
+ public boolean hasConflict(@NotNull final PyFunction member, @NotNull final PyClass aClass) {
+ return NamePredicate.hasElementWithSameName(member, Arrays.asList(aClass.getMethods()));
+ }
+
+ @NotNull
+ @Override
+ protected Collection<PyElement> getDependencies(@NotNull final MultiMap<PyClass, PyElement> usedElements) {
+ return Collections.emptyList();
+ }
+
+ @NotNull
+ @Override
+ protected MultiMap<PyClass, PyElement> getDependencies(@NotNull final PyElement member) {
+ final MultiMap<PyClass, PyElement> result = new MultiMap<PyClass, PyElement>();
+ member.accept(new MyPyRecursiveElementVisitor(result));
+
+ return result;
+ }
+
+ @NotNull
+ @Override
+ protected List<PyElement> getMembersCouldBeMoved(@NotNull final PyClass pyClass) {
+ return Lists.<PyElement>newArrayList(filterNameless(Arrays.asList(pyClass.getMethods())));
+ }
+
+ @Override
+ protected Collection<PyElement> moveMembers(@NotNull final PyClass from,
+ @NotNull final Collection<PyMemberInfo<PyFunction>> members,
+ @NotNull final PyClass... to) {
+ final Collection<PyFunction> methodsToMove = fetchElements(Collections2.filter(members, new AbstractFilter(false)));
+ final Collection<PyFunction> methodsToAbstract = fetchElements(Collections2.filter(members, new AbstractFilter(true)));
+
+ makeMethodsAbstract(methodsToAbstract, to);
+ return moveMethods(from, methodsToMove, to);
+ }
+
+ /**
+ * Creates abstract version of each method in each class (does not touch method itself as opposite to {@link #moveMethods(com.jetbrains.python.psi.PyClass, java.util.Collection, com.jetbrains.python.psi.PyClass...)})
+ *
+ * @param currentFunctions functions to make them abstract
+ * @param to classes where abstract method should be created
+ */
+ private static void makeMethodsAbstract(final Collection<PyFunction> currentFunctions, final PyClass... to) {
+ final Set<PsiFile> filesToCheckImport = new HashSet<PsiFile>();
+ final Set<PyClass> classesToAddMetaAbc = new HashSet<PyClass>();
+
+ for (final PyFunction function : currentFunctions) {
+ for (final PyClass destClass : to) {
+ final PyFunctionBuilder functionBuilder = PyFunctionBuilder.copySignature(function, DECORATORS_MAY_BE_COPIED_TO_ABSTRACT);
+ functionBuilder.decorate(PyNames.ABSTRACTMETHOD);
+ final LanguageLevel level = LanguageLevel.forElement(destClass);
+ PyClassRefactoringUtil.addMethods(destClass, false, functionBuilder.buildFunction(destClass.getProject(), level));
+ classesToAddMetaAbc.add(destClass);
+ }
+ }
+
+ // Add ABCMeta to new classes if needed
+ for (final PyClass aClass : classesToAddMetaAbc) {
+ if (addMetaAbcIfNeeded(aClass)) {
+ filesToCheckImport.add(aClass.getContainingFile());
+ }
+ }
+
+ // Add imports for ABC if needed
+ for (final PsiFile file : filesToCheckImport) {
+ addImportFromAbc(file, PyNames.ABSTRACTMETHOD);
+ addImportFromAbc(file, ABC_META_CLASS);
+ PyClassRefactoringUtil.optimizeImports(file); //To remove redundant imports
+ }
+ }
+
+ /**
+ * Adds metaclass = ABCMeta for class if has no.
+ *
+ * @param aClass class where it should be added
+ * @return true if added. False if class already has metaclass so we did not touch it.
+ */
+ // TODO: Copy/Paste with PyClass.getMeta..
+ private static boolean addMetaAbcIfNeeded(@NotNull final PyClass aClass) {
+ final PsiFile file = aClass.getContainingFile();
+ final PyType type = aClass.getMetaClassType(TypeEvalContext.userInitiated(file));
+ if (type != null) {
+ return false; //User already has metaclass. He probably knows about metaclasses, so we should not add ABCMeta
+ }
+ final LanguageLevel languageLevel = LanguageLevel.forElement(aClass);
+ if (languageLevel.isPy3K()) { //TODO: Copy/paste, use strategy because we already has the same check in #couldBeAbstract
+ // Add (metaclass= for Py3K
+ PyClassRefactoringUtil
+ .addSuperClassExpressions(aClass.getProject(), aClass, null, Collections.singletonList(Pair.create(PyNames.METACLASS,
+ ABC_META_CLASS)));
+ }
+ else {
+ // Add __metaclass__ for Py2
+ PyClassRefactoringUtil.addClassAttributeIfNotExist(aClass, PyNames.DUNDER_METACLASS, ABC_META_CLASS);
+ }
+ return true;
+ }
+
+ /**
+ * Adds import from ABC module
+ *
+ * @param file where to add import
+ * @param nameToImport what to import
+ */
+ private static void addImportFromAbc(@NotNull final PsiFile file, @NotNull final String nameToImport) {
+ AddImportHelper.addImportFromStatement(file, ABC_META_PACKAGE, nameToImport, null,
+ AddImportHelper.ImportPriority.BUILTIN);
+ }
+
+ /**
+ * Moves methods (as opposite to {@link #makeMethodsAbstract(java.util.Collection, com.jetbrains.python.psi.PyClass...)})
+ *
+ * @param from source
+ * @param methodsToMove what to move
+ * @param to where
+ * @return newly added methods
+ */
+ private static List<PyElement> moveMethods(final PyClass from, final Collection<PyFunction> methodsToMove, final PyClass... to) {
+ final List<PyElement> result = new ArrayList<PyElement>();
+ for (final PyClass destClass : to) {
+ //We move copies here because there may be several destinations
+ final List<PyFunction> copies = new ArrayList<PyFunction>(methodsToMove.size());
+ for (final PyFunction element : methodsToMove) {
+ final PyFunction newMethod = (PyFunction)element.copy();
+ copies.add(newMethod);
+ }
+
+ result.addAll(PyClassRefactoringUtil.copyMethods(copies, destClass));
+ }
+ deleteElements(methodsToMove);
+
+ PyClassRefactoringUtil.insertPassIfNeeded(from);
+ return result;
+ }
+
+ @NotNull
+ @Override
+ public PyMemberInfo<PyFunction> apply(@NotNull final PyFunction pyFunction) {
+ final PyUtil.MethodFlags flags = PyUtil.MethodFlags.of(pyFunction);
+ assert flags != null : "No flags return while element is function " + pyFunction;
+ final boolean isStatic = flags.isStaticMethod() || flags.isClassMethod();
+ return new PyMemberInfo<PyFunction>(pyFunction, isStatic, buildDisplayMethodName(pyFunction), isOverrides(pyFunction), this,
+ couldBeAbstract(pyFunction));
+ }
+
+ /**
+ * @return if method could be made abstract? (that means "create abstract version if method in parent class")
+ */
+ private static boolean couldBeAbstract(@NotNull final PyFunction function) {
+ if (PyUtil.isInit(function)) {
+ return false; // Who wants to make __init__ abstract?!
+ }
+ final PyUtil.MethodFlags flags = PyUtil.MethodFlags.of(function);
+ assert flags != null : "Function should be called on method!";
+
+ final boolean py3K = LanguageLevel.forElement(function).isPy3K();
+
+ //TODO: use strategy because we already has the same check in #addMetaAbcIfNeeded
+ return flags.isInstanceMethod() || py3K; //Any method could be made abstract in py3
+ }
+
+
+ @Nullable
+ private static Boolean isOverrides(final PyFunction pyFunction) {
+ final PyClass clazz = PyUtil.getContainingClassOrSelf(pyFunction);
+ assert clazz != null : "Refactoring called on function, not method: " + pyFunction;
+ for (final PyClass parentClass : clazz.getSuperClasses()) {
+ final PyFunction parentMethod = parentClass.findMethodByName(pyFunction.getName(), true);
+ if (parentMethod != null) {
+ return true;
+ }
+ }
+ return null;
+ }
+
+ @NotNull
+ private static String buildDisplayMethodName(@NotNull final PyFunction pyFunction) {
+ final StringBuilder builder = new StringBuilder(pyFunction.getName());
+ builder.append('(');
+ final PyParameter[] arguments = pyFunction.getParameterList().getParameters();
+ for (final PyParameter parameter : arguments) {
+ builder.append(parameter.getName());
+ if (arguments.length > 1 && parameter != arguments[arguments.length - 1]) {
+ builder.append(", ");
+ }
+ }
+ builder.append(')');
+ return builder.toString();
+ }
+
+
+ /**
+ * Filters member infos to find if they should be abstracted
+ */
+ private static class AbstractFilter extends NotNullPredicate<PyMemberInfo<PyFunction>> {
+ private final boolean myAllowAbstractOnly;
+
+ /**
+ * @param allowAbstractOnly returns only methods to be abstracted. Returns only methods to be moved otherwise.
+ */
+ private AbstractFilter(final boolean allowAbstractOnly) {
+ myAllowAbstractOnly = allowAbstractOnly;
+ }
+
+ @Override
+ protected boolean applyNotNull(@NotNull final PyMemberInfo<PyFunction> input) {
+ return input.isToAbstract() == myAllowAbstractOnly;
+ }
+ }
+
+ private static class MyPyRecursiveElementVisitor extends PyRecursiveElementVisitor {
+ @NotNull
+ private final MultiMap<PyClass, PyElement> myResult;
+
+ private MyPyRecursiveElementVisitor(@NotNull final MultiMap<PyClass, PyElement> result) {
+ myResult = result;
+ }
+
+ @Override
+ public void visitPyCallExpression(final PyCallExpression node) {
+ // TODO: refactor, messy code
+ final PyExpression callee = node.getCallee();
+ if (callee != null) {
+ final PsiReference calleeRef = callee.getReference();
+ if (calleeRef != null) {
+ final PsiElement calleeDeclaration = calleeRef.resolve();
+ if (calleeDeclaration instanceof PyFunction) {
+ final PyFunction calleeFunction = (PyFunction)calleeDeclaration;
+ final PyClass clazz = calleeFunction.getContainingClass();
+ if (clazz != null) {
+ if (PyUtil.isInit(calleeFunction)) {
+ return; // Init call should not be marked as dependency
+ }
+ myResult.putValue(clazz, calleeFunction);
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/NamePredicate.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/NamePredicate.java
new file mode 100644
index 0000000..7a5ddc6
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/NamePredicate.java
@@ -0,0 +1,45 @@
+package com.jetbrains.python.refactoring.classes.membersManager;
+
+import com.google.common.base.Optional;
+import com.google.common.collect.Iterables;
+import com.intellij.navigation.NavigationItem;
+import com.jetbrains.NotNullPredicate;
+import com.jetbrains.python.psi.PyElement;
+import org.jetbrains.annotations.NotNull;
+
+
+/**
+ * Finds elements by name
+ *
+ * @author Ilya.Kazakevich
+ */
+class NamePredicate extends NotNullPredicate<PyElement> {
+ @NotNull
+ private final String myName;
+
+
+ NamePredicate(@NotNull final String name) {
+ myName = name;
+ }
+
+ @Override
+ protected boolean applyNotNull(@NotNull final PyElement input) {
+ return myName.equals(input.getName());
+ }
+
+ /**
+ * Checks if collection has {@link com.jetbrains.python.psi.PyElement} with name equals to name of provided element.
+ * If element has no name -- returns false any way.
+ * @param needle element to take name from
+ * @param stock collection elements to search between
+ * @return true if stock contains element with name equal to needle's name
+ */
+ static boolean hasElementWithSameName(@NotNull final NavigationItem needle, @NotNull final Iterable<? extends PyElement> stock) {
+ final String name = needle.getName();
+ if (name != null) {
+ final Optional<? extends PyElement> optional = Iterables.tryFind(stock, new NamePredicate(name));
+ return optional.isPresent();
+ }
+ return false;
+ }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/PyMemberInfo.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/PyMemberInfo.java
new file mode 100644
index 0000000..819ab90
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/PyMemberInfo.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2000-2013 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.refactoring.classes.membersManager;
+
+import com.intellij.refactoring.classMembers.MemberInfoBase;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyElement;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * @author Dennis.Ushakov
+ */
+public class PyMemberInfo<T extends PyElement> extends MemberInfoBase<T> {
+ @NotNull
+ private final MembersManager<T> myMembersManager;
+ private final boolean myCouldBeAbstract;
+
+ /**
+ * @param couldBeAbstract if element could be marked as abstract (like abstract method)
+ * @param member element itself
+ * @param isStatic is it static or not?
+ * @param displayName element display name
+ * @param overrides does it overrides something? TRUE if is overriden, FALSE if implemented, null if not implemented or overriden
+ * TODO: use primitive instead? "Implemeneted" has nothing to do with python duck-typing
+ * @param membersManager manager that knows how to handle this member
+ */
+ PyMemberInfo(@NotNull final T member,
+ final boolean isStatic,
+ @NotNull final String displayName,
+ @Nullable final Boolean overrides,
+ @NotNull final MembersManager<T> membersManager,
+ final boolean couldBeAbstract) {
+ super(member);
+ this.isStatic = isStatic;
+ this.displayName = displayName;
+ this.overrides = overrides;
+ myMembersManager = membersManager;
+ myCouldBeAbstract = couldBeAbstract;
+ }
+
+ @NotNull
+ MembersManager<T> getMembersManager() {
+ return myMembersManager;
+ }
+
+ public boolean isCouldBeAbstract() {
+ return myCouldBeAbstract;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof PyMemberInfo) {
+ return getMember().equals(((PyMemberInfo<?>)obj).getMember());
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return getMember().hashCode();
+ }
+
+ /**
+ * Checks if moving this member to some class may create conflict.
+ * @param destinationClass destination class to check
+ * @return true if conflict.
+ */
+ public boolean hasConflict(@NotNull final PyClass destinationClass) {
+ return myMembersManager.hasConflict(myMember, destinationClass);
+ }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/PyMembersRefactoringBaseProcessor.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/PyMembersRefactoringBaseProcessor.java
new file mode 100644
index 0000000..983deb6
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/PyMembersRefactoringBaseProcessor.java
@@ -0,0 +1,86 @@
+package com.jetbrains.python.refactoring.classes.membersManager;
+
+import com.intellij.openapi.project.Project;
+import com.intellij.psi.PsiElement;
+import com.intellij.refactoring.BaseRefactoringProcessor;
+import com.intellij.usageView.UsageInfo;
+import com.intellij.usageView.UsageViewDescriptor;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.refactoring.classes.PyClassRefactoringUtil;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Processor for member-based refactorings. It moves members from one place to another using {@link com.jetbrains.python.refactoring.classes.membersManager.MembersManager}.
+ * Inheritors only need to implement {@link com.intellij.usageView.UsageViewDescriptor} methods (while this interface is also implemented by this class)
+ *
+ * @author Ilya.Kazakevich
+ */
+public abstract class PyMembersRefactoringBaseProcessor extends BaseRefactoringProcessor implements UsageViewDescriptor {
+
+ @NotNull
+ protected final Collection<PyMemberInfo<PyElement>> myMembersToMove;
+ @NotNull
+ protected final PyClass myFrom;
+ @NotNull
+ private final PyClass[] myTo;
+
+ /**
+ * @param membersToMove what to move
+ * @param from source
+ * @param to where to move
+ */
+ protected PyMembersRefactoringBaseProcessor(
+ @NotNull final Project project,
+ @NotNull final Collection<PyMemberInfo<PyElement>> membersToMove,
+ @NotNull final PyClass from,
+ @NotNull final PyClass... to) {
+ super(project);
+ myFrom = from;
+ myMembersToMove = new ArrayList<PyMemberInfo<PyElement>>(membersToMove);
+ myTo = to.clone();
+ }
+
+ @NotNull
+ @Override
+ protected UsageViewDescriptor createUsageViewDescriptor(final UsageInfo[] usages) {
+ return this;
+ }
+
+ @NotNull
+ @Override
+ public PsiElement[] getElements() {
+ return myTo.clone();
+ }
+
+ /**
+ * @return destinations (so user would be able to choose if she wants to move member to certain place or not)
+ */
+ @NotNull
+ @Override
+ protected final PyUsageInfo[] findUsages() {
+ final List<PyUsageInfo> result = new ArrayList<PyUsageInfo>(myTo.length);
+ for (final PyClass pyDestinationClass : myTo) {
+ result.add(new PyUsageInfo(pyDestinationClass));
+ }
+ return result.toArray(new PyUsageInfo[result.size()]);
+ }
+
+ @Override
+ protected final void performRefactoring(final UsageInfo[] usages) {
+ final Collection<PyClass> destinations = new ArrayList<PyClass>(usages.length);
+ for (final UsageInfo usage : usages) {
+ if (!(usage instanceof PyUsageInfo)) {
+ throw new IllegalArgumentException("Only PyUsageInfo is accepted here");
+ }
+ //We collect destination info to pass it to members manager
+ destinations.add(((PyUsageInfo)usage).getTo());
+ }
+ MembersManager.moveAllMembers(myMembersToMove, myFrom, destinations.toArray(new PyClass[destinations.size()]));
+ PyClassRefactoringUtil.optimizeImports(myFrom.getContainingFile()); // To remove unneeded imports
+ }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/PyUsageInfo.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/PyUsageInfo.java
new file mode 100644
index 0000000..c8e1f1f
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/PyUsageInfo.java
@@ -0,0 +1,26 @@
+package com.jetbrains.python.refactoring.classes.membersManager;
+
+import com.intellij.usageView.UsageInfo;
+import com.jetbrains.python.psi.PyClass;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * TODO: Make it generic to allow to reuse in another projects?
+ * Usage info that displays destination (where should member be moved)
+ *
+ * @author Ilya.Kazakevich
+ */
+class PyUsageInfo extends UsageInfo {
+ @NotNull
+ private final PyClass myTo;
+
+ PyUsageInfo(@NotNull final PyClass to) {
+ super(to, true); //TODO: Make super generic and get rid of field?
+ myTo = to;
+ }
+
+ @NotNull
+ public PyClass getTo() {
+ return myTo;
+ }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/SuperClassesManager.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/SuperClassesManager.java
new file mode 100644
index 0000000..92ffe76
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/SuperClassesManager.java
@@ -0,0 +1,109 @@
+package com.jetbrains.python.refactoring.classes.membersManager;
+
+import com.google.common.collect.Collections2;
+import com.google.common.collect.Lists;
+import com.intellij.refactoring.RefactoringBundle;
+import com.intellij.util.containers.MultiMap;
+import com.jetbrains.NotNullPredicate;
+import com.jetbrains.python.PyNames;
+import com.jetbrains.python.psi.*;
+import com.jetbrains.python.refactoring.classes.PyClassRefactoringUtil;
+import com.jetbrains.python.refactoring.classes.ui.PyClassCellRenderer;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.*;
+
+/**
+ * Plugin that moves superclasses from one class to another
+ *
+ * @author Ilya.Kazakevich
+ */
+class SuperClassesManager extends MembersManager<PyClass> {
+
+ private static final NoFakeSuperClasses NO_FAKE_SUPER_CLASSES = new NoFakeSuperClasses();
+
+ SuperClassesManager() {
+ super(PyClass.class);
+ }
+
+
+ @NotNull
+ @Override
+ protected Collection<PyElement> getDependencies(@NotNull final MultiMap<PyClass, PyElement> usedElements) {
+ return Lists.<PyElement>newArrayList(usedElements.keySet());
+ }
+
+ @NotNull
+ protected MultiMap<PyClass, PyElement> getDependencies(@NotNull PyElement member) {
+ return MultiMap.emptyInstance();
+ }
+
+ @Override
+ public boolean hasConflict(@NotNull final PyClass member, @NotNull final PyClass aClass) {
+ final List<PyExpression> expressionList = getExpressionsBySuperClass(aClass, Collections.singleton(member));
+ return !expressionList.isEmpty();
+ }
+
+ @NotNull
+ @Override
+ protected List<PyElement> getMembersCouldBeMoved(@NotNull final PyClass pyClass) {
+ return Lists.<PyElement>newArrayList(Collections2.filter(Arrays.asList(pyClass.getSuperClasses()), NO_FAKE_SUPER_CLASSES));
+ }
+
+ @Override
+ protected Collection<PyElement> moveMembers(@NotNull final PyClass from,
+ @NotNull final Collection<PyMemberInfo<PyClass>> members,
+ @NotNull final PyClass... to) {
+ final Collection<PyClass> elements = fetchElements(members);
+ for (final PyClass destClass : to) {
+ PyClassRefactoringUtil.addSuperclasses(from.getProject(), destClass, elements.toArray(new PyClass[members.size()]));
+ }
+
+ final List<PyExpression> expressionsToDelete = getExpressionsBySuperClass(from, elements);
+ for (final PyExpression expressionToDelete : expressionsToDelete) {
+ expressionToDelete.delete();
+ }
+
+ return Collections.emptyList(); //Hack: we know that "superclass expression" can't have reference
+ }
+
+ /**
+ * Returns superclass expressions that are resolved to one or more classes from collection
+ * @param from class to get superclass expressions from
+ * @param classes classes to check superclasses against
+ * @return collection of expressions that are resolved to one or more class from classes param
+ */
+ @NotNull
+ private static List<PyExpression> getExpressionsBySuperClass(@NotNull final PyClass from, @NotNull final Collection<PyClass> classes) {
+ final List<PyExpression> expressionsToDelete = new ArrayList<PyExpression>(classes.size());
+
+ for (final PyExpression expression : from.getSuperClassExpressions()) {
+ // Remove all superclass expressions that point to class from memberinfo
+ if (!(expression instanceof PyQualifiedExpression)) {
+ continue;
+ }
+ final PyReferenceExpression reference = (PyReferenceExpression)expression;
+ for (final PyClass element : classes) {
+ if (reference.getReference().isReferenceTo(element)) {
+ expressionsToDelete.add(expression);
+ }
+ }
+ }
+ return expressionsToDelete;
+ }
+
+ @NotNull
+ @Override
+ public PyMemberInfo<PyClass> apply(@NotNull final PyClass input) {
+ final String name = RefactoringBundle.message("member.info.extends.0", PyClassCellRenderer.getClassText(input));
+ //TODO: Check for "overrides"
+ return new PyMemberInfo<PyClass>(input, false, name, false, this, false);
+ }
+
+ private static class NoFakeSuperClasses extends NotNullPredicate<PyClass> {
+ @Override
+ protected boolean applyNotNull(@NotNull final PyClass input) {
+ return !PyNames.FAKE_OLD_BASE.equals(input.getName());
+ }
+ }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/TypeSafeMovingStrategy.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/TypeSafeMovingStrategy.java
new file mode 100644
index 0000000..2cf9efd
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/TypeSafeMovingStrategy.java
@@ -0,0 +1,70 @@
+package com.jetbrains.python.refactoring.classes.membersManager;
+
+import com.jetbrains.python.PyNames;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.refactoring.classes.PyClassRefactoringUtil;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+/**
+ * Moves members checking types at runtime.
+ *
+ * @author Ilya.Kazakevich
+ */
+class TypeSafeMovingStrategy<T extends PyElement> {
+ @NotNull private final PyClass myFrom;
+ @NotNull private final MembersManager<T> myManager;
+ @NotNull private final Collection<PyMemberInfo<T>> myMemberInfoCollection;
+ @NotNull private final PyClass[] myTo;
+
+ /**
+ * Move members.
+ * @param from source
+ * @param manager manager to be used
+ * @param memberInfoCollection what to move
+ * @param to where
+ */
+ @SuppressWarnings({"unchecked", "rawtypes"}) //We check types at runtime
+ static void moveCheckingTypesAtRunTime(@NotNull final PyClass from,
+ @NotNull final MembersManager<?> manager,
+ @NotNull final Collection<PyMemberInfo<PyElement>> memberInfoCollection,
+ @NotNull final PyClass... to) {
+ manager.checkElementTypes((Collection)MembersManager.fetchElements(memberInfoCollection));
+ new TypeSafeMovingStrategy(from, manager, memberInfoCollection, to).moveTyped();
+ }
+
+ private TypeSafeMovingStrategy(@NotNull final PyClass from,
+ @NotNull final MembersManager<T> manager,
+ @NotNull final Collection<PyMemberInfo<T>> memberInfoCollection,
+ @NotNull final PyClass[] to) {
+ myFrom = from;
+ myManager = manager;
+ myMemberInfoCollection = new ArrayList<PyMemberInfo<T>>(memberInfoCollection);
+ myTo = to.clone();
+ }
+
+
+ /**
+ * While types are already checked at runtime, this method could move everything in type-safe manner.
+ */
+ private void moveTyped() {
+ final Collection<T> elementsCollection = MembersManager.fetchElements(myMemberInfoCollection);
+ final Collection<? extends PyElement> references = myManager.getElementsToStoreReferences(elementsCollection);
+
+ // Store references to add required imports
+ for (final PyElement element : references) {
+ PyClassRefactoringUtil.rememberNamedReferences(element, PyNames.CANONICAL_SELF); //"self" is not reference we need to move
+ }
+
+ // Move
+ final Collection<PyElement> newElements = myManager.moveMembers(myFrom, myMemberInfoCollection, myTo);
+
+ // Restore references to add appropriate imports
+ for (final PyElement element : newElements) {
+ PyClassRefactoringUtil.restoreNamedReferences(element);
+ }
+ }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/package-info.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/package-info.java
new file mode 100644
index 0000000..9fb380a
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/package-info.java
@@ -0,0 +1,12 @@
+/**
+ * Incapsulates knowledge about class members that could be moved to some other class.
+ * To use (get list of members to move or actually move them) use {@link com.jetbrains.python.refactoring.classes.membersManager.MembersManager#getAllMembersCouldBeMoved(com.jetbrains.python.psi.PyClass)}
+ * and {@link com.jetbrains.python.refactoring.classes.membersManager.MembersManager#moveAllMembers(java.util.Collection, com.jetbrains.python.psi.PyClass, com.jetbrains.python.psi.PyClass)}
+ *
+ * This class delegates its behaviour to its managers (some kind of plugins). There is one for each member type (one for method, one for field etc).
+ * You need to extend {@link com.jetbrains.python.refactoring.classes.membersManager.MembersManager} to add some. See its javadoc for more info.
+ *
+ *
+ * @author Ilya.Kazakevich
+ */
+package com.jetbrains.python.refactoring.classes.membersManager;
\ No newline at end of file
diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/BadDataException.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/BadDataException.java
new file mode 100644
index 0000000..684576d
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/BadDataException.java
@@ -0,0 +1,18 @@
+package com.jetbrains.python.refactoring.classes.membersManager.vp;
+
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * To be thrown when {@link com.jetbrains.python.refactoring.classes.membersManager.vp.MembersBasedViewSwingImpl} or its children
+ * assumes that data entered by user in {@link com.jetbrains.python.refactoring.classes.membersManager.vp.MembersBasedView} is invalid.
+ * See {@link MembersBasedPresenterImpl#validateView()} for info why exception user
+ * @author Ilya.Kazakevich
+ */
+public class BadDataException extends Exception {
+ /**
+ * @param message what exactly is wrong with data
+ */
+ public BadDataException(@NotNull final String message) {
+ super(message);
+ }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/MembersBasedPresenter.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/MembersBasedPresenter.java
new file mode 100644
index 0000000..f57f280
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/MembersBasedPresenter.java
@@ -0,0 +1,21 @@
+package com.jetbrains.python.refactoring.classes.membersManager.vp;
+
+import com.jetbrains.python.vp.Presenter;
+
+/**
+ * Presenter for dialogs that display members
+ *
+ * @author Ilya.Kazakevich
+ */
+public interface MembersBasedPresenter extends Presenter {
+ /**
+ * User clicked on "ok" button
+ */
+ void okClicked();
+
+ /**
+ * @return true if dialog button "preview" should be displayed.
+ * Preview uses {@link com.jetbrains.python.refactoring.classes.membersManager.PyMembersRefactoringBaseProcessor}
+ */
+ boolean showPreview();
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/MembersBasedPresenterImpl.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/MembersBasedPresenterImpl.java
new file mode 100644
index 0000000..57f437f
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/MembersBasedPresenterImpl.java
@@ -0,0 +1,124 @@
+package com.jetbrains.python.refactoring.classes.membersManager.vp;
+
+import com.intellij.refactoring.RefactoringBundle;
+import com.intellij.refactoring.classMembers.MemberInfoModel;
+import com.intellij.util.containers.MultiMap;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.refactoring.classes.PyMemberInfoStorage;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+/**
+ * All presenters that use members inherits this class.
+ * <strong>Warning</strong>: Do not inherit it directly.
+ * Check {@link com.jetbrains.python.refactoring.classes.membersManager.vp.MembersBasedPresenterNoPreviewImpl}
+ * or {@link com.jetbrains.python.refactoring.classes.membersManager.vp.MembersBasedPresenterWithPreviewImpl} instead
+ *
+ * @param <T> view for that presenter
+ * @param <M> Type of model {@link #myModel}
+ * @author Ilya.Kazakevich
+ */
+abstract class MembersBasedPresenterImpl<T extends MembersBasedView<?>,
+ M extends MemberInfoModel<PyElement, PyMemberInfo<PyElement>>> implements MembersBasedPresenter {
+ @NotNull
+ protected final T myView;
+ @NotNull
+ protected final PyClass myClassUnderRefactoring;
+ @NotNull
+ protected final PyMemberInfoStorage myStorage;
+ /**
+ * Member model
+ */
+ @NotNull
+ protected final M myModel;
+
+ /**
+ * @param view View for presenter
+ * @param classUnderRefactoring class to be refactored
+ * @param infoStorage info storage
+ * @param model Member model (to be used for dependencies checking)
+ */
+ MembersBasedPresenterImpl(@NotNull final T view,
+ @NotNull final PyClass classUnderRefactoring,
+ @NotNull final PyMemberInfoStorage infoStorage,
+ @NotNull final M model) {
+ myView = view;
+ myClassUnderRefactoring = classUnderRefactoring;
+ myStorage = infoStorage;
+ myModel = model;
+ }
+
+ //TODO: Mark Async ?
+ @Override
+ public void okClicked() {
+ final MultiMap<PyClass, PyMemberInfo<?>> conflicts = getConflicts();
+ final Collection<PyMemberInfo<?>> dependencyConflicts = new ArrayList<PyMemberInfo<?>>();
+ for (final PyMemberInfo<PyElement> memberInfo : myStorage.getClassMemberInfos(myClassUnderRefactoring)) {
+ if (myModel.checkForProblems(memberInfo) != MemberInfoModel.OK) {
+ dependencyConflicts.add(memberInfo);
+ }
+ }
+
+ if ((conflicts.isEmpty() && dependencyConflicts.isEmpty()) || myView.showConflictsDialog(conflicts, dependencyConflicts)) {
+ try {
+ validateView();
+ doRefactor();
+ }
+ catch (final BadDataException e) {
+ myView.showError(e.getMessage()); //Show error message if presenter says view in invalid
+ }
+ }
+ }
+
+ /**
+ * Validates view (used by presenter to check if view is valid).
+ * When overwrite, <strong>always</strong> call "super" <strong>first</strong>!
+ * Throw {@link com.jetbrains.python.refactoring.classes.membersManager.vp.BadDataException} in case of error.
+ * Do nothing, otherwise.
+ * Method is designed to be overwritten and exception is used to simplify this process: children do not need parent's result.
+ * They just call super.
+ *
+ * @throws BadDataException
+ */
+ protected void validateView() throws BadDataException {
+ if (myView.getSelectedMemberInfos().isEmpty()) {
+ throw new BadDataException(RefactoringBundle.message("no.members.selected"));
+ }
+ }
+
+ /**
+ * Does refactoring itself
+ */
+ abstract void doRefactor();
+
+ /**
+ * Checks if one of destination classes already has members that should be moved, so conflict would take place.
+ *
+ * @return map of conflicts (if any)
+ * @see #getDestClassesToCheckConflicts()
+ */
+ @NotNull
+ protected final MultiMap<PyClass, PyMemberInfo<?>> getConflicts() {
+ final MultiMap<PyClass, PyMemberInfo<?>> result = new MultiMap<PyClass, PyMemberInfo<?>>();
+ final Collection<PyMemberInfo<PyElement>> memberInfos = myView.getSelectedMemberInfos();
+ for (final PyClass destinationClass : getDestClassesToCheckConflicts()) {
+ for (final PyMemberInfo<PyElement> pyMemberInfo : memberInfos) {
+ if (pyMemberInfo.hasConflict(destinationClass)) {
+ result.putValue(destinationClass, pyMemberInfo);
+ }
+ }
+ }
+ return result;
+ }
+
+ /**
+ * @return classes where this refactoring will move members. To be used to check for conflicts (if one of target classes already has members)
+ * @see #getConflicts()
+ */
+ @NotNull
+ protected abstract Iterable<? extends PyClass> getDestClassesToCheckConflicts();
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/MembersBasedPresenterNoPreviewImpl.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/MembersBasedPresenterNoPreviewImpl.java
new file mode 100644
index 0000000..dfbe3da
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/MembersBasedPresenterNoPreviewImpl.java
@@ -0,0 +1,69 @@
+package com.jetbrains.python.refactoring.classes.membersManager.vp;
+
+import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.command.CommandProcessor;
+import com.intellij.refactoring.classMembers.MemberInfoModel;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.refactoring.classes.PyMemberInfoStorage;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * Presenter that has not preview. Children should implement {@link #refactorNoPreview()}.
+ * To "preview" button would be displayed
+ *
+ * @param <T> view for this presenter
+ * @param <M> Type of model
+ * @author Ilya.Kazakevich
+ */
+
+public abstract class MembersBasedPresenterNoPreviewImpl<T extends MembersBasedView<?>,
+ M extends MemberInfoModel<PyElement, PyMemberInfo<PyElement>>> extends MembersBasedPresenterImpl<T, M> {
+ /**
+ * @param view view for this presenter
+ * @param classUnderRefactoring class to refactor
+ * @param infoStorage info storage
+ * @param model Member model (to be used for dependencies checking)
+ */
+ protected MembersBasedPresenterNoPreviewImpl(@NotNull final T view,
+ @NotNull final PyClass classUnderRefactoring,
+ @NotNull final PyMemberInfoStorage infoStorage,
+ @NotNull final M model) {
+ super(view, classUnderRefactoring, infoStorage, model);
+ }
+
+ @Override
+ public boolean showPreview() {
+ return false;
+ }
+
+ @Override
+ void doRefactor() {
+ CommandProcessor.getInstance().executeCommand(myClassUnderRefactoring.getProject(), new Runnable() {
+ @Override
+ public void run() {
+ ApplicationManager.getApplication().runWriteAction(new MyRunnableRefactoring());
+ }
+ }, getCommandName(), null);
+ myView.close();
+ }
+
+ /**
+ * @return Command name for this preview
+ */
+ @NotNull
+ protected abstract String getCommandName();
+
+ /**
+ * Do refactor with out of preview. Implement this method to do refactoring.
+ */
+ protected abstract void refactorNoPreview();
+
+ private class MyRunnableRefactoring implements Runnable {
+ @Override
+ public void run() {
+ refactorNoPreview();
+ }
+ }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/MembersBasedPresenterWithPreviewImpl.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/MembersBasedPresenterWithPreviewImpl.java
new file mode 100644
index 0000000..8950a14
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/MembersBasedPresenterWithPreviewImpl.java
@@ -0,0 +1,52 @@
+package com.jetbrains.python.refactoring.classes.membersManager.vp;
+
+import com.intellij.refactoring.BaseRefactoringProcessor;
+import com.intellij.refactoring.classMembers.MemberInfoModel;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.refactoring.classes.PyMemberInfoStorage;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * Does refactoring with preview (based on {@link com.intellij.refactoring.BaseRefactoringProcessor}).
+ * Child must implement {@link #createProcessor()} and return appropriate processor.
+ * "Preview" button would be displayed.
+ *
+ * @param <T> view for this presenter
+ * @param <M> Type of model
+ * @author Ilya.Kazakevich
+ */
+public abstract class MembersBasedPresenterWithPreviewImpl<T extends MembersBasedView<?>,
+ M extends MemberInfoModel<PyElement, PyMemberInfo<PyElement>>> extends MembersBasedPresenterImpl<T, M> {
+
+
+ /**
+ * @param view view for this presenter
+ * @param classUnderRefactoring class to refactor
+ * @param infoStorage info storage
+ * @param model Member model (to be used for dependencies checking)
+ */
+ protected MembersBasedPresenterWithPreviewImpl(@NotNull final T view,
+ @NotNull final PyClass classUnderRefactoring,
+ @NotNull final PyMemberInfoStorage infoStorage,
+ @NotNull final M model) {
+ super(view, classUnderRefactoring, infoStorage, model);
+ }
+
+ @Override
+ public boolean showPreview() {
+ return true;
+ }
+
+ @Override
+ protected void doRefactor() {
+ myView.invokeRefactoring(createProcessor());
+ }
+
+ /**
+ * @return processor for refactoring
+ */
+ @NotNull
+ public abstract BaseRefactoringProcessor createProcessor();
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/MembersBasedView.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/MembersBasedView.java
new file mode 100644
index 0000000..01a7eca
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/MembersBasedView.java
@@ -0,0 +1,75 @@
+package com.jetbrains.python.refactoring.classes.membersManager.vp;
+
+import com.intellij.refactoring.BaseRefactoringProcessor;
+import com.intellij.util.containers.MultiMap;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Collection;
+
+/**
+ * View to display dialog with members.
+ * First, configure it with {@link #configure(MembersViewInitializationInfo)}.
+ * Then, display with {@link #initAndShow()}
+ *
+ * @param <C> initialization info for this view. See {@link com.jetbrains.python.refactoring.classes.membersManager.vp.MembersViewInitializationInfo}
+ * for more info
+ * @author Ilya.Kazakevich
+ */
+public interface MembersBasedView<C extends MembersViewInitializationInfo> {
+ /**
+ * Display conflict dialogs.
+ *
+ * @param duplicatesConflict duplicates conflicts : that means destination class has the same member.
+ * If member "foo" already exists in class "bar": pass [bar] -] [foo].
+ * @param dependenciesConflicts dependency conflict: list of elements used by member under refactoring and would not be available
+ * at new destination. If user wants to move method, that uses field "bar" which would not be available at new class,
+ * pass [bar] field
+ * @return true if user's choice is "continue". False if "cancel"
+ */
+ boolean showConflictsDialog(
+ @NotNull MultiMap<PyClass, PyMemberInfo<?>> duplicatesConflict,
+ @NotNull Collection<PyMemberInfo<?>> dependenciesConflicts);
+
+ /**
+ * Displays error message
+ *
+ * @param message message to display
+ */
+ void showError(@NotNull String message);
+
+ /**
+ * Configures view and <strong>must</strong> be called once, before {@link #initAndShow()}
+ * It accepts configuration info class
+ * Children may rewrite method to do additional configuration, but they should <strong>always</strong> call "super" first!
+ *
+ * @param configInfo configuration info
+ */
+ void configure(@NotNull C configInfo);
+
+ /**
+ * @return collection of member infos user selected
+ */
+ @NotNull
+ Collection<PyMemberInfo<PyElement>> getSelectedMemberInfos();
+
+ /**
+ * Runs refactoring based on {@link com.intellij.refactoring.BaseRefactoringProcessor}.
+ * It may display "preview" first.
+ *
+ * @param processor refactoring processor
+ */
+ void invokeRefactoring(@NotNull BaseRefactoringProcessor processor);
+
+ /**
+ * Displays dialog. Be sure to run {@link #configure(MembersViewInitializationInfo)} first
+ */
+ void initAndShow();
+
+ /**
+ * Closes dialog
+ */
+ void close();
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/MembersBasedViewSwingImpl.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/MembersBasedViewSwingImpl.java
new file mode 100644
index 0000000..a8df16e
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/MembersBasedViewSwingImpl.java
@@ -0,0 +1,143 @@
+package com.jetbrains.python.refactoring.classes.membersManager.vp;
+
+import com.google.common.base.Preconditions;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.ui.DialogWrapper;
+import com.intellij.openapi.ui.Messages;
+import com.intellij.openapi.util.Pair;
+import com.intellij.refactoring.BaseRefactoringProcessor;
+import com.intellij.refactoring.ui.RefactoringDialog;
+import com.intellij.util.containers.MultiMap;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.refactoring.classes.membersManager.MembersConflictDialog;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
+import com.jetbrains.python.refactoring.classes.ui.PyMemberSelectionPanel;
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import java.awt.*;
+import java.util.Collection;
+
+/**
+ * {@link com.jetbrains.python.refactoring.classes.membersManager.vp.MembersBasedView} implementation on swing.
+ * Consists of {@link #myTopPanel} and {@link #myCenterPanel}. Children must fill them in constructor.
+ * Presenter is stored in {@link #myPresenter}.
+ * Panel with members in {@link #myPyMemberSelectionPanel}
+ *
+ * @param <P> View presenter class
+ * @param <C> View configuration class
+ */
+public abstract class MembersBasedViewSwingImpl<P extends MembersBasedPresenter, C extends MembersViewInitializationInfo>
+ extends RefactoringDialog implements MembersBasedView<C> {
+
+ /**
+ * Panel to be displayed on the top
+ */
+ @NotNull
+ protected final JPanel myTopPanel;
+ /**
+ * Panel to be displayed at the center
+ */
+ @NotNull
+ protected final JComponent myCenterPanel;
+
+ /**
+ * Presenter
+ */
+ @NotNull
+ protected final P myPresenter;
+
+ /**
+ * Panel with members
+ */
+ @NotNull
+ protected final PyMemberSelectionPanel myPyMemberSelectionPanel;
+
+ private boolean myConfigured;
+
+
+ /**
+ *
+ * @param project project this view runs
+ * @param presenter view's presenter
+ * @param title window title
+ * @param supportAbstract supports "abstract" column?
+ */
+ protected MembersBasedViewSwingImpl(@NotNull final Project project, @NotNull final P presenter, @NotNull final String title,
+ final boolean supportAbstract) {
+ super(project, true);
+ myTopPanel = new JPanel(new BorderLayout());
+ myCenterPanel = new JPanel(new BorderLayout());
+ myPresenter = presenter;
+ myPyMemberSelectionPanel = new PyMemberSelectionPanel(title, supportAbstract);
+ //TODO: Take this from presenter to prevent inconsistence: now it is possible to create view that supports abstract backed by presenter that does not. And vice versa.
+ }
+
+
+ @Override
+ public boolean showConflictsDialog(@NotNull final MultiMap<PyClass, PyMemberInfo<?>> duplicatesConflict,
+ @NotNull final Collection<PyMemberInfo<?>> dependenciesConflicts) {
+ Preconditions.checkArgument(!(duplicatesConflict.isEmpty() && dependenciesConflicts.isEmpty()), "Can't show dialog for empty conflicts");
+ final DialogWrapper conflictsDialog = new MembersConflictDialog(myProject, duplicatesConflict, dependenciesConflicts);
+ conflictsDialog.show();
+ return conflictsDialog.isOK();
+ }
+
+ @Override
+ public void showError(@NotNull final String message) {
+ Messages.showErrorDialog(getContentPane(), message);
+ }
+
+ @Override
+ protected boolean hasPreviewButton() {
+ return myPresenter.showPreview();
+ }
+
+ @Override
+ protected void doAction() {
+ myPresenter.okClicked();
+ }
+
+ @NotNull
+ @Override
+ protected JComponent createNorthPanel() {
+ return myTopPanel;
+ }
+
+ @Override
+ public void close() {
+ close(OK_EXIT_CODE);
+ }
+
+ @Override
+ protected JComponent createCenterPanel() {
+ return myCenterPanel;
+ }
+
+ @NotNull
+ @Override
+ public Collection<PyMemberInfo<PyElement>> getSelectedMemberInfos() {
+ return myPyMemberSelectionPanel.getSelectedMemberInfos();
+ }
+
+ @Override
+ public void invokeRefactoring(@NotNull final BaseRefactoringProcessor processor) {
+ super.invokeRefactoring(processor);
+ }
+
+ @Override
+ public void configure(@NotNull final C configInfo) {
+ Preconditions.checkArgument(!myConfigured, "Already configured");
+ myConfigured = true;
+ myPyMemberSelectionPanel.init(configInfo.getMemberInfoModel(), configInfo.getMemberInfos());
+ }
+
+ @Override
+ public void initAndShow() {
+ Preconditions.checkArgument(myConfigured, "Not configured, run 'configure' first!");
+ init();
+ myPyMemberSelectionPanel.redraw(); // To display errors for checked member
+ show();
+ }
+}
\ No newline at end of file
diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/MembersViewInitializationInfo.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/MembersViewInitializationInfo.java
new file mode 100644
index 0000000..7803105
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/MembersViewInitializationInfo.java
@@ -0,0 +1,49 @@
+package com.jetbrains.python.refactoring.classes.membersManager.vp;
+
+import com.intellij.refactoring.classMembers.MemberInfoModel;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+
+/**
+ * Configuration for {@link com.jetbrains.python.refactoring.classes.membersManager.vp.MembersBasedView}
+ *
+ * @author Ilya.Kazakevich
+ */
+public class MembersViewInitializationInfo {
+
+ @NotNull
+ private final MemberInfoModel<PyElement, PyMemberInfo<PyElement>> myMemberInfoModel;
+ @NotNull
+ private final Collection<PyMemberInfo<PyElement>> myMemberInfos;
+
+ /**
+ * @param memberInfoModel model to be used in members panel
+ * @param memberInfos members to displau
+ */
+ public MembersViewInitializationInfo(@NotNull final MemberInfoModel<PyElement, PyMemberInfo<PyElement>> memberInfoModel,
+ @NotNull final Collection<PyMemberInfo<PyElement>> memberInfos) {
+ myMemberInfos = new ArrayList<PyMemberInfo<PyElement>>(memberInfos);
+ myMemberInfoModel = memberInfoModel;
+ }
+
+ /**
+ * @return model to be used in members panel
+ */
+ @NotNull
+ public MemberInfoModel<PyElement, PyMemberInfo<PyElement>> getMemberInfoModel() {
+ return myMemberInfoModel;
+ }
+
+ /**
+ * @return members to display
+ */
+ @NotNull
+ public Collection<PyMemberInfo<PyElement>> getMemberInfos() {
+ return Collections.unmodifiableCollection(myMemberInfos);
+ }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/package-info.java b/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/package-info.java
new file mode 100644
index 0000000..f714797
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/membersManager/vp/package-info.java
@@ -0,0 +1,6 @@
+/**
+ * MVP ({@link com.jetbrains.python.vp}) implementation for refactorings that use members ({@link com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo})
+ * and package {@link com.jetbrains.python.refactoring.classes.membersManager}
+ * @author Ilya.Kazakevich
+ */
+package com.jetbrains.python.refactoring.classes.membersManager.vp;
\ No newline at end of file
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pullUp/PullUpConflictsUtil.java b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PullUpConflictsUtil.java
deleted file mode 100644
index ee659c1..0000000
--- a/python/src/com/jetbrains/python/refactoring/classes/pullUp/PullUpConflictsUtil.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright 2000-2013 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.jetbrains.python.refactoring.classes.pullUp;
-
-import com.intellij.psi.PsiElement;
-import com.intellij.refactoring.RefactoringBundle;
-import com.intellij.refactoring.util.RefactoringUIUtil;
-import com.intellij.util.containers.MultiMap;
-import com.jetbrains.python.psi.PyClass;
-import com.jetbrains.python.psi.PyFunction;
-import com.jetbrains.python.refactoring.classes.PyMemberInfo;
-
-import java.util.Collection;
-
-/**
- * @author Dennis.Ushakov
- */
-public class PullUpConflictsUtil {
- private PullUpConflictsUtil() {
- }
-
- public static MultiMap<PsiElement, String> checkConflicts(final Collection<PyMemberInfo> infos, final PyClass superClass) {
- final MultiMap<PsiElement, String> conflictsList = new MultiMap<PsiElement, String>();
- for (PyMemberInfo info : infos) {
- PsiElement member = info.getMember();
- boolean isConflict = false;
- if (member instanceof PyFunction) {
- final String name = ((PyFunction)member).getName();
- if (name == null) continue;
- final PyFunction superClassMethod = superClass.findMethodByName(name, false);
- isConflict = superClassMethod != null;
- } else if (member instanceof PyClass) {
- final PyClass clazz = (PyClass)member;
- for (PyClass aClass : superClass.getSuperClasses()) {
- if (aClass == clazz) {
- conflictsList.putValue(superClass,
- RefactoringUIUtil.getDescription(superClass, false) + " already extends " + RefactoringUIUtil.getDescription(clazz, false));
- }
- }
- }
-
- if (isConflict) {
- final String message = RefactoringBundle.message("0.already.contains.a.1",
- RefactoringUIUtil.getDescription(superClass, false),
- RefactoringUIUtil.getDescription(member, false));
- conflictsList.putValue(superClass, message);
- }
- }
-
- return conflictsList;
- }
-}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyAncestorsUtils.java b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyAncestorsUtils.java
new file mode 100644
index 0000000..05c41c4
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyAncestorsUtils.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.refactoring.classes.pullUp;
+
+
+import com.google.common.collect.Collections2;
+import com.google.common.collect.Sets;
+import com.intellij.openapi.vfs.VfsUtilCore;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.jetbrains.NotNullPredicate;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyUtil;
+import com.jetbrains.python.psi.types.TypeEvalContext;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Ilya.Kazakevich
+ */
+class PyAncestorsUtils extends NotNullPredicate<PyClass> {
+ @NotNull
+ private final Set<VirtualFile> mySourceRoots;
+
+ /**
+ * Returns list of class parents that are under user control
+ *
+ * @param pyClass class to find parents for
+ * @return list of parents
+ */
+ @NotNull
+ static Collection<PyClass> getAncestorsUnderUserControl(@NotNull final PyClass pyClass) {
+ final List<PyClass> allAncestors = pyClass.getAncestorClasses(TypeEvalContext.userInitiated(pyClass.getContainingFile()));
+ return Collections2.filter(allAncestors, new PyAncestorsUtils(PyUtil.getSourceRoots(pyClass)));
+ }
+
+ private PyAncestorsUtils(@NotNull final Collection<VirtualFile> sourceRoots) {
+ mySourceRoots = Sets.newHashSet(sourceRoots);
+ }
+
+ @Override
+ public boolean applyNotNull(@NotNull final PyClass input) {
+ return VfsUtilCore.isUnder(input.getContainingFile().getVirtualFile(), mySourceRoots);
+ }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpDialog.java b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpDialog.java
deleted file mode 100644
index e9631a8..0000000
--- a/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpDialog.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Copyright 2000-2013 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.jetbrains.python.refactoring.classes.pullUp;
-
-import com.intellij.openapi.project.Project;
-import com.intellij.psi.PsiElement;
-import com.intellij.refactoring.RefactoringBundle;
-import com.intellij.refactoring.classMembers.AbstractUsesDependencyMemberInfoModel;
-import com.intellij.refactoring.classMembers.DependencyMemberInfoModel;
-import com.intellij.refactoring.ui.ConflictsDialog;
-import com.intellij.util.containers.MultiMap;
-import com.jetbrains.python.psi.PyClass;
-import com.jetbrains.python.psi.PyElement;
-import com.jetbrains.python.refactoring.classes.PyMemberInfo;
-import com.jetbrains.python.refactoring.classes.PyMemberInfoStorage;
-import com.jetbrains.python.refactoring.classes.ui.PyClassCellRenderer;
-import com.jetbrains.python.refactoring.classes.ui.UpDirectedMembersMovingDialog;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-import javax.swing.*;
-import java.awt.*;
-import java.awt.event.ItemEvent;
-import java.awt.event.ItemListener;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.TreeSet;
-
-/**
- * @author Dennis.Ushakov
- */
-public class PyPullUpDialog extends UpDirectedMembersMovingDialog {
- private JComboBox myClassCombo;
- private Collection<PyClass> mySuperClasses;
- private final PyMemberInfoStorage myStorage;
-
- public PyPullUpDialog(final Project project, final PyClass clazz, final Collection<PyClass> superClasses, final PyMemberInfoStorage storage) {
- super(project, clazz);
- myStorage = storage;
- mySuperClasses = new TreeSet<PyClass>(new Comparator<PyClass>() {
- public int compare(final PyClass o1, final PyClass o2) {
- final String name1 = PyClassCellRenderer.getClassText(o1);
- final String name2 = PyClassCellRenderer.getClassText(o2);
- return name1 == null ? -1 : name1.compareTo(name2);
- }
- });
- mySuperClasses = superClasses;
- myMemberInfos = myStorage.getClassMemberInfos(myClass);
-
- setTitle(PyPullUpHandler.REFACTORING_NAME);
-
- init();
- }
-
- protected DependencyMemberInfoModel<PyElement, PyMemberInfo> createMemberInfoModel() {
- return new MyMemberInfoModel(myClass);
- }
-
- protected String getHelpId() {
- return "python.reference.pullMembersUp";
- }
-
- protected JComponent createNorthPanel() {
- JPanel panel = new JPanel();
- panel.setLayout(new GridBagLayout());
- GridBagConstraints gbConstraints = new GridBagConstraints();
-
- gbConstraints.insets = new Insets(4, 8, 4, 8);
- gbConstraints.weighty = 1;
- gbConstraints.weightx = 1;
- gbConstraints.gridy = 0;
- gbConstraints.gridwidth = GridBagConstraints.REMAINDER;
- gbConstraints.fill = GridBagConstraints.BOTH;
- gbConstraints.anchor = GridBagConstraints.WEST;
- final JLabel classComboLabel = new JLabel();
- panel.add(classComboLabel, gbConstraints);
-
- myClassCombo = new JComboBox(mySuperClasses.toArray());
- myClassCombo.setRenderer(new PyClassCellRenderer());
- final String fqn = PyClassCellRenderer.getClassText(myClass);
- classComboLabel.setText(RefactoringBundle.message("pull.up.members.to", fqn));
- classComboLabel.setLabelFor(myClassCombo);
- myClassCombo.addItemListener(new ItemListener() {
- public void itemStateChanged(ItemEvent e) {
- if (e.getStateChange() == ItemEvent.SELECTED) {
- updateMembersInfo();
- if (myMemberSelectionPanel != null) {
- ((MyMemberInfoModel)myMemberInfoModel).setSuperClass(getSuperClass());
- myMemberSelectionPanel.getTable().setMemberInfos(myMemberInfos);
- myMemberSelectionPanel.getTable().fireExternalDataChange();
- }
- }
- }
- });
- gbConstraints.gridy++;
- panel.add(myClassCombo, gbConstraints);
- updateMembersInfo();
-
- return panel;
- }
-
- private void updateMembersInfo() {
- final PyClass targetClass = (PyClass)myClassCombo.getSelectedItem();
- myMemberInfos = myStorage.getIntermediateMemberInfosList(targetClass);
- }
-
- @Override
- public boolean checkConflicts() {
- final Collection<PyMemberInfo> infos = getSelectedMemberInfos();
- PyClass superClass = getSuperClass();
- if (!checkWritable(superClass, infos)) return false;
- MultiMap<PsiElement,String> conflicts = PullUpConflictsUtil.checkConflicts(infos, superClass);
- if (!conflicts.isEmpty()) {
- ConflictsDialog conflictsDialog = new ConflictsDialog(myClass.getProject(), conflicts);
- conflictsDialog.show();
- final boolean ok = conflictsDialog.isOK();
- if (!ok && conflictsDialog.isShowConflicts()) close(CANCEL_EXIT_CODE);
- return ok;
- }
- return true;
- }
-
- @Nullable
- public PyClass getSuperClass() {
- return myClassCombo != null ? (PyClass)myClassCombo.getSelectedItem() : null;
- }
-
- protected String getMembersBorderTitle() {
- return RefactoringBundle.message("members.to.be.pulled.up");
- }
-
- private class MyMemberInfoModel extends AbstractUsesDependencyMemberInfoModel<PyElement, PyClass, PyMemberInfo> {
- public MyMemberInfoModel(PyClass clazz) {
- super(clazz, getSuperClass(), false);
- }
-
-
- public boolean isMemberEnabled(PyMemberInfo member) {
- PyClass currentSuperClass = getSuperClass();
- return (currentSuperClass == null ||
- !myStorage.getDuplicatedMemberInfos(currentSuperClass).contains(member)) &&
- member.getMember() != currentSuperClass;
- }
-
- public boolean isAbstractEnabled(PyMemberInfo member) {
- return false;
- }
-
- public int checkForProblems(@NotNull PyMemberInfo member) {
- return member.isChecked() ? OK : super.checkForProblems(member);
- }
-
- @Override
- protected int doCheck(@NotNull PyMemberInfo memberInfo, int problem) {
- if (problem == ERROR && memberInfo.isStatic()) {
- return WARNING;
- }
- return problem;
- }
- }
-}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpHandler.java b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpHandler.java
index 0e95700..4fa0eac 100644
--- a/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpHandler.java
+++ b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpHandler.java
@@ -15,24 +15,15 @@
*/
package com.jetbrains.python.refactoring.classes.pullUp;
-import com.intellij.openapi.actionSystem.DataContext;
-import com.intellij.openapi.application.ex.ApplicationManagerEx;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
-import com.intellij.psi.PsiElement;
-import com.intellij.psi.PsiFile;
-import com.intellij.refactoring.RefactoringBundle;
-import com.intellij.refactoring.util.CommonRefactoringUtil;
-import com.intellij.util.PsiNavigateUtil;
import com.jetbrains.python.PyBundle;
import com.jetbrains.python.psi.PyClass;
-import com.jetbrains.python.psi.PyUtil;
-import com.jetbrains.python.refactoring.classes.PyClassMembersRefactoringSupport;
import com.jetbrains.python.refactoring.classes.PyClassRefactoringHandler;
-import com.jetbrains.python.refactoring.classes.PyMemberInfo;
import com.jetbrains.python.refactoring.classes.PyMemberInfoStorage;
-
-import java.util.Collection;
+import com.jetbrains.python.vp.Creator;
+import com.jetbrains.python.vp.ViewPresenterUtils;
+import org.jetbrains.annotations.NotNull;
/**
* @author: Dennis.Ushakov
@@ -41,34 +32,36 @@
public static final String REFACTORING_NAME = PyBundle.message("refactoring.pull.up.dialog.title");
@Override
- protected void doRefactor(Project project, PsiElement element1, PsiElement element2, Editor editor, PsiFile file, DataContext dataContext) {
- CommonRefactoringUtil.checkReadOnlyStatus(project, file);
+ protected void doRefactorImpl(@NotNull final Project project,
+ @NotNull final PyClass classUnderRefactoring,
+ @NotNull final PyMemberInfoStorage infoStorage,
+ @NotNull final Editor editor) {
+ //TODO: Move to vp (presenter) as well
+ final PyPullUpNothingToRefactorMessage nothingToRefactor = new PyPullUpNothingToRefactorMessage(project, editor, classUnderRefactoring);
- final PyClass clazz = PyUtil.getContainingClassOrSelf(element1);
- if (!inClass(clazz, project, editor, "refactoring.pull.up.error.cannot.perform.refactoring.not.inside.class")) return;
-
- final PyMemberInfoStorage infoStorage = PyClassMembersRefactoringSupport.getSelectedMemberInfos(clazz, element1, element2);
- final Collection<PyClass> classes = infoStorage.getClasses();
- if (classes.size() == 0) {
- assert clazz != null;
- CommonRefactoringUtil.showErrorHint(project, editor, PyBundle.message("refactoring.pull.up.error.cannot.perform.refactoring.no.base.classes", clazz.getName()),
- RefactoringBundle.message("pull.members.up.title"),
- "members.pull.up");
+ if (PyAncestorsUtils.getAncestorsUnderUserControl(classUnderRefactoring).isEmpty()) {
+ nothingToRefactor.showNothingToRefactor();
return;
}
- if (ApplicationManagerEx.getApplicationEx().isUnitTestMode()) return;
-
- final PyPullUpDialog dialog = new PyPullUpDialog(project, clazz, classes, infoStorage);
- dialog.show();
- if(dialog.isOK()) {
- pullUpWithHelper(clazz, dialog.getSelectedMemberInfos(), dialog.getSuperClass());
- }
+
+ ViewPresenterUtils
+ .linkViewWithPresenterAndLaunch(PyPullUpPresenter.class, PyPullUpView.class, new Creator<PyPullUpView, PyPullUpPresenter>() {
+ @NotNull
+ @Override
+ public PyPullUpPresenter createPresenter(@NotNull final PyPullUpView view) {
+ return new PyPullUpPresenterImpl(view, infoStorage, classUnderRefactoring);
+ }
+
+ @NotNull
+ @Override
+ public PyPullUpView createView(@NotNull final PyPullUpPresenter presenter) {
+ return new PyPullUpViewSwingImpl(project, presenter, classUnderRefactoring, nothingToRefactor);
+ }
+ }
+ );
}
- private static void pullUpWithHelper(PyClass clazz, Collection<PyMemberInfo> selectedMemberInfos, PyClass superClass) {
- PsiNavigateUtil.navigate(PyPullUpHelper.pullUp(clazz, selectedMemberInfos, superClass));
- }
@Override
protected String getTitle() {
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpHelper.java b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpHelper.java
deleted file mode 100644
index 0046ba2..0000000
--- a/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpHelper.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright 2000-2013 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.jetbrains.python.refactoring.classes.pullUp;
-
-import com.intellij.openapi.application.ApplicationManager;
-import com.intellij.openapi.command.CommandProcessor;
-import com.intellij.openapi.diagnostic.Logger;
-import com.intellij.psi.PsiNamedElement;
-import com.intellij.refactoring.RefactoringBundle;
-import com.jetbrains.python.psi.PyClass;
-import com.jetbrains.python.psi.PyElement;
-import com.jetbrains.python.psi.PyFunction;
-import com.jetbrains.python.refactoring.classes.PyClassRefactoringUtil;
-import com.jetbrains.python.refactoring.classes.PyMemberInfo;
-
-import java.util.*;
-
-/**
- * @author Dennis.Ushakov
- */
-public class PyPullUpHelper {
- private static final Logger LOG = Logger.getInstance(PyPullUpHelper.class.getName());
- private PyPullUpHelper() {}
-
- public static PyElement pullUp(final PyClass clazz, final Collection<PyMemberInfo> selectedMemberInfos, final PyClass superClass) {
- final Set<String> superClasses = new HashSet<String>();
- final Set<PsiNamedElement> extractedClasses = new HashSet<PsiNamedElement>();
- final List<PyFunction> methods = new ArrayList<PyFunction>();
- for (PyMemberInfo member : selectedMemberInfos) {
- final PyElement element = member.getMember();
- if (element instanceof PyFunction) methods.add((PyFunction)element);
- else if (element instanceof PyClass) {
- superClasses.add(element.getName());
- extractedClasses.add((PyClass)element);
- }
- else LOG.error("unmatched member class " + element.getClass());
- }
-
- CommandProcessor.getInstance().executeCommand(clazz.getProject(), new Runnable() {
- public void run() {
- ApplicationManager.getApplication().runWriteAction(new Runnable() {
- public void run() {
- // move methods
- PyClassRefactoringUtil.moveMethods(methods, superClass);
-
- // move superclasses declarations
- PyClassRefactoringUtil.moveSuperclasses(clazz, superClasses, superClass);
- PyClassRefactoringUtil.insertImport(superClass, extractedClasses);
- PyClassRefactoringUtil.insertPassIfNeeded(clazz);
- }
- });
- }
- }, RefactoringBundle.message("pull.members.up.title"), null);
-
- return superClass;
- }
-
-}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpInfoModel.java b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpInfoModel.java
new file mode 100644
index 0000000..c86907d
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpInfoModel.java
@@ -0,0 +1,52 @@
+package com.jetbrains.python.refactoring.classes.pullUp;
+
+import com.intellij.refactoring.classMembers.AbstractUsesDependencyMemberInfoModel;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * Dependencies model for PyPullUp refactoring
+* @author Ilya.Kazakevich
+*/
+class PyPullUpInfoModel extends AbstractUsesDependencyMemberInfoModel<PyElement, PyClass, PyMemberInfo<PyElement>> {
+ @NotNull
+ private final PyPullUpView myView;
+
+
+ PyPullUpInfoModel(@NotNull final PyClass classUnderRefactoring,
+ @NotNull final PyPullUpView view) {
+ super(classUnderRefactoring, null, false);
+ myView = view;
+ }
+
+ @Override
+ public boolean isAbstractEnabled(final PyMemberInfo<PyElement> member) {
+ return member.isCouldBeAbstract() && isMemberEnabled(member); // TODO: copy paste with other models, get rid of
+ }
+
+ @Override
+ public int checkForProblems(@NotNull final PyMemberInfo<PyElement> member) {
+ return member.isChecked() ? OK : super.checkForProblems(member);
+ }
+
+
+ @Override
+ protected int doCheck(@NotNull final PyMemberInfo<PyElement> memberInfo, final int problem) {
+ return problem;
+ }
+
+ @Override
+ public boolean isMemberEnabled(final PyMemberInfo<PyElement> member) {
+ final PyClass currentSuperClass = myView.getSelectedParent();
+ if (member.getMember() instanceof PyClass) {
+ //TODO: Delegate to Memebers Managers
+ final PyClass memberClass = (PyClass)member.getMember();
+ if (memberClass.isSubclass(currentSuperClass) || currentSuperClass.isSubclass(memberClass)) {
+ return false; //Class is already parent of superclass
+ }
+ }
+ return true;
+ }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpNothingToRefactorMessage.java b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpNothingToRefactorMessage.java
new file mode 100644
index 0000000..cbb599c
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpNothingToRefactorMessage.java
@@ -0,0 +1,48 @@
+package com.jetbrains.python.refactoring.classes.pullUp;
+
+import com.intellij.openapi.editor.Editor;
+import com.intellij.openapi.project.Project;
+import com.intellij.refactoring.RefactoringBundle;
+import com.intellij.refactoring.util.CommonRefactoringUtil;
+import com.jetbrains.python.PyBundle;
+import com.jetbrains.python.psi.PyClass;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * Displays "nothing to refactor" message
+ * @author Ilya.Kazakevich
+ */
+class PyPullUpNothingToRefactorMessage {
+
+ @NotNull
+ private final Project myProject;
+ @NotNull
+ private final Editor myEditor;
+ @NotNull
+ private final PyClass myClassUnderRefactoring;
+
+ /**
+ *
+ * @param project project to be used
+ * @param editor editor to be used
+ * @param classUnderRefactoring class user refactors
+ */
+ PyPullUpNothingToRefactorMessage(@NotNull final Project project,
+ @NotNull final Editor editor,
+ @NotNull final PyClass classUnderRefactoring) {
+ myProject = project;
+ myEditor = editor;
+ myClassUnderRefactoring = classUnderRefactoring;
+ }
+
+ /**
+ * Display message
+ */
+ void showNothingToRefactor() {
+ CommonRefactoringUtil.showErrorHint(myProject, myEditor, PyBundle
+ .message("refactoring.pull.up.error.cannot.perform.refactoring.no.base.classes",
+ myClassUnderRefactoring.getName()), RefactoringBundle.message("pull.members.up.title"),
+ "members.pull.up"
+ );
+ }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpPresenter.java b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpPresenter.java
new file mode 100644
index 0000000..1e97f77
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpPresenter.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.refactoring.classes.pullUp;
+
+
+import com.jetbrains.python.refactoring.classes.membersManager.vp.MembersBasedPresenter;
+
+/**
+ * Presenter for pull-up refactoring
+ *
+ * TODO: Interface left empty. Remove?
+ *
+ * @author Ilya.Kazakevich
+ */
+public interface PyPullUpPresenter extends MembersBasedPresenter {
+
+ /**
+ * To be called when user changed parent
+ */
+ void parentChanged();
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpPresenterImpl.java b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpPresenterImpl.java
new file mode 100644
index 0000000..b78433a
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpPresenterImpl.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.refactoring.classes.pullUp;
+
+import com.google.common.base.Preconditions;
+import com.intellij.openapi.project.Project;
+import com.intellij.refactoring.BaseRefactoringProcessor;
+import com.intellij.refactoring.util.CommonRefactoringUtil;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.psi.PyUtil;
+import com.jetbrains.python.refactoring.classes.PyMemberInfoStorage;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
+import com.jetbrains.python.refactoring.classes.membersManager.vp.MembersBasedPresenterWithPreviewImpl;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Collection;
+import java.util.Collections;
+
+/**
+ * Pull-up presenter implementation
+ *
+ * @author Ilya.Kazakevich
+ */
+class PyPullUpPresenterImpl extends MembersBasedPresenterWithPreviewImpl<PyPullUpView, PyPullUpInfoModel> implements PyPullUpPresenter {
+ @NotNull
+ private final Collection<PyClass> myParents;
+
+ /**
+ * @param view view
+ * @param infoStorage member storage
+ * @param clazz class to refactor
+ */
+ PyPullUpPresenterImpl(@NotNull final PyPullUpView view, @NotNull final PyMemberInfoStorage infoStorage, @NotNull final PyClass clazz) {
+ super(view, clazz, infoStorage, new PyPullUpInfoModel(clazz, view));
+ myParents = PyAncestorsUtils.getAncestorsUnderUserControl(clazz);
+ Preconditions.checkArgument(!myParents.isEmpty(), "No parents found");
+ }
+
+
+ @Override
+ public void launch() {
+ myView.configure(
+ new PyPullUpViewInitializationInfo(myModel, myStorage.getClassMemberInfos(myClassUnderRefactoring), myParents));
+
+ // If there is no enabled member then only error should be displayed
+
+ boolean atLeastOneEnabled = false;
+ for (final PyMemberInfo<PyElement> info : myStorage.getClassMemberInfos(myClassUnderRefactoring)) {
+ if (myModel.isMemberEnabled(info)) {
+ atLeastOneEnabled = true;
+ }
+ }
+
+
+ if (atLeastOneEnabled) {
+ myView.initAndShow();
+ } else {
+ myView.showNothingToRefactor();
+ }
+ }
+
+ @Override
+ public void okClicked() {
+ if (!isWritable()) {
+ return; //TODO: Strange behaviour
+ }
+ super.okClicked();
+ }
+
+ @NotNull
+ @Override
+ public BaseRefactoringProcessor createProcessor() {
+ return new PyPullUpProcessor(myClassUnderRefactoring, myView.getSelectedParent(), myView.getSelectedMemberInfos());
+ }
+
+ private boolean isWritable() {
+ final Collection<PyMemberInfo<PyElement>> infos = myView.getSelectedMemberInfos();
+ if (infos.isEmpty()) {
+ return true;
+ }
+ final PyElement element = infos.iterator().next().getMember();
+ final Project project = element.getProject();
+ if (!CommonRefactoringUtil.checkReadOnlyStatus(project, myView.getSelectedParent())) return false;
+ final PyClass container = PyUtil.getContainingClassOrSelf(element);
+ if (container == null || !CommonRefactoringUtil.checkReadOnlyStatus(project, container)) return false;
+ for (final PyMemberInfo<PyElement> info : infos) {
+ final PyElement member = info.getMember();
+ if (!CommonRefactoringUtil.checkReadOnlyStatus(project, member)) return false;
+ }
+ return true;
+ }
+
+ @Override
+ public void parentChanged() {
+ myModel.setSuperClass(myView.getSelectedParent());
+ }
+
+ @NotNull
+ @Override
+ protected Iterable<? extends PyClass> getDestClassesToCheckConflicts() {
+ return Collections.singletonList(myView.getSelectedParent());
+ }
+}
+
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpProcessor.java b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpProcessor.java
new file mode 100644
index 0000000..1eaa742
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpProcessor.java
@@ -0,0 +1,45 @@
+package com.jetbrains.python.refactoring.classes.pullUp;
+
+import com.jetbrains.python.PyBundle;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMembersRefactoringBaseProcessor;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Collection;
+
+/**
+ *
+ *
+ * @author Ilya.Kazakevich
+ */
+class PyPullUpProcessor extends PyMembersRefactoringBaseProcessor {
+
+ PyPullUpProcessor(@NotNull final PyClass from, @NotNull final PyClass to, @NotNull final Collection<PyMemberInfo<PyElement>> membersToMove) {
+ super(from.getProject(), membersToMove, from, to);
+ }
+
+
+ @Override
+ protected String getCommandName() {
+ return PyPullUpHandler.REFACTORING_NAME;
+ }
+
+ @Override
+ public String getProcessedElementsHeader() {
+ return PyBundle.message("refactoring.pull.up.dialog.move.members.to.class");
+ }
+
+ @Override
+ public String getCodeReferencesText(final int usagesCount, final int filesCount) {
+ return PyBundle.message("refactoring.pull.up.dialog.members.to.be.moved");
+ }
+
+ @Nullable
+ @Override
+ public String getCommentReferencesText(final int usagesCount, final int filesCount) {
+ return getCodeReferencesText(usagesCount, filesCount);
+ }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpView.java b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpView.java
new file mode 100644
index 0000000..0a770ea
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpView.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.refactoring.classes.pullUp;
+
+
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.refactoring.classes.membersManager.vp.MembersBasedView;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * @author Ilya.Kazakevich
+ * View for pull-up refactoring
+ */
+public interface PyPullUpView extends MembersBasedView<PyPullUpViewInitializationInfo> {
+
+ /**
+ * @return Parent that user selected
+ */
+ @NotNull
+ PyClass getSelectedParent();
+
+ /**
+ * Display "nothing to refactor" message.
+ */
+ void showNothingToRefactor();
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpViewInitializationInfo.java b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpViewInitializationInfo.java
new file mode 100644
index 0000000..c438e84
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpViewInitializationInfo.java
@@ -0,0 +1,38 @@
+package com.jetbrains.python.refactoring.classes.pullUp;
+
+import com.intellij.refactoring.classMembers.MemberInfoModel;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
+import com.jetbrains.python.refactoring.classes.membersManager.vp.MembersViewInitializationInfo;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Configuration for pull-up view
+ *
+ * @author Ilya.Kazakevich
+ */
+class PyPullUpViewInitializationInfo extends MembersViewInitializationInfo {
+ @NotNull
+ private final Collection<PyClass> myParents;
+
+ /**
+ * @param parents list of possible parents to display.
+ */
+ PyPullUpViewInitializationInfo(@NotNull final MemberInfoModel<PyElement, PyMemberInfo<PyElement>> memberInfoModel,
+ @NotNull final List<PyMemberInfo<PyElement>> memberInfos,
+ @NotNull final Collection<PyClass> parents) {
+ super(memberInfoModel, memberInfos);
+ myParents = new ArrayList<PyClass>(parents);
+ }
+
+ @NotNull
+ public Collection<PyClass> getParents() {
+ return Collections.unmodifiableCollection(myParents);
+ }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpViewSwingImpl.java b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpViewSwingImpl.java
new file mode 100644
index 0000000..3f0fa2a
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpViewSwingImpl.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.refactoring.classes.pullUp;
+
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.ui.ComboBox;
+import com.intellij.refactoring.RefactoringBundle;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.refactoring.classes.membersManager.vp.MembersBasedViewSwingImpl;
+import com.jetbrains.python.refactoring.classes.ui.PyClassCellRenderer;
+import org.jetbrains.annotations.NotNull;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+
+
+/**
+ * @author Ilya.Kazakevich
+ * Pull up view implementation
+ */
+class PyPullUpViewSwingImpl extends MembersBasedViewSwingImpl<PyPullUpPresenter, PyPullUpViewInitializationInfo> implements PyPullUpView,
+ ItemListener {
+ @NotNull
+ private final ComboBox myParentsCombo;
+ @NotNull
+ private final DefaultComboBoxModel myParentsComboBoxModel;
+ @NotNull
+ private final PyPullUpNothingToRefactorMessage myNothingToRefactorMessage;
+
+ /**
+ * @param project project where refactoring takes place
+ * @param presenter presenter for this view
+ * @param clazz class to refactor
+ * @param nothingToRefactorMessage class that displays message "nothing to refactor" when presenter calls {@link #showNothingToRefactor()}
+ */
+ PyPullUpViewSwingImpl(
+ @NotNull final Project project,
+ @NotNull final PyPullUpPresenter presenter,
+ @NotNull final PyClass clazz,
+ @NotNull final PyPullUpNothingToRefactorMessage nothingToRefactorMessage) {
+ super(project, presenter, RefactoringBundle.message("members.to.be.pulled.up"), true);
+ setTitle(PyPullUpHandler.REFACTORING_NAME);
+ myNothingToRefactorMessage = nothingToRefactorMessage;
+
+ myParentsComboBoxModel = new DefaultComboBoxModel();
+
+ myParentsCombo = new ComboBox(myParentsComboBoxModel);
+ myParentsCombo.setRenderer(new PyClassCellRenderer());
+
+ final JLabel mainLabel = new JLabel();
+ mainLabel.setText(RefactoringBundle.message("pull.up.members.to", PyClassCellRenderer.getClassText(clazz)));
+ mainLabel.setLabelFor(myParentsCombo);
+
+
+ myTopPanel.setLayout(new GridBagLayout());
+ final GridBagConstraints gbConstraints = new GridBagConstraints();
+
+ gbConstraints.insets = new Insets(4, 8, 4, 8);
+ gbConstraints.weighty = 1;
+ gbConstraints.weightx = 1;
+ gbConstraints.gridy = 0;
+ gbConstraints.gridwidth = GridBagConstraints.REMAINDER;
+ gbConstraints.fill = GridBagConstraints.BOTH;
+ gbConstraints.anchor = GridBagConstraints.WEST;
+ myTopPanel.add(mainLabel, gbConstraints);
+ myTopPanel.add(mainLabel, gbConstraints);
+ gbConstraints.gridy++;
+ myTopPanel.add(myParentsCombo, gbConstraints);
+
+ gbConstraints.gridy++;
+ myCenterPanel.add(myPyMemberSelectionPanel, BorderLayout.CENTER);
+ }
+
+ @Override
+ @NotNull
+ protected String getHelpId() {
+ return "python.reference.pullMembersUp";
+ }
+
+
+ @NotNull
+ @Override
+ public PyClass getSelectedParent() {
+ return (PyClass)myParentsComboBoxModel.getSelectedItem();
+ }
+
+ @Override
+ public void showNothingToRefactor() {
+ myNothingToRefactorMessage.showNothingToRefactor();
+ }
+
+ @Override
+ public void configure(@NotNull final PyPullUpViewInitializationInfo configInfo) {
+ super.configure(configInfo);
+ for (final PyClass parent : configInfo.getParents()) {
+ myParentsComboBoxModel.addElement(parent);
+ }
+ myPresenter.parentChanged();
+ myParentsCombo.addItemListener(this);
+ }
+
+ @Override
+ public void itemStateChanged(final ItemEvent e) {
+ if (e.getStateChange() == ItemEvent.SELECTED) {
+ myPyMemberSelectionPanel.redraw();
+ myPresenter.parentChanged();
+ }
+ }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pullUp/package-info.java b/python/src/com/jetbrains/python/refactoring/classes/pullUp/package-info.java
new file mode 100644
index 0000000..4623236
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/pullUp/package-info.java
@@ -0,0 +1,5 @@
+/**
+ * "Pull members up" refactoring
+ * @author Ilya.Kazakevich
+ */
+package com.jetbrains.python.refactoring.classes.pullUp;
\ No newline at end of file
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownConflicts.java b/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownConflicts.java
deleted file mode 100644
index c159b2f..0000000
--- a/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownConflicts.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright 2000-2013 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.jetbrains.python.refactoring.classes.pushDown;
-
-import com.intellij.openapi.diagnostic.Logger;
-import com.intellij.openapi.util.Comparing;
-import com.intellij.psi.PsiElement;
-import com.intellij.refactoring.RefactoringBundle;
-import com.intellij.refactoring.util.RefactoringUIUtil;
-import com.intellij.util.Function;
-import com.intellij.util.containers.ContainerUtil;
-import com.intellij.util.containers.MultiMap;
-import com.jetbrains.python.psi.*;
-import com.jetbrains.python.psi.resolve.PyResolveContext;
-import com.jetbrains.python.refactoring.classes.PyMemberInfo;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * @author Dennis.Ushakov
- */
-public class PyPushDownConflicts {
- private static final Logger LOG = Logger.getInstance(PyPushDownProcessor.class.getName());
-
- private final PyClass myClass;
- private final Collection<PyMemberInfo> myMembers;
- private final MultiMap<PsiElement, String> myConflicts;
-
- public PyPushDownConflicts(final PyClass clazz, final Collection<PyMemberInfo> members) {
- myClass = clazz;
- myMembers = members;
- myConflicts = new MultiMap<PsiElement, String>();
- }
-
- public MultiMap<PsiElement, String> getConflicts() {
- return myConflicts;
- }
-
- public void checkTargetClassConflicts(PyClass clazz) {
- checkPlacementConflicts(clazz);
- }
-
- private void checkPlacementConflicts(PyClass clazz) {
- for (PyMemberInfo member : myMembers) {
- final PyElement element = member.getMember();
- if (element instanceof PyFunction) {
- for (PyFunction function : clazz.getMethods()) {
- if (Comparing.strEqual(function.getName(), element.getName())) {
- final String message = RefactoringBundle.message("0.is.already.overridden.in.1",
- RefactoringUIUtil.getDescription(element, false),
- RefactoringUIUtil.getDescription(clazz, false));
- myConflicts.putValue(element, message);
- }
- }
- } else if (element instanceof PyClass) {
- } else LOG.error("unmatched member class " + clazz.getClass());
- }
- }
-
- public void checkSourceClassConflicts() {
- final List<PyElement> elements = ContainerUtil.map(myMembers, new Function<PyMemberInfo, PyElement>() {
- public PyElement fun(PyMemberInfo pyMemberInfo) {
- return pyMemberInfo.getMember();
- }
- });
- for (PyFunction pyFunction : myClass.getMethods()) {
- final UsedMembersCollector collector = new UsedMembersCollector(elements);
- pyFunction.accept(collector);
- final List<PyElement> conflicts = collector.getCollection();
-
- for (PyElement conflict : conflicts) {
- final String message = RefactoringBundle.message("0.uses.1.which.is.pushed.down",
- RefactoringUIUtil.getDescription(pyFunction, false),
- RefactoringUIUtil.getDescription(conflict, false));
- myConflicts.putValue(pyFunction, message);
- }
- }
- }
-
- private static class UsedMembersCollector extends PyRecursiveElementVisitor {
- private final List<PyElement> myCollection = new ArrayList<PyElement>();
- private final Collection<PyElement> myMovedMembers;
-
- private UsedMembersCollector(Collection<PyElement> movedMembers) {
- myMovedMembers = movedMembers;
- }
-
- @Override
- public void visitPyCallExpression(PyCallExpression node) {
- final Callable function = node.resolveCalleeFunction(PyResolveContext.noImplicits());
- if (function != null && myMovedMembers.contains(function)) {
- myCollection.add(function);
- }
- }
-
- public List<PyElement> getCollection() {
- return myCollection;
- }
- }
-}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownDialog.java b/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownDialog.java
deleted file mode 100644
index 2235c57..0000000
--- a/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownDialog.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright 2000-2013 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.jetbrains.python.refactoring.classes.pushDown;
-
-import com.intellij.openapi.project.Project;
-import com.intellij.refactoring.RefactoringBundle;
-import com.intellij.refactoring.classMembers.MemberInfoChange;
-import com.intellij.refactoring.classMembers.MemberInfoModel;
-import com.intellij.refactoring.classMembers.UsedByDependencyMemberInfoModel;
-import com.intellij.refactoring.ui.RefactoringDialog;
-import com.jetbrains.python.psi.PyClass;
-import com.jetbrains.python.psi.PyElement;
-import com.jetbrains.python.refactoring.classes.PyMemberInfo;
-import com.jetbrains.python.refactoring.classes.PyMemberInfoStorage;
-import com.jetbrains.python.refactoring.classes.ui.PyMemberSelectionPanel;
-
-import javax.swing.*;
-import java.awt.*;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * @author Dennis.Ushakov
- */
-public class PyPushDownDialog extends RefactoringDialog {
- private final List<PyMemberInfo> myMemberInfos;
- private final PyClass myClass;
- private MemberInfoModel<PyElement, PyMemberInfo> myMemberInfoModel;
-
- public PyPushDownDialog(Project project, PyClass aClass, PyMemberInfoStorage memberInfos) {
- super(project, true);
- myMemberInfos = memberInfos.getClassMemberInfos(aClass);
- myClass = aClass;
-
- setTitle(PyPushDownHandler.REFACTORING_NAME);
-
- init();
- }
-
- protected String getHelpId() {
- return "python.reference.pushMembersDown";
- }
-
- @Override
- protected void doAction() {
- if(!isOKActionEnabled()) return;
-
- final PyPushDownProcessor processor = new PyPushDownProcessor(getProject(), myClass, getSelectedMemberInfos());
- invokeRefactoring(processor);
- }
-
- protected JComponent createNorthPanel() {
- GridBagConstraints gbConstraints = new GridBagConstraints();
-
- JPanel panel = new JPanel(new GridBagLayout());
-
- gbConstraints.insets = new Insets(4, 0, 4, 8);
- gbConstraints.weighty = 1;
- gbConstraints.weightx = 1;
- gbConstraints.gridy = 0;
- gbConstraints.gridwidth = GridBagConstraints.REMAINDER;
- gbConstraints.fill = GridBagConstraints.BOTH;
- gbConstraints.anchor = GridBagConstraints.WEST;
- final String fqn = myClass.getName();
- panel.add(new JLabel(RefactoringBundle.message("push.members.from.0.down.label", fqn)), gbConstraints);
- return panel;
- }
-
- protected JComponent createCenterPanel() {
- JPanel panel = new JPanel(new BorderLayout());
- final PyMemberSelectionPanel memberSelectionPanel = new PyMemberSelectionPanel(
- RefactoringBundle.message("members.to.be.pushed.down.panel.title"),
- myMemberInfos, null);
- panel.add(memberSelectionPanel, BorderLayout.CENTER);
-
- myMemberInfoModel = new UsedByDependencyMemberInfoModel<PyElement, PyClass, PyMemberInfo>(myClass);
- myMemberInfoModel.memberInfoChanged(new MemberInfoChange<PyElement, PyMemberInfo>(myMemberInfos));
- memberSelectionPanel.getTable().setMemberInfoModel(myMemberInfoModel);
- memberSelectionPanel.getTable().addMemberInfoChangeListener(myMemberInfoModel);
-
- return panel;
- }
-
- public Collection<PyMemberInfo> getSelectedMemberInfos() {
- ArrayList<PyMemberInfo> list = new ArrayList<PyMemberInfo>(myMemberInfos.size());
- for (PyMemberInfo info : myMemberInfos) {
- if (info.isChecked() && myMemberInfoModel.isMemberEnabled(info)) {
- list.add(info);
- }
- }
- return list;
- }
-}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownHandler.java b/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownHandler.java
index 689d508..08fda71 100644
--- a/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownHandler.java
+++ b/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownHandler.java
@@ -15,21 +15,18 @@
*/
package com.jetbrains.python.refactoring.classes.pushDown;
-import com.intellij.openapi.actionSystem.DataContext;
-import com.intellij.openapi.application.ex.ApplicationManagerEx;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
-import com.intellij.psi.PsiElement;
-import com.intellij.psi.PsiFile;
import com.intellij.refactoring.RefactoringBundle;
import com.intellij.refactoring.util.CommonRefactoringUtil;
import com.intellij.util.Query;
import com.jetbrains.python.psi.PyClass;
-import com.jetbrains.python.psi.PyUtil;
import com.jetbrains.python.psi.search.PyClassInheritorsSearch;
-import com.jetbrains.python.refactoring.classes.PyClassMembersRefactoringSupport;
import com.jetbrains.python.refactoring.classes.PyClassRefactoringHandler;
import com.jetbrains.python.refactoring.classes.PyMemberInfoStorage;
+import com.jetbrains.python.vp.Creator;
+import com.jetbrains.python.vp.ViewPresenterUtils;
+import org.jetbrains.annotations.NotNull;
/**
* @author Dennis.Ushakov
@@ -38,26 +35,33 @@
public static final String REFACTORING_NAME = RefactoringBundle.message("push.members.down.title");
@Override
- protected void doRefactor(Project project, PsiElement element1, PsiElement element2, Editor editor, PsiFile file, DataContext dataContext) {
- CommonRefactoringUtil.checkReadOnlyStatus(project, file);
+ protected void doRefactorImpl(@NotNull final Project project,
+ @NotNull final PyClass classUnderRefactoring,
+ @NotNull final PyMemberInfoStorage infoStorage,
+ @NotNull Editor editor) {
- final PyClass clazz = PyUtil.getContainingClassOrSelf(element1);
- if (!inClass(clazz, project, editor, "refactoring.pull.up.error.cannot.perform.refactoring.not.inside.class")) return;
-
- final Query<PyClass> query = PyClassInheritorsSearch.search(clazz, false);
+ //TODO: Move to presenter?
+ final Query<PyClass> query = PyClassInheritorsSearch.search(classUnderRefactoring, false);
if (query.findFirst() == null) {
- assert clazz != null;
- final String message = RefactoringBundle.message("class.0.does.not.have.inheritors", clazz.getName());
+ final String message = RefactoringBundle.message("class.0.does.not.have.inheritors", classUnderRefactoring.getName());
CommonRefactoringUtil.showErrorHint(project, editor, message, getTitle(), getHelpId());
return;
}
- final PyMemberInfoStorage infoStorage = PyClassMembersRefactoringSupport.getSelectedMemberInfos(clazz, element1, element2);
+ ViewPresenterUtils
+ .linkViewWithPresenterAndLaunch(PyPushDownPresenter.class, PyPushDownView.class, new Creator<PyPushDownView, PyPushDownPresenter>() {
+ @NotNull
+ @Override
+ public PyPushDownPresenter createPresenter(@NotNull PyPushDownView view) {
+ return new PyPushDownPresenterImpl(project, view, classUnderRefactoring, infoStorage);
+ }
- if (ApplicationManagerEx.getApplicationEx().isUnitTestMode()) return;
-
- final PyPushDownDialog dialog = new PyPushDownDialog(project, clazz, infoStorage);
- dialog.show();
+ @NotNull
+ @Override
+ public PyPushDownView createView(@NotNull PyPushDownPresenter presenter) {
+ return new PyPushDownViewSwingImpl(classUnderRefactoring, project, presenter);
+ }
+ });
}
@Override
@@ -69,5 +73,4 @@
protected String getHelpId() {
return "members.push.down";
}
-
}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownPresenter.java b/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownPresenter.java
new file mode 100644
index 0000000..357aa66
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownPresenter.java
@@ -0,0 +1,9 @@
+package com.jetbrains.python.refactoring.classes.pushDown;
+
+import com.jetbrains.python.refactoring.classes.membersManager.vp.MembersBasedPresenter;
+
+/**
+ * @author Ilya.Kazakevich
+ */
+public interface PyPushDownPresenter extends MembersBasedPresenter {
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownPresenterImpl.java b/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownPresenterImpl.java
new file mode 100644
index 0000000..ce9306f
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownPresenterImpl.java
@@ -0,0 +1,49 @@
+package com.jetbrains.python.refactoring.classes.pushDown;
+
+import com.intellij.openapi.project.Project;
+import com.intellij.refactoring.BaseRefactoringProcessor;
+import com.intellij.refactoring.classMembers.MemberInfoModel;
+import com.intellij.refactoring.classMembers.UsedByDependencyMemberInfoModel;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.psi.PyUtil;
+import com.jetbrains.python.refactoring.classes.PyMemberInfoStorage;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
+import com.jetbrains.python.refactoring.classes.membersManager.vp.MembersBasedPresenterWithPreviewImpl;
+import com.jetbrains.python.refactoring.classes.membersManager.vp.MembersViewInitializationInfo;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * @author Ilya.Kazakevich
+ */
+public class PyPushDownPresenterImpl extends MembersBasedPresenterWithPreviewImpl<PyPushDownView, MemberInfoModel<PyElement, PyMemberInfo<PyElement>>> implements PyPushDownPresenter {
+ @NotNull
+ private final Project myProject;
+
+ public PyPushDownPresenterImpl(@NotNull final Project project,
+ @NotNull final PyPushDownView view,
+ @NotNull final PyClass classUnderRefactoring,
+ @NotNull final PyMemberInfoStorage infoStorage) {
+ super(view, classUnderRefactoring, infoStorage, new UsedByDependencyMemberInfoModel<PyElement, PyClass, PyMemberInfo<PyElement>>(classUnderRefactoring));
+ myProject = project;
+ }
+
+ @NotNull
+ @Override
+ public BaseRefactoringProcessor createProcessor() {
+ return new PyPushDownProcessor(myProject, myView.getSelectedMemberInfos(), myClassUnderRefactoring);
+ }
+
+ @NotNull
+ @Override
+ protected Iterable<? extends PyClass> getDestClassesToCheckConflicts() {
+ return PyPushDownProcessor.getInheritors(myClassUnderRefactoring);
+ }
+
+ @Override
+ public void launch() {
+ myView
+ .configure(new MembersViewInitializationInfo(myModel, PyUtil.filterOutObject(myStorage.getClassMemberInfos(myClassUnderRefactoring))));
+ myView.initAndShow();
+ }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownProcessor.java b/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownProcessor.java
index e7026aa..283dd72 100644
--- a/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownProcessor.java
+++ b/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownProcessor.java
@@ -15,120 +15,60 @@
*/
package com.jetbrains.python.refactoring.classes.pushDown;
-import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
-import com.intellij.openapi.ui.Messages;
-import com.intellij.openapi.util.Ref;
-import com.intellij.psi.PsiElement;
-import com.intellij.psi.PsiNamedElement;
-import com.intellij.refactoring.BaseRefactoringProcessor;
import com.intellij.refactoring.RefactoringBundle;
-import com.intellij.usageView.UsageInfo;
-import com.intellij.usageView.UsageViewDescriptor;
-import com.intellij.util.Function;
-import com.intellij.util.containers.ContainerUtil;
+import com.intellij.usageView.UsageViewBundle;
import com.jetbrains.python.psi.PyClass;
import com.jetbrains.python.psi.PyElement;
-import com.jetbrains.python.psi.PyExpression;
-import com.jetbrains.python.psi.PyFunction;
-import com.jetbrains.python.psi.impl.PyPsiUtils;
import com.jetbrains.python.psi.search.PyClassInheritorsSearch;
-import com.jetbrains.python.refactoring.classes.PyClassRefactoringUtil;
-import com.jetbrains.python.refactoring.classes.PyMemberInfo;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMembersRefactoringBaseProcessor;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
-import java.util.*;
+import java.util.Collection;
/**
* @author Dennis.Ushakov
*/
-public class PyPushDownProcessor extends BaseRefactoringProcessor {
- private static final Logger LOG = Logger.getInstance(PyPushDownProcessor.class.getName());
+public class PyPushDownProcessor extends PyMembersRefactoringBaseProcessor {
- private PyClass myClass;
- private final Collection<PyMemberInfo> mySelectedMemberInfos;
+ private static final String HEADER = RefactoringBundle.message("push.down.members.elements.header");
- public PyPushDownProcessor(Project project, PyClass clazz, Collection<PyMemberInfo> selectedMemberInfos) {
- super(project);
- myClass = clazz;
- mySelectedMemberInfos = selectedMemberInfos;
+ public PyPushDownProcessor(
+ @NotNull final Project project,
+ @NotNull final Collection<PyMemberInfo<PyElement>> membersToMove,
+ @NotNull final PyClass from) {
+ super(project, membersToMove, from, getChildren(from));
}
@NotNull
- @Override
- protected UsageViewDescriptor createUsageViewDescriptor(UsageInfo[] usages) {
- return new PyPushDownUsageViewDescriptor(myClass);
+ private static PyClass[] getChildren(@NotNull final PyClass from) {
+ final Collection<PyClass> all = getInheritors(from);
+ return all.toArray(new PyClass[all.size()]);
}
+ /**
+ * @param from class to check for inheritors
+ * @return inheritors of class
+ */
@NotNull
- @Override
- protected UsageInfo[] findUsages() {
- final Collection<PyClass> subClasses = PyClassInheritorsSearch.search(myClass, false).findAll();
- final UsageInfo[] result = new UsageInfo[subClasses.size()];
- ContainerUtil.map2Array(subClasses, result, new Function<PyClass, UsageInfo>() {
- public UsageInfo fun(PyClass pyClass) {
- return new UsageInfo(pyClass);
- }
- });
- return result;
+ static Collection<PyClass> getInheritors(@NotNull final PyClass from) {
+ return PyClassInheritorsSearch.search(from, false).findAll();
}
- @Override
- protected void refreshElements(PsiElement[] elements) {
- if (elements.length == 1 && elements[0] instanceof PyClass) {
- myClass = (PyClass)elements[0];
- }
+
+ public String getProcessedElementsHeader() {
+ return HEADER;
}
- @Override
- protected void performRefactoring(UsageInfo[] usages) {
- final Set<String> superClasses = new HashSet<String>();
- final Set<PsiNamedElement> extractedClasses = new HashSet<PsiNamedElement>();
- final List<PyFunction> methods = new ArrayList<PyFunction>();
- for (PyMemberInfo member : mySelectedMemberInfos) {
- final PyElement element = member.getMember();
- if (element instanceof PyFunction) methods.add((PyFunction)element);
- else if (element instanceof PyClass) {
- superClasses.add(element.getName());
- extractedClasses.add((PyClass)element);
- }
- else LOG.error("unmatched member class " + element.getClass());
- }
- final PyElement[] elements = methods.toArray(new PyElement[methods.size()]);
-
- final List<PyExpression> superClassesElements = PyClassRefactoringUtil.removeAndGetSuperClasses(myClass, superClasses);
-
- for (UsageInfo usage : usages) {
- final PyClass targetClass = (PyClass)usage.getElement();
- PyClassRefactoringUtil.addMethods(targetClass, elements, false);
- PyClassRefactoringUtil.addSuperclasses(myClass.getProject(), targetClass, superClassesElements, superClasses);
- PyClassRefactoringUtil.insertImport(targetClass, extractedClasses);
- }
-
- if (methods.size() != 0) {
- PyPsiUtils.removeElements(elements);
- PyClassRefactoringUtil.insertPassIfNeeded(myClass);
- }
+ public String getCodeReferencesText(int usagesCount, int filesCount) {
+ return RefactoringBundle.message("classes.to.push.down.members.to", UsageViewBundle.getReferencesString(usagesCount, filesCount));
}
- @Override
- protected boolean preprocessUsages(Ref<UsageInfo[]> ref) {
- final UsageInfo[] usages = ref.get();
- final PyPushDownConflicts conflicts = new PyPushDownConflicts(myClass, mySelectedMemberInfos);
- conflicts.checkSourceClassConflicts();
-
- if (usages.length == 0) {
- final String message = RefactoringBundle.message("class.0.does.not.have.inheritors", myClass.getName()) + "\nPushing members down will result in them being deleted";
- final int answer = Messages.showYesNoDialog(message, PyPushDownHandler.REFACTORING_NAME, Messages.getWarningIcon());
- if (answer != 0) {
- return false;
- }
- }
-
- for (UsageInfo usage : usages) {
- conflicts.checkTargetClassConflicts((PyClass)usage.getElement());
- }
- return showConflicts(conflicts.getConflicts(), usages);
+ @Nullable
+ public String getCommentReferencesText(int usagesCount, int filesCount) {
+ return null;
}
@Override
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownUsageViewDescriptor.java b/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownUsageViewDescriptor.java
deleted file mode 100644
index 97f858a..0000000
--- a/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownUsageViewDescriptor.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright 2000-2013 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.jetbrains.python.refactoring.classes.pushDown;
-
-import com.intellij.psi.PsiElement;
-import com.intellij.refactoring.RefactoringBundle;
-import com.intellij.usageView.UsageViewBundle;
-import com.intellij.usageView.UsageViewDescriptor;
-import com.jetbrains.python.psi.PyClass;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-/**
- * @author Dennis.Ushakov
- */
-public class PyPushDownUsageViewDescriptor implements UsageViewDescriptor {
- private final PyClass myClass;
- private static final String HEADER = RefactoringBundle.message("push.down.members.elements.header");
-
- public PyPushDownUsageViewDescriptor(final PyClass clazz) {
- myClass = clazz;
- }
-
- @NotNull
- public PsiElement[] getElements() {
- return new PsiElement[] {myClass};
- }
-
- public String getProcessedElementsHeader() {
- return HEADER;
- }
-
- public String getCodeReferencesText(int usagesCount, int filesCount) {
- return RefactoringBundle.message("classes.to.push.down.members.to", UsageViewBundle.getReferencesString(usagesCount, filesCount));
- }
-
- @Nullable
- public String getCommentReferencesText(int usagesCount, int filesCount) {
- return null;
- }
-}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownView.java b/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownView.java
new file mode 100644
index 0000000..5b1848e
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownView.java
@@ -0,0 +1,10 @@
+package com.jetbrains.python.refactoring.classes.pushDown;
+
+import com.jetbrains.python.refactoring.classes.membersManager.vp.MembersBasedView;
+import com.jetbrains.python.refactoring.classes.membersManager.vp.MembersViewInitializationInfo;
+
+/**
+ * @author Ilya.Kazakevich
+ */
+public interface PyPushDownView extends MembersBasedView<MembersViewInitializationInfo> {
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownViewSwingImpl.java b/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownViewSwingImpl.java
new file mode 100644
index 0000000..9fd0cb5
--- /dev/null
+++ b/python/src/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownViewSwingImpl.java
@@ -0,0 +1,26 @@
+package com.jetbrains.python.refactoring.classes.pushDown;
+
+import com.intellij.openapi.project.Project;
+import com.intellij.refactoring.RefactoringBundle;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.refactoring.classes.membersManager.vp.MembersBasedViewSwingImpl;
+import com.jetbrains.python.refactoring.classes.membersManager.vp.MembersViewInitializationInfo;
+import org.jetbrains.annotations.NotNull;
+
+import java.awt.*;
+
+/**
+ * @author Ilya.Kazakevich
+ */
+public class PyPushDownViewSwingImpl extends MembersBasedViewSwingImpl<PyPushDownPresenter, MembersViewInitializationInfo>
+ implements PyPushDownView {
+ public PyPushDownViewSwingImpl(
+ @NotNull final PyClass classUnderRefactoring,
+ @NotNull final Project project,
+ @NotNull final PyPushDownPresenter presenter) {
+ super(project, presenter, RefactoringBundle.message("push.members.from.0.down.label", classUnderRefactoring.getName()), false);
+
+ myCenterPanel.add(myPyMemberSelectionPanel, BorderLayout.CENTER);
+ setTitle(PyPushDownHandler.REFACTORING_NAME);
+ }
+}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/ui/PyMemberSelectionPanel.java b/python/src/com/jetbrains/python/refactoring/classes/ui/PyMemberSelectionPanel.java
index cc4357e..0b6ef07 100644
--- a/python/src/com/jetbrains/python/refactoring/classes/ui/PyMemberSelectionPanel.java
+++ b/python/src/com/jetbrains/python/refactoring/classes/ui/PyMemberSelectionPanel.java
@@ -15,39 +15,95 @@
*/
package com.jetbrains.python.refactoring.classes.ui;
+import com.google.common.base.Preconditions;
import com.intellij.refactoring.classMembers.MemberInfoModel;
import com.intellij.ui.IdeBorderFactory;
import com.intellij.ui.ScrollPaneFactory;
import com.jetbrains.python.psi.PyElement;
-import com.jetbrains.python.refactoring.classes.PyMemberInfo;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
+import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;
+import java.util.Collection;
+import java.util.Collections;
import java.util.List;
/**
+ * Panel that handles table with list of class members with selection checkboxes.
+ *
* @author Dennis.Ushakov
*/
public class PyMemberSelectionPanel extends JPanel {
+ private static final List<PyMemberInfo<PyElement>> EMPTY_MEMBER_INFO = Collections.emptyList();
private final PyMemberSelectionTable myTable;
+ private boolean myInitialized;
- public PyMemberSelectionPanel(String title, List<PyMemberInfo> memberInfo, final MemberInfoModel<PyElement, PyMemberInfo> model) {
- super();
+
+ /**
+ * Creates empty panel to be filled later by {@link #init(com.intellij.refactoring.classMembers.MemberInfoModel, java.util.Collection)}
+ *
+ * @param title
+ */
+ public PyMemberSelectionPanel(@NotNull String title, boolean supportAbstract) {
+ this(title, EMPTY_MEMBER_INFO, null, supportAbstract);
+ }
+
+ /**
+ * Creates panel and fills its table (see {@link #init(com.intellij.refactoring.classMembers.MemberInfoModel, java.util.Collection)} ) with members info
+ *
+ * @param title Title for panel
+ * @param memberInfo list of members
+ * @param model model
+ */
+ public PyMemberSelectionPanel(
+ String title,
+ List<PyMemberInfo<PyElement>> memberInfo,
+ final MemberInfoModel<PyElement, PyMemberInfo<PyElement>> model,
+ final boolean supportAbstract) {
Border titledBorder = IdeBorderFactory.createTitledBorder(title, false);
Border emptyBorder = BorderFactory.createEmptyBorder(0, 5, 5, 5);
Border border = BorderFactory.createCompoundBorder(titledBorder, emptyBorder);
setBorder(border);
setLayout(new BorderLayout());
- myTable = new PyMemberSelectionTable(memberInfo, model);
+ myTable = new PyMemberSelectionTable(memberInfo, model, supportAbstract);
JScrollPane scrollPane = ScrollPaneFactory.createScrollPane(myTable);
add(scrollPane, BorderLayout.CENTER);
}
- public PyMemberSelectionTable getTable() {
- return myTable;
+
+ /**
+ * Inits panel.
+ *
+ * @param memberInfoModel model to display memebers in table
+ * @param members members to display
+ */
+ public void init(@NotNull final MemberInfoModel<PyElement, PyMemberInfo<PyElement>> memberInfoModel,
+ @NotNull final Collection<PyMemberInfo<PyElement>> members) {
+ Preconditions.checkState(!myInitialized, "Already myInitialized");
+ myTable.setMemberInfos(members);
+ myTable.setMemberInfoModel(memberInfoModel);
+ myTable.addMemberInfoChangeListener(memberInfoModel);
+ myInitialized = true;
+ }
+
+ /**
+ * @return list of members, selected by user
+ */
+ @NotNull
+ public Collection<PyMemberInfo<PyElement>> getSelectedMemberInfos() {
+ Preconditions.checkState(myInitialized, "Call #init first");
+ return myTable.getSelectedMemberInfos();
+ }
+
+ /**
+ * Redraws table. Call it when some new data is available.
+ */
+ public void redraw() {
+ myTable.redraw();
}
}
diff --git a/python/src/com/jetbrains/python/refactoring/classes/ui/PyMemberSelectionTable.java b/python/src/com/jetbrains/python/refactoring/classes/ui/PyMemberSelectionTable.java
index 11d3e42..229b2b5 100644
--- a/python/src/com/jetbrains/python/refactoring/classes/ui/PyMemberSelectionTable.java
+++ b/python/src/com/jetbrains/python/refactoring/classes/ui/PyMemberSelectionTable.java
@@ -17,12 +17,15 @@
import com.intellij.icons.AllIcons;
import com.intellij.psi.PsiElement;
+import com.intellij.refactoring.RefactoringBundle;
import com.intellij.refactoring.classMembers.MemberInfoModel;
import com.intellij.refactoring.ui.AbstractMemberSelectionTable;
import com.intellij.ui.RowIcon;
import com.jetbrains.python.psi.PyElement;
import com.jetbrains.python.psi.PyFunction;
-import com.jetbrains.python.refactoring.classes.PyMemberInfo;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.util.List;
@@ -30,23 +33,37 @@
/**
* @author Dennis.Ushakov
*/
-public class PyMemberSelectionTable extends AbstractMemberSelectionTable<PyElement, PyMemberInfo> {
- public PyMemberSelectionTable(final List<PyMemberInfo> memberInfos,
- final MemberInfoModel<PyElement, PyMemberInfo> model) {
- super(memberInfos, model, null);
+public class PyMemberSelectionTable extends AbstractMemberSelectionTable<PyElement, PyMemberInfo<PyElement>> {
+
+ private static final String ABSTRACT_TITLE = RefactoringBundle.message("make.abstract");
+ private final boolean mySupportAbstract;
+
+ public PyMemberSelectionTable(
+ @NotNull final List<PyMemberInfo<PyElement>> memberInfos,
+ @Nullable final MemberInfoModel<PyElement, PyMemberInfo<PyElement>> model,
+ final boolean supportAbstract) {
+ super(memberInfos, model, (supportAbstract ? ABSTRACT_TITLE : null));
+ mySupportAbstract = supportAbstract;
}
- protected Object getAbstractColumnValue(PyMemberInfo memberInfo) {
- return null;
+ @Nullable
+ @Override
+ protected Object getAbstractColumnValue(final PyMemberInfo<PyElement> memberInfo) {
+ //TODO: Too many logic, move to presenters
+ return (mySupportAbstract && memberInfo.isChecked() && myMemberInfoModel.isAbstractEnabled(memberInfo)) ? memberInfo.isToAbstract() : null;
}
- protected boolean isAbstractColumnEditable(int rowIndex) {
- return false;
+ @Override
+ protected boolean isAbstractColumnEditable(final int rowIndex) {
+ return mySupportAbstract && myMemberInfoModel.isAbstractEnabled(myMemberInfos.get(rowIndex));
}
- protected void setVisibilityIcon(PyMemberInfo memberInfo, RowIcon icon) {}
+ @Override
+ protected void setVisibilityIcon(PyMemberInfo<PyElement> memberInfo, RowIcon icon) {
+ }
- protected Icon getOverrideIcon(PyMemberInfo memberInfo) {
+ @Override
+ protected Icon getOverrideIcon(PyMemberInfo<PyElement> memberInfo) {
final PsiElement member = memberInfo.getMember();
Icon overrideIcon = EMPTY_OVERRIDE_ICON;
if (member instanceof PyFunction && memberInfo.getOverrides() != null && memberInfo.getOverrides()) {
diff --git a/python/src/com/jetbrains/python/refactoring/classes/ui/UpDirectedMembersMovingDialog.java b/python/src/com/jetbrains/python/refactoring/classes/ui/UpDirectedMembersMovingDialog.java
deleted file mode 100644
index 7ac313d..0000000
--- a/python/src/com/jetbrains/python/refactoring/classes/ui/UpDirectedMembersMovingDialog.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright 2000-2013 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.jetbrains.python.refactoring.classes.ui;
-
-import com.intellij.openapi.project.Project;
-import com.intellij.openapi.ui.DialogWrapper;
-import com.intellij.refactoring.classMembers.DependencyMemberInfoModel;
-import com.intellij.refactoring.classMembers.MemberInfoChange;
-import com.intellij.refactoring.util.CommonRefactoringUtil;
-import com.jetbrains.python.psi.PyClass;
-import com.jetbrains.python.psi.PyElement;
-import com.jetbrains.python.psi.PyUtil;
-import com.jetbrains.python.refactoring.classes.PyMemberInfo;
-
-import javax.swing.*;
-import java.awt.*;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * @author Dennis.Ushakov
- */
-public abstract class UpDirectedMembersMovingDialog extends DialogWrapper {
- protected DependencyMemberInfoModel<PyElement, PyMemberInfo> myMemberInfoModel;
- protected PyMemberSelectionPanel myMemberSelectionPanel;
- protected PyClass myClass;
- protected List<PyMemberInfo> myMemberInfos;
-
- public UpDirectedMembersMovingDialog(Project project, final PyClass clazz) {
- super(project, true);
- myClass = clazz;
- }
-
- protected JComponent createCenterPanel() {
- JPanel panel = new JPanel(new BorderLayout());
- myMemberSelectionPanel = new PyMemberSelectionPanel(getMembersBorderTitle(), myMemberInfos, null);
- myMemberInfoModel = createMemberInfoModel();
- myMemberInfoModel.memberInfoChanged(new MemberInfoChange<PyElement, PyMemberInfo>(myMemberInfos));
- myMemberSelectionPanel.getTable().setMemberInfoModel(myMemberInfoModel);
- myMemberSelectionPanel.getTable().addMemberInfoChangeListener(myMemberInfoModel);
- panel.add(myMemberSelectionPanel, BorderLayout.CENTER);
-
- return panel;
- }
-
- protected abstract String getMembersBorderTitle();
-
- protected abstract DependencyMemberInfoModel<PyElement, PyMemberInfo> createMemberInfoModel();
-
- protected void doOKAction() {
- if(!checkConflicts()) return;
- close(OK_EXIT_CODE);
- }
-
- public boolean isOKActionEnabled() {
- return getSelectedMemberInfos().size() > 0 && super.isOKActionEnabled();
- }
-
- public abstract boolean checkConflicts();
-
- protected static boolean checkWritable(final PyClass superClass, final Collection<PyMemberInfo> infos) {
- if (infos.size() ==0) {
- return true;
- }
- final PyElement element = infos.iterator().next().getMember();
- final Project project = element.getProject();
- if (!CommonRefactoringUtil.checkReadOnlyStatus(project, superClass)) return false;
- final PyClass container = PyUtil.getContainingClassOrSelf(element);
- if (container == null || !CommonRefactoringUtil.checkReadOnlyStatus(project, container)) return false;
- for (PyMemberInfo info : infos) {
- final PyElement member = info.getMember();
- if (!CommonRefactoringUtil.checkReadOnlyStatus(project, member)) return false;
- }
- return true;
- }
-
- public Collection<PyMemberInfo> getSelectedMemberInfos() {
- ArrayList<PyMemberInfo> list = new ArrayList<PyMemberInfo>(myMemberInfos.size());
- for (PyMemberInfo info : myMemberInfos) {
- if (info.isChecked() && myMemberInfoModel.isMemberEnabled(info)) {
- list.add(info);
- }
- }
- return list;
- }
-}
diff --git a/python/src/com/jetbrains/python/refactoring/extractmethod/PyExtractMethodUtil.java b/python/src/com/jetbrains/python/refactoring/extractmethod/PyExtractMethodUtil.java
index 8a1bd6b..d16712d 100644
--- a/python/src/com/jetbrains/python/refactoring/extractmethod/PyExtractMethodUtil.java
+++ b/python/src/com/jetbrains/python/refactoring/extractmethod/PyExtractMethodUtil.java
@@ -40,7 +40,10 @@
import com.intellij.util.Function;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.containers.hash.HashMap;
-import com.jetbrains.python.*;
+import com.jetbrains.python.PyBundle;
+import com.jetbrains.python.PyNames;
+import com.jetbrains.python.PythonFileType;
+import com.jetbrains.python.PythonLanguage;
import com.jetbrains.python.codeInsight.codeFragment.PyCodeFragment;
import com.jetbrains.python.codeInsight.controlflow.ControlFlowCache;
import com.jetbrains.python.codeInsight.controlflow.ScopeOwner;
@@ -56,6 +59,7 @@
import java.util.*;
/**
+ * * TODO: Merge with {@link com.jetbrains.python.refactoring.classes.PyClassRefactoringUtil#createMethod(String, com.jetbrains.python.psi.PyClass, com.jetbrains.python.psi.PyFunction.Modifier, java.util.Collection, String...)}
* @author oleg
*/
public class PyExtractMethodUtil {
@@ -332,9 +336,12 @@
}
}
- private static void setSelectionAndCaret(Editor editor, final PsiElement callElement) {
+ private static void setSelectionAndCaret(Editor editor, @Nullable final PsiElement callElement) {
editor.getSelectionModel().removeSelection();
- editor.getCaretModel().moveToOffset(callElement.getTextOffset());
+ if (callElement != null) {
+ final int offset = callElement.getTextOffset();
+ editor.getCaretModel().moveToOffset(offset);
+ }
}
private static PsiElement replaceElements(final List<PsiElement> elementsRange, @NotNull PsiElement callElement) {
@@ -558,7 +565,7 @@
throw new CommonRefactoringUtil.RefactoringErrorHintException(error);
}
if (Messages.showOkCancelDialog(error + ". " + RefactoringBundle.message("do.you.wish.to.continue"),
- RefactoringBundle.message("warning.title"), Messages.getWarningIcon()) != 0){
+ RefactoringBundle.message("warning.title"), Messages.getWarningIcon()) != Messages.OK){
throw new CommonRefactoringUtil.RefactoringErrorHintException(error);
}
}
diff --git a/python/src/com/jetbrains/python/refactoring/introduce/IntroduceHandler.java b/python/src/com/jetbrains/python/refactoring/introduce/IntroduceHandler.java
index e17c76c..7f77401 100644
--- a/python/src/com/jetbrains/python/refactoring/introduce/IntroduceHandler.java
+++ b/python/src/com/jetbrains/python/refactoring/introduce/IntroduceHandler.java
@@ -104,7 +104,7 @@
}
int offset = editor.getCaretModel().getOffset();
for (PsiElement occurrence : occurrences) {
- if (occurrence.getTextRange().contains(offset)) {
+ if (occurrence != null && occurrence.getTextRange().contains(offset)) {
return occurrence;
}
}
diff --git a/python/src/com/jetbrains/python/refactoring/introduce/field/PyIntroduceFieldHandler.java b/python/src/com/jetbrains/python/refactoring/introduce/field/PyIntroduceFieldHandler.java
index 3818370..6cdc4b3 100644
--- a/python/src/com/jetbrains/python/refactoring/introduce/field/PyIntroduceFieldHandler.java
+++ b/python/src/com/jetbrains/python/refactoring/introduce/field/PyIntroduceFieldHandler.java
@@ -310,7 +310,7 @@
private static void putCaretOnFieldName(Editor editor, PsiElement occurrence) {
PyQualifiedExpression qExpr = PsiTreeUtil.getParentOfType(occurrence, PyQualifiedExpression.class, false);
- if (qExpr != null && qExpr.getQualifier() == null) {
+ if (qExpr != null && !qExpr.isQualified()) {
qExpr = PsiTreeUtil.getParentOfType(qExpr, PyQualifiedExpression.class);
}
if (qExpr != null) {
diff --git a/python/src/com/jetbrains/python/refactoring/move/PyMoveClassOrFunctionProcessor.java b/python/src/com/jetbrains/python/refactoring/move/PyMoveClassOrFunctionProcessor.java
index fe4da8e..e5f5c26 100644
--- a/python/src/com/jetbrains/python/refactoring/move/PyMoveClassOrFunctionProcessor.java
+++ b/python/src/com/jetbrains/python/refactoring/move/PyMoveClassOrFunctionProcessor.java
@@ -23,6 +23,7 @@
import com.intellij.psi.*;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtilCore;
+import com.intellij.psi.util.QualifiedName;
import com.intellij.refactoring.BaseRefactoringProcessor;
import com.intellij.refactoring.ui.UsageViewDescriptorAdapter;
import com.intellij.refactoring.util.CommonRefactoringUtil;
@@ -33,9 +34,7 @@
import com.jetbrains.python.PyNames;
import com.jetbrains.python.codeInsight.dataflow.scope.ScopeUtil;
import com.jetbrains.python.codeInsight.imports.PyImportOptimizer;
-import com.jetbrains.python.documentation.DocStringTypeReference;
import com.jetbrains.python.psi.*;
-import com.intellij.psi.util.QualifiedName;
import com.jetbrains.python.psi.resolve.QualifiedNameFinder;
import com.jetbrains.python.refactoring.PyRefactoringUtil;
import com.jetbrains.python.refactoring.classes.PyClassRefactoringUtil;
@@ -141,7 +140,7 @@
// TODO: Remove extra empty lines after the removed element
element.delete();
if (file != null) {
- optimizeImports(file);
+ PyClassRefactoringUtil.optimizeImports(file);
}
}
@@ -184,7 +183,7 @@
if (oldElement instanceof PyClass && PyNames.INIT.equals(expr.getName())) {
return;
}
- if (expr.getQualifier() != null) {
+ if (expr.isQualified()) {
final PyElementGenerator generator = PyElementGenerator.getInstance(expr.getProject());
final PyExpression generated = generator.createExpressionFromText(LanguageLevel.forElement(expr), expr.getName());
final PsiElement newExpr = expr.replace(generated);
@@ -193,7 +192,7 @@
}
if (usage instanceof PyStringLiteralExpression) {
for (PsiReference ref : usage.getReferences()) {
- if (ref instanceof DocStringTypeReference && ref.isReferenceTo(oldElement)) {
+ if (ref.isReferenceTo(oldElement)) {
ref.bindToElement(newElement);
}
}
@@ -210,15 +209,12 @@
if (resolvesToLocalStarImport(usage)) {
PyClassRefactoringUtil.insertImport(usage, newElement);
if (usageFile != null) {
- optimizeImports(usageFile);
+ PyClassRefactoringUtil.optimizeImports(usageFile);
}
}
}
}
- private static void optimizeImports(@NotNull PsiFile file) {
- new PyImportOptimizer().processFile(file).run();
- }
private static boolean resolvesToLocalStarImport(@NotNull PsiElement element) {
final PsiReference ref = element.getReference();
diff --git a/python/src/com/jetbrains/python/refactoring/move/PyMoveFileHandler.java b/python/src/com/jetbrains/python/refactoring/move/PyMoveFileHandler.java
index 84164cb..901aeee 100644
--- a/python/src/com/jetbrains/python/refactoring/move/PyMoveFileHandler.java
+++ b/python/src/com/jetbrains/python/refactoring/move/PyMoveFileHandler.java
@@ -109,7 +109,7 @@
}
else if (element instanceof PyReferenceExpression) {
updatedFiles.add(file);
- if (((PyReferenceExpression)element).getQualifier() != null) {
+ if (((PyReferenceExpression)element).isQualified()) {
final QualifiedName newQualifiedName = QualifiedNameFinder.findCanonicalImportPath(newElement, element);
replaceWithQualifiedExpression(element, newQualifiedName);
} else {
diff --git a/python/src/com/jetbrains/python/refactoring/rename/RenamePyFunctionProcessor.java b/python/src/com/jetbrains/python/refactoring/rename/RenamePyFunctionProcessor.java
index ce91ea6..36e0a00 100644
--- a/python/src/com/jetbrains/python/refactoring/rename/RenamePyFunctionProcessor.java
+++ b/python/src/com/jetbrains/python/refactoring/rename/RenamePyFunctionProcessor.java
@@ -79,10 +79,10 @@
String message = "Method " + function.getName() + " of class " + containingClass.getQualifiedName() + "\noverrides method of class "
+ deepestSuperMethod.getContainingClass().getQualifiedName() + ".\nDo you want to rename the base method?";
int rc = Messages.showYesNoCancelDialog(element.getProject(), message, "Rename", Messages.getQuestionIcon());
- if (rc == 0) {
+ if (rc == Messages.YES) {
return deepestSuperMethod;
}
- if (rc == 1) {
+ if (rc == Messages.NO) {
return function;
}
return null;
@@ -98,8 +98,8 @@
property.getName(), function.getName());
final int rc = Messages.showYesNoCancelDialog(element.getProject(), message, "Rename", Messages.getQuestionIcon());
switch (rc) {
- case 0: return site;
- case 1: return function;
+ case Messages.YES: return site;
+ case Messages.NO: return function;
default: return null;
}
}
diff --git a/python/src/com/jetbrains/python/refactoring/surround/surrounders/statements/PyWithTryExceptSurrounder.java b/python/src/com/jetbrains/python/refactoring/surround/surrounders/statements/PyWithTryExceptSurrounder.java
index 5cdaba2..25a9f26 100644
--- a/python/src/com/jetbrains/python/refactoring/surround/surrounders/statements/PyWithTryExceptSurrounder.java
+++ b/python/src/com/jetbrains/python/refactoring/surround/surrounders/statements/PyWithTryExceptSurrounder.java
@@ -22,7 +22,6 @@
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
-import com.intellij.psi.codeStyle.CodeStyleManager;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.IncorrectOperationException;
import com.jetbrains.python.PyBundle;
@@ -53,9 +52,10 @@
final PsiFile psiFile = parent.getContainingFile();
final Document document = psiFile.getViewProvider().getDocument();
- final RangeMarker rangeMarker = document.createRangeMarker(tryStatement.getTextRange());
+ final TextRange range = tryStatement.getTextRange();
+ assert document != null;
+ final RangeMarker rangeMarker = document.createRangeMarker(range);
- CodeStyleManager.getInstance(project).reformat(psiFile);
final PsiElement element = psiFile.findElementAt(rangeMarker.getStartOffset());
tryStatement = PsiTreeUtil.getParentOfType(element, PyTryExceptStatement.class);
if (tryStatement != null) {
@@ -70,7 +70,9 @@
protected TextRange getResultRange(PyTryExceptStatement tryStatement) {
final PyExceptPart part = tryStatement.getExceptParts()[0];
- return part.getStatementList().getTextRange();
+ final PyStatementList list = part.getStatementList();
+ assert list != null;
+ return list.getTextRange();
}
public String getTemplateDescription() {
diff --git a/python/src/com/jetbrains/python/refactoring/surround/surrounders/statements/PyWithTryFinallySurrounder.java b/python/src/com/jetbrains/python/refactoring/surround/surrounders/statements/PyWithTryFinallySurrounder.java
index 54e2c27..d457e32 100644
--- a/python/src/com/jetbrains/python/refactoring/surround/surrounders/statements/PyWithTryFinallySurrounder.java
+++ b/python/src/com/jetbrains/python/refactoring/surround/surrounders/statements/PyWithTryFinallySurrounder.java
@@ -17,6 +17,8 @@
import com.intellij.codeInsight.CodeInsightBundle;
import com.intellij.openapi.util.TextRange;
+import com.jetbrains.python.psi.PyFinallyPart;
+import com.jetbrains.python.psi.PyStatementList;
import com.jetbrains.python.psi.PyTryExceptStatement;
/**
@@ -37,6 +39,10 @@
@Override
protected TextRange getResultRange(PyTryExceptStatement tryStatement) {
- return tryStatement.getFinallyPart().getStatementList().getTextRange();
+ final PyFinallyPart finallyPart = tryStatement.getFinallyPart();
+ assert finallyPart != null;
+ final PyStatementList statementList = finallyPart.getStatementList();
+ assert statementList != null;
+ return statementList.getTextRange();
}
}
diff --git a/python/src/com/jetbrains/python/remote/PyRemoteSdkAdditionalDataBase.java b/python/src/com/jetbrains/python/remote/PyRemoteSdkAdditionalDataBase.java
new file mode 100644
index 0000000..deb8030
--- /dev/null
+++ b/python/src/com/jetbrains/python/remote/PyRemoteSdkAdditionalDataBase.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.remote;
+
+import com.intellij.remotesdk2.RemoteSdkAdditionalData2;
+
+/**
+ * @author traff
+ */
+public interface PyRemoteSdkAdditionalDataBase extends RemoteSdkAdditionalData2<PyRemoteSdkCredentials>, PySkeletonsPathAware {
+}
diff --git a/python/src/com/jetbrains/python/remote/PyRemoteSdkCredentials.java b/python/src/com/jetbrains/python/remote/PyRemoteSdkCredentials.java
new file mode 100644
index 0000000..5b5fc9b
--- /dev/null
+++ b/python/src/com/jetbrains/python/remote/PyRemoteSdkCredentials.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2000-2013 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.remote;
+
+import com.intellij.remotesdk.RemoteSdkCredentials;
+
+/**
+ * @author yole
+ */
+public interface PyRemoteSdkCredentials extends RemoteSdkCredentials, PySkeletonsPathAware {
+
+}
diff --git a/python/src/com/jetbrains/python/remote/PyRemoteSdkData.java b/python/src/com/jetbrains/python/remote/PyRemoteSdkData.java
deleted file mode 100644
index ea2f8df..0000000
--- a/python/src/com/jetbrains/python/remote/PyRemoteSdkData.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright 2000-2013 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.jetbrains.python.remote;
-
-import com.intellij.remotesdk.RemoteSdkData;
-
-/**
- * @author yole
- */
-public interface PyRemoteSdkData extends RemoteSdkData {
- String getSkeletonsPath();
-}
diff --git a/python/src/com/jetbrains/python/remote/PySkeletonsPathAware.java b/python/src/com/jetbrains/python/remote/PySkeletonsPathAware.java
new file mode 100644
index 0000000..789d1ba
--- /dev/null
+++ b/python/src/com/jetbrains/python/remote/PySkeletonsPathAware.java
@@ -0,0 +1,10 @@
+package com.jetbrains.python.remote;
+
+/**
+ * @author traff
+ */
+public interface PySkeletonsPathAware {
+ String getSkeletonsPath();
+
+ void setSkeletonsPath(String path);
+}
diff --git a/python/src/com/jetbrains/python/remote/PythonRemoteInterpreterManager.java b/python/src/com/jetbrains/python/remote/PythonRemoteInterpreterManager.java
index 8be1df8..40e34f1 100644
--- a/python/src/com/jetbrains/python/remote/PythonRemoteInterpreterManager.java
+++ b/python/src/com/jetbrains/python/remote/PythonRemoteInterpreterManager.java
@@ -28,7 +28,7 @@
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.remotesdk.RemoteInterpreterException;
-import com.intellij.remotesdk.RemoteSdkData;
+import com.intellij.remotesdk.RemoteSdkCredentials;
import com.intellij.remotesdk.RemoteSshProcess;
import com.intellij.util.NullableConsumer;
import com.intellij.util.PathMappingSettings;
@@ -52,14 +52,14 @@
"Remote interpreter can't be executed. Please enable the Remote Hosts Access plugin.";
public abstract ProcessHandler startRemoteProcess(@Nullable Project project,
- @NotNull PyRemoteSdkData data,
+ @NotNull PyRemoteSdkCredentials data,
@NotNull GeneralCommandLine commandLine,
@Nullable
PathMappingSettings mappingSettings)
throws RemoteInterpreterException;
public abstract ProcessHandler startRemoteProcessWithPid(@Nullable Project project,
- @NotNull PyRemoteSdkData data,
+ @NotNull PyRemoteSdkCredentials data,
@NotNull GeneralCommandLine commandLine,
@Nullable
PathMappingSettings mappingSettings)
@@ -70,7 +70,7 @@
public abstract ProcessOutput runRemoteProcess(@Nullable Project project,
- RemoteSdkData data,
+ RemoteSdkCredentials data,
String[] command,
@Nullable String workingDir,
boolean askForSudo)
@@ -78,7 +78,7 @@
@NotNull
public abstract RemoteSshProcess createRemoteProcess(@Nullable Project project,
- @NotNull RemoteSdkData data,
+ @NotNull RemoteSdkCredentials data,
@NotNull GeneralCommandLine commandLine, boolean allocatePty)
throws RemoteInterpreterException;
@@ -89,18 +89,18 @@
@NotNull Sdk sdk,
String path);
- public abstract boolean ensureCanWrite(@Nullable Object projectOrComponent, RemoteSdkData data, String path);
+ public abstract boolean ensureCanWrite(@Nullable Object projectOrComponent, RemoteSdkCredentials data, String path);
@Nullable
- public abstract RemoteProjectSettings showRemoteProjectSettingsDialog(VirtualFile baseDir, RemoteSdkData data);
+ public abstract RemoteProjectSettings showRemoteProjectSettingsDialog(VirtualFile baseDir, RemoteSdkCredentials data);
public abstract void createDeployment(Project project,
VirtualFile projectDir,
RemoteProjectSettings settings,
- RemoteSdkData data);
+ RemoteSdkCredentials data);
public abstract void copyFromRemote(@NotNull Project project,
- RemoteSdkData data,
+ RemoteSdkCredentials data,
List<PathMappingSettings.PathMapping> mappings);
@Nullable
@@ -127,7 +127,7 @@
return FileUtil.toSystemIndependentName(path).replace('/', separator);
}
- public static void addHelpersMapping(@NotNull RemoteSdkData data, @Nullable PathMappingSettings newMappingSettings) {
+ public static void addHelpersMapping(@NotNull RemoteSdkCredentials data, @Nullable PathMappingSettings newMappingSettings) {
if (newMappingSettings == null) {
newMappingSettings = new PathMappingSettings();
}
@@ -135,7 +135,7 @@
}
public abstract PathMappingSettings setupMappings(@Nullable Project project,
- @NotNull PyRemoteSdkData data,
+ @NotNull PyRemoteSdkCredentials data,
@Nullable PathMappingSettings mappingSettings);
public abstract SdkAdditionalData loadRemoteSdkData(Sdk sdk, Element additional);
diff --git a/python/src/com/jetbrains/python/run/PyRemoteProcessStarter.java b/python/src/com/jetbrains/python/run/PyRemoteProcessStarter.java
index 5fc0bc8..5941d5f 100644
--- a/python/src/com/jetbrains/python/run/PyRemoteProcessStarter.java
+++ b/python/src/com/jetbrains/python/run/PyRemoteProcessStarter.java
@@ -23,9 +23,11 @@
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.Sdk;
-import com.intellij.openapi.ui.Messages;
+import com.intellij.openapi.projectRoots.SdkAdditionalData;
+import com.intellij.remotesdk2.RemoteSdkAdditionalData2;
import com.intellij.util.PathMappingSettings;
-import com.jetbrains.python.remote.PyRemoteSdkData;
+import com.jetbrains.python.remote.PyRemoteSdkAdditionalDataBase;
+import com.jetbrains.python.remote.PyRemoteSdkCredentials;
import com.jetbrains.python.remote.PythonRemoteInterpreterManager;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -43,21 +45,15 @@
if (manager != null) {
ProcessHandler processHandler;
- while (true) {
- try {
- processHandler = doStartRemoteProcess(sdk, commandLine, manager, project, mappingSettings);
- break;
+ try {
+ processHandler = doStartRemoteProcess(sdk, commandLine, manager, project, mappingSettings);
+ }
+ catch (ExecutionException e) {
+ final Application application = ApplicationManager.getApplication();
+ if (application != null && (application.isUnitTestMode() || application.isHeadlessEnvironment())) {
+ throw new RuntimeException(e);
}
- catch (ExecutionException e) {
- final Application application = ApplicationManager.getApplication();
- if (application != null && (application.isUnitTestMode() || application.isHeadlessEnvironment())) {
- throw new RuntimeException(e);
- }
- if (Messages.showYesNoDialog(e.getMessage() + "\nTry again?", "Can't Run Remote Interpreter", Messages.getErrorIcon()) ==
- Messages.NO) {
- throw new ExecutionException("Can't run remote python interpreter: " + e.getMessage(), e);
- }
- }
+ throw new ExecutionException("Can't run remote python interpreter: " + e.getMessage(), e);
}
ProcessTerminatedListener.attach(processHandler);
return processHandler;
@@ -74,7 +70,14 @@
@Nullable PathMappingSettings settings)
throws ExecutionException {
- return manager.startRemoteProcess(project, (PyRemoteSdkData)sdk.getSdkAdditionalData(), commandLine,
- settings);
+ SdkAdditionalData data = sdk.getSdkAdditionalData();
+ assert data instanceof PyRemoteSdkAdditionalDataBase;
+ try {
+ return manager.startRemoteProcess(project, ((PyRemoteSdkAdditionalDataBase)data).getRemoteSdkCredentials(), commandLine,
+ settings);
+ }
+ catch (InterruptedException e) {
+ throw new ExecutionException(e); //TODO: handle exception
+ }
}
}
diff --git a/python/src/com/jetbrains/python/run/PythonRunConfigurationProducer.java b/python/src/com/jetbrains/python/run/PythonRunConfigurationProducer.java
index c14bde2..5817768 100644
--- a/python/src/com/jetbrains/python/run/PythonRunConfigurationProducer.java
+++ b/python/src/com/jetbrains/python/run/PythonRunConfigurationProducer.java
@@ -17,6 +17,7 @@
import com.intellij.execution.Location;
import com.intellij.execution.actions.ConfigurationContext;
+import com.intellij.execution.actions.ConfigurationFromContext;
import com.intellij.execution.actions.RunConfigurationProducer;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.module.Module;
@@ -94,4 +95,8 @@
}
return true;
}
+ @Override
+ public boolean isPreferredConfiguration(ConfigurationFromContext self, ConfigurationFromContext other) {
+ return other.isProducedBy(PythonRunConfigurationProducer.class);
+ }
}
diff --git a/python/src/com/jetbrains/python/run/PythonRunner.java b/python/src/com/jetbrains/python/run/PythonRunner.java
index c2a8937..b95da7c 100644
--- a/python/src/com/jetbrains/python/run/PythonRunner.java
+++ b/python/src/com/jetbrains/python/run/PythonRunner.java
@@ -44,10 +44,10 @@
@Override
protected RunContentDescriptor doExecute(
- Project project,
- RunProfileState state,
+ @NotNull Project project,
+ @NotNull RunProfileState state,
RunContentDescriptor contentToReuse,
- ExecutionEnvironment env
+ @NotNull ExecutionEnvironment env
) throws ExecutionException {
FileDocumentManager.getInstance().saveAllDocuments();
diff --git a/python/src/com/jetbrains/python/sdk/CreateVirtualEnvDialog.form b/python/src/com/jetbrains/python/sdk/CreateVirtualEnvDialog.form
index bd84b37..ea6172e 100644
--- a/python/src/com/jetbrains/python/sdk/CreateVirtualEnvDialog.form
+++ b/python/src/com/jetbrains/python/sdk/CreateVirtualEnvDialog.form
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="com.jetbrains.python.sdk.CreateVirtualEnvDialog">
- <grid id="cbd77" binding="myMainPanel" layout-manager="GridLayoutManager" row-count="7" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
+ <grid id="cbd77" binding="myMainPanel" layout-manager="GridLayoutManager" row-count="6" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
<xy x="48" y="54" width="550" height="342"/>
@@ -16,7 +16,7 @@
</component>
<vspacer id="b277d">
<constraints>
- <grid row="6" column="1" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
+ <grid row="5" column="1" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
</constraints>
</vspacer>
<component id="48fd" class="com.intellij.ui.components.JBLabel">
@@ -60,30 +60,22 @@
</component>
<component id="41e08" class="com.intellij.ui.components.JBCheckBox" binding="myMakeAvailableToAllProjectsCheckbox">
<constraints>
- <grid row="5" column="0" row-span="1" col-span="2" vsize-policy="0" hsize-policy="0" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
+ <grid row="4" column="0" row-span="1" col-span="2" vsize-policy="0" hsize-policy="0" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<selected value="false"/>
<text value="Make available to &all projects"/>
</properties>
</component>
- <component id="9835d" class="com.intellij.ui.components.JBCheckBox" binding="mySitePackagesCheckBox">
+ <component id="d10a9" class="com.intellij.ui.components.JBCheckBox" binding="mySitePackagesCheckBox">
<constraints>
- <grid row="3" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+ <grid row="3" column="0" row-span="1" col-span="2" vsize-policy="0" hsize-policy="0" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
+ <selected value="false"/>
<text value="&Inherit global site-packages"/>
</properties>
</component>
- <component id="fd5f3" class="com.intellij.ui.components.JBCheckBox" binding="mySetAsProjectInterpreterCheckbox" default-binding="true">
- <constraints>
- <grid row="4" column="0" row-span="1" col-span="2" vsize-policy="0" hsize-policy="0" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
- </constraints>
- <properties>
- <selected value="true"/>
- <text value="&Set as project interpreter for this project"/>
- </properties>
- </component>
</children>
</grid>
</form>
diff --git a/python/src/com/jetbrains/python/sdk/CreateVirtualEnvDialog.java b/python/src/com/jetbrains/python/sdk/CreateVirtualEnvDialog.java
index e86fca4..1043866 100644
--- a/python/src/com/jetbrains/python/sdk/CreateVirtualEnvDialog.java
+++ b/python/src/com/jetbrains/python/sdk/CreateVirtualEnvDialog.java
@@ -15,6 +15,8 @@
*/
package com.jetbrains.python.sdk;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
import com.intellij.facet.ui.FacetEditorValidator;
import com.intellij.facet.ui.FacetValidatorsManager;
import com.intellij.openapi.application.Application;
@@ -33,7 +35,7 @@
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.platform.LocationNameFieldsBinding;
-import com.intellij.remotesdk.RemoteSdkDataHolder;
+import com.intellij.remotesdk.RemoteSdkCredentialsHolder;
import com.intellij.ui.CollectionComboBoxModel;
import com.intellij.ui.DocumentAdapter;
import com.intellij.ui.components.JBCheckBox;
@@ -67,18 +69,16 @@
private JTextField myName;
private JBCheckBox mySitePackagesCheckBox;
private JBCheckBox myMakeAvailableToAllProjectsCheckbox;
- private JBCheckBox mySetAsProjectInterpreterCheckbox;
@Nullable private Project myProject;
private String myInitialPath;
public interface VirtualEnvCallback {
- void virtualEnvCreated(Sdk sdk, boolean associateWithProject, boolean setAsProjectInterpreter);
+ void virtualEnvCreated(Sdk sdk, boolean associateWithProject);
}
- private static void setupVirtualEnvSdk(List<Sdk> allSdks,
+ private void setupVirtualEnvSdk(List<Sdk> allSdks,
final String path,
boolean associateWithProject,
- final boolean makeActive,
VirtualEnvCallback callback) {
final VirtualFile sdkHome =
ApplicationManager.getApplication().runWriteAction(new Computable<VirtualFile>() {
@@ -92,46 +92,45 @@
SdkConfigurationUtil.createUniqueSdkName(PythonSdkType.getInstance(), sdkHome.getPath(), allSdks);
final ProjectJdkImpl sdk = new ProjectJdkImpl(name, PythonSdkType.getInstance());
sdk.setHomePath(sdkHome.getPath());
- callback.virtualEnvCreated(sdk, associateWithProject, makeActive);
+ callback.virtualEnvCreated(sdk, associateWithProject);
+ PythonSdkType.setupSdkPaths(sdk, myProject, null);
}
}
public CreateVirtualEnvDialog(Project project,
- boolean isNewProject,
final List<Sdk> allSdks,
@Nullable Sdk suggestedBaseSdk) {
super(project);
- setupDialog(project, isNewProject, allSdks, suggestedBaseSdk);
+ setupDialog(project, allSdks, suggestedBaseSdk);
}
public CreateVirtualEnvDialog(Component owner,
- boolean isNewProject,
final List<Sdk> allSdks,
@Nullable Sdk suggestedBaseSdk) {
super(owner);
- setupDialog(null, isNewProject, allSdks, suggestedBaseSdk);
+ setupDialog(null, allSdks, suggestedBaseSdk);
}
- private void setupDialog(Project project, boolean isNewProject, List<Sdk> allSdks, @Nullable Sdk suggestedBaseSdk) {
+ private void setupDialog(Project project, List<Sdk> allSdks, @Nullable Sdk suggestedBaseSdk) {
myProject = project;
init();
setTitle("Create Virtual Environment");
if (suggestedBaseSdk == null && allSdks.size() > 0) {
+ Iterables.removeIf(allSdks, new Predicate<Sdk>() {
+ @Override
+ public boolean apply(Sdk s) {
+ return PythonSdkType.isInvalid(s) || PythonSdkType.isVirtualEnv(s) || RemoteSdkCredentialsHolder.isRemoteSdk(s.getHomePath());
+ }
+ });
List<Sdk> sortedSdks = new ArrayList<Sdk>(allSdks);
Collections.sort(sortedSdks, new PreferredSdkComparator());
suggestedBaseSdk = sortedSdks.get(0);
}
updateSdkList(allSdks, suggestedBaseSdk);
- myMakeAvailableToAllProjectsCheckbox.setBorder(BorderFactory.createEmptyBorder(8, 0, 0, 0));
if (project == null || project.isDefault() || !PlatformUtils.isPyCharm()) {
myMakeAvailableToAllProjectsCheckbox.setSelected(true);
myMakeAvailableToAllProjectsCheckbox.setVisible(false);
- mySetAsProjectInterpreterCheckbox.setSelected(false);
- mySetAsProjectInterpreterCheckbox.setVisible(false);
- }
- else if (isNewProject) {
- mySetAsProjectInterpreterCheckbox.setText("Set as project interpreter for the project being created");
}
setOKActionEnabled(false);
@@ -238,17 +237,7 @@
private void updateSdkList(final List<Sdk> allSdks, @Nullable Sdk initialSelection) {
mySdkCombo.setRenderer(new PySdkListCellRenderer());
- List<Sdk> baseSdks = new ArrayList<Sdk>();
- for (Sdk s : allSdks) {
- if (!PythonSdkType.isInvalid(s) && !PythonSdkType.isVirtualEnv(s) && !RemoteSdkDataHolder.isRemoteSdk(s.getHomePath())) {
- baseSdks.add(s);
- }
- else if (s.equals(initialSelection)){
- initialSelection = null;
- }
- }
-
- mySdkCombo.setModel(new CollectionComboBoxModel(baseSdks, initialSelection));
+ mySdkCombo.setModel(new CollectionComboBoxModel(allSdks, initialSelection));
}
@Override
@@ -288,10 +277,6 @@
return !myMakeAvailableToAllProjectsCheckbox.isSelected();
}
- public boolean setAsProjectInterpreter() {
- return mySetAsProjectInterpreterCheckbox.isSelected();
- }
-
@Override
public JComponent getPreferredFocusedComponent() {
return myName;
@@ -326,7 +311,7 @@
application.invokeLater(new Runnable() {
@Override
public void run() {
- setupVirtualEnvSdk(allSdks, myPath, associateWithProject(), setAsProjectInterpreter(), callback);
+ setupVirtualEnvSdk(allSdks, myPath, associateWithProject(), callback);
}
}, ModalityState.any());
}
diff --git a/python/src/com/jetbrains/python/sdk/InterpreterPathChooser.java b/python/src/com/jetbrains/python/sdk/InterpreterPathChooser.java
deleted file mode 100644
index ab57e35..0000000
--- a/python/src/com/jetbrains/python/sdk/InterpreterPathChooser.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * Copyright 2000-2013 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.jetbrains.python.sdk;
-
-import com.google.common.collect.Lists;
-import com.intellij.openapi.application.ApplicationManager;
-import com.intellij.openapi.application.ModalityState;
-import com.intellij.openapi.options.ShowSettingsUtil;
-import com.intellij.openapi.project.Project;
-import com.intellij.openapi.projectRoots.Sdk;
-import com.intellij.openapi.projectRoots.impl.SdkConfigurationUtil;
-import com.intellij.openapi.ui.Messages;
-import com.intellij.openapi.ui.popup.JBPopupFactory;
-import com.intellij.openapi.ui.popup.ListPopup;
-import com.intellij.openapi.ui.popup.ListPopupStep;
-import com.intellij.openapi.ui.popup.PopupStep;
-import com.intellij.openapi.ui.popup.util.BaseListPopupStep;
-import com.intellij.openapi.util.io.FileUtil;
-import com.intellij.openapi.util.text.StringUtil;
-import com.intellij.openapi.vfs.LocalFileSystem;
-import com.intellij.ui.awt.RelativePoint;
-import com.intellij.util.NullableConsumer;
-import com.intellij.util.SystemProperties;
-import com.jetbrains.python.remote.PythonRemoteInterpreterManager;
-import com.jetbrains.python.sdk.flavors.PythonSdkFlavor;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-import javax.swing.*;
-import java.awt.*;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-
-/**
-* @author yole
-*/
-public class InterpreterPathChooser extends BaseListPopupStep<String> {
- private final Project myProject;
- private final Component myOwnerComponent;
- private final Sdk[] myExistingSdks;
- private final NullableConsumer<Sdk> myCallback;
-
- private static final String LOCAL = "Local...";
- private static final String REMOTE = "Remote...";
- private static final String VIRTUALENV = "Create VirtualEnv...";
-
- public static void show(final Project project,
- final Sdk[] existingSdks,
- final RelativePoint popupPoint,
- final boolean showVirtualEnv,
- final NullableConsumer<Sdk> callback) {
- ListPopupStep sdkHomesStep = new InterpreterPathChooser(project, popupPoint.getComponent(), existingSdks, showVirtualEnv, callback);
- final ListPopup popup = JBPopupFactory.getInstance().createListPopup(sdkHomesStep);
- popup.show(popupPoint);
- }
-
- public InterpreterPathChooser(Project project,
- Component ownerComponent,
- Sdk[] existingSdks,
- boolean showVirtualEnv,
- NullableConsumer<Sdk> callback) {
- super("Select Interpreter Path", getSuggestedPythonSdkPaths(existingSdks, showVirtualEnv));
- myProject = project;
- myOwnerComponent = ownerComponent;
- myExistingSdks = existingSdks;
- myCallback = callback;
- }
-
- private static List<String> getSuggestedPythonSdkPaths(Sdk[] existingSdks, boolean showVirtualEnv) {
- List<String> paths = new ArrayList<String>();
- Collection<String> sdkHomes = PythonSdkType.getInstance().suggestHomePaths();
- for (String sdkHome : SdkConfigurationUtil.filterExistingPaths(PythonSdkType.getInstance(), sdkHomes, existingSdks)) {
- paths.add(FileUtil.getLocationRelativeToUserHome(sdkHome));
- }
- paths.add(LOCAL);
- if (PythonRemoteInterpreterManager.getInstance() != null) {
- paths.add(REMOTE);
- }
- if (showVirtualEnv) {
- paths.add(VIRTUALENV);
- }
- return paths;
- }
-
- @Nullable
- @Override
- public Icon getIconFor(String aValue) {
- if (LOCAL.equals(aValue) || REMOTE.equals(aValue) || VIRTUALENV.equals(aValue)) return null;
- String filePath = aValue;
- if (StringUtil.startsWithChar(filePath, '~')) {
- String home = SystemProperties.getUserHome();
- filePath = home + filePath.substring(1);
- }
- final PythonSdkFlavor flavor = PythonSdkFlavor.getPlatformIndependentFlavor(filePath);
- return flavor != null ? flavor.getIcon() : PythonSdkType.getInstance().getIcon();
- }
-
- @NotNull
- @Override
- public String getTextFor(String value) {
- return FileUtil.toSystemDependentName(value);
- }
-
- private void sdkSelected(final String selectedValue) {
- if (LOCAL.equals(selectedValue)) {
- createLocalSdk();
- }
- else if (REMOTE.equals(selectedValue)) {
- createRemoteSdk();
- }
- else if (VIRTUALENV.equals(selectedValue)) {
- createVirtualEnvSdk();
- }
- else {
- createSdkFromPath(selectedValue);
- }
- }
-
- private void createLocalSdk() {
- ApplicationManager.getApplication().invokeLater(new Runnable() {
- @Override
- public void run() {
- SdkConfigurationUtil.createSdk(myProject, myExistingSdks, myCallback, PythonSdkType.getInstance());
- }
- }, ModalityState.any());
- }
-
- private void createRemoteSdk() {
- PythonRemoteInterpreterManager remoteInterpreterManager = PythonRemoteInterpreterManager.getInstance();
- if (remoteInterpreterManager != null) {
- remoteInterpreterManager.addRemoteSdk(myProject, myOwnerComponent, Lists.newArrayList(myExistingSdks), myCallback);
- }
- else {
- Messages.showErrorDialog("The Remote Hosts Access plugin is missing. Please enable the plugin in " +
- ShowSettingsUtil.getSettingsMenuName() +
- " | Plugins.", "Add Remote Interpreter");
- }
- }
-
- private void createSdkFromPath(String selectedPath) {
- String filePath = selectedPath;
- if (StringUtil.startsWithChar(filePath, '~')) {
- String home = SystemProperties.getUserHome();
- filePath = home + filePath.substring(1);
- }
- Sdk sdk = SdkConfigurationUtil.setupSdk(myExistingSdks,
- LocalFileSystem.getInstance().findFileByPath(filePath),
- PythonSdkType.getInstance(), false, null, null);
- myCallback.consume(sdk);
- }
-
- private void createVirtualEnvSdk() {
- final CreateVirtualEnvDialog dialog;
- final List<Sdk> allSdks = Arrays.asList(myExistingSdks);
- if (myProject != null) {
- dialog = new CreateVirtualEnvDialog(myProject, false, allSdks, null);
- }
- else {
- dialog = new CreateVirtualEnvDialog(myOwnerComponent, false, allSdks, null);
- }
- dialog.show();
- if (dialog.isOK()) {
- dialog.createVirtualEnv(allSdks, new CreateVirtualEnvDialog.VirtualEnvCallback() {
- @Override
- public void virtualEnvCreated(Sdk sdk, boolean associateWithProject, boolean setAsProjectInterpreter) {
- myCallback.consume(sdk);
- }
- });
- }
- }
-
- @Override
- public boolean canBeHidden(String value) {
- return true;
- }
-
- @Override
- public PopupStep onChosen(final String selectedValue, boolean finalChoice) {
- return doFinalStep(new Runnable() {
- public void run() {
- sdkSelected(selectedValue);
- }
- });
- }
-}
diff --git a/python/src/com/jetbrains/python/sdk/PreferredSdkComparator.java b/python/src/com/jetbrains/python/sdk/PreferredSdkComparator.java
index 50bc771..ff1cea9 100644
--- a/python/src/com/jetbrains/python/sdk/PreferredSdkComparator.java
+++ b/python/src/com/jetbrains/python/sdk/PreferredSdkComparator.java
@@ -37,6 +37,12 @@
if (remote1Weight != remote2Weight) {
return remote2Weight - remote1Weight;
}
+ int detectedWeight1 = o1 instanceof PyDetectedSdk ? 0 : 1;
+ int detectedWeight2 = o2 instanceof PyDetectedSdk ? 0 : 1;
+ if (detectedWeight1 != detectedWeight2) {
+ return detectedWeight2 - detectedWeight1;
+ }
+
int venv1weight = PythonSdkType.isVirtualEnv(o1) ? 0 : 1;
int venv2weight = PythonSdkType.isVirtualEnv(o2) ? 0 : 1;
if (venv1weight != venv2weight) {
@@ -47,6 +53,7 @@
if (flavor1weight != flavor2weight) {
return flavor2weight - flavor1weight;
}
+
return -Comparing.compare(o1.getVersionString(), o2.getVersionString());
}
}
diff --git a/python/src/com/jetbrains/python/sdk/PyDetectedSdk.java b/python/src/com/jetbrains/python/sdk/PyDetectedSdk.java
new file mode 100644
index 0000000..098462e
--- /dev/null
+++ b/python/src/com/jetbrains/python/sdk/PyDetectedSdk.java
@@ -0,0 +1,11 @@
+package com.jetbrains.python.sdk;
+
+import com.intellij.openapi.projectRoots.impl.ProjectJdkImpl;
+
+public class PyDetectedSdk extends ProjectJdkImpl {
+ public PyDetectedSdk(String name) {
+ super(name, PythonSdkType.getInstance());
+ setHomePath(name);
+ }
+
+}
diff --git a/python/src/com/jetbrains/python/sdk/PySdkListCellRenderer.java b/python/src/com/jetbrains/python/sdk/PySdkListCellRenderer.java
index 9065d37..9886224 100644
--- a/python/src/com/jetbrains/python/sdk/PySdkListCellRenderer.java
+++ b/python/src/com/jetbrains/python/sdk/PySdkListCellRenderer.java
@@ -19,6 +19,7 @@
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.projectRoots.SdkModificator;
import com.intellij.openapi.projectRoots.SdkType;
+import com.intellij.openapi.util.IconLoader;
import com.intellij.ui.LayeredIcon;
import com.intellij.ui.ListCellRendererWrapper;
import com.jetbrains.python.sdk.flavors.PythonSdkFlavor;
@@ -27,9 +28,10 @@
import javax.swing.*;
import java.util.Map;
-public class PySdkListCellRenderer extends ListCellRendererWrapper<Sdk> {
+public class PySdkListCellRenderer extends ListCellRendererWrapper<Object> {
private final String myNullText;
private final Map<Sdk, SdkModificator> mySdkModifiers;
+ public static final String SEPARATOR = "separator";
public PySdkListCellRenderer() {
myNullText = "";
@@ -42,8 +44,9 @@
}
@Override
- public void customize(JList list, Sdk sdk, int index, boolean selected, boolean hasFocus) {
- if (sdk != null) {
+ public void customize(JList list, Object item, int index, boolean selected, boolean hasFocus) {
+ if (item instanceof Sdk) {
+ Sdk sdk = (Sdk)item;
final PythonSdkFlavor flavor = PythonSdkFlavor.getPlatformIndependentFlavor(sdk.getHomePath());
final Icon icon = flavor != null ? flavor.getIcon() : ((SdkType)sdk.getSdkType()).getIcon();
@@ -54,7 +57,6 @@
else {
name = sdk.getName();
}
-
if (PythonSdkType.isInvalid(sdk)) {
setText("[invalid] " + name);
setIcon(wrapIconWithWarningDecorator(icon));
@@ -63,17 +65,22 @@
setText("[incomplete] " + name);
setIcon(wrapIconWithWarningDecorator(icon));
}
+ else if (sdk instanceof PyDetectedSdk){
+ setText(name);
+ setIcon(IconLoader.getTransparentIcon(icon));
+ }
else {
setText(name);
setIcon(icon);
}
}
- else {
+ else if (SEPARATOR.equals(item))
+ setSeparator();
+ else if (item == null)
setText(myNullText);
- }
}
- private LayeredIcon wrapIconWithWarningDecorator(Icon icon) {
+ private static LayeredIcon wrapIconWithWarningDecorator(Icon icon) {
final LayeredIcon layered = new LayeredIcon(2);
layered.setIcon(icon, 0);
// TODO: Create a separate invalid SDK overlay icon (DSGN-497)
diff --git a/python/src/com/jetbrains/python/sdk/PySdkUtil.java b/python/src/com/jetbrains/python/sdk/PySdkUtil.java
index a0ec72e..4185da7 100644
--- a/python/src/com/jetbrains/python/sdk/PySdkUtil.java
+++ b/python/src/com/jetbrains/python/sdk/PySdkUtil.java
@@ -26,6 +26,7 @@
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.remotesdk.RemoteCredentials;
+import com.intellij.remotesdk2.RemoteSdkAdditionalData2;
import com.intellij.util.ArrayUtil;
import com.intellij.util.containers.HashMap;
import org.jetbrains.annotations.NonNls;
@@ -213,7 +214,7 @@
}
public static boolean isRemote(@Nullable Sdk sdk) {
- return sdk != null && sdk.getSdkAdditionalData() instanceof RemoteCredentials;
+ return sdk != null && sdk.getSdkAdditionalData() instanceof RemoteSdkAdditionalData2;
}
public static boolean isElementInSkeletons(@NotNull final PsiElement element) {
diff --git a/python/src/com/jetbrains/python/sdk/PythonSdkDetailsStep.java b/python/src/com/jetbrains/python/sdk/PythonSdkDetailsStep.java
new file mode 100644
index 0000000..df04801
--- /dev/null
+++ b/python/src/com/jetbrains/python/sdk/PythonSdkDetailsStep.java
@@ -0,0 +1,187 @@
+/*
+ * Copyright 2000-2013 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.sdk;
+
+import com.google.common.collect.Lists;
+import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.application.ModalityState;
+import com.intellij.openapi.options.ShowSettingsUtil;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.projectRoots.Sdk;
+import com.intellij.openapi.projectRoots.SdkAdditionalData;
+import com.intellij.openapi.projectRoots.impl.ProjectJdkImpl;
+import com.intellij.openapi.projectRoots.impl.SdkConfigurationUtil;
+import com.intellij.openapi.ui.DialogWrapper;
+import com.intellij.openapi.ui.Messages;
+import com.intellij.openapi.ui.popup.*;
+import com.intellij.openapi.ui.popup.util.BaseListPopupStep;
+import com.intellij.util.NullableConsumer;
+import com.jetbrains.python.remote.PythonRemoteInterpreterManager;
+import com.jetbrains.python.sdk.flavors.PythonSdkFlavor;
+import org.jetbrains.annotations.Nullable;
+
+import javax.swing.*;
+import java.awt.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+public class PythonSdkDetailsStep extends BaseListPopupStep<String> {
+ private static DialogWrapper myMore;
+ private final Project myProject;
+ private final Component myOwnerComponent;
+ private final Sdk[] myExistingSdks;
+ private final NullableConsumer<Sdk> myCallback;
+
+ private static final String LOCAL = "Add Local";
+ private static final String REMOTE = "Add Remote";
+ private static final String VIRTUALENV = "Create VirtualEnv";
+ private static final String MORE = "More...";
+
+ public static void show(final Project project,
+ final Sdk[] existingSdks,
+ DialogWrapper moreDialog,
+ JComponent ownerComponent, final Point popupPoint,
+ final boolean showMore,
+ final NullableConsumer<Sdk> callback) {
+ myMore = moreDialog;
+ final ListPopupStep sdkHomesStep = new PythonSdkDetailsStep(project, ownerComponent, existingSdks, showMore, callback);
+ final ListPopup popup = JBPopupFactory.getInstance().createListPopup(sdkHomesStep);
+ popup.showInScreenCoordinates(ownerComponent, popupPoint);
+ }
+
+ public PythonSdkDetailsStep(Project project,
+ Component ownerComponent,
+ Sdk[] existingSdks,
+ boolean showMore,
+ NullableConsumer<Sdk> callback) {
+ super(null, getAvailableOptions(showMore));
+ myProject = project;
+ myOwnerComponent = ownerComponent;
+ myExistingSdks = existingSdks;
+ myCallback = callback;
+ }
+
+ private static List<String> getAvailableOptions(boolean showMore) {
+ final List<String> options = new ArrayList<String>();
+ options.add(LOCAL);
+ if (PythonRemoteInterpreterManager.getInstance() != null) {
+ options.add(REMOTE);
+ }
+ options.add(VIRTUALENV);
+
+ if (showMore) {
+ options.add(MORE);
+ }
+ return options;
+ }
+
+ @Nullable
+ @Override
+ public ListSeparator getSeparatorAbove(String value) {
+ return MORE.equals(value) ? new ListSeparator() : null;
+ }
+
+ private void optionSelected(final String selectedValue) {
+ if (LOCAL.equals(selectedValue)) {
+ createLocalSdk();
+ }
+ else if (REMOTE.equals(selectedValue)) {
+ createRemoteSdk();
+ }
+ else if (VIRTUALENV.equals(selectedValue)) {
+ createVirtualEnvSdk();
+ }
+ else {
+ myMore.show();
+ }
+ }
+
+ private void createLocalSdk() {
+ ApplicationManager.getApplication().invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ SdkConfigurationUtil.createSdk(myProject, myExistingSdks, myCallback, false, PythonSdkType.getInstance());
+ }
+ }, ModalityState.any());
+ }
+
+ private void createRemoteSdk() {
+ PythonRemoteInterpreterManager remoteInterpreterManager = PythonRemoteInterpreterManager.getInstance();
+ if (remoteInterpreterManager != null) {
+ remoteInterpreterManager.addRemoteSdk(myProject, myOwnerComponent, Lists.newArrayList(myExistingSdks), myCallback);
+ }
+ else {
+ Messages.showErrorDialog("The Remote Hosts Access plugin is missing. Please enable the plugin in " +
+ ShowSettingsUtil.getSettingsMenuName() +
+ " | Plugins.", "Add Remote Interpreter");
+ }
+ }
+
+ private void createVirtualEnvSdk() {
+ CreateVirtualEnvDialog.VirtualEnvCallback callback = new CreateVirtualEnvDialog.VirtualEnvCallback() {
+ @Override
+ public void virtualEnvCreated(Sdk sdk, boolean associateWithProject) {
+ PythonSdkType.setupSdkPaths(sdk, myProject, null);
+ if (associateWithProject) {
+ SdkAdditionalData additionalData = sdk.getSdkAdditionalData();
+ if (additionalData == null) {
+ additionalData = new PythonSdkAdditionalData(PythonSdkFlavor.getFlavor(sdk.getHomePath()));
+ ((ProjectJdkImpl)sdk).setSdkAdditionalData(additionalData);
+ }
+ ((PythonSdkAdditionalData)additionalData).associateWithProject(myProject);
+ }
+ myCallback.consume(sdk);
+ }
+ };
+
+ final CreateVirtualEnvDialog dialog;
+ final List<Sdk> allSdks = Lists.newArrayList(myExistingSdks);
+
+ final List<PythonSdkFlavor> flavors = PythonSdkFlavor.getApplicableFlavors(false);
+ for (PythonSdkFlavor flavor : flavors) {
+ final Collection<String> strings = flavor.suggestHomePaths();
+ for (String string : strings) {
+ allSdks.add(new PyDetectedSdk(string));
+ }
+ }
+
+ if (myProject != null) {
+ dialog = new CreateVirtualEnvDialog(myProject, allSdks, null);
+ }
+ else {
+ dialog = new CreateVirtualEnvDialog(myOwnerComponent, allSdks, null);
+ }
+ dialog.show();
+ if (dialog.isOK()) {
+ dialog.createVirtualEnv(allSdks, callback);
+ }
+ }
+
+ @Override
+ public boolean canBeHidden(String value) {
+ return true;
+ }
+
+ @Override
+ public PopupStep onChosen(final String selectedValue, boolean finalChoice) {
+ return doFinalStep(new Runnable() {
+ public void run() {
+ optionSelected(selectedValue);
+ }
+ });
+ }
+}
diff --git a/python/src/com/jetbrains/python/sdk/PythonSdkType.java b/python/src/com/jetbrains/python/sdk/PythonSdkType.java
index 65d8082..6aa0c6d 100644
--- a/python/src/com/jetbrains/python/sdk/PythonSdkType.java
+++ b/python/src/com/jetbrains/python/sdk/PythonSdkType.java
@@ -21,19 +21,14 @@
import com.intellij.facet.FacetConfiguration;
import com.intellij.facet.FacetManager;
import com.intellij.ide.DataManager;
-import com.intellij.notification.Notification;
-import com.intellij.notification.NotificationListener;
-import com.intellij.notification.NotificationType;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.application.Application;
import com.intellij.openapi.application.ApplicationManager;
-import com.intellij.openapi.application.ModalityState;
import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleUtilCore;
-import com.intellij.openapi.options.ShowSettingsUtil;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.progress.Task;
@@ -50,11 +45,14 @@
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.CharFilter;
import com.intellij.openapi.util.text.StringUtil;
-import com.intellij.openapi.vfs.*;
+import com.intellij.openapi.vfs.JarFileSystem;
+import com.intellij.openapi.vfs.LocalFileSystem;
+import com.intellij.openapi.vfs.VfsUtilCore;
+import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement;
-import com.intellij.remotesdk.RemoteSdkData;
-import com.intellij.remotesdk.RemoteSdkDataHolder;
-import com.intellij.ui.awt.RelativePoint;
+import com.intellij.reference.SoftReference;
+import com.intellij.remotesdk.RemoteSdkCredentials;
+import com.intellij.remotesdk.RemoteSdkCredentialsHolder;
import com.intellij.util.ArrayUtil;
import com.intellij.util.Consumer;
import com.intellij.util.NullableConsumer;
@@ -78,10 +76,10 @@
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
-import javax.swing.event.HyperlinkEvent;
import java.awt.*;
import java.io.File;
import java.io.FilenameFilter;
+import java.io.IOException;
import java.lang.ref.WeakReference;
import java.util.*;
import java.util.List;
@@ -149,6 +147,10 @@
@NonNls
@Nullable
public String suggestHomePath() {
+ final String pythonFromPath = findPythonInPath();
+ if (pythonFromPath != null) {
+ return pythonFromPath;
+ }
for (PythonSdkFlavor flavor : PythonSdkFlavor.getApplicableFlavors()) {
TreeSet<String> candidates = createVersionSet();
candidates.addAll(flavor.suggestHomePaths());
@@ -161,6 +163,23 @@
return null;
}
+ @Nullable
+ private static String findPythonInPath() {
+ final String defaultCommand = SystemInfo.isWindows ? "python.exe" : "python";
+ final String path = System.getenv("PATH");
+ for (String root : path.split(File.pathSeparator)) {
+ final File file = new File(root, defaultCommand);
+ if (file.exists()) {
+ try {
+ return file.getCanonicalPath();
+ }
+ catch (IOException ignored) {
+ }
+ }
+ }
+ return null;
+ }
+
@Override
public Collection<String> suggestHomePaths() {
List<String> candidates = new ArrayList<String>();
@@ -260,15 +279,18 @@
public void showCustomCreateUI(SdkModel sdkModel, final JComponent parentComponent, final Consumer<Sdk> sdkCreatedCallback) {
Project project = CommonDataKeys.PROJECT.getData(DataManager.getInstance().getDataContext(parentComponent));
- InterpreterPathChooser.show(project, sdkModel.getSdks(), RelativePoint.getCenterOf(parentComponent), true, new NullableConsumer<Sdk>() {
- @Override
- public void consume(@Nullable Sdk sdk) {
- if (sdk != null) {
- sdk.putUserData(SDK_CREATOR_COMPONENT_KEY, new WeakReference<Component>(parentComponent));
- sdkCreatedCallback.consume(sdk);
+ final Point point = parentComponent.getMousePosition();
+ SwingUtilities.convertPointToScreen(point, parentComponent);
+ PythonSdkDetailsStep
+ .show(project, sdkModel.getSdks(), null, parentComponent, point, false, new NullableConsumer<Sdk>() {
+ @Override
+ public void consume(@Nullable Sdk sdk) {
+ if (sdk != null) {
+ sdk.putUserData(SDK_CREATOR_COMPONENT_KEY, new WeakReference<Component>(parentComponent));
+ sdkCreatedCallback.consume(sdk);
+ }
}
- }
- });
+ });
}
public static boolean isVirtualEnv(Sdk sdk) {
@@ -406,15 +428,16 @@
return null;
}
- public void saveAdditionalData(final SdkAdditionalData additionalData, final Element additional) {
+ @Override
+ public void saveAdditionalData(@NotNull final SdkAdditionalData additionalData, @NotNull final Element additional) {
if (additionalData instanceof PythonSdkAdditionalData) {
((PythonSdkAdditionalData)additionalData).save(additional);
}
}
@Override
- public SdkAdditionalData loadAdditionalData(final Sdk currentSdk, final Element additional) {
- if (RemoteSdkDataHolder.isRemoteSdk(currentSdk.getHomePath())) {
+ public SdkAdditionalData loadAdditionalData(@NotNull final Sdk currentSdk, final Element additional) {
+ if (RemoteSdkCredentialsHolder.isRemoteSdk(currentSdk.getHomePath())) {
PythonRemoteInterpreterManager manager = PythonRemoteInterpreterManager.getInstance();
if (manager != null) {
return manager.loadRemoteSdkData(currentSdk, additional);
@@ -423,42 +446,12 @@
return PythonSdkAdditionalData.load(currentSdk, additional);
}
- private boolean switchPathToInterpreter(Sdk currentSdk, String... variants) {
- File sdk_file = new File(currentSdk.getHomePath());
- final String sdk_name = currentSdk.getName();
- boolean success = false;
- for (String interpreter : variants) {
- File binary = interpreter.startsWith("/") ? new File(interpreter) : new File(sdk_file, interpreter);
- if (binary.exists()) {
- if (currentSdk instanceof SdkModificator) {
- final SdkModificator sdk_as_modificator = (SdkModificator)currentSdk;
- sdk_as_modificator.setHomePath(binary.getPath());
- sdk_as_modificator.setName(suggestSdkName(currentSdk.getName(), binary.getAbsolutePath()));
- //setupSdkPaths(currentSdk);
- success = true;
- break;
- }
- }
- }
- if (!success) {
- ApplicationManager.getApplication().invokeLater(new Runnable() {
- public void run() {
- Messages.showWarningDialog(
- "Failed to convert Python SDK '" + sdk_name + "'\nplease delete and re-create it",
- "Converting Python SDK"
- );
- }
- }, ModalityState.NON_MODAL);
- }
- return success;
- }
-
@Nullable
public static String findSkeletonsPath(Sdk sdk) {
final String[] urls = sdk.getRootProvider().getUrls(BUILTIN_ROOT_TYPE);
for (String url : urls) {
if (url.contains(SKELETON_DIR_NAME)) {
- return VfsUtil.urlToPath(url);
+ return VfsUtilCore.urlToPath(url);
}
}
return null;
@@ -495,11 +488,8 @@
public void setupSdkPaths(@NotNull final Sdk sdk) {
final Project project;
- Component ownerComponent = null;
final WeakReference<Component> ownerComponentRef = sdk.getUserData(SDK_CREATOR_COMPONENT_KEY);
- if (ownerComponentRef != null) {
- ownerComponent = ownerComponentRef.get();
- }
+ Component ownerComponent = SoftReference.dereference(ownerComponentRef);
if (ownerComponent != null) {
project = CommonDataKeys.PROJECT.getData(DataManager.getInstance().getDataContext(ownerComponent));
}
@@ -532,57 +522,46 @@
LOG.error("For refreshing skeletons of remote SDK, either project or owner component must be specified");
}
final ProgressManager progressManager = ProgressManager.getInstance();
- final Ref<Boolean> success = new Ref<Boolean>();
- success.set(true);
+ final Ref<Boolean> sdkPathsUpdatedRef = new Ref<Boolean>(false);
final Task.Modal setupTask = new Task.Modal(project, "Setting up library files for " + sdk.getName(), false) {
- // TODO: make this a backgroundable task. see #setupSdkPaths(final Sdk sdk) and its modificator handling
public void run(@NotNull final ProgressIndicator indicator) {
sdkModificator.removeAllRoots();
try {
updateSdkRootsFromSysPath(sdk, sdkModificator, indicator);
updateUserAddedPaths(sdk, sdkModificator, indicator);
- if (!ApplicationManager.getApplication().isUnitTestMode()) {
- PySkeletonRefresher.refreshSkeletonsOfSdk(project, ownerComponent,
- getSkeletonsPath(PathManager.getSystemPath(), sdk.getHomePath()),
- null, sdk
- );
- PythonSdkUpdater.getInstance().markAlreadyUpdated(sdk.getHomePath());
- }
+ PythonSdkUpdater.getInstance().markAlreadyUpdated(sdk.getHomePath());
+ sdkPathsUpdatedRef.set(true);
}
- catch (InvalidSdkException e) {
- if (!isInvalid(sdk)) {
- LOG.warn(e);
- final Notification notification = createInvalidSdkNotification(project);
- notification.notify(project);
- }
+ catch (InvalidSdkException ignored) {
}
}
};
progressManager.run(setupTask);
- return success.get();
- }
-
- @NotNull
- public static Notification createInvalidSdkNotification(@Nullable final Project project) {
- String message = "Cannot run the project interpreter.";
- if (project != null && !project.isDisposed()) {
- message += " <a href=\"xxx\">Configure...</a>";
+ final Boolean sdkPathsUpdated = sdkPathsUpdatedRef.get();
+ final Application application = ApplicationManager.getApplication();
+ if (sdkPathsUpdated && !application.isUnitTestMode()) {
+ application.invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ progressManager.run(new Task.Backgroundable(project, PyBundle.message("sdk.gen.updating.skels"), false) {
+ @Override
+ public void run(@NotNull ProgressIndicator indicator) {
+ try {
+ final String skeletonsPath = getSkeletonsPath(PathManager.getSystemPath(), sdk.getHomePath());
+ PySkeletonRefresher.refreshSkeletonsOfSdk(project, ownerComponent, skeletonsPath, null, sdk);
+ }
+ catch (InvalidSdkException e) {
+ // If the SDK is invalid, the user should worry about the SDK itself, not about skeletons generation errors
+ if (!isInvalid(sdk)) {
+ LOG.error(e);
+ }
+ }
+ }
+ });
+ }
+ });
}
- return new Notification("xxx",
- "Invalid Project Interpreter",
- message,
- NotificationType.ERROR,
- new NotificationListener() {
- @Override
- public void hyperlinkUpdate(@NotNull Notification notification,
- @NotNull HyperlinkEvent event) {
- if (project != null && !project.isDisposed()) {
- final ShowSettingsUtil settings = ShowSettingsUtil.getInstance();
- settings.showSettingsDialog(project, "Project Interpreter");
- }
- notification.expire();
- }
- });
+ return sdkPathsUpdated;
}
/**
@@ -959,9 +938,9 @@
}
public static boolean isIncompleteRemote(Sdk sdk) {
- if (sdk.getSdkAdditionalData() instanceof RemoteSdkData) {
+ if (sdk.getSdkAdditionalData() instanceof RemoteSdkCredentials) {
//noinspection ConstantConditions
- if (!((RemoteSdkData)sdk.getSdkAdditionalData()).isInitialized()) {
+ if (!((RemoteSdkCredentials)sdk.getSdkAdditionalData()).isInitialized()) {
return true;
}
}
diff --git a/python/src/com/jetbrains/python/sdk/PythonSdkUpdater.java b/python/src/com/jetbrains/python/sdk/PythonSdkUpdater.java
index fc0d798..2cc749f 100644
--- a/python/src/com/jetbrains/python/sdk/PythonSdkUpdater.java
+++ b/python/src/com/jetbrains/python/sdk/PythonSdkUpdater.java
@@ -15,7 +15,6 @@
*/
package com.jetbrains.python.sdk;
-import com.intellij.notification.Notification;
import com.intellij.openapi.application.Application;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
@@ -115,9 +114,7 @@
}
catch (InvalidSdkException e) {
if (!PythonSdkType.isInvalid(sdk)) {
- LOG.warn(e);
- final Notification notification = PythonSdkType.createInvalidSdkNotification(myProject);
- notification.notify(myProject);
+ LOG.error(e);
}
}
myAlreadyUpdated.add(sdk.getHomePath());
diff --git a/python/src/com/jetbrains/python/sdk/flavors/MacPythonSdkFlavor.java b/python/src/com/jetbrains/python/sdk/flavors/MacPythonSdkFlavor.java
index 780effe..5d241b6 100644
--- a/python/src/com/jetbrains/python/sdk/flavors/MacPythonSdkFlavor.java
+++ b/python/src/com/jetbrains/python/sdk/flavors/MacPythonSdkFlavor.java
@@ -16,6 +16,7 @@
package com.jetbrains.python.sdk.flavors;
import com.intellij.openapi.vfs.LocalFileSystem;
+import com.intellij.openapi.vfs.VFileProperty;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.newvfs.NewVirtualFile;
@@ -57,7 +58,7 @@
if (binDir != null && binDir.isDirectory()) {
for (String name : POSSIBLE_BINARY_NAMES) {
final VirtualFile child = binDir.findChild(name);
- if (child != null) {
+ if (child != null && !child.is(VFileProperty.SYMLINK)) {
candidates.add(child.getPath());
break;
}
diff --git a/python/src/com/jetbrains/python/sdk/flavors/PythonSdkFlavor.java b/python/src/com/jetbrains/python/sdk/flavors/PythonSdkFlavor.java
index 60fa802..07c8e1c 100644
--- a/python/src/com/jetbrains/python/sdk/flavors/PythonSdkFlavor.java
+++ b/python/src/com/jetbrains/python/sdk/flavors/PythonSdkFlavor.java
@@ -72,6 +72,10 @@
}
public static List<PythonSdkFlavor> getApplicableFlavors() {
+ return getApplicableFlavors(true);
+ }
+
+ public static List<PythonSdkFlavor> getApplicableFlavors(boolean addPlatformIndependent) {
List<PythonSdkFlavor> result = new ArrayList<PythonSdkFlavor>();
if (SystemInfo.isWindows) {
@@ -84,7 +88,8 @@
result.add(UnixPythonSdkFlavor.INSTANCE);
}
- result.addAll(getPlatformIndependentFlavors());
+ if (addPlatformIndependent)
+ result.addAll(getPlatformIndependentFlavors());
return result;
}
diff --git a/python/src/com/jetbrains/python/sdk/flavors/UnixPythonSdkFlavor.java b/python/src/com/jetbrains/python/sdk/flavors/UnixPythonSdkFlavor.java
index c28587c..2440661 100644
--- a/python/src/com/jetbrains/python/sdk/flavors/UnixPythonSdkFlavor.java
+++ b/python/src/com/jetbrains/python/sdk/flavors/UnixPythonSdkFlavor.java
@@ -16,6 +16,7 @@
package com.jetbrains.python.sdk.flavors;
import com.intellij.openapi.vfs.LocalFileSystem;
+import com.intellij.openapi.vfs.VFileProperty;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.newvfs.NewVirtualFile;
@@ -47,14 +48,15 @@
if (rootDir instanceof NewVirtualFile) {
((NewVirtualFile)rootDir).markDirty();
}
- rootDir.refresh(false, false);
+ rootDir.refresh(true, false);
VirtualFile[] suspects = rootDir.getChildren();
for (VirtualFile child : suspects) {
if (!child.isDirectory()) {
final String childName = child.getName();
for (String name : NAMES) {
if (childName.startsWith(name)) {
- if (!childName.endsWith("-config") && !childName.startsWith("pythonw")) {
+ if (!childName.endsWith("-config") && !childName.startsWith("pythonw") &&
+ !childName.endsWith("m") && !child.is(VFileProperty.SYMLINK)) {
candidates.add(child.getPath());
}
break;
diff --git a/python/src/com/jetbrains/python/sdk/flavors/VirtualEnvSdkFlavor.java b/python/src/com/jetbrains/python/sdk/flavors/VirtualEnvSdkFlavor.java
index 5bdecd7..b9de2e2 100644
--- a/python/src/com/jetbrains/python/sdk/flavors/VirtualEnvSdkFlavor.java
+++ b/python/src/com/jetbrains/python/sdk/flavors/VirtualEnvSdkFlavor.java
@@ -83,7 +83,7 @@
public static Collection<String> findInDirectory(VirtualFile rootDir) {
List<String> candidates = new ArrayList<String>();
if (rootDir != null) {
- rootDir.refresh(false, false);
+ rootDir.refresh(true, false);
VirtualFile[] suspects = rootDir.getChildren();
for (VirtualFile child : suspects) {
if (child.isDirectory()) {
diff --git a/python/src/com/jetbrains/python/sdk/flavors/WinPythonSdkFlavor.java b/python/src/com/jetbrains/python/sdk/flavors/WinPythonSdkFlavor.java
index 2c45c83..9de862f 100644
--- a/python/src/com/jetbrains/python/sdk/flavors/WinPythonSdkFlavor.java
+++ b/python/src/com/jetbrains/python/sdk/flavors/WinPythonSdkFlavor.java
@@ -20,6 +20,7 @@
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.newvfs.NewVirtualFile;
+import com.jetbrains.python.PythonHelpersLocator;
import java.io.File;
import java.util.Collection;
@@ -39,6 +40,7 @@
public Collection<String> suggestHomePaths() {
Set<String> candidates = new TreeSet<String>();
findInCandidatePaths(candidates, "python.exe", "jython.bat", "pypy.exe");
+ candidates.add(PythonHelpersLocator.getHelpersRoot().getParent());
return candidates;
}
@@ -75,7 +77,7 @@
if (rootVDir instanceof NewVirtualFile) {
((NewVirtualFile)rootVDir).markDirty();
}
- rootVDir.refresh(false, false);
+ rootVDir.refresh(true, false);
for (VirtualFile dir : rootVDir.getChildren()) {
if (dir.isDirectory() && dir.getName().toLowerCase().startsWith(dir_prefix)) {
VirtualFile python_exe = dir.findChild(exe_name);
diff --git a/python/src/com/jetbrains/python/sdk/skeletons/PySkeletonRefresher.java b/python/src/com/jetbrains/python/sdk/skeletons/PySkeletonRefresher.java
index c9454fb..077ced3 100644
--- a/python/src/com/jetbrains/python/sdk/skeletons/PySkeletonRefresher.java
+++ b/python/src/com/jetbrains/python/sdk/skeletons/PySkeletonRefresher.java
@@ -41,6 +41,7 @@
import com.intellij.util.io.ZipUtil;
import com.jetbrains.python.PyBundle;
import com.jetbrains.python.PyNames;
+import com.jetbrains.python.codeInsight.userSkeletons.PyUserSkeletonsUtil;
import com.jetbrains.python.packaging.PyExternalProcessException;
import com.jetbrains.python.packaging.PyPackageManager;
import com.jetbrains.python.packaging.PyPackageManagerImpl;
@@ -91,6 +92,8 @@
private static final Pattern FROM_LINE_V2 = Pattern.compile("# from (.*)$");
private static final Pattern BY_LINE_V2 = Pattern.compile("# by generator (.*)$");
+ private static int ourGeneratingCount = 0;
+
private String myExtraSyspath;
private VirtualFile myPregeneratedSkeletons;
private int myGeneratorVersion;
@@ -103,6 +106,14 @@
refreshSkeletonsOfSdk(project, null, PythonSdkType.findSkeletonsPath(sdk), new Ref<Boolean>(false), sdk);
}
+ public static synchronized boolean isGeneratingSkeletons() {
+ return ourGeneratingCount > 0;
+ }
+
+ private static synchronized void changeGeneratingSkeletons(int increment) {
+ ourGeneratingCount += increment;
+ }
+
public static void refreshSkeletonsOfSdk(@Nullable Project project,
Component ownerComponent,
String skeletonsPath,
@@ -120,16 +131,23 @@
LOG.info("Refreshing skeletons for " + homePath);
SkeletonVersionChecker checker = new SkeletonVersionChecker(0); // this default version won't be used
final PySkeletonRefresher refresher = new PySkeletonRefresher(project, ownerComponent, sdk, skeletonsPath, indicator);
- List<String> sdkErrors = refresher.regenerateSkeletons(checker, migrationFlag);
- if (sdkErrors.size() > 0) {
- String sdkName = sdk.getName();
- List<String> knownErrors = errors.get(sdkName);
- if (knownErrors == null) {
- errors.put(sdkName, sdkErrors);
+
+ changeGeneratingSkeletons(1);
+ try {
+ List<String> sdkErrors = refresher.regenerateSkeletons(checker, migrationFlag);
+ if (sdkErrors.size() > 0) {
+ String sdkName = sdk.getName();
+ List<String> knownErrors = errors.get(sdkName);
+ if (knownErrors == null) {
+ errors.put(sdkName, sdkErrors);
+ }
+ else {
+ knownErrors.addAll(sdkErrors);
+ }
}
- else {
- knownErrors.addAll(sdkErrors);
- }
+ }
+ finally {
+ changeGeneratingSkeletons(-1);
}
}
if (failedSdks.size() > 0 || errors.size() > 0) {
@@ -207,13 +225,14 @@
final VirtualFile[] classDirs = sdk.getRootProvider().getFiles(OrderRootType.CLASSES);
final StringBuilder builder = new StringBuilder("");
int countAddedPaths = 0;
+ final VirtualFile userSkeletonsDir = PyUserSkeletonsUtil.getUserSkeletonsDirectory();
for (VirtualFile file : classDirs) {
if (countAddedPaths > 0) {
builder.append(File.pathSeparator);
}
if (file.isInLocalFileSystem()) {
final String pathname = file.getPath();
- if (pathname != null && !pathname.equals(skeletonsPath)) {
+ if (pathname != null && !pathname.equals(skeletonsPath) && !file.equals(userSkeletonsDir)) {
builder.append(pathname);
countAddedPaths += 1;
}
@@ -248,6 +267,7 @@
final String skeletonsPath = getSkeletonsPath();
final File skeletonsDir = new File(skeletonsPath);
if (!skeletonsDir.exists()) {
+ //noinspection ResultOfMethodCallIgnored
skeletonsDir.mkdirs();
}
final String readablePath = FileUtil.getLocationRelativeToUserHome(homePath);
@@ -427,7 +447,7 @@
reader.close();
}
}
- catch (IOException e) {
+ catch (IOException ignored) {
}
return null;
}
diff --git a/python/src/com/jetbrains/python/spellchecker/PythonSpellcheckerStrategy.java b/python/src/com/jetbrains/python/spellchecker/PythonSpellcheckerStrategy.java
index 4a0a59d..b24e53c 100644
--- a/python/src/com/jetbrains/python/spellchecker/PythonSpellcheckerStrategy.java
+++ b/python/src/com/jetbrains/python/spellchecker/PythonSpellcheckerStrategy.java
@@ -15,6 +15,7 @@
*/
package com.jetbrains.python.spellchecker;
+import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiElement;
import com.intellij.spellchecker.inspections.PlainTextSplitter;
@@ -26,7 +27,6 @@
import com.jetbrains.python.inspections.PyStringFormatParser;
import com.jetbrains.python.psi.PyBinaryExpression;
import com.jetbrains.python.psi.PyStringLiteralExpression;
-import com.jetbrains.python.psi.impl.PyStringLiteralExpressionImpl;
import org.jetbrains.annotations.NotNull;
import java.util.List;
@@ -41,9 +41,11 @@
Splitter splitter = PlainTextSplitter.getInstance();
String text = element.getText();
if (text.indexOf('\\') >= 0) {
- MyTextRangeConsumer textRangeConsumer = new MyTextRangeConsumer(element, consumer);
- ((PyStringLiteralExpressionImpl) element).iterateCharacterRanges(textRangeConsumer);
- textRangeConsumer.processCurrentToken(); // process last token
+ for (Pair<TextRange, String> fragment : element.getDecodedFragments()) {
+ final String value = fragment.getSecond();
+ consumer.consumeToken(element, value, false, fragment.getFirst().getStartOffset(), TextRange.allOf(value),
+ PlainTextSplitter.getInstance());
+ }
}
else if (text.startsWith("u") || text.startsWith("U") || text.startsWith("r") || text.startsWith("R") ||
text.startsWith("b") || text.startsWith("B")) {
@@ -57,40 +59,6 @@
consumer.consumeToken(element, splitter);
}
}
-
- private static class MyTextRangeConsumer implements PyStringLiteralExpressionImpl.TextRangeConsumer {
- private final StringBuilder myCurrentToken = new StringBuilder();
- private final PyStringLiteralExpression myElement;
- private final TokenConsumer myTokenConsumer;
- private int myTokenStart;
-
- public MyTextRangeConsumer(PyStringLiteralExpression element, TokenConsumer tokenConsumer) {
- myElement = element;
- myTokenConsumer = tokenConsumer;
- }
-
- @Override
- public boolean process(int startOffset, int endOffset, String value) {
- if (endOffset == startOffset + 1) {
- if (myCurrentToken.length() == 0) {
- myTokenStart = startOffset;
- }
- myCurrentToken.append(value);
- }
- else {
- if (myCurrentToken.length() > 0) {
- processCurrentToken();
- myCurrentToken.setLength(0);
- }
- }
- return true;
- }
-
- private void processCurrentToken() {
- String token = myCurrentToken.toString();
- myTokenConsumer.consumeToken(myElement, token, false, myTokenStart, TextRange.allOf(token), PlainTextSplitter.getInstance());
- }
- }
}
private static class FormatStringTokenizer extends Tokenizer<PyStringLiteralExpression> {
diff --git a/python/src/com/jetbrains/python/structureView/PyInheritedMembersFilter.java b/python/src/com/jetbrains/python/structureView/PyInheritedMembersFilter.java
index b61edd6..2b5483f 100644
--- a/python/src/com/jetbrains/python/structureView/PyInheritedMembersFilter.java
+++ b/python/src/com/jetbrains/python/structureView/PyInheritedMembersFilter.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -64,11 +64,13 @@
AllIcons.Hierarchy.Supertypes);
}
+ @NotNull
@Override
public String getCheckBoxText() {
return IdeBundle.message("file.structure.toggle.show.inherited");
}
+ @NotNull
@Override
public Shortcut[] getShortcut() {
return KeymapManager.getInstance().getActiveKeymap().getShortcuts("FileStructurePopup");
diff --git a/python/src/com/jetbrains/python/structureView/PyStructureViewElement.java b/python/src/com/jetbrains/python/structureView/PyStructureViewElement.java
index 1f58a73..93c44f7 100644
--- a/python/src/com/jetbrains/python/structureView/PyStructureViewElement.java
+++ b/python/src/com/jetbrains/python/structureView/PyStructureViewElement.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -27,6 +27,7 @@
import com.jetbrains.python.PyNames;
import com.jetbrains.python.psi.*;
import icons.PythonIcons;
+import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
@@ -120,6 +121,7 @@
return name != null ? name.hashCode() : 0;
}
+ @NotNull
public StructureViewTreeElement[] getChildren() {
final Collection<StructureViewTreeElement> children = new ArrayList<StructureViewTreeElement>();
for (PyElement e : getElementChildren(myElement)) {
@@ -220,7 +222,7 @@
if (element instanceof PyClass || element instanceof PyFunction) {
return true;
}
- if (!(parent instanceof PyClass) && (element instanceof PyTargetExpression) && ((PyTargetExpression)element).getQualifier() == null) {
+ if (!(parent instanceof PyClass) && (element instanceof PyTargetExpression) && !((PyTargetExpression)element).isQualified()) {
PsiElement e = element.getParent();
if (e instanceof PyAssignmentStatement) {
e = e.getParent();
@@ -232,6 +234,7 @@
return false;
}
+ @NotNull
@Override
public ItemPresentation getPresentation() {
return new ColoredItemPresentation() {
diff --git a/python/src/com/jetbrains/python/structureView/PyStructureViewModel.java b/python/src/com/jetbrains/python/structureView/PyStructureViewModel.java
index 6621792..3e8e4f1 100644
--- a/python/src/com/jetbrains/python/structureView/PyStructureViewModel.java
+++ b/python/src/com/jetbrains/python/structureView/PyStructureViewModel.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -66,7 +66,7 @@
}
@Override
- public boolean isAutoExpand(StructureViewTreeElement element) {
+ public boolean isAutoExpand(@NotNull StructureViewTreeElement element) {
return element.getValue() instanceof PsiFile;
}
diff --git a/python/src/com/jetbrains/python/testing/PyTestFrameworkService.java b/python/src/com/jetbrains/python/testing/PyTestFrameworkService.java
new file mode 100644
index 0000000..8eac088
--- /dev/null
+++ b/python/src/com/jetbrains/python/testing/PyTestFrameworkService.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2000-2013 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.testing;
+
+import com.intellij.openapi.components.*;
+import com.intellij.util.containers.HashMap;
+import com.intellij.util.xmlb.XmlSerializerUtil;
+
+import java.util.Map;
+
+@State(
+ name = "PyTestFrameworkService",
+ storages = {
+ @Storage(
+ file = StoragePathMacros.APP_CONFIG + "/other.xml"
+ )}
+)
+public class PyTestFrameworkService implements PersistentStateComponent<PyTestFrameworkService> {
+
+ public static PyTestFrameworkService getInstance() {
+ return ServiceManager.getService(PyTestFrameworkService.class);
+ }
+
+ public Map<String, Boolean> SDK_TO_PYTEST = new HashMap<String, Boolean>();
+ public Map <String, Boolean> SDK_TO_NOSETEST = new HashMap<String, Boolean>();
+ public Map <String, Boolean> SDK_TO_ATTEST = new HashMap<String, Boolean>();
+
+ @Override
+ public PyTestFrameworkService getState() {
+ return this;
+ }
+
+ @Override
+ public void loadState(PyTestFrameworkService state) {
+ XmlSerializerUtil.copyBean(state, this);
+ }
+}
diff --git a/python/src/com/jetbrains/python/testing/PythonTestCommandLineStateBase.java b/python/src/com/jetbrains/python/testing/PythonTestCommandLineStateBase.java
index ef16a65..39e4e96 100644
--- a/python/src/com/jetbrains/python/testing/PythonTestCommandLineStateBase.java
+++ b/python/src/com/jetbrains/python/testing/PythonTestCommandLineStateBase.java
@@ -106,9 +106,10 @@
return cmd;
}
- private void setWorkingDirectory(@NotNull final GeneralCommandLine cmd) {
- if (!StringUtil.isEmptyOrSpaces(myConfiguration.getWorkingDirectory())) {
- cmd.setWorkDirectory(myConfiguration.getWorkingDirectory());
+ protected void setWorkingDirectory(@NotNull final GeneralCommandLine cmd) {
+ final String workingDirectory = myConfiguration.getWorkingDirectory();
+ if (!StringUtil.isEmptyOrSpaces(workingDirectory)) {
+ cmd.setWorkDirectory(workingDirectory);
}
else if (myConfiguration instanceof AbstractPythonTestRunConfiguration) {
final String folderName = ((AbstractPythonTestRunConfiguration)myConfiguration).getFolderName();
diff --git a/python/src/com/jetbrains/python/testing/PythonTestConfigurationProducer.java b/python/src/com/jetbrains/python/testing/PythonTestConfigurationProducer.java
index 3875cd3..8c28e08 100644
--- a/python/src/com/jetbrains/python/testing/PythonTestConfigurationProducer.java
+++ b/python/src/com/jetbrains/python/testing/PythonTestConfigurationProducer.java
@@ -18,6 +18,7 @@
import com.google.common.collect.Sets;
import com.intellij.execution.Location;
import com.intellij.execution.actions.ConfigurationContext;
+import com.intellij.execution.actions.ConfigurationFromContext;
import com.intellij.execution.actions.RunConfigurationProducer;
import com.intellij.execution.configurations.ConfigurationFactory;
import com.intellij.facet.Facet;
@@ -39,6 +40,7 @@
import com.jetbrains.python.PythonModuleTypeBase;
import com.jetbrains.python.facet.PythonFacetSettings;
import com.jetbrains.python.psi.*;
+import com.jetbrains.python.run.PythonRunConfigurationProducer;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -254,4 +256,8 @@
return PythonUnitTestUtil.getTestCaseClassesFromFile(pyFile);
}
+ @Override
+ public boolean isPreferredConfiguration(ConfigurationFromContext self, ConfigurationFromContext other) {
+ return other.isProducedBy(PythonTestConfigurationProducer.class) || other.isProducedBy(PythonRunConfigurationProducer.class);
+ }
}
\ No newline at end of file
diff --git a/python/src/com/jetbrains/python/testing/PythonUnitTestTestIdUrlProvider.java b/python/src/com/jetbrains/python/testing/PythonUnitTestTestIdUrlProvider.java
index d0dd2c2..a53828a 100644
--- a/python/src/com/jetbrains/python/testing/PythonUnitTestTestIdUrlProvider.java
+++ b/python/src/com/jetbrains/python/testing/PythonUnitTestTestIdUrlProvider.java
@@ -16,22 +16,12 @@
package com.jetbrains.python.testing;
import com.intellij.execution.Location;
-import com.intellij.execution.PsiLocation;
-import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.project.Project;
-import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
-import com.intellij.openapi.vfs.VirtualFile;
-import com.intellij.psi.PsiFile;
import com.intellij.testIntegration.TestLocationProvider;
-import com.jetbrains.python.psi.PyClass;
-import com.jetbrains.python.psi.PyFunction;
-import com.jetbrains.python.psi.stubs.PyClassNameIndex;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -55,55 +45,20 @@
// parse path as [ns.]*fileName.className[.methodName]
if (listSize == 2) {
- return findLocations(project, list.get(0), list.get(1), null);
+ return PythonUnitTestUtil.findLocations(project, list.get(0), list.get(1), null);
}
if (listSize > 2) {
final String className = list.get(listSize - 2);
final String methodName = list.get(listSize - 1);
String fileName = list.get(listSize - 3);
- final List<Location> locations = findLocations(project, fileName, className, methodName);
+ final List<Location> locations = PythonUnitTestUtil.findLocations(project, fileName, className, methodName);
if (locations.size() > 0) {
return locations;
}
- return findLocations(project, list.get(listSize-2), list.get(listSize-1), null);
+ return PythonUnitTestUtil.findLocations(project, list.get(listSize-2), list.get(listSize-1), null);
}
return Collections.emptyList();
}
-
- private static List<Location> findLocations(Project project,
- String fileName,
- String className,
- @Nullable String methodName) {
- if (fileName.indexOf("%") >= 0) {
- fileName = fileName.substring(0, fileName.lastIndexOf("%"));
- }
-
- final List<Location> locations = new ArrayList<Location>();
- for (PyClass cls : PyClassNameIndex.find(className, project, false)) {
- ProgressManager.checkCanceled();
-
- final PsiFile containingFile = cls.getContainingFile();
- final VirtualFile virtualFile = containingFile.getVirtualFile();
- final String clsFileName = virtualFile == null? containingFile.getName() : virtualFile.getPath();
- final String clsFileNameWithoutExt = FileUtil.getNameWithoutExtension(clsFileName);
- if (!clsFileNameWithoutExt.endsWith(fileName)) {
- continue;
- }
- if (methodName == null) {
- locations.add(new PsiLocation<PyClass>(project, cls));
- }
- else {
- final PyFunction method = cls.findMethodByName(methodName, true);
- if (method == null) {
- continue;
- }
-
- locations.add(new PsiLocation<PyFunction>(project, method));
- }
- }
-
- return locations;
- }
}
diff --git a/python/src/com/jetbrains/python/testing/PythonUnitTestUtil.java b/python/src/com/jetbrains/python/testing/PythonUnitTestUtil.java
index d0b4ea1..0830897 100644
--- a/python/src/com/jetbrains/python/testing/PythonUnitTestUtil.java
+++ b/python/src/com/jetbrains/python/testing/PythonUnitTestUtil.java
@@ -17,14 +17,25 @@
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
+import com.intellij.execution.Location;
+import com.intellij.execution.PsiLocation;
import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.progress.ProgressManager;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.io.FileUtil;
+import com.intellij.openapi.vfs.LocalFileSystem;
+import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
+import com.intellij.psi.PsiManager;
import com.intellij.util.containers.Stack;
import com.jetbrains.python.psi.*;
+import com.jetbrains.python.psi.stubs.PyClassNameIndex;
+import com.jetbrains.python.psi.stubs.PyFunctionNameIndex;
import com.jetbrains.python.psi.types.PyClassLikeType;
import com.jetbrains.python.psi.types.TypeEvalContext;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
import java.util.*;
import java.util.regex.Pattern;
@@ -93,7 +104,7 @@
}
}
for (PyFunction cls : file.getTopLevelFunctions()) {
- if (isTestCaseFunction(cls)) {
+ if (isTestCaseFunction(cls, false)) {
result.add(cls);
}
}
@@ -115,9 +126,9 @@
}
if (checkAssert) {
boolean hasAssert = hasAssertOrYield(function.getStatementList());
- if (!hasAssert) return false;
+ if (hasAssert) return true;
}
- return true;
+ return false;
}
private static boolean hasAssertOrYield(PyStatementList list) {
@@ -148,7 +159,9 @@
return true;
}
String clsName = cls.getQualifiedName();
- String[] names = clsName.split("\\.");
+ String[] names = new String[0];
+ if (clsName != null)
+ names = clsName.split("\\.");
clsName = names[names.length - 1];
if (TEST_MATCH_PATTERN.matcher(clsName).find()) {
return true;
@@ -157,4 +170,62 @@
}
return false;
}
+
+ public static List<Location> findLocations(@NotNull final Project project,
+ @NotNull String fileName,
+ @Nullable String className,
+ @Nullable String methodName) {
+ if (fileName.contains("%")) {
+ fileName = fileName.substring(0, fileName.lastIndexOf("%"));
+ }
+ final List<Location> locations = new ArrayList<Location>();
+ if (methodName == null && className == null) {
+ final VirtualFile virtualFile = LocalFileSystem.getInstance().findFileByPath(fileName);
+ if (virtualFile == null) return locations;
+ final PsiFile psiFile = PsiManager.getInstance(project).findFile(virtualFile);
+ if (psiFile != null)
+ locations.add(new PsiLocation<PsiFile>(project, psiFile));
+ }
+
+ if (className != null) {
+ for (PyClass cls : PyClassNameIndex.find(className, project, false)) {
+ ProgressManager.checkCanceled();
+
+ final PsiFile containingFile = cls.getContainingFile();
+ final VirtualFile virtualFile = containingFile.getVirtualFile();
+ final String clsFileName = virtualFile == null? containingFile.getName() : virtualFile.getPath();
+ final String clsFileNameWithoutExt = FileUtil.getNameWithoutExtension(clsFileName);
+ if (!clsFileNameWithoutExt.endsWith(fileName)) {
+ continue;
+ }
+ if (methodName == null) {
+ locations.add(new PsiLocation<PyClass>(project, cls));
+ }
+ else {
+ final PyFunction method = cls.findMethodByName(methodName, true);
+ if (method == null) {
+ continue;
+ }
+
+ locations.add(new PsiLocation<PyFunction>(project, method));
+ }
+ }
+ }
+ else if (methodName != null) {
+ for (PyFunction function : PyFunctionNameIndex.find(methodName, project)) {
+ ProgressManager.checkCanceled();
+ if (function.getContainingClass() == null) {
+ final PsiFile containingFile = function.getContainingFile();
+ final VirtualFile virtualFile = containingFile.getVirtualFile();
+ final String clsFileName = virtualFile == null? containingFile.getName() : virtualFile.getPath();
+ final String clsFileNameWithoutExt = FileUtil.getNameWithoutExtension(clsFileName);
+ if (!clsFileNameWithoutExt.endsWith(fileName)) {
+ continue;
+ }
+ locations.add(new PsiLocation<PyFunction>(project, function));
+ }
+ }
+ }
+ return locations;
+ }
}
diff --git a/python/src/com/jetbrains/python/testing/TestRunnerService.java b/python/src/com/jetbrains/python/testing/TestRunnerService.java
index 32bcc26..3301909 100644
--- a/python/src/com/jetbrains/python/testing/TestRunnerService.java
+++ b/python/src/com/jetbrains/python/testing/TestRunnerService.java
@@ -34,7 +34,7 @@
)
public class TestRunnerService implements PersistentStateComponent<TestRunnerService> {
private List<String> myConfigurations = new ArrayList<String>();
- public String PROJECT_TEST_RUNNER = "";
+ public String PROJECT_TEST_RUNNER = PythonTestConfigurationsModel.PYTHONS_UNITTEST_NAME;
public TestRunnerService() {
myConfigurations.add(PythonTestConfigurationsModel.PYTHONS_UNITTEST_NAME);
diff --git a/python/src/com/jetbrains/python/testing/VFSTestFrameworkListener.java b/python/src/com/jetbrains/python/testing/VFSTestFrameworkListener.java
index 7130b1a..69d1ce0 100644
--- a/python/src/com/jetbrains/python/testing/VFSTestFrameworkListener.java
+++ b/python/src/com/jetbrains/python/testing/VFSTestFrameworkListener.java
@@ -16,22 +16,22 @@
package com.jetbrains.python.testing;
import com.intellij.openapi.application.ApplicationManager;
-import com.intellij.openapi.components.*;
+import com.intellij.openapi.components.ApplicationComponent;
+import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.roots.OrderRootType;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
+import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileManager;
import com.intellij.openapi.vfs.newvfs.BulkFileListener;
import com.intellij.openapi.vfs.newvfs.events.VFileContentChangeEvent;
import com.intellij.openapi.vfs.newvfs.events.VFileEvent;
-import com.intellij.util.containers.HashMap;
import com.intellij.util.messages.MessageBus;
import com.intellij.util.ui.update.MergingUpdateQueue;
import com.intellij.util.ui.update.Update;
-import com.intellij.util.xmlb.XmlSerializerUtil;
import com.jetbrains.python.PyNames;
import com.jetbrains.python.packaging.PyExternalProcessException;
import com.jetbrains.python.packaging.PyPackageManager;
@@ -41,25 +41,17 @@
import org.jetbrains.annotations.NotNull;
import java.util.List;
-import java.util.Map;
/**
* User: catherine
*/
-@State(
- name = "VFSTestFrameworkListener",
- storages = {
- @Storage(
- file = StoragePathMacros.APP_CONFIG + "/other.xml"
- )}
-)
-public class VFSTestFrameworkListener implements ApplicationComponent, PersistentStateComponent<VFSTestFrameworkListener> {
-
+public class VFSTestFrameworkListener implements ApplicationComponent {
private static final Logger LOG = Logger.getInstance("#com.jetbrains.python.testing.VFSTestFrameworkListener");
-
private static final MergingUpdateQueue myQueue = new MergingUpdateQueue("TestFrameworkChecker", 5000, true, null);
+ private PyTestFrameworkService myService;
public VFSTestFrameworkListener() {
+ myService = PyTestFrameworkService.getInstance();
MessageBus messageBus = ApplicationManager.getApplication().getMessageBus();
messageBus.connect().subscribe(VirtualFileManager.VFS_CHANGES, new BulkFileListener.Adapter() {
@Override
@@ -76,8 +68,9 @@
if (PySdkUtil.isRemote(sdk)) {
continue;
}
- for (String root : sdk.getRootProvider().getUrls(OrderRootType.CLASSES)) {
- if (path.contains(root)) {
+ for (VirtualFile virtualFile : sdk.getRootProvider().getFiles(OrderRootType.CLASSES)) {
+ String root = virtualFile.getCanonicalPath();
+ if (root != null && path.contains(root)) {
if (containsNose) {
updateTestFrameworks(sdk, PyNames.NOSE_TEST);
return;
@@ -152,26 +145,12 @@
return ServiceManager.getService(VFSTestFrameworkListener.class);
}
- public Map<String, Boolean> SDK_TO_PYTEST = new HashMap<String, Boolean>();
- public Map <String, Boolean> SDK_TO_NOSETEST = new HashMap<String, Boolean>();
- public Map <String, Boolean> SDK_TO_ATTEST = new HashMap<String, Boolean>();
-
- @Override
- public VFSTestFrameworkListener getState() {
- return this;
- }
-
- @Override
- public void loadState(VFSTestFrameworkListener state) {
- XmlSerializerUtil.copyBean(state, this);
- }
-
public void pyTestInstalled(boolean installed, String sdkHome) {
- SDK_TO_PYTEST.put(sdkHome, installed);
+ myService.SDK_TO_PYTEST.put(sdkHome, installed);
}
public boolean isPyTestInstalled(final Sdk sdk) {
- Boolean isInstalled = SDK_TO_PYTEST.get(sdk.getHomePath());
+ Boolean isInstalled = myService.SDK_TO_PYTEST.get(sdk.getHomePath());
if (isInstalled == null) {
updateTestFrameworks(sdk, PyNames.PY_TEST);
return true;
@@ -180,11 +159,11 @@
}
public void noseTestInstalled(boolean installed, String sdkHome) {
- SDK_TO_NOSETEST.put(sdkHome, installed);
+ myService.SDK_TO_NOSETEST.put(sdkHome, installed);
}
public boolean isNoseTestInstalled(final Sdk sdk) {
- Boolean isInstalled = SDK_TO_NOSETEST.get(sdk.getHomePath());
+ Boolean isInstalled = myService.SDK_TO_NOSETEST.get(sdk.getHomePath());
if (isInstalled == null) {
updateTestFrameworks(sdk, PyNames.NOSE_TEST);
return true;
@@ -193,11 +172,11 @@
}
public void atTestInstalled(boolean installed, String sdkHome) {
- SDK_TO_ATTEST.put(sdkHome, installed);
+ myService.SDK_TO_ATTEST.put(sdkHome, installed);
}
public boolean isAtTestInstalled(final Sdk sdk) {
- Boolean isInstalled = SDK_TO_ATTEST.get(sdk.getHomePath());
+ Boolean isInstalled = myService.SDK_TO_ATTEST.get(sdk.getHomePath());
if (isInstalled == null) {
updateTestFrameworks(sdk, PyNames.AT_TEST);
return true;
diff --git a/python/src/com/jetbrains/python/testing/doctest/PythonDocTestConfigurationProducer.java b/python/src/com/jetbrains/python/testing/doctest/PythonDocTestConfigurationProducer.java
index cfa2be7..e3eef29 100644
--- a/python/src/com/jetbrains/python/testing/doctest/PythonDocTestConfigurationProducer.java
+++ b/python/src/com/jetbrains/python/testing/doctest/PythonDocTestConfigurationProducer.java
@@ -21,6 +21,8 @@
import com.intellij.execution.Location;
import com.intellij.openapi.module.Module;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiRecursiveElementVisitor;
@@ -85,4 +87,10 @@
}
}
}
+
+ @Override
+ protected boolean isTestFolder(@NotNull VirtualFile virtualFile, @NotNull Project project) {
+ return false;
+ }
+
}
\ No newline at end of file
diff --git a/python/src/com/jetbrains/python/testing/nosetest/PythonNoseTestConfigurationProducer.java b/python/src/com/jetbrains/python/testing/nosetest/PythonNoseTestConfigurationProducer.java
index 5cf9784..b7dc704 100644
--- a/python/src/com/jetbrains/python/testing/nosetest/PythonNoseTestConfigurationProducer.java
+++ b/python/src/com/jetbrains/python/testing/nosetest/PythonNoseTestConfigurationProducer.java
@@ -47,6 +47,6 @@
@Override
protected boolean isTestFunction(@NotNull final PyFunction pyFunction, @Nullable final AbstractPythonTestRunConfiguration configuration) {
- return PythonUnitTestUtil.isTestCaseFunction(pyFunction, false);
+ return PythonUnitTestUtil.isTestCaseFunction(pyFunction, true);
}
}
\ No newline at end of file
diff --git a/python/src/com/jetbrains/python/testing/nosetest/PythonNoseTestUrlProvider.java b/python/src/com/jetbrains/python/testing/nosetest/PythonNoseTestUrlProvider.java
new file mode 100644
index 0000000..2c7787c
--- /dev/null
+++ b/python/src/com/jetbrains/python/testing/nosetest/PythonNoseTestUrlProvider.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2000-2013 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.testing.nosetest;
+
+import com.intellij.execution.Location;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.text.StringUtil;
+import com.intellij.testIntegration.TestLocationProvider;
+import com.jetbrains.python.testing.PythonUnitTestUtil;
+import org.jetbrains.annotations.NonNls;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Collections;
+import java.util.List;
+
+public class PythonNoseTestUrlProvider implements TestLocationProvider {
+ @NonNls
+ private static final String PROTOCOL_ID = "python_nosetestid";
+
+ @NotNull
+ public List<Location> getLocation(@NotNull final String protocolId, @NotNull final String path,
+ final Project project) {
+ if (!PROTOCOL_ID.equals(protocolId)) {
+ return Collections.emptyList();
+ }
+
+ final List<String> list = StringUtil.split(path, ".");
+ if (list.isEmpty()) {
+ return Collections.emptyList();
+ }
+ final int listSize = list.size();
+
+ // parse path as [ns.]*fileName[.className][.methodName]
+ if (listSize == 2) {
+ final List<Location> classes = PythonUnitTestUtil.findLocations(project, list.get(0), list.get(1), null);
+ if (classes.size() > 0)
+ return classes;
+ final List<Location> functions = PythonUnitTestUtil.findLocations(project, list.get(0), null, list.get(1));
+ if (functions.size() > 0)
+ return functions;
+ }
+
+ if (listSize > 2) {
+ final String className = list.get(listSize - 2);
+ final String methodName = list.get(listSize - 1);
+
+ String fileName = list.get(listSize - 3);
+ List<Location> locations = PythonUnitTestUtil.findLocations(project, fileName, className, methodName);
+ if (locations.size() > 0) {
+ return locations;
+ }
+ locations = PythonUnitTestUtil.findLocations(project, list.get(listSize - 2), list.get(listSize - 1), null);
+ if (locations.size() > 0) {
+ return locations;
+ }
+ final List<Location> functions = PythonUnitTestUtil.findLocations(project, list.get(listSize - 2), null, list.get(listSize - 1));
+ if (functions.size() > 0)
+ return functions;
+ }
+ return PythonUnitTestUtil.findLocations(project, project.getBasePath() + "/" + StringUtil.join(list, "/") + ".py", null, null);
+ }
+}
diff --git a/python/src/com/jetbrains/python/testing/pytest/PyTestRunnableScriptFilter.java b/python/src/com/jetbrains/python/testing/pytest/PyTestRunnableScriptFilter.java
deleted file mode 100644
index 036663b..0000000
--- a/python/src/com/jetbrains/python/testing/pytest/PyTestRunnableScriptFilter.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright 2000-2013 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.jetbrains.python.testing.pytest;
-
-import com.intellij.execution.Location;
-import com.intellij.openapi.module.Module;
-import com.intellij.openapi.projectRoots.Sdk;
-import com.intellij.psi.PsiFile;
-import com.jetbrains.python.psi.PyClass;
-import com.jetbrains.python.psi.PyFile;
-import com.jetbrains.python.psi.PyFunction;
-import com.jetbrains.python.psi.PyRecursiveElementVisitor;
-import com.jetbrains.python.run.RunnableScriptFilter;
-import com.jetbrains.python.sdk.PythonSdkType;
-import com.jetbrains.python.testing.PythonTestConfigurationsModel;
-import com.jetbrains.python.testing.TestRunnerService;
-import com.jetbrains.python.testing.VFSTestFrameworkListener;
-import org.jetbrains.annotations.NotNull;
-
-/**
- * @author yole
- */
-public class PyTestRunnableScriptFilter implements RunnableScriptFilter {
- public boolean isRunnableScript(PsiFile script, @NotNull Module module, Location location) {
- return isPyTestInstalled(module) && isPyTestScript(script) &&
- TestRunnerService.getInstance(module).getProjectConfiguration().
- equals(PythonTestConfigurationsModel.PY_TEST_NAME);
- }
-
- private static boolean isPyTestInstalled(Module module) {
- // TODO[yole] add caching to avoid disk I/O in findPyTestRunner()?
- final Sdk sdk = PythonSdkType.findPythonSdk(module);
- return sdk != null && VFSTestFrameworkListener.getInstance().isPyTestInstalled(sdk);
- }
-
- public static boolean isPyTestScript(PsiFile script) {
- if (!(script instanceof PyFile)) {
- return false;
- }
- PyTestVisitor testVisitor = new PyTestVisitor();
- script.accept(testVisitor);
- return testVisitor.isTestsFound();
- }
-
- private static class PyTestVisitor extends PyRecursiveElementVisitor {
- private boolean myTestsFound = false;
-
- public boolean isTestsFound() {
- return myTestsFound;
- }
-
- @Override
- public void visitPyFunction(PyFunction node) {
- super.visitPyFunction(node);
- String name = node.getName();
- if (name != null && name.startsWith("test")) {
- myTestsFound = true;
- }
- }
-
- @Override
- public void visitPyClass(PyClass node) {
- super.visitPyClass(node);
- String name = node.getName();
- if (name != null && name.startsWith("Test")) {
- myTestsFound = true;
- }
- }
- }
-}
diff --git a/python/src/com/jetbrains/python/validation/CompatibilityVisitor.java b/python/src/com/jetbrains/python/validation/CompatibilityVisitor.java
index d63d8c7..f48af7f 100644
--- a/python/src/com/jetbrains/python/validation/CompatibilityVisitor.java
+++ b/python/src/com/jetbrains/python/validation/CompatibilityVisitor.java
@@ -51,6 +51,7 @@
AVAILABLE_PREFIXES.put(LanguageLevel.PYTHON31, Sets.newHashSet("R", "B", "BR"));
AVAILABLE_PREFIXES.put(LanguageLevel.PYTHON32, Sets.newHashSet("R", "B", "BR"));
AVAILABLE_PREFIXES.put(LanguageLevel.PYTHON33, Sets.newHashSet("R", "U", "B", "BR", "RB"));
+ AVAILABLE_PREFIXES.put(LanguageLevel.PYTHON34, Sets.newHashSet("R", "U", "B", "BR", "RB"));
}
public CompatibilityVisitor(List<LanguageLevel> versionsToProcess) {
diff --git a/python/src/com/jetbrains/python/validation/HighlightingAnnotator.java b/python/src/com/jetbrains/python/validation/HighlightingAnnotator.java
index 728a6e1..cc6d445 100644
--- a/python/src/com/jetbrains/python/validation/HighlightingAnnotator.java
+++ b/python/src/com/jetbrains/python/validation/HighlightingAnnotator.java
@@ -37,7 +37,7 @@
@Override
public void visitPyReferenceExpression(PyReferenceExpression node) {
final String referencedName = node.getReferencedName();
- if (node.getQualifier() == null && referencedName != null) {
+ if (!node.isQualified() && referencedName != null) {
PyFunction function = PsiTreeUtil.getParentOfType(node, PyFunction.class);
if (function != null) {
final PyNamedParameter element = function.getParameterList().findParameterByName(referencedName);
diff --git a/python/src/com/jetbrains/python/validation/Pep8ExternalAnnotator.java b/python/src/com/jetbrains/python/validation/Pep8ExternalAnnotator.java
index 6292d8e..c115ba4 100644
--- a/python/src/com/jetbrains/python/validation/Pep8ExternalAnnotator.java
+++ b/python/src/com/jetbrains/python/validation/Pep8ExternalAnnotator.java
@@ -52,6 +52,7 @@
import com.jetbrains.python.codeInsight.imports.OptimizeImportsQuickFix;
import com.jetbrains.python.inspections.PyPep8Inspection;
import com.jetbrains.python.inspections.quickfix.ReformatFix;
+import com.jetbrains.python.quickFixes.RemoveTrailingBlankLinesFix;
import com.jetbrains.python.sdk.PreferredSdkComparator;
import com.jetbrains.python.sdk.PySdkUtil;
import com.jetbrains.python.sdk.PythonSdkType;
@@ -253,6 +254,9 @@
if (problem.myCode.equals("E401")) {
annotation.registerUniversalFix(new OptimizeImportsQuickFix(), null, null);
}
+ else if (problem.myCode.equals("W391")) {
+ annotation.registerUniversalFix(new RemoveTrailingBlankLinesFix(), null, null);
+ }
else {
annotation.registerUniversalFix(new ReformatFix(), null, null);
}
diff --git a/python/src/com/jetbrains/python/validation/PyBuiltinAnnotator.java b/python/src/com/jetbrains/python/validation/PyBuiltinAnnotator.java
index 7e69319..417c362 100644
--- a/python/src/com/jetbrains/python/validation/PyBuiltinAnnotator.java
+++ b/python/src/com/jetbrains/python/validation/PyBuiltinAnnotator.java
@@ -36,7 +36,7 @@
final String name = node.getName();
if (name == null) return;
boolean highlighted_as_attribute = highlightAsAttribute(node, name);
- if (! highlighted_as_attribute && node.getQualifier() == null) {
+ if (! highlighted_as_attribute && !node.isQualified()) {
// things like len()
ResolveResult[] resolved = node.getReference().multiResolve(false); // constructors, etc may give multiple results...
if (resolved.length > 0) {
@@ -71,7 +71,7 @@
if (PyNames.UnderscoredAttributes.contains(name) || PyNames.getBuiltinMethods(languageLevel).containsKey(name)) {
// things like __len__
if (
- (node.getQualifier() != null) // foo.__len__
+ node.isQualified() // foo.__len__
|| (PyUtil.getConcealingParent(node) instanceof PyClass) // class Foo: ... __len__ = myLenImpl
) {
final ASTNode astNode = node.getNode();
diff --git a/python/src/com/jetbrains/python/validation/PyMultiplePsiFilesVisitorFilter.java b/python/src/com/jetbrains/python/validation/PyMultiplePsiFilesVisitorFilter.java
new file mode 100644
index 0000000..9b6e6b7
--- /dev/null
+++ b/python/src/com/jetbrains/python/validation/PyMultiplePsiFilesVisitorFilter.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.validation;
+
+import com.intellij.psi.MultiplePsiFilesPerDocumentFileViewProvider;
+import com.intellij.psi.PsiFile;
+import com.jetbrains.python.inspections.PythonVisitorFilter;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * @author vlan
+ */
+public class PyMultiplePsiFilesVisitorFilter implements PythonVisitorFilter {
+ @Override
+ public boolean isSupported(@NotNull Class visitorClass, @NotNull PsiFile file) {
+ if (visitorClass == StringLiteralQuotesAnnotator.class &&
+ file.getViewProvider() instanceof MultiplePsiFilesPerDocumentFileViewProvider) {
+ return false;
+ }
+ return true;
+ }
+}
diff --git a/python/src/com/jetbrains/python/validation/UnsupportedFeaturesUtil.java b/python/src/com/jetbrains/python/validation/UnsupportedFeaturesUtil.java
index d8e4cae..2945de4 100644
--- a/python/src/com/jetbrains/python/validation/UnsupportedFeaturesUtil.java
+++ b/python/src/com/jetbrains/python/validation/UnsupportedFeaturesUtil.java
@@ -82,6 +82,7 @@
ALL_LANGUAGE_LEVELS.add(LanguageLevel.PYTHON31.toString());
ALL_LANGUAGE_LEVELS.add(LanguageLevel.PYTHON32.toString());
ALL_LANGUAGE_LEVELS.add(LanguageLevel.PYTHON33.toString());
+ ALL_LANGUAGE_LEVELS.add(LanguageLevel.PYTHON34.toString());
}
private static void fillMaps() throws IOException {
diff --git a/python/src/com/jetbrains/python/vp/Creator.java b/python/src/com/jetbrains/python/vp/Creator.java
new file mode 100644
index 0000000..3d5bffe
--- /dev/null
+++ b/python/src/com/jetbrains/python/vp/Creator.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.vp;
+
+
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * Creates view and presenter allowing them to have links to each other.
+ * Implement it and pass to {@link com.jetbrains.python.vp.ViewPresenterUtils#linkViewWithPresenterAndLaunch(Class, Class, Creator)}
+ *
+ * @author Ilya.Kazakevich
+ * @param <V> view interface
+ * @param <P> presenter interface
+ */
+public interface Creator<V, P extends Presenter> {
+
+ /**
+ * Create presenter
+ *
+ * @param view for that presenter
+ * @return presenter
+ */
+ @NotNull
+ P createPresenter(@NotNull V view);
+
+ /**
+ * Creates view
+ *
+ * @param presenter for this view
+ * @return view
+ */
+ @NotNull
+ V createView(@NotNull P presenter);
+
+}
diff --git a/python/src/com/jetbrains/python/vp/Presenter.java b/python/src/com/jetbrains/python/vp/Presenter.java
new file mode 100644
index 0000000..251aff6
--- /dev/null
+++ b/python/src/com/jetbrains/python/vp/Presenter.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.vp;
+
+
+/**
+ * Interface each presenter should implement
+ * @author Ilya.Kazakevich
+ */
+public interface Presenter {
+ /**
+ * Launches dialog. Presenter should fetch data and start view.
+ * TODO: Say you run initand show and launch
+ */
+ void launch();
+}
diff --git a/python/src/com/jetbrains/python/vp/PresenterHandler.java b/python/src/com/jetbrains/python/vp/PresenterHandler.java
new file mode 100644
index 0000000..e610604
--- /dev/null
+++ b/python/src/com/jetbrains/python/vp/PresenterHandler.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.vp;
+
+import org.jetbrains.annotations.NotNull;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+
+/**
+ * Wrapper for presenter.
+ * @author Ilya.Kazakevich
+ * @param <C> presenter class
+ */
+class PresenterHandler<C> implements InvocationHandler {
+ /**
+ * Presenter, created by user with {@link com.jetbrains.python.vp.Creator#createPresenter(Object)}
+ */
+ private C realPresenter;
+
+ void setRealPresenter(@NotNull C realPresenter) {
+ this.realPresenter = realPresenter;
+ }
+
+ @Override
+ public Object invoke(Object proxy, final Method method, final Object[] args) throws Throwable {
+ /**
+ * TODO: Implement async call.
+ * The idea is void methods marked with @Async should be called in background thread.
+ * That will allow presenter to be agnostic about EDT
+ */
+ return method.invoke(realPresenter, args);
+ }
+}
diff --git a/python/src/com/jetbrains/python/vp/ViewHandler.java b/python/src/com/jetbrains/python/vp/ViewHandler.java
new file mode 100644
index 0000000..84e9963
--- /dev/null
+++ b/python/src/com/jetbrains/python/vp/ViewHandler.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2000-2013 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.vp;
+
+import com.google.common.base.Preconditions;
+import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.application.ModalityState;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+/**
+ * Wrapper for view.
+ * @author Ilya.Kazakevich
+ * @param <C> view class
+ */
+class ViewHandler<C> implements InvocationHandler {
+ /**
+ * Real view, created by user using {@link com.jetbrains.python.vp.Creator#createView(Presenter)}
+ */
+ private C realView;
+
+ public void setRealView(@NotNull C realView) {
+ this.realView = realView;
+ }
+
+ @Override
+ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+ Preconditions.checkState(realView != null, "Real view not set");
+ Invoker invoker = new Invoker(realView, method, args);
+ ApplicationManager.getApplication().invokeAndWait(invoker, ModalityState.defaultModalityState());
+ if (invoker.exception != null) {
+ throw invoker.exception;
+ }
+ return invoker.result;
+ }
+
+ /**
+ * Class that invokes view methods in appropriate thread
+ */
+ private static class Invoker implements Runnable {
+ @NotNull
+ private final Method method;
+ @Nullable
+ private final Object[] args;
+ @NotNull
+ private final Object target;
+
+ private InvocationTargetException exception;
+ private Object result;
+
+ private Invoker(@NotNull Object target, @NotNull Method method, @Nullable Object[] args) {
+ this.target = target;
+ this.method = method;
+ this.args = args;
+ }
+
+ @Override
+ public void run() {
+ try {
+ result = method.invoke(target, args);
+ }
+ catch (IllegalAccessException e) {
+ throw new IllegalStateException("Method is unaccessible: " + method, e);
+ }
+ catch (InvocationTargetException e) {
+ exception = e;
+ }
+ }
+ }
+}
diff --git a/python/src/com/jetbrains/python/vp/ViewPresenterUtils.java b/python/src/com/jetbrains/python/vp/ViewPresenterUtils.java
new file mode 100644
index 0000000..cfd9677
--- /dev/null
+++ b/python/src/com/jetbrains/python/vp/ViewPresenterUtils.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2000-2013 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.vp;
+
+
+import com.google.common.base.Preconditions;
+import org.jetbrains.annotations.NotNull;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Proxy;
+
+/**
+ * Entry point to package. Use {@link #linkViewWithPresenterAndLaunch(Class, Class, Creator)}
+ * @author Ilya.Kazakevich
+ */
+public final class ViewPresenterUtils {
+ private ViewPresenterUtils() {
+ }
+
+ /**
+ * TODO: Write about do not call anything in constructor
+ * Creates link between view and presenter and launches them using {@link Presenter#launch()}. Be sure to read package info first.
+ *
+ * @param presenterInterface presenter interface
+ * @param viewInterface view interface
+ * @param creator class that handles presenter and view instances actual creation
+ * @param <V> view interface
+ * @param <P> presenter interface
+ */
+ public static <V, P extends Presenter> void linkViewWithPresenterAndLaunch(@NotNull Class<P> presenterInterface,
+ @NotNull Class<V> viewInterface,
+ @NotNull Creator<V, P> creator) {
+ Preconditions.checkArgument(presenterInterface.isInterface(), "Presenter is not interface");
+ Preconditions.checkArgument(viewInterface.isInterface(), "View is not interface");
+
+ //TODO: Use cglib?
+ PresenterHandler<P> presenterHandler = new PresenterHandler<P>();
+ ViewHandler<V> viewHandler = new ViewHandler<V>();
+ V viewProxy = createProxy(viewInterface, viewHandler);
+ P presenterProxy = createProxy(presenterInterface, presenterHandler);
+
+ V realView = creator.createView(presenterProxy);
+ viewHandler.setRealView(realView);
+ P realPresenter = creator.createPresenter(viewProxy);
+ presenterHandler.setRealPresenter(realPresenter);
+ realPresenter.launch();
+ }
+
+
+ @SuppressWarnings("unchecked") //Proxy always returns correct class
+ private static <C> C createProxy(Class<C> clazz, InvocationHandler handler) {
+ assert clazz != null;
+ assert handler != null;
+ return (C)Proxy.newProxyInstance(ViewPresenterUtils.class.getClassLoader(), new Class[]{clazz}, handler);
+ }
+}
diff --git a/python/src/com/jetbrains/python/vp/package-info.java b/python/src/com/jetbrains/python/vp/package-info.java
new file mode 100644
index 0000000..834ca29
--- /dev/null
+++ b/python/src/com/jetbrains/python/vp/package-info.java
@@ -0,0 +1,26 @@
+/**
+ * <h1>Model-view presenter package</h1>
+ * <h2>How to use?</h2>
+ * <p>
+ * <a href="http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93presenter">MVP</a> pattern implementation with only view and presenter for now.
+ * <dl>
+ * <dt>Presenter</dt>
+ * <dd>Handles all business logic and has <strong>no</strong> references to awt/swing, so it is 100% testable</dd>
+ * <dt>View</dt>
+ * <dd>Handles only view: it may import any swing/awt packages but should contain almost no logic, because it is untestable.</dd>
+ * </dl>
+ * One implements <strong>Presenter</strong> and <strong>View</strong>. Both may have links to each other.
+ * You run {@link com.jetbrains.python.vp.ViewPresenterUtils#linkViewWithPresenterAndLaunch(Class, Class, Creator)} to link and launch them.
+ * See its javadoc
+ * </p>
+ * <h2>Threading issues</h2>
+ *
+ * <p>
+ * Presenter and View should be thread-agnostic.
+ * Any call to <strong>view</strong> is invoked in EDT automatically. <br/>
+ * Call to <strong>presenter</strong> may be invoked in background (not implemented yet, see {@link com.jetbrains.python.vp.PresenterHandler})
+ * </p>
+ *
+ * @author Ilya.Kazakevich
+ */
+package com.jetbrains.python.vp;
\ No newline at end of file
diff --git a/python/src/icons/PythonIcons.java b/python/src/icons/PythonIcons.java
index c942e0c..2adb29d 100644
--- a/python/src/icons/PythonIcons.java
+++ b/python/src/icons/PythonIcons.java
@@ -32,6 +32,7 @@
}
public static final Icon Dotnet = load("/icons/com/jetbrains/python/dotnet.png"); // 16x16
+ public static final Icon InterpreterGear = load("/icons/com/jetbrains/python/interpreterGear.png"); // 16x16
public static final Icon Jython = load("/icons/com/jetbrains/python/jython.png"); // 16x16
public static class Nodes {
@@ -48,6 +49,8 @@
public static final Icon Python_24 = load("/icons/com/jetbrains/python/python_24.png"); // 24x24
public static final Icon PythonClosed = load("/icons/com/jetbrains/python/pythonClosed.png"); // 16x16
public static final Icon PythonTests = load("/icons/com/jetbrains/python/pythonTests.png"); // 16x16
+ public static final Icon Skeleton = load("/icons/com/jetbrains/python/skeleton.png"); // 16x16
+ public static final Icon TemplateRoot = load("/icons/com/jetbrains/python/templateRoot.png"); // 16x16
public static final Icon Virtualenv = load("/icons/com/jetbrains/python/virtualenv.png"); // 16x16
}
diff --git a/python/testData/addImport/comment.after.py b/python/testData/addImport/comment.after.py
index 777f480..a816490 100644
--- a/python/testData/addImport/comment.after.py
+++ b/python/testData/addImport/comment.after.py
@@ -1 +1 @@
-from urllib import urlopen, urlencode, unquote_plus # this is a comment
\ No newline at end of file
+from urllib import urlopen, urlencode, unquote_plus # this is a comment
\ No newline at end of file
diff --git a/python/testData/completion/epydocParamTag.py b/python/testData/completion/epydocParamTag.py
index 6323111..e74df8d 100644
--- a/python/testData/completion/epydocParamTag.py
+++ b/python/testData/completion/epydocParamTag.py
@@ -1,2 +1,2 @@
def foo(bar):
- """ @param <caret> """
\ No newline at end of file
+ """ @param b<caret> """
\ No newline at end of file
diff --git a/python/testData/completion/identifiersInPlainDocstring.after.py b/python/testData/completion/identifiersInPlainDocstring.after.py
deleted file mode 100644
index 440570b..0000000
--- a/python/testData/completion/identifiersInPlainDocstring.after.py
+++ /dev/null
@@ -1,2 +0,0 @@
-def foo(bar):
- """ Variable bar """
\ No newline at end of file
diff --git a/python/testData/formatter/alignInCallExpression.py b/python/testData/formatter/alignInCallExpression.py
new file mode 100644
index 0000000..0c1dff1
--- /dev/null
+++ b/python/testData/formatter/alignInCallExpression.py
@@ -0,0 +1,3 @@
+foo(1 +
+ x.
+ call())
\ No newline at end of file
diff --git a/python/testData/formatter/alignInCallExpression_after.py b/python/testData/formatter/alignInCallExpression_after.py
new file mode 100644
index 0000000..48c17a1
--- /dev/null
+++ b/python/testData/formatter/alignInCallExpression_after.py
@@ -0,0 +1,3 @@
+foo(1 +
+ x.
+ call())
\ No newline at end of file
diff --git a/python/testData/formatter/alignInNestedCallInWith.py b/python/testData/formatter/alignInNestedCallInWith.py
new file mode 100644
index 0000000..ccf3783
--- /dev/null
+++ b/python/testData/formatter/alignInNestedCallInWith.py
@@ -0,0 +1,10 @@
+import logging
+from nose.tools import assert_raises_regex
+
+
+def _assert_stuff(i):
+ with assert_raises_regex(
+ logging.INFO,
+ 'Did stuff to {} because of reasons that take up a whole line of text'.format(
+ i.relname)):
+ pass
\ No newline at end of file
diff --git a/python/testData/formatter/alignInNestedCallInWith_after.py b/python/testData/formatter/alignInNestedCallInWith_after.py
new file mode 100644
index 0000000..b64caa7
--- /dev/null
+++ b/python/testData/formatter/alignInNestedCallInWith_after.py
@@ -0,0 +1,10 @@
+import logging
+from nose.tools import assert_raises_regex
+
+
+def _assert_stuff(i):
+ with assert_raises_regex(
+ logging.INFO,
+ 'Did stuff to {} because of reasons that take up a whole line of text'.format(
+ i.relname)):
+ pass
\ No newline at end of file
diff --git a/python/testData/formatter/alignInParameterList.py b/python/testData/formatter/alignInParameterList.py
new file mode 100644
index 0000000..1a79766
--- /dev/null
+++ b/python/testData/formatter/alignInParameterList.py
@@ -0,0 +1,4 @@
+def foo(x=
+ y.
+ call()):
+ pass
\ No newline at end of file
diff --git a/python/testData/formatter/alignInParameterList_after.py b/python/testData/formatter/alignInParameterList_after.py
new file mode 100644
index 0000000..c3291b2
--- /dev/null
+++ b/python/testData/formatter/alignInParameterList_after.py
@@ -0,0 +1,4 @@
+def foo(x=
+ y.
+ call()):
+ pass
\ No newline at end of file
diff --git a/python/testData/formatter/alignInParenthesizedExpression.py b/python/testData/formatter/alignInParenthesizedExpression.py
new file mode 100644
index 0000000..ea97ade
--- /dev/null
+++ b/python/testData/formatter/alignInParenthesizedExpression.py
@@ -0,0 +1,8 @@
+print(1 + (1 + (1
+ +
+ x
+ .calc())
+ +
+ x.
+ calc()
+))
\ No newline at end of file
diff --git a/python/testData/formatter/alignInParenthesizedExpression_after.py b/python/testData/formatter/alignInParenthesizedExpression_after.py
new file mode 100644
index 0000000..868557c
--- /dev/null
+++ b/python/testData/formatter/alignInParenthesizedExpression_after.py
@@ -0,0 +1,8 @@
+print(1 + (1 + (1
+ +
+ x
+ .calc())
+ +
+ x.
+ calc()
+))
\ No newline at end of file
diff --git a/python/testData/formatter/alignListComprehensionInDict.py b/python/testData/formatter/alignListComprehensionInDict.py
new file mode 100644
index 0000000..7b74279
--- /dev/null
+++ b/python/testData/formatter/alignListComprehensionInDict.py
@@ -0,0 +1,5 @@
+def foo():
+ return {field.key: field for key, field in inspect.getmembers(instance)
+ if isinstance(field, QueryableAttribute)
+ and isinstance(field.property, ColumnProperty)
+ or field.foreign_keys}
\ No newline at end of file
diff --git a/python/testData/formatter/alignListComprehensionInDict_after.py b/python/testData/formatter/alignListComprehensionInDict_after.py
new file mode 100644
index 0000000..bcb4c22
--- /dev/null
+++ b/python/testData/formatter/alignListComprehensionInDict_after.py
@@ -0,0 +1,5 @@
+def foo():
+ return {field.key: field for key, field in inspect.getmembers(instance)
+ if isinstance(field, QueryableAttribute)
+ and isinstance(field.property, ColumnProperty)
+ or field.foreign_keys}
\ No newline at end of file
diff --git a/python/testData/formatter/commentAfterBlock.py b/python/testData/formatter/commentAfterBlock.py
new file mode 100644
index 0000000..fd8584a
--- /dev/null
+++ b/python/testData/formatter/commentAfterBlock.py
@@ -0,0 +1,5 @@
+def test():
+ if bar:
+ foo()
+ # comment
+ foobar()
\ No newline at end of file
diff --git a/python/testData/formatter/commentAfterBlock_after.py b/python/testData/formatter/commentAfterBlock_after.py
new file mode 100644
index 0000000..fd8584a
--- /dev/null
+++ b/python/testData/formatter/commentAfterBlock_after.py
@@ -0,0 +1,5 @@
+def test():
+ if bar:
+ foo()
+ # comment
+ foobar()
\ No newline at end of file
diff --git a/python/testData/formatter/commentBetweenClasses_after.py b/python/testData/formatter/commentBetweenClasses_after.py
index b852394..e97c76b 100644
--- a/python/testData/formatter/commentBetweenClasses_after.py
+++ b/python/testData/formatter/commentBetweenClasses_after.py
@@ -2,6 +2,7 @@
def m1(self):
pass
+
# comment about T2
class T2(object):
diff --git a/python/testData/formatter/commentInEmptyTuple.py b/python/testData/formatter/commentInEmptyTuple.py
new file mode 100644
index 0000000..fffda70
--- /dev/null
+++ b/python/testData/formatter/commentInEmptyTuple.py
@@ -0,0 +1,3 @@
+var_name = (
+# comment
+)
\ No newline at end of file
diff --git a/python/testData/formatter/commentInEmptyTuple_after.py b/python/testData/formatter/commentInEmptyTuple_after.py
new file mode 100644
index 0000000..a8572fd
--- /dev/null
+++ b/python/testData/formatter/commentInEmptyTuple_after.py
@@ -0,0 +1,3 @@
+var_name = (
+ # comment
+)
\ No newline at end of file
diff --git a/python/testData/formatter/continuationIndentInIndentingStatement.py b/python/testData/formatter/continuationIndentInIndentingStatement.py
new file mode 100644
index 0000000..38c7910
--- /dev/null
+++ b/python/testData/formatter/continuationIndentInIndentingStatement.py
@@ -0,0 +1,39 @@
+if True \
+ or False:
+ pass
+elif \
+ False:
+ pass
+
+for i in \
+ range(1, 100):
+ pass
+
+with open('file1') as file1, \
+ open('file2') as file2:
+ pass
+
+
+class \
+ A(object):
+ pass
+
+
+def \
+ foo():
+ pass
+
+
+try:
+ pass
+except \
+ AttributeError:
+ pass
+
+while value \
+ in values: # <- missing continuation indent here
+ do_smth()
+
+if (1 + x.
+ value()):
+ pass
\ No newline at end of file
diff --git a/python/testData/formatter/continuationIndentInIndentingStatement2.py b/python/testData/formatter/continuationIndentInIndentingStatement2.py
new file mode 100644
index 0000000..63957fb
--- /dev/null
+++ b/python/testData/formatter/continuationIndentInIndentingStatement2.py
@@ -0,0 +1,4 @@
+def f(value, value1, value2):
+ if value in (
+ value1, value2) or value == 0: # <- missing continuation indent here
+ return False
\ No newline at end of file
diff --git a/python/testData/formatter/continuationIndentInIndentingStatement2_after.py b/python/testData/formatter/continuationIndentInIndentingStatement2_after.py
new file mode 100644
index 0000000..b76f2ac
--- /dev/null
+++ b/python/testData/formatter/continuationIndentInIndentingStatement2_after.py
@@ -0,0 +1,4 @@
+def f(value, value1, value2):
+ if value in (
+ value1, value2) or value == 0: # <- missing continuation indent here
+ return False
\ No newline at end of file
diff --git a/python/testData/formatter/continuationIndentInIndentingStatement_after.py b/python/testData/formatter/continuationIndentInIndentingStatement_after.py
new file mode 100644
index 0000000..be17337
--- /dev/null
+++ b/python/testData/formatter/continuationIndentInIndentingStatement_after.py
@@ -0,0 +1,39 @@
+if True \
+ or False:
+ pass
+elif \
+ False:
+ pass
+
+for i in \
+ range(1, 100):
+ pass
+
+with open('file1') as file1, \
+ open('file2') as file2:
+ pass
+
+
+class \
+ A(object):
+ pass
+
+
+def \
+ foo():
+ pass
+
+
+try:
+ pass
+except \
+ AttributeError:
+ pass
+
+while value \
+ in values: # <- missing continuation indent here
+ do_smth()
+
+if (1 + x.
+ value()):
+ pass
\ No newline at end of file
diff --git a/python/testData/formatter/indentParensInImport.py b/python/testData/formatter/indentParensInImport.py
new file mode 100644
index 0000000..ab20f1b
--- /dev/null
+++ b/python/testData/formatter/indentParensInImport.py
@@ -0,0 +1,3 @@
+from some.module import (
+ thing
+ )
\ No newline at end of file
diff --git a/python/testData/formatter/indentParensInImport_after.py b/python/testData/formatter/indentParensInImport_after.py
new file mode 100644
index 0000000..2ad9216
--- /dev/null
+++ b/python/testData/formatter/indentParensInImport_after.py
@@ -0,0 +1,3 @@
+from some.module import (
+ thing
+)
\ No newline at end of file
diff --git a/python/testData/formatter/twoLinesBetweenTopLevelDeclarationsWithComment.py b/python/testData/formatter/twoLinesBetweenTopLevelDeclarationsWithComment.py
new file mode 100644
index 0000000..c908253
--- /dev/null
+++ b/python/testData/formatter/twoLinesBetweenTopLevelDeclarationsWithComment.py
@@ -0,0 +1,18 @@
+class A(object):
+ pass
+
+# comment
+def one():
+ pass
+
+# comment
+def two():
+ pass
+
+# comment
+class B(object):
+ pass
+
+# comment
+class C(object):
+ pass
\ No newline at end of file
diff --git a/python/testData/formatter/twoLinesBetweenTopLevelDeclarationsWithComment_after.py b/python/testData/formatter/twoLinesBetweenTopLevelDeclarationsWithComment_after.py
new file mode 100644
index 0000000..ba0e697
--- /dev/null
+++ b/python/testData/formatter/twoLinesBetweenTopLevelDeclarationsWithComment_after.py
@@ -0,0 +1,22 @@
+class A(object):
+ pass
+
+
+# comment
+def one():
+ pass
+
+
+# comment
+def two():
+ pass
+
+
+# comment
+class B(object):
+ pass
+
+
+# comment
+class C(object):
+ pass
\ No newline at end of file
diff --git a/python/testData/formatter/wrapBeforeElse_after.py b/python/testData/formatter/wrapBeforeElse_after.py
index 216c191..b818506 100644
--- a/python/testData/formatter/wrapBeforeElse_after.py
+++ b/python/testData/formatter/wrapBeforeElse_after.py
@@ -1,2 +1,2 @@
-id = 1 if looooooooooooooooooooooooong_vaaaaaaaaaaaaaaaar == 'loooooooooooooooong_vaaaaaaaaaaaaaaaaaaaaaaaaaalue' else list(
- 'foo')[0]
\ No newline at end of file
+id = 1 if looooooooooooooooooooooooong_vaaaaaaaaaaaaaaaar == 'loooooooooooooooong_vaaaaaaaaaaaaaaaaaaaaaaaaaalue' else \
+list('foo')[0]
\ No newline at end of file
diff --git a/python/testData/formatter/wrapImports.py b/python/testData/formatter/wrapImports.py
new file mode 100644
index 0000000..e5ab6b4
--- /dev/null
+++ b/python/testData/formatter/wrapImports.py
@@ -0,0 +1 @@
+from common.resources.health import URLHealthCheck, JSONURLHealthCheck, HealthHandler, HealthResult
\ No newline at end of file
diff --git a/python/testData/formatter/wrapImports_after.py b/python/testData/formatter/wrapImports_after.py
new file mode 100644
index 0000000..7a58d05
--- /dev/null
+++ b/python/testData/formatter/wrapImports_after.py
@@ -0,0 +1,2 @@
+from common.resources.health import URLHealthCheck, JSONURLHealthCheck, \
+ HealthHandler, HealthResult
\ No newline at end of file
diff --git a/python/testData/formatter/wrapOnDot.py b/python/testData/formatter/wrapOnDot.py
new file mode 100644
index 0000000..917ec74
--- /dev/null
+++ b/python/testData/formatter/wrapOnDot.py
@@ -0,0 +1,2 @@
+sitesettings = call(settings_manager
+.get_whitelabel_settings_by_site_id(myuser.site_id))
\ No newline at end of file
diff --git a/python/testData/formatter/wrapOnDot_after.py b/python/testData/formatter/wrapOnDot_after.py
new file mode 100644
index 0000000..e42d177
--- /dev/null
+++ b/python/testData/formatter/wrapOnDot_after.py
@@ -0,0 +1,2 @@
+sitesettings = call(settings_manager
+ .get_whitelabel_settings_by_site_id(myuser.site_id))
\ No newline at end of file
diff --git a/python/testData/highlighting/assignmentTargetWith.py b/python/testData/highlighting/assignmentTargetWith.py
index f516b41..f1e6493 100644
--- a/python/testData/highlighting/assignmentTargetWith.py
+++ b/python/testData/highlighting/assignmentTargetWith.py
@@ -1,2 +1,2 @@
-with open("") as <error descr="can't assign to operator">my_<<var</error>:
+with open("") as <error descr="Can't assign to operator">my_<<var</error>:
pass
\ No newline at end of file
diff --git a/python/testData/highlighting/assignmentTargets.py b/python/testData/highlighting/assignmentTargets.py
index 731541d..295cd8f 100644
--- a/python/testData/highlighting/assignmentTargets.py
+++ b/python/testData/highlighting/assignmentTargets.py
@@ -1,31 +1,31 @@
# fail
-<error descr="can't assign to function call">int(1)</error> = 1
+<error descr="Can't assign to function call">int(1)</error> = 1
-<error descr="can't assign to literal">12</error> = 1
+<error descr="Can't assign to literal">12</error> = 1
-<error descr="can't assign to operator">1 + 21</error> = 12
+<error descr="Can't assign to operator">1 + 21</error> = 12
-result = <error descr="can't assign to operator">a < c and c</error> = 4
+result = <error descr="Can't assign to operator">a < c and c</error> = 4
-<error descr="can't assign to ()">()</error> = 123
-<error descr="can't assign to []">[]</error> = 1
-[<error descr="can't assign to literal">1</error>] = 1
-<error descr="can't assign to literal">{}</error> = 1
-<error descr="can't assign to literal">{1, 2, 3}</error> = 1
+<error descr="Can't assign to ()">()</error> = 123
+<error descr="Can't assign to []">[]</error> = 1
+[<error descr="Can't assign to literal">1</error>] = 1
+<error descr="Can't assign to literal">{}</error> = 1
+<error descr="Can't assign to literal">{1, 2, 3}</error> = 1
-(<error descr="can't assign to literal">1</error>,(<error descr="can't assign to literal">2</error>, <error descr="can't assign to literal">3</error>)) = 3,(4,5)
-del <error descr="can't delete literal">1</error>
-del <error descr="can't delete function call">int()</error>
+(<error descr="Can't assign to literal">1</error>,(<error descr="Can't assign to literal">2</error>, <error descr="Can't assign to literal">3</error>)) = 3,(4,5)
+del <error descr="Can't delete literal">1</error>
+del <error descr="Can't delete function call">int()</error>
-for <error descr="can't assign to literal">1</error> in []:
+for <error descr="Can't assign to literal">1</error> in []:
pass
-for (<error descr="can't assign to literal">1</error>,(<error descr="can't assign to literal">2</error>,)) in [12]:
+for (<error descr="Can't assign to literal">1</error>,(<error descr="Can't assign to literal">2</error>,)) in [12]:
pass
-<error descr="augmented assign to dict comprehension not possible">{ x: y for y, x in ((1, 2), (3, 4)) }</error> += 5
-<error descr="can't assign to set comprehension">{ x for x in (1, 2) }</error> = 5
+<error descr="Augmented assign to dict comprehension not possible">{ x: y for y, x in ((1, 2), (3, 4)) }</error> += 5
+<error descr="Can't assign to set comprehension">{ x for x in (1, 2) }</error> = 5
# ok
diff --git a/python/testData/indexing/ModuleNameIndex/ModuleNameIndex_bar/__init__.py b/python/testData/indexing/ModuleNameIndex/ModuleNameIndex_bar/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/python/testData/indexing/ModuleNameIndex/ModuleNameIndex_bar/__init__.py
diff --git a/python/testData/indexing/ModuleNameIndex/ModuleNameIndex_baz.txt b/python/testData/indexing/ModuleNameIndex/ModuleNameIndex_baz.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/python/testData/indexing/ModuleNameIndex/ModuleNameIndex_baz.txt
diff --git a/python/testData/indexing/ModuleNameIndex/ModuleNameIndex_foo.py b/python/testData/indexing/ModuleNameIndex/ModuleNameIndex_foo.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/python/testData/indexing/ModuleNameIndex/ModuleNameIndex_foo.py
diff --git a/python/testData/indexing/ModuleNameIndex/a.py b/python/testData/indexing/ModuleNameIndex/a.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/python/testData/indexing/ModuleNameIndex/a.py
diff --git a/python/testData/inspections/AddCallSuperAnnotations.py b/python/testData/inspections/AddCallSuperAnnotations.py
new file mode 100644
index 0000000..b50ae1b
--- /dev/null
+++ b/python/testData/inspections/AddCallSuperAnnotations.py
@@ -0,0 +1,8 @@
+class Example1:
+ def __init__(self, field1: str):
+ self.field1 = field1
+
+
+class Example2(Example1):
+ def <warning descr="Call to __init__ of super class is missed">__i<caret>nit__</warning>(self): ## Missed call to __init__ of super class
+ pass
\ No newline at end of file
diff --git a/python/testData/inspections/AddCallSuperAnnotations_after.py b/python/testData/inspections/AddCallSuperAnnotations_after.py
new file mode 100644
index 0000000..4bfd08c
--- /dev/null
+++ b/python/testData/inspections/AddCallSuperAnnotations_after.py
@@ -0,0 +1,8 @@
+class Example1:
+ def __init__(self, field1: str):
+ self.field1 = field1
+
+
+class Example2(Example1):
+ def __init__(self, field1):
+ super().__init__(field1)
\ No newline at end of file
diff --git a/python/testData/inspections/DictComprehensionToCall.py b/python/testData/inspections/DictComprehensionToCall.py
new file mode 100644
index 0000000..b360be7
--- /dev/null
+++ b/python/testData/inspections/DictComprehensionToCall.py
@@ -0,0 +1 @@
+var = <warning descr="Python version 2.4, 2.5, 2.6, 3.0 do not support dictionary comprehensions">{k: v for k, v in zip('abc', <caret>range(3)) if k % 2}</warning>
\ No newline at end of file
diff --git a/python/testData/inspections/DictComprehensionToCall_after.py b/python/testData/inspections/DictComprehensionToCall_after.py
new file mode 100644
index 0000000..a71f9ff
--- /dev/null
+++ b/python/testData/inspections/DictComprehensionToCall_after.py
@@ -0,0 +1 @@
+var = dict([(k, v) for k, v in zip('abc', range(3)) if k % 2])
\ No newline at end of file
diff --git a/python/testData/inspections/FieldFromUnusedParameterKeyword.py b/python/testData/inspections/FieldFromUnusedParameterKeyword.py
deleted file mode 100644
index 35851f0..0000000
--- a/python/testData/inspections/FieldFromUnusedParameterKeyword.py
+++ /dev/null
@@ -1,3 +0,0 @@
-class A:
- def __init__(self, <weak_warning descr="Parameter 'foo' value is not used">f<caret>oo=True</weak_warning>):
- print('hello')
\ No newline at end of file
diff --git a/python/testData/inspections/FieldFromUnusedParameterKeyword_after.py b/python/testData/inspections/FieldFromUnusedParameterKeyword_after.py
deleted file mode 100644
index 7e0d662..0000000
--- a/python/testData/inspections/FieldFromUnusedParameterKeyword_after.py
+++ /dev/null
@@ -1,4 +0,0 @@
-class A:
- def __init__(self, foo=True):
- print('hello')
- self.foo = foo
\ No newline at end of file
diff --git a/python/testData/inspections/FieldFromUnusedParameter_after.py b/python/testData/inspections/FieldFromUnusedParameter_after.py
deleted file mode 100644
index 7405ba3..0000000
--- a/python/testData/inspections/FieldFromUnusedParameter_after.py
+++ /dev/null
@@ -1,4 +0,0 @@
-class A:
- def __init__(self, foo):
- print('hello')
- self.foo = foo
\ No newline at end of file
diff --git a/python/testData/inspections/MoveDocstring.py b/python/testData/inspections/MoveDocstring.py
deleted file mode 100644
index 1db4e3f..0000000
--- a/python/testData/inspections/MoveDocstring.py
+++ /dev/null
@@ -1,8 +0,0 @@
-class GetCustomerPaymentProfileRequest(CustomerRequest):
- def __init__(self, user, profileid):
- CustomerRequest.__init__(self, user,
- customerPaymentProfileId=profileid)
- <warning descr="Docstring seems to be misplaced">"""
- Gets a payment profile by user <caret>Account object and authorize.net
- profileid of the payment profile.
- """</warning>
diff --git a/python/testData/inspections/MoveDocstring_after.py b/python/testData/inspections/MoveDocstring_after.py
deleted file mode 100644
index 1833c32..0000000
--- a/python/testData/inspections/MoveDocstring_after.py
+++ /dev/null
@@ -1,9 +0,0 @@
-class GetCustomerPaymentProfileRequest(CustomerRequest):
- """
- Gets a payment profile by user Account object and authorize.net
- profileid of the payment profile.
- """
-
- def __init__(self, user, profileid):
- CustomerRequest.__init__(self, user,
- customerPaymentProfileId=profileid)
diff --git a/python/testData/inspections/PyArgumentEqualDefaultInspection/test.py b/python/testData/inspections/PyArgumentEqualDefaultInspection/test.py
index bda25d3..b75341f 100644
--- a/python/testData/inspections/PyArgumentEqualDefaultInspection/test.py
+++ b/python/testData/inspections/PyArgumentEqualDefaultInspection/test.py
@@ -67,3 +67,9 @@
{1: 2}.get('foo', None) #pass
{1: 2}.pop('foo', None) #pass
+
+def a(foo=1*1024):
+ print foo
+
+a( 1024*1024)
+
diff --git a/python/testData/inspections/PyArgumentListInspection/decoratorsPy3K.py b/python/testData/inspections/PyArgumentListInspection/decoratorsPy3K.py
new file mode 100644
index 0000000..07e9942
--- /dev/null
+++ b/python/testData/inspections/PyArgumentListInspection/decoratorsPy3K.py
@@ -0,0 +1,7 @@
+
+def deco(func, *args):
+ return func
+
+@deco # <= Here is a false positive.
+def myfunc(a, b):
+ print(a, b)
\ No newline at end of file
diff --git a/python/testData/inspections/PyAssignmentToLoopOrWithParameterInspection/bad.py b/python/testData/inspections/PyAssignmentToLoopOrWithParameterInspection/bad.py
new file mode 100644
index 0000000..c6492c1
--- /dev/null
+++ b/python/testData/inspections/PyAssignmentToLoopOrWithParameterInspection/bad.py
@@ -0,0 +1,62 @@
+i = []
+for i[0] in xrange(5):
+ for <weak_warning descr="Variable 'i[0]' already declared in 'for' loop or 'with' statement above">i[0]</weak_warning> in xrange(20, 25):
+ print("Inner", i)
+ for <weak_warning descr="Variable 'i' already declared in 'for' loop or 'with' statement above">i</weak_warning> in xrange(20, 25):
+ pass
+ print("Outer", i)
+
+for i in xrange(5):
+ for <weak_warning descr="Variable 'i' already declared in 'for' loop or 'with' statement above">i</weak_warning> in xrange(20, 25):
+ print("Inner", i)
+ print("Outer", i)
+
+for i in xrange(5):
+ i = []
+ for <weak_warning descr="Variable 'i[0]' already declared in 'for' loop or 'with' statement above">i[0]</weak_warning> in xrange(20, 25):
+ print("Inner", i)
+ print("Outer", i)
+
+i = [0]
+for i[0] in xrange(5):
+ for <weak_warning descr="Variable 'i[0]' already declared in 'for' loop or 'with' statement above">i[0]</weak_warning> in xrange(20, 25):
+ print("Inner", i)
+ print("Outer", i)
+
+i = [[]]
+for i[0] in xrange(5):
+ for <weak_warning descr="Variable 'i' already declared in 'for' loop or 'with' statement above">i</weak_warning> in xrange(20, 25):
+ print("Inner", i)
+ print("Outer", i)
+
+with open("a") as f:
+ spam(f)
+ f.eggs()
+ with open("b") as <weak_warning descr="Variable 'f' already declared in 'for' loop or 'with' statement above">f</weak_warning>: #
+ pass
+
+with open("a") as z, open("A") as f:
+ spam(f)
+ f.eggs()
+ for (a,b,c,d,(e,<weak_warning descr="Variable 'f' already declared in 'for' loop or 'with' statement above">f</weak_warning>)) in []:
+ pass
+
+
+with open("a") as f:
+ spam(f)
+ f.eggs()
+ for z in []:
+ with open("b") as q:
+ with open("a") as <weak_warning descr="Variable 'f' already declared in 'for' loop or 'with' statement above">f</weak_warning>: #
+ pass
+
+
+class Foo(object):
+ def __init__(self):
+ super(Foo, self).__init__()
+ self.data = "ddd"
+
+ def foo(self):
+ for self.data in [1,2,3]:
+ for <weak_warning descr="Variable 'self.data' already declared in 'for' loop or 'with' statement above">self.data</weak_warning> in [1,2,3]:
+ pass
\ No newline at end of file
diff --git a/python/testData/inspections/PyAssignmentToLoopOrWithParameterInspection/good.py b/python/testData/inspections/PyAssignmentToLoopOrWithParameterInspection/good.py
new file mode 100644
index 0000000..f324656
--- /dev/null
+++ b/python/testData/inspections/PyAssignmentToLoopOrWithParameterInspection/good.py
@@ -0,0 +1,89 @@
+from spam import eggs
+
+for eggs in (1, 12):
+ eggs = 12
+
+for a in (1, 12):
+ for b in (2, 24):
+ for (c, d) in {"C": "D"}.items():
+ (e, f) = (a, d)
+
+i = 12
+print(i)
+(z, x) = (i, 12)
+print(z)
+
+for root in settings.STATICFILES_DIRS:
+ if isinstance(root, (list, tuple)):
+ prefix, root = root
+
+
+for field, model in self.model._meta.get_concrete_fields_with_model():
+ if model is None:
+ model = self.model
+
+with open('a', 'w') as a, open('b', 'w') as b:
+ do_something()
+
+
+for f in [1,2,3]:
+ f = f + 1
+
+for f in [1,2,3]:
+ f = spam(f)
+
+for f in [1,2,3]:
+ f = eggs(lambda x: x + f)
+
+q = []
+for q[0] in [1,2,3]:
+ q[0] = eggs(q)
+
+q = []
+for q[0] in [1,2,3]:
+ q[0] = eggs(q)
+
+for f in [1,2,3]:
+ f = eggs(lambda x: x, f)
+
+for a in [1,2]:
+ pass
+
+for a in [1,2]:
+ pass
+
+b = 12
+for b in [1,2]:
+ pass
+
+for item in range(5):
+ want_to_import = False
+ print want_to_import
+ want_to_import = 2 #No error should be here
+ if True:
+ pass
+
+for ((a, b), (c, d)) in {(1, 2): (3, 4)}.items():
+ print b
+
+x = [1]
+for x[0] in range(1,2):
+ print i
+
+for x[i] in range(1,2):
+ print i
+
+x = [[1]]
+for x[0][0] in range(1,2):
+ x[0][1] = 1
+
+class Foo(object):
+ def __init__(self):
+ super(Foo, self).__init__()
+ self.data = "ddd"
+
+ def foo(self):
+ data, self.data = self.data
+ for data in [1,2,3]:
+ for self.data in [1,2,3]:
+ pass
diff --git a/python/testData/inspections/PyAttributeOutsideInitInspection/staticMethod.py b/python/testData/inspections/PyAttributeOutsideInitInspection/staticMethod.py
new file mode 100644
index 0000000..b593c51
--- /dev/null
+++ b/python/testData/inspections/PyAttributeOutsideInitInspection/staticMethod.py
@@ -0,0 +1,6 @@
+
+class C(object):
+
+ @staticmethod
+ def static_method(obj, name):
+ obj.name = name # warning here
\ No newline at end of file
diff --git a/python/testData/inspections/PyCompatibilityInspection/binaryExpression.py b/python/testData/inspections/PyCompatibilityInspection/binaryExpression.py
index 42338d8..d9c7e85 100644
--- a/python/testData/inspections/PyCompatibilityInspection/binaryExpression.py
+++ b/python/testData/inspections/PyCompatibilityInspection/binaryExpression.py
@@ -1,4 +1,4 @@
-print(<warning descr="Python version 3.0, 3.1, 3.2, 3.3 do not support <>, use != instead.">a <> b</warning>)
+print(<warning descr="Python version 3.0, 3.1, 3.2, 3.3, 3.4 do not support <>, use != instead.">a <> b</warning>)
-if <warning descr="Python version 3.0, 3.1, 3.2, 3.3 do not support <>, use != instead.">a <> 2</warning>:
+if <warning descr="Python version 3.0, 3.1, 3.2, 3.3, 3.4 do not support <>, use != instead.">a <> 2</warning>:
var = a
\ No newline at end of file
diff --git a/python/testData/inspections/PyCompatibilityInspection/callExpression.py b/python/testData/inspections/PyCompatibilityInspection/callExpression.py
index 7327d8e..68afd5a 100644
--- a/python/testData/inspections/PyCompatibilityInspection/callExpression.py
+++ b/python/testData/inspections/PyCompatibilityInspection/callExpression.py
@@ -2,11 +2,11 @@
def __init__(self):
<warning descr="Python version 2.4, 2.5, 2.6, 2.7 do not support this syntax. super() should have arguments in Python 2">super()</warning>
-<warning descr="Python version 3.1, 3.2, 3.3 do not have method cmp">cmp()</warning>
-<warning descr="Python version 3.0, 3.1, 3.2, 3.3 do not have method reduce">reduce()</warning>
+<warning descr="Python version 3.1, 3.2, 3.3, 3.4 do not have method cmp">cmp()</warning>
+<warning descr="Python version 3.0, 3.1, 3.2, 3.3, 3.4 do not have method reduce">reduce()</warning>
<warning descr="Python version 2.4 does not have method all">all()</warning>
-<warning descr="Python version 3.0, 3.1, 3.2, 3.3 do not have method buffer">buffer()</warning>
+<warning descr="Python version 3.0, 3.1, 3.2, 3.3, 3.4 do not have method buffer">buffer()</warning>
def foo(a,b,c):
print (a,b,c)
diff --git a/python/testData/inspections/PyCompatibilityInspection/exceptBlock.py b/python/testData/inspections/PyCompatibilityInspection/exceptBlock.py
index 0dde8c7..8f113c7 100644
--- a/python/testData/inspections/PyCompatibilityInspection/exceptBlock.py
+++ b/python/testData/inspections/PyCompatibilityInspection/exceptBlock.py
@@ -5,5 +5,5 @@
try:
do_smth()
-<warning descr="Python version 3.0, 3.1, 3.2, 3.3 do not support this syntax.">except ImportError, ImportWarning:
+<warning descr="Python version 3.0, 3.1, 3.2, 3.3, 3.4 do not support this syntax.">except ImportError, ImportWarning:
do()</warning>
\ No newline at end of file
diff --git a/python/testData/inspections/PyCompatibilityInspection/fromImportStatement.py b/python/testData/inspections/PyCompatibilityInspection/fromImportStatement.py
index b3be372..15a869f 100644
--- a/python/testData/inspections/PyCompatibilityInspection/fromImportStatement.py
+++ b/python/testData/inspections/PyCompatibilityInspection/fromImportStatement.py
@@ -1,7 +1,7 @@
<warning descr="Python version 2.4 doesn't support this syntax.">from . import smth</warning>
<warning descr="Python version 2.4 doesn't support this syntax.">from .module import name1, name2</warning>
-from <warning descr="Python version 3.0, 3.1, 3.2, 3.3 do not have module Bastion">Bastion</warning> import BastionClass
+from <warning descr="Python version 3.0, 3.1, 3.2, 3.3, 3.4 do not have module Bastion">Bastion</warning> import BastionClass
<warning descr="Python version 2.4 doesn't support this syntax.">from . import exceptions</warning>
diff --git a/python/testData/inspections/PyCompatibilityInspection/importElement.py b/python/testData/inspections/PyCompatibilityInspection/importElement.py
index ccf562b..5927f38 100644
--- a/python/testData/inspections/PyCompatibilityInspection/importElement.py
+++ b/python/testData/inspections/PyCompatibilityInspection/importElement.py
@@ -1 +1 @@
-import <warning descr="Python version 3.0, 3.1, 3.2, 3.3 do not have module Bastion">Bastion</warning>
\ No newline at end of file
+import <warning descr="Python version 3.0, 3.1, 3.2, 3.3, 3.4 do not have module Bastion">Bastion</warning>
\ No newline at end of file
diff --git a/python/testData/inspections/PyCompatibilityInspection/importStatement.py b/python/testData/inspections/PyCompatibilityInspection/importStatement.py
index c72f918..7e08386 100644
--- a/python/testData/inspections/PyCompatibilityInspection/importStatement.py
+++ b/python/testData/inspections/PyCompatibilityInspection/importStatement.py
@@ -1,3 +1,3 @@
<error descr="Python version 2.7 does not have module builtins"><warning descr="Python version 2.4, 2.5, 2.6, 2.7 do not have module builtins">import builtins</warning></error>
-<warning descr="Python version 3.0, 3.1, 3.2, 3.3 do not have module __builtin__">import __builtin__</warning>
\ No newline at end of file
+<warning descr="Python version 3.0, 3.1, 3.2, 3.3, 3.4 do not have module __builtin__">import __builtin__</warning>
\ No newline at end of file
diff --git a/python/testData/inspections/PyCompatibilityInspection/listCompExpression.py b/python/testData/inspections/PyCompatibilityInspection/listCompExpression.py
index 34e65db..3891ea0 100644
--- a/python/testData/inspections/PyCompatibilityInspection/listCompExpression.py
+++ b/python/testData/inspections/PyCompatibilityInspection/listCompExpression.py
@@ -1 +1 @@
-var = [x for x in <warning descr="Python version 3.0, 3.1, 3.2, 3.3 do not support this syntax in list comprehensions.">1, 2, 3</warning>]
\ No newline at end of file
+var = [x for x in <warning descr="Python version 3.0, 3.1, 3.2, 3.3, 3.4 do not support this syntax in list comprehensions.">1, 2, 3</warning>]
\ No newline at end of file
diff --git a/python/testData/inspections/PyCompatibilityInspection/numericLiteralExpression.py b/python/testData/inspections/PyCompatibilityInspection/numericLiteralExpression.py
index dacb742..216ed0a 100644
--- a/python/testData/inspections/PyCompatibilityInspection/numericLiteralExpression.py
+++ b/python/testData/inspections/PyCompatibilityInspection/numericLiteralExpression.py
@@ -1,2 +1,2 @@
-a = <warning descr="Python version 3.0, 3.1, 3.2, 3.3 do not support a trailing 'l' or 'L'.">12l</warning>
-v = <warning descr="Python version 3.0, 3.1, 3.2, 3.3 do not support this syntax. It requires '0o' prefix for octal literals">04</warning><error descr="End of statement expected">8</error>
\ No newline at end of file
+a = <warning descr="Python version 3.0, 3.1, 3.2, 3.3, 3.4 do not support a trailing 'l' or 'L'.">12l</warning>
+v = <warning descr="Python version 3.0, 3.1, 3.2, 3.3, 3.4 do not support this syntax. It requires '0o' prefix for octal literals">04</warning><error descr="End of statement expected">8</error>
\ No newline at end of file
diff --git a/python/testData/inspections/PyCompatibilityInspection/raiseStatement.py b/python/testData/inspections/PyCompatibilityInspection/raiseStatement.py
index 3696e4a..e6f1569 100644
--- a/python/testData/inspections/PyCompatibilityInspection/raiseStatement.py
+++ b/python/testData/inspections/PyCompatibilityInspection/raiseStatement.py
@@ -1,6 +1,6 @@
try:
a
except :
- <warning descr="Python version 3.0, 3.1, 3.2, 3.3 do not support this syntax.">raise ImportError, ImportWarning</warning>
+ <warning descr="Python version 3.0, 3.1, 3.2, 3.3, 3.4 do not support this syntax.">raise ImportError, ImportWarning</warning>
-<warning descr="Python version 3.0, 3.1, 3.2, 3.3 do not support this syntax. Raise with no arguments can only be used in an except block">raise</warning>
+<warning descr="Python version 3.0, 3.1, 3.2, 3.3, 3.4 do not support this syntax. Raise with no arguments can only be used in an except block">raise</warning>
diff --git a/python/testData/inspections/PyCompatibilityInspection/reprExpression.py b/python/testData/inspections/PyCompatibilityInspection/reprExpression.py
index a4c606d..1b31464 100644
--- a/python/testData/inspections/PyCompatibilityInspection/reprExpression.py
+++ b/python/testData/inspections/PyCompatibilityInspection/reprExpression.py
@@ -1 +1 @@
-a = <warning descr="Python version 3.0, 3.1, 3.2, 3.3 do not support backquotes, use repr() instead">`imp.acquire_lock()`</warning>
+a = <warning descr="Python version 3.0, 3.1, 3.2, 3.3, 3.4 do not support backquotes, use repr() instead">`imp.acquire_lock()`</warning>
diff --git a/python/testData/inspections/PyCompatibilityInspection/stringLiteralExpression.py b/python/testData/inspections/PyCompatibilityInspection/stringLiteralExpression.py
index 1f7dd87..9a882a3 100644
--- a/python/testData/inspections/PyCompatibilityInspection/stringLiteralExpression.py
+++ b/python/testData/inspections/PyCompatibilityInspection/stringLiteralExpression.py
@@ -23,7 +23,7 @@
a = <warning descr="Python version 3.0, 3.1, 3.2 do not support a 'U' prefix">u</warning>""
a = r""
-a = <warning descr="Python version 3.0, 3.1, 3.2, 3.3 do not support a 'UR' prefix">ur</warning>""
+a = <warning descr="Python version 3.0, 3.1, 3.2, 3.3, 3.4 do not support a 'UR' prefix">ur</warning>""
a = <warning descr="Python version 2.4, 2.5 do not support a 'B' prefix">b</warning>""
a = <warning descr="Python version 2.4, 2.5, 3.0 do not support a 'BR' prefix">br</warning>""
@@ -31,12 +31,12 @@
a = <warning descr="Python version 3.0, 3.1, 3.2 do not support a 'U' prefix">u</warning>""
a = r""
-a = <warning descr="Python version 3.0, 3.1, 3.2, 3.3 do not support a 'UR' prefix">ur</warning>""
+a = <warning descr="Python version 3.0, 3.1, 3.2, 3.3, 3.4 do not support a 'UR' prefix">ur</warning>""
# combined
b = <warning descr="Python version 3.0, 3.1, 3.2 do not support a 'U' prefix">u</warning>"" <warning descr="Python version 2.4, 2.5 do not support a 'B' prefix">b</warning>""
# never was available
-a = <error descr="Python version 2.7 does not support a 'RR' prefix"><warning descr="Python version 2.4, 2.5, 2.6, 2.7, 3.0, 3.1, 3.2, 3.3 do not support a 'RR' prefix">rr</warning></error>""
-a = <error descr="Python version 2.7 does not support a 'BB' prefix"><warning descr="Python version 2.4, 2.5, 2.6, 2.7, 3.0, 3.1, 3.2, 3.3 do not support a 'BB' prefix">bb</warning></error>""
-a = <error descr="Python version 2.7 does not support a 'UU' prefix"><warning descr="Python version 2.4, 2.5, 2.6, 2.7, 3.0, 3.1, 3.2, 3.3 do not support a 'UU' prefix">uu</warning></error>""
\ No newline at end of file
+a = <error descr="Python version 2.7 does not support a 'RR' prefix"><warning descr="Python version 2.4, 2.5, 2.6, 2.7, 3.0, 3.1, 3.2, 3.3, 3.4 do not support a 'RR' prefix">rr</warning></error>""
+a = <error descr="Python version 2.7 does not support a 'BB' prefix"><warning descr="Python version 2.4, 2.5, 2.6, 2.7, 3.0, 3.1, 3.2, 3.3, 3.4 do not support a 'BB' prefix">bb</warning></error>""
+a = <error descr="Python version 2.7 does not support a 'UU' prefix"><warning descr="Python version 2.4, 2.5, 2.6, 2.7, 3.0, 3.1, 3.2, 3.3, 3.4 do not support a 'UU' prefix">uu</warning></error>""
\ No newline at end of file
diff --git a/python/testData/inspections/PyMethodMayBeStaticInspection/decorated.py b/python/testData/inspections/PyMethodMayBeStaticInspection/decorated.py
new file mode 100644
index 0000000..c16da1e
--- /dev/null
+++ b/python/testData/inspections/PyMethodMayBeStaticInspection/decorated.py
@@ -0,0 +1,15 @@
+def bar(f):
+ def wrapper(self, *args, **kwargs):
+ print('running {cls}.{method}'.format(cls=type(self).__name__,
+ method=f.__name__))
+ return f(self, *args, **kwargs)
+ return wrapper
+
+
+class C(object):
+ @bar
+ def foo(self): # False positive: self is used by @bar
+ return 'foo'
+
+
+C().foo()
\ No newline at end of file
diff --git a/python/testData/inspections/PyPep8NamingInspection/globals.py b/python/testData/inspections/PyPep8NamingInspection/globals.py
new file mode 100644
index 0000000..c055acc
--- /dev/null
+++ b/python/testData/inspections/PyPep8NamingInspection/globals.py
@@ -0,0 +1,14 @@
+from contextlib import contextmanager
+
+MUST_REFRESH_CACHE = False
+
+
+@contextmanager
+def fresh_per_request_cache():
+ global MUST_REFRESH_CACHE
+ orig = MUST_REFRESH_CACHE
+ MUST_REFRESH_CACHE = True
+ try:
+ yield
+ finally:
+ MUST_REFRESH_CACHE = orig
\ No newline at end of file
diff --git a/python/testData/inspections/PyPep8NamingInspection/importCamelAsLower.py b/python/testData/inspections/PyPep8NamingInspection/importCamelAsLower.py
index 94a1139..77c27c7 100644
--- a/python/testData/inspections/PyPep8NamingInspection/importCamelAsLower.py
+++ b/python/testData/inspections/PyPep8NamingInspection/importCamelAsLower.py
@@ -1 +1,2 @@
from x import TestX as <weak_warning descr="CamelCase variable imported as lowercase">test</weak_warning>
+import Exceptions.tt as user_defined_properties
diff --git a/python/testData/inspections/PyPropertyAccessInspection/test.py b/python/testData/inspections/PyPropertyAccessInspection/test.py
index a42b78f..c140b8a 100644
--- a/python/testData/inspections/PyPropertyAccessInspection/test.py
+++ b/python/testData/inspections/PyPropertyAccessInspection/test.py
@@ -22,7 +22,7 @@
<warning descr="Property 'readonly' cannot be set">a.readonly</warning> += 1
del <warning descr="Property 'readonly' cannot be deleted">a.readonly</warning>
-del <error descr="can't delete function call">a.readonly()</error> # Error, delete the result of function
+del <error descr="Can't delete function call">a.readonly()</error> # Error, delete the result of function
a.writeonly = 1
<warning descr="Property 'writeonly' cannot be read">a.writeonly</warning> += 1
diff --git a/python/testData/inspections/PyStatementEffectInspection/test.py b/python/testData/inspections/PyStatementEffectInspection/test.py
index 71ef96b..4a39946 100644
--- a/python/testData/inspections/PyStatementEffectInspection/test.py
+++ b/python/testData/inspections/PyStatementEffectInspection/test.py
@@ -6,7 +6,7 @@
def bar():
"""a"""
- <warning descr="Statement seems to have no effect">"a"</warning>
+ "a"
[allpats.extend(patlist) for patlist in pats.values()]
@@ -30,11 +30,11 @@
"""@type: int"""
foo()
-<warning descr="Statement seems to have no effect">"""fake docstring"""</warning>
+"""fake docstring"""
def foo():
y = 2
- <warning descr="Docstring seems to be misplaced">"""fake docstring"""</warning>
+ """fake docstring"""
# PY-10755
def is_good(a):
diff --git a/python/testData/inspections/PyTypeCheckerInspection/DefaultTupleParameter.py b/python/testData/inspections/PyTypeCheckerInspection/DefaultTupleParameter.py
new file mode 100644
index 0000000..0e082e8
--- /dev/null
+++ b/python/testData/inspections/PyTypeCheckerInspection/DefaultTupleParameter.py
@@ -0,0 +1,5 @@
+def f(x=(), y=('foo', 'bar')):
+ pass
+
+
+f([1, 2, 3], ['foo'])
diff --git a/python/testData/inspections/PyTypeCheckerInspection/MetaClassIteration.py b/python/testData/inspections/PyTypeCheckerInspection/MetaClassIteration.py
new file mode 100644
index 0000000..0ec6926
--- /dev/null
+++ b/python/testData/inspections/PyTypeCheckerInspection/MetaClassIteration.py
@@ -0,0 +1,31 @@
+class M1(type):
+ def __iter__(self):
+ pass
+
+
+class M2(type):
+ pass
+
+
+class C1(object):
+ __metaclass__ = M1
+
+
+class C2(object):
+ __metaclass__ = M2
+
+
+class B1(C1):
+ pass
+
+
+for x in C1:
+ pass
+
+
+for y in <warning descr="Expected 'collections.Iterable', got 'C2' instead">C2</warning>:
+ pass
+
+
+for z in B1:
+ pass
diff --git a/python/testData/inspections/PyUnresolvedReferencesInspection/FromPackageImportBuiltin/a.py b/python/testData/inspections/PyUnresolvedReferencesInspection/FromPackageImportBuiltin/a.py
index a66445c..8880a48 100644
--- a/python/testData/inspections/PyUnresolvedReferencesInspection/FromPackageImportBuiltin/a.py
+++ b/python/testData/inspections/PyUnresolvedReferencesInspection/FromPackageImportBuiltin/a.py
@@ -1 +1,3 @@
from importSource import <error descr="Unresolved reference 'len'">len</error>
+
+len()
diff --git a/python/testData/inspections/PyUnresolvedReferencesInspection/UnusedUnresolvedNameImported/a.py b/python/testData/inspections/PyUnresolvedReferencesInspection/UnusedUnresolvedNameImported/a.py
new file mode 100644
index 0000000..b0ad821
--- /dev/null
+++ b/python/testData/inspections/PyUnresolvedReferencesInspection/UnusedUnresolvedNameImported/a.py
@@ -0,0 +1 @@
+<warning descr="Unused import statement">from my_module import <error descr="Unresolved reference 'eggs'">eggs</error></warning>
diff --git a/python/testData/inspections/PyUnresolvedReferencesInspection/UnusedUnresolvedNameImported/my_module.py b/python/testData/inspections/PyUnresolvedReferencesInspection/UnusedUnresolvedNameImported/my_module.py
new file mode 100644
index 0000000..51d8ead
--- /dev/null
+++ b/python/testData/inspections/PyUnresolvedReferencesInspection/UnusedUnresolvedNameImported/my_module.py
@@ -0,0 +1,2 @@
+def my_func():
+ pass
\ No newline at end of file
diff --git a/python/testData/inspections/PyUnresolvedReferencesInspection/UnusedUnresolvedNameImportedSeveralTimes/a.py b/python/testData/inspections/PyUnresolvedReferencesInspection/UnusedUnresolvedNameImportedSeveralTimes/a.py
new file mode 100644
index 0000000..5e1c928
--- /dev/null
+++ b/python/testData/inspections/PyUnresolvedReferencesInspection/UnusedUnresolvedNameImportedSeveralTimes/a.py
@@ -0,0 +1,2 @@
+<warning descr="Unused import statement">from my_module import <error descr="Unresolved reference 'eggs'">eggs</error></warning>
+<warning descr="Unused import statement">from my_module import <error descr="Unresolved reference 'eggs'">eggs</error></warning>
diff --git a/python/testData/inspections/PyUnresolvedReferencesInspection/UnusedUnresolvedNameImportedSeveralTimes/my_module.py b/python/testData/inspections/PyUnresolvedReferencesInspection/UnusedUnresolvedNameImportedSeveralTimes/my_module.py
new file mode 100644
index 0000000..51d8ead
--- /dev/null
+++ b/python/testData/inspections/PyUnresolvedReferencesInspection/UnusedUnresolvedNameImportedSeveralTimes/my_module.py
@@ -0,0 +1,2 @@
+def my_func():
+ pass
\ No newline at end of file
diff --git a/python/testData/inspections/PyUnresolvedReferencesInspection/UsedUnresolvedNameImportedSeveralTimes/a.py b/python/testData/inspections/PyUnresolvedReferencesInspection/UsedUnresolvedNameImportedSeveralTimes/a.py
new file mode 100644
index 0000000..767f9bf
--- /dev/null
+++ b/python/testData/inspections/PyUnresolvedReferencesInspection/UsedUnresolvedNameImportedSeveralTimes/a.py
@@ -0,0 +1,4 @@
+from my_package.my_module import <error descr="Unresolved reference 'eggs'">eggs</error>
+from my_package.my_module import <error descr="Unresolved reference 'eggs'">eggs</error>
+
+eggs()
diff --git a/python/testData/inspections/PyUnresolvedReferencesInspection/UsedUnresolvedNameImportedSeveralTimes/my_package/__init__.py b/python/testData/inspections/PyUnresolvedReferencesInspection/UsedUnresolvedNameImportedSeveralTimes/my_package/__init__.py
new file mode 100644
index 0000000..a5f9f02
--- /dev/null
+++ b/python/testData/inspections/PyUnresolvedReferencesInspection/UsedUnresolvedNameImportedSeveralTimes/my_package/__init__.py
@@ -0,0 +1 @@
+__author__ = 'Ilya.Kazakevich'
diff --git a/python/testData/inspections/PyUnresolvedReferencesInspection/UsedUnresolvedNameImportedSeveralTimes/my_package/my_module.py b/python/testData/inspections/PyUnresolvedReferencesInspection/UsedUnresolvedNameImportedSeveralTimes/my_package/my_module.py
new file mode 100644
index 0000000..51d8ead
--- /dev/null
+++ b/python/testData/inspections/PyUnresolvedReferencesInspection/UsedUnresolvedNameImportedSeveralTimes/my_package/my_module.py
@@ -0,0 +1,2 @@
+def my_func():
+ pass
\ No newline at end of file
diff --git a/python/testData/inspections/PyUnresolvedReferencesInspection/contextManagerSubclass.py b/python/testData/inspections/PyUnresolvedReferencesInspection/contextManagerSubclass.py
new file mode 100644
index 0000000..f7406de
--- /dev/null
+++ b/python/testData/inspections/PyUnresolvedReferencesInspection/contextManagerSubclass.py
@@ -0,0 +1,12 @@
+class C(object):
+ def __enter__(self):
+ return self
+
+
+class D(C):
+ def foo(self):
+ pass
+
+
+with D() as cm:
+ cm.foo() # pass
diff --git a/python/testData/inspections/PyUnresolvedReferencesInspection/importFunction.py b/python/testData/inspections/PyUnresolvedReferencesInspection/importFunction.py
index 2bfbaa3..75ddd5c 100644
--- a/python/testData/inspections/PyUnresolvedReferencesInspection/importFunction.py
+++ b/python/testData/inspections/PyUnresolvedReferencesInspection/importFunction.py
@@ -1 +1,3 @@
import collections.<warning descr="No module named OrderedDict">OrderedDict</warning>
+
+collections.OrderedDict()
diff --git a/python/testData/inspections/PyUnresolvedReferencesInspection/ivarInDocstring.py b/python/testData/inspections/PyUnresolvedReferencesInspection/ivarInDocstring.py
new file mode 100644
index 0000000..1fec85f
--- /dev/null
+++ b/python/testData/inspections/PyUnresolvedReferencesInspection/ivarInDocstring.py
@@ -0,0 +1,10 @@
+
+class SomeClass(object):
+ """ Awesome class
+
+ @ivar someVar: great stuff
+ @type someVar: string
+ """
+
+ def __init__(self):
+ self.someVar = None
\ No newline at end of file
diff --git a/python/testData/inspections/PyUnresolvedReferencesInspection/returnSelfInSuperClass.py b/python/testData/inspections/PyUnresolvedReferencesInspection/returnSelfInSuperClass.py
new file mode 100644
index 0000000..79c56a0
--- /dev/null
+++ b/python/testData/inspections/PyUnresolvedReferencesInspection/returnSelfInSuperClass.py
@@ -0,0 +1,13 @@
+class C(object):
+ def get_self(self):
+ return self
+
+
+class D(C):
+ def foo(self):
+ pass
+
+
+d = D()
+print(d.foo())
+print(d.get_self().foo()) # pass
diff --git a/python/testData/inspections/PyUnresolvedReferencesInspection/unresolvedImport.py b/python/testData/inspections/PyUnresolvedReferencesInspection/unresolvedImport.py
index e96da63..91aae42 100644
--- a/python/testData/inspections/PyUnresolvedReferencesInspection/unresolvedImport.py
+++ b/python/testData/inspections/PyUnresolvedReferencesInspection/unresolvedImport.py
@@ -1 +1,3 @@
import <error descr="No module named wurm">wurm</error>
+
+wurm()
diff --git a/python/testData/inspections/PyUnresolvedReferencesInspection/unusedUnresolvedModuleImported.py b/python/testData/inspections/PyUnresolvedReferencesInspection/unusedUnresolvedModuleImported.py
new file mode 100644
index 0000000..3351b1d
--- /dev/null
+++ b/python/testData/inspections/PyUnresolvedReferencesInspection/unusedUnresolvedModuleImported.py
@@ -0,0 +1 @@
+<warning descr="Unused import statement">import <error descr="No module named spam">spam</error></warning>
diff --git a/python/testData/inspections/PyUnresolvedReferencesInspection/unusedUnresolvedPackageImported.py b/python/testData/inspections/PyUnresolvedReferencesInspection/unusedUnresolvedPackageImported.py
new file mode 100644
index 0000000..ba929a6
--- /dev/null
+++ b/python/testData/inspections/PyUnresolvedReferencesInspection/unusedUnresolvedPackageImported.py
@@ -0,0 +1 @@
+<warning descr="Unused import statement">import <error descr="No module named spam">spam</error>.eggs</warning>
\ No newline at end of file
diff --git a/python/testData/inspections/PyUnresolvedReferencesInspection3K/EnumMemberAttributes/a.py b/python/testData/inspections/PyUnresolvedReferencesInspection3K/EnumMemberAttributes/a.py
new file mode 100644
index 0000000..9d4ffeb
--- /dev/null
+++ b/python/testData/inspections/PyUnresolvedReferencesInspection3K/EnumMemberAttributes/a.py
@@ -0,0 +1,18 @@
+from enum import Enum
+
+
+class Color(Enum):
+ red = 1
+ green = 2
+ blue = 3
+
+
+print(Color.red.name, Color.red.name.upper())
+print(Color.red.name.<warning descr="Unresolved attribute reference 'foo' for class 'str'">foo</warning>)
+print(Color.red.value, Color.red.value.real)
+print(Color.red.value.<warning descr="Unresolved attribute reference 'foo' for class 'int'">foo</warning>)
+print(Color.red.<warning descr="Unresolved attribute reference 'foo' for class 'Color'">foo</warning>)
+
+
+print(Color.__members__.items())
+print(Color.__members__.<warning descr="Unresolved attribute reference 'foo' for class 'dict'">foo</warning>)
diff --git a/python/testData/inspections/PyUnresolvedReferencesInspection3K/EnumMemberAttributes/enum.py b/python/testData/inspections/PyUnresolvedReferencesInspection3K/EnumMemberAttributes/enum.py
new file mode 100644
index 0000000..368f85a
--- /dev/null
+++ b/python/testData/inspections/PyUnresolvedReferencesInspection3K/EnumMemberAttributes/enum.py
@@ -0,0 +1,17 @@
+class EnumMeta(type):
+ """Fake Enum metaclass."""
+ @property
+ def __members__(cls):
+ return {}
+
+
+class Enum(object, metaclass=EnumMeta):
+ """Fake Enum class."""
+
+ @DynamicClassAttribute
+ def name(self):
+ return self._name_
+
+ @DynamicClassAttribute
+ def value(self):
+ return self._value_
diff --git a/python/testData/inspections/PyUnresolvedReferencesInspection3K/MetaclassStub/a.py b/python/testData/inspections/PyUnresolvedReferencesInspection3K/MetaclassStub/a.py
new file mode 100644
index 0000000..bf0ee44
--- /dev/null
+++ b/python/testData/inspections/PyUnresolvedReferencesInspection3K/MetaclassStub/a.py
@@ -0,0 +1,5 @@
+from m1 import C
+
+c = C()
+print(C.foo(), C.<warning descr="Unresolved attribute reference 'bar' for class 'C'">bar</warning>())
+print(c.<warning descr="Unresolved attribute reference 'foo' for class 'C'">foo</warning>())
\ No newline at end of file
diff --git a/python/testData/inspections/PyUnresolvedReferencesInspection3K/MetaclassStub/m1.py b/python/testData/inspections/PyUnresolvedReferencesInspection3K/MetaclassStub/m1.py
new file mode 100644
index 0000000..bd6222a
--- /dev/null
+++ b/python/testData/inspections/PyUnresolvedReferencesInspection3K/MetaclassStub/m1.py
@@ -0,0 +1,7 @@
+class M(type):
+ def foo(cls):
+ pass
+
+
+class C(metaclass=M):
+ pass
diff --git a/python/testData/inspections/PyUnusedLocalVariableInspection/test.py b/python/testData/inspections/PyUnusedLocalVariableInspection/test.py
index 5edffda..65913e2 100644
--- a/python/testData/inspections/PyUnusedLocalVariableInspection/test.py
+++ b/python/testData/inspections/PyUnusedLocalVariableInspection/test.py
@@ -303,3 +303,16 @@
x = False #pass
if c:
x = True
+
+
+# PY-7527
+def test_unused_empty_init_parameter():
+ class C(object):
+ def __init__(self, <weak_warning descr="Parameter 'foo' value is not used">foo</weak_warning>):
+ pass
+
+ def f(self, bar):
+ pass
+
+ return C
+
diff --git a/python/testData/inspections/QualifyByImport_after.py b/python/testData/inspections/QualifyByImport_after.py
index 7718df7..aa433ef 100644
--- a/python/testData/inspections/QualifyByImport_after.py
+++ b/python/testData/inspections/QualifyByImport_after.py
@@ -1,3 +1,3 @@
import QualifyByImportFoo
-QualifyByImportFoo.foo # must be qualified
+QualifyByImportFoo.foo # must be qualified
diff --git a/python/testData/inspections/ReplaceNotEqOperator.py b/python/testData/inspections/ReplaceNotEqOperator.py
index 37a717d..790a765 100644
--- a/python/testData/inspections/ReplaceNotEqOperator.py
+++ b/python/testData/inspections/ReplaceNotEqOperator.py
@@ -1 +1 @@
-print(<warning descr="Python version 3.0, 3.1, 3.2, 3.3 do not support <>, use != instead.">a <> <caret>b</warning>)
\ No newline at end of file
+print(<warning descr="Python version 3.0, 3.1, 3.2, 3.3, 3.4 do not support <>, use != instead.">a<caret> <> b</warning>)
\ No newline at end of file
diff --git a/python/testData/inspections/StatementEffectPrint.py b/python/testData/inspections/StatementEffectPrint.py
deleted file mode 100644
index 03aa115..0000000
--- a/python/testData/inspections/StatementEffectPrint.py
+++ /dev/null
@@ -1,3 +0,0 @@
-<warning descr="Statement seems to have no effect and can be replaced with function call to have effect">print</warning><error descr="End of statement expected"> </error>\
- <warning descr="Statement seems to have no effect">"foo"</warning>
-a = 1
\ No newline at end of file
diff --git a/python/testData/inspections/StatementEffectPrint_after.py b/python/testData/inspections/StatementEffectPrint_after.py
deleted file mode 100644
index a06f471..0000000
--- a/python/testData/inspections/StatementEffectPrint_after.py
+++ /dev/null
@@ -1,2 +0,0 @@
-print("foo")
-a = 1
\ No newline at end of file
diff --git a/python/testData/inspections/UnresolvedRefNoCreateFunction.py b/python/testData/inspections/UnresolvedRefNoCreateFunction.py
new file mode 100644
index 0000000..ae313c0
--- /dev/null
+++ b/python/testData/inspections/UnresolvedRefNoCreateFunction.py
@@ -0,0 +1 @@
+<error descr="Unresolved reference 'my_ref'">my_<caret>ref</error>.do_smth(1, 2)
\ No newline at end of file
diff --git a/python/testData/inspections/spelling/ignoreEscapeSequence.py b/python/testData/inspections/spelling/ignoreEscapeSequence.py
index 3bd9965..95e8df4 100644
--- a/python/testData/inspections/spelling/ignoreEscapeSequence.py
+++ b/python/testData/inspections/spelling/ignoreEscapeSequence.py
@@ -1 +1,2 @@
-print "foo\nsomething"
\ No newline at end of file
+print "foo\nsomething"
+print """foo\n<TYPO descr="Typo: In word 'brbrbr'">brbrbr</TYPO>"""
diff --git a/python/testData/keywordCompletion/finallyInElse.after.py b/python/testData/keywordCompletion/finallyInElse.after.py
new file mode 100644
index 0000000..be2ee7a
--- /dev/null
+++ b/python/testData/keywordCompletion/finallyInElse.after.py
@@ -0,0 +1,8 @@
+def f():
+ try:
+ a = 1
+ except:
+ b = 1
+ else:
+ c = 1
+ finally:
\ No newline at end of file
diff --git a/python/testData/keywordCompletion/finallyInElse.py b/python/testData/keywordCompletion/finallyInElse.py
new file mode 100644
index 0000000..5f170c7
--- /dev/null
+++ b/python/testData/keywordCompletion/finallyInElse.py
@@ -0,0 +1,8 @@
+def f():
+ try:
+ a = 1
+ except:
+ b = 1
+ else:
+ c = 1
+ fin<caret>
\ No newline at end of file
diff --git a/python/testData/mover/innerIf.py b/python/testData/mover/innerIf.py
index 2faa0c9..b55e273 100644
--- a/python/testData/mover/innerIf.py
+++ b/python/testData/mover/innerIf.py
@@ -1,3 +1,3 @@
if value is not None:
if not False or value <= 2:
- print "h<caret>ere"
\ No newline at end of file
+ print "h<caret>ere"
diff --git a/python/testData/mover/innerIf_afterUp.py b/python/testData/mover/innerIf_afterUp.py
index 6be6e6c..3bbbd1a6 100644
--- a/python/testData/mover/innerIf_afterUp.py
+++ b/python/testData/mover/innerIf_afterUp.py
@@ -1,4 +1,4 @@
if value is not None:
print "here"
if not False or value <= 2:
- pass
\ No newline at end of file
+ pass
diff --git a/python/testData/mover/insideDocComment.py b/python/testData/mover/insideDocComment.py
new file mode 100644
index 0000000..1f2b305
--- /dev/null
+++ b/python/testData/mover/insideDocComment.py
@@ -0,0 +1,7 @@
+def fcn(self, foo, bar):
+ """
+ :type <caret>foo: int
+ :type bar: str
+ """
+ self.foo = foo
+ self.bar = bar
\ No newline at end of file
diff --git a/python/testData/mover/insideDocComment_afterDown.py b/python/testData/mover/insideDocComment_afterDown.py
new file mode 100644
index 0000000..83dbf61
--- /dev/null
+++ b/python/testData/mover/insideDocComment_afterDown.py
@@ -0,0 +1,7 @@
+def fcn(self, foo, bar):
+ """
+ :type bar: str
+ :type foo: int
+ """
+ self.foo = foo
+ self.bar = bar
\ No newline at end of file
diff --git a/python/testData/mover/insideDocComment_afterUp.py b/python/testData/mover/insideDocComment_afterUp.py
new file mode 100644
index 0000000..fe14fa7
--- /dev/null
+++ b/python/testData/mover/insideDocComment_afterUp.py
@@ -0,0 +1,7 @@
+"""
+ :type foo: int
+ :type bar: str
+ """
+def fcn(self, foo, bar):
+ self.foo = foo
+ self.bar = bar
\ No newline at end of file
diff --git a/python/testData/mover/multiCompound.py b/python/testData/mover/multiCompound.py
index e5c86a8..fc9c32e 100644
--- a/python/testData/mover/multiCompound.py
+++ b/python/testData/mover/multiCompound.py
@@ -1,3 +1,3 @@
for item in range(1,
3):
- b = 2<caret>
\ No newline at end of file
+ b = 2<caret>
diff --git a/python/testData/mover/multiCompound_afterUp.py b/python/testData/mover/multiCompound_afterUp.py
index c4fd7de..be4e18f 100644
--- a/python/testData/mover/multiCompound_afterUp.py
+++ b/python/testData/mover/multiCompound_afterUp.py
@@ -1,4 +1,4 @@
b = 2<caret>
for item in range(1,
3):
- pass
\ No newline at end of file
+ pass
diff --git a/python/testData/mover/multiLineSelection10.py b/python/testData/mover/multiLineSelection10.py
index 1feb611..b0f261a 100644
--- a/python/testData/mover/multiLineSelection10.py
+++ b/python/testData/mover/multiLineSelection10.py
@@ -1,3 +1,3 @@
if True:
<caret><selection> a = 2
- b = 3</selection>
\ No newline at end of file
+ b = 3</selection>
diff --git a/python/testData/mover/multiLineSelection10_afterUp.py b/python/testData/mover/multiLineSelection10_afterUp.py
index c8820eb..8d273a3 100644
--- a/python/testData/mover/multiLineSelection10_afterUp.py
+++ b/python/testData/mover/multiLineSelection10_afterUp.py
@@ -1,4 +1,4 @@
<caret><selection>a = 2
b = 3</selection>
if True:
- pass
\ No newline at end of file
+ pass
diff --git a/python/testData/mover/nestedBlock.py b/python/testData/mover/nestedBlock.py
index af60068..77ca3c1 100644
--- a/python/testData/mover/nestedBlock.py
+++ b/python/testData/mover/nestedBlock.py
@@ -4,4 +4,4 @@
else:
for n in range(10):
- <caret> print(b)
\ No newline at end of file
+ <caret> print(b)
diff --git a/python/testData/mover/oneLineCompoundOutside.py b/python/testData/mover/oneLineCompoundOutside.py
index 3f17b74..56e31b8 100644
--- a/python/testData/mover/oneLineCompoundOutside.py
+++ b/python/testData/mover/oneLineCompoundOutside.py
@@ -3,4 +3,4 @@
elif other_condition:
if another_one:
if T<caret>rue: a = 1 # <- move statement up here
- else: b = 2
\ No newline at end of file
+ else: b = 2
diff --git a/python/testData/mover/oneLineCompoundOutside_afterUp.py b/python/testData/mover/oneLineCompoundOutside_afterUp.py
index 21f2798..1f871fb 100644
--- a/python/testData/mover/oneLineCompoundOutside_afterUp.py
+++ b/python/testData/mover/oneLineCompoundOutside_afterUp.py
@@ -4,4 +4,4 @@
if T<caret>rue: a = 1 # <- move statement up here
else: b = 2
if another_one:
- pass
\ No newline at end of file
+ pass
diff --git a/python/testData/mover/upInNested.py b/python/testData/mover/upInNested.py
index 4e170cc..89cacaf 100644
--- a/python/testData/mover/upInNested.py
+++ b/python/testData/mover/upInNested.py
@@ -4,4 +4,4 @@
except:
print(zoo(0).foo(2))
except:
- zoo<caret>(3)
\ No newline at end of file
+ zoo<caret>(3)
diff --git a/python/testData/mover/upInNested_afterUp.py b/python/testData/mover/upInNested_afterUp.py
index 9b20d8e..cb5ecd8 100644
--- a/python/testData/mover/upInNested_afterUp.py
+++ b/python/testData/mover/upInNested_afterUp.py
@@ -5,4 +5,4 @@
print(zoo(0).foo(2))
zoo(3)
except:
- pass
\ No newline at end of file
+ pass
diff --git a/python/testData/optimizeImports/insertBlankLines.after.py b/python/testData/optimizeImports/insertBlankLines.after.py
index e3719e0..62bebf5 100644
--- a/python/testData/optimizeImports/insertBlankLines.after.py
+++ b/python/testData/optimizeImports/insertBlankLines.after.py
@@ -8,3 +8,4 @@
sys.path
datetime.datetime
+foo.bar()
\ No newline at end of file
diff --git a/python/testData/optimizeImports/insertBlankLines.py b/python/testData/optimizeImports/insertBlankLines.py
index 9e77f44..fcf075f 100644
--- a/python/testData/optimizeImports/insertBlankLines.py
+++ b/python/testData/optimizeImports/insertBlankLines.py
@@ -7,3 +7,4 @@
sys.path
datetime.datetime
+foo.bar()
\ No newline at end of file
diff --git a/python/testData/optimizeImports/order.after.py b/python/testData/optimizeImports/order.after.py
index e3719e0..62bebf5 100644
--- a/python/testData/optimizeImports/order.after.py
+++ b/python/testData/optimizeImports/order.after.py
@@ -8,3 +8,4 @@
sys.path
datetime.datetime
+foo.bar()
\ No newline at end of file
diff --git a/python/testData/optimizeImports/order.py b/python/testData/optimizeImports/order.py
index ad3147a..eaa3e27 100644
--- a/python/testData/optimizeImports/order.py
+++ b/python/testData/optimizeImports/order.py
@@ -6,3 +6,4 @@
sys.path
datetime.datetime
+foo.bar()
\ No newline at end of file
diff --git a/python/testData/optimizeImports/unresolved.after.py b/python/testData/optimizeImports/unresolved.after.py
index b014e1f..8b13789 100644
--- a/python/testData/optimizeImports/unresolved.after.py
+++ b/python/testData/optimizeImports/unresolved.after.py
@@ -1 +1 @@
-import xyzzy_shazam
+
diff --git a/python/testData/override/docstring.py b/python/testData/override/docstring.py
new file mode 100644
index 0000000..3670ee1
--- /dev/null
+++ b/python/testData/override/docstring.py
@@ -0,0 +1,9 @@
+class Abstract(object):
+
+ @abstractmethod
+ def foo(self, bar):
+ pass
+
+
+class Concrete(Abstract):
+ """The docstring."""
\ No newline at end of file
diff --git a/python/testData/override/docstring_after.py b/python/testData/override/docstring_after.py
new file mode 100644
index 0000000..a8b3696
--- /dev/null
+++ b/python/testData/override/docstring_after.py
@@ -0,0 +1,12 @@
+class Abstract(object):
+
+ @abstractmethod
+ def foo(self, bar):
+ pass
+
+
+class Concrete(Abstract):
+ """The docstring."""
+
+ def foo(self, bar):
+ <selection>super(Concrete, self).foo(bar)</selection>
\ No newline at end of file
diff --git a/python/testData/psi/BadDecoratorNotMethod.py b/python/testData/psi/BadDecoratorNotMethod.py
new file mode 100644
index 0000000..1e3b5e6
--- /dev/null
+++ b/python/testData/psi/BadDecoratorNotMethod.py
@@ -0,0 +1,4 @@
+class Foo(object):
+ @staticmethod
+ def bad_method(): #test
+ pass
\ No newline at end of file
diff --git a/python/testData/psi/BadDecoratorNotMethod.txt b/python/testData/psi/BadDecoratorNotMethod.txt
new file mode 100644
index 0000000..b2269d3
--- /dev/null
+++ b/python/testData/psi/BadDecoratorNotMethod.txt
@@ -0,0 +1,44 @@
+PyFile:BadDecoratorNotMethod.py
+ PyClass: Foo
+ PsiElement(Py:CLASS_KEYWORD)('class')
+ PsiWhiteSpace(' ')
+ PsiElement(Py:IDENTIFIER)('Foo')
+ PyArgumentList
+ PsiElement(Py:LPAR)('(')
+ PyReferenceExpression: object
+ PsiElement(Py:IDENTIFIER)('object')
+ PsiElement(Py:RPAR)(')')
+ PsiElement(Py:COLON)(':')
+ PsiWhiteSpace('\n ')
+ PyStatementList
+ PyFunction('null')
+ PyDecoratorList
+ PyDecorator: @staticmethod
+ PsiElement(Py:AT)('@')
+ PyReferenceExpression: staticmethod
+ PsiElement(Py:IDENTIFIER)('staticmethod')
+ PyArgumentList
+ <empty list>
+ PsiErrorElement:'@' or 'def' expected
+ <empty list>
+ PsiWhiteSpace('\n ')
+ PyParameterList
+ <empty list>
+ PyStatementList
+ <empty list>
+ PsiErrorElement:Unexpected indent
+ <empty list>
+ PyFunction('bad_method')
+ PsiElement(Py:DEF_KEYWORD)('def')
+ PsiWhiteSpace(' ')
+ PsiElement(Py:IDENTIFIER)('bad_method')
+ PyParameterList
+ PsiElement(Py:LPAR)('(')
+ PsiElement(Py:RPAR)(')')
+ PsiElement(Py:COLON)(':')
+ PsiWhiteSpace(' ')
+ PsiComment(Py:END_OF_LINE_COMMENT)('#test')
+ PsiWhiteSpace('\n ')
+ PyStatementList
+ PyPassStatement
+ PsiElement(Py:PASS_KEYWORD)('pass')
\ No newline at end of file
diff --git a/python/testData/psi/BlockWithoutColon.py b/python/testData/psi/BlockWithoutColon.py
new file mode 100644
index 0000000..a71c318
--- /dev/null
+++ b/python/testData/psi/BlockWithoutColon.py
@@ -0,0 +1,5 @@
+def foo():
+ while True
+ x = 1
+ x = 2
+ return x
diff --git a/python/testData/psi/BlockWithoutColon.txt b/python/testData/psi/BlockWithoutColon.txt
new file mode 100644
index 0000000..abf54f4
--- /dev/null
+++ b/python/testData/psi/BlockWithoutColon.txt
@@ -0,0 +1,44 @@
+PyFile:BlockWithoutColon.py
+ PyFunction('foo')
+ PsiElement(Py:DEF_KEYWORD)('def')
+ PsiWhiteSpace(' ')
+ PsiElement(Py:IDENTIFIER)('foo')
+ PyParameterList
+ PsiElement(Py:LPAR)('(')
+ PsiElement(Py:RPAR)(')')
+ PsiElement(Py:COLON)(':')
+ PsiWhiteSpace('\n ')
+ PyStatementList
+ PyWhileStatement
+ PyWhilePart
+ PsiElement(Py:WHILE_KEYWORD)('while')
+ PsiWhiteSpace(' ')
+ PyReferenceExpression: True
+ PsiElement(Py:IDENTIFIER)('True')
+ PsiErrorElement:Colon expected
+ <empty list>
+ PsiWhiteSpace('\n ')
+ PyStatementList
+ PyAssignmentStatement
+ PyTargetExpression: x
+ PsiElement(Py:IDENTIFIER)('x')
+ PsiWhiteSpace(' ')
+ PsiElement(Py:EQ)('=')
+ PsiWhiteSpace(' ')
+ PyNumericLiteralExpression
+ PsiElement(Py:INTEGER_LITERAL)('1')
+ PsiWhiteSpace('\n ')
+ PyAssignmentStatement
+ PyTargetExpression: x
+ PsiElement(Py:IDENTIFIER)('x')
+ PsiWhiteSpace(' ')
+ PsiElement(Py:EQ)('=')
+ PsiWhiteSpace(' ')
+ PyNumericLiteralExpression
+ PsiElement(Py:INTEGER_LITERAL)('2')
+ PsiWhiteSpace('\n ')
+ PyReturnStatement
+ PsiElement(Py:RETURN_KEYWORD)('return')
+ PsiWhiteSpace(' ')
+ PyReferenceExpression: x
+ PsiElement(Py:IDENTIFIER)('x')
\ No newline at end of file
diff --git a/python/testData/psi/EmptyBlockInFunctionBeforeFunction.py b/python/testData/psi/EmptyBlockInFunctionBeforeFunction.py
new file mode 100644
index 0000000..5248b7d
--- /dev/null
+++ b/python/testData/psi/EmptyBlockInFunctionBeforeFunction.py
@@ -0,0 +1,6 @@
+def foo(xs):
+ for x in xs:
+
+
+def bar():
+ pass
diff --git a/python/testData/psi/EmptyBlockInFunctionBeforeFunction.txt b/python/testData/psi/EmptyBlockInFunctionBeforeFunction.txt
new file mode 100644
index 0000000..4ee3e5c
--- /dev/null
+++ b/python/testData/psi/EmptyBlockInFunctionBeforeFunction.txt
@@ -0,0 +1,41 @@
+PyFile:EmptyBlockInFunctionBeforeFunction.py
+ PyFunction('foo')
+ PsiElement(Py:DEF_KEYWORD)('def')
+ PsiWhiteSpace(' ')
+ PsiElement(Py:IDENTIFIER)('foo')
+ PyParameterList
+ PsiElement(Py:LPAR)('(')
+ PyNamedParameter('xs')
+ PsiElement(Py:IDENTIFIER)('xs')
+ PsiElement(Py:RPAR)(')')
+ PsiElement(Py:COLON)(':')
+ PsiWhiteSpace('\n ')
+ PyStatementList
+ PyForStatement
+ PyForPart
+ PsiElement(Py:FOR_KEYWORD)('for')
+ PsiWhiteSpace(' ')
+ PyTargetExpression: x
+ PsiElement(Py:IDENTIFIER)('x')
+ PsiWhiteSpace(' ')
+ PsiElement(Py:IN_KEYWORD)('in')
+ PsiWhiteSpace(' ')
+ PyReferenceExpression: xs
+ PsiElement(Py:IDENTIFIER)('xs')
+ PsiElement(Py:COLON)(':')
+ PyStatementList
+ PsiErrorElement:Indent expected
+ <empty list>
+ PsiWhiteSpace('\n\n\n')
+ PyFunction('bar')
+ PsiElement(Py:DEF_KEYWORD)('def')
+ PsiWhiteSpace(' ')
+ PsiElement(Py:IDENTIFIER)('bar')
+ PyParameterList
+ PsiElement(Py:LPAR)('(')
+ PsiElement(Py:RPAR)(')')
+ PsiElement(Py:COLON)(':')
+ PsiWhiteSpace('\n ')
+ PyStatementList
+ PyPassStatement
+ PsiElement(Py:PASS_KEYWORD)('pass')
\ No newline at end of file
diff --git a/python/testData/psi/IncompleteFor.txt b/python/testData/psi/IncompleteFor.txt
index 3b833e5..3aac386 100644
--- a/python/testData/psi/IncompleteFor.txt
+++ b/python/testData/psi/IncompleteFor.txt
@@ -23,7 +23,8 @@
PsiErrorElement:Colon expected
<empty list>
PyStatementList
- <empty list>
+ PsiErrorElement:Indent expected
+ <empty list>
PsiWhiteSpace('\n\n')
PyFunction('bar')
PsiElement(Py:DEF_KEYWORD)('def')
diff --git a/python/testData/psi/IncompleteStatementList.txt b/python/testData/psi/IncompleteStatementList.txt
index 6924008..fb363aa 100644
--- a/python/testData/psi/IncompleteStatementList.txt
+++ b/python/testData/psi/IncompleteStatementList.txt
@@ -18,7 +18,8 @@
PsiErrorElement:Colon expected
<empty list>
PyStatementList
- <empty list>
+ PsiErrorElement:Indent expected
+ <empty list>
PsiWhiteSpace('\n\n')
PyFunction('bar')
PsiElement(Py:DEF_KEYWORD)('def')
diff --git a/python/testData/psi/KeywordAsFunctionName.txt b/python/testData/psi/KeywordAsFunctionName.txt
index 473ba30..c995f92 100644
--- a/python/testData/psi/KeywordAsFunctionName.txt
+++ b/python/testData/psi/KeywordAsFunctionName.txt
@@ -2,7 +2,7 @@
PyFunction('null')
PsiElement(Py:DEF_KEYWORD)('def')
PsiWhiteSpace(' ')
- PsiErrorElement:function name expected
+ PsiErrorElement:Identifier expected
PsiElement(Py:FROM_KEYWORD)('from')
PyParameterList
PsiElement(Py:LPAR)('(')
diff --git a/python/testData/psi/MissingParenInCall.txt b/python/testData/psi/MissingParenInCall.txt
index 57caa80..649a59b 100644
--- a/python/testData/psi/MissingParenInCall.txt
+++ b/python/testData/psi/MissingParenInCall.txt
@@ -27,10 +27,9 @@
PsiErrorElement:expression expected
<empty list>
PsiWhiteSpace('\n\n')
- PsiErrorElement:Colon expected
- <empty list>
PyStatementList
- <empty list>
+ PsiErrorElement:Indent expected
+ <empty list>
PyFunction('clean')
PsiElement(Py:DEF_KEYWORD)('def')
PsiWhiteSpace(' ')
diff --git a/python/testData/psi/NotClosedBraceDict.py b/python/testData/psi/NotClosedBraceDict.py
new file mode 100644
index 0000000..9a72624
--- /dev/null
+++ b/python/testData/psi/NotClosedBraceDict.py
@@ -0,0 +1,3 @@
+a = {
+ 'b': 'c',
+ ]
\ No newline at end of file
diff --git a/python/testData/psi/NotClosedBraceDict.txt b/python/testData/psi/NotClosedBraceDict.txt
new file mode 100644
index 0000000..1222ea3
--- /dev/null
+++ b/python/testData/psi/NotClosedBraceDict.txt
@@ -0,0 +1,24 @@
+PyFile:NotClosedBraceDict.py
+ PyAssignmentStatement
+ PyTargetExpression: a
+ PsiElement(Py:IDENTIFIER)('a')
+ PsiWhiteSpace(' ')
+ PsiElement(Py:EQ)('=')
+ PsiWhiteSpace(' ')
+ PyDictLiteralExpression
+ PsiElement(Py:LBRACE)('{')
+ PsiWhiteSpace('\n ')
+ PyKeyValueExpression
+ PyStringLiteralExpression: b
+ PsiElement(Py:SINGLE_QUOTED_STRING)(''b'')
+ PsiElement(Py:COLON)(':')
+ PsiWhiteSpace(' ')
+ PyStringLiteralExpression: c
+ PsiElement(Py:SINGLE_QUOTED_STRING)(''c'')
+ PsiElement(Py:COMMA)(',')
+ PsiErrorElement:'}' expected
+ <empty list>
+ PsiWhiteSpace('\n ')
+ PsiElement(Py:RBRACKET)(']')
+ PsiErrorElement:Statement expected, found Py:RBRACKET
+ <empty list>
\ No newline at end of file
diff --git a/python/testData/psi/NotClosedBraceSet.py b/python/testData/psi/NotClosedBraceSet.py
new file mode 100644
index 0000000..71817f2
--- /dev/null
+++ b/python/testData/psi/NotClosedBraceSet.py
@@ -0,0 +1 @@
+a = {'b',]
\ No newline at end of file
diff --git a/python/testData/psi/NotClosedBraceSet.txt b/python/testData/psi/NotClosedBraceSet.txt
new file mode 100644
index 0000000..95b97f0
--- /dev/null
+++ b/python/testData/psi/NotClosedBraceSet.txt
@@ -0,0 +1,17 @@
+PyFile:NotClosedBraceSet.py
+ PyAssignmentStatement
+ PyTargetExpression: a
+ PsiElement(Py:IDENTIFIER)('a')
+ PsiWhiteSpace(' ')
+ PsiElement(Py:EQ)('=')
+ PsiWhiteSpace(' ')
+ PySetLiteralExpression
+ PsiElement(Py:LBRACE)('{')
+ PyStringLiteralExpression: b
+ PsiElement(Py:SINGLE_QUOTED_STRING)(''b'')
+ PsiElement(Py:COMMA)(',')
+ PsiErrorElement:'}' expected
+ <empty list>
+ PsiElement(Py:RBRACKET)(']')
+ PsiErrorElement:Statement expected, found Py:RBRACKET
+ <empty list>
\ No newline at end of file
diff --git a/python/testData/psi/OverIndentedComment.py b/python/testData/psi/OverIndentedComment.py
new file mode 100644
index 0000000..33e9351
--- /dev/null
+++ b/python/testData/psi/OverIndentedComment.py
@@ -0,0 +1,3 @@
+if test:
+ # comment
+ pass
diff --git a/python/testData/psi/OverIndentedComment.txt b/python/testData/psi/OverIndentedComment.txt
new file mode 100644
index 0000000..c098016
--- /dev/null
+++ b/python/testData/psi/OverIndentedComment.txt
@@ -0,0 +1,14 @@
+PyFile:OverIndentedComment.py
+ PyIfStatement
+ PyIfPartIf
+ PsiElement(Py:IF_KEYWORD)('if')
+ PsiWhiteSpace(' ')
+ PyReferenceExpression: test
+ PsiElement(Py:IDENTIFIER)('test')
+ PsiElement(Py:COLON)(':')
+ PsiWhiteSpace('\n ')
+ PyStatementList
+ PsiComment(Py:END_OF_LINE_COMMENT)('# comment')
+ PsiWhiteSpace('\n ')
+ PyPassStatement
+ PsiElement(Py:PASS_KEYWORD)('pass')
\ No newline at end of file
diff --git a/python/testData/psi/SingleClassBeforeFunction.py b/python/testData/psi/SingleClassBeforeFunction.py
new file mode 100644
index 0000000..b487baf
--- /dev/null
+++ b/python/testData/psi/SingleClassBeforeFunction.py
@@ -0,0 +1,5 @@
+class
+
+
+def foo():
+ pass
diff --git a/python/testData/psi/SingleClassBeforeFunction.txt b/python/testData/psi/SingleClassBeforeFunction.txt
new file mode 100644
index 0000000..2fa5b30
--- /dev/null
+++ b/python/testData/psi/SingleClassBeforeFunction.txt
@@ -0,0 +1,25 @@
+PyFile:SingleClassBeforeFunction.py
+ PyClass: null
+ PsiElement(Py:CLASS_KEYWORD)('class')
+ PsiErrorElement:Identifier expected
+ <empty list>
+ PyArgumentList
+ <empty list>
+ PsiErrorElement:Colon expected
+ <empty list>
+ PsiWhiteSpace('\n\n\n')
+ PyStatementList
+ PsiErrorElement:Indent expected
+ <empty list>
+ PyFunction('foo')
+ PsiElement(Py:DEF_KEYWORD)('def')
+ PsiWhiteSpace(' ')
+ PsiElement(Py:IDENTIFIER)('foo')
+ PyParameterList
+ PsiElement(Py:LPAR)('(')
+ PsiElement(Py:RPAR)(')')
+ PsiElement(Py:COLON)(':')
+ PsiWhiteSpace('\n ')
+ PyStatementList
+ PyPassStatement
+ PsiElement(Py:PASS_KEYWORD)('pass')
diff --git a/python/testData/psi/SingleDefBeforeFunction.py b/python/testData/psi/SingleDefBeforeFunction.py
new file mode 100644
index 0000000..407918f
--- /dev/null
+++ b/python/testData/psi/SingleDefBeforeFunction.py
@@ -0,0 +1,5 @@
+def
+
+
+def bar():
+ x = 1
diff --git a/python/testData/psi/SingleDefBeforeFunction.txt b/python/testData/psi/SingleDefBeforeFunction.txt
new file mode 100644
index 0000000..5d4dfb0
--- /dev/null
+++ b/python/testData/psi/SingleDefBeforeFunction.txt
@@ -0,0 +1,31 @@
+PyFile:SingleDefBeforeFunction.py
+ PyFunction('null')
+ PsiElement(Py:DEF_KEYWORD)('def')
+ PsiErrorElement:Identifier expected
+ <empty list>
+ PsiErrorElement:'(' expected
+ <empty list>
+ PyParameterList
+ <empty list>
+ PsiWhiteSpace('\n\n\n')
+ PyStatementList
+ PsiErrorElement:Indent expected
+ <empty list>
+ PyFunction('bar')
+ PsiElement(Py:DEF_KEYWORD)('def')
+ PsiWhiteSpace(' ')
+ PsiElement(Py:IDENTIFIER)('bar')
+ PyParameterList
+ PsiElement(Py:LPAR)('(')
+ PsiElement(Py:RPAR)(')')
+ PsiElement(Py:COLON)(':')
+ PsiWhiteSpace('\n ')
+ PyStatementList
+ PyAssignmentStatement
+ PyTargetExpression: x
+ PsiElement(Py:IDENTIFIER)('x')
+ PsiWhiteSpace(' ')
+ PsiElement(Py:EQ)('=')
+ PsiWhiteSpace(' ')
+ PyNumericLiteralExpression
+ PsiElement(Py:INTEGER_LITERAL)('1')
\ No newline at end of file
diff --git a/python/testData/psi/WithMissingID.txt b/python/testData/psi/WithMissingID.txt
index fa8caab..afd37e7 100644
--- a/python/testData/psi/WithMissingID.txt
+++ b/python/testData/psi/WithMissingID.txt
@@ -13,7 +13,7 @@
PsiElement(Py:RPAR)(')')
PsiWhiteSpace(' ')
PsiElement(Py:AS_KEYWORD)('as')
- PsiErrorElement:identifier expected
+ PsiErrorElement:Identifier expected
<empty list>
PsiWhiteSpace(' ')
PsiElement(Py:COLON)(':')
diff --git a/python/testData/quickFixes/AddFieldQuickFixTest/addFieldFromInstance_after.py b/python/testData/quickFixes/AddFieldQuickFixTest/addFieldFromInstance_after.py
index 6862903..7027a39 100644
--- a/python/testData/quickFixes/AddFieldQuickFixTest/addFieldFromInstance_after.py
+++ b/python/testData/quickFixes/AddFieldQuickFixTest/addFieldFromInstance_after.py
@@ -1,8 +1,7 @@
class A:
def __init__(self):
- self.x = 1
self.y = None
-
+ self.x = 1
a = A()
a.y+1
diff --git a/python/testData/quickFixes/AddFieldQuickFixTest/addFieldFromMethod_after.py b/python/testData/quickFixes/AddFieldQuickFixTest/addFieldFromMethod_after.py
index 3ac2f7e..c0ce40f 100644
--- a/python/testData/quickFixes/AddFieldQuickFixTest/addFieldFromMethod_after.py
+++ b/python/testData/quickFixes/AddFieldQuickFixTest/addFieldFromMethod_after.py
@@ -1,7 +1,7 @@
class A:
def __init__(self):
- self.x = 1
self.y = None
+ self.x = 1
def foo(self):
a = self.y
diff --git a/python/testData/inspections/FieldFromUnusedParameter.py b/python/testData/quickFixes/AddFieldQuickFixTest/fromUnusedParameter.py
similarity index 100%
rename from python/testData/inspections/FieldFromUnusedParameter.py
rename to python/testData/quickFixes/AddFieldQuickFixTest/fromUnusedParameter.py
diff --git a/python/testData/quickFixes/AddFieldQuickFixTest/fromUnusedParameterKeyword.py b/python/testData/quickFixes/AddFieldQuickFixTest/fromUnusedParameterKeyword.py
new file mode 100644
index 0000000..27f1600
--- /dev/null
+++ b/python/testData/quickFixes/AddFieldQuickFixTest/fromUnusedParameterKeyword.py
@@ -0,0 +1,3 @@
+class A:
+ def __init__(self, fo<caret>o=True):
+ print('hello')
\ No newline at end of file
diff --git a/python/testData/quickFixes/AddFieldQuickFixTest/fromUnusedParameterKeyword_after.py b/python/testData/quickFixes/AddFieldQuickFixTest/fromUnusedParameterKeyword_after.py
new file mode 100644
index 0000000..3f86fa4
--- /dev/null
+++ b/python/testData/quickFixes/AddFieldQuickFixTest/fromUnusedParameterKeyword_after.py
@@ -0,0 +1,4 @@
+class A:
+ def __init__(self, foo=True):
+ self.foo = foo
+ print('hello')
\ No newline at end of file
diff --git a/python/testData/quickFixes/AddFieldQuickFixTest/fromUnusedParameter_after.py b/python/testData/quickFixes/AddFieldQuickFixTest/fromUnusedParameter_after.py
new file mode 100644
index 0000000..58785ed
--- /dev/null
+++ b/python/testData/quickFixes/AddFieldQuickFixTest/fromUnusedParameter_after.py
@@ -0,0 +1,4 @@
+class A:
+ def __init__(self, foo):
+ self.foo = foo
+ print('hello')
\ No newline at end of file
diff --git a/python/testData/quickFixes/AddMethodQuickFixTest/addMethodFromMethod_after.py b/python/testData/quickFixes/AddMethodQuickFixTest/addMethodFromMethod_after.py
index 978acaf..5c47b58 100644
--- a/python/testData/quickFixes/AddMethodQuickFixTest/addMethodFromMethod_after.py
+++ b/python/testData/quickFixes/AddMethodQuickFixTest/addMethodFromMethod_after.py
@@ -8,6 +8,7 @@
def y(self, param, a):
pass
+
# Some comment
class B:
diff --git a/python/testData/quickFixes/PyMakeMethodStaticQuickFixTest/decoWithParams.py b/python/testData/quickFixes/PyMakeMethodStaticQuickFixTest/decoWithParams.py
deleted file mode 100644
index 7cdd655..0000000
--- a/python/testData/quickFixes/PyMakeMethodStaticQuickFixTest/decoWithParams.py
+++ /dev/null
@@ -1,10 +0,0 @@
-__author__ = 'ktisha'
-
-def foo(x):
- return x
-
-class A():
-
- @accepts(int, int)
- def my_<caret>method(self):
- print "Smth"
\ No newline at end of file
diff --git a/python/testData/quickFixes/PyMakeMethodStaticQuickFixTest/decoWithParams_after.py b/python/testData/quickFixes/PyMakeMethodStaticQuickFixTest/decoWithParams_after.py
deleted file mode 100644
index 21293a9..0000000
--- a/python/testData/quickFixes/PyMakeMethodStaticQuickFixTest/decoWithParams_after.py
+++ /dev/null
@@ -1,11 +0,0 @@
-__author__ = 'ktisha'
-
-def foo(x):
- return x
-
-class A():
-
- @staticmethod
- @accepts(int, int)
- def my_<caret>method():
- print "Smth"
\ No newline at end of file
diff --git a/python/testData/quickFixes/PyMakeMethodStaticQuickFixTest/functionWithDeco.py b/python/testData/quickFixes/PyMakeMethodStaticQuickFixTest/functionWithDeco.py
deleted file mode 100644
index dded2b0..0000000
--- a/python/testData/quickFixes/PyMakeMethodStaticQuickFixTest/functionWithDeco.py
+++ /dev/null
@@ -1,10 +0,0 @@
-__author__ = 'ktisha'
-
-def foo(x):
- return x
-
-class A():
-
- @my_deco
- def my_<caret>method(self):
- print "Smth"
\ No newline at end of file
diff --git a/python/testData/quickFixes/PyMakeMethodStaticQuickFixTest/functionWithDeco_after.py b/python/testData/quickFixes/PyMakeMethodStaticQuickFixTest/functionWithDeco_after.py
deleted file mode 100644
index 36607a4..0000000
--- a/python/testData/quickFixes/PyMakeMethodStaticQuickFixTest/functionWithDeco_after.py
+++ /dev/null
@@ -1,11 +0,0 @@
-__author__ = 'ktisha'
-
-def foo(x):
- return x
-
-class A():
-
- @staticmethod
- @my_deco
- def my_method():
- print "Smth"
\ No newline at end of file
diff --git a/python/testData/quickFixes/PyMoveAttributeToInitQuickFixTest/addPass_after.py b/python/testData/quickFixes/PyMoveAttributeToInitQuickFixTest/addPass_after.py
index da65a03..040de73 100644
--- a/python/testData/quickFixes/PyMoveAttributeToInitQuickFixTest/addPass_after.py
+++ b/python/testData/quickFixes/PyMoveAttributeToInitQuickFixTest/addPass_after.py
@@ -3,8 +3,8 @@
class A:
def __init__(self):
- self._a = 1
self.b = 1
+ self._a = 1
def foo(self):
pass
diff --git a/python/testData/quickFixes/PyMoveAttributeToInitQuickFixTest/moveToInit_after.py b/python/testData/quickFixes/PyMoveAttributeToInitQuickFixTest/moveToInit_after.py
index 2dc8074..9a83f67 100644
--- a/python/testData/quickFixes/PyMoveAttributeToInitQuickFixTest/moveToInit_after.py
+++ b/python/testData/quickFixes/PyMoveAttributeToInitQuickFixTest/moveToInit_after.py
@@ -3,8 +3,8 @@
class A:
def __init__(self):
- self._a = 1
self.b = 1
+ self._a = 1
def foo(self):
c = 1
\ No newline at end of file
diff --git a/python/testData/refactoring/argumentList/addKeyArgument/addArgumentFile.after.py b/python/testData/refactoring/argumentList/addKeyArgument/addArgumentFile.after.py
new file mode 100644
index 0000000..7a9fbe9
--- /dev/null
+++ b/python/testData/refactoring/argumentList/addKeyArgument/addArgumentFile.after.py
@@ -0,0 +1,32 @@
+from stub import *
+import stub
+
+
+class MyOldClass(metaclass=ABCMeta):
+ pass
+
+
+class MyNewClass(object,metaclass=ABCMeta):
+ pass
+
+
+class MyNewClass_2(object, datetime,metaclass=ABCMeta):
+ pass
+
+class NewClass_3(stub.object,metaclass=ABCMeta):
+ pass
+
+class NewClass_4(stub.object, stub.datetime,metaclass=ABCMeta):
+ pass
+
+class NewClass_5(stub.datetime, foo=stub.object,metaclass=ABCMeta):
+ pass
+
+
+spam = "new_param"
+
+my_function(new_param=spam)
+my_function_1("some_param",new_param=spam)
+my_function_2(named_param="ham",new_param=spam)
+my_function_3("some_param", "some_param_2", named_param="ham",new_param=spam)
+my_function_4("some_param", "some_param_2", named_param=stub.object, named_param_2="eggs",new_param=spam)
\ No newline at end of file
diff --git a/python/testData/refactoring/argumentList/addKeyArgument/addArgumentFile.py b/python/testData/refactoring/argumentList/addKeyArgument/addArgumentFile.py
new file mode 100644
index 0000000..32b4fda
--- /dev/null
+++ b/python/testData/refactoring/argumentList/addKeyArgument/addArgumentFile.py
@@ -0,0 +1,32 @@
+from stub import *
+import stub
+
+
+class MyOldClass():
+ pass
+
+
+class MyNewClass(object):
+ pass
+
+
+class MyNewClass_2(object, datetime):
+ pass
+
+class NewClass_3(stub.object):
+ pass
+
+class NewClass_4(stub.object, stub.datetime):
+ pass
+
+class NewClass_5(stub.datetime, foo=stub.object):
+ pass
+
+
+spam = "new_param"
+
+my_function()
+my_function_1("some_param")
+my_function_2(named_param="ham")
+my_function_3("some_param", "some_param_2", named_param="ham")
+my_function_4("some_param", "some_param_2", named_param=stub.object, named_param_2="eggs")
\ No newline at end of file
diff --git a/python/testData/refactoring/argumentList/addKeyArgument/stub.py b/python/testData/refactoring/argumentList/addKeyArgument/stub.py
new file mode 100644
index 0000000..9227a35
--- /dev/null
+++ b/python/testData/refactoring/argumentList/addKeyArgument/stub.py
@@ -0,0 +1,13 @@
+class object: pass
+
+class datetime: pass
+
+
+class ABCMeta: pass
+
+
+def my_function(new_param="spam"): pass
+def my_function_1(first_param,some_param, new_param="spam"): pass
+def my_function_2(first_param,named_param="ham", new_param="spam"): pass
+def my_function_3(first_param,some_param, some_param_2, named_param="ham", new_param="spam"): pass
+def my_function_4(first_param,some_param, some_param_2, named_param="ham", named_param_2="eggs", new_param="spam"): pass
\ No newline at end of file
diff --git a/python/testData/refactoring/argumentList/addParam/addArgumentFile.after.py b/python/testData/refactoring/argumentList/addParam/addArgumentFile.after.py
new file mode 100644
index 0000000..97c18fd
--- /dev/null
+++ b/python/testData/refactoring/argumentList/addParam/addArgumentFile.after.py
@@ -0,0 +1,27 @@
+from stub import *
+import stub
+
+
+class MyOldClass(SuperClass):
+ pass
+
+
+class MyNewClass(object,SuperClass):
+ pass
+
+
+class MyNewClass_2(object, datetime,SuperClass):
+ pass
+
+class NewClass_3(stub.object,SuperClass):
+ pass
+
+class NewClass_4(stub.object, stub.datetime,SuperClass):
+ pass
+
+new_param = "ogg"
+
+my_function(new_param,some_param="spam")
+my_function(new_param)
+my_function_2("some_param",new_param)
+my_function_3(new_param,some_param="spam",some_another_param=stub.object)
\ No newline at end of file
diff --git a/python/testData/refactoring/argumentList/addParam/addArgumentFile.py b/python/testData/refactoring/argumentList/addParam/addArgumentFile.py
new file mode 100644
index 0000000..32d0235
--- /dev/null
+++ b/python/testData/refactoring/argumentList/addParam/addArgumentFile.py
@@ -0,0 +1,27 @@
+from stub import *
+import stub
+
+
+class MyOldClass():
+ pass
+
+
+class MyNewClass(object):
+ pass
+
+
+class MyNewClass_2(object, datetime):
+ pass
+
+class NewClass_3(stub.object):
+ pass
+
+class NewClass_4(stub.object, stub.datetime):
+ pass
+
+new_param = "ogg"
+
+my_function(some_param="spam")
+my_function()
+my_function_2("some_param")
+my_function_3(some_param="spam",some_another_param=stub.object)
\ No newline at end of file
diff --git a/python/testData/refactoring/argumentList/addParam/stub.py b/python/testData/refactoring/argumentList/addParam/stub.py
new file mode 100644
index 0000000..b98bdb0
--- /dev/null
+++ b/python/testData/refactoring/argumentList/addParam/stub.py
@@ -0,0 +1,13 @@
+class object: pass
+
+class datetime: pass
+
+
+class ABCMeta: pass
+
+class SuperClass: pass
+
+
+def my_function(new_param,some_param="spam"): pass
+def my_function_2(new_param,some_param): pass
+def my_function_3(new_param,some_param="spam",some_another_param="eggs"): pass
diff --git a/python/testData/refactoring/dependenciesTest.py b/python/testData/refactoring/dependenciesTest.py
new file mode 100644
index 0000000..aa245b2
--- /dev/null
+++ b/python/testData/refactoring/dependenciesTest.py
@@ -0,0 +1,9 @@
+class Foo:
+ """
+ Some doc
+ """
+
+ def my_method(self):
+ pass
+
+ CLASS_FIELD = 42
diff --git a/python/testData/refactoring/extractmethod/Comment2.after.py b/python/testData/refactoring/extractmethod/Comment2.after.py
index 1260973..c5cc3a7 100644
--- a/python/testData/refactoring/extractmethod/Comment2.after.py
+++ b/python/testData/refactoring/extractmethod/Comment2.after.py
@@ -1,6 +1,6 @@
class Foo():
def baz():
- tmp = "!" #try to extract this assignmet, either with or without this comment
+ tmp = "!" # try to extract this assignment, either with or without this comment
baz()
diff --git a/python/testData/refactoring/extractmethod/Comment2.before.py b/python/testData/refactoring/extractmethod/Comment2.before.py
index d43386a..23ba13d 100644
--- a/python/testData/refactoring/extractmethod/Comment2.before.py
+++ b/python/testData/refactoring/extractmethod/Comment2.before.py
@@ -1,5 +1,5 @@
class Foo():
- <selection>tmp = "!" #try to extract this assignmet, either with or without this comment</selection>
+ <selection>tmp = "!" #try to extract this assignment, either with or without this comment</selection>
def bar(self):
pass
\ No newline at end of file
diff --git a/python/testData/refactoring/extractmethod/ElseBody.after.py b/python/testData/refactoring/extractmethod/ElseBody.after.py
index 684a444..24e387d 100644
--- a/python/testData/refactoring/extractmethod/ElseBody.after.py
+++ b/python/testData/refactoring/extractmethod/ElseBody.after.py
@@ -1,5 +1,5 @@
def baz(f_new):
- length = len(f_new.readlines()) #<---extract something from here
+ length = len(f_new.readlines()) # <---extract something from here
print("hi from else")
diff --git a/python/testData/refactoring/extractsuperclass/importMultiFile/dest_module.after.py b/python/testData/refactoring/extractsuperclass/importMultiFile/dest_module.after.py
new file mode 100644
index 0000000..eba5f32
--- /dev/null
+++ b/python/testData/refactoring/extractsuperclass/importMultiFile/dest_module.after.py
@@ -0,0 +1,9 @@
+import shared_module
+from shared_module import module_function as my_function, ModuleClass
+
+
+class NewParent(object):
+ def do_useful_stuff(self):
+ i = shared_module.MODULE_CONTANT
+ my_function()
+ ModuleClass()
\ No newline at end of file
diff --git a/python/testData/refactoring/extractsuperclass/importMultiFile/dest_module.py b/python/testData/refactoring/extractsuperclass/importMultiFile/dest_module.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/python/testData/refactoring/extractsuperclass/importMultiFile/dest_module.py
diff --git a/python/testData/refactoring/extractsuperclass/importMultiFile/shared_module.py b/python/testData/refactoring/extractsuperclass/importMultiFile/shared_module.py
new file mode 100644
index 0000000..13fe833
--- /dev/null
+++ b/python/testData/refactoring/extractsuperclass/importMultiFile/shared_module.py
@@ -0,0 +1,9 @@
+MODULE_CONTANT = 42
+
+
+def module_function():
+ pass
+
+
+class ModuleClass(object):
+ pass
\ No newline at end of file
diff --git a/python/testData/refactoring/extractsuperclass/importMultiFile/source_module.after.py b/python/testData/refactoring/extractsuperclass/importMultiFile/source_module.after.py
new file mode 100644
index 0000000..b9d7117
--- /dev/null
+++ b/python/testData/refactoring/extractsuperclass/importMultiFile/source_module.after.py
@@ -0,0 +1,5 @@
+from dest_module import NewParent
+
+
+class MyClass(NewParent):
+ pass
\ No newline at end of file
diff --git a/python/testData/refactoring/extractsuperclass/importMultiFile/source_module.py b/python/testData/refactoring/extractsuperclass/importMultiFile/source_module.py
new file mode 100644
index 0000000..aa10bca
--- /dev/null
+++ b/python/testData/refactoring/extractsuperclass/importMultiFile/source_module.py
@@ -0,0 +1,9 @@
+import shared_module
+from shared_module import module_function as my_function
+from shared_module import ModuleClass
+
+class MyClass(object):
+ def do_useful_stuff(self):
+ i = shared_module.MODULE_CONTANT
+ my_function()
+ ModuleClass()
\ No newline at end of file
diff --git a/python/testData/refactoring/extractsuperclass/importNotBroken.after.py b/python/testData/refactoring/extractsuperclass/importNotBroken.after.py
new file mode 100644
index 0000000..897c62a
--- /dev/null
+++ b/python/testData/refactoring/extractsuperclass/importNotBroken.after.py
@@ -0,0 +1,9 @@
+from shared import SharedClass
+
+
+class DestClass(SharedClass):
+ pass
+
+
+class Source(DestClass):
+ pass
\ No newline at end of file
diff --git a/python/testData/refactoring/extractsuperclass/importNotBroken.before.py b/python/testData/refactoring/extractsuperclass/importNotBroken.before.py
new file mode 100644
index 0000000..82d6d5c
--- /dev/null
+++ b/python/testData/refactoring/extractsuperclass/importNotBroken.before.py
@@ -0,0 +1,5 @@
+from shared import SharedClass
+
+
+class Source(SharedClass):
+ pass
\ No newline at end of file
diff --git a/python/testData/refactoring/extractsuperclass/importNotBrokenManyFiles/dest_module.after.py b/python/testData/refactoring/extractsuperclass/importNotBrokenManyFiles/dest_module.after.py
new file mode 100644
index 0000000..6189ad4
--- /dev/null
+++ b/python/testData/refactoring/extractsuperclass/importNotBrokenManyFiles/dest_module.after.py
@@ -0,0 +1,5 @@
+from shared_module import SharedClass
+
+
+class NewParent(SharedClass):
+ pass
\ No newline at end of file
diff --git a/python/testData/refactoring/extractsuperclass/importNotBrokenManyFiles/dest_module.py b/python/testData/refactoring/extractsuperclass/importNotBrokenManyFiles/dest_module.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/python/testData/refactoring/extractsuperclass/importNotBrokenManyFiles/dest_module.py
diff --git a/python/testData/refactoring/extractsuperclass/importNotBrokenManyFiles/shared_module.py b/python/testData/refactoring/extractsuperclass/importNotBrokenManyFiles/shared_module.py
new file mode 100644
index 0000000..da81c49
--- /dev/null
+++ b/python/testData/refactoring/extractsuperclass/importNotBrokenManyFiles/shared_module.py
@@ -0,0 +1 @@
+class SharedClass(object): pass
\ No newline at end of file
diff --git a/python/testData/refactoring/extractsuperclass/importNotBrokenManyFiles/source_module.after.py b/python/testData/refactoring/extractsuperclass/importNotBrokenManyFiles/source_module.after.py
new file mode 100644
index 0000000..b9d7117
--- /dev/null
+++ b/python/testData/refactoring/extractsuperclass/importNotBrokenManyFiles/source_module.after.py
@@ -0,0 +1,5 @@
+from dest_module import NewParent
+
+
+class MyClass(NewParent):
+ pass
\ No newline at end of file
diff --git a/python/testData/refactoring/extractsuperclass/importNotBrokenManyFiles/source_module.py b/python/testData/refactoring/extractsuperclass/importNotBrokenManyFiles/source_module.py
new file mode 100644
index 0000000..1824aec
--- /dev/null
+++ b/python/testData/refactoring/extractsuperclass/importNotBrokenManyFiles/source_module.py
@@ -0,0 +1,4 @@
+from shared_module import SharedClass
+
+class MyClass(SharedClass):
+ pass
\ No newline at end of file
diff --git a/python/testData/refactoring/extractsuperclass/instanceNotDeclaredInInit.after.py b/python/testData/refactoring/extractsuperclass/instanceNotDeclaredInInit.after.py
new file mode 100644
index 0000000..ef3511d
--- /dev/null
+++ b/python/testData/refactoring/extractsuperclass/instanceNotDeclaredInInit.after.py
@@ -0,0 +1,8 @@
+class Parent(object):
+ def __init__(self):
+ self.eggs = 12
+
+
+class Child(Parent):
+ def foo(self):
+ self.eggs = 12
diff --git a/python/testData/refactoring/extractsuperclass/instanceNotDeclaredInInit.before.py b/python/testData/refactoring/extractsuperclass/instanceNotDeclaredInInit.before.py
new file mode 100644
index 0000000..9c5594a
--- /dev/null
+++ b/python/testData/refactoring/extractsuperclass/instanceNotDeclaredInInit.before.py
@@ -0,0 +1,3 @@
+class Child(object):
+ def foo(self):
+ self.eggs = 12
diff --git a/python/testData/refactoring/extractsuperclass/moveAndMakeAbstract/abc.py b/python/testData/refactoring/extractsuperclass/moveAndMakeAbstract/abc.py
new file mode 100644
index 0000000..ef4f2f6
--- /dev/null
+++ b/python/testData/refactoring/extractsuperclass/moveAndMakeAbstract/abc.py
@@ -0,0 +1,8 @@
+# Stubs
+
+class ABCMeta:
+ pass
+
+
+def abstractmethod(foo):
+ pass
\ No newline at end of file
diff --git a/python/testData/refactoring/extractsuperclass/moveAndMakeAbstract/dest_module.after.py b/python/testData/refactoring/extractsuperclass/moveAndMakeAbstract/dest_module.after.py
new file mode 100644
index 0000000..bbf726c
--- /dev/null
+++ b/python/testData/refactoring/extractsuperclass/moveAndMakeAbstract/dest_module.after.py
@@ -0,0 +1,13 @@
+from abc import abstractmethod
+from abc import ABCMeta
+
+
+class NewParent(object):
+ __metaclass__ = ABCMeta
+
+ @abstractmethod
+ def foo_method(self):
+ """
+ Foo
+ """
+ pass
\ No newline at end of file
diff --git a/python/testData/refactoring/extractsuperclass/moveAndMakeAbstract/dest_module.py b/python/testData/refactoring/extractsuperclass/moveAndMakeAbstract/dest_module.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/python/testData/refactoring/extractsuperclass/moveAndMakeAbstract/dest_module.py
diff --git a/python/testData/refactoring/extractsuperclass/moveAndMakeAbstract/shared_module.py b/python/testData/refactoring/extractsuperclass/moveAndMakeAbstract/shared_module.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/python/testData/refactoring/extractsuperclass/moveAndMakeAbstract/shared_module.py
diff --git a/python/testData/refactoring/extractsuperclass/moveAndMakeAbstract/source_module.after.py b/python/testData/refactoring/extractsuperclass/moveAndMakeAbstract/source_module.after.py
new file mode 100644
index 0000000..6e71752
--- /dev/null
+++ b/python/testData/refactoring/extractsuperclass/moveAndMakeAbstract/source_module.after.py
@@ -0,0 +1,9 @@
+from dest_module import NewParent
+
+
+class MyClass(NewParent):
+ def foo_method(self):
+ """
+ Foo
+ """
+ spam = "eggs"
\ No newline at end of file
diff --git a/python/testData/refactoring/extractsuperclass/moveAndMakeAbstract/source_module.py b/python/testData/refactoring/extractsuperclass/moveAndMakeAbstract/source_module.py
new file mode 100644
index 0000000..f4a7c42
--- /dev/null
+++ b/python/testData/refactoring/extractsuperclass/moveAndMakeAbstract/source_module.py
@@ -0,0 +1,6 @@
+class MyClass(object):
+ def foo_method(self):
+ """
+ Foo
+ """
+ spam = "eggs"
\ No newline at end of file
diff --git a/python/testData/refactoring/extractsuperclass/moveAndMakeAbstractImportExistsPy3/abc.py b/python/testData/refactoring/extractsuperclass/moveAndMakeAbstractImportExistsPy3/abc.py
new file mode 100644
index 0000000..ef4f2f6
--- /dev/null
+++ b/python/testData/refactoring/extractsuperclass/moveAndMakeAbstractImportExistsPy3/abc.py
@@ -0,0 +1,8 @@
+# Stubs
+
+class ABCMeta:
+ pass
+
+
+def abstractmethod(foo):
+ pass
\ No newline at end of file
diff --git a/python/testData/refactoring/extractsuperclass/moveAndMakeAbstractImportExistsPy3/dest_module.after.py b/python/testData/refactoring/extractsuperclass/moveAndMakeAbstractImportExistsPy3/dest_module.after.py
new file mode 100644
index 0000000..ddce4a8
--- /dev/null
+++ b/python/testData/refactoring/extractsuperclass/moveAndMakeAbstractImportExistsPy3/dest_module.after.py
@@ -0,0 +1,13 @@
+from abc import ABCMeta
+from abc import abstractmethod
+
+
+ABCMeta()
+abstractmethod()
+
+
+class NewParent(metaclass=ABCMeta):
+ @classmethod
+ @abstractmethod
+ def foo_method(cls):
+ pass
\ No newline at end of file
diff --git a/python/testData/refactoring/extractsuperclass/moveAndMakeAbstractImportExistsPy3/dest_module.py b/python/testData/refactoring/extractsuperclass/moveAndMakeAbstractImportExistsPy3/dest_module.py
new file mode 100644
index 0000000..81549d3
--- /dev/null
+++ b/python/testData/refactoring/extractsuperclass/moveAndMakeAbstractImportExistsPy3/dest_module.py
@@ -0,0 +1,6 @@
+from abc import ABCMeta
+from abc import abstractmethod
+
+
+ABCMeta()
+abstractmethod()
\ No newline at end of file
diff --git a/python/testData/refactoring/extractsuperclass/moveAndMakeAbstractImportExistsPy3/shared_module.py b/python/testData/refactoring/extractsuperclass/moveAndMakeAbstractImportExistsPy3/shared_module.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/python/testData/refactoring/extractsuperclass/moveAndMakeAbstractImportExistsPy3/shared_module.py
diff --git a/python/testData/refactoring/extractsuperclass/moveAndMakeAbstractImportExistsPy3/source_module.after.py b/python/testData/refactoring/extractsuperclass/moveAndMakeAbstractImportExistsPy3/source_module.after.py
new file mode 100644
index 0000000..02c129f
--- /dev/null
+++ b/python/testData/refactoring/extractsuperclass/moveAndMakeAbstractImportExistsPy3/source_module.after.py
@@ -0,0 +1,7 @@
+from dest_module import NewParent
+
+
+class MyClass(NewParent):
+ @classmethod
+ def foo_method(cls):
+ spam = "eggs"
\ No newline at end of file
diff --git a/python/testData/refactoring/extractsuperclass/moveAndMakeAbstractImportExistsPy3/source_module.py b/python/testData/refactoring/extractsuperclass/moveAndMakeAbstractImportExistsPy3/source_module.py
new file mode 100644
index 0000000..b197c5f
--- /dev/null
+++ b/python/testData/refactoring/extractsuperclass/moveAndMakeAbstractImportExistsPy3/source_module.py
@@ -0,0 +1,4 @@
+class MyClass():
+ @classmethod
+ def foo_method(cls):
+ spam = "eggs"
\ No newline at end of file
diff --git a/python/testData/refactoring/extractsuperclass/moveExtends/dest_module.after.py b/python/testData/refactoring/extractsuperclass/moveExtends/dest_module.after.py
new file mode 100644
index 0000000..1171abf
--- /dev/null
+++ b/python/testData/refactoring/extractsuperclass/moveExtends/dest_module.after.py
@@ -0,0 +1,5 @@
+from shared_module import TheParentOfItAll
+
+
+class NewParent(TheParentOfItAll):
+ pass
\ No newline at end of file
diff --git a/python/testData/refactoring/extractsuperclass/moveExtends/dest_module.py b/python/testData/refactoring/extractsuperclass/moveExtends/dest_module.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/python/testData/refactoring/extractsuperclass/moveExtends/dest_module.py
diff --git a/python/testData/refactoring/extractsuperclass/moveExtends/shared_module.py b/python/testData/refactoring/extractsuperclass/moveExtends/shared_module.py
new file mode 100644
index 0000000..fd3d3fc
--- /dev/null
+++ b/python/testData/refactoring/extractsuperclass/moveExtends/shared_module.py
@@ -0,0 +1,2 @@
+class TheParentOfItAll(object):
+ pass
\ No newline at end of file
diff --git a/python/testData/refactoring/extractsuperclass/moveExtends/source_module.after.py b/python/testData/refactoring/extractsuperclass/moveExtends/source_module.after.py
new file mode 100644
index 0000000..b9d7117
--- /dev/null
+++ b/python/testData/refactoring/extractsuperclass/moveExtends/source_module.after.py
@@ -0,0 +1,5 @@
+from dest_module import NewParent
+
+
+class MyClass(NewParent):
+ pass
\ No newline at end of file
diff --git a/python/testData/refactoring/extractsuperclass/moveExtends/source_module.py b/python/testData/refactoring/extractsuperclass/moveExtends/source_module.py
new file mode 100644
index 0000000..87c753a
--- /dev/null
+++ b/python/testData/refactoring/extractsuperclass/moveExtends/source_module.py
@@ -0,0 +1,4 @@
+import shared_module
+
+class MyClass(shared_module.TheParentOfItAll):
+ pass
\ No newline at end of file
diff --git a/python/testData/refactoring/extractsuperclass/moveExtendsCheckReference/dest_module.after.py b/python/testData/refactoring/extractsuperclass/moveExtendsCheckReference/dest_module.after.py
new file mode 100644
index 0000000..1171abf
--- /dev/null
+++ b/python/testData/refactoring/extractsuperclass/moveExtendsCheckReference/dest_module.after.py
@@ -0,0 +1,5 @@
+from shared_module import TheParentOfItAll
+
+
+class NewParent(TheParentOfItAll):
+ pass
\ No newline at end of file
diff --git a/python/testData/refactoring/extractsuperclass/moveExtendsCheckReference/dest_module.py b/python/testData/refactoring/extractsuperclass/moveExtendsCheckReference/dest_module.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/python/testData/refactoring/extractsuperclass/moveExtendsCheckReference/dest_module.py
diff --git a/python/testData/refactoring/extractsuperclass/moveExtendsCheckReference/shared_module.py b/python/testData/refactoring/extractsuperclass/moveExtendsCheckReference/shared_module.py
new file mode 100644
index 0000000..fd3d3fc
--- /dev/null
+++ b/python/testData/refactoring/extractsuperclass/moveExtendsCheckReference/shared_module.py
@@ -0,0 +1,2 @@
+class TheParentOfItAll(object):
+ pass
\ No newline at end of file
diff --git a/python/testData/refactoring/extractsuperclass/moveExtendsCheckReference/source_module.after.py b/python/testData/refactoring/extractsuperclass/moveExtendsCheckReference/source_module.after.py
new file mode 100644
index 0000000..b9d7117
--- /dev/null
+++ b/python/testData/refactoring/extractsuperclass/moveExtendsCheckReference/source_module.after.py
@@ -0,0 +1,5 @@
+from dest_module import NewParent
+
+
+class MyClass(NewParent):
+ pass
\ No newline at end of file
diff --git a/python/testData/refactoring/extractsuperclass/moveExtendsCheckReference/source_module.py b/python/testData/refactoring/extractsuperclass/moveExtendsCheckReference/source_module.py
new file mode 100644
index 0000000..c2ca974
--- /dev/null
+++ b/python/testData/refactoring/extractsuperclass/moveExtendsCheckReference/source_module.py
@@ -0,0 +1,4 @@
+from shared_module import TheParentOfItAll
+
+class MyClass(TheParentOfItAll):
+ pass
\ No newline at end of file
diff --git a/python/testData/refactoring/extractsuperclass/moveFields.after.py b/python/testData/refactoring/extractsuperclass/moveFields.after.py
new file mode 100644
index 0000000..043e4d3
--- /dev/null
+++ b/python/testData/refactoring/extractsuperclass/moveFields.after.py
@@ -0,0 +1,10 @@
+class ToClass(object):
+ CLASS_FIELD = 42
+
+ def __init__(self):
+ self.instance_field = 100500
+
+
+class FromClass(ToClass):
+ def __init__(self):
+ pass
\ No newline at end of file
diff --git a/python/testData/refactoring/extractsuperclass/moveFields.before.py b/python/testData/refactoring/extractsuperclass/moveFields.before.py
new file mode 100644
index 0000000..54a167f
--- /dev/null
+++ b/python/testData/refactoring/extractsuperclass/moveFields.before.py
@@ -0,0 +1,4 @@
+class FromClass(object):
+ CLASS_FIELD = 42
+ def __init__(self):
+ self.instance_field = 100500
diff --git a/python/testData/refactoring/extractsuperclass/presenter/file.py b/python/testData/refactoring/extractsuperclass/presenter/file.py
new file mode 100644
index 0000000..9e6af14
--- /dev/null
+++ b/python/testData/refactoring/extractsuperclass/presenter/file.py
@@ -0,0 +1,20 @@
+from datetime import date
+class Child(object, date):
+ CLASS_VAR = "spam"
+
+ def eggs(self): # May be abstract
+ pass
+
+ def __init__(self):
+ super(Child, self).__init__()
+ self.artur = "king"
+
+class StaticOnly(object):
+ @staticmethod
+ def static_method(): # May be abstract in case of Py3
+ pass
+
+
+class OldClass():
+ def foo(self):
+ pass
\ No newline at end of file
diff --git a/python/testData/refactoring/extractsuperclass/shared.py b/python/testData/refactoring/extractsuperclass/shared.py
new file mode 100644
index 0000000..71f03ab
--- /dev/null
+++ b/python/testData/refactoring/extractsuperclass/shared.py
@@ -0,0 +1 @@
+class SharedClass: pass
\ No newline at end of file
diff --git a/python/testData/refactoring/extractsuperclass/withImport.after.py b/python/testData/refactoring/extractsuperclass/withImport.after.py
index ccd508b..8601863 100644
--- a/python/testData/refactoring/extractsuperclass/withImport.after.py
+++ b/python/testData/refactoring/extractsuperclass/withImport.after.py
@@ -1,4 +1,3 @@
-import os
from refactoring.extractsuperclass import Suppa
diff --git a/python/testData/refactoring/introduceField/py4437.after.py b/python/testData/refactoring/introduceField/py4437.after.py
index e9c7d75..07a1331 100644
--- a/python/testData/refactoring/introduceField/py4437.after.py
+++ b/python/testData/refactoring/introduceField/py4437.after.py
@@ -1,7 +1,7 @@
class SomeClass():
def __init__(self):
- self.x = 1
self.a = ''
+ self.x = 1
def foo(self):
self.a
diff --git a/python/testData/refactoring/pullup/abstractMethodHasMeta/Class.after.py b/python/testData/refactoring/pullup/abstractMethodHasMeta/Class.after.py
new file mode 100644
index 0000000..e85e0f2
--- /dev/null
+++ b/python/testData/refactoring/pullup/abstractMethodHasMeta/Class.after.py
@@ -0,0 +1,4 @@
+from SuperClass import Parent
+class Child(Parent):
+ def my_method(self, foo):
+ bar = foo
\ No newline at end of file
diff --git a/python/testData/refactoring/pullup/abstractMethodHasMeta/Class.py b/python/testData/refactoring/pullup/abstractMethodHasMeta/Class.py
new file mode 100644
index 0000000..e85e0f2
--- /dev/null
+++ b/python/testData/refactoring/pullup/abstractMethodHasMeta/Class.py
@@ -0,0 +1,4 @@
+from SuperClass import Parent
+class Child(Parent):
+ def my_method(self, foo):
+ bar = foo
\ No newline at end of file
diff --git a/python/testData/refactoring/pullup/abstractMethodHasMeta/SuperClass.after.py b/python/testData/refactoring/pullup/abstractMethodHasMeta/SuperClass.after.py
new file mode 100644
index 0000000..b0004eb
--- /dev/null
+++ b/python/testData/refactoring/pullup/abstractMethodHasMeta/SuperClass.after.py
@@ -0,0 +1,13 @@
+from abc import ABCMeta, abstractmethod
+
+
+class Parent(object):
+ __metaclass__ = ABCMeta
+
+ @abstractmethod
+ def my_method2(self):
+ pass
+
+ @abstractmethod
+ def my_method(self, foo):
+ pass
\ No newline at end of file
diff --git a/python/testData/refactoring/pullup/abstractMethodHasMeta/SuperClass.py b/python/testData/refactoring/pullup/abstractMethodHasMeta/SuperClass.py
new file mode 100644
index 0000000..14d85de
--- /dev/null
+++ b/python/testData/refactoring/pullup/abstractMethodHasMeta/SuperClass.py
@@ -0,0 +1,9 @@
+from abc import ABCMeta, abstractmethod
+
+
+class Parent(object):
+ __metaclass__ = ABCMeta
+
+ @abstractmethod
+ def my_method2(self):
+ pass
\ No newline at end of file
diff --git a/python/testData/refactoring/pullup/abstractMethodHasMeta/abc.py b/python/testData/refactoring/pullup/abstractMethodHasMeta/abc.py
new file mode 100644
index 0000000..ef4f2f6
--- /dev/null
+++ b/python/testData/refactoring/pullup/abstractMethodHasMeta/abc.py
@@ -0,0 +1,8 @@
+# Stubs
+
+class ABCMeta:
+ pass
+
+
+def abstractmethod(foo):
+ pass
\ No newline at end of file
diff --git a/python/testData/refactoring/pullup/abstractMethodPy2AddMeta/Class.after.py b/python/testData/refactoring/pullup/abstractMethodPy2AddMeta/Class.after.py
new file mode 100644
index 0000000..69998c4
--- /dev/null
+++ b/python/testData/refactoring/pullup/abstractMethodPy2AddMeta/Class.after.py
@@ -0,0 +1,7 @@
+from SuperClass import Parent
+class Child(Parent):
+ def my_method(self, foo):
+ bar = foo
+
+ def my_method_2(self, foo):
+ bar = foo
\ No newline at end of file
diff --git a/python/testData/refactoring/pullup/abstractMethodPy2AddMeta/Class.py b/python/testData/refactoring/pullup/abstractMethodPy2AddMeta/Class.py
new file mode 100644
index 0000000..69998c4
--- /dev/null
+++ b/python/testData/refactoring/pullup/abstractMethodPy2AddMeta/Class.py
@@ -0,0 +1,7 @@
+from SuperClass import Parent
+class Child(Parent):
+ def my_method(self, foo):
+ bar = foo
+
+ def my_method_2(self, foo):
+ bar = foo
\ No newline at end of file
diff --git a/python/testData/refactoring/pullup/abstractMethodPy2AddMeta/SuperClass.after.py b/python/testData/refactoring/pullup/abstractMethodPy2AddMeta/SuperClass.after.py
new file mode 100644
index 0000000..d44a9e4
--- /dev/null
+++ b/python/testData/refactoring/pullup/abstractMethodPy2AddMeta/SuperClass.after.py
@@ -0,0 +1,14 @@
+from abc import ABCMeta
+from abc import abstractmethod
+
+
+class Parent(object):
+ __metaclass__ = ABCMeta
+
+ @abstractmethod
+ def my_method(self, foo):
+ pass
+
+ @abstractmethod
+ def my_method_2(self, foo):
+ pass
\ No newline at end of file
diff --git a/python/testData/refactoring/pullup/abstractMethodPy2AddMeta/SuperClass.py b/python/testData/refactoring/pullup/abstractMethodPy2AddMeta/SuperClass.py
new file mode 100644
index 0000000..b63dd44
--- /dev/null
+++ b/python/testData/refactoring/pullup/abstractMethodPy2AddMeta/SuperClass.py
@@ -0,0 +1,2 @@
+class Parent(object):
+ pass
\ No newline at end of file
diff --git a/python/testData/refactoring/pullup/abstractMethodPy2AddMeta/abc.py b/python/testData/refactoring/pullup/abstractMethodPy2AddMeta/abc.py
new file mode 100644
index 0000000..ef4f2f6
--- /dev/null
+++ b/python/testData/refactoring/pullup/abstractMethodPy2AddMeta/abc.py
@@ -0,0 +1,8 @@
+# Stubs
+
+class ABCMeta:
+ pass
+
+
+def abstractmethod(foo):
+ pass
\ No newline at end of file
diff --git a/python/testData/refactoring/pullup/abstractMethodPy3AddMeta/Class.after.py b/python/testData/refactoring/pullup/abstractMethodPy3AddMeta/Class.after.py
new file mode 100644
index 0000000..c0e75fa
--- /dev/null
+++ b/python/testData/refactoring/pullup/abstractMethodPy3AddMeta/Class.after.py
@@ -0,0 +1,12 @@
+from SuperClass import Parent
+class Child(Parent):
+ def my_method(self, foo):
+ """
+ Eats eggs
+ :param foo: eggs
+ """
+ bar = foo
+
+ @classmethod
+ def my_class_method():
+ print("Q")
\ No newline at end of file
diff --git a/python/testData/refactoring/pullup/abstractMethodPy3AddMeta/Class.py b/python/testData/refactoring/pullup/abstractMethodPy3AddMeta/Class.py
new file mode 100644
index 0000000..c0e75fa
--- /dev/null
+++ b/python/testData/refactoring/pullup/abstractMethodPy3AddMeta/Class.py
@@ -0,0 +1,12 @@
+from SuperClass import Parent
+class Child(Parent):
+ def my_method(self, foo):
+ """
+ Eats eggs
+ :param foo: eggs
+ """
+ bar = foo
+
+ @classmethod
+ def my_class_method():
+ print("Q")
\ No newline at end of file
diff --git a/python/testData/refactoring/pullup/abstractMethodPy3AddMeta/SuperClass.after.py b/python/testData/refactoring/pullup/abstractMethodPy3AddMeta/SuperClass.after.py
new file mode 100644
index 0000000..ded9ea6
--- /dev/null
+++ b/python/testData/refactoring/pullup/abstractMethodPy3AddMeta/SuperClass.after.py
@@ -0,0 +1,16 @@
+from abc import ABCMeta
+from abc import abstractmethod
+from abc import object
+class Parent(object, metaclass=ABCMeta):
+ @abstractmethod
+ def my_method(self, foo):
+ """
+ Eats eggs
+ :param foo: eggs
+ """
+ pass
+
+ @classmethod
+ @abstractmethod
+ def my_class_method():
+ pass
\ No newline at end of file
diff --git a/python/testData/refactoring/pullup/abstractMethodPy3AddMeta/SuperClass.py b/python/testData/refactoring/pullup/abstractMethodPy3AddMeta/SuperClass.py
new file mode 100644
index 0000000..33ba9ff
--- /dev/null
+++ b/python/testData/refactoring/pullup/abstractMethodPy3AddMeta/SuperClass.py
@@ -0,0 +1,3 @@
+from abc import object
+class Parent(object):
+ pass
\ No newline at end of file
diff --git a/python/testData/refactoring/pullup/abstractMethodPy3AddMeta/abc.py b/python/testData/refactoring/pullup/abstractMethodPy3AddMeta/abc.py
new file mode 100644
index 0000000..a63732d
--- /dev/null
+++ b/python/testData/refactoring/pullup/abstractMethodPy3AddMeta/abc.py
@@ -0,0 +1,11 @@
+# Stubs
+
+class object:
+ pass
+
+class ABCMeta:
+ pass
+
+
+def abstractmethod(foo):
+ pass
\ No newline at end of file
diff --git a/python/testData/refactoring/pullup/dependenciesOrder.after.py b/python/testData/refactoring/pullup/dependenciesOrder.after.py
new file mode 100644
index 0000000..151587a
--- /dev/null
+++ b/python/testData/refactoring/pullup/dependenciesOrder.after.py
@@ -0,0 +1,30 @@
+class DataHolder:
+ VAR = 1
+
+class Parent:
+ A_FIELD = DataHolder.VAR
+ CLASS_FIELD = 42
+ ANOTHER_CLASS_FIELD = CLASS_FIELD
+ BOO = 12
+ FIELD = BOO
+
+ def __init__(self):
+ self.d = Parent.BOO
+ self.c = 1
+ self.b = self.c
+
+ @staticmethod
+ def foo():
+ return "A"
+
+ SOME_VAR = foo()
+
+
+class Child(Parent): # Try to pull members up
+
+
+
+ def __init__(self):
+ super(Child, self).__init__()
+ self.a = 12
+ i = 1
\ No newline at end of file
diff --git a/python/testData/refactoring/pullup/dependenciesOrder.py b/python/testData/refactoring/pullup/dependenciesOrder.py
new file mode 100644
index 0000000..789bd99
--- /dev/null
+++ b/python/testData/refactoring/pullup/dependenciesOrder.py
@@ -0,0 +1,28 @@
+class DataHolder:
+ VAR = 1
+
+class Parent:
+ BOO = 12
+
+ def __init__(self):
+ self.c = 1
+
+
+class Child(Parent): # Try to pull members up
+ CLASS_FIELD = 42
+ ANOTHER_CLASS_FIELD = CLASS_FIELD
+ FIELD = Parent.BOO
+ A_FIELD = DataHolder.VAR
+
+ @staticmethod
+ def foo():
+ return "A"
+
+ SOME_VAR = foo()
+
+ def __init__(self):
+ super(Child, self).__init__()
+ self.a = 12
+ self.b = self.c
+ self.d = Parent.BOO
+ i = 1
\ No newline at end of file
diff --git a/python/testData/refactoring/pullup/duplicateImport/Class.after.py b/python/testData/refactoring/pullup/duplicateImport/Class.after.py
new file mode 100644
index 0000000..d1946f8
--- /dev/null
+++ b/python/testData/refactoring/pullup/duplicateImport/Class.after.py
@@ -0,0 +1,6 @@
+from SuperClass import SuperClass
+
+
+class AnyClass(SuperClass):
+ pass
+
diff --git a/python/testData/refactoring/pullup/duplicateImport/Class.py b/python/testData/refactoring/pullup/duplicateImport/Class.py
index bd19d07..ca10ac1 100644
--- a/python/testData/refactoring/pullup/duplicateImport/Class.py
+++ b/python/testData/refactoring/pullup/duplicateImport/Class.py
@@ -1,4 +1,6 @@
from SuperClass import SuperClass
+import sys
+
from sys import argv
@@ -7,3 +9,5 @@
if not self.args:
self.args = argv
self.argument = some_argument
+ print(sys.api_version)
+
diff --git a/python/testData/refactoring/pullup/duplicateImport/SuperClass.after.py b/python/testData/refactoring/pullup/duplicateImport/SuperClass.after.py
index 19fa11b..beda7cd 100644
--- a/python/testData/refactoring/pullup/duplicateImport/SuperClass.after.py
+++ b/python/testData/refactoring/pullup/duplicateImport/SuperClass.after.py
@@ -1,4 +1,6 @@
from sys import argv
+import sys
+
class SuperClass(object):
def __init__(self):
@@ -8,3 +10,4 @@
if not self.args:
self.args = argv
self.argument = some_argument
+ print(sys.api_version)
diff --git a/python/testData/refactoring/pullup/fieldMove/Class.after.py b/python/testData/refactoring/pullup/fieldMove/Class.after.py
new file mode 100644
index 0000000..da34ab3
--- /dev/null
+++ b/python/testData/refactoring/pullup/fieldMove/Class.after.py
@@ -0,0 +1,6 @@
+from SuperClass import SuperClass
+
+
+class AnyClass(SuperClass):
+ def __init__(self):
+ super().__init__()
diff --git a/python/testData/refactoring/pullup/fieldMove/Class.py b/python/testData/refactoring/pullup/fieldMove/Class.py
new file mode 100644
index 0000000..99e7fa8
--- /dev/null
+++ b/python/testData/refactoring/pullup/fieldMove/Class.py
@@ -0,0 +1,9 @@
+import sys
+from SuperClass import SuperClass
+
+class AnyClass(SuperClass):
+ COPYRIGHT = sys.copyright
+
+ def __init__(self):
+ super().__init__()
+ self.version = sys.api_version
\ No newline at end of file
diff --git a/python/testData/refactoring/pullup/fieldMove/SuperClass.after.py b/python/testData/refactoring/pullup/fieldMove/SuperClass.after.py
new file mode 100644
index 0000000..fc7c5e9
--- /dev/null
+++ b/python/testData/refactoring/pullup/fieldMove/SuperClass.after.py
@@ -0,0 +1,8 @@
+import sys
+
+
+class SuperClass(object):
+ COPYRIGHT = sys.copyright
+
+ def __init__(self):
+ self.version = sys.api_version
\ No newline at end of file
diff --git a/python/testData/refactoring/pullup/fieldMove/SuperClass.py b/python/testData/refactoring/pullup/fieldMove/SuperClass.py
new file mode 100644
index 0000000..287177a
--- /dev/null
+++ b/python/testData/refactoring/pullup/fieldMove/SuperClass.py
@@ -0,0 +1,2 @@
+class SuperClass(object):
+ pass
\ No newline at end of file
diff --git a/python/testData/refactoring/pullup/instanceNotDeclaredInInit.after.py b/python/testData/refactoring/pullup/instanceNotDeclaredInInit.after.py
new file mode 100644
index 0000000..812bd9c
--- /dev/null
+++ b/python/testData/refactoring/pullup/instanceNotDeclaredInInit.after.py
@@ -0,0 +1,8 @@
+class Parent(object):
+ def __init__(self):
+ self.foo = 12
+
+
+class Child(Parent):
+ def foo(self):
+ self.foo = 12
diff --git a/python/testData/refactoring/pullup/instanceNotDeclaredInInit.py b/python/testData/refactoring/pullup/instanceNotDeclaredInInit.py
new file mode 100644
index 0000000..9e57575
--- /dev/null
+++ b/python/testData/refactoring/pullup/instanceNotDeclaredInInit.py
@@ -0,0 +1,7 @@
+class Parent(object):
+ pass
+
+
+class Child(Parent):
+ def foo(self):
+ self.foo = 12
diff --git a/python/testData/refactoring/pullup/moveClassAttributesNoPass.after.py b/python/testData/refactoring/pullup/moveClassAttributesNoPass.after.py
new file mode 100644
index 0000000..8732118
--- /dev/null
+++ b/python/testData/refactoring/pullup/moveClassAttributesNoPass.after.py
@@ -0,0 +1,9 @@
+class Parent2:
+ CLASS_VAR = 42
+
+ def doo(self):
+ pass
+
+
+class Child2(Parent2):
+ pass
\ No newline at end of file
diff --git a/python/testData/refactoring/pullup/moveClassAttributesNoPass.py b/python/testData/refactoring/pullup/moveClassAttributesNoPass.py
new file mode 100644
index 0000000..2454ab2
--- /dev/null
+++ b/python/testData/refactoring/pullup/moveClassAttributesNoPass.py
@@ -0,0 +1,7 @@
+class Parent2:
+ def doo(self):
+ pass
+
+
+class Child2(Parent2):
+ CLASS_VAR = 42
diff --git a/python/testData/refactoring/pullup/moveClassAttributesSimple.after.py b/python/testData/refactoring/pullup/moveClassAttributesSimple.after.py
new file mode 100644
index 0000000..a770871
--- /dev/null
+++ b/python/testData/refactoring/pullup/moveClassAttributesSimple.after.py
@@ -0,0 +1,6 @@
+class Parent:
+ CLASS_VAR = 42
+
+
+class Child(Parent):
+ pass
\ No newline at end of file
diff --git a/python/testData/refactoring/pullup/moveClassAttributesSimple.py b/python/testData/refactoring/pullup/moveClassAttributesSimple.py
new file mode 100644
index 0000000..fbfef9f
--- /dev/null
+++ b/python/testData/refactoring/pullup/moveClassAttributesSimple.py
@@ -0,0 +1,6 @@
+class Parent:
+ pass
+
+
+class Child(Parent):
+ CLASS_VAR = 42
diff --git a/python/testData/refactoring/pullup/moveInstanceAttributesLeaveEmptyInit.after.py b/python/testData/refactoring/pullup/moveInstanceAttributesLeaveEmptyInit.after.py
new file mode 100644
index 0000000..b379333
--- /dev/null
+++ b/python/testData/refactoring/pullup/moveInstanceAttributesLeaveEmptyInit.after.py
@@ -0,0 +1,21 @@
+class Parent(object):
+ C = 12
+
+ def __init__(self):
+ self.foo = 12
+
+ def foo(self):
+ pass
+
+
+class Child(Parent, object):
+ def __init__(self): pass
+
+ AC = 11
+
+ def foo(self):
+ pass
+
+
+class Bar(object):
+ pass
\ No newline at end of file
diff --git a/python/testData/refactoring/pullup/moveInstanceAttributesLeaveEmptyInit.py b/python/testData/refactoring/pullup/moveInstanceAttributesLeaveEmptyInit.py
new file mode 100644
index 0000000..36721bf
--- /dev/null
+++ b/python/testData/refactoring/pullup/moveInstanceAttributesLeaveEmptyInit.py
@@ -0,0 +1,19 @@
+class Parent(object):
+ C = 12
+
+ def foo(self):
+ pass
+
+
+class Child(Parent, object):
+ def __init__(self):
+ self.foo = 12
+
+ AC = 11
+
+ def foo(self):
+ pass
+
+
+class Bar(object):
+ pass
\ No newline at end of file
diff --git a/python/testData/refactoring/pullup/moveInstanceAttributesNoInit.after.py b/python/testData/refactoring/pullup/moveInstanceAttributesNoInit.after.py
new file mode 100644
index 0000000..ec67fd6
--- /dev/null
+++ b/python/testData/refactoring/pullup/moveInstanceAttributesNoInit.after.py
@@ -0,0 +1,9 @@
+class Parent:
+ def __init__(self):
+ self.instance_field = "eggs"
+
+
+class Child(Parent):
+ def __init__(self):
+ Parent2.__init__(self)
+
diff --git a/python/testData/refactoring/pullup/moveInstanceAttributesNoInit.py b/python/testData/refactoring/pullup/moveInstanceAttributesNoInit.py
new file mode 100644
index 0000000..88866c1
--- /dev/null
+++ b/python/testData/refactoring/pullup/moveInstanceAttributesNoInit.py
@@ -0,0 +1,9 @@
+class Parent:
+ pass
+
+
+class Child(Parent):
+ def __init__(self):
+ Parent2.__init__(self)
+ self.instance_field = "eggs"
+
diff --git a/python/testData/refactoring/pullup/moveInstanceAttributesSimple.after.py b/python/testData/refactoring/pullup/moveInstanceAttributesSimple.after.py
new file mode 100644
index 0000000..c1d9a6b
--- /dev/null
+++ b/python/testData/refactoring/pullup/moveInstanceAttributesSimple.after.py
@@ -0,0 +1,9 @@
+class Parent:
+ def __init__(self):
+ self.instance_field = "eggs"
+
+
+class Child(Parent):
+ def __init__(self):
+ Parent2.__init__(self)
+
diff --git a/python/testData/refactoring/pullup/moveInstanceAttributesSimple.py b/python/testData/refactoring/pullup/moveInstanceAttributesSimple.py
new file mode 100644
index 0000000..2cf1c16
--- /dev/null
+++ b/python/testData/refactoring/pullup/moveInstanceAttributesSimple.py
@@ -0,0 +1,10 @@
+class Parent:
+ def __init__(self):
+ pass
+
+
+class Child(Parent):
+ def __init__(self):
+ Parent2.__init__(self)
+ self.instance_field = "eggs"
+
diff --git a/python/testData/refactoring/pullup/multiFile/Class.after.py b/python/testData/refactoring/pullup/multiFile/Class.after.py
new file mode 100644
index 0000000..1def8e5
--- /dev/null
+++ b/python/testData/refactoring/pullup/multiFile/Class.after.py
@@ -0,0 +1,4 @@
+from SuperClass import SuperClass
+
+class AnyClass(SuperClass):
+ pass
diff --git a/python/testData/refactoring/pullup/presenter/file.py b/python/testData/refactoring/pullup/presenter/file.py
new file mode 100644
index 0000000..cb6ca95
--- /dev/null
+++ b/python/testData/refactoring/pullup/presenter/file.py
@@ -0,0 +1,82 @@
+from datetime import datetime
+from datetime import date
+
+class MainParent(object):
+ pass
+
+class SubParent1(MainParent):
+ def foo(self):
+ pass
+ pass
+
+class SubParent2(MainParent):
+ pass
+
+class Child(SubParent1, SubParent2):
+ def spam(self):
+ pass
+ pass
+
+class NoParentsAllowed(datetime, object):
+ def foo(self):
+ pass
+ pass
+
+
+class NoMembers(object):
+ pass
+
+class BadMro(MainParent, object, SubParent1, SubParent2):
+ pass
+
+class HugeChild(SubParent1, date): #SubParent1 is disabled
+ def __init__(self):
+ self.instance_field_1 = 42
+ self.instance_field_2 = 100500
+
+ CLASS_FIELD = 42
+ (CLASS_FIELD_A,CLASS_FIELD_B) = (42,100500) #We do not support tuples in class assignments for now (see ClassFieldsManager)
+ def foo(self): #should be disabled
+ pass
+ def bar(self):
+ pass
+
+ @classmethod
+ def static_1(cls): # Could be abstract in Py3K
+ pass
+
+ @staticmethod
+ def static_2(): # Could be abstract in Py3K
+ pass
+
+
+ @staticmethod
+ def bad_method(): #Code has errors, so method should be not be marked as static
+ pass
+
+class Bar(object):
+ C = 1
+
+class Foo(Bar):
+ def __init__(self):
+ self.foo = 12
+
+
+class ParentWithConflicts(Bar):
+ CLASS_FIELD = 42
+ def __init__(self):
+ self.instance_field = 12
+
+ def my_func(self):
+ pass
+
+
+class ChildWithConflicts(ParentWithConflicts, Bar): # Bar -> conflict
+ CLASS_FIELD = 42 # Conflict
+ GOOD_FIELD = 32
+ def __init__(self):
+ self.instance_field = 12 # Conflict
+ self.good_instance_field = "egg"
+
+ def my_func(self): # Conflict
+ pass
\ No newline at end of file
diff --git a/python/testData/refactoring/pullup/pyPullUpInfoModel.py b/python/testData/refactoring/pullup/pyPullUpInfoModel.py
new file mode 100644
index 0000000..04f6430
--- /dev/null
+++ b/python/testData/refactoring/pullup/pyPullUpInfoModel.py
@@ -0,0 +1,39 @@
+class EmptyParent:pass
+
+class SomeParent:
+ PARENT_CLASS_FIELD = 42
+
+ def __init__(self):
+ self.parent_instance_field = "egg"
+
+ def parent_func(self):
+ pass
+
+
+class ChildWithDependencies(SomeParent, EmptyParent):
+ CLASS_FIELD_FOO = 42
+ CLASS_FIELD_DEPENDS_ON_CLASS_FIELD_FOO = CLASS_FIELD_FOO
+ CLASS_FIELD_DEPENDS_ON_PARENT_FIELD = SomeParent.PARENT_CLASS_FIELD
+
+ def __init__(self):
+ SomeParent.__init__(self)
+ self.instance_field_bar = 42
+ self.depends_on_instance_field_bar = self.instance_field_bar
+ self.depends_on_class_field_foo = ChildWithDependencies.CLASS_FIELD_FOO
+
+ def normal_method(self):
+ pass
+
+ def method_depends_on_parent_method(self):
+ self.parent_func()
+ pass
+
+ def method_depends_on_parent_field(self):
+ i = self.parent_instance_field
+ pass
+
+ def method_depends_on_normal_method(self):
+ self.normal_method()
+
+ def method_depends_on_instance_field_bar(self):
+ eggs = self.instance_field_bar
\ No newline at end of file
diff --git a/python/testData/refactoring/pullup/severalParents.after.py b/python/testData/refactoring/pullup/severalParents.after.py
new file mode 100644
index 0000000..cd45e22
--- /dev/null
+++ b/python/testData/refactoring/pullup/severalParents.after.py
@@ -0,0 +1,13 @@
+class Spam:
+ pass
+
+class Parent_1(object, Spam):
+ pass
+
+
+class Parent_2():
+ pass
+
+
+class Child(Parent_1, Parent_2):
+ pass
\ No newline at end of file
diff --git a/python/testData/refactoring/pullup/severalParents.py b/python/testData/refactoring/pullup/severalParents.py
new file mode 100644
index 0000000..2c5f7a1
--- /dev/null
+++ b/python/testData/refactoring/pullup/severalParents.py
@@ -0,0 +1,13 @@
+class Spam:
+ pass
+
+class Parent_1(object):
+ pass
+
+
+class Parent_2():
+ pass
+
+
+class Child(Parent_1, Parent_2, Spam):
+ pass
\ No newline at end of file
diff --git a/python/testData/refactoring/pullup/withComments.after.py b/python/testData/refactoring/pullup/withComments.after.py
index ce91117..d2d920f 100644
--- a/python/testData/refactoring/pullup/withComments.after.py
+++ b/python/testData/refactoring/pullup/withComments.after.py
@@ -2,8 +2,10 @@
def foo(self):
print("a")
- # this is boo
def boo(self):
+ """
+ In python we use multi-line comments inside of method body
+ """
print "rrrrr"
diff --git a/python/testData/refactoring/pullup/withComments.py b/python/testData/refactoring/pullup/withComments.py
index 32edbc3..a044302 100644
--- a/python/testData/refactoring/pullup/withComments.py
+++ b/python/testData/refactoring/pullup/withComments.py
@@ -3,6 +3,8 @@
print("a")
class Boo(Foo):
- # this is boo
def boo(self):
+ """
+ In python we use multi-line comments inside of method body
+ """
print "rrrrr"
\ No newline at end of file
diff --git a/python/testData/refactoring/pushdown/existingmethod.after.py b/python/testData/refactoring/pushdown/existingmethod.after.py
index 25daa38..b396cd5 100644
--- a/python/testData/refactoring/pushdown/existingmethod.after.py
+++ b/python/testData/refactoring/pushdown/existingmethod.after.py
@@ -1,5 +1,7 @@
class Foo:
+ pass
-class Boo():
+
+class Boo(Foo):
def foo(self):
print "rrrrr"
\ No newline at end of file
diff --git a/python/testData/refactoring/pushdown/full.after.py b/python/testData/refactoring/pushdown/full.after.py
new file mode 100644
index 0000000..0845450
--- /dev/null
+++ b/python/testData/refactoring/pushdown/full.after.py
@@ -0,0 +1,48 @@
+class Dummny(object):
+ pass
+
+
+class Parent(object):
+ """
+ This class is usefull.
+ """
+ CLASS_VAR_2 = 2
+
+ def __init__(self): pass
+
+
+ def method_2(self):
+ i = 1
+
+
+class Child_1(Parent, Dummny):
+ CLASS_VAR_1 = 1
+
+ def __init__(self):
+ self.inst_var = 12
+ self.bar = 64
+
+ def method_1(self):
+ """
+ Some text
+ """
+ pass
+
+
+class Child_2(Parent, Dummny):
+ """
+ This class implements most sophisticated algorithm
+ """
+ CLASS_VAR_1 = 1
+
+ def __init__(self):
+ self.inst_var = 12
+
+ def lala(self):
+ pass
+
+ def method_1(self):
+ """
+ Some text
+ """
+ pass
diff --git a/python/testData/refactoring/pushdown/full.before.py b/python/testData/refactoring/pushdown/full.before.py
new file mode 100644
index 0000000..30b205b
--- /dev/null
+++ b/python/testData/refactoring/pushdown/full.before.py
@@ -0,0 +1,37 @@
+class Dummny(object):
+ pass
+
+
+class Parent(object, Dummny):
+ """
+ This class is usefull.
+ """
+ CLASS_VAR_1 = 1
+ CLASS_VAR_2 = 2
+
+ def __init__(self):
+ self.inst_var = 12
+
+
+ def method_1(self):
+ """
+ Some text
+ """
+ pass
+
+ def method_2(self):
+ i = 1
+
+
+class Child_1(Parent):
+ def __init__(self):
+ self.bar = 64
+ pass
+
+
+class Child_2(Parent):
+ """
+ This class implements most sophisticated algorithm
+ """
+ def lala(self):
+ pass
diff --git a/python/testData/refactoring/pushdown/multiFileImports/child_module.after.py b/python/testData/refactoring/pushdown/multiFileImports/child_module.after.py
new file mode 100644
index 0000000..020596c
--- /dev/null
+++ b/python/testData/refactoring/pushdown/multiFileImports/child_module.after.py
@@ -0,0 +1,7 @@
+from parent_module import Parent
+from shared_module import module_function
+
+
+class Child(Parent):
+ def should_be_pushed(self):
+ module_function()
\ No newline at end of file
diff --git a/python/testData/refactoring/pushdown/multiFileImports/child_module.py b/python/testData/refactoring/pushdown/multiFileImports/child_module.py
new file mode 100644
index 0000000..86716f1
--- /dev/null
+++ b/python/testData/refactoring/pushdown/multiFileImports/child_module.py
@@ -0,0 +1,4 @@
+from parent_module import Parent
+
+class Child(Parent):
+ pass
\ No newline at end of file
diff --git a/python/testData/refactoring/pushdown/multiFileImports/parent_module.after.py b/python/testData/refactoring/pushdown/multiFileImports/parent_module.after.py
new file mode 100644
index 0000000..b63dd44
--- /dev/null
+++ b/python/testData/refactoring/pushdown/multiFileImports/parent_module.after.py
@@ -0,0 +1,2 @@
+class Parent(object):
+ pass
\ No newline at end of file
diff --git a/python/testData/refactoring/pushdown/multiFileImports/parent_module.py b/python/testData/refactoring/pushdown/multiFileImports/parent_module.py
new file mode 100644
index 0000000..aeeb449
--- /dev/null
+++ b/python/testData/refactoring/pushdown/multiFileImports/parent_module.py
@@ -0,0 +1,6 @@
+from shared_module import module_function
+
+
+class Parent(object):
+ def should_be_pushed(self):
+ module_function()
\ No newline at end of file
diff --git a/python/testData/refactoring/pushdown/multiFileImports/shared_module.py b/python/testData/refactoring/pushdown/multiFileImports/shared_module.py
new file mode 100644
index 0000000..13fe833
--- /dev/null
+++ b/python/testData/refactoring/pushdown/multiFileImports/shared_module.py
@@ -0,0 +1,9 @@
+MODULE_CONTANT = 42
+
+
+def module_function():
+ pass
+
+
+class ModuleClass(object):
+ pass
\ No newline at end of file
diff --git a/python/testData/refactoring/rename/docstringParams.py b/python/testData/refactoring/rename/docstringParams.py
new file mode 100644
index 0000000..4a79b84
--- /dev/null
+++ b/python/testData/refactoring/rename/docstringParams.py
@@ -0,0 +1,9 @@
+class SomeClass(object):
+ """ Awesome class
+
+ @ivar someVar: great stuff
+ @type someVar: string
+ """
+
+ def __init__(self):
+ self.some<caret>Var = None
\ No newline at end of file
diff --git a/python/testData/refactoring/rename/docstringParams_after.py b/python/testData/refactoring/rename/docstringParams_after.py
new file mode 100644
index 0000000..ae4d5e5
--- /dev/null
+++ b/python/testData/refactoring/rename/docstringParams_after.py
@@ -0,0 +1,9 @@
+class SomeClass(object):
+ """ Awesome class
+
+ @ivar bar: great stuff
+ @type bar: string
+ """
+
+ def __init__(self):
+ self.bar = None
\ No newline at end of file
diff --git a/python/testData/refactoring/unwrap/ifInIfUnwrap_after.py b/python/testData/refactoring/unwrap/ifInIfUnwrap_after.py
index 68407fb..1473f8f 100644
--- a/python/testData/refactoring/unwrap/ifInIfUnwrap_after.py
+++ b/python/testData/refactoring/unwrap/ifInIfUnwrap_after.py
@@ -1,4 +1,4 @@
if False:
- #comment
+ # comment
x = 1<caret>
y = 2
diff --git a/python/testData/refactoring/unwrap/ifInIfUnwrap_before.py b/python/testData/refactoring/unwrap/ifInIfUnwrap_before.py
index 2bb897c..4e4fa45 100644
--- a/python/testData/refactoring/unwrap/ifInIfUnwrap_before.py
+++ b/python/testData/refactoring/unwrap/ifInIfUnwrap_before.py
@@ -1,5 +1,5 @@
if False:
if True:
- #comment
+ # comment
x = 1<caret>
y = 2
diff --git a/python/testData/refactoring/unwrap/ifInWhileUnwrap_after.py b/python/testData/refactoring/unwrap/ifInWhileUnwrap_after.py
index a3de7bd..61a8c67 100644
--- a/python/testData/refactoring/unwrap/ifInWhileUnwrap_after.py
+++ b/python/testData/refactoring/unwrap/ifInWhileUnwrap_after.py
@@ -1,4 +1,4 @@
while False:
- #comment
+ # comment
x = 1<caret>
y = 2
diff --git a/python/testData/refactoring/unwrap/ifInWhileUnwrap_before.py b/python/testData/refactoring/unwrap/ifInWhileUnwrap_before.py
index a612cbc..b47a4d5 100644
--- a/python/testData/refactoring/unwrap/ifInWhileUnwrap_before.py
+++ b/python/testData/refactoring/unwrap/ifInWhileUnwrap_before.py
@@ -1,5 +1,5 @@
while False:
if True:
- #comment
+ # comment
x = 1<caret>
y = 2
diff --git a/python/testData/refactoring/unwrap/whileInIfUnwrap_after.py b/python/testData/refactoring/unwrap/whileInIfUnwrap_after.py
index 02d1de0..a855afb 100644
--- a/python/testData/refactoring/unwrap/whileInIfUnwrap_after.py
+++ b/python/testData/refactoring/unwrap/whileInIfUnwrap_after.py
@@ -1,4 +1,4 @@
if True:
- #comment
+ # comment
x = 1<caret>
y = 2
diff --git a/python/testData/refactoring/unwrap/whileInIfUnwrap_before.py b/python/testData/refactoring/unwrap/whileInIfUnwrap_before.py
index 3fb06a2..ddd29ac 100644
--- a/python/testData/refactoring/unwrap/whileInIfUnwrap_before.py
+++ b/python/testData/refactoring/unwrap/whileInIfUnwrap_before.py
@@ -1,5 +1,5 @@
if True:
while False:
- #comment
+ # comment
x = 1<caret>
y = 2
diff --git a/python/testData/refactoring/unwrap/whileInWhileUnwrap_after.py b/python/testData/refactoring/unwrap/whileInWhileUnwrap_after.py
index d5a3c2b..fc23ac4 100644
--- a/python/testData/refactoring/unwrap/whileInWhileUnwrap_after.py
+++ b/python/testData/refactoring/unwrap/whileInWhileUnwrap_after.py
@@ -1,4 +1,4 @@
while True:
- #comment
+ # comment
x = 1<caret>
y = 2
diff --git a/python/testData/refactoring/unwrap/whileInWhileUnwrap_before.py b/python/testData/refactoring/unwrap/whileInWhileUnwrap_before.py
index 631003f..a7cb503 100644
--- a/python/testData/refactoring/unwrap/whileInWhileUnwrap_before.py
+++ b/python/testData/refactoring/unwrap/whileInWhileUnwrap_before.py
@@ -1,5 +1,5 @@
while True:
while False:
- #comment
+ # comment
x = 1<caret>
y = 2
diff --git a/python/testData/stubs/MetaClass.py b/python/testData/stubs/MetaClass.py
new file mode 100644
index 0000000..d882691
--- /dev/null
+++ b/python/testData/stubs/MetaClass.py
@@ -0,0 +1,13 @@
+class M(type):
+ pass
+
+
+__metaclass__ = M
+
+
+class C(object):
+ __metaclass__ = type
+
+
+class D(object):
+ pass
diff --git a/python/testData/surround/SurroundWithTryExcept.py b/python/testData/surround/SurroundWithTryExcept.py
index faee07e..ee6e2cb 100644
--- a/python/testData/surround/SurroundWithTryExcept.py
+++ b/python/testData/surround/SurroundWithTryExcept.py
@@ -1,2 +1,2 @@
def foo():
- <selection>print "hello"</selection>
\ No newline at end of file
+ pr<caret>int "hello"
\ No newline at end of file
diff --git a/python/testData/surround/SurroundWithTryExcept_after.py b/python/testData/surround/SurroundWithTryExcept_after.py
index 54b20bc..ae244ff 100644
--- a/python/testData/surround/SurroundWithTryExcept_after.py
+++ b/python/testData/surround/SurroundWithTryExcept_after.py
@@ -2,4 +2,4 @@
try:
print "hello"
except:
- <selection>pass</selection>
\ No newline at end of file
+ <selection>pass</selection>
diff --git a/python/testData/wrap/DontWrapStartOfString.after.py b/python/testData/wrap/DontWrapStartOfString.after.py
new file mode 100644
index 0000000..f3fc48a
--- /dev/null
+++ b/python/testData/wrap/DontWrapStartOfString.after.py
@@ -0,0 +1,2 @@
+call_command(' '
+ 'regressiontests_some_long_text_here_to_test_right_margin_some_long_text_here_to_test_right_margin_some_long_text_here_to_test_right_margin')
\ No newline at end of file
diff --git a/python/testData/wrap/DontWrapStartOfString.py b/python/testData/wrap/DontWrapStartOfString.py
new file mode 100644
index 0000000..06905d2
--- /dev/null
+++ b/python/testData/wrap/DontWrapStartOfString.py
@@ -0,0 +1 @@
+call_command(' regressiontests<caret>')
\ No newline at end of file
diff --git a/python/testData/wrap/wrapRightMargin.after.py b/python/testData/wrap/wrapRightMargin.after.py
index b7ed9d5..1d20b40 100644
--- a/python/testData/wrap/wrapRightMargin.after.py
+++ b/python/testData/wrap/wrapRightMargin.after.py
@@ -1,4 +1,4 @@
def do_stuff():
another_long_variable = a_really_long_function_name_with_parameters(12,
this_is_the_first_param=23,
- this_is_the_second=45).do_more_stuff_to_the_result()
+ this_is_the_second=45).do_more_stuff_to_the_result()
diff --git a/python/testSrc/com/jetbrains/python/PyAutoUnindentTest.java b/python/testSrc/com/jetbrains/python/PyAutoUnindentTest.java
index 18fdeec..995ab6a 100644
--- a/python/testSrc/com/jetbrains/python/PyAutoUnindentTest.java
+++ b/python/testSrc/com/jetbrains/python/PyAutoUnindentTest.java
@@ -17,7 +17,7 @@
import com.intellij.codeInsight.completion.CompletionType;
import com.intellij.codeInsight.lookup.LookupElement;
-import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.util.Computable;
import com.intellij.psi.PsiFile;
import com.jetbrains.python.fixtures.PyTestCase;
@@ -78,7 +78,7 @@
private void doTyping(final char character) {
final int offset = myFixture.getEditor().getCaretModel().getOffset();
- final PsiFile file = ApplicationManager.getApplication().runWriteAction(new Computable<PsiFile>() {
+ final PsiFile file = WriteCommandAction.runWriteCommandAction(null, new Computable<PsiFile>() {
@Override
public PsiFile compute() {
myFixture.getEditor().getCaretModel().moveToOffset(offset);
diff --git a/python/testSrc/com/jetbrains/python/PyClassicPropertyTest.java b/python/testSrc/com/jetbrains/python/PyClassicPropertyTest.java
index 7947ffb..2e55003 100644
--- a/python/testSrc/com/jetbrains/python/PyClassicPropertyTest.java
+++ b/python/testSrc/com/jetbrains/python/PyClassicPropertyTest.java
@@ -38,7 +38,7 @@
public void testV1() throws Exception {
Property p;
Maybe<Callable> accessor;
- p = myClass.findProperty("v1");
+ p = myClass.findProperty("v1", true);
assertNotNull(p);
assertNull(p.getDoc());
PyTargetExpression site = p.getDefinitionSite();
@@ -62,7 +62,7 @@
public void testV2() throws Exception {
Property p;
Maybe<Callable> accessor;
- p = myClass.findProperty("v2");
+ p = myClass.findProperty("v2", true);
assertNotNull(p);
assertEquals("doc of v2", p.getDoc());
PyTargetExpression site = p.getDefinitionSite();
@@ -86,7 +86,7 @@
public void testV3() throws Exception {
Maybe<Callable> accessor;
- Property p = myClass.findProperty("v3");
+ Property p = myClass.findProperty("v3", true);
assertNotNull(p);
assertNull(p.getDoc());
PyTargetExpression site = p.getDefinitionSite();
diff --git a/python/testSrc/com/jetbrains/python/PyDecoratedPropertyTest.java b/python/testSrc/com/jetbrains/python/PyDecoratedPropertyTest.java
index 414c355..ac9f83a 100644
--- a/python/testSrc/com/jetbrains/python/PyDecoratedPropertyTest.java
+++ b/python/testSrc/com/jetbrains/python/PyDecoratedPropertyTest.java
@@ -35,7 +35,7 @@
Property p;
Maybe<Callable> accessor;
final String name = "w1";
- p = myClass.findProperty(name);
+ p = myClass.findProperty(name, true);
assertNotNull(p);
assertNull(p.getDoc());
assertNull(p.getDefinitionSite());
@@ -60,7 +60,7 @@
Property p;
Maybe<Callable> accessor;
final String name = "w2";
- p = myClass.findProperty(name);
+ p = myClass.findProperty(name, true);
assertNotNull(p);
assertNull(p.getDoc());
assertNull(p.getDefinitionSite());
diff --git a/python/testSrc/com/jetbrains/python/PyDeprecationTest.java b/python/testSrc/com/jetbrains/python/PyDeprecationTest.java
index 450a99b..dffa4bc 100644
--- a/python/testSrc/com/jetbrains/python/PyDeprecationTest.java
+++ b/python/testSrc/com/jetbrains/python/PyDeprecationTest.java
@@ -15,6 +15,7 @@
*/
package com.jetbrains.python;
+import com.intellij.testFramework.PlatformTestUtil;
import com.jetbrains.python.fixtures.PyTestCase;
import com.jetbrains.python.inspections.PyDeprecationInspection;
import com.jetbrains.python.psi.PyFile;
@@ -43,9 +44,13 @@
public void testFunctionStub() {
myFixture.configureByFile("deprecation/functionStub.py");
- PyFunction getstatus = ((PyFile) myFixture.getFile()).findTopLevelFunction("getstatus");
- assertEquals("commands.getstatus() is deprecated", getstatus.getDeprecationMessage());
- assertNotParsed((PyFile) myFixture.getFile());
+ PyFile file = (PyFile)myFixture.getFile();
+ assertEquals("commands.getstatus() is deprecated", file.findTopLevelFunction("getstatus").getDeprecationMessage());
+ PlatformTestUtil.tryGcSoftlyReachableObjects();
+ assertNotParsed(file);
+
+ assertEquals("commands.getstatus() is deprecated", file.findTopLevelFunction("getstatus").getDeprecationMessage());
+ assertNotParsed(file);
}
public void testDeprecatedAsFallback() {
@@ -68,7 +73,13 @@
public void testFileStub() {
myFixture.configureByFile("deprecation/deprecatedModule.py");
- assertEquals("the deprecated module is deprecated; use a non-deprecated module instead", ((PyFile) myFixture.getFile()).getDeprecationMessage());
- assertNotParsed((PyFile) myFixture.getFile());
+ PyFile file = (PyFile)myFixture.getFile();
+ assertEquals("the deprecated module is deprecated; use a non-deprecated module instead", file.getDeprecationMessage());
+ PlatformTestUtil.tryGcSoftlyReachableObjects();
+ assertNotParsed(file);
+
+ assertEquals("the deprecated module is deprecated; use a non-deprecated module instead", file.getDeprecationMessage());
+ assertNotParsed(file);
+
}
}
diff --git a/python/testSrc/com/jetbrains/python/PyEditingTest.java b/python/testSrc/com/jetbrains/python/PyEditingTest.java
index 6619bf8..84470af 100644
--- a/python/testSrc/com/jetbrains/python/PyEditingTest.java
+++ b/python/testSrc/com/jetbrains/python/PyEditingTest.java
@@ -20,12 +20,14 @@
import com.intellij.openapi.actionSystem.ActionManager;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.IdeActions;
-import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.command.CommandProcessor;
+import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.editor.LogicalPosition;
import com.intellij.openapi.editor.ex.EditorSettingsExternalizable;
import com.intellij.openapi.util.Computable;
import com.intellij.psi.PsiFile;
+import com.jetbrains.python.documentation.DocStringFormat;
+import com.jetbrains.python.documentation.PyDocumentationSettings;
import com.jetbrains.python.fixtures.PyTestCase;
/**
@@ -142,7 +144,7 @@
}
public void testEnterInStatement() {
- doTestEnter("if a <caret>and b: pass", "if a \\\n and b: pass");
+ doTestEnter("if a <caret>and b: pass", "if a \\\n and b: pass");
}
public void testEnterBeforeStatement() {
@@ -202,10 +204,17 @@
}
public void testEnterStubInDocstring() { // CR-PY-144
- doTestEnter("def foo():\n \"\"\"<caret>", "def foo():\n" +
- " \"\"\"\n" +
- " \n" +
- " \"\"\"");
+ final PyDocumentationSettings documentationSettings = PyDocumentationSettings.getInstance(myFixture.getModule());
+ final String oldFormat = documentationSettings.getFormat();
+ documentationSettings.setFormat(DocStringFormat.PLAIN);
+ try {
+ doTestEnter("def foo():\n \"\"\"<caret>", "def foo():\n" +
+ " \"\"\"\n" +
+ " \n" +
+ " \"\"\"");
+ } finally {
+ documentationSettings.setFormat(oldFormat);
+ }
}
public void testEnterInString() { // PY-1738
@@ -216,7 +225,7 @@
public void testEnterInImportWithParens() { // PY-2661
doTestEnter("from django.http import (HttpResponse,<caret>)",
"from django.http import (HttpResponse,\n" +
- " )");
+ ")");
}
public void testEnterInKeyword() {
@@ -288,10 +297,10 @@
}
public void testParenthesizedInIf() {
- doTestEnter("if isinstance(bz_value, list) and <caret>(isinstance(bz_value[0], str):\n" +
+ doTestEnter("if isinstance(bz_value, list) and <caret>(isinstance(bz_value[0], str)):\n" +
" pass",
- "if isinstance(bz_value, list) and \n" +
- "(isinstance(bz_value[0], str):\n" +
+ "if isinstance(bz_value, list) and \\\n" +
+ " (isinstance(bz_value[0], str)):\n" +
" pass");
}
@@ -323,7 +332,7 @@
}
private String doTestTyping(final String text, final int offset, final char character) {
- final PsiFile file = ApplicationManager.getApplication().runWriteAction(new Computable<PsiFile>() {
+ final PsiFile file = WriteCommandAction.runWriteCommandAction(null, new Computable<PsiFile>() {
@Override
public PsiFile compute() {
final PsiFile file = myFixture.configureByText(PythonFileType.INSTANCE, text);
@@ -344,7 +353,7 @@
private void doTyping(final char character) {
final int offset = myFixture.getEditor().getCaretModel().getOffset();
- final PsiFile file = ApplicationManager.getApplication().runWriteAction(new Computable<PsiFile>() {
+ final PsiFile file = WriteCommandAction.runWriteCommandAction(null, new Computable<PsiFile>() {
@Override
public PsiFile compute() {
myFixture.getEditor().getCaretModel().moveToOffset(offset);
diff --git a/python/testSrc/com/jetbrains/python/PyFormatterTest.java b/python/testSrc/com/jetbrains/python/PyFormatterTest.java
index bf6c1fe..3983689 100644
--- a/python/testSrc/com/jetbrains/python/PyFormatterTest.java
+++ b/python/testSrc/com/jetbrains/python/PyFormatterTest.java
@@ -15,7 +15,7 @@
*/
package com.jetbrains.python;
-import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.codeStyle.CodeStyleManager;
@@ -118,6 +118,10 @@
doTest();
}
+ public void testCommentInEmptyTuple() { //PY-11904
+ doTest();
+ }
+
public void testTwoLinesBetweenTopLevelClasses() { // PY-2765
doTest();
}
@@ -126,6 +130,10 @@
doTest();
}
+ public void testTwoLinesBetweenTopLevelDeclarationsWithComment() { // PY-9923
+ doTest();
+ }
+
public void testSpecialSlice() { // PY-1928
doTest();
}
@@ -199,6 +207,14 @@
doTest();
}
+ public void testContinuationIndentInIndentingStatement() { // PY-9573
+ doTest();
+ }
+
+ public void testContinuationIndentInIndentingStatement2() { // PY-11868
+ doTest();
+ }
+
public void testBlankLineAfterDecorator() {
doTest();
}
@@ -235,7 +251,7 @@
" desired_response_parameters,\n" +
" inverse_filter_length, \n" +
" observed_impulse_response):\n" +
- " # Extract from here to ...\n" +
+ " # Extract from here to ...\n" +
" desired_impulse_response = {'dirac, 'gaussian', logistic_derivative'}\n" +
"return desired, o";
@@ -248,7 +264,7 @@
" desired_response_parameters,\n" +
" inverse_filter_length,\n" +
" observed_impulse_response):\n" +
- "# Extract from here to ...\n" +
+ " # Extract from here to ...\n" +
" desired_impulse_response = {'dirac, '\n" +
" gaussian\n" +
" ', logistic_derivative'}\n" +
@@ -283,6 +299,14 @@
doTest();
}
+ public void testAlignInCallExpression() {
+ doTest();
+ }
+
+ public void _testAlignInNestedCallInWith() { //PY-11337 TODO:
+ doTest();
+ }
+
public void testContinuationIndentForCallInStatementPart() { // PY-8577
doTest();
}
@@ -290,8 +314,8 @@
public void testIfConditionContinuation() { // PY-8195
doTest();
}
-
- public void _testIndentInNestedCall() { // PY-8195
+
+ public void _testIndentInNestedCall() { // PY-11919 TODO: required changes in formatter to be able to make indent relative to block or alignment
doTest();
}
@@ -329,7 +353,7 @@
public void testWrapInBinaryExpression() { // PY-9032
settings().RIGHT_MARGIN = 80;
- doTest();
+ doTest(true);
}
public void testSpaceWithinDeclarationParentheses() { // PY-8818
@@ -337,7 +361,7 @@
doTest();
}
- public void _testWrapBeforeElse() { // PY-10319
+ public void testWrapBeforeElse() { // PY-10319
doTest(true);
}
@@ -345,13 +369,42 @@
doTest();
}
+ public void testWrapImports() { // PY-9163
+ settings().RIGHT_MARGIN = 80;
+ doTest();
+ }
+
+ public void testCommentAfterBlock() { // PY-9542
+ doTest();
+ }
+
+ public void testWrapOnDot() { // PY-6359
+ doTest();
+ }
+
+ public void testIndentParensInImport() { // PY-9075
+ doTest();
+ }
+
+ public void testAlignInParenthesizedExpression() {
+ doTest();
+ }
+
+ public void testAlignInParameterList() {
+ doTest();
+ }
+
+ public void testAlignListComprehensionInDict() { //PY-10076
+ doTest();
+ }
+
private void doTest() {
doTest(false);
}
private void doTest(final boolean reformatText) {
myFixture.configureByFile("formatter/" + getTestName(true) + ".py");
- ApplicationManager.getApplication().runWriteAction(new Runnable() {
+ WriteCommandAction.runWriteCommandAction(null, new Runnable() {
@Override
public void run() {
CodeStyleManager codeStyleManager = CodeStyleManager.getInstance(myFixture.getProject());
diff --git a/python/testSrc/com/jetbrains/python/PyIndexingTest.java b/python/testSrc/com/jetbrains/python/PyIndexingTest.java
new file mode 100644
index 0000000..03d3f69
--- /dev/null
+++ b/python/testSrc/com/jetbrains/python/PyIndexingTest.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python;
+
+import com.jetbrains.python.fixtures.PyTestCase;
+import com.jetbrains.python.psi.stubs.PyModuleNameIndex;
+
+import java.util.Collection;
+
+/**
+ * @author vlan
+ */
+public class PyIndexingTest extends PyTestCase {
+ public static final String TEST_DIRECTORY = "indexing/";
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ final String testName = getTestName(false);
+ myFixture.copyDirectoryToProject(TEST_DIRECTORY + testName, "");
+ myFixture.configureFromTempProjectFile("a.py");
+ }
+
+ public void testModuleNameIndex() {
+ final Collection<String> modules = PyModuleNameIndex.getAllKeys(myFixture.getProject());
+ assertContainsElements(modules, "ModuleNameIndex_foo");
+ assertContainsElements(modules, "ModuleNameIndex_bar");
+ assertDoesntContain(modules, "__init__");
+ assertDoesntContain(modules, "ModuleNameIndex_baz");
+ }
+}
diff --git a/python/testSrc/com/jetbrains/python/PyJoinLinesTest.java b/python/testSrc/com/jetbrains/python/PyJoinLinesTest.java
index 699e8c7..856ddb7 100644
--- a/python/testSrc/com/jetbrains/python/PyJoinLinesTest.java
+++ b/python/testSrc/com/jetbrains/python/PyJoinLinesTest.java
@@ -16,8 +16,7 @@
package com.jetbrains.python;
import com.intellij.codeInsight.editorActions.JoinRawLinesHandlerDelegate;
-import com.intellij.openapi.application.Result;
-import com.intellij.openapi.application.WriteAction;
+import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
import com.jetbrains.python.editor.PyJoinLinesHandler;
@@ -46,12 +45,12 @@
while (" \n\t".indexOf(text.charAt(i)) >= 0) i += 1;
final int end = i;
final JoinRawLinesHandlerDelegate handler = new PyJoinLinesHandler();
- new WriteAction() {
+ WriteCommandAction.runWriteCommandAction(myFixture.getProject(), new Runnable() {
@Override
- protected void run(Result result) throws Throwable {
+ public void run() {
handler.tryJoinRawLines(doc, myFixture.getFile(), start, end);
}
- }.execute().throwException();
+ });
myFixture.checkResultByFile(path + getTestName(false) + "-after.py");
}
diff --git a/python/testSrc/com/jetbrains/python/PyOverrideTest.java b/python/testSrc/com/jetbrains/python/PyOverrideTest.java
index ed7fc43..d86f25d 100644
--- a/python/testSrc/com/jetbrains/python/PyOverrideTest.java
+++ b/python/testSrc/com/jetbrains/python/PyOverrideTest.java
@@ -130,6 +130,10 @@
doTest3k();
}
+ public void testDocstring() {
+ doTest();
+ }
+
// PY-10229
public void testInstanceCheck() {
myFixture.configureByFile("override/" + getTestName(true) + ".py");
diff --git a/python/testSrc/com/jetbrains/python/PyQuickDocTest.java b/python/testSrc/com/jetbrains/python/PyQuickDocTest.java
index 0b78bd5..fb45fae 100644
--- a/python/testSrc/com/jetbrains/python/PyQuickDocTest.java
+++ b/python/testSrc/com/jetbrains/python/PyQuickDocTest.java
@@ -20,6 +20,8 @@
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement;
import com.intellij.testFramework.TestDataFile;
+import com.jetbrains.python.documentation.DocStringFormat;
+import com.jetbrains.python.documentation.PyDocumentationSettings;
import com.jetbrains.python.documentation.PythonDocumentationProvider;
import com.jetbrains.python.fixtures.LightMarkedTestCase;
import com.jetbrains.python.fixtures.PyTestCase;
@@ -35,12 +37,23 @@
*/
public class PyQuickDocTest extends LightMarkedTestCase {
private PythonDocumentationProvider myProvider;
+ private String myFormat;
@Override
protected void setUp() throws Exception {
super.setUp();
// the provider is stateless, can be reused, as in real life
myProvider = new PythonDocumentationProvider();
+ final PyDocumentationSettings documentationSettings = PyDocumentationSettings.getInstance(myFixture.getModule());
+ myFormat = documentationSettings.getFormat();
+ documentationSettings.setFormat(DocStringFormat.PLAIN);
+ }
+
+ @Override
+ public void tearDown() throws Exception {
+ final PyDocumentationSettings documentationSettings = PyDocumentationSettings.getInstance(myFixture.getModule());
+ documentationSettings.setFormat(myFormat);
+ super.tearDown();
}
private void checkByHTML(String text) {
diff --git a/python/testSrc/com/jetbrains/python/PyQuickFixTest.java b/python/testSrc/com/jetbrains/python/PyQuickFixTest.java
index e0f82b0..2f5d1f7 100644
--- a/python/testSrc/com/jetbrains/python/PyQuickFixTest.java
+++ b/python/testSrc/com/jetbrains/python/PyQuickFixTest.java
@@ -173,13 +173,6 @@
doInspectionTest("AddClass.py", PyUnresolvedReferencesInspection.class, "Create class 'Xyzzy'", true, true);
}
- public void testFieldFromUnusedParameter() { // PY-1398
- doInspectionTest("FieldFromUnusedParameter.py", PyUnusedLocalInspection.class, "Add field 'foo' to class A", true, true);
- }
-
- public void testFieldFromUnusedParameterKeyword() { // PY-1602
- doInspectionTest("FieldFromUnusedParameterKeyword.py", PyUnusedLocalInspection.class, "Add field 'foo' to class A", true, true);
- }
public void testAddFunctionToModule() { // PY-1602
doInspectionTest(
@@ -247,16 +240,6 @@
PyBundle.message("QFIX.statement.effect"), true, true);
}
- public void testStatementEffectPrint() {
- setLanguageLevel(LanguageLevel.PYTHON33);
- try {
- doInspectionTest("StatementEffectPrint.py", PyStatementEffectInspection.class,
- PyBundle.message("QFIX.statement.effect"), true, true);
- } finally {
- setLanguageLevel(LanguageLevel.getDefault());
- }
- }
-
public void testStatementEffectIntroduceVariable() { // PY-1265
doInspectionTest("StatementEffectIntroduceVariable.py", PyStatementEffectInspection.class,
PyBundle.message("QFIX.statement.effect.introduce.variable"), true, true);
@@ -273,6 +256,15 @@
PyBundle.message("QFIX.unresolved.reference.create.function.$0", "ref"), true, true);
}
+ public void testUnresolvedRefNoCreateFunction() {
+ myFixture.enableInspections(PyUnresolvedReferencesInspection.class);
+ myFixture.configureByFile("UnresolvedRefNoCreateFunction.py");
+ myFixture.checkHighlighting(true, false, false);
+ final IntentionAction intentionAction = myFixture.getAvailableIntention(
+ PyBundle.message("QFIX.unresolved.reference.create.function.$0", "ref"));
+ assertNull(intentionAction);
+ }
+
public void testReplaceNotEqOperator() {
doInspectionTest("ReplaceNotEqOperator.py", PyCompatibilityInspection.class,
PyBundle.message("INTN.replace.noteq.operator"), true, true);
@@ -313,6 +305,17 @@
PyBundle.message("QFIX.add.super"), true, true);
}
+ public void testAddCallSuperAnnotations() {
+ runWithLanguageLevel(LanguageLevel.PYTHON33, new Runnable() {
+ @Override
+ public void run() {
+ doInspectionTest("AddCallSuperAnnotations.py",
+ PyMissingConstructorInspection.class,
+ PyBundle.message("QFIX.add.super"), true, true);
+ }
+ });
+ }
+
public void testAddCallSuperPass() { //PY-8654
doInspectionTest("AddCallSuperPass.py", PyMissingConstructorInspection.class,
PyBundle.message("QFIX.add.super"), true, true);
@@ -333,11 +336,6 @@
PyBundle.message("QFIX.unresolved.reference.add.param.$0", "test"), true, true);
}
- public void testMoveDocstring() { //PY-4398
- doInspectionTest("MoveDocstring.py", PyStatementEffectInspection.class,
- PyBundle.message("QFIX.statement.effect.move.docstring"), true, true);
- }
-
public void testRenameUnresolvedReference() { //PY-6595
doInspectionTest("RenameUnresolvedReference.py", PyUnresolvedReferencesInspection.class,
PyBundle.message("QFIX.rename.unresolved.reference"), true, true);
@@ -349,6 +347,11 @@
PyBundle.message("QFIX.replace.function.set.with.literal"), true, true);
}
+ public void testDictComprehensionToCall() {
+ doInspectionTest("DictComprehensionToCall.py", PyCompatibilityInspection.class,
+ PyBundle.message("INTN.convert.dict.comp.to"), true, true);
+ }
+
public void testDocstringParams() { //PY-3394
PyDocumentationSettings documentationSettings = PyDocumentationSettings.getInstance(myFixture.getModule());
documentationSettings.setFormat(DocStringFormat.EPYTEXT);
diff --git a/python/testSrc/com/jetbrains/python/PyRegexpTest.java b/python/testSrc/com/jetbrains/python/PyRegexpTest.java
index 3befb2c..cce3941 100644
--- a/python/testSrc/com/jetbrains/python/PyRegexpTest.java
+++ b/python/testSrc/com/jetbrains/python/PyRegexpTest.java
@@ -127,7 +127,7 @@
"\n" +
"def f(x, y):\n" +
" re.search('<caret>.*(' + x + ')' + y, 'foo')\n",
- ".*(missing)missing");
+ ".*(missing_value)missing_value");
}
public void testPercentFormattingRegexpAutoInjection() {
@@ -135,7 +135,7 @@
"\n" +
"def f(x, y):\n" +
" re.search('<caret>.*%s-%d' % (x, y), 'foo')\n",
- ".*missing-missing");
+ ".*missing_value-missing_value");
}
public void testNewStyleFormattingRegexpAutoInjection() {
@@ -143,7 +143,7 @@
"\n" +
"def f(x, y):\n" +
" re.search('<caret>.*{foo}-{}'.format(x, foo=y), 'foo')\n",
- ".*missing-missing");
+ ".*missing_value-missing_value");
}
public void testNewStyleFormattingEndsWithConstant() {
@@ -151,7 +151,7 @@
"\n" +
"def f(**kwargs):" +
" re.search('<caret>(foo{bar}baz$)'.format(**kwargs), 'foo')\n",
- "(foomissingbaz$)");
+ "(foomissing_valuebaz$)");
}
private void doTestInjectedText(@NotNull String text, @NotNull String expected) {
diff --git a/python/testSrc/com/jetbrains/python/PyRequirementTest.java b/python/testSrc/com/jetbrains/python/PyRequirementTest.java
index 18e6bdd..75fb9a5 100644
--- a/python/testSrc/com/jetbrains/python/PyRequirementTest.java
+++ b/python/testSrc/com/jetbrains/python/PyRequirementTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/python/testSrc/com/jetbrains/python/PyStatementMoverTest.java b/python/testSrc/com/jetbrains/python/PyStatementMoverTest.java
index 583864a..3539150 100644
--- a/python/testSrc/com/jetbrains/python/PyStatementMoverTest.java
+++ b/python/testSrc/com/jetbrains/python/PyStatementMoverTest.java
@@ -256,6 +256,10 @@
doTest();
}
+ public void testInsideDocComment() { //PY-11595
+ doTest();
+ }
+
public void testWith() { // PY-5202
try {
setLanguageLevel(LanguageLevel.PYTHON27);
diff --git a/python/testSrc/com/jetbrains/python/PyStringFormatParserTest.java b/python/testSrc/com/jetbrains/python/PyStringFormatParserTest.java
index 16fefc3..b6aa969 100644
--- a/python/testSrc/com/jetbrains/python/PyStringFormatParserTest.java
+++ b/python/testSrc/com/jetbrains/python/PyStringFormatParserTest.java
@@ -146,4 +146,17 @@
assertEquals(1, chunks.size());
assertConstant(chunks.get(0), 0, 1);
}
+
+ public void testNewStyleUnbalanced() {
+ final List<FormatStringChunk> chunks = parseNewStyleFormat("{{{foo}}");
+ assertEquals(2, chunks.size());
+ }
+
+ public void testNewStyleEscapingAndValue() {
+ final List<FormatStringChunk> chunks = parseNewStyleFormat("{{{foo}}}");
+ assertEquals(3, chunks.size());
+ assertEquals(TextRange.create(0, 2), chunks.get(0).getTextRange());
+ assertEquals(TextRange.create(2, 7), chunks.get(1).getTextRange());
+ assertEquals(TextRange.create(7, 9), chunks.get(2).getTextRange());
+ }
}
diff --git a/python/testSrc/com/jetbrains/python/PyStringLiteralTest.java b/python/testSrc/com/jetbrains/python/PyStringLiteralTest.java
index 7f5b08a..c79b37b 100644
--- a/python/testSrc/com/jetbrains/python/PyStringLiteralTest.java
+++ b/python/testSrc/com/jetbrains/python/PyStringLiteralTest.java
@@ -15,6 +15,7 @@
*/
package com.jetbrains.python;
+import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.LiteralTextEscaper;
import com.intellij.psi.PsiFile;
@@ -64,19 +65,73 @@
assertEquals(-1, escaper.getOffsetInHost(4, fooOnly));
}
- public void testIterateCharacterRanges() {
- final PyStringLiteralExpression expr = createLiteralFromText("'\\nfoo' 'bar'");
+ public void testEscaperOffsetInSingleCharString() {
+ final PyStringLiteralExpression expr = createLiteralFromText("'c'");
assertNotNull(expr);
- final List<String> characters = new ArrayList<String>();
- expr.iterateCharacterRanges(new PyStringLiteralExpression.TextRangeConsumer() {
- @Override
- public boolean process(int startOffset, int endOffset, String value) {
- characters.add(value);
- return true;
- }
- });
- final List<String> expected = Arrays.asList("\n", "f", "o", "o", "b", "a", "r");
- assertSameElements(characters, expected);
+ final LiteralTextEscaper<? extends PsiLanguageInjectionHost> escaper = expr.createLiteralTextEscaper();
+ final TextRange range = TextRange.create(1, 2);
+ assertEquals(1, escaper.getOffsetInHost(0, range));
+ assertEquals(2, escaper.getOffsetInHost(1, range));
+ assertEquals(-1, escaper.getOffsetInHost(2, range));
+ }
+
+ public void testEscaperOffsetInSingleEscapedCharString() {
+ final PyStringLiteralExpression expr = createLiteralFromText("'\\n'");
+ assertNotNull(expr);
+ final LiteralTextEscaper<? extends PsiLanguageInjectionHost> escaper = expr.createLiteralTextEscaper();
+ final TextRange range = TextRange.create(1, 3);
+ assertEquals(1, escaper.getOffsetInHost(0, range));
+ assertEquals(3, escaper.getOffsetInHost(1, range));
+ assertEquals(-1, escaper.getOffsetInHost(2, range));
+ }
+
+ public void testIterateCharacterRanges() {
+ assertSameElements(getCharacterRanges("'\\nfoo' 'bar'"),
+ Arrays.asList("\n", "foo", "bar"));
+ }
+
+ public void testIterateEscapedBackslash() {
+ assertSameElements(getCharacterRanges("'''\n" +
+ "foo.\\\\\n" +
+ "bar\n" +
+ "'''\n"),
+ Arrays.asList("\nfoo.", "\\", "\nbar\n"));
+ }
+
+ public void testEscaperOffsetInEscapedBackslash() {
+ final PyStringLiteralExpression expr = createLiteralFromText("'XXX foo.\\\\bar YYY'");
+ assertNotNull(expr);
+ final LiteralTextEscaper<? extends PsiLanguageInjectionHost> escaper = expr.createLiteralTextEscaper();
+ final TextRange range = TextRange.create(5, 14);
+ assertEquals(5, escaper.getOffsetInHost(0, range));
+ assertEquals(6, escaper.getOffsetInHost(1, range));
+ assertEquals(7, escaper.getOffsetInHost(2, range));
+ assertEquals(8, escaper.getOffsetInHost(3, range));
+ assertEquals(9, escaper.getOffsetInHost(4, range));
+ assertEquals(11, escaper.getOffsetInHost(5, range));
+ assertEquals(12, escaper.getOffsetInHost(6, range));
+ assertEquals(13, escaper.getOffsetInHost(7, range));
+ assertEquals(14, escaper.getOffsetInHost(8, range));
+ assertEquals(-1, escaper.getOffsetInHost(9, range));
+ }
+
+ public void testStringValue() {
+ assertEquals("foo", createLiteralFromText("\"\"\"foo\"\"\"").getStringValue());
+ assertEquals("foo", createLiteralFromText("u\"foo\"").getStringValue());
+ assertEquals("foo", createLiteralFromText("b\"foo\"").getStringValue());
+ assertEquals("\\b", createLiteralFromText("r'\\b'").getStringValue());
+ assertEquals("b\\n", createLiteralFromText("ur'\\u0062\\n'").getStringValue());
+ assertEquals("\\8", createLiteralFromText("'\\8'").getStringValue());
+ }
+
+ public void testEscapedUnicodeInLiterals() {
+ assertEquals("\\u0041", createLiteralFromText("'\\u0041'").getStringValue());
+ assertEquals("A", createLiteralFromText("u'\\u0041'").getStringValue());
+ assertEquals("\\u0041", createLiteralFromText("b'\\u0041'").getStringValue());
+ }
+
+ public void testNonUnicodeCodePointValue() {
+ assertEquals("\\U12345678", createLiteralFromText("u'\\U12345678'").getStringValue());
}
private static String decodeRange(PyStringLiteralExpression expr, TextRange range) {
@@ -92,12 +147,13 @@
return expr;
}
- public void testStringValue() {
- assertEquals("foo", createLiteralFromText("\"\"\"foo\"\"\"").getStringValue());
- assertEquals("foo", createLiteralFromText("u\"foo\"").getStringValue());
- assertEquals("foo", createLiteralFromText("b\"foo\"").getStringValue());
- assertEquals("\\b", createLiteralFromText("r'\\b'").getStringValue());
- assertEquals("b\\n", createLiteralFromText("ur'\\u0062\\n'").getStringValue());
- assertEquals("\\8", createLiteralFromText("'\\8'").getStringValue());
+ private List<String> getCharacterRanges(String text) {
+ final PyStringLiteralExpression expr = createLiteralFromText(text);
+ assertNotNull(expr);
+ final List<String> characters = new ArrayList<String>();
+ for (Pair<TextRange, String> fragment : expr.getDecodedFragments()) {
+ characters.add(fragment.getSecond());
+ }
+ return characters;
}
}
diff --git a/python/testSrc/com/jetbrains/python/PyStructureViewTest.java b/python/testSrc/com/jetbrains/python/PyStructureViewTest.java
index 7556d0f..b1ed603 100644
--- a/python/testSrc/com/jetbrains/python/PyStructureViewTest.java
+++ b/python/testSrc/com/jetbrains/python/PyStructureViewTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -25,7 +25,7 @@
* @author vlan
*/
public class PyStructureViewTest extends PyTestCase {
- private static String TEST_DIRECTORY = "structureView/";
+ private static final String TEST_DIRECTORY = "structureView/";
public void testBaseClassNames() {
myFixture.configureByFiles(TEST_DIRECTORY + "baseClassNames.py",
diff --git a/python/testSrc/com/jetbrains/python/PyStubsTest.java b/python/testSrc/com/jetbrains/python/PyStubsTest.java
index 6ad2dc4..474e558 100644
--- a/python/testSrc/com/jetbrains/python/PyStubsTest.java
+++ b/python/testSrc/com/jetbrains/python/PyStubsTest.java
@@ -29,16 +29,17 @@
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.stubs.StubElement;
import com.intellij.psi.stubs.StubUpdatingIndex;
+import com.intellij.psi.util.QualifiedName;
import com.intellij.testFramework.TestDataPath;
import com.intellij.util.indexing.FileBasedIndex;
import com.jetbrains.python.fixtures.PyTestCase;
import com.jetbrains.python.psi.*;
import com.jetbrains.python.psi.impl.PyFileImpl;
-import com.intellij.psi.util.QualifiedName;
import com.jetbrains.python.psi.impl.PythonLanguageLevelPusher;
import com.jetbrains.python.psi.stubs.PyClassNameIndex;
import com.jetbrains.python.psi.stubs.PyClassStub;
import com.jetbrains.python.psi.stubs.PyVariableNameIndex;
+import com.jetbrains.python.psi.types.TypeEvalContext;
import com.jetbrains.python.toolbox.Maybe;
import java.util.Collection;
@@ -118,12 +119,12 @@
pyClass = classes.get(1);
assertEquals("BarClass", pyClass.getName());
- Property prop = pyClass.findProperty("value");
+ Property prop = pyClass.findProperty("value", true);
Maybe<Callable> maybe_function = prop.getGetter();
assertTrue(maybe_function.isDefined());
assertEquals(pyClass.getMethods()[0], maybe_function.value());
- Property setvalueProp = pyClass.findProperty("setvalue");
+ Property setvalueProp = pyClass.findProperty("setvalue", true);
Maybe<Callable> setter = setvalueProp.getSetter();
assertTrue(setter.isDefined());
assertEquals("__set", setter.value().getName());
@@ -131,7 +132,7 @@
// properties by decorator
pyClass = classes.get(2);
assertEquals("BazClass", pyClass.getName());
- prop = pyClass.findProperty("x");
+ prop = pyClass.findProperty("x", true);
maybe_function = prop.getGetter();
assertTrue(maybe_function.isDefined());
assertEquals(pyClass.getMethods()[0], maybe_function.value());
@@ -411,4 +412,16 @@
final String docString = foo.getDocStringValue();
assertEquals("Foo docstring.", docString);
}
+
+ public void testMetaClass() {
+ final PyFile file = getTestFile();
+ final PyClass c = file.findTopLevelClass("C");
+ assertNotNull(c);
+ assertNotNull(c.getMetaClassExpression());
+ final PyClass d = file.findTopLevelClass("D");
+ assertNotNull(d);
+ assertNull(d.getMetaClassExpression());
+ assertNotNull(d.getMetaClassType(TypeEvalContext.codeInsightFallback()));
+ assertNotParsed(file);
+ }
}
diff --git a/python/testSrc/com/jetbrains/python/PySurroundWithTest.java b/python/testSrc/com/jetbrains/python/PySurroundWithTest.java
index b2a1292..5f49581 100644
--- a/python/testSrc/com/jetbrains/python/PySurroundWithTest.java
+++ b/python/testSrc/com/jetbrains/python/PySurroundWithTest.java
@@ -35,7 +35,7 @@
doTest(new PyWithWhileSurrounder());
}
- public void _testSurroundWithTryExcept() throws Exception {
+ public void testSurroundWithTryExcept() throws Exception {
doTest(new PyWithTryExceptSurrounder());
}
diff --git a/python/testSrc/com/jetbrains/python/PyWrapTest.java b/python/testSrc/com/jetbrains/python/PyWrapTest.java
index 39606c3..05c21b8 100644
--- a/python/testSrc/com/jetbrains/python/PyWrapTest.java
+++ b/python/testSrc/com/jetbrains/python/PyWrapTest.java
@@ -64,6 +64,10 @@
doTest(" AND field");
}
+ public void testDontWrapStartOfString() { // PY-9436
+ doTest("_some_long_text_here_to_test_right_margin_some_long_text_here_to_test_right_margin_some_long_text_here_to_test_right_margin");
+ }
+
public void testWrapRightMargin() {
final CodeStyleSettings settings = CodeStyleSettingsManager.getInstance(myFixture.getProject()).getCurrentSettings();
@@ -83,7 +87,6 @@
settings.RIGHT_MARGIN = oldValue;
settings.WRAP_WHEN_TYPING_REACHES_RIGHT_MARGIN = oldMarginValue;
}
-
}
private void doTest(final String textToType) {
diff --git a/python/testSrc/com/jetbrains/python/PythonCompletionTest.java b/python/testSrc/com/jetbrains/python/PythonCompletionTest.java
index 4f93cca..da7888e 100644
--- a/python/testSrc/com/jetbrains/python/PythonCompletionTest.java
+++ b/python/testSrc/com/jetbrains/python/PythonCompletionTest.java
@@ -15,9 +15,12 @@
*/
package com.jetbrains.python;
+import com.google.common.collect.Lists;
import com.intellij.codeInsight.completion.impl.CamelHumpMatcher;
+import com.intellij.codeInsight.lookup.AutoCompletionPolicy;
import com.intellij.codeInsight.lookup.Lookup;
import com.intellij.codeInsight.lookup.LookupElement;
+import com.intellij.codeInsight.lookup.LookupElementBuilder;
import com.jetbrains.python.documentation.DocStringFormat;
import com.jetbrains.python.documentation.PyDocumentationSettings;
import com.jetbrains.python.fixtures.PyTestCase;
@@ -387,8 +390,10 @@
final PyDocumentationSettings settings = PyDocumentationSettings.getInstance(myFixture.getModule());
settings.setFormat(DocStringFormat.PLAIN);
myFixture.configureByFile("completion/identifiersInPlainDocstring.py");
- myFixture.completeBasic();
- myFixture.checkResultByFile("completion/identifiersInPlainDocstring.after.py");
+ final LookupElement[] elements = myFixture.completeBasic();
+ assertNotNull(elements);
+ assertContainsElements(Lists.newArrayList(elements),
+ LookupElementBuilder.create("bar").withAutoCompletionPolicy(AutoCompletionPolicy.NEVER_AUTOCOMPLETE));
}
public void testPep328Completion() { // PY-3409
diff --git a/python/testSrc/com/jetbrains/python/PythonKeywordCompletionTest.java b/python/testSrc/com/jetbrains/python/PythonKeywordCompletionTest.java
index a439727..acf6cc7 100644
--- a/python/testSrc/com/jetbrains/python/PythonKeywordCompletionTest.java
+++ b/python/testSrc/com/jetbrains/python/PythonKeywordCompletionTest.java
@@ -124,8 +124,8 @@
public void testNoElseBeforeExcept() {
final List<String> lookupElementStrings = doTestByText("try:\n" +
- " a = 1\n" +
- "<caret>");
+ " a = 1\n" +
+ "<caret>");
assertNotNull(lookupElementStrings);
assertDoesntContain(lookupElementStrings, "else");
}
@@ -169,6 +169,10 @@
"el<caret>").contains("else"));
}
+ public void testFinallyInElse() { // PY-6755
+ doTest();
+ }
+
public void testForInComprehension() { // PY-3687
assertContainsElements(doTestByText("L = [x fo<caret>]"), "for");
assertContainsElements(doTestByText("L = [x <caret>]"), "for");
diff --git a/python/testSrc/com/jetbrains/python/PythonMockSdk.java b/python/testSrc/com/jetbrains/python/PythonMockSdk.java
index d8f48dc..0acdbc0 100644
--- a/python/testSrc/com/jetbrains/python/PythonMockSdk.java
+++ b/python/testSrc/com/jetbrains/python/PythonMockSdk.java
@@ -25,6 +25,7 @@
import com.intellij.psi.stubs.StubUpdatingIndex;
import com.intellij.util.indexing.FileBasedIndex;
import com.jetbrains.python.codeInsight.userSkeletons.PyUserSkeletonsUtil;
+import com.jetbrains.python.psi.stubs.PyModuleNameIndex;
import com.jetbrains.python.sdk.PythonSdkType;
import org.jetbrains.annotations.NonNls;
@@ -77,7 +78,10 @@
sdkModificator.addRoot(LocalFileSystem.getInstance().refreshAndFindFileByPath(mock_stubs_path), PythonSdkType.BUILTIN_ROOT_TYPE);
sdkModificator.commitChanges();
- FileBasedIndex.getInstance().requestRebuild(StubUpdatingIndex.INDEX_ID);
+
+ final FileBasedIndex index = FileBasedIndex.getInstance();
+ index.requestRebuild(StubUpdatingIndex.INDEX_ID);
+ index.requestRebuild(PyModuleNameIndex.NAME);
return sdk;
}
diff --git a/python/testSrc/com/jetbrains/python/PythonParsingTest.java b/python/testSrc/com/jetbrains/python/PythonParsingTest.java
index fbbabda..d253db7 100644
--- a/python/testSrc/com/jetbrains/python/PythonParsingTest.java
+++ b/python/testSrc/com/jetbrains/python/PythonParsingTest.java
@@ -16,10 +16,15 @@
package com.jetbrains.python;
import com.intellij.psi.PsiFile;
+import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.testFramework.ParsingTestCase;
import com.intellij.testFramework.TestDataPath;
import com.jetbrains.python.fixtures.PyTestCase;
import com.jetbrains.python.psi.LanguageLevel;
+import com.jetbrains.python.psi.PyFunction;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Collection;
/**
* @author yole
@@ -220,7 +225,7 @@
}
public void testTrailingSemicolon() { // PY-363
- doTest();
+ doTest();
}
public void testStarExpression() { // PEP-3132
@@ -251,6 +256,10 @@
doTest();
}
+ public void testBadDecoratorNotMethod() {
+ doTest();
+ }
+
public void testCommentAtEndOfMethod() { // PY-2137
doTest();
}
@@ -318,7 +327,7 @@
public void testIncompleteFor() { // PY-3792
doTest();
}
-
+
public void testCallInAssignment() { // PY-5062
doTest();
}
@@ -426,6 +435,34 @@
doTest(LanguageLevel.PYTHON27);
}
+ public void testOverIndentedComment() { // PY-1909
+ doTest();
+ }
+
+ public void testNotClosedBraceDict() {
+ doTest();
+ }
+
+ public void testNotClosedBraceSet() {
+ doTest(LanguageLevel.PYTHON33);
+ }
+
+ public void testEmptyBlockInFunctionBeforeFunction() {
+ doTest();
+ }
+
+ public void testBlockWithoutColon() {
+ doTest();
+ }
+
+ public void testSingleDefBeforeFunction() {
+ doTest();
+ }
+
+ public void testSingleClassBeforeFunction() {
+ doTest();
+ }
+
public void doTest(LanguageLevel languageLevel) {
LanguageLevel prev = myLanguageLevel;
myLanguageLevel = languageLevel;
@@ -435,6 +472,7 @@
finally {
myLanguageLevel = prev;
}
+ ensureEachFunctionHasStatementList(myFile, PyFunction.class);
}
@Override
@@ -443,4 +481,13 @@
file.getVirtualFile().putUserData(LanguageLevel.KEY, myLanguageLevel);
return file;
}
+
+ public static <T extends PyFunction> void ensureEachFunctionHasStatementList(
+ @NotNull PsiFile parentFile,
+ @NotNull Class<T> functionType) {
+ Collection<T> functions = PsiTreeUtil.findChildrenOfType(parentFile, functionType);
+ for (T functionToCheck : functions) {
+ functionToCheck.getStatementList(); //To make sure each function has statement list (does not throw exception)
+ }
+ }
}
diff --git a/python/testSrc/com/jetbrains/python/fixtures/PyInspectionTestCase.java b/python/testSrc/com/jetbrains/python/fixtures/PyInspectionTestCase.java
new file mode 100644
index 0000000..717a579
--- /dev/null
+++ b/python/testSrc/com/jetbrains/python/fixtures/PyInspectionTestCase.java
@@ -0,0 +1,61 @@
+package com.jetbrains.python.fixtures;
+
+import com.jetbrains.python.inspections.PyInspection;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * Helps you to create inspection tests.
+ * <br/>
+ * For each case
+ * <ol>
+ * <li>Create file <code>testData/inspections/_YOUR_INSPECTION_CLASS_SIMPLE_NAME_/CASE_NAME_CAMEL_CASE.py</code></li>
+ * <li>Create method <code>test_YOUR_CASE_NAME_PASCAL_CASE</code> that runs {@link #doTest()}</li>
+ * <li>Overwrite {@link #isInfo()}, {@link #isWarning()} or {@link #isWeakWarning()} to configure what to check</li>
+ * </ol>
+ *
+ * @author link
+ */
+public abstract class PyInspectionTestCase extends PyTestCase {
+
+ @NotNull
+ protected abstract Class<? extends PyInspection> getInspectionClass();
+
+ /**
+ * Launches test. To be called by test author
+ */
+ protected void doTest() {
+ myFixture.configureByFile(getTestDirectory(true) + ".py");
+ configureInspection();
+ }
+
+ protected void doMultiFileTest() {
+ doMultiFileTest("a.py");
+ }
+ protected void doMultiFileTest(@NotNull String filename) {
+ myFixture.copyDirectoryToProject(getTestDirectory(false), "");
+ myFixture.configureFromTempProjectFile(filename);
+ configureInspection();
+ }
+
+ private void configureInspection() {
+ myFixture.enableInspections(getInspectionClass());
+ myFixture.checkHighlighting(isWarning(), isInfo(), isWeakWarning());
+ }
+
+ private String getTestDirectory(boolean lowercaseFirstLetter) {
+ return "inspections/" + getInspectionClass().getSimpleName() + "/" + getTestName(lowercaseFirstLetter);
+ }
+
+
+ protected boolean isWeakWarning() {
+ return true;
+ }
+
+ protected boolean isInfo() {
+ return false;
+ }
+
+ protected boolean isWarning() {
+ return true;
+ }
+}
diff --git a/python/testSrc/com/jetbrains/python/fixtures/PyMultiFileResolveTestCase.java b/python/testSrc/com/jetbrains/python/fixtures/PyMultiFileResolveTestCase.java
index 431bf28..22b4e54 100644
--- a/python/testSrc/com/jetbrains/python/fixtures/PyMultiFileResolveTestCase.java
+++ b/python/testSrc/com/jetbrains/python/fixtures/PyMultiFileResolveTestCase.java
@@ -44,17 +44,13 @@
FileType fileType = file.getFileType();
return fileType == PythonFileType.INSTANCE;
}
- });
- try {
- final ResolveResult[] resolveResults = ref.multiResolve(false);
- if (resolveResults.length == 0) {
- return null;
- }
- return resolveResults[0].isValidResult() ? resolveResults[0].getElement() : null;
+ }, myTestRootDisposable);
+ final ResolveResult[] resolveResults = ref.multiResolve(false);
+ psiManager.setAssertOnFileLoadingFilter(VirtualFileFilter.NONE, myTestRootDisposable);
+ if (resolveResults.length == 0) {
+ return null;
}
- finally {
- psiManager.setAssertOnFileLoadingFilter(VirtualFileFilter.NONE);
- }
+ return resolveResults[0].isValidResult() ? resolveResults[0].getElement() : null;
}
diff --git a/python/testSrc/com/jetbrains/python/fixtures/PyTestCase.java b/python/testSrc/com/jetbrains/python/fixtures/PyTestCase.java
index 09c74b7..3404194 100644
--- a/python/testSrc/com/jetbrains/python/fixtures/PyTestCase.java
+++ b/python/testSrc/com/jetbrains/python/fixtures/PyTestCase.java
@@ -41,6 +41,7 @@
import com.jetbrains.python.PythonMockSdk;
import com.jetbrains.python.PythonTestUtil;
import com.jetbrains.python.psi.LanguageLevel;
+import com.jetbrains.python.psi.PyClass;
import com.jetbrains.python.psi.PyFile;
import com.jetbrains.python.psi.impl.PyFileImpl;
import com.jetbrains.python.psi.impl.PythonLanguageLevelPusher;
@@ -130,6 +131,15 @@
assertNull(PARSED_ERROR_MSG, ((PyFileImpl)file).getTreeElement());
}
+ /**
+ * @param name
+ * @return class by its name from file
+ */
+ @NotNull
+ protected PyClass getClassByName(@NotNull final String name) {
+ return myFixture.findElementByText("class " + name, PyClass.class);
+ }
+
protected static class PyLightProjectDescriptor implements LightProjectDescriptor {
private final String myPythonVersion;
diff --git a/python/testSrc/com/jetbrains/python/inspections/Py3UnresolvedReferencesInspectionTest.java b/python/testSrc/com/jetbrains/python/inspections/Py3UnresolvedReferencesInspectionTest.java
index 65cb17d..ee37eab 100644
--- a/python/testSrc/com/jetbrains/python/inspections/Py3UnresolvedReferencesInspectionTest.java
+++ b/python/testSrc/com/jetbrains/python/inspections/Py3UnresolvedReferencesInspectionTest.java
@@ -15,11 +15,19 @@
*/
package com.jetbrains.python.inspections;
+import com.intellij.openapi.project.Project;
+import com.intellij.psi.PsiFile;
+import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.testFramework.LightProjectDescriptor;
import com.jetbrains.python.fixtures.PyTestCase;
import com.jetbrains.python.psi.LanguageLevel;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyFile;
+import com.jetbrains.python.psi.stubs.PyClassNameIndex;
import org.jetbrains.annotations.NotNull;
+import java.util.Collection;
+
/**
* @author vlan
*/
@@ -73,6 +81,18 @@
doTest();
}
+ public void testMetaclassStub() {
+ doMultiFileTest("a.py");
+ final Project project = myFixture.getProject();
+ Collection<PyClass> classes = PyClassNameIndex.find("M", project, GlobalSearchScope.allScope(project));
+ for (PyClass cls : classes) {
+ final PsiFile file = cls.getContainingFile();
+ if (file instanceof PyFile) {
+ assertNotParsed((PyFile)file);
+ }
+ }
+ }
+
// PY-9011
public void testDatetimeDateAttributesOutsideClass() {
doMultiFileTest("a.py");
@@ -81,4 +101,8 @@
public void testObjectNewAttributes() {
doTest();
}
+
+ public void testEnumMemberAttributes() {
+ doMultiFileTest("a.py");
+ }
}
diff --git a/python/testSrc/com/jetbrains/python/inspections/PyArgumentListInspectionTest.java b/python/testSrc/com/jetbrains/python/inspections/PyArgumentListInspectionTest.java
index fabba0c..c0b20d8 100644
--- a/python/testSrc/com/jetbrains/python/inspections/PyArgumentListInspectionTest.java
+++ b/python/testSrc/com/jetbrains/python/inspections/PyArgumentListInspectionTest.java
@@ -34,6 +34,16 @@
public void testDecorators() {
doTest();
}
+
+ public void testDecoratorsPy3K() {
+ PythonLanguageLevelPusher.setForcedLanguageLevel(myFixture.getProject(), LanguageLevel.PYTHON30);
+ try {
+ doTest();
+ }
+ finally {
+ PythonLanguageLevelPusher.setForcedLanguageLevel(myFixture.getProject(), null);
+ }
+ }
public void testTupleVsLiteralList() {
doTest();
diff --git a/python/testSrc/com/jetbrains/python/inspections/PyAssignmentToLoopOrWithParameterInspectionTest.java b/python/testSrc/com/jetbrains/python/inspections/PyAssignmentToLoopOrWithParameterInspectionTest.java
new file mode 100644
index 0000000..2870935
--- /dev/null
+++ b/python/testSrc/com/jetbrains/python/inspections/PyAssignmentToLoopOrWithParameterInspectionTest.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.inspections;
+
+import com.jetbrains.python.fixtures.PyInspectionTestCase;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * @author link
+ */
+public class PyAssignmentToLoopOrWithParameterInspectionTest extends PyInspectionTestCase {
+
+ public void testGood() {
+ doTest();
+ }
+
+ public void testBad() {
+ doTest();
+ }
+
+ @NotNull
+ @Override
+ protected Class<? extends PyInspection> getInspectionClass() {
+ return PyAssignmentToLoopOrWithParameterInspection.class;
+ }
+
+ @Override
+ protected boolean isWeakWarning() {
+ return true;
+ }
+}
diff --git a/python/testSrc/com/jetbrains/python/inspections/PyAttributeOutsideInitInspectionTest.java b/python/testSrc/com/jetbrains/python/inspections/PyAttributeOutsideInitInspectionTest.java
index 5cc33a8..7c8812f 100644
--- a/python/testSrc/com/jetbrains/python/inspections/PyAttributeOutsideInitInspectionTest.java
+++ b/python/testSrc/com/jetbrains/python/inspections/PyAttributeOutsideInitInspectionTest.java
@@ -62,6 +62,10 @@
doTest();
}
+ public void testStaticMethod() {
+ doTest();
+ }
+
private void doTest() {
myFixture.configureByFile("inspections/PyAttributeOutsideInitInspection/" + getTestName(true) + ".py");
myFixture.enableInspections(PyAttributeOutsideInitInspection.class);
diff --git a/python/testSrc/com/jetbrains/python/inspections/PyMethodMayBeStaticInspectionTest.java b/python/testSrc/com/jetbrains/python/inspections/PyMethodMayBeStaticInspectionTest.java
index ea40830..885f043 100644
--- a/python/testSrc/com/jetbrains/python/inspections/PyMethodMayBeStaticInspectionTest.java
+++ b/python/testSrc/com/jetbrains/python/inspections/PyMethodMayBeStaticInspectionTest.java
@@ -15,6 +15,7 @@
*/
package com.jetbrains.python.inspections;
+import com.intellij.testFramework.TestDataPath;
import com.jetbrains.python.PythonTestUtil;
import com.jetbrains.python.fixtures.PyTestCase;
@@ -23,6 +24,7 @@
/**
* User: ktisha
*/
+@TestDataPath("$CONTENT_ROOT/../testData/inspections/PyMethodMayBeStaticInspection/")
public class PyMethodMayBeStaticInspectionTest extends PyTestCase {
public void testTruePositive() {
@@ -65,6 +67,10 @@
doTest();
}
+ public void testDecorated() {
+ doTest();
+ }
+
public void testOverwrittenMethod() {
doTest();
}
diff --git a/python/testSrc/com/jetbrains/python/inspections/PyPep8NamingInspectionTest.java b/python/testSrc/com/jetbrains/python/inspections/PyPep8NamingInspectionTest.java
index d048af2..0a32aa4 100644
--- a/python/testSrc/com/jetbrains/python/inspections/PyPep8NamingInspectionTest.java
+++ b/python/testSrc/com/jetbrains/python/inspections/PyPep8NamingInspectionTest.java
@@ -54,6 +54,10 @@
doTest();
}
+ public void testGlobals() {
+ doTest();
+ }
+
public void testTest() {
doTest();
}
diff --git a/python/testSrc/com/jetbrains/python/inspections/PyTypeCheckerInspectionTest.java b/python/testSrc/com/jetbrains/python/inspections/PyTypeCheckerInspectionTest.java
index 2615cc1..0b15d89 100644
--- a/python/testSrc/com/jetbrains/python/inspections/PyTypeCheckerInspectionTest.java
+++ b/python/testSrc/com/jetbrains/python/inspections/PyTypeCheckerInspectionTest.java
@@ -228,4 +228,13 @@
public void testSecondFormIter() {
doTest();
}
+
+ public void testMetaClassIteration() {
+ doTest();
+ }
+
+ // PY-10967
+ public void testDefaultTupleParameter() {
+ doTest();
+ }
}
diff --git a/python/testSrc/com/jetbrains/python/inspections/PyUnresolvedReferencesInspectionTest.java b/python/testSrc/com/jetbrains/python/inspections/PyUnresolvedReferencesInspectionTest.java
index 54cbf2e..546795e 100644
--- a/python/testSrc/com/jetbrains/python/inspections/PyUnresolvedReferencesInspectionTest.java
+++ b/python/testSrc/com/jetbrains/python/inspections/PyUnresolvedReferencesInspectionTest.java
@@ -15,15 +15,14 @@
*/
package com.jetbrains.python.inspections;
-import com.jetbrains.python.fixtures.PyTestCase;
+import com.jetbrains.python.fixtures.PyInspectionTestCase;
import com.jetbrains.python.psi.LanguageLevel;
import org.jetbrains.annotations.NotNull;
/**
* @author yole
*/
-public class PyUnresolvedReferencesInspectionTest extends PyTestCase {
- private static final String TEST_DIRECTORY = "inspections/PyUnresolvedReferencesInspection/";
+public class PyUnresolvedReferencesInspectionTest extends PyInspectionTestCase {
public void testSelfReference() {
doTest();
@@ -77,11 +76,11 @@
public void testTypeAssertions() {
doTest();
}
-
+
public void testUnresolvedImportedModule() { // PY-2075
doTest();
}
-
+
public void testSuperType() { // PY-2320
doTest();
}
@@ -89,7 +88,7 @@
public void testImportFunction() { // PY-1896
doTest();
}
-
+
public void testSuperclassAsLocal() { // PY-5427
doTest();
}
@@ -133,6 +132,10 @@
doTest();
}
+ public void testIvarInDocstring() {
+ doTest();
+ }
+
// PY-6634
public void testModuleAttribute() {
doTest();
@@ -322,17 +325,44 @@
doTest();
}
- private void doTest() {
- myFixture.configureByFile(TEST_DIRECTORY + getTestName(true) + ".py");
- myFixture.enableInspections(PyUnresolvedReferencesInspection.class);
- myFixture.checkHighlighting(true, false, false);
+ // PY-10977
+ public void testContextManagerSubclass() {
+ doTest();
}
- private void doMultiFileTest(@NotNull String filename) {
- final String testName = getTestName(false);
- myFixture.copyDirectoryToProject(TEST_DIRECTORY + testName, "");
- myFixture.configureFromTempProjectFile(filename);
- myFixture.enableInspections(PyUnresolvedReferencesInspection.class);
- myFixture.checkHighlighting(true, false, false);
+ // PY-11413
+ public void testReturnSelfInSuperClass() {
+ doTest();
+ }
+
+ // PY-6955
+ public void testUnusedUnresolvedModuleImported() {
+ doTest();
+ }
+
+ // PY-6955
+ public void testUnusedUnresolvedNameImported() {
+ doMultiFileTest();
+ }
+
+ // PY-6955
+ public void testUnusedUnresolvedNameImportedSeveralTimes() {
+ doMultiFileTest();
+ }
+
+ // PY-6955
+ public void testUsedUnresolvedNameImportedSeveralTimes() {
+ doMultiFileTest();
+ }
+
+ // PY-6955
+ public void testUnusedUnresolvedPackageImported() {
+ doTest();
+ }
+
+ @NotNull
+ @Override
+ protected Class<? extends PyInspection> getInspectionClass() {
+ return PyUnresolvedReferencesInspection.class;
}
}
diff --git a/python/testSrc/com/jetbrains/python/psi/impl/PyArgumentListImplTest.java b/python/testSrc/com/jetbrains/python/psi/impl/PyArgumentListImplTest.java
new file mode 100644
index 0000000..7aa1a5c
--- /dev/null
+++ b/python/testSrc/com/jetbrains/python/psi/impl/PyArgumentListImplTest.java
@@ -0,0 +1,89 @@
+package com.jetbrains.python.psi.impl;
+
+import com.intellij.openapi.command.WriteCommandAction;
+import com.intellij.psi.impl.source.PostprocessReformattingAspect;
+import com.intellij.psi.util.PsiTreeUtil;
+import com.jetbrains.python.psi.*;
+import com.jetbrains.python.refactoring.classes.PyClassRefactoringTest;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * Tests {@link com.jetbrains.python.psi.impl.PyArgumentListImpl#addArgument(com.jetbrains.python.psi.PyExpression)}
+ *
+ * @author Ilya.Kazakevich
+ */
+public class PyArgumentListImplTest extends PyClassRefactoringTest {
+ private PyElementGeneratorImpl myGenerator;
+ private LanguageLevel myLanguagelevel;
+
+ public PyArgumentListImplTest() {
+ super("argumentList");
+ }
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ myGenerator = new PyElementGeneratorImpl(myFixture.getProject());
+ myLanguagelevel = LanguageLevel.PYTHON34;
+ setLanguageLevel(myLanguagelevel);
+ }
+
+ /**
+ * Ensures new keyword argument is set into appropriate place
+ */
+ public void testAddKeyArgument() throws Exception {
+ final PyKeywordArgument classKeyword = myGenerator.createKeywordArgument(myLanguagelevel, "metaclass", "ABCMeta");
+ final PyKeywordArgument functionKeyword = myGenerator.createKeywordArgument(myLanguagelevel, "new_param", "spam");
+
+
+ doTest(classKeyword, functionKeyword);
+ }
+
+ /**
+ * Ensures new param (NOT keyword argument) is set into appropriate place
+ */
+ public void testAddParam() throws Exception {
+ final PyExpression classParameter = myGenerator.createParameter("SuperClass");
+ final PyExpression functionParameter = myGenerator.createParameter("new_param");
+
+
+ doTest(classParameter, functionParameter);
+ }
+
+ /**
+ * Adds expressions to the superclass list and to the function calls in file
+ *
+ * @param superClassExpression expressions to add to the list of superclasses to any class found on file
+ * @param functionExpression expressions to add to any function call found in file
+ */
+ private void doTest(@NotNull final PyExpression superClassExpression, @NotNull final PyExpression functionExpression) {
+ configureMultiFile("addArgumentFile", "stub");
+ myFixture.configureByFile(getMultiFileBaseName() + "/addArgumentFile.py");
+
+ //TODO: newly created expressions has no indent info, it leads to errors in postprocessing formatting. Need to investigate.
+ PostprocessReformattingAspect.getInstance(myFixture.getProject()).disablePostprocessFormattingInside(new Runnable() {
+ @Override
+ public void run() {
+ WriteCommandAction.runWriteCommandAction(myFixture.getProject(), new Runnable() {
+ @Override
+ public void run() {
+
+
+ for (final PyClass aClass : PsiTreeUtil.findChildrenOfType(myFixture.getFile(), PyClass.class)) {
+ final PyArgumentList superClassExpressionList = aClass.getSuperClassExpressionList();
+ assert superClassExpressionList != null : "Class has no expression list!";
+ superClassExpressionList.addArgument(superClassExpression);
+ }
+
+ for (final PyCallExpression expression : PsiTreeUtil.findChildrenOfType(myFixture.getFile(), PyCallExpression.class)) {
+ final PyArgumentList list = expression.getArgumentList();
+ assert list != null : "Callable statement has no argument list?";
+ list.addArgument(functionExpression);
+ }
+ }
+ });
+ }
+ });
+ myFixture.checkResultByFile(getMultiFileBaseName() + "/addArgumentFile.after.py");
+ }
+}
diff --git a/python/testSrc/com/jetbrains/python/quickFixes/AddFieldQuickFixTest.java b/python/testSrc/com/jetbrains/python/quickFixes/AddFieldQuickFixTest.java
index 5ffe1a6..c93553d 100644
--- a/python/testSrc/com/jetbrains/python/quickFixes/AddFieldQuickFixTest.java
+++ b/python/testSrc/com/jetbrains/python/quickFixes/AddFieldQuickFixTest.java
@@ -15,13 +15,16 @@
*/
package com.jetbrains.python.quickFixes;
+import com.intellij.testFramework.TestDataPath;
import com.jetbrains.python.PyBundle;
import com.jetbrains.python.PyQuickFixTestCase;
import com.jetbrains.python.inspections.PyUnresolvedReferencesInspection;
+import com.jetbrains.python.inspections.PyUnusedLocalInspection;
/**
* User: ktisha
*/
+@TestDataPath("$CONTENT_ROOT/../testData//quickFixes/AddFieldQuickFixTest/")
public class AddFieldQuickFixTest extends PyQuickFixTestCase {
public void testAddClassField() {
@@ -44,4 +47,12 @@
doQuickFixTest(PyUnresolvedReferencesInspection.class, PyBundle.message("QFIX.NAME.add.field.$0.to.class.$1", "x", "B"));
}
+ public void testFromUnusedParameter() { // PY-1398
+ doQuickFixTest(PyUnusedLocalInspection.class, "Add field 'foo' to class A");
+ }
+
+ public void testFromUnusedParameterKeyword() { // PY-1602
+ doQuickFixTest(PyUnusedLocalInspection.class, "Add field 'foo' to class A");
+ }
+
}
diff --git a/python/testSrc/com/jetbrains/python/quickFixes/PyMakeMethodStaticQuickFixTest.java b/python/testSrc/com/jetbrains/python/quickFixes/PyMakeMethodStaticQuickFixTest.java
index 310c211..835e6ed 100644
--- a/python/testSrc/com/jetbrains/python/quickFixes/PyMakeMethodStaticQuickFixTest.java
+++ b/python/testSrc/com/jetbrains/python/quickFixes/PyMakeMethodStaticQuickFixTest.java
@@ -36,14 +36,6 @@
doQuickFixTest(PyMethodMayBeStaticInspection.class, PyBundle.message("QFIX.NAME.make.static"));
}
- public void testFunctionWithDeco() {
- doQuickFixTest(PyMethodMayBeStaticInspection.class, PyBundle.message("QFIX.NAME.make.static"));
- }
-
- public void testDecoWithParams() {
- doQuickFixTest(PyMethodMayBeStaticInspection.class, PyBundle.message("QFIX.NAME.make.static"));
- }
-
public void testNoSelf() {
doQuickFixTest(PyMethodMayBeStaticInspection.class, PyBundle.message("QFIX.NAME.make.static"));
}
diff --git a/python/testSrc/com/jetbrains/python/refactoring/PyCodeFragmentTest.java b/python/testSrc/com/jetbrains/python/refactoring/PyCodeFragmentTest.java
index ac05633..8b6f81b 100644
--- a/python/testSrc/com/jetbrains/python/refactoring/PyCodeFragmentTest.java
+++ b/python/testSrc/com/jetbrains/python/refactoring/PyCodeFragmentTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/python/testSrc/com/jetbrains/python/refactoring/PyIntroduceTestCase.java b/python/testSrc/com/jetbrains/python/refactoring/PyIntroduceTestCase.java
index e949656..82efe37 100644
--- a/python/testSrc/com/jetbrains/python/refactoring/PyIntroduceTestCase.java
+++ b/python/testSrc/com/jetbrains/python/refactoring/PyIntroduceTestCase.java
@@ -17,6 +17,7 @@
import com.intellij.codeInsight.template.impl.TemplateManagerImpl;
import com.intellij.codeInsight.template.impl.TemplateState;
+import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.Consumer;
@@ -88,9 +89,15 @@
}
handler.performAction(introduceOperation);
- TemplateState state = TemplateManagerImpl.getTemplateState(myFixture.getEditor());
- assert state != null;
- state.gotoEnd(false);
+ WriteCommandAction.runWriteCommandAction(myFixture.getProject(), new Runnable() {
+ @Override
+ public void run() {
+ TemplateState state = TemplateManagerImpl.getTemplateState(myFixture.getEditor());
+ assert state != null;
+ state.gotoEnd(false);
+ }
+ });
+
myFixture.checkResultByFile(name + ".after.py", true);
}
finally {
diff --git a/python/testSrc/com/jetbrains/python/refactoring/PyRenameTest.java b/python/testSrc/com/jetbrains/python/refactoring/PyRenameTest.java
index f6ff0ee..948f159 100644
--- a/python/testSrc/com/jetbrains/python/refactoring/PyRenameTest.java
+++ b/python/testSrc/com/jetbrains/python/refactoring/PyRenameTest.java
@@ -195,6 +195,11 @@
doMultiFileTest("bar");
}
+ // PY-11879
+ public void testDocstringParams() {
+ doTest("bar");
+ }
+
private void doRenameConflictTest(String newName, String expectedConflict) {
myFixture.configureByFile(RENAME_DATA_PATH + getTestName(true) + ".py");
try {
diff --git a/python/testSrc/com/jetbrains/python/refactoring/classes/NameAndStatusTransformer.java b/python/testSrc/com/jetbrains/python/refactoring/classes/NameAndStatusTransformer.java
new file mode 100644
index 0000000..8d80445
--- /dev/null
+++ b/python/testSrc/com/jetbrains/python/refactoring/classes/NameAndStatusTransformer.java
@@ -0,0 +1,24 @@
+package com.jetbrains.python.refactoring.classes;
+
+import com.google.common.base.Function;
+import com.intellij.refactoring.classMembers.MemberInfoModel;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
+import org.jetbrains.annotations.NotNull;
+
+/**
+* @author Ilya.Kazakevich
+*/
+public class NameAndStatusTransformer implements Function<PyMemberInfo<PyElement>, PyPresenterTestMemberEntry> {
+ @NotNull
+ private final MemberInfoModel<PyElement, PyMemberInfo<PyElement>> myMemberInfoModel;
+
+ public NameAndStatusTransformer(@NotNull final MemberInfoModel<PyElement, PyMemberInfo<PyElement>> memberInfoModel) {
+ myMemberInfoModel = memberInfoModel;
+ }
+
+ @Override
+ public PyPresenterTestMemberEntry apply(final PyMemberInfo<PyElement> input) {
+ return new PyPresenterTestMemberEntry(input.getDisplayName(), myMemberInfoModel.isMemberEnabled(input), input.isStatic(), myMemberInfoModel.isAbstractEnabled(input));
+ }
+}
diff --git a/python/testSrc/com/jetbrains/python/refactoring/classes/NameTransformer.java b/python/testSrc/com/jetbrains/python/refactoring/classes/NameTransformer.java
new file mode 100644
index 0000000..1002cea
--- /dev/null
+++ b/python/testSrc/com/jetbrains/python/refactoring/classes/NameTransformer.java
@@ -0,0 +1,25 @@
+package com.jetbrains.python.refactoring.classes;
+
+import com.google.common.base.Function;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * Transforms {@link com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo} to its display names
+ * @author Ilya.Kazakevich
+ */
+public class NameTransformer implements Function<PyMemberInfo<? extends PyElement>, String> {
+ /**
+ * To be used instead of creation
+ */
+ public static final NameTransformer INSTANCE = new NameTransformer();
+
+ private NameTransformer() {
+ }
+
+ @Override
+ public String apply(@NotNull final PyMemberInfo<? extends PyElement> input) {
+ return input.getDisplayName();
+ }
+}
diff --git a/python/testSrc/com/jetbrains/python/refactoring/classes/PyClassRefactoringTest.java b/python/testSrc/com/jetbrains/python/refactoring/classes/PyClassRefactoringTest.java
index dbdca0d..c47935d 100644
--- a/python/testSrc/com/jetbrains/python/refactoring/classes/PyClassRefactoringTest.java
+++ b/python/testSrc/com/jetbrains/python/refactoring/classes/PyClassRefactoringTest.java
@@ -15,12 +15,21 @@
*/
package com.jetbrains.python.refactoring.classes;
+import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.command.CommandProcessor;
import com.intellij.openapi.project.Project;
+import com.intellij.refactoring.BaseRefactoringProcessor;
import com.jetbrains.python.fixtures.PyTestCase;
import com.jetbrains.python.psi.PyClass;
import com.jetbrains.python.psi.PyElement;
import com.jetbrains.python.psi.PyFunction;
+import com.jetbrains.python.psi.PyTargetExpression;
import com.jetbrains.python.psi.stubs.PyClassNameIndex;
+import com.jetbrains.python.refactoring.classes.membersManager.MembersManager;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
+import org.hamcrest.Matchers;
+import org.jetbrains.annotations.NotNull;
+import org.junit.Assert;
import java.util.Collection;
@@ -28,22 +37,126 @@
* @author Dennis.Ushakov
*/
public abstract class PyClassRefactoringTest extends PyTestCase {
- protected PyElement findMember(String className, String memberName) {
- if (!memberName.contains(".")) return findClass(memberName);
- return findMethod(className, memberName.substring(1));
+ @NotNull
+ private final String myRefactoringName;
+
+ /**
+ * @param refactoringName name of the refactoring. It will be used as folder name for tests
+ */
+ protected PyClassRefactoringTest(@NotNull final String refactoringName) {
+ myRefactoringName = refactoringName;
+ }
+
+ /**
+ * Finds memberInfo by class name and member name.
+ *
+ * @param clazzName name of class
+ * @param memberName name of member (See {@link #findMember(String, String)} for naming protocol)
+ * @return member info
+ * @see #findMember(String, String)
+ */
+ @NotNull
+ protected PyMemberInfo<PyElement> findMemberInfo(@NotNull final String clazzName, @NotNull final String memberName) {
+ final PyClass clazz = findClass(clazzName);
+ return MembersManager.findMember(clazz, findMember(clazzName, memberName));
+ }
+
+ /**
+ * @param className class where member should be found
+ * @param memberName member that starts with dot (<code>.</code>) is treated as method.
+ * member that starts with dash (<code>#</code>) is treated as attribute.
+ * It is treated parent class otherwise
+ * @return member or null if not found
+ */
+ @NotNull
+ protected PyElement findMember(@NotNull final String className, @NotNull String memberName) {
+ final PyElement result;
+ //TODO: Get rid of this chain of copy pastes
+ if (memberName.contains(".")) {
+ result = findMethod(className, memberName.substring(1));
+ }
+ else if (memberName.contains("#")) {
+ result = findField(className, memberName.substring(1));
+ }
+ else {
+ result = findClass(memberName);
+ }
+ Assert.assertNotNull(String.format("No member %s found in class %s", memberName, className), result);
+ return result;
+ }
+
+ private PyElement findField(final String className, final String memberName) {
+ final PyClass aClass = findClass(className);
+ final PyTargetExpression attribute = aClass.findClassAttribute(memberName, false);
+ if (attribute != null) {
+ return attribute;
+ }
+ return aClass.findInstanceAttribute(memberName, false);
}
private PyFunction findMethod(final String className, final String name) {
final PyClass clazz = findClass(className);
- final PyFunction method = clazz.findMethodByName(name, false);
- assertNotNull(method);
- return method;
+ return clazz.findMethodByName(name, false);
}
protected PyClass findClass(final String name) {
final Project project = myFixture.getProject();
final Collection<PyClass> classes = PyClassNameIndex.find(name, project, false);
- assertEquals(1, classes.size());
+ Assert.assertThat(String.format("Expected one class named %s", name), classes, Matchers.hasSize(1));
return classes.iterator().next();
}
+
+
+ protected void moveViaProcessor(@NotNull Project project, @NotNull final BaseRefactoringProcessor processor) {
+ CommandProcessor.getInstance().executeCommand(project, new Runnable() {
+ @Override
+ public void run() {
+ ApplicationManager.getApplication().runWriteAction(new Runnable() {
+ @Override
+ public void run() {
+ processor.run();
+ }
+ });
+ }
+ }, null, null);
+ }
+
+ /**
+ * Adds several files to project from folder {@link #myRefactoringName} with extension <pre>py</pre>.
+ * Call it <strong>before</strong> refactoring.
+ * After refactoring use {@link #checkMultiFile(String...)} to make sure refactoring is ok.
+ *
+ * @param fileNamesNoExtensions file (module) names to add with out of extensions
+ * @see #checkMultiFile(String...)
+ */
+ protected void configureMultiFile(@NotNull final String... fileNamesNoExtensions) {
+ final String baseName = getMultiFileBaseName() + "/";
+
+ for (final String fileNameNoExtension : fileNamesNoExtensions) {
+ final String fileNameBefore = String.format("%s.py", fileNameNoExtension);
+ myFixture.copyFileToProject(baseName + fileNameBefore, fileNameBefore);
+ }
+ }
+
+ /**
+ * Checks files <strong>after</strong> refactoring. See {@link #configureMultiFile(String...)} for more info.
+ *
+ * @param fileNamesNoExtensions file names to check with out of extension
+ * @see #configureMultiFile(String...)
+ */
+ protected void checkMultiFile(@NotNull final String... fileNamesNoExtensions) {
+ for (final String fileNameNoExtension : fileNamesNoExtensions) {
+ final String fileNameAfter = String.format("%s.after.py", fileNameNoExtension);
+ final String fileNameBefore = String.format("%s.py", fileNameNoExtension);
+ myFixture.checkResultByFile(fileNameBefore, "/" + getMultiFileBaseName() + "/" + fileNameAfter, true);
+ }
+ }
+
+ /**
+ * @return folder name with {@link #myRefactoringName} and test name added
+ */
+ @NotNull
+ protected String getMultiFileBaseName() {
+ return "refactoring/" + myRefactoringName + "/" + getTestName(true);
+ }
}
diff --git a/python/testSrc/com/jetbrains/python/refactoring/classes/PyDependenciesComparatorTest.java b/python/testSrc/com/jetbrains/python/refactoring/classes/PyDependenciesComparatorTest.java
new file mode 100644
index 0000000..9ebe01b
--- /dev/null
+++ b/python/testSrc/com/jetbrains/python/refactoring/classes/PyDependenciesComparatorTest.java
@@ -0,0 +1,40 @@
+package com.jetbrains.python.refactoring.classes;
+
+import com.intellij.psi.PsiElement;
+import com.intellij.util.text.Matcher;
+import com.jetbrains.python.fixtures.PyTestCase;
+import com.jetbrains.python.psi.*;
+import org.hamcrest.Matchers;
+import org.junit.Assert;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * @author Ilya.Kazakevich
+ */
+public class PyDependenciesComparatorTest extends PyTestCase {
+
+ public void test() {
+ myFixture.configureByFile("/refactoring/dependenciesTest.py");
+ final PyClass clazz = getClassByName("Foo");
+
+ @SuppressWarnings("ConstantConditions") // Can't be null (class has docstring)
+ PsiElement docStringExpression = clazz.getDocStringExpression().getParent();
+ PyFunction method = clazz.getMethods()[0];
+ PsiElement classField = clazz.getClassAttributes().get(0).getParent();
+
+ final List<PyStatement> elementList = new ArrayList<PyStatement>();
+ elementList.addAll(Arrays.asList(clazz.getStatementList().getStatements()));
+ Collections.sort(elementList, PyDependenciesComparator.INSTANCE);
+
+ Assert.assertThat("Members returned in wrong order", elementList, Matchers.contains(
+ docStringExpression, classField, method
+ ));
+
+
+
+ }
+}
diff --git a/python/testSrc/com/jetbrains/python/refactoring/classes/PyExtractSuperclassTest.java b/python/testSrc/com/jetbrains/python/refactoring/classes/PyExtractSuperclassTest.java
deleted file mode 100644
index cae5550..0000000
--- a/python/testSrc/com/jetbrains/python/refactoring/classes/PyExtractSuperclassTest.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * Copyright 2000-2013 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.jetbrains.python.refactoring.classes;
-
-import com.intellij.openapi.command.WriteCommandAction;
-import com.intellij.openapi.vfs.LocalFileSystem;
-import com.intellij.openapi.vfs.VirtualFile;
-import com.intellij.psi.PsiFile;
-import com.intellij.psi.PsiManager;
-import com.jetbrains.python.PyNames;
-import com.jetbrains.python.psi.PyClass;
-import com.jetbrains.python.psi.PyElement;
-import com.jetbrains.python.refactoring.classes.extractSuperclass.PyExtractSuperclassHelper;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Dennis.Ushakov
- */
-public class PyExtractSuperclassTest extends PyClassRefactoringTest {
- public void testSimple() throws Exception {
- doSimpleTest("Foo", "Suppa", null, true, ".foo");
- }
-
- public void testWithSuper() throws Exception {
- doSimpleTest("Foo", "Suppa", null, true, ".foo");
- }
-
- public void testWithImport() throws Exception {
- doSimpleTest("A", "Suppa", null, false, ".foo");
- }
-
- private void doSimpleTest(final String className, final String superclassName, final String expectedError, final boolean sameFile, final String... membersName) throws Exception {
- try {
- String baseName = "/refactoring/extractsuperclass/" + getTestName(true);
- myFixture.configureByFile(baseName + ".before.py");
- final PyClass clazz = findClass(className);
- final List<PyMemberInfo> members = new ArrayList<PyMemberInfo>();
- for (String memberName : membersName) {
- final PyElement member = findMember(className, memberName);
- assertNotNull(member);
- members.add(new PyMemberInfo(member));
- }
-
- new WriteCommandAction.Simple(myFixture.getProject()) {
- @Override
- protected void run() throws Throwable {
- //noinspection ConstantConditions
- final String url = sameFile ? myFixture.getFile().getVirtualFile().getUrl() :
- myFixture.getFile().getVirtualFile().getParent().getUrl();
- PyExtractSuperclassHelper.extractSuperclass(clazz, members, superclassName, url);
- }
- }.execute();
- myFixture.checkResultByFile(baseName + ".after.py");
- } catch (Exception e) {
- if (expectedError == null) throw e;
- assertEquals(expectedError, e.getMessage());
- }
- }
-
-
- public void testMultifileNew() {
- String baseName = "/refactoring/extractsuperclass/multifile/";
- myFixture.configureByFile(baseName + "source.py");
- final String className = "Foo";
- final String superclassName = "Suppa";
- final PyClass clazz = findClass(className);
- final List<PyMemberInfo> members = new ArrayList<PyMemberInfo>();
- final PyElement member = findMember(className, ".foo");
- assertNotNull(member);
- members.add(new PyMemberInfo(member));
- final VirtualFile base_dir = myFixture.getFile().getVirtualFile().getParent();
-
- new WriteCommandAction.Simple(myFixture.getProject()) {
- @Override
- protected void run() throws Throwable {
- //noinspection ConstantConditions
- final String path = base_dir.getPath() + "/a/b";
- PyExtractSuperclassHelper.extractSuperclass(clazz, members, superclassName, path);
- }
- }.execute();
- final PsiManager psi_mgr = PsiManager.getInstance(myFixture.getProject());
- VirtualFile vfile = base_dir.findChild("a");
- assertTrue(vfile.isDirectory());
- vfile = vfile.findChild(PyNames.INIT_DOT_PY);
- assertNotNull(vfile);
-
- vfile = base_dir.findChild("a").findChild("b");
- assertTrue(vfile.isDirectory());
- vfile = vfile.findChild(PyNames.INIT_DOT_PY);
- assertNotNull(vfile);
-
- PsiFile psi_file = psi_mgr.findFile(vfile);
- String result = psi_file.getText().trim();
- File expected_file = new File(getTestDataPath() + baseName, "target.new.py");
- String expected = psi_mgr.findFile(LocalFileSystem.getInstance().findFileByIoFile(expected_file)).getText().trim();
- assertEquals(expected, result);
- }
-
- public void testMultifileAppend() {
- // this is half-copy-paste of testMultifileNew. generalization won't make either easier to follow.
- String baseName = "/refactoring/extractsuperclass/multifile/";
- myFixture.configureByFiles(
- baseName + "source.py",
- baseName + "a/__init__.py",
- baseName + "a/b/__init__.py",
- baseName + "a/b/foo.py"
- );
- final String className = "Foo";
- final String superclassName = "Suppa";
- final PyClass clazz = findClass(className);
- final List<PyMemberInfo> members = new ArrayList<PyMemberInfo>();
- final PyElement member = findMember(className, ".foo");
- assertNotNull(member);
- members.add(new PyMemberInfo(member));
- final VirtualFile base_dir = myFixture.getFile().getVirtualFile().getParent();
-
- new WriteCommandAction.Simple(myFixture.getProject()) {
- @Override
- protected void run() throws Throwable {
- //noinspection ConstantConditions
- final String path = base_dir.getPath() + "/a/b";
- PyExtractSuperclassHelper.extractSuperclass(clazz, members, superclassName, path + "/foo.py");
- }
- }.execute();
- final PsiManager psi_mgr = PsiManager.getInstance(myFixture.getProject());
- VirtualFile vfile = base_dir.findChild("a");
- assertTrue(vfile.isDirectory());
- vfile = vfile.findChild(PyNames.INIT_DOT_PY);
- assertNotNull(vfile);
-
- vfile = base_dir.findChild("a").findChild("b");
- assertTrue(vfile.isDirectory());
- assertNotNull(vfile.findChild(PyNames.INIT_DOT_PY));
- vfile = vfile.findChild("foo.py");
- assertNotNull(vfile);
-
- PsiFile psi_file = psi_mgr.findFile(vfile);
- String result = psi_file.getText().trim();
- File expected_file = new File(getTestDataPath() + baseName, "target.append.py");
- String expected = psi_mgr.findFile(LocalFileSystem.getInstance().findFileByIoFile(expected_file)).getText().trim();
- assertEquals(expected, result);
- }
-
-}
diff --git a/python/testSrc/com/jetbrains/python/refactoring/classes/PyPresenterTestMemberEntry.java b/python/testSrc/com/jetbrains/python/refactoring/classes/PyPresenterTestMemberEntry.java
new file mode 100644
index 0000000..8518c45
--- /dev/null
+++ b/python/testSrc/com/jetbrains/python/refactoring/classes/PyPresenterTestMemberEntry.java
@@ -0,0 +1,63 @@
+package com.jetbrains.python.refactoring.classes;
+
+import org.jetbrains.annotations.NonNls;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * Test only {@link com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo} representation.
+ * @author Ilya.Kazakevich
+ */
+public class PyPresenterTestMemberEntry {
+ @NonNls @NotNull
+ private final String myName;
+ private final boolean myEnabled;
+ private final boolean myStaticEntry;
+ private final boolean myMayBeAbstract;
+
+ /**
+ * @param name name of the member
+ * @param enabled is member enabled or not
+ * @param staticEntry is member static entry
+ * @param mayBeAbstract if element has "abstract" checkbox or not
+ */
+ public PyPresenterTestMemberEntry(@NotNull final String name, final boolean enabled, final boolean staticEntry, final boolean mayBeAbstract) {
+ myName = name;
+ myEnabled = enabled;
+ myStaticEntry = staticEntry;
+ myMayBeAbstract = mayBeAbstract;
+ }
+
+ @Override
+ public String toString() {
+ return "PyPresenterTestMemberEntry{" +
+ "myName='" + myName + '\'' +
+ ", myEnabled=" + myEnabled +
+ ", myStaticEntry=" + myStaticEntry +
+ ", myMayBeAbstract=" + myMayBeAbstract +
+ '}';
+ }
+
+ @Override
+ public boolean equals(final Object o) {
+ if (this == o) return true;
+ if (!(o instanceof PyPresenterTestMemberEntry)) return false;
+
+ final PyPresenterTestMemberEntry entry = (PyPresenterTestMemberEntry)o;
+
+ if (myEnabled != entry.myEnabled) return false;
+ if (myMayBeAbstract != entry.myMayBeAbstract) return false;
+ if (myStaticEntry != entry.myStaticEntry) return false;
+ if (!myName.equals(entry.myName)) return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = myName.hashCode();
+ result = 31 * result + (myEnabled ? 1 : 0);
+ result = 31 * result + (myStaticEntry ? 1 : 0);
+ result = 31 * result + (myMayBeAbstract ? 1 : 0);
+ return result;
+ }
+}
diff --git a/python/testSrc/com/jetbrains/python/refactoring/classes/PyPullUpTest.java b/python/testSrc/com/jetbrains/python/refactoring/classes/PyPullUpTest.java
deleted file mode 100644
index 80c6b24..0000000
--- a/python/testSrc/com/jetbrains/python/refactoring/classes/PyPullUpTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright 2000-2013 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.jetbrains.python.refactoring.classes;
-
-import com.jetbrains.python.psi.PyClass;
-import com.jetbrains.python.psi.PyElement;
-import com.jetbrains.python.refactoring.classes.pullUp.PyPullUpHelper;
-
-import java.util.Collections;
-
-/**
- * @author Dennis.Ushakov
- */
-public class PyPullUpTest extends PyClassRefactoringTest {
- public void testSimple() {
- doHelperTest("Boo", ".boo", "Foo");
- }
-
- public void testSuperclass() {
- doHelperTest("Boo", "Foo", "Zope");
- }
-
- public void testExistingsuperclass() {
- doHelperTest("Boo", "Foo", "Zope");
- }
-
- public void testWithComments() {
- doHelperTest("Boo", ".boo", "Foo");
- }
-
- public void testWithMultilineComments() {
- doHelperTest("Boo", ".boo", "Foo");
- }
-
- public void testMultiFile() { // PY-2810
- doMultiFileTest();
- }
-
- public void testDuplicateImport() { // PY-2810
- doMultiFileTest();
- }
-
- private void doMultiFileTest() {
- String baseName = "refactoring/pullup/" + getTestName(true) + "/";
- myFixture.copyFileToProject(baseName + "Class.py", "Class.py");
- myFixture.copyFileToProject(baseName + "SuperClass.py", "SuperClass.py");
- doPullUp("AnyClass", ".this_should_be_in_super", "SuperClass");
- myFixture.checkResultByFile("SuperClass.py", "/" + baseName + "/SuperClass.after.py", true);
- }
-
- private void doHelperTest(final String className, final String memberName, final String superClassName) {
- String baseName = "/refactoring/pullup/" + getTestName(true);
- myFixture.configureByFile(baseName + ".py");
- doPullUp(className, memberName, superClassName);
- myFixture.checkResultByFile(baseName + ".after.py");
- }
-
- private void doPullUp(String className, String memberName, String superClassName) {
- final PyClass clazz = findClass(className);
- final PyElement member = findMember(className, memberName);
- final PyClass superClass = findClass(superClassName);
- PyPullUpHelper.pullUp(clazz, Collections.singleton(new PyMemberInfo(member)), superClass);
- }
-}
diff --git a/python/testSrc/com/jetbrains/python/refactoring/classes/PyPushDownTest.java b/python/testSrc/com/jetbrains/python/refactoring/classes/PyPushDownTest.java
deleted file mode 100644
index cc4ca07..0000000
--- a/python/testSrc/com/jetbrains/python/refactoring/classes/PyPushDownTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright 2000-2013 JetBrains s.r.o.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.jetbrains.python.refactoring.classes;
-
-import com.intellij.openapi.command.WriteCommandAction;
-import com.jetbrains.python.psi.PyClass;
-import com.jetbrains.python.psi.PyElement;
-import com.jetbrains.python.refactoring.classes.pushDown.PyPushDownProcessor;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Dennis.Ushakov
- */
-public class PyPushDownTest extends PyClassRefactoringTest {
- public void testSimple() throws Exception {
- doProcessorTest("Foo", null, ".foo");
- }
-
- public void testSuperclass() throws Exception {
- doProcessorTest("Zope", null, "Foo");
- }
-
- public void testMultiple() throws Exception {
- doProcessorTest("Foo", null, ".foo");
- }
-
- public void testPy346() throws Exception {
- doProcessorTest("A", null, ".meth_a1", ".meth_a2");
- }
-
- public void testExistingmethod() throws Exception {
- doProcessorTest("Foo", "method <b><code>foo</code></b> is already overridden in class <b><code>Boo</code></b>. Method will not be pushed down to that class.", ".foo");
- }
-
- private void doProcessorTest(final String className, final String expectedError, final String... membersName) throws Exception {
- try {
- String baseName = "/refactoring/pushdown/" + getTestName(true);
- myFixture.configureByFile(baseName + ".before.py");
- final PyClass clazz = findClass(className);
- final List<PyMemberInfo> members = new ArrayList<PyMemberInfo>();
- for (String memberName : membersName) {
- final PyElement member = findMember(className, memberName);
- assertNotNull(member);
- members.add(new PyMemberInfo(member));
- }
-
- final PyPushDownProcessor processor = new PyPushDownProcessor(myFixture.getProject(), clazz, members);
- new WriteCommandAction.Simple(myFixture.getProject()) {
- @Override
- protected void run() throws Throwable {
- processor.run();
- }
- }.execute().throwException();
- myFixture.checkResultByFile(baseName + ".after.py");
- } catch (Exception e) {
- if (expectedError == null) throw e;
- assertTrue(e.getMessage(), e.getMessage().contains(expectedError));
- }
- }
-}
diff --git a/python/testSrc/com/jetbrains/python/refactoring/classes/PyRefactoringPresenterTestCase.java b/python/testSrc/com/jetbrains/python/refactoring/classes/PyRefactoringPresenterTestCase.java
new file mode 100644
index 0000000..d0c5f2a
--- /dev/null
+++ b/python/testSrc/com/jetbrains/python/refactoring/classes/PyRefactoringPresenterTestCase.java
@@ -0,0 +1,134 @@
+package com.jetbrains.python.refactoring.classes;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Collections2;
+import com.jetbrains.python.fixtures.PyTestCase;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
+import com.jetbrains.python.refactoring.classes.membersManager.vp.MembersBasedPresenter;
+import com.jetbrains.python.refactoring.classes.membersManager.vp.MembersBasedView;
+import com.jetbrains.python.refactoring.classes.membersManager.vp.MembersViewInitializationInfo;
+import org.easymock.Capture;
+import org.easymock.EasyMock;
+import org.easymock.internal.MocksControl;
+import org.hamcrest.Matcher;
+import org.jetbrains.annotations.NotNull;
+import org.junit.Assert;
+
+import java.util.Collection;
+
+/**
+ * Base class for {@link com.jetbrains.python.refactoring.classes.membersManager.vp.MembersBasedPresenter} tests.
+ * It takes file <pre>file.py</pre> from folder provided as "refactoringName" constructor argument.
+ * It configures {@link #myView}
+ *
+ * @param <C> configuration class for presenter view
+ * @param <V> presenter's view class
+ * @author Ilya.Kazakevich
+ */
+public abstract class PyRefactoringPresenterTestCase<C extends MembersViewInitializationInfo, V extends MembersBasedView<C>>
+ extends PyTestCase {
+ /**
+ * Converts class collection to name collection
+ */
+ protected static final Function<PyClass, String> CLASS_TO_NAME = new ClassToName();
+ /**
+ * Easy mock control
+ */
+ protected MocksControl myMocksControl;
+ /**
+ * View mock
+ */
+ protected V myView;
+ /**
+ * Capture that stores config ({@link MembersViewInitializationInfo} or its children) after {@link com.jetbrains.python.vp.Presenter#launch()} is called
+ */
+ protected Capture<C> myViewConfigCapture;
+
+ @NotNull
+ private final Class<V> myViewClass;
+ @NotNull
+ private final String myRefactoringName;
+
+ /**
+ * @param viewClass view class
+ * @param refactoringName name of the refactoring. Folder with its name would be used to take "file.py" from it.
+ */
+ protected PyRefactoringPresenterTestCase(@NotNull final Class<V> viewClass, @NotNull final String refactoringName) {
+ myViewClass = viewClass;
+ this.myRefactoringName = refactoringName;
+ }
+
+
+ /**
+ * Compares member states (names and other fields) with provided matcher.
+ * @see PyPresenterTestMemberEntry
+ * @param members members to compare
+ * @param matcher to match them against
+ */
+ protected static void compareMembers(@NotNull final Collection<PyPresenterTestMemberEntry> members,
+ @NotNull final Matcher<Iterable<? extends PyPresenterTestMemberEntry>> matcher) {
+ Assert.assertThat("Wrong members or their states", members, matcher);
+ }
+
+ /**
+ * Initializes test. Always run it <strong>first</strong> if overwrite.
+ */
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+
+ myFixture.copyDirectoryToProject("refactoring/" + myRefactoringName + "/presenter/", "");
+ myFixture.configureFromTempProjectFile("file.py");
+ myMocksControl = new MocksControl(MocksControl.MockType.NICE);
+ myView = myMocksControl.createMock(myViewClass);
+
+ configureMockCapture();
+ }
+
+ /**
+ * Configures view to capture config info
+ */
+ private void configureMockCapture() {
+ myViewConfigCapture = new Capture<C>();
+
+ myView.configure(EasyMock.capture(myViewConfigCapture));
+ EasyMock.expectLastCall().once();
+ }
+
+
+ /**
+ * @return collection of members displayed by presenter
+ */
+ @NotNull
+ protected Collection<PyPresenterTestMemberEntry> getMembers() {
+ Assert.assertTrue("No members captured", myViewConfigCapture.hasCaptured());
+ final Collection<PyMemberInfo<PyElement>> members = myViewConfigCapture.getValue().getMemberInfos();
+ Assert.assertFalse("No members selected", members.isEmpty());
+ return Collections2.transform(members, new NameAndStatusTransformer(myViewConfigCapture.getValue().getMemberInfoModel()));
+ }
+
+ private static class ClassToName implements Function<PyClass, String> {
+
+ @Override
+ public String apply(@NotNull final PyClass input) {
+ return input.getName();
+ }
+ }
+
+ /**
+ * Returns member infos presenter wants to display
+ * @param presenter presenter to check
+ * @return collection of member infos
+ */
+ @NotNull
+ protected Collection<PyMemberInfo<PyElement>> getMemberInfos(@NotNull MembersBasedPresenter presenter) {
+ myMocksControl.replay();
+ presenter.launch();
+ final Collection<PyMemberInfo<PyElement>> result = myViewConfigCapture.getValue().getMemberInfos();
+ myMocksControl.reset();
+ configureMockCapture();
+ return result;
+ }
+}
diff --git a/python/testSrc/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassPresenterTest.java b/python/testSrc/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassPresenterTest.java
new file mode 100644
index 0000000..dd89f63
--- /dev/null
+++ b/python/testSrc/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassPresenterTest.java
@@ -0,0 +1,170 @@
+package com.jetbrains.python.refactoring.classes.extractSuperclass;
+
+import com.jetbrains.python.psi.LanguageLevel;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.refactoring.classes.PyMemberInfoStorage;
+import com.jetbrains.python.refactoring.classes.PyPresenterTestMemberEntry;
+import com.jetbrains.python.refactoring.classes.PyRefactoringPresenterTestCase;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
+import org.easymock.Capture;
+import org.easymock.EasyMock;
+import org.hamcrest.Matcher;
+import org.hamcrest.Matchers;
+import org.jetbrains.annotations.NotNull;
+import org.junit.Assert;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Tests presenter for "extract superclass" refactoring
+ *
+ * @author Ilya.Kazakevich
+ */
+public class PyExtractSuperclassPresenterTest
+ extends PyRefactoringPresenterTestCase<PyExtractSuperclassInitializationInfo, PyExtractSuperclassView> {
+
+ public PyExtractSuperclassPresenterTest() {
+ super(PyExtractSuperclassView.class, "extractsuperclass");
+ }
+
+ /**
+ * Tests that static methods could be moved, but "extends object" is not in list
+ * Also checks that static method could NOT be made abstract in Py2K
+ */
+ public void testStaticNoObjectPy2() {
+ ensureStaticNoObject(false);
+ }
+
+ /**
+ * Tests that static methods could be moved, but "extends object" is not in list
+ * Also checks that static method COULD be made abstract in Py3K
+ */
+ public void testStaticNoObjectPy3() {
+ setLanguageLevel(LanguageLevel.PYTHON32);
+ ensureStaticNoObject(true);
+ }
+
+ /**
+ * Tests that static methods could be moved, but "extends object" is not in list.
+ * Also checks that static method could be made abstract in Py3K, but not in Py2K
+ *
+ * @param py3k if py 3?
+ */
+ private void ensureStaticNoObject(final boolean py3k) {
+ final Collection<PyPresenterTestMemberEntry> members = launchAndGetMembers("StaticOnly");
+
+ final Matcher<Iterable<? extends PyPresenterTestMemberEntry>> matcher =
+ Matchers.containsInAnyOrder(new PyPresenterTestMemberEntry("static_method()", true, true, py3k));
+ compareMembers(members, matcher);
+ }
+
+ /**
+ * Tests that if no members selected, presenter shows error
+ */
+ public void testNoSelectedMembersLeadsToError() {
+ EasyMock.expect(myView.getSelectedMemberInfos()).andReturn(Collections.<PyMemberInfo<PyElement>>emptyList()).anyTimes();
+
+ final Capture<String> errorMessageCapture = configureViewToCaptureError();
+
+
+ final PyExtractSuperclassPresenterImpl sut = configureByClass("Child");
+ myMocksControl.replay();
+ sut.launch();
+
+ sut.okClicked();
+
+ Assert.assertTrue("No error displayed empty list of selected members", errorMessageCapture.hasCaptured());
+ }
+
+ /**
+ * Checks that presenter displays error if user enters invalid name for new class
+ */
+ public void testInvalidSuperClassNameLeadsToError() {
+ final String className = "Child";
+ final PyClass aClass = getClassByName(className);
+ final List<PyMemberInfo<PyElement>> classMemberInfos = new PyMemberInfoStorage(aClass).getClassMemberInfos(aClass);
+ assert !classMemberInfos.isEmpty() : "No member infos for " + className;
+ final PyMemberInfo<PyElement> pyMemberInfo = classMemberInfos.get(0);
+ EasyMock.expect(myView.getSelectedMemberInfos()).andReturn(Collections.singletonList(pyMemberInfo)).anyTimes();
+ EasyMock.expect(myView.getSuperClassName()).andReturn("INVALID CLASS NAME").anyTimes();
+ final Capture<String> errorMessageCapture = configureViewToCaptureError();
+
+
+ final PyExtractSuperclassPresenterImpl sut = configureByClass(className);
+ myMocksControl.replay();
+ sut.launch();
+
+ sut.okClicked();
+
+ Assert.assertTrue("No error displayed for invalid class name", errorMessageCapture.hasCaptured());
+ }
+
+ /**
+ * Creates capture ready to capture error message and configures view to return it
+ *
+ * @return
+ */
+ @NotNull
+ private Capture<String> configureViewToCaptureError() {
+ final Capture<String> errorMessageCapture = new Capture<String>();
+ myView.showError(EasyMock.capture(errorMessageCapture));
+ return errorMessageCapture;
+ }
+
+ /**
+ * Old classes could be refactored as well
+ */
+ public void testOldClass() {
+ final Collection<PyPresenterTestMemberEntry> members = launchAndGetMembers("OldClass");
+ final Matcher<Iterable<? extends PyPresenterTestMemberEntry>> matcher = Matchers
+ .containsInAnyOrder(new PyPresenterTestMemberEntry("foo(self)", true, false, true));
+ compareMembers(members, matcher);
+ }
+
+ /**
+ * Checks that class fields could be moved while "extends object" is not in list
+ */
+ public void testFieldsAndNoObject() {
+ final Collection<PyPresenterTestMemberEntry> members = launchAndGetMembers("Child");
+
+ final Matcher<Iterable<? extends PyPresenterTestMemberEntry>> matcher = Matchers
+ .containsInAnyOrder(new PyPresenterTestMemberEntry("CLASS_VAR", true, true, false),
+ new PyPresenterTestMemberEntry("eggs(self)", true, false, true),
+ new PyPresenterTestMemberEntry("__init__(self)", true, false, false),
+ new PyPresenterTestMemberEntry("self.artur", true, false, false),
+ new PyPresenterTestMemberEntry("extends date", true, false, false));
+ compareMembers(members, matcher);
+ }
+
+ /**
+ * launches presenter and returns member it displayed to user
+ *
+ * @param className name of class to configure presenter by
+ * @return displayed members
+ */
+ @NotNull
+ private Collection<PyPresenterTestMemberEntry> launchAndGetMembers(@NotNull final String className) {
+ final PyExtractSuperclassPresenterImpl sut = configureByClass(className);
+ myMocksControl.replay();
+ sut.launch();
+ return getMembers();
+ }
+
+
+ /**
+ * Configures presenter by class
+ *
+ * @param name name of class
+ * @return presenter
+ */
+ @NotNull
+ private PyExtractSuperclassPresenterImpl configureByClass(@NotNull final String name) {
+ final PyClass childClass = getClassByName(name);
+ final PyMemberInfoStorage storage = new PyMemberInfoStorage(childClass);
+ return new PyExtractSuperclassPresenterImpl(myView, childClass, storage);
+ }
+
+}
diff --git a/python/testSrc/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassTest.java b/python/testSrc/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassTest.java
new file mode 100644
index 0000000..13d5b4d
--- /dev/null
+++ b/python/testSrc/com/jetbrains/python/refactoring/classes/extractSuperclass/PyExtractSuperclassTest.java
@@ -0,0 +1,242 @@
+/*
+ * Copyright 2000-2013 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.refactoring.classes.extractSuperclass;
+
+import com.intellij.openapi.command.WriteCommandAction;
+import com.intellij.openapi.vfs.LocalFileSystem;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.psi.PsiFile;
+import com.intellij.psi.PsiManager;
+import com.intellij.util.ArrayUtil;
+import com.jetbrains.python.PyNames;
+import com.jetbrains.python.psi.LanguageLevel;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.refactoring.classes.PyClassRefactoringTest;
+import com.jetbrains.python.refactoring.classes.membersManager.MembersManager;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
+import org.jetbrains.annotations.NotNull;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * @author Dennis.Ushakov
+ */
+public class PyExtractSuperclassTest extends PyClassRefactoringTest {
+
+ public PyExtractSuperclassTest() {
+ super("extractsuperclass");
+ }
+
+ // Checks that moving methods between files moves imports as well
+ public void testImportMultiFile() throws Throwable {
+ multiFileTestHelper(".do_useful_stuff", false);
+ }
+
+ // Checks that moving methods between files moves superclass expressions as well
+ public void testMoveExtends() throws Throwable {
+ multiFileTestHelper("TheParentOfItAll", false);
+ }
+
+ // Checks that moving methods between files moves superclass expressions regardless import style (q.name or name)
+ public void testMoveExtendsCheckReference() throws Throwable {
+ multiFileTestHelper("TheParentOfItAll", false);
+ }
+
+ // Extracts method as abstract
+ public void testMoveAndMakeAbstract() throws Throwable {
+ multiFileTestHelper(".foo_method", true);
+ }
+
+ // Extracts method as abstract and ensures that newly created class imports ABC in Py3
+ public void testMoveAndMakeAbstractImportExistsPy3() throws Throwable {
+ setLanguageLevel(LanguageLevel.PYTHON30);
+ configureMultiFile("abc");
+ multiFileTestHelper(".foo_method", true);
+ }
+
+ /**
+ * Moves member from class <pre>MyClass</pre> in module <pre>source_module</pre> to class <pre>NewParent</pre> in module <pre>dest_module</pre>.
+ * Ensures it is moved correctly.
+ *
+ * @param memberToMove name of the member to move
+ */
+ private void multiFileTestHelper(@NotNull final String memberToMove, final boolean toAbstract) {
+ final String[] modules = {"dest_module", "source_module"};
+ configureMultiFile(ArrayUtil.mergeArrays(modules, "shared_module"));
+ myFixture.configureByFile("source_module.py");
+ final String sourceClass = "MyClass";
+ final PyMemberInfo<PyElement> member = findMemberInfo(sourceClass, memberToMove);
+ member.setToAbstract(toAbstract);
+ final String destUrl = myFixture.getFile().getVirtualFile().getParent().findChild("dest_module.py").getUrl();
+ new WriteCommandAction.Simple(myFixture.getProject()) {
+ @Override
+ protected void run() throws Throwable {
+ PyExtractSuperclassHelper.extractSuperclass(findClass(sourceClass), Collections.singleton(member), "NewParent", destUrl);
+ }
+ }.execute();
+ checkMultiFile(modules);
+ }
+
+ public void testSimple() throws Exception {
+ doSimpleTest("Foo", "Suppa", null, true, ".foo");
+ }
+
+ public void testInstanceNotDeclaredInInit() throws Exception {
+ doSimpleTest("Child", "Parent", null, true, "#eggs");
+ }
+
+ public void testWithSuper() throws Exception {
+ doSimpleTest("Foo", "Suppa", null, true, ".foo");
+ }
+
+ public void testWithImport() throws Exception {
+ doSimpleTest("A", "Suppa", null, false, ".foo");
+ }
+
+ // PY-12175
+ public void testImportNotBroken() throws Exception {
+ myFixture.copyFileToProject("/refactoring/extractsuperclass/shared.py", "shared.py");
+ doSimpleTest("Source", "DestClass", null, true, "SharedClass");
+ }
+
+ // PY-12175 but between several files
+ public void testImportNotBrokenManyFiles() throws Exception {
+ multiFileTestHelper("SharedClass", false);
+ }
+
+ public void testMoveFields() throws Exception {
+ doSimpleTest("FromClass", "ToClass", null, true, "#instance_field", "#CLASS_FIELD");
+ }
+
+ private void doSimpleTest(final String className,
+ final String superclassName,
+ final String expectedError,
+ final boolean sameFile,
+ final String... membersName) throws Exception {
+ try {
+ String baseName = "/refactoring/extractsuperclass/" + getTestName(true);
+ myFixture.configureByFile(baseName + ".before.py");
+ final PyClass clazz = findClass(className);
+ final List<PyMemberInfo<PyElement>> members = new ArrayList<PyMemberInfo<PyElement>>();
+ for (String memberName : membersName) {
+ final PyElement member = findMember(className, memberName);
+ members.add(MembersManager.findMember(clazz, member));
+ }
+
+ new WriteCommandAction.Simple(myFixture.getProject()) {
+ @Override
+ protected void run() throws Throwable {
+ //noinspection ConstantConditions
+ final String url = sameFile ? myFixture.getFile().getVirtualFile().getUrl() :
+ myFixture.getFile().getVirtualFile().getParent().getUrl();
+ PyExtractSuperclassHelper.extractSuperclass(clazz, members, superclassName, url);
+ }
+ }.execute();
+ myFixture.checkResultByFile(baseName + ".after.py");
+ }
+ catch (Exception e) {
+ if (expectedError == null) throw e;
+ assertEquals(expectedError, e.getMessage());
+ }
+ }
+
+
+ public void testMultifileNew() {
+ String baseName = "/refactoring/extractsuperclass/multifile/";
+ myFixture.configureByFile(baseName + "source.py");
+ final String className = "Foo";
+ final String superclassName = "Suppa";
+ final PyClass clazz = findClass(className);
+ final List<PyMemberInfo<PyElement>> members = new ArrayList<PyMemberInfo<PyElement>>();
+ final PyElement member = findMember(className, ".foo");
+ members.add(MembersManager.findMember(clazz, member));
+ final VirtualFile base_dir = myFixture.getFile().getVirtualFile().getParent();
+
+ new WriteCommandAction.Simple(myFixture.getProject()) {
+ @Override
+ protected void run() throws Throwable {
+ //noinspection ConstantConditions
+ final String path = base_dir.getPath() + "/a/b";
+ PyExtractSuperclassHelper.extractSuperclass(clazz, members, superclassName, path);
+ }
+ }.execute();
+ final PsiManager psi_mgr = PsiManager.getInstance(myFixture.getProject());
+ VirtualFile vfile = base_dir.findChild("a");
+ assertTrue(vfile.isDirectory());
+ vfile = vfile.findChild(PyNames.INIT_DOT_PY);
+ assertNotNull(vfile);
+
+ vfile = base_dir.findChild("a").findChild("b");
+ assertTrue(vfile.isDirectory());
+ vfile = vfile.findChild(PyNames.INIT_DOT_PY);
+ assertNotNull(vfile);
+
+ PsiFile psi_file = psi_mgr.findFile(vfile);
+ String result = psi_file.getText().trim();
+ File expected_file = new File(getTestDataPath() + baseName, "target.new.py");
+ String expected = psi_mgr.findFile(LocalFileSystem.getInstance().findFileByIoFile(expected_file)).getText().trim();
+ assertEquals(expected, result);
+ }
+
+ public void testMultifileAppend() {
+ // this is half-copy-paste of testMultifileNew. generalization won't make either easier to follow.
+ String baseName = "/refactoring/extractsuperclass/multifile/";
+ myFixture.configureByFiles(
+ baseName + "source.py",
+ baseName + "a/__init__.py",
+ baseName + "a/b/__init__.py",
+ baseName + "a/b/foo.py"
+ );
+ final String className = "Foo";
+ final String superclassName = "Suppa";
+ final PyClass clazz = findClass(className);
+ final List<PyMemberInfo<PyElement>> members = new ArrayList<PyMemberInfo<PyElement>>();
+ final PyElement member = findMember(className, ".foo");
+ members.add(MembersManager.findMember(clazz, member));
+ final VirtualFile base_dir = myFixture.getFile().getVirtualFile().getParent();
+
+ new WriteCommandAction.Simple(myFixture.getProject()) {
+ @Override
+ protected void run() throws Throwable {
+ //TODO: Test via presenter
+ //noinspection ConstantConditions
+ final String path = base_dir.getPath() + "/a/b";
+ PyExtractSuperclassHelper.extractSuperclass(clazz, members, superclassName, path + "/foo.py");
+ }
+ }.execute();
+ final PsiManager psi_mgr = PsiManager.getInstance(myFixture.getProject());
+ VirtualFile vfile = base_dir.findChild("a");
+ assertTrue(vfile.isDirectory());
+ vfile = vfile.findChild(PyNames.INIT_DOT_PY);
+ assertNotNull(vfile);
+
+ vfile = base_dir.findChild("a").findChild("b");
+ assertTrue(vfile.isDirectory());
+ assertNotNull(vfile.findChild(PyNames.INIT_DOT_PY));
+ vfile = vfile.findChild("foo.py");
+ assertNotNull(vfile);
+
+ PsiFile psi_file = psi_mgr.findFile(vfile);
+ String result = psi_file.getText().trim();
+ File expected_file = new File(getTestDataPath() + baseName, "target.append.py");
+ String expected = psi_mgr.findFile(LocalFileSystem.getInstance().findFileByIoFile(expected_file)).getText().trim();
+ assertEquals(expected, result);
+ }
+}
diff --git a/python/testSrc/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpInfoModelTest.java b/python/testSrc/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpInfoModelTest.java
new file mode 100644
index 0000000..9fe02c3
--- /dev/null
+++ b/python/testSrc/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpInfoModelTest.java
@@ -0,0 +1,135 @@
+package com.jetbrains.python.refactoring.classes.pullUp;
+
+import com.google.common.collect.Iterables;
+import com.intellij.refactoring.classMembers.MemberInfoModel;
+import com.jetbrains.NotNullPredicate;
+import com.jetbrains.python.fixtures.PyTestCase;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.refactoring.classes.PyMemberInfoStorage;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
+import org.easymock.internal.MocksControl;
+import org.hamcrest.Matchers;
+import org.jetbrains.annotations.NotNull;
+import org.junit.Assert;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Tests dependencies management for PyPullUp refactoring
+ *
+ * @author Ilya.Kazakevich
+ */
+public class PyPullUpInfoModelTest extends PyTestCase {
+ private PyPullUpInfoModel mySut;
+ private List<PyMemberInfo<PyElement>> myMemberInfos;
+
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ myFixture.configureByFile("/refactoring/pullup/pyPullUpInfoModel.py");
+ final PyClass childClass = getClassByName("ChildWithDependencies");
+ final PyClass parentClass = getClassByName("SomeParent");
+ mySut = new PyPullUpInfoModel(childClass, new MocksControl(MocksControl.MockType.NICE).createMock(PyPullUpView.class));
+ mySut.setSuperClass(parentClass);
+ myMemberInfos = new PyMemberInfoStorage(childClass).getClassMemberInfos(childClass);
+ }
+
+ /**
+ * Checks class field depends on class field
+ */
+ public void testClassMemberDependencies() throws Exception {
+ checkMembers("CLASS_FIELD_DEPENDS_ON_CLASS_FIELD_FOO");
+ Assert.assertThat("Class member dependencies failed", getErrorMemberNames(), Matchers.containsInAnyOrder("CLASS_FIELD_FOO"));
+ }
+
+ /**
+ * Checks instance field depends on class field
+ */
+ public void testInstanceMemberDependencies() throws Exception {
+ checkMembers("self.depends_on_class_field_foo");
+ Assert.assertThat("Instance member dependencies failed", getErrorMemberNames(), Matchers.containsInAnyOrder("CLASS_FIELD_FOO"));
+ }
+
+ /**
+ * Checks method depends on another class field
+ */
+ public void testMethodMemberDependencies() throws Exception {
+ checkMembers("method_depends_on_normal_method(self)");
+ Assert.assertThat("Method dependencies failed", getErrorMemberNames(), Matchers.containsInAnyOrder("normal_method(self)"));
+ }
+
+ /**
+ * Checks method depends on method
+ */
+ public void testMethodOnInstanceMemberDependencies() throws Exception {
+ checkMembers("method_depends_on_instance_field_bar(self)");
+ Assert.assertThat("Instance on member dependencies failed", getErrorMemberNames(), Matchers.containsInAnyOrder("self.instance_field_bar"));
+ }
+
+
+ /**
+ * All dependencies are met: new (destination) class has all of them
+ */
+ public void testParentDependenciesOk() throws Exception {
+ checkMembers("CLASS_FIELD_DEPENDS_ON_PARENT_FIELD",
+ "method_depends_on_parent_method(self)",
+ "method_depends_on_parent_field(self)");
+ Assert.assertThat("Dependence check false positive: parent has all required members", getErrorMemberNames(), Matchers.empty());
+ }
+
+
+ /**
+ * New (destination) class has no members, required by member under refactoring.
+ * Error should be displayed.
+ */
+ public void testNoParentDependenciesOk() throws Exception {
+ mySut.setSuperClass(getClassByName("EmptyParent"));
+ checkMembers("CLASS_FIELD_DEPENDS_ON_PARENT_FIELD",
+ "method_depends_on_parent_method(self)",
+ "method_depends_on_parent_field(self)");
+ Assert.assertThat("Dependence check false positive: parent has all required members", getErrorMemberNames(), Matchers.contains("extends SomeParent"));
+ }
+
+
+ /**
+ * @return names of error members (displayed with red)
+ */
+ @NotNull
+ private List<String> getErrorMemberNames() {
+ final List<String> result = new ArrayList<String>();
+ for (final PyMemberInfo<PyElement> info : myMemberInfos) {
+ if (mySut.checkForProblems(info) != MemberInfoModel.OK) {
+ result.add(info.getDisplayName());
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Marks members to be moved (sets checkbox on them)
+ * @param memberNames names of members to check
+ */
+ private void checkMembers(@NotNull final String... memberNames) {
+ for (final String memberName : memberNames) {
+ Iterables.find(myMemberInfos, new NamePredicate(memberName)).setChecked(true);
+ }
+ mySut.memberInfoChanged(myMemberInfos);
+ }
+
+ private static class NamePredicate extends NotNullPredicate<PyMemberInfo<?>> {
+ @NotNull
+ private final String myNameToSearch;
+
+ private NamePredicate(@NotNull final String nameToSearch) {
+ myNameToSearch = nameToSearch;
+ }
+
+ @Override
+ protected boolean applyNotNull(@NotNull final PyMemberInfo<?> input) {
+ return input.getDisplayName().equals(myNameToSearch);
+ }
+ }
+}
diff --git a/python/testSrc/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpPresenterTest.java b/python/testSrc/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpPresenterTest.java
new file mode 100644
index 0000000..ee5371c
--- /dev/null
+++ b/python/testSrc/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpPresenterTest.java
@@ -0,0 +1,207 @@
+package com.jetbrains.python.refactoring.classes.pullUp;
+
+import com.google.common.collect.Collections2;
+import com.intellij.util.containers.MultiMap;
+import com.jetbrains.python.psi.LanguageLevel;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.refactoring.classes.NameTransformer;
+import com.jetbrains.python.refactoring.classes.PyMemberInfoStorage;
+import com.jetbrains.python.refactoring.classes.PyPresenterTestMemberEntry;
+import com.jetbrains.python.refactoring.classes.PyRefactoringPresenterTestCase;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
+import org.easymock.Capture;
+import org.easymock.EasyMock;
+import org.hamcrest.Matcher;
+import org.hamcrest.Matchers;
+import org.jetbrains.annotations.NotNull;
+import org.junit.Assert;
+
+import java.util.Collection;
+
+
+/**
+ * Test presenter for pull-up refactoring
+ *
+ * @author Ilya.Kazakevich
+ */
+public class PyPullUpPresenterTest extends PyRefactoringPresenterTestCase<PyPullUpViewInitializationInfo, PyPullUpView> {
+
+
+ public PyPullUpPresenterTest() {
+ super(PyPullUpView.class, "pullup");
+ }
+
+ /**
+ * Checks that parents are returned in MRO order and no parents outside of source root are included
+ */
+ public void testParentsOrder() throws Exception {
+ final PyPullUpPresenter sut = configureByClass("Child");
+ configureParent();
+ myMocksControl.replay();
+
+ sut.launch();
+ Assert.assertTrue("Presenter did not show parents", myViewConfigCapture.hasCaptured());
+ final Collection<PyClass> parents = myViewConfigCapture.getValue().getParents();
+ Assert.assertThat("Wrong list of parents or parents are listed in wrong order", Collections2.transform(parents, CLASS_TO_NAME),
+ Matchers.contains("SubParent1", "SubParent2", "MainParent"));
+ }
+
+ /**
+ * Checks that refactoring does not work for classes with out of allowed parents
+ */
+ public void testNoParents() throws Exception {
+ ensureNoMembers("NoParentsAllowed");
+ }
+
+ /**
+ * Ensures that presenter displays conflicts if destination class already has that members
+ */
+ public void testConflicts() throws Exception {
+ final PyPullUpPresenterImpl sut = configureByClass("ChildWithConflicts");
+ configureParent();
+ final Collection<PyMemberInfo<PyElement>> infos = getMemberInfos(sut);
+
+ final Capture<MultiMap<PyClass, PyMemberInfo<?>>> conflictCapture = new Capture<MultiMap<PyClass, PyMemberInfo<?>>>();
+ EasyMock.expect(myView.showConflictsDialog(EasyMock.capture(conflictCapture), EasyMock.<Collection<PyMemberInfo<?>>>anyObject())).andReturn(false).anyTimes();
+ EasyMock.expect(myView.getSelectedMemberInfos()).andReturn(infos).anyTimes();
+ final PyClass parent = getClassByName("ParentWithConflicts");
+ EasyMock.expect(myView.getSelectedParent()).andReturn(parent).anyTimes();
+ myMocksControl.replay();
+ sut.okClicked();
+
+ final MultiMap<PyClass, PyMemberInfo<?>> conflictMap = conflictCapture.getValue();
+ Assert.assertTrue("No conflicts found, while it should", conflictMap.containsKey(parent));
+ final Collection<String> conflictedMemberNames = Collections2.transform(conflictMap.get(parent), NameTransformer.INSTANCE);
+ Assert.assertThat("Failed to find right conflicts", conflictedMemberNames, Matchers.containsInAnyOrder(
+ "extends Bar",
+ "CLASS_FIELD",
+ "self.instance_field",
+ "my_func(self)",
+ "__init__(self)"
+ ));
+
+
+ }
+
+ /**
+ * Checks that refactoring does not work for classes with out of members
+ */
+ public void testNoMembers() throws Exception {
+ ensureNoMembers("NoMembers");
+ }
+
+ /**
+ * Checks that refactoring does not work when C3 MRO can't be calculated
+ */
+ public void testBadMro() throws Exception {
+ ensureNoMembers("BadMro");
+ }
+
+ /**
+ * Checks that parent can't be moved to itself
+ */
+ public void testNoMoveParentToItSelf() throws Exception {
+ final Collection<PyPresenterTestMemberEntry> memberNamesAndStatus = launchAndGetMembers("Foo", "Bar");
+
+ compareMembers(memberNamesAndStatus, Matchers.containsInAnyOrder(new PyPresenterTestMemberEntry("__init__(self)", true, false, false),
+ new PyPresenterTestMemberEntry("self.foo", true, false, false),
+ new PyPresenterTestMemberEntry("extends Bar", false, false, false)));
+ }
+
+ /**
+ * Checks that some members are not allowed (and may nto be abstract), while others are for Py2
+ */
+ public void testMembersPy2() throws Exception {
+ ensureCorrectMembersForHugeChild(false);
+ }
+
+ /**
+ * Checks that some members are not allowed (and may nto be abstract), while others are for Py3
+ */
+ public void testMembersPy3() throws Exception {
+ setLanguageLevel(LanguageLevel.PYTHON30);
+ ensureCorrectMembersForHugeChild(true);
+ }
+
+ /**
+ * Checks members for class HugeChild
+ *
+ * @param py3K if python 3
+ */
+ private void ensureCorrectMembersForHugeChild(final boolean py3K) {
+ final Collection<PyPresenterTestMemberEntry> memberNamesAndStatus = launchAndGetMembers("HugeChild", "SubParent1");
+
+ //Pair will return correct type
+ final Matcher<Iterable<? extends PyPresenterTestMemberEntry>> matcher = Matchers
+ .containsInAnyOrder(new PyPresenterTestMemberEntry("extends date", true, false, false),
+ new PyPresenterTestMemberEntry("CLASS_FIELD", true, true, false),
+ new PyPresenterTestMemberEntry("__init__(self)", true, false, false),
+ new PyPresenterTestMemberEntry("extends SubParent1", false, false, false),
+ new PyPresenterTestMemberEntry("foo(self)", true, false, true),
+ new PyPresenterTestMemberEntry("bar(self)", true, false, true),
+ new PyPresenterTestMemberEntry("static_1(cls)", true, true, py3K),
+ new PyPresenterTestMemberEntry("static_2()", true, true, py3K),
+ new PyPresenterTestMemberEntry("self.instance_field_1", true, false, false),
+ new PyPresenterTestMemberEntry("self.instance_field_2", true, false, false),
+ new PyPresenterTestMemberEntry("bad_method()", true, false, true));
+ compareMembers(memberNamesAndStatus, matcher);
+ }
+
+
+ /**
+ * Launches presenter and returns members it displayed to user
+ *
+ * @param classUnderRefactoring class to refactor
+ * @param destinationClass where to move it
+ * @return members displayed to user
+ */
+ @NotNull
+ private Collection<PyPresenterTestMemberEntry> launchAndGetMembers(@NotNull final String classUnderRefactoring,
+ @NotNull final String destinationClass) {
+ final PyPullUpPresenterImpl sut = configureByClass(classUnderRefactoring);
+
+ EasyMock.expect(myView.getSelectedParent()).andReturn(getClassByName(destinationClass)).anyTimes();
+
+ myMocksControl.replay();
+ sut.launch();
+
+ return getMembers();
+ }
+
+ /**
+ * Checks that refactoring does not work for classes with out of members
+ */
+ private void ensureNoMembers(@NotNull final String className) throws Exception {
+ try {
+ final PyPullUpPresenter sut = configureByClass(className);
+
+ myMocksControl.replay();
+ sut.launch();
+ }
+ catch (final IllegalArgumentException ignored) {
+ return;
+ }
+ Assert
+ .fail("Presenter should throw exception, but it returned list of parents instead: " + myViewConfigCapture.getValue().getParents());
+ }
+
+ /**
+ * Creates presenter (sut) by class
+ *
+ * @param name name of class
+ * @return presenter
+ */
+ private PyPullUpPresenterImpl configureByClass(@NotNull final String name) {
+ final PyClass childClass = getClassByName(name);
+ final PyMemberInfoStorage storage = new PyMemberInfoStorage(childClass);
+ return new PyPullUpPresenterImpl(myView, storage, childClass);
+ }
+
+ /**
+ * Makes view to return class "Parent" as selected parent
+ */
+ private void configureParent() {
+ EasyMock.expect(myView.getSelectedParent()).andReturn(getClassByName("Parent")).anyTimes();
+ }
+}
diff --git a/python/testSrc/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpTest.java b/python/testSrc/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpTest.java
new file mode 100644
index 0000000..d725c17
--- /dev/null
+++ b/python/testSrc/com/jetbrains/python/refactoring/classes/pullUp/PyPullUpTest.java
@@ -0,0 +1,175 @@
+/*
+ * Copyright 2000-2013 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.refactoring.classes.pullUp;
+
+import com.intellij.util.ArrayUtil;
+import com.jetbrains.python.psi.LanguageLevel;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.refactoring.classes.PyClassRefactoringTest;
+import com.jetbrains.python.refactoring.classes.membersManager.MembersManager;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+/**
+ * @author Dennis.Ushakov
+ */
+public class PyPullUpTest extends PyClassRefactoringTest {
+
+ public PyPullUpTest() {
+ super("pullup");
+ }
+
+ public void testSimple() {
+ doHelperTest("Boo", ".boo", "Foo");
+ }
+
+ public void testSuperclass() {
+ doHelperTest("Boo", "Foo", "Zope");
+ }
+
+ public void testExistingsuperclass() {
+ doHelperTest("Boo", "Foo", "Zope");
+ }
+
+ public void testWithComments() {
+ doHelperTest("Boo", ".boo", "Foo");
+ }
+
+ public void testWithMultilineComments() {
+ doHelperTest("Boo", ".boo", "Foo");
+ }
+
+ public void testSeveralParents() {
+ doHelperTest("Child", "Spam", "Parent_1");
+ }
+
+ public void testMoveClassAttributesSimple() {
+ doHelperTest("Child", "#CLASS_VAR", "Parent");
+ }
+
+ public void testInstanceNotDeclaredInInit() {
+ doHelperTest("Child", "#foo", "Parent");
+ }
+
+ public void testMoveClassAttributesNoPass() {
+ doHelperTest("Child2", "#CLASS_VAR", "Parent2");
+ }
+
+ public void testMoveInstanceAttributesSimple() {
+ doHelperTest("Child", "#instance_field", "Parent");
+ }
+
+ public void testMoveInstanceAttributesNoInit() {
+ doHelperTest("Child", "#instance_field", "Parent");
+ }
+
+ public void testMoveInstanceAttributesLeaveEmptyInit() {
+ doHelperTest("Child", "#foo", "Parent");
+ }
+
+ // Ensures than all fields are moved in correct order
+ public void testDependenciesOrder() {
+ doHelperTestSeveralMembers("Child", "Parent", "#CLASS_FIELD", "#ANOTHER_CLASS_FIELD", "#FIELD", ".foo", "#SOME_VAR", "#b", "#d", "#A_FIELD");
+ }
+
+ public void testMultiFile() { // PY-2810
+ doMultiFileTest();
+ }
+
+ public void testDuplicateImport() { // PY-2810
+ doMultiFileTest();
+ }
+
+ public void testFieldMove() {
+ final String[] modules = {"Class", "SuperClass"};
+ configureMultiFile(modules);
+ doPullUp("AnyClass", "SuperClass", "#COPYRIGHT");
+ doPullUp("AnyClass", "SuperClass", "#version");
+ checkMultiFile(modules);
+ }
+
+ private void doMultiFileTest() {
+ final String[] modules = {"Class", "SuperClass"};
+ configureMultiFile(modules);
+ doPullUp("AnyClass", "SuperClass", ".this_should_be_in_super");
+ checkMultiFile(modules);
+ }
+
+ /**
+ * Ensures that pulling abstract method up to class that already uses ABCMeta works correctly
+ */
+ public void testAbstractMethodHasMeta() {
+ checkAbstract(".my_method");
+ }
+
+ /**
+ * Ensures that pulling abstract method up to class that has NO ABCMeta works correctly for py2 (__metaclass__ is added)
+ */
+ public void testAbstractMethodPy2AddMeta() {
+ checkAbstract(".my_method", ".my_method_2");
+ }
+
+ /**
+ * Ensures that pulling abstract method up to class that has NO ABCMeta works correctly for py3k (metaclass is added)
+ */
+ public void testAbstractMethodPy3AddMeta() {
+ setLanguageLevel(LanguageLevel.PYTHON34);
+ checkAbstract(".my_method", ".my_class_method");
+ }
+
+ /**
+ * Moves methods fromn Child to Parent and make them abstract
+ * @param methodNames methods to check
+ */
+ private void checkAbstract(@NotNull final String... methodNames) {
+ final String[] modules = {"Class", "SuperClass"};
+ configureMultiFile(ArrayUtil.mergeArrays(modules, "abc"));
+ doPullUp("Child", "Parent", true, methodNames);
+ checkMultiFile(modules);
+ }
+
+
+ private void doHelperTest(final String className, final String memberName, final String superClassName) {
+ doHelperTestSeveralMembers(className, superClassName, memberName);
+ }
+
+ private void doHelperTestSeveralMembers(@NotNull final String className, @NotNull final String superClassName, @NotNull final String... memberNames) {
+ myFixture.configureByFile(getMultiFileBaseName() + ".py");
+ doPullUp(className, superClassName, false, memberNames);
+ myFixture.checkResultByFile(getMultiFileBaseName() + ".after.py");
+ }
+
+ private void doPullUp(final String className, final String superClassName, final String memberName) {
+ doPullUp(className, superClassName, false, memberName);
+ }
+ private void doPullUp(final String className, final String superClassName, final boolean toAbstract, final String... memberNames ) {
+ final PyClass clazz = findClass(className);
+ final PyClass superClass = findClass(superClassName);
+ final Collection<PyMemberInfo<PyElement>> membersToMove = new ArrayList<PyMemberInfo<PyElement>>(memberNames.length);
+ for (final String memberName : memberNames) {
+ final PyElement member = findMember(className, memberName);
+ final PyMemberInfo<PyElement> memberInfo = MembersManager.findMember(clazz, member);
+ memberInfo.setToAbstract(toAbstract);
+ membersToMove.add(memberInfo);
+ }
+ moveViaProcessor(clazz.getProject(),
+ new PyPullUpProcessor(clazz, superClass, membersToMove));
+ }
+}
diff --git a/python/testSrc/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownTest.java b/python/testSrc/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownTest.java
new file mode 100644
index 0000000..e2bd778
--- /dev/null
+++ b/python/testSrc/com/jetbrains/python/refactoring/classes/pushDown/PyPushDownTest.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2000-2013 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jetbrains.python.refactoring.classes.pushDown;
+
+import com.intellij.util.ArrayUtil;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyElement;
+import com.jetbrains.python.refactoring.classes.PyClassRefactoringTest;
+import com.jetbrains.python.refactoring.classes.membersManager.MembersManager;
+import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * @author Dennis.Ushakov
+ */
+public class PyPushDownTest extends PyClassRefactoringTest {
+
+ public PyPushDownTest() {
+ super("pushdown");
+ }
+
+ // Tests that pushing down methods moves imports as well (PY-10963)
+ public void testMultiFileImports() {
+ final String[] modules = {"child_module", "parent_module"};
+ configureMultiFile(ArrayUtil.mergeArrays(modules, "shared_module"));
+ final PyClass parentClass = findClass("Parent");
+ final PyMemberInfo<PyElement> methodToMove = MembersManager.findMember(parentClass, findMember("Parent", ".should_be_pushed"));
+
+ moveViaProcessor(myFixture.getProject(), new PyPushDownProcessor(myFixture.getProject(), Collections.singletonList(methodToMove), parentClass));
+ checkMultiFile(modules);
+ }
+
+ public void testSimple() throws Exception {
+ doProcessorTest("Foo", null, ".foo");
+ }
+
+ public void testSuperclass() throws Exception {
+ doProcessorTest("Zope", null, "Foo");
+ }
+
+ public void testFull() throws Exception {
+ doProcessorTest("Parent", null, "#CLASS_VAR_1", "#inst_var", ".method_1", "Dummny");
+ }
+
+ public void testMultiple() throws Exception {
+ doProcessorTest("Foo", null, ".foo");
+ }
+
+ public void testPy346() throws Exception {
+ doProcessorTest("A", null, ".meth_a1", ".meth_a2");
+ }
+
+ public void testExistingmethod() throws Exception {
+ doProcessorTest("Foo",
+ "method <b><code>foo</code></b> is already overridden in class <b><code>Boo</code></b>. Method will not be pushed down to that class.",
+ ".foo");
+ }
+
+ private void doProcessorTest(final String className, final String expectedError, final String... memberNames) throws Exception {
+ try {
+ String baseName = "/refactoring/pushdown/" + getTestName(true);
+ myFixture.configureByFile(baseName + ".before.py");
+ final PyClass clazz = findClass(className);
+ final List<PyMemberInfo<PyElement>> members = new ArrayList<PyMemberInfo<PyElement>>();
+ for (String memberName : memberNames) {
+ final PyElement member = findMember(className, memberName);
+ members.add(MembersManager.findMember(clazz, member));
+ }
+
+ final PyPushDownProcessor processor = new PyPushDownProcessor(myFixture.getProject(), members, clazz);
+ moveViaProcessor(myFixture.getProject(), processor);
+ myFixture.checkResultByFile(baseName + ".after.py");
+ }
+ catch (Exception e) {
+ if (expectedError == null) throw e;
+ assertTrue(e.getMessage(), e.getMessage().contains(expectedError));
+ }
+ }
+}
diff --git a/python/testSrc/python-community-tests.iml b/python/testSrc/python-community-tests.iml
index b4cc276..6511d88 100644
--- a/python/testSrc/python-community-tests.iml
+++ b/python/testSrc/python-community-tests.iml
@@ -15,6 +15,7 @@
<orderEntry type="module" module-name="spellchecker" scope="TEST" />
<orderEntry type="module" module-name="python-ide-community" />
<orderEntry type="module" module-name="python-helpers" scope="RUNTIME" />
+ <orderEntry type="library" name="Groovy" level="project" />
</component>
</module>