add support for lessons and modules written in Kotlin
authorSergey Karashevich <sergey.karashevich@jetbrains.com>
Fri, 12 Oct 2018 17:32:39 +0000 (20:32 +0300)
committerintellij-monorepo-bot <intellij-monorepo-bot-no-reply@jetbrains.com>
Thu, 14 Nov 2019 22:34:47 +0000 (22:34 +0000)
GitOrigin-RevId: 6f38137a40c8813b0b79d88ba391f2aea426d46f

42 files changed:
ide-features-trainer/.idea/ant.xml [deleted file]
ide-features-trainer/.idea/dictionaries/jetbrains.xml [deleted file]
ide-features-trainer/.idea/modules.xml [deleted file]
ide-features-trainer/.idea/modules/training.iml [deleted file]
ide-features-trainer/.idea/modules/training_main.iml [deleted file]
ide-features-trainer/.idea/modules/training_test.iml [deleted file]
ide-features-trainer/.idea/uiDesigner.xml [deleted file]
ide-features-trainer/build.gradle
ide-features-trainer/gradle.properties [new file with mode: 0644]
ide-features-trainer/res/data/modules/java/Navigation/02.Declaration.xml
ide-features-trainer/src/training/actions/OpenLessonAction.kt
ide-features-trainer/src/training/commands/ExecutionList.kt
ide-features-trainer/src/training/commands/TryCommand.kt
ide-features-trainer/src/training/commands/kotlin/Commands.kt [new file with mode: 0644]
ide-features-trainer/src/training/commands/kotlin/TaskContext.kt [new file with mode: 0644]
ide-features-trainer/src/training/learn/ActionsRecorder.kt
ide-features-trainer/src/training/learn/CourseManager.kt
ide-features-trainer/src/training/learn/XmlModule.kt [moved from ide-features-trainer/src/training/learn/Module.kt with 80% similarity]
ide-features-trainer/src/training/learn/interfaces/Lesson.kt [new file with mode: 0644]
ide-features-trainer/src/training/learn/interfaces/Module.kt [new file with mode: 0644]
ide-features-trainer/src/training/learn/interfaces/ModuleType.kt [new file with mode: 0644]
ide-features-trainer/src/training/learn/lesson/LessonListener.kt
ide-features-trainer/src/training/learn/lesson/LessonListenerAdapter.kt
ide-features-trainer/src/training/learn/lesson/LessonManager.kt
ide-features-trainer/src/training/learn/lesson/LessonProcessor.kt
ide-features-trainer/src/training/learn/lesson/LessonStateBase.kt
ide-features-trainer/src/training/learn/lesson/XmlLesson.kt [moved from ide-features-trainer/src/training/learn/lesson/Lesson.kt with 67% similarity]
ide-features-trainer/src/training/learn/lesson/kimpl/KLesson.kt [new file with mode: 0644]
ide-features-trainer/src/training/learn/lesson/kimpl/KModule.kt [new file with mode: 0644]
ide-features-trainer/src/training/learn/lesson/listeners/NextLessonListener.kt
ide-features-trainer/src/training/learn/lesson/listeners/StatisticLessonListener.kt
ide-features-trainer/src/training/learn/log/GlobalLessonLog.java [deleted file]
ide-features-trainer/src/training/learn/log/LessonLog.kt
ide-features-trainer/src/training/lessons/java/EditorBasicsModule.kt [new file with mode: 0644]
ide-features-trainer/src/training/statistic/StatisticBase.kt
ide-features-trainer/src/training/ui/MessageUtils.kt [new file with mode: 0644]
ide-features-trainer/src/training/ui/UISettings.kt
ide-features-trainer/src/training/ui/UiManager.kt
ide-features-trainer/src/training/ui/views/LearnPanel.kt
ide-features-trainer/src/training/ui/views/ModulesPanel.kt
ide-features-trainer/src/training/util/GenModuleXml.java
ide-features-trainer/training.iml [deleted file]

diff --git a/ide-features-trainer/.idea/ant.xml b/ide-features-trainer/.idea/ant.xml
deleted file mode 100644 (file)
index c8f67ff..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4" />
\ No newline at end of file
diff --git a/ide-features-trainer/.idea/dictionaries/jetbrains.xml b/ide-features-trainer/.idea/dictionaries/jetbrains.xml
deleted file mode 100644 (file)
index bca103a..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<component name="ProjectDictionaryState">
-  <dictionary name="jetbrains">
-    <words>
-      <w>darcula</w>
-      <w>karashevich</w>
-      <w>multicaster</w>
-      <w>xroot</w>
-    </words>
-  </dictionary>
-</component>
\ No newline at end of file
diff --git a/ide-features-trainer/.idea/modules.xml b/ide-features-trainer/.idea/modules.xml
deleted file mode 100644 (file)
index 022668e..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="ProjectModuleManager">
-    <modules>
-      <module fileurl="file://$PROJECT_DIR$/.idea/modules/training.iml" filepath="$PROJECT_DIR$/.idea/modules/training.iml" />
-      <module fileurl="file://$PROJECT_DIR$/.idea/modules/training_main.iml" filepath="$PROJECT_DIR$/.idea/modules/training_main.iml" group="training" />
-      <module fileurl="file://$PROJECT_DIR$/.idea/modules/training_test.iml" filepath="$PROJECT_DIR$/.idea/modules/training_test.iml" group="training" />
-    </modules>
-  </component>
-</project>
\ No newline at end of file
diff --git a/ide-features-trainer/.idea/modules/training.iml b/ide-features-trainer/.idea/modules/training.iml
deleted file mode 100644 (file)
index 42609f0..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module external.linked.project.id="training" external.linked.project.path="$MODULE_DIR$/../.." external.root.project.path="$MODULE_DIR$/../.." external.system.id="GRADLE" external.system.module.group="org.sk" external.system.module.version="0.8.SNAPSHOT" type="JAVA_MODULE" version="4">
-  <component name="NewModuleRootManager" inherit-compiler-output="true">
-    <exclude-output />
-    <content url="file://$MODULE_DIR$/../..">
-      <excludeFolder url="file://$MODULE_DIR$/../../.gradle" />
-      <excludeFolder url="file://$MODULE_DIR$/../../build" />
-      <excludeFolder url="file://$MODULE_DIR$/../../out" />
-    </content>
-    <orderEntry type="inheritedJdk" />
-    <orderEntry type="sourceFolder" forTests="false" />
-  </component>
-</module>
\ No newline at end of file
diff --git a/ide-features-trainer/.idea/modules/training_main.iml b/ide-features-trainer/.idea/modules/training_main.iml
deleted file mode 100644 (file)
index 5280146..0000000
+++ /dev/null
@@ -1,275 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module external.linked.project.id="training:main" external.linked.project.path="$MODULE_DIR$/../.." external.root.project.path="$MODULE_DIR$/../.." external.system.id="GRADLE" external.system.module.group="org.sk" external.system.module.type="sourceSet" external.system.module.version="0.8.SNAPSHOT" type="JAVA_MODULE" version="4">
-  <component name="FacetManager">
-    <facet type="kotlin-language" name="Kotlin">
-      <configuration version="3" platform="JVM 1.6" useProjectSettings="false">
-        <compilerSettings />
-        <compilerArguments>
-          <option name="destination" value="$MODULE_DIR$/../../build/kotlin-classes/main" />
-          <option name="noStdlib" value="true" />
-          <option name="noReflect" value="true" />
-          <option name="moduleName" value="training_main" />
-          <option name="addCompilerBuiltIns" value="true" />
-          <option name="languageVersion" value="1.1" />
-          <option name="apiVersion" value="1.1" />
-          <option name="pluginOptions">
-            <array />
-          </option>
-          <option name="pluginClasspaths">
-            <array />
-          </option>
-        </compilerArguments>
-      </configuration>
-    </facet>
-  </component>
-  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
-    <output url="file://$MODULE_DIR$/../../out/production/classes" />
-    <exclude-output />
-    <content url="file://$MODULE_DIR$/../../res">
-      <sourceFolder url="file://$MODULE_DIR$/../../res" type="java-resource" />
-    </content>
-    <content url="file://$MODULE_DIR$/../../src">
-      <sourceFolder url="file://$MODULE_DIR$/../../src" isTestSource="false" />
-    </content>
-    <orderEntry type="inheritedJdk" />
-    <orderEntry type="sourceFolder" forTests="false" />
-    <orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-jre8:1.1.4-3" level="project" />
-    <orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-reflect:1.1.4-3" level="project" />
-    <orderEntry type="module-library" scope="RUNTIME">
-      <library>
-        <CLASSES>
-          <root url="jar://C:/Program Files/Java/jbsdk8u152b1211_x64/lib/tools.jar!/" />
-        </CLASSES>
-        <JAVADOC />
-        <SOURCES />
-      </library>
-    </orderEntry>
-    <orderEntry type="library" name="Gradle: org.jetbrains:annotations:13.0" level="project" />
-    <orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-jre7:1.1.4-3" level="project" />
-    <orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib:1.1.4-3" level="project" />
-    <orderEntry type="module-library" scope="PROVIDED">
-      <library name="Gradle: com.jetbrains:ideaIU:182.3458.5">
-        <CLASSES>
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/aether-api-1.1.0.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/aether-connector-basic-1.1.0.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/aether-dependency-resolver.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/aether-impl-1.1.0.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/aether-spi-1.1.0.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/aether-transport-file-1.1.0.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/aether-transport-http-1.1.0.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/aether-util-1.1.0.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/annotations.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/asm-5.0.3.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/asm-all.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/asm-analysis-5.0.3.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/asm-tree-5.0.3.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/automaton-1.12-1.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/baksmali-2.2.1.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/batik-all-1.10.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/bcprov-jdk15on-1.59.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/bootstrap.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/cglib-nodep-3.2.4.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/cli-parser-1.1.2.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/cloud-config-client.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/common-image-3.3.2.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/common-io-3.3.2.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/common-lang-3.3.2.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/commons-codec-1.10.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/commons-collections-3.2.1.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/commons-compress-1.16.1.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/commons-httpclient-3.1-patched.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/commons-imaging-1.0-RC-1.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/commons-io-2.6.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/commons-lang-2.4.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/commons-lang3-3.4.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/commons-logging-1.2.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/commons-net-3.6.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/constraint-layout.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/delight-rhino-sandbox-0.0.6.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/dexlib2-2.2.1.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/ecj-4.7.2.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/eddsa-0.2.0.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/extensions.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/external-system-rt.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/fest-assert-1.5.0-SNAPSHOT.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/fest-reflect-2.0-SNAPSHOT.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/fest-swing-1.4.6.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/fest-util-1.3.0-SNAPSHOT.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/fluent-hc-4.5.5.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/forms-1.1-preview.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/forms_rt.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/fst-2.57.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/groovy-all-2.4.15.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/gson-2.8.4.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/guava-23.6-jre.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/hamcrest-core-1.3.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/httpclient-4.5.5.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/httpcore-4.4.9.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/httpmime-4.5.5.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/icons.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/idea-jsp-openapi.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/idea.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/ideax.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/idea_rt.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/imageio-core-3.3.2.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/imageio-metadata-3.3.2.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/imageio-tiff-3.3.2.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/imgscalr-lib-4.2.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/ini4j-0.5.5-2.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/intellij-coverage-agent-1.0.470.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/intellij-test-discovery-agent-1.0.470.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/isorelax-20030108.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jackson-annotations-2.9.0.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jackson-core-2.9.5.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jackson-databind-2.9.5.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jasper21_rt.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jasper2_rt.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/java-api.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/java-impl.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/javac2.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/javahelp-2.0.02.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/javassist-3.22.0-GA.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/javax.inject-1.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/java_resources_en.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jaxen-1.1.6.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jayatana-1.2.4.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jbcrypt-1.0.0.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jcip-annotations-1.0.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jdkAnnotations.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jdom.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jediterm-pty-2.9.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jetCheck.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jettison-1.4.0.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jgoodies-common-1.4.0.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jing.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jna-platform.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jna.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jps-builders-6.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jps-builders.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jps-launcher.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jps-model.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jsch-0.1.54.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jsch.agentproxy.connector-factory.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jsch.agentproxy.core.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jsch.agentproxy.jsch.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jsch.agentproxy.pageant.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jsch.agentproxy.sshagent.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jsch.agentproxy.usocket-jna.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jsch.agentproxy.usocket-nc.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jshell-frontend.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jshell-protocol.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jsp-api.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jsr305.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/junit-4.12.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/junit.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jzlib-1.1.3.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/kotlin-test.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/kotlinx-coroutines-core-0.22.5.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/kotlinx-coroutines-jdk8-0.22.5.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/log4j-1.2.17.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/log4j.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/lz4-1.3.0.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/markdown4j-2.2-cj-1.1.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/markdownj-core-0.4.2-SNAPSHOT.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/maven-aether-provider-3.3.9.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/maven-artifact-3.3.9.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/maven-builder-support-3.3.9.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/maven-model-3.3.9.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/maven-model-builder-3.3.9.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/maven-repository-metadata-3.3.9.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/microba.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/miglayout-core-5.1.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/miglayout-swing-5.1.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/MultithreadedTC-1.01.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/nanoxml-2.2.3.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/nekohtml-1.9.22.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/netty-buffer-4.1.25.Final.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/netty-codec-4.1.25.Final.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/netty-codec-http-4.1.25.Final.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/netty-common-4.1.25.Final.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/netty-handler-4.1.25.Final.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/netty-resolver-4.1.25.Final.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/netty-transport-4.1.25.Final.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/objenesis-2.6.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/openapi.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/optimizedFileManager.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/oro-2.0.8.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/picocontainer-1.2.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/platform-api.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/platform-impl.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/plexus-component-annotations-1.6.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/plexus-interpolation-1.21.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/plexus-utils-3.0.22.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/protobuf-java-3.4.0.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/proxy-vole-1.0.4.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/pty4j-0.7.5.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/purejavacomm.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/resources.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/resources_en.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/rhino-1.7.10.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/rngom-20051226-patched.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/serviceMessages.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/servlet-api.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/slf4j-api-1.7.25.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/slf4j-log4j12-1.7.25.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/snakeyaml-1.21.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/sqlite-jdbc-3.21.0.1.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/stax-api-1.0.1.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/streamex-0.6.5.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/swingx-core-1.6.2-2.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/trang-core.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/trilead-ssh2-build-217-jenkins-11.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/trove4j.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/util-2.2.1.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/util.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/velocity-1.7.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/wadl-core.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/winp-1.26.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/xercesImpl-2.11.0.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/xml-apis-ext-1.3.04.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/xml-resolver-1.2.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/xmlbeans-2.6.0.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/xmlgraphics-commons-2.2.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/xmlpull-1.1.3.1.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/xmlrpc-2.0.1.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/xpp3_min-1.1.4c.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/xstream-1.4.10.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/xz-1.8.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/yjp-controller-api-redist.jar!/" />
-        </CLASSES>
-        <JAVADOC />
-        <SOURCES>
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIC/182.3458.5/3d83bd9e0cdd139fdedc8c7e9dff4b8dfcfb5903/ideaIC-182.3458.5-sources.jar!/" />
-        </SOURCES>
-      </library>
-    </orderEntry>
-    <orderEntry type="module-library" scope="PROVIDED">
-      <library name="Gradle: org.jetbrains.plugins:Pythonid:2018.2.182.3341.29">
-        <CLASSES>
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/plugins.jetbrains.com/Pythonid-2018.2.182.3341.29/python/lib/commons-io-2.3.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/plugins.jetbrains.com/Pythonid-2018.2.182.3341.29/python/lib/commons-lang-2.6.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/plugins.jetbrains.com/Pythonid-2018.2.182.3341.29/python/lib/java_websocket.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/plugins.jetbrains.com/Pythonid-2018.2.182.3341.29/python/lib/jsoup-1.10.3.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/plugins.jetbrains.com/Pythonid-2018.2.182.3341.29/python/lib/libthrift-0.11.0.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/plugins.jetbrains.com/Pythonid-2018.2.182.3341.29/python/lib/python.jar!/" />
-        </CLASSES>
-        <JAVADOC />
-        <SOURCES />
-      </library>
-    </orderEntry>
-    <orderEntry type="module-library" scope="PROVIDED">
-      <library name="Gradle: org.jetbrains.plugins:org.jetbrains.plugins.go:182.3458.6.790">
-        <CLASSES>
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/plugins.jetbrains.com/org.jetbrains.plugins.go-182.3458.6.790/intellij-go/lib/go-template-182.3458.6.790.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/plugins.jetbrains.com/org.jetbrains.plugins.go-182.3458.6.790/intellij-go/lib/go-utils-182.3458.6.790.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/plugins.jetbrains.com/org.jetbrains.plugins.go-182.3458.6.790/intellij-go/lib/intellij-go-182.3458.6.790.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/plugins.jetbrains.com/org.jetbrains.plugins.go-182.3458.6.790/intellij-go/lib/plan9-182.3458.6.790.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/plugins.jetbrains.com/org.jetbrains.plugins.go-182.3458.6.790/intellij-go/lib/toml4j-0.7.2.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/plugins.jetbrains.com/org.jetbrains.plugins.go-182.3458.6.790/intellij-go/lib/vgo-182.3458.6.790.jar!/" />
-        </CLASSES>
-        <JAVADOC />
-        <SOURCES />
-      </library>
-    </orderEntry>
-  </component>
-</module>
\ No newline at end of file
diff --git a/ide-features-trainer/.idea/modules/training_test.iml b/ide-features-trainer/.idea/modules/training_test.iml
deleted file mode 100644 (file)
index 3701801..0000000
+++ /dev/null
@@ -1,273 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module external.linked.project.id="training:test" external.linked.project.path="$MODULE_DIR$/../.." external.root.project.path="$MODULE_DIR$/../.." external.system.id="GRADLE" external.system.module.group="org.sk" external.system.module.type="sourceSet" external.system.module.version="0.8.SNAPSHOT" type="JAVA_MODULE" version="4">
-  <component name="FacetManager">
-    <facet type="kotlin-language" name="Kotlin">
-      <configuration version="3" platform="JVM 1.6" useProjectSettings="false">
-        <compilerSettings />
-        <compilerArguments>
-          <option name="destination" value="$MODULE_DIR$/../../build/kotlin-classes/test" />
-          <option name="noStdlib" value="true" />
-          <option name="noReflect" value="true" />
-          <option name="moduleName" value="training_main" />
-          <option name="addCompilerBuiltIns" value="true" />
-          <option name="languageVersion" value="1.1" />
-          <option name="apiVersion" value="1.1" />
-          <option name="pluginOptions">
-            <array />
-          </option>
-          <option name="pluginClasspaths">
-            <array />
-          </option>
-        </compilerArguments>
-      </configuration>
-    </facet>
-  </component>
-  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
-    <output-test url="file://$MODULE_DIR$/../../out/test/classes" />
-    <exclude-output />
-    <content url="file://$MODULE_DIR$/../../src/test" />
-    <content url="file://$MODULE_DIR$/../../tests" />
-    <content url="file://$MODULE_DIR$/../../testsData" />
-    <orderEntry type="inheritedJdk" />
-    <orderEntry type="sourceFolder" forTests="false" />
-    <orderEntry type="module" module-name="training_main" />
-    <orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-jre8:1.1.4-3" level="project" />
-    <orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-reflect:1.1.4-3" level="project" />
-    <orderEntry type="module-library" scope="RUNTIME">
-      <library>
-        <JAVADOC />
-        <SOURCES />
-      </library>
-    </orderEntry>
-    <orderEntry type="module-library">
-      <library name="Gradle: com.jetbrains:ideaIU:182.3458.5">
-        <CLASSES>
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/aether-api-1.1.0.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/aether-connector-basic-1.1.0.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/aether-dependency-resolver.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/aether-impl-1.1.0.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/aether-spi-1.1.0.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/aether-transport-file-1.1.0.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/aether-transport-http-1.1.0.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/aether-util-1.1.0.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/annotations.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/asm-5.0.3.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/asm-all.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/asm-analysis-5.0.3.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/asm-tree-5.0.3.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/automaton-1.12-1.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/baksmali-2.2.1.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/batik-all-1.10.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/bcprov-jdk15on-1.59.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/bootstrap.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/cglib-nodep-3.2.4.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/cli-parser-1.1.2.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/cloud-config-client.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/common-image-3.3.2.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/common-io-3.3.2.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/common-lang-3.3.2.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/commons-codec-1.10.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/commons-collections-3.2.1.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/commons-compress-1.16.1.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/commons-httpclient-3.1-patched.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/commons-imaging-1.0-RC-1.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/commons-io-2.6.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/commons-lang-2.4.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/commons-lang3-3.4.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/commons-logging-1.2.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/commons-net-3.6.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/constraint-layout.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/delight-rhino-sandbox-0.0.6.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/dexlib2-2.2.1.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/ecj-4.7.2.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/eddsa-0.2.0.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/extensions.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/external-system-rt.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/fest-assert-1.5.0-SNAPSHOT.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/fest-reflect-2.0-SNAPSHOT.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/fest-swing-1.4.6.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/fest-util-1.3.0-SNAPSHOT.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/fluent-hc-4.5.5.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/forms-1.1-preview.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/forms_rt.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/fst-2.57.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/groovy-all-2.4.15.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/gson-2.8.4.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/guava-23.6-jre.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/hamcrest-core-1.3.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/httpclient-4.5.5.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/httpcore-4.4.9.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/httpmime-4.5.5.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/icons.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/idea-jsp-openapi.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/idea.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/ideax.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/idea_rt.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/imageio-core-3.3.2.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/imageio-metadata-3.3.2.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/imageio-tiff-3.3.2.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/imgscalr-lib-4.2.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/ini4j-0.5.5-2.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/intellij-coverage-agent-1.0.470.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/intellij-test-discovery-agent-1.0.470.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/isorelax-20030108.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jackson-annotations-2.9.0.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jackson-core-2.9.5.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jackson-databind-2.9.5.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jasper21_rt.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jasper2_rt.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/java-api.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/java-impl.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/javac2.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/javahelp-2.0.02.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/javassist-3.22.0-GA.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/javax.inject-1.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/java_resources_en.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jaxen-1.1.6.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jayatana-1.2.4.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jbcrypt-1.0.0.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jcip-annotations-1.0.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jdkAnnotations.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jdom.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jediterm-pty-2.9.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jetCheck.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jettison-1.4.0.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jgoodies-common-1.4.0.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jing.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jna-platform.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jna.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jps-builders-6.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jps-builders.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jps-launcher.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jps-model.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jsch-0.1.54.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jsch.agentproxy.connector-factory.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jsch.agentproxy.core.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jsch.agentproxy.jsch.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jsch.agentproxy.pageant.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jsch.agentproxy.sshagent.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jsch.agentproxy.usocket-jna.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jsch.agentproxy.usocket-nc.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jshell-frontend.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jshell-protocol.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jsp-api.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jsr305.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/junit-4.12.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/junit.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/jzlib-1.1.3.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/kotlin-test.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/kotlinx-coroutines-core-0.22.5.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/kotlinx-coroutines-jdk8-0.22.5.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/log4j-1.2.17.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/log4j.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/lz4-1.3.0.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/markdown4j-2.2-cj-1.1.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/markdownj-core-0.4.2-SNAPSHOT.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/maven-aether-provider-3.3.9.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/maven-artifact-3.3.9.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/maven-builder-support-3.3.9.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/maven-model-3.3.9.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/maven-model-builder-3.3.9.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/maven-repository-metadata-3.3.9.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/microba.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/miglayout-core-5.1.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/miglayout-swing-5.1.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/MultithreadedTC-1.01.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/nanoxml-2.2.3.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/nekohtml-1.9.22.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/netty-buffer-4.1.25.Final.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/netty-codec-4.1.25.Final.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/netty-codec-http-4.1.25.Final.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/netty-common-4.1.25.Final.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/netty-handler-4.1.25.Final.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/netty-resolver-4.1.25.Final.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/netty-transport-4.1.25.Final.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/objenesis-2.6.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/openapi.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/optimizedFileManager.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/oro-2.0.8.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/picocontainer-1.2.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/platform-api.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/platform-impl.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/plexus-component-annotations-1.6.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/plexus-interpolation-1.21.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/plexus-utils-3.0.22.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/protobuf-java-3.4.0.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/proxy-vole-1.0.4.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/pty4j-0.7.5.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/purejavacomm.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/resources.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/resources_en.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/rhino-1.7.10.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/rngom-20051226-patched.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/serviceMessages.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/servlet-api.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/slf4j-api-1.7.25.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/slf4j-log4j12-1.7.25.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/snakeyaml-1.21.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/sqlite-jdbc-3.21.0.1.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/stax-api-1.0.1.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/streamex-0.6.5.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/swingx-core-1.6.2-2.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/trang-core.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/trilead-ssh2-build-217-jenkins-11.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/trove4j.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/util-2.2.1.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/util.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/velocity-1.7.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/wadl-core.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/winp-1.26.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/xercesImpl-2.11.0.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/xml-apis-ext-1.3.04.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/xml-resolver-1.2.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/xmlbeans-2.6.0.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/xmlgraphics-commons-2.2.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/xmlpull-1.1.3.1.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/xmlrpc-2.0.1.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/xpp3_min-1.1.4c.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/xstream-1.4.10.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/xz-1.8.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIU/182.3458.5/6cb5a148ead623686894fdcda42690d0dc2d58da/ideaIU-182.3458.5/lib/yjp-controller-api-redist.jar!/" />
-        </CLASSES>
-        <JAVADOC />
-        <SOURCES>
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIC/182.3458.5/3d83bd9e0cdd139fdedc8c7e9dff4b8dfcfb5903/ideaIC-182.3458.5-sources.jar!/" />
-        </SOURCES>
-      </library>
-    </orderEntry>
-    <orderEntry type="library" name="Gradle: org.jetbrains:annotations:13.0" level="project" />
-    <orderEntry type="library" name="Gradle: org.hamcrest:hamcrest-core:1.3" level="project" />
-    <orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-jre7:1.1.4-3" level="project" />
-    <orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib:1.1.4-3" level="project" />
-    <orderEntry type="library" name="Gradle: junit:junit:4.12" level="project" />
-    <orderEntry type="module-library">
-      <library name="Gradle: org.jetbrains.plugins:org.jetbrains.plugins.go:182.3458.6.790">
-        <CLASSES>
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/plugins.jetbrains.com/org.jetbrains.plugins.go-182.3458.6.790/intellij-go/lib/go-template-182.3458.6.790.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/plugins.jetbrains.com/org.jetbrains.plugins.go-182.3458.6.790/intellij-go/lib/go-utils-182.3458.6.790.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/plugins.jetbrains.com/org.jetbrains.plugins.go-182.3458.6.790/intellij-go/lib/intellij-go-182.3458.6.790.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/plugins.jetbrains.com/org.jetbrains.plugins.go-182.3458.6.790/intellij-go/lib/plan9-182.3458.6.790.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/plugins.jetbrains.com/org.jetbrains.plugins.go-182.3458.6.790/intellij-go/lib/toml4j-0.7.2.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/plugins.jetbrains.com/org.jetbrains.plugins.go-182.3458.6.790/intellij-go/lib/vgo-182.3458.6.790.jar!/" />
-        </CLASSES>
-        <JAVADOC />
-        <SOURCES />
-      </library>
-    </orderEntry>
-    <orderEntry type="module-library">
-      <library name="Gradle: org.jetbrains.plugins:Pythonid:2018.2.182.3341.29">
-        <CLASSES>
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/plugins.jetbrains.com/Pythonid-2018.2.182.3341.29/python/lib/commons-io-2.3.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/plugins.jetbrains.com/Pythonid-2018.2.182.3341.29/python/lib/commons-lang-2.6.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/plugins.jetbrains.com/Pythonid-2018.2.182.3341.29/python/lib/java_websocket.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/plugins.jetbrains.com/Pythonid-2018.2.182.3341.29/python/lib/jsoup-1.10.3.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/plugins.jetbrains.com/Pythonid-2018.2.182.3341.29/python/lib/libthrift-0.11.0.jar!/" />
-          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/plugins.jetbrains.com/Pythonid-2018.2.182.3341.29/python/lib/python.jar!/" />
-        </CLASSES>
-        <JAVADOC />
-        <SOURCES />
-      </library>
-    </orderEntry>
-  </component>
-  <component name="TestModuleProperties" production-module="training_main" />
-</module>
\ No newline at end of file
diff --git a/ide-features-trainer/.idea/uiDesigner.xml b/ide-features-trainer/.idea/uiDesigner.xml
deleted file mode 100644 (file)
index e96534f..0000000
+++ /dev/null
@@ -1,124 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="Palette2">
-    <group name="Swing">
-      <item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
-        <default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
-      </item>
-      <item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
-        <default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
-      </item>
-      <item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.png" removable="false" auto-create-binding="false" can-attach-label="false">
-        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
-      </item>
-      <item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.png" removable="false" auto-create-binding="false" can-attach-label="true">
-        <default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
-      </item>
-      <item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.png" removable="false" auto-create-binding="true" can-attach-label="false">
-        <default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
-        <initial-values>
-          <property name="text" value="Button" />
-        </initial-values>
-      </item>
-      <item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.png" removable="false" auto-create-binding="true" can-attach-label="false">
-        <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
-        <initial-values>
-          <property name="text" value="RadioButton" />
-        </initial-values>
-      </item>
-      <item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.png" removable="false" auto-create-binding="true" can-attach-label="false">
-        <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
-        <initial-values>
-          <property name="text" value="CheckBox" />
-        </initial-values>
-      </item>
-      <item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.png" removable="false" auto-create-binding="false" can-attach-label="false">
-        <default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
-        <initial-values>
-          <property name="text" value="Label" />
-        </initial-values>
-      </item>
-      <item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.png" removable="false" auto-create-binding="true" can-attach-label="true">
-        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
-          <preferred-size width="150" height="-1" />
-        </default-constraints>
-      </item>
-      <item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.png" removable="false" auto-create-binding="true" can-attach-label="true">
-        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
-          <preferred-size width="150" height="-1" />
-        </default-constraints>
-      </item>
-      <item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.png" removable="false" auto-create-binding="true" can-attach-label="true">
-        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
-          <preferred-size width="150" height="-1" />
-        </default-constraints>
-      </item>
-      <item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.png" removable="false" auto-create-binding="true" can-attach-label="true">
-        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
-          <preferred-size width="150" height="50" />
-        </default-constraints>
-      </item>
-      <item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
-        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
-          <preferred-size width="150" height="50" />
-        </default-constraints>
-      </item>
-      <item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
-        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
-          <preferred-size width="150" height="50" />
-        </default-constraints>
-      </item>
-      <item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.png" removable="false" auto-create-binding="true" can-attach-label="true">
-        <default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
-      </item>
-      <item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.png" removable="false" auto-create-binding="true" can-attach-label="false">
-        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
-          <preferred-size width="150" height="50" />
-        </default-constraints>
-      </item>
-      <item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.png" removable="false" auto-create-binding="true" can-attach-label="false">
-        <default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
-          <preferred-size width="150" height="50" />
-        </default-constraints>
-      </item>
-      <item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.png" removable="false" auto-create-binding="true" can-attach-label="false">
-        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
-          <preferred-size width="150" height="50" />
-        </default-constraints>
-      </item>
-      <item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.png" removable="false" auto-create-binding="true" can-attach-label="false">
-        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
-          <preferred-size width="200" height="200" />
-        </default-constraints>
-      </item>
-      <item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.png" removable="false" auto-create-binding="false" can-attach-label="false">
-        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
-          <preferred-size width="200" height="200" />
-        </default-constraints>
-      </item>
-      <item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.png" removable="false" auto-create-binding="true" can-attach-label="true">
-        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
-      </item>
-      <item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.png" removable="false" auto-create-binding="true" can-attach-label="false">
-        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
-      </item>
-      <item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.png" removable="false" auto-create-binding="false" can-attach-label="false">
-        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
-      </item>
-      <item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
-        <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
-      </item>
-      <item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.png" removable="false" auto-create-binding="false" can-attach-label="false">
-        <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
-          <preferred-size width="-1" height="20" />
-        </default-constraints>
-      </item>
-      <item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.png" removable="false" auto-create-binding="false" can-attach-label="false">
-        <default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
-      </item>
-      <item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
-        <default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
-      </item>
-    </group>
-  </component>
-</project>
\ No newline at end of file
index fa348f9409a4230baa8e3ec70f3c48b85ac29689..97d6fc135f51563a48ee9edac00ef60d954607ff 100644 (file)
@@ -1,49 +1,30 @@
-buildscript {
-    ext.kotlin_version = '1.1.4-3'
-    repositories {
-        mavenLocal()
-        mavenCentral()
-        maven { url "http://repository.jetbrains.com/repo/"}
-    }
-    dependencies {
-        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlin_version}"
-    }
-}
-
-
 plugins {
-    id "org.jetbrains.intellij" version "0.3.4"
+    id "org.jetbrains.intellij" version "0.3.11"
+    id 'org.jetbrains.kotlin.jvm' version '1.2.61'
 }
 
 repositories {
     mavenLocal()
     mavenCentral()
     jcenter()
-    maven { url "http://repository.jetbrains.com/repo/"}
 }
 
 dependencies {
     testCompile group: 'junit', name: 'junit', version: '4.12'
-    compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version"
-    compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
+    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
+    compile "org.jetbrains.kotlin:kotlin-reflect"
 }
 
 group 'org.sk'
 version "$version.$buildNumber"
 
-apply plugin: 'java'
-apply plugin: "kotlin"
-
 sourceCompatibility = 1.8
+targetCompatibility = 1.8
 
 intellij {
-    version 'IU-182.3458.5'
+    version 'IU-182.5107.41'
     //to check compatibility for Python and Go
-    plugins = ['Pythonid:2018.2.182.3341.29', 'org.jetbrains.plugins.go:182.3458.6.790']
-//    publish {
-//        username repoUser
-//        password repoPassword
-//    }
+    plugins = ['Pythonid:2018.2.182.5107.16', 'org.jetbrains.plugins.go:182.4505.32.913']
     intellij.updateSinceUntilBuild = false
 }
 
@@ -58,7 +39,8 @@ sourceSets {
         java.srcDir 'testsData'
     }
 }
-
-task printVersion << {
-    println version
-}
\ No newline at end of file
+kotlin {
+    experimental {
+        coroutines "enable"
+    }
+}
diff --git a/ide-features-trainer/gradle.properties b/ide-features-trainer/gradle.properties
new file mode 100644 (file)
index 0000000..0d93f48
--- /dev/null
@@ -0,0 +1,2 @@
+version=0.8
+buildNumber=75
\ No newline at end of file
index 318e99e607dd3be5c059601493963565938acecd..c013b0ea264b6000bb1b2897b44013b80169f6cf 100755 (executable)
@@ -29,7 +29,7 @@ class DeclarationDemo {
     }
 }]]></CopyText>
     <MoveCaret position="8:16"/>
-    <Try triggers="com.intellij.codeInsight.navigation.actions.GotoDeclarationAction">Use <action>GotoDeclaration</action> to jump to the declaration of a class or interface.</Try>
+    <Try triggers="GotoDeclaration">Use <action>GotoDeclaration</action> to jump to the declaration of a class or interface.</Try>
     <MoveCaret position="26:17"/>
     <Try triggers="GotoImplementation">To see implementations of a class/interface, use <action>GotoImplementation</action>.</Try>
     <Win/>
index 2ccef869cdc79cd5170c7c9fac310633be182202..a5f602eaa716043cad28b829162f9f38683497e3 100644 (file)
@@ -24,13 +24,17 @@ import training.lang.LangManager
 import training.lang.LangSupport
 import training.learn.CourseManager
 import training.learn.LearnBundle
-import training.learn.Module
 import training.learn.NewLearnProjectUtil
 import training.learn.dialogs.AskToSwitchToLearnProjectBackDialog
 import training.learn.dialogs.SdkModuleProblemDialog
 import training.learn.exceptons.*
-import training.learn.lesson.Lesson
+import training.learn.interfaces.Lesson
+import training.learn.interfaces.ModuleType
+import training.learn.lesson.LessonManager
 import training.learn.lesson.LessonProcessor
+import training.learn.lesson.XmlLesson
+import training.learn.lesson.kimpl.KLesson
+import training.learn.lesson.kimpl.LessonContext
 import training.learn.lesson.listeners.NextLessonListener
 import training.learn.lesson.listeners.StatisticLessonListener
 import training.ui.LearnToolWindowFactory
@@ -39,6 +43,7 @@ import training.util.findLanguageByID
 import java.awt.FontFormatException
 import java.io.IOException
 import java.util.concurrent.ExecutionException
+import kotlin.concurrent.thread
 
 /**
  * @author Sergey Karashevich
@@ -85,7 +90,7 @@ class OpenLessonAction : AnAction() {
       LOG.debug("${projectWhereToStartLesson.name}: trying to find LearnProject in opened projects ${learnProject != null}")
       if (learnProject != null) CourseManager.instance.learnProject = learnProject
 
-      if (lesson.module == null || lesson.module!!.moduleType == Module.ModuleType.SCRATCH) {
+      if (lesson.module == null || lesson.module.moduleType == ModuleType.SCRATCH) {
         LOG.debug("${projectWhereToStartLesson.name}: scratch based lesson")
         CourseManager.instance.checkEnvironment(projectWhereToStartLesson)
         vf = getScratchFile(projectWhereToStartLesson, lesson, scratchFileName)
@@ -129,7 +134,7 @@ class OpenLessonAction : AnAction() {
       }
 
       LOG.debug("${projectWhereToStartLesson.name}: VirtualFile for lesson has been created/found")
-      val currentProject = if (lesson.module != null && lesson.module!!.moduleType != Module.ModuleType.SCRATCH) CourseManager.instance.learnProject!! else projectWhereToStartLesson
+      val currentProject = if (lesson.module != null && lesson.module.moduleType != ModuleType.SCRATCH) CourseManager.instance.learnProject!! else projectWhereToStartLesson
       if (vf == null) return  //if user aborts opening lesson in LearnProject or Virtual File couldn't be computed
 
       LOG.debug("${projectWhereToStartLesson.name}: Add listeners to lesson")
@@ -139,7 +144,7 @@ class OpenLessonAction : AnAction() {
       //open next lesson if current is passed
       LOG.debug("${projectWhereToStartLesson.name}: Set lesson view")
       UiManager.setLessonView()
-      LOG.debug("${projectWhereToStartLesson.name}: Lesson onStart()")
+      LOG.debug("${projectWhereToStartLesson.name}: XmlLesson onStart()")
       lesson.onStart()
 
       //to start any lesson we need to do 4 steps:
@@ -176,7 +181,15 @@ class OpenLessonAction : AnAction() {
 
       //4. Process lesson
       LOG.debug("${projectWhereToStartLesson.name}: 4. Process lesson")
-      LessonProcessor.process(projectWhereToStartLesson, lesson, textEditor.editor)
+      when (lesson) {
+        is XmlLesson -> LessonProcessor.process(projectWhereToStartLesson, lesson, textEditor.editor)
+        is KLesson -> {
+          LessonManager.getInstance(lesson).initLesson(textEditor.editor)
+          thread(name = "IdeFeaturesTrainer") {
+            lesson.lessonContent(LessonContext(lesson, textEditor!!.editor, project))
+          }
+        }
+      }
 
     } catch (noSdkException: NoSdkException) {
       Messages.showMessageDialog(projectWhereToStartLesson, LearnBundle.message("dialog.noSdk.message", LangManager.getInstance().getLanguageDisplayName()), LearnBundle.message("dialog.noSdk.title"), Messages.getErrorIcon())
@@ -307,7 +320,7 @@ class OpenLessonAction : AnAction() {
         val languageByID = findLanguageByID(myLanguage)
         val extensionFile = languageByID!!.associatedFileType!!.defaultExtension
 
-        var fileName = "Test." + extensionFile
+        var fileName = "Test.$extensionFile"
         if (lesson.module != null) {
           fileName = lesson.module!!.sanitizedName + "." + extensionFile
         }
@@ -333,7 +346,7 @@ class OpenLessonAction : AnAction() {
 
         }
 
-        if (lesson.module != null) CourseManager.instance.registerVirtualFile(lesson.module!!, lessonVirtualFile!!)
+        CourseManager.instance.registerVirtualFile(lesson.module, lessonVirtualFile!!)
         return lessonVirtualFile!!
       }
     }
index a343a90899c922c16f8220f2f252a4f9928004bd..6ae9c5ef3f1a415097776ff55170eceeda1c5ad1 100644 (file)
@@ -4,7 +4,7 @@ import com.intellij.openapi.editor.Editor
 import com.intellij.openapi.fileEditor.FileEditorManager
 import com.intellij.openapi.project.Project
 import org.jdom.Element
-import training.learn.lesson.Lesson
+import training.learn.interfaces.Lesson
 import java.util.*
 
 /**
index ca9f108a8ff4e7d897dc64008236a1d2536f28ee..83efb28990f41ea6692b362a9a07d8847a1d7174 100644 (file)
@@ -1,10 +1,13 @@
 package training.commands
 
+import com.intellij.openapi.application.ApplicationManager
 import training.check.Check
 import training.keymap.KeymapUtil
 import training.learn.ActionsRecorder
 import training.learn.lesson.LessonManager
 import training.ui.Message
+import java.util.concurrent.CompletableFuture
+import kotlin.concurrent.thread
 
 /**
  * Created by karashevich on 30/01/15.
@@ -21,7 +24,10 @@ class TryCommand : Command(Command.CommandType.TRY) {
     val lesson = executionList.lesson
     val editor = executionList.editor
 
-    LessonManager.getInstance(lesson)?.addMessages(Message.convert(element))
+    var checkFuture: CompletableFuture<Boolean>? = null
+    var triggerFuture: CompletableFuture<Boolean>? = null
+
+    LessonManager.getInstance(lesson).addMessages(Message.convert(element))
 
     val recorder = ActionsRecorder(editor.project!!, editor.document)
     LessonManager.getInstance(lesson).registerActionsRecorder(recorder)
@@ -33,55 +39,31 @@ class TryCommand : Command(Command.CommandType.TRY) {
         check = myCheck.newInstance() as Check
         check.set(executionList.project, editor)
         check.before()
-      }
-      catch (e: Exception) {
+        checkFuture = recorder.futureCheck { check.check() }
+      catch (e: Exception) {
         e.printStackTrace()
       }
 
     }
-    if (element.getAttribute("trigger") != null) {
-      val actionId = element.getAttribute("trigger")!!.value
-      startRecord(executionList, recorder, actionId, check)
-    }
-    else if (element.getAttribute("triggers") != null) {
-      val actionIds = element.getAttribute("triggers")!!.value
-      val actionIdArray = actionIds.split(";".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
-      startRecord(executionList, recorder, actionIdArray, check)
+    when {
+      element.getAttribute("trigger") != null -> {
+        val actionId = element.getAttribute("trigger")!!.value
+        triggerFuture = recorder.futureAction(actionId)
+      }
+      element.getAttribute("triggers") != null -> {
+        val actionIds = element.getAttribute("triggers")!!.value
+        val listOfActionIds = actionIds.split(";".toRegex()).dropLastWhile { it.isEmpty() }
+        triggerFuture = recorder.futureListActions(listOfActionIds)
+      }
     }
-    else {
-      startRecord(executionList, recorder, check)
+    thread(name = "IdeFeaturesTrainer Result") {
+      checkFuture?.get()
+      triggerFuture?.get()
+      LessonManager.getInstance(lesson).passExercise()
+      ApplicationManager.getApplication().invokeLater { startNextCommand(executionList) }
     }
-
-  }
-
-  @Throws(Exception::class)
-  private fun startRecord(executionList: ExecutionList, recorder: ActionsRecorder, check: Check?) {
-    recorder.startRecording(getDoWhenDone(executionList), null as Array<String>?, check)
-  }
-
-  @Throws(Exception::class)
-  private fun startRecord(executionList: ExecutionList, recorder: ActionsRecorder, actionId: String, check: Check?) {
-    recorder.startRecording(getDoWhenDone(executionList), actionId, check)
-  }
-
-  @Throws(Exception::class)
-  private fun startRecord(executionList: ExecutionList, recorder: ActionsRecorder, actionIdArray: Array<String>, check: Check?) {
-    recorder.startRecording(getDoWhenDone(executionList), actionIdArray, check)
-
   }
 
-  private fun getDoWhenDone(executionList: ExecutionList): Runnable
-    = Runnable { pass(executionList) }
-
-  private fun pass(executionList: ExecutionList) {
-    val lesson = executionList.lesson
-    LessonManager.getInstance(lesson).passExercise()
-    val lessonLog = lesson.lessonLog
-    lesson.passItem()
-    startNextCommand(executionList)
-  }
-
-
   private fun resolveShortcut(text: String, actionId: String): String {
     val shortcutByActionId = KeymapUtil.getShortcutByActionId(actionId)
     val shortcutText = KeymapUtil.getKeyStrokeText(shortcutByActionId)
@@ -91,11 +73,10 @@ class TryCommand : Command(Command.CommandType.TRY) {
   companion object {
 
     fun substitution(text: String, shortcutString: String): String {
-      if (text.contains(ActionCommand.SHORTCUT)) {
-        return text.replace(ActionCommand.SHORTCUT, shortcutString)
-      }
-      else {
-        return text
+      return if (text.contains(ActionCommand.SHORTCUT)) {
+        text.replace(ActionCommand.SHORTCUT, shortcutString)
+      } else {
+        text
       }
     }
   }
diff --git a/ide-features-trainer/src/training/commands/kotlin/Commands.kt b/ide-features-trainer/src/training/commands/kotlin/Commands.kt
new file mode 100644 (file)
index 0000000..c1dc123
--- /dev/null
@@ -0,0 +1,109 @@
+package training.commands.kotlin
+
+import com.intellij.find.FindManager
+import com.intellij.find.FindResult
+import com.intellij.openapi.application.ApplicationManager
+import com.intellij.openapi.application.ModalityState
+import com.intellij.openapi.command.CommandProcessor
+import com.intellij.openapi.command.undo.BasicUndoableAction
+import com.intellij.openapi.command.undo.DocumentReferenceManager
+import com.intellij.openapi.command.undo.UndoManager
+import com.intellij.openapi.editor.Editor
+import com.intellij.openapi.editor.LogicalPosition
+import com.intellij.openapi.editor.ex.EditorGutterComponentEx
+import com.intellij.openapi.project.Project
+import com.intellij.psi.PsiDocumentManager
+import com.intellij.util.DocumentUtil
+import org.jdom.input.SAXBuilder
+import training.learn.ActionsRecorder
+import training.learn.lesson.LessonManager
+import training.ui.Message
+
+/**
+ * Write a text to the learn panel (panel with a learning tasks).
+ */
+fun TaskContext.text(text: String) {
+  val wrappedText = "<root><text>$text</text></root>"
+  val textAsElement = SAXBuilder().build(wrappedText.byteInputStream()).rootElement.getChild("text")
+  LessonManager.getInstance(this.lesson).addMessages(Message.convert(textAsElement)) //support old format
+}
+
+fun TaskContext.copyCode(code: String) {
+  ApplicationManager.getApplication().invokeAndWait {
+    val document = editor.document
+    DocumentUtil.writeInRunUndoTransparentAction {
+      val documentReference = DocumentReferenceManager.getInstance().create(document)
+      UndoManager.getInstance(project).nonundoableActionPerformed(documentReference, false)
+      document.insertString(0, code)
+    }
+    PsiDocumentManager.getInstance(project).commitDocument(document)
+    doUndoableAction(project)
+    updateGutter(editor)
+  }
+}
+
+fun TaskContext.caret(offset: Int) {
+  runInEdt { editor.caretModel.moveToOffset(offset) }
+}
+
+fun TaskContext.caret(line: Int, column: Int) {
+  runInEdt { editor.caretModel.moveToLogicalPosition(LogicalPosition(line - 1, column - 1)) }
+}
+
+fun TaskContext.caret(text: String) {
+  runInEdt {
+    val start = getStartOffsetForText(text, editor, project)
+    editor.caretModel.moveToOffset(start.startOffset)
+  }
+}
+
+fun TaskContext.trigger(actionId: String) {
+  val recorder = ActionsRecorder(project, editor.document)
+  LessonManager.getInstance(lesson).registerActionsRecorder(recorder)
+  this.triggerFutures.add(recorder.futureAction(actionId))
+}
+
+fun TaskContext.triggers(vararg actionIds: String) {
+  val recorder = ActionsRecorder(project, editor.document)
+  LessonManager.getInstance(lesson).registerActionsRecorder(recorder)
+  this.triggerFutures.add(recorder.futureListActions(actionIds.toList()))
+}
+
+
+private fun getStartOffsetForText(text: String, editor: Editor, project: Project): FindResult {
+  val document = editor.document
+
+  val findManager = FindManager.getInstance(project)
+  val model = findManager.findInFileModel.clone()
+  model.isGlobal = false
+  model.isReplaceState = false
+  model.stringToFind = text
+  return FindManager.getInstance(project).findString(document.charsSequence, 0, model)
+}
+
+private fun doUndoableAction(project: Project) {
+  CommandProcessor.getInstance().executeCommand(project, {
+    UndoManager.getInstance(project).undoableActionPerformed(object : BasicUndoableAction() {
+      override fun undo() {}
+      override fun redo() {}
+    })
+  }, null, null)
+}
+
+private fun updateGutter(editor: Editor) {
+  val editorGutterComponentEx = editor.gutter as EditorGutterComponentEx
+  editorGutterComponentEx.revalidateMarkup()
+}
+
+inline fun runInEdt(crossinline runnable: () -> Unit) {
+  val app = ApplicationManager.getApplication()
+  if (app.isDispatchThread) {
+    runnable()
+  } else {
+    app.invokeLater({ runnable() }, ModalityState.defaultModalityState())
+  }
+}
+
+fun action(id: String): String {
+  return "<action>$id</action>"
+}
diff --git a/ide-features-trainer/src/training/commands/kotlin/TaskContext.kt b/ide-features-trainer/src/training/commands/kotlin/TaskContext.kt
new file mode 100644 (file)
index 0000000..f95f764
--- /dev/null
@@ -0,0 +1,25 @@
+package training.commands.kotlin
+
+import com.intellij.openapi.editor.Editor
+import com.intellij.openapi.project.Project
+import training.learn.lesson.LessonManager
+import training.learn.lesson.kimpl.KLesson
+import training.learn.lesson.kimpl.LessonContext
+import java.util.concurrent.CompletableFuture
+import kotlin.test.assertTrue
+
+class TaskContext(val taskName: String?, val lesson: KLesson, val editor: Editor, val project: Project) {
+  val checkFutures: MutableList<CompletableFuture<Boolean>> = mutableListOf()
+  val triggerFutures: MutableList<CompletableFuture<Boolean>> = mutableListOf()
+}
+
+/**
+ * Start a new task in a lesson context. Task may have an optional name.
+ */
+fun LessonContext.task(taskName: String? = null, taskContent: TaskContext.() -> Unit) {
+  val taskContext = TaskContext(taskName, this.first, this.second, this.third)
+  taskContext.apply(taskContent)
+  taskContext.checkFutures.forEach { assertTrue(it.get()) }
+  taskContext.triggerFutures.forEach { assertTrue(it.get()) }
+  LessonManager.getInstance(this.first).passExercise()
+}
\ No newline at end of file
index eeea558f915acf713c853086b3082cc09f56b133..e26da26dff5f2d0a194c0f561b3763fa963a7263 100644 (file)
@@ -11,35 +11,26 @@ import com.intellij.openapi.application.ApplicationManager
 import com.intellij.openapi.editor.Document
 import com.intellij.openapi.editor.event.DocumentEvent
 import com.intellij.openapi.editor.event.DocumentListener
-import com.intellij.openapi.fileEditor.FileEditorManagerEvent
-import com.intellij.openapi.fileEditor.FileEditorManagerListener
 import com.intellij.openapi.project.Project
 import com.intellij.openapi.util.Disposer
-import com.intellij.openapi.util.text.StringUtil
 import com.intellij.psi.PsiDocumentManager
 import com.intellij.util.messages.MessageBusConnection
-import training.check.Check
 import java.awt.event.KeyEvent
-import java.util.*
+import java.util.concurrent.CompletableFuture
 
 /**
  * Created by karashevich on 18/12/14.
  */
 class ActionsRecorder(private val project: Project,
                       private val document: Document) : Disposable {
-  private var triggerActivated: Boolean = false
-  private var triggerQueue: Queue<String>? = null
 
-  private var myDocumentListener: DocumentListener? = null
-  private var myAnActionListener: AnActionListener? = null
+  private val documentListeners: MutableList<DocumentListener> = mutableListOf()
+  private val actionListeners: MutableList<AnActionListener> = mutableListOf()
+  private val eventDispatchers: MutableList<IdeEventQueue.EventDispatcher> = mutableListOf()
 
   private var disposed = false
-  private var doWhenDone: Runnable? = null
-  private var check: Check? = null
 
   init {
-    this.doWhenDone = null
-
     Disposer.register(project, this)
   }
 
@@ -49,80 +40,84 @@ class ActionsRecorder(private val project: Project,
     Disposer.dispose(this)
   }
 
-  fun startRecording(doWhenDone: Runnable) {
-    if (disposed) return
-    this.doWhenDone = doWhenDone
-
-  }
-
-  fun startRecording(doWhenDone: Runnable, actionId: String?, check: Check?) {
-    val stringArray = arrayOf<String>(actionId!!)
-    startRecording(doWhenDone, stringArray, check)
+  fun futureAction(actionId: String): CompletableFuture<Boolean> {
+    val future: CompletableFuture<Boolean> = CompletableFuture()
+    val listener = createActionListener { caughtActionId, _ -> if (actionId == caughtActionId) future.complete(true) }
+    ActionManager.getInstance().addAnActionListener(listener, this)
+    return future
   }
 
-  fun startRecording(doWhenDone: Runnable, actionIdArray: Array<String>?, check: Check?) {
-    if (check != null) this.check = check
-    if (disposed) return
-    this.doWhenDone = doWhenDone
-
-    //        triggerMap = new HashMap<String, Boolean>(actionIdArray.length);
-    triggerQueue = LinkedList<String>()
-    //set triggerMap
-    if (actionIdArray != null) {
-      Collections.addAll(triggerQueue!!, *actionIdArray)
+  fun futureListActions(listOfActions: List<String>): CompletableFuture<Boolean> {
+    val future: CompletableFuture<Boolean> = CompletableFuture()
+    val mutableListOfActions = listOfActions.toMutableList()
+    val listener = createActionListener { caughtActionId, _ ->
+      if (mutableListOfActions.isNotEmpty() && mutableListOfActions.first() == caughtActionId) mutableListOfActions.removeAt(0)
+      if (mutableListOfActions.isEmpty()) future.complete(true)
     }
-    addActionAndDocumentListeners()
-  }
-
-  private fun isTaskSolved(current: Document): Boolean {
-    if (disposed) return false
-    return if (triggerQueue != null)
-      (triggerQueue!!.size == 1 || triggerQueue!!.size == 0) && (check == null || check!!.check())
-    else
-      triggerActivated && (check == null || check!!.check())
+    ActionManager.getInstance().addAnActionListener(listener, this)
+    return future
   }
 
-  private fun computeTrimmedLines(s: String): List<String> {
-    val ls = ArrayList<String>()
-
-    for (it in StringUtil.splitByLines(s)) {
-      val splitted = it.split("[ ]+".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
-      for (element in splitted)
-        if (element != "") {
-          ls.add(element)
-        }
+  fun futureCheck(checkFunction: () -> Boolean): CompletableFuture<Boolean> {
+    val future: CompletableFuture<Boolean> = CompletableFuture()
+    val listener = createDocumentListener {
+      if (!future.isDone && !future.isCancelled && checkFunction())
+        future.complete(true)
+    }
+    addKeyEventListener {
+      if (!future.isDone && !future.isCancelled && checkFunction()) {
+        future.complete(true)
+      }
     }
-    return ls
+    document.addDocumentListener(listener)
+    return future
   }
 
   private val myMessageBusConnection: MessageBusConnection
-    get() { return project.messageBus.connect() }
+    get() {
+      return project.messageBus.connect()
+    }
 
   /**
    * method adds action and document listeners to monitor user activity and check task
    */
   private fun addActionAndDocumentListeners() {
-    val actionManager = ActionManager.getInstance() ?: throw Exception("Unable to get instance for ActionManager")
-
-    myAnActionListener = object : AnActionListener {
-
-      private var projectAvailable: Boolean = false
-
-      override fun beforeActionPerformed(action: AnAction, dataContext: DataContext, event: AnActionEvent) {
-        projectAvailable = event.project != null
-      }
-
-      override fun afterActionPerformed(action: AnAction, dataContext: DataContext, event: AnActionEvent?) {
-        val actionId = ActionManager.getInstance().getId(action)
-        val actionClassName = action.javaClass.name
-        val resultId = actionId ?: actionClassName
-        doProcessAction(resultId, projectAvailable)
-      }
+//    myAnActionListener = createActionListener {
+//      actionId, _ -> doProcessAction(actionId, true)
+//    }
+//    myDocumentListener = createDocumentListener {
+//      doWhenTriggerIsEmptyAndTaskSolved(ActionManager.getInstance(), completableFuture)
+//    }
+//
+//    val myEventDispatcher = IdeEventQueue.EventDispatcher { e ->
+//      if (e is KeyEvent) {
+//        doWhenTriggerIsEmptyAndTaskSolved(ActionManager.getInstance(), completableFuture)
+//      }
+//      false
+//    }
+//
+//    myMessageBusConnection.subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, object : FileEditorManagerListener {
+//      override fun selectionChanged(event: FileEditorManagerEvent) {
+//        event.newFile?.name?.let { doProcessAction(it, true, completableFuture) }
+//      }
+//    })
+//
+//    if (check != null && check!!.listenAllKeys()) IdeEventQueue.getInstance().addDispatcher(myEventDispatcher, this)
+//    document.addDocumentListener(myDocumentListener!!)
+//    ActionManager.getInstance().addAnActionListener(myAnActionListener)
+  }
 
-      override fun beforeEditorTyping(c: Char, dataContext: DataContext) {}
+  private fun addKeyEventListener(onKeyEvent: () -> Unit) {
+    val myEventDispatcher: IdeEventQueue.EventDispatcher = IdeEventQueue.EventDispatcher { e ->
+      if (e is KeyEvent) onKeyEvent()
+      false
     }
-    myDocumentListener = object : DocumentListener {
+    eventDispatchers.add(myEventDispatcher)
+    IdeEventQueue.getInstance().addDispatcher(myEventDispatcher, this)
+  }
 
+  private fun createDocumentListener(onDocumentChange: () -> Unit): DocumentListener {
+    val documentListener = object : DocumentListener {
 
       override fun beforeDocumentChange(event: DocumentEvent) {}
 
@@ -131,91 +126,48 @@ class ActionsRecorder(private val project: Project,
           ApplicationManager.getApplication().invokeLater {
 
             if (!disposed && !project.isDisposed) {
-              PsiDocumentManager.getInstance(project).commitAndRunReadAction { doWhenTriggerIsEmptyAndTaskSolved(actionManager) }
+              PsiDocumentManager.getInstance(project).commitAndRunReadAction { onDocumentChange() }
             }
           }
         }
       }
     }
+    documentListeners.add(documentListener)
+    return documentListener
+  }
 
-    val myEventDispatcher = IdeEventQueue.EventDispatcher { e ->
-      if (e is KeyEvent) {
-        doWhenTriggerIsEmptyAndTaskSolved(actionManager)
-      }
-      false
-    }
-
-    myMessageBusConnection.subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, object : FileEditorManagerListener {
-      override fun selectionChanged(event: FileEditorManagerEvent) {
-        event.newFile?.name?.let { doProcessAction(it, true) }
-      }
-    })
-
+  private fun createActionListener(processAction: (actionId: String, project: Project) -> Unit): AnActionListener {
+    val actionListener = object : AnActionListener {
 
-    if (check != null && check!!.listenAllKeys()) IdeEventQueue.getInstance().addDispatcher(myEventDispatcher, this)
-    document.addDocumentListener(myDocumentListener!!)
-    actionManager.addAnActionListener(myAnActionListener)
-  }
-  /**
-   * @param action - caught action by AnActionListener (see [.addActionAndDocumentListeners] addActionAndDocumentListeners()} method.) or by the project
-   * message bus - see FileEditorManagerListener
-   * @param actionString - could be an actionId, action class name or the file name opened after some action
-   */
+      private var projectAvailable: Boolean = false
 
-  private fun doProcessAction(action: String, projectAvailable: Boolean){
-    //if action called not from project or current editor is different from editor
-    if (!projectAvailable) return
-
-    if (triggerQueue!!.size == 0) {
-      if (isTaskSolved(document)) {
-        //                        actionManager.removeAnActionListener(this);
-        removeListeners(document, ActionManager.getInstance())
-        if (doWhenDone != null) {
-          dispose()
-          doWhenDone!!.run()
-        }
-      }
-    }
-    if (equalStr(action, triggerQueue!!.peek())) {
-      if (triggerQueue!!.size > 1) {
-        triggerQueue!!.poll()
-      } else if (triggerQueue!!.size == 1) {
-        if (isTaskSolved(document)) {
-          //                            actionManager.removeAnActionListener(this);
-          removeListeners(document, ActionManager.getInstance())
-          if (doWhenDone != null) {
-            dispose()
-            doWhenDone!!.run()
-          }
-        } else {
-          triggerQueue!!.poll()
-        }
+      override fun beforeActionPerformed(action: AnAction, dataContext: DataContext, event: AnActionEvent) {
+        projectAvailable = event.project != null
       }
-    }
-  }
 
-  private fun doWhenTriggerIsEmptyAndTaskSolved(actionManager: ActionManager) {
-    if (triggerQueue!!.isEmpty()) {
-      if (isTaskSolved(document)) {
-        removeListeners(document, actionManager)
-        if (doWhenDone != null)
-          dispose()
-        assert(doWhenDone != null)
-        doWhenDone!!.run()
+      override fun afterActionPerformed(action: AnAction, dataContext: DataContext, event: AnActionEvent?) {
+        val actionId = ActionManager.getInstance().getId(action)
+        val actionClassName = action.javaClass.name
+        val resultId = actionId ?: actionClassName
+        processAction(resultId, project)
       }
+
+      override fun beforeEditorTyping(c: Char, dataContext: DataContext) {}
     }
+    actionListeners.add(actionListener)
+    return actionListener
   }
 
+
   private fun removeListeners(document: Document, actionManager: ActionManager) {
-    if (myAnActionListener != null) actionManager.removeAnActionListener(myAnActionListener)
-    if (myDocumentListener != null) document.removeDocumentListener(myDocumentListener!!)
+    if (actionListeners.isNotEmpty()) actionListeners.forEach { actionManager.removeAnActionListener(it) }
+    if (documentListeners.isNotEmpty()) documentListeners.forEach { document.removeDocumentListener(it) }
+    if (eventDispatchers.isNotEmpty()) eventDispatchers.forEach { IdeEventQueue.getInstance().removeDispatcher(it) }
     myMessageBusConnection.disconnect()
-    myAnActionListener = null
-    myDocumentListener = null
+    actionListeners.clear()
+    documentListeners.clear()
+    eventDispatchers.clear()
   }
 
-  private fun equalStr(str1: String?, str2: String?): Boolean {
-    return !(str1 == null || str2 == null) && str1.toUpperCase() == str2.toUpperCase()
-  }
 }
 
index 5f2d02d9d9b9194a2cc45c697b97fe9f0173178f..845891fd2fe8ebfe3d4627d0827a6b0846873a07 100644 (file)
@@ -18,7 +18,9 @@ import training.learn.exceptons.InvalidSdkException
 import training.learn.exceptons.NoJavaModuleException
 import training.learn.exceptons.NoSdkException
 import training.learn.exceptons.OldJdkException
-import training.learn.lesson.Lesson
+import training.learn.interfaces.Lesson
+import training.learn.interfaces.Module
+import training.lessons.java.EditorBasicsModule
 import training.util.GenModuleXml
 import java.util.*
 import kotlin.collections.HashMap
@@ -28,17 +30,18 @@ class CourseManager internal constructor() {
   var learnProject: Project? = null
   var learnProjectPath: String? = null
   var mapModuleVirtualFile = HashMap<Module, VirtualFile>()
-  var modules: MutableList<Module> = ArrayList<Module>()
-  val modulesId2modules: MutableMap<String, Module> = mutableMapOf()
+  var modules: MutableList<Module> = ArrayList()
   val currentProject: Project?
     get() {
       val lastFocusedFrame = IdeFocusManager.getGlobalInstance().lastFocusedFrame ?: return null
       return lastFocusedFrame.project
     }
 
+  private val modulesId2modules: MutableMap<String, Module> = mutableMapOf()
 
   init {
-    initModules()
+    initXmlModules()
+    initKotlinModules()
   }
 
   fun clearModules() {
@@ -46,20 +49,24 @@ class CourseManager internal constructor() {
     modules.clear()
   }
 
-  fun initModules() {
-    val modulesRoot = Module.getRootFromPath(GenModuleXml.MODULE_ALLMODULE_FILENAME)
+  fun initXmlModules() {
+    val modulesRoot = XmlModule.getRootFromPath(GenModuleXml.MODULE_ALLMODULE_FILENAME)
     for (element in modulesRoot.children) {
       if (element.name == GenModuleXml.MODULE_TYPE_ATTR) {
         val moduleFilename = element.getAttribute(GenModuleXml.MODULE_NAME_ATTR).value
-        val module = Module.initModule(moduleFilename) ?: throw Exception("Unable to init module (is null) from file: $moduleFilename")
+        val module = XmlModule.initModule(moduleFilename) ?: throw Exception("Unable to init module (is null) from file: $moduleFilename")
         modules.add(module)
       }
     }
     mergeModules()
   }
 
+  private fun initKotlinModules() {
+    modules.add(EditorBasicsModule())
+  }
+
   private fun mergeModules() {
-    // leave only uniques Module id
+    // leave only uniques XmlModule id
     modules.forEach { if (it.id != null && !modulesId2modules.keys.contains(it.id!!)) modulesId2modules.put(it.id!!, it) }
     modules.forEach {
       val mergedModule = modulesId2modules.get(it.id)
@@ -74,6 +81,8 @@ class CourseManager internal constructor() {
     return modules.firstOrNull { it.id?.toUpperCase() == id.toUpperCase() }
   }
 
+
+  //TODO: remove this method or convert XmlModule to a Module
   fun registerVirtualFile(module: Module, virtualFile: VirtualFile) {
     mapModuleVirtualFile.put(module, virtualFile)
   }
@@ -92,7 +101,7 @@ class CourseManager internal constructor() {
     }
   }
 
-  fun unregisterModule(module: Module) {
+  fun unregisterModule(module: XmlModule) {
     mapModuleVirtualFile.remove(module)
   }
 
@@ -177,7 +186,7 @@ class CourseManager internal constructor() {
     val size = modules.size
     if (size == 1) return null
 
-    for (i in 0..size - 1) {
+    for (i in 0 until size) {
       if (modules[i] == module) {
         if (i + 1 < size) nextModule = modules[i + 1]
         break
similarity index 80%
rename from ide-features-trainer/src/training/learn/Module.kt
rename to ide-features-trainer/src/training/learn/XmlModule.kt
index a59cc34644db75a1ac408a1fe3dc17cb6cfcaf42..d8fc112c88598fac878553e97b6057ee607fc448 100644 (file)
@@ -6,8 +6,11 @@ import training.lang.LangManager
 import training.lang.LangSupport
 import training.learn.exceptons.BadLessonException
 import training.learn.exceptons.BadModuleException
-import training.learn.lesson.Lesson
+import training.learn.interfaces.Lesson
+import training.learn.interfaces.Module
+import training.learn.interfaces.ModuleType
 import training.learn.lesson.Scenario
+import training.learn.lesson.XmlLesson
 import training.util.DataLoader
 import training.util.GenModuleXml
 import training.util.GenModuleXml.*
@@ -19,22 +22,21 @@ import java.util.function.Consumer
 /**
  * @author Sergey Karashevich
  */
-class Module(val name: String, moduleXmlPath: String, private val root: Element) {
+class XmlModule(override val name: String, moduleXmlPath: String, private val root: Element): Module {
 
-  val description: String?
-
-  enum class ModuleType {
-    SCRATCH, PROJECT
-  }
+  override val description: String?
 
   //used for lessons filtered by LangManger chosen lang
-  var lessons: MutableList<Lesson> = ArrayList<Lesson>()
+  override var lessons: MutableList<Lesson> = ArrayList<Lesson>()
+  override val sanitizedName: String
+    get() = name.replace("[^\\dA-Za-z ]".toRegex(), "").replace("\\s+".toRegex(), "")
+  override var id: String? = null
+  override lateinit var moduleType: ModuleType
+
   private val allLessons = ArrayList<Lesson>()
   private val moduleUpdateListeners = ArrayList<ModuleUpdateListener>()
 
   val answersPath: String?
-  var id: String?
-  var moduleType: ModuleType
   var sdkType: ModuleSdkType?
 
   enum class ModuleSdkType {
@@ -59,80 +61,71 @@ class Module(val name: String, moduleXmlPath: String, private val root: Element)
     initLessons(modulePath)
   }
 
-  private fun initLessons(modulePath: String) {
-
-    if (root.getAttribute(MODULE_LESSONS_PATH_ATTR) != null) {
-
-      //retrieve list of xml files inside lessonsPath directory
-      val lessonsPath = modulePath + root.getAttribute(MODULE_LESSONS_PATH_ATTR).value
-
-      for (lessonElement in root.children) {
-        if (lessonElement.name != MODULE_LESSON_ELEMENT)
-          throw BadModuleException("Module file is corrupted or cannot be read properly")
-
-        val lessonFilename = lessonElement.getAttributeValue(MODULE_LESSON_FILENAME_ATTR)
-        val lessonPath = lessonsPath + lessonFilename
-        try {
-          val scenario = Scenario(lessonPath)
-          val lesson = Lesson(scenario = scenario, lang = scenario.lang, module = this)
-          allLessons.add(lesson)
-        } catch (e: JDOMException) {
-          //Lesson file is corrupted
-          throw BadLessonException("Probably lesson file is corrupted: $lessonPath JDOMException:$e")
-        } catch (e: IOException) {
-          //Lesson file cannot be read
-          throw BadLessonException("Probably lesson file cannot be read: " + lessonPath)
-        }
-      }
-    }
-    lessons = filterLessonsByCurrentLang()
-  }
-
   fun setMySdkType(mySdkType: ModuleSdkType?) {
     this.sdkType = mySdkType
   }
 
-  fun addLesson(lesson: Lesson) {
-    if (lessons.any { it.id == lesson.id && it.hashCode() == lesson.hashCode()}) return // do not add lesson twice
-    lesson.module = this
-    lessons.add(lesson)
-  }
-
   private fun filterLessonsByCurrentLang(): MutableList<Lesson> {
     val langManager = LangManager.getInstance()
     if (langManager.isLangUndefined()) return allLessons
     return filterLessonByLang(langManager.getLangSupport())
   }
 
-  fun filterLessonByLang(langSupport: LangSupport): MutableList<Lesson> {
+  override fun filterLessonByLang(langSupport: LangSupport): MutableList<Lesson> {
     return allLessons.filter { langSupport.acceptLang(it.lang) }.toMutableList()
   }
 
-  fun giveNotPassedLesson(): Lesson? {
+  override fun giveNotPassedLesson(): Lesson? {
     return lessons.firstOrNull { !it.passed }
   }
 
-  fun giveNotPassedAndNotOpenedLesson(): Lesson? {
+  override fun giveNotPassedAndNotOpenedLesson(): Lesson? {
     return lessons.firstOrNull { !it.passed && !it.isOpen }
   }
 
-  fun hasNotPassedLesson(): Boolean {
+  override fun hasNotPassedLesson(): Boolean {
     return lessons.any { !it.passed }
   }
 
-  val sanitizedName: String
-    get() = name.replace("[^\\dA-Za-z ]".toRegex(), "").replace("\\s+".toRegex(), "")
-
-  fun update() {
+  override fun update() {
     lessons = filterLessonsByCurrentLang()
     moduleUpdateListeners.forEach(Consumer<ModuleUpdateListener> { it.onUpdate() })
   }
 
+  private fun initLessons(modulePath: String) {
+
+    if (root.getAttribute(MODULE_LESSONS_PATH_ATTR) != null) {
+
+      //retrieve list of xml files inside lessonsPath directory
+      val lessonsPath = modulePath + root.getAttribute(MODULE_LESSONS_PATH_ATTR).value
+
+      for (lessonElement in root.children) {
+        if (lessonElement.name != MODULE_LESSON_ELEMENT)
+          throw BadModuleException("XmlModule file is corrupted or cannot be read properly")
+
+        val lessonFilename = lessonElement.getAttributeValue(MODULE_LESSON_FILENAME_ATTR)
+        val lessonPath = lessonsPath + lessonFilename
+        try {
+          val scenario = Scenario(lessonPath)
+          val lesson = XmlLesson(scenario = scenario, lang = scenario.lang, module = this)
+          allLessons.add(lesson)
+        } catch (e: JDOMException) {
+          //XmlLesson file is corrupted
+          throw BadLessonException("Probably lesson file is corrupted: $lessonPath JDOMException:$e")
+        } catch (e: IOException) {
+          //XmlLesson file cannot be read
+          throw BadLessonException("Probably lesson file cannot be read: " + lessonPath)
+        }
+      }
+    }
+    lessons = filterLessonsByCurrentLang()
+  }
+
   override fun equals(other: Any?): Boolean {
     if (this === other) return true
     if (javaClass != other?.javaClass) return false
 
-    other as Module
+    other as XmlModule
 
     if (name != other.name) return false
     if (id != other.id) return false
@@ -153,15 +146,15 @@ class Module(val name: String, moduleXmlPath: String, private val root: Element)
   companion object {
 
     @Throws(BadModuleException::class, BadLessonException::class, JDOMException::class, IOException::class, URISyntaxException::class)
-    fun initModule(modulePath: String): Module? {
+    fun initModule(modulePath: String): XmlModule? {
       //load xml with lessons
 
-      //Check DOM with Module
+      //Check DOM with XmlModule
       val root = getRootFromPath(modulePath)
       if (root.getAttribute(GenModuleXml.MODULE_NAME_ATTR) == null) return null
       val name = root.getAttribute(GenModuleXml.MODULE_NAME_ATTR).value
 
-      return Module(name, modulePath, root)
+      return XmlModule(name, modulePath, root)
 
     }
 
diff --git a/ide-features-trainer/src/training/learn/interfaces/Lesson.kt b/ide-features-trainer/src/training/learn/interfaces/Lesson.kt
new file mode 100644 (file)
index 0000000..cf6654e
--- /dev/null
@@ -0,0 +1,44 @@
+package training.learn.interfaces
+
+import training.learn.lesson.LessonListener
+import training.learn.lesson.LessonStateManager
+
+interface Lesson {
+
+  val name: String
+
+  val id: String
+
+  var module: Module
+
+  var passed: Boolean
+
+  var isOpen: Boolean
+
+  val lang: String
+
+  val lessonListeners: MutableList<LessonListener>
+
+  fun addLessonListener(lessonListener: LessonListener) {
+    lessonListeners.add(lessonListener)
+  }
+
+  fun onStart() {
+    lessonListeners.forEach { it.lessonStarted(this) }
+  }
+
+  fun onClose() {
+    lessonListeners.clear()
+  }
+
+  fun onPass() {
+    lessonListeners.forEach { it.lessonPassed(this) }
+  }
+
+  fun pass() {
+    passed = true
+    LessonStateManager.setPassed(this)
+    onPass()
+  }
+
+}
diff --git a/ide-features-trainer/src/training/learn/interfaces/Module.kt b/ide-features-trainer/src/training/learn/interfaces/Module.kt
new file mode 100644 (file)
index 0000000..4c90029
--- /dev/null
@@ -0,0 +1,35 @@
+package training.learn.interfaces
+
+import training.lang.LangSupport
+
+interface Module {
+
+  var lessons: MutableList<Lesson>
+
+  val sanitizedName: String
+
+  var id: String?
+
+  val name: String
+
+  val moduleType: ModuleType
+
+  val description: String?
+
+  fun filterLessonByLang(langSupport: LangSupport): MutableList<Lesson>
+
+  fun giveNotPassedLesson(): Lesson?
+
+  fun giveNotPassedAndNotOpenedLesson(): Lesson?
+
+  fun hasNotPassedLesson(): Boolean
+
+  fun update()
+
+  fun addLesson(lesson: Lesson) {
+    if (lessons.any { it.id == lesson.id && it.hashCode() == lesson.hashCode()}) return // do not add lesson twice
+    lesson.module = this
+    lessons.add(lesson)
+  }
+
+}
\ No newline at end of file
diff --git a/ide-features-trainer/src/training/learn/interfaces/ModuleType.kt b/ide-features-trainer/src/training/learn/interfaces/ModuleType.kt
new file mode 100644 (file)
index 0000000..4ef3235
--- /dev/null
@@ -0,0 +1,5 @@
+package training.learn.interfaces
+
+enum class ModuleType {
+  SCRATCH, PROJECT
+}
\ No newline at end of file
index bfcad59d045231cbce581e2b2bdc8e352943b9b7..442ff1274b7af9f5626dd7f3b44fb45f373e9c2e 100644 (file)
@@ -3,6 +3,7 @@ package training.learn.lesson
 import training.learn.exceptons.BadLessonException
 import training.learn.exceptons.BadModuleException
 import training.learn.exceptons.LessonIsOpenedException
+import training.learn.interfaces.Lesson
 import java.awt.FontFormatException
 import java.io.IOException
 import java.util.*
index 72c713678f5175c099140bf3b7ebe238017cc675..5b6145647629a43300e4953533d3d0388d7e5d4c 100644 (file)
@@ -3,6 +3,7 @@ package training.learn.lesson
 import training.learn.exceptons.BadLessonException
 import training.learn.exceptons.BadModuleException
 import training.learn.exceptons.LessonIsOpenedException
+import training.learn.interfaces.Lesson
 import java.awt.FontFormatException
 import java.io.IOException
 import java.util.concurrent.ExecutionException
index ef9db6ddb1c9bc279a27a6073750e530ca8794b6..f89acf03ddc37f27b9b39b71a77a3e6e8d43b1a5 100644 (file)
@@ -12,7 +12,9 @@ import training.editor.actions.LearnActions
 import training.learn.ActionsRecorder
 import training.learn.CourseManager
 import training.learn.LearnBundle
-import training.ui.*
+import training.learn.interfaces.Lesson
+import training.ui.Message
+import training.ui.UiManager
 import training.util.createBalloon
 import training.util.editorPointForBalloon
 import java.util.*
index 2f6c364aa619c7ab0834d3362859dcf555ab36b7..f351fbb1ca6275c0eacb24028b877d5cde0c8eb6 100644 (file)
@@ -26,7 +26,7 @@ object LessonProcessor {
   var currentExecutionList: training.commands.ExecutionList? = null
     private set
 
-  fun process(project: Project, lesson: Lesson, editor: Editor) {
+  fun process(project: Project, lesson: XmlLesson, editor: Editor) {
 
     val myEditorParameters = LessonProcessor.getEditorParameters(lesson.scenario.root)
     val myQueueOfElements = LessonProcessor.createQueueOfCommands(lesson.scenario.root)
@@ -81,14 +81,14 @@ object LessonProcessor {
 
   private fun getEditorParameters(root: Element): HashMap<String, String> {
     val editorParameters = HashMap<String, String>()
-    if (root.getAttribute(Lesson.EditorParameters.PROJECT_TREE) != null) {
-      editorParameters.put(Lesson.EditorParameters.PROJECT_TREE, root.getAttributeValue(Lesson.EditorParameters.PROJECT_TREE))
+    if (root.getAttribute(XmlLesson.EditorParameters.PROJECT_TREE) != null) {
+      editorParameters.put(XmlLesson.EditorParameters.PROJECT_TREE, root.getAttributeValue(XmlLesson.EditorParameters.PROJECT_TREE))
     }
     return editorParameters
   }
 
   private fun prepareEnvironment(editor: Editor, project: Project, editorParameters: HashMap<String, String>) {
-    if (editorParameters.containsKey(Lesson.EditorParameters.PROJECT_TREE)) {
+    if (editorParameters.containsKey(XmlLesson.EditorParameters.PROJECT_TREE)) {
       if (ActionManager.getInstance().getAction(HideProjectTreeAction.Companion.myActionId) == null) {
         val hideAction = HideProjectTreeAction()
         ActionManager.getInstance().registerAction(hideAction.actionId, hideAction)
index 37d51127b48664e948b64546931f63dd33661bdc..e8d868787d8090361737c572edd93f201c9b1214 100644 (file)
@@ -19,6 +19,7 @@ import com.intellij.openapi.components.PersistentStateComponent
 import com.intellij.openapi.components.ServiceManager
 import com.intellij.openapi.components.State
 import com.intellij.openapi.components.Storage
+import training.learn.interfaces.Lesson
 import training.migration.MigrationManager
 import java.util.*
 
similarity index 67%
rename from ide-features-trainer/src/training/learn/lesson/Lesson.kt
rename to ide-features-trainer/src/training/learn/lesson/XmlLesson.kt
index 62591950bd16dda7959381562bc6bf10c9631fb7..2954e96d4a71c983ea08044cc5d7bd183e87081f 100644 (file)
@@ -2,11 +2,12 @@ package training.learn.lesson
 
 import com.intellij.openapi.project.Project
 import training.learn.CourseManager
-import training.learn.Module
 import training.learn.exceptons.BadLessonException
 import training.learn.exceptons.BadModuleException
 import training.learn.exceptons.LessonIsOpenedException
 import training.learn.exceptons.NoProjectException
+import training.learn.interfaces.Lesson
+import training.learn.interfaces.Module
 import training.learn.log.LessonLog
 import java.awt.Dimension
 import java.awt.FontFormatException
@@ -17,28 +18,26 @@ import java.util.concurrent.ExecutionException
 /**
  * Created by karashevich on 29/01/15.
  */
-data class Lesson(val scenario: Scenario, val lang: String, var module: Module?) {
+data class XmlLesson(val scenario: Scenario, override val lang: String, override var module: Module): Lesson {
 
-  var lessonListeners: ArrayList<LessonListener> = ArrayList<LessonListener>()
+  override var lessonListeners: MutableList<LessonListener> = ArrayList()
     private set
-  var passed: Boolean = false
-  var isOpen: Boolean = false
-    private set
-  val name: String = scenario.name
-  val id: String = scenario.id
+  override var passed: Boolean = false
+  override var isOpen: Boolean = false
+  override val name: String = scenario.name
+  override val id: String = scenario.id
 
   /*Log lesson metrics*/
-  val lessonLog: LessonLog = LessonLog(this)
+  private val lessonLog: LessonLog = LessonLog(this)
 
   init {
-    lessonListeners = ArrayList<LessonListener>()
     passed = LessonStateManager.getStateFromBase(id) == LessonState.PASSED
   }
 
   @Deprecated("")
   @Throws(IOException::class, FontFormatException::class, LessonIsOpenedException::class)
   fun open(infoPanelDimension: Dimension) {
-    //init infoPanel, check that Lesson has not opened yet
+    //init infoPanel, check that XmlLesson has not opened yet
     if (isOpen) throw LessonIsOpenedException(this.name + "is opened")
     onStart()
     isOpen = true
@@ -60,40 +59,19 @@ data class Lesson(val scenario: Scenario, val lang: String, var module: Module?)
     CourseManager.instance.openLesson(projectWhereToOpenLesson, this)
   }
 
-  fun close() {
-    isOpen = false
-    onClose()
-  }
-
-  //Listeners
-  fun addLessonListener(lessonListener: LessonListener) {
-    lessonListeners.add(lessonListener)
-  }
-
-  fun removeLessonListener(lessonListener: LessonListener) {
-    if (lessonListeners.contains(lessonListener)) lessonListeners.remove(lessonListener)
-
-  }
-
-  fun onStart() {
-    lessonLog.log("Lesson started")
+  override fun onStart() {
+    super.onStart()
+    lessonLog.log("XmlLesson started")
     lessonLog.resetCounter()
-    lessonListeners.forEach { it.lessonStarted(this) }
   }
 
   private fun onItemPassed() {
   }
 
-  private fun onClose() {
-    lessonListeners.clear()
-
-  }
-
   //call onPass handlers in lessonListeners
-  private fun onPass() {
-    lessonLog.log("Lesson passed")
-    lessonListeners.forEach { it.lessonPassed(this) }
-
+  override fun onPass() {
+    super.onPass()
+    lessonLog.log("XmlLesson passed")
   }
 
   @Throws(BadLessonException::class, ExecutionException::class, IOException::class, FontFormatException::class, InterruptedException::class, BadModuleException::class, LessonIsOpenedException::class)
@@ -101,12 +79,6 @@ data class Lesson(val scenario: Scenario, val lang: String, var module: Module?)
     lessonListeners.forEach { it.lessonNext(this) }
   }
 
-  fun pass() {
-    passed = true
-    LessonStateManager.setPassed(this)
-    onPass()
-  }
-
   fun passItem() {
     onItemPassed()
   }
@@ -116,7 +88,7 @@ data class Lesson(val scenario: Scenario, val lang: String, var module: Module?)
   }
 
   override fun equals(other: Any?): Boolean {
-    return other != null && other is Lesson && other.name == this.name
+    return other != null && other is XmlLesson && other.name == this.name
   }
 
   override fun hashCode(): Int {
diff --git a/ide-features-trainer/src/training/learn/lesson/kimpl/KLesson.kt b/ide-features-trainer/src/training/learn/lesson/kimpl/KLesson.kt
new file mode 100644 (file)
index 0000000..d5e2281
--- /dev/null
@@ -0,0 +1,28 @@
+package training.learn.lesson.kimpl
+
+import com.intellij.openapi.editor.Editor
+import com.intellij.openapi.project.Project
+import training.learn.interfaces.Lesson
+import training.learn.interfaces.Module
+import training.learn.lesson.LessonListener
+import training.learn.lesson.LessonManager
+
+typealias LessonContext = Triple<KLesson, Editor, Project>
+
+class KLesson(override val name: String, override var module: Module, override val lang: String, val lessonContent: Triple<KLesson, Editor, Project>.() -> Unit) : Lesson {
+
+  override val id: String = name
+  override var passed = false
+  override var isOpen = false
+  override val lessonListeners: MutableList<LessonListener> = mutableListOf()
+}
+
+fun KModule.lesson(lessonName: String, lang: String, lessonContent: LessonContext.() -> Unit): KLesson {
+  return KLesson(lessonName, this, lang, lessonContent)
+}
+
+fun LessonContext.complete(text: String? = null) {
+  val (lesson, editor, project) = this
+  lesson.pass()
+  LessonManager.getInstance(lesson).passLesson(project, editor)
+}
\ No newline at end of file
diff --git a/ide-features-trainer/src/training/learn/lesson/kimpl/KModule.kt b/ide-features-trainer/src/training/learn/lesson/kimpl/KModule.kt
new file mode 100644 (file)
index 0000000..178afdc
--- /dev/null
@@ -0,0 +1,56 @@
+package training.learn.lesson.kimpl
+
+import training.lang.LangSupport
+import training.learn.interfaces.Lesson
+import training.learn.interfaces.Module
+import training.learn.interfaces.ModuleType
+import kotlin.reflect.KVisibility
+import kotlin.reflect.full.declaredFunctions
+
+open class KModule(override val name: String, override val moduleType: ModuleType ): Module {
+
+
+  private val myLessons by lazy {
+    return@lazy this::class.declaredFunctions.filter { it.visibility == KVisibility.PUBLIC }.map { it.call(this)
+    as KLesson}
+  }
+
+  override var lessons: MutableList<Lesson>
+    get() {
+      return myLessons.toMutableList()
+    }
+    set(value) {
+
+    }
+
+
+  override val sanitizedName: String
+    get() = name
+
+  override var id: String?
+    get() = name
+    set(value) {}
+
+  override val description: String = "Empty description of Kotlin Module"
+
+  override fun filterLessonByLang(langSupport: LangSupport): MutableList<Lesson> {
+    return lessons.asSequence().filter { langSupport.acceptLang(it.lang) }.toMutableList()
+  }
+
+  override fun giveNotPassedLesson(): Lesson? {
+    return lessons.asSequence().filter { !it.passed }.firstOrNull()
+  }
+
+  override fun giveNotPassedAndNotOpenedLesson(): Lesson? {
+    return lessons.asSequence().filter { !it.passed && !it.isOpen }.firstOrNull()
+  }
+
+  override fun hasNotPassedLesson(): Boolean {
+    return lessons.asSequence().any { !it.passed }
+  }
+
+  override fun update() {
+    //do nothing here
+  }
+
+}
\ No newline at end of file
index 1c02af077dfe945796d79c7dd6129f6c2830c319..5f6b3a06655fb79df839c3592633050df7ac3351 100644 (file)
@@ -5,7 +5,7 @@ import training.learn.CourseManager
 import training.learn.exceptons.BadLessonException
 import training.learn.exceptons.BadModuleException
 import training.learn.exceptons.LessonIsOpenedException
-import training.learn.lesson.Lesson
+import training.learn.interfaces.Lesson
 import training.learn.lesson.LessonListenerAdapter
 import java.awt.FontFormatException
 import java.io.IOException
index 5c716c203269e3c6958c7f873385e0858456b6ce..494674718649e28dd8555860b91bfb7f0b34b30c 100644 (file)
@@ -1,7 +1,7 @@
 package training.learn.lesson.listeners
 
 import com.intellij.openapi.project.Project
-import training.learn.lesson.Lesson
+import training.learn.interfaces.Lesson
 import training.learn.lesson.LessonListenerAdapter
 import training.statistic.StatisticBase
 
diff --git a/ide-features-trainer/src/training/learn/log/GlobalLessonLog.java b/ide-features-trainer/src/training/learn/log/GlobalLessonLog.java
deleted file mode 100644 (file)
index ce3428d..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-package training.learn.log;
-
-import com.intellij.util.SmartList;
-import com.intellij.util.xmlb.annotations.Tag;
-import training.learn.lesson.Lesson;
-
-import java.util.HashMap;
-
-/**
- * Created by karashevich on 13/10/15.
- */
-@Tag("GlobalLessonLog")
-public class GlobalLessonLog {
-
-    public HashMap<String, SmartList<LessonLog>> globalLessonLogMap; //map lesson -> lessonLog
-
-    public GlobalLessonLog() {
-        globalLessonLogMap = new HashMap<String, SmartList<LessonLog>>();
-    }
-
-    public void commitSession(Lesson lesson) {
-
-        if (lesson.getName() == null) return;
-
-        if (globalLessonLogMap.containsKey(lesson.getName())) {
-            final SmartList<LessonLog> sessions = globalLessonLogMap.get(lesson.getName());
-            if (sessions.size() > 0) {
-                final int lastIndex = sessions.size() - 1;
-                final LessonLog lastSession = sessions.get(lastIndex);
-                if (lastSession.getFirstDate().equals(lesson.getLessonLog().getFirstDate())) {
-                    //concatenate session
-                    sessions.set(lastIndex, lesson.getLessonLog());
-                } else {
-                    globalLessonLogMap.get(lesson.getName()).add(lesson.getLessonLog());
-                }
-            } else {
-                globalLessonLogMap.get(lesson.getName()).add(lesson.getLessonLog());
-            }
-        } else {
-            final SmartList<LessonLog> sessions = new SmartList<LessonLog>();
-            sessions.add(lesson.getLessonLog());
-            globalLessonLogMap.put(lesson.getName(), sessions);
-        }
-    }
-}
index 6af77225f2daeadf1e50fa29e30846d0c452483a..1d41d9f5a1c2fcc1d924ed3becb0b0287422327c 100644 (file)
@@ -1,6 +1,6 @@
 package training.learn.log
 
-import training.learn.lesson.Lesson
+import training.learn.interfaces.Lesson
 import java.util.*
 
 /**
@@ -38,7 +38,7 @@ class LessonLog(lesson: Lesson) {
   }
 
   init {
-    log("Log is created. Lesson:" + lesson.name)
+    log("Log is created. XmlLesson:" + lesson.name)
   }
 
 }
diff --git a/ide-features-trainer/src/training/lessons/java/EditorBasicsModule.kt b/ide-features-trainer/src/training/lessons/java/EditorBasicsModule.kt
new file mode 100644 (file)
index 0000000..09267de
--- /dev/null
@@ -0,0 +1,58 @@
+package training.lessons.java
+
+import training.commands.kotlin.*
+import training.learn.interfaces.ModuleType
+import training.learn.lesson.kimpl.KModule
+import training.learn.lesson.kimpl.lesson
+
+class EditorBasicsModule : KModule("Editor Basics Kotlin", ModuleType.SCRATCH) {
+
+  fun selectLesson() = lesson("Select", "JAVA") {
+    task {
+      copyCode("""class SelectionDemo {
+
+    public int fib(int n) {
+        int a = 1;
+        int b = 1;
+
+        int tmp;
+
+        if (n < 2) return 1;
+
+        for (int i = 0; i < (n - 1); i++) {
+            tmp = b;
+            b = a;
+            a = a + tmp;
+        }
+
+        return a;
+    }
+}""")
+      text("Place the caret before any word. Press ${action("EditorNextWordWithSelection")} to move the caret to the next word and select everything in between.")
+      caret(line = 9, column = 9)
+      trigger("EditorNextWordWithSelection")
+    }
+    task {
+      text("Press ${action("EditorSelectWord")} to extend the selection to the next code block.")
+      trigger("EditorSelectWord")
+    }
+    task {
+      text("Try increasing your selection with <action>EditorSelectWord</action> until your whole file is selected.")
+      trigger("EditorSelectWord")
+    }
+    task {
+      text("${action("EditorUnSelectWord")} shrinks selection. Try pressing it.")
+      trigger("EditorUnSelectWord")
+    }
+    task {
+      text("Now select the whole file instantly with ${action("\$SelectAll")}.")
+      trigger("\$SelectAll")
+    }
+    task {
+      text("Awesome! Click the button below to start the next lesson, or use ${action("learn.next.lesson")}.")
+      trigger("learn.next.lesson")
+    }
+//    complete()
+  }
+
+}
\ No newline at end of file
index c18882c08aa4426dd12e1aadfdc1bfe587368216..52735887d0d07edc9ec8417d05a3069741ca6c71 100644 (file)
@@ -1,14 +1,11 @@
 package training.statistic
 
-import com.intellij.internal.statistic.UsagesCollector
-import com.intellij.internal.statistic.beans.GroupDescriptor
-import com.intellij.internal.statistic.beans.UsageDescriptor
 import com.intellij.openapi.components.PersistentStateComponent
 import com.intellij.openapi.components.ServiceManager
 import com.intellij.openapi.components.State
 import com.intellij.openapi.components.Storage
 import com.intellij.util.xmlb.annotations.Transient
-import training.learn.lesson.Lesson
+import training.learn.interfaces.Lesson
 
 @State(name = "StatisticBase", storages = arrayOf(Storage(value = "ide-features-trainer.xml")))
 class StatisticBase : PersistentStateComponent<StatisticBase> {
@@ -60,27 +57,4 @@ class StatisticBase : PersistentStateComponent<StatisticBase> {
       sessionLessonId2State.add(Pair(lesson.id, statisticData))
     }
   }
-}
-
-class StatisticCollector: UsagesCollector() {
-
-  override fun getGroupId(): GroupDescriptor {
-    return GroupDescriptor.create("plugin.IdeFeaturesTrainer")
-  }
-
-  /**
-   * returns a set of lesson states in a next format:
-   *    - for a started lesson: UsageDescriptor(${lesson.id}#STARTED, 1)
-   *    - for a passed lesson UsageDescriptor(${lesson.id}#PASSED, delta_in_seconds )
-   */
-  override fun getUsages(): MutableSet<UsageDescriptor> {
-    return StatisticBase.instance.sessionLessonId2State
-        .map {
-          val (lessonId, statisticData) = it
-          val key = "$lessonId#${statisticData.state}"
-          val count: Int = if (statisticData.state == StatisticBase.StatisticState.STARTED) 1 else (statisticData.timestamp!! / 1000).toInt()
-          UsageDescriptor(key, count)
-        }
-        .toMutableSet()
-  }
 }
\ No newline at end of file
diff --git a/ide-features-trainer/src/training/ui/MessageUtils.kt b/ide-features-trainer/src/training/ui/MessageUtils.kt
new file mode 100644 (file)
index 0000000..66b500a
--- /dev/null
@@ -0,0 +1,23 @@
+package training.ui
+
+object MessageUtils {
+
+  fun List<Message>.extractTag(tagName: String, messageType: Message.MessageType): List<Message> {
+    val groupedRegex = Regex("<$tagName>(.*?)</$tagName>")
+    val regex = Regex("<$tagName>.*?</$tagName>")
+    return this.map { message ->
+      if (message.isText && groupedRegex.find(message.text) != null) {
+        val splitByTag = regex.split(message.text)
+        val groups =  regex.findAll(message.text).map { it.groups }.flatten().toList()
+        val result = ArrayList<Message>()
+        groups.forEachIndexed { i, _ -> result.add(Message(splitByTag[i], message.type))
+          val textInTag = groupedRegex.find(groups[i]!!.value)!!.groups[1]!!.value
+          result.add(Message(textInTag, messageType))
+        }
+        result.add(Message(splitByTag.last(), message.type))
+        result
+      } else listOf(message)
+    }.flatten().toList()
+  }
+
+}
\ No newline at end of file
index 1c4074d9acad88f07d77ceabb431b81ba89febb5..e267d2ecbfeb9257ef9840ac007492a9696c90e3 100644 (file)
@@ -12,7 +12,6 @@ import javax.swing.JLabel
 import javax.swing.border.Border
 import javax.swing.border.EmptyBorder
 import kotlin.reflect.KProperty
-import kotlin.reflect.jvm.javaField
 
 /**
  * Created by jetbrains on 12/08/16.
index e72fee60cafede1b385e37c5d79ae9a579a67db4..025c522d72e5a9ef2b837218759540ab6d0c30cc 100644 (file)
@@ -3,7 +3,7 @@ package training.ui
 import com.intellij.openapi.diagnostic.Logger
 import com.intellij.openapi.project.Project
 import com.intellij.openapi.wm.ToolWindowManager
-import training.learn.lesson.Lesson
+import training.learn.interfaces.Lesson
 import training.ui.views.LearnPanel
 import training.ui.views.ModulesPanel
 
index 526ae352d0994a69ac23623da2f03840613cfa07..0123be1ba559ec30554f7c13db2d509b39f76af0 100644 (file)
@@ -8,7 +8,7 @@ import com.intellij.util.containers.BidirectionalMap
 import com.intellij.util.ui.UIUtil
 import training.learn.CourseManager
 import training.learn.LearnBundle
-import training.learn.lesson.Lesson
+import training.learn.interfaces.Lesson
 import training.ui.*
 import java.awt.*
 import java.awt.event.ActionEvent
@@ -26,7 +26,7 @@ class LearnPanel : JPanel() {
 
     private val boxLayout: BoxLayout
 
-    //Lesson panel items
+    //XmlLesson panel items
     private var lessonPanel: JPanel? = null
     private var moduleNameLabel: JLabel? = null
     private var allTopicsLabel: LinkLabel<Any>? = null
@@ -37,7 +37,7 @@ class LearnPanel : JPanel() {
     private var button: JButton? = null
 
 
-    //Module panel stuff
+    //XmlModule panel stuff
     var modulePanel: ModulePanel? = null
         private set
     private var moduleNamePanel: JPanel? = null //contains moduleNameLabel and allTopicsLabel
@@ -337,9 +337,6 @@ class LearnPanel : JPanel() {
             val module = lesson.module
             val myLessons = module!!.lessons
 
-            //if module contains one lesson only
-            if (myLessons.size == 1) return
-
             //create ModuleLessons region
             val moduleLessons = JLabel()
             moduleLessons.name = "moduleLessons"
@@ -356,7 +353,7 @@ class LearnPanel : JPanel() {
             moduleNamePanel!!.add(Box.createHorizontalGlue())
             moduleNamePanel!!.add(allTopicsLabel)
 
-            moduleLessons.text = lesson.module!!.name
+            moduleLessons.text = lesson.module.name
             moduleLessons.font = UISettings.instance.boldFont
             moduleLessons.isFocusable = false
 
index dc66e90d1fb62ec198977ebe21ad835ce85f7a7b..eb7254bfe604c29070982e9d4a0f0a1189709486 100644 (file)
@@ -2,7 +2,6 @@ package training.ui.views
 
 import com.intellij.openapi.project.DumbService
 import com.intellij.openapi.project.guessCurrentProject
-import com.intellij.openapi.ui.popup.JBPopupFactory
 import com.intellij.openapi.util.SystemInfo
 import com.intellij.ui.JBColor
 import com.intellij.ui.components.JBLabel
@@ -11,7 +10,7 @@ import com.intellij.util.containers.BidirectionalMap
 import com.intellij.util.ui.UIUtil
 import training.learn.CourseManager
 import training.learn.LearnBundle
-import training.learn.Module
+import training.learn.interfaces.Module
 import training.ui.LearnIcons
 import training.ui.UISettings
 import training.util.DataLoader
@@ -86,7 +85,7 @@ class ModulesPanel : JPanel() {
         val modules = CourseManager.instance.modules
         if(DataLoader.liveMode) {
             CourseManager.instance.clearModules()
-            CourseManager.instance.initModules()
+            CourseManager.instance.initXmlModules()
             module2linklabel!!.clear()
         }
         for (module in modules) {
index 9100bd513136e50d7c4e310df5f8e701729497f8..e93aff1c2324f40930d35488554e64b7d22ff890 100644 (file)
@@ -4,7 +4,7 @@ import org.jdom.Document;
 import org.jdom.Element;
 import org.jdom.output.Format;
 import org.jdom.output.XMLOutputter;
-import training.learn.Module;
+import training.learn.XmlModule;
 
 import java.io.File;
 import java.io.FileWriter;
@@ -105,9 +105,9 @@ public class GenModuleXml {
         genModules();
     }
 
-    public static Module.ModuleSdkType getSdkTypeFromString(String string) {
+    public static XmlModule.ModuleSdkType getSdkTypeFromString(String string) {
         if (string == null) return null;
-        for (Module.ModuleSdkType moduleSdkType : Module.ModuleSdkType.values()) {
+        for (XmlModule.ModuleSdkType moduleSdkType : XmlModule.ModuleSdkType.values()) {
             if(moduleSdkType.toString().equals(string)) return moduleSdkType;
         }
         return null;
diff --git a/ide-features-trainer/training.iml b/ide-features-trainer/training.iml
deleted file mode 100644 (file)
index 2772729..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="PLUGIN_MODULE" version="4">
-  <component name="DevKit.ModuleBuildProperties" url="file://$MODULE_DIR$/META-INF/plugin.xml" />
-  <component name="NewModuleRootManager" inherit-compiler-output="false">
-    <output url="file://$MODULE_DIR$/out/production/training" />
-    <output-test url="file://$MODULE_DIR$/out/test/training" />
-    <exclude-output />
-    <content url="file://$MODULE_DIR$">
-      <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
-      <sourceFolder url="file://$MODULE_DIR$/res" type="java-resource" />
-      <sourceFolder url="file://$MODULE_DIR$/tests" isTestSource="true" />
-      <sourceFolder url="file://$MODULE_DIR$/testsData" type="java-test-resource" />
-      <excludeFolder url="file://$MODULE_DIR$/../training-util/src/sandbox" />
-    </content>
-    <orderEntry type="inheritedJdk" />
-    <orderEntry type="sourceFolder" forTests="false" />
-    <orderEntry type="module-library">
-      <library>
-        <CLASSES>
-          <root url="jar://$MODULE_DIR$/lib/shortcutter.jar!/" />
-        </CLASSES>
-        <JAVADOC />
-        <SOURCES />
-      </library>
-    </orderEntry>
-    <orderEntry type="module-library" scope="TEST">
-      <library name="JUnit4">
-        <CLASSES>
-          <root url="jar://$APPLICATION_HOME_DIR$/lib/junit-4.12.jar!/" />
-          <root url="jar://$APPLICATION_HOME_DIR$/lib/hamcrest-core-1.3.jar!/" />
-        </CLASSES>
-        <JAVADOC />
-        <SOURCES />
-      </library>
-    </orderEntry>
-  </component>
-</module>
\ No newline at end of file