Merge tag 'edgent-1.2.0'

[maven-release-plugin] copy for tag edgent-1.2.0
diff --git a/scripts/runhelloedgent.sh b/.editorconfig
old mode 100755
new mode 100644
similarity index 80%
rename from scripts/runhelloedgent.sh
rename to .editorconfig
index f08010f..df7383c
--- a/scripts/runhelloedgent.sh
+++ b/.editorconfig
@@ -1,4 +1,3 @@
-#!/bin/bash
 #
 # Licensed to the Apache Software Foundation (ASF) under one or more
 # contributor license agreements.  See the NOTICE file distributed with
@@ -15,9 +14,18 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-edgent=..
 
-# Runs HelloEdgent
-#
-export CLASSPATH="${edgent}/samples/lib/edgent.samples.topology.jar"
-java org.apache.edgent.samples.topology.HelloEdgent
+[*]
+charset=utf-8
+end_of_line=lf
+insert_final_newline=false
+indent_style=space
+indent_size=4
+
+[{*.yml,*.yaml}]
+indent_style=space
+indent_size=2
+
+[*.xml]
+indent_style=space
+indent_size=2
diff --git a/.gitignore b/.gitignore
index 92778e2..ea7e192 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,13 +1,14 @@
 *.class
 
+# Local developers toolchain
+/toolchains-local.xml
+
+# Exclude the maven-wrapper.jar
+.mvn/wrapper/maven-wrapper.jar
+
 # More generated artifacts
-/target
-/test/svt/lib
-/release-edgent
+target/
 /reports
-/.gradle/
-build/
-/externalJars
 
 # Mobile Tools for Java (J2ME)
 .mtj.tmp/
@@ -22,3 +23,11 @@
 # IntelliJ Idea
 .idea/
 *.iml
+
+# Eclipse
+.classpath
+.project
+.settings/
+
+# Emacs
+*~
\ No newline at end of file
diff --git a/.gradle-wrapper/gradle-wrapper.jar b/.gradle-wrapper/gradle-wrapper.jar
deleted file mode 100644
index ca78035..0000000
--- a/.gradle-wrapper/gradle-wrapper.jar
+++ /dev/null
Binary files differ
diff --git a/.gradle-wrapper/gradle-wrapper.properties b/.gradle-wrapper/gradle-wrapper.properties
deleted file mode 100644
index 501e1c4..0000000
--- a/.gradle-wrapper/gradle-wrapper.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-distributionBase=GRADLE_USER_HOME
-distributionPath=wrapper/dists
-zipStoreBase=GRADLE_USER_HOME
-zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-3.1-bin.zip
-distributionSha256Sum=c7de3442432253525902f7e8d7eac8b5fd6ce1623f96d76916af6d0e383010fc
diff --git a/.mvn/wrapper/MavenWrapperDownloader.java b/.mvn/wrapper/MavenWrapperDownloader.java
new file mode 100644
index 0000000..44f8e00
--- /dev/null
+++ b/.mvn/wrapper/MavenWrapperDownloader.java
@@ -0,0 +1,110 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+import java.net.*;
+import java.io.*;
+import java.nio.channels.*;
+import java.util.Properties;
+
+public class MavenWrapperDownloader {
+
+    /**
+     * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
+     */
+    private static final String DEFAULT_DOWNLOAD_URL =
+            "https://repo1.maven.org/maven2/io/takari/maven-wrapper/0.2.1/maven-wrapper-0.2.1.jar";
+
+    /**
+     * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
+     * use instead of the default one.
+     */
+    private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
+            ".mvn/wrapper/maven-wrapper.properties";
+
+    /**
+     * Path where the maven-wrapper.jar will be saved to.
+     */
+    private static final String MAVEN_WRAPPER_JAR_PATH =
+            ".mvn/wrapper/maven-wrapper.jar";
+
+    /**
+     * Name of the property which should be used to override the default download url for the wrapper.
+     */
+    private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
+
+    public static void main(String args[]) {
+        System.out.println("- Downloader started");
+        File baseDirectory = new File(args[0]);
+        System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
+
+        // If the maven-wrapper.properties exists, read it and check if it contains a custom
+        // wrapperUrl parameter.
+        File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
+        String url = DEFAULT_DOWNLOAD_URL;
+        if(mavenWrapperPropertyFile.exists()) {
+            FileInputStream mavenWrapperPropertyFileInputStream = null;
+            try {
+                mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
+                Properties mavenWrapperProperties = new Properties();
+                mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
+                url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
+            } catch (IOException e) {
+                System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
+            } finally {
+                try {
+                    if(mavenWrapperPropertyFileInputStream != null) {
+                        mavenWrapperPropertyFileInputStream.close();
+                    }
+                } catch (IOException e) {
+                    // Ignore ...
+                }
+            }
+        }
+        System.out.println("- Downloading from: : " + url);
+
+        File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
+        if(!outputFile.getParentFile().exists()) {
+            if(!outputFile.getParentFile().mkdirs()) {
+                System.out.println(
+                        "- ERROR creating output direcrory '" + outputFile.getParentFile().getAbsolutePath() + "'");
+            }
+        }
+        System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
+        try {
+            downloadFileFromURL(url, outputFile);
+            System.out.println("Done");
+            System.exit(0);
+        } catch (Throwable e) {
+            System.out.println("- Error downloading");
+            e.printStackTrace();
+            System.exit(1);
+        }
+    }
+
+    private static void downloadFileFromURL(String urlString, File destination) throws Exception {
+        URL website = new URL(urlString);
+        ReadableByteChannel rbc;
+        rbc = Channels.newChannel(website.openStream());
+        FileOutputStream fos = new FileOutputStream(destination);
+        fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
+        fos.close();
+        rbc.close();
+    }
+
+}
diff --git a/gradle.properties b/.mvn/wrapper/maven-wrapper.properties
similarity index 65%
rename from gradle.properties
rename to .mvn/wrapper/maven-wrapper.properties
index cca1472..7e8f382 100644
--- a/gradle.properties
+++ b/.mvn/wrapper/maven-wrapper.properties
@@ -15,13 +15,6 @@
 # specific language governing permissions and limitations
 # under the License.
 
-build_group: org.apache.edgent
-build_name: edgent
-build_version: 1.2.0
-build_vendor: Apache Software Foundation
+distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.0/apache-maven-3.5.0-bin.zip
 
-# Minimum required gradle version and version for the wrapper to use.
-# Comment out gradleDistributionSha256Sum to disable validation of
-# a wrapper downloaded gradle distribution.
-gradleVersion = 3.1
-gradleDistributionSha256Sum = c7de3442432253525902f7e8d7eac8b5fd6ce1623f96d76916af6d0e383010fc
+#wrapperUrl=https://repo1.maven.org/maven2/io/takari/maven-wrapper/0.2.1/maven-wrapper-0.2.1.jar
diff --git a/.project b/.project
deleted file mode 100644
index 8a1877a..0000000
--- a/.project
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-    <name>_edgent</name>
-    <comment>Top level project</comment>
-</projectDescription>
diff --git a/.travis.yml b/.travis.yml
index 31171ba..b7d6c8e 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -17,24 +17,15 @@
 
 language: java
 
+env:
+   - MAVEN_OPTS="-Xms512m -Xmx512m"
+
 matrix:
    fast_finish: true
 
 install: true
 
-# avoid uploading the cache after every build (per travis doc)
-before_cache:
-  - rm -f  $HOME/.gradle/caches/modules-2/modules-2.lock
-  - rm -fr $HOME/.gradle/caches/*/plugin-resolution/
-cache:
-  directories:
-    - $HOME/.gradle/caches/
-    - $HOME/.gradle/wrapper/
-
 script:
     - jdk_switcher use oraclejdk8
-    - ./gradlew release -Dedgent.build.ci=true
-    - ./gradlew test --continue -Dedgent.build.ci=true
-    - ./gradlew test7Compile -Dedgent.build.ci=true
-    - jdk_switcher use oraclejdk7
-    - ./gradlew test7Run --continue -Dedgent.build.ci=true 
+    - mvn clean install -Pdistribution -Dedgent.build.ci=true
+#    - mvn -t toolchains-travis.xml -Djava8.home=/usr/lib/jvm/java-8-oracle clean install site:site -Pdistribution,platform-java7,platform-android -Dedgent.build.ci=true
diff --git a/CONTRIBUTORS b/CONTRIBUTORS
index 3d84f50..18e5261 100644
--- a/CONTRIBUTORS
+++ b/CONTRIBUTORS
@@ -1,5 +1,32 @@
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+
 The following volunteers have contributed code, documentation, testing and/or support to the Apache Edgent(incubating).
 
+Apache Edgent(incubating) 1.2.0
+---------------------
+Christofer Dutz
+Dale LaBossiere
+John Ament
+Justin Mclean
+Thomas Cristanis
+
 Apache Edgent(incubating) 1.1.0
 ---------------------
 Cazen Lee
diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md
index feea297..d57cdc1 100644
--- a/DEVELOPMENT.md
+++ b/DEVELOPMENT.md
@@ -1,10 +1,28 @@
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
 ## Development of Apache Edgent
 
 *Apache Edgent is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by the Incubator PMC. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.*
 
 See [README.md](README.md) for high-level information about Apache Edgent.
 
-This document describes development of Apache Edgent itself, not how to develop Edgent applications.
+This document describes building and the development of Apache Edgent itself, not how to develop Edgent applications.
 
  * See http://edgent.incubator.apache.org/docs/edgent-getting-started for getting started using Edgent
 
@@ -16,106 +34,181 @@
 
 See the [Edgent Wiki](https://cwiki.apache.org/confluence/display/EDGENT) for additional information including Internal and Design notes. 
 
-## Switched from Ant to Gradle
+## Switched from Ant and Gradle to Maven
 
 See the updated _Building_ and _Using Eclipse_ sections below.
-The Ant tooling is no longer functional.
+The Ant and Gradle tooling is no longer functional.
 
 It's recommended that developers of Edgent create a new workspace instead of
-reusing current ant-based Edgent workspaces.
+reusing current gradle-based Edgent workspaces.
 
-## Renamed from Apache Quarks
-Apache Edgent is the new name and the conversion is complete.
+## Branches
 
-Code changes:
+The `develop` branch is used for development.  Jenkins is setup to build this branch and publish internal SNAPSHOT build results to the ASF Nexus SNAPSHOTS Repository (https://repository.apache.org/content/repositories/snapshots).
 
-  * Package names have the prefix "org.apache.edgent"
-  * JAR names have the prefix "edgent"
-
-Users of Edgent will need to update their references to the above.
-It's recommended that developers of Edgent create a new workspace instead of
-reusing their Quarks workspace.
+The `master` branch contains released code. Releases are published to the ASF Nexus Releases Repository (https://repository.apache.org/content/repositories/releases). The Releases repository is automatically mirrored to the Maven Central Repository.
 
 ## Setup
 
 Once you have forked the repository and created your local clone you need to download
 these additional development software tools.
 
-* Java 8 - The development setup assumes Java 8 and Linux.
-* gradle - (https://gradle.org/) only if building from a source release bundle
+* Java 8 - The development setup assumes Java 8
+* Java 7 - *(optional) only required when also building the Java 7 and Android artifacts with `toolchain` support* 
+* Maven - *(optional) (https://maven.apache.org/)*
 
-All Edgent runtime development is done using Java 8.  JARs for Java 7 and Android
-platforms are created as described below.
+Maven is used as build tool. Currently there are two options:
 
-## Building a Binary Release Bundle
+1. Using the maven-wrapper (the `mvnw` or `mvnw.bat` command - preferred)
+2. Using an installed version of Maven (the `mvn` command)
 
-Building from a source release bundle (lacking a `./gradlew`) requires
-performing a one-time bootstrap step using an installed version of gradle:
-``` sh
-$ gradle          # one time gradle build bootstrap setup.
+The maven-wrapper will automatically download and install the correct Maven version and use that. Besides this, there is no difference between using the `mvn` and `mvnw` command.
+
+You may also use a maven-integrated IDE for Edgent development.  e.g., see the _Using Eclipse_ section below.
+
+All Edgent runtime development is done using Java 8. JARs for Java 7 and Android platforms are created by back-porting the compiled Java 8 code using a tool called `retrolambda`. More details on this below.
+
+Per default the build will use Java 8 to perform the build of the Java 7 and Android modules. In order to reliably __test__ the Java 7 modules on a real Java 7 Runtime, we defined an additional profile `toolchain` which lets Maven run the tests in the Java 7 Modules with a real Java 7 Runtime.
+
+In preparation for testing the Java 7 and Android modules with enabled `toolchain` support, edit or create `~/.m2/toolchains.xml`:
+
+``` toolchains.xml
+<?xml version="1.0" encoding="UTF8"?>
+<toolchains>
+  <toolchain>
+    <type>jdk</type>
+    <provides>
+      <version>1.8</version>
+      <vendor>oracle</vendor>
+    </provides>
+    <configuration>
+      <jdkHome>{path to the Java 8 SDK}</jdkHome>
+    </configuration>
+  </toolchain>
+  <toolchain>
+    <type>jdk</type>
+    <provides>
+      <version>1.7</version>
+      <vendor>oracle</vendor>
+    </provides>
+    <configuration>
+      <jdkHome>{path to the Java 7 SDK}</jdkHome>
+    </configuration>
+  </toolchain>
+<toolchains>
 ```
 
-Building an Edgent binary release bundle:
+Set the jdkHome values appropriately for your system.
+e.g., on an OSX system:
 ``` sh
-$ ./gradlew release
+  j8 jdkHome:  /Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home
+  j7 jdkHome:  /Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home
 ```
 
-The build reports the location of the binary distribution bundle that can then
-be unpacked and used in building applications.
 
-See [Getting Started](https://edgent.apache.org/docs/edgent-getting-started)
-for information on using the binary release bundle.
+## Building Edgent For Edgent Development
 
-## Building for Edgent Runtime Development
+Any pull request is expected to maintain the build success of `mvn package`.
 
-The primary build process is using [Gradle](https://gradle.org/),
-any pull request is expected to maintain the build success of `clean, assemble, test`.
-
-The Gradle wrapper `edgent/{gradlew,gradlew.bat}` should be used.
-The wrapper ensures the appropriate version of Gradle is used and it
-will automatically download it if needed, e.g.:
+To build and test for Java 8
 ``` sh
-$ ./gradlew --version
-$ ./gradlew clean build
+$ ./mvnw clean package   # -DskipTests to omit tests
 ```
 
-The Gradle tooling:
+To build __and properly test__ the Edgent Java 7 and Android platform jars
+requires an installed Java 7 JRE and the `toolchains.xml` setup above, then
+``` sh
+$ ./mvnw clean package -Djava8.home=$JAVA_HOME -Ptoolchain,platform-java7,platform-android
+```
 
-- Creates release images under `<edgent>/build/release-edgent`
-- Creates build artifacts under `<edgent>/build/distributions` and `<edgent>/<project>/build`
+### Documentation of all defined Maven profiles
+
+A set of Maven `profiles` have been created to control which parts should be built. 
+The default profile only builds and tests the Java 8 versions of all modules and doesn't assemble a binary distribution as usually Maven builds don't require such a step. 
+It also doesn't build the Java 7 or Android modules either.
+
+Edgent currently comes with these profiles:
+
+- `apache-release`: Builds source release bundle under `target` 
+- `distribution`: Builds one binary distribution bundle under `distribution/target` for Java 8. If the java 7 and android profiles are enabled too, for each of these an additional binary distribution is created.
+- `platform-java7`: Builds Java 7 versions of all Edgent modules and runs the tests.
+- `platform-android`: Builds Android versions of all Edgent modules that are compatible with Android (See [JAVA_SUPPORT.md](JAVA_SUPPORT.md).
+- `toolchain`: Runs the tests in the Java 7 and Android modules using a Java 7 runtime instead of Java 8 version, which happens if this profile is not enabled. 
+
+As the Android modules are based on the Java 7 versions, when building the `platform-android` profile, the `platform-java7` profile is required to be enabled too, or the build will fail. 
+
+For a not quite two hour introduction into Maven please feel free to watch this video we created for another Apache project: https://vimeo.com/167857327
+
+## Building Edgent For Using Edgent
+
+__Note:__ Apache Edgent releases include convenience binaries. Use of them
+is covered in [samples/APPLICATION_DEVELOPMENT.md](https://github.com/apache/incubator-edgent-samples/blob/develop/APPLICATION_DEVELOPMENT.md).
+
+If instead you want to build Edgent for your use there are two different use-cases:
+
+1.  Build Edgent for use with a Maven project. 
+2.  Build Edgent for use with non-Maven integrated tooling.  
+
+### Building Edgent for use with Maven
+
+Build, test, and install the Edgent Java8 jars in the local maven repository
+``` sh
+$ ./mvnw clean install  # -DskipTests to skip tests
+```
+
+To also build, but not test, the Edgent Java 7 and Android platform jars:
+``` sh
+$ ./mvnw clean install -DskipTests -Pplatform-java7,platform-android
+```
+
+To build __and properly test__ the Edgent Java 7 and Android platform jars
+requires an installed Java 7 JRE and the `toolchains.xml` setup above, then
+``` sh
+$ ./mvnw clean install -Djava8.home=$JAVA_HOME -Ptoolchain,platform-java7,platform-android
+```
 
 
-The top-level Gradle file is `edgent/build.gradle` and it contains several
-unique tasks:
+### Building Edgent for NOT using it with Maven
 
-* `wrapper` (default) : one-time bootstrap processing for use when building from a source release bundle 
-* `assemble` : Build all code and Javadoc into `build\distributions`. The build will fail on any code error or Javadoc warning or error.
-* `all` : Synonym for `assemble`
-* `build` : Essentially like "assemble test reports"
-* `clean` : Clean the project
-* `test` : Run the JUnit tests, if any test fails the test run stops.  Use `--continue` to not stop on the first failure.
-  * Use a project test task and optionally the `--tests` option to run a subset of the tests.  Multiple `--tests` options may be specified following each test task.
-    * `$ ./gradlew <project>:test`
-    * `$ ./gradlew <project>:test --tests '*.SomeTest'`
-    * `$ ./gradlew <project>:test --tests '*.SomeTest.someMethod'`
-  * Use the `cleanTest` task to force rerunning a previously successful test task (without forcing a rerun of all of the task's dependencies):
-    * `$ ./gradlew [<project>:]cleanTest [<project>:]test`
-* `reports` : Generate JUnit and Code Coverage reports in `build\distributions\reports`. Use after executing the `test` target.
-  * `reports\tests\overview-summary.html` - JUnit test report
-  * `reports\coverage\index.html` - Code coverage report
-* `release` : Build release bundles in `build/release-edgent`, that includes subsets of the Edgent JARs that run on Java 7 (`build/distributions/java7`) and Android (`build/distributions/android`). By default, SNAPSHOT bundles are created.  Specify `-Dedgent.snapshotId=""` to create bundles for a formal release.
-* `rat` : run the Apache Release Analysis Tool (license checking).
-* `signAll` : Sign the release bundles in `build/release-edgent` (first run `release`).  You will be promoted for your PGP code signing key's ID, the location of the keyring file, and the secret key password.  Default response values may be set with environment variables:
-  * `GPG_ID` - the code signing key's ID (e.g., D0F56CAD)
-  * `GPG_SECRING` - path to the secret key's keyring file
+Build Edgent as described above to populate the local maven repository.
+Then see [samples/APPLICATION_DEVELOPMENT.md](https://github.com/apache/incubator-edgent-samples/blob/develop/APPLICATION_DEVELOPMENT.md)
+for information about the `get-edgent-jars.sh` script.
 
-The build process has been tested on Linux and macOS.
+An alternative to using the `get-edgent-jars.sh` script is to
+create a binary distribution bundle consisting of the Edgent runtime
+jars and their external dependencies.
 
-To build on Windows probably needs some changes, please get involved and contribute them!
+Build a binary distribution bundle for Java 8
+``` sh
+$ ./mvnw clean package -DskipTests -Pdistribution
+```
+
+The distribution bundle is created under `distribution/target`.
+The `libs` directory inside the bundle contains the Edgent jars and 
+the `ext` directory contains third party dependencies the Edgent jars require.
+
+<b>NOTE: each third party dependency in the bundle comes with its 
+own copyright and license terms which you implicitly accept when using
+a distribution bundle.  See the README file in the bundle for more
+information.</b>
+
+You will need to manually setup the CLASSPATH for the build tooling that you're
+using to develop your Edgent application.
+
+
+To also build the Edgent Java 7 and Android platform jars:
+``` sh
+$ ./mvnw clean package -DskipTests -Pdistribution -Pplatform-java7,platform-android
+```
+The distribution bundles will be in `platforms/java7/distribution/target`
+and `platforms/android/distribution/target` respectively.
+ 
 
 ## Continuous Integration
 
-When a pull request is opened on the GitHub mirror site, the Travis CI service runs a full build.
+### Travis CI
+
+When a pull request is opened on the GitHub mirror site, the Travis CI service runs a full build of the java8 modules.
 
 The latest build status for the project's branches can be seen at: https://travis-ci.org/apache/incubator-edgent/branches
 
@@ -123,9 +216,23 @@
 It includes:
 
 * Building the project
-* Testing on Java 8 and Java 7
+* Testing on Java 8
   - Not all tests may be run, some tests are skipped due to timing issues or if excessive setup is required.
 
+In an attempt to more generally desentize tmo failures
+when the system property edgent.build.ci=true is set
+some runtime and test infrastructure components will 
+bump the normal tmo value (e.g., 10x).
+This affects travis and Jenkins runs (both set edgent.build.ci).
+See:
+
+    * TStreamTest.waitForCompletion()
+    * AbstractTester.complete()
+    * Execuatble.invokeAction()
+    * generally search for uses of edgent.build.ci
+        * maybe remove other test specific uses of it in light of the general change 
+
+The following may now best be avoided:
 If your test randomly fails because, for example, it depends on publicly available test services,
 or is timing dependent, and if timing variances on the Travis CI servers may make it more likely
 for your tests to fail, you may disable the test from being executed on Travis CI using the
@@ -141,43 +248,199 @@
 
 Closing and reopening a pull request will kick off a new build against the pull request.
 
-## Java 7 and Android
+### Jenkins, SonarQube
+
+In addition to Travis CI running the quick tests with only the Java8 modules, we have also setup additional build-jobs at the Apaches Jenkins instance at https://builds.apache.org/view/E-G/view/Edgent/
+
+This build also automatically runs on every commit, but in contrast to the Travis build, it also builds and tests the Java7 and Android modules using the toolchain profile.
+
+This is also the build which produces and deploys the Maven artifacts that are published to the Apache Maven repository at https://repository.apache.org/
+
+As an additional quality assurance tool, this build also runs a SonarQube analysis who's results are available at Apaches SonarQube instance at https://builds.apache.org/analysis/overview?id=45154
+
+Heads up: the (Jenkins?) test failure reporting tooling seems to get confused
+in the face of the same named tests being run for multiple platforms.
+Generally you will see each test file listed twice: once for Java8 and once
+for Java7.  In the html results it seems impossible to tell which platform
+a failed test (or passed test for that matter) applies to.  Even though the
+html links for the two tests differ (e.g., the 2nd one has a "_2" at the end
+of the URL), a failed test's page shows the passed test's page.  My approach
+to investigating failures is to open the "View as plain text" page and
+then use the browser's search feature to look for the test name of interest
+to locate the output for the failing test.  ugh.
+
+## Java 7 and Android Build Tooling
+
 Java 7 and Android target platforms are supported through use of
-retrolambda to convert Edgent Java8 JARs to Java7 JARs.
+retrolambda to convert Edgent Java 8 JARs to Java 7 JARs. In order
+to make it easy to address easily, for each Java 8 module a matching
+Java 7 version is located inside the `<edgent>/platforms/java7`
+directory. For Android only those counterparts exist which are generally
+supported on Android.
 
-Building a release (`./gradlew release`) produces three sets of JARs under
+In general all Java 7 modules differ from the ordinary Java 8 versions 
+as these modules don't contain any source code or resources. They are
+all built by unpacking the Java 8 jars content into the current modules 
+target directory. So the output is effectively located exactly in the 
+same location it would have when normally compiling the Java 8 version. 
+There the retrolambda plugin is executed to convert the existing class 
+files into ones compatible with Java 7.
 
-* build/distributions/java8 - Java 8 SE
-* build/distributions/java7 - Java 7 SE
-* build/distributions/android - Android
+The Android versions are even simpler, as all they do is unpack the Java 7
+versions and re-pack the content with the android groupId. All except the
+two modules which are currently only available on Android 
+(located in the `<edgent>/platforms/android/android` directory). These 
+modules are built up similar to the Java 8 versions, but they also contain
+the retrolambda plugin execution. While it would have been possible to 
+treat these modules as Java 7, for the sake of an equal coding experience
+it was decided to make it possible to write the same type of code for all
+modules.
 
-See [JAVA_SUPPORT.md](JAVA_SUPPORT.md) for which Edgent capabilities / JARs are supported
-for each environment.
+An Android module's dependency on the Java 7 version makes the requirement
+obvious, that in order to build the Android versions, the Java 7 versions
+have to be built too.
 
-### Adding Edgent Runtime JARs to Java 7 & Android
+See [JAVA_SUPPORT.md](JAVA_SUPPORT.md) for which Edgent capabilities / JARs 
+are supported for each environment.
 
-The Gradle tooling uses some Ant tooling to create the Java 7 and Android platform JARs.
-
-Java 7 Edgent runtime JARs are created using `platform/java7/build.xml`. Adding a JAR just requires:
-
-* Adding it to target `retro7.edgent` - Copy entry for an existing JAR.
-* Adding any tests for it to targets `test7.setup` and `test7.run` - Copy entry for an existing JAR.
-
-Any Java 7 JAR is automatically included in Android unless it is explictly excluded in `platform/android/build.xml`.
+Also see _Coding Conventions_ below.
 
 ## Test reports
 
-Running the `reports` target produces two reports:
+The typical maven build contains two phases of unit-tests.
+The Unit-Test phase which is executed by the surefire maven plugin
+and the Integration-Test phase, which is executed by the failsafe
+maven plugin.
 
-* `builds/distributions/reports/tests/index.html` - JUnit test report
-* `builds/distributions/reports/coverage/index.html` - Code coverage report.
+When running a normal maven `package` build, only the unit-test phase is executed.
+When running `verify` or above (`install`, `deploy`, etc.) the integration
+tests are also executed.
+
+Each Maven plugin produces output to different directories:
+
+* `<module>/target/surefire-reports` - JUnit unit-test reports
+* `<module>/target/failsafe-reports` - JUnit integration-test reports
+
+In addition to running the unit tests, coverage data is automatically 
+collected by the `jacoco-maven-plugin`, which is configured to store
+its data in `<module>/target/coverage-reports` in files called 
+`jacoco-ut.exec` and `jacoco-it.exec`.
+
+Even if at least the surfire and failsafe output is generated in a human
+readable txt and xml form, the jacoco output is intended on being used 
+by tools. SonarQube is for example able to interpret this information 
+In order to generate nicely formatted html reports, please have a look
+at the following `Site generation` chapter.
+
+## Site generation
+
+Maven has 3 built in lifecycles:
+
+* clean - For cleaning up (effectively simply deleting the output folder)
+* default - For building, testing, deploying the code
+* site - For generating, documentation, reports, ...
+
+If the human readable version of all of these should be generated, all needed
+to do this, is to append a simple `site:site` at the end of the maven command.
+
+```sh
+./mvnw -Pdistribution,platform-java7,platform-android clean verify site:site
+```
+Each modules `<module>/target/site` directory will then contain the generated 
+Module documentation.
+
+## More Build Tooling Miscellenea
+
+There is a lot of surface area to the maven build tooling.  The following
+information may help to better understand it.
+
+* `pom.xml/maven-surefile-plugin` - unit test execution
+* `pom.xml/maven-failsafe-plugin` - integration test execution
+* `pom.xml/jacoco-maven-plugin` - jacoco code coverage reports
+* `pom.xml/animal-sniffer-maven-plugin` - retrolambda results checker
+* `pom.xml/org.codehaus.sonar-plugins` - SonarQube code quality reports
+* `pom.xml/maven-javadoc-plugin` - javadoc generation and the config
+  for all of the "grouping" control.
+* `pom.xml/apache-rat-plugin` - builds automatically run Apache RAT
+  (Release Audit Tool) for checking for appropriate content.  
+  The build fails if the checking fails.
+  See configuration info for controlling excluded artifacts.
+* `pom.xml/maven-assembly-plugin` - used in a couple places for configuring
+  and generating "assemblies" => source release bundle, distribution bundles  
+* `pom.xml/maven-site-plugin` - things related to website generation that includes
+   a number of interesting things, including html reports from various things
+   above plus aggregated javadoc.  How / if this untimately relates to the
+   public website is TDB.
+* `platforms/java7/pom.xml/retrolambda-maven-plugin` 
+   and `platforms/android/android/pom.xml/retrolambda-maven-plugin` - where
+   retrolambda is enabled
+* As mentioned earlier the current scheme for generating Java7 and Android
+  Edgent jars, is achieved by replicating the java8 project structure in
+  platforms/{java7,android}.  <b>Manual synchronization of the corresponding
+  info in the alternate platform poms and other configuration files
+  is required.</b>
+* LICENSE and NOTICE: it's a requirement that released bundles
+  (source release bundle, released jars) contain accurate LICENSE, NOTICE
+  and DISCLAIMER files.  Some of the Edgent projects contain code that
+  that was contributed by IBM, some of the generated jars/war bundle
+  external components.  The build tooling is configured to automatically
+  include standard ALv2.0 LICENSE and NOTICE files in the jars.
+  The non-default cases are handled in a variety of ways: 
+    * `pom.xml/maven-remote-resources-plugin` config plays a role in all of this
+    * `src/main/appended-resources` - contains copies of license text for
+      artifacts that are bundled in Edgent bundles.  For the most part
+      this means the Edgent Console jar/war.  These are incorporated
+      into a jar by including a declaration like the following in the
+      project's pom:
+``` xml
+        <resource>
+          <directory>${project.basedir}/../../src/main/appended-resources/licenses</directory>
+          <targetPath>${project.build.directory}/${project.artifactId}-${project.version}/META-INF/licenses</targetPath>
+        </resource>
+```
+    * `src/main/ibm-remote-resources` - contains the NOTICE fragment for
+      projects containing IBM contributed code.  Applicable project's
+      define the following in their pom to ensure a correct
+      NOTICE is included in the project's jar:
+``` xml
+        <properties>
+          <remote-resources-maven-plugin.remote-resources.dir>../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+        </properties>
+```
+    * `edgent-console-servlets:war` contains bundled code (downloaded and
+      incorporated by the build tooling).  It includes the bundled code's
+      license text as described above.  Its own LICENSE and NOTICE is
+      copied from the respective files in its `src/main/remote-resources/META-INF`.
+      <b>There are copies of those in under the java7 platform as well.</b>
+    * `edgent-console-server:jar` bundles the console-servlets war and as such
+      requires the same LICENSE/NOTICE/licenses treatment as the servlets war.
+      <b>There are copies of its LICENSE/NOTICE in its  `src/main/remote-resources/META-INF`.
+      There are copies of those in under the java7 platform as well.</b>
+* source-release bundle
+    * `src/assembly/source-release.xml` - configuration information
+      controlling source-release bundle and distribution bundle names,
+      included/excluded files, etc.
+* distribution bundles:
+  Each platform has a "distribution" project.
+  We don't release these bundles hence they aren't obligated to 
+  strictly conform to the ASF LICENSE/NOTICE file requirements.
+  That said, much of the same information is provided via an
+  automatically generated DEPENDENCIES file in the bundle.
+  <b>There are copies of the following information in the java7 and android platforms.</b>
+  Related, `samples/get-edgent-jars-project` uses the same scheme and has
+  its own copies of the files.
+  * the name of the bundle is inherited from the source-release bundle's
+    configuration file noted above.
+  * src/assembly/distribution.xml - additional configuration info
+  * src/main/resources/README - source of the file in the bundle
+    
 
 ## Testing the Kafka Connector
 
 The kafka connector tests aren't run by default as the connector must
 connect to a running Kafka/Zookeeper config.
 
-There are apparently ways to embedd Kafka and Zookeeper for testing purposes but
+There are apparently ways to embed Kafka and Zookeeper for testing purposes but
 we're not there yet. Contributions welcome!
 
 Setting up the servers is easy.
@@ -186,89 +449,16 @@
 Once kafka/zookeeper are running you can run the tests and samples:
 ```sh
 #### run the kafka tests
-./gradlew connectors:kafka:test --tests '*.*Manual'
+./mvnw -pl connectors/kafka test '-Dtest=**/*Manual'
 
 #### run the sample
-cd java8/scripts/connectors/kafka
+(cd samples; ./mvnw package -DskipTests)  # build if not already done
+cd samples/scripts/connectors/kafka
 cat README
 ./runkafkasample.sh sub
 ./runkafkasample.sh pub
 ```
 
-## Testing the JDBC Connector
-
-The JDBC connector tests are written to run against Apache Derby 
-as the backing dbms and the derby jar needs to be on the classpath.
-The tests are skipped if derby can't be loaded.
-The test harness adds $DERBY_HOME/db/lib/derby.jar to the classpath.
-See [JdbcStreamsTest](connectors/jdbc/src/test/java/org/apache/edgent/test/connectors/jdbc/JdbcStreamsTest.java) 
-for more info but the following should suffice:
-
-```sh
-export DERBY_HOME=$JAVA_HOME/db
-
-#### if JAVA_HOME isn't set - e.g., on OSX...
-export DERBY_HOME=`/usr/libexec/java_home`/db
-```
-
-Once DERBY_HOME is set the tests and samples can be run as follows
-```sh
-#### run the jdbc tests
-./gradlew connectors:jdbc:test
-
-#### run the sample
-cd java8/scripts/connectors/jdbc
-cat README
-./runjdbcsample.sh writer
-./runjdbcsample.sh reader
-```
-
-## Testing Edgent with Java7
-
-All of the standard build system _tasks_ above must be run with
-`JAVA_HOME` set to use a Java8 VM.
-
-As noted above, the `release` task includes generation of Java7
-compatible versions of the Edgent JARs. After the release task has been run,
-Edgent may be tested in a Java7 context using some special _test7_ tasks.
-
-See [JAVA_SUPPORT](JAVA_SUPPORT.md) for information about what
-Edgent features are supported in the different environments.
-
-``` sh
- # pave the way for useful report generation at the end
-$ ./gradlew cleanTest
-$ ./gradlew reports
-
- # run with JAVA_HOME/PATH set for Java8
-$ ./gradlew test7Compile  # compile the Edgent tests to operate in a Java7 environment
-
-$ sh   # muck with EVs for Java7 in a subshell
-  $ export JAVA_HOME=`/usr/libexec/java_home -v 1.7`   # on OSX
-  $ export PATH=$JAVA_HOME/bin:$PATH
-  $ ./gradlew test7Run      # run the tests with a Java7 VM
-  $ exit
-
- # run with JAVA_HOME set for Java8
-$ ./gradlew test7Reports  # generate the JUnit and coverage reports
-```
-
-## Publish to Maven Repository
-
-Initial support for publishing to a local Maven repository has been added.
-Use the following to do the publish.
-
-``` sh
-$ ./gradlew publishToMavenLocal
-```
-
-The component JARs / WARs are published as well as their sources.
-The published groupId is `org.apache.edgent`. The artifactIds match the
-names of the JARs in the target-dir / release tgz.
-
-For example: `org.apache.edgent:edgent.api.topology:0.4.0`
-
-
 ## Code Layout
 
 The code is broken into a number of projects and modules within those projects defined by directories under `edgent`.
@@ -294,10 +484,11 @@
 * `analytics` - Analytics for use by Edgent applications.
 * `utils` - Optional utilities for Edgent applications.
 * `console` - Development console that allows visualization of the streams within an Edgent application during development.
-* `samples` - Sample applications, from Hello World to some sensor simulation applications.
 * `android` - Code specific to Android.
 * `test` - SVT
 
+Samples are located at https://github.com/apache/incubator-edgent-samples
+
 ## Coding Conventions
 
 Placeholder: see [EDGENT-23](https://issues.apache.org/jira/browse/EDGENT-23)
@@ -308,16 +499,11 @@
 * Don't use wildcard imports
 * Don't deliver code with warnings (e.g., unused imports)
 * All source files, scripts, etc must have the standard Apache License header
-  * run the `rat` build task to check license headers
-* Per ASF policy, released source bundles must not contain binaries (e.g., .class, .jar)
+  * the build tooling automatically runs `rat` to check license headers
+    and fails if non-conforming files are encountered.
+* __Per ASF policy, released source bundles must not contain binaries (e.g., .class, .jar)__
 * Per ASF policy, release source and binary bundle LICENSE and NOTICE files must be accurate and up to date, and only bundled 3rd party dependencies whose license meets the ASF licensing requirements can be included. 
 
-## Logging
-
-[SLF4J](http://www.slf4j.org) is used for logging and tracing.
-
-Search the code for org.slf4j.LoggerFactory to see a sample of its use.
-
 ### Use of Java 8 features
 Edgent's primary development environment is Java 8, to take advantage of lambda expressions
 since Edgent's primary API is a functional one.
@@ -325,20 +511,24 @@
 **However**, in order to support Android (and Java 7), other features of Java 8 are not used in the core
 code. Lambdas are translated into Java 7 compatible classes using retrolambda.
 
-Thus:
+Thus for core code and tests that needs to run on Android/Java7:
 
-* For core code that needs to run on Android:
    * The only Java 8 feature that can be used is lambda expressions
-   * JMX functionality cannot be used.
-* For test code that tests core code that runs on Android:
-   * Java 8 lambda expressions can be used
-   * Java 8 default & static interface methods
+   * Java 8 default & static interface methods cannot be used
    * Java 8 new classes and methods cannot be used
+   * Android only: JMX functionality cannot be used
 
-In general, most code is expected to work on Android (but might not yet) with the exception:
+In general, most code is expected to work on Android (but might not yet)
+with the exception of these excluded features:
 
-* Functionality aimed at the developer environment, such as console and development provider
-* Any JMX related code
+   * Functionality aimed at the developer environment, such as console and development provider
+   * Any JMX related code
+
+### Logging
+
+[SLF4J](http://www.slf4j.org) is used for logging and tracing.
+
+Search the code for org.slf4j.LoggerFactory to see a sample of its use.
 
 ## The ASF / GitHub Integration
 
@@ -385,42 +575,57 @@
 
 ## Using Eclipse
 
-The Edgent Git repository contains Eclipse project definitions for the
-top-level directories that contain code, such as api, runtime, connectors.
+The Edgent Git repository, or source release bundle, contains 
+Maven project definitions for the various components of Edgent
+such as api, runtime, connectors.
 
-**The Git repository does not include the 3rd party JARs that Edgent depends on,
-and Eclipse builds of Edgent projects will fail until a Gradle task is run
-to make them available in your workspace.  See the steps below.**
+Once you import the Maven projects into your workspace,
+builds and JUnit testing of Edgent in Eclipse use the 
+same artifacts as the Maven command line tooling. Like
+the command line tooling, the jars for dependent projects
+are automatically downloaded to the local maven repository
+and used.
 
-Using the Eclipse Git Team Provider plugin allows you to import these projects
-into your Eclipse workspace directly from your fork.
+If you want to use Eclipse to clone your fork, use the Eclipse Git Team Provider plugin
 
 1. From the *File* menu, select *Import...*
 2. From the *Git* folder, select *Projects from Git* and click *Next*
-3. In the *Select Repository Source* window, select one of the following:
-  - *Existing local repository* if you have already cloned the project to your machine. Click *Next*.
-    + Click *Add* and browse to the local Git repository directory
-    + Select the checkbox next to the repository and click *Finish*
-    + In the *Select a Git repository* window, choose *incubator-edgent* and click *Next*
-  - *Clone URI* to clone the remote repository. Click *Next*.
+3. Select *Clone URI* to clone the remote repository. Click *Next*.
     + In the *Location* section, enter the URI of your fork in the *URI* field (e.g., `git@github.com:<username>/incubator-edgent.git`). The other fields will be populated automatically. Click *Next*. If required, enter your passphrase.
     + In the *Source Git Repository* window, select the branch (usually `master`) and click *Next*
-    + Specify the directory where your local clone will be stored and click *Next*. Note: You can build and run tests using the Gradle targets in this directory.
-4. In the *Select a wizard to use for importing projects* window, choose *Import existing Eclipse projects* and click *Next*
-5. In the *Import Projects* window, ensure that the *Search for nested projects* checkbox is selected. Click *Finish* to bring in all the Edgent projects. **Expect build failures until you...**
-6. Run the following Gradle task in your clone directory to make all of the dependant 3rd party JARs available to Eclipse. When the command finishes, refresh your Eclipse workspace (*File* > *Refresh*) so that it rebuilds the projects.
-``` sh
-$ ./gradlew setupExternalJars
-```
+    + Specify the directory where your local clone will be stored and click *Next*. The repository will be cloned. Note: You can build and run tests using Maven in this directory.
+4. In the *Select a wizard to use for importing projects* window, click *Cancel*.  Then follow the steps below to import the Maven projects.
 
-The `_edgent` project exists to make the top-level artifacts such as
-`build.gradle` manageable via Eclipse.  Unfortunately, folders for the
-other projects (e.g., `api`) also show up in the `_edgent` folder, and
-are best ignored.
 
-Builds and JUnit testing of Edgent in Eclipse are independent from the artifacts
-generated by the Gradle build tooling.  Neither environment is affected by
-the other. This is not ideal, but it's where things are at at this time.
-Both sets of tooling can be, and typically are, used in the same workspace.
+Once you have cloned the Git repository to your machine or are working from an unpacked source release bundle, import the Maven projects into your workspace
 
-Note: Specifics may change depending on your version of Eclipse or the Eclipse Git Team Provider.
+1. From the *File* menu, select *Import...*
+2. From the *Maven* folder, select *Existing Maven Projects* and click *Next*
+  + browse to the root of the clone or source release directory and select it.  A hierarchy of projects / pom.xml files will be listed and all selected. 
+  + Verify the *Add project(s) to working set* checkbox is checked
+  + Click *Finish*.  Eclipse starts the import process and builds the workspace.  Be patient, it may take a minute or so.
+
+Top-level artifacts such as `README.md` are available under the `edgent-parent` project.
+
+Note: Specifics may change depending on your version of Eclipse or the Eclipse Maven or Git Team Provider.
+
+### Markdown Text Editor
+
+The ALv2 license headers in various markdown files (e.g., README.md)
+seem to confuse the Eclipse `wikitext` editor resulting in blank contents
+in its preview panel.  This situation may be improved by installing 
+the `Markdown text editor` from the Eclipse marketplace and adjusting
+Eclipse's file associations accordingly.
+
+## Renamed from Apache Quarks
+Apache Edgent is the new name and the conversion is complete.
+
+Code changes:
+
+  * Package names have the prefix "org.apache.edgent"
+  * JAR names have the prefix "edgent"
+
+Users of Edgent will need to update their references to the above.
+It's recommended that developers of Edgent create a new workspace instead of
+reusing their Quarks workspace.
+
diff --git a/DISCLAIMER b/DISCLAIMER
index 8bcc295..58cf3ad 100644
--- a/DISCLAIMER
+++ b/DISCLAIMER
@@ -1,8 +1,10 @@
+Apache Edgent is an effort undergoing incubation at the Apache Software
+Foundation (ASF), sponsored by the Apache Incubator PMC.
 
-Apache Edgent is an effort undergoing incubation at The Apache Software Foundation (ASF), 
-sponsored by the Incubator PMC. Incubation is required of all newly accepted 
-projects until a further review indicates that the infrastructure, communications, 
-and decision making process have stabilized in a manner consistent with other 
-successful ASF projects. While incubation status is not necessarily a reflection
-of the completeness or stability of the code, it does indicate that the project
-has yet to be fully endorsed by the ASF.
+Incubation is required of all newly accepted projects until a further review
+indicates that the infrastructure, communications, and decision making process
+have stabilized in a manner consistent with other successful ASF projects.
+
+While incubation status is not necessarily a reflection of the completeness
+or stability of the code, it does indicate that the project has yet to be
+fully endorsed by the ASF.
diff --git a/JAVA_SUPPORT.md b/JAVA_SUPPORT.md
index ec6a221..5a3bb44 100644
--- a/JAVA_SUPPORT.md
+++ b/JAVA_SUPPORT.md
@@ -1,110 +1,173 @@
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
 # Edgent Java support
 
 The Edgent runtime is supported on all Java 8 SE, Java 7 SE, and Android
 platforms with the exceptions noted below.
 
-An Edgent binary release bundle has a directory for each of the target platforms.
-Each target platform directory contains a set of jars for that platform
-* java8 - Java 8 SE
-* java7 - Java 7 SE
-* android - Android
+An Edgent release includes convenience binaries for the Edgent SDK.
+The binaries (jars and wars) are available in the Apache Nexus repository
+and Maven Central.  If you are building the Edgent SDK, the artifacts
+will be installed into the local maven repository.
 
-When building an Edgent release (`./gradlew release`) the above platform
-directories are in `build/distributions`.  See [DEVELOPMENT.md](DEVELOPMENT.md) for more
-information.
+See `samples/README.md` for general information regarding Edgent Application
+development and deployment and tooling to support that.
 
-This page documents which jars are expected to work in each environment.
+SDK binary artifacts are published for each of the supported platform types
+and the artifact's groupId portion of its coordinate indicates which
+platform the artifact is for.  The Edgent jar/war file name is the same
+for each of the platforms.
 
-A blank entry means a jar is currently not supported in that environment
-and no investigation has taken place to see if it can be supported.
+The coordinates have the following form:
+* groupId: `org.apache.edgent[.platform]`
+* artifactId: `edgent-<component>-<subcomponent>`
+
+The [.platform] is as follows:
+* blank/omitted - Java 8 SE
+* `.java7` - Java 7 SE
+* `.android` - Android
+
+For example:
+```
+<!-- for Java8 -->
+<dependency>
+  <groupId>org.apache.edgent</groupId>
+  <artifactId>edgent-providers-direct</artifactId>
+  <version>1.2.0</version>
+</dependency>
+
+<!-- for Java7 -->
+<dependency>
+  <groupId>org.apache.edgent.java7</groupId>
+  <artifactId>edgent-providers-direct</artifactId>
+  <version>1.2.0</version>
+</dependency>
+```
+
+Generally, an Edgent application needs to declare these depedencies:
+* the Edgent Provider used
+* the Edgent Analytics used
+* the Edgent Utils used
+* the Edgent Connectors used
+* an SLF4J implementation for category "runtime"
+
+At application execution time, those same dependencies as well
+as their dependencies (e.g., other "internal" Edgent Core jars, 
+external dependency jars such as for mqtt) must be included on
+the application's classpath.
+
+The `samples/template/pom.xml` is structured to support all of this.
+
+This page documents which Edgent SDK jars are expected to work in each environment.
+
+A blank entry means no investigation has taken place to see if the jar
+and its features are supported in that environment.
 
 ## Core
 
-| Jar                             | Java 8 SE | Java 7 SE | Android | Notes |
-|---------------------------------|-----------|-----------|---------|-------|
-|edgent.api.execution.jar         | yes       | yes       | yes     |       |
-|edgent.api.function.jar          | yes       | yes       | yes     |       |
-|edgent.api.graph.jar             | yes       | yes       | yes     |       |
-|edgent.api.oplet.jar             | yes       | yes       | yes     |       |
-|edgent.api.topology.jar          | yes       | yes       | yes     |       |
-|edgent.api.window.jar            | yes       | yes       | yes     |       |
-|edgent.providers.development.jar | yes       |           | no      | Uses JMX, For development only, not deployment |
-|edgent.providers.direct.jar      | yes       | yes       | yes     |       |
-|edgent.providers.iot.jar         | yes       | yes       | yes     |       |
-|edgent.runtime.appservice.jar    | yes       | yes       | yes     |       |
-|edgent.runtime.etiao.jar         | yes       | yes       | yes     |       |
-|edgent.runtime.jmxcontrol.jar    | yes       | yes       | no      | Uses JMX |
-|edgent.runtime.jobregistry.jar   | yes       |           |         |       |
-|edgent.runtime.jsoncontrol.jar   | yes       | yes       | yes     |       |
-|edgent.spi.graph.jar             | yes       | yes       | yes     |       |
-|edgent.spi.topology.jar          | yes       | yes       | yes     |       |
+| Jar                                   | Java 8 SE | Java 7 SE | Android | Notes |
+|---------------------------------------|-----------|-----------|---------|-------|
+|edgent-api-execution-<ver>.jar         | yes       | yes       | yes     |       |
+|edgent-api-function-<ver>.jar          | yes       | yes       | yes     |       |
+|edgent-api-graph-<ver>.jar             | yes       | yes       | yes     |       |
+|edgent-api-oplet-<ver>.jar             | yes       | yes       | yes     |       |
+|edgent-api-topology-<ver>.jar          | yes       | yes       | yes     |       |
+|edgent-api-window-<ver>.jar            | yes       | yes       | yes     |       |
+|edgent-providers-development-<ver>.jar | yes       | yes       | no      | Uses JMX, For development only, not deployment |
+|edgent-providers-direct-<ver>.jar      | yes       | yes       | yes     |       |
+|edgent-providers-iot-<ver>.jar         | yes       | yes       | yes     |       |
+|edgent-runtime-appservice-<ver>.jar    | yes       | yes       | yes     |       |
+|edgent-runtime-etiao-<ver>.jar         | yes       | yes       | yes     |       |
+|edgent-runtime-jmxcontrol-<ver>.jar    | yes       | yes       | no      | Uses JMX |
+|edgent-runtime-jobregistry-<ver>.jar   | yes       | yes       | yes     |       |
+|edgent-runtime-jsoncontrol-<ver>.jar   | yes       | yes       | yes     |       |
+|edgent-spi-graph-<ver>.jar             | yes       | yes       | yes     |       |
+|edgent-spi-topology-<ver>.jar          | yes       | yes       | yes     |       |
 
 ## Connectors
 
-| Jar                                           | Java 8 SE | Java 7 SE | Android | Notes |
-|-----------------------------------------------|-----------|-----------|---------|-------|
-|edgent.connectors.common.jar                   | yes       | yes       | yes     |       |
-|edgent.connectors.command.jar                  | yes       |           |         |       |
-|edgent.connectors.csv.jar                      | yes       |           |         |       |
-|edgent.connectors.file.jar                     | yes       |           |         |       |
-|edgent.connectors.http.jar                     | yes       | yes       | yes     |       |
-|edgent.connectors.iotf.jar                     | yes       | yes       | yes     |       |
-|edgent.connectors.iot.jar                      | yes       | yes       | yes     |       |
-|edgent.connectors.jdbc.jar                     | yes       |           |         |       |
-|edgent.connectors.kafka.jar                    | yes       |           |         |       |
-|edgent.connectors.mqtt.jar                     | yes       |           |         |       |
-|edgent.connectors.pubsub.jar                   | yes       | yes       | yes     |       |
-|edgent.connectors.serial.jar                   | yes       |           |         |       |
-|edgent.connectors.wsclient.jar                 | yes       |           |         |       |
-|edgent.connectors.wsclient-javax.websocket.jar | yes       |           |         |       |
-|edgent.javax.websocket.jar                     | yes       |           |         |       |
+| Jar                                                 | Java 8 SE | Java 7 SE | Android | Notes |
+|-----------------------------------------------------|-----------|-----------|---------|-------|
+|edgent-connectors-common-<ver>.jar                   | yes       | yes       | yes     |       |
+|edgent-connectors-command-<ver>.jar                  | yes       | yes       |         |       |
+|edgent-connectors-csv-<ver>.jar                      | yes       | yes       |         |       |
+|edgent-connectors-file-<ver>.jar                     | yes       | yes       |         |       |
+|edgent-connectors-http-<ver>.jar                     | yes       | yes       | yes     |       |
+|edgent-connectors-iotf-<ver>.jar                     | yes       | yes       | yes     |       |
+|edgent-connectors-iot-<ver>.jar                      | yes       | yes       | yes     |       |
+|edgent-connectors-jdbc-<ver>.jar                     | yes       | yes       |         |       |
+|edgent-connectors-kafka-<ver>.jar                    | yes       | yes       |         |       |
+|edgent-connectors-mqtt-<ver>.jar                     | yes       | yes       |         |       |
+|edgent-connectors-pubsub-<ver>.jar                   | yes       | yes       | yes     |       |
+|edgent-connectors-serial-<ver>.jar                   | yes       | yes       |         |       |
+|edgent-connectors-websocket-<ver>.jar                | yes       | yes       |         |       |
+|edgent-connectors-websocket-base-<ver>.jar           | yes       | yes       |         |       |
+|edgent-connectors-websocket-jetty-<ver>.jar          | yes       | yes       |         |       |
+|edgent-connectors-websocket-misc-<ver>.jar           | yes       | yes       |         |       |
 
 ## Applications
-| Jar                    | Java 8 SE | Java 7 SE | Android | Notes |
-|------------------------|-----------|-----------|---------|-------|
-|edgent.apps.iot.jar     | yes       | yes       | yes     |       | 
-|edgent.apps.runtime.jar | yes       | yes       | yes     |       | 
+| Jar                          | Java 8 SE | Java 7 SE | Android | Notes |
+|------------------------------|-----------|-----------|---------|-------|
+|edgent-apps-iot-<ver>.jar     | yes       | yes       | yes     |       | 
+|edgent-apps-runtime-<ver>.jar | yes       | yes       | yes     |       | 
 
 ### Analytics
 
-| Jar                         | Java 8 SE | Java 7 SE | Android | Notes |
-|-----------------------------|-----------|-----------|---------|-------|
-|edgent.analytics.math3.jar   | yes       |           |         |       |
-|edgent.analytics.sensors.jar | yes       | yes       | yes     |       |
+| Jar                               | Java 8 SE | Java 7 SE | Android | Notes |
+|-----------------------------------|-----------|-----------|---------|-------|
+|edgent-analytics-math3-<ver>.jar   | yes       | yes       |         |       |
+|edgent-analytics-sensors-<ver>.jar | yes       | yes       | yes     |       |
 
 ### Utilities
 
-| Jar                         | Java 8 SE | Java 7 SE | Android | Notes |
-|-----------------------------|-----------|-----------|---------|-------|
-|edgent.utils.metrics.jar     | yes       |           |         |       |
-|edgent.utils.streamscope.jar | yes       |           |         |       |
+| Jar                               | Java 8 SE | Java 7 SE | Android | Notes |
+|-----------------------------------|-----------|-----------|---------|-------|
+|edgent-utils-metrics-<ver>.jar     | yes       | yes       |         |       |
+|edgent-utils-streamscope-<ver>.jar | yes       | yes       |         |       |
 
 ### Development Console
 
-| Jar                         | Java 8 SE | Java 7 SE | Android | Notes |
-|-----------------------------|-----------|-----------|---------|-------|
-|edgent.console.servlets.jar  | yes       |           | no      | Uses JMX, Servlet |
-|edgent.console.server.jar    | yes       |           | no      | Uses JMX, Servlet |
+| Jar                               | Java 8 SE | Java 7 SE | Android | Notes |
+|-----------------------------------|-----------|-----------|---------|-------|
+|edgent-console-server-<ver>.jar    | yes       | yes       | no      | Uses JMX, Servlet |
+|edgent-console-servlets-<ver>.war  | yes       | yes       | no      | Uses JMX, Servlet |
 
 ### Android
-| Jar                         | Java 8 SE | Java 7 SE | Android | Notes |
-|-----------------------------|-----------|-----------|---------|-------|
-|edgent.android.topology.jar  | no        | no        | yes     |       |
-|edgent.android.hardware.jar  | no        | no        | yes     |       |
+
+| Jar                               | Java 8 SE | Java 7 SE | Android | Notes |
+|-----------------------------------|-----------|-----------|---------|-------|
+|edgent-android-topology-<ver>.jar  | no        | no        | yes     |       |
+|edgent-android-hardware-<ver>.jar  | no        | no        | yes     |       |
 
 
 ## Java API Usage
 
-Documented use of Java packages outside of the Java core packages.
+Documented use of Java packages outside of the Java core packages-
 Java core has a number of definitions, but at least those outside
-of the Java 8 compact1 definition.
+of the Java 8 compact1 definition-
 
 | Feature  | Packages              | Edgent Usage      | Notes |
 |----------|-----------------------|-------------------|-------|
-|JMX       | `java.lang.management, javax.managment*` |     | JMX not supported on Android |
+|JMX       | `java-lang-management, javax-managment*` |     | JMX not supported on Android |
 |JMX       |                       | utils/metrics     | Optional utility methods |
 |JMX       |                       | console/servlets, runtime/jmxcontrol | 
-|Servlet   | `javax.servlet*`      | console/servlets  |
-|Websocket | `javax.websocket`     | connectors/edgent.javax.websocket, connectors/wsclient-javax-websocket, connectors/javax.websocket-client |
-|JDBC      | `java.sql, javax.sql` | connectors/jdbc   |
+|Servlet   | `javax-servlet*`      | console/servlets  |
+|Websocket | `javax-websocket`     | connectors/websocket* |
+|JDBC      | `java-sql, javax-sql` | connectors/jdbc   |
 
diff --git a/Jenkinsfile b/Jenkinsfile
new file mode 100644
index 0000000..52bc845
--- /dev/null
+++ b/Jenkinsfile
@@ -0,0 +1,122 @@
+#!groovy
+
+/*
+ *
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+node('ubuntu') {
+
+    currentBuild.result = "SUCCESS"
+
+    echo 'Building Branch: ' + env.BRANCH_NAME
+
+    // Setup the required environment variables.
+    def mvnHome = "${tool 'Maven 3 (latest)'}"
+    env.JAVA_HOME="${tool 'JDK 1.8 (latest)'}"
+    env.PATH="${env.JAVA_HOME}/bin:${env.PATH}"
+
+    // Make sure the feature branches don't change the SNAPSHOTS in Nexus.
+    def mavenGoal = "install"
+    def mavenLocalRepo = ""
+    if(env.BRANCH_NAME == 'develop') {
+        mavenGoal = "sonar:sonar deploy"
+    } else {
+        mavenLocalRepo = "-Dmaven.repo.local=${env.WORKSPACE}/.repository"
+    }
+    def mavenFailureMode = "" // consider "--fail-at-end"? Odd ordering side effects?
+
+    try {
+        /*stage ('Cleanup') {
+            echo 'Cleaning up the workspace'
+            deleteDir()
+        }*/
+
+        stage ('Checkout') {
+            echo 'Checking out branch ' + env.BRANCH_NAME
+            checkout scm
+        }
+
+        stage ('Clean') {
+            echo 'Cleaning Edgent'
+            sh "${mvnHome}/bin/mvn ${mavenLocalRepo} -Pplatform-android,platform-java7,distribution clean"
+        }
+
+        stage ('Build Edgent') {
+            echo 'Building Edgent'
+            sh "${mvnHome}/bin/mvn ${mavenFailureMode} ${mavenLocalRepo} -Pplatform-android,platform-java7,distribution,toolchain -Djava8.home=${env.JAVA_HOME} -Dedgent.build.ci=true ${mavenGoal}"
+        }
+
+        stage ('Build Site') {
+            if(env.BRANCH_NAME == 'develop') {
+                echo 'Building Site'
+                sh "${mvnHome}/bin/mvn ${mavenLocalRepo} site site:stage"
+            } else {
+                echo 'Building Site (skipped for non develop branch)'
+            }
+        }
+
+/* ========================== TODO figure out what to do with samples now in a separate repo
+        stage ('Build Samples') {
+            echo 'Building samples'
+            sh "cd samples; ${mvnHome}/bin/mvn ${mavenFailureMode} ${mavenLocalRepo} clean package"
+            sh "cd samples/topology; ./run-sample.sh HelloEdgent"
+            sh "cd samples; ${mvnHome}/bin/mvn ${mavenFailureMode} ${mavenLocalRepo} -Pplatform-java7 clean package"
+            sh "cd samples/topology; ./run-sample.sh HelloEdgent"
+        }
+
+        stage ('Build Templates') {
+            echo 'Building templates'
+            sh "cd samples/template; ${mvnHome}/bin/mvn ${mavenFailureMode} ${mavenLocalRepo} clean package; ./app-run.sh"
+            sh "cd samples/template; ${mvnHome}/bin/mvn ${mavenFailureMode} ${mavenLocalRepo} -Pplatform-java7 clean package; ./app-run.sh"
+            sh "cd samples/template; ${mvnHome}/bin/mvn ${mavenFailureMode} ${mavenLocalRepo} -Pplatform-android clean package; ./app-run.sh"
+        }
+========================== */
+
+        /* There seems to be a problem with this (Here the output of the build log):
+
+        Verifying get-edgent-jars
+        [Pipeline] sh
+        [edgent-pipeline_develop-JN4DHO6BQV4SCTGBDJEOL4ZIC6T36DGONHH3VGS4DCDBO6UXH4MA] Running shell script
+        + cd samples/get-edgent-jars-project
+        + ./get-edgent-jars.sh
+        ./get-edgent-jars.sh: 111: [: java8: unexpected operator
+        ./get-edgent-jars.sh: 118: ./get-edgent-jars.sh: Syntax error: "(" unexpected
+
+        */
+        /*stage ('Verify get-engent-jars') {
+            if(env.BRANCH_NAME == 'develop') {
+                echo 'Verifying get-edgent-jars'
+                sh "cd samples/get-edgent-jars-project; ./get-edgent-jars.sh"
+            } else {
+                echo 'Verifying get-edgent-jars (skipped for non develop branch)'
+            }
+        }*/
+    }
+
+
+    catch (err) {
+        currentBuild.result = "FAILURE"
+/*            mail body: "project build error is here: ${env.BUILD_URL}" ,
+            from: 'xxxx@yyyy.com',
+            replyTo: 'dev@edgent.apache.org',
+            subject: 'Autobuild for Branch ' env.BRANCH_NAME
+            to: 'commits@edgent.apache.org'
+*/
+        throw err
+    }
+
+}
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
index f4748e9..b56042a 100644
--- a/LICENSE
+++ b/LICENSE
@@ -203,27 +203,37 @@
 ======================================
 APACHE EDGENT SUBCOMPONENTS:
 
-Apache Edgent source includes a number of subcomponents with
+Apache Edgent source a includes one or more subcomponents with
 separate copyright notices and license terms.  Your use of the
 source code for these components is subject to the terms and
 conditions of the following licenses.
 
-This product bundles d3-legend which is available under a MIT license.
-For details, see licenses/d3-legend.MIT
+This product bundles d3-legend which is available under a separate license.
 
-This product bundles portions of d3 which is available under a BSD license.
-For details, see licenses/d3.BSD
+console/servlets/src/main/webapp/js/ext/d3-legend/d3.legend.js
+https://gist.githubusercontent.com/ZJONSSON/3918369/raw/bf9bce6b68a3b70f87450f155436ca4a84af1ba4/d3.legend.js
+With Edgent specific modifications.
+License type: MIT
 
-This product bundles portions of d3-sankey which is available under a BSD license.
-For details, see licenses/d3-sankey.BSD
- 
-This product bundles portions of jquery-ui which is available under a MIT license.
-For details, see licenses/jquery-ui.MIT
- 
-The bundled jquery-ui bundles jquery which is available under a MIT license.
-For details, see licenses/jquery.MIT
+  Copyright (c) 2012 ziggy.jonsson.nyc@gmail.com
 
-The bundled jquery bundles Sizzle which is available under a MIT license.
-For details, see licenses/sizzle.MIT
+  Permission is hereby granted, free of charge, to any person obtaining
+  a copy of this software and associated documentation files (the
+  "Software"), to deal in the Software without restriction, including
+  without limitation the rights to use, copy, modify, merge, publish,
+  distribute, sublicense, and/or sell copies of the Software, and to
+  permit persons to whom the Software is furnished to do so, subject to
+  the following conditions:
+
+  The above copyright notice and this permission notice shall be
+  included in all copies or substantial portions of the Software.
+
+  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 ======================================
diff --git a/PROBLEMS.md b/PROBLEMS.md
new file mode 100644
index 0000000..2b25c49
--- /dev/null
+++ b/PROBLEMS.md
@@ -0,0 +1,21 @@
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+
+1) Rename console/servlets to console/webapp
+
diff --git a/README b/README
index ebffb0a..40d08ad 100644
--- a/README
+++ b/README
@@ -1,32 +1,35 @@
-Building Edgent from a Source Distribution
+Building the Apache Edgent SDK from a Source Distribution
+
+Quickstart
+----------
+
+You must have Java 8 installed on your system and connectivity to Maven Central
+(for downloading external thrid party dependencies). Maven will be automatically
+downloaded and installed by the maven wrapper `mvnw`.
+
+Build the Edgent SDK Java8 jars and install them in your local maven repository
+
+$ ./mvnw clean install  # add -DskipTests to omit running the tests
+
+You can now construct applications that use Edgent.  The Edgent samples
+are a good place to start and are available as a separate download
+at https://github.com/apache/incubator-edgent-samples
+
+Additional Information
+----------------------
 
 Apache Edgent is supported on several Java target platforms.
 For more information see JAVA_SUPPORT.md in the source tree
 or in the ASF git repository https://git-wip-us.apache.org/repos/asf/incubator-edgent.git
 or in the repository mirror at github https://github.com/apache/incubator-edgent.
 
-Pre-requisites:
-- Java 8 is required to build an Edgent binary distribution
-- gradle (https://gradle.org/) only if building from a source release bundle
+See DEVELOPMENT.md in this folder or 
+https://github.com/apache/incubator-edgent/DEVELOPMENT.md for information
+about building the Edgent SDK for the Java 7 and Android platforms.
 
-Building from a source release bundle (lacking a ./gradlew) requires
-performing a one-time bootstrap step using an installed version of gradle:
 
-$ gradle          # one time gradle build bootstrap setup.
-
-Build an Edgent binary distribution:
-
-$ ./gradlew release   # .\gradlew.bat on Windows
-
-The build reports the location of the binary distribution bundle that can then
-be unpacked and used in building applications.
-
-See Getting Started https://edgent.apache.org/docs/edgent-getting-started
-
-For more information about the Edgent sources, testing, and
-contributing to Edgent runtime development see DEVELOPMENT.md in the source tree
-or in the ASF git repository https://git-wip-us.apache.org/repos/asf/incubator-edgent.git
-or in the repository mirror at github https://github.com/apache/incubator-edgent.
+Licensing
+---------
 
 Apache Edgent is released under the Apache License Version 2.0.
 
diff --git a/README.md b/README.md
index ff706d1..9dda318 100644
--- a/README.md
+++ b/README.md
@@ -1,10 +1,30 @@
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
 # Welcome to Apache Edgent!
 
+[![Build Status](https://travis-ci.org/apache/incubator-edgent.svg?branch=develop)](https://travis-ci.org/apache/incubator-edgent)
+
 *Apache Edgent is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by the Incubator PMC. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.*
 
 Apache Edgent is an open source programming model and runtime for edge devices that enables you to analyze data and events at the device.
 
-Please joins us by subscribing to the developer mailing list
+Please join us by subscribing to the developer mailing list
 [dev at edgent.incubator.apache.org](http://mail-archives.apache.org/mod_mbox/incubator-edgent-dev/).
 To subscribe, send an email to `dev-subscribe at edgent.incubator.apache.org`.
 
@@ -24,34 +44,12 @@
 
 Edgent is released under the [Apache License Version 2.0](LICENSE)
 
-# Renamed from Apache Quarks
-Apache Edgent is the new name. Things are in a state of transition until all
-of the pieces arrive.
-
-The "incubator-quarks" repository has been fully updated.
-
-Until the Apache infrastructure changes are done, continue to use
-the Quarks mailing list, website, and repositories:
-  * mailing list: dev at quarks.incubator.apache.org
-  * http://quarks.incubator.apache.org/
-  * https://git-wip-us.apache.org/repos/asf/incubator-quarks.git
-  * https://github.com/apache/incubator-quarks
-
-Code changes:
-  * package names have the prefix "org.apache.edgent"
-  * jar names have the prefix "edgent"
-  
-Users of Edgent will need to update their references to the above.
-It's recommended that developers of Edgent create a new workspace instead of
-reusing their Quarks workspace.
-
 # Edgent
 Devices and sensors are everywhere. And more are coming online every day. You need a way to analyze all of the data coming from your devices, but it can be expensive to transmit all of the data from a sensor to your central analytics engine.
 
 Edgent is an open source programming model and runtime for edge devices that enables you to analyze data and events at the device. When you analyze on the edge, you can:
 
 * Reduce the amount of data that you transmit to your analytics server
-
 * Reduce the amount of data that you store
 
 An Edgent application uses analytics to determine when data needs to be sent to a back-end system for further analysis, action, or storage. For example, you can use Edgent to determine whether a system is running outside of normal parameters, such as an engine that is running too hot.
@@ -102,3 +100,8 @@
 For details about the Edgent sources and contributing to 
 Edgent runtime development see [DEVELOPMENT.md](DEVELOPMENT.md)
 
+# Renamed from Apache Quarks
+Apache Quarks was renamed to Apache Edgent.
+
+See the [RELEASE_NOTES](RELEASE_NOTES] for change information if
+you are converting from "Apache Quarks".
diff --git a/RELEASE_NOTES b/RELEASE_NOTES
index d9dba00..fc2bbd8 100644
--- a/RELEASE_NOTES
+++ b/RELEASE_NOTES
@@ -1,3 +1,89 @@
+Apache Edgent (incubating) 1.2.0
+==================
+
+The release includes a number of minor SDK bugfixes and enhancements listed below.
+
+A release now includes two source bundles:
+  - Edgent SDK bundle
+  - Edgent Samples bundle
+
+A release now publishes the Edgent SDK jars in Apache Nexus Release
+repository which are automatically mirrored to the Maven Central repository.
+
+A binary bundle (tgz) is no longer released.  The new `get-edgent-jars.sh`
+tool included in the Samples source bundle can be used to create such
+a bundle.
+
+A user now builds the samples from the released Samples source bundle
+much as a real application developer might.
+Pre-built samples jars are no longer released.  
+The Samples bundle includes an Edgent Application project template
+and some tools.
+
+There have been many updates to the Edgent website (https://edgent.apache.org/)
+related to the above:
+  - updated Getting Started Guide
+  - updated Downloads page
+  - a new The Power of Edgent page
+  - updated FAQ page
+  - a new Quickstart with Edgent Samples page
+  - a new Edgent Application Development page
+
+There are some additional changes affecting the
+use of Edgent in developing Edgent applications:
+
+The names of the Edgent jars now conform to standard
+practices: "." has been replaced with "-" and the Edgent SDK
+versionId is now included.  
+
+Almost all of the Edgent SDK jars are now available for the Java7 and Android platforms.
+
+The websocket connector jar names have been changed:
+* `edgent-connectors-websocket-<ver>.jar` was `edgent.connectors.websocket.wsclient-javax.websocket.jar`
+* `edgent-connectors-websocket-base-<ver>.jar` was  `edgent.connectors.wsclient.jar`
+* `edgent-connectors-websocket-misc-<ver>.jar` was  `edgent.javax.websocket.jar`
+* `edgent-connectors-websocket-jetty-<ver>.jar` was  `javax.websocket-client.jar`
+
+See the `JAVA_SUPPORT` documentation on the Downloads page details.
+
+From the perspective of building, development, and releasing
+Edgent, Maven is now used for the build tooling.
+The DEVELOPMENT.md file has been updated accordingly.
+
+
+New Features
+--------------------
+EDGENT-393  Add Ranges.outsideOf()
+EDGENT-273  Add scripts, etc to enable building samples
+
+Incompatible API changes
+------------------------
+NONE
+    
+Known Issues
+--------
+Open JIRAs may be found at https://issues.apache.org/jira/browse/EDGENT
+
+Bug Fixes
+---------
+EDGENT-429  JobMonitorApp.closeJob() doesn't wait for close
+EDGENT-423  Range.toStringUnsigned() not supported on Java7/Android
+
+Miscellaneous changes
+---------------------
+EDGENT-438  Improve WebSocketClientTest skip-if-cant-connect
+EDGENT-436  Change tests that use complete() TMO for successful runs
+EDGENT-435  CME in TrackingScheduledExecutor seen with testMultiTopologyPollWithError()
+EDGENT-434  Desensitize PlumbingTest.testParallelBalanced
+EDGENT-433  Automatically bump some TMO values when running CI test context
+EDGENT-432  Reduce runtime of some WindowsTest tests
+EDGENT-431  Cleanup some console code hygiene warnings
+EDGENT-418  LICENSE/NOTICE in .war are wrong
+EDGENT-413  Simplify download experience
+EDGENT-219  WindowsTest.keyedTimeBatchWIndowTest isn't robust
+EDGENT-31   FileStreamsTextFileWriterTest.testRetainAgeBased test fails
+
+
 Apache Edgent (incubating) 1.1.0
 ==================
 
diff --git a/analytics/.classpath b/analytics/.classpath
deleted file mode 100644
index 82ecf3d..0000000
--- a/analytics/.classpath
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="math3/src/main/java"/>
-	<classpathentry kind="src" path="math3/src/test/java"/>
-	<classpathentry kind="src" path="sensors/src/main/java"/>
-	<classpathentry kind="src" path="sensors/src/test/java"/>
-	<classpathentry exported="true" kind="lib" path="../externalJars/java8/analytics/math3/ext/commons-math3-3.4.1.jar"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/api"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/ext"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/providers"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/spi"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/analytics/.gitignore b/analytics/.gitignore
deleted file mode 100644
index 948fe44..0000000
--- a/analytics/.gitignore
+++ /dev/null
@@ -1,5 +0,0 @@
-/classes/
-**/test.classes/
-**/classes/
-**/unittests/
-/bin/
diff --git a/analytics/.project b/analytics/.project
deleted file mode 100644
index 726a29c..0000000
--- a/analytics/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>analytics</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/analytics/math3/build.gradle b/analytics/math3/build.gradle
deleted file mode 100644
index 9842e9c..0000000
--- a/analytics/math3/build.gradle
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-dependencies {
-  addTargetDirProjectJarDependency 'compile', ':api:topology'
-  addProjectExtDependency 'compile', 'org.apache.commons:commons-math3:3.4.1'
-  addTargetDirCoreExtJarDependencies 'compile'
-  
-  addTargetDirProjectJarDependency 'testCompile', ':providers:direct'
-  // N.B. root project adds test common dependencies
-}
-
-addCompileTestDependencies ':api:topology', ':providers:direct'
diff --git a/analytics/math3/pom.xml b/analytics/math3/pom.xml
new file mode 100644
index 0000000..d4017a1
--- /dev/null
+++ b/analytics/math3/pom.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-analytics</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-analytics-math3</artifactId>
+
+  <name>Apache Edgent (Java 8): Analytics: Math3</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-math3</artifactId>
+      <version>3.4.1</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/analytics/math3/src/main/java/org/apache/edgent/analytics/math3/Aggregations.java b/analytics/math3/src/main/java/org/apache/edgent/analytics/math3/Aggregations.java
index bcc9ea0..af4cdfb 100644
--- a/analytics/math3/src/main/java/org/apache/edgent/analytics/math3/Aggregations.java
+++ b/analytics/math3/src/main/java/org/apache/edgent/analytics/math3/Aggregations.java
@@ -23,6 +23,7 @@
 import org.apache.edgent.analytics.math3.json.JsonAnalytics;
 import org.apache.edgent.analytics.math3.stat.Regression2;
 import org.apache.edgent.analytics.math3.stat.Statistic2;
+import org.apache.edgent.analytics.math3.utils.Java7Helper;
 import org.apache.edgent.function.ToDoubleFunction;
 import org.apache.edgent.topology.TWindow;
 
@@ -195,6 +196,7 @@
    * An aggregation result may be null under other conditions,
    * e.g., a Regression2.SLOPE where the minimum number of samples has not been met.
    * 
+   * @param <T> Tuple type
    * @param c the Collection to aggregate
    * @param getter function that returns the variable to aggregate from a {@code T}
    * @param aggregate the aggregation to perform
@@ -213,6 +215,7 @@
    * The ResultMap does not contain an entry for an aggregation with a null,
    * e.g., a Regression2.SLOPE where the minimum number of samples has not been met.
    * 
+   * @param <T> Tuple type
    * @param c the Collection to aggregate
    * @param getter function that returns the variable to aggregate from a {@code T}
    * @param aggregates the aggregations to perform
@@ -242,8 +245,8 @@
           // do as JsonAnalytics did and omit Nan/Inf results from the map.
           double rv = agg.getResult();
           
-          if (Double.isFinite(rv))
-              result.put(agg.getAggregate(), Double.valueOf(rv));
+          if (Java7Helper.doubleIsFinite(rv))
+              result.put(agg.getAggregate(), rv);
       }
     }
 
diff --git a/analytics/math3/src/main/java/org/apache/edgent/analytics/math3/json/JsonAnalytics.java b/analytics/math3/src/main/java/org/apache/edgent/analytics/math3/json/JsonAnalytics.java
index 8335757..27f6202 100644
--- a/analytics/math3/src/main/java/org/apache/edgent/analytics/math3/json/JsonAnalytics.java
+++ b/analytics/math3/src/main/java/org/apache/edgent/analytics/math3/json/JsonAnalytics.java
@@ -249,6 +249,7 @@
      *    });
      * }</pre>
      * 
+     * @param <K> Partition type
      * @param window the window to compute aggregations over
      * @param resultPartitionKeyProperty name of the partition key property in the result
      * @param resultProperty name of the aggregation results property in the result
diff --git a/analytics/math3/src/main/java/org/apache/edgent/analytics/math3/stat/JsonOLS.java b/analytics/math3/src/main/java/org/apache/edgent/analytics/math3/stat/JsonOLS.java
index c1d351b..bf5e38c 100644
--- a/analytics/math3/src/main/java/org/apache/edgent/analytics/math3/stat/JsonOLS.java
+++ b/analytics/math3/src/main/java/org/apache/edgent/analytics/math3/stat/JsonOLS.java
@@ -23,6 +23,7 @@
 
 import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
+import org.apache.edgent.analytics.math3.utils.Java7Helper;
 
 class JsonOLS implements JsonUnivariateAggregator {
     
@@ -66,7 +67,7 @@
             // [0] is the constant (zero'th order)
             // [1] is the first order , which we use as the slope.
             final double slope = regressionParams[1];
-            if (Double.isFinite(slope))
+            if (Java7Helper.doubleIsFinite(slope))
                 result.addProperty(type.name(), slope);
         }
         values = null;
diff --git a/analytics/math3/src/main/java/org/apache/edgent/analytics/math3/stat/JsonStorelessStatistic.java b/analytics/math3/src/main/java/org/apache/edgent/analytics/math3/stat/JsonStorelessStatistic.java
index 702f7c3..8c43c84 100644
--- a/analytics/math3/src/main/java/org/apache/edgent/analytics/math3/stat/JsonStorelessStatistic.java
+++ b/analytics/math3/src/main/java/org/apache/edgent/analytics/math3/stat/JsonStorelessStatistic.java
@@ -23,6 +23,7 @@
 
 import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
+import org.apache.edgent.analytics.math3.utils.Java7Helper;
 
 /**
  * JSON univariate aggregator implementation wrapping a {@code StorelessUnivariateStatistic}.
@@ -51,7 +52,7 @@
     public void result(JsonElement partition, JsonObject result) {        
         double rv = statImpl.getResult();
         
-        if (Double.isFinite(rv))
+        if (Java7Helper.doubleIsFinite(rv))
             result.addProperty(stat.name(), rv);
     }
 
diff --git a/samples/topology/src/main/java/org/apache/edgent/samples/topology/package-info.java b/analytics/math3/src/main/java/org/apache/edgent/analytics/math3/utils/Java7Helper.java
similarity index 76%
rename from samples/topology/src/main/java/org/apache/edgent/samples/topology/package-info.java
rename to analytics/math3/src/main/java/org/apache/edgent/analytics/math3/utils/Java7Helper.java
index 000cb03..0a2e7f4 100644
--- a/samples/topology/src/main/java/org/apache/edgent/samples/topology/package-info.java
+++ b/analytics/math3/src/main/java/org/apache/edgent/analytics/math3/utils/Java7Helper.java
@@ -16,9 +16,12 @@
 specific language governing permissions and limitations
 under the License.
 */
+package org.apache.edgent.analytics.math3.utils;
 
-/**
- * Samples showing creating and executing basic topologies .
- */
-package org.apache.edgent.samples.topology;
+public class Java7Helper {
 
+    public static boolean doubleIsFinite(double value) {
+        return (Double.NEGATIVE_INFINITY < value) && (value < Double.POSITIVE_INFINITY);
+    }
+
+}
diff --git a/analytics/math3/src/test/java/org/apache/edgent/test/analytics/math3/Statistics2Test.java b/analytics/math3/src/test/java/org/apache/edgent/test/analytics/math3/Statistics2Test.java
index 6995b30..779c9b7 100644
--- a/analytics/math3/src/test/java/org/apache/edgent/test/analytics/math3/Statistics2Test.java
+++ b/analytics/math3/src/test/java/org/apache/edgent/test/analytics/math3/Statistics2Test.java
@@ -28,7 +28,6 @@
 import java.util.List;
 import java.util.Map;
 
-import org.apache.commons.math3.util.Pair;
 import org.apache.edgent.analytics.math3.Aggregations;
 import org.apache.edgent.analytics.math3.MvResultMap;
 import org.apache.edgent.analytics.math3.ResultMap;
diff --git a/analytics/pom.xml b/analytics/pom.xml
new file mode 100644
index 0000000..ac75ad6
--- /dev/null
+++ b/analytics/pom.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-parent</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-analytics</artifactId>
+  <packaging>pom</packaging>
+
+  <name>Apache Edgent (Java 8): Analytics</name>
+
+  <modules>
+    <module>sensors</module>
+    <module>math3</module>
+  </modules>
+
+</project>
diff --git a/analytics/sensors/build.gradle b/analytics/sensors/build.gradle
deleted file mode 100644
index 6a86d26..0000000
--- a/analytics/sensors/build.gradle
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-dependencies {
-  addTargetDirProjectJarDependency 'compile', ':api:topology'
-  addTargetDirCoreExtJarDependencies 'compile'
-  
-  addTargetDirProjectJarDependency 'testCompile', ':providers:direct'
-  // N.B. root project adds test common dependencies
-}
-
-addCompileTestDependencies ':api:topology', ':providers:direct'
diff --git a/analytics/sensors/pom.xml b/analytics/sensors/pom.xml
new file mode 100644
index 0000000..81e5fc3
--- /dev/null
+++ b/analytics/sensors/pom.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-analytics</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-analytics-sensors</artifactId>
+
+  <name>Apache Edgent (Java 8): Analytics: Sensors</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/analytics/sensors/src/main/java/org/apache/edgent/analytics/sensors/Range.java b/analytics/sensors/src/main/java/org/apache/edgent/analytics/sensors/Range.java
index 65430e7..7ba2b56 100644
--- a/analytics/sensors/src/main/java/org/apache/edgent/analytics/sensors/Range.java
+++ b/analytics/sensors/src/main/java/org/apache/edgent/analytics/sensors/Range.java
@@ -25,6 +25,8 @@
 import org.apache.edgent.function.Function;
 import org.apache.edgent.function.Predicate;
 
+import static org.apache.edgent.analytics.sensors.utils.Java7Helper.*;
+
 /**
  * A generic immutable range of values and a way to 
  * check a value for containment in the range.
@@ -162,6 +164,11 @@
      * Create a new Range&lt;T&gt;
      * <p>
      * See {@link Ranges} for a collection of convenience constructors.
+     * <p>
+     * While not enforced, for a Range to be useful/sensible,
+     * the following must be true: {@code lowerEndpoint <= upperEndpoint}.
+     * Otherwise the Range will be returned but test() and contains()
+     * can never return true.
      * 
      * @param <T> a Comparable type
      * @param lowerEndpoint null for an infinite value (and lbt must be OPEN)
@@ -172,6 +179,9 @@
      */
     public static <T extends Comparable<?>> Range<T> range(T lowerEndpoint, BoundType lbt, T upperEndpoint, BoundType ubt) {
         // matchs Guava Range.range param order
+        // Note: the lowerEndpoint <= upperEndpoint "requirement" is the same as Guava
+        // don't know if Guava Range.range() enforces that.
+        // Since we didn't originally enforce that, leave it that way. 
         return new Range<T>(lowerEndpoint, lbt, upperEndpoint, ubt);
     }
 
@@ -261,7 +271,7 @@
      * <pre>
      * Comparator&lt;Byte&gt; unsignedByteComparator = new Comparator&lt;Byte&gt;() {
      *     public int compare(Byte b1, Byte b2) {
-     *         return Integer.compareUnsigned(Byte.toUnsignedInt(b1), Byte.toUnsignedInt(b2));
+     *         return intCompareUnsigned(byteToUnsignedInt(b1), byteToUnsignedInt(b2));
      *     }
      *     public boolean equals(Object o2) { return o2==this; }
      *     };
@@ -329,7 +339,7 @@
     /**
      * Parse a String from {@link #toString()}
      * 
-     * @param str the String
+     * @param s the String
      * @return Four element array with the range's component Strings
      * @throws IllegalArgumentException
      */
@@ -457,14 +467,14 @@
     
     private static <T> String toUnsignedString(T v) {
         if (v instanceof Byte)
-            return Integer.toUnsignedString(Byte.toUnsignedInt((Byte)v));
+            return intToUnsignedString(byteToUnsignedInt((Byte)v));
         else if (v instanceof Short)
-            return Integer.toUnsignedString(Short.toUnsignedInt((Short)v));
+            return intToUnsignedString(shortToUnsignedInt((Short)v));
         else if (v instanceof Integer)
-            return Integer.toUnsignedString((Integer)v);
+            return intToUnsignedString((Integer)v);
         else if (v instanceof Long)
-            return Long.toUnsignedString((Long)v);
+            return longToUnsignedString((Long)v);
         throw new IllegalArgumentException("Not Range of Byte,Short,Integer, or Long"+v.getClass());
     }
-    
+
 }
diff --git a/analytics/sensors/src/main/java/org/apache/edgent/analytics/sensors/Ranges.java b/analytics/sensors/src/main/java/org/apache/edgent/analytics/sensors/Ranges.java
index c4f485f..e272e4b 100644
--- a/analytics/sensors/src/main/java/org/apache/edgent/analytics/sensors/Ranges.java
+++ b/analytics/sensors/src/main/java/org/apache/edgent/analytics/sensors/Ranges.java
@@ -22,6 +22,7 @@
 import java.math.BigInteger;
 
 import org.apache.edgent.analytics.sensors.Range.BoundType;
+import org.apache.edgent.function.Predicate;
 
 /**
  * Convenience functions and utility operations on {@link Range}.
@@ -136,6 +137,23 @@
     }
     
     /**
+     * Create a Predicate whose {@code test(v)} behaves like {@code ! range.test(v)}
+     * <p>
+     * This can be useful in a situation such as filtering to include only values
+     * that are outside of a range.
+     * <pre>{@code
+     *     TStream<?> outsideRange = readings.filter(Ranges.outsideOf(Ranges.open(10,20)));
+     * }</pre>
+     * 
+     * @param <T> Endpoint type
+     * @param range the Range
+     * @return the Predicate
+     */
+    public static <T extends Comparable<?>> Predicate<T> outsideOf(Range<T> range) {
+        return t -> ! range.test(t);
+    }
+    
+    /**
      * Create a Range from a Range&lt;Integer&gt;.toString() value.
      * @param str the String
      * @return the Range
diff --git a/analytics/sensors/src/main/java/org/apache/edgent/analytics/sensors/utils/Java7Helper.java b/analytics/sensors/src/main/java/org/apache/edgent/analytics/sensors/utils/Java7Helper.java
new file mode 100644
index 0000000..e425c15
--- /dev/null
+++ b/analytics/sensors/src/main/java/org/apache/edgent/analytics/sensors/utils/Java7Helper.java
@@ -0,0 +1,62 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+package org.apache.edgent.analytics.sensors.utils;
+
+public class Java7Helper {
+
+    public static int byteToUnsignedInt(byte input) {
+        return ((int) input) & 0xff;
+    }
+
+    public static int shortToUnsignedInt(short input) {
+        return ((int) input) & 0xffff;
+    }
+
+    public static long intToUnsignedLong(int input) {
+        return ((long) input) & 0xffffffffL;
+    }
+
+    public static String intToUnsignedString(int input) {
+        return Long.toString(intToUnsignedLong(input));
+    }
+
+    public static String longToUnsignedString(long input) {
+        // In case of a positive signed value, just output that.
+        if (input >= 0) {
+            return Long.toString(input, 10);
+        }
+        // If the value is negative, the most significant bit is
+        // 1 and Java is interpreting the number as negative value.
+        else {
+            // Shift everything right one bit (filling up with 0)
+            long quot = (input >>> 1) / 5;
+            long rem = input - quot * 10;
+            return Long.toString(quot) + rem;
+        }
+    }
+
+    public static int intCompareUnsigned(int x, int y) {
+        return Integer.compare(x + Integer.MIN_VALUE, y + Integer.MIN_VALUE);
+    }
+
+    public static int longCompareUnsigned(long x, long y) {
+        return Long.compare(x + Long.MIN_VALUE, y + Long.MIN_VALUE);
+    }
+
+}
diff --git a/analytics/sensors/src/test/java/org/apache/edgent/test/analytics/sensors/RangeTest.java b/analytics/sensors/src/test/java/org/apache/edgent/test/analytics/sensors/RangeTest.java
index 7d4b316..92298d1 100644
--- a/analytics/sensors/src/test/java/org/apache/edgent/test/analytics/sensors/RangeTest.java
+++ b/analytics/sensors/src/test/java/org/apache/edgent/test/analytics/sensors/RangeTest.java
@@ -8,7 +8,7 @@
 with the License.  You may obtain a copy of the License at
 
   http://www.apache.org/licenses/LICENSE-2.0
-  
+
 Unless required by applicable law or agreed to in writing,
 software distributed under the License is distributed on an
 "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -22,6 +22,7 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotSame;
 import static org.junit.Assert.assertTrue;
+import static org.apache.edgent.analytics.sensors.utils.Java7Helper.*;
 
 import java.lang.reflect.Type;
 import java.math.BigDecimal;
@@ -31,6 +32,7 @@
 import org.apache.edgent.analytics.sensors.Range;
 import org.apache.edgent.analytics.sensors.Ranges;
 import org.apache.edgent.function.Function;
+import org.apache.edgent.function.Predicate;
 import org.junit.Test;
 
 import com.google.gson.Gson;
@@ -40,13 +42,18 @@
  * Test Range and Ranges
  */
 public class RangeTest {
+  
+  private <T extends Comparable<?>> void testOutsideOf(Range<T> range, T v) {
+      Predicate<T> notPredicate = Ranges.outsideOf(range); 
+      assertEquals("outsideOf-"+range+".test("+v+")", !range.test(v), notPredicate.test(v));
+  }
     
     private <T extends Comparable<?>> void testContains(Range<T> range, T v, Boolean expected) {
-        assertEquals("range"+range+".contains(range"+v+")", expected, range.contains(v));
+        assertEquals("range"+range+".contains("+v+")", expected, range.contains(v));
     }
     
     private <T extends Comparable<?>> void testPredicate(Range<T> range, T v, Boolean expected) {
-        assertEquals("range"+range+".test(range"+v+")", expected, range.test(v));
+        assertEquals("range"+range+".test("+v+")", expected, range.test(v));
     }
     
     private <T extends Comparable<?>> void testToString(Range<T> range, String expected) {
@@ -162,6 +169,15 @@
         testPredicate(Ranges.closed(2,4), 4, true);
         testPredicate(Ranges.closed(2,4), 5, false);
     }
+    
+    @Test
+    public void testOutsideOf() {
+        testOutsideOf(Ranges.closed(2,4), 1);
+        testOutsideOf(Ranges.closed(2,4), 2);
+        testOutsideOf(Ranges.closed(2,4), 3);
+        testOutsideOf(Ranges.closed(2,4), 4);
+        testOutsideOf(Ranges.closed(2,4), 5);
+    }
 
     @Test
     public void testEquals() {
@@ -372,14 +388,13 @@
      * Test unsigned handling.
      * toUnsignedString() and compare(T, Comparator<T>)
      */
-
     @Test
     public void testToUnsignedString() {
         testToStringUnsigned(Ranges.open((byte)0,(byte)255), "(0..255)");
         testToStringUnsigned(Ranges.closed((byte)0,(byte)255), "[0..255]");
         testToStringUnsigned(Ranges.open((short)0,(short)0xFFFF), "(0..65535)");
-        testToStringUnsigned(Ranges.open(0,0xFFFFFFFF), "(0.."+Integer.toUnsignedString(0xFFFFFFFF)+")");
-        testToStringUnsigned(Ranges.open(0L,0xFFFFFFFFFFFFFFFFL), "(0.."+Long.toUnsignedString(0xFFFFFFFFFFFFFFFFL)+")");
+        testToStringUnsigned(Ranges.open(0,0xFFFFFFFF), "(0.."+ intToUnsignedString(0xFFFFFFFF)+")");
+        testToStringUnsigned(Ranges.open(0L,0xFFFFFFFFFFFFFFFFL), "(0.."+longToUnsignedString(0xFFFFFFFFFFFFFFFFL)+")");
     }
 
     @Test
@@ -387,7 +402,7 @@
         // Unsigned Byte ======================
         Comparator<Byte> unsignedByteComparator = new Comparator<Byte>() {
             public int compare(Byte v1, Byte v2) {
-                return Integer.compareUnsigned(Byte.toUnsignedInt(v1), Byte.toUnsignedInt(v2));
+                return intCompareUnsigned(byteToUnsignedInt(v1), byteToUnsignedInt(v2));
             }
             public boolean equals(Object o2) { return o2==this; }
             };
@@ -401,7 +416,7 @@
         // Unsigned Short ======================
         Comparator<Short> unsignedShortComparator = new Comparator<Short>() {
             public int compare(Short v1, Short v2) {
-                return Integer.compareUnsigned(Short.toUnsignedInt(v1), Short.toUnsignedInt(v2));
+                return intCompareUnsigned(shortToUnsignedInt(v1), shortToUnsignedInt(v2));
             }
             public boolean equals(Object o2) { return o2==this; }
             };
@@ -414,7 +429,7 @@
         // Unsigned Integer ======================
         Comparator<Integer> unsignedIntegerComparator = new Comparator<Integer>() {
             public int compare(Integer v1, Integer v2) {
-                return Integer.compareUnsigned(v1, v2);
+                return intCompareUnsigned(v1, v2);
             }
             public boolean equals(Object o2) { return o2==this; }
             };
@@ -427,7 +442,7 @@
         // Unsigned Long ======================
         Comparator<Long> unsignedLongComparator = new Comparator<Long>() {
             public int compare(Long v1, Long v2) {
-                return Long.compareUnsigned(v1, v2);
+                return longCompareUnsigned(v1, v2);
             }
             public boolean equals(Object o2) { return o2==this; }
             };
diff --git a/android/.gitignore b/android/.gitignore
deleted file mode 100644
index ffb09f3..0000000
--- a/android/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/classes/
-**/test.classes/
-**/classes/
-**/unittests/
diff --git a/android/hardware/build.gradle b/android/hardware/build.gradle
deleted file mode 100644
index 0368f95..0000000
--- a/android/hardware/build.gradle
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-ext.androidJarSpec = 'com.google.android:android:4.1.1.4@jar'
-
-dependencies {
-  addTargetDirProjectJarDependency 'compile', ':api:topology'
-  addProjectExtDependency 'compile', androidJarSpec
-  
-  // N.B. root project adds test common dependencies
-}
-
-test {
-  // this project lacks tests and this task fails if attempted 
-  enabled = false
-}
diff --git a/android/topology/build.gradle b/android/topology/build.gradle
deleted file mode 100644
index f5e9106..0000000
--- a/android/topology/build.gradle
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-dependencies {
-  addTargetDirProjectJarDependency 'compile', ':api:topology'
-  addTargetDirProjectJarDependency 'compile', ':api:oplet'
-  addProjectExtDependency 'compile', project(':android:hardware').androidJarSpec
-
-  // N.B. root project adds test common dependencies
-}
-
-test {
-  // this project lacks tests and this task fails if attempted 
-  enabled = false
-}
diff --git a/api/.classpath b/api/.classpath
deleted file mode 100644
index 661cdab..0000000
--- a/api/.classpath
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="function/src/main/java"/>
-	<classpathentry kind="src" path="function/src/test/java"/>
-	<classpathentry kind="src" path="execution/src/main/java"/>
-	<classpathentry kind="src" path="execution/src/test/java"/>
-	<classpathentry kind="src" path="graph/src/main/java"/>
-	<classpathentry kind="src" path="graph/src/test/java"/>
-	<classpathentry kind="src" path="oplet/src/main/java"/>
-	<classpathentry kind="src" path="oplet/src/test/java"/>
-	<classpathentry kind="src" path="topology/src/main/java"/>
-	<classpathentry kind="src" path="topology/src/test/java"/>
-	<classpathentry kind="src" path="window/src/main/java"/>
-	<classpathentry kind="src" path="window/src/test/java"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/ext"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/api/.gitignore b/api/.gitignore
deleted file mode 100644
index 948fe44..0000000
--- a/api/.gitignore
+++ /dev/null
@@ -1,5 +0,0 @@
-/classes/
-**/test.classes/
-**/classes/
-**/unittests/
-/bin/
diff --git a/api/.project b/api/.project
deleted file mode 100644
index 0df4729..0000000
--- a/api/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>api</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/api/execution/build.gradle b/api/execution/build.gradle
deleted file mode 100644
index 19b441d..0000000
--- a/api/execution/build.gradle
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-dependencies {
-  addTargetDirProjectJarDependency 'compile', ':api:function'
-  addTargetDirCoreExtJarDependencies 'compile'
-
-  // N.B. root project adds test common dependencies
-}
diff --git a/api/execution/pom.xml b/api/execution/pom.xml
new file mode 100644
index 0000000..e0b0e5b
--- /dev/null
+++ b/api/execution/pom.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-api</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-api-execution</artifactId>
+
+  <name>Apache Edgent (Java 8): API: Execution</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-function</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>com.google.code.gson</groupId>
+      <artifactId>gson</artifactId>
+      <version>2.8.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/api/function/build.gradle b/api/function/build.gradle
deleted file mode 100644
index f5aa243..0000000
--- a/api/function/build.gradle
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-dependencies {
-  // none
-
-  // N.B. root project adds test common dependencies
-}
diff --git a/api/function/pom.xml b/api/function/pom.xml
new file mode 100644
index 0000000..0f2e38b
--- /dev/null
+++ b/api/function/pom.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-api</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-api-function</artifactId>
+
+  <name>Apache Edgent (Java 8): API: Function</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+</project>
diff --git a/api/graph/build.gradle b/api/graph/build.gradle
deleted file mode 100644
index 4931d57..0000000
--- a/api/graph/build.gradle
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-dependencies {
-  addTargetDirProjectJarDependency 'compile', ':api:oplet'
-  addTargetDirCoreExtJarDependencies 'compile'
-
-  // N.B. root project adds test common dependencies
-}
-
-test {
-  // this project lacks non-abstract test classes and this task fails if attempted 
-  enabled = false
-}
diff --git a/api/graph/pom.xml b/api/graph/pom.xml
new file mode 100644
index 0000000..94fa3de
--- /dev/null
+++ b/api/graph/pom.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-api</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-api-graph</artifactId>
+
+  <name>Apache Edgent (Java 8): API: Graph</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-oplet</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/api/oplet/build.gradle b/api/oplet/build.gradle
deleted file mode 100644
index b97572d..0000000
--- a/api/oplet/build.gradle
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-dependencies {
-  addTargetDirProjectJarDependency 'compile', ':api:function'
-  addTargetDirProjectJarDependency 'compile', ':api:execution'
-  addTargetDirProjectJarDependency 'compile', ':api:window'
-  addTargetDirCoreExtJarDependencies 'compile'
-
-  // N.B. root project adds test common dependencies
-}
diff --git a/api/oplet/pom.xml b/api/oplet/pom.xml
new file mode 100644
index 0000000..e8ef37e
--- /dev/null
+++ b/api/oplet/pom.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-api</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-api-oplet</artifactId>
+
+  <name>Apache Edgent (Java 8): API: Oplet</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-function</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-execution</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-window</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/api/pom.xml b/api/pom.xml
new file mode 100644
index 0000000..481c4ee
--- /dev/null
+++ b/api/pom.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-parent</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-api</artifactId>
+  <packaging>pom</packaging>
+
+  <name>Apache Edgent (Java 8): API</name>
+
+  <modules>
+    <module>execution</module>
+    <module>function</module>
+    <module>graph</module>
+    <module>oplet</module>
+    <module>topology</module>
+    <module>window</module>
+  </modules>
+
+</project>
diff --git a/api/topology/build.gradle b/api/topology/build.gradle
deleted file mode 100644
index ac33fc3..0000000
--- a/api/topology/build.gradle
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-dependencies {
-  addTargetDirProjectJarDependency 'compile', ':api:execution'
-  addTargetDirProjectJarDependency 'compile', ':api:function'
-  addTargetDirProjectJarDependency 'compile', ':api:graph'
-  addTargetDirProjectJarDependency 'compile', ':api:oplet'
-  addTargetDirCoreExtJarDependencies 'compile'
-
-  // N.B. root project adds test common dependencies
-}
-
-//Build a jar file containing the applications to test the ApplicationService
-task testApplicationJar{
-  doLast{
-    ant.jar(destfile: "${buildDir}/lib/test/edgent.api.topology.APPS.TEST.jar") {
-      service(type: 'org.apache.edgent.topology.services.TopologyBuilder') {
-        provider(classname: 'org.apache.edgent.test.topology.services.TestApplications$AppOne')
-        provider(classname: 'org.apache.edgent.test.topology.services.TestApplications$AppTwo')
-        provider(classname: 'org.apache.edgent.test.topology.services.TestApplications$AppThree')
-      }
-    fileset (dir: "${buildDir}/classes/test/", includes: '**/*TestApplications$App*.class')
-    }
-  }
-}
-
-testClasses.dependsOn testApplicationJar
diff --git a/api/topology/pom.xml b/api/topology/pom.xml
new file mode 100644
index 0000000..ab8fc53
--- /dev/null
+++ b/api/topology/pom.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-api</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-api-topology</artifactId>
+
+  <name>Apache Edgent (Java 8): API: Topology</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-execution</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-function</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-graph</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-oplet</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/api/topology/src/main/java/org/apache/edgent/topology/plumbing/PlumbingStreams-withComcurrentMapSingleOp.JAVA b/api/topology/src/main/java/org/apache/edgent/topology/plumbing/PlumbingStreams-withComcurrentMapSingleOp.JAVA
deleted file mode 100644
index f470ad0..0000000
--- a/api/topology/src/main/java/org/apache/edgent/topology/plumbing/PlumbingStreams-withComcurrentMapSingleOp.JAVA
+++ /dev/null
@@ -1,494 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.topology.plumbing;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicReference;
-
-import org.apache.edgent.function.Function;
-import org.apache.edgent.oplet.plumbing.Barrier;
-import org.apache.edgent.oplet.plumbing.Isolate;
-import org.apache.edgent.oplet.plumbing.PressureReliever;
-import org.apache.edgent.oplet.plumbing.UnorderedIsolate;
-import org.apache.edgent.topology.TStream;
-import org.apache.edgent.topology.TopologyProvider;
-
-/**
- * Plumbing utilities for {@link TStream}.
- * Methods that manipulate the flow of tuples in a streaming topology,
- * but are not part of the logic of the application.
- */
-public class PlumbingStreams {
-  
-    /**
-     * Insert a blocking delay between tuples.
-     * Returned stream is the input stream delayed by {@code delay}.
-     * <p>
-     * Delays less than 1msec are translated to a 0 delay.
-     * <p>
-     * This function always adds the {@code delay} amount after receiving
-     * a tuple before forwarding it.  
-     * <p>
-     * Downstream tuple processing delays will affect
-     * the overall delay of a subsequent tuple.
-     * <p>
-     * e.g., the input stream contains two tuples t1 and t2 and
-     * the delay is 100ms.  The forwarding of t1 is delayed by 100ms.
-     * Then if a downstream processing delay of 80ms occurs, this function
-     * receives t2 80ms after it forwarded t1 and it will delay another
-     * 100ms before forwarding t2.  Hence the overall delay between forwarding
-     * t1 and t2 is 180ms.
-     * See {@link #blockingThrottle(long, TimeUnit) blockingThrottle}.
-     * 
-     * @param stream Stream t
-     * @param delay Amount of time to delay a tuple.
-     * @param unit Time unit for {@code delay}.
-     * 
-     * @return Stream that will be delayed.
-     */
-    public static <T> TStream<T> blockingDelay(TStream<T> stream, long delay, TimeUnit unit) {
-        return stream.map(t -> {try {
-            Thread.sleep(unit.toMillis(delay));
-        } catch (InterruptedException e) {
-            Thread.currentThread().interrupt();
-            throw new RuntimeException(e);
-        } return t;}) ;
-    }
-    
-    /**
-     * Maintain a constant blocking delay between tuples.
-     * The returned stream is the input stream throttled by {@code delay}.
-     * <p>
-     * Delays less than 1msec are translated to a 0 delay.
-     * <p>
-     * Sample use:
-     * <pre>{@code
-     * TStream<String> stream = topology.strings("a", "b, "c");
-     * // Create a stream with tuples throttled to 1 second intervals.
-     * TStream<String> throttledStream = blockingThrottle(stream, 1, TimeUnit.SECOND);
-     * // print out the throttled tuples as they arrive
-     * throttledStream.peek(t -> System.out.println(new Date() + " - " + t));
-     * }</pre>
-     * <p>
-     * The function adjusts for downstream processing delays.
-     * The first tuple is not delayed.  If {@code delay} has already
-     * elapsed since the prior tuple was forwarded, the tuple 
-     * is forwarded immediately.
-     * Otherwise, forwarding the tuple is delayed to achieve
-     * a {@code delay} amount since forwarding the prior tuple.
-     * <p>
-     * e.g., the input stream contains two tuples t1 and t2 and
-     * the delay is 100ms.  The forwarding of t1 is delayed by 100ms.
-     * Then if a downstream processing delay of 80ms occurs, this function
-     * receives t2 80ms after it forwarded t1 and it will only delay another
-     * 20ms (100ms - 80ms) before forwarding t2.  
-     * Hence the overall delay between forwarding t1 and t2 remains 100ms.
-     * 
-     * @param <T> tuple type
-     * @param stream the stream to throttle
-     * @param delay Amount of time to delay a tuple.
-     * @param unit Time unit for {@code delay}.
-     * @return the throttled stream
-     */
-    public static <T> TStream<T> blockingThrottle(TStream<T> stream, long delay, TimeUnit unit) {
-        return stream.map( blockingThrottle(delay, unit) );
-    }
-
-    private static <T> Function<T,T> blockingThrottle(long delay, TimeUnit unit) {
-        long[] nextTupleTime = { 0 };
-        return t -> {
-            long now = System.currentTimeMillis();
-            if (nextTupleTime[0] != 0) {
-                if (now < nextTupleTime[0]) {
-                    try {
-                        Thread.sleep(nextTupleTime[0] - now);
-                    } catch (InterruptedException e) {
-                        Thread.currentThread().interrupt();
-                        throw new RuntimeException(e);
-                    }
-                    now = System.currentTimeMillis();
-                }
-            }
-            nextTupleTime[0] = now + unit.toMillis(delay);
-            return t;
-        };
-    }
-    
-    /**
-     * Insert a blocking delay before forwarding the first tuple and
-     * no delay for subsequent tuples.
-     * <p>
-     * Delays less than 1msec are translated to a 0 delay.
-     * <p>
-     * Sample use:
-     * <pre>{@code
-     * TStream<String> stream = topology.strings("a", "b, "c");
-     * // create a stream where the first tuple is delayed by 5 seconds. 
-     * TStream<String> oneShotDelayedStream =
-     *      stream.map( blockingOneShotDelay(5, TimeUnit.SECONDS) );
-     * }</pre>
-     * 
-     * @param <T> tuple type
-     * @param stream input stream
-     * @param delay Amount of time to delay a tuple.
-     * @param unit Time unit for {@code delay}.
-     * @return the delayed stream
-     */
-    public static <T> TStream<T> blockingOneShotDelay(TStream<T> stream, long delay, TimeUnit unit) {
-        return stream.map( blockingOneShotDelay(delay, unit) );
-    }
-
-    private static <T> Function<T,T> blockingOneShotDelay(long delay, TimeUnit unit) {
-        long[] initialDelay = { unit.toMillis(delay) };
-        return t -> {
-            if (initialDelay[0] != -1) {
-                try {
-                    Thread.sleep(initialDelay[0]);
-                } catch (InterruptedException e) {
-                    Thread.currentThread().interrupt();
-                    throw new RuntimeException(e);
-                }
-                initialDelay[0] = -1;
-            }
-            return t;
-            };
-    }
-    
-    /**
-     * Relieve pressure on upstream processing by discarding tuples.
-     * This method ensures that upstream processing is not
-     * constrained by any delay in downstream processing,
-     * for example by a connector not being able to connect
-     * to its external system.
-     * <P>
-     * Any downstream processing of the returned stream is isolated
-     * from {@code stream} so that any slow down does not affect {@code stream}.
-     * When the downstream processing cannot keep up with rate of
-     * {@code stream} tuples will be dropped from returned stream.
-     * <BR>
-     * Up to {@code count} of the most recent tuples per key from {@code stream}
-     * are maintained when downstream processing is slow, any older tuples
-     * that have not been submitted to the returned stream will be discarded.
-     * <BR>
-     * Tuple order is maintained within a partition but is not guaranteed to
-     * be maintained across partitions.
-     * </P>
-     * 
-     * @param stream Stream to be isolated from downstream processing.
-     * @param keyFunction Function defining the key of each tuple.
-     * @param count Maximum number of tuples to maintain when downstream processing is backing up.
-     * @return Stream that is isolated from and thus relieves pressure on {@code stream}.
-     * 
-     * @param <T> Tuple type.
-     * @param <K> Key type.
-     * @see #isolate(TStream, int) isolate
-     */
-    public static <T,K> TStream<T> pressureReliever(TStream<T> stream, Function<T,K> keyFunction, int count) {
-        return stream.pipe(new PressureReliever<>(count, keyFunction));
-    }
-    
-    /**
-     * Isolate upstream processing from downstream processing.
-     * <BR>
-     * Implementations may throw {@code OutOfMemoryExceptions} 
-     * if the processing against returned stream cannot keep up
-     * with the arrival rate of tuples on {@code stream}.
-     *  
-     * @param stream Stream to be isolated from downstream processing.
-     * @param ordered {@code true} to maintain arrival order on the returned stream,
-     * {@code false} to not guaranteed arrival order.
-     * @return Stream that is isolated from {@code stream}.
-     */
-    public static <T> TStream<T> isolate(TStream<T> stream, boolean ordered) {
-        return stream.pipe(
-                ordered ? new Isolate<T>() : new UnorderedIsolate<T>());
-    }
-    
-    /**
-     * Isolate upstream processing from downstream processing.
-     * <P>
-     * If the processing against the returned stream cannot keep up
-     * with the arrival rate of tuples on {@code stream}, upstream
-     * processing will block until there is space in the queue between
-     * the streams.
-     * </P><P>
-     * Processing of tuples occurs in the order they were received.
-     * </P>
-     *  
-     * @param stream Stream to be isolated from downstream processing.
-     * @param queueCapacity size of the queue between {@code stream} and
-     *        the returned stream.
-     * @return Stream that is isolated from {@code stream}.
-     * @see #pressureReliever(TStream, Function, int) pressureReliever
-     */
-    public static <T> TStream<T> isolate(TStream<T> stream, int queueCapacity) {
-      return stream.pipe(new Isolate<T>(queueCapacity));
-    }
-    
-    /**
-     * Perform analytics concurrently.
-     * <P>
-     * This is a convenience function that calls
-     * {@link #concurrent(TStream, List, Function)} after
-     * creating {@code pipeline} and {@code combiner} functions
-     * from the supplied {@code mappers} and {@code combiner} arguments.
-     * </P><P>
-     * That is, it is logically, if not exactly, the same as:
-     * <pre>{@code
-     * List<Function<TStream<T>,TStream<U>>> pipelines = new ArrayList<>();
-     * for (Function<T,U> mapper : mappers)
-     *   pipelines.add(s -> s.map(mapper));
-     * concurrent(stream, pipelines, s -> s.map(combiner));
-     * }</pre>
-     * </P>
-     * 
-     * @param <T> Tuple type on input stream.
-     * @param <U> Tuple type generated by mappers.
-     * @param <R> Tuple type of the result.
-     * 
-     * @param stream input stream
-     * @param mappers functions to be run concurrently.  Each mapper MUST
-     *                 return a non-null result.
-     *                 A runtime error will be generated if a null result
-     *                 is returned.
-     * @param combiner function to create a result tuple from the list of
-     *                 results from {@code mappers}.
-     *                 The input list order is 1:1 with the {@code mappers} list.
-     *                 I.e., list entry [0] is the result from mappers[0],
-     *                 list entry [1] is the result from mappers[1], etc.
-     * @return result stream
-     */
-    public static <T,U,R> TStream<R> concurrentMap(TStream<T> stream, List<Function<T,U>> mappers, Function<List<U>,R> combiner) {
-      Objects.requireNonNull(stream, "stream");
-      Objects.requireNonNull(mappers, "mappers");
-      Objects.requireNonNull(combiner, "combiner");
-      
-      List<Function<TStream<T>,TStream<U>>> pipelines = new ArrayList<>();
-      for (Function<T,U> mapper : mappers) {
-        pipelines.add(s -> s.map(mapper));
-      }
-      
-      return concurrent(stream, pipelines, s -> s.map(combiner));
-    }
-    
-    // Q: is there any value to this implementation approach?  Or just dispose of it?
-    @SuppressWarnings("unused")
-    private static <T,U,R> TStream<R> concurrentMapSingleOp(TStream<T> stream, List<Function<T,U>> mappers, Function<List<U>,R> combiner) {
-      Objects.requireNonNull(stream, "stream");
-      Objects.requireNonNull(mappers, "mappers");
-      Objects.requireNonNull(combiner, "combiner");
-      
-      // INITIAL IMPL TO GET STARTED - validate interface and test
-      // explore an impl with no new oplets
-      //
-      // This is the most lightweight impl possible wrt no intermediate streams
-      // i.e., all of the processing is handled within a single injected map()
-      // 
-      // TODO: want to create ExecutorService using provider's ThreadFactory service.
-      //       Can't get RuntimeServicesSupplier from a stream.
-      //
-      // Note, we impose this "non-null mapper result" requirement so as
-      // to enable alternative implementations that might be burdened if
-      // null results were allowed.
-      // The implementation below could easily handle null results w/o
-      // losing synchronization, with the combiner needing to deal with
-      // a null result in the list it's given.
-      
-      AtomicReference<ExecutorService> executorRef = new AtomicReference<>();
-      
-      return stream.map(tuple -> {
-        if (executorRef.get() == null) {
-          executorRef.compareAndSet(null, Executors.newFixedThreadPool(Math.min(mappers.size(), 20)));
-        }
-        ExecutorService executor = executorRef.get();
-        List<U> results = new ArrayList<>(Collections.nCopies(mappers.size(), null));
-        List<Future<?>> futures = new ArrayList<>(mappers.size());
-
-        // Submit a task for each mapper invocation
-        int ch = 0;
-        for (Function<T,U> mapper : mappers) {
-          final int resultIndx = ch++;
-          Future<?> future = executor.submit(() -> {
-            U result = mapper.apply(tuple);
-            if (result == null)
-              throw new IllegalStateException("mapper index "+resultIndx+" returned null");
-            results.set(resultIndx, result); 
-          });
-          futures.add(future);
-        }
-        // Await completion of all
-        for (Future<?> future : futures) {
-          try {
-            future.get();
-          } catch (InterruptedException e) {
-            Thread.currentThread().interrupt();
-            throw new RuntimeException("mapper interrupted", e);
-          } catch (Exception e) {
-            throw new RuntimeException("mapper threw", e);
-          }
-        }
-        // Run the combiner
-        R result = combiner.apply(results);
-        return result;
-      });
-      
-    }
-
-    /**
-     * Perform analytics concurrently.
-     * <P>
-     * Process input tuples one at at time, invoking the specified
-     * analytics ({@code pipelines}) concurrently, combine the results,
-     * and then process the next input tuple in the same manner.
-     * </P><P>
-     * Logically, instead of doing this:
-     * <pre>{@code
-     * sensorReadings<T> -> A1pipeline -> A2pipeline -> A3pipeline -> results<R>
-     * }</pre>
-     * create a graph that's logically like this:
-     * <pre>{@code
-     * - 
-     *                      |->  A1pipeline  ->|
-     * sensorReadings<T> -> |->  A2pipeline  ->| -> result<R>
-     *                      |->  A3pipeline  ->|
-     * }</pre>
-     * </P><P>
-     * The typical use case for this is when an application has a collection
-     * of independent analytics to perform on each tuple and the analytics
-     * are sufficiently long running such that performing them concurrently
-     * is desired.
-     * </P><P>
-     * Note, this is in contrast to "parallel" stream processing,
-     * which in Java8 Streams and other contexts means processing multiple
-     * tuples in parallel, each on a replicated processing pipeline.
-     * </P><P>
-     * Threadsafety - one of the following must be true:
-     * <ul>
-     * <li>the tuples from {@code stream} are threadsafe</li>
-     * <li>the {@code pipelines} do not modify the input tuples</li>
-     * <li>the {@code pipelines} provide their own synchronization controls
-     *     to protect concurrent modifications of the input tuples</li>
-     * </ul>
-     * </P><P>
-     * Logically, a thread is allocated for each of the {@code pipelines}.
-     * The actual degree of concurrency may be {@link TopologyProvider} dependent.
-     * </P>
-     * 
-     * @param <T> Tuple type on input stream.
-     * @param <U> Tuple type generated by pipelines.
-     * @param <R> Tuple type of the result.
-     * 
-     * @param stream input stream
-     * @param pipelines a list of functions to add a pipeline to the topology.
-     *                 Each {@code pipeline.apply()} is called with {@code stream}
-     *                 as the input, yielding the pipeline's result stream.
-     *                 For each input tuple, a pipeline MUST create exactly one output tuple.
-     *                 Tuple flow into the pipelines will cease if that requirement
-     *                 is not met.
-     * @param combiner a function that creates a result stream from a stream
-     *                 whose tuples are the list of each pipeline's result.
-     *                 The input tuple list's order is 1:1 with the {@code pipelines} list.
-     *                 I.e., list entry [0] is the result from pipelines[0],
-     *                 list entry [1] is the result from pipelines[1], etc.
-     * @return result stream
-     */
-    public static <T,U,R> TStream<R> concurrent(TStream<T> stream, List<Function<TStream<T>,TStream<U>>> pipelines, Function<TStream<List<U>>,TStream<R>> combiner) {
-      Objects.requireNonNull(stream, "stream");
-      Objects.requireNonNull(pipelines, "pipelines");
-      Objects.requireNonNull(combiner, "combiner");
-      
-      // Summary of what's below:
-      //           |-> isolate(1) -> p1 -> |
-      // stream -> |-> isolate(1) -> p2 -> |-> barrier(10) -> combiner 
-      //           |-> isolate(1) -> p3 -> |
-      //                . . .
-
-      int barrierQueueCapacity = 10;  // don't preclude pipelines from getting ahead some.
-      
-      // Add concurrent (isolated) fanouts
-      List<TStream<T>> fanouts = new ArrayList<>(pipelines.size());
-      for (int i = 0; i < pipelines.size(); i++)
-        fanouts.add(isolate(stream, 1).tag("concurrent.isolated-ch"+i));
-      
-      // Add pipelines
-      List<TStream<U>> results = new ArrayList<>(pipelines.size());
-      int ch = 0;
-      for (Function<TStream<T>,TStream<U>> pipeline : pipelines) {
-        results.add(pipeline.apply(fanouts.get(ch)).tag("concurrent-ch"+ch));
-        ch++;
-      }
-      
-      // Add the barrier
-      TStream<List<U>> barrier = barrier(results, barrierQueueCapacity).tag("concurrent.barrier");
-      
-      // Add the combiner
-      return combiner.apply(barrier);
-    }
-
-    /**
-     * A tuple synchronization barrier.
-     * <P>
-     * Same as {@code barrier(others, 1)}
-     * </P>
-     * @see #barrier(List, int)
-     */
-    public static <T> TStream<List<T>> barrier(List<TStream<T>> streams) {
-      return barrier(streams, 1);
-    }
-
-    /**
-     * A tuple synchronization barrier.
-     * <P>
-     * A barrier has n input streams with tuple type {@code T}
-     * and one output stream with tuple type {@code List<T>}.
-     * Once the barrier receives one tuple on each of its input streams,
-     * it generates an output tuple containing one tuple from each input stream.
-     * It then waits until it has received another tuple from each input stream.
-     * </P><P>
-     * Input stream 0's tuple is in the output tuple's list[0],
-     * stream 1's tuple in list[1], and so on.
-     * </P><P>
-     * The barrier's output stream is isolated from the input streams.
-     * </P><P>
-     * The barrier has a queue of size {@code queueCapacity} for each
-     * input stream.  When a tuple for an input stream is received it is
-     * added to its queue.  The stream will block if the queue is full.
-     * </P>
-     *
-     * @param <T> Type of the tuple.
-     * 
-     * @param streams the list of input streams
-     * @param queueCapacity the size of each input stream's queue
-     * @return the output stream
-     * @see Barrier
-     */
-    public static <T> TStream<List<T>> barrier(List<TStream<T>> streams, int queueCapacity) {
-      List<TStream<T>> others = new ArrayList<>(streams);
-      TStream<T> s1 = others.remove(0);
-      return s1.fanin(new Barrier<T>(queueCapacity), others);
-    }
- 
-}
diff --git a/api/topology/src/test/java/org/apache/edgent/test/topology/PlumbingTest.java b/api/topology/src/test/java/org/apache/edgent/test/topology/PlumbingTest.java
index 4a347ed..644ac4f 100644
--- a/api/topology/src/test/java/org/apache/edgent/test/topology/PlumbingTest.java
+++ b/api/topology/src/test/java/org/apache/edgent/test/topology/PlumbingTest.java
@@ -64,7 +64,7 @@
         // delay stream
         starts = PlumbingStreams.blockingDelay(starts, 300, TimeUnit.MILLISECONDS);
         
-        // calculate display
+        // calculate delay
         starts = starts.modify(v -> System.currentTimeMillis() - v);
         
         starts = starts.filter(v -> v >= 300);
@@ -161,67 +161,27 @@
     }
     
     @Test
-    public void testPressureReliever() throws Exception {
-		// Timing variances on shared machines can cause this test to fail
-		assumeTrue(!Boolean.getBoolean("edgent.build.ci"));
+    public void testPressureRelieverDrop() throws Exception {
 
         Topology topology = newTopology();
         
-        TStream<TimeAndId> raw = topology.poll(() -> new TimeAndId(), 10, TimeUnit.MILLISECONDS);
-           
+        // Verify the pressureReliever drops and retains the most recent when
+        // backpressure exists.
+        //
+        // Here, all the tuples hit the reliever at once, the downstream processing (oneShotDelay)
+        // causes a backup causing the reliever's queue to become full and drop tuples.
+        // The first tuple should be processed, then the last (most recent) N (N==queue depth).
         
-        TStream<TimeAndId> pr = PlumbingStreams.pressureReliever(raw, Functions.unpartitioned(), 5);
+        String[] tuples = {"A", "B", "C", "D", "E", "F", "G", "H"};
+        String[] expTuples = {"A", "F", "G", "H"};  // with queue depth of 3
+        TStream<String> raw = topology.strings(tuples);
         
-        // insert a blocking delay acting as downstream operator that cannot keep up
-        TStream<TimeAndId> slow = PlumbingStreams.blockingDelay(pr, 200, TimeUnit.MILLISECONDS);
+        TStream<String> pr = PlumbingStreams.pressureReliever(raw, Functions.unpartitioned(), 3);
         
-        // calculate the delay
-        TStream<TimeAndId> slowM = slow.modify(v -> new TimeAndId(v));
+        TStream<String> pr2 = PlumbingStreams.blockingOneShotDelay(pr, 1, TimeUnit.SECONDS);
         
-        // Also process raw that should be unaffected by the slow path
-        TStream<String> processed = raw.asString();
-        
-        
-        Condition<Long> tcSlowCount = topology.getTester().atLeastTupleCount(slow, 20);
-        Condition<List<TimeAndId>> tcRaw = topology.getTester().streamContents(raw);
-        Condition<List<TimeAndId>> tcSlow = topology.getTester().streamContents(slow);
-        Condition<List<TimeAndId>> tcSlowM = topology.getTester().streamContents(slowM);
-        Condition<List<String>> tcProcessed = topology.getTester().streamContents(processed);
-        complete(topology, tcSlowCount);
-        
-        assertTrue(tcProcessed.getResult().size() > tcSlowM.getResult().size());
-        for (TimeAndId delay : tcSlowM.getResult())
-            assertTrue("delay:"+delay, delay.ms < 300);
-
-        // Must not lose any tuples in the non relieving path
-        Set<TimeAndId> uniq = new HashSet<>(tcRaw.getResult());
-        assertEquals(tcRaw.getResult().size(), uniq.size());
-
-        // Must not lose any tuples in the non relieving path
-        Set<String> uniqProcessed = new HashSet<>(tcProcessed.getResult());
-        assertEquals(tcProcessed.getResult().size(), uniqProcessed.size());
-        
-        assertEquals(uniq.size(), uniqProcessed.size());
-           
-        // Might lose tuples, but must not have send duplicates
-        uniq = new HashSet<>(tcSlow.getResult());
-        assertEquals(tcSlow.getResult().size(), uniq.size());
-    }
-    
-    @Test
-    public void testPressureRelieverWithInitialDelay() throws Exception {
-
-        Topology topology = newTopology();
-        
-        
-        TStream<String> raw = topology.strings("A", "B", "C", "D", "E", "F", "G", "H");
-        
-        TStream<String> pr = PlumbingStreams.pressureReliever(raw, v -> 0, 100);
-        
-        TStream<String> pr2 = PlumbingStreams.blockingOneShotDelay(pr, 5, TimeUnit.SECONDS);
-        
-        Condition<Long> tcCount = topology.getTester().tupleCount(pr2, 8);
-        Condition<List<String>> contents = topology.getTester().streamContents(pr2, "A", "B", "C", "D", "E", "F", "G", "H");
+        Condition<Long> tcCount = topology.getTester().tupleCount(pr2, expTuples.length);
+        Condition<List<String>> contents = topology.getTester().streamContents(pr2, expTuples);
         complete(topology, tcCount);
         
         assertTrue(tcCount.valid());
@@ -229,6 +189,102 @@
     }
     
     @Test
+    public void testPressureRelieverNoDrop() throws Exception {
+
+        Topology topology = newTopology();
+        
+        // Same pipeline config as testPressureRelieverDrop but the reliever queue is
+        // big enough to avoid drops
+        String[] tuples = {"A", "B", "C", "D", "E", "F", "G", "H"};
+        TStream<String> raw = topology.strings(tuples);
+        
+        TStream<String> pr = PlumbingStreams.pressureReliever(raw, Functions.unpartitioned(), 100);
+        
+        TStream<String> pr2 = PlumbingStreams.blockingOneShotDelay(pr, 1, TimeUnit.SECONDS);
+        
+        Condition<Long> tcCount = topology.getTester().tupleCount(pr2, tuples.length);
+        Condition<List<String>> contents = topology.getTester().streamContents(pr2, tuples);
+        complete(topology, tcCount);
+        
+        assertTrue(tcCount.valid());
+        assertTrue(contents.valid());
+    }
+    
+    @Test
+    public void testPressureRelieverContinuous() throws Exception {
+		// Timing variances on shared machines can cause this test to fail
+		//assumeTrue(!Boolean.getBoolean("edgent.build.ci"));
+
+		// Try to verify more continuous reliever behavior instead of just the
+		// the other pressure reliever tests where the backpressure only exists
+		// at the beginning.
+		//
+		// Generate @ 100tps, consume @ 5tps.  
+		// With reliever depth=1, roughly should process every 20th tuple, with essentially
+		// no delay in the queue (certainly less than say 50% of the consumer delay, hence < 0.5 * 200ms)
+		
+        Topology topology = newTopology();
+
+        TStream<TimeAndId> raw = topology.poll(() -> new TimeAndId(), 10, TimeUnit.MILLISECONDS);
+        
+        TStream<TimeAndId> pr = PlumbingStreams.pressureReliever(raw, Functions.unpartitioned(), 1);
+        
+        TStream<TimeAndId> slow = PlumbingStreams.blockingDelay(pr, 200, TimeUnit.MILLISECONDS);
+        
+        // calculate the delay (queue time + consumer processing)
+        TStream<TimeAndId> slowM = slow.modify(v -> new TimeAndId(v));
+        
+        // Also process raw that should be unaffected by the slow path
+        TStream<TimeAndId> processed = raw.filter(t -> true);
+        
+        
+        Condition<Long> tcSlowMCount = topology.getTester().atLeastTupleCount(slowM, 10);
+        Condition<List<TimeAndId>> tcSlowM = topology.getTester().streamContents(slowM);
+        Condition<List<TimeAndId>> tcProcessed = topology.getTester().streamContents(processed);
+        complete(topology, tcSlowMCount);
+        
+        System.out.println(String.format("testPressureRelieverContinuous() fastCnt:%d slowCnt:%d",
+                tcProcessed.getResult().size(), tcSlowM.getResult().size()));
+        System.out.println("slow: "+tcSlowM.getResult());
+
+        // No lost tuples in the fast path (successive Ids, starting @ 1)
+        assertEquals("fastpath tuples dropped",
+                tcProcessed.getResult().size(),
+                tcProcessed.getResult().get(tcProcessed.getResult().size()-1).id);
+
+        // No dup tuples in the fast path
+        Set<TimeAndId> uniqRaw = new HashSet<>(tcProcessed.getResult());
+        assertEquals("fastpath tuples duplicated", tcProcessed.getResult().size(), uniqRaw.size());
+
+        // fastpath count should be roughly 20x the slow delayed/relieved count
+        assertTrue("rawCnt:"+tcProcessed.getResult().size()+" slowMCnt:"+tcSlowM.getResult().size(),
+                tcProcessed.getResult().size() >= 15 * +tcSlowM.getResult().size());
+        
+        // slow should process roughly every 20th tuple... not successive ones
+        TimeAndId prevId = null;
+        for (TimeAndId id : tcSlowM.getResult()) {
+            if (prevId == null) {
+                // should have processed the 1st tuple
+                assertEquals("slow firstId", 1, id.id);
+            }
+            else {
+                // seems like this could be sensitive to host load
+                assertTrue("slow ids prevId:"+prevId+" id:"+id,
+                        id.id >= prevId.id + 15
+                        && id.id <= prevId.id + 25);
+            }
+            prevId = id;
+        }
+        
+        // every slow tuple should be processed near instantaneously - shouldn't wait
+        // long in the queue.
+        for (TimeAndId id : tcSlowM.getResult()) {
+            assertTrue("slow delays prevId:"+prevId+" id:"+id,
+                    id.ms <= 300);  // 200ms consumer processing + up to %50 of that waiting  
+        }
+    }
+    
+    @Test
     public void testValveState() throws Exception {
         Valve<Integer> valve = new Valve<>();
         assertTrue(valve.isOpen());
@@ -561,10 +617,6 @@
     
     @Test
     public void testParallelBalanced() throws Exception {
-        // May need tweak validation sensitivity or add this:
-        // Timing variances on shared machines can cause this test to fail
-        // assumeTrue(!Boolean.getBoolean("edgent.build.ci"));
-
         Topology top = newTopology("testParallelBalanced");
         
         // arrange for even channels to process ~2x as many as odd channels.
@@ -576,6 +628,7 @@
         
         int width = 4;
         int tupCnt = 60;
+        int expEvenChCnt = 2 * (tupCnt / 3);   // even:2/3rds, odd:1/3rd 
         Integer[] resultTuples = new Integer[tupCnt];
         for (int i = 0; i < tupCnt; i++)
           resultTuples[i] = i;
@@ -616,17 +669,19 @@
           assertTrue("expMinSerialDuration="+expMinSerialDuration+" actDuration="+actDuration, 
               actDuration < 0.5 * expMinSerialDuration);
         
-        int evenChCounts = 0;
-        int oddChCounts = 0;
+        // Verify the balancing seemed to work.
+        // On loaded systems we've seen eCnt:37 oCnt:23.  Settle for expEvenCnt +- 15%
+        int thresholdCnt = (int) (expEvenChCnt * 0.15);
+        int evenChCnt = 0;
         for (int ch = 0; ch < width; ch++) {
-          assertTrue(chCounts[ch].get() != 0);
+          assertTrue("ch:"+ch, chCounts[ch].get() != 0);
           if (ch % 2 == 0)
-            evenChCounts += chCounts[ch].get();
-          else
-            oddChCounts += chCounts[ch].get();
+            evenChCnt += chCounts[ch].get();
         }
-        assertTrue(oddChCounts > 0.4 * evenChCounts
-            && oddChCounts < 0.6 * evenChCounts);
+        assertTrue(
+                String.format("evenChCnt:%d expEvenChCnt:%d +-:%d", evenChCnt, expEvenChCnt, thresholdCnt),
+                evenChCnt >= (expEvenChCnt - thresholdCnt)
+                && evenChCnt <= (expEvenChCnt + thresholdCnt)); 
     }
     
 //    @Test
diff --git a/api/topology/src/test/java/org/apache/edgent/test/topology/TStreamTest.java b/api/topology/src/test/java/org/apache/edgent/test/topology/TStreamTest.java
index 7625667..9fae5ed 100644
--- a/api/topology/src/test/java/org/apache/edgent/test/topology/TStreamTest.java
+++ b/api/topology/src/test/java/org/apache/edgent/test/topology/TStreamTest.java
@@ -37,6 +37,7 @@
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
 
 import org.apache.edgent.topology.TSink;
@@ -135,7 +136,7 @@
     /**
      * Test Peek. This will only work with an embedded setup.
      * 
-     * @throws Exception
+     * @throws Exception on failure
      */
     @Test
     public void testPeek() throws Exception {
@@ -600,7 +601,7 @@
     /**
      * Test Union with itself.
      * 
-     * @throws Exception
+     * @throws Exception on failure
      */
     @Test
     public void testUnionWithSelf() throws Exception {
@@ -745,14 +746,26 @@
                 Topology t = newTopology();
                 TStream<String> s = t.strings("a", "b", "c", "d", "e", "f", "g", "h");
                 // Throw on the 8th tuple
-                s.sink((tuple) -> { if ("h".equals(tuple)) throw new RuntimeException("Expected Test Exception");});
+                s.sink((tuple) -> { if ("h".equals(tuple)) throw new RuntimeException("MTWE Expected Test Exception");});
                 // Expect 7 tuples out of 8
                 Condition<Long> tc = t.getTester().tupleCount(s, 7);
-                complete(t, tc);
+//                complete(t, tc);
+                try {
+                    complete(t, tc);
+                } catch (Exception e) {
+                    System.err.println("MTWE complete() threw e:"+e);
+                    throw e;
+                }
                 return true;
             });
         }
-        waitForCompletion(completer, executions);
+//        waitForCompletion(completer, executions);
+        try {
+            waitForCompletion(completer, executions);
+        } catch (Exception e) {
+            System.err.println("MTWE waitForCompletion() threw e:"+e);
+            throw e;
+        }
     }
     
     /**
@@ -762,24 +775,58 @@
     @Test
     public void testMultiTopologyPollWithError() throws Exception {
 
+        /*
+         * It's unclear exactly what this test is supposed to achieve
+         * (hence unclear how to ensure its achieving it).
+         * Is it just trying to verify that a failure in one topology/job
+         * doesn't affect the execution of another?
+         * 
+         * The way the test is written I'm not sure there's any guarantee
+         * that the "Expected Exception" will be generated the appropriate
+         * number of times.
+         * Is it possible the completion condition could get evaluated
+         * true (having seen the 7th tuple) before the 8th tuple is generated
+         * and processed by the sink fn raising the exception, resulting in
+         * the job being closed... before the 8th is generated and processed?
+         * I'm also seeing more "Expected Test Exception" traces than I expected.
+         * 
+         * Annotate this and the MPWE test a bit to help understand what we're seeing
+         * in the output.
+         */
         int executions = 4;
         ExecutorCompletionService<Boolean> completer = new ExecutorCompletionService<>(
                 Executors.newFixedThreadPool(executions));
+        final AtomicInteger excCnt = new AtomicInteger();
         for (int i = 0; i < executions; i++) {
             completer.submit(() -> {
                 Topology t = newTopology();
                 AtomicLong n = new AtomicLong(0);
                 TStream<Long> s = t.poll(() -> n.incrementAndGet(), 10, TimeUnit.MILLISECONDS);
                 // Throw on the 8th tuple
-                s.sink((tuple) -> { if (8 == n.get()) throw new RuntimeException("Expected Test Exception");});
+                s.sink((tuple) -> { if (8 == n.get()) throw new RuntimeException("MTPWE Expected Test Exception # "+excCnt.incrementAndGet());});
                 // Expect 7 tuples out of 8
                 Condition<Long> tc = t.getTester().tupleCount(s, 7);
-                complete(t, tc);
+//              complete(t, tc);
+                try {
+                    complete(t, tc);
+                } catch (Exception e) {
+                    // we're receiving the CancellationException here (and it percolates through waitForCompletion
+                    System.err.println("MTPWE complete() threw e:"+e);
+                    e.printStackTrace();
+                    throw e;
+                }
                 return true;
             });
         }
-        waitForCompletion(completer, executions);
-    }
+//      waitForCompletion(completer, executions);
+        try {
+            waitForCompletion(completer, executions);
+        } catch (Exception e) {
+            System.err.println("MTPWE waitForCompletion() threw e:"+e);
+            e.printStackTrace();
+            throw e;
+        }
+   }
     
     @Test
     public void testJoinWithWindow() throws Exception{
@@ -853,15 +900,29 @@
         Condition<Long> tc = t.getTester().tupleCount(joinsHappened, 100);
         complete(t, tc);      
     }
+    
+    private static long getTimeoutValue(long timeout, TimeUnit units) {
+        // try to protect the tests from timing out prematurely
+        // in the face of overloaded/slow build/test servers.
+        if (Boolean.getBoolean("edgent.build.ci")) {
+            // could do something like base the decision of the current value of timeout and/or units
+            return timeout * 2;  // try to minimize
+        }
+        return timeout;
+    }
 
     private void waitForCompletion(ExecutorCompletionService<Boolean> completer, int numtasks) throws ExecutionException {
         int remainingTasks = numtasks;
+        long getFutureTimeout = 4;
+        TimeUnit getFutureTimeoutUnits = TimeUnit.SECONDS;
+        getFutureTimeout = getTimeoutValue(getFutureTimeout, getFutureTimeoutUnits);
         while (remainingTasks > 0) {
             try {
-                Future<Boolean> completed = completer.poll(4, TimeUnit.SECONDS);
+                Future<Boolean> completed = completer.poll(getFutureTimeout, getFutureTimeoutUnits);
                 if (completed == null) {
-                    System.err.println("Completer timed out");
-                    throw new RuntimeException(new TimeoutException());
+                    String msg = String.format("Completer timed out: %d%s timeout", getFutureTimeout, getFutureTimeoutUnits.toString());
+                    System.err.println(msg);
+                    throw new RuntimeException(new TimeoutException(msg));
                 }
                 else {
                     completed.get();
diff --git a/api/topology/src/test/java/org/apache/edgent/test/topology/TopologyTest.java b/api/topology/src/test/java/org/apache/edgent/test/topology/TopologyTest.java
index cc1c059..033baa9 100644
--- a/api/topology/src/test/java/org/apache/edgent/test/topology/TopologyTest.java
+++ b/api/topology/src/test/java/org/apache/edgent/test/topology/TopologyTest.java
@@ -134,23 +134,23 @@
             job = jf.get();
             assertEquals(Job.State.RUNNING, job.getCurrentState());
             
-            setPollFrequency(s, 100, TimeUnit.MILLISECONDS);
+            setPollFrequency(s, 10, TimeUnit.MILLISECONDS);
             cnt.set(0);
-            Thread.sleep(TimeUnit.SECONDS.toMillis(3));
+            Thread.sleep(TimeUnit.SECONDS.toMillis(1));
             int curCnt = cnt.get();
-            assertTrue("curCnt="+curCnt, curCnt >= 20);
-            
-            setPollFrequency(s, 1, TimeUnit.SECONDS);
-            cnt.set(0);
-            Thread.sleep(TimeUnit.SECONDS.toMillis(3));
-            curCnt = cnt.get();
-            assertTrue("curCnt="+curCnt, curCnt >= 2 && curCnt <= 4);
+            assertTrue("curCnt="+curCnt, curCnt >= 70);
             
             setPollFrequency(s, 100, TimeUnit.MILLISECONDS);
             cnt.set(0);
-            Thread.sleep(TimeUnit.SECONDS.toMillis(3));
+            Thread.sleep(TimeUnit.SECONDS.toMillis(1));
             curCnt = cnt.get();
-            assertTrue("curCnt="+curCnt, curCnt >= 20);
+            assertTrue("curCnt="+curCnt, curCnt >= 5 && curCnt <= 20);
+            
+            setPollFrequency(s, 10, TimeUnit.MILLISECONDS);
+            cnt.set(0);
+            Thread.sleep(TimeUnit.SECONDS.toMillis(1));
+            curCnt = cnt.get();
+            assertTrue("curCnt="+curCnt, curCnt >= 70);
         }
         finally {
             if (job != null)
diff --git a/api/window/build.gradle b/api/window/build.gradle
deleted file mode 100644
index 19b441d..0000000
--- a/api/window/build.gradle
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-dependencies {
-  addTargetDirProjectJarDependency 'compile', ':api:function'
-  addTargetDirCoreExtJarDependencies 'compile'
-
-  // N.B. root project adds test common dependencies
-}
diff --git a/api/window/pom.xml b/api/window/pom.xml
new file mode 100644
index 0000000..0f44025
--- /dev/null
+++ b/api/window/pom.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-api</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-api-window</artifactId>
+
+  <name>Apache Edgent (Java 8): API: Window</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-function</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/api/window/src/test/java/org/apache/edgent/test/window/WindowTest.java b/api/window/src/test/java/org/apache/edgent/test/window/WindowTest.java
index 45d4c61..98f04ea 100644
--- a/api/window/src/test/java/org/apache/edgent/test/window/WindowTest.java
+++ b/api/window/src/test/java/org/apache/edgent/test/window/WindowTest.java
@@ -20,6 +20,7 @@
 
 import static org.apache.edgent.function.Functions.unpartitioned;
 import static org.apache.edgent.window.Policies.alwaysInsert;
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assume.assumeTrue;
 
@@ -35,6 +36,7 @@
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.ScheduledThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.edgent.function.BiConsumer;
 import org.apache.edgent.window.InsertionTimeList;
@@ -293,7 +295,7 @@
         
         window.registerScheduledExecutorService(new ScheduledThreadPoolExecutor(5));
         
-        long endTime = System.currentTimeMillis() + 8000;
+        long endTime = System.currentTimeMillis() + 4000;
         List<Thread> threads = new ArrayList<>();
         int NUM_THREADS = 10;
         // Create 10 threads. Each inserts at 1,000 Hz
@@ -375,7 +377,7 @@
             window.insert(1);
         }, 0, 10, TimeUnit.MILLISECONDS);
 
-        Thread.sleep(11000);
+        Thread.sleep(4000);
         sf.cancel(true);
         double tolerance = .08;
         for(int i = 0; i < numBatches.size(); i++){
@@ -415,7 +417,7 @@
         		window.insert(i);
         }, 0, 1, TimeUnit.MILLISECONDS);
 
-        Thread.sleep(11000);
+        Thread.sleep(4000);
         sf.cancel(true);
         try {
           sf.get();
@@ -457,19 +459,22 @@
         
         window.registerScheduledExecutorService(new ScheduledThreadPoolExecutor(5));
 
+        AtomicInteger count = new AtomicInteger();
+        int MAX_TUP_CNT = 300;
         ScheduledFuture<?> sf = ses.scheduleAtFixedRate(new Runnable(){
-            private int count = 0;
             @Override
             public void run() {
-                if(count < 1000){
-                    window.insert(count++);
+                if(count.get() < MAX_TUP_CNT){
+                    window.insert(count.incrementAndGet());
                 }
             }
             
         }, 0, 10, TimeUnit.MILLISECONDS);
 
-        Thread.sleep(11000);
+        long insertMsec = MAX_TUP_CNT * 10 /*10msec/tup*/;
+        Thread.sleep(insertMsec + 1000/*extra sec*/);
         sf.cancel(true);
+        assertEquals("Invalid test", MAX_TUP_CNT, count.get());
         int numTuples = 0;
         for(int i = 0; i < batches.size() - 1; i++){
             List<Integer> batch = batches.get(i);
@@ -480,7 +485,9 @@
         }
         
         numTuples += batches.get(batches.size() -1).size();
-        assertTrue("Number of tuples submitted (1000) != number of tuples processed in batch (" + numTuples + ")", numTuples == 1000);
+        assertEquals("Number of batch tuples", count.get(), numTuples);
+        assertTrue("Number of batches exp:"+MAX_TUP_CNT/100+" got:"+batches.size(),
+                withinToleranceAmt((double)MAX_TUP_CNT/100, (double)batches.size(), 1)); // +/- 1
     }
     
     private void assertOnTimeEvictions(List<Long> diffs) {
@@ -497,4 +504,10 @@
         return (actual < highBound && actual > lowBound);
     }
 
+    public static boolean withinToleranceAmt(double expected, Double actual, double toleranceAmt) {
+        double lowBound = expected - toleranceAmt;
+        double highBound = expected + toleranceAmt;
+        return (actual <= highBound && actual >= lowBound);
+    }
+
 }
diff --git a/apps/.classpath b/apps/.classpath
deleted file mode 100644
index a639293..0000000
--- a/apps/.classpath
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="iot/src/main/java"/>
-	<classpathentry kind="src" path="iot/src/test/java"/>
-    <classpathentry kind="src" path="runtime/src/main/java"/>
-    <classpathentry kind="src" path="runtime/src/test/java"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/ext"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/api"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/connectors"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/providers"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/spi"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/runtime"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/apps/.project b/apps/.project
deleted file mode 100644
index 142fc54..0000000
--- a/apps/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>apps</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/apps/iot/build.gradle b/apps/iot/build.gradle
deleted file mode 100644
index 0242187..0000000
--- a/apps/iot/build.gradle
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-dependencies {
-  addTargetDirProjectJarDependency 'compile', ':api:topology'
-  addTargetDirProjectJarDependency 'compile', ':connectors:pubsub'
-  addTargetDirProjectJarDependency 'compile', ':connectors:iot'
-  
-  addTargetDirProjectJarDependency 'testCompile', ':providers:direct'
-  // N.B. root project adds test common dependencies
-}
diff --git a/apps/iot/pom.xml b/apps/iot/pom.xml
new file mode 100644
index 0000000..116117f
--- /dev/null
+++ b/apps/iot/pom.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-apps</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-apps-iot</artifactId>
+
+  <name>Apache Edgent (Java 8): Apps: IoT</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-connectors-iot</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-connectors-pubsub</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/apps/pom.xml b/apps/pom.xml
new file mode 100644
index 0000000..8c83e22
--- /dev/null
+++ b/apps/pom.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-parent</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-apps</artifactId>
+  <packaging>pom</packaging>
+
+  <name>Apache Edgent (Java 8): Apps</name>
+
+  <modules>
+    <module>iot</module>
+    <module>runtime</module>
+  </modules>
+
+</project>
diff --git a/apps/runtime/build.gradle b/apps/runtime/build.gradle
deleted file mode 100644
index fefbe85..0000000
--- a/apps/runtime/build.gradle
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-dependencies {
-  addTargetDirProjectJarDependency 'compile', ':api:topology'
-  addTargetDirProjectJarDependency 'compile', ':runtime:jobregistry'
-  addTargetDirProjectJarDependency 'compile', ':runtime:appservice'
-  
-  addTargetDirProjectJarDependency 'testCompile', ':providers:direct'
-  addTargetDirProjectJarDependency 'testCompile', ':runtime:jmxcontrol'
-  // N.B. root project adds test common dependencies
-}
diff --git a/apps/runtime/pom.xml b/apps/runtime/pom.xml
new file mode 100644
index 0000000..bcbbd86
--- /dev/null
+++ b/apps/runtime/pom.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-apps</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-apps-runtime</artifactId>
+
+  <name>Apache Edgent (Java 8): Apps: Runtime</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-runtime-jobregistry</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-runtime-jmxcontrol</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/apps/runtime/src/main/java/org/apache/edgent/apps/runtime/JobMonitorApp.java b/apps/runtime/src/main/java/org/apache/edgent/apps/runtime/JobMonitorApp.java
index 2a90cc1..afe9575 100644
--- a/apps/runtime/src/main/java/org/apache/edgent/apps/runtime/JobMonitorApp.java
+++ b/apps/runtime/src/main/java/org/apache/edgent/apps/runtime/JobMonitorApp.java
@@ -160,7 +160,7 @@
             // Wait for the job to complete
             long startWaiting = System.currentTimeMillis();
             for (long waitForMillis = Controls.JOB_HOLD_AFTER_CLOSE_SECS * 1000;
-                    waitForMillis < 0;
+                    waitForMillis >= 0;
                     waitForMillis -= 100) {
                 if (jobMbean.getCurrentState() == Job.State.CLOSED)
                     break;
diff --git a/binary-release/LICENSE b/binary-release/LICENSE
deleted file mode 100644
index 39e4bcd..0000000
--- a/binary-release/LICENSE
+++ /dev/null
@@ -1,401 +0,0 @@
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "{}"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright {yyyy} {name of copyright owner}
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
-======================================
-APACHE EDGENT SUBCOMPONENTS:
-
-This Apache Edgent binary release includes a number of subcomponents with
-separate copyright notices and license terms.  Your use of these
-components is subject to the terms and conditions of the following licenses.
-
-The binary release includes some binary content with associated
-Eclipse Public License ("EPL-1.0") and 
-Common Development and Distribution License ("CDDL-1.0" and CDDL-1.1")
-licenses as noted below.
-
---------------------------------
-ext/    # common dependencies for all Edgent components
-  gson-2.2.4.jar                    com.google.code.gson:gson:2.2.4
-        LICENSE: AL-2.0             For details, see licenses/binary-release/gson-2.2.4.AL-2.0
-        
-  metrics-core-3.1.2.jar            io.dropwizard.metrics:metrics-core:3.1.2
-        LICENSE: AL-2.0             For details, see licenses/binary-release/metrics-core-3.1.2.AL-2.0
-        
-  slf4j-api-1.7.12.jar              org.slf4j:slf4j-api:1.7.12
-  slf4j-jdk14-1.7.12.jar
-        LICENSE: MIT                For details, see licenses/binary-release/slf4j-1.7.12.MIT
-
---------------------------------
-analytics/math3/ext/
-  commons-math3-3.4.1.jar           org.apache.commons:commons-math3:3.4.1
-        LICENSE: AL-2.0             For details, see licenses/binary-release/commons-math3-3.4.1.AL-2.0
-
---------------------------------
-connectors/http/ext
-  httpclient-4.5.1.jar              org.apache.httpcomponents:httpclient:4.5.1
-        LICENSE: AL-2.0             For details, see licenses/binary-release/httpclient-4.5.1.AL-2.0
-        
-  httpcore-4.4.4.jar                org.apache.httpcomponents:httpcore:4.4.4
-        LICENSE: AL-2.0             For details, see licenses/binary-release/httpcore-4.4.4.AL-2.0
-        
-  commons-codec-1.9.jar             org.apache.commons:commons-codec:1.9
-        LICENSE: AL-2.0             For details, see licenses/binary-release/commons-codec-1.9.AL-2.0
-        
-  commons-logging-1.2.jar           org.apache.commons:commons-logging:1.2
-        LICENSE: AL-2.0             For details, see licenses/binary-release/commons-logging-1.2.AL-2.0
-        
---------------------------------
-connectors/iotp/ext
-  watson-iot-0.2.2.jar              com.ibm.messaging:watson-iot:0.2.2
-        LICENSE: EPL-1.0            For details, see licenses/binary-release/watson-iot-0.2.2.EPL-1.0
-                                    Only binary form content is included.
-                                    https://mvnrepository.com/artifact/com.ibm.messaging/watson-iot/0.2.2
-        
-  commons-codec-1.10.jar            org.apache.commons:commons-codec:1.10
-        LICENSE: AL-2.0             For details, see licenses/binary-release/commons-codec-1.10.AL-2.0
-        
-  commons-lang3-3.4.jar             org.apache.commons:commons-lang3:3.4
-        LICENSE: AL-2.0             For details, see licenses/binary-release/commons-lang3-3.4.AL-2.0
-        
-  commons-logging-1.2.jar           org.apache.commons:commons-logging:1.2
-        LICENSE: AL-2.0             For details, see licenses/binary-release/commons-logging-1.2.AL-2.0
-        
-  commons-net-3.3.jar               org.apache.commons:commons-net:3.3
-        LICENSE: AL-2.0             For details, see licenses/binary-release/commons-net-3.3.AL-2.0
-        
-  gson-2.6.1.jar                    com.google.code.gson:gson:2.6.1
-        LICENSE: AL-2.0             For details, see licenses/binary-release/gson-2.6.1.AL-2.0
-        
-  httpclient-4.5.1.jar              org.apache.httpcomponents:httpclient:4.5.1
-        LICENSE: AL-2.0             For details, see licenses/binary-release/httpclient-4.5.1.AL-2.0
-        
-  httpcore-4.4.3.jar                org.apache.httpcomponents:httpcore:4.4.3
-        LICENSE: AL-2.0             For details, see licenses/binary-release/httpcore-4.4.3.AL-2.0
-        
-  joda-time-2.9.2.jar               joda-time:joda-time:2.9.2
-        LICENSE: AL-2.0             For details, see licenses/binary-release/joda-time-2.9.2.AL-2.0
-        
-  log4j-1.2.17.jar                  log4j:log4j:1.2.17
-        LICENSE: AL-2.0             For details, see licenses/binary-release/log4j-1.2.17.AL-2.0
-        
-  org.eclipse.paho.client.mqttv3-1.1.0.jar  org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0
-        LICENSE: EDL-1.0            For details, see licenses/binary-release/mqttv3-1.1.0.EDL-1.0
-        
---------------------------------
-connectors/kafka/ext
-  kafka-clients-0.8.2.2.jar         org.apache.kafka:kafka-clients:0.8.2.2
-        LICENSE: AL-2.0             For details, see licenses/binary-release/kafka-clients-0.8.2.2.AL-2.0
-        
-  kafka_2.10-0.8.2.2.jar            org.apache.kafka:kafka_2.10:0.8.2.2
-        LICENSE: AL-2.0             For details, see licenses/binary-release/kafka-2.10-0.8.2.2.AL-2.0
-        
-  log4j-1.2.16.jar                  log4j:log4j:1.2.16
-        LICENSE: AL-2.0             For details, see licenses/binary-release/log4j-1.2.16.AL-2.0
-        
-  metrics-core-2.2.0.jar            com.yammer.metrics:metrics-core:2.2.0
-        LICENSE: AL-2.0             For details, see licenses/binary-release/metrics-core-2.2.0.AL-2.0
-        
-  scala-library-2.10.4.jar          org.scala-lang:scala-library:2.10.4
-        LICENSE: BSD                For details, see licenses/binary-release/scala-library-2.10.4.BSD
-        
-  zkclient-0.3.jar                  com.101tec:zkclient:0.3
-        LICENSE: AL-2.0             For details, see licenses/binary-release/zkclient-0.3.AL-2.0
-        
-  zookeeper-3.4.6.jar               org.apache.zookeeper:zookeeper:3.4.6
-        LICENSE: AL-2.0             For details, see licenses/binary-release/zookeeper-3.4.6.AL-2.0
-
---------------------------------
-connectors/mqtt/ext
-  org.eclipse.paho.client.mqttv3-1.1.0.jar  org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0
-        LICENSE: EDL-1.0            For details, see licenses/binary-release/mqttv3-1.1.0.EDL-1.0
-
---------------------------------
-connectors/edgent.javax.websocket/ext
-  javax.websocket-api-1.0.jar       javax.websocket:javax.websocket-api:1.0
-        LICENSE: CDDL-1.1           For details, see licenses/binary-release/javax.websocket-api-1.0.CDDL-1.1
-                                    Only binary form content is included.
-                                    https://mvnrepository.com/artifact/javax.websocket/javax.websocket-api/1.0
-
---------------------------------
-connectors/javax.websocket-client/ext
-  javax-websocket-client-impl-9.3.6.v20151106.jar  org.eclipse.jetty.websocket:javax-websocket-client-impl:9.3.6.v20151106
-        LICENSE: AL-2.0               For details, see licenses/binary-release/javax-websocket-client-impl-9.3.6.AL-2.0
-        
-  javax.websocket-api-1.0.jar         javax.websocket:javax.websocket-api:1.0
-        LICENSE: CDDL-1.1             For details, see licenses/binary-release/javax.websocket-api-1.0.CDDL-1.1
-                                      Only binary form content is included.
-                                      https://mvnrepository.com/artifact/javax.websocket/javax.websocket-api/1.0
-        
-  jetty-io-9.3.6.v20151106.jar        org.eclipse.jetty.websocket:javax-websocket-client-impl:9.3.6.v20151106
-        LICENSE: AL-2.0               For details, see licenses/binary-release/jetty-io-9.3.6.AL-2.0
-        
-  jetty-util-9.3.6.v20151106.jar      org.eclipse.jetty.websocket:javax-websocket-client-impl:9.3.6.v20151106              
-        LICENSE: AL-2.0               For details, see licenses/binary-release/jetty-util-9.3.6.AL-2.0
-        
-  websocket-api-9.3.6.v20151106.jar   org.eclipse.jetty.websocket:javax-websocket-client-impl:9.3.6.v20151106
-        LICENSE: AL-2.0               For details, see licenses/binary-release/websocket-api-9.3.6.AL-2.0
-        
-  websocket-client-9.3.6.v20151106.jar  org.eclipse.jetty.websocket:javax-websocket-client-impl:9.3.6.v20151106
-        LICENSE: AL-2.0               For details, see licenses/binary-release/websocket-client-9.3.6.AL-2.0
-        
-  websocket-common-9.3.6.v20151106.jar  org.eclipse.jetty.websocket:javax-websocket-client-impl:9.3.6.v20151106
-        LICENSE: AL-2.0               For details, see licenses/binary-release/websocket-common-9.3.6.AL-2.0
-
---------------------------------
-console/server/ext
-  javax.servlet-api-3.1.0.jar        javax.servlet:javax.servlet-api:3.1.0
-        LICENSE: CDDL-1.0            For details, see licenses/binary-release/javax.servlet-api-3.1.0.CDDL-1.0
-                                     Only binary form content is included.
-                                     https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api/3.1.0
-        
-  jetty-http-9.3.6.v20151106.jar     org.eclipse.jetty:jetty-http:9.3.6.v20151106
-        LICENSE: AL-2.0              For details, see licenses/binary-release/jetty-http-9.3.6.AL-2.0
-        
-  jetty-io-9.3.6.v20151106.jar       org.eclipse.jetty:jetty-io:9.3.6.v20151106
-        LICENSE: AL-2.0              For details, see licenses/binary-release/jetty-io-9.3.6.AL-2.0
-        
-  jetty-security-9.3.6.v20151106.jar org.eclipse.jetty:jetty-security:9.3.6.v20151106
-        LICENSE: AL-2.0              For details, see licenses/binary-release/jetty-security-9.3.6.AL-2.0
-        
-  jetty-server-9.3.6.v20151106.jar   org.eclipse.jetty:jetty-server:9.3.6.v20151106
-        LICENSE: AL-2.0              For details, see licenses/binary-release/jetty-server-9.3.6.AL-2.0
-        
-  jetty-servlet-9.3.6.v20151106.jar  org.eclipse.jetty:jetty-servlet:9.3.6.v20151106
-        LICENSE: AL-2.0              For details, see licenses/binary-release/jetty-servlet-9.3.6.AL-2.0
-        
-  jetty-util-9.3.6.v20151106.jar     org.eclipse.jetty:jetty-util:9.3.6.v20151106
-        LICENSE: AL-2.0              For details, see licenses/binary-release/jetty-util-9.3.6.AL-2.0
-        
-  jetty-webapp-9.3.6.v20151106.jar   org.eclipse.jetty:jetty-webapp:9.3.6.v20151106
-        LICENSE: AL-2.0              For details, see licenses/binary-release/jetty-webapp-9.3.6.AL-2.0
-        
-  jetty-xml-9.3.6.v20151106.jar      org.eclipse.jetty:jetty-xml:9.3.6.v20151106
-        LICENSE: AL-2.0              For details, see licenses/binary-release/jetty-xml-9.3.6.AL-2.0
-  
---------------------------------
-console/servlets/ext
-  javax.servlet-api-3.1.0.jar        javax.servlet:javax.servlet-api:3.1.0
-        LICENSE: CDDL-1.0            For details, see licenses/binary-release/javax.servlet-api-3.1.0.CDDL-1.0
-                                     https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api/3.1.0
-
---------------------------------
-console/webapps
-  console.war
-        The file bundles d3-legend which is available under a MIT license.
-        For details, see licenses/d3-legend.MIT
-
-        The file bundles portions of d3 which is available under a BSD license.
-        For details, see licenses/d3.BSD
-
-        The file bundles portions of d3-sankey which is available under a BSD license.
-        For details, see licenses/d3-sankey.BSD
- 
-        The file bundles portions of jquery-ui which is available under a MIT license.
-        For details, see licenses/jquery-ui.MIT
- 
-        The bundled jquery-ui bundles jquery which is available under a MIT license.
-        For details, see licenses/jquery.MIT
-    
-        The bundled jquery bundles Sizzle which is available under a MIT license.
-        For details, see licenses/sizzle.MIT
-    
---------------------------------
diff --git a/binary-release/NOTICE b/binary-release/NOTICE
deleted file mode 100644
index 48d09e1..0000000
--- a/binary-release/NOTICE
+++ /dev/null
@@ -1,85 +0,0 @@
-Apache Edgent
-Copyright 2016-2017 The Apache Software Foundation
-
-Apache Edgent is currently undergoing Incubation at the Apache Software Foundation.
-
-This bundle includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-===============================================================================
-
-Portions of this bundle were developed by IBM Corp.
-Copyright IBM Corp. 2015, 2016
-
-===============================================================================
-
-APACHE EDGENT SUBCOMPONENTS:
-
-This Apache Edgent binary release includes a number of subcomponents with
-separate copyright notices and license terms.  The following notices apply.
-
---------------------------------
-ext/    # common dependencies for all Edgent components
-  metrics-core-3.1.2.jar            io.dropwizard.metrics:metrics-core:3.1.2
-                                    See licenses/binary-release/metrics-core-3.1.2.NOTICE
-
---------------------------------
-analytics/math3/ext/
-  commons-math3-3.4.1.jar           org.apache.commons:commons-math3:3.4.1
-                                    See licenses/binary-release/commons-math3-3.4.1.NOTICE
-
---------------------------------
-connectors/http/ext
-  httpclient-4.5.1.jar              org.apache.httpcomponents:httpclient:4.5.1
-                                    See licenses/binary-release/httpclient-4.5.1.NOTICE
-                                    
-  httpcore-4.4.4.jar                org.apache.httpcomponents:httpcore:4.4.4
-                                    See licenses/binary-release/httpcore-4.4.4.NOTICE
-                                    
-  commons-codec-1.9.jar             org.apache.commons:commons-codec:1.9
-                                    See licenses/binary-release/commons-codec-1.9.NOTICE
-                                    
-  commons-logging-1.2.jar           org.apache.commons:commons-logging:1.2
-                                    See licenses/binary-release/commons-logging-1.2.NOTICE
-        
---------------------------------
-connectors/iotp/ext
-  commons-codec-1.10.jar            org.apache.commons:commons-codec:1.10
-                                    See licenses/binary-release/commons-codec-1.10.NOTICE
-                                    
-  commons-lang3-3.4.jar             org.apache.commons:commons-lang3:3.4
-                                    See licenses/binary-release/commons-lang3-3.4.NOTICE
-                                    
-  commons-logging-1.2.jar           org.apache.commons:commons-logging:1.2
-                                    See licenses/binary-release/commons-logging-1.2.NOTICE
-                                    
-  commons-net-3.3.jar               org.apache.commons:commons-net:3.3
-                                    See licenses/binary-release/commons-net-3.3.NOTICE
-                                    
-  httpclient-4.5.1.jar              org.apache.httpcomponents:httpclient:4.5.1
-                                    See licenses/binary-release/httpclient-4.5.1.NOTICE
-                                    
-  httpcore-4.4.3.jar                org.apache.httpcomponents:httpcore:4.4.3
-                                    See licenses/binary-release/httpcore-4.4.3.NOTICE
-                                    
-  joda-time-2.9.2.jar               joda-time:joda-time:2.9.2
-                                    See licenses/binary-release/joda-time-2.9.2.NOTICE
-                                    
-  log4j-1.2.17.jar                  log4j:log4j:1.2.17
-                                    See licenses/binary-release/log4j-1.2.17.NOTICE
-        
---------------------------------
-connectors/kafka/ext
-  kafka-clients-0.8.2.2.jar         org.apache.kafka:kafka-clients:0.8.2.2
-                                    See licenses/binary-release/kafka-clients-0.8.2.2.NOTICE
-                                    
-  kafka_2.10-0.8.2.2.jar            org.apache.kafka:kafka_2.10:0.8.2.2
-                                    See licenses/binary-release/kafka_2.10-0.8.2.2.NOTICE
-                                    
-  log4j-1.2.16.jar                  log4j:log4j:1.2.16
-                                    See licenses/binary-release/log4j-1.2.16.NOTICE
-                                    
-  metrics-core-2.2.0.jar            com.yammer.metrics:metrics-core:2.2.0
-                                    See licenses/binary-release/metrics-core-2.2.0.NOTICE
-    
---------------------------------
-    
\ No newline at end of file
diff --git a/binary-release/README b/binary-release/README
deleted file mode 100644
index aae76d3..0000000
--- a/binary-release/README
+++ /dev/null
@@ -1,21 +0,0 @@
-Using an Apache Edgent binary release bundle
-
-Apache Edgent is supported on several Java target platforms.
-For more information see JAVA_SUPPORT.md 
-
-See Getting Started https://edgent.apache.org/docs/edgent-getting-started for
-information about using this binary release to develop applications that
-use Edgent.
-
-Apache Edgent is released under the Apache License Version 2.0.
-This Apache Edgent binary release includes a number of subcomponents with
-separate copyright notices and license terms. It includes some binary content
-with associated EPL and CDDL licenses.  See LICENSE for details.
-
-Apache Edgent is an effort undergoing incubation at The Apache Software Foundation (ASF),
-sponsored by the Incubator PMC. Incubation is required of all newly accepted
-projects until a further review indicates that the infrastructure, communications,
-and decision making process have stabilized in a manner consistent with other
-successful ASF projects. While incubation status is not necessarily a reflection
-of the completeness or stability of the code, it does indicate that the project
-has yet to be fully endorsed by the ASF.
diff --git a/binary-release/apache-notice b/binary-release/apache-notice
deleted file mode 100644
index 2684968..0000000
--- a/binary-release/apache-notice
+++ /dev/null
@@ -1,8 +0,0 @@
-Apache Edgent
-Copyright 2016 The Apache Software Foundation
-
-Apache Edgent is currently undergoing Incubation at the Apache Software Foundation.
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-===============================================================================
diff --git a/binary-release/apache-v2_0-license b/binary-release/apache-v2_0-license
deleted file mode 100644
index 8dada3e..0000000
--- a/binary-release/apache-v2_0-license
+++ /dev/null
@@ -1,201 +0,0 @@
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "{}"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright {yyyy} {name of copyright owner}
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff --git a/binary-release/ibm-contrib-notice b/binary-release/ibm-contrib-notice
deleted file mode 100644
index 9ddbaa5..0000000
--- a/binary-release/ibm-contrib-notice
+++ /dev/null
@@ -1,11 +0,0 @@
-Apache Edgent
-Copyright 2016 The Apache Software Foundation
-
-Apache Edgent is currently undergoing Incubation at the Apache Software Foundation.
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-===============================================================================
-
-Portions of this software were developed by IBM Corp.
-Copyright IBM Corp. 2015, 2016
diff --git a/build.gradle b/build.gradle
deleted file mode 100644
index 450a54c..0000000
--- a/build.gradle
+++ /dev/null
@@ -1,930 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
- 
-apply from: 'gradle/wrapper.gradle'
-apply from: 'gradle/other.gradle'
-
-import org.gradle.plugins.signing.Sign
-import java.io.Console
- 
-/* Configure root project */
-allprojects {
-  apply plugin: 'idea'
-  apply plugin: 'eclipse'
-
-  repositories {
-    mavenCentral()
-  }
-  
-  project.version = build_version
-}
-
-apply from: 'gradle/rat.gradle'
-
-rat {
-  excludes = [
-    '*.patch',
-    '**/.classpath',
-    '**/.cache/**',
-    '**/.git/**',
-    '**/.gitignore',
-    '**/.gradle/**',
-    '.gradle-wrapper/**',  // historical instead of gradle/wrapper
-    '**/.idea/**',
-    '**/.project',
-    '**/.settings/**',
-    '**/bin/**',           // generated by Eclipse builds
-    '**/build/**',
-    '**/META-INF/services/**',
-    '**/README.md',
-    'externalJars/**',     // generated by setupExternalJars for Eclipse use
-    'gradlew',
-    'gradlew.bat',
-    'DEVELOPMENT.md',
-    'JAVA_SUPPORT.md',
-    'CONTRIBUTORS', '.mailmap',
-    'binary-release/apache-notice',
-    'binary-release/ibm-contrib-notice',
-    'connectors/jdbc/JdbcStreamsTestDb/**',
-    'connectors/jdbc/derby.log',
-    'connectors/mqtt/src/test/keystores/**',
-    'console/**/js/ext/**/jquery.js',         // has header w/MIT license ref
-    'console/**/js/ext/**/jquery-ui.min.css', // has header w/MIT license ref
-    'console/**/js/ext/**/jquery-ui.min.js',  // has header w/MIT license ref
-    'console/**/js/ext/**/jquery-ui.structure.min.css', // has header w/MIT license ref
-    'console/**/js/ext/**/jquery-ui.theme.min.css', // has header w/MIT license ref
-    'console/**/js/ext/d3.legend.js',         // has header w/MIT license ref
-    'console/**/js/ext/d3.min.js',            // no header. included in LICENSE
-    'console/**/js/ext/sankey_edgent.js',     // no header. included in LICENSE
-    'licenses/d3-sankey.BSD',                 // OK, BSD 3-clause
-    'licenses/d3.BSD',                        // OK, BSD 3-clause
-    'licenses/binary-release/javax.servlet-api-3.1.0.CDDL-1.0',  // OK, only binary form content
-    'licenses/binary-release/javax.websocket-api-1.0.CDDL-1.1',  // OK, only binary form content
-    'licenses/binary-release/mqttv3-1.1.0.EDL-1.0',  // OK, EDL-1.0
-    'licenses/binary-release/mqttv3-1.1.0.EDL-1.0',  // OK, EDL-1.0
-    'licenses/binary-release/watson-iot-0.2.2.EPL-1.0',  // OK, only binary form content
-    'samples/**/*.properties',
-    'samples/**/*.cfg',
-    'scripts/**/*.properties',
-    'scripts/**/*.cfg',
-    'scripts/connectors/jdbc/persondata.txt',
-    'scripts/connectors/kafka/README-kafka',
-    'test/**/*.properties',
-    'test/**/device.cfg',
-    'test/**/*.txt',
-  ]
-}
-
-apply plugin: 'java'
-jar {
-  deleteAllActions()  // Avoid creating/staging an empty jar for the "root"
-}
-apply plugin: 'signing'
-
-
-ext {
-  commithash_error = ''
-  commithash = {
-    try {
-      return "git rev-parse --short HEAD".execute().text.trim()
-    } catch (Exception e) {
-      ext.commithash_error = e
-      return ''
-    }
-  }()
-  now = new Date()
-  DSTAMP = String.format('%tY%<tm%<td', now)
-  TSTAMP = String.format('%tH%<tM', now)
-  COPYRIGHT_YEAR = String.format('%tY', now)
-  
-  snapshotId = "-SNAPSHOT-${DSTAMP}-${TSTAMP}"
-  if (System.properties['edgent.snapshotId'] != null) {
-    snapshotId = System.properties['edgent.snapshotId']
-  }
-                   
-  external_jars_dir = "$rootProject.projectDir/externalJars/java8"
-  
-  target_dir = "$distsDir"
-  target_java8_dir = "$target_dir/java8"
-  target_java8_ext_dir = "$target_java8_dir/ext"
-  target_java7_dir = "$target_dir/java7"
-  target_android_dir = "$target_dir/android"
-  target_docs_dir = "$target_dir/docs"
-  target_javadoc_dir = "$target_docs_dir/javadoc"
-  target_report_dir = "$target_dir/reports"
- 
-  // project groups whose jars are to be placed in target_java8_lib
-  // instead of the default "$target_java8_dir/$simpleProjectGroup/$project.name/lib"
-  //         e.g., "$target_java8_dir/lib" for api/topology
-  //         "$target_java8_dir/connectors/iotp/lib" for connectors/iotp
-  //
-  target_java8_lib_groups = ["api", "providers", "runtime", "spi"]
-  
-  // TODO can these be deduced by the absence of a build.gradle for the project?
-  aggregatorOnlyProjects = [
-    ':android',
-    ':analytics', ':api', ':apps',
-    ':connectors', ':console',
-    ':platform', ':providers',
-    ':runtime', ':samples', ':spi',
-    ':test', ':utils'
-  ]
-  
-  filteredSubprojects = subprojects.findAll { 
-    project -> !aggregatorOnlyProjects.contains(project.path)
-  }
-  
-  // Edgent core external dependencies
-  core_ext_dependencies = ['com.google.code.gson:gson:2.2.4',
-                   'org.slf4j:slf4j-api:1.7.12',
-                   'io.dropwizard.metrics:metrics-core:3.1.2']
-  
-  // Edgent Samples external dependencies
-  samples_ext_dependencies = ['org.slf4j:slf4j-jdk14:1.7.12']
-
-  // Edgent tests external dependencies
-  test_common_dependencies = ['org.slf4j:slf4j-jdk14:1.7.12']
-  
-  common_ext_dependencies = [
-    core_ext_dependencies,
-    samples_ext_dependencies,
-    // test_common_dependencies, // omit as tests aren't included in release tgz
-  ].flatten()
-
-  ext."signing.keyId" = null
-  ext."signing.secretKeyRingFile" = null
-  ext."signing.password" = null
-}
-
-// Declare the common_ext_dependencies as dependencies of the root project
-// to easily copy them (their resolved paths) to the target dir
-dependencies {
-  compile common_ext_dependencies
-}
-ext.copyCommonExtJarsFn = { targetDir ->
-  copy {
-    from configurations.compile.files
-    into targetDir
-  }
-}
-task setupCommonExtJars << {
-  copyCommonExtJarsFn "$external_jars_dir/ext"
-}
-task copyCommonExtJars << {
-  copyCommonExtJarsFn target_java8_ext_dir
-}
-
-def String mkJarNameFromSpec(String jarSpec) {
-  // e.g. 'com.google.code.gson:gson:2.2.4' => gson-2.2.4.jar
-  // e.g. 'com.google.code.gson:gson:2.2.4@jar' => gson-2.2.4.jar
-  def sfx = jarSpec.endsWith('@jar') ? "" : '.jar'
-  return jarSpec.split(':')[1] + '-' + jarSpec.split(':')[2].replace('@','.') + sfx
-}
-
-def getProjectExtDepFiles(Project proj) { // project's direct ext deps and their transitive deps
-  // TODO suspect this is picking up ext dependencies of transitive **project** dependencies???
-  
-  // handle ext jar deps expressed via "compile <external-dependency-spec>"
-  def allExtDepFiles = proj.configurations.runtime.files { it instanceof ExternalDependency }
-  
-  // handle ext jar deps expressed via addTargetDirExtJarDependency
-  allExtDepFiles.addAll proj.files(proj.directTargetDirExtJarDependencies)
-  
-  logger.info "$proj.path allExtDepFiles: "+allExtDepFiles
-  return allExtDepFiles
-}
- 
-def getProjectNonCommonExtDepFiles(Project proj) {
-  // filter out "common" (target_java8_ext_dir) external dependencies
-  def commonExtJarNames = common_ext_dependencies.collect {
-    mkJarNameFromSpec it
-  }
-  def filteredExtDepFiles = getProjectExtDepFiles(proj).findAll {
-    ! commonExtJarNames.contains(it.getName())
-  }
-  return filteredExtDepFiles
-}
-
-def String mkManifestClassPath(Project proj) {
-  // The manifest's classpath needs to include the project's:
-  // - immediate-only dependant edgent jars (not transitive and not their ext deps
-  //   since our project jars are build with a manifest-classpath that
-  //   handles the project's "private" dependencies)
-  // - immediate dependant external jars and their transitive deps (since
-  //   these don't seem to have a manifest classpath that takes care of their
-  //   dependencies)
-  // - common_ext_dependencies jars when declared as dependencies
-  //
-  // proj.configurations.runtime.files (mostly) captures all of the above
-  // since do to our project build.gradle use of our various add*Dependency().
-
-  def depJars = proj.configurations.runtime.files
-    
-  // assume that any deps still in the gradle cache are project private ext deps
-  // (that will-get/have-been copied into the project's ext dir in the targetdir) 
-  def projExtDir = "$target_java8_dir/$proj.targetRelProjExtDir"
-  depJars = depJars.collect { file ->
-    if (file.toString().contains('/.gradle/caches/')) {
-      return proj.file("$projExtDir/"+file.getName())
-    }
-    return file
-  }
-    
-  def cp = proj.mkRelativePaths(depJars).join(' ')
-  logger.info "$proj.path manifest-classPath: $cp"
-  return cp
-}
-
-gradle.taskGraph.whenReady {taskGraph ->
-  if (taskGraph.hasTask(test)) {
-    println "\nHINTs: Use the '--tests <testClassNamePattern>[.<testMethodNamePattern>]' option to select specific test classes or methods."
-    println "    ./gradlew :api:topology:test --tests '*JsonFunctionsTest'"
-    println "    ./gradlew :api:topology:test --tests '*JsonFunctionsTest.testBytes'"
-    println "Use the 'cleanTest' task to force a rerun of a previously successful test task:"
-    println "    ./gradlew :api:topology:cleanTest :api:topology:test"
-    println "    ./gradlew cleanTest test"
-    println ""
-    sleep 2
-  }
-}
-
-/* Configure subprojects */
-subprojects {
-
-  // ignore aggregator only projects so we don't assemble empty jars, etc for them.
-  if (aggregatorOnlyProjects.contains(project.path)) {
-    return
-  }
-  
-  if(!project.group.equals("edgent.platform")){
-  	apply plugin: 'maven-publish'
-  }
-  apply plugin: 'java'
-  apply plugin: "jacoco"
- 
-  if (buildFile.isFile() && !buildFile.exists()) {
-    configurations.create('default')
-    return
-  }
-  
-  ext.simpleGroupName = project.group.replace('edgent.', '') // e.g., 'edgent.api' => 'api'
-
-  ext.mkRelativePaths = { Collection files ->
-    // make all files paths relative to the project's lib dir in targetdir
-    // well... unless this is for a war, which resides in the group's "webapps"
-    // dir instead of project's lib dir.  See :console:servlets build.gradle.
-    def projLibDir = project.file("$target_java8_dir/$targetRelProjLibDir")
-    if (project.pluginManager.hasPlugin('war')) {
-      projLibDir = project.file("$target_java8_dir/$project.simpleGroupName/webapps")
-    }
-    files.collect {  projLibDir.toPath().relativize(it.toPath()) }
-  }
-
-  ext.targetRelProjDir = { String kind ->  // kind: "lib", "ext"
-    // use targetRelProject{Lib,Ext}Dir
-    // e.g., =>  "lib" or "<component>/<subcomponent>/lib"
-    // the general case location
-    def relProjDir = "$simpleGroupName/$project.name/$kind"
-   
-    // special cases
-    if (target_java8_lib_groups.contains(simpleGroupName)) {
-      relProjDir = "$kind"
-    }
-    else if ('samples' == simpleGroupName) {
-      relProjDir = "samples/$kind"
-    }
-   
-    return relProjDir
-  }
-  ext.targetRelProjLibDir = targetRelProjDir('lib')
-  ext.targetRelProjExtDir = targetRelProjDir('ext')
-  
-  // N.B. regarding the various add*Dependency() methods
-  //
-  // The methods need to be used in project build.gradle "dependencies" declarations.
-  // e.g.,
-  //   dependencies {
-  //     addTargetDirProjectJarDependency 'compile', ':api:topology' # NOT compile project(':api:topology')
-  //     addProjectExtDependency 'compile', 'com.ibm.messaging:watson-iot:0.2.2'  # NOT compile 'com.ibm.messaging:watson-iot:0.2.2'
-  //     addProjectExtDependency 'compile', 'org.apache.kafka:kafka_2.10:0.8.2.2@jar'
-  //     addTargetDirCoreExtDependencies 'compile'
-  //     addMyTargetDirProjectJarDependency 'testCompile'
-  //     // N.B. root project adds test common dependencies
-  //   }
-  // 
-  // These methods play a role in the policies:
-  // - Edgent projects depend on other project's jars in the target-dir, not their classes
-  // - Edgent project jars have a manifest-classpath that handles
-  //   the project's "private" inter-project dependencies
-  //   as well as the project's "private" external component dependencies.
-  // - We build a target dir that includes the project's jar as well as
-  //   the project's external dependency jars
-  // - The tests compile and run against the project jars in the target dir
-  //   (as external/integration test code would).
-  // - The samples compile and run against the project jars in the target dir
-  //   (as user code would).
-  
-  ext.directTargetDirExtJarDependencies = [] 
-
-  ext.addTargetDirProjectJarDependency = { config,proj ->
-    // add a dependency on a project's jar in the target-dir
-    def jarPath = project(proj).jar.archivePath
-    
-    // add the jar as a dependency and ensure it's present when we need it
-    // ? script error with: dependencies { "$config" files(jarPath) builtBy "${proj}:assemble" }
-    dependencies { "$config" files(jarPath) }
-    def task = "${config}Java"
-    if (config == "testCompile") {
-      task = "compileTestJava"
-    }
-    else if (config == "providedCompile") {
-      task = "compileJava"
-    }
-    "$task" { dependsOn "${proj}:assemble" }
-  }
-
-  ext.addMyTargetDirProjectJarDependency = { config ->
-    // add a dependency on my project's jar in the target dir
-    addTargetDirProjectJarDependency(config, project.path)
-  }
-  
-  ext.addTargetDirExtJarDependency = { config,jarName ->
-    // add a dependency on a target_java8_ext_dir jarName
-    // record the addition
-    def jar = "$target_java8_ext_dir/$jarName"
-    if (!directTargetDirExtJarDependencies.contains(jar)) {
-      directTargetDirExtJarDependencies.add jar
-    }
-    
-    // add the jar as a dependency
-    dependencies { "$config" files(jar) }
-    compileJava { dependsOn ':copyCommonExtJars' }
-  }
-  
-  ext.addTargetDirCoreExtJarDependencies = { config ->
-    core_ext_dependencies.collect { depSpec ->
-      mkJarNameFromSpec(depSpec)
-    }.each { jarName ->
-      addTargetDirExtJarDependency config, jarName
-    }
-  }
-
-  ext.addProjectExtDependency = { config,externalDepSpec ->
-    // for declaring project private external dependencies
-    // ends up (transitively) copying the dependency to the project's ext dir
-    dependencies { "$config" externalDepSpec }
-  }
-
-  ext.addCompileTestDependencies = { String... deps ->
-    // add a dependency on other project's testClasses
-    deps.each { dep ->
-      dependencies {
-        testCompile project(dep).sourceSets.test.output
-      }
-      compileTestJava {
-        dependsOn "${dep}:testClasses"
-      }
-    }
-  }
-
-  sourceCompatibility = '1.8'
-  targetCompatibility = '1.8'
-
-  def compileOptions = {
-    options.debugOptions.debugLevel = 'source,lines,vars'
-    options.verbose = logger.isDebugEnabled()
-    options.listFiles = logger.isInfoEnabled()
-    options.deprecation = true
-    options.encoding = 'UTF-8'
-  }
-  compileJava {
-    configure compileOptions
-  }
-  compileTestJava {
-    configure compileOptions
-  }
-  
-  dependencies {
-    // common dependencies for tests
-    testCompile 'junit:junit:4.10'
-    addMyTargetDirProjectJarDependency 'testCompile'
-    if (project.path != ':api:function') {
-      addTargetDirExtJarDependency 'testRuntime', 'slf4j-jdk14-1.7.12.jar'
-    }
-    else {
-      // the add... induces UnsupportedOperationException elsewhere in script when processing :api:function:jar ???
-      // can't figure it out but cleaning directTargetDirExtJarDependencies
-      // avoids it ???... with seemingly no other consequences.
-      addTargetDirExtJarDependency 'testRuntime', 'slf4j-jdk14-1.7.12.jar'
-      project.directTargetDirExtJarDependencies = []
-    }
-
-    // common dependencies for samples
-    if (project.path ==~ '^:samples.*') {
-      addTargetDirProjectJarDependency 'compile', ':providers:development'
-      addTargetDirProjectJarDependency 'compile', ':providers:direct'
-
-      addTargetDirCoreExtJarDependencies 'compile'      
-      addTargetDirExtJarDependency 'runtime', 'slf4j-jdk14-1.7.12.jar'
-    }
-  }
-  
-  ext.copyProjectExtJarsFn = { targetDir ->
-    // Copy the project jar's "private" external dependencies (transitively)
-    // into the project's ext dir in the target-dir.
-
-    // If our project's jar task lacks any actions (e.g., platform:android)
-    // there's nothing to do.
-    if (!jar.actions)
-      return
-    
-    // FYI we're getting more transitive ext deps than the ant build
-    // in some cases - e.g., for watson iot we "knew" we only needed a subset
-    // of all watson iot deps known to maven
-    
-    def projectExtDir = project.targetRelProjExtDir
-    def nonCommonExtFiles = getProjectNonCommonExtDepFiles(project)
-    logger.info "$project.path copying projExtDepFiles jars: "+nonCommonExtFiles.collect { it.getName() }
-    copy {
-      from nonCommonExtFiles
-      includeEmptyDirs = false
-      into "$targetDir/$projectExtDir"
-    }
-  }
-  
-  ext.copyProjectExtJarsFn2 = { targetDir ->
-    // Copy the project jar's "private" external dependencies (transitively)
-    // into target-dir.
-    
-    def nonCommonExtFiles = getProjectNonCommonExtDepFiles(project)
-    logger.info "$project.path copying projExtDepFiles jars: "+nonCommonExtFiles.collect { it.getName() }
-    copy {
-      from nonCommonExtFiles
-      includeEmptyDirs = false
-      into "$targetDir"
-    }
-  }
-  
-  task setupProjectExtJars << {
-    // Helper for setupExternalJars task
-    copyProjectExtJarsFn external_jars_dir
-  }
-
-  jar {
-    // adjust jar task config and also augment the task to do our additional processing
-    
-    // generate the project's jar into the target dir location
-    // with the appropriate name and manifest.
-    // TODO - gradle/maven best practice has version in jarname
-    
-    archiveName = "${project.group}.${project.name}.${extension}"
-    if (["javax.websocket-client", "javax.websocket-server", "edgent.javax.websocket"].contains(project.name)) {
-      archiveName = "${project.name}.${extension}"
-    }
-    destinationDir = file("$target_java8_dir/" + targetRelProjLibDir)
-
-    doFirst {
-      configure jarOptions
-    }
-    
-    doLast {
-      copyProjectExtJarsFn target_java8_dir
-    }
-  }
-
-  ext.jarOptions = {
-    manifest {
-      attributes(
-        'Implementation-Title': "${-> baseName}",
-        'Implementation-Vendor': build_vendor,
-        // TODO inclusion of DSTAMP/TSTAMP results in regeneration
-        // of a jar when none of its contents/dependencies have changed.
-        // If possible use a canned DSTAMP/TSTAMP for non-"release" tasks
-        // to make the dev cycle more efficient at the expense of the TSTAMP.
-        'Implementation-Version': "${commithash}-${DSTAMP}-${TSTAMP}",
-        'Class-Path': mkManifestClassPath(project),
-      )
-    }
-    metaInf {
-      with( copySpec {
-        rename { 'LICENSE' }
-        from rootProject.file('binary-release/apache-v2_0-license')
-      })
-      with( copySpec {
-        rename { 'NOTICE' }
-        from rootProject.file(
-          projectsWithPreApacheContribs.contains(project.path)
-            ? 'binary-release/ibm-contrib-notice'
-            : 'binary-release/apache-notice')
-      })
-    }
-  }
-  
-  ext.printFile = { path ->
-    ant.concat { fileset(file: path) }
-  }
-  ext.adjustTest7Classpath = false
-  
-  task testSummaryFinalizer << {
-    def testTask = tasks.getByName('test')
-    if (System.properties['edgent.build.ci'] != null) {
-      testTask.failedTestResultPaths.each { path ->
-        println path
-        printFile path
-      }
-    }
-    def result = testTask.summaryResult
-    if (result != null) {
-      def duration = String.format('%.3fsec', (result.endTime - result.startTime) / 1000)
-      println "$project.path $duration $result.resultType ($result.testCount tests, $result.failedTestCount failures, $result.skippedTestCount skipped)"
-    }
-  }
-
-  test {
-    filter {
-      includeTestsMatching '*Test'  // can override via --tests command line option
-    }
-
-    systemProperty 'edgent.test.top.dir.file.path', rootProject.projectDir
-    systemProperty 'edgent.test.root.dir', rootProject.projectDir
-    systemProperty 'edgent.build.ci', System.properties['edgent.build.ci']
-    
-    // pass along any org.apache.edgent system props
-    systemProperties System.properties.findAll { it.key.startsWith("org.apache.edgent") }
-    
-    testLogging {
-      exceptionFormat 'full'
-      showStandardStreams = System.properties['edgent.test.showOutput'] != null
-    }
-    beforeSuite { desc ->
-      if (!desc.parent) { // will match the outermost suite
-        println "$project.path testing ..."
-      }
-    }
-    ext.failedTestResultPaths = []
-    ext.summaryResult = null
-    afterSuite { desc, result ->
-      // make failures in edgent.build.ci runs more debuggable
-      // wish the junit xml files existed at this moment but they don't
-      if (desc.parent && desc.className != null) {  // individual test class result
-        if (result.resultType == TestResult.ResultType.FAILURE) {
-          def resultFile = "$testResultsDir/test/TEST-${desc.className}.xml"
-          println "\nFailed testrun results: $resultFile"
-          failedTestResultPaths.add resultFile
-        }
-      }
-      else if (!desc.parent) { // project's overall results
-        summaryResult = result 
-      }
-    }
-    finalizedBy "testSummaryFinalizer" // a doLast isn't invoked if there's a test failure
-    reports {
-      junitXml.enabled = true  // generate build/test-results/test/TEST-*.xml
-      // individual <project>/build/reports junit/jacoco html reports not needed with aggregate report
-      html.enabled = System.properties['edgent.test.project.htmlReports'] != null
-    }
-    doFirst {
-      // The project's tests are supposed to run against its target-dir jar.
-      // We must remove the project's $buildDir/{classes,resources}/main
-      // from the classpath so they're not used.  
-
-      classpath = project.sourceSets.test.runtimeClasspath
-      classpath -= project.sourceSets.main.output
-
-      // Hmm... for some reason the classpath (when printed here) also includes
-      // the project's src build/libs/ jar and by the default name
-      // (e.g., build/libs/oplets-0.4.1.jar) yet we've configured the jar task
-      // to generate the jar in the target-dir with a different name.  
-      // It also lacks that target-dir jar we added as a dependency 
-      // via addMyTargetDirProjectJarDependency 'testCompile'
-      // ???  
-      // Adjust accordingly.
-      
-      classpath = classpath.filter { ! it.path.startsWith(project.libsDir.path) } 
-      classpath = files(project.jar.archivePath) + classpath
-      
-      if (adjustTest7Classpath) {
-        // Add special java7 processing... (on top of the other test.doFirst classpath manipulations)
-      
-        // Change from using the normal test classes dir to the java7 test classes dir
-        classpath -= files(sourceSets.test.output.classesDir)
-        classpath = files(sourceSets.test.output.classesDir.toString().replace('test', 'java7Test')) + classpath
-        
-        // Some of the tests have dependencies on other tests, adjust those classpaths too
-        classpath = files(classpath.collect { it.toString().replace('build/classes/test', 'build/classes/java7Test') })
-      
-        // Switch from java8 jars to java7 jars
-        classpath = files(classpath.collect { it.toString().replace('java8', 'java7') })
-      }
-      logger.debug "$project.path test.classpath: " + classpath.collect { it.toString() }
-    }
-  }
-  
-  ext.j7TestClassesDir = file("$project.buildDir/classes/java7Test")
-  
-  task test7AdjustTestTask << {
-    if (! tasks.getByName('test').enabled
-        || unsupportedJava7TestProjects.contains(project.path)
-        || sourceSets.test.allSource.isEmpty()) {
-      test.enabled = false
-      return
-    }
-    adjustTest7Classpath = true
-    if (!j7TestClassesDir.exists()) {
-      // implicit dependency: :platform:java7:test7Compile
-      logger.error " ERROR: Run the test7Compile task.  $j7TestClassesDir does not exist."
-      throw new TaskExecutionException()
-    }
-    test {
-      testClassesDir = j7TestClassesDir
-      outputs.upToDateWhen { false } // always run - task is never "up to date"
-    }
-  }
-
-  task test7Run() {
-    description = "Run the test7Compile'd tests against the java7 target jars - run after :platform:java7:test7Compile and with JAVA_HOME==java7-VM"
-    // fwiw trying to leverage :platform:java7:ant_test7.run was problematic
-    
-    dependsOn ':platform:java7:verifyJava7Built', test7AdjustTestTask, test
-    // implicit dependency: :platform:java7:test7Compile
-    test.mustRunAfter = [ test7AdjustTestTask, ':platform:java7:verifyJava7Built' ]
-
-    outputs.upToDateWhen { false } // always run - never "up to date"
-  }
-
-  assemble.doLast {
-    // augment assemble with our additional target dir update processing
-    
-    // Copy SRC into target dir when appropriate
-    if (project.path ==~ '^:samples.*') {
-      copy {
-        from(sourceSets.main.allSource.srcDirs) { include '**/*.java' }
-        into "$target_java8_dir/$project.simpleGroupName/src/$project.name/src/main/java/"
-      }
-    }
-  }
-  
-  task sourceJar(type: Jar) {
-    // baseName-appendix-version-classifier.extension
-    from sourceSets.main.allJava
-    classifier = 'sources'
-  }  
-
-  // support for 'gradle publishToMavenLocal' etc 
-  // TODO publishing test.{fvt,svt} and samples ... doesn't seem desirable? e.g., we're excluding test.{fvt,svt} jars from the tgz
-  if (project.pluginManager.hasPlugin('publishing')) {
-    publishing {
-      publications {
-        mavenJava(MavenPublication) {
-          // specify dependencies like: org.apache.edgent:edgent.api.topology:0.4.0
-          groupId = build_group
-          artifactId = "${project.group}.${project.name}" 
-          artifact sourceJar
-          if (project.pluginManager.hasPlugin('war')) {
-            from components.web
-          }
-          else {
-            from components.java
-          }
-        }
-      }
-    }
-  }
-    
-}
-
-task copyScripts(type: Copy) {
-  description = 'Copy scripts to target_java8_dir'
-  includeEmptyDirs = false
-  from("scripts/") { include "**/*" }
-  into "$target_java8_dir/scripts/"
-}
-
-//Create Junit Report
-// need to setup classpath to junit/jacoco for ant.junitreport task
-configurations {
-  junitLibs
-}
-dependencies { // versions with gradle 3.1
-  junitLibs 'org.apache.ant:ant-junit:1.9.6'
-  junitLibs 'org.apache.ant:ant-junit4:1.9.6'
-  junitLibs 'org.jacoco:org.jacoco.ant:0.7.7.201606060606'
-}
-
-task createJunitReport << {
-  description = "Generates a Junit report from all subprojects (use after 'test')"
-
-  ant.delete(dir: "${target_report_dir}/tests")
-  ant.taskdef(name: 'junitreport',
-          classname: 'org.apache.tools.ant.taskdefs.optional.junit.XMLResultAggregator',
-          classpath: configurations.junitLibs.asPath)
-  ant.junitreport(todir: './') {
-    fileset(dir: './', includes: '**/test-results/test/TEST-*.xml')
-    report(format: 'frames', todir: "${target_report_dir}/tests")
-  }
-  ant.move(file: "TESTS-TestSuites.xml", tofile: "${target_report_dir}/TESTS-TestSuites.xml")
-}
-
-apply from: 'gradle/jacoco.gradle'
-apply from: 'gradle/javadoc.gradle'
-
-task addVersionDotTxt {
-  description = 'Add version.txt in target_dir'
-  doLast {
-    def map = [
-      DSTAMP: "$DSTAMP",
-      TSTAMP: "$TSTAMP",
-      commithash: "$commithash",
-      'commithash.error': "$commithash_error",
-      'edgent.version': "$build_version",
-      ]
-    def f = new File("$target_dir/version.txt");
-    def d = new File(target_dir);
-    if( !d.exists() ) { d.mkdirs() }
-    f.createNewFile()
-    map.forEach { k,v -> f.append "$k=$v\n" }
-  }
-}
-
-task releaseTarGz(type: Tar) {
-  description = 'Create binary release tgz in target_dir'
-  archiveName = "apache-${build_name}-${build_version}-incubating${snapshotId}-bin.tgz"
-  compression = Compression.GZIP
-  destinationDir = new File("${target_dir}/../release-edgent")
-  duplicatesStrategy 'exclude'
-  into "${build_name}-${build_version}${snapshotId}"
-  // make some things first in the tgz
-  from rootProject.file('binary-release/LICENSE')
-  from rootProject.file('binary-release/NOTICE')
-  into ('licenses') { from 'licenses' }
-  from 'DISCLAIMER', 'JAVA_SUPPORT.md'
-  from rootProject.file('binary-release/README')
-  from 'RELEASE_NOTES', 'CONTRIBUTORS'
-  from "$target_dir/version.txt"
-  from target_dir
-  exclude '**/test/svt/'
-  exclude '**/connectors/javax.websocket-server/' // just part of wsclient test harness
-  doLast {
-    ant.checksum algorithm: 'md5', file: archivePath
-    ant.checksum algorithm: 'sha-512', fileext: '.sha', file: archivePath
-    println "created $destinationDir/$archiveName"
-  }
-}  
-
-task srcReleaseTarGz(type: Tar) {
-  description = 'Create source release tgz in target_dir'
-  archiveName = "apache-${build_name}-${build_version}-incubating${snapshotId}-src.tgz"
-  compression = Compression.GZIP
-  destinationDir = new File("${target_dir}/../release-edgent")
-  duplicatesStrategy 'exclude'
-  into "${build_name}-${build_version}${snapshotId}-src"
-  // make some things first in the tgz
-  from 'LICENSE', 'NOTICE'
-  from 'DISCLAIMER', 'JAVA_SUPPORT.md'
-  from 'RELEASE_NOTES'
-  from 'README'
-  exclude 'README.md'
-  from 'DEVELOPMENT.md'
-  from '.'
-  exclude 'KEYS'
-  exclude '.git', '.gradle', '.settings'
-  exclude '.gradle-wrapper', 'gradlew', 'gradlew.bat'
-  exclude '**/build/'           // gradle generated artifacts
-  exclude '**/externalJars/'    // gradle generated artifacts for eclipse
-  exclude '**/bin/'             // eclipse generated artifacts
-  exclude '**/*.class'          // final backstop just in case
-  exclude 'connectors/jdbc/derby.log'         // test cruft
-  exclude 'connectors/jdbc/JdbcStreamsTestDb' // test cruft
-  doLast {
-    ant.checksum algorithm: 'md5', file: archivePath
-    ant.checksum algorithm: 'sha-512', fileext: '.sha', file: archivePath
-    println "created $destinationDir/$archiveName"
-  }
-}  
-
-gradle.taskGraph.whenReady { taskGraph ->
-    if (ext."signing.password"==null && taskGraph.allTasks.any { it instanceof Sign }) {
-        // Use Java console to read from the console (no good for a CI environment)
-        def Console console = System.console()
-        console.printf "\n\n#####################################" +
-                       "\nWe have to sign some things in this build." +
-                       "\nPlease enter your signing details.\n\n"
-        def id = System.env['GPG_ID']
-        try { 
-          def tmpId = console.readLine("PGP Code Signing Key Id (default: $id): ")
-          if (!tmpId.isEmpty())
-            id = tmpId
-        } catch (NullPointerException e) {
-          throw new GradleException("You must run 'signAll --no-daemon'")
-        }
-        def file = System.env['GPG_SECRING']
-        if (file == null) {
-          file = "${System.properties['user.home']}/.gnupg/secring.gpg"
-        }
-        def tmpFile = console.readLine("PGP Secret Key Ring File (default: $file): ")
-        if (!tmpFile.isEmpty()) {
-          file = tmpFile
-        }
-        def password = String.valueOf(console.readPassword("PGP Private Key Password: "))
-
-        allprojects { ext."signing.keyId" = id }
-        allprojects { ext."signing.secretKeyRingFile" = file }
-        allprojects { ext."signing.password" = password }
-
-        console.printf "\n#####################################\n"
-    }
-}
-
-task signAll(type: Sign) {
-    description='Sign existing release artifacts in ${target_dir}/../release-edgent (run separetely after "release")'
-    fileTree("${target_dir}/../release-edgent") {
-        include '**/*.tgz'
-    }.each {
-      sign it
-    }
-    outputs.upToDateWhen { false }
-    doFirst {
-      if (getFilesToSign().isEmpty()) {
-        throw new GradleException("No artifacts to sign. Run the 'release' task first.")
-      }
-      //println "### files to sign: " + getFilesToSign().collect { it.name }.join(",")
-    }
-    doLast {
-      println "\nCreated signature files: " + getSignatureFiles().collect { it.name }.join(", ")
-    }
-}
-
-assemble {
-  description = "Assemble distribution artifacts and populate the target_dir with jars, doc, etc. Like 'build' w/o 'test'"
-  dependsOn filteredSubprojects.assemble, aggregateJavadoc, copyScripts
-  aggregateJavadoc.mustRunAfter filteredSubprojects*.assemble
-}
-
-task all(dependsOn: assemble) {
-  description = "alias for 'assemble'"
-}
-
-task cleanAll(type: Delete) {
-  description = 'clean aggregator'  // "release dependsOn clean" only does top-level clean
-  dependsOn clean, filteredSubprojects*.clean
-  // purge old ant build artifacts
-  delete 'target'
-  delete 'reports'
-  delete fileTree(dir: '.', includes:['**/classes/', '**/test.classes/'])
-  // retro7 processing cruft 
-  delete fileTree(dir: '.', includes:['**/classes.in/', '**/classes.out/']) 
-}
-
-task release {
-  description = 'Assemble distribution artifacts, populate target_dir, and create a release tgz'
-  dependsOn cleanAll, addVersionDotTxt, assemble,
-       ':platform:java7:addJava7TargetDir', ':platform:android:addAndroidTargetDir',
-       srcReleaseTarGz, releaseTarGz
-  addVersionDotTxt.mustRunAfter cleanAll
-  assemble.mustRunAfter addVersionDotTxt
-  releaseTarGz.mustRunAfter assemble,':platform:java7:addJava7TargetDir',':platform:android:addAndroidTargetDir'
-}
-
-task reports {
-  description = "Generate JUnit and Coverage reports of prior test run. Use after 'test'"
-  dependsOn createJunitReport, jacocoTestReport
-}
-
-task test7AdjustJacocoReport << {
-  jacocoTestReport.test7AdjustJacocoReport = true
-  logger.lifecycle "### NOTE: [WIP] test7 jacoco reporting ###"
-}
-
-task test7Reports {
-  description = "Generate JUnit and Coverage reports of prior test run. Use after 'test7Run'"
-  dependsOn createJunitReport, test7AdjustJacocoReport, jacocoTestReport
-  jacocoTestReport.mustRunAfter test7AdjustJacocoReport
-}
-
-// build: inject test report generation and javadoc generation (for early problem detection)
-// make 'build' like "all test reports"
-build {
-  dependsOn filteredSubprojects.build, reports
-  reports.mustRunAfter filteredSubprojects.build 
-}
-
-task setupExternalJars {
-  description = 'Add all of the dependant external jars to the target-dir (make available to Eclipse, etc)'
-  dependsOn setupCommonExtJars, filteredSubprojects.setupProjectExtJars
-}
diff --git a/connectors/.classpath b/connectors/.classpath
deleted file mode 100644
index b9abe61..0000000
--- a/connectors/.classpath
+++ /dev/null
@@ -1,74 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="common/src/main/java"/>
-	<classpathentry kind="src" path="common/src/test/java"/>
-	<classpathentry kind="src" path="command/src/main/java"/>
-	<classpathentry kind="src" path="command/src/test/java"/>
-	<classpathentry kind="src" path="csv/src/main/java"/>
-	<classpathentry kind="src" path="csv/src/test/java"/>
-	<classpathentry kind="src" path="file/src/main/java"/>
-	<classpathentry kind="src" path="file/src/test/java"/>
-	<classpathentry kind="src" path="http/src/main/java"/>
-	<classpathentry kind="src" path="http/src/test/java"/>
-	<classpathentry kind="src" path="iot/src/main/java"/>
-	<classpathentry kind="src" path="iot/src/test/java"/>
-	<classpathentry kind="src" path="iotp/src/main/java"/>
-	<classpathentry kind="src" path="jdbc/src/main/java"/>
-	<classpathentry kind="src" path="jdbc/src/test/java"/>
-	<classpathentry kind="src" path="kafka/src/main/java"/>
-	<classpathentry kind="src" path="kafka/src/test/java"/>
-	<classpathentry kind="src" path="mqtt/src/main/java"/>
-	<classpathentry kind="src" path="mqtt/src/test/java"/>
-	<classpathentry kind="src" path="pubsub/src/main/java"/>
-	<classpathentry kind="src" path="pubsub/src/test/java"/>
-	<classpathentry kind="src" path="serial/src/main/java"/>
-	<classpathentry kind="src" path="edgent.javax.websocket/src/main/java"/>
-	<classpathentry kind="src" path="javax.websocket-client/src/main/java"/>
-	<classpathentry kind="src" path="wsclient/src/main/java"/>
-	<classpathentry kind="src" path="wsclient-javax.websocket/src/main/java"/>
-	<classpathentry kind="src" path="wsclient-javax.websocket/src/test/java"/>
-    <classpathentry kind="src" path="javax.websocket-client/src/main/resources"/>
-	<classpathentry kind="lib" path="../externalJars/java8/connectors/http/ext/commons-codec-1.9.jar"/>
-	<classpathentry kind="lib" path="../externalJars/java8/connectors/http/ext/commons-logging-1.2.jar"/>
-	<classpathentry kind="lib" path="../externalJars/java8/connectors/http/ext/httpclient-4.5.1.jar"/>
-	<classpathentry kind="lib" path="../externalJars/java8/connectors/http/ext/httpcore-4.4.4.jar"/>
-	<classpathentry kind="lib" path="../externalJars/java8/connectors/iotp/ext/watson-iot-0.2.2.jar"/>
-	<classpathentry kind="lib" path="../externalJars/java8/connectors/iotp/ext/commons-lang3-3.4.jar"/>
-	<classpathentry kind="lib" path="../externalJars/java8/connectors/iotp/ext/commons-codec-1.10.jar"/>
-	<classpathentry kind="lib" path="../externalJars/java8/connectors/iotp/ext/commons-logging-1.2.jar"/>
-	<classpathentry kind="lib" path="../externalJars/java8/connectors/iotp/ext/commons-net-3.3.jar"/>
-	<classpathentry kind="lib" path="../externalJars/java8/connectors/iotp/ext/httpclient-4.5.1.jar"/>
-	<classpathentry kind="lib" path="../externalJars/java8/connectors/iotp/ext/httpcore-4.4.3.jar"/>
-	<classpathentry kind="lib" path="../externalJars/java8/connectors/iotp/ext/joda-time-2.9.2.jar"/>
-	<classpathentry kind="lib" path="../externalJars/java8/connectors/iotp/ext/org.eclipse.paho.client.mqttv3-1.1.0.jar"/>
-	<classpathentry kind="lib" path="../externalJars/java8/connectors/kafka/ext/kafka_2.10-0.8.2.2.jar"/>
-	<classpathentry kind="lib" path="../externalJars/java8/connectors/kafka/ext/kafka-clients-0.8.2.2.jar"/>
-	<classpathentry kind="lib" path="../externalJars/java8/connectors/kafka/ext/log4j-1.2.16.jar"/>
-	<classpathentry kind="lib" path="../externalJars/java8/connectors/kafka/ext/metrics-core-2.2.0.jar"/>
-	<classpathentry kind="lib" path="../externalJars/java8/connectors/kafka/ext/scala-library-2.10.4.jar"/>
-	<classpathentry kind="lib" path="../externalJars/java8/connectors/kafka/ext/zkclient-0.3.jar"/>
-	<classpathentry kind="lib" path="../externalJars/java8/connectors/kafka/ext/zookeeper-3.4.6.jar"/>
-	<classpathentry kind="lib" path="../externalJars/java8/connectors/mqtt/ext/org.eclipse.paho.client.mqttv3-1.1.0.jar"/>
-	<classpathentry kind="lib" path="../externalJars/java8/connectors/javax.websocket-client/ext/javax-websocket-client-impl-9.3.6.v20151106.jar"/>
-	<classpathentry kind="lib" path="../externalJars/java8/connectors/javax.websocket-client/ext/javax.websocket-api-1.0.jar"/>
-	<classpathentry kind="lib" path="../externalJars/java8/connectors/javax.websocket-client/ext/jetty-util-9.3.6.v20151106.jar"/>
-	<classpathentry kind="lib" path="../externalJars/java8/connectors/javax.websocket-client/ext/websocket-api-9.3.6.v20151106.jar"/>
-	<classpathentry kind="lib" path="../externalJars/java8/connectors/javax.websocket-client/ext/websocket-client-9.3.6.v20151106.jar"/>
-	<classpathentry kind="lib" path="../externalJars/java8/connectors/javax.websocket-client/ext/websocket-common-9.3.6.v20151106.jar"/>
-    <classpathentry kind="lib" path="../externalJars/java8/connectors/javax.websocket-server/ext/javax-websocket-server-impl-9.3.6.v20151106.jar"/>
-	<classpathentry kind="lib" path="../externalJars/java8/connectors/javax.websocket-server/ext/jetty-http-9.3.6.v20151106.jar"/>
-	<classpathentry kind="lib" path="../externalJars/java8/connectors/javax.websocket-server/ext/jetty-io-9.3.6.v20151106.jar"/>
-	<classpathentry kind="lib" path="../externalJars/java8/connectors/javax.websocket-server/ext/jetty-security-9.3.6.v20151106.jar"/>
-	<classpathentry kind="lib" path="../externalJars/java8/connectors/javax.websocket-server/ext/jetty-server-9.3.6.v20151106.jar"/>
-	<classpathentry kind="lib" path="../externalJars/java8/connectors/javax.websocket-server/ext/jetty-servlet-9.3.6.v20151106.jar"/>
-    <classpathentry kind="lib" path="../externalJars/java8/connectors/javax.websocket-server/ext/javax.servlet-api-3.1.0.jar"/>
-	<classpathentry kind="lib" path="../externalJars/java8/connectors/javax.websocket-server/ext/websocket-server-9.3.6.v20151106.jar"/>
-	<classpathentry kind="lib" path="../externalJars/java8/connectors/javax.websocket-server/ext/websocket-servlet-9.3.6.v20151106.jar"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/api"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/ext"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/spi"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/providers"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/connectors/.gitignore b/connectors/.gitignore
deleted file mode 100644
index 5ce6105..0000000
--- a/connectors/.gitignore
+++ /dev/null
@@ -1,7 +0,0 @@
-/classes/
-**/test.classes/
-**/classes/
-**/unittests/
-/bin/
-jdbc/derby.log
-jdbc/JdbcStreamsTestDb
diff --git a/connectors/.project b/connectors/.project
deleted file mode 100644
index a63c22e..0000000
--- a/connectors/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>connectors</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/connectors/command/build.gradle b/connectors/command/build.gradle
deleted file mode 100644
index a5eb48c..0000000
--- a/connectors/command/build.gradle
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-dependencies {
-  addTargetDirProjectJarDependency 'compile', ':api:topology'
-  addTargetDirProjectJarDependency 'compile', ':connectors:common'
-  
-  addTargetDirProjectJarDependency 'testCompile', ':providers:direct'
-  // N.B. root project adds test common dependencies
-}
-
-addCompileTestDependencies ':api:topology', ':providers:direct', ':connectors:common'
diff --git a/connectors/command/pom.xml b/connectors/command/pom.xml
new file mode 100644
index 0000000..32946b6
--- /dev/null
+++ b/connectors/command/pom.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-command</artifactId>
+
+  <name>Apache Edgent (Java 8): Connectors: Command</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-connectors-common</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-connectors-common</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/connectors/command/src/main/java/org/apache/edgent/connectors/command/runtime/CommandReader.java b/connectors/command/src/main/java/org/apache/edgent/connectors/command/runtime/CommandReader.java
index ec2bc31..b699e80 100644
--- a/connectors/command/src/main/java/org/apache/edgent/connectors/command/runtime/CommandReader.java
+++ b/connectors/command/src/main/java/org/apache/edgent/connectors/command/runtime/CommandReader.java
@@ -81,7 +81,7 @@
                     closeProcess();
                   }
                 }
-                else if (currentSupplierIterator == null && canStart()) {
+                else if (canStart()) {
                   start(); // and loop/retry
                 }
                 else {
diff --git a/connectors/command/src/main/java/org/apache/edgent/connectors/command/runtime/CommandWriter.java b/connectors/command/src/main/java/org/apache/edgent/connectors/command/runtime/CommandWriter.java
index e3308dc..ac55e69 100644
--- a/connectors/command/src/main/java/org/apache/edgent/connectors/command/runtime/CommandWriter.java
+++ b/connectors/command/src/main/java/org/apache/edgent/connectors/command/runtime/CommandWriter.java
@@ -72,7 +72,7 @@
             closeProcess(); // and loop/retry
           }
         }
-        else if (currentConsumer == null && canStart()) {
+        else if (canStart()) {
           logger.debug("STARTING for: {}", value);
           start();  // and loop/retry
         }
diff --git a/connectors/command/src/test/java/org/apache/edgent/test/connectors/command/CommandStreamsTest.java b/connectors/command/src/test/java/org/apache/edgent/test/connectors/command/CommandStreamsTest.java
index e2ad3c7..bc96ad2 100644
--- a/connectors/command/src/test/java/org/apache/edgent/test/connectors/command/CommandStreamsTest.java
+++ b/connectors/command/src/test/java/org/apache/edgent/test/connectors/command/CommandStreamsTest.java
@@ -41,8 +41,6 @@
 import org.apache.edgent.topology.tester.Condition;
 import org.junit.Test;
 
-import com.google.gson.JsonObject;
-
 public class CommandStreamsTest extends DirectTopologyTestBase {
     
     private String[] stdLines = new String[] {
@@ -176,9 +174,24 @@
       assertNotNull(sink);
       
       try {
-        // start the job, sleep for a bit (await the timeout) then validate sink output
-        Condition<?> never = t.getTester().tupleCount(s, Long.MAX_VALUE);
-        t.getTester().complete(getSubmitter(), new JsonObject(), never, 3, TimeUnit.SECONDS);
+        // complete when the sink has generated the expected results
+        Condition<Object> tc = new Condition<Object>() {
+            public boolean valid() { 
+                try {
+                    return FileUtil.validateFile(tempFile1, getLines(), true);
+                } catch (Exception e) {
+                    return false;
+                }
+            }
+            public Object getResult() { return "todo-files-lines"; }
+        };
+
+        // If we time out, still validate content to see what we did get
+        try {
+            complete(t, tc, 3, TimeUnit.SECONDS);
+        } catch (Exception e) {
+            System.out.println("test time out");
+        }
 
         FileUtil.validateFile(tempFile1, getLines());
       }
@@ -229,11 +242,25 @@
       assertNotNull(sink);
       
       try {
-        // start the job, sleep for a bit (await the timeout) then validate sink output
-        Condition<?> never = t.getTester().tupleCount(s, Long.MAX_VALUE);
-        t.getTester().complete(getSubmitter(), new JsonObject(), never,
-            6 + ((NUM_RUNS-1) * 1/*restart delay*/), TimeUnit.SECONDS);
-        
+        // complete when the sink has generated the expected results
+        Condition<Object> tc = new Condition<Object>() {
+            public boolean valid() { 
+                try {
+                    return FileUtil.validateFile(tempFile1, expLines.toArray(new String[0]), true);
+                } catch (Exception e) {
+                    return false;
+                }
+            }
+            public Object getResult() { return "todo-files-lines"; }
+        };
+
+        // If we time out, still validate content to see what we did get
+        try {
+            complete(t, tc, 6 + ((NUM_RUNS-1) * 1/*restart delay*/), TimeUnit.SECONDS);
+        } catch (Exception e) {
+            System.out.println("test time out");
+        }
+
         FileUtil.validateFile(tempFile1, expLines.toArray(new String[0]));
       }
       finally {
@@ -242,7 +269,7 @@
     }
     
     private String getCmdPath(String cmd) {
-      return TestRepoPath.getPath("connectors", "command", "src", "test", "scripts", cmd);
+      return TestRepoPath.getPath(cmd);
     }
 
 }
diff --git a/connectors/command/src/test/scripts/sinkcmd b/connectors/command/src/test/resources/sinkcmd
similarity index 100%
rename from connectors/command/src/test/scripts/sinkcmd
rename to connectors/command/src/test/resources/sinkcmd
diff --git a/connectors/common/build.gradle b/connectors/common/build.gradle
deleted file mode 100644
index 99f1553..0000000
--- a/connectors/common/build.gradle
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-dependencies {
-  addTargetDirProjectJarDependency 'compile', ':api:topology'
-  addTargetDirCoreExtJarDependencies 'compile'
-  
-  addTargetDirProjectJarDependency 'testCompile', ':providers:direct'
-  // N.B. root project adds test common dependencies
-}
-
-addCompileTestDependencies ':api:topology', ':providers:direct'
-
-test {
-  // this project lacks tests and this task fails if attempted 
-  enabled = false
-}
diff --git a/connectors/common/pom.xml b/connectors/common/pom.xml
new file mode 100644
index 0000000..8809194
--- /dev/null
+++ b/connectors/common/pom.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-common</artifactId>
+
+  <name>Apache Edgent (Java 8): Connectors: Common</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/connectors/common/src/test/java/org/apache/edgent/test/connectors/common/ConnectorTestBase.java b/connectors/common/src/test/java/org/apache/edgent/test/connectors/common/ConnectorTestBase.java
index f5230a9..82a70c0 100644
--- a/connectors/common/src/test/java/org/apache/edgent/test/connectors/common/ConnectorTestBase.java
+++ b/connectors/common/src/test/java/org/apache/edgent/test/connectors/common/ConnectorTestBase.java
@@ -23,10 +23,12 @@
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 
 import org.apache.edgent.test.providers.direct.DirectTopologyTestBase;
 import org.apache.edgent.topology.TStream;
 import org.apache.edgent.topology.Topology;
+import org.apache.edgent.topology.tester.Condition;
 
 public class ConnectorTestBase extends DirectTopologyTestBase {
     
@@ -102,5 +104,23 @@
 
         super.completeAndValidate(ordered, msg, t, s, secTimeout, expected);
     }
+    
+    public static Condition<Object> newWaitTimeCondition(int seconds) {
+        return new Condition<Object>() {
+            private long startTime = 0;
+            private long endTime = 0;
+            private volatile boolean done = false;
+            public boolean valid() {
+                if (startTime==0) {
+                    startTime = System.currentTimeMillis();
+                    endTime = startTime + TimeUnit.SECONDS.toMillis(seconds);
+                }
+                long now = System.currentTimeMillis();
+                done = now >= endTime;
+                return done;
+            }
+            public Object getResult() { return done; }
+        };
+    }
 
 }
diff --git a/connectors/common/src/test/java/org/apache/edgent/test/connectors/common/FileUtil.java b/connectors/common/src/test/java/org/apache/edgent/test/connectors/common/FileUtil.java
index 0c36c0f..4902544 100644
--- a/connectors/common/src/test/java/org/apache/edgent/test/connectors/common/FileUtil.java
+++ b/connectors/common/src/test/java/org/apache/edgent/test/connectors/common/FileUtil.java
@@ -30,6 +30,7 @@
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 /**
@@ -39,8 +40,8 @@
 
   /**
    * Create a temp file with the specified name, extension and contents.
-   * @param name
-   * @param extension
+   * @param name filename prefix 
+   * @param extension filename extension
    * @param lines content for the file
    * @return {@code Path} to temp file
    * @throws Exception on failure
@@ -69,9 +70,11 @@
    * Validate that the file contains the specified content.
    * @param path file to validate
    * @param lines the expected content
-   * @throws Exception on failure
+   * @param silent control return vs throw
+   * @return false on failure - only applicable when silent==true
+   * @throws Exception on failure when silent==false
    */
-  public static void validateFile(Path path, String[] lines) throws Exception {
+  public static boolean validateFile(Path path, String[] lines, boolean silent) throws Exception {
     List<String> actLines = new ArrayList<>();
     try (BufferedReader reader = 
           new BufferedReader(new InputStreamReader(
@@ -81,8 +84,26 @@
       while ((line = reader.readLine()) != null) {
         actLines.add(line);
       }
-      assertArrayEquals(lines, actLines.toArray(new String[actLines.size()]));
+      if (!silent)
+          assertArrayEquals(lines, actLines.toArray(new String[actLines.size()]));
+      else if (!Arrays.equals(lines, actLines.toArray(new String[actLines.size()])))
+          return false;
+      return true;
     }
+    catch (Exception e) {
+        if (!silent) throw e;
+        return false;
+    }
+  }
+  
+  /**
+   * Validate that the file contains the specified content.
+   * @param path file to validate
+   * @param lines the expected content
+   * @throws Exception on failure
+   */
+  public static void validateFile(Path path, String[] lines) throws Exception {
+      validateFile(path, lines, false);
   }
 
 }
diff --git a/connectors/common/src/test/java/org/apache/edgent/test/connectors/common/TestRepoPath.java b/connectors/common/src/test/java/org/apache/edgent/test/connectors/common/TestRepoPath.java
index bb3daf6..162d264 100644
--- a/connectors/common/src/test/java/org/apache/edgent/test/connectors/common/TestRepoPath.java
+++ b/connectors/common/src/test/java/org/apache/edgent/test/connectors/common/TestRepoPath.java
@@ -19,8 +19,8 @@
 package org.apache.edgent.test.connectors.common;
 
 import java.io.File;
-import java.nio.file.Path;
-import java.nio.file.Paths;
+import java.net.URISyntaxException;
+import java.net.URL;
 
 /**
  * Utility for tests to get the path to something in the local git repository.
@@ -33,29 +33,17 @@
      * Deals with implications of the different execution contexts:
      * eclipse/junit and ant/junit.
      * 
-     * @param testProject the project (e.g., "connectors") that the
-     *        test belongs to.
-     * @param more more components
+     * @param classpathPath the absolute path of the resource in the applications classpath.
      * @return absolute path in the repository
      */
-    public static String getPath(String testProject, String... more) {
-        String pathStr = System.getProperty("user.dir");
-        // Under eclipse/junit: path to project in repo: <repo>/<testProject>
-        // Under ant/junit: <repo>/<testProject>/<project>/unittests/testrunxxxxxxx
-        // Get the path to the <repo>
-        Path path = new File(pathStr).toPath();
-        do {
-            if (path.endsWith(testProject)) {
-                path = path.getParent();
-                break;
-            }
-            path = path.getParent();
-        } while (path != null);
-        // add the components to the repo-path
-        path = path.resolve(Paths.get(testProject, more));
-        if (!path.toFile().exists())
-            throw new IllegalArgumentException("File does not exist: "+path);
-        return path.toString();
+    public static String getPath(String classpathPath) {
+        try {
+            URL resourceUrl = ClassLoader.getSystemResource(classpathPath);
+            File resource = new File(resourceUrl.toURI());
+            return resource.getAbsolutePath();
+        } catch (URISyntaxException e) {
+            throw new RuntimeException("Could not get path of resource; " + classpathPath, e);
+        }
     }
 
 }
diff --git a/connectors/csv/build.gradle b/connectors/csv/build.gradle
deleted file mode 100644
index 6a08147..0000000
--- a/connectors/csv/build.gradle
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-dependencies {
-  addTargetDirProjectJarDependency 'compile', ':api:topology'
-  addTargetDirCoreExtJarDependencies 'compile'
-  
-  addTargetDirProjectJarDependency 'testCompile', ':providers:direct'
-  // N.B. root project adds test common dependencies
-}
-
-addCompileTestDependencies ':api:topology', ':providers:direct', ':connectors:common'
diff --git a/connectors/csv/pom.xml b/connectors/csv/pom.xml
new file mode 100644
index 0000000..20eddae
--- /dev/null
+++ b/connectors/csv/pom.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-csv</artifactId>
+
+  <name>Apache Edgent (Java 8): Connectors: CSV</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>com.google.code.gson</groupId>
+      <artifactId>gson</artifactId>
+      <version>2.8.0</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+      <type>test-jar</type>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/connectors/edgent.javax.websocket/build.gradle b/connectors/edgent.javax.websocket/build.gradle
deleted file mode 100644
index 9a06f08..0000000
--- a/connectors/edgent.javax.websocket/build.gradle
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-archivesBaseName = project.name
-
-dependencies {
-  addProjectExtDependency 'compile', 'javax.websocket:javax.websocket-api:1.0'
-
-  // N.B. root project adds test common dependencies
-}
diff --git a/connectors/file/build.gradle b/connectors/file/build.gradle
deleted file mode 100644
index 6a08147..0000000
--- a/connectors/file/build.gradle
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-dependencies {
-  addTargetDirProjectJarDependency 'compile', ':api:topology'
-  addTargetDirCoreExtJarDependencies 'compile'
-  
-  addTargetDirProjectJarDependency 'testCompile', ':providers:direct'
-  // N.B. root project adds test common dependencies
-}
-
-addCompileTestDependencies ':api:topology', ':providers:direct', ':connectors:common'
diff --git a/connectors/file/pom.xml b/connectors/file/pom.xml
new file mode 100644
index 0000000..7d14da9
--- /dev/null
+++ b/connectors/file/pom.xml
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-file</artifactId>
+
+  <name>Apache Edgent (Java 8): Connectors: File</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-function</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-oplet</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-connectors-common</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/connectors/file/src/test/java/org/apache/edgent/test/connectors/file/FileStreamsTest.java b/connectors/file/src/test/java/org/apache/edgent/test/connectors/file/FileStreamsTest.java
index 8636888..542a137 100644
--- a/connectors/file/src/test/java/org/apache/edgent/test/connectors/file/FileStreamsTest.java
+++ b/connectors/file/src/test/java/org/apache/edgent/test/connectors/file/FileStreamsTest.java
@@ -32,7 +32,6 @@
 import java.util.List;
 import java.util.Objects;
 import java.util.concurrent.TimeUnit;
-import java.util.stream.Stream;
 
 import org.apache.edgent.connectors.file.FileStreams;
 import org.apache.edgent.function.BiFunction;
@@ -185,17 +184,28 @@
             throw new RuntimeException(e);
         }
     }
+    
+    private String[] toUpperCase(String[] strs) {
+        List<String> ucstrs = new ArrayList<>();
+        for (String s : strs) {
+            ucstrs.add(s.toUpperCase());
+        }
+        return ucstrs.toArray(new String[0]);
+    }
+    private String[] concat(String[] a1, String[] a2) {
+        List<String> res = new ArrayList<>();
+        for (String s : a1) res.add(s);
+        for (String s : a2) res.add(s);
+        return res.toArray(new String[0]);
+    }
 
     @Test
     public void testTextFileReader() throws Exception {
         Topology t = newTopology("testTextFileReader");
         
         String[] lines = getLines();
-        String[] ucLines = Stream.of(lines)
-                .map(line -> line.toUpperCase())
-                .toArray(String[]::new);
-        String[] allLines = Stream.concat(Stream.of(lines), Stream.of(ucLines))
-                .toArray(String[]::new);
+        String[] ucLines = toUpperCase(lines);
+        String[] allLines = concat(lines, ucLines);
         
         Path tempFile1 = FileUtil.createTempFile("test1", "txt", lines);
         Path tempFile2 = FileUtil.createTempFile("test2", "txt", ucLines);
@@ -218,11 +228,8 @@
         Topology t = newTopology("testTextFileReaderProblemPaths");
         
         String[] lines = getLines();
-        String[] ucLines = Stream.of(lines)
-                .map(line -> line.toUpperCase())
-                .toArray(String[]::new);
-        String[] allLines = Stream.concat(Stream.of(lines), Stream.of(ucLines))
-                .toArray(String[]::new);
+        String[] ucLines = toUpperCase(lines);
+        String[] allLines = concat(lines, ucLines);
         
         Path tempFile1 = FileUtil.createTempFile("test1", "txt", lines);
         Path tempFile2 = FileUtil.createTempFile("test2", "txt", ucLines);
@@ -250,9 +257,7 @@
         Topology t = newTopology("testTextFileReaderPrePost");
         
         String[] lines = getLines();
-        String[] ucLines = Stream.of(lines)
-                .map(line -> line.toUpperCase())
-                .toArray(String[]::new);
+        String[] ucLines = toUpperCase(lines);
         
         Path tempFile1 = FileUtil.createTempFile("test1", "txt", lines);
         Path tempFile2 = FileUtil.createTempFile("test2", "txt", ucLines);
diff --git a/connectors/file/src/test/java/org/apache/edgent/test/connectors/file/FileStreamsTextFileWriterTest.java b/connectors/file/src/test/java/org/apache/edgent/test/connectors/file/FileStreamsTextFileWriterTest.java
index 576e677..fe3b54a 100644
--- a/connectors/file/src/test/java/org/apache/edgent/test/connectors/file/FileStreamsTextFileWriterTest.java
+++ b/connectors/file/src/test/java/org/apache/edgent/test/connectors/file/FileStreamsTextFileWriterTest.java
@@ -35,6 +35,9 @@
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStreamReader;
+import java.io.Reader;
+import java.nio.charset.Charset;
+import java.nio.charset.CharsetDecoder;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -83,6 +86,19 @@
     public String[] getLines() {
         return stdLines;
     }
+    
+    // Cover for Java8 Files.newBufferedReader() convenience fn
+    private static BufferedReader newBufferedReader(Path path) throws IOException {
+        return newBufferedReader(path, StandardCharsets.UTF_8);
+    }
+    private static BufferedReader newBufferedReader(Path path, Charset cs)
+            throws IOException
+        {
+            CharsetDecoder decoder = cs.newDecoder();
+            Reader reader = new InputStreamReader(Files.newInputStream(path), decoder);
+            return new BufferedReader(reader);
+        }
+
 
     @Test
     public void testFlushConfig() throws Exception {
@@ -301,6 +317,8 @@
         // default writer policy
         TSink<String> sink = FileStreams.textFileWriter(s, () -> basePath.toString());
 
+        // note, with only 4 tuples, default policy won't cycle (finalize the cur file)
+        // to make the expResults present until job stops (TMO)
         completeAndValidateWriter(t, TMO_SEC, basePath, expResults);
         
         assertNotNull(sink);
@@ -427,6 +445,14 @@
 
     @Test
     public void testRetainAgeBased() throws Exception {
+        // The mechanisms of this test no longer work with the
+        // recent changes to bump the tmo 2x when edgent.build.ci=true.
+        // So disable while we continue to work on this.
+        //
+        // With the general changes for completion condition checking,
+        // I think this has the chance of working again.
+//        assumeTrue(!Boolean.getBoolean("edgent.build.ci"));
+
         Topology t = newTopology("testRetainAgeBased");
         
         // establish a base path
@@ -436,9 +462,8 @@
         
         // build expected results
         int keepCnt = 2;  // only keep the last n files with throttling, age,
-                          // and TMO_SEC
         int ageSec = 5;
-        long periodMsec = TimeUnit.SECONDS.toMillis(1);
+        long periodMsec = TimeUnit.SECONDS.toMillis(1);  // age retention checking period
         // net one tuple per file
         List<List<String>> expResults = buildExpResults(lines, tuple -> true);
         for (int i = 0; i < keepCnt; i++)
@@ -453,9 +478,11 @@
         // With 4 tuples, throttleDelay=2sec, and ageSec=5
         // t0=add-f1, t1, t2=add-f2, t3, t4=add-f3, t5-rm-f1, t6=add-f4, t7=rm-f2, t8, t9=rm-f3, ...
         //
-        // So we want to check somewhere around t8 (after t7 and definitely before t9)
-        // so all 4 files were created and the first 2 have been aged out.
-        // with complete delay = #files-1*throttle + TMO_SEC, should be 6+2 == t8.
+        // The expected results happen somewhere around t8 (after t7 and definitely before t9),
+        // all 4 files were created and the first 2 have been aged out.
+        //
+        // If the "completion condition" doesn't manage to get run during that interval
+        // the test will fail even if the code is working fine. 
         
         int throttleSec = 2;
         TStream<String> s = PlumbingStreams.blockingThrottle(
@@ -489,7 +516,7 @@
         
         IFileWriterPolicy<String> policy = new FileWriterPolicy<String>(
                 FileWriterFlushConfig.newImplicitConfig(),
-                FileWriterCycleConfig.newCountBasedConfig(1000),
+                FileWriterCycleConfig.newCountBasedConfig(expResults.get(0).size()),
                 FileWriterRetentionConfig.newFileCountBasedConfig(10)
                 );
         FileStreams.textFileWriter(s, () -> basePath.toString(), () -> policy);
@@ -514,7 +541,7 @@
         
         IFileWriterPolicy<String> policy = new FileWriterPolicy<String>(
                 FileWriterFlushConfig.newCountBasedConfig(1),  // every tuple
-                FileWriterCycleConfig.newCountBasedConfig(1000),  // all in 1 file
+                FileWriterCycleConfig.newCountBasedConfig(expResults.get(0).size()),  // all in 1 file
                 FileWriterRetentionConfig.newFileCountBasedConfig(10)
                 );
         FileStreams.textFileWriter(s, () -> basePath.toString(), () -> policy);
@@ -543,7 +570,7 @@
         
         IFileWriterPolicy<String> policy = new FileWriterPolicy<String>(
                 FileWriterFlushConfig.newTimeBasedConfig(TimeUnit.MILLISECONDS.toMillis(250)),
-                FileWriterCycleConfig.newCountBasedConfig(1000),  // all in 1 file
+                FileWriterCycleConfig.newCountBasedConfig(expResults.get(0).size()),  // all in 1 file
                 FileWriterRetentionConfig.newFileCountBasedConfig(10)
                 );
         FileStreams.textFileWriter(s, () -> basePath.toString(), () -> policy);
@@ -570,7 +597,7 @@
         IFileWriterPolicy<String> policy = new FileWriterPolicy<String>(
                 FileWriterFlushConfig.newPredicateBasedConfig(
                         tuple -> tuple.startsWith("1-") || tuple.startsWith("3-")),
-                FileWriterCycleConfig.newCountBasedConfig(1000),  // all in 1 file
+                FileWriterCycleConfig.newCountBasedConfig(expResults.get(0).size()),  // all in 1 file
                 FileWriterRetentionConfig.newFileCountBasedConfig(10)
                 );
         FileStreams.textFileWriter(s, () -> basePath.toString(), () -> policy);
@@ -676,7 +703,9 @@
 
         // build expected results
         // a tuple based config / predicate.  in this case should end up with 3 files.
-        Predicate<String> cycleIt = tuple -> tuple.startsWith("1-") || tuple.startsWith("3-");
+        // flush on the last tuple too to ensure the test completes before TMO.
+        Predicate<String> cycleIt = tuple -> tuple.startsWith("1-") || tuple.startsWith("3-")
+                                        || tuple.equals(lines[lines.length-1]);
         List<List<String>> expResults = buildExpResults(lines, cycleIt);
         assertEquals(3, expResults.size());
 
@@ -818,7 +847,7 @@
         System.out.println("<<<<< Dumping "+f);
         try {
             Path path = f.toPath();
-            try (BufferedReader br = Files.newBufferedReader(path)) {
+            try (BufferedReader br = newBufferedReader(path)) {
                 br.lines().forEach(line -> System.out.println(line));
             }
         }
@@ -847,34 +876,59 @@
             Path basePath, List<List<T>> expResults) throws Exception {
         
         try {
-            // just let it run to the tmo before we check the file contents
+            // wait until the right number of files and content or we timeout.
+            // (don't use a wait-till-tmo scheme as that's "too slow" especially
+            // when complete() adds a TMO multiplier when edgent.build.ci=true)
             Condition<Object> tc = new Condition<Object>() {
-                public boolean valid() { return false; }
-                public Object getResult() { return null; }
+                public boolean valid() {
+                    try {
+                        return checkFiles(basePath, expResults, true);
+                    } catch (Exception e) {
+                        return false;
+                    }
+                }
+                public Object getResult() { return getActFiles(basePath).size(); }
             };
-            
-            complete(t, tc, tmoSec, TimeUnit.SECONDS);
+
+            // if we time out we probably need to know which files are present to diagnose
+            try {
+                complete(t, tc, tmoSec, TimeUnit.SECONDS);
+            } catch(Exception e) {
+                System.out.println("completed with exception: "+e);
+            }
 
             System.out.println("########## "+t.getName());
-
-            // right number of files?
-            List<Path> actFiles = getActFiles(basePath);
-            System.out.println("actFiles: "+actFiles);
-            assertEquals(actFiles.toString(), expResults.size(), actFiles.size());
             
-            // do the file(s) have the right contents?
-            System.out.println("expResults: "+expResults);
-            int i = 0;
-            for (List<T> expFile : expResults) {
-                Path path = actFiles.get(i++);
-                checkContents(path, expFile.toArray(new String[0]));
-            }
+            checkFiles(basePath, expResults, false);
         }
         finally {
             deleteAll(basePath);
         }
     }
     
+    // silent==true => return false on fail; silent==false => asserts/throws on fail
+    private <T> boolean checkFiles(Path basePath, List<List<T>> expResults, boolean silent) {
+
+        // right number of files?
+        List<Path> actFiles = getActFiles(basePath);
+        if (!silent) System.out.println("actFiles: "+actFiles);
+        if (!silent) 
+            assertEquals(actFiles.toString(), expResults.size(), actFiles.size());
+        else if (expResults.size() != actFiles.size())
+            return false;
+        
+        // do the file(s) have the right contents?
+        if (!silent) System.out.println("expResults: "+expResults);
+        int i = 0;
+        for (List<T> expFile : expResults) {
+            Path path = actFiles.get(i++);
+            if (!checkContents(path, expFile.toArray(new String[0]), silent))
+                return false;
+        }
+        
+        return true;
+    }
+    
     private void deleteAll(Path basePath) {
         Path parent = basePath.getParent();
         String baseLeaf = basePath.getFileName().toString();
@@ -898,28 +952,39 @@
         return paths;
     }
     
-    private void checkContents(Path path, String[] lines) {
+    // silent==true => return false on fail; silent==false => asserts/throws on fail
+    private boolean checkContents(Path path, String[] lines, boolean silent) {
         if (path.getFileName().toString().endsWith(".zip")) {
-          checkZipContents(path, lines);
-          return;
+          return checkZipContents(path, lines, silent);
         }
-        System.out.println("checking file "+path);
+        if (!silent) System.out.println("checking file "+path);
         int lineCnt = 0;
-        try (BufferedReader br = Files.newBufferedReader(path)) {
+        try (BufferedReader br = newBufferedReader(path)) {
             for (String line : lines) {
                 ++lineCnt;
                 String actLine = br.readLine();
-                assertEquals("path:"+path+" line "+lineCnt, line, actLine);
+                if (!silent)
+                    assertEquals("path:"+path+" line "+lineCnt, line, actLine);
+                else if (!line.equals(actLine))
+                    return false;
             }
-            assertNull("path:"+path+" line "+lineCnt+" expected EOF", br.readLine());
+            if (!silent)
+                assertNull("path:"+path+" line "+lineCnt+" expected EOF", br.readLine());
+            else if (null != br.readLine())
+                return false;
         }
         catch (IOException e) {
-            assertNull("path:"+path+" line "+lineCnt+" unexpected IOException "+e, e);
+            if (!silent)
+                assertNull("path:"+path+" line "+lineCnt+" unexpected IOException "+e, e);
+            else
+                return false;
         }
+        return true;
     }
     
-    private void checkZipContents(Path path, String[] lines) {
-        System.out.println("checking file "+path);
+    // silent==true => return false on fail; silent==false => asserts/throws on fail
+    private boolean checkZipContents(Path path, String[] lines, boolean silent) {
+        if (!silent) System.out.println("checking file "+path);
         String fileName = path.getFileName().toString();
         String entryName = fileName.substring(0, fileName.length() - ".zip".length());
         int lineCnt = 0;
@@ -930,18 +995,31 @@
         {
           ZipEntry entry = zin.getNextEntry();
           
-          assertEquals(entryName, entry.getName());
+          if (!silent)
+              assertEquals(entryName, entry.getName());
+          else if (!entryName.equals(entry.getName()))
+              return false;
 
           BufferedReader br = new BufferedReader(new InputStreamReader(zin, StandardCharsets.UTF_8));
           for (String line : lines) {
             ++lineCnt;
             String actLine = br.readLine();
-            assertEquals("path:"+path+" line "+lineCnt, line, actLine);
+            if (!silent)
+                assertEquals("path:"+path+" line "+lineCnt, line, actLine);
+            else if (!line.equals(actLine))
+                return false;
           }
-          assertNull("path:"+path+" line "+lineCnt+" expected EOF", br.readLine());
+          if (!silent)
+              assertNull("path:"+path+" line "+lineCnt+" expected EOF", br.readLine());
+          else if (null != br.readLine())
+              return false;
         }
         catch (IOException e) {
-          assertNull("path:"+path+" line "+lineCnt+" unexpected IOException "+e, e);
+            if (!silent)
+                assertNull("path:"+path+" line "+lineCnt+" unexpected IOException "+e, e);
+            else
+                return false;
         }
+        return true;
     }
 }
diff --git a/connectors/http/build.gradle b/connectors/http/build.gradle
deleted file mode 100644
index caf8636..0000000
--- a/connectors/http/build.gradle
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-dependencies {
-  addTargetDirProjectJarDependency 'compile', ':api:topology'
-  addProjectExtDependency 'compile', 'org.apache.httpcomponents:httpclient:4.5.1'
-  addProjectExtDependency 'compile', 'org.apache.httpcomponents:httpcore:4.4.4'
-  addTargetDirCoreExtJarDependencies 'compile'
-  
-  addTargetDirProjectJarDependency 'testCompile', ':providers:direct'
-  // N.B. root project adds test common dependencies
-}
-
-addCompileTestDependencies ':api:topology', ':providers:direct'
diff --git a/connectors/http/pom.xml b/connectors/http/pom.xml
new file mode 100644
index 0000000..81345d7
--- /dev/null
+++ b/connectors/http/pom.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-http</artifactId>
+
+  <name>Apache Edgent (Java 8): Connectors: HTTP</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.httpcomponents</groupId>
+      <artifactId>httpclient</artifactId>
+      <version>4.5.1</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.httpcomponents</groupId>
+      <artifactId>httpcore</artifactId>
+      <version>4.4.4</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/connectors/http/src/test/java/org/apache/edgent/test/connectors/http/HttpTest.java b/connectors/http/src/test/java/org/apache/edgent/test/connectors/http/HttpTest.java
index 0511150..9f08879 100644
--- a/connectors/http/src/test/java/org/apache/edgent/test/connectors/http/HttpTest.java
+++ b/connectors/http/src/test/java/org/apache/edgent/test/connectors/http/HttpTest.java
@@ -184,7 +184,7 @@
     /**
      * Test basic authentication, first with valid user/password
      * and then with invalid (results in 401).
-     * @throws Exception
+     * @throws Exception on failure
      */
     @Test
     public void testBasicAuthentication() throws Exception {
diff --git a/connectors/iot/build.gradle b/connectors/iot/build.gradle
deleted file mode 100644
index 6a86d26..0000000
--- a/connectors/iot/build.gradle
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-dependencies {
-  addTargetDirProjectJarDependency 'compile', ':api:topology'
-  addTargetDirCoreExtJarDependencies 'compile'
-  
-  addTargetDirProjectJarDependency 'testCompile', ':providers:direct'
-  // N.B. root project adds test common dependencies
-}
-
-addCompileTestDependencies ':api:topology', ':providers:direct'
diff --git a/connectors/iot/pom.xml b/connectors/iot/pom.xml
new file mode 100644
index 0000000..80a9c1b
--- /dev/null
+++ b/connectors/iot/pom.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-iot</artifactId>
+
+  <name>Apache Edgent (Java 8): Connectors: IoT</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-function</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/connectors/iotp/build.gradle b/connectors/iotp/build.gradle
deleted file mode 100644
index c5e2390..0000000
--- a/connectors/iotp/build.gradle
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-dependencies {
-  addTargetDirProjectJarDependency 'compile', ':api:topology'
-  addTargetDirProjectJarDependency 'compile', ':connectors:iot'
-  addProjectExtDependency 'compile', 'com.ibm.messaging:watson-iot:0.2.2'
-  addTargetDirCoreExtJarDependencies 'compile'
-  
-  addTargetDirProjectJarDependency 'testCompile', ':providers:direct'
-  // N.B. root project adds test common dependencies
-}
-
-addCompileTestDependencies ':api:topology', ':providers:direct'
diff --git a/connectors/iotp/pom.xml b/connectors/iotp/pom.xml
new file mode 100644
index 0000000..da3bb7c
--- /dev/null
+++ b/connectors/iotp/pom.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-iotp</artifactId>
+
+  <name>Apache Edgent (Java 8): Connectors: IoTP</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-function</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-connectors-iot</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>com.ibm.messaging</groupId>
+      <artifactId>watson-iot</artifactId>
+      <version>0.2.2</version>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/connectors/iotp/src/main/java/org/apache/edgent/connectors/iotp/IotpGWDevice.java b/connectors/iotp/src/main/java/org/apache/edgent/connectors/iotp/IotpGWDevice.java
index 786fd59..bfebebc 100644
--- a/connectors/iotp/src/main/java/org/apache/edgent/connectors/iotp/IotpGWDevice.java
+++ b/connectors/iotp/src/main/java/org/apache/edgent/connectors/iotp/IotpGWDevice.java
@@ -91,7 +91,7 @@
   @Override
   public boolean equals(Object o2) {
     return o2 == this 
-        || equals(o2 instanceof IotpGWDevice && ((IotpGWDevice)o2).fqDeviceId.equals(fqDeviceId));
+        || (o2 instanceof IotpGWDevice && ((IotpGWDevice)o2).fqDeviceId.equals(fqDeviceId));
   }
 
   @Override
diff --git a/connectors/javax.websocket-client/build.gradle b/connectors/javax.websocket-client/build.gradle
deleted file mode 100644
index 0391c10..0000000
--- a/connectors/javax.websocket-client/build.gradle
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-archivesBaseName = project.name
-
-dependencies {
-  addTargetDirProjectJarDependency 'compile', ':connectors:edgent.javax.websocket'
-  addProjectExtDependency 'compile', 'org.eclipse.jetty.websocket:javax-websocket-client-impl:9.3.6.v20151106'
-  
-  // N.B. root project adds test common dependencies
-}
diff --git a/connectors/javax.websocket-client/src/main/resources/META-INF/services/org.apache.edgent.javax.websocket.EdgentSslContainerProvider b/connectors/javax.websocket-client/src/main/resources/META-INF/services/org.apache.edgent.javax.websocket.EdgentSslContainerProvider
deleted file mode 100644
index 7ebe858..0000000
--- a/connectors/javax.websocket-client/src/main/resources/META-INF/services/org.apache.edgent.javax.websocket.EdgentSslContainerProvider
+++ /dev/null
@@ -1 +0,0 @@
-org.apache.edgent.javax.websocket.impl.EdgentSslContainerProviderImpl
\ No newline at end of file
diff --git a/connectors/javax.websocket-server/build.gradle b/connectors/javax.websocket-server/build.gradle
deleted file mode 100644
index 16d7f5f..0000000
--- a/connectors/javax.websocket-server/build.gradle
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-archivesBaseName = project.name
-
-dependencies {
-  addTargetDirProjectJarDependency 'compile', ':connectors:javax.websocket-client'
-  addProjectExtDependency 'compile', 'org.eclipse.jetty.websocket:javax-websocket-server-impl:9.3.6.v20151106'
-  
-  // N.B. root project adds test common dependencies
-}
diff --git a/connectors/jdbc/.gitignore b/connectors/jdbc/.gitignore
new file mode 100644
index 0000000..14903f1
--- /dev/null
+++ b/connectors/jdbc/.gitignore
@@ -0,0 +1,3 @@
+# test created swill
+derby.log
+/JdbcStreamsTestDb
diff --git a/connectors/jdbc/build.gradle b/connectors/jdbc/build.gradle
deleted file mode 100644
index 0eef8c2..0000000
--- a/connectors/jdbc/build.gradle
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-dependencies {
-  addTargetDirProjectJarDependency 'compile', ':api:topology'
-  addTargetDirCoreExtJarDependencies 'compile'
-  addTargetDirProjectJarDependency 'testCompile', ':providers:direct'
-  
-  testCompile files("${System.env.DERBY_HOME}/lib/derby.jar")
-  // N.B. root project adds test common dependencies
-}
-
-addCompileTestDependencies ':api:topology', ':providers:direct', ':connectors:common'
diff --git a/connectors/jdbc/pom.xml b/connectors/jdbc/pom.xml
new file mode 100644
index 0000000..d442266
--- /dev/null
+++ b/connectors/jdbc/pom.xml
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-jdbc</artifactId>
+
+  <name>Apache Edgent (Java 8): Connectors: JDBC</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <configuration>
+          <!--
+                Set an environment variable to make sure any derby log is created
+                inside the target directory as well as pass in a location for
+                creating the database.
+          -->
+          <systemProperties>
+            <property>
+              <name>jdbcStreamsTest.tmpdir</name>
+              <value>${project.build.directory}/jdbc-test-tmp</value>
+            </property>
+            <property>
+              <name>derby.stream.error.file</name>
+              <value>${project.build.directory}/derby.log</value>
+            </property>
+          </systemProperties>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-function</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-connectors-common</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <!-- https://mvnrepository.com/artifact/org.apache.derby/derby -->
+    <dependency>
+      <groupId>org.apache.derby</groupId>
+      <artifactId>derby</artifactId>
+      <version>10.13.1.1</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/connectors/jdbc/src/test/java/org/apache/edgent/test/connectors/jdbc/JdbcStreamsTest.java b/connectors/jdbc/src/test/java/org/apache/edgent/test/connectors/jdbc/JdbcStreamsTest.java
index a15b9d9..a284340 100644
--- a/connectors/jdbc/src/test/java/org/apache/edgent/test/connectors/jdbc/JdbcStreamsTest.java
+++ b/connectors/jdbc/src/test/java/org/apache/edgent/test/connectors/jdbc/JdbcStreamsTest.java
@@ -20,6 +20,7 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
 import static org.junit.Assume.assumeTrue;
 
 import java.lang.reflect.Method;
@@ -32,43 +33,46 @@
 import java.util.List;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
-import java.util.stream.Collectors;
 
 import javax.sql.DataSource;
 
 import org.apache.edgent.connectors.jdbc.JdbcStreams;
+import org.apache.edgent.function.Predicate;
 import org.apache.edgent.test.connectors.common.ConnectorTestBase;
 import org.apache.edgent.topology.TSink;
 import org.apache.edgent.topology.TStream;
 import org.apache.edgent.topology.Topology;
 import org.apache.edgent.topology.plumbing.PlumbingStreams;
+import org.apache.edgent.topology.tester.Condition;
 import org.junit.Test;
 
 /**
  * JdbcStreams connector tests.
  * <p>
  * The tests use Apache Embedded Derby as the backing dbms.
- * The Oracle JDK includes Derby in $JAVA_HOME/db.
- * Manually install Derby for other JDKs if required.
- * Arrange for the classpath to be configured by one of:
- * <ul>
- * <li>manually add derby.jar to the classpath</li>
- * <li>set the DERBY_HOME environment variable.  connectors/jdbc/build.gradle adds 
- *     $DERBY_HOME/lib/derby.jar to the classpath when running the tests.
- *     e.g., try
- *     <ul>
- *       <li> export DERBY_HOME=$JAVA_HOME/db</li>
- *       <li> OSX: export DERBY_HOME=`/usr/libexec/java_home`/db
- *     </ul>
- *     </li>
- * </ul>
+ * The connectors/jdbc/pom.xml includes a "test" dependency on derby 
+ * so execution of the test via maven automatially retrieves and adds
+ * the derby jar to the classpath.  
+ * The pom also defines jdbcStreamsTest.tmpdir and redirects the derby.log location.
+ * <p>
+ * If running the test from Eclipse you may have to manually add derby.jar
+ * to the test's classpath.
+ * The Oracle JDK includes Derby in $JAVA_HOME/db/lib/derby.jar.
+ * <p>
  * The tests are "skipped" if the dbms's jdbc driver can't be found.
  */
 public class JdbcStreamsTest  extends ConnectorTestBase {
     
     private static final int SEC_TIMEOUT = 10;
-    private final static String DB_NAME = "JdbcStreamsTestDb";
-    private final static String USERNAME = System.getProperty("user.name");
+    private final static String TMPDIR_PROPERTY_NAME = "jdbcStreamsTest.tmpdir";
+    private final static String TMPDIR = System.getProperty(TMPDIR_PROPERTY_NAME, "");
+    static {
+        if (TMPDIR.equals("")) {
+            throw new RuntimeException("System property \""+TMPDIR_PROPERTY_NAME+"\" is not set.");
+        }
+    }
+    private final static String DB_NAME = TMPDIR + "/JdbcStreamsTestDb";
+    private final static String USERNAME = "test"; // can't contain "."
     private final static String PW = "none";
     private static final List<Person> personList = new ArrayList<>();
     static {
@@ -124,7 +128,7 @@
     {
         // Avoid a compile-time dependency to the jdbc driver.
         // At runtime, require that the classpath can find it.
-        // e.g., build.xml adds $DERBY_HOME/lib/derby.jar to the test classpath
+        // e.g., pom.xml adds derby.jar to the test classpath
 
         String DERBY_DATA_SOURCE = "org.apache.derby.jdbc.EmbeddedDataSource";
     
@@ -134,9 +138,6 @@
         }
         catch (ClassNotFoundException e) {
             String msg = "Fix the test classpath. ";
-            if (System.getenv("DERBY_HOME") == null) {
-                msg += "DERBY_HOME not set. ";
-            }
             msg += "Class not found: "+e.getLocalizedMessage();
             System.err.println(msg);
             assumeTrue(false);
@@ -236,15 +237,18 @@
         return rcvdPerson;
     }
     
-    private static java.util.function.Predicate<Person> newOddIdPredicate() {
+    private static Predicate<Person> newOddIdPredicate() {
         return (person) -> person.id % 2 != 0;
     }
     
-    private List<String> expectedPersons(java.util.function.Predicate<Person> predicate, List<Person> persons) {
-        return persons.stream()
-                .filter(predicate)
-                .map(person -> person.toString())
-                .collect(Collectors.toList());
+    private List<String> expectedPersons(Predicate<Person> predicate, List<Person> persons) {
+        List<String> expPersons = new ArrayList<>();
+        for (Person p : persons) {
+            if (predicate.test(p)) {
+                expPersons.add(p.toString());
+            }
+        }
+        return expPersons;
     }
 
     @Test
@@ -462,6 +466,7 @@
                         executionExcCnt.incrementAndGet();
                         return;
                     }
+                    // don't ever expect to get here in this case
                     resultSet.next();
                     int id = resultSet.getInt("id");
                     String firstName = resultSet.getString("firstname");
@@ -473,10 +478,21 @@
                 );
         TStream<String> rcvd = rcvdPerson.map(person -> person.toString());
         
+        // Await completion on having received the correct number of exception.
+        // Then also verify that no non-exceptional results were received.
+        Condition<Object> tc = new Condition<Object>() {
+            public boolean valid() {
+                return executionExcCnt.get() == expectedExcCnt;
+            }
+            public Object getResult() { return executionExcCnt.get(); }
+        };
+        Condition<List<String>> rcvdContents = t.getTester().streamContents(rcvd, expected.toArray(new String[0]));
+        
         rcvd.sink(tuple -> System.out.println(
                 String.format("%s rcvd: %s", t.getName(), tuple)));
-        completeAndValidate("", t, rcvd, SEC_TIMEOUT, expected.toArray(new String[0]));
+        complete(t, tc, SEC_TIMEOUT, TimeUnit.SECONDS);
         assertEquals("executionExcCnt", expectedExcCnt, executionExcCnt.get());
+        assertTrue("rcvd: "+rcvdContents.getResult(), rcvdContents.valid());
     }
     
     @Test
diff --git a/connectors/kafka/build.gradle b/connectors/kafka/build.gradle
deleted file mode 100644
index 047bed7..0000000
--- a/connectors/kafka/build.gradle
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-dependencies {
-  addTargetDirProjectJarDependency 'compile', ':api:topology'
-  
-  // The pom for kafka includes dependencies that don't make sense for us.
-  // In at least one case kafka dependencies include a slf4j *implementation* jar
-  // and that conflicts with our samples' binding to a particular
-  // version of slf4j implementation.
-  // This all seems like fallout from, I believe, the kafka jars containing
-  // the code for their cli tools too, and possibly tests, which need things like:
-  //   slf4j-log4j12, snappy-java, jline, jopt-simple, junit-3.8.1
-  //
-  // So at least for now, avoid transitive and just match our ant based config
-  //
-  // addProjectExtDependency 'compile', 'org.apache.kafka:kafka_2.10:0.8.2.2'
-  // addProjectExtDependency 'compile', 'org.apache.kafka:kafka-clients:0.8.2.2'
-  addProjectExtDependency 'compile', 'org.apache.kafka:kafka_2.10:0.8.2.2@jar'
-  addProjectExtDependency 'compile', 'org.apache.kafka:kafka-clients:0.8.2.2@jar'
-  addProjectExtDependency 'compile', 'log4j:log4j:1.2.16@jar'
-  addProjectExtDependency 'compile', 'com.yammer.metrics:metrics-core:2.2.0@jar'
-  addProjectExtDependency 'compile', 'org.scala-lang:scala-library:2.10.4@jar'
-  addProjectExtDependency 'compile', 'com.101tec:zkclient:0.3@jar'
-  addProjectExtDependency 'compile', 'org.apache.zookeeper:zookeeper:3.4.6@jar'
-  
-  addTargetDirCoreExtJarDependencies 'compile'
-  
-  addTargetDirProjectJarDependency 'testCompile', ':providers:direct'
-  // N.B. root project adds test common dependencies
-}
-
-addCompileTestDependencies ':api:topology', ':providers:direct', ':connectors:common'
diff --git a/connectors/kafka/pom.xml b/connectors/kafka/pom.xml
new file mode 100644
index 0000000..e2d3b09
--- /dev/null
+++ b/connectors/kafka/pom.xml
@@ -0,0 +1,162 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-kafka</artifactId>
+
+  <name>Apache Edgent (Java 8): Connectors: Kafka</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <!--
+   The pom for kafka includes dependencies that don't make sense for us.
+   In at least one case kafka dependencies include a slf4j *implementation* jar
+   and that conflicts with our samples' binding to a particular
+   version of slf4j implementation.
+   This all seems like fallout from, I believe, the kafka jars containing
+   the code for their cli tools too, and possibly tests, which need things like:
+     slf4j-log4j12, snappy-java, jline, jopt-simple, junit-3.8.1
+
+   So at least for now, avoid transitive and just match our ant/gradle based
+   config.  Include only the exact dependencies that our kafka
+   dependency requires to function properly.
+   -->
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.kafka</groupId>
+      <artifactId>kafka_2.10</artifactId>
+      <version>0.8.2.2</version>
+      <exclusions>
+        <exclusion> <!-- not transitive -->
+          <groupId>*</groupId>
+          <artifactId>*</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.kafka</groupId>
+      <artifactId>kafka-clients</artifactId>
+      <version>0.8.2.2</version>
+      <exclusions>
+        <exclusion> <!-- not transitive -->
+          <groupId>*</groupId>
+          <artifactId>*</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
+      <version>1.2.16</version>
+      <exclusions>
+        <exclusion> <!-- not transitive -->
+          <groupId>*</groupId>
+          <artifactId>*</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>com.yammer.metrics</groupId>
+      <artifactId>metrics-core</artifactId>
+      <version>2.2.0</version>
+      <exclusions>
+        <exclusion> <!-- not transitive -->
+          <groupId>*</groupId>
+          <artifactId>*</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>org.scala-lang</groupId>
+      <artifactId>scala-library</artifactId>
+      <version>2.10.4</version>
+      <exclusions>
+        <exclusion> <!-- not transitive -->
+          <groupId>*</groupId>
+          <artifactId>*</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>com.101tec</groupId>
+      <artifactId>zkclient</artifactId>
+      <version>0.3</version>
+      <exclusions>
+        <exclusion> <!-- not transitive -->
+          <groupId>*</groupId>
+          <artifactId>*</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.zookeeper</groupId>
+      <artifactId>zookeeper</artifactId>
+      <version>3.4.6</version>
+      <exclusions>
+        <exclusion> <!-- not transitive -->
+          <groupId>*</groupId>
+          <artifactId>*</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-connectors-common</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/connectors/kafka/src/main/java/org/apache/edgent/connectors/kafka/package-info.java b/connectors/kafka/src/main/java/org/apache/edgent/connectors/kafka/package-info.java
index 3e27717..b62af36 100644
--- a/connectors/kafka/src/main/java/org/apache/edgent/connectors/kafka/package-info.java
+++ b/connectors/kafka/src/main/java/org/apache/edgent/connectors/kafka/package-info.java
@@ -17,7 +17,7 @@
 under the License.
 */
 /**
- * Apache Kafka enterprise messing hub stream connector.
+ * Apache Kafka enterprise messaging hub stream connector.
  * <p>
  * The connector uses and includes components from the Kafka 0.8.2.2 release.
  * It has been successfully tested against kafka_2.11-0.10.1.0 and kafka_2.11-0.9.0.0 server as well.
diff --git a/connectors/kafka/src/test/java/org/apache/edgent/test/connectors/kafka/KafkaStreamsSkipMeTest.java b/connectors/kafka/src/test/java/org/apache/edgent/test/connectors/kafka/KafkaStreamsSkipMeTest.java
index 78bdc47..fbc9a8c 100644
--- a/connectors/kafka/src/test/java/org/apache/edgent/test/connectors/kafka/KafkaStreamsSkipMeTest.java
+++ b/connectors/kafka/src/test/java/org/apache/edgent/test/connectors/kafka/KafkaStreamsSkipMeTest.java
@@ -23,7 +23,7 @@
 import org.junit.Test;
 
 /*
- * Our current gradle driven test config (test filtering with
+ * Our current maven/gradle driven test config (test filtering with
  * includeTestsMatching '*Test') results in failing a project's
  * test task if the project lacks any "*Test" classes.
  * 
diff --git a/connectors/mqtt/build.gradle b/connectors/mqtt/build.gradle
deleted file mode 100644
index 2d1d32e..0000000
--- a/connectors/mqtt/build.gradle
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-dependencies {
-  addTargetDirProjectJarDependency 'compile', ':api:topology'
-  addTargetDirProjectJarDependency 'compile', ':connectors:iot'
-  addTargetDirProjectJarDependency 'compile', ':connectors:common'
-  addProjectExtDependency 'compile', 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0'
-  
-  addTargetDirProjectJarDependency 'testCompile', ':providers:direct'
-  // N.B. root project adds test common dependencies
-}
-
-addCompileTestDependencies ':api:topology', ':providers:direct', ':connectors:common'
diff --git a/connectors/mqtt/pom.xml b/connectors/mqtt/pom.xml
new file mode 100644
index 0000000..e3192e2
--- /dev/null
+++ b/connectors/mqtt/pom.xml
@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-mqtt</artifactId>
+
+  <name>Apache Edgent (Java 8): Connectors: MQTT</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.rat</groupId>
+        <artifactId>apache-rat-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>license-check</id>
+            <phase>verify</phase>
+            <goals>
+              <goal>check</goal>
+            </goals>
+          </execution>
+        </executions>
+        <configuration>
+          <excludes combine.children="append">
+            <exclude>src/test/resources/keystores/*.crt</exclude>
+            <exclude>src/test/resources/keystores/*.key</exclude>
+            <exclude>src/test/resources/keystores/*.srl</exclude>
+            <exclude>src/test/resources/keystores/*.csr</exclude>
+            <exclude>src/test/resources/keystores/*.p12</exclude>
+            <exclude>src/test/resources/keystores/mosquitto-SSL.conf.template</exclude>
+            <exclude>src/test/resources/keystores/mosquitto.org.crt</exclude>
+          </excludes>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-connectors-iot</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-connectors-common</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.paho</groupId>
+      <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
+      <version>1.1.0</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-connectors-common</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
+      <version>3.4</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/connectors/mqtt/src/test/java/org/apache/edgent/test/connectors/mqtt/MqttStreamsTestManual.java b/connectors/mqtt/src/test/java/org/apache/edgent/test/connectors/mqtt/MqttStreamsTestManual.java
index 2ab320d..4eae1f1 100644
--- a/connectors/mqtt/src/test/java/org/apache/edgent/test/connectors/mqtt/MqttStreamsTestManual.java
+++ b/connectors/mqtt/src/test/java/org/apache/edgent/test/connectors/mqtt/MqttStreamsTestManual.java
@@ -38,8 +38,8 @@
 import java.util.Properties;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
-import java.util.stream.Collectors;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.edgent.connectors.mqtt.MqttConfig;
 import org.apache.edgent.connectors.mqtt.MqttStreams;
 import org.apache.edgent.function.BiFunction;
@@ -112,7 +112,7 @@
     }
     
     protected String getKeystorePath(String storeLeaf) {
-        return TestRepoPath.getPath("connectors", "mqtt", "src", "test", "keystores", storeLeaf);
+        return TestRepoPath.getPath("keystores/" + storeLeaf);
     }
     
     private MqttConfig newConfig(String serverURL, String clientId) {
@@ -295,6 +295,14 @@
         completeAndValidate(clientId, top, rcvd, mgen, SEC_TIMEOUT, msgs.toArray(new String[0]));
     }
     
+    private List<String> msgsAsStr(String topic, List<String> msgs) {
+        List<String> msgsAsStr = new ArrayList<>();
+        for (String msgStr : msgs) {
+            msgsAsStr.add(new Msg(msgStr, topic).toString());
+        }
+        return msgsAsStr;
+    }
+    
     @Test
     public void testGenericPublish() throws Exception {
         Topology top = newTopology("testGenericPublish");
@@ -306,11 +314,7 @@
         // and use a different topic
         String topic = getMqttTopics()[0] + "-Generic";
         List<String> msgs = createMsgs(mgen, topic, getMsg1(), getMsg2());
-        List<String> expMsgsAsStr = 
-                msgs
-                .stream()
-                .map(t -> (new Msg(t, topic)).toString())
-                .collect(Collectors.toList());
+        List<String> expMsgsAsStr = msgsAsStr(topic, msgs);
 
         TStream<Msg> s = PlumbingStreams.blockingOneShotDelay(
                 top.collection(msgs), PUB_DELAY_MSEC, TimeUnit.MILLISECONDS)
@@ -491,17 +495,24 @@
                 top.collection(msgs), PUB_DELAY_MSEC, TimeUnit.MILLISECONDS);
         
         // Code coverage test: induce connection failure
-        //
-        // At this point the only thing we can check is an expected
-        // result of 0 msgs received.
         
         MqttConfig config = newConfig("tcp://localhost:31999", clientId);
         MqttStreams mqtt = new MqttStreams(top, () -> config);
 
         mqtt.publish(s, topic, qos, retain);
-        TStream<String> rcvd = mqtt.subscribe(topic, qos);
-
-        completeAndValidate(clientId, top, rcvd, mgen, SEC_TIMEOUT, new String[0]);
+        TStream<String> rcvd = mqtt.subscribe(topic, qos);  // rcv nothing
+        
+        // in this case there's no useful condition that we can check for
+        // to validate this is behaving properly other than the connector doesn't
+        // blow up and that nothing is rcvd, so just wait a short time
+        // before verifying nothing was rcvd.
+        // Don't use the complete() TMO for successful termination.
+        
+        Condition<List<String>> rcvdContent = top.getTester().streamContents(rcvd, new String[0]);
+        Condition<Object> tc = newWaitTimeCondition(3);
+        
+        complete(top, tc, SEC_TIMEOUT, TimeUnit.SECONDS);
+        assertTrue("rcvd: "+rcvdContent.getResult(), rcvdContent.valid());
     }
     
     private String retainTestSetup(boolean isRetained, MsgGenerator mgen) throws Exception {
@@ -550,11 +561,7 @@
         
         // verify the next connect/subscribe [doesn't] sees the retain and then new msgs
         List<String> msgs = createMsgs(mgen, topic, getMsg1(), getMsg2());
-        List<String> expMsgsAsStr = 
-                msgs
-                .stream()
-                .map(t -> (new Msg(t, topic)).toString())
-                .collect(Collectors.toList());
+        List<String> expMsgsAsStr = msgsAsStr(topic, msgs);
         if (isRetained)
             expMsgsAsStr.add(0, (new Msg(retainedMsg, topic)).toString());
 
@@ -592,11 +599,7 @@
         
         // verify the next connect/subscribe [doesn't] sees the retain and then new msgs
         List<String> msgs = createMsgs(mgen, topic, getMsg1(), getMsg2());
-        List<String> expMsgsAsStr = 
-                msgs
-                .stream()
-                .map(t -> (new Msg(t, topic)).toString())
-                .collect(Collectors.toList());
+        List<String> expMsgsAsStr = msgsAsStr(topic, msgs);
         if (isRetained)
             expMsgsAsStr.add(0, (new Msg(retainedMsg, topic)).toString());
 
@@ -796,7 +799,7 @@
 //        propTester.add("mqtt.persistence", "some.persistence.classname",
 //                () -> configRef.get().getPersistence());
         propTester.add("mqtt.serverURLs", "tcp://somehost:1234,ssl://somehost:5678",
-                () -> String.join(",", configRef.get().getServerURLs()));
+                () -> StringUtils.join(configRef.get().getServerURLs(), ","));
         propTester.add("mqtt.subscriberIdleReconnectIntervalSec", "14", 
                 () -> ((Integer)configRef.get().getSubscriberIdleReconnectInterval()).toString());
         propTester.add("mqtt.trustStore", "some/path/truststore",
diff --git a/connectors/mqtt/src/test/keystores/README b/connectors/mqtt/src/test/resources/keystores/README
similarity index 100%
rename from connectors/mqtt/src/test/keystores/README
rename to connectors/mqtt/src/test/resources/keystores/README
diff --git a/connectors/mqtt/src/test/keystores/ca.crt b/connectors/mqtt/src/test/resources/keystores/ca.crt
similarity index 100%
rename from connectors/mqtt/src/test/keystores/ca.crt
rename to connectors/mqtt/src/test/resources/keystores/ca.crt
diff --git a/connectors/mqtt/src/test/keystores/ca.key b/connectors/mqtt/src/test/resources/keystores/ca.key
similarity index 100%
rename from connectors/mqtt/src/test/keystores/ca.key
rename to connectors/mqtt/src/test/resources/keystores/ca.key
diff --git a/connectors/mqtt/src/test/keystores/ca.srl b/connectors/mqtt/src/test/resources/keystores/ca.srl
similarity index 100%
rename from connectors/mqtt/src/test/keystores/ca.srl
rename to connectors/mqtt/src/test/resources/keystores/ca.srl
diff --git a/connectors/mqtt/src/test/keystores/client.crt b/connectors/mqtt/src/test/resources/keystores/client.crt
similarity index 100%
rename from connectors/mqtt/src/test/keystores/client.crt
rename to connectors/mqtt/src/test/resources/keystores/client.crt
diff --git a/connectors/mqtt/src/test/keystores/client.csr b/connectors/mqtt/src/test/resources/keystores/client.csr
similarity index 100%
rename from connectors/mqtt/src/test/keystores/client.csr
rename to connectors/mqtt/src/test/resources/keystores/client.csr
diff --git a/connectors/mqtt/src/test/keystores/client.key b/connectors/mqtt/src/test/resources/keystores/client.key
similarity index 100%
rename from connectors/mqtt/src/test/keystores/client.key
rename to connectors/mqtt/src/test/resources/keystores/client.key
diff --git a/connectors/mqtt/src/test/keystores/client.p12 b/connectors/mqtt/src/test/resources/keystores/client.p12
similarity index 100%
rename from connectors/mqtt/src/test/keystores/client.p12
rename to connectors/mqtt/src/test/resources/keystores/client.p12
Binary files differ
diff --git a/connectors/mqtt/src/test/keystores/clientKeyStore.jks b/connectors/mqtt/src/test/resources/keystores/clientKeyStore.jks
similarity index 100%
rename from connectors/mqtt/src/test/keystores/clientKeyStore.jks
rename to connectors/mqtt/src/test/resources/keystores/clientKeyStore.jks
Binary files differ
diff --git a/connectors/mqtt/src/test/keystores/clientTrustStore.jks b/connectors/mqtt/src/test/resources/keystores/clientTrustStore.jks
similarity index 100%
rename from connectors/mqtt/src/test/keystores/clientTrustStore.jks
rename to connectors/mqtt/src/test/resources/keystores/clientTrustStore.jks
Binary files differ
diff --git a/connectors/mqtt/src/test/keystores/create-all.sh b/connectors/mqtt/src/test/resources/keystores/create-all.sh
similarity index 100%
rename from connectors/mqtt/src/test/keystores/create-all.sh
rename to connectors/mqtt/src/test/resources/keystores/create-all.sh
diff --git a/connectors/mqtt/src/test/keystores/mosquitto-SSL.conf.template b/connectors/mqtt/src/test/resources/keystores/mosquitto-SSL.conf.template
similarity index 100%
rename from connectors/mqtt/src/test/keystores/mosquitto-SSL.conf.template
rename to connectors/mqtt/src/test/resources/keystores/mosquitto-SSL.conf.template
diff --git a/connectors/mqtt/src/test/keystores/mosquitto.org.crt b/connectors/mqtt/src/test/resources/keystores/mosquitto.org.crt
similarity index 100%
rename from connectors/mqtt/src/test/keystores/mosquitto.org.crt
rename to connectors/mqtt/src/test/resources/keystores/mosquitto.org.crt
diff --git a/connectors/mqtt/src/test/keystores/server.crt b/connectors/mqtt/src/test/resources/keystores/server.crt
similarity index 100%
rename from connectors/mqtt/src/test/keystores/server.crt
rename to connectors/mqtt/src/test/resources/keystores/server.crt
diff --git a/connectors/mqtt/src/test/keystores/server.csr b/connectors/mqtt/src/test/resources/keystores/server.csr
similarity index 100%
rename from connectors/mqtt/src/test/keystores/server.csr
rename to connectors/mqtt/src/test/resources/keystores/server.csr
diff --git a/connectors/mqtt/src/test/keystores/server.key b/connectors/mqtt/src/test/resources/keystores/server.key
similarity index 100%
rename from connectors/mqtt/src/test/keystores/server.key
rename to connectors/mqtt/src/test/resources/keystores/server.key
diff --git a/connectors/pom.xml b/connectors/pom.xml
new file mode 100644
index 0000000..47b0f55
--- /dev/null
+++ b/connectors/pom.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-parent</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors</artifactId>
+  <packaging>pom</packaging>
+
+  <name>Apache Edgent (Java 8): Connectors</name>
+
+  <modules>
+    <module>command</module>
+    <module>common</module>
+    <module>csv</module>
+    <module>file</module>
+    <module>http</module>
+    <module>iot</module>
+    <module>iotp</module>
+    <module>jdbc</module>
+    <module>kafka</module>
+    <module>mqtt</module>
+    <module>pubsub</module>
+    <module>serial</module>
+    <module>websocket</module>
+    <module>websocket-base</module>
+    <module>websocket-jetty</module>
+    <module>websocket-misc</module>
+    <module>websocket-server</module>
+  </modules>
+
+</project>
diff --git a/connectors/pubsub/build.gradle b/connectors/pubsub/build.gradle
deleted file mode 100644
index 6a86d26..0000000
--- a/connectors/pubsub/build.gradle
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-dependencies {
-  addTargetDirProjectJarDependency 'compile', ':api:topology'
-  addTargetDirCoreExtJarDependencies 'compile'
-  
-  addTargetDirProjectJarDependency 'testCompile', ':providers:direct'
-  // N.B. root project adds test common dependencies
-}
-
-addCompileTestDependencies ':api:topology', ':providers:direct'
diff --git a/connectors/pubsub/pom.xml b/connectors/pubsub/pom.xml
new file mode 100644
index 0000000..3d3cdc1
--- /dev/null
+++ b/connectors/pubsub/pom.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-pubsub</artifactId>
+
+  <name>Apache Edgent (Java 8): Connectors: PubSub</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/connectors/pubsub/src/test/java/org/apache/edgent/test/connectors/pubsub/PubSubTest.java b/connectors/pubsub/src/test/java/org/apache/edgent/test/connectors/pubsub/PubSubTest.java
index 8c133e4..d60f0c3 100644
--- a/connectors/pubsub/src/test/java/org/apache/edgent/test/connectors/pubsub/PubSubTest.java
+++ b/connectors/pubsub/src/test/java/org/apache/edgent/test/connectors/pubsub/PubSubTest.java
@@ -46,7 +46,7 @@
     /**
      * Test without a pub-sub service so no
      * cross job connections will be made.
-     * @throws Exception
+     * @throws Exception on failure
      */
     @Test
     public void testNoService() throws Exception {
diff --git a/connectors/serial/build.gradle b/connectors/serial/build.gradle
deleted file mode 100644
index 6a86d26..0000000
--- a/connectors/serial/build.gradle
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-dependencies {
-  addTargetDirProjectJarDependency 'compile', ':api:topology'
-  addTargetDirCoreExtJarDependencies 'compile'
-  
-  addTargetDirProjectJarDependency 'testCompile', ':providers:direct'
-  // N.B. root project adds test common dependencies
-}
-
-addCompileTestDependencies ':api:topology', ':providers:direct'
diff --git a/connectors/serial/pom.xml b/connectors/serial/pom.xml
new file mode 100644
index 0000000..28f001e
--- /dev/null
+++ b/connectors/serial/pom.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-serial</artifactId>
+
+  <name>Apache Edgent (Java 8): Connectors: Serial</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/connectors/websocket-base/pom.xml b/connectors/websocket-base/pom.xml
new file mode 100644
index 0000000..4da4564
--- /dev/null
+++ b/connectors/websocket-base/pom.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-websocket-base</artifactId>
+
+  <name>Apache Edgent (Java 8): Connectors: Websocket: Base</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/connectors/wsclient/src/main/java/org/apache/edgent/connectors/wsclient/WebSocketClient.java b/connectors/websocket-base/src/main/java/org/apache/edgent/connectors/wsclient/WebSocketClient.java
similarity index 100%
rename from connectors/wsclient/src/main/java/org/apache/edgent/connectors/wsclient/WebSocketClient.java
rename to connectors/websocket-base/src/main/java/org/apache/edgent/connectors/wsclient/WebSocketClient.java
diff --git a/connectors/wsclient/src/main/java/org/apache/edgent/connectors/wsclient/package-info.java b/connectors/websocket-base/src/main/java/org/apache/edgent/connectors/wsclient/package-info.java
similarity index 88%
rename from connectors/wsclient/src/main/java/org/apache/edgent/connectors/wsclient/package-info.java
rename to connectors/websocket-base/src/main/java/org/apache/edgent/connectors/wsclient/package-info.java
index c2cc0cb..c508759 100644
--- a/connectors/wsclient/src/main/java/org/apache/edgent/connectors/wsclient/package-info.java
+++ b/connectors/websocket-base/src/main/java/org/apache/edgent/connectors/wsclient/package-info.java
@@ -17,6 +17,6 @@
 under the License.
 */
 /**
- * WebSocket Client Connector API for sending and receiving messages to a WebSocket Server.
+ * A generic WebSocket Client Connector API for sending and receiving messages to a WebSocket Server.
  */
 package org.apache.edgent.connectors.wsclient;
diff --git a/connectors/javax.websocket-client/README b/connectors/websocket-jetty/README
similarity index 100%
rename from connectors/javax.websocket-client/README
rename to connectors/websocket-jetty/README
diff --git a/connectors/websocket-jetty/pom.xml b/connectors/websocket-jetty/pom.xml
new file mode 100644
index 0000000..1f27493
--- /dev/null
+++ b/connectors/websocket-jetty/pom.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-websocket-jetty</artifactId>
+
+  <name>Apache Edgent (Java 8): Connectors: Websocket: Jetty</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-connectors-websocket-misc</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.websocket</groupId>
+      <artifactId>javax-websocket-client-impl</artifactId>
+      <version>9.3.6.v20151106</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/connectors/javax.websocket-client/src/main/java/org/apache/edgent/javax/websocket/impl/EdgentSslContainerProviderImpl.java b/connectors/websocket-jetty/src/main/java/org/apache/edgent/javax/websocket/impl/EdgentSslContainerProviderImpl.java
similarity index 100%
rename from connectors/javax.websocket-client/src/main/java/org/apache/edgent/javax/websocket/impl/EdgentSslContainerProviderImpl.java
rename to connectors/websocket-jetty/src/main/java/org/apache/edgent/javax/websocket/impl/EdgentSslContainerProviderImpl.java
diff --git a/connectors/javax.websocket-client/src/main/java/org/apache/edgent/javax/websocket/impl/package-info.java b/connectors/websocket-jetty/src/main/java/org/apache/edgent/javax/websocket/impl/package-info.java
similarity index 100%
rename from connectors/javax.websocket-client/src/main/java/org/apache/edgent/javax/websocket/impl/package-info.java
rename to connectors/websocket-jetty/src/main/java/org/apache/edgent/javax/websocket/impl/package-info.java
diff --git a/connectors/websocket-jetty/src/main/resources/META-INF/services/org.apache.edgent.javax.websocket.EdgentSslContainerProvider b/connectors/websocket-jetty/src/main/resources/META-INF/services/org.apache.edgent.javax.websocket.EdgentSslContainerProvider
new file mode 100644
index 0000000..8c3cec2
--- /dev/null
+++ b/connectors/websocket-jetty/src/main/resources/META-INF/services/org.apache.edgent.javax.websocket.EdgentSslContainerProvider
@@ -0,0 +1,17 @@
+#
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You under the Apache License, Version 2.0
+#  (the "License"); you may not use this file except in compliance with
+#  the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#  See the License for the specific language governing permissions and
+#  limitations under the License.
+#
+org.apache.edgent.javax.websocket.impl.EdgentSslContainerProviderImpl
\ No newline at end of file
diff --git a/connectors/websocket-misc/pom.xml b/connectors/websocket-misc/pom.xml
new file mode 100644
index 0000000..47a2073
--- /dev/null
+++ b/connectors/websocket-misc/pom.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-websocket-misc</artifactId>
+
+  <name>Apache Edgent (Java 8): Connectors: Websocket: Misc</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>javax.websocket</groupId>
+      <artifactId>javax.websocket-api</artifactId>
+      <version>1.0</version>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/connectors/edgent.javax.websocket/src/main/java/org/apache/edgent/javax/websocket/EdgentSslContainerProvider.java b/connectors/websocket-misc/src/main/java/org/apache/edgent/javax/websocket/EdgentSslContainerProvider.java
similarity index 100%
rename from connectors/edgent.javax.websocket/src/main/java/org/apache/edgent/javax/websocket/EdgentSslContainerProvider.java
rename to connectors/websocket-misc/src/main/java/org/apache/edgent/javax/websocket/EdgentSslContainerProvider.java
diff --git a/connectors/edgent.javax.websocket/src/main/java/org/apache/edgent/javax/websocket/package-info.java b/connectors/websocket-misc/src/main/java/org/apache/edgent/javax/websocket/package-info.java
similarity index 100%
rename from connectors/edgent.javax.websocket/src/main/java/org/apache/edgent/javax/websocket/package-info.java
rename to connectors/websocket-misc/src/main/java/org/apache/edgent/javax/websocket/package-info.java
diff --git a/connectors/javax.websocket-server/README b/connectors/websocket-server/README
similarity index 100%
rename from connectors/javax.websocket-server/README
rename to connectors/websocket-server/README
diff --git a/connectors/websocket-server/pom.xml b/connectors/websocket-server/pom.xml
new file mode 100644
index 0000000..20a7c83
--- /dev/null
+++ b/connectors/websocket-server/pom.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-websocket-server</artifactId>
+
+  <name>Apache Edgent (Java 8): Connectors: Websocket: Server</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-connectors-websocket-jetty</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.websocket</groupId>
+      <artifactId>javax-websocket-server-impl</artifactId>
+      <version>9.3.6.v20151106</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/connectors/websocket/pom.xml b/connectors/websocket/pom.xml
new file mode 100644
index 0000000..f49c8dc
--- /dev/null
+++ b/connectors/websocket/pom.xml
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-websocket</artifactId>
+
+  <name>Apache Edgent (Java 8): Connectors: Websocket</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-connectors-common</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-connectors-websocket-misc</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-connectors-websocket-base</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>javax.websocket</groupId>
+      <artifactId>javax.websocket-api</artifactId>
+      <version>1.0</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-http</artifactId>
+      <version>${jetty.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-server</artifactId>
+      <version>${jetty.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-servlet</artifactId>
+      <version>${jetty.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.websocket</groupId>
+      <artifactId>javax-websocket-server-impl</artifactId>
+      <version>${jetty.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-connectors-common</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-connectors-websocket-jetty</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/connectors/wsclient-javax.websocket/src/main/java/org/apache/edgent/connectors/wsclient/javax/websocket/Jsr356WebSocketClient.java b/connectors/websocket/src/main/java/org/apache/edgent/connectors/wsclient/javax/websocket/Jsr356WebSocketClient.java
similarity index 100%
rename from connectors/wsclient-javax.websocket/src/main/java/org/apache/edgent/connectors/wsclient/javax/websocket/Jsr356WebSocketClient.java
rename to connectors/websocket/src/main/java/org/apache/edgent/connectors/wsclient/javax/websocket/Jsr356WebSocketClient.java
diff --git a/connectors/wsclient-javax.websocket/src/main/java/org/apache/edgent/connectors/wsclient/javax/websocket/package-info.java b/connectors/websocket/src/main/java/org/apache/edgent/connectors/wsclient/javax/websocket/package-info.java
similarity index 88%
rename from connectors/wsclient-javax.websocket/src/main/java/org/apache/edgent/connectors/wsclient/javax/websocket/package-info.java
rename to connectors/websocket/src/main/java/org/apache/edgent/connectors/wsclient/javax/websocket/package-info.java
index 277ce5c..d590d14 100644
--- a/connectors/wsclient-javax.websocket/src/main/java/org/apache/edgent/connectors/wsclient/javax/websocket/package-info.java
+++ b/connectors/websocket/src/main/java/org/apache/edgent/connectors/wsclient/javax/websocket/package-info.java
@@ -17,6 +17,6 @@
 under the License.
 */
 /**
- * WebSocket Client Connector for sending and receiving messages to a WebSocket Server.
+ * A JSR356 based WebSocket Client Connector for sending and receiving messages to a WebSocket Server.
  */
 package org.apache.edgent.connectors.wsclient.javax.websocket;
diff --git a/connectors/wsclient-javax.websocket/src/main/java/org/apache/edgent/connectors/wsclient/javax/websocket/runtime/WebSocketClientBinaryReceiver.java b/connectors/websocket/src/main/java/org/apache/edgent/connectors/wsclient/javax/websocket/runtime/WebSocketClientBinaryReceiver.java
similarity index 100%
rename from connectors/wsclient-javax.websocket/src/main/java/org/apache/edgent/connectors/wsclient/javax/websocket/runtime/WebSocketClientBinaryReceiver.java
rename to connectors/websocket/src/main/java/org/apache/edgent/connectors/wsclient/javax/websocket/runtime/WebSocketClientBinaryReceiver.java
diff --git a/connectors/wsclient-javax.websocket/src/main/java/org/apache/edgent/connectors/wsclient/javax/websocket/runtime/WebSocketClientBinarySender.java b/connectors/websocket/src/main/java/org/apache/edgent/connectors/wsclient/javax/websocket/runtime/WebSocketClientBinarySender.java
similarity index 100%
rename from connectors/wsclient-javax.websocket/src/main/java/org/apache/edgent/connectors/wsclient/javax/websocket/runtime/WebSocketClientBinarySender.java
rename to connectors/websocket/src/main/java/org/apache/edgent/connectors/wsclient/javax/websocket/runtime/WebSocketClientBinarySender.java
diff --git a/connectors/wsclient-javax.websocket/src/main/java/org/apache/edgent/connectors/wsclient/javax/websocket/runtime/WebSocketClientConnector.java b/connectors/websocket/src/main/java/org/apache/edgent/connectors/wsclient/javax/websocket/runtime/WebSocketClientConnector.java
similarity index 100%
rename from connectors/wsclient-javax.websocket/src/main/java/org/apache/edgent/connectors/wsclient/javax/websocket/runtime/WebSocketClientConnector.java
rename to connectors/websocket/src/main/java/org/apache/edgent/connectors/wsclient/javax/websocket/runtime/WebSocketClientConnector.java
diff --git a/connectors/wsclient-javax.websocket/src/main/java/org/apache/edgent/connectors/wsclient/javax/websocket/runtime/WebSocketClientReceiver.java b/connectors/websocket/src/main/java/org/apache/edgent/connectors/wsclient/javax/websocket/runtime/WebSocketClientReceiver.java
similarity index 100%
rename from connectors/wsclient-javax.websocket/src/main/java/org/apache/edgent/connectors/wsclient/javax/websocket/runtime/WebSocketClientReceiver.java
rename to connectors/websocket/src/main/java/org/apache/edgent/connectors/wsclient/javax/websocket/runtime/WebSocketClientReceiver.java
diff --git a/connectors/wsclient-javax.websocket/src/main/java/org/apache/edgent/connectors/wsclient/javax/websocket/runtime/WebSocketClientSender.java b/connectors/websocket/src/main/java/org/apache/edgent/connectors/wsclient/javax/websocket/runtime/WebSocketClientSender.java
similarity index 100%
rename from connectors/wsclient-javax.websocket/src/main/java/org/apache/edgent/connectors/wsclient/javax/websocket/runtime/WebSocketClientSender.java
rename to connectors/websocket/src/main/java/org/apache/edgent/connectors/wsclient/javax/websocket/runtime/WebSocketClientSender.java
diff --git a/connectors/websocket/src/test/java/org/apache/edgent/test/connectors/wsclient/javax/websocket/WebSocketClientConnectTestHelper.java b/connectors/websocket/src/test/java/org/apache/edgent/test/connectors/wsclient/javax/websocket/WebSocketClientConnectTestHelper.java
new file mode 100644
index 0000000..41878f7
--- /dev/null
+++ b/connectors/websocket/src/test/java/org/apache/edgent/test/connectors/wsclient/javax/websocket/WebSocketClientConnectTestHelper.java
@@ -0,0 +1,64 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+package org.apache.edgent.test.connectors.wsclient.javax.websocket;
+
+import java.net.URI;
+import java.util.Properties;
+
+import javax.websocket.ClientEndpoint;
+import javax.websocket.ContainerProvider;
+import javax.websocket.OnError;
+import javax.websocket.Session;
+import javax.websocket.WebSocketContainer;
+
+import org.eclipse.jetty.util.component.LifeCycle;
+
+@ClientEndpoint 
+public class WebSocketClientConnectTestHelper {
+  
+  @OnError
+  public void onError(Session client, Throwable t) {
+    System.err.println("Unable to connect to WebSocket server: "+t.getMessage());
+  }
+
+  public static void connectToServer(Properties config) throws Exception {
+    // Verify we can create a real websocket connection to the server.
+    //
+    // We do the following instead of a simple socket connect
+    // because in at least one location, the websocket connect/upgrade
+    // fails with: expecting 101 got 403 (Forbidden).
+    // There's something about that location that's not
+    // allowing a websocket to be created to the (public) server.
+    // Everything works fine from other locations.
+    //
+    String wsUri = config.getProperty("ws.uri");
+    URI uri = new URI(wsUri);
+    WebSocketContainer container = ContainerProvider.getWebSocketContainer();
+    try {
+      Session session = container.connectToServer(WebSocketClientConnectTestHelper.class,  uri);
+      session.close();
+    }
+    finally {
+      if (container instanceof LifeCycle) {
+        ((LifeCycle)container).stop();
+      }
+    }
+  }
+
+}
diff --git a/connectors/wsclient-javax.websocket/src/test/java/org/apache/edgent/test/connectors/wsclient/javax/websocket/WebSocketClientGlobalTest.java b/connectors/websocket/src/test/java/org/apache/edgent/test/connectors/wsclient/javax/websocket/WebSocketClientGlobalTest.java
similarity index 95%
rename from connectors/wsclient-javax.websocket/src/test/java/org/apache/edgent/test/connectors/wsclient/javax/websocket/WebSocketClientGlobalTest.java
rename to connectors/websocket/src/test/java/org/apache/edgent/test/connectors/wsclient/javax/websocket/WebSocketClientGlobalTest.java
index 5bbed78..9651b19 100644
--- a/connectors/wsclient-javax.websocket/src/test/java/org/apache/edgent/test/connectors/wsclient/javax/websocket/WebSocketClientGlobalTest.java
+++ b/connectors/websocket/src/test/java/org/apache/edgent/test/connectors/wsclient/javax/websocket/WebSocketClientGlobalTest.java
@@ -21,6 +21,7 @@
 /**
  * WebSocketClient connector globalization tests.
  */
+//@Ignore("There seem to be issues with SSL related tests")
 public class WebSocketClientGlobalTest extends WebSocketClientTest {
     private final static String globalStr1 = "一";
     private final static String globalStr2 = "二";
diff --git a/connectors/wsclient-javax.websocket/src/test/java/org/apache/edgent/test/connectors/wsclient/javax/websocket/WebSocketClientTest.java b/connectors/websocket/src/test/java/org/apache/edgent/test/connectors/wsclient/javax/websocket/WebSocketClientTest.java
similarity index 89%
rename from connectors/wsclient-javax.websocket/src/test/java/org/apache/edgent/test/connectors/wsclient/javax/websocket/WebSocketClientTest.java
rename to connectors/websocket/src/test/java/org/apache/edgent/test/connectors/wsclient/javax/websocket/WebSocketClientTest.java
index 0a85cfb..b256bfe 100644
--- a/connectors/wsclient-javax.websocket/src/test/java/org/apache/edgent/test/connectors/wsclient/javax/websocket/WebSocketClientTest.java
+++ b/connectors/websocket/src/test/java/org/apache/edgent/test/connectors/wsclient/javax/websocket/WebSocketClientTest.java
@@ -20,13 +20,13 @@
 
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertTrue;
 import static org.junit.Assume.assumeTrue;
 
-import java.net.InetSocketAddress;
-import java.net.Socket;
 import java.net.URI;
 import java.nio.charset.StandardCharsets;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 import java.util.concurrent.CountDownLatch;
@@ -42,11 +42,13 @@
 import org.apache.edgent.topology.Topology;
 import org.apache.edgent.topology.json.JsonFunctions;
 import org.apache.edgent.topology.plumbing.PlumbingStreams;
+import org.apache.edgent.topology.tester.Condition;
 import org.junit.After;
 import org.junit.Test;
 
 import com.google.gson.JsonObject;
 
+//@Ignore("There seem to be issues with SSL related tests")
 public class WebSocketClientTest extends ConnectorTestBase {
     private final static int SEC_TMO = 5;
     WebSocketServerEcho wsServer;
@@ -142,7 +144,7 @@
     }
     
     private String getStorePath(String storeLeaf) {
-        return TestRepoPath.getPath("connectors", "wsclient-javax.websocket", "src", "test", "keystores", storeLeaf);
+        return TestRepoPath.getPath("keystores/" + storeLeaf);
     }
 
     @Test
@@ -595,9 +597,19 @@
         s = PlumbingStreams.blockingOneShotDelay(s, 2, TimeUnit.SECONDS);
         wsClient.sendString(s);
         
-        TStream<String> rcvd = wsClient.receiveString();
+        TStream<String> rcvd = wsClient.receiveString();  // rcv nothing
         
-        completeAndValidate("", t, rcvd, SEC_TMO, new String[0]);  //rcv nothing
+        // in this case there's no useful condition that we can check for
+        // to validate this is behaving properly other than the connector doesn't
+        // blow up and that nothing is rcvd, so just wait a short time
+        // before verifying nothing was rcvd.
+        // Don't use the complete() TMO for successful termination.
+        
+        Condition<List<String>> rcvdContent = t.getTester().streamContents(rcvd, new String[0]);
+        Condition<Object> tc = newWaitTimeCondition(3);
+        
+        complete(t, tc, SEC_TMO, TimeUnit.SECONDS);
+        assertTrue("rcvd: "+rcvdContent.getResult(), rcvdContent.valid());
     }
     
     @Test
@@ -674,9 +686,19 @@
         s = PlumbingStreams.blockingOneShotDelay(s, 2, TimeUnit.SECONDS);
         wsClient.sendString(s);
         
-        TStream<String> rcvd = wsClient.receiveString();
+        TStream<String> rcvd = wsClient.receiveString();  // rcv nothing
         
-        completeAndValidate("", t, rcvd, SEC_TMO, new String[0]); // rcv nothing
+        // in this case there's no useful condition that we can check for
+        // to validate this is behaving properly other than the connector doesn't
+        // blow up and that nothing is rcvd, so just wait a short time
+        // before verifying nothing was rcvd.
+        // Don't use the complete() TMO for successful termination.
+        
+        Condition<List<String>> rcvdContent = t.getTester().streamContents(rcvd, new String[0]);
+        Condition<Object> tc = newWaitTimeCondition(3);
+        
+        complete(t, tc, SEC_TMO, TimeUnit.SECONDS);
+        assertTrue("rcvd: "+rcvdContent.getResult(), rcvdContent.valid());
     }
     
     @Test
@@ -732,27 +754,31 @@
         s = PlumbingStreams.blockingOneShotDelay(s, 2, TimeUnit.SECONDS);
         wsClient.sendString(s);
         
-        TStream<String> rcvd = wsClient.receiveString();
+        TStream<String> rcvd = wsClient.receiveString();  // rcv nothing
         
-        completeAndValidate("", t, rcvd, SEC_TMO, new String[0]);  //rcv nothing
+        // in this case there's no useful condition that we can check for
+        // to validate this is behaving properly other than the connector doesn't
+        // blow up and that nothing is rcvd, so just wait a short time
+        // before verifying nothing was rcvd.
+        // Don't use the complete() TMO for successful termination.
+        
+        Condition<List<String>> rcvdContent = t.getTester().streamContents(rcvd, new String[0]);
+        Condition<Object> tc = newWaitTimeCondition(3);
+        
+        complete(t, tc, SEC_TMO, TimeUnit.SECONDS);
+        assertTrue("rcvd: "+rcvdContent.getResult(), rcvdContent.valid());
     }
     
     private void skipTestIfCantConnect(Properties config) throws Exception {
-        String wsUri = config.getProperty("ws.uri");
-        // Skip tests if the WebSocket server can't be contacted.
-        try {
-            URI uri = new URI(wsUri);
-            int port = uri.getPort();
-            if (port == -1)
-                port = uri.getScheme().equals("ws") ? 80 : 443;
-            Socket s = new Socket();
-            s.connect(new InetSocketAddress(uri.getHost(), port), 5*1000/*cn-timeout-msec*/);
-            s.close();
-        } catch (Exception e) {
-            System.err.println("Unable to connect to WebSocket server "+wsUri+" : "+e.getMessage());
-            e.printStackTrace();
-            assumeTrue(false);
-        }
+      String wsUri = config.getProperty("ws.uri");
+      try {
+          WebSocketClientConnectTestHelper.connectToServer(config);
+      } catch (Exception e) {
+          System.err.println("Unable to connect to WebSocket server "+wsUri+" : "+e.getMessage());
+          e.printStackTrace();
+          System.err.println("skipTestIfCantConnect(): SKIPPING TEST");
+          assumeTrue(false);
+      }
     }
     
     @Test
@@ -846,9 +872,19 @@
             s = PlumbingStreams.blockingOneShotDelay(s, 2, TimeUnit.SECONDS);
             wsClient.sendString(s);
             
-            TStream<String> rcvd = wsClient.receiveString();
+            TStream<String> rcvd = wsClient.receiveString();  // rcv nothing
             
-            completeAndValidate("", t, rcvd, SEC_TMO, new String[0]);  //rcv nothing
+            // in this case there's no useful condition that we can check for
+            // to validate this is behaving properly other than the connector doesn't
+            // blow up and that nothing is rcvd, so just wait a short time
+            // before verifying nothing was rcvd.
+            // Don't use the complete() TMO for successful termination.
+            
+            Condition<List<String>> rcvdContent = t.getTester().streamContents(rcvd, new String[0]);
+            Condition<Object> tc = newWaitTimeCondition(3);
+            
+            complete(t, tc, SEC_TMO, TimeUnit.SECONDS);
+            assertTrue("rcvd: "+rcvdContent.getResult(), rcvdContent.valid());
         }
         finally {
             sslProps.restore();
diff --git a/connectors/wsclient-javax.websocket/src/test/java/org/apache/edgent/test/connectors/wsclient/javax/websocket/WebSocketServerEcho.java b/connectors/websocket/src/test/java/org/apache/edgent/test/connectors/wsclient/javax/websocket/WebSocketServerEcho.java
similarity index 98%
rename from connectors/wsclient-javax.websocket/src/test/java/org/apache/edgent/test/connectors/wsclient/javax/websocket/WebSocketServerEcho.java
rename to connectors/websocket/src/test/java/org/apache/edgent/test/connectors/wsclient/javax/websocket/WebSocketServerEcho.java
index d6c9bde..9e0651e 100644
--- a/connectors/wsclient-javax.websocket/src/test/java/org/apache/edgent/test/connectors/wsclient/javax/websocket/WebSocketServerEcho.java
+++ b/connectors/websocket/src/test/java/org/apache/edgent/test/connectors/wsclient/javax/websocket/WebSocketServerEcho.java
@@ -144,7 +144,7 @@
     }
     
     private String getStorePath(String storeLeaf) {
-        return TestRepoPath.getPath("connectors", "wsclient-javax.websocket", "src", "test", "keystores", storeLeaf);
+        return TestRepoPath.getPath("keystores/" + storeLeaf);
     }
     
     public int getPort() {
diff --git a/connectors/wsclient-javax.websocket/src/test/keystores/README b/connectors/websocket/src/test/resources/keystores/README
similarity index 79%
rename from connectors/wsclient-javax.websocket/src/test/keystores/README
rename to connectors/websocket/src/test/resources/keystores/README
index 4419c23..466d40f 100644
--- a/connectors/wsclient-javax.websocket/src/test/keystores/README
+++ b/connectors/websocket/src/test/resources/keystores/README
@@ -1,5 +1,22 @@
 #!/bin/sh
 
+#
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You under the Apache License, Version 2.0
+#  (the "License"); you may not use this file except in compliance with
+#  the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#  See the License for the specific language governing permissions and
+#  limitations under the License.
+#
+
 # The test's key and trust stores are created as follows.
 # They have the password "passw0rd".
 
diff --git a/connectors/wsclient-javax.websocket/src/test/keystores/clientKeyStore.jks b/connectors/websocket/src/test/resources/keystores/clientKeyStore.jks
similarity index 100%
rename from connectors/wsclient-javax.websocket/src/test/keystores/clientKeyStore.jks
rename to connectors/websocket/src/test/resources/keystores/clientKeyStore.jks
Binary files differ
diff --git a/connectors/wsclient-javax.websocket/src/test/keystores/clientTrustStore.jks b/connectors/websocket/src/test/resources/keystores/clientTrustStore.jks
similarity index 100%
rename from connectors/wsclient-javax.websocket/src/test/keystores/clientTrustStore.jks
rename to connectors/websocket/src/test/resources/keystores/clientTrustStore.jks
Binary files differ
diff --git a/connectors/wsclient-javax.websocket/src/test/keystores/serverKeyStore.jks b/connectors/websocket/src/test/resources/keystores/serverKeyStore.jks
similarity index 100%
rename from connectors/wsclient-javax.websocket/src/test/keystores/serverKeyStore.jks
rename to connectors/websocket/src/test/resources/keystores/serverKeyStore.jks
Binary files differ
diff --git a/connectors/wsclient-javax.websocket/src/test/keystores/serverTrustStore.jks b/connectors/websocket/src/test/resources/keystores/serverTrustStore.jks
similarity index 100%
rename from connectors/wsclient-javax.websocket/src/test/keystores/serverTrustStore.jks
rename to connectors/websocket/src/test/resources/keystores/serverTrustStore.jks
Binary files differ
diff --git a/connectors/wsclient-javax.websocket/build.gradle b/connectors/wsclient-javax.websocket/build.gradle
deleted file mode 100644
index e0c84dc..0000000
--- a/connectors/wsclient-javax.websocket/build.gradle
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-dependencies {
-  addTargetDirProjectJarDependency 'compile', ':api:topology'
-  addTargetDirProjectJarDependency 'compile', ':connectors:common'
-  addTargetDirProjectJarDependency 'compile', ':connectors:wsclient'
-  addTargetDirProjectJarDependency 'compile', ':connectors:edgent.javax.websocket'
-  
-  addTargetDirProjectJarDependency 'testCompile', ':providers:direct'
-  addTargetDirProjectJarDependency 'testCompile', ':connectors:javax.websocket-client'
-  addTargetDirProjectJarDependency 'testCompile', ':connectors:javax.websocket-server'
-  
-  // N.B. root project adds test common dependencies
-}
-
-addCompileTestDependencies ':api:topology', ':providers:direct', ':connectors:common'
diff --git a/connectors/wsclient/build.gradle b/connectors/wsclient/build.gradle
deleted file mode 100644
index 6a86d26..0000000
--- a/connectors/wsclient/build.gradle
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-dependencies {
-  addTargetDirProjectJarDependency 'compile', ':api:topology'
-  addTargetDirCoreExtJarDependencies 'compile'
-  
-  addTargetDirProjectJarDependency 'testCompile', ':providers:direct'
-  // N.B. root project adds test common dependencies
-}
-
-addCompileTestDependencies ':api:topology', ':providers:direct'
diff --git a/console/.classpath b/console/.classpath
deleted file mode 100644
index a2a5a9c..0000000
--- a/console/.classpath
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="server/src/main/java"/>
-	<classpathentry kind="src" path="server/src/test/java"/>
-	<classpathentry kind="src" path="servlets/src/main/java"/>
-	<classpathentry kind="lib" path="../externalJars/java8/console/server/ext/jetty-http-9.3.6.v20151106.jar"/>
-	<classpathentry kind="lib" path="../externalJars/java8/console/server/ext/jetty-io-9.3.6.v20151106.jar"/>
-	<classpathentry kind="lib" path="../externalJars/java8/console/server/ext/jetty-security-9.3.6.v20151106.jar"/>
-	<classpathentry kind="lib" path="../externalJars/java8/console/server/ext/jetty-server-9.3.6.v20151106.jar"/>
-	<classpathentry kind="lib" path="../externalJars/java8/console/server/ext/jetty-servlet-9.3.6.v20151106.jar"/>
-	<classpathentry kind="lib" path="../externalJars/java8/console/server/ext/jetty-util-9.3.6.v20151106.jar"/>
-	<classpathentry kind="lib" path="../externalJars/java8/console/server/ext/jetty-webapp-9.3.6.v20151106.jar"/>
-	<classpathentry kind="lib" path="../externalJars/java8/console/server/ext/jetty-xml-9.3.6.v20151106.jar"/>
-	<classpathentry kind="lib" path="../externalJars/java8/console/server/ext/javax.servlet-api-3.1.0.jar"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/ext"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/utils"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/console/.gitignore b/console/.gitignore
deleted file mode 100644
index 948fe44..0000000
--- a/console/.gitignore
+++ /dev/null
@@ -1,5 +0,0 @@
-/classes/
-**/test.classes/
-**/classes/
-**/unittests/
-/bin/
diff --git a/console/.project b/console/.project
deleted file mode 100644
index d1df45d..0000000
--- a/console/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>console</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/console/pom.xml b/console/pom.xml
new file mode 100644
index 0000000..4256fbc
--- /dev/null
+++ b/console/pom.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-parent</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-console</artifactId>
+  <packaging>pom</packaging>
+
+  <name>Apache Edgent (Java 8): Console</name>
+
+  <modules>
+    <module>server</module>
+    <module>servlets</module>
+  </modules>
+
+</project>
diff --git a/console/server/build.gradle b/console/server/build.gradle
deleted file mode 100644
index 1febc14..0000000
--- a/console/server/build.gradle
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-dependencies {
-  addProjectExtDependency 'compile', 'org.eclipse.jetty:jetty-http:9.3.6.v20151106'
-  addProjectExtDependency 'compile', 'org.eclipse.jetty:jetty-io:9.3.6.v20151106'
-  addProjectExtDependency 'compile', 'org.eclipse.jetty:jetty-security:9.3.6.v20151106'
-  addProjectExtDependency 'compile', 'org.eclipse.jetty:jetty-server:9.3.6.v20151106'
-  addProjectExtDependency 'compile', 'org.eclipse.jetty:jetty-servlet:9.3.6.v20151106'
-  addProjectExtDependency 'compile', 'org.eclipse.jetty:jetty-util:9.3.6.v20151106'
-  addProjectExtDependency 'compile', 'org.eclipse.jetty:jetty-webapp:9.3.6.v20151106'
-  addProjectExtDependency 'compile', 'org.eclipse.jetty:jetty-xml:9.3.6.v20151106'
-  addTargetDirCoreExtJarDependencies 'compile'
-  
-  // TODO runtime dependsOn ":console:servlets"  ???  
-
-  // N.B. root project adds test common dependencies
-}
diff --git a/console/server/pom.xml b/console/server/pom.xml
new file mode 100644
index 0000000..8355265
--- /dev/null
+++ b/console/server/pom.xml
@@ -0,0 +1,152 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-console</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-console-server</artifactId>
+
+  <name>Apache Edgent (Java 8): Console: Server</name>
+
+  <build>
+    <resources>
+      <resource>
+        <directory>${project.basedir}/src/main/resources</directory>
+        <targetPath>${project.build.outputDirectory}/</targetPath>
+      </resource>
+      <resource>
+        <!--  bundle the licenses of the artifacts we are bundling -->
+        <directory>${project.basedir}/../../src/main/appended-resources/licenses</directory>
+        <targetPath>${project.build.outputDirectory}/META-INF/licenses</targetPath>
+      </resource>
+    </resources>
+    <plugins>
+      <!--
+        Copy the servlets.war into the build output so it is embedded as
+        resource into the jar.
+      -->
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>generate-resources</phase>
+            <goals>
+              <goal>copy</goal>
+            </goals>
+            <configuration>
+               <!--  Bundle these dependencies in the jar.
+                    
+                  You must maintain the corresponding info if you
+                  add/remove artifacts or change their versions:
+                    - entry in src/main/resources/META-INF/LICENSE
+                    - entry in src/main/resources/META-INF/NOTICE when appropriate                    
+ 
+                  See console/servlets and its pom,LICENSE,NOTICE.
+                  
+                  You must maintain the info in this project's
+                  corresponding platforms/java7 files.
+               -->
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>edgent-console-servlets</artifactId>
+                  <version>${project.version}</version>
+                  <type>war</type>
+                  <outputDirectory>${project.build.outputDirectory}/resources</outputDirectory>
+                  <destFileName>servlets.war</destFileName>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+   </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-http</artifactId>
+      <version>${jetty.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-io</artifactId>
+      <version>${jetty.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-security</artifactId>
+      <version>${jetty.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-server</artifactId>
+      <version>${jetty.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-servlet</artifactId>
+      <version>${jetty.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-util</artifactId>
+      <version>${jetty.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-webapp</artifactId>
+      <version>${jetty.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-xml</artifactId>
+      <version>${jetty.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+      <version>1.7.12</version>
+    </dependency>
+
+    <!--
+        This artifact is needed by the maven-dependency-plugin
+        by marking this dependency optional, it is not included
+        in the resulting artifact, but Maven ensures it is built
+        prior to this module.
+    -->
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-console-servlets</artifactId>
+      <version>1.2.0</version>
+      <type>war</type>
+      <optional>true</optional>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/console/server/src/main/java/org/apache/edgent/console/server/HttpServer.java b/console/server/src/main/java/org/apache/edgent/console/server/HttpServer.java
index 5844aeb..302200d 100644
--- a/console/server/src/main/java/org/apache/edgent/console/server/HttpServer.java
+++ b/console/server/src/main/java/org/apache/edgent/console/server/HttpServer.java
@@ -19,8 +19,6 @@
 
 package org.apache.edgent.console.server;
 
-import java.security.ProtectionDomain;
-
 import org.eclipse.jetty.server.Handler;
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.server.ServerConnector;
@@ -29,6 +27,8 @@
 import org.eclipse.jetty.servlet.ServletContextHandler;
 import org.eclipse.jetty.webapp.WebAppContext;
 
+import java.io.File;
+
 public class HttpServer {
 
 	/**
@@ -46,8 +46,6 @@
         private static final WebAppContext WEBAPP = new WebAppContext();
         private static final HttpServer INSTANCE = new HttpServer();
         private static boolean INITIALIZED = false;
-        private static final String consoleWarNotFoundMessage =  
-    			"console.war not found.  Run 'ant' from the top level edgent directory, or 'ant' from 'console/servlets' to create console.war under the webapps directory.";
     }
 
     /**
@@ -71,24 +69,14 @@
             ServletContextHandler contextMetrics = new ServletContextHandler(ServletContextHandler.SESSIONS);
             contextMetrics.setContextPath("/metrics");
             ServerUtil sUtil = new ServerUtil();
-            String commandWarFilePath = sUtil.getAbsoluteWarFilePath("console.war");
-            if (commandWarFilePath.equals("")){
-            	// check if we are on Eclipse, if Eclipse can't find it, it probably does not exist
-            	// running on Eclipse, look for the eclipse war file path
-            	ProtectionDomain protectionDomain = HttpServer.class.getProtectionDomain();
-            	String eclipseWarFilePath = sUtil.getEclipseWarFilePath(protectionDomain, "console.war");
-            	if (!eclipseWarFilePath.equals("")) {            	
-            		HttpServerHolder.WEBAPP.setWar(eclipseWarFilePath);
-            	} else {
-            		throw new Exception(HttpServerHolder.consoleWarNotFoundMessage);
-            	}
+            File servletsJarFile = sUtil.getWarFilePath();
+            if (servletsJarFile.exists()){
+            	HttpServerHolder.WEBAPP.setWar(servletsJarFile.getAbsolutePath());
             } else {
-            	HttpServerHolder.WEBAPP.setWar(commandWarFilePath);
+                throw new RuntimeException("Unable to find WAR archive in " + servletsJarFile.getAbsolutePath());
             }
 
-
-            
-            HttpServerHolder.WEBAPP.addAliasCheck(new AllowSymLinkAliasChecker()); 
+            HttpServerHolder.WEBAPP.addAliasCheck(new AllowSymLinkAliasChecker());
             ContextHandlerCollection contexts = new ContextHandlerCollection();
             contexts.setHandlers(new Handler[] { contextJobs, contextMetrics, HttpServerHolder.WEBAPP });
             HttpServerHolder.JETTYSERVER.setHandler(contexts);
diff --git a/console/server/src/main/java/org/apache/edgent/console/server/ServerUtil.java b/console/server/src/main/java/org/apache/edgent/console/server/ServerUtil.java
index 5002d5d..f8c6fde 100644
--- a/console/server/src/main/java/org/apache/edgent/console/server/ServerUtil.java
+++ b/console/server/src/main/java/org/apache/edgent/console/server/ServerUtil.java
@@ -19,17 +19,7 @@
 
 package org.apache.edgent.console.server;
 
-import java.io.IOException;
-import java.io.File;
-import java.net.URL;
-import java.nio.file.Files;
-import java.nio.file.FileVisitResult;
-import java.nio.file.Path;
-import java.nio.file.SimpleFileVisitor;
-import java.nio.file.attribute.BasicFileAttributes;
-import java.security.ProtectionDomain;
-import java.util.ArrayList;
-import java.util.List;
+import java.io.*;
 
 public class ServerUtil {
 
@@ -37,90 +27,58 @@
 	 *  The public constructor of this utility class for use by the HttpServer class.
 	 */
     public ServerUtil() {
-
-    }
-    /**
-     * Returns the path to the jar file for this package
-     * @return a String representing the path to the jar file of this package
-     */
-    private String getPath() {
-        return getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
-    }
-
-    /**
-     * Returns a file object representing the parent's parent directory of the jar file.
-     * @return a File object
-     */
-    private File getTopDirFilePath() {
-        String topDirProp = System.getProperty("edgent.test.top.dir.file.path");
-        if (topDirProp != null) {
-          return new File(topDirProp);
-        }
-        File jarFile = new File(getPath());
-        return jarFile.getParentFile().getParentFile().getParentFile();
     }
 
     /**
      * Returns the File object representing the "webapps" directory
      * @return a File object or null if the "webapps" directory is not found
      */
-    private File getWarFilePath() {
-        List<File> foundFiles = new ArrayList<>();
-        try {
-            Files.walkFileTree(getTopDirFilePath().toPath(), new SimpleFileVisitor<Path>() {
-                @Override
-                public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
-                    if (dir.endsWith("webapps")) {
-                      foundFiles.add(dir.toFile());
-                    }
-                    return FileVisitResult.CONTINUE;
+    public File getWarFilePath() {
+        File war = new File("target/war-resources/servlets.war");
+        if(!war.exists()) {
+            // Eventually create the directory for serving the war.
+            if(!war.getParentFile().exists()) {
+                if(!war.getParentFile().mkdirs()) {
+                    throw new RuntimeException("Could not create output directory at " + war.getAbsolutePath());
                 }
-            });
-        } catch (IOException e) {
-          // end of file searching
+            }
+
+            // Dump the servlet.war into the output directory.
+            InputStream stream = null;
+            FileOutputStream fileOutputStream = null;
+            try {
+                stream = ServerUtil.class.getResourceAsStream("/resources/servlets.war");
+                if(stream == null) {
+                    throw new RuntimeException("Could not get resource '/resources/servlets.war' from classpath.");
+                }
+
+                int readBytes;
+                byte[] buffer = new byte[4096];
+                fileOutputStream = new FileOutputStream(war);
+                while ((readBytes = stream.read(buffer)) > 0) {
+                    fileOutputStream.write(buffer, 0, readBytes);
+                }
+            } catch (IOException e) {
+                throw new RuntimeException("Could not dump resource 'resources/servlets.war' from classpath.", e);
+            } finally {
+                if(stream != null) {
+                    try {
+                        stream.close();
+                    } catch (IOException e) {
+                        // Ignore.
+                    }
+                }
+                if(fileOutputStream != null) {
+                    try {
+                        fileOutputStream.close();
+                    } catch (IOException e) {
+                        // Ignore.
+                    }
+                }
+            }
         }
-        if (foundFiles.size() != 0) {
-            return foundFiles.get(0);
-        }
-        return null;
-    }
-    
-    /**
-     * Looks for the absolute file path of the name of the warFileName argument
-     * @param warFileName the name of the war file to find the absolute path to
-     * @return the absolute path to the warFileName argument as a String
-     */
-    public String getAbsoluteWarFilePath(String warFileName) {
-        File warFilePath = getWarFilePath();
-        if (warFilePath != null) {
-        	File warFile = new File(warFilePath.getAbsolutePath() + "/" + warFileName);
-        	if (warFile.exists()) {        	
-        		return warFile.getAbsolutePath();
-        	} else {
-        		return "";
-        	}
-        }
-        else {
-            return "";
-        }
-    }
-    
-    /**
-     * Looks for the absolute file path of the name of the warFileName argument when running from Eclipse
-     * @param pDomain the ProtectionDomain to use to get the source's location
-     * @param warFileName the name of the war file to find the absolute path to
-     * @return the absolute path to the warFileName argument as a String
-     */
-    public String getEclipseWarFilePath(ProtectionDomain pDomain, String warFileName) {
-        URL location = pDomain.getCodeSource().getLocation();
-        File topEdgent = new File(location.getPath()).getParentFile().getParentFile();
-        File warFile = new File(topEdgent, "./target/java8/console/webapps/" +warFileName);
-        if (warFile.exists()) {
-        	return warFile.getAbsolutePath();
-        } else {
-        	return "";
-        }
-	
+
+        return war;
     }
 
 }
diff --git a/console/server/src/main/remote-resources/META-INF/LICENSE b/console/server/src/main/remote-resources/META-INF/LICENSE
new file mode 100644
index 0000000..8d0e1a0
--- /dev/null
+++ b/console/server/src/main/remote-resources/META-INF/LICENSE
@@ -0,0 +1,42 @@
+
+===============================================================================
+APACHE EDGENT SUBCOMPONENTS:
+
+This binary includes a number of subcomponents with separate
+copyright notices and license terms.  Your use of this binary
+is subject to the terms and conditions of the following licenses.
+
+===============================================================================
+License: Apache License Version 2.0
+For details, see META-INF/licenses/apache-license-version-2.0.txt
+
+gson (com.google.code.gson:gson:2.2.4)
+metrics-core (io.dropwizard.metrics:metrics-core:3.1.2)
+
+===============================================================================
+License: MIT
+
+jquery (org.webjars:jquery:1.11.2)
+    For details, see META-INF/licenses/jquery-1_11_2-MIT.txt.
+
+jquery-ui (org.webjars:jquery-ui:1.11.4)
+    For details, see META-INF/licenses/jquery-ui-1_11_4-MIT.txt.
+
+d3.legend.js (included inside the resources/servlets.war!/js/ext/d3.legend/d3.legend.js)
+    https://gist.githubusercontent.com/ZJONSSON/3918369/raw/bf9bce6b68a3b70f87450f155436ca4a84af1ba4/d3.legend.js
+    With Edgent specific modifications.
+    For details, see META-INF/licenses/d3.legend-MIT.txt.
+
+===============================================================================
+License: BSD 3-Clause
+
+d3 (org.webjars.bower:d3:3.3.9)
+    For details, see META-INF/licenses/d3-3_3_9-BSD.txt.
+
+===============================================================================
+License: BSD 2-Clause
+
+d3-plugins-sankey (org.webjars.bower:d3-plugins-sankey:1.1.0)
+    For details, see META-INF/licenses/d3-plugins-sankey-1_1_0-BSD.txt.
+
+===============================================================================
diff --git a/console/server/src/main/remote-resources/META-INF/NOTICE b/console/server/src/main/remote-resources/META-INF/NOTICE
new file mode 100644
index 0000000..9c9e7e9
--- /dev/null
+++ b/console/server/src/main/remote-resources/META-INF/NOTICE
@@ -0,0 +1,28 @@
+===============================================================================
+
+Portions of this software were developed by IBM Corp.
+Copyright IBM Corp. 2015, 2016
+
+===============================================================================
+
+APACHE EDGENT SUBCOMPONENTS:
+
+This product includes a number of subcomponents with separate
+copyright notices and license terms.  The following notices apply.
+
+-------------------------------------------------------------------------------
+metrics-core (io.dropwizard.metrics:metrics-core:3.1.2)
+
+Metrics
+Copyright 2010-2013 Coda Hale and Yammer, Inc.
+
+This product includes software developed by Coda Hale and Yammer, Inc.
+
+This product includes code derived from the JSR-166 project (ThreadLocalRandom,
+Striped64, LongAdder) with the following comments:
+
+          Written by Doug Lea with assistance from members of JCP JSR-166
+          Expert Group and released to the public domain, as explained at
+          http://creativecommons.org/publicdomain/zero/1.0/
+
+===============================================================================
diff --git a/console/server/src/test/java/org/apache/edgent/test/console/server/HttpServerTest.java b/console/server/src/test/java/org/apache/edgent/test/console/server/HttpServerTest.java
index 3ecc510..46bd511 100644
--- a/console/server/src/test/java/org/apache/edgent/test/console/server/HttpServerTest.java
+++ b/console/server/src/test/java/org/apache/edgent/test/console/server/HttpServerTest.java
@@ -46,7 +46,7 @@
         		assertEquals("", "");
         	}
         } finally {
-        	if (warNotFoundExceptionThrown == false) {
+        	if (!warNotFoundExceptionThrown) {
         		assertNotNull("HttpServer getInstance is null", myHttpServer);
         	} else {
         		assertNull("HttpServer getInstance is null because console.war could not be found", myHttpServer);
@@ -67,14 +67,13 @@
         		assertEquals("", "");
         	}
         } finally {
-        	if (warNotFoundExceptionThrown == false) {
+        	if ((!warNotFoundExceptionThrown) && (myHttpServer != null)){
                 myHttpServer.startServer();
                 assertTrue(myHttpServer.isServerStarted());
         	} else {
         		assertNull("HttpServer getInstance is null because console.war could not be found", myHttpServer);
         	}
         }
-
     }
 
     @Test
@@ -90,7 +89,7 @@
         		assertEquals("", "");
         	}
         } finally {
-        	if (warNotFoundExceptionThrown == false) {
+			if ((!warNotFoundExceptionThrown) && (myHttpServer != null)){
                 myHttpServer.startServer();
                 assertFalse(myHttpServer.isServerStopped());
         	} else {
@@ -112,7 +111,7 @@
         		assertEquals("", "");
         	}
         } finally {
-        	if (warNotFoundExceptionThrown == false) {
+			if ((!warNotFoundExceptionThrown) && (myHttpServer != null)){
         		assertEquals("/console", myHttpServer.getConsoleContextPath());
         	} else {
         		assertNull("HttpServer getInstance is null because console.war could not be found", myHttpServer);
@@ -135,7 +134,7 @@
         		assertEquals("", "");
         	}
         } finally {
-        	if (warNotFoundExceptionThrown == false) {
+			if ((!warNotFoundExceptionThrown) && (myHttpServer != null)){
                 myHttpServer.startServer();
                 int portNum = myHttpServer.getConsolePortNumber();
                 String context = myHttpServer.getConsoleContextPath();
@@ -159,7 +158,7 @@
         		assertEquals("", "");
         	}
         } finally {
-        	if (warNotFoundExceptionThrown == false) {
+			if ((!warNotFoundExceptionThrown) && (myHttpServer != null)){
                 myHttpServer.startServer();
                 int portNum = myHttpServer.getConsolePortNumber();
                 assertTrue("the port number is not in integer range: " + Integer.toString(portNum),
diff --git a/console/server/src/test/java/org/apache/edgent/test/console/server/ServerUtilTest.java b/console/server/src/test/java/org/apache/edgent/test/console/server/ServerUtilTest.java
index 7dfc855..cea0ac4 100644
--- a/console/server/src/test/java/org/apache/edgent/test/console/server/ServerUtilTest.java
+++ b/console/server/src/test/java/org/apache/edgent/test/console/server/ServerUtilTest.java
@@ -37,7 +37,7 @@
     @Test
     public void testGetPath() throws IOException {
         ServerUtil serverUtil = new ServerUtil();
-        assertNotNull("Get AbsoluteWarFilePath is null", serverUtil.getAbsoluteWarFilePath("console.war"));
+        assertNotNull("Get AbsoluteWarFilePath is null", serverUtil.getWarFilePath());
     }
 
 }
diff --git a/console/servlets/README b/console/servlets/README
index 144b0cd..dbcbbf2 100644
--- a/console/servlets/README
+++ b/console/servlets/README
@@ -6,16 +6,3 @@
 
 servlets/webapp_content/js/ext/d3.legend.js: 
 Obtained from: https://github.com/jieter/d3-legend/blob/master/d3.legend.js
-
-servlets/webapp_content/js/ext/d3.min.js: 
-Obtained from: https://github.com/d3/d3/releases/tag/v3.5.9
-
-servlets/webapp_content/js/ext/sankey_edgent.js: 
-Originally obtained sankey.js from: https://github.com/d3/d3-sankey
-Modified it and renamed it to sankey_edgent.js
-
-servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom:
-Obtained from: http://jqueryui.com (select 'Custom Download')
-
-servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/external/jquery/jquery.js:
-Obtained from: https://code.jquery.com/jquery/
diff --git a/console/servlets/build.gradle b/console/servlets/build.gradle
deleted file mode 100644
index 272a672..0000000
--- a/console/servlets/build.gradle
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-distsDirName = 'webapps'
-
-plugins.apply 'war'
-
-dependencies {
-  addTargetDirProjectJarDependency 'providedCompile', ':utils:streamscope'
-  addProjectExtDependency 'providedCompile', 'javax.servlet:javax.servlet-api:3.1.0'
-  addTargetDirCoreExtJarDependencies 'providedCompile'
-
-  // N.B. root project adds test common dependencies
-}
-
-war {
-  destinationDir = file("$target_java8_dir/$project.simpleGroupName/webapps")
-  archiveName 'console.war'
-  from file('webapp_content/html')
-  into('resources') {
-    from file('webapp_content/resources')
-  }
-  into('js') {
-    from file('webapp_content/js')
-  }
-  webXml = file('webapp_content/WEB-INF/console.xml')
-  
-  doFirst {
-    configure jarOptions
-  }
-}
-
-testClasses.dependsOn war
diff --git a/console/servlets/pom.xml b/console/servlets/pom.xml
new file mode 100644
index 0000000..88d01e1
--- /dev/null
+++ b/console/servlets/pom.xml
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-console</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-console-servlets</artifactId>
+  <packaging>war</packaging>
+
+  <name>Apache Edgent (Java 8): Console: Servlets</name>
+
+  <build>
+    <!-- Add the directory where all the external resources were unpacked to the build -->
+    <resources>
+      <resource>
+        <directory>${project.build.directory}/generated-resources/META-INF/resources/webjars</directory>
+        <targetPath>${project.build.directory}/${project.artifactId}-${project.version}/js/ext</targetPath>
+      </resource>
+      <!--  bundle the licenses of the artifacts we are bundling -->
+      <resource>
+        <directory>${project.basedir}/../../src/main/appended-resources/licenses</directory>
+        <targetPath>${project.build.directory}/${project.artifactId}-${project.version}/META-INF/licenses</targetPath>
+      </resource>
+    </resources>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.rat</groupId>
+        <artifactId>apache-rat-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>license-check</id>
+            <phase>verify</phase>
+            <goals>
+              <goal>check</goal>
+            </goals>
+          </execution>
+        </executions>
+        <configuration>
+          <excludes combine.children="append">
+            <!-- TODO: Still got one unlicensed file in there ... -->
+            <exclude>src/main/webapp/js/ext/**</exclude>
+          </excludes>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-remote-resources-plugin</artifactId>
+        <configuration>
+          <outputDirectory>${project.build.directory}/${project.artifactId}-${project.version}</outputDirectory>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>unpack-js-deps</id>
+            <phase>generate-resources</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <!--  Bundle these dependencies in the war.
+                    
+                  You must maintain the corresponding info if you
+                  add/remove artifacts or change their versions:
+                    - entry in src/main/webapp/META-INF/LICENSE
+                    - entry in src/main/webapp/META-INF/NOTICE when appropriate
+                    
+                  You must maintain the info in the corresponding
+                  console/server files because it bundles this war. 
+                  
+                  You must maintain the info in this project's
+                  corresponding platforms/java7 files.
+               -->
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.webjars</groupId>
+                  <artifactId>jquery</artifactId>
+                  <version>1.11.2</version>
+                  <outputDirectory>${project.build.directory}/generated-resources</outputDirectory>
+                  <includes>META-INF/resources/webjars/**/jquery.min.js</includes>
+                </artifactItem>
+                <artifactItem>
+                  <groupId>org.webjars</groupId>
+                  <artifactId>jquery-ui</artifactId>
+                  <version>1.11.4</version>
+                  <outputDirectory>${project.build.directory}/generated-resources</outputDirectory>
+                  <includes>META-INF/resources/webjars/**/images/*.png,META-INF/resources/webjars/**/*.min.*</includes>
+                </artifactItem>
+                <artifactItem>
+                  <groupId>org.webjars.bower</groupId>
+                  <artifactId>d3</artifactId>
+                  <version>3.3.9</version>
+                  <outputDirectory>${project.build.directory}/generated-resources</outputDirectory>
+                  <includes>META-INF/resources/webjars/**/**.min.*</includes>
+                </artifactItem>
+                <artifactItem>
+                  <groupId>org.webjars.bower</groupId>
+                  <artifactId>d3-plugins-sankey</artifactId>
+                  <version>1.1.0</version>
+                  <outputDirectory>${project.build.directory}/generated-resources</outputDirectory>
+                  <includes>META-INF/resources/webjars/**/*.css,META-INF/resources/webjars/**/*.js</includes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <!-- Download JavaScript form GitHub -->
+      <!--plugin>
+        <groupId>com.googlecode.maven-download-plugin</groupId>
+        <artifactId>download-maven-plugin</artifactId>
+        <version>1.2.1</version>
+        <executions>
+          <execution>
+            <id>get-d3-legend-js</id>
+            <phase>generate-resources</phase>
+            <goals>
+              <goal>wget</goal>
+            </goals>
+            <configuration>
+              <url>https://gist.githubusercontent.com/ZJONSSON/3918369/raw/bf9bce6b68a3b70f87450f155436ca4a84af1ba4/d3.legend.js</url>
+              <outputDirectory>${project.build.directory}/generated-resources/META-INF/resources/webjars/d3.legend/</outputDirectory>
+              <outputFileName>d3.legend.js</outputFileName>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin-->
+      <plugin>
+        <!--  Included to enable "mvn tomcat:run" and have a running
+              console server without using the server jar.
+        -->
+        <groupId>org.apache.tomcat.maven</groupId>
+        <artifactId>tomcat7-maven-plugin</artifactId>
+        <version>2.2</version>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-utils-streamscope</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>javax.servlet</groupId>
+      <artifactId>javax.servlet-api</artifactId>
+      <version>3.1.0</version>
+      <scope>provided</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/console/servlets/src/main/java/org/apache/edgent/console/servlets/ConsoleJobServlet.java b/console/servlets/src/main/java/org/apache/edgent/console/servlets/ConsoleJobServlet.java
index d1b1fb9..94bc913 100644
--- a/console/servlets/src/main/java/org/apache/edgent/console/servlets/ConsoleJobServlet.java
+++ b/console/servlets/src/main/java/org/apache/edgent/console/servlets/ConsoleJobServlet.java
@@ -50,32 +50,31 @@
         boolean jobsInfo = false;
         boolean jobGraph = false;
         for(Map.Entry<String,String[]> entry : parameterMap.entrySet()) {
-                if (entry.getKey().equals("jobsInfo")) {
+                if ("jobsInfo".equals(entry.getKey())) {
                         String[] vals = entry.getValue();
-                        if (vals[0].equals("true")) {
+                        if ("true".equals(vals[0])) {
                                 jobsInfo = true;
                         }
-                } else if (entry.getKey().equals("jobgraph")) {
+                } else if ("jobgraph".equals(entry.getKey())) {
                         String[] vals = entry.getValue();
-                        if (vals[0].equals("true")) {
+                        if ("true".equals(vals[0])) {
                                 jobGraph = true;
                         }
-                } else if (entry.getKey().equals("jobId")) {
+                } else if ("jobId".equals(entry.getKey())) {
                         String[] ids = entry.getValue();
                         if (ids.length == 1) {
                                 jobId = ids[0];
                         }
                 }
         }
-        
 
-        StringBuffer sbuf = new StringBuffer();
+        StringBuilder sbuf = new StringBuilder();
         sbuf.append("*:interface=");
         sbuf.append(ObjectName.quote("org.apache.edgent.execution.mbeans.JobMXBean"));
         sbuf.append(",type=");
         sbuf.append(ObjectName.quote("job"));
         
-        if (!jobId.equals("")) {
+        if (!jobId.isEmpty()) {
         	sbuf.append(",id=");
         	sbuf.append(ObjectName.quote(jobId));
         } 
@@ -90,13 +89,16 @@
         String jsonString = "";
         if (jobsInfo) {
         	jsonString = JobUtil.getJobsInfo(jobObjName);
-        } else if (jobGraph && !(jobId.equals("")) && !(jobId.equals("undefined"))) {
+        } else if (jobGraph && !(jobId.isEmpty()) && !("undefined".equals(jobId))) {
             jsonString = JobUtil.getJobGraph(jobObjName);
         }
 
         response.setContentType("application/json");
         response.setCharacterEncoding("UTF-8");
-        response.getWriter().write(jsonString);
-        
+        try {
+            response.getWriter().write(jsonString);
+        } catch (IOException e) {
+            throw new ServletException(e);
+        }
 	}		
 }
diff --git a/console/servlets/src/main/java/org/apache/edgent/console/servlets/JobUtil.java b/console/servlets/src/main/java/org/apache/edgent/console/servlets/JobUtil.java
index fbd449d..8cee003 100644
--- a/console/servlets/src/main/java/org/apache/edgent/console/servlets/JobUtil.java
+++ b/console/servlets/src/main/java/org/apache/edgent/console/servlets/JobUtil.java
@@ -40,14 +40,14 @@
 
 final class JobUtil {
 	
-	static MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
+	private static MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
 	private static final Logger logger = LoggerFactory.getLogger(JobUtil.class);
 
 	static String getJobsInfo(ObjectName jobObjName) {
         Set<ObjectInstance> jobInstances = mBeanServer.queryMBeans(jobObjName, null);
         
         Iterator<ObjectInstance> jobIterator = jobInstances.iterator();
-        StringBuffer json = new StringBuffer("[");
+        StringBuilder json = new StringBuilder("[");
         int counter = 0;
         while (jobIterator.hasNext()) {
         	if (counter > 0) {
@@ -55,47 +55,43 @@
         	}
         	ObjectInstance jobInstance = jobIterator.next();
             ObjectName jobObjectName = jobInstance.getObjectName();
-            MBeanInfo mBeanInfo = null;
+            MBeanInfo mBeanInfo;
 			try {
 				mBeanInfo = mBeanServer.getMBeanInfo(jobObjectName);
 			} catch (IntrospectionException | InstanceNotFoundException | ReflectionException e) {
 			    logger.error("Exception caught while getting MBeanInfo", e);
+				throw new RuntimeException("Exception caught while getting MBeanInfo", e);
 			}
             
             /*
              * Get the names of all the attributes
              */
-			            
-			Set<String> names = new HashSet<String> ();
+			Set<String> names = new HashSet<> ();
 	    	for (MBeanAttributeInfo attributeInfo : mBeanInfo.getAttributes()) {
 	    			names.add(attributeInfo.getName());
 	    	}
 	    	// now construct the job json and add it to the string buffer
-	    	StringBuffer s = new StringBuffer();
+	    	StringBuilder s = new StringBuilder();
 	    	s.append("{\"");
-	    	Iterator<String> it = names.iterator();
-	    	while(it.hasNext()) {
-	    		String attr = it.next();
-	    		s.append(attr);
-	    		s.append("\":\"");
-	    		try {
-					s.append((String)mBeanServer.getAttribute(jobObjectName, attr));
-				} catch (AttributeNotFoundException | InstanceNotFoundException 
+			for (String attr : names) {
+				s.append(attr);
+				s.append("\":\"");
+				try {
+					s.append((String) mBeanServer.getAttribute(jobObjectName, attr));
+				} catch (AttributeNotFoundException | InstanceNotFoundException
 						| MBeanException | ReflectionException e) {
-				    logger.error("Exception caught while accessing MBean", e);
+					logger.error("Exception caught while accessing MBean", e);
 				}
-	    		s.append("\",\"");
-	    	}
+				s.append("\",\"");
+			}
 	    	// remove the trailing ,\
 	    	s.deleteCharAt(s.length()-1);
 	    	s.deleteCharAt(s.length()-1);
-	    	json.append(s.toString() + "}");
+	    	json.append(s.toString()).append("}");
 	    	counter++;
         }
         json.append("]");
-        String jsonString = json.toString();
-		
-		return jsonString;
+        return json.toString();
 	}
 	
 	static String getJobGraph(ObjectName jobObjName) {
@@ -109,28 +105,28 @@
         String gSnapshot = "";
         if (jobInstance != null) {
             ObjectName jobObjectName = jobInstance.getObjectName();
-            MBeanInfo mBeanInfo = null;
+            MBeanInfo mBeanInfo;
 			try {
 				mBeanInfo = mBeanServer.getMBeanInfo(jobObjectName);
 			} catch (IntrospectionException | InstanceNotFoundException | ReflectionException e) {
 			    logger.error("Exception caught while getting MBeanInfo", e);
+			    throw new RuntimeException("Exception caught while getting MBeanInfo", e);
 			}
+
 	    	/*
 	    	 * Now get the graph for the job
 	    	 */
-	    	Set<String> operations = new HashSet<String> ();
 	    	for (MBeanOperationInfo operationInfo: mBeanInfo.getOperations()) {
-	    		operations.add(operationInfo.getName());
 	    		if (operationInfo.getName().equals("graphSnapshot")) {
 	    			try {
 						gSnapshot = (String) mBeanServer.invoke(jobObjectName, "graphSnapshot",null, null);
-						//System.out.println(gSnapshot);
 					} catch (InstanceNotFoundException | ReflectionException | MBeanException e) {
 					    logger.error("Exception caught while invoking operation on MBean", e);
-					}
+                        throw new RuntimeException("Exception caught while invoking operation on MBean", e);
+                    }
 	    		}
 	    	}
-	}
+	    }
 		return gSnapshot;
 	}
 }
diff --git a/console/servlets/src/main/java/org/apache/edgent/console/servlets/MetricsGson.java b/console/servlets/src/main/java/org/apache/edgent/console/servlets/MetricsGson.java
index 7ba60b7..7f29de1 100644
--- a/console/servlets/src/main/java/org/apache/edgent/console/servlets/MetricsGson.java
+++ b/console/servlets/src/main/java/org/apache/edgent/console/servlets/MetricsGson.java
@@ -24,12 +24,17 @@
 
 public class MetricsGson {
 
-	public String jobId = null;
-	public ArrayList<Operator> ops = new ArrayList<Operator>();
+    private String jobId = null;
+    private ArrayList<Operator> ops = new ArrayList<>();
 	
 	class Operator {
-		String opId = null;
-		ArrayList<OpMetric> metrics = null;
+		final String opId;
+		final ArrayList<OpMetric> metrics;
+		Operator(String name) {
+		    opId = name;
+		    metrics = new ArrayList<>();
+		    MetricsGson.this.addOp(this);
+		}
 	}
 	
 	class OpMetric {
@@ -58,7 +63,7 @@
 		
 		Iterator<Operator> opsIterator = this.ops.iterator();
 		while (opsIterator.hasNext()) {
-			Operator op = (Operator) opsIterator.next();
+			Operator op = opsIterator.next();
 			if (getOpId(op).equals(opId)) {
 				return op;
 			}
@@ -77,7 +82,7 @@
 		
 		Iterator<Operator> opsIterator = this.ops.iterator();
 		while (opsIterator.hasNext()) {
-			Operator op = (Operator) opsIterator.next();
+			Operator op = opsIterator.next();
 			if (getOpId(op).equals(opId)) {
 				return true;
 			}
@@ -97,8 +102,4 @@
 		return theOp.metrics;
 	}
 	
-	public void setOpMetrics(Operator theOp, ArrayList<OpMetric> theMetrics) {
-		theOp.metrics = theMetrics;
-	}
-	
 }
diff --git a/console/servlets/src/main/java/org/apache/edgent/console/servlets/MetricsUtil.java b/console/servlets/src/main/java/org/apache/edgent/console/servlets/MetricsUtil.java
index bca6cc6..3d74338 100644
--- a/console/servlets/src/main/java/org/apache/edgent/console/servlets/MetricsUtil.java
+++ b/console/servlets/src/main/java/org/apache/edgent/console/servlets/MetricsUtil.java
@@ -19,7 +19,6 @@
 package org.apache.edgent.console.servlets;
 
 import java.lang.management.ManagementFactory;
-import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.Set;
 
@@ -42,13 +41,13 @@
 
 final class MetricsUtil {
 	
-	static MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
+	private static MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
 	private static final Logger logger = LoggerFactory.getLogger(MetricsUtil.class);
 
 	static Iterator<ObjectInstance> getCounterObjectIterator(String jobId) {
 		ObjectName counterObjName = null;
-		StringBuffer sbuf = new StringBuffer();
-		sbuf.append("*:jobId=" + jobId);
+		StringBuilder sbuf = new StringBuilder();
+		sbuf.append("*:jobId=").append(jobId);
 		sbuf.append(",type=metric.counters,*");
 
         // i.e, edgent.providers.development:jobId=JOB-0,opId=OP_4,name=TupleRateMeter.edgent.oplet.JOB_0.OP_4,type=metric.meters
@@ -64,8 +63,8 @@
 	static Iterator<ObjectInstance> getMeterObjectIterator(String jobId) {
 		ObjectName meterObjName = null;
 			
-			StringBuffer sbuf1 = new StringBuffer();
-			sbuf1.append("*:jobId=" + jobId);
+			StringBuilder sbuf1 = new StringBuilder();
+			sbuf1.append("*:jobId=").append(jobId);
 			sbuf1.append(",type=metric.meters,*");
 
 			try {
@@ -82,21 +81,19 @@
 	
 	static MetricsGson getAvailableMetricsForJob(String jobId, Iterator<ObjectInstance> meterIterator, Iterator<ObjectInstance> counterIterator) {
 		MetricsGson gsonJob = new MetricsGson();
-		ArrayList<Operator> counterOps = new ArrayList<Operator>();
 		gsonJob.setJobId(jobId);
 		while (meterIterator.hasNext()) {
-			ArrayList<OpMetric> metrics = null;
-			ObjectInstance meterInstance = (ObjectInstance)meterIterator.next();
+			ObjectInstance meterInstance = meterIterator.next();
 			ObjectName mObjName = meterInstance.getObjectName(); 
 			String opName = mObjName.getKeyProperty("opId");
 
-			Operator anOp = null;
 				if (!opName.equals("")) {
-					MBeanInfo mBeanInfo = null;
+					MBeanInfo mBeanInfo;
 					try {
 						mBeanInfo = mBeanServer.getMBeanInfo(mObjName);
 					} catch (IntrospectionException | InstanceNotFoundException | ReflectionException e) {
 					    logger.error("Exception caught while getting MBeanInfo", e);
+					    throw new RuntimeException("Exception caught while getting MBeanInfo", e);
 					}
 
 			    	for (MBeanAttributeInfo attributeInfo : mBeanInfo.getAttributes()) {
@@ -112,32 +109,27 @@
 	    				}
 		    			
 		    			// if the op associated with this metric is not in the job add it
-		    			if (!gsonJob.isOpInJob(opName)) {
-						    anOp = gsonJob.new Operator();
-						    gsonJob.addOp(anOp);
-						    anOp.opId = opName;
-						    counterOps.add(anOp);
-						    metrics = new ArrayList<OpMetric>();
-		    			} 
-		    			metrics.add(aMetric);
+		    			Operator theOp = gsonJob.getOp(opName);
+		    			if (theOp == null) {
+						    theOp = gsonJob.new Operator(opName);
+		    			}
+		    			theOp.metrics.add(aMetric);
 			    	}
-			    	gsonJob.setOpMetrics(anOp, metrics);
 				}
 		}
 
 		while (counterIterator.hasNext()) {
-			ArrayList<OpMetric> metrics = null;
-			ObjectInstance counterInstance = (ObjectInstance)counterIterator.next();
+			ObjectInstance counterInstance = counterIterator.next();
 			ObjectName cObjName = counterInstance.getObjectName();
 			String opName1 = cObjName.getKeyProperty("opId");
 
-			Operator anOp = null;
 			if (!opName1.equals("")) {
-			MBeanInfo mBeanInfo = null;
+			MBeanInfo mBeanInfo;
 			try {
 				mBeanInfo = mBeanServer.getMBeanInfo(cObjName);
 			} catch (IntrospectionException | InstanceNotFoundException | ReflectionException e) {
 			    logger.error("Exception caught while getting MBeanInfo", e);
+			    throw new RuntimeException("Exception caught while getting MBeanInfo", e);
 			}
 
 	    	for (MBeanAttributeInfo attributeInfo : mBeanInfo.getAttributes()) {
@@ -152,16 +144,9 @@
 				}
     			Operator theOp = gsonJob.getOp(opName1);
 				if (theOp == null) {
-					anOp = gsonJob.new Operator();
-					gsonJob.addOp(anOp);
-					anOp.opId = opName1;
-					metrics = new ArrayList<OpMetric>();
-					gsonJob.setOpMetrics(anOp, metrics);
-				} else {
-					// get the op
-					metrics = theOp.metrics;
+                    theOp = gsonJob.new Operator(opName1);
 				}
-    			metrics.add(aMetric);
+    			theOp.metrics.add(aMetric);
 	    	}
 			}
 		}
@@ -172,7 +157,7 @@
 	
 	/**
 	 * Get all the rate metrics, i.e, one minute rate, fifteen minute rate, mean rate, etc  for a job
-	 * @param job id (e.g, "JOB_0")
+	 * @param jobId id (e.g, "JOB_0")
 	 * 
 	 * @return  all metrics for this job if there are any
 	 */
@@ -182,21 +167,20 @@
 		
 		Iterator<ObjectInstance> meterIterator = MetricsUtil.getMeterObjectIterator(jobId);
 		while (meterIterator.hasNext()) {
-			ArrayList<OpMetric> metrics = null;
-			ObjectInstance meterInstance = (ObjectInstance)meterIterator.next();
+			ObjectInstance meterInstance = meterIterator.next();
 			ObjectName mObjName = meterInstance.getObjectName();
 			//i.e, edgent.providers.development:jobId=JOB-0,opId=OP_4,name=TupleRateMeter.edgent.oplet.JOB_0.OP_4,type=metric.meters
 			String jobName = mObjName.getKeyProperty("jobId");
 			String opName = mObjName.getKeyProperty("opId");
-			Operator anOp = null;
 
 			if (jobId.equals(jobName)) {
-				MBeanInfo mBeanInfo = null;
+				MBeanInfo mBeanInfo;
 			
 				try {
 					mBeanInfo = mBeanServer.getMBeanInfo(mObjName);
 				} catch (IntrospectionException | InstanceNotFoundException | ReflectionException e) {
 				    logger.error("Exception caught while getting MBeanInfo", e);
+				    throw new RuntimeException("Exception caught while getting MBeanInfo", e);
 				}
 				
 		    	for (MBeanAttributeInfo attributeInfo : mBeanInfo.getAttributes()) {
@@ -210,35 +194,28 @@
 							| ReflectionException e) {
 					    logger.error("Exception caught while accessing MBean", e);
     				}
-					 if (!gsonJob.isOpInJob(opName)) {
-					    anOp = gsonJob.new Operator();
-					    gsonJob.addOp(anOp);
-					    anOp.opId = opName;
-					    metrics = new ArrayList<OpMetric>();
-					    gsonJob.setOpMetrics(anOp, metrics);
-					 } else {
-						anOp = gsonJob.getOp(opName);
-						metrics = anOp.metrics;
+					 Operator theOp = gsonJob.getOp(opName);
+					 if (theOp == null) {
+					    theOp = gsonJob.new Operator(opName);
 					 }
-					 metrics.add(aMetric);
+					 theOp.metrics.add(aMetric);
 		    	}
 			}
 		}
 		
 		Iterator<ObjectInstance> counterIterator = MetricsUtil.getCounterObjectIterator(jobId);
 		while (counterIterator.hasNext()) {
-			ArrayList<OpMetric> metrics = null;
-			ObjectInstance counterInstance = (ObjectInstance)counterIterator.next();
+			ObjectInstance counterInstance = counterIterator.next();
 			ObjectName cObjName = counterInstance.getObjectName();
 			String opName1 = cObjName.getKeyProperty("opId");
 
-			Operator anOp = null;
 			if (!opName1.equals("")) {
-			MBeanInfo mBeanInfo = null;
+			MBeanInfo mBeanInfo;
 			try {
 				mBeanInfo = mBeanServer.getMBeanInfo(cObjName);
 			} catch (IntrospectionException | InstanceNotFoundException | ReflectionException e) {
 			    logger.error("Exception caught while getting MBeanInfo", e);
+			    throw new RuntimeException("Exception caught while getting MBeanInfo", e);
 			}
 
 	    	for (MBeanAttributeInfo attributeInfo : mBeanInfo.getAttributes()) {
@@ -253,16 +230,9 @@
 				}
     			Operator theOp = gsonJob.getOp(opName1);
 				if (theOp == null) {
-					anOp = gsonJob.new Operator();
-					gsonJob.addOp(anOp);
-					anOp.opId = opName1;
-					metrics = new ArrayList<OpMetric>();
-					gsonJob.setOpMetrics(anOp, metrics);
-				} else {
-					// get the op
-					metrics = theOp.metrics;
+					theOp = gsonJob.new Operator(opName1);
 				}
-    			metrics.add(aMetric);
+    			theOp.metrics.add(aMetric);
 	    	}
 			}
 		}
@@ -274,29 +244,27 @@
 		MetricsGson gsonJob = new MetricsGson();
 		gsonJob.setJobId(jobId);
 		String[] desiredParts = metricName.split(",");
-		String[] nameA = new String[2];
 		String desName = "";
 		if (!desiredParts[0].equals("")) {
-			nameA = desiredParts[0].split(":");
+			String[] nameA = desiredParts[0].split(":");
 			desName = nameA[1];
 		}
 		
 		while (metricIterator.hasNext()) {
-			ArrayList<OpMetric> metrics = null;
-			ObjectInstance meterInstance = (ObjectInstance)metricIterator.next();
+			ObjectInstance meterInstance = metricIterator.next();
 			ObjectName mObjName = meterInstance.getObjectName();
 			//i.e, edgent.providers.development:jobId=JOB-0,opId=OP_4,name=TupleRateMeter.edgent.oplet.JOB_0.OP_4,type=metric.meters
 			String jobName = mObjName.getKeyProperty("jobId");
 			String opName = mObjName.getKeyProperty("opId");
-			Operator anOp = null;
 
 			if (jobId.equals(jobName)) {
-				MBeanInfo mBeanInfo = null;
+				MBeanInfo mBeanInfo;
 			
 				try {
 					mBeanInfo = mBeanServer.getMBeanInfo(mObjName);
 				} catch (IntrospectionException | InstanceNotFoundException | ReflectionException e) {
 				    logger.error("Exception caught while getting MBeanInfo", e);
+				    throw new RuntimeException("Exception caught while getting MBeanInfo", e);
 				}
 				
 		    	for (MBeanAttributeInfo attributeInfo : mBeanInfo.getAttributes()) {
@@ -311,38 +279,31 @@
 								| ReflectionException e) {
 						    logger.error("Exception caught while accessing MBean", e);
 						}
-    					if (!gsonJob.isOpInJob(opName)) {
-    					    anOp = gsonJob.new Operator();
-    					    gsonJob.addOp(anOp);
-    					    anOp.opId = opName;
-    					    metrics = new ArrayList<OpMetric>();
-    					    gsonJob.setOpMetrics(anOp, metrics);
-    					} else {
-    						anOp = gsonJob.getOp(opName);
-    						metrics = anOp.metrics;
+    					Operator theOp = gsonJob.getOp(opName);
+    					if (theOp == null) {
+    					    theOp = gsonJob.new Operator(opName);
     					}
-	    				 metrics.add(aMetric);
+	    				 theOp.metrics.add(aMetric);
 	    			 }
 		    	}
 			}
 		}
 		
 		while (counterIterator.hasNext()) {
-			ArrayList<OpMetric> metrics = null;
-			ObjectInstance counterInstance = (ObjectInstance)counterIterator.next();
+			ObjectInstance counterInstance = counterIterator.next();
 			ObjectName cObjName = counterInstance.getObjectName();
 			String jobName1 = cObjName.getKeyProperty("jobId");
 			String opName1 = cObjName.getKeyProperty("opId");
 			
 
-			Operator anOp = null;
 			if (jobId.equals(jobName1)) {
-				MBeanInfo mBeanInfo = null;
+				MBeanInfo mBeanInfo;
 			
 				try {
 					mBeanInfo = mBeanServer.getMBeanInfo(cObjName);
 				} catch (IntrospectionException | InstanceNotFoundException | ReflectionException e) {
 				    logger.error("Exception caught while getting MBeanInfo", e);
+				    throw new RuntimeException("Exception caught while getting MBeanInfo", e);
 				}
 				
 		    	for (MBeanAttributeInfo attributeInfo : mBeanInfo.getAttributes()) {
@@ -358,17 +319,11 @@
 								| ReflectionException e) {
 						    logger.error("Exception caught while accessing MBean", e);
 						}
-    					if (!gsonJob.isOpInJob(opName1)) {
-    					    anOp = gsonJob.new Operator();
-    					    gsonJob.addOp(anOp);
-    					    anOp.opId = opName1;
-    					    metrics = new ArrayList<OpMetric>();
-    					    gsonJob.setOpMetrics(anOp, metrics);
-    					} else {
-    						anOp = gsonJob.getOp(opName1);
-    						metrics = anOp.metrics;
+    					Operator theOp = gsonJob.getOp(opName1);
+    					if (theOp == null) {
+    					    theOp = gsonJob.new Operator(opName1);
     					}
-	    				 metrics.add(aMetric);
+	    				 theOp.metrics.add(aMetric);
 	    			 }
 		    	}
 			}
diff --git a/console/servlets/src/main/remote-resources/META-INF/LICENSE b/console/servlets/src/main/remote-resources/META-INF/LICENSE
new file mode 100644
index 0000000..29d3c2e
--- /dev/null
+++ b/console/servlets/src/main/remote-resources/META-INF/LICENSE
@@ -0,0 +1,42 @@
+
+===============================================================================
+APACHE EDGENT SUBCOMPONENTS:
+
+This binary includes a number of subcomponents with separate
+copyright notices and license terms.  Your use of this binary
+is subject to the terms and conditions of the following licenses.
+
+===============================================================================
+License: Apache License Version 2.0
+For details, see META-INF/licenses/apache-license-version-2.0.txt
+
+gson (com.google.code.gson:gson:2.2.4)
+metrics-core (io.dropwizard.metrics:metrics-core:3.1.2)
+
+===============================================================================
+License: MIT
+
+jquery (org.webjars:jquery:1.11.2)
+    For details, see META-INF/licenses/jquery-1_11_2-MIT.txt.
+
+jquery-ui (org.webjars:jquery-ui:1.11.4)
+    For details, see META-INF/licenses/jquery-ui-1_11_4-MIT.txt.
+
+d3.legend.js (src/main/webapp/js/ext/d3.legend/d3.legend.js)
+    https://gist.githubusercontent.com/ZJONSSON/3918369/raw/bf9bce6b68a3b70f87450f155436ca4a84af1ba4/d3.legend.js
+    With Edgent specific modifications.
+    For details, see META-INF/licenses/d3.legend-MIT.txt.
+
+===============================================================================
+License: BSD 3-Clause
+
+d3 (org.webjars.bower:d3:3.3.9)
+    For details, see META-INF/licenses/d3-3_3_9-BSD.txt.
+
+===============================================================================
+License: BSD 2-Clause
+
+d3-plugins-sankey (org.webjars.bower:d3-plugins-sankey:1.1.0)
+    For details, see META-INF/licenses/d3-plugins-sankey-1_1_0-BSD.txt.
+
+===============================================================================
diff --git a/console/servlets/src/main/remote-resources/META-INF/NOTICE b/console/servlets/src/main/remote-resources/META-INF/NOTICE
new file mode 100644
index 0000000..9c9e7e9
--- /dev/null
+++ b/console/servlets/src/main/remote-resources/META-INF/NOTICE
@@ -0,0 +1,28 @@
+===============================================================================
+
+Portions of this software were developed by IBM Corp.
+Copyright IBM Corp. 2015, 2016
+
+===============================================================================
+
+APACHE EDGENT SUBCOMPONENTS:
+
+This product includes a number of subcomponents with separate
+copyright notices and license terms.  The following notices apply.
+
+-------------------------------------------------------------------------------
+metrics-core (io.dropwizard.metrics:metrics-core:3.1.2)
+
+Metrics
+Copyright 2010-2013 Coda Hale and Yammer, Inc.
+
+This product includes software developed by Coda Hale and Yammer, Inc.
+
+This product includes code derived from the JSR-166 project (ThreadLocalRandom,
+Striped64, LongAdder) with the following comments:
+
+          Written by Doug Lea with assistance from members of JCP JSR-166
+          Expert Group and released to the public domain, as explained at
+          http://creativecommons.org/publicdomain/zero/1.0/
+
+===============================================================================
diff --git a/console/servlets/src/main/webapp/WEB-INF/web.xml b/console/servlets/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..f4aa1d1
--- /dev/null
+++ b/console/servlets/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,62 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ -->
+<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
+         http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
+         version="3.1">
+
+  <servlet>
+    <display-name>Console Application</display-name>
+    <servlet-name>ConsoleServlet</servlet-name>
+    <servlet-class>org.apache.edgent.console.servlets.ConsoleServlet</servlet-class>
+    <load-on-startup>1</load-on-startup>
+  </servlet>
+
+  <servlet-mapping>
+    <servlet-name>ConsoleServlet</servlet-name>
+    <url-pattern>/console</url-pattern>
+  </servlet-mapping>
+
+  <servlet>
+    <display-name>Job Listing Service</display-name>
+    <servlet-name>ConsoleJobServlet</servlet-name>
+    <servlet-class>org.apache.edgent.console.servlets.ConsoleJobServlet</servlet-class>
+    <load-on-startup>1</load-on-startup>
+  </servlet>
+
+  <servlet-mapping>
+    <servlet-name>ConsoleJobServlet</servlet-name>
+    <url-pattern>/jobs</url-pattern>
+  </servlet-mapping>
+
+  <servlet>
+    <display-name>Metrics Listing Service</display-name>
+    <servlet-name>ConsoleMetricsServlet</servlet-name>
+    <servlet-class>org.apache.edgent.console.servlets.ConsoleMetricsServlet</servlet-class>
+    <load-on-startup>1</load-on-startup>
+  </servlet>
+
+  <servlet-mapping>
+    <servlet-name>ConsoleMetricsServlet</servlet-name>
+    <url-pattern>/metrics</url-pattern>
+  </servlet-mapping>
+
+  <welcome-file-list>
+    <welcome-file>index.html</welcome-file>
+  </welcome-file-list>
+
+</web-app>
\ No newline at end of file
diff --git a/console/servlets/src/main/webapp/index.html b/console/servlets/src/main/webapp/index.html
new file mode 100644
index 0000000..ba48dfc
--- /dev/null
+++ b/console/servlets/src/main/webapp/index.html
@@ -0,0 +1,134 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ -->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xml:lang="en-us">
+<head>
+    <title>Apache Edgent Console</title>
+
+    <link rel="stylesheet" type="text/css" href="js/ext/jquery-ui/1.11.4/jquery-ui.min.css">
+    <link rel="stylesheet" type="text/css" href="js/ext/jquery-ui/1.11.4/jquery-ui.theme.min.css">
+    <link rel="stylesheet" type="text/css" href="js/ext/jquery-ui/1.11.4/jquery-ui.structure.min.css">
+    <link rel="stylesheet" type="text/css" href="resources/css/main.css">
+    <link rel="stylesheet" type="text/css" href="resources/css/metrics.css">
+    <link rel="shortcut icon" href="resources/images/favicon.png"/>
+</head>
+
+<body>
+<div role="main">
+    <div style='margin-left:15px; float:left;'>
+        <img height='81' width='178' tabindex=0 alt="Apache Edgent logo" title="Apache Edgent logo"
+             src="resources/images/apache_edgent.png"/>
+    </div>
+    <div style='float:left;margin-top: 30px; font-size: 1.2em; margin-left: 320px;'>
+        <label tabindex=0>Topology Graph</label>
+    </div>
+    <div class="topControls" style='margin-left: 30px;clear:both;'>
+        <label for="jobs" class="jobsLabel">Job:</label>
+        <select id="jobs"></select>
+    </div>
+    <div id='stateImg' tabindex=0
+         style="float:left; display:none; margin-top: 10px; margin-left: 5px; margin-right: 10px;">
+        <div class="hidden">Job state, press the Enter key to display the job state information in a table</div>
+        <img width="28" height="28" alt="job state" src="resources/images/state.png"/>
+    </div>
+    <div class="topControls">
+        <label for="layers" class="layersLabel">View by:</label>
+        <select title="view by" id="layers">
+            <option value="static">Static flow</option>
+            <option value="flow">Tuple count</option>
+            <option value="opletColor">Oplet kind</option>
+        </select>
+
+        <div id="tagsDiv" style="visibility:hidden;margin-top: 5px;">
+            <input type='checkbox' id='showTags' checked/>
+            <label for='showTags'>Show tags:</label>
+            <div>
+
+                <input type='checkbox' id='showAllTags' checked/>
+                <label for='showAllTags'>Show all tags:</label>
+                <button id="tagDialogBtn" type='button' disabled>Select individual tags ...</button>
+            </div>
+            <div id="dialog" title="Select one or more tags">
+                <label for="tags" class="tagsLabel">Tag:</label>
+                <select id="tags" multiple></select>
+            </div>
+        </div>
+    </div>
+    <div class="topControls">
+        <label class="refreshLabel" tabindex=0>Refresh interval:</label>
+        <input aria-label='Refresh interval' name='refreshInterval' id="refreshInterval" style='width: 40px;'
+               type="number" min="3" max="20" step="1" value="5"/>
+        <label title="seconds" tabindex=0 style='margin-left: 5px; margin-right: 10px;'>seconds</label>
+        <button id="toggleTimer" title='Pause graph' type="button">Pause graph</button>
+    </div>
+
+    <div style='width: 370px; margin-left: 30px; clear:both;'>
+        <div id="showAll" tabindex=0>
+            <div>View all oplet properties</div>
+            <div style='font-size: 0.95em'>(opens a new window)</div>
+        </div>
+        <div id="graphLegend" style='height: 600px; width: 340px;'></div>
+    </div>
+    <div id="chart" style="float:right; margin-right: 100px; margin-top: -600px;">
+        <div id="loading">Loading graph ...</div>
+    </div>
+
+
+    <div id="metricsDiv" style="clear:both;display:none;margin-left: 30px;">
+        <div>
+            <label class="metricsTitle">Metrics</label>
+        </div>
+        <div class="metricsControls">
+            <label for='metrics' class="metricsLabel">Metrics:</label>
+            <select id="metrics"></select>
+            <span id="rateUnit"></span>
+        </div>
+
+        <div class="metricsControls">
+            <label for='mChartType' class="chartTypeLabel">Chart type:</label>
+            <select id="mChartType">
+                <option value='barChart' selected>Bar chart</option>
+                <option value='lineChart' selected>Line chart</option>
+            </select>
+        </div>
+
+        <div class="metricsControls">
+            <span id="noLineChartWarning" style="visibility:hidden;" class="warningLabel">*Line charts are not available when you select a metric containing multiple oplets</span>
+        </div>
+        <div id="showMetricsTable" tabindex=0 style='clear:left; padding-top: 10px; width: 150px;'>
+            <div class='hidden'>Show metrics in table. Press the Enter key to display available metrics in a table. To
+                close the dialog once it is open, press the Escape key.
+            </div>
+            <img width="150" height="38" alt='show table metrics' src="resources/images/show_metrics_in_table.png"/>
+        </div>
+
+        <div id="metricsChart" style="clear:left;"></div>
+    </div>
+</div>
+<script src="js/ext/d3/3.3.9/d3.min.js" charset="utf-8" type="application/javascript"></script>
+<script src="js/ext/jquery/1.11.2/jquery.min.js" type="application/javascript"></script>
+<script src="js/ext/jquery-ui/1.11.4/jquery-ui.min.js" type="application/javascript"></script>
+<script src="js/ext/d3-plugins-sankey/1.1.0/sankey.js" type="application/javascript"></script>
+<script src="js/ext/d3.legend/d3.legend.js" type="application/javascript"></script>
+<script src="js/streamtags.js" type="application/javascript"></script>
+<script src="js/graph.js" type="application/javascript"></script>
+<script src="js/metrics.js" type="application/javascript"></script>
+
+<script src="js/index.js" type="application/javascript"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/console/servlets/src/main/webapp/js/ext/d3.legend/d3.legend.js b/console/servlets/src/main/webapp/js/ext/d3.legend/d3.legend.js
new file mode 100644
index 0000000..79c3c43
--- /dev/null
+++ b/console/servlets/src/main/webapp/js/ext/d3.legend/d3.legend.js
@@ -0,0 +1,193 @@
+// d3.legend.js
+// (C) 2012 ziggy.jonsson.nyc@gmail.com
+// MIT licence
+
+// Edgent modified from https://gist.githubusercontent.com/ZJONSSON/3918369/raw/bf9bce6b68a3b70f87450f155436ca4a84af1ba4/d3.legend.js
+
+(function() {
+    d3.legend = function(g, chartSvg, pItems, legendTitle) {
+        g.each(function() {
+            var g= d3.select(this);
+            var items = {};
+            var svg = !chartSvg ? d3.select(g.property("nearestViewportElement")) : chartSvg;
+            var isTupleFlowLegend = false;
+            var isRect = function(d) {
+                var k = d.key.toUpperCase();
+                return k.startsWith("COUNTEROP")
+                    || k.startsWith("STREAMSCOPE");
+            };
+
+            var	legendPadding = g.attr("data-style-padding") || 5,
+                lTitleItems = g.selectAll(".legend-title-items").data([true]),
+                lb = g.selectAll(".legend-box").data([true]),
+                li = g.selectAll(".legend-items").data([true])
+
+            lTitleItems.enter().append("g").classed("legend-title-items", true)
+            lb.enter().append("rect").classed("legend-box",true)
+            liG = li.enter().append("g").classed("legend-items",true)
+
+            if (pItems) {
+                pItems.forEach(function(p){
+                    if (p.idx !== undefined) {
+                        items[p.name] = {color: p.fill, idx: p.idx};
+                        isTupleFlowLegend = true;
+                    } else {
+                        items[p.name] = {color: p.fill};
+                        isTupleFlowLegend = false;
+                    }
+                });
+            } else {
+                svg.selectAll("[data-legend]").each(function() {
+                    var self = d3.select(this);
+                    items[self.attr("data-legend")] = {
+                        pos : self.attr("data-legend-pos") || this.getBBox().y,
+                        color : self.attr("data-legend-color") != undefined ? self.attr("data-legend-color") : self.style("fill") != 'none' ? self.style("fill") : self.style("stroke")
+                    }
+                });
+            }
+
+            if (isTupleFlowLegend)
+                items = d3.entries(items).sort(
+                    function(a,b) {
+                        if (a.value.idx < b.value.idx) {
+                            return -1;
+                        } else if (a.value.idx > b.value.idx) {
+                            return 1;
+                        } else {
+                            return 0;
+                        }
+                    });
+            else  {
+                items = d3.entries(items).sort(
+                    function(a,b) {
+                        // rect before circle - graphic positioning code below
+                        var ra = isRect(a);
+                        var rb = isRect(b);
+                        if (ra && !rb) {
+                            return -1;
+                        } else if (!ra && rb) {
+                            return 1;
+                        }
+                        if (a.key < b.key) {
+                            return -1;
+                        } else if (a.key > b.key) {
+                            return 1;
+                        } else {
+                            return 0;
+                        }
+                    });
+            }
+
+            li.selectAll("text")
+                .data(items,function(d) {
+                    return d.key}
+                )
+                .call(function(d) { d.enter().append("text")})
+                .call(function(d) { d.exit().remove()})
+                .attr("y",function(d,i) { return i+"em"})
+                .attr("x","1.5em")
+                .text(function(d) {
+                    return d.key;
+                })
+
+            var legendOpacity = 0.7;
+            if (legendTitle && legendTitle === "Stream tags") {
+                legendOpacity = 1.0;
+                li.selectAll("rect")
+                    .data(items,function(d) {
+                        return d.key}
+                    )
+                    .call(function(d) { d.enter().append("rect")})
+                    .call(function(d) { d.exit().remove()})
+                    .attr("y", function(d,i) {
+                        return i-0.75+ "em"})
+                    .attr("width", 10)
+                    .attr("height", 8)
+                    .style("fill",function(d) {
+                        return d.value.color === "#c7c7c7" ? "#008080" : d.value.color;
+                    })
+                    .style("stroke", "none")
+                    .style("fill-opacity", legendOpacity);
+            } else if (legendTitle && legendTitle === "Oplet kind" || legendTitle === "Tuple count"){
+                liG.selectAll("g")
+                    .data(items, function(d) {
+                        return d.key;
+                    })
+                    .enter()
+                    .append(function(d) {
+                        if (isRect(d)) {
+                            return document.createElementNS(d3.ns.prefix.svg, 'rect');
+                        } else {
+                            return document.createElementNS(d3.ns.prefix.svg, 'circle');
+                        }
+                    });
+
+                // rects before circles
+                var count = 0;
+                li.selectAll("rect")
+                    .attr("x", -3)
+                    .attr("y", function(d,i) {
+                        count++;
+                        return i-0.75+ "em"})
+                    .attr("width", legendTitle === "Oplet kind" ? 8 : 10)
+                    .attr("height", 8)
+                    .style("fill",function(d) {
+                        return d.value.color
+                    })
+                    .style("stroke", "none")
+                    .style("fill-opacity", legendOpacity);
+
+                li.selectAll("circle")
+                    .attr("cy",function(d,i) {
+                        return (i+count)-0.25+"em"})
+                    .attr("cx",0)
+                    .attr("r","0.4em")
+                    .style("fill",function(d) {
+                        return d.value.color
+                    })
+                    .style("fill-opacity", legendOpacity);
+
+            } else {
+                li.selectAll("circle")
+                    .data(items,function(d) {
+                        return d.key}
+                    )
+                    .call(function(d) { d.enter().append("circle")})
+                    .call(function(d) { d.exit().remove()})
+                    .attr("cy",function(d,i) { return i-0.25+"em"})
+                    .attr("cx",0)
+                    .attr("r","0.4em")
+                    .style("fill",function(d) {
+                        return d.value.color
+                    })
+                    .style("fill-opacity", legendOpacity);
+            }
+            // Reposition and resize the box
+            var lbbox = li[0][0].getBBox();
+            lb.attr("x",(lbbox.x-legendPadding))
+                .attr("y",(lbbox.y-legendPadding))
+                .attr("height",(lbbox.height+2*legendPadding))
+                .attr("width",((lbbox.width+12) + 2*legendPadding));
+
+            lTitleItems.attr("x", 0)
+                .attr("y", (lbbox.y - legendPadding - 15))
+                .attr("height",15)
+                .attr("width",(lbbox.width+2*legendPadding));
+            if (legendTitle) {
+                lTitleItems.selectAll("text")
+                    .data([""],function(d) {
+                        return legendTitle;
+                    })
+                    .call(function(d) { d.enter().append("text")})
+                    .call(function(d) { d.exit().remove()})
+                    .attr("y",function(d,i) { return "-2em"})
+                    .attr("x",(lbbox.x-legendPadding))
+                    .text(function(d) {
+                        return legendTitle;
+                    });
+            }
+
+        })
+        return g
+    }
+})()
diff --git a/console/servlets/webapp_content/js/graph.js b/console/servlets/src/main/webapp/js/graph.js
similarity index 100%
rename from console/servlets/webapp_content/js/graph.js
rename to console/servlets/src/main/webapp/js/graph.js
diff --git a/console/servlets/webapp_content/js/index.js b/console/servlets/src/main/webapp/js/index.js
similarity index 97%
rename from console/servlets/webapp_content/js/index.js
rename to console/servlets/src/main/webapp/js/index.js
index 43a3e12..949d202 100644
--- a/console/servlets/webapp_content/js/index.js
+++ b/console/servlets/src/main/webapp/js/index.js
@@ -240,10 +240,10 @@
 
 var path = d3.svg.diagonal()
 .source(function(d) { 
-	return {"x":d.sourceIdx.y + d.sourceIdx.dy/2, "y":d.sourceIdx.x + sankey.nodeWidth()/2}; 
+	return {"x":d.source.y + d.source.dy/2, "y":d.source.x + sankey.nodeWidth()/2};
  })            
 .target(function(d) { 
-	return {"x":d.targetIdx.y + d.targetIdx.dy/2, "y":d.targetIdx.x + sankey.nodeWidth()/2}; 
+	return {"x":d.target.y + d.target.dy/2, "y":d.target.x + sankey.nodeWidth()/2};
  })
 .projection(function(d) { 
 	return [d.y, d.x]; 
@@ -703,8 +703,8 @@
 		var sourceStreamAliasesMap = new Map();
 		var sourceStreamTagsMap = new Map();
 		n.targetLinks.forEach(function(trg) {
-			var source = trg.sourceIdx.idx.toString();
-			var sourceLinks = trg.sourceIdx.sourceLinks;
+			var source = trg.source.idx.toString();
+			var sourceLinks = trg.source.sourceLinks;
 			for (var i = 0; i < sourceLinks.length; i++) {
 				if (trg.sourceId == sourceLinks[i].sourceId && trg.targetId == sourceLinks[i].targetId) {
 					if (layer == "static") {
@@ -731,8 +731,8 @@
 		var targetStreamAliasesMap = new Map();
 		var targetStreamTagsMap = new Map();
 		n.sourceLinks.forEach(function(src) {
-			var target = src.targetIdx.idx.toString();
-			var targetLinks = src.targetIdx.targetLinks;
+			var target = src.target.idx.toString();
+			var targetLinks = src.target.targetLinks;
 			for (var i = 0; i < targetLinks.length; i++) {
 				if (src.sourceId == targetLinks[i].sourceId && src.targetId == targetLinks[i].targetId) {
 					if (layer == "static") {
@@ -1075,8 +1075,8 @@
 				value = edge.value;
 			}
 			edge.value = value;
-			edge.sourceIdx = vertexMap[edge.sourceId].idx;
-			edge.targetIdx = vertexMap[edge.targetId].idx;
+			edge.source = vertexMap[edge.sourceId].idx;
+			edge.target = vertexMap[edge.targetId].idx;
 			i++;
 			if (edge.tags && edge.tags.length > 0) {
 				setAvailableTags(edge.tags);
@@ -1165,10 +1165,10 @@
     	  } else if (d.isZero) {
     		  value = "0";
     	  }
-    	  var sKind = parseOpletKind(d.sourceIdx.invocation.kind);
-    	  var tKind = parseOpletKind(d.targetIdx.invocation.kind);
-    	  var retString = "Oplet name: " + d.sourceIdx.idx + "\nOplet kind: " + sKind + " --> \n"
-    	  + "Oplet name: " + d.targetIdx.idx + "\nOplet kind: " + tKind + "\n" + value;
+    	  var sKind = parseOpletKind(d.source.invocation.kind);
+    	  var tKind = parseOpletKind(d.target.invocation.kind);
+    	  var retString = "Oplet name: " + d.source.idx + "\nOplet kind: " + sKind + " --> \n"
+    	  + "Oplet name: " + d.target.idx + "\nOplet kind: " + tKind + "\n" + value;
 
     	  if (d.alias) {
     		  retString += "\nStream alias: " + d.alias;
@@ -1308,8 +1308,8 @@
 		var sourceStreamAliasesMap = new Map();
 		var sourceStreamTagsMap = new Map();
 		d.targetLinks.forEach(function(trg) {
-			var source = trg.sourceIdx.idx.toString();
-			var sourceLinks = trg.sourceIdx.sourceLinks;
+			var source = trg.source.idx.toString();
+			var sourceLinks = trg.source.sourceLinks;
 			for (var i = 0; i < sourceLinks.length; i++) {
 				if (trg.sourceId == sourceLinks[i].sourceId && trg.targetId == sourceLinks[i].targetId) {
 					if (layer == "static") {
@@ -1337,8 +1337,8 @@
 		var targetStreamAliasesMap = new Map();
 		var targetStreamTagsMap = new Map();
 		d.sourceLinks.forEach(function(src) {
-			var target = src.targetIdx.idx.toString();
-			var targetLinks = src.targetIdx.targetLinks;
+			var target = src.target.idx.toString();
+			var targetLinks = src.target.targetLinks;
 			for (var i = 0; i < targetLinks.length; i++) {
 				if (src.sourceId == targetLinks[i].sourceId && src.targetId == targetLinks[i].targetId) {
 					if (layer == "static") {
diff --git a/console/servlets/webapp_content/js/metrics.js b/console/servlets/src/main/webapp/js/metrics.js
similarity index 99%
rename from console/servlets/webapp_content/js/metrics.js
rename to console/servlets/src/main/webapp/js/metrics.js
index 5c3bd8c..9d3c2e8 100644
--- a/console/servlets/webapp_content/js/metrics.js
+++ b/console/servlets/src/main/webapp/js/metrics.js
@@ -54,7 +54,6 @@
 					  var metrics = op.metrics;
 					  metrics.forEach(function(met) {
 						 obj.type = met.type;
-						 obj.opId = obj.opId;
 						 obj.name = met.name;
 						 obj.value = met.value;
 					  });
diff --git a/console/servlets/webapp_content/js/streamtags.js b/console/servlets/src/main/webapp/js/streamtags.js
similarity index 100%
rename from console/servlets/webapp_content/js/streamtags.js
rename to console/servlets/src/main/webapp/js/streamtags.js
diff --git a/console/servlets/webapp_content/resources/css/main.css b/console/servlets/src/main/webapp/resources/css/main.css
similarity index 98%
rename from console/servlets/webapp_content/resources/css/main.css
rename to console/servlets/src/main/webapp/resources/css/main.css
index 7498ab0..3d281a5 100644
--- a/console/servlets/webapp_content/resources/css/main.css
+++ b/console/servlets/src/main/webapp/resources/css/main.css
@@ -151,8 +151,7 @@
 
 .ui-widget-overlay {
 	opacity: 0.2;
-	background-color: steelblue;
-	background-image: none;
+	background: steelblue none;
 }
 
 #metrics {
diff --git a/console/servlets/webapp_content/resources/css/metrics.css b/console/servlets/src/main/webapp/resources/css/metrics.css
similarity index 100%
rename from console/servlets/webapp_content/resources/css/metrics.css
rename to console/servlets/src/main/webapp/resources/css/metrics.css
diff --git a/console/servlets/webapp_content/resources/images/apache_edgent.png b/console/servlets/src/main/webapp/resources/images/apache_edgent.png
similarity index 100%
rename from console/servlets/webapp_content/resources/images/apache_edgent.png
rename to console/servlets/src/main/webapp/resources/images/apache_edgent.png
Binary files differ
diff --git a/console/servlets/webapp_content/resources/images/favicon.png b/console/servlets/src/main/webapp/resources/images/favicon.png
similarity index 100%
rename from console/servlets/webapp_content/resources/images/favicon.png
rename to console/servlets/src/main/webapp/resources/images/favicon.png
Binary files differ
diff --git a/console/servlets/webapp_content/resources/images/show_metrics_in_table.png b/console/servlets/src/main/webapp/resources/images/show_metrics_in_table.png
similarity index 100%
rename from console/servlets/webapp_content/resources/images/show_metrics_in_table.png
rename to console/servlets/src/main/webapp/resources/images/show_metrics_in_table.png
Binary files differ
diff --git a/console/servlets/webapp_content/resources/images/state.png b/console/servlets/src/main/webapp/resources/images/state.png
similarity index 100%
rename from console/servlets/webapp_content/resources/images/state.png
rename to console/servlets/src/main/webapp/resources/images/state.png
Binary files differ
diff --git a/console/servlets/webapp_content/resources/json/samplegraph.json b/console/servlets/src/main/webapp/resources/json/samplegraph.json
similarity index 100%
rename from console/servlets/webapp_content/resources/json/samplegraph.json
rename to console/servlets/src/main/webapp/resources/json/samplegraph.json
diff --git a/console/servlets/webapp_content/resources/json/samplegraph_health.json b/console/servlets/src/main/webapp/resources/json/samplegraph_health.json
similarity index 100%
rename from console/servlets/webapp_content/resources/json/samplegraph_health.json
rename to console/servlets/src/main/webapp/resources/json/samplegraph_health.json
diff --git a/console/servlets/webapp_content/WEB-INF/console.xml b/console/servlets/webapp_content/WEB-INF/console.xml
deleted file mode 100644
index f152998..0000000
--- a/console/servlets/webapp_content/WEB-INF/console.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
- -->
-<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
-         http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
-    version="3.1">
-    <servlet>
-        <display-name>Console Application</display-name>
-        <servlet-name>ConsoleServlet</servlet-name>
-        <servlet-class>org.apache.edgent.console.servlets.ConsoleServlet</servlet-class>
-        <load-on-startup>1</load-on-startup>
-    </servlet>
-    <servlet-mapping>
-        <servlet-name>ConsoleServlet</servlet-name>
-        <url-pattern>/console</url-pattern>
-    </servlet-mapping>
-            <servlet>
-   <display-name>Job Listing Service</display-name>
-        <servlet-name>ConsoleJobServlet</servlet-name>
-        <servlet-class>org.apache.edgent.console.servlets.ConsoleJobServlet</servlet-class>
-        <load-on-startup>1</load-on-startup>
-    </servlet>
-    <servlet-mapping>
-        <servlet-name>ConsoleJobServlet</servlet-name>
-        <url-pattern>/jobs</url-pattern>
-    </servlet-mapping>
-    <servlet>
-      	<display-name>Metrics Listing Service</display-name>
-     	<servlet-name>ConsoleMetricsServlet</servlet-name>
-     	<servlet-class>org.apache.edgent.console.servlets.ConsoleMetricsServlet</servlet-class>
-     	<load-on-startup>1</load-on-startup>
-      </servlet>
-     <servlet-mapping>
-      	<servlet-name>ConsoleMetricsServlet</servlet-name>
-      	<url-pattern>/metrics</url-pattern>
-      </servlet-mapping>
-    <welcome-file-list>
-        <welcome-file>index.html</welcome-file>
-        <welcome-file>index.htm</welcome-file>
-    </welcome-file-list>
-</web-app>
\ No newline at end of file
diff --git a/console/servlets/webapp_content/html/index.html b/console/servlets/webapp_content/html/index.html
deleted file mode 100644
index ecef02a..0000000
--- a/console/servlets/webapp_content/html/index.html
+++ /dev/null
@@ -1,128 +0,0 @@
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
- -->
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" 
-   "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-us">
-<head>
-<title>Apache Edgent Console</title>
-
-<link rel="stylesheet" type="text/css" href="js/ext/jquery-ui-1.11.4.custom/jquery-ui.min.css">
-<link rel="stylesheet" type="text/css" href="js/ext/jquery-ui-1.11.4.custom/jquery-ui.theme.min.css">
-<link rel="stylesheet" type="text/css" href="js/ext/jquery-ui-1.11.4.custom/jquery-ui.structure.min.css">
-<link rel="stylesheet" type="text/css" href="resources/css/main.css">
-<link rel="stylesheet" type="text/css" href="resources/css/metrics.css">
-<link rel="shortcut icon" href="resources/images/favicon.png" />
-</head>
-
-<body>
-<div role="main">
-<div style='margin-left:15px; float:left;'>
-<img height='81' width='178' tabindex=0 alt="Apache Edgent logo" title="Apache Edgent logo" src="resources/images/apache_edgent.png"/>
-</div>
-<div style='float:left;margin-top: 30px; font-size: 1.2em; margin-left: 320px;'>
-<label tabindex=0>Topology Graph</label>
-</div>
-<div class="topControls" style='margin-left: 30px;clear:both;'>
-<label for="jobs" class="jobsLabel">Job:</label>
-<select id="jobs"></select>
-</div>
-<div id='stateImg' tabindex=0 style="float:left; display:none; margin-top: 10px; margin-left: 5px; margin-right: 10px;">
-<div class="hidden">Job state, press the Enter key to display the job state information in a table</div>
-<img width="28" height="28" alt="job state" src="resources/images/state.png"/>
-</div>
-<div class="topControls">
-<label for="layers" class="layersLabel">View by:</label>
-<select title="view by" id="layers">
-<option value="static">Static flow</option>
-<option value="flow">Tuple count</option>
-<option value="opletColor">Oplet kind</option>
-</select>
-
-<div id="tagsDiv" style="visibility:hidden;margin-top: 5px;">
-	<input type='checkbox' id='showTags' checked/>
-	<label for='showTags'>Show tags:</label>
-	<div>
-		
-		<input type='checkbox' id='showAllTags' checked/>
-		<label for='showAllTags'>Show all tags:</label>
-		<button id="tagDialogBtn" type='button' disabled>Select individual tags ...</button>
-	</div>
-		<div id="dialog" title="Select one or more tags">
-			<label for="tags" class="tagsLabel">Tag:</label>
-			<select id="tags" multiple></select>
-		</div>
-</div>
-</div>
-<div class="topControls">
-<label class="refreshLabel" tabindex=0>Refresh interval:</span>
-<input aria-label='Refresh interval' name='refreshInterval' id="refreshInterval" style='width: 40px;' type="number" min="3" max="20" step="1" value="5"/>
-<label title="seconds" tabindex=0 style='margin-left: 5px; margin-right: 10px;'>seconds</label>
-<button id="toggleTimer" title='Pause graph' type="button">Pause graph</button>
-</div>
-
-<div style='width: 370px; margin-left: 30px; clear:both;'>
-	<div id="showAll" tabindex=0 >
-		<div>View all oplet properties</div>
-		<div style='font-size: 0.95em'>(opens a new window)</div> 
-	</div>
-	<div id="graphLegend" style='height: 600px; width: 340px;'></div>
-</div>
-	<div id="chart" style="float:right; margin-right: 100px; margin-top: -600px;"><div id="loading">Loading graph ...</div></div>
-
-
-<div id="metricsDiv" style="clear:both;display:none;margin-left: 30px;">
-<div>
-<label class="metricsTitle">Metrics</label>
-</div>
-<div class="metricsControls">
-<label for='metrics' class="metricsLabel">Metrics:</label>
-<select id="metrics"></select>
-<span id="rateUnit"></span>
-</div>
-
-<div class="metricsControls">
-<label for='mChartType' class="chartTypeLabel">Chart type:</label>
-<select id="mChartType">
-<option value='barChart' selected>Bar chart</option>
-<option value='lineChart' selected>Line chart</option>
-</select>
-</div>
-
-<div class="metricsControls">
-<span id="noLineChartWarning" style="visibility:hidden;" class="warningLabel">*Line charts are not available when you select a metric containing multiple oplets</span>
-</div>
-<div id="showMetricsTable" tabindex=0 style='clear:left; padding-top: 10px; width: 150px;'>
-<div class='hidden'>Show metrics in table. Press the Enter key to display available metrics in a table. To close the dialog once it is open, press the Escape key.</div>
-<img width="150" height="38" alt='show table metrics' src="resources/images/show_metrics_in_table.png"/>
-</div>
-
-<div id="metricsChart" style="clear:left;"></div>
-</div>
-</div>
-<script src="js/ext/d3.min.js" charset="utf-8"></script>
-<script src="js/ext/jquery-ui-1.11.4.custom/external/jquery/jquery.js"></script>
-<script src="js/ext/jquery-ui-1.11.4.custom/jquery-ui.min.js"></script>
-<script src="js/ext/sankey_edgent.js"></script>
-<script src="js/streamtags.js"></script>
-<script src="js/ext/d3.legend.js"></script>
-<script src="js/graph.js"></script>
-<script src="js/metrics.js"></script>
-
-<script src="js/index.js"></script>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/console/servlets/webapp_content/js/ext/d3.legend.js b/console/servlets/webapp_content/js/ext/d3.legend.js
deleted file mode 100755
index 114546c..0000000
--- a/console/servlets/webapp_content/js/ext/d3.legend.js
+++ /dev/null
@@ -1,191 +0,0 @@
-// d3.legend.js 
-// (C) 2012 ziggy.jonsson.nyc@gmail.com
-// MIT licence
-
-(function() {
-d3.legend = function(g, chartSvg, pItems, legendTitle) {
-  g.each(function() {
-    var g= d3.select(this);
-    var items = {};
-    var svg = !chartSvg ? d3.select(g.property("nearestViewportElement")) : chartSvg;
-    var isTupleFlowLegend = false;
-    var isRect = function(d) {
-        var k = d.key.toUpperCase();
-        return k.startsWith("COUNTEROP")
-             || k.startsWith("STREAMSCOPE");
-        };
-        
-    var	legendPadding = g.attr("data-style-padding") || 5,
-        lTitleItems = g.selectAll(".legend-title-items").data([true]),
-        lb = g.selectAll(".legend-box").data([true]),
-        li = g.selectAll(".legend-items").data([true])
-
-    lTitleItems.enter().append("g").classed("legend-title-items", true)
-    lb.enter().append("rect").classed("legend-box",true)
-    liG = li.enter().append("g").classed("legend-items",true)
-
-    if (pItems) {
-    	pItems.forEach(function(p){
-    		if (p.idx !== undefined) {
-    			items[p.name] = {color: p.fill, idx: p.idx};
-    			isTupleFlowLegend = true;
-    		} else {
-    			items[p.name] = {color: p.fill};
-    			isTupleFlowLegend = false;
-    		}
-    	});
-    } else {
-	    svg.selectAll("[data-legend]").each(function() {
-	        var self = d3.select(this);
-	        items[self.attr("data-legend")] = {
-	          pos : self.attr("data-legend-pos") || this.getBBox().y,
-	          color : self.attr("data-legend-color") != undefined ? self.attr("data-legend-color") : self.style("fill") != 'none' ? self.style("fill") : self.style("stroke") 
-	        }
-	      });
-    }
-
-    if (isTupleFlowLegend)
-	   items = d3.entries(items).sort(
-			   function(a,b) {
-				   if (a.value.idx < b.value.idx) {
-					   return -1;
-				   } else if (a.value.idx > b.value.idx) {
-					   return 1;
-				   } else {
-					   return 0;
-				   }
-			   });
-    else  {
-	    items = d3.entries(items).sort(
-	    		function(a,b) {
-	    		    // rect before circle - graphic positioning code below
-	    		    var ra = isRect(a);
-	    		    var rb = isRect(b);
-	    		    if (ra && !rb) {
-	    		      return -1;
-	    		    } else if (!ra && rb) {
-	    		      return 1;
-	    		    }
-	    			if (a.key < b.key) {
-	    				return -1;
-	    			} else if (a.key > b.key) {
-	    				return 1;
-	    			} else {
-	    				return 0;
-	    			}
-	    });
-    }
-    
-    li.selectAll("text")
-        .data(items,function(d) { 
-        	return d.key}
-        )
-        .call(function(d) { d.enter().append("text")})
-        .call(function(d) { d.exit().remove()})
-        .attr("y",function(d,i) { return i+"em"})
-        .attr("x","1.5em")
-        .text(function(d) {
-        	return d.key;
-        	})
-    
-    var legendOpacity = 0.7;
-    if (legendTitle && legendTitle === "Stream tags") {
-    	legendOpacity = 1.0;
-	    li.selectAll("rect")
-        .data(items,function(d) { 
-        	return d.key}
-        )
-        .call(function(d) { d.enter().append("rect")})
-        .call(function(d) { d.exit().remove()})
-        .attr("y", function(d,i) { 
-        	return i-0.75+ "em"}) 
-        .attr("width", 10)                          
-        .attr("height", 8)
-        .style("fill",function(d) {
-        	return d.value.color === "#c7c7c7" ? "#008080" : d.value.color;
-        	})
-        .style("stroke", "none")
-        .style("fill-opacity", legendOpacity);
-    } else if (legendTitle && legendTitle === "Oplet kind" || legendTitle === "Tuple count"){
-    	liG.selectAll("g")
-    		.data(items, function(d) { 
-    			return d.key;
-    		})
-    		.enter()
-    		.append(function(d) {
-    		    if (isRect(d)) {
-    	  			return document.createElementNS(d3.ns.prefix.svg, 'rect');
-    	  		} else {
-    	  			return document.createElementNS(d3.ns.prefix.svg, 'circle');
-    	  		}
-    		});
-
-        // rects before circles
-    	var count = 0;
-    	li.selectAll("rect")
-    	.attr("x", -3)
-        .attr("y", function(d,i) {
-        	count++;
-        	return i-0.75+ "em"}) 
-        .attr("width", legendTitle === "Oplet kind" ? 8 : 10)                          
-        .attr("height", 8)
-        .style("fill",function(d) {
-        	return d.value.color
-        	})
-        .style("stroke", "none")
-        .style("fill-opacity", legendOpacity);
-    	
-	    li.selectAll("circle")
-        .attr("cy",function(d,i) {
-        	return (i+count)-0.25+"em"})
-        .attr("cx",0)
-        .attr("r","0.4em")
-        .style("fill",function(d) {
-        	return d.value.color
-        	})
-         .style("fill-opacity", legendOpacity);
-    	
-    } else {
-	    li.selectAll("circle")
-	        .data(items,function(d) { 
-	        	return d.key}
-	        )
-	        .call(function(d) { d.enter().append("circle")})
-	        .call(function(d) { d.exit().remove()})
-	        .attr("cy",function(d,i) { return i-0.25+"em"})
-	        .attr("cx",0)
-	        .attr("r","0.4em")
-	        .style("fill",function(d) {
-	        	return d.value.color
-	        	})
-	         .style("fill-opacity", legendOpacity);
-    }
-    // Reposition and resize the box
-    var lbbox = li[0][0].getBBox();
-    lb.attr("x",(lbbox.x-legendPadding))
-        .attr("y",(lbbox.y-legendPadding))
-        .attr("height",(lbbox.height+2*legendPadding))
-        .attr("width",((lbbox.width+12) + 2*legendPadding));
-    
-    lTitleItems.attr("x", 0)
-    	.attr("y", (lbbox.y - legendPadding - 15))
-    	.attr("height",15)
-        .attr("width",(lbbox.width+2*legendPadding));
-        if (legendTitle) {
-	         lTitleItems.selectAll("text")
-	         .data([""],function(d) { 
-	         	return legendTitle;
-	          })
-	         .call(function(d) { d.enter().append("text")})
-	         .call(function(d) { d.exit().remove()})
-	         .attr("y",function(d,i) { return "-2em"})
-	         .attr("x",(lbbox.x-legendPadding))
-	         .text(function(d) { 
-	         	return legendTitle;
-	         	});
-        }
-    	
-  })
-  return g
-}
-})()
diff --git a/console/servlets/webapp_content/js/ext/d3.min.js b/console/servlets/webapp_content/js/ext/d3.min.js
deleted file mode 100755
index e3aa5c6..0000000
--- a/console/servlets/webapp_content/js/ext/d3.min.js
+++ /dev/null
@@ -1,5 +0,0 @@
-!function(){function n(n){return n&&(n.ownerDocument||n.document||n).documentElement}function t(n){return n&&(n.ownerDocument&&n.ownerDocument.defaultView||n.document&&n||n.defaultView)}function e(n,t){return t>n?-1:n>t?1:n>=t?0:NaN}function r(n){return null===n?NaN:+n}function u(n){return!isNaN(n)}function i(n){return{left:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n(t[i],e)<0?r=i+1:u=i}return r},right:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n(t[i],e)>0?u=i:r=i+1}return r}}}function a(n){return n.length}function o(n){for(var t=1;n*t%1;)t*=10;return t}function l(n,t){for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}function c(){this._=Object.create(null)}function s(n){return(n+="")===xa||n[0]===ba?ba+n:n}function f(n){return(n+="")[0]===ba?n.slice(1):n}function h(n){return s(n)in this._}function g(n){return(n=s(n))in this._&&delete this._[n]}function p(){var n=[];for(var t in this._)n.push(f(t));return n}function v(){var n=0;for(var t in this._)++n;return n}function d(){for(var n in this._)return!1;return!0}function m(){this._=Object.create(null)}function y(n){return n}function M(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function x(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.slice(1);for(var e=0,r=_a.length;r>e;++e){var u=_a[e]+t;if(u in n)return u}}function b(){}function _(){}function w(n){function t(){for(var t,r=e,u=-1,i=r.length;++u<i;)(t=r[u].on)&&t.apply(this,arguments);return n}var e=[],r=new c;return t.on=function(t,u){var i,a=r.get(t);return arguments.length<2?a&&a.on:(a&&(a.on=null,e=e.slice(0,i=e.indexOf(a)).concat(e.slice(i+1)),r.remove(t)),u&&e.push(r.set(t,{on:u})),n)},t}function S(){oa.event.preventDefault()}function k(){for(var n,t=oa.event;n=t.sourceEvent;)t=n;return t}function N(n){for(var t=new _,e=0,r=arguments.length;++e<r;)t[arguments[e]]=w(t);return t.of=function(e,r){return function(u){try{var i=u.sourceEvent=oa.event;u.target=n,oa.event=u,t[u.type].apply(e,r)}finally{oa.event=i}}},t}function E(n){return Sa(n,Aa),n}function A(n){return"function"==typeof n?n:function(){return ka(n,this)}}function C(n){return"function"==typeof n?n:function(){return Na(n,this)}}function z(n,t){function e(){this.removeAttribute(n)}function r(){this.removeAttributeNS(n.space,n.local)}function u(){this.setAttribute(n,t)}function i(){this.setAttributeNS(n.space,n.local,t)}function a(){var e=t.apply(this,arguments);null==e?this.removeAttribute(n):this.setAttribute(n,e)}function o(){var e=t.apply(this,arguments);null==e?this.removeAttributeNS(n.space,n.local):this.setAttributeNS(n.space,n.local,e)}return n=oa.ns.qualify(n),null==t?n.local?r:e:"function"==typeof t?n.local?o:a:n.local?i:u}function L(n){return n.trim().replace(/\s+/g," ")}function q(n){return new RegExp("(?:^|\\s+)"+oa.requote(n)+"(?:\\s+|$)","g")}function T(n){return(n+"").trim().split(/^|\s+/)}function R(n,t){function e(){for(var e=-1;++e<u;)n[e](this,t)}function r(){for(var e=-1,r=t.apply(this,arguments);++e<u;)n[e](this,r)}n=T(n).map(D);var u=n.length;return"function"==typeof t?r:e}function D(n){var t=q(n);return function(e,r){if(u=e.classList)return r?u.add(n):u.remove(n);var u=e.getAttribute("class")||"";r?(t.lastIndex=0,t.test(u)||e.setAttribute("class",L(u+" "+n))):e.setAttribute("class",L(u.replace(t," ")))}}function P(n,t,e){function r(){this.style.removeProperty(n)}function u(){this.style.setProperty(n,t,e)}function i(){var r=t.apply(this,arguments);null==r?this.style.removeProperty(n):this.style.setProperty(n,r,e)}return null==t?r:"function"==typeof t?i:u}function j(n,t){function e(){delete this[n]}function r(){this[n]=t}function u(){var e=t.apply(this,arguments);null==e?delete this[n]:this[n]=e}return null==t?e:"function"==typeof t?u:r}function U(n){function t(){var t=this.ownerDocument,e=this.namespaceURI;return e?t.createElementNS(e,n):t.createElement(n)}function e(){return this.ownerDocument.createElementNS(n.space,n.local)}return"function"==typeof n?n:(n=oa.ns.qualify(n)).local?e:t}function F(){var n=this.parentNode;n&&n.removeChild(this)}function H(n){return{__data__:n}}function O(n){return function(){return Ea(this,n)}}function I(n){return arguments.length||(n=e),function(t,e){return t&&e?n(t.__data__,e.__data__):!t-!e}}function Y(n,t){for(var e=0,r=n.length;r>e;e++)for(var u,i=n[e],a=0,o=i.length;o>a;a++)(u=i[a])&&t(u,a,e);return n}function Z(n){return Sa(n,za),n}function V(n){var t,e;return function(r,u,i){var a,o=n[i].update,l=o.length;for(i!=e&&(e=i,t=0),u>=t&&(t=u+1);!(a=o[t])&&++t<l;);return a}}function X(n,t,e){function r(){var t=this[a];t&&(this.removeEventListener(n,t,t.$),delete this[a])}function u(){var u=l(t,ca(arguments));r.call(this),this.addEventListener(n,this[a]=u,u.$=e),u._=t}function i(){var t,e=new RegExp("^__on([^.]+)"+oa.requote(n)+"$");for(var r in this)if(t=r.match(e)){var u=this[r];this.removeEventListener(t[1],u,u.$),delete this[r]}}var a="__on"+n,o=n.indexOf("."),l=$;o>0&&(n=n.slice(0,o));var c=La.get(n);return c&&(n=c,l=B),o?t?u:r:t?b:i}function $(n,t){return function(e){var r=oa.event;oa.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{oa.event=r}}}function B(n,t){var e=$(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function W(e){var r=".dragsuppress-"+ ++Ta,u="click"+r,i=oa.select(t(e)).on("touchmove"+r,S).on("dragstart"+r,S).on("selectstart"+r,S);if(null==qa&&(qa="onselectstart"in e?!1:x(e.style,"userSelect")),qa){var a=n(e).style,o=a[qa];a[qa]="none"}return function(n){if(i.on(r,null),qa&&(a[qa]=o),n){var t=function(){i.on(u,null)};i.on(u,function(){S(),t()},!0),setTimeout(t,0)}}}function J(n,e){e.changedTouches&&(e=e.changedTouches[0]);var r=n.ownerSVGElement||n;if(r.createSVGPoint){var u=r.createSVGPoint();if(0>Ra){var i=t(n);if(i.scrollX||i.scrollY){r=oa.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important");var a=r[0][0].getScreenCTM();Ra=!(a.f||a.e),r.remove()}}return Ra?(u.x=e.pageX,u.y=e.pageY):(u.x=e.clientX,u.y=e.clientY),u=u.matrixTransform(n.getScreenCTM().inverse()),[u.x,u.y]}var o=n.getBoundingClientRect();return[e.clientX-o.left-n.clientLeft,e.clientY-o.top-n.clientTop]}function G(){return oa.event.changedTouches[0].identifier}function K(n){return n>0?1:0>n?-1:0}function Q(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(t[1]-n[1])*(e[0]-n[0])}function nn(n){return n>1?0:-1>n?ja:Math.acos(n)}function tn(n){return n>1?Ha:-1>n?-Ha:Math.asin(n)}function en(n){return((n=Math.exp(n))-1/n)/2}function rn(n){return((n=Math.exp(n))+1/n)/2}function un(n){return((n=Math.exp(2*n))-1)/(n+1)}function an(n){return(n=Math.sin(n/2))*n}function on(){}function ln(n,t,e){return this instanceof ln?(this.h=+n,this.s=+t,void(this.l=+e)):arguments.length<2?n instanceof ln?new ln(n.h,n.s,n.l):_n(""+n,wn,ln):new ln(n,t,e)}function cn(n,t,e){function r(n){return n>360?n-=360:0>n&&(n+=360),60>n?i+(a-i)*n/60:180>n?a:240>n?i+(a-i)*(240-n)/60:i}function u(n){return Math.round(255*r(n))}var i,a;return n=isNaN(n)?0:(n%=360)<0?n+360:n,t=isNaN(t)?0:0>t?0:t>1?1:t,e=0>e?0:e>1?1:e,a=.5>=e?e*(1+t):e+t-e*t,i=2*e-a,new yn(u(n+120),u(n),u(n-120))}function sn(n,t,e){return this instanceof sn?(this.h=+n,this.c=+t,void(this.l=+e)):arguments.length<2?n instanceof sn?new sn(n.h,n.c,n.l):n instanceof hn?pn(n.l,n.a,n.b):pn((n=Sn((n=oa.rgb(n)).r,n.g,n.b)).l,n.a,n.b):new sn(n,t,e)}function fn(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),new hn(e,Math.cos(n*=Oa)*t,Math.sin(n)*t)}function hn(n,t,e){return this instanceof hn?(this.l=+n,this.a=+t,void(this.b=+e)):arguments.length<2?n instanceof hn?new hn(n.l,n.a,n.b):n instanceof sn?fn(n.h,n.c,n.l):Sn((n=yn(n)).r,n.g,n.b):new hn(n,t,e)}function gn(n,t,e){var r=(n+16)/116,u=r+t/500,i=r-e/200;return u=vn(u)*Ka,r=vn(r)*Qa,i=vn(i)*no,new yn(mn(3.2404542*u-1.5371385*r-.4985314*i),mn(-.969266*u+1.8760108*r+.041556*i),mn(.0556434*u-.2040259*r+1.0572252*i))}function pn(n,t,e){return n>0?new sn(Math.atan2(e,t)*Ia,Math.sqrt(t*t+e*e),n):new sn(NaN,NaN,n)}function vn(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function dn(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function mn(n){return Math.round(255*(.00304>=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function yn(n,t,e){return this instanceof yn?(this.r=~~n,this.g=~~t,void(this.b=~~e)):arguments.length<2?n instanceof yn?new yn(n.r,n.g,n.b):_n(""+n,yn,cn):new yn(n,t,e)}function Mn(n){return new yn(n>>16,n>>8&255,255&n)}function xn(n){return Mn(n)+""}function bn(n){return 16>n?"0"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function _n(n,t,e){var r,u,i,a=0,o=0,l=0;if(r=/([a-z]+)\((.*)\)/.exec(n=n.toLowerCase()))switch(u=r[2].split(","),r[1]){case"hsl":return e(parseFloat(u[0]),parseFloat(u[1])/100,parseFloat(u[2])/100);case"rgb":return t(Nn(u[0]),Nn(u[1]),Nn(u[2]))}return(i=ro.get(n))?t(i.r,i.g,i.b):(null==n||"#"!==n.charAt(0)||isNaN(i=parseInt(n.slice(1),16))||(4===n.length?(a=(3840&i)>>4,a=a>>4|a,o=240&i,o=o>>4|o,l=15&i,l=l<<4|l):7===n.length&&(a=(16711680&i)>>16,o=(65280&i)>>8,l=255&i)),t(a,o,l))}function wn(n,t,e){var r,u,i=Math.min(n/=255,t/=255,e/=255),a=Math.max(n,t,e),o=a-i,l=(a+i)/2;return o?(u=.5>l?o/(a+i):o/(2-a-i),r=n==a?(t-e)/o+(e>t?6:0):t==a?(e-n)/o+2:(n-t)/o+4,r*=60):(r=NaN,u=l>0&&1>l?0:r),new ln(r,u,l)}function Sn(n,t,e){n=kn(n),t=kn(t),e=kn(e);var r=dn((.4124564*n+.3575761*t+.1804375*e)/Ka),u=dn((.2126729*n+.7151522*t+.072175*e)/Qa),i=dn((.0193339*n+.119192*t+.9503041*e)/no);return hn(116*u-16,500*(r-u),200*(u-i))}function kn(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function Nn(n){var t=parseFloat(n);return"%"===n.charAt(n.length-1)?Math.round(2.55*t):t}function En(n){return"function"==typeof n?n:function(){return n}}function An(n){return function(t,e,r){return 2===arguments.length&&"function"==typeof e&&(r=e,e=null),Cn(t,e,n,r)}}function Cn(n,t,e,r){function u(){var n,t=l.status;if(!t&&Ln(l)||t>=200&&300>t||304===t){try{n=e.call(i,l)}catch(r){return void a.error.call(i,r)}a.load.call(i,n)}else a.error.call(i,l)}var i={},a=oa.dispatch("beforesend","progress","load","error"),o={},l=new XMLHttpRequest,c=null;return!this.XDomainRequest||"withCredentials"in l||!/^(http(s)?:)?\/\//.test(n)||(l=new XDomainRequest),"onload"in l?l.onload=l.onerror=u:l.onreadystatechange=function(){l.readyState>3&&u()},l.onprogress=function(n){var t=oa.event;oa.event=n;try{a.progress.call(i,l)}finally{oa.event=t}},i.header=function(n,t){return n=(n+"").toLowerCase(),arguments.length<2?o[n]:(null==t?delete o[n]:o[n]=t+"",i)},i.mimeType=function(n){return arguments.length?(t=null==n?null:n+"",i):t},i.responseType=function(n){return arguments.length?(c=n,i):c},i.response=function(n){return e=n,i},["get","post"].forEach(function(n){i[n]=function(){return i.send.apply(i,[n].concat(ca(arguments)))}}),i.send=function(e,r,u){if(2===arguments.length&&"function"==typeof r&&(u=r,r=null),l.open(e,n,!0),null==t||"accept"in o||(o.accept=t+",*/*"),l.setRequestHeader)for(var s in o)l.setRequestHeader(s,o[s]);return null!=t&&l.overrideMimeType&&l.overrideMimeType(t),null!=c&&(l.responseType=c),null!=u&&i.on("error",u).on("load",function(n){u(null,n)}),a.beforesend.call(i,l),l.send(null==r?null:r),i},i.abort=function(){return l.abort(),i},oa.rebind(i,a,"on"),null==r?i:i.get(zn(r))}function zn(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function Ln(n){var t=n.responseType;return t&&"text"!==t?n.response:n.responseText}function qn(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now());var u=e+t,i={c:n,t:u,n:null};return io?io.n=i:uo=i,io=i,ao||(oo=clearTimeout(oo),ao=1,lo(Tn)),i}function Tn(){var n=Rn(),t=Dn()-n;t>24?(isFinite(t)&&(clearTimeout(oo),oo=setTimeout(Tn,t)),ao=0):(ao=1,lo(Tn))}function Rn(){for(var n=Date.now(),t=uo;t;)n>=t.t&&t.c(n-t.t)&&(t.c=null),t=t.n;return n}function Dn(){for(var n,t=uo,e=1/0;t;)t.c?(t.t<e&&(e=t.t),t=(n=t).n):t=n?n.n=t.n:uo=t.n;return io=n,e}function Pn(n,t){return t-(n?Math.ceil(Math.log(n)/Math.LN10):1)}function jn(n,t){var e=Math.pow(10,3*Ma(8-t));return{scale:t>8?function(n){return n/e}:function(n){return n*e},symbol:n}}function Un(n){var t=n.decimal,e=n.thousands,r=n.grouping,u=n.currency,i=r&&e?function(n,t){for(var u=n.length,i=[],a=0,o=r[0],l=0;u>0&&o>0&&(l+o+1>t&&(o=Math.max(1,t-l)),i.push(n.substring(u-=o,u+o)),!((l+=o+1)>t));)o=r[a=(a+1)%r.length];return i.reverse().join(e)}:y;return function(n){var e=so.exec(n),r=e[1]||" ",a=e[2]||">",o=e[3]||"-",l=e[4]||"",c=e[5],s=+e[6],f=e[7],h=e[8],g=e[9],p=1,v="",d="",m=!1,y=!0;switch(h&&(h=+h.substring(1)),(c||"0"===r&&"="===a)&&(c=r="0",a="="),g){case"n":f=!0,g="g";break;case"%":p=100,d="%",g="f";break;case"p":p=100,d="%",g="r";break;case"b":case"o":case"x":case"X":"#"===l&&(v="0"+g.toLowerCase());case"c":y=!1;case"d":m=!0,h=0;break;case"s":p=-1,g="r"}"$"===l&&(v=u[0],d=u[1]),"r"!=g||h||(g="g"),null!=h&&("g"==g?h=Math.max(1,Math.min(21,h)):("e"==g||"f"==g)&&(h=Math.max(0,Math.min(20,h)))),g=fo.get(g)||Fn;var M=c&&f;return function(n){var e=d;if(m&&n%1)return"";var u=0>n||0===n&&0>1/n?(n=-n,"-"):"-"===o?"":o;if(0>p){var l=oa.formatPrefix(n,h);n=l.scale(n),e=l.symbol+d}else n*=p;n=g(n,h);var x,b,_=n.lastIndexOf(".");if(0>_){var w=y?n.lastIndexOf("e"):-1;0>w?(x=n,b=""):(x=n.substring(0,w),b=n.substring(w))}else x=n.substring(0,_),b=t+n.substring(_+1);!c&&f&&(x=i(x,1/0));var S=v.length+x.length+b.length+(M?0:u.length),k=s>S?new Array(S=s-S+1).join(r):"";return M&&(x=i(k+x,k.length?s-b.length:1/0)),u+=v,n=x+b,("<"===a?u+n+k:">"===a?k+u+n:"^"===a?k.substring(0,S>>=1)+u+n+k.substring(S):u+(M?n:k+n))+e}}}function Fn(n){return n+""}function Hn(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function On(n,t,e){function r(t){var e=n(t),r=i(e,1);return r-t>t-e?e:r}function u(e){return t(e=n(new go(e-1)),1),e}function i(n,e){return t(n=new go(+n),e),n}function a(n,r,i){var a=u(n),o=[];if(i>1)for(;r>a;)e(a)%i||o.push(new Date(+a)),t(a,1);else for(;r>a;)o.push(new Date(+a)),t(a,1);return o}function o(n,t,e){try{go=Hn;var r=new Hn;return r._=n,a(r,t,e)}finally{go=Date}}n.floor=n,n.round=r,n.ceil=u,n.offset=i,n.range=a;var l=n.utc=In(n);return l.floor=l,l.round=In(r),l.ceil=In(u),l.offset=In(i),l.range=o,n}function In(n){return function(t,e){try{go=Hn;var r=new Hn;return r._=t,n(r,e)._}finally{go=Date}}}function Yn(n){function t(n){function t(t){for(var e,u,i,a=[],o=-1,l=0;++o<r;)37===n.charCodeAt(o)&&(a.push(n.slice(l,o)),null!=(u=vo[e=n.charAt(++o)])&&(e=n.charAt(++o)),(i=A[e])&&(e=i(t,null==u?"e"===e?" ":"0":u)),a.push(e),l=o+1);return a.push(n.slice(l,o)),a.join("")}var r=n.length;return t.parse=function(t){var r={y:1900,m:0,d:1,H:0,M:0,S:0,L:0,Z:null},u=e(r,n,t,0);if(u!=t.length)return null;"p"in r&&(r.H=r.H%12+12*r.p);var i=null!=r.Z&&go!==Hn,a=new(i?Hn:go);return"j"in r?a.setFullYear(r.y,0,r.j):"W"in r||"U"in r?("w"in r||(r.w="W"in r?1:0),a.setFullYear(r.y,0,1),a.setFullYear(r.y,0,"W"in r?(r.w+6)%7+7*r.W-(a.getDay()+5)%7:r.w+7*r.U-(a.getDay()+6)%7)):a.setFullYear(r.y,r.m,r.d),a.setHours(r.H+(r.Z/100|0),r.M+r.Z%100,r.S,r.L),i?a._:a},t.toString=function(){return n},t}function e(n,t,e,r){for(var u,i,a,o=0,l=t.length,c=e.length;l>o;){if(r>=c)return-1;if(u=t.charCodeAt(o++),37===u){if(a=t.charAt(o++),i=C[a in vo?t.charAt(o++):a],!i||(r=i(n,e,r))<0)return-1}else if(u!=e.charCodeAt(r++))return-1}return r}function r(n,t,e){_.lastIndex=0;var r=_.exec(t.slice(e));return r?(n.w=w.get(r[0].toLowerCase()),e+r[0].length):-1}function u(n,t,e){x.lastIndex=0;var r=x.exec(t.slice(e));return r?(n.w=b.get(r[0].toLowerCase()),e+r[0].length):-1}function i(n,t,e){N.lastIndex=0;var r=N.exec(t.slice(e));return r?(n.m=E.get(r[0].toLowerCase()),e+r[0].length):-1}function a(n,t,e){S.lastIndex=0;var r=S.exec(t.slice(e));return r?(n.m=k.get(r[0].toLowerCase()),e+r[0].length):-1}function o(n,t,r){return e(n,A.c.toString(),t,r)}function l(n,t,r){return e(n,A.x.toString(),t,r)}function c(n,t,r){return e(n,A.X.toString(),t,r)}function s(n,t,e){var r=M.get(t.slice(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}var f=n.dateTime,h=n.date,g=n.time,p=n.periods,v=n.days,d=n.shortDays,m=n.months,y=n.shortMonths;t.utc=function(n){function e(n){try{go=Hn;var t=new go;return t._=n,r(t)}finally{go=Date}}var r=t(n);return e.parse=function(n){try{go=Hn;var t=r.parse(n);return t&&t._}finally{go=Date}},e.toString=r.toString,e},t.multi=t.utc.multi=ct;var M=oa.map(),x=Vn(v),b=Xn(v),_=Vn(d),w=Xn(d),S=Vn(m),k=Xn(m),N=Vn(y),E=Xn(y);p.forEach(function(n,t){M.set(n.toLowerCase(),t)});var A={a:function(n){return d[n.getDay()]},A:function(n){return v[n.getDay()]},b:function(n){return y[n.getMonth()]},B:function(n){return m[n.getMonth()]},c:t(f),d:function(n,t){return Zn(n.getDate(),t,2)},e:function(n,t){return Zn(n.getDate(),t,2)},H:function(n,t){return Zn(n.getHours(),t,2)},I:function(n,t){return Zn(n.getHours()%12||12,t,2)},j:function(n,t){return Zn(1+ho.dayOfYear(n),t,3)},L:function(n,t){return Zn(n.getMilliseconds(),t,3)},m:function(n,t){return Zn(n.getMonth()+1,t,2)},M:function(n,t){return Zn(n.getMinutes(),t,2)},p:function(n){return p[+(n.getHours()>=12)]},S:function(n,t){return Zn(n.getSeconds(),t,2)},U:function(n,t){return Zn(ho.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return Zn(ho.mondayOfYear(n),t,2)},x:t(h),X:t(g),y:function(n,t){return Zn(n.getFullYear()%100,t,2)},Y:function(n,t){return Zn(n.getFullYear()%1e4,t,4)},Z:ot,"%":function(){return"%"}},C={a:r,A:u,b:i,B:a,c:o,d:tt,e:tt,H:rt,I:rt,j:et,L:at,m:nt,M:ut,p:s,S:it,U:Bn,w:$n,W:Wn,x:l,X:c,y:Gn,Y:Jn,Z:Kn,"%":lt};return t}function Zn(n,t,e){var r=0>n?"-":"",u=(r?-n:n)+"",i=u.length;return r+(e>i?new Array(e-i+1).join(t)+u:u)}function Vn(n){return new RegExp("^(?:"+n.map(oa.requote).join("|")+")","i")}function Xn(n){for(var t=new c,e=-1,r=n.length;++e<r;)t.set(n[e].toLowerCase(),e);return t}function $n(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+1));return r?(n.w=+r[0],e+r[0].length):-1}function Bn(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e));return r?(n.U=+r[0],e+r[0].length):-1}function Wn(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e));return r?(n.W=+r[0],e+r[0].length):-1}function Jn(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+4));return r?(n.y=+r[0],e+r[0].length):-1}function Gn(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+2));return r?(n.y=Qn(+r[0]),e+r[0].length):-1}function Kn(n,t,e){return/^[+-]\d{4}$/.test(t=t.slice(e,e+5))?(n.Z=-t,e+5):-1}function Qn(n){return n+(n>68?1900:2e3)}function nt(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function tt(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function et(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function rt(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function ut(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function it(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function at(n,t,e){mo.lastIndex=0;var r=mo.exec(t.slice(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function ot(n){var t=n.getTimezoneOffset(),e=t>0?"-":"+",r=Ma(t)/60|0,u=Ma(t)%60;return e+Zn(r,"0",2)+Zn(u,"0",2)}function lt(n,t,e){yo.lastIndex=0;var r=yo.exec(t.slice(e,e+1));return r?e+r[0].length:-1}function ct(n){for(var t=n.length,e=-1;++e<t;)n[e][0]=this(n[e][0]);return function(t){for(var e=0,r=n[e];!r[1](t);)r=n[++e];return r[0](t)}}function st(){}function ft(n,t,e){var r=e.s=n+t,u=r-n,i=r-u;e.t=n-i+(t-u)}function ht(n,t){n&&_o.hasOwnProperty(n.type)&&_o[n.type](n,t)}function gt(n,t,e){var r,u=-1,i=n.length-e;for(t.lineStart();++u<i;)r=n[u],t.point(r[0],r[1],r[2]);t.lineEnd()}function pt(n,t){var e=-1,r=n.length;for(t.polygonStart();++e<r;)gt(n[e],t,1);t.polygonEnd()}function vt(){function n(n,t){n*=Oa,t=t*Oa/2+ja/4;var e=n-r,a=e>=0?1:-1,o=a*e,l=Math.cos(t),c=Math.sin(t),s=i*c,f=u*l+s*Math.cos(o),h=s*a*Math.sin(o);So.add(Math.atan2(h,f)),r=n,u=l,i=c}var t,e,r,u,i;ko.point=function(a,o){ko.point=n,r=(t=a)*Oa,u=Math.cos(o=(e=o)*Oa/2+ja/4),i=Math.sin(o)},ko.lineEnd=function(){n(t,e)}}function dt(n){var t=n[0],e=n[1],r=Math.cos(e);return[r*Math.cos(t),r*Math.sin(t),Math.sin(e)]}function mt(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function yt(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function Mt(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function xt(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function bt(n){var t=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}function _t(n){return[Math.atan2(n[1],n[0]),tn(n[2])]}function wt(n,t){return Ma(n[0]-t[0])<Da&&Ma(n[1]-t[1])<Da}function St(n,t){n*=Oa;var e=Math.cos(t*=Oa);kt(e*Math.cos(n),e*Math.sin(n),Math.sin(t))}function kt(n,t,e){++No,Ao+=(n-Ao)/No,Co+=(t-Co)/No,zo+=(e-zo)/No}function Nt(){function n(n,u){n*=Oa;var i=Math.cos(u*=Oa),a=i*Math.cos(n),o=i*Math.sin(n),l=Math.sin(u),c=Math.atan2(Math.sqrt((c=e*l-r*o)*c+(c=r*a-t*l)*c+(c=t*o-e*a)*c),t*a+e*o+r*l);Eo+=c,Lo+=c*(t+(t=a)),qo+=c*(e+(e=o)),To+=c*(r+(r=l)),kt(t,e,r)}var t,e,r;jo.point=function(u,i){u*=Oa;var a=Math.cos(i*=Oa);t=a*Math.cos(u),e=a*Math.sin(u),r=Math.sin(i),jo.point=n,kt(t,e,r)}}function Et(){jo.point=St}function At(){function n(n,t){n*=Oa;var e=Math.cos(t*=Oa),a=e*Math.cos(n),o=e*Math.sin(n),l=Math.sin(t),c=u*l-i*o,s=i*a-r*l,f=r*o-u*a,h=Math.sqrt(c*c+s*s+f*f),g=r*a+u*o+i*l,p=h&&-nn(g)/h,v=Math.atan2(h,g);Ro+=p*c,Do+=p*s,Po+=p*f,Eo+=v,Lo+=v*(r+(r=a)),qo+=v*(u+(u=o)),To+=v*(i+(i=l)),kt(r,u,i)}var t,e,r,u,i;jo.point=function(a,o){t=a,e=o,jo.point=n,a*=Oa;var l=Math.cos(o*=Oa);r=l*Math.cos(a),u=l*Math.sin(a),i=Math.sin(o),kt(r,u,i)},jo.lineEnd=function(){n(t,e),jo.lineEnd=Et,jo.point=St}}function Ct(n,t){function e(e,r){return e=n(e,r),t(e[0],e[1])}return n.invert&&t.invert&&(e.invert=function(e,r){return e=t.invert(e,r),e&&n.invert(e[0],e[1])}),e}function zt(){return!0}function Lt(n,t,e,r,u){var i=[],a=[];if(n.forEach(function(n){if(!((t=n.length-1)<=0)){var t,e=n[0],r=n[t];if(wt(e,r)){u.lineStart();for(var o=0;t>o;++o)u.point((e=n[o])[0],e[1]);return void u.lineEnd()}var l=new Tt(e,n,null,!0),c=new Tt(e,null,l,!1);l.o=c,i.push(l),a.push(c),l=new Tt(r,n,null,!1),c=new Tt(r,null,l,!0),l.o=c,i.push(l),a.push(c)}}),a.sort(t),qt(i),qt(a),i.length){for(var o=0,l=e,c=a.length;c>o;++o)a[o].e=l=!l;for(var s,f,h=i[0];;){for(var g=h,p=!0;g.v;)if((g=g.n)===h)return;s=g.z,u.lineStart();do{if(g.v=g.o.v=!0,g.e){if(p)for(var o=0,c=s.length;c>o;++o)u.point((f=s[o])[0],f[1]);else r(g.x,g.n.x,1,u);g=g.n}else{if(p){s=g.p.z;for(var o=s.length-1;o>=0;--o)u.point((f=s[o])[0],f[1])}else r(g.x,g.p.x,-1,u);g=g.p}g=g.o,s=g.z,p=!p}while(!g.v);u.lineEnd()}}}function qt(n){if(t=n.length){for(var t,e,r=0,u=n[0];++r<t;)u.n=e=n[r],e.p=u,u=e;u.n=e=n[0],e.p=u}}function Tt(n,t,e,r){this.x=n,this.z=t,this.o=e,this.e=r,this.v=!1,this.n=this.p=null}function Rt(n,t,e,r){return function(u,i){function a(t,e){var r=u(t,e);n(t=r[0],e=r[1])&&i.point(t,e)}function o(n,t){var e=u(n,t);d.point(e[0],e[1])}function l(){y.point=o,d.lineStart()}function c(){y.point=a,d.lineEnd()}function s(n,t){v.push([n,t]);var e=u(n,t);x.point(e[0],e[1])}function f(){x.lineStart(),v=[]}function h(){s(v[0][0],v[0][1]),x.lineEnd();var n,t=x.clean(),e=M.buffer(),r=e.length;if(v.pop(),p.push(v),v=null,r)if(1&t){n=e[0];var u,r=n.length-1,a=-1;if(r>0){for(b||(i.polygonStart(),b=!0),i.lineStart();++a<r;)i.point((u=n[a])[0],u[1]);i.lineEnd()}}else r>1&&2&t&&e.push(e.pop().concat(e.shift())),g.push(e.filter(Dt))}var g,p,v,d=t(i),m=u.invert(r[0],r[1]),y={point:a,lineStart:l,lineEnd:c,polygonStart:function(){y.point=s,y.lineStart=f,y.lineEnd=h,g=[],p=[]},polygonEnd:function(){y.point=a,y.lineStart=l,y.lineEnd=c,g=oa.merge(g);var n=Ot(m,p);g.length?(b||(i.polygonStart(),b=!0),Lt(g,jt,n,e,i)):n&&(b||(i.polygonStart(),b=!0),i.lineStart(),e(null,null,1,i),i.lineEnd()),b&&(i.polygonEnd(),b=!1),g=p=null},sphere:function(){i.polygonStart(),i.lineStart(),e(null,null,1,i),i.lineEnd(),i.polygonEnd()}},M=Pt(),x=t(M),b=!1;return y}}function Dt(n){return n.length>1}function Pt(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:b,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function jt(n,t){return((n=n.x)[0]<0?n[1]-Ha-Da:Ha-n[1])-((t=t.x)[0]<0?t[1]-Ha-Da:Ha-t[1])}function Ut(n){var t,e=NaN,r=NaN,u=NaN;return{lineStart:function(){n.lineStart(),t=1},point:function(i,a){var o=i>0?ja:-ja,l=Ma(i-e);Ma(l-ja)<Da?(n.point(e,r=(r+a)/2>0?Ha:-Ha),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(o,r),n.point(i,r),t=0):u!==o&&l>=ja&&(Ma(e-u)<Da&&(e-=u*Da),Ma(i-o)<Da&&(i-=o*Da),r=Ft(e,r,i,a),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(o,r),t=0),n.point(e=i,r=a),u=o},lineEnd:function(){n.lineEnd(),e=r=NaN},clean:function(){return 2-t}}}function Ft(n,t,e,r){var u,i,a=Math.sin(n-e);return Ma(a)>Da?Math.atan((Math.sin(t)*(i=Math.cos(r))*Math.sin(e)-Math.sin(r)*(u=Math.cos(t))*Math.sin(n))/(u*i*a)):(t+r)/2}function Ht(n,t,e,r){var u;if(null==n)u=e*Ha,r.point(-ja,u),r.point(0,u),r.point(ja,u),r.point(ja,0),r.point(ja,-u),r.point(0,-u),r.point(-ja,-u),r.point(-ja,0),r.point(-ja,u);else if(Ma(n[0]-t[0])>Da){var i=n[0]<t[0]?ja:-ja;u=e*i/2,r.point(-i,u),r.point(0,u),r.point(i,u)}else r.point(t[0],t[1])}function Ot(n,t){var e=n[0],r=n[1],u=[Math.sin(e),-Math.cos(e),0],i=0,a=0;So.reset();for(var o=0,l=t.length;l>o;++o){var c=t[o],s=c.length;if(s)for(var f=c[0],h=f[0],g=f[1]/2+ja/4,p=Math.sin(g),v=Math.cos(g),d=1;;){d===s&&(d=0),n=c[d];var m=n[0],y=n[1]/2+ja/4,M=Math.sin(y),x=Math.cos(y),b=m-h,_=b>=0?1:-1,w=_*b,S=w>ja,k=p*M;if(So.add(Math.atan2(k*_*Math.sin(w),v*x+k*Math.cos(w))),i+=S?b+_*Ua:b,S^h>=e^m>=e){var N=yt(dt(f),dt(n));bt(N);var E=yt(u,N);bt(E);var A=(S^b>=0?-1:1)*tn(E[2]);(r>A||r===A&&(N[0]||N[1]))&&(a+=S^b>=0?1:-1)}if(!d++)break;h=m,p=M,v=x,f=n}}return(-Da>i||Da>i&&0>So)^1&a}function It(n){function t(n,t){return Math.cos(n)*Math.cos(t)>i}function e(n){var e,i,l,c,s;return{lineStart:function(){c=l=!1,s=1},point:function(f,h){var g,p=[f,h],v=t(f,h),d=a?v?0:u(f,h):v?u(f+(0>f?ja:-ja),h):0;if(!e&&(c=l=v)&&n.lineStart(),v!==l&&(g=r(e,p),(wt(e,g)||wt(p,g))&&(p[0]+=Da,p[1]+=Da,v=t(p[0],p[1]))),v!==l)s=0,v?(n.lineStart(),g=r(p,e),n.point(g[0],g[1])):(g=r(e,p),n.point(g[0],g[1]),n.lineEnd()),e=g;else if(o&&e&&a^v){var m;d&i||!(m=r(p,e,!0))||(s=0,a?(n.lineStart(),n.point(m[0][0],m[0][1]),n.point(m[1][0],m[1][1]),n.lineEnd()):(n.point(m[1][0],m[1][1]),n.lineEnd(),n.lineStart(),n.point(m[0][0],m[0][1])))}!v||e&&wt(e,p)||n.point(p[0],p[1]),e=p,l=v,i=d},lineEnd:function(){l&&n.lineEnd(),e=null},clean:function(){return s|(c&&l)<<1}}}function r(n,t,e){var r=dt(n),u=dt(t),a=[1,0,0],o=yt(r,u),l=mt(o,o),c=o[0],s=l-c*c;if(!s)return!e&&n;var f=i*l/s,h=-i*c/s,g=yt(a,o),p=xt(a,f),v=xt(o,h);Mt(p,v);var d=g,m=mt(p,d),y=mt(d,d),M=m*m-y*(mt(p,p)-1);if(!(0>M)){var x=Math.sqrt(M),b=xt(d,(-m-x)/y);if(Mt(b,p),b=_t(b),!e)return b;var _,w=n[0],S=t[0],k=n[1],N=t[1];w>S&&(_=w,w=S,S=_);var E=S-w,A=Ma(E-ja)<Da,C=A||Da>E;if(!A&&k>N&&(_=k,k=N,N=_),C?A?k+N>0^b[1]<(Ma(b[0]-w)<Da?k:N):k<=b[1]&&b[1]<=N:E>ja^(w<=b[0]&&b[0]<=S)){var z=xt(d,(-m+x)/y);return Mt(z,p),[b,_t(z)]}}}function u(t,e){var r=a?n:ja-n,u=0;return-r>t?u|=1:t>r&&(u|=2),-r>e?u|=4:e>r&&(u|=8),u}var i=Math.cos(n),a=i>0,o=Ma(i)>Da,l=ve(n,6*Oa);return Rt(t,e,l,a?[0,-n]:[-ja,n-ja])}function Yt(n,t,e,r){return function(u){var i,a=u.a,o=u.b,l=a.x,c=a.y,s=o.x,f=o.y,h=0,g=1,p=s-l,v=f-c;if(i=n-l,p||!(i>0)){if(i/=p,0>p){if(h>i)return;g>i&&(g=i)}else if(p>0){if(i>g)return;i>h&&(h=i)}if(i=e-l,p||!(0>i)){if(i/=p,0>p){if(i>g)return;i>h&&(h=i)}else if(p>0){if(h>i)return;g>i&&(g=i)}if(i=t-c,v||!(i>0)){if(i/=v,0>v){if(h>i)return;g>i&&(g=i)}else if(v>0){if(i>g)return;i>h&&(h=i)}if(i=r-c,v||!(0>i)){if(i/=v,0>v){if(i>g)return;i>h&&(h=i)}else if(v>0){if(h>i)return;g>i&&(g=i)}return h>0&&(u.a={x:l+h*p,y:c+h*v}),1>g&&(u.b={x:l+g*p,y:c+g*v}),u}}}}}}function Zt(n,t,e,r){function u(r,u){return Ma(r[0]-n)<Da?u>0?0:3:Ma(r[0]-e)<Da?u>0?2:1:Ma(r[1]-t)<Da?u>0?1:0:u>0?3:2}function i(n,t){return a(n.x,t.x)}function a(n,t){var e=u(n,1),r=u(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}return function(o){function l(n){for(var t=0,e=d.length,r=n[1],u=0;e>u;++u)for(var i,a=1,o=d[u],l=o.length,c=o[0];l>a;++a)i=o[a],c[1]<=r?i[1]>r&&Q(c,i,n)>0&&++t:i[1]<=r&&Q(c,i,n)<0&&--t,c=i;return 0!==t}function c(i,o,l,c){var s=0,f=0;if(null==i||(s=u(i,l))!==(f=u(o,l))||a(i,o)<0^l>0){do c.point(0===s||3===s?n:e,s>1?r:t);while((s=(s+l+4)%4)!==f)}else c.point(o[0],o[1])}function s(u,i){return u>=n&&e>=u&&i>=t&&r>=i}function f(n,t){s(n,t)&&o.point(n,t)}function h(){C.point=p,d&&d.push(m=[]),S=!0,w=!1,b=_=NaN}function g(){v&&(p(y,M),x&&w&&E.rejoin(),v.push(E.buffer())),C.point=f,w&&o.lineEnd()}function p(n,t){n=Math.max(-Fo,Math.min(Fo,n)),t=Math.max(-Fo,Math.min(Fo,t));var e=s(n,t);if(d&&m.push([n,t]),S)y=n,M=t,x=e,S=!1,e&&(o.lineStart(),o.point(n,t));else if(e&&w)o.point(n,t);else{var r={a:{x:b,y:_},b:{x:n,y:t}};A(r)?(w||(o.lineStart(),o.point(r.a.x,r.a.y)),o.point(r.b.x,r.b.y),e||o.lineEnd(),k=!1):e&&(o.lineStart(),o.point(n,t),k=!1)}b=n,_=t,w=e}var v,d,m,y,M,x,b,_,w,S,k,N=o,E=Pt(),A=Yt(n,t,e,r),C={point:f,lineStart:h,lineEnd:g,polygonStart:function(){o=E,v=[],d=[],k=!0},polygonEnd:function(){o=N,v=oa.merge(v);var t=l([n,r]),e=k&&t,u=v.length;(e||u)&&(o.polygonStart(),e&&(o.lineStart(),c(null,null,1,o),o.lineEnd()),u&&Lt(v,i,t,c,o),o.polygonEnd()),v=d=m=null}};return C}}function Vt(n){var t=0,e=ja/3,r=oe(n),u=r(t,e);return u.parallels=function(n){return arguments.length?r(t=n[0]*ja/180,e=n[1]*ja/180):[t/ja*180,e/ja*180]},u}function Xt(n,t){function e(n,t){var e=Math.sqrt(i-2*u*Math.sin(t))/u;return[e*Math.sin(n*=u),a-e*Math.cos(n)]}var r=Math.sin(n),u=(r+Math.sin(t))/2,i=1+r*(2*u-r),a=Math.sqrt(i)/u;return e.invert=function(n,t){var e=a-t;return[Math.atan2(n,e)/u,tn((i-(n*n+e*e)*u*u)/(2*u))]},e}function $t(){function n(n,t){Oo+=u*n-r*t,r=n,u=t}var t,e,r,u;Xo.point=function(i,a){Xo.point=n,t=r=i,e=u=a},Xo.lineEnd=function(){n(t,e)}}function Bt(n,t){Io>n&&(Io=n),n>Zo&&(Zo=n),Yo>t&&(Yo=t),t>Vo&&(Vo=t)}function Wt(){function n(n,t){a.push("M",n,",",t,i)}function t(n,t){a.push("M",n,",",t),o.point=e}function e(n,t){a.push("L",n,",",t)}function r(){o.point=n}function u(){a.push("Z")}var i=Jt(4.5),a=[],o={point:n,lineStart:function(){o.point=t},lineEnd:r,polygonStart:function(){o.lineEnd=u},polygonEnd:function(){o.lineEnd=r,o.point=n},pointRadius:function(n){return i=Jt(n),o},result:function(){if(a.length){var n=a.join("");return a=[],n}}};return o}function Jt(n){return"m0,"+n+"a"+n+","+n+" 0 1,1 0,"+-2*n+"a"+n+","+n+" 0 1,1 0,"+2*n+"z"}function Gt(n,t){Ao+=n,Co+=t,++zo}function Kt(){function n(n,r){var u=n-t,i=r-e,a=Math.sqrt(u*u+i*i);Lo+=a*(t+n)/2,qo+=a*(e+r)/2,To+=a,Gt(t=n,e=r)}var t,e;Bo.point=function(r,u){Bo.point=n,Gt(t=r,e=u)}}function Qt(){Bo.point=Gt}function ne(){function n(n,t){var e=n-r,i=t-u,a=Math.sqrt(e*e+i*i);Lo+=a*(r+n)/2,qo+=a*(u+t)/2,To+=a,a=u*n-r*t,Ro+=a*(r+n),Do+=a*(u+t),Po+=3*a,Gt(r=n,u=t)}var t,e,r,u;Bo.point=function(i,a){Bo.point=n,Gt(t=r=i,e=u=a)},Bo.lineEnd=function(){n(t,e)}}function te(n){function t(t,e){n.moveTo(t+a,e),n.arc(t,e,a,0,Ua)}function e(t,e){n.moveTo(t,e),o.point=r}function r(t,e){n.lineTo(t,e)}function u(){o.point=t}function i(){n.closePath()}var a=4.5,o={point:t,lineStart:function(){o.point=e},lineEnd:u,polygonStart:function(){o.lineEnd=i},polygonEnd:function(){o.lineEnd=u,o.point=t},pointRadius:function(n){return a=n,o},result:b};return o}function ee(n){function t(n){return(o?r:e)(n)}function e(t){return ie(t,function(e,r){e=n(e,r),t.point(e[0],e[1])})}function r(t){function e(e,r){e=n(e,r),t.point(e[0],e[1])}function r(){M=NaN,S.point=i,t.lineStart()}function i(e,r){var i=dt([e,r]),a=n(e,r);u(M,x,y,b,_,w,M=a[0],x=a[1],y=e,b=i[0],_=i[1],w=i[2],o,t),t.point(M,x)}function a(){S.point=e,t.lineEnd()}function l(){r(),S.point=c,S.lineEnd=s}function c(n,t){
-i(f=n,h=t),g=M,p=x,v=b,d=_,m=w,S.point=i}function s(){u(M,x,y,b,_,w,g,p,f,v,d,m,o,t),S.lineEnd=a,a()}var f,h,g,p,v,d,m,y,M,x,b,_,w,S={point:e,lineStart:r,lineEnd:a,polygonStart:function(){t.polygonStart(),S.lineStart=l},polygonEnd:function(){t.polygonEnd(),S.lineStart=r}};return S}function u(t,e,r,o,l,c,s,f,h,g,p,v,d,m){var y=s-t,M=f-e,x=y*y+M*M;if(x>4*i&&d--){var b=o+g,_=l+p,w=c+v,S=Math.sqrt(b*b+_*_+w*w),k=Math.asin(w/=S),N=Ma(Ma(w)-1)<Da||Ma(r-h)<Da?(r+h)/2:Math.atan2(_,b),E=n(N,k),A=E[0],C=E[1],z=A-t,L=C-e,q=M*z-y*L;(q*q/x>i||Ma((y*z+M*L)/x-.5)>.3||a>o*g+l*p+c*v)&&(u(t,e,r,o,l,c,A,C,N,b/=S,_/=S,w,d,m),m.point(A,C),u(A,C,N,b,_,w,s,f,h,g,p,v,d,m))}}var i=.5,a=Math.cos(30*Oa),o=16;return t.precision=function(n){return arguments.length?(o=(i=n*n)>0&&16,t):Math.sqrt(i)},t}function re(n){var t=ee(function(t,e){return n([t*Ia,e*Ia])});return function(n){return le(t(n))}}function ue(n){this.stream=n}function ie(n,t){return{point:t,sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function ae(n){return oe(function(){return n})()}function oe(n){function t(n){return n=o(n[0]*Oa,n[1]*Oa),[n[0]*h+l,c-n[1]*h]}function e(n){return n=o.invert((n[0]-l)/h,(c-n[1])/h),n&&[n[0]*Ia,n[1]*Ia]}function r(){o=Ct(a=fe(m,M,x),i);var n=i(v,d);return l=g-n[0]*h,c=p+n[1]*h,u()}function u(){return s&&(s.valid=!1,s=null),t}var i,a,o,l,c,s,f=ee(function(n,t){return n=i(n,t),[n[0]*h+l,c-n[1]*h]}),h=150,g=480,p=250,v=0,d=0,m=0,M=0,x=0,b=Uo,_=y,w=null,S=null;return t.stream=function(n){return s&&(s.valid=!1),s=le(b(a,f(_(n)))),s.valid=!0,s},t.clipAngle=function(n){return arguments.length?(b=null==n?(w=n,Uo):It((w=+n)*Oa),u()):w},t.clipExtent=function(n){return arguments.length?(S=n,_=n?Zt(n[0][0],n[0][1],n[1][0],n[1][1]):y,u()):S},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(g=+n[0],p=+n[1],r()):[g,p]},t.center=function(n){return arguments.length?(v=n[0]%360*Oa,d=n[1]%360*Oa,r()):[v*Ia,d*Ia]},t.rotate=function(n){return arguments.length?(m=n[0]%360*Oa,M=n[1]%360*Oa,x=n.length>2?n[2]%360*Oa:0,r()):[m*Ia,M*Ia,x*Ia]},oa.rebind(t,f,"precision"),function(){return i=n.apply(this,arguments),t.invert=i.invert&&e,r()}}function le(n){return ie(n,function(t,e){n.point(t*Oa,e*Oa)})}function ce(n,t){return[n,t]}function se(n,t){return[n>ja?n-Ua:-ja>n?n+Ua:n,t]}function fe(n,t,e){return n?t||e?Ct(ge(n),pe(t,e)):ge(n):t||e?pe(t,e):se}function he(n){return function(t,e){return t+=n,[t>ja?t-Ua:-ja>t?t+Ua:t,e]}}function ge(n){var t=he(n);return t.invert=he(-n),t}function pe(n,t){function e(n,t){var e=Math.cos(t),o=Math.cos(n)*e,l=Math.sin(n)*e,c=Math.sin(t),s=c*r+o*u;return[Math.atan2(l*i-s*a,o*r-c*u),tn(s*i+l*a)]}var r=Math.cos(n),u=Math.sin(n),i=Math.cos(t),a=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),o=Math.cos(n)*e,l=Math.sin(n)*e,c=Math.sin(t),s=c*i-l*a;return[Math.atan2(l*i+c*a,o*r+s*u),tn(s*r-o*u)]},e}function ve(n,t){var e=Math.cos(n),r=Math.sin(n);return function(u,i,a,o){var l=a*t;null!=u?(u=de(e,u),i=de(e,i),(a>0?i>u:u>i)&&(u+=a*Ua)):(u=n+a*Ua,i=n-.5*l);for(var c,s=u;a>0?s>i:i>s;s-=l)o.point((c=_t([e,-r*Math.cos(s),-r*Math.sin(s)]))[0],c[1])}}function de(n,t){var e=dt(t);e[0]-=n,bt(e);var r=nn(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Da)%(2*Math.PI)}function me(n,t,e){var r=oa.range(n,t-Da,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function ye(n,t,e){var r=oa.range(n,t-Da,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function Me(n){return n.source}function xe(n){return n.target}function be(n,t,e,r){var u=Math.cos(t),i=Math.sin(t),a=Math.cos(r),o=Math.sin(r),l=u*Math.cos(n),c=u*Math.sin(n),s=a*Math.cos(e),f=a*Math.sin(e),h=2*Math.asin(Math.sqrt(an(r-t)+u*a*an(e-n))),g=1/Math.sin(h),p=h?function(n){var t=Math.sin(n*=h)*g,e=Math.sin(h-n)*g,r=e*l+t*s,u=e*c+t*f,a=e*i+t*o;return[Math.atan2(u,r)*Ia,Math.atan2(a,Math.sqrt(r*r+u*u))*Ia]}:function(){return[n*Ia,t*Ia]};return p.distance=h,p}function _e(){function n(n,u){var i=Math.sin(u*=Oa),a=Math.cos(u),o=Ma((n*=Oa)-t),l=Math.cos(o);Wo+=Math.atan2(Math.sqrt((o=a*Math.sin(o))*o+(o=r*i-e*a*l)*o),e*i+r*a*l),t=n,e=i,r=a}var t,e,r;Jo.point=function(u,i){t=u*Oa,e=Math.sin(i*=Oa),r=Math.cos(i),Jo.point=n},Jo.lineEnd=function(){Jo.point=Jo.lineEnd=b}}function we(n,t){function e(t,e){var r=Math.cos(t),u=Math.cos(e),i=n(r*u);return[i*u*Math.sin(t),i*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),u=t(r),i=Math.sin(u),a=Math.cos(u);return[Math.atan2(n*i,r*a),Math.asin(r&&e*i/r)]},e}function Se(n,t){function e(n,t){a>0?-Ha+Da>t&&(t=-Ha+Da):t>Ha-Da&&(t=Ha-Da);var e=a/Math.pow(u(t),i);return[e*Math.sin(i*n),a-e*Math.cos(i*n)]}var r=Math.cos(n),u=function(n){return Math.tan(ja/4+n/2)},i=n===t?Math.sin(n):Math.log(r/Math.cos(t))/Math.log(u(t)/u(n)),a=r*Math.pow(u(n),i)/i;return i?(e.invert=function(n,t){var e=a-t,r=K(i)*Math.sqrt(n*n+e*e);return[Math.atan2(n,e)/i,2*Math.atan(Math.pow(a/r,1/i))-Ha]},e):Ne}function ke(n,t){function e(n,t){var e=i-t;return[e*Math.sin(u*n),i-e*Math.cos(u*n)]}var r=Math.cos(n),u=n===t?Math.sin(n):(r-Math.cos(t))/(t-n),i=r/u+n;return Ma(u)<Da?ce:(e.invert=function(n,t){var e=i-t;return[Math.atan2(n,e)/u,i-K(u)*Math.sqrt(n*n+e*e)]},e)}function Ne(n,t){return[n,Math.log(Math.tan(ja/4+t/2))]}function Ee(n){var t,e=ae(n),r=e.scale,u=e.translate,i=e.clipExtent;return e.scale=function(){var n=r.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.translate=function(){var n=u.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.clipExtent=function(n){var a=i.apply(e,arguments);if(a===e){if(t=null==n){var o=ja*r(),l=u();i([[l[0]-o,l[1]-o],[l[0]+o,l[1]+o]])}}else t&&(a=null);return a},e.clipExtent(null)}function Ae(n,t){return[Math.log(Math.tan(ja/4+t/2)),-n]}function Ce(n){return n[0]}function ze(n){return n[1]}function Le(n){for(var t=n.length,e=[0,1],r=2,u=2;t>u;u++){for(;r>1&&Q(n[e[r-2]],n[e[r-1]],n[u])<=0;)--r;e[r++]=u}return e.slice(0,r)}function qe(n,t){return n[0]-t[0]||n[1]-t[1]}function Te(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function Re(n,t,e,r){var u=n[0],i=e[0],a=t[0]-u,o=r[0]-i,l=n[1],c=e[1],s=t[1]-l,f=r[1]-c,h=(o*(l-c)-f*(u-i))/(f*a-o*s);return[u+h*a,l+h*s]}function De(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function Pe(){rr(this),this.edge=this.site=this.circle=null}function je(n){var t=ll.pop()||new Pe;return t.site=n,t}function Ue(n){Be(n),il.remove(n),ll.push(n),rr(n)}function Fe(n){var t=n.circle,e=t.x,r=t.cy,u={x:e,y:r},i=n.P,a=n.N,o=[n];Ue(n);for(var l=i;l.circle&&Ma(e-l.circle.x)<Da&&Ma(r-l.circle.cy)<Da;)i=l.P,o.unshift(l),Ue(l),l=i;o.unshift(l),Be(l);for(var c=a;c.circle&&Ma(e-c.circle.x)<Da&&Ma(r-c.circle.cy)<Da;)a=c.N,o.push(c),Ue(c),c=a;o.push(c),Be(c);var s,f=o.length;for(s=1;f>s;++s)c=o[s],l=o[s-1],nr(c.edge,l.site,c.site,u);l=o[0],c=o[f-1],c.edge=Ke(l.site,c.site,null,u),$e(l),$e(c)}function He(n){for(var t,e,r,u,i=n.x,a=n.y,o=il._;o;)if(r=Oe(o,a)-i,r>Da)o=o.L;else{if(u=i-Ie(o,a),!(u>Da)){r>-Da?(t=o.P,e=o):u>-Da?(t=o,e=o.N):t=e=o;break}if(!o.R){t=o;break}o=o.R}var l=je(n);if(il.insert(t,l),t||e){if(t===e)return Be(t),e=je(t.site),il.insert(l,e),l.edge=e.edge=Ke(t.site,l.site),$e(t),void $e(e);if(!e)return void(l.edge=Ke(t.site,l.site));Be(t),Be(e);var c=t.site,s=c.x,f=c.y,h=n.x-s,g=n.y-f,p=e.site,v=p.x-s,d=p.y-f,m=2*(h*d-g*v),y=h*h+g*g,M=v*v+d*d,x={x:(d*y-g*M)/m+s,y:(h*M-v*y)/m+f};nr(e.edge,c,p,x),l.edge=Ke(c,n,null,x),e.edge=Ke(n,p,null,x),$e(t),$e(e)}}function Oe(n,t){var e=n.site,r=e.x,u=e.y,i=u-t;if(!i)return r;var a=n.P;if(!a)return-(1/0);e=a.site;var o=e.x,l=e.y,c=l-t;if(!c)return o;var s=o-r,f=1/i-1/c,h=s/c;return f?(-h+Math.sqrt(h*h-2*f*(s*s/(-2*c)-l+c/2+u-i/2)))/f+r:(r+o)/2}function Ie(n,t){var e=n.N;if(e)return Oe(e,t);var r=n.site;return r.y===t?r.x:1/0}function Ye(n){this.site=n,this.edges=[]}function Ze(n){for(var t,e,r,u,i,a,o,l,c,s,f=n[0][0],h=n[1][0],g=n[0][1],p=n[1][1],v=ul,d=v.length;d--;)if(i=v[d],i&&i.prepare())for(o=i.edges,l=o.length,a=0;l>a;)s=o[a].end(),r=s.x,u=s.y,c=o[++a%l].start(),t=c.x,e=c.y,(Ma(r-t)>Da||Ma(u-e)>Da)&&(o.splice(a,0,new tr(Qe(i.site,s,Ma(r-f)<Da&&p-u>Da?{x:f,y:Ma(t-f)<Da?e:p}:Ma(u-p)<Da&&h-r>Da?{x:Ma(e-p)<Da?t:h,y:p}:Ma(r-h)<Da&&u-g>Da?{x:h,y:Ma(t-h)<Da?e:g}:Ma(u-g)<Da&&r-f>Da?{x:Ma(e-g)<Da?t:f,y:g}:null),i.site,null)),++l)}function Ve(n,t){return t.angle-n.angle}function Xe(){rr(this),this.x=this.y=this.arc=this.site=this.cy=null}function $e(n){var t=n.P,e=n.N;if(t&&e){var r=t.site,u=n.site,i=e.site;if(r!==i){var a=u.x,o=u.y,l=r.x-a,c=r.y-o,s=i.x-a,f=i.y-o,h=2*(l*f-c*s);if(!(h>=-Pa)){var g=l*l+c*c,p=s*s+f*f,v=(f*g-c*p)/h,d=(l*p-s*g)/h,f=d+o,m=cl.pop()||new Xe;m.arc=n,m.site=u,m.x=v+a,m.y=f+Math.sqrt(v*v+d*d),m.cy=f,n.circle=m;for(var y=null,M=ol._;M;)if(m.y<M.y||m.y===M.y&&m.x<=M.x){if(!M.L){y=M.P;break}M=M.L}else{if(!M.R){y=M;break}M=M.R}ol.insert(y,m),y||(al=m)}}}}function Be(n){var t=n.circle;t&&(t.P||(al=t.N),ol.remove(t),cl.push(t),rr(t),n.circle=null)}function We(n){for(var t,e=rl,r=Yt(n[0][0],n[0][1],n[1][0],n[1][1]),u=e.length;u--;)t=e[u],(!Je(t,n)||!r(t)||Ma(t.a.x-t.b.x)<Da&&Ma(t.a.y-t.b.y)<Da)&&(t.a=t.b=null,e.splice(u,1))}function Je(n,t){var e=n.b;if(e)return!0;var r,u,i=n.a,a=t[0][0],o=t[1][0],l=t[0][1],c=t[1][1],s=n.l,f=n.r,h=s.x,g=s.y,p=f.x,v=f.y,d=(h+p)/2,m=(g+v)/2;if(v===g){if(a>d||d>=o)return;if(h>p){if(i){if(i.y>=c)return}else i={x:d,y:l};e={x:d,y:c}}else{if(i){if(i.y<l)return}else i={x:d,y:c};e={x:d,y:l}}}else if(r=(h-p)/(v-g),u=m-r*d,-1>r||r>1)if(h>p){if(i){if(i.y>=c)return}else i={x:(l-u)/r,y:l};e={x:(c-u)/r,y:c}}else{if(i){if(i.y<l)return}else i={x:(c-u)/r,y:c};e={x:(l-u)/r,y:l}}else if(v>g){if(i){if(i.x>=o)return}else i={x:a,y:r*a+u};e={x:o,y:r*o+u}}else{if(i){if(i.x<a)return}else i={x:o,y:r*o+u};e={x:a,y:r*a+u}}return n.a=i,n.b=e,!0}function Ge(n,t){this.l=n,this.r=t,this.a=this.b=null}function Ke(n,t,e,r){var u=new Ge(n,t);return rl.push(u),e&&nr(u,n,t,e),r&&nr(u,t,n,r),ul[n.i].edges.push(new tr(u,n,t)),ul[t.i].edges.push(new tr(u,t,n)),u}function Qe(n,t,e){var r=new Ge(n,null);return r.a=t,r.b=e,rl.push(r),r}function nr(n,t,e,r){n.a||n.b?n.l===e?n.b=r:n.a=r:(n.a=r,n.l=t,n.r=e)}function tr(n,t,e){var r=n.a,u=n.b;this.edge=n,this.site=t,this.angle=e?Math.atan2(e.y-t.y,e.x-t.x):n.l===t?Math.atan2(u.x-r.x,r.y-u.y):Math.atan2(r.x-u.x,u.y-r.y)}function er(){this._=null}function rr(n){n.U=n.C=n.L=n.R=n.P=n.N=null}function ur(n,t){var e=t,r=t.R,u=e.U;u?u.L===e?u.L=r:u.R=r:n._=r,r.U=u,e.U=r,e.R=r.L,e.R&&(e.R.U=e),r.L=e}function ir(n,t){var e=t,r=t.L,u=e.U;u?u.L===e?u.L=r:u.R=r:n._=r,r.U=u,e.U=r,e.L=r.R,e.L&&(e.L.U=e),r.R=e}function ar(n){for(;n.L;)n=n.L;return n}function or(n,t){var e,r,u,i=n.sort(lr).pop();for(rl=[],ul=new Array(n.length),il=new er,ol=new er;;)if(u=al,i&&(!u||i.y<u.y||i.y===u.y&&i.x<u.x))(i.x!==e||i.y!==r)&&(ul[i.i]=new Ye(i),He(i),e=i.x,r=i.y),i=n.pop();else{if(!u)break;Fe(u.arc)}t&&(We(t),Ze(t));var a={cells:ul,edges:rl};return il=ol=rl=ul=null,a}function lr(n,t){return t.y-n.y||t.x-n.x}function cr(n,t,e){return(n.x-e.x)*(t.y-n.y)-(n.x-t.x)*(e.y-n.y)}function sr(n){return n.x}function fr(n){return n.y}function hr(){return{leaf:!0,nodes:[],point:null,x:null,y:null}}function gr(n,t,e,r,u,i){if(!n(t,e,r,u,i)){var a=.5*(e+u),o=.5*(r+i),l=t.nodes;l[0]&&gr(n,l[0],e,r,a,o),l[1]&&gr(n,l[1],a,r,u,o),l[2]&&gr(n,l[2],e,o,a,i),l[3]&&gr(n,l[3],a,o,u,i)}}function pr(n,t,e,r,u,i,a){var o,l=1/0;return function c(n,s,f,h,g){if(!(s>i||f>a||r>h||u>g)){if(p=n.point){var p,v=t-n.x,d=e-n.y,m=v*v+d*d;if(l>m){var y=Math.sqrt(l=m);r=t-y,u=e-y,i=t+y,a=e+y,o=p}}for(var M=n.nodes,x=.5*(s+h),b=.5*(f+g),_=t>=x,w=e>=b,S=w<<1|_,k=S+4;k>S;++S)if(n=M[3&S])switch(3&S){case 0:c(n,s,f,x,b);break;case 1:c(n,x,f,h,b);break;case 2:c(n,s,b,x,g);break;case 3:c(n,x,b,h,g)}}}(n,r,u,i,a),o}function vr(n,t){n=oa.rgb(n),t=oa.rgb(t);var e=n.r,r=n.g,u=n.b,i=t.r-e,a=t.g-r,o=t.b-u;return function(n){return"#"+bn(Math.round(e+i*n))+bn(Math.round(r+a*n))+bn(Math.round(u+o*n))}}function dr(n,t){var e,r={},u={};for(e in n)e in t?r[e]=Mr(n[e],t[e]):u[e]=n[e];for(e in t)e in n||(u[e]=t[e]);return function(n){for(e in r)u[e]=r[e](n);return u}}function mr(n,t){return n=+n,t=+t,function(e){return n*(1-e)+t*e}}function yr(n,t){var e,r,u,i=fl.lastIndex=hl.lastIndex=0,a=-1,o=[],l=[];for(n+="",t+="";(e=fl.exec(n))&&(r=hl.exec(t));)(u=r.index)>i&&(u=t.slice(i,u),o[a]?o[a]+=u:o[++a]=u),(e=e[0])===(r=r[0])?o[a]?o[a]+=r:o[++a]=r:(o[++a]=null,l.push({i:a,x:mr(e,r)})),i=hl.lastIndex;return i<t.length&&(u=t.slice(i),o[a]?o[a]+=u:o[++a]=u),o.length<2?l[0]?(t=l[0].x,function(n){return t(n)+""}):function(){return t}:(t=l.length,function(n){for(var e,r=0;t>r;++r)o[(e=l[r]).i]=e.x(n);return o.join("")})}function Mr(n,t){for(var e,r=oa.interpolators.length;--r>=0&&!(e=oa.interpolators[r](n,t)););return e}function xr(n,t){var e,r=[],u=[],i=n.length,a=t.length,o=Math.min(n.length,t.length);for(e=0;o>e;++e)r.push(Mr(n[e],t[e]));for(;i>e;++e)u[e]=n[e];for(;a>e;++e)u[e]=t[e];return function(n){for(e=0;o>e;++e)u[e]=r[e](n);return u}}function br(n){return function(t){return 0>=t?0:t>=1?1:n(t)}}function _r(n){return function(t){return 1-n(1-t)}}function wr(n){return function(t){return.5*(.5>t?n(2*t):2-n(2-2*t))}}function Sr(n){return n*n}function kr(n){return n*n*n}function Nr(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(.5>n?e:3*(n-t)+e-.75)}function Er(n){return function(t){return Math.pow(t,n)}}function Ar(n){return 1-Math.cos(n*Ha)}function Cr(n){return Math.pow(2,10*(n-1))}function zr(n){return 1-Math.sqrt(1-n*n)}function Lr(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/Ua*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*Ua/t)}}function qr(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function Tr(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function Rr(n,t){n=oa.hcl(n),t=oa.hcl(t);var e=n.h,r=n.c,u=n.l,i=t.h-e,a=t.c-r,o=t.l-u;return isNaN(a)&&(a=0,r=isNaN(r)?t.c:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return fn(e+i*n,r+a*n,u+o*n)+""}}function Dr(n,t){n=oa.hsl(n),t=oa.hsl(t);var e=n.h,r=n.s,u=n.l,i=t.h-e,a=t.s-r,o=t.l-u;return isNaN(a)&&(a=0,r=isNaN(r)?t.s:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return cn(e+i*n,r+a*n,u+o*n)+""}}function Pr(n,t){n=oa.lab(n),t=oa.lab(t);var e=n.l,r=n.a,u=n.b,i=t.l-e,a=t.a-r,o=t.b-u;return function(n){return gn(e+i*n,r+a*n,u+o*n)+""}}function jr(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function Ur(n){var t=[n.a,n.b],e=[n.c,n.d],r=Hr(t),u=Fr(t,e),i=Hr(Or(e,t,-u))||0;t[0]*e[1]<e[0]*t[1]&&(t[0]*=-1,t[1]*=-1,r*=-1,u*=-1),this.rotate=(r?Math.atan2(t[1],t[0]):Math.atan2(-e[0],e[1]))*Ia,this.translate=[n.e,n.f],this.scale=[r,i],this.skew=i?Math.atan2(u,i)*Ia:0}function Fr(n,t){return n[0]*t[0]+n[1]*t[1]}function Hr(n){var t=Math.sqrt(Fr(n,n));return t&&(n[0]/=t,n[1]/=t),t}function Or(n,t,e){return n[0]+=e*t[0],n[1]+=e*t[1],n}function Ir(n){return n.length?n.pop()+",":""}function Yr(n,t,e,r){if(n[0]!==t[0]||n[1]!==t[1]){var u=e.push("translate(",null,",",null,")");r.push({i:u-4,x:mr(n[0],t[0])},{i:u-2,x:mr(n[1],t[1])})}else(t[0]||t[1])&&e.push("translate("+t+")")}function Zr(n,t,e,r){n!==t?(n-t>180?t+=360:t-n>180&&(n+=360),r.push({i:e.push(Ir(e)+"rotate(",null,")")-2,x:mr(n,t)})):t&&e.push(Ir(e)+"rotate("+t+")")}function Vr(n,t,e,r){n!==t?r.push({i:e.push(Ir(e)+"skewX(",null,")")-2,x:mr(n,t)}):t&&e.push(Ir(e)+"skewX("+t+")")}function Xr(n,t,e,r){if(n[0]!==t[0]||n[1]!==t[1]){var u=e.push(Ir(e)+"scale(",null,",",null,")");r.push({i:u-4,x:mr(n[0],t[0])},{i:u-2,x:mr(n[1],t[1])})}else(1!==t[0]||1!==t[1])&&e.push(Ir(e)+"scale("+t+")")}function $r(n,t){var e=[],r=[];return n=oa.transform(n),t=oa.transform(t),Yr(n.translate,t.translate,e,r),Zr(n.rotate,t.rotate,e,r),Vr(n.skew,t.skew,e,r),Xr(n.scale,t.scale,e,r),n=t=null,function(n){for(var t,u=-1,i=r.length;++u<i;)e[(t=r[u]).i]=t.x(n);return e.join("")}}function Br(n,t){return t=(t-=n=+n)||1/t,function(e){return(e-n)/t}}function Wr(n,t){return t=(t-=n=+n)||1/t,function(e){return Math.max(0,Math.min(1,(e-n)/t))}}function Jr(n){for(var t=n.source,e=n.target,r=Kr(t,e),u=[t];t!==r;)t=t.parent,u.push(t);for(var i=u.length;e!==r;)u.splice(i,0,e),e=e.parent;return u}function Gr(n){for(var t=[],e=n.parent;null!=e;)t.push(n),n=e,e=e.parent;return t.push(n),t}function Kr(n,t){if(n===t)return n;for(var e=Gr(n),r=Gr(t),u=e.pop(),i=r.pop(),a=null;u===i;)a=u,u=e.pop(),i=r.pop();return a}function Qr(n){n.fixed|=2}function nu(n){n.fixed&=-7}function tu(n){n.fixed|=4,n.px=n.x,n.py=n.y}function eu(n){n.fixed&=-5}function ru(n,t,e){var r=0,u=0;if(n.charge=0,!n.leaf)for(var i,a=n.nodes,o=a.length,l=-1;++l<o;)i=a[l],null!=i&&(ru(i,t,e),n.charge+=i.charge,r+=i.charge*i.cx,u+=i.charge*i.cy);if(n.point){n.leaf||(n.point.x+=Math.random()-.5,n.point.y+=Math.random()-.5);var c=t*e[n.point.index];n.charge+=n.pointCharge=c,r+=c*n.point.x,u+=c*n.point.y}n.cx=r/n.charge,n.cy=u/n.charge}function uu(n,t){return oa.rebind(n,t,"sort","children","value"),n.nodes=n,n.links=su,n}function iu(n,t){for(var e=[n];null!=(n=e.pop());)if(t(n),(u=n.children)&&(r=u.length))for(var r,u;--r>=0;)e.push(u[r])}function au(n,t){for(var e=[n],r=[];null!=(n=e.pop());)if(r.push(n),(i=n.children)&&(u=i.length))for(var u,i,a=-1;++a<u;)e.push(i[a]);for(;null!=(n=r.pop());)t(n)}function ou(n){return n.children}function lu(n){return n.value}function cu(n,t){return t.value-n.value}function su(n){return oa.merge(n.map(function(n){return(n.children||[]).map(function(t){return{source:n,target:t}})}))}function fu(n){return n.x}function hu(n){return n.y}function gu(n,t,e){n.y0=t,n.y=e}function pu(n){return oa.range(n.length)}function vu(n){for(var t=-1,e=n[0].length,r=[];++t<e;)r[t]=0;return r}function du(n){for(var t,e=1,r=0,u=n[0][1],i=n.length;i>e;++e)(t=n[e][1])>u&&(r=e,u=t);return r}function mu(n){return n.reduce(yu,0)}function yu(n,t){return n+t[1]}function Mu(n,t){return xu(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function xu(n,t){for(var e=-1,r=+n[0],u=(n[1]-r)/t,i=[];++e<=t;)i[e]=u*e+r;return i}function bu(n){return[oa.min(n),oa.max(n)]}function _u(n,t){return n.value-t.value}function wu(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function Su(n,t){n._pack_next=t,t._pack_prev=n}function ku(n,t){var e=t.x-n.x,r=t.y-n.y,u=n.r+t.r;return.999*u*u>e*e+r*r}function Nu(n){function t(n){s=Math.min(n.x-n.r,s),f=Math.max(n.x+n.r,f),h=Math.min(n.y-n.r,h),g=Math.max(n.y+n.r,g)}if((e=n.children)&&(c=e.length)){var e,r,u,i,a,o,l,c,s=1/0,f=-(1/0),h=1/0,g=-(1/0);if(e.forEach(Eu),r=e[0],r.x=-r.r,r.y=0,t(r),c>1&&(u=e[1],u.x=u.r,u.y=0,t(u),c>2))for(i=e[2],zu(r,u,i),t(i),wu(r,i),r._pack_prev=i,wu(i,u),u=r._pack_next,a=3;c>a;a++){zu(r,u,i=e[a]);var p=0,v=1,d=1;for(o=u._pack_next;o!==u;o=o._pack_next,v++)if(ku(o,i)){p=1;break}if(1==p)for(l=r._pack_prev;l!==o._pack_prev&&!ku(l,i);l=l._pack_prev,d++);p?(d>v||v==d&&u.r<r.r?Su(r,u=o):Su(r=l,u),a--):(wu(r,i),u=i,t(i))}var m=(s+f)/2,y=(h+g)/2,M=0;for(a=0;c>a;a++)i=e[a],i.x-=m,i.y-=y,M=Math.max(M,i.r+Math.sqrt(i.x*i.x+i.y*i.y));n.r=M,e.forEach(Au)}}function Eu(n){n._pack_next=n._pack_prev=n}function Au(n){delete n._pack_next,delete n._pack_prev}function Cu(n,t,e,r){var u=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,u)for(var i=-1,a=u.length;++i<a;)Cu(u[i],t,e,r)}function zu(n,t,e){var r=n.r+e.r,u=t.x-n.x,i=t.y-n.y;if(r&&(u||i)){var a=t.r+e.r,o=u*u+i*i;a*=a,r*=r;var l=.5+(r-a)/(2*o),c=Math.sqrt(Math.max(0,2*a*(r+o)-(r-=o)*r-a*a))/(2*o);e.x=n.x+l*u+c*i,e.y=n.y+l*i-c*u}else e.x=n.x+r,e.y=n.y}function Lu(n,t){return n.parent==t.parent?1:2}function qu(n){var t=n.children;return t.length?t[0]:n.t}function Tu(n){var t,e=n.children;return(t=e.length)?e[t-1]:n.t}function Ru(n,t,e){var r=e/(t.i-n.i);t.c-=r,t.s+=e,n.c+=r,t.z+=e,t.m+=e}function Du(n){for(var t,e=0,r=0,u=n.children,i=u.length;--i>=0;)t=u[i],t.z+=e,t.m+=e,e+=t.s+(r+=t.c)}function Pu(n,t,e){return n.a.parent===t.parent?n.a:e}function ju(n){return 1+oa.max(n,function(n){return n.y})}function Uu(n){return n.reduce(function(n,t){return n+t.x},0)/n.length}function Fu(n){var t=n.children;return t&&t.length?Fu(t[0]):n}function Hu(n){var t,e=n.children;return e&&(t=e.length)?Hu(e[t-1]):n}function Ou(n){return{x:n.x,y:n.y,dx:n.dx,dy:n.dy}}function Iu(n,t){var e=n.x+t[3],r=n.y+t[0],u=n.dx-t[1]-t[3],i=n.dy-t[0]-t[2];return 0>u&&(e+=u/2,u=0),0>i&&(r+=i/2,i=0),{x:e,y:r,dx:u,dy:i}}function Yu(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function Zu(n){return n.rangeExtent?n.rangeExtent():Yu(n.range())}function Vu(n,t,e,r){var u=e(n[0],n[1]),i=r(t[0],t[1]);return function(n){return i(u(n))}}function Xu(n,t){var e,r=0,u=n.length-1,i=n[r],a=n[u];return i>a&&(e=r,r=u,u=e,e=i,i=a,a=e),n[r]=t.floor(i),n[u]=t.ceil(a),n}function $u(n){return n?{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:wl}function Bu(n,t,e,r){var u=[],i=[],a=0,o=Math.min(n.length,t.length)-1;for(n[o]<n[0]&&(n=n.slice().reverse(),t=t.slice().reverse());++a<=o;)u.push(e(n[a-1],n[a])),i.push(r(t[a-1],t[a]));return function(t){var e=oa.bisect(n,t,1,o)-1;return i[e](u[e](t))}}function Wu(n,t,e,r){function u(){var u=Math.min(n.length,t.length)>2?Bu:Vu,l=r?Wr:Br;return a=u(n,t,l,e),o=u(t,n,l,Mr),i}function i(n){return a(n)}var a,o;return i.invert=function(n){return o(n)},i.domain=function(t){return arguments.length?(n=t.map(Number),u()):n},i.range=function(n){return arguments.length?(t=n,u()):t},i.rangeRound=function(n){return i.range(n).interpolate(jr)},i.clamp=function(n){return arguments.length?(r=n,u()):r},i.interpolate=function(n){return arguments.length?(e=n,u()):e},i.ticks=function(t){return Qu(n,t)},i.tickFormat=function(t,e){return ni(n,t,e)},i.nice=function(t){return Gu(n,t),u()},i.copy=function(){return Wu(n,t,e,r)},u()}function Ju(n,t){return oa.rebind(n,t,"range","rangeRound","interpolate","clamp")}function Gu(n,t){return Xu(n,$u(Ku(n,t)[2]))}function Ku(n,t){null==t&&(t=10);var e=Yu(n),r=e[1]-e[0],u=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),i=t/r*u;return.15>=i?u*=10:.35>=i?u*=5:.75>=i&&(u*=2),e[0]=Math.ceil(e[0]/u)*u,e[1]=Math.floor(e[1]/u)*u+.5*u,e[2]=u,e}function Qu(n,t){return oa.range.apply(oa,Ku(n,t))}function ni(n,t,e){var r=Ku(n,t);if(e){var u=so.exec(e);if(u.shift(),"s"===u[8]){var i=oa.formatPrefix(Math.max(Ma(r[0]),Ma(r[1])));return u[7]||(u[7]="."+ti(i.scale(r[2]))),u[8]="f",e=oa.format(u.join("")),function(n){return e(i.scale(n))+i.symbol}}u[7]||(u[7]="."+ei(u[8],r)),e=u.join("")}else e=",."+ti(r[2])+"f";return oa.format(e)}function ti(n){return-Math.floor(Math.log(n)/Math.LN10+.01)}function ei(n,t){var e=ti(t[2]);return n in Sl?Math.abs(e-ti(Math.max(Ma(t[0]),Ma(t[1]))))+ +("e"!==n):e-2*("%"===n)}function ri(n,t,e,r){function u(n){return(e?Math.log(0>n?0:n):-Math.log(n>0?0:-n))/Math.log(t)}function i(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function a(t){return n(u(t))}return a.invert=function(t){return i(n.invert(t))},a.domain=function(t){return arguments.length?(e=t[0]>=0,n.domain((r=t.map(Number)).map(u)),a):r},a.base=function(e){return arguments.length?(t=+e,n.domain(r.map(u)),a):t},a.nice=function(){var t=Xu(r.map(u),e?Math:Nl);return n.domain(t),r=t.map(i),a},a.ticks=function(){var n=Yu(r),a=[],o=n[0],l=n[1],c=Math.floor(u(o)),s=Math.ceil(u(l)),f=t%1?2:t;if(isFinite(s-c)){if(e){for(;s>c;c++)for(var h=1;f>h;h++)a.push(i(c)*h);a.push(i(c))}else for(a.push(i(c));c++<s;)for(var h=f-1;h>0;h--)a.push(i(c)*h);for(c=0;a[c]<o;c++);for(s=a.length;a[s-1]>l;s--);a=a.slice(c,s)}return a},a.tickFormat=function(n,t){if(!arguments.length)return kl;arguments.length<2?t=kl:"function"!=typeof t&&(t=oa.format(t));var r,o=Math.max(.1,n/a.ticks().length),l=e?(r=1e-12,Math.ceil):(r=-1e-12,Math.floor);return function(n){return n/i(l(u(n)+r))<=o?t(n):""}},a.copy=function(){return ri(n.copy(),t,e,r)},Ju(a,n)}function ui(n,t,e){function r(t){return n(u(t))}var u=ii(t),i=ii(1/t);return r.invert=function(t){return i(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain((e=t.map(Number)).map(u)),r):e},r.ticks=function(n){return Qu(e,n)},r.tickFormat=function(n,t){return ni(e,n,t)},r.nice=function(n){return r.domain(Gu(e,n))},r.exponent=function(a){return arguments.length?(u=ii(t=a),i=ii(1/t),n.domain(e.map(u)),r):t},r.copy=function(){return ui(n.copy(),t,e)},Ju(r,n)}function ii(n){return function(t){return 0>t?-Math.pow(-t,n):Math.pow(t,n)}}function ai(n,t){function e(e){return i[((u.get(e)||("range"===t.t?u.set(e,n.push(e)):NaN))-1)%i.length]}function r(t,e){return oa.range(n.length).map(function(n){return t+e*n})}var u,i,a;return e.domain=function(r){if(!arguments.length)return n;n=[],u=new c;for(var i,a=-1,o=r.length;++a<o;)u.has(i=r[a])||u.set(i,n.push(i));return e[t.t].apply(e,t.a)},e.range=function(n){return arguments.length?(i=n,a=0,t={t:"range",a:arguments},e):i},e.rangePoints=function(u,o){arguments.length<2&&(o=0);var l=u[0],c=u[1],s=n.length<2?(l=(l+c)/2,0):(c-l)/(n.length-1+o);return i=r(l+s*o/2,s),a=0,t={t:"rangePoints",a:arguments},e},e.rangeRoundPoints=function(u,o){arguments.length<2&&(o=0);var l=u[0],c=u[1],s=n.length<2?(l=c=Math.round((l+c)/2),0):(c-l)/(n.length-1+o)|0;return i=r(l+Math.round(s*o/2+(c-l-(n.length-1+o)*s)/2),s),a=0,t={t:"rangeRoundPoints",a:arguments},e},e.rangeBands=function(u,o,l){arguments.length<2&&(o=0),arguments.length<3&&(l=o);var c=u[1]<u[0],s=u[c-0],f=u[1-c],h=(f-s)/(n.length-o+2*l);return i=r(s+h*l,h),c&&i.reverse(),a=h*(1-o),t={t:"rangeBands",a:arguments},e},e.rangeRoundBands=function(u,o,l){arguments.length<2&&(o=0),arguments.length<3&&(l=o);var c=u[1]<u[0],s=u[c-0],f=u[1-c],h=Math.floor((f-s)/(n.length-o+2*l));return i=r(s+Math.round((f-s-(n.length-o)*h)/2),h),c&&i.reverse(),a=Math.round(h*(1-o)),t={t:"rangeRoundBands",a:arguments},e},e.rangeBand=function(){return a},e.rangeExtent=function(){return Yu(t.a[0])},e.copy=function(){return ai(n,t)},e.domain(n)}function oi(n,t){function i(){var e=0,r=t.length;for(o=[];++e<r;)o[e-1]=oa.quantile(n,e/r);return a}function a(n){return isNaN(n=+n)?void 0:t[oa.bisect(o,n)]}var o;return a.domain=function(t){return arguments.length?(n=t.map(r).filter(u).sort(e),i()):n},a.range=function(n){return arguments.length?(t=n,i()):t},a.quantiles=function(){return o},a.invertExtent=function(e){return e=t.indexOf(e),0>e?[NaN,NaN]:[e>0?o[e-1]:n[0],e<o.length?o[e]:n[n.length-1]]},a.copy=function(){return oi(n,t)},i()}function li(n,t,e){function r(t){return e[Math.max(0,Math.min(a,Math.floor(i*(t-n))))]}function u(){return i=e.length/(t-n),a=e.length-1,r}var i,a;return r.domain=function(e){return arguments.length?(n=+e[0],t=+e[e.length-1],u()):[n,t]},r.range=function(n){return arguments.length?(e=n,u()):e},r.invertExtent=function(t){return t=e.indexOf(t),t=0>t?NaN:t/i+n,[t,t+1/i]},r.copy=function(){return li(n,t,e)},u()}function ci(n,t){function e(e){return e>=e?t[oa.bisect(n,e)]:void 0}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.invertExtent=function(e){return e=t.indexOf(e),[n[e-1],n[e]]},e.copy=function(){return ci(n,t)},e}function si(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return Qu(n,t)},t.tickFormat=function(t,e){return ni(n,t,e)},t.copy=function(){return si(n)},t}function fi(){return 0}function hi(n){return n.innerRadius}function gi(n){return n.outerRadius}function pi(n){return n.startAngle}function vi(n){return n.endAngle}function di(n){return n&&n.padAngle}function mi(n,t,e,r){return(n-e)*t-(t-r)*n>0?0:1}function yi(n,t,e,r,u){var i=n[0]-t[0],a=n[1]-t[1],o=(u?r:-r)/Math.sqrt(i*i+a*a),l=o*a,c=-o*i,s=n[0]+l,f=n[1]+c,h=t[0]+l,g=t[1]+c,p=(s+h)/2,v=(f+g)/2,d=h-s,m=g-f,y=d*d+m*m,M=e-r,x=s*g-h*f,b=(0>m?-1:1)*Math.sqrt(Math.max(0,M*M*y-x*x)),_=(x*m-d*b)/y,w=(-x*d-m*b)/y,S=(x*m+d*b)/y,k=(-x*d+m*b)/y,N=_-p,E=w-v,A=S-p,C=k-v;return N*N+E*E>A*A+C*C&&(_=S,w=k),[[_-l,w-c],[_*e/M,w*e/M]]}function Mi(n){function t(t){function a(){c.push("M",i(n(s),o))}for(var l,c=[],s=[],f=-1,h=t.length,g=En(e),p=En(r);++f<h;)u.call(this,l=t[f],f)?s.push([+g.call(this,l,f),+p.call(this,l,f)]):s.length&&(a(),s=[]);return s.length&&a(),c.length?c.join(""):null}var e=Ce,r=ze,u=zt,i=xi,a=i.key,o=.7;return t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t.defined=function(n){return arguments.length?(u=n,t):u},t.interpolate=function(n){return arguments.length?(a="function"==typeof n?i=n:(i=ql.get(n)||xi).key,t):a},t.tension=function(n){return arguments.length?(o=n,t):o},t}function xi(n){return n.length>1?n.join("L"):n+"Z"}function bi(n){return n.join("L")+"Z"}function _i(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("H",(r[0]+(r=n[t])[0])/2,"V",r[1]);return e>1&&u.push("H",r[0]),u.join("")}function wi(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("V",(r=n[t])[1],"H",r[0]);return u.join("")}function Si(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("H",(r=n[t])[0],"V",r[1]);return u.join("")}function ki(n,t){return n.length<4?xi(n):n[1]+Ai(n.slice(1,-1),Ci(n,t))}function Ni(n,t){return n.length<3?bi(n):n[0]+Ai((n.push(n[0]),n),Ci([n[n.length-2]].concat(n,[n[1]]),t))}function Ei(n,t){return n.length<3?xi(n):n[0]+Ai(n,Ci(n,t))}function Ai(n,t){if(t.length<1||n.length!=t.length&&n.length!=t.length+2)return xi(n);var e=n.length!=t.length,r="",u=n[0],i=n[1],a=t[0],o=a,l=1;if(e&&(r+="Q"+(i[0]-2*a[0]/3)+","+(i[1]-2*a[1]/3)+","+i[0]+","+i[1],u=n[1],l=2),t.length>1){o=t[1],i=n[l],l++,r+="C"+(u[0]+a[0])+","+(u[1]+a[1])+","+(i[0]-o[0])+","+(i[1]-o[1])+","+i[0]+","+i[1];for(var c=2;c<t.length;c++,l++)i=n[l],o=t[c],r+="S"+(i[0]-o[0])+","+(i[1]-o[1])+","+i[0]+","+i[1]}if(e){var s=n[l];r+="Q"+(i[0]+2*o[0]/3)+","+(i[1]+2*o[1]/3)+","+s[0]+","+s[1]}return r}function Ci(n,t){for(var e,r=[],u=(1-t)/2,i=n[0],a=n[1],o=1,l=n.length;++o<l;)e=i,i=a,a=n[o],r.push([u*(a[0]-e[0]),u*(a[1]-e[1])]);return r}function zi(n){if(n.length<3)return xi(n);var t=1,e=n.length,r=n[0],u=r[0],i=r[1],a=[u,u,u,(r=n[1])[0]],o=[i,i,i,r[1]],l=[u,",",i,"L",Ri(Dl,a),",",Ri(Dl,o)];for(n.push(n[e-1]);++t<=e;)r=n[t],a.shift(),a.push(r[0]),o.shift(),o.push(r[1]),Di(l,a,o);return n.pop(),l.push("L",r),l.join("")}function Li(n){if(n.length<4)return xi(n);for(var t,e=[],r=-1,u=n.length,i=[0],a=[0];++r<3;)t=n[r],i.push(t[0]),a.push(t[1]);for(e.push(Ri(Dl,i)+","+Ri(Dl,a)),--r;++r<u;)t=n[r],i.shift(),i.push(t[0]),a.shift(),a.push(t[1]),Di(e,i,a);return e.join("")}function qi(n){for(var t,e,r=-1,u=n.length,i=u+4,a=[],o=[];++r<4;)e=n[r%u],a.push(e[0]),o.push(e[1]);for(t=[Ri(Dl,a),",",Ri(Dl,o)],--r;++r<i;)e=n[r%u],a.shift(),a.push(e[0]),o.shift(),o.push(e[1]),Di(t,a,o);return t.join("")}function Ti(n,t){var e=n.length-1;if(e)for(var r,u,i=n[0][0],a=n[0][1],o=n[e][0]-i,l=n[e][1]-a,c=-1;++c<=e;)r=n[c],u=c/e,r[0]=t*r[0]+(1-t)*(i+u*o),r[1]=t*r[1]+(1-t)*(a+u*l);return zi(n)}function Ri(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]+n[3]*t[3]}function Di(n,t,e){n.push("C",Ri(Tl,t),",",Ri(Tl,e),",",Ri(Rl,t),",",Ri(Rl,e),",",Ri(Dl,t),",",Ri(Dl,e))}function Pi(n,t){return(t[1]-n[1])/(t[0]-n[0])}function ji(n){for(var t=0,e=n.length-1,r=[],u=n[0],i=n[1],a=r[0]=Pi(u,i);++t<e;)r[t]=(a+(a=Pi(u=i,i=n[t+1])))/2;return r[t]=a,r}function Ui(n){for(var t,e,r,u,i=[],a=ji(n),o=-1,l=n.length-1;++o<l;)t=Pi(n[o],n[o+1]),Ma(t)<Da?a[o]=a[o+1]=0:(e=a[o]/t,r=a[o+1]/t,u=e*e+r*r,u>9&&(u=3*t/Math.sqrt(u),a[o]=u*e,a[o+1]=u*r));for(o=-1;++o<=l;)u=(n[Math.min(l,o+1)][0]-n[Math.max(0,o-1)][0])/(6*(1+a[o]*a[o])),i.push([u||0,a[o]*u||0]);return i}function Fi(n){return n.length<3?xi(n):n[0]+Ai(n,Ui(n))}function Hi(n){for(var t,e,r,u=-1,i=n.length;++u<i;)t=n[u],e=t[0],r=t[1]-Ha,t[0]=e*Math.cos(r),t[1]=e*Math.sin(r);return n}function Oi(n){function t(t){function l(){v.push("M",o(n(m),f),s,c(n(d.reverse()),f),"Z")}for(var h,g,p,v=[],d=[],m=[],y=-1,M=t.length,x=En(e),b=En(u),_=e===r?function(){return g;
-}:En(r),w=u===i?function(){return p}:En(i);++y<M;)a.call(this,h=t[y],y)?(d.push([g=+x.call(this,h,y),p=+b.call(this,h,y)]),m.push([+_.call(this,h,y),+w.call(this,h,y)])):d.length&&(l(),d=[],m=[]);return d.length&&l(),v.length?v.join(""):null}var e=Ce,r=Ce,u=0,i=ze,a=zt,o=xi,l=o.key,c=o,s="L",f=.7;return t.x=function(n){return arguments.length?(e=r=n,t):r},t.x0=function(n){return arguments.length?(e=n,t):e},t.x1=function(n){return arguments.length?(r=n,t):r},t.y=function(n){return arguments.length?(u=i=n,t):i},t.y0=function(n){return arguments.length?(u=n,t):u},t.y1=function(n){return arguments.length?(i=n,t):i},t.defined=function(n){return arguments.length?(a=n,t):a},t.interpolate=function(n){return arguments.length?(l="function"==typeof n?o=n:(o=ql.get(n)||xi).key,c=o.reverse||o,s=o.closed?"M":"L",t):l},t.tension=function(n){return arguments.length?(f=n,t):f},t}function Ii(n){return n.radius}function Yi(n){return[n.x,n.y]}function Zi(n){return function(){var t=n.apply(this,arguments),e=t[0],r=t[1]-Ha;return[e*Math.cos(r),e*Math.sin(r)]}}function Vi(){return 64}function Xi(){return"circle"}function $i(n){var t=Math.sqrt(n/ja);return"M0,"+t+"A"+t+","+t+" 0 1,1 0,"+-t+"A"+t+","+t+" 0 1,1 0,"+t+"Z"}function Bi(n){return function(){var t,e,r;(t=this[n])&&(r=t[e=t.active])&&(r.timer.c=null,r.timer.t=NaN,--t.count?delete t[e]:delete this[n],t.active+=.5,r.event&&r.event.interrupt.call(this,this.__data__,r.index))}}function Wi(n,t,e){return Sa(n,Il),n.namespace=t,n.id=e,n}function Ji(n,t,e,r){var u=n.id,i=n.namespace;return Y(n,"function"==typeof e?function(n,a,o){n[i][u].tween.set(t,r(e.call(n,n.__data__,a,o)))}:(e=r(e),function(n){n[i][u].tween.set(t,e)}))}function Gi(n){return null==n&&(n=""),function(){this.textContent=n}}function Ki(n){return null==n?"__transition__":"__transition_"+n+"__"}function Qi(n,t,e,r,u){function i(n){var t=v.delay;return s.t=t+l,n>=t?a(n-t):void(s.c=a)}function a(e){var u=p.active,i=p[u];i&&(i.timer.c=null,i.timer.t=NaN,--p.count,delete p[u],i.event&&i.event.interrupt.call(n,n.__data__,i.index));for(var a in p)if(r>+a){var c=p[a];c.timer.c=null,c.timer.t=NaN,--p.count,delete p[a]}s.c=o,qn(function(){return s.c&&o(e||1)&&(s.c=null,s.t=NaN),1},0,l),p.active=r,v.event&&v.event.start.call(n,n.__data__,t),g=[],v.tween.forEach(function(e,r){(r=r.call(n,n.__data__,t))&&g.push(r)}),h=v.ease,f=v.duration}function o(u){for(var i=u/f,a=h(i),o=g.length;o>0;)g[--o].call(n,a);return i>=1?(v.event&&v.event.end.call(n,n.__data__,t),--p.count?delete p[r]:delete n[e],1):void 0}var l,s,f,h,g,p=n[e]||(n[e]={active:0,count:0}),v=p[r];v||(l=u.time,s=qn(i,0,l),v=p[r]={tween:new c,time:l,timer:s,delay:u.delay,duration:u.duration,ease:u.ease,index:t},u=null,++p.count)}function na(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate("+(isFinite(r)?r:e(n))+",0)"})}function ta(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate(0,"+(isFinite(r)?r:e(n))+")"})}function ea(n){return n.toISOString()}function ra(n,t,e){function r(t){return n(t)}function u(n,e){var r=n[1]-n[0],u=r/e,i=oa.bisect(Gl,u);return i==Gl.length?[t.year,Ku(n.map(function(n){return n/31536e6}),e)[2]]:i?t[u/Gl[i-1]<Gl[i]/u?i-1:i]:[nc,Ku(n,e)[2]]}return r.invert=function(t){return ua(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain(t),r):n.domain().map(ua)},r.nice=function(n,t){function e(e){return!isNaN(e)&&!n.range(e,ua(+e+1),t).length}var i=r.domain(),a=Yu(i),o=null==n?u(a,10):"number"==typeof n&&u(a,n);return o&&(n=o[0],t=o[1]),r.domain(Xu(i,t>1?{floor:function(t){for(;e(t=n.floor(t));)t=ua(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=ua(+t+1);return t}}:n))},r.ticks=function(n,t){var e=Yu(r.domain()),i=null==n?u(e,10):"number"==typeof n?u(e,n):!n.range&&[{range:n},t];return i&&(n=i[0],t=i[1]),n.range(e[0],ua(+e[1]+1),1>t?1:t)},r.tickFormat=function(){return e},r.copy=function(){return ra(n.copy(),t,e)},Ju(r,n)}function ua(n){return new Date(n)}function ia(n){return JSON.parse(n.responseText)}function aa(n){var t=sa.createRange();return t.selectNode(sa.body),t.createContextualFragment(n.responseText)}var oa={version:"3.5.9"},la=[].slice,ca=function(n){return la.call(n)},sa=this.document;if(sa)try{ca(sa.documentElement.childNodes)[0].nodeType}catch(fa){ca=function(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}}if(Date.now||(Date.now=function(){return+new Date}),sa)try{sa.createElement("DIV").style.setProperty("opacity",0,"")}catch(ha){var ga=this.Element.prototype,pa=ga.setAttribute,va=ga.setAttributeNS,da=this.CSSStyleDeclaration.prototype,ma=da.setProperty;ga.setAttribute=function(n,t){pa.call(this,n,t+"")},ga.setAttributeNS=function(n,t,e){va.call(this,n,t,e+"")},da.setProperty=function(n,t,e){ma.call(this,n,t+"",e)}}oa.ascending=e,oa.descending=function(n,t){return n>t?-1:t>n?1:t>=n?0:NaN},oa.min=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u<i;)if(null!=(r=n[u])&&r>=r){e=r;break}for(;++u<i;)null!=(r=n[u])&&e>r&&(e=r)}else{for(;++u<i;)if(null!=(r=t.call(n,n[u],u))&&r>=r){e=r;break}for(;++u<i;)null!=(r=t.call(n,n[u],u))&&e>r&&(e=r)}return e},oa.max=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u<i;)if(null!=(r=n[u])&&r>=r){e=r;break}for(;++u<i;)null!=(r=n[u])&&r>e&&(e=r)}else{for(;++u<i;)if(null!=(r=t.call(n,n[u],u))&&r>=r){e=r;break}for(;++u<i;)null!=(r=t.call(n,n[u],u))&&r>e&&(e=r)}return e},oa.extent=function(n,t){var e,r,u,i=-1,a=n.length;if(1===arguments.length){for(;++i<a;)if(null!=(r=n[i])&&r>=r){e=u=r;break}for(;++i<a;)null!=(r=n[i])&&(e>r&&(e=r),r>u&&(u=r))}else{for(;++i<a;)if(null!=(r=t.call(n,n[i],i))&&r>=r){e=u=r;break}for(;++i<a;)null!=(r=t.call(n,n[i],i))&&(e>r&&(e=r),r>u&&(u=r))}return[e,u]},oa.sum=function(n,t){var e,r=0,i=n.length,a=-1;if(1===arguments.length)for(;++a<i;)u(e=+n[a])&&(r+=e);else for(;++a<i;)u(e=+t.call(n,n[a],a))&&(r+=e);return r},oa.mean=function(n,t){var e,i=0,a=n.length,o=-1,l=a;if(1===arguments.length)for(;++o<a;)u(e=r(n[o]))?i+=e:--l;else for(;++o<a;)u(e=r(t.call(n,n[o],o)))?i+=e:--l;return l?i/l:void 0},oa.quantile=function(n,t){var e=(n.length-1)*t+1,r=Math.floor(e),u=+n[r-1],i=e-r;return i?u+i*(n[r]-u):u},oa.median=function(n,t){var i,a=[],o=n.length,l=-1;if(1===arguments.length)for(;++l<o;)u(i=r(n[l]))&&a.push(i);else for(;++l<o;)u(i=r(t.call(n,n[l],l)))&&a.push(i);return a.length?oa.quantile(a.sort(e),.5):void 0},oa.variance=function(n,t){var e,i,a=n.length,o=0,l=0,c=-1,s=0;if(1===arguments.length)for(;++c<a;)u(e=r(n[c]))&&(i=e-o,o+=i/++s,l+=i*(e-o));else for(;++c<a;)u(e=r(t.call(n,n[c],c)))&&(i=e-o,o+=i/++s,l+=i*(e-o));return s>1?l/(s-1):void 0},oa.deviation=function(){var n=oa.variance.apply(this,arguments);return n?Math.sqrt(n):n};var ya=i(e);oa.bisectLeft=ya.left,oa.bisect=oa.bisectRight=ya.right,oa.bisector=function(n){return i(1===n.length?function(t,r){return e(n(t),r)}:n)},oa.shuffle=function(n,t,e){(i=arguments.length)<3&&(e=n.length,2>i&&(t=0));for(var r,u,i=e-t;i;)u=Math.random()*i--|0,r=n[i+t],n[i+t]=n[u+t],n[u+t]=r;return n},oa.permute=function(n,t){for(var e=t.length,r=new Array(e);e--;)r[e]=n[t[e]];return r},oa.pairs=function(n){for(var t,e=0,r=n.length-1,u=n[0],i=new Array(0>r?0:r);r>e;)i[e]=[t=u,u=n[++e]];return i},oa.zip=function(){if(!(r=arguments.length))return[];for(var n=-1,t=oa.min(arguments,a),e=new Array(t);++n<t;)for(var r,u=-1,i=e[n]=new Array(r);++u<r;)i[u]=arguments[u][n];return e},oa.transpose=function(n){return oa.zip.apply(oa,n)},oa.keys=function(n){var t=[];for(var e in n)t.push(e);return t},oa.values=function(n){var t=[];for(var e in n)t.push(n[e]);return t},oa.entries=function(n){var t=[];for(var e in n)t.push({key:e,value:n[e]});return t},oa.merge=function(n){for(var t,e,r,u=n.length,i=-1,a=0;++i<u;)a+=n[i].length;for(e=new Array(a);--u>=0;)for(r=n[u],t=r.length;--t>=0;)e[--a]=r[t];return e};var Ma=Math.abs;oa.range=function(n,t,e){if(arguments.length<3&&(e=1,arguments.length<2&&(t=n,n=0)),(t-n)/e===1/0)throw new Error("infinite range");var r,u=[],i=o(Ma(e)),a=-1;if(n*=i,t*=i,e*=i,0>e)for(;(r=n+e*++a)>t;)u.push(r/i);else for(;(r=n+e*++a)<t;)u.push(r/i);return u},oa.map=function(n,t){var e=new c;if(n instanceof c)n.forEach(function(n,t){e.set(n,t)});else if(Array.isArray(n)){var r,u=-1,i=n.length;if(1===arguments.length)for(;++u<i;)e.set(u,n[u]);else for(;++u<i;)e.set(t.call(n,r=n[u],u),r)}else for(var a in n)e.set(a,n[a]);return e};var xa="__proto__",ba="\x00";l(c,{has:h,get:function(n){return this._[s(n)]},set:function(n,t){return this._[s(n)]=t},remove:g,keys:p,values:function(){var n=[];for(var t in this._)n.push(this._[t]);return n},entries:function(){var n=[];for(var t in this._)n.push({key:f(t),value:this._[t]});return n},size:v,empty:d,forEach:function(n){for(var t in this._)n.call(this,f(t),this._[t])}}),oa.nest=function(){function n(t,a,o){if(o>=i.length)return r?r.call(u,a):e?a.sort(e):a;for(var l,s,f,h,g=-1,p=a.length,v=i[o++],d=new c;++g<p;)(h=d.get(l=v(s=a[g])))?h.push(s):d.set(l,[s]);return t?(s=t(),f=function(e,r){s.set(e,n(t,r,o))}):(s={},f=function(e,r){s[e]=n(t,r,o)}),d.forEach(f),s}function t(n,e){if(e>=i.length)return n;var r=[],u=a[e++];return n.forEach(function(n,u){r.push({key:n,values:t(u,e)})}),u?r.sort(function(n,t){return u(n.key,t.key)}):r}var e,r,u={},i=[],a=[];return u.map=function(t,e){return n(e,t,0)},u.entries=function(e){return t(n(oa.map,e,0),0)},u.key=function(n){return i.push(n),u},u.sortKeys=function(n){return a[i.length-1]=n,u},u.sortValues=function(n){return e=n,u},u.rollup=function(n){return r=n,u},u},oa.set=function(n){var t=new m;if(n)for(var e=0,r=n.length;r>e;++e)t.add(n[e]);return t},l(m,{has:h,add:function(n){return this._[s(n+="")]=!0,n},remove:g,values:p,size:v,empty:d,forEach:function(n){for(var t in this._)n.call(this,f(t))}}),oa.behavior={},oa.rebind=function(n,t){for(var e,r=1,u=arguments.length;++r<u;)n[e=arguments[r]]=M(n,t,t[e]);return n};var _a=["webkit","ms","moz","Moz","o","O"];oa.dispatch=function(){for(var n=new _,t=-1,e=arguments.length;++t<e;)n[arguments[t]]=w(n);return n},_.prototype.on=function(n,t){var e=n.indexOf("."),r="";if(e>=0&&(r=n.slice(e+1),n=n.slice(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},oa.event=null,oa.requote=function(n){return n.replace(wa,"\\$&")};var wa=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,Sa={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},ka=function(n,t){return t.querySelector(n)},Na=function(n,t){return t.querySelectorAll(n)},Ea=function(n,t){var e=n.matches||n[x(n,"matchesSelector")];return(Ea=function(n,t){return e.call(n,t)})(n,t)};"function"==typeof Sizzle&&(ka=function(n,t){return Sizzle(n,t)[0]||null},Na=Sizzle,Ea=Sizzle.matchesSelector),oa.selection=function(){return oa.select(sa.documentElement)};var Aa=oa.selection.prototype=[];Aa.select=function(n){var t,e,r,u,i=[];n=A(n);for(var a=-1,o=this.length;++a<o;){i.push(t=[]),t.parentNode=(r=this[a]).parentNode;for(var l=-1,c=r.length;++l<c;)(u=r[l])?(t.push(e=n.call(u,u.__data__,l,a)),e&&"__data__"in u&&(e.__data__=u.__data__)):t.push(null)}return E(i)},Aa.selectAll=function(n){var t,e,r=[];n=C(n);for(var u=-1,i=this.length;++u<i;)for(var a=this[u],o=-1,l=a.length;++o<l;)(e=a[o])&&(r.push(t=ca(n.call(e,e.__data__,o,u))),t.parentNode=e);return E(r)};var Ca={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};oa.ns={prefix:Ca,qualify:function(n){var t=n.indexOf(":"),e=n;return t>=0&&"xmlns"!==(e=n.slice(0,t))&&(n=n.slice(t+1)),Ca.hasOwnProperty(e)?{space:Ca[e],local:n}:n}},Aa.attr=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node();return n=oa.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(z(t,n[t]));return this}return this.each(z(n,t))},Aa.classed=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node(),r=(n=T(n)).length,u=-1;if(t=e.classList){for(;++u<r;)if(!t.contains(n[u]))return!1}else for(t=e.getAttribute("class");++u<r;)if(!q(n[u]).test(t))return!1;return!0}for(t in n)this.each(R(t,n[t]));return this}return this.each(R(n,t))},Aa.style=function(n,e,r){var u=arguments.length;if(3>u){if("string"!=typeof n){2>u&&(e="");for(r in n)this.each(P(r,n[r],e));return this}if(2>u){var i=this.node();return t(i).getComputedStyle(i,null).getPropertyValue(n)}r=""}return this.each(P(n,e,r))},Aa.property=function(n,t){if(arguments.length<2){if("string"==typeof n)return this.node()[n];for(t in n)this.each(j(t,n[t]));return this}return this.each(j(n,t))},Aa.text=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?"":t}:null==n?function(){this.textContent=""}:function(){this.textContent=n}):this.node().textContent},Aa.html=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?"":t}:null==n?function(){this.innerHTML=""}:function(){this.innerHTML=n}):this.node().innerHTML},Aa.append=function(n){return n=U(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},Aa.insert=function(n,t){return n=U(n),t=A(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments)||null)})},Aa.remove=function(){return this.each(F)},Aa.data=function(n,t){function e(n,e){var r,u,i,a=n.length,f=e.length,h=Math.min(a,f),g=new Array(f),p=new Array(f),v=new Array(a);if(t){var d,m=new c,y=new Array(a);for(r=-1;++r<a;)(u=n[r])&&(m.has(d=t.call(u,u.__data__,r))?v[r]=u:m.set(d,u),y[r]=d);for(r=-1;++r<f;)(u=m.get(d=t.call(e,i=e[r],r)))?u!==!0&&(g[r]=u,u.__data__=i):p[r]=H(i),m.set(d,!0);for(r=-1;++r<a;)r in y&&m.get(y[r])!==!0&&(v[r]=n[r])}else{for(r=-1;++r<h;)u=n[r],i=e[r],u?(u.__data__=i,g[r]=u):p[r]=H(i);for(;f>r;++r)p[r]=H(e[r]);for(;a>r;++r)v[r]=n[r]}p.update=g,p.parentNode=g.parentNode=v.parentNode=n.parentNode,o.push(p),l.push(g),s.push(v)}var r,u,i=-1,a=this.length;if(!arguments.length){for(n=new Array(a=(r=this[0]).length);++i<a;)(u=r[i])&&(n[i]=u.__data__);return n}var o=Z([]),l=E([]),s=E([]);if("function"==typeof n)for(;++i<a;)e(r=this[i],n.call(r,r.parentNode.__data__,i));else for(;++i<a;)e(r=this[i],n);return l.enter=function(){return o},l.exit=function(){return s},l},Aa.datum=function(n){return arguments.length?this.property("__data__",n):this.property("__data__")},Aa.filter=function(n){var t,e,r,u=[];"function"!=typeof n&&(n=O(n));for(var i=0,a=this.length;a>i;i++){u.push(t=[]),t.parentNode=(e=this[i]).parentNode;for(var o=0,l=e.length;l>o;o++)(r=e[o])&&n.call(r,r.__data__,o,i)&&t.push(r)}return E(u)},Aa.order=function(){for(var n=-1,t=this.length;++n<t;)for(var e,r=this[n],u=r.length-1,i=r[u];--u>=0;)(e=r[u])&&(i&&i!==e.nextSibling&&i.parentNode.insertBefore(e,i),i=e);return this},Aa.sort=function(n){n=I.apply(this,arguments);for(var t=-1,e=this.length;++t<e;)this[t].sort(n);return this.order()},Aa.each=function(n){return Y(this,function(t,e,r){n.call(t,t.__data__,e,r)})},Aa.call=function(n){var t=ca(arguments);return n.apply(t[0]=this,t),this},Aa.empty=function(){return!this.node()},Aa.node=function(){for(var n=0,t=this.length;t>n;n++)for(var e=this[n],r=0,u=e.length;u>r;r++){var i=e[r];if(i)return i}return null},Aa.size=function(){var n=0;return Y(this,function(){++n}),n};var za=[];oa.selection.enter=Z,oa.selection.enter.prototype=za,za.append=Aa.append,za.empty=Aa.empty,za.node=Aa.node,za.call=Aa.call,za.size=Aa.size,za.select=function(n){for(var t,e,r,u,i,a=[],o=-1,l=this.length;++o<l;){r=(u=this[o]).update,a.push(t=[]),t.parentNode=u.parentNode;for(var c=-1,s=u.length;++c<s;)(i=u[c])?(t.push(r[c]=e=n.call(u.parentNode,i.__data__,c,o)),e.__data__=i.__data__):t.push(null)}return E(a)},za.insert=function(n,t){return arguments.length<2&&(t=V(this)),Aa.insert.call(this,n,t)},oa.select=function(t){var e;return"string"==typeof t?(e=[ka(t,sa)],e.parentNode=sa.documentElement):(e=[t],e.parentNode=n(t)),E([e])},oa.selectAll=function(n){var t;return"string"==typeof n?(t=ca(Na(n,sa)),t.parentNode=sa.documentElement):(t=ca(n),t.parentNode=null),E([t])},Aa.on=function(n,t,e){var r=arguments.length;if(3>r){if("string"!=typeof n){2>r&&(t=!1);for(e in n)this.each(X(e,n[e],t));return this}if(2>r)return(r=this.node()["__on"+n])&&r._;e=!1}return this.each(X(n,t,e))};var La=oa.map({mouseenter:"mouseover",mouseleave:"mouseout"});sa&&La.forEach(function(n){"on"+n in sa&&La.remove(n)});var qa,Ta=0;oa.mouse=function(n){return J(n,k())};var Ra=this.navigator&&/WebKit/.test(this.navigator.userAgent)?-1:0;oa.touch=function(n,t,e){if(arguments.length<3&&(e=t,t=k().changedTouches),t)for(var r,u=0,i=t.length;i>u;++u)if((r=t[u]).identifier===e)return J(n,r)},oa.behavior.drag=function(){function n(){this.on("mousedown.drag",i).on("touchstart.drag",a)}function e(n,t,e,i,a){return function(){function o(){var n,e,r=t(h,v);r&&(n=r[0]-M[0],e=r[1]-M[1],p|=n|e,M=r,g({type:"drag",x:r[0]+c[0],y:r[1]+c[1],dx:n,dy:e}))}function l(){t(h,v)&&(m.on(i+d,null).on(a+d,null),y(p),g({type:"dragend"}))}var c,s=this,f=oa.event.target,h=s.parentNode,g=r.of(s,arguments),p=0,v=n(),d=".drag"+(null==v?"":"-"+v),m=oa.select(e(f)).on(i+d,o).on(a+d,l),y=W(f),M=t(h,v);u?(c=u.apply(s,arguments),c=[c.x-M[0],c.y-M[1]]):c=[0,0],g({type:"dragstart"})}}var r=N(n,"drag","dragstart","dragend"),u=null,i=e(b,oa.mouse,t,"mousemove","mouseup"),a=e(G,oa.touch,y,"touchmove","touchend");return n.origin=function(t){return arguments.length?(u=t,n):u},oa.rebind(n,r,"on")},oa.touches=function(n,t){return arguments.length<2&&(t=k().touches),t?ca(t).map(function(t){var e=J(n,t);return e.identifier=t.identifier,e}):[]};var Da=1e-6,Pa=Da*Da,ja=Math.PI,Ua=2*ja,Fa=Ua-Da,Ha=ja/2,Oa=ja/180,Ia=180/ja,Ya=Math.SQRT2,Za=2,Va=4;oa.interpolateZoom=function(n,t){var e,r,u=n[0],i=n[1],a=n[2],o=t[0],l=t[1],c=t[2],s=o-u,f=l-i,h=s*s+f*f;if(Pa>h)r=Math.log(c/a)/Ya,e=function(n){return[u+n*s,i+n*f,a*Math.exp(Ya*n*r)]};else{var g=Math.sqrt(h),p=(c*c-a*a+Va*h)/(2*a*Za*g),v=(c*c-a*a-Va*h)/(2*c*Za*g),d=Math.log(Math.sqrt(p*p+1)-p),m=Math.log(Math.sqrt(v*v+1)-v);r=(m-d)/Ya,e=function(n){var t=n*r,e=rn(d),o=a/(Za*g)*(e*un(Ya*t+d)-en(d));return[u+o*s,i+o*f,a*e/rn(Ya*t+d)]}}return e.duration=1e3*r,e},oa.behavior.zoom=function(){function n(n){n.on(L,f).on($a+".zoom",g).on("dblclick.zoom",p).on(R,h)}function e(n){return[(n[0]-k.x)/k.k,(n[1]-k.y)/k.k]}function r(n){return[n[0]*k.k+k.x,n[1]*k.k+k.y]}function u(n){k.k=Math.max(A[0],Math.min(A[1],n))}function i(n,t){t=r(t),k.x+=n[0]-t[0],k.y+=n[1]-t[1]}function a(t,e,r,a){t.__chart__={x:k.x,y:k.y,k:k.k},u(Math.pow(2,a)),i(d=e,r),t=oa.select(t),C>0&&(t=t.transition().duration(C)),t.call(n.event)}function o(){b&&b.domain(x.range().map(function(n){return(n-k.x)/k.k}).map(x.invert)),w&&w.domain(_.range().map(function(n){return(n-k.y)/k.k}).map(_.invert))}function l(n){z++||n({type:"zoomstart"})}function c(n){o(),n({type:"zoom",scale:k.k,translate:[k.x,k.y]})}function s(n){--z||(n({type:"zoomend"}),d=null)}function f(){function n(){o=1,i(oa.mouse(u),h),c(a)}function r(){f.on(q,null).on(T,null),g(o),s(a)}var u=this,a=D.of(u,arguments),o=0,f=oa.select(t(u)).on(q,n).on(T,r),h=e(oa.mouse(u)),g=W(u);Ol.call(u),l(a)}function h(){function n(){var n=oa.touches(p);return g=k.k,n.forEach(function(n){n.identifier in d&&(d[n.identifier]=e(n))}),n}function t(){var t=oa.event.target;oa.select(t).on(x,r).on(b,o),_.push(t);for(var e=oa.event.changedTouches,u=0,i=e.length;i>u;++u)d[e[u].identifier]=null;var l=n(),c=Date.now();if(1===l.length){if(500>c-M){var s=l[0];a(p,s,d[s.identifier],Math.floor(Math.log(k.k)/Math.LN2)+1),S()}M=c}else if(l.length>1){var s=l[0],f=l[1],h=s[0]-f[0],g=s[1]-f[1];m=h*h+g*g}}function r(){var n,t,e,r,a=oa.touches(p);Ol.call(p);for(var o=0,l=a.length;l>o;++o,r=null)if(e=a[o],r=d[e.identifier]){if(t)break;n=e,t=r}if(r){var s=(s=e[0]-n[0])*s+(s=e[1]-n[1])*s,f=m&&Math.sqrt(s/m);n=[(n[0]+e[0])/2,(n[1]+e[1])/2],t=[(t[0]+r[0])/2,(t[1]+r[1])/2],u(f*g)}M=null,i(n,t),c(v)}function o(){if(oa.event.touches.length){for(var t=oa.event.changedTouches,e=0,r=t.length;r>e;++e)delete d[t[e].identifier];for(var u in d)return void n()}oa.selectAll(_).on(y,null),w.on(L,f).on(R,h),N(),s(v)}var g,p=this,v=D.of(p,arguments),d={},m=0,y=".zoom-"+oa.event.changedTouches[0].identifier,x="touchmove"+y,b="touchend"+y,_=[],w=oa.select(p),N=W(p);t(),l(v),w.on(L,null).on(R,t)}function g(){var n=D.of(this,arguments);y?clearTimeout(y):(Ol.call(this),v=e(d=m||oa.mouse(this)),l(n)),y=setTimeout(function(){y=null,s(n)},50),S(),u(Math.pow(2,.002*Xa())*k.k),i(d,v),c(n)}function p(){var n=oa.mouse(this),t=Math.log(k.k)/Math.LN2;a(this,n,e(n),oa.event.shiftKey?Math.ceil(t)-1:Math.floor(t)+1)}var v,d,m,y,M,x,b,_,w,k={x:0,y:0,k:1},E=[960,500],A=Ba,C=250,z=0,L="mousedown.zoom",q="mousemove.zoom",T="mouseup.zoom",R="touchstart.zoom",D=N(n,"zoomstart","zoom","zoomend");return $a||($a="onwheel"in sa?(Xa=function(){return-oa.event.deltaY*(oa.event.deltaMode?120:1)},"wheel"):"onmousewheel"in sa?(Xa=function(){return oa.event.wheelDelta},"mousewheel"):(Xa=function(){return-oa.event.detail},"MozMousePixelScroll")),n.event=function(n){n.each(function(){var n=D.of(this,arguments),t=k;Fl?oa.select(this).transition().each("start.zoom",function(){k=this.__chart__||{x:0,y:0,k:1},l(n)}).tween("zoom:zoom",function(){var e=E[0],r=E[1],u=d?d[0]:e/2,i=d?d[1]:r/2,a=oa.interpolateZoom([(u-k.x)/k.k,(i-k.y)/k.k,e/k.k],[(u-t.x)/t.k,(i-t.y)/t.k,e/t.k]);return function(t){var r=a(t),o=e/r[2];this.__chart__=k={x:u-r[0]*o,y:i-r[1]*o,k:o},c(n)}}).each("interrupt.zoom",function(){s(n)}).each("end.zoom",function(){s(n)}):(this.__chart__=k,l(n),c(n),s(n))})},n.translate=function(t){return arguments.length?(k={x:+t[0],y:+t[1],k:k.k},o(),n):[k.x,k.y]},n.scale=function(t){return arguments.length?(k={x:k.x,y:k.y,k:null},u(+t),o(),n):k.k},n.scaleExtent=function(t){return arguments.length?(A=null==t?Ba:[+t[0],+t[1]],n):A},n.center=function(t){return arguments.length?(m=t&&[+t[0],+t[1]],n):m},n.size=function(t){return arguments.length?(E=t&&[+t[0],+t[1]],n):E},n.duration=function(t){return arguments.length?(C=+t,n):C},n.x=function(t){return arguments.length?(b=t,x=t.copy(),k={x:0,y:0,k:1},n):b},n.y=function(t){return arguments.length?(w=t,_=t.copy(),k={x:0,y:0,k:1},n):w},oa.rebind(n,D,"on")};var Xa,$a,Ba=[0,1/0];oa.color=on,on.prototype.toString=function(){return this.rgb()+""},oa.hsl=ln;var Wa=ln.prototype=new on;Wa.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),new ln(this.h,this.s,this.l/n)},Wa.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new ln(this.h,this.s,n*this.l)},Wa.rgb=function(){return cn(this.h,this.s,this.l)},oa.hcl=sn;var Ja=sn.prototype=new on;Ja.brighter=function(n){return new sn(this.h,this.c,Math.min(100,this.l+Ga*(arguments.length?n:1)))},Ja.darker=function(n){return new sn(this.h,this.c,Math.max(0,this.l-Ga*(arguments.length?n:1)))},Ja.rgb=function(){return fn(this.h,this.c,this.l).rgb()},oa.lab=hn;var Ga=18,Ka=.95047,Qa=1,no=1.08883,to=hn.prototype=new on;to.brighter=function(n){return new hn(Math.min(100,this.l+Ga*(arguments.length?n:1)),this.a,this.b)},to.darker=function(n){return new hn(Math.max(0,this.l-Ga*(arguments.length?n:1)),this.a,this.b)},to.rgb=function(){return gn(this.l,this.a,this.b)},oa.rgb=yn;var eo=yn.prototype=new on;eo.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,u=30;return t||e||r?(t&&u>t&&(t=u),e&&u>e&&(e=u),r&&u>r&&(r=u),new yn(Math.min(255,t/n),Math.min(255,e/n),Math.min(255,r/n))):new yn(u,u,u)},eo.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new yn(n*this.r,n*this.g,n*this.b)},eo.hsl=function(){return wn(this.r,this.g,this.b)},eo.toString=function(){return"#"+bn(this.r)+bn(this.g)+bn(this.b)};var ro=oa.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});ro.forEach(function(n,t){ro.set(n,Mn(t))}),oa.functor=En,oa.xhr=An(y),oa.dsv=function(n,t){function e(n,e,i){arguments.length<3&&(i=e,e=null);var a=Cn(n,t,null==e?r:u(e),i);return a.row=function(n){return arguments.length?a.response(null==(e=n)?r:u(n)):e},a}function r(n){return e.parse(n.responseText)}function u(n){return function(t){return e.parse(t.responseText,n)}}function i(t){return t.map(a).join(n)}function a(n){return o.test(n)?'"'+n.replace(/\"/g,'""')+'"':n}var o=new RegExp('["'+n+"\n]"),l=n.charCodeAt(0);return e.parse=function(n,t){var r;return e.parseRows(n,function(n,e){if(r)return r(n,e-1);var u=new Function("d","return {"+n.map(function(n,t){return JSON.stringify(n)+": d["+t+"]"}).join(",")+"}");r=t?function(n,e){return t(u(n),e)}:u})},e.parseRows=function(n,t){function e(){if(s>=c)return a;if(u)return u=!1,i;var t=s;if(34===n.charCodeAt(t)){for(var e=t;e++<c;)if(34===n.charCodeAt(e)){if(34!==n.charCodeAt(e+1))break;++e}s=e+2;var r=n.charCodeAt(e+1);return 13===r?(u=!0,10===n.charCodeAt(e+2)&&++s):10===r&&(u=!0),n.slice(t+1,e).replace(/""/g,'"')}for(;c>s;){var r=n.charCodeAt(s++),o=1;if(10===r)u=!0;else if(13===r)u=!0,10===n.charCodeAt(s)&&(++s,++o);else if(r!==l)continue;return n.slice(t,s-o)}return n.slice(t)}for(var r,u,i={},a={},o=[],c=n.length,s=0,f=0;(r=e())!==a;){for(var h=[];r!==i&&r!==a;)h.push(r),r=e();t&&null==(h=t(h,f++))||o.push(h)}return o},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new m,u=[];return t.forEach(function(n){for(var t in n)r.has(t)||u.push(r.add(t))}),[u.map(a).join(n)].concat(t.map(function(t){return u.map(function(n){return a(t[n])}).join(n)})).join("\n")},e.formatRows=function(n){return n.map(i).join("\n")},e},oa.csv=oa.dsv(",","text/csv"),oa.tsv=oa.dsv("	","text/tab-separated-values");var uo,io,ao,oo,lo=this[x(this,"requestAnimationFrame")]||function(n){setTimeout(n,17)};oa.timer=function(){qn.apply(this,arguments)},oa.timer.flush=function(){Rn(),Dn()},oa.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)};var co=["y","z","a","f","p","n","\xb5","m","","k","M","G","T","P","E","Z","Y"].map(jn);oa.formatPrefix=function(n,t){var e=0;return(n=+n)&&(0>n&&(n*=-1),t&&(n=oa.round(n,Pn(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((e-1)/3)))),co[8+e/3]};var so=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,fo=oa.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=oa.round(n,Pn(n,t))).toFixed(Math.max(0,Math.min(20,Pn(n*(1+1e-15),t))))}}),ho=oa.time={},go=Date;Hn.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){po.setUTCDate.apply(this._,arguments)},setDay:function(){po.setUTCDay.apply(this._,arguments)},setFullYear:function(){po.setUTCFullYear.apply(this._,arguments)},setHours:function(){po.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){po.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){po.setUTCMinutes.apply(this._,arguments)},setMonth:function(){po.setUTCMonth.apply(this._,arguments)},setSeconds:function(){po.setUTCSeconds.apply(this._,arguments)},setTime:function(){po.setTime.apply(this._,arguments)}};var po=Date.prototype;ho.year=On(function(n){return n=ho.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),ho.years=ho.year.range,ho.years.utc=ho.year.utc.range,ho.day=On(function(n){var t=new go(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),ho.days=ho.day.range,ho.days.utc=ho.day.utc.range,ho.dayOfYear=function(n){var t=ho.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},["sunday","monday","tuesday","wednesday","thursday","friday","saturday"].forEach(function(n,t){t=7-t;var e=ho[n]=On(function(n){return(n=ho.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=ho.year(n).getDay();return Math.floor((ho.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});ho[n+"s"]=e.range,ho[n+"s"].utc=e.utc.range,ho[n+"OfYear"]=function(n){var e=ho.year(n).getDay();return Math.floor((ho.dayOfYear(n)+(e+t)%7)/7)}}),ho.week=ho.sunday,ho.weeks=ho.sunday.range,ho.weeks.utc=ho.sunday.utc.range,ho.weekOfYear=ho.sundayOfYear;var vo={"-":"",_:" ",0:"0"},mo=/^\s*\d+/,yo=/^%/;oa.locale=function(n){return{numberFormat:Un(n),timeFormat:Yn(n)}};var Mo=oa.locale({decimal:".",thousands:",",grouping:[3],currency:["$",""],dateTime:"%a %b %e %X %Y",date:"%m/%d/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],
-shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});oa.format=Mo.numberFormat,oa.geo={},st.prototype={s:0,t:0,add:function(n){ft(n,this.t,xo),ft(xo.s,this.s,this),this.s?this.t+=xo.t:this.s=xo.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var xo=new st;oa.geo.stream=function(n,t){n&&bo.hasOwnProperty(n.type)?bo[n.type](n,t):ht(n,t)};var bo={Feature:function(n,t){ht(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,u=e.length;++r<u;)ht(e[r].geometry,t)}},_o={Sphere:function(n,t){t.sphere()},Point:function(n,t){n=n.coordinates,t.point(n[0],n[1],n[2])},MultiPoint:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)n=e[r],t.point(n[0],n[1],n[2])},LineString:function(n,t){gt(n.coordinates,t,0)},MultiLineString:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)gt(e[r],t,0)},Polygon:function(n,t){pt(n.coordinates,t)},MultiPolygon:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)pt(e[r],t)},GeometryCollection:function(n,t){for(var e=n.geometries,r=-1,u=e.length;++r<u;)ht(e[r],t)}};oa.geo.area=function(n){return wo=0,oa.geo.stream(n,ko),wo};var wo,So=new st,ko={sphere:function(){wo+=4*ja},point:b,lineStart:b,lineEnd:b,polygonStart:function(){So.reset(),ko.lineStart=vt},polygonEnd:function(){var n=2*So;wo+=0>n?4*ja+n:n,ko.lineStart=ko.lineEnd=ko.point=b}};oa.geo.bounds=function(){function n(n,t){M.push(x=[s=n,h=n]),f>t&&(f=t),t>g&&(g=t)}function t(t,e){var r=dt([t*Oa,e*Oa]);if(m){var u=yt(m,r),i=[u[1],-u[0],0],a=yt(i,u);bt(a),a=_t(a);var l=t-p,c=l>0?1:-1,v=a[0]*Ia*c,d=Ma(l)>180;if(d^(v>c*p&&c*t>v)){var y=a[1]*Ia;y>g&&(g=y)}else if(v=(v+360)%360-180,d^(v>c*p&&c*t>v)){var y=-a[1]*Ia;f>y&&(f=y)}else f>e&&(f=e),e>g&&(g=e);d?p>t?o(s,t)>o(s,h)&&(h=t):o(t,h)>o(s,h)&&(s=t):h>=s?(s>t&&(s=t),t>h&&(h=t)):t>p?o(s,t)>o(s,h)&&(h=t):o(t,h)>o(s,h)&&(s=t)}else n(t,e);m=r,p=t}function e(){b.point=t}function r(){x[0]=s,x[1]=h,b.point=n,m=null}function u(n,e){if(m){var r=n-p;y+=Ma(r)>180?r+(r>0?360:-360):r}else v=n,d=e;ko.point(n,e),t(n,e)}function i(){ko.lineStart()}function a(){u(v,d),ko.lineEnd(),Ma(y)>Da&&(s=-(h=180)),x[0]=s,x[1]=h,m=null}function o(n,t){return(t-=n)<0?t+360:t}function l(n,t){return n[0]-t[0]}function c(n,t){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:n<t[0]||t[1]<n}var s,f,h,g,p,v,d,m,y,M,x,b={point:n,lineStart:e,lineEnd:r,polygonStart:function(){b.point=u,b.lineStart=i,b.lineEnd=a,y=0,ko.polygonStart()},polygonEnd:function(){ko.polygonEnd(),b.point=n,b.lineStart=e,b.lineEnd=r,0>So?(s=-(h=180),f=-(g=90)):y>Da?g=90:-Da>y&&(f=-90),x[0]=s,x[1]=h}};return function(n){g=h=-(s=f=1/0),M=[],oa.geo.stream(n,b);var t=M.length;if(t){M.sort(l);for(var e,r=1,u=M[0],i=[u];t>r;++r)e=M[r],c(e[0],u)||c(e[1],u)?(o(u[0],e[1])>o(u[0],u[1])&&(u[1]=e[1]),o(e[0],u[1])>o(u[0],u[1])&&(u[0]=e[0])):i.push(u=e);for(var a,e,p=-(1/0),t=i.length-1,r=0,u=i[t];t>=r;u=e,++r)e=i[r],(a=o(u[1],e[0]))>p&&(p=a,s=e[0],h=u[1])}return M=x=null,s===1/0||f===1/0?[[NaN,NaN],[NaN,NaN]]:[[s,f],[h,g]]}}(),oa.geo.centroid=function(n){No=Eo=Ao=Co=zo=Lo=qo=To=Ro=Do=Po=0,oa.geo.stream(n,jo);var t=Ro,e=Do,r=Po,u=t*t+e*e+r*r;return Pa>u&&(t=Lo,e=qo,r=To,Da>Eo&&(t=Ao,e=Co,r=zo),u=t*t+e*e+r*r,Pa>u)?[NaN,NaN]:[Math.atan2(e,t)*Ia,tn(r/Math.sqrt(u))*Ia]};var No,Eo,Ao,Co,zo,Lo,qo,To,Ro,Do,Po,jo={sphere:b,point:St,lineStart:Nt,lineEnd:Et,polygonStart:function(){jo.lineStart=At},polygonEnd:function(){jo.lineStart=Nt}},Uo=Rt(zt,Ut,Ht,[-ja,-ja/2]),Fo=1e9;oa.geo.clipExtent=function(){var n,t,e,r,u,i,a={stream:function(n){return u&&(u.valid=!1),u=i(n),u.valid=!0,u},extent:function(o){return arguments.length?(i=Zt(n=+o[0][0],t=+o[0][1],e=+o[1][0],r=+o[1][1]),u&&(u.valid=!1,u=null),a):[[n,t],[e,r]]}};return a.extent([[0,0],[960,500]])},(oa.geo.conicEqualArea=function(){return Vt(Xt)}).raw=Xt,oa.geo.albers=function(){return oa.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},oa.geo.albersUsa=function(){function n(n){var i=n[0],a=n[1];return t=null,e(i,a),t||(r(i,a),t)||u(i,a),t}var t,e,r,u,i=oa.geo.albers(),a=oa.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),o=oa.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),l={point:function(n,e){t=[n,e]}};return n.invert=function(n){var t=i.scale(),e=i.translate(),r=(n[0]-e[0])/t,u=(n[1]-e[1])/t;return(u>=.12&&.234>u&&r>=-.425&&-.214>r?a:u>=.166&&.234>u&&r>=-.214&&-.115>r?o:i).invert(n)},n.stream=function(n){var t=i.stream(n),e=a.stream(n),r=o.stream(n);return{point:function(n,u){t.point(n,u),e.point(n,u),r.point(n,u)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(i.precision(t),a.precision(t),o.precision(t),n):i.precision()},n.scale=function(t){return arguments.length?(i.scale(t),a.scale(.35*t),o.scale(t),n.translate(i.translate())):i.scale()},n.translate=function(t){if(!arguments.length)return i.translate();var c=i.scale(),s=+t[0],f=+t[1];return e=i.translate(t).clipExtent([[s-.455*c,f-.238*c],[s+.455*c,f+.238*c]]).stream(l).point,r=a.translate([s-.307*c,f+.201*c]).clipExtent([[s-.425*c+Da,f+.12*c+Da],[s-.214*c-Da,f+.234*c-Da]]).stream(l).point,u=o.translate([s-.205*c,f+.212*c]).clipExtent([[s-.214*c+Da,f+.166*c+Da],[s-.115*c-Da,f+.234*c-Da]]).stream(l).point,n},n.scale(1070)};var Ho,Oo,Io,Yo,Zo,Vo,Xo={point:b,lineStart:b,lineEnd:b,polygonStart:function(){Oo=0,Xo.lineStart=$t},polygonEnd:function(){Xo.lineStart=Xo.lineEnd=Xo.point=b,Ho+=Ma(Oo/2)}},$o={point:Bt,lineStart:b,lineEnd:b,polygonStart:b,polygonEnd:b},Bo={point:Gt,lineStart:Kt,lineEnd:Qt,polygonStart:function(){Bo.lineStart=ne},polygonEnd:function(){Bo.point=Gt,Bo.lineStart=Kt,Bo.lineEnd=Qt}};oa.geo.path=function(){function n(n){return n&&("function"==typeof o&&i.pointRadius(+o.apply(this,arguments)),a&&a.valid||(a=u(i)),oa.geo.stream(n,a)),i.result()}function t(){return a=null,n}var e,r,u,i,a,o=4.5;return n.area=function(n){return Ho=0,oa.geo.stream(n,u(Xo)),Ho},n.centroid=function(n){return Ao=Co=zo=Lo=qo=To=Ro=Do=Po=0,oa.geo.stream(n,u(Bo)),Po?[Ro/Po,Do/Po]:To?[Lo/To,qo/To]:zo?[Ao/zo,Co/zo]:[NaN,NaN]},n.bounds=function(n){return Zo=Vo=-(Io=Yo=1/0),oa.geo.stream(n,u($o)),[[Io,Yo],[Zo,Vo]]},n.projection=function(n){return arguments.length?(u=(e=n)?n.stream||re(n):y,t()):e},n.context=function(n){return arguments.length?(i=null==(r=n)?new Wt:new te(n),"function"!=typeof o&&i.pointRadius(o),t()):r},n.pointRadius=function(t){return arguments.length?(o="function"==typeof t?t:(i.pointRadius(+t),+t),n):o},n.projection(oa.geo.albersUsa()).context(null)},oa.geo.transform=function(n){return{stream:function(t){var e=new ue(t);for(var r in n)e[r]=n[r];return e}}},ue.prototype={point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},oa.geo.projection=ae,oa.geo.projectionMutator=oe,(oa.geo.equirectangular=function(){return ae(ce)}).raw=ce.invert=ce,oa.geo.rotation=function(n){function t(t){return t=n(t[0]*Oa,t[1]*Oa),t[0]*=Ia,t[1]*=Ia,t}return n=fe(n[0]%360*Oa,n[1]*Oa,n.length>2?n[2]*Oa:0),t.invert=function(t){return t=n.invert(t[0]*Oa,t[1]*Oa),t[0]*=Ia,t[1]*=Ia,t},t},se.invert=ce,oa.geo.circle=function(){function n(){var n="function"==typeof r?r.apply(this,arguments):r,t=fe(-n[0]*Oa,-n[1]*Oa,0).invert,u=[];return e(null,null,1,{point:function(n,e){u.push(n=t(n,e)),n[0]*=Ia,n[1]*=Ia}}),{type:"Polygon",coordinates:[u]}}var t,e,r=[0,0],u=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=ve((t=+r)*Oa,u*Oa),n):t},n.precision=function(r){return arguments.length?(e=ve(t*Oa,(u=+r)*Oa),n):u},n.angle(90)},oa.geo.distance=function(n,t){var e,r=(t[0]-n[0])*Oa,u=n[1]*Oa,i=t[1]*Oa,a=Math.sin(r),o=Math.cos(r),l=Math.sin(u),c=Math.cos(u),s=Math.sin(i),f=Math.cos(i);return Math.atan2(Math.sqrt((e=f*a)*e+(e=c*s-l*f*o)*e),l*s+c*f*o)},oa.geo.graticule=function(){function n(){return{type:"MultiLineString",coordinates:t()}}function t(){return oa.range(Math.ceil(i/d)*d,u,d).map(h).concat(oa.range(Math.ceil(c/m)*m,l,m).map(g)).concat(oa.range(Math.ceil(r/p)*p,e,p).filter(function(n){return Ma(n%d)>Da}).map(s)).concat(oa.range(Math.ceil(o/v)*v,a,v).filter(function(n){return Ma(n%m)>Da}).map(f))}var e,r,u,i,a,o,l,c,s,f,h,g,p=10,v=p,d=90,m=360,y=2.5;return n.lines=function(){return t().map(function(n){return{type:"LineString",coordinates:n}})},n.outline=function(){return{type:"Polygon",coordinates:[h(i).concat(g(l).slice(1),h(u).reverse().slice(1),g(c).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(i=+t[0][0],u=+t[1][0],c=+t[0][1],l=+t[1][1],i>u&&(t=i,i=u,u=t),c>l&&(t=c,c=l,l=t),n.precision(y)):[[i,c],[u,l]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],o=+t[0][1],a=+t[1][1],r>e&&(t=r,r=e,e=t),o>a&&(t=o,o=a,a=t),n.precision(y)):[[r,o],[e,a]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(d=+t[0],m=+t[1],n):[d,m]},n.minorStep=function(t){return arguments.length?(p=+t[0],v=+t[1],n):[p,v]},n.precision=function(t){return arguments.length?(y=+t,s=me(o,a,90),f=ye(r,e,y),h=me(c,l,90),g=ye(i,u,y),n):y},n.majorExtent([[-180,-90+Da],[180,90-Da]]).minorExtent([[-180,-80-Da],[180,80+Da]])},oa.geo.greatArc=function(){function n(){return{type:"LineString",coordinates:[t||r.apply(this,arguments),e||u.apply(this,arguments)]}}var t,e,r=Me,u=xe;return n.distance=function(){return oa.geo.distance(t||r.apply(this,arguments),e||u.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t="function"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(u=t,e="function"==typeof t?null:t,n):u},n.precision=function(){return arguments.length?n:0},n},oa.geo.interpolate=function(n,t){return be(n[0]*Oa,n[1]*Oa,t[0]*Oa,t[1]*Oa)},oa.geo.length=function(n){return Wo=0,oa.geo.stream(n,Jo),Wo};var Wo,Jo={sphere:b,point:b,lineStart:_e,lineEnd:b,polygonStart:b,polygonEnd:b},Go=we(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});(oa.geo.azimuthalEqualArea=function(){return ae(Go)}).raw=Go;var Ko=we(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},y);(oa.geo.azimuthalEquidistant=function(){return ae(Ko)}).raw=Ko,(oa.geo.conicConformal=function(){return Vt(Se)}).raw=Se,(oa.geo.conicEquidistant=function(){return Vt(ke)}).raw=ke;var Qo=we(function(n){return 1/n},Math.atan);(oa.geo.gnomonic=function(){return ae(Qo)}).raw=Qo,Ne.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-Ha]},(oa.geo.mercator=function(){return Ee(Ne)}).raw=Ne;var nl=we(function(){return 1},Math.asin);(oa.geo.orthographic=function(){return ae(nl)}).raw=nl;var tl=we(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});(oa.geo.stereographic=function(){return ae(tl)}).raw=tl,Ae.invert=function(n,t){return[-t,2*Math.atan(Math.exp(n))-Ha]},(oa.geo.transverseMercator=function(){var n=Ee(Ae),t=n.center,e=n.rotate;return n.center=function(n){return n?t([-n[1],n[0]]):(n=t(),[n[1],-n[0]])},n.rotate=function(n){return n?e([n[0],n[1],n.length>2?n[2]+90:90]):(n=e(),[n[0],n[1],n[2]-90])},e([0,0,90])}).raw=Ae,oa.geom={},oa.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,u=En(e),i=En(r),a=n.length,o=[],l=[];for(t=0;a>t;t++)o.push([+u.call(this,n[t],t),+i.call(this,n[t],t),t]);for(o.sort(qe),t=0;a>t;t++)l.push([o[t][0],-o[t][1]]);var c=Le(o),s=Le(l),f=s[0]===c[0],h=s[s.length-1]===c[c.length-1],g=[];for(t=c.length-1;t>=0;--t)g.push(n[o[c[t]][2]]);for(t=+f;t<s.length-h;++t)g.push(n[o[s[t]][2]]);return g}var e=Ce,r=ze;return arguments.length?t(n):(t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t)},oa.geom.polygon=function(n){return Sa(n,el),n};var el=oa.geom.polygon.prototype=[];el.area=function(){for(var n,t=-1,e=this.length,r=this[e-1],u=0;++t<e;)n=r,r=this[t],u+=n[1]*r[0]-n[0]*r[1];return.5*u},el.centroid=function(n){var t,e,r=-1,u=this.length,i=0,a=0,o=this[u-1];for(arguments.length||(n=-1/(6*this.area()));++r<u;)t=o,o=this[r],e=t[0]*o[1]-o[0]*t[1],i+=(t[0]+o[0])*e,a+=(t[1]+o[1])*e;return[i*n,a*n]},el.clip=function(n){for(var t,e,r,u,i,a,o=De(n),l=-1,c=this.length-De(this),s=this[c-1];++l<c;){for(t=n.slice(),n.length=0,u=this[l],i=t[(r=t.length-o)-1],e=-1;++e<r;)a=t[e],Te(a,s,u)?(Te(i,s,u)||n.push(Re(i,a,s,u)),n.push(a)):Te(i,s,u)&&n.push(Re(i,a,s,u)),i=a;o&&n.push(n[0]),s=u}return n};var rl,ul,il,al,ol,ll=[],cl=[];Ye.prototype.prepare=function(){for(var n,t=this.edges,e=t.length;e--;)n=t[e].edge,n.b&&n.a||t.splice(e,1);return t.sort(Ve),t.length},tr.prototype={start:function(){return this.edge.l===this.site?this.edge.a:this.edge.b},end:function(){return this.edge.l===this.site?this.edge.b:this.edge.a}},er.prototype={insert:function(n,t){var e,r,u;if(n){if(t.P=n,t.N=n.N,n.N&&(n.N.P=t),n.N=t,n.R){for(n=n.R;n.L;)n=n.L;n.L=t}else n.R=t;e=n}else this._?(n=ar(this._),t.P=null,t.N=n,n.P=n.L=t,e=n):(t.P=t.N=null,this._=t,e=null);for(t.L=t.R=null,t.U=e,t.C=!0,n=t;e&&e.C;)r=e.U,e===r.L?(u=r.R,u&&u.C?(e.C=u.C=!1,r.C=!0,n=r):(n===e.R&&(ur(this,e),n=e,e=n.U),e.C=!1,r.C=!0,ir(this,r))):(u=r.L,u&&u.C?(e.C=u.C=!1,r.C=!0,n=r):(n===e.L&&(ir(this,e),n=e,e=n.U),e.C=!1,r.C=!0,ur(this,r))),e=n.U;this._.C=!1},remove:function(n){n.N&&(n.N.P=n.P),n.P&&(n.P.N=n.N),n.N=n.P=null;var t,e,r,u=n.U,i=n.L,a=n.R;if(e=i?a?ar(a):i:a,u?u.L===n?u.L=e:u.R=e:this._=e,i&&a?(r=e.C,e.C=n.C,e.L=i,i.U=e,e!==a?(u=e.U,e.U=n.U,n=e.R,u.L=n,e.R=a,a.U=e):(e.U=u,u=e,n=e.R)):(r=n.C,n=e),n&&(n.U=u),!r){if(n&&n.C)return void(n.C=!1);do{if(n===this._)break;if(n===u.L){if(t=u.R,t.C&&(t.C=!1,u.C=!0,ur(this,u),t=u.R),t.L&&t.L.C||t.R&&t.R.C){t.R&&t.R.C||(t.L.C=!1,t.C=!0,ir(this,t),t=u.R),t.C=u.C,u.C=t.R.C=!1,ur(this,u),n=this._;break}}else if(t=u.L,t.C&&(t.C=!1,u.C=!0,ir(this,u),t=u.L),t.L&&t.L.C||t.R&&t.R.C){t.L&&t.L.C||(t.R.C=!1,t.C=!0,ur(this,t),t=u.L),t.C=u.C,u.C=t.L.C=!1,ir(this,u),n=this._;break}t.C=!0,n=u,u=u.U}while(!n.C);n&&(n.C=!1)}}},oa.geom.voronoi=function(n){function t(n){var t=new Array(n.length),r=o[0][0],u=o[0][1],i=o[1][0],a=o[1][1];return or(e(n),o).cells.forEach(function(e,o){var l=e.edges,c=e.site,s=t[o]=l.length?l.map(function(n){var t=n.start();return[t.x,t.y]}):c.x>=r&&c.x<=i&&c.y>=u&&c.y<=a?[[r,a],[i,a],[i,u],[r,u]]:[];s.point=n[o]}),t}function e(n){return n.map(function(n,t){return{x:Math.round(i(n,t)/Da)*Da,y:Math.round(a(n,t)/Da)*Da,i:t}})}var r=Ce,u=ze,i=r,a=u,o=sl;return n?t(n):(t.links=function(n){return or(e(n)).edges.filter(function(n){return n.l&&n.r}).map(function(t){return{source:n[t.l.i],target:n[t.r.i]}})},t.triangles=function(n){var t=[];return or(e(n)).cells.forEach(function(e,r){for(var u,i,a=e.site,o=e.edges.sort(Ve),l=-1,c=o.length,s=o[c-1].edge,f=s.l===a?s.r:s.l;++l<c;)u=s,i=f,s=o[l].edge,f=s.l===a?s.r:s.l,r<i.i&&r<f.i&&cr(a,i,f)<0&&t.push([n[r],n[i.i],n[f.i]])}),t},t.x=function(n){return arguments.length?(i=En(r=n),t):r},t.y=function(n){return arguments.length?(a=En(u=n),t):u},t.clipExtent=function(n){return arguments.length?(o=null==n?sl:n,t):o===sl?null:o},t.size=function(n){return arguments.length?t.clipExtent(n&&[[0,0],n]):o===sl?null:o&&o[1]},t)};var sl=[[-1e6,-1e6],[1e6,1e6]];oa.geom.delaunay=function(n){return oa.geom.voronoi().triangles(n)},oa.geom.quadtree=function(n,t,e,r,u){function i(n){function i(n,t,e,r,u,i,a,o){if(!isNaN(e)&&!isNaN(r))if(n.leaf){var l=n.x,s=n.y;if(null!=l)if(Ma(l-e)+Ma(s-r)<.01)c(n,t,e,r,u,i,a,o);else{var f=n.point;n.x=n.y=n.point=null,c(n,f,l,s,u,i,a,o),c(n,t,e,r,u,i,a,o)}else n.x=e,n.y=r,n.point=t}else c(n,t,e,r,u,i,a,o)}function c(n,t,e,r,u,a,o,l){var c=.5*(u+o),s=.5*(a+l),f=e>=c,h=r>=s,g=h<<1|f;n.leaf=!1,n=n.nodes[g]||(n.nodes[g]=hr()),f?u=c:o=c,h?a=s:l=s,i(n,t,e,r,u,a,o,l)}var s,f,h,g,p,v,d,m,y,M=En(o),x=En(l);if(null!=t)v=t,d=e,m=r,y=u;else if(m=y=-(v=d=1/0),f=[],h=[],p=n.length,a)for(g=0;p>g;++g)s=n[g],s.x<v&&(v=s.x),s.y<d&&(d=s.y),s.x>m&&(m=s.x),s.y>y&&(y=s.y),f.push(s.x),h.push(s.y);else for(g=0;p>g;++g){var b=+M(s=n[g],g),_=+x(s,g);v>b&&(v=b),d>_&&(d=_),b>m&&(m=b),_>y&&(y=_),f.push(b),h.push(_)}var w=m-v,S=y-d;w>S?y=d+w:m=v+S;var k=hr();if(k.add=function(n){i(k,n,+M(n,++g),+x(n,g),v,d,m,y)},k.visit=function(n){gr(n,k,v,d,m,y)},k.find=function(n){return pr(k,n[0],n[1],v,d,m,y)},g=-1,null==t){for(;++g<p;)i(k,n[g],f[g],h[g],v,d,m,y);--g}else n.forEach(k.add);return f=h=n=s=null,k}var a,o=Ce,l=ze;return(a=arguments.length)?(o=sr,l=fr,3===a&&(u=e,r=t,e=t=0),i(n)):(i.x=function(n){return arguments.length?(o=n,i):o},i.y=function(n){return arguments.length?(l=n,i):l},i.extent=function(n){return arguments.length?(null==n?t=e=r=u=null:(t=+n[0][0],e=+n[0][1],r=+n[1][0],u=+n[1][1]),i):null==t?null:[[t,e],[r,u]]},i.size=function(n){return arguments.length?(null==n?t=e=r=u=null:(t=e=0,r=+n[0],u=+n[1]),i):null==t?null:[r-t,u-e]},i)},oa.interpolateRgb=vr,oa.interpolateObject=dr,oa.interpolateNumber=mr,oa.interpolateString=yr;var fl=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,hl=new RegExp(fl.source,"g");oa.interpolate=Mr,oa.interpolators=[function(n,t){var e=typeof t;return("string"===e?ro.has(t.toLowerCase())||/^(#|rgb\(|hsl\()/i.test(t)?vr:yr:t instanceof on?vr:Array.isArray(t)?xr:"object"===e&&isNaN(t)?dr:mr)(n,t)}],oa.interpolateArray=xr;var gl=function(){return y},pl=oa.map({linear:gl,poly:Er,quad:function(){return Sr},cubic:function(){return kr},sin:function(){return Ar},exp:function(){return Cr},circle:function(){return zr},elastic:Lr,back:qr,bounce:function(){return Tr}}),vl=oa.map({"in":y,out:_r,"in-out":wr,"out-in":function(n){return wr(_r(n))}});oa.ease=function(n){var t=n.indexOf("-"),e=t>=0?n.slice(0,t):n,r=t>=0?n.slice(t+1):"in";return e=pl.get(e)||gl,r=vl.get(r)||y,br(r(e.apply(null,la.call(arguments,1))))},oa.interpolateHcl=Rr,oa.interpolateHsl=Dr,oa.interpolateLab=Pr,oa.interpolateRound=jr,oa.transform=function(n){var t=sa.createElementNS(oa.ns.prefix.svg,"g");return(oa.transform=function(n){if(null!=n){t.setAttribute("transform",n);var e=t.transform.baseVal.consolidate()}return new Ur(e?e.matrix:dl)})(n)},Ur.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var dl={a:1,b:0,c:0,d:1,e:0,f:0};oa.interpolateTransform=$r,oa.layout={},oa.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++e<r;)t.push(Jr(n[e]));return t}},oa.layout.chord=function(){function n(){var n,c,f,h,g,p={},v=[],d=oa.range(i),m=[];for(e=[],r=[],n=0,h=-1;++h<i;){for(c=0,g=-1;++g<i;)c+=u[h][g];v.push(c),m.push(oa.range(i)),n+=c}for(a&&d.sort(function(n,t){return a(v[n],v[t])}),o&&m.forEach(function(n,t){n.sort(function(n,e){return o(u[t][n],u[t][e])})}),n=(Ua-s*i)/n,c=0,h=-1;++h<i;){for(f=c,g=-1;++g<i;){var y=d[h],M=m[y][g],x=u[y][M],b=c,_=c+=x*n;p[y+"-"+M]={index:y,subindex:M,startAngle:b,endAngle:_,value:x}}r[y]={index:y,startAngle:f,endAngle:c,value:(c-f)/n},c+=s}for(h=-1;++h<i;)for(g=h-1;++g<i;){var w=p[h+"-"+g],S=p[g+"-"+h];(w.value||S.value)&&e.push(w.value<S.value?{source:S,target:w}:{source:w,target:S})}l&&t()}function t(){e.sort(function(n,t){return l((n.source.value+n.target.value)/2,(t.source.value+t.target.value)/2)})}var e,r,u,i,a,o,l,c={},s=0;return c.matrix=function(n){return arguments.length?(i=(u=n)&&u.length,e=r=null,c):u},c.padding=function(n){return arguments.length?(s=n,e=r=null,c):s},c.sortGroups=function(n){return arguments.length?(a=n,e=r=null,c):a},c.sortSubgroups=function(n){return arguments.length?(o=n,e=null,c):o},c.sortChords=function(n){return arguments.length?(l=n,e&&t(),c):l},c.chords=function(){return e||n(),e},c.groups=function(){return r||n(),r},c},oa.layout.force=function(){function n(n){return function(t,e,r,u){if(t.point!==n){var i=t.cx-n.x,a=t.cy-n.y,o=u-e,l=i*i+a*a;if(l>o*o/m){if(v>l){var c=t.charge/l;n.px-=i*c,n.py-=a*c}return!0}if(t.point&&l&&v>l){var c=t.pointCharge/l;n.px-=i*c,n.py-=a*c}}return!t.charge}}function t(n){n.px=oa.event.x,n.py=oa.event.y,l.resume()}var e,r,u,i,a,o,l={},c=oa.dispatch("start","tick","end"),s=[1,1],f=.9,h=ml,g=yl,p=-30,v=Ml,d=.1,m=.64,M=[],x=[];return l.tick=function(){if((u*=.99)<.005)return e=null,c.end({type:"end",alpha:u=0}),!0;var t,r,l,h,g,v,m,y,b,_=M.length,w=x.length;for(r=0;w>r;++r)l=x[r],h=l.source,g=l.target,y=g.x-h.x,b=g.y-h.y,(v=y*y+b*b)&&(v=u*a[r]*((v=Math.sqrt(v))-i[r])/v,y*=v,b*=v,g.x-=y*(m=h.weight+g.weight?h.weight/(h.weight+g.weight):.5),g.y-=b*m,h.x+=y*(m=1-m),h.y+=b*m);if((m=u*d)&&(y=s[0]/2,b=s[1]/2,r=-1,m))for(;++r<_;)l=M[r],l.x+=(y-l.x)*m,l.y+=(b-l.y)*m;if(p)for(ru(t=oa.geom.quadtree(M),u,o),r=-1;++r<_;)(l=M[r]).fixed||t.visit(n(l));for(r=-1;++r<_;)l=M[r],l.fixed?(l.x=l.px,l.y=l.py):(l.x-=(l.px-(l.px=l.x))*f,l.y-=(l.py-(l.py=l.y))*f);c.tick({type:"tick",alpha:u})},l.nodes=function(n){return arguments.length?(M=n,l):M},l.links=function(n){return arguments.length?(x=n,l):x},l.size=function(n){return arguments.length?(s=n,l):s},l.linkDistance=function(n){return arguments.length?(h="function"==typeof n?n:+n,l):h},l.distance=l.linkDistance,l.linkStrength=function(n){return arguments.length?(g="function"==typeof n?n:+n,l):g},l.friction=function(n){return arguments.length?(f=+n,l):f},l.charge=function(n){return arguments.length?(p="function"==typeof n?n:+n,l):p},l.chargeDistance=function(n){return arguments.length?(v=n*n,l):Math.sqrt(v)},l.gravity=function(n){return arguments.length?(d=+n,l):d},l.theta=function(n){return arguments.length?(m=n*n,l):Math.sqrt(m)},l.alpha=function(n){return arguments.length?(n=+n,u?n>0?u=n:(e.c=null,e.t=NaN,e=null,c.start({type:"end",alpha:u=0})):n>0&&(c.start({type:"start",alpha:u=n}),e=qn(l.tick)),l):u},l.start=function(){function n(n,r){if(!e){for(e=new Array(u),l=0;u>l;++l)e[l]=[];for(l=0;c>l;++l){var i=x[l];e[i.source.index].push(i.target),e[i.target.index].push(i.source)}}for(var a,o=e[t],l=-1,s=o.length;++l<s;)if(!isNaN(a=o[l][n]))return a;return Math.random()*r}var t,e,r,u=M.length,c=x.length,f=s[0],v=s[1];for(t=0;u>t;++t)(r=M[t]).index=t,r.weight=0;for(t=0;c>t;++t)r=x[t],"number"==typeof r.source&&(r.source=M[r.source]),"number"==typeof r.target&&(r.target=M[r.target]),++r.source.weight,++r.target.weight;for(t=0;u>t;++t)r=M[t],isNaN(r.x)&&(r.x=n("x",f)),isNaN(r.y)&&(r.y=n("y",v)),isNaN(r.px)&&(r.px=r.x),isNaN(r.py)&&(r.py=r.y);if(i=[],"function"==typeof h)for(t=0;c>t;++t)i[t]=+h.call(this,x[t],t);else for(t=0;c>t;++t)i[t]=h;if(a=[],"function"==typeof g)for(t=0;c>t;++t)a[t]=+g.call(this,x[t],t);else for(t=0;c>t;++t)a[t]=g;if(o=[],"function"==typeof p)for(t=0;u>t;++t)o[t]=+p.call(this,M[t],t);else for(t=0;u>t;++t)o[t]=p;return l.resume()},l.resume=function(){return l.alpha(.1)},l.stop=function(){return l.alpha(0)},l.drag=function(){return r||(r=oa.behavior.drag().origin(y).on("dragstart.force",Qr).on("drag.force",t).on("dragend.force",nu)),arguments.length?void this.on("mouseover.force",tu).on("mouseout.force",eu).call(r):r},oa.rebind(l,c,"on")};var ml=20,yl=1,Ml=1/0;oa.layout.hierarchy=function(){function n(u){var i,a=[u],o=[];for(u.depth=0;null!=(i=a.pop());)if(o.push(i),(c=e.call(n,i,i.depth))&&(l=c.length)){for(var l,c,s;--l>=0;)a.push(s=c[l]),s.parent=i,s.depth=i.depth+1;r&&(i.value=0),i.children=c}else r&&(i.value=+r.call(n,i,i.depth)||0),delete i.children;return au(u,function(n){var e,u;t&&(e=n.children)&&e.sort(t),r&&(u=n.parent)&&(u.value+=n.value)}),o}var t=cu,e=ou,r=lu;return n.sort=function(e){return arguments.length?(t=e,n):t},n.children=function(t){return arguments.length?(e=t,n):e},n.value=function(t){return arguments.length?(r=t,n):r},n.revalue=function(t){return r&&(iu(t,function(n){n.children&&(n.value=0)}),au(t,function(t){var e;t.children||(t.value=+r.call(n,t,t.depth)||0),(e=t.parent)&&(e.value+=t.value)})),t},n},oa.layout.partition=function(){function n(t,e,r,u){var i=t.children;if(t.x=e,t.y=t.depth*u,t.dx=r,t.dy=u,i&&(a=i.length)){var a,o,l,c=-1;for(r=t.value?r/t.value:0;++c<a;)n(o=i[c],e,l=o.value*r,u),e+=l}}function t(n){var e=n.children,r=0;if(e&&(u=e.length))for(var u,i=-1;++i<u;)r=Math.max(r,t(e[i]));return 1+r}function e(e,i){var a=r.call(this,e,i);return n(a[0],0,u[0],u[1]/t(a[0])),a}var r=oa.layout.hierarchy(),u=[1,1];return e.size=function(n){return arguments.length?(u=n,e):u},uu(e,r)},oa.layout.pie=function(){function n(a){var o,l=a.length,c=a.map(function(e,r){return+t.call(n,e,r)}),s=+("function"==typeof r?r.apply(this,arguments):r),f=("function"==typeof u?u.apply(this,arguments):u)-s,h=Math.min(Math.abs(f)/l,+("function"==typeof i?i.apply(this,arguments):i)),g=h*(0>f?-1:1),p=oa.sum(c),v=p?(f-l*g)/p:0,d=oa.range(l),m=[];return null!=e&&d.sort(e===xl?function(n,t){return c[t]-c[n]}:function(n,t){return e(a[n],a[t])}),d.forEach(function(n){m[n]={data:a[n],value:o=c[n],startAngle:s,endAngle:s+=o*v+g,padAngle:h}}),m}var t=Number,e=xl,r=0,u=Ua,i=0;return n.value=function(e){return arguments.length?(t=e,n):t},n.sort=function(t){return arguments.length?(e=t,n):e},n.startAngle=function(t){return arguments.length?(r=t,n):r},n.endAngle=function(t){return arguments.length?(u=t,n):u},n.padAngle=function(t){return arguments.length?(i=t,n):i},n};var xl={};oa.layout.stack=function(){function n(o,l){if(!(h=o.length))return o;var c=o.map(function(e,r){return t.call(n,e,r)}),s=c.map(function(t){return t.map(function(t,e){return[i.call(n,t,e),a.call(n,t,e)]})}),f=e.call(n,s,l);c=oa.permute(c,f),s=oa.permute(s,f);var h,g,p,v,d=r.call(n,s,l),m=c[0].length;for(p=0;m>p;++p)for(u.call(n,c[0][p],v=d[p],s[0][p][1]),g=1;h>g;++g)u.call(n,c[g][p],v+=s[g-1][p][1],s[g][p][1]);return o}var t=y,e=pu,r=vu,u=gu,i=fu,a=hu;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e="function"==typeof t?t:bl.get(t)||pu,n):e},n.offset=function(t){return arguments.length?(r="function"==typeof t?t:_l.get(t)||vu,n):r},n.x=function(t){return arguments.length?(i=t,n):i},n.y=function(t){return arguments.length?(a=t,n):a},n.out=function(t){return arguments.length?(u=t,n):u},n};var bl=oa.map({"inside-out":function(n){var t,e,r=n.length,u=n.map(du),i=n.map(mu),a=oa.range(r).sort(function(n,t){return u[n]-u[t]}),o=0,l=0,c=[],s=[];for(t=0;r>t;++t)e=a[t],l>o?(o+=i[e],c.push(e)):(l+=i[e],s.push(e));return s.reverse().concat(c)},reverse:function(n){return oa.range(n.length).reverse()},"default":pu}),_l=oa.map({silhouette:function(n){var t,e,r,u=n.length,i=n[0].length,a=[],o=0,l=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];r>o&&(o=r),a.push(r)}for(e=0;i>e;++e)l[e]=(o-a[e])/2;return l},wiggle:function(n){var t,e,r,u,i,a,o,l,c,s=n.length,f=n[0],h=f.length,g=[];for(g[0]=l=c=0,e=1;h>e;++e){for(t=0,u=0;s>t;++t)u+=n[t][e][1];for(t=0,i=0,o=f[e][0]-f[e-1][0];s>t;++t){for(r=0,a=(n[t][e][1]-n[t][e-1][1])/(2*o);t>r;++r)a+=(n[r][e][1]-n[r][e-1][1])/o;i+=a*n[t][e][1]}g[e]=l-=u?i/u*o:0,c>l&&(c=l)}for(e=0;h>e;++e)g[e]-=c;return g},expand:function(n){var t,e,r,u=n.length,i=n[0].length,a=1/u,o=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];if(r)for(t=0;u>t;t++)n[t][e][1]/=r;else for(t=0;u>t;t++)n[t][e][1]=a}for(e=0;i>e;++e)o[e]=0;return o},zero:vu});oa.layout.histogram=function(){function n(n,i){for(var a,o,l=[],c=n.map(e,this),s=r.call(this,c,i),f=u.call(this,s,c,i),i=-1,h=c.length,g=f.length-1,p=t?1:1/h;++i<g;)a=l[i]=[],a.dx=f[i+1]-(a.x=f[i]),a.y=0;if(g>0)for(i=-1;++i<h;)o=c[i],o>=s[0]&&o<=s[1]&&(a=l[oa.bisect(f,o,1,g)-1],a.y+=p,a.push(n[i]));return l}var t=!0,e=Number,r=bu,u=Mu;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=En(t),n):r},n.bins=function(t){return arguments.length?(u="number"==typeof t?function(n){return xu(n,t)}:En(t),n):u},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},oa.layout.pack=function(){function n(n,i){var a=e.call(this,n,i),o=a[0],l=u[0],c=u[1],s=null==t?Math.sqrt:"function"==typeof t?t:function(){return t};if(o.x=o.y=0,au(o,function(n){n.r=+s(n.value)}),au(o,Nu),r){var f=r*(t?1:Math.max(2*o.r/l,2*o.r/c))/2;au(o,function(n){n.r+=f}),au(o,Nu),au(o,function(n){n.r-=f})}return Cu(o,l/2,c/2,t?1:1/Math.max(2*o.r/l,2*o.r/c)),a}var t,e=oa.layout.hierarchy().sort(_u),r=0,u=[1,1];return n.size=function(t){return arguments.length?(u=t,n):u},n.radius=function(e){return arguments.length?(t=null==e||"function"==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},uu(n,e)},oa.layout.tree=function(){function n(n,u){var s=a.call(this,n,u),f=s[0],h=t(f);if(au(h,e),h.parent.m=-h.z,iu(h,r),c)iu(f,i);else{var g=f,p=f,v=f;iu(f,function(n){n.x<g.x&&(g=n),n.x>p.x&&(p=n),n.depth>v.depth&&(v=n)});var d=o(g,p)/2-g.x,m=l[0]/(p.x+o(p,g)/2+d),y=l[1]/(v.depth||1);iu(f,function(n){n.x=(n.x+d)*m,n.y=n.depth*y})}return s}function t(n){for(var t,e={A:null,children:[n]},r=[e];null!=(t=r.pop());)for(var u,i=t.children,a=0,o=i.length;o>a;++a)r.push((i[a]=u={_:i[a],parent:t,children:(u=i[a].children)&&u.slice()||[],A:null,a:null,z:0,m:0,c:0,s:0,t:null,i:a}).a=u);return e.children[0]}function e(n){var t=n.children,e=n.parent.children,r=n.i?e[n.i-1]:null;if(t.length){Du(n);var i=(t[0].z+t[t.length-1].z)/2;r?(n.z=r.z+o(n._,r._),n.m=n.z-i):n.z=i}else r&&(n.z=r.z+o(n._,r._));n.parent.A=u(n,r,n.parent.A||e[0])}function r(n){n._.x=n.z+n.parent.m,n.m+=n.parent.m}function u(n,t,e){if(t){for(var r,u=n,i=n,a=t,l=u.parent.children[0],c=u.m,s=i.m,f=a.m,h=l.m;a=Tu(a),u=qu(u),a&&u;)l=qu(l),i=Tu(i),i.a=n,r=a.z+f-u.z-c+o(a._,u._),r>0&&(Ru(Pu(a,n,e),n,r),c+=r,s+=r),f+=a.m,c+=u.m,h+=l.m,s+=i.m;a&&!Tu(i)&&(i.t=a,i.m+=f-s),u&&!qu(l)&&(l.t=u,l.m+=c-h,e=n)}return e}function i(n){n.x*=l[0],n.y=n.depth*l[1]}var a=oa.layout.hierarchy().sort(null).value(null),o=Lu,l=[1,1],c=null;return n.separation=function(t){return arguments.length?(o=t,n):o},n.size=function(t){return arguments.length?(c=null==(l=t)?i:null,n):c?null:l},n.nodeSize=function(t){return arguments.length?(c=null==(l=t)?null:i,n):c?l:null},uu(n,a)},oa.layout.cluster=function(){function n(n,i){var a,o=t.call(this,n,i),l=o[0],c=0;au(l,function(n){var t=n.children;t&&t.length?(n.x=Uu(t),n.y=ju(t)):(n.x=a?c+=e(n,a):0,n.y=0,a=n)});var s=Fu(l),f=Hu(l),h=s.x-e(s,f)/2,g=f.x+e(f,s)/2;return au(l,u?function(n){n.x=(n.x-l.x)*r[0],n.y=(l.y-n.y)*r[1]}:function(n){n.x=(n.x-h)/(g-h)*r[0],n.y=(1-(l.y?n.y/l.y:1))*r[1]}),o}var t=oa.layout.hierarchy().sort(null).value(null),e=Lu,r=[1,1],u=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(u=null==(r=t),n):u?null:r},n.nodeSize=function(t){return arguments.length?(u=null!=(r=t),n):u?r:null},uu(n,t)},oa.layout.treemap=function(){function n(n,t){for(var e,r,u=-1,i=n.length;++u<i;)r=(e=n[u]).value*(0>t?0:t),e.area=isNaN(r)||0>=r?0:r}function t(e){var i=e.children;if(i&&i.length){var a,o,l,c=f(e),s=[],h=i.slice(),p=1/0,v="slice"===g?c.dx:"dice"===g?c.dy:"slice-dice"===g?1&e.depth?c.dy:c.dx:Math.min(c.dx,c.dy);for(n(h,c.dx*c.dy/e.value),s.area=0;(l=h.length)>0;)s.push(a=h[l-1]),s.area+=a.area,"squarify"!==g||(o=r(s,v))<=p?(h.pop(),p=o):(s.area-=s.pop().area,u(s,v,c,!1),v=Math.min(c.dx,c.dy),s.length=s.area=0,p=1/0);s.length&&(u(s,v,c,!0),s.length=s.area=0),i.forEach(t)}}function e(t){var r=t.children;if(r&&r.length){var i,a=f(t),o=r.slice(),l=[];for(n(o,a.dx*a.dy/t.value),l.area=0;i=o.pop();)l.push(i),l.area+=i.area,null!=i.z&&(u(l,i.z?a.dx:a.dy,a,!o.length),l.length=l.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,u=0,i=1/0,a=-1,o=n.length;++a<o;)(e=n[a].area)&&(i>e&&(i=e),e>u&&(u=e));return r*=r,t*=t,r?Math.max(t*u*p/r,r/(t*i*p)):1/0}function u(n,t,e,r){var u,i=-1,a=n.length,o=e.x,c=e.y,s=t?l(n.area/t):0;
-if(t==e.dx){for((r||s>e.dy)&&(s=e.dy);++i<a;)u=n[i],u.x=o,u.y=c,u.dy=s,o+=u.dx=Math.min(e.x+e.dx-o,s?l(u.area/s):0);u.z=!0,u.dx+=e.x+e.dx-o,e.y+=s,e.dy-=s}else{for((r||s>e.dx)&&(s=e.dx);++i<a;)u=n[i],u.x=o,u.y=c,u.dx=s,c+=u.dy=Math.min(e.y+e.dy-c,s?l(u.area/s):0);u.z=!1,u.dy+=e.y+e.dy-c,e.x+=s,e.dx-=s}}function i(r){var u=a||o(r),i=u[0];return i.x=i.y=0,i.value?(i.dx=c[0],i.dy=c[1]):i.dx=i.dy=0,a&&o.revalue(i),n([i],i.dx*i.dy/i.value),(a?e:t)(i),h&&(a=u),u}var a,o=oa.layout.hierarchy(),l=Math.round,c=[1,1],s=null,f=Ou,h=!1,g="squarify",p=.5*(1+Math.sqrt(5));return i.size=function(n){return arguments.length?(c=n,i):c},i.padding=function(n){function t(t){var e=n.call(i,t,t.depth);return null==e?Ou(t):Iu(t,"number"==typeof e?[e,e,e,e]:e)}function e(t){return Iu(t,n)}if(!arguments.length)return s;var r;return f=null==(s=n)?Ou:"function"==(r=typeof n)?t:"number"===r?(n=[n,n,n,n],e):e,i},i.round=function(n){return arguments.length?(l=n?Math.round:Number,i):l!=Number},i.sticky=function(n){return arguments.length?(h=n,a=null,i):h},i.ratio=function(n){return arguments.length?(p=n,i):p},i.mode=function(n){return arguments.length?(g=n+"",i):g},uu(i,o)},oa.random={normal:function(n,t){var e=arguments.length;return 2>e&&(t=1),1>e&&(n=0),function(){var e,r,u;do e=2*Math.random()-1,r=2*Math.random()-1,u=e*e+r*r;while(!u||u>1);return n+t*e*Math.sqrt(-2*Math.log(u)/u)}},logNormal:function(){var n=oa.random.normal.apply(oa,arguments);return function(){return Math.exp(n())}},bates:function(n){var t=oa.random.irwinHall(n);return function(){return t()/n}},irwinHall:function(n){return function(){for(var t=0,e=0;n>e;e++)t+=Math.random();return t}}},oa.scale={};var wl={floor:y,ceil:y};oa.scale.linear=function(){return Wu([0,1],[0,1],Mr,!1)};var Sl={s:1,g:1,p:1,r:1,e:1};oa.scale.log=function(){return ri(oa.scale.linear().domain([0,1]),10,!0,[1,10])};var kl=oa.format(".0e"),Nl={floor:function(n){return-Math.ceil(-n)},ceil:function(n){return-Math.floor(-n)}};oa.scale.pow=function(){return ui(oa.scale.linear(),1,[0,1])},oa.scale.sqrt=function(){return oa.scale.pow().exponent(.5)},oa.scale.ordinal=function(){return ai([],{t:"range",a:[[]]})},oa.scale.category10=function(){return oa.scale.ordinal().range(El)},oa.scale.category20=function(){return oa.scale.ordinal().range(Al)},oa.scale.category20b=function(){return oa.scale.ordinal().range(Cl)},oa.scale.category20c=function(){return oa.scale.ordinal().range(zl)};var El=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(xn),Al=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(xn),Cl=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(xn),zl=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(xn);oa.scale.quantile=function(){return oi([],[])},oa.scale.quantize=function(){return li(0,1,[0,1])},oa.scale.threshold=function(){return ci([.5],[0,1])},oa.scale.identity=function(){return si([0,1])},oa.svg={},oa.svg.arc=function(){function n(){var n=Math.max(0,+e.apply(this,arguments)),c=Math.max(0,+r.apply(this,arguments)),s=a.apply(this,arguments)-Ha,f=o.apply(this,arguments)-Ha,h=Math.abs(f-s),g=s>f?0:1;if(n>c&&(p=c,c=n,n=p),h>=Fa)return t(c,g)+(n?t(n,1-g):"")+"Z";var p,v,d,m,y,M,x,b,_,w,S,k,N=0,E=0,A=[];if((m=(+l.apply(this,arguments)||0)/2)&&(d=i===Ll?Math.sqrt(n*n+c*c):+i.apply(this,arguments),g||(E*=-1),c&&(E=tn(d/c*Math.sin(m))),n&&(N=tn(d/n*Math.sin(m)))),c){y=c*Math.cos(s+E),M=c*Math.sin(s+E),x=c*Math.cos(f-E),b=c*Math.sin(f-E);var C=Math.abs(f-s-2*E)<=ja?0:1;if(E&&mi(y,M,x,b)===g^C){var z=(s+f)/2;y=c*Math.cos(z),M=c*Math.sin(z),x=b=null}}else y=M=0;if(n){_=n*Math.cos(f-N),w=n*Math.sin(f-N),S=n*Math.cos(s+N),k=n*Math.sin(s+N);var L=Math.abs(s-f+2*N)<=ja?0:1;if(N&&mi(_,w,S,k)===1-g^L){var q=(s+f)/2;_=n*Math.cos(q),w=n*Math.sin(q),S=k=null}}else _=w=0;if(h>Da&&(p=Math.min(Math.abs(c-n)/2,+u.apply(this,arguments)))>.001){v=c>n^g?0:1;var T=p,R=p;if(ja>h){var D=null==S?[_,w]:null==x?[y,M]:Re([y,M],[S,k],[x,b],[_,w]),P=y-D[0],j=M-D[1],U=x-D[0],F=b-D[1],H=1/Math.sin(Math.acos((P*U+j*F)/(Math.sqrt(P*P+j*j)*Math.sqrt(U*U+F*F)))/2),O=Math.sqrt(D[0]*D[0]+D[1]*D[1]);R=Math.min(p,(n-O)/(H-1)),T=Math.min(p,(c-O)/(H+1))}if(null!=x){var I=yi(null==S?[_,w]:[S,k],[y,M],c,T,g),Y=yi([x,b],[_,w],c,T,g);p===T?A.push("M",I[0],"A",T,",",T," 0 0,",v," ",I[1],"A",c,",",c," 0 ",1-g^mi(I[1][0],I[1][1],Y[1][0],Y[1][1]),",",g," ",Y[1],"A",T,",",T," 0 0,",v," ",Y[0]):A.push("M",I[0],"A",T,",",T," 0 1,",v," ",Y[0])}else A.push("M",y,",",M);if(null!=S){var Z=yi([y,M],[S,k],n,-R,g),V=yi([_,w],null==x?[y,M]:[x,b],n,-R,g);p===R?A.push("L",V[0],"A",R,",",R," 0 0,",v," ",V[1],"A",n,",",n," 0 ",g^mi(V[1][0],V[1][1],Z[1][0],Z[1][1]),",",1-g," ",Z[1],"A",R,",",R," 0 0,",v," ",Z[0]):A.push("L",V[0],"A",R,",",R," 0 0,",v," ",Z[0])}else A.push("L",_,",",w)}else A.push("M",y,",",M),null!=x&&A.push("A",c,",",c," 0 ",C,",",g," ",x,",",b),A.push("L",_,",",w),null!=S&&A.push("A",n,",",n," 0 ",L,",",1-g," ",S,",",k);return A.push("Z"),A.join("")}function t(n,t){return"M0,"+n+"A"+n+","+n+" 0 1,"+t+" 0,"+-n+"A"+n+","+n+" 0 1,"+t+" 0,"+n}var e=hi,r=gi,u=fi,i=Ll,a=pi,o=vi,l=di;return n.innerRadius=function(t){return arguments.length?(e=En(t),n):e},n.outerRadius=function(t){return arguments.length?(r=En(t),n):r},n.cornerRadius=function(t){return arguments.length?(u=En(t),n):u},n.padRadius=function(t){return arguments.length?(i=t==Ll?Ll:En(t),n):i},n.startAngle=function(t){return arguments.length?(a=En(t),n):a},n.endAngle=function(t){return arguments.length?(o=En(t),n):o},n.padAngle=function(t){return arguments.length?(l=En(t),n):l},n.centroid=function(){var n=(+e.apply(this,arguments)+ +r.apply(this,arguments))/2,t=(+a.apply(this,arguments)+ +o.apply(this,arguments))/2-Ha;return[Math.cos(t)*n,Math.sin(t)*n]},n};var Ll="auto";oa.svg.line=function(){return Mi(y)};var ql=oa.map({linear:xi,"linear-closed":bi,step:_i,"step-before":wi,"step-after":Si,basis:zi,"basis-open":Li,"basis-closed":qi,bundle:Ti,cardinal:Ei,"cardinal-open":ki,"cardinal-closed":Ni,monotone:Fi});ql.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var Tl=[0,2/3,1/3,0],Rl=[0,1/3,2/3,0],Dl=[0,1/6,2/3,1/6];oa.svg.line.radial=function(){var n=Mi(Hi);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},wi.reverse=Si,Si.reverse=wi,oa.svg.area=function(){return Oi(y)},oa.svg.area.radial=function(){var n=Oi(Hi);return n.radius=n.x,delete n.x,n.innerRadius=n.x0,delete n.x0,n.outerRadius=n.x1,delete n.x1,n.angle=n.y,delete n.y,n.startAngle=n.y0,delete n.y0,n.endAngle=n.y1,delete n.y1,n},oa.svg.chord=function(){function n(n,o){var l=t(this,i,n,o),c=t(this,a,n,o);return"M"+l.p0+r(l.r,l.p1,l.a1-l.a0)+(e(l,c)?u(l.r,l.p1,l.r,l.p0):u(l.r,l.p1,c.r,c.p0)+r(c.r,c.p1,c.a1-c.a0)+u(c.r,c.p1,l.r,l.p0))+"Z"}function t(n,t,e,r){var u=t.call(n,e,r),i=o.call(n,u,r),a=l.call(n,u,r)-Ha,s=c.call(n,u,r)-Ha;return{r:i,a0:a,a1:s,p0:[i*Math.cos(a),i*Math.sin(a)],p1:[i*Math.cos(s),i*Math.sin(s)]}}function e(n,t){return n.a0==t.a0&&n.a1==t.a1}function r(n,t,e){return"A"+n+","+n+" 0 "+ +(e>ja)+",1 "+t}function u(n,t,e,r){return"Q 0,0 "+r}var i=Me,a=xe,o=Ii,l=pi,c=vi;return n.radius=function(t){return arguments.length?(o=En(t),n):o},n.source=function(t){return arguments.length?(i=En(t),n):i},n.target=function(t){return arguments.length?(a=En(t),n):a},n.startAngle=function(t){return arguments.length?(l=En(t),n):l},n.endAngle=function(t){return arguments.length?(c=En(t),n):c},n},oa.svg.diagonal=function(){function n(n,u){var i=t.call(this,n,u),a=e.call(this,n,u),o=(i.y+a.y)/2,l=[i,{x:i.x,y:o},{x:a.x,y:o},a];return l=l.map(r),"M"+l[0]+"C"+l[1]+" "+l[2]+" "+l[3]}var t=Me,e=xe,r=Yi;return n.source=function(e){return arguments.length?(t=En(e),n):t},n.target=function(t){return arguments.length?(e=En(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},oa.svg.diagonal.radial=function(){var n=oa.svg.diagonal(),t=Yi,e=n.projection;return n.projection=function(n){return arguments.length?e(Zi(t=n)):t},n},oa.svg.symbol=function(){function n(n,r){return(Pl.get(t.call(this,n,r))||$i)(e.call(this,n,r))}var t=Xi,e=Vi;return n.type=function(e){return arguments.length?(t=En(e),n):t},n.size=function(t){return arguments.length?(e=En(t),n):e},n};var Pl=oa.map({circle:$i,cross:function(n){var t=Math.sqrt(n/5)/2;return"M"+-3*t+","+-t+"H"+-t+"V"+-3*t+"H"+t+"V"+-t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+-t+"V"+t+"H"+-3*t+"Z"},diamond:function(n){var t=Math.sqrt(n/(2*Ul)),e=t*Ul;return"M0,"+-t+"L"+e+",0 0,"+t+" "+-e+",0Z"},square:function(n){var t=Math.sqrt(n)/2;return"M"+-t+","+-t+"L"+t+","+-t+" "+t+","+t+" "+-t+","+t+"Z"},"triangle-down":function(n){var t=Math.sqrt(n/jl),e=t*jl/2;return"M0,"+e+"L"+t+","+-e+" "+-t+","+-e+"Z"},"triangle-up":function(n){var t=Math.sqrt(n/jl),e=t*jl/2;return"M0,"+-e+"L"+t+","+e+" "+-t+","+e+"Z"}});oa.svg.symbolTypes=Pl.keys();var jl=Math.sqrt(3),Ul=Math.tan(30*Oa);Aa.transition=function(n){for(var t,e,r=Fl||++Yl,u=Ki(n),i=[],a=Hl||{time:Date.now(),ease:Nr,delay:0,duration:250},o=-1,l=this.length;++o<l;){i.push(t=[]);for(var c=this[o],s=-1,f=c.length;++s<f;)(e=c[s])&&Qi(e,s,u,r,a),t.push(e)}return Wi(i,u,r)},Aa.interrupt=function(n){return this.each(null==n?Ol:Bi(Ki(n)))};var Fl,Hl,Ol=Bi(Ki()),Il=[],Yl=0;Il.call=Aa.call,Il.empty=Aa.empty,Il.node=Aa.node,Il.size=Aa.size,oa.transition=function(n,t){return n&&n.transition?Fl?n.transition(t):n:oa.selection().transition(n)},oa.transition.prototype=Il,Il.select=function(n){var t,e,r,u=this.id,i=this.namespace,a=[];n=A(n);for(var o=-1,l=this.length;++o<l;){a.push(t=[]);for(var c=this[o],s=-1,f=c.length;++s<f;)(r=c[s])&&(e=n.call(r,r.__data__,s,o))?("__data__"in r&&(e.__data__=r.__data__),Qi(e,s,i,u,r[i][u]),t.push(e)):t.push(null)}return Wi(a,i,u)},Il.selectAll=function(n){var t,e,r,u,i,a=this.id,o=this.namespace,l=[];n=C(n);for(var c=-1,s=this.length;++c<s;)for(var f=this[c],h=-1,g=f.length;++h<g;)if(r=f[h]){i=r[o][a],e=n.call(r,r.__data__,h,c),l.push(t=[]);for(var p=-1,v=e.length;++p<v;)(u=e[p])&&Qi(u,p,o,a,i),t.push(u)}return Wi(l,o,a)},Il.filter=function(n){var t,e,r,u=[];"function"!=typeof n&&(n=O(n));for(var i=0,a=this.length;a>i;i++){u.push(t=[]);for(var e=this[i],o=0,l=e.length;l>o;o++)(r=e[o])&&n.call(r,r.__data__,o,i)&&t.push(r)}return Wi(u,this.namespace,this.id)},Il.tween=function(n,t){var e=this.id,r=this.namespace;return arguments.length<2?this.node()[r][e].tween.get(n):Y(this,null==t?function(t){t[r][e].tween.remove(n)}:function(u){u[r][e].tween.set(n,t)})},Il.attr=function(n,t){function e(){this.removeAttribute(o)}function r(){this.removeAttributeNS(o.space,o.local)}function u(n){return null==n?e:(n+="",function(){var t,e=this.getAttribute(o);return e!==n&&(t=a(e,n),function(n){this.setAttribute(o,t(n))})})}function i(n){return null==n?r:(n+="",function(){var t,e=this.getAttributeNS(o.space,o.local);return e!==n&&(t=a(e,n),function(n){this.setAttributeNS(o.space,o.local,t(n))})})}if(arguments.length<2){for(t in n)this.attr(t,n[t]);return this}var a="transform"==n?$r:Mr,o=oa.ns.qualify(n);return Ji(this,"attr."+n,t,o.local?i:u)},Il.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(u));return r&&function(n){this.setAttribute(u,r(n))}}function r(n,e){var r=t.call(this,n,e,this.getAttributeNS(u.space,u.local));return r&&function(n){this.setAttributeNS(u.space,u.local,r(n))}}var u=oa.ns.qualify(n);return this.tween("attr."+n,u.local?r:e)},Il.style=function(n,e,r){function u(){this.style.removeProperty(n)}function i(e){return null==e?u:(e+="",function(){var u,i=t(this).getComputedStyle(this,null).getPropertyValue(n);return i!==e&&(u=Mr(i,e),function(t){this.style.setProperty(n,u(t),r)})})}var a=arguments.length;if(3>a){if("string"!=typeof n){2>a&&(e="");for(r in n)this.style(r,n[r],e);return this}r=""}return Ji(this,"style."+n,e,i)},Il.styleTween=function(n,e,r){function u(u,i){var a=e.call(this,u,i,t(this).getComputedStyle(this,null).getPropertyValue(n));return a&&function(t){this.style.setProperty(n,a(t),r)}}return arguments.length<3&&(r=""),this.tween("style."+n,u)},Il.text=function(n){return Ji(this,"text",n,Gi)},Il.remove=function(){var n=this.namespace;return this.each("end.transition",function(){var t;this[n].count<2&&(t=this.parentNode)&&t.removeChild(this)})},Il.ease=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].ease:("function"!=typeof n&&(n=oa.ease.apply(oa,arguments)),Y(this,function(r){r[e][t].ease=n}))},Il.delay=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].delay:Y(this,"function"==typeof n?function(r,u,i){r[e][t].delay=+n.call(r,r.__data__,u,i)}:(n=+n,function(r){r[e][t].delay=n}))},Il.duration=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].duration:Y(this,"function"==typeof n?function(r,u,i){r[e][t].duration=Math.max(1,n.call(r,r.__data__,u,i))}:(n=Math.max(1,n),function(r){r[e][t].duration=n}))},Il.each=function(n,t){var e=this.id,r=this.namespace;if(arguments.length<2){var u=Hl,i=Fl;try{Fl=e,Y(this,function(t,u,i){Hl=t[r][e],n.call(t,t.__data__,u,i)})}finally{Hl=u,Fl=i}}else Y(this,function(u){var i=u[r][e];(i.event||(i.event=oa.dispatch("start","end","interrupt"))).on(n,t)});return this},Il.transition=function(){for(var n,t,e,r,u=this.id,i=++Yl,a=this.namespace,o=[],l=0,c=this.length;c>l;l++){o.push(n=[]);for(var t=this[l],s=0,f=t.length;f>s;s++)(e=t[s])&&(r=e[a][u],Qi(e,s,a,i,{time:r.time,ease:r.ease,delay:r.delay+r.duration,duration:r.duration})),n.push(e)}return Wi(o,a,i)},oa.svg.axis=function(){function n(n){n.each(function(){var n,c=oa.select(this),s=this.__chart__||e,f=this.__chart__=e.copy(),h=null==l?f.ticks?f.ticks.apply(f,o):f.domain():l,g=null==t?f.tickFormat?f.tickFormat.apply(f,o):y:t,p=c.selectAll(".tick").data(h,f),v=p.enter().insert("g",".domain").attr("class","tick").style("opacity",Da),d=oa.transition(p.exit()).style("opacity",Da).remove(),m=oa.transition(p.order()).style("opacity",1),M=Math.max(u,0)+a,x=Zu(f),b=c.selectAll(".domain").data([0]),_=(b.enter().append("path").attr("class","domain"),oa.transition(b));v.append("line"),v.append("text");var w,S,k,N,E=v.select("line"),A=m.select("line"),C=p.select("text").text(g),z=v.select("text"),L=m.select("text"),q="top"===r||"left"===r?-1:1;if("bottom"===r||"top"===r?(n=na,w="x",k="y",S="x2",N="y2",C.attr("dy",0>q?"0em":".71em").style("text-anchor","middle"),_.attr("d","M"+x[0]+","+q*i+"V0H"+x[1]+"V"+q*i)):(n=ta,w="y",k="x",S="y2",N="x2",C.attr("dy",".32em").style("text-anchor",0>q?"end":"start"),_.attr("d","M"+q*i+","+x[0]+"H0V"+x[1]+"H"+q*i)),E.attr(N,q*u),z.attr(k,q*M),A.attr(S,0).attr(N,q*u),L.attr(w,0).attr(k,q*M),f.rangeBand){var T=f,R=T.rangeBand()/2;s=f=function(n){return T(n)+R}}else s.rangeBand?s=f:d.call(n,f,s);v.call(n,s,f),m.call(n,f,f)})}var t,e=oa.scale.linear(),r=Zl,u=6,i=6,a=3,o=[10],l=null;return n.scale=function(t){return arguments.length?(e=t,n):e},n.orient=function(t){return arguments.length?(r=t in Vl?t+"":Zl,n):r},n.ticks=function(){return arguments.length?(o=ca(arguments),n):o},n.tickValues=function(t){return arguments.length?(l=t,n):l},n.tickFormat=function(e){return arguments.length?(t=e,n):t},n.tickSize=function(t){var e=arguments.length;return e?(u=+t,i=+arguments[e-1],n):u},n.innerTickSize=function(t){return arguments.length?(u=+t,n):u},n.outerTickSize=function(t){return arguments.length?(i=+t,n):i},n.tickPadding=function(t){return arguments.length?(a=+t,n):a},n.tickSubdivide=function(){return arguments.length&&n},n};var Zl="bottom",Vl={top:1,right:1,bottom:1,left:1};oa.svg.brush=function(){function n(t){t.each(function(){var t=oa.select(this).style("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush",i).on("touchstart.brush",i),a=t.selectAll(".background").data([0]);a.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),t.selectAll(".extent").data([0]).enter().append("rect").attr("class","extent").style("cursor","move");var o=t.selectAll(".resize").data(v,y);o.exit().remove(),o.enter().append("g").attr("class",function(n){return"resize "+n}).style("cursor",function(n){return Xl[n]}).append("rect").attr("x",function(n){return/[ew]$/.test(n)?-3:null}).attr("y",function(n){return/^[ns]/.test(n)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),o.style("display",n.empty()?"none":null);var l,f=oa.transition(t),h=oa.transition(a);c&&(l=Zu(c),h.attr("x",l[0]).attr("width",l[1]-l[0]),r(f)),s&&(l=Zu(s),h.attr("y",l[0]).attr("height",l[1]-l[0]),u(f)),e(f)})}function e(n){n.selectAll(".resize").attr("transform",function(n){return"translate("+f[+/e$/.test(n)]+","+h[+/^s/.test(n)]+")"})}function r(n){n.select(".extent").attr("x",f[0]),n.selectAll(".extent,.n>rect,.s>rect").attr("width",f[1]-f[0])}function u(n){n.select(".extent").attr("y",h[0]),n.selectAll(".extent,.e>rect,.w>rect").attr("height",h[1]-h[0])}function i(){function i(){32==oa.event.keyCode&&(C||(M=null,L[0]-=f[1],L[1]-=h[1],C=2),S())}function v(){32==oa.event.keyCode&&2==C&&(L[0]+=f[1],L[1]+=h[1],C=0,S())}function d(){var n=oa.mouse(b),t=!1;x&&(n[0]+=x[0],n[1]+=x[1]),C||(oa.event.altKey?(M||(M=[(f[0]+f[1])/2,(h[0]+h[1])/2]),L[0]=f[+(n[0]<M[0])],L[1]=h[+(n[1]<M[1])]):M=null),E&&m(n,c,0)&&(r(k),t=!0),A&&m(n,s,1)&&(u(k),t=!0),t&&(e(k),w({type:"brush",mode:C?"move":"resize"}))}function m(n,t,e){var r,u,i=Zu(t),l=i[0],c=i[1],s=L[e],v=e?h:f,d=v[1]-v[0];return C&&(l-=s,c-=d+s),r=(e?p:g)?Math.max(l,Math.min(c,n[e])):n[e],C?u=(r+=s)+d:(M&&(s=Math.max(l,Math.min(c,2*M[e]-r))),r>s?(u=r,r=s):u=s),v[0]!=r||v[1]!=u?(e?o=null:a=null,v[0]=r,v[1]=u,!0):void 0}function y(){d(),k.style("pointer-events","all").selectAll(".resize").style("display",n.empty()?"none":null),oa.select("body").style("cursor",null),q.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),z(),w({type:"brushend"})}var M,x,b=this,_=oa.select(oa.event.target),w=l.of(b,arguments),k=oa.select(b),N=_.datum(),E=!/^(n|s)$/.test(N)&&c,A=!/^(e|w)$/.test(N)&&s,C=_.classed("extent"),z=W(b),L=oa.mouse(b),q=oa.select(t(b)).on("keydown.brush",i).on("keyup.brush",v);if(oa.event.changedTouches?q.on("touchmove.brush",d).on("touchend.brush",y):q.on("mousemove.brush",d).on("mouseup.brush",y),k.interrupt().selectAll("*").interrupt(),C)L[0]=f[0]-L[0],L[1]=h[0]-L[1];else if(N){var T=+/w$/.test(N),R=+/^n/.test(N);x=[f[1-T]-L[0],h[1-R]-L[1]],L[0]=f[T],L[1]=h[R]}else oa.event.altKey&&(M=L.slice());k.style("pointer-events","none").selectAll(".resize").style("display",null),oa.select("body").style("cursor",_.style("cursor")),w({type:"brushstart"}),d()}var a,o,l=N(n,"brushstart","brush","brushend"),c=null,s=null,f=[0,0],h=[0,0],g=!0,p=!0,v=$l[0];return n.event=function(n){n.each(function(){var n=l.of(this,arguments),t={x:f,y:h,i:a,j:o},e=this.__chart__||t;this.__chart__=t,Fl?oa.select(this).transition().each("start.brush",function(){a=e.i,o=e.j,f=e.x,h=e.y,n({type:"brushstart"})}).tween("brush:brush",function(){var e=xr(f,t.x),r=xr(h,t.y);return a=o=null,function(u){f=t.x=e(u),h=t.y=r(u),n({type:"brush",mode:"resize"})}}).each("end.brush",function(){a=t.i,o=t.j,n({type:"brush",mode:"resize"}),n({type:"brushend"})}):(n({type:"brushstart"}),n({type:"brush",mode:"resize"}),n({type:"brushend"}))})},n.x=function(t){return arguments.length?(c=t,v=$l[!c<<1|!s],n):c},n.y=function(t){return arguments.length?(s=t,v=$l[!c<<1|!s],n):s},n.clamp=function(t){return arguments.length?(c&&s?(g=!!t[0],p=!!t[1]):c?g=!!t:s&&(p=!!t),n):c&&s?[g,p]:c?g:s?p:null},n.extent=function(t){var e,r,u,i,l;return arguments.length?(c&&(e=t[0],r=t[1],s&&(e=e[0],r=r[0]),a=[e,r],c.invert&&(e=c(e),r=c(r)),e>r&&(l=e,e=r,r=l),(e!=f[0]||r!=f[1])&&(f=[e,r])),s&&(u=t[0],i=t[1],c&&(u=u[1],i=i[1]),o=[u,i],s.invert&&(u=s(u),i=s(i)),u>i&&(l=u,u=i,i=l),(u!=h[0]||i!=h[1])&&(h=[u,i])),n):(c&&(a?(e=a[0],r=a[1]):(e=f[0],r=f[1],c.invert&&(e=c.invert(e),r=c.invert(r)),e>r&&(l=e,e=r,r=l))),s&&(o?(u=o[0],i=o[1]):(u=h[0],i=h[1],s.invert&&(u=s.invert(u),i=s.invert(i)),u>i&&(l=u,u=i,i=l))),c&&s?[[e,u],[r,i]]:c?[e,r]:s&&[u,i])},n.clear=function(){return n.empty()||(f=[0,0],h=[0,0],a=o=null),n},n.empty=function(){return!!c&&f[0]==f[1]||!!s&&h[0]==h[1]},oa.rebind(n,l,"on")};var Xl={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},$l=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]],Bl=ho.format=Mo.timeFormat,Wl=Bl.utc,Jl=Wl("%Y-%m-%dT%H:%M:%S.%LZ");Bl.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?ea:Jl,ea.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},ea.toString=Jl.toString,ho.second=On(function(n){return new go(1e3*Math.floor(n/1e3))},function(n,t){n.setTime(n.getTime()+1e3*Math.floor(t))},function(n){return n.getSeconds()}),ho.seconds=ho.second.range,ho.seconds.utc=ho.second.utc.range,ho.minute=On(function(n){return new go(6e4*Math.floor(n/6e4))},function(n,t){n.setTime(n.getTime()+6e4*Math.floor(t))},function(n){return n.getMinutes()}),ho.minutes=ho.minute.range,ho.minutes.utc=ho.minute.utc.range,ho.hour=On(function(n){var t=n.getTimezoneOffset()/60;return new go(36e5*(Math.floor(n/36e5-t)+t))},function(n,t){n.setTime(n.getTime()+36e5*Math.floor(t))},function(n){return n.getHours()}),ho.hours=ho.hour.range,ho.hours.utc=ho.hour.utc.range,ho.month=On(function(n){return n=ho.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),ho.months=ho.month.range,ho.months.utc=ho.month.utc.range;var Gl=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Kl=[[ho.second,1],[ho.second,5],[ho.second,15],[ho.second,30],[ho.minute,1],[ho.minute,5],[ho.minute,15],[ho.minute,30],[ho.hour,1],[ho.hour,3],[ho.hour,6],[ho.hour,12],[ho.day,1],[ho.day,2],[ho.week,1],[ho.month,1],[ho.month,3],[ho.year,1]],Ql=Bl.multi([[".%L",function(n){return n.getMilliseconds()}],[":%S",function(n){return n.getSeconds()}],["%I:%M",function(n){return n.getMinutes()}],["%I %p",function(n){return n.getHours()}],["%a %d",function(n){return n.getDay()&&1!=n.getDate()}],["%b %d",function(n){return 1!=n.getDate()}],["%B",function(n){return n.getMonth()}],["%Y",zt]]),nc={range:function(n,t,e){return oa.range(Math.ceil(n/e)*e,+t,e).map(ua)},floor:y,ceil:y};Kl.year=ho.year,ho.scale=function(){return ra(oa.scale.linear(),Kl,Ql)};var tc=Kl.map(function(n){return[n[0].utc,n[1]]}),ec=Wl.multi([[".%L",function(n){return n.getUTCMilliseconds()}],[":%S",function(n){return n.getUTCSeconds()}],["%I:%M",function(n){return n.getUTCMinutes()}],["%I %p",function(n){return n.getUTCHours()}],["%a %d",function(n){return n.getUTCDay()&&1!=n.getUTCDate()}],["%b %d",function(n){return 1!=n.getUTCDate()}],["%B",function(n){return n.getUTCMonth()}],["%Y",zt]]);tc.year=ho.year.utc,ho.scale.utc=function(){return ra(oa.scale.linear(),tc,ec)},oa.text=An(function(n){return n.responseText}),oa.json=function(n,t){return Cn(n,"application/json",ia,t)},oa.html=function(n,t){return Cn(n,"text/html",aa,t)},oa.xml=An(function(n){return n.responseXML}),"function"==typeof define&&define.amd?(this.d3=oa,define(oa)):"object"==typeof module&&module.exports?module.exports=oa:this.d3=oa}();
\ No newline at end of file
diff --git a/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/external/jquery/jquery.js b/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/external/jquery/jquery.js
deleted file mode 100644
index c5c6482..0000000
--- a/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/external/jquery/jquery.js
+++ /dev/null
@@ -1,9789 +0,0 @@
-/*!
- * jQuery JavaScript Library v1.10.2
- * http://jquery.com/
- *
- * Includes Sizzle.js
- * http://sizzlejs.com/
- *
- * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors
- * Released under the MIT license
- * http://jquery.org/license
- *
- * Date: 2013-07-03T13:48Z
- */
-(function( window, undefined ) {
-
-// Can't do this because several apps including ASP.NET trace
-// the stack via arguments.caller.callee and Firefox dies if
-// you try to trace through "use strict" call chains. (#13335)
-// Support: Firefox 18+
-//"use strict";
-var
-	// The deferred used on DOM ready
-	readyList,
-
-	// A central reference to the root jQuery(document)
-	rootjQuery,
-
-	// Support: IE<10
-	// For `typeof xmlNode.method` instead of `xmlNode.method !== undefined`
-	core_strundefined = typeof undefined,
-
-	// Use the correct document accordingly with window argument (sandbox)
-	location = window.location,
-	document = window.document,
-	docElem = document.documentElement,
-
-	// Map over jQuery in case of overwrite
-	_jQuery = window.jQuery,
-
-	// Map over the $ in case of overwrite
-	_$ = window.$,
-
-	// [[Class]] -> type pairs
-	class2type = {},
-
-	// List of deleted data cache ids, so we can reuse them
-	core_deletedIds = [],
-
-	core_version = "1.10.2",
-
-	// Save a reference to some core methods
-	core_concat = core_deletedIds.concat,
-	core_push = core_deletedIds.push,
-	core_slice = core_deletedIds.slice,
-	core_indexOf = core_deletedIds.indexOf,
-	core_toString = class2type.toString,
-	core_hasOwn = class2type.hasOwnProperty,
-	core_trim = core_version.trim,
-
-	// Define a local copy of jQuery
-	jQuery = function( selector, context ) {
-		// The jQuery object is actually just the init constructor 'enhanced'
-		return new jQuery.fn.init( selector, context, rootjQuery );
-	},
-
-	// Used for matching numbers
-	core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,
-
-	// Used for splitting on whitespace
-	core_rnotwhite = /\S+/g,
-
-	// Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
-	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
-
-	// A simple way to check for HTML strings
-	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
-	// Strict HTML recognition (#11290: must start with <)
-	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
-
-	// Match a standalone tag
-	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
-
-	// JSON RegExp
-	rvalidchars = /^[\],:{}\s]*$/,
-	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
-	rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
-	rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,
-
-	// Matches dashed string for camelizing
-	rmsPrefix = /^-ms-/,
-	rdashAlpha = /-([\da-z])/gi,
-
-	// Used by jQuery.camelCase as callback to replace()
-	fcamelCase = function( all, letter ) {
-		return letter.toUpperCase();
-	},
-
-	// The ready event handler
-	completed = function( event ) {
-
-		// readyState === "complete" is good enough for us to call the dom ready in oldIE
-		if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) {
-			detach();
-			jQuery.ready();
-		}
-	},
-	// Clean-up method for dom ready events
-	detach = function() {
-		if ( document.addEventListener ) {
-			document.removeEventListener( "DOMContentLoaded", completed, false );
-			window.removeEventListener( "load", completed, false );
-
-		} else {
-			document.detachEvent( "onreadystatechange", completed );
-			window.detachEvent( "onload", completed );
-		}
-	};
-
-jQuery.fn = jQuery.prototype = {
-	// The current version of jQuery being used
-	jquery: core_version,
-
-	constructor: jQuery,
-	init: function( selector, context, rootjQuery ) {
-		var match, elem;
-
-		// HANDLE: $(""), $(null), $(undefined), $(false)
-		if ( !selector ) {
-			return this;
-		}
-
-		// Handle HTML strings
-		if ( typeof selector === "string" ) {
-			if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
-				// Assume that strings that start and end with <> are HTML and skip the regex check
-				match = [ null, selector, null ];
-
-			} else {
-				match = rquickExpr.exec( selector );
-			}
-
-			// Match html or make sure no context is specified for #id
-			if ( match && (match[1] || !context) ) {
-
-				// HANDLE: $(html) -> $(array)
-				if ( match[1] ) {
-					context = context instanceof jQuery ? context[0] : context;
-
-					// scripts is true for back-compat
-					jQuery.merge( this, jQuery.parseHTML(
-						match[1],
-						context && context.nodeType ? context.ownerDocument || context : document,
-						true
-					) );
-
-					// HANDLE: $(html, props)
-					if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
-						for ( match in context ) {
-							// Properties of context are called as methods if possible
-							if ( jQuery.isFunction( this[ match ] ) ) {
-								this[ match ]( context[ match ] );
-
-							// ...and otherwise set as attributes
-							} else {
-								this.attr( match, context[ match ] );
-							}
-						}
-					}
-
-					return this;
-
-				// HANDLE: $(#id)
-				} else {
-					elem = document.getElementById( match[2] );
-
-					// Check parentNode to catch when Blackberry 4.6 returns
-					// nodes that are no longer in the document #6963
-					if ( elem && elem.parentNode ) {
-						// Handle the case where IE and Opera return items
-						// by name instead of ID
-						if ( elem.id !== match[2] ) {
-							return rootjQuery.find( selector );
-						}
-
-						// Otherwise, we inject the element directly into the jQuery object
-						this.length = 1;
-						this[0] = elem;
-					}
-
-					this.context = document;
-					this.selector = selector;
-					return this;
-				}
-
-			// HANDLE: $(expr, $(...))
-			} else if ( !context || context.jquery ) {
-				return ( context || rootjQuery ).find( selector );
-
-			// HANDLE: $(expr, context)
-			// (which is just equivalent to: $(context).find(expr)
-			} else {
-				return this.constructor( context ).find( selector );
-			}
-
-		// HANDLE: $(DOMElement)
-		} else if ( selector.nodeType ) {
-			this.context = this[0] = selector;
-			this.length = 1;
-			return this;
-
-		// HANDLE: $(function)
-		// Shortcut for document ready
-		} else if ( jQuery.isFunction( selector ) ) {
-			return rootjQuery.ready( selector );
-		}
-
-		if ( selector.selector !== undefined ) {
-			this.selector = selector.selector;
-			this.context = selector.context;
-		}
-
-		return jQuery.makeArray( selector, this );
-	},
-
-	// Start with an empty selector
-	selector: "",
-
-	// The default length of a jQuery object is 0
-	length: 0,
-
-	toArray: function() {
-		return core_slice.call( this );
-	},
-
-	// Get the Nth element in the matched element set OR
-	// Get the whole matched element set as a clean array
-	get: function( num ) {
-		return num == null ?
-
-			// Return a 'clean' array
-			this.toArray() :
-
-			// Return just the object
-			( num < 0 ? this[ this.length + num ] : this[ num ] );
-	},
-
-	// Take an array of elements and push it onto the stack
-	// (returning the new matched element set)
-	pushStack: function( elems ) {
-
-		// Build a new jQuery matched element set
-		var ret = jQuery.merge( this.constructor(), elems );
-
-		// Add the old object onto the stack (as a reference)
-		ret.prevObject = this;
-		ret.context = this.context;
-
-		// Return the newly-formed element set
-		return ret;
-	},
-
-	// Execute a callback for every element in the matched set.
-	// (You can seed the arguments with an array of args, but this is
-	// only used internally.)
-	each: function( callback, args ) {
-		return jQuery.each( this, callback, args );
-	},
-
-	ready: function( fn ) {
-		// Add the callback
-		jQuery.ready.promise().done( fn );
-
-		return this;
-	},
-
-	slice: function() {
-		return this.pushStack( core_slice.apply( this, arguments ) );
-	},
-
-	first: function() {
-		return this.eq( 0 );
-	},
-
-	last: function() {
-		return this.eq( -1 );
-	},
-
-	eq: function( i ) {
-		var len = this.length,
-			j = +i + ( i < 0 ? len : 0 );
-		return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
-	},
-
-	map: function( callback ) {
-		return this.pushStack( jQuery.map(this, function( elem, i ) {
-			return callback.call( elem, i, elem );
-		}));
-	},
-
-	end: function() {
-		return this.prevObject || this.constructor(null);
-	},
-
-	// For internal use only.
-	// Behaves like an Array's method, not like a jQuery method.
-	push: core_push,
-	sort: [].sort,
-	splice: [].splice
-};
-
-// Give the init function the jQuery prototype for later instantiation
-jQuery.fn.init.prototype = jQuery.fn;
-
-jQuery.extend = jQuery.fn.extend = function() {
-	var src, copyIsArray, copy, name, options, clone,
-		target = arguments[0] || {},
-		i = 1,
-		length = arguments.length,
-		deep = false;
-
-	// Handle a deep copy situation
-	if ( typeof target === "boolean" ) {
-		deep = target;
-		target = arguments[1] || {};
-		// skip the boolean and the target
-		i = 2;
-	}
-
-	// Handle case when target is a string or something (possible in deep copy)
-	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
-		target = {};
-	}
-
-	// extend jQuery itself if only one argument is passed
-	if ( length === i ) {
-		target = this;
-		--i;
-	}
-
-	for ( ; i < length; i++ ) {
-		// Only deal with non-null/undefined values
-		if ( (options = arguments[ i ]) != null ) {
-			// Extend the base object
-			for ( name in options ) {
-				src = target[ name ];
-				copy = options[ name ];
-
-				// Prevent never-ending loop
-				if ( target === copy ) {
-					continue;
-				}
-
-				// Recurse if we're merging plain objects or arrays
-				if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
-					if ( copyIsArray ) {
-						copyIsArray = false;
-						clone = src && jQuery.isArray(src) ? src : [];
-
-					} else {
-						clone = src && jQuery.isPlainObject(src) ? src : {};
-					}
-
-					// Never move original objects, clone them
-					target[ name ] = jQuery.extend( deep, clone, copy );
-
-				// Don't bring in undefined values
-				} else if ( copy !== undefined ) {
-					target[ name ] = copy;
-				}
-			}
-		}
-	}
-
-	// Return the modified object
-	return target;
-};
-
-jQuery.extend({
-	// Unique for each copy of jQuery on the page
-	// Non-digits removed to match rinlinejQuery
-	expando: "jQuery" + ( core_version + Math.random() ).replace( /\D/g, "" ),
-
-	noConflict: function( deep ) {
-		if ( window.$ === jQuery ) {
-			window.$ = _$;
-		}
-
-		if ( deep && window.jQuery === jQuery ) {
-			window.jQuery = _jQuery;
-		}
-
-		return jQuery;
-	},
-
-	// Is the DOM ready to be used? Set to true once it occurs.
-	isReady: false,
-
-	// A counter to track how many items to wait for before
-	// the ready event fires. See #6781
-	readyWait: 1,
-
-	// Hold (or release) the ready event
-	holdReady: function( hold ) {
-		if ( hold ) {
-			jQuery.readyWait++;
-		} else {
-			jQuery.ready( true );
-		}
-	},
-
-	// Handle when the DOM is ready
-	ready: function( wait ) {
-
-		// Abort if there are pending holds or we're already ready
-		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
-			return;
-		}
-
-		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
-		if ( !document.body ) {
-			return setTimeout( jQuery.ready );
-		}
-
-		// Remember that the DOM is ready
-		jQuery.isReady = true;
-
-		// If a normal DOM Ready event fired, decrement, and wait if need be
-		if ( wait !== true && --jQuery.readyWait > 0 ) {
-			return;
-		}
-
-		// If there are functions bound, to execute
-		readyList.resolveWith( document, [ jQuery ] );
-
-		// Trigger any bound ready events
-		if ( jQuery.fn.trigger ) {
-			jQuery( document ).trigger("ready").off("ready");
-		}
-	},
-
-	// See test/unit/core.js for details concerning isFunction.
-	// Since version 1.3, DOM methods and functions like alert
-	// aren't supported. They return false on IE (#2968).
-	isFunction: function( obj ) {
-		return jQuery.type(obj) === "function";
-	},
-
-	isArray: Array.isArray || function( obj ) {
-		return jQuery.type(obj) === "array";
-	},
-
-	isWindow: function( obj ) {
-		/* jshint eqeqeq: false */
-		return obj != null && obj == obj.window;
-	},
-
-	isNumeric: function( obj ) {
-		return !isNaN( parseFloat(obj) ) && isFinite( obj );
-	},
-
-	type: function( obj ) {
-		if ( obj == null ) {
-			return String( obj );
-		}
-		return typeof obj === "object" || typeof obj === "function" ?
-			class2type[ core_toString.call(obj) ] || "object" :
-			typeof obj;
-	},
-
-	isPlainObject: function( obj ) {
-		var key;
-
-		// Must be an Object.
-		// Because of IE, we also have to check the presence of the constructor property.
-		// Make sure that DOM nodes and window objects don't pass through, as well
-		if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
-			return false;
-		}
-
-		try {
-			// Not own constructor property must be Object
-			if ( obj.constructor &&
-				!core_hasOwn.call(obj, "constructor") &&
-				!core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
-				return false;
-			}
-		} catch ( e ) {
-			// IE8,9 Will throw exceptions on certain host objects #9897
-			return false;
-		}
-
-		// Support: IE<9
-		// Handle iteration over inherited properties before own properties.
-		if ( jQuery.support.ownLast ) {
-			for ( key in obj ) {
-				return core_hasOwn.call( obj, key );
-			}
-		}
-
-		// Own properties are enumerated firstly, so to speed up,
-		// if last one is own, then all properties are own.
-		for ( key in obj ) {}
-
-		return key === undefined || core_hasOwn.call( obj, key );
-	},
-
-	isEmptyObject: function( obj ) {
-		var name;
-		for ( name in obj ) {
-			return false;
-		}
-		return true;
-	},
-
-	error: function( msg ) {
-		throw new Error( msg );
-	},
-
-	// data: string of html
-	// context (optional): If specified, the fragment will be created in this context, defaults to document
-	// keepScripts (optional): If true, will include scripts passed in the html string
-	parseHTML: function( data, context, keepScripts ) {
-		if ( !data || typeof data !== "string" ) {
-			return null;
-		}
-		if ( typeof context === "boolean" ) {
-			keepScripts = context;
-			context = false;
-		}
-		context = context || document;
-
-		var parsed = rsingleTag.exec( data ),
-			scripts = !keepScripts && [];
-
-		// Single tag
-		if ( parsed ) {
-			return [ context.createElement( parsed[1] ) ];
-		}
-
-		parsed = jQuery.buildFragment( [ data ], context, scripts );
-		if ( scripts ) {
-			jQuery( scripts ).remove();
-		}
-		return jQuery.merge( [], parsed.childNodes );
-	},
-
-	parseJSON: function( data ) {
-		// Attempt to parse using the native JSON parser first
-		if ( window.JSON && window.JSON.parse ) {
-			return window.JSON.parse( data );
-		}
-
-		if ( data === null ) {
-			return data;
-		}
-
-		if ( typeof data === "string" ) {
-
-			// Make sure leading/trailing whitespace is removed (IE can't handle it)
-			data = jQuery.trim( data );
-
-			if ( data ) {
-				// Make sure the incoming data is actual JSON
-				// Logic borrowed from http://json.org/json2.js
-				if ( rvalidchars.test( data.replace( rvalidescape, "@" )
-					.replace( rvalidtokens, "]" )
-					.replace( rvalidbraces, "")) ) {
-
-					return ( new Function( "return " + data ) )();
-				}
-			}
-		}
-
-		jQuery.error( "Invalid JSON: " + data );
-	},
-
-	// Cross-browser xml parsing
-	parseXML: function( data ) {
-		var xml, tmp;
-		if ( !data || typeof data !== "string" ) {
-			return null;
-		}
-		try {
-			if ( window.DOMParser ) { // Standard
-				tmp = new DOMParser();
-				xml = tmp.parseFromString( data , "text/xml" );
-			} else { // IE
-				xml = new ActiveXObject( "Microsoft.XMLDOM" );
-				xml.async = "false";
-				xml.loadXML( data );
-			}
-		} catch( e ) {
-			xml = undefined;
-		}
-		if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
-			jQuery.error( "Invalid XML: " + data );
-		}
-		return xml;
-	},
-
-	noop: function() {},
-
-	// Evaluates a script in a global context
-	// Workarounds based on findings by Jim Driscoll
-	// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
-	globalEval: function( data ) {
-		if ( data && jQuery.trim( data ) ) {
-			// We use execScript on Internet Explorer
-			// We use an anonymous function so that context is window
-			// rather than jQuery in Firefox
-			( window.execScript || function( data ) {
-				window[ "eval" ].call( window, data );
-			} )( data );
-		}
-	},
-
-	// Convert dashed to camelCase; used by the css and data modules
-	// Microsoft forgot to hump their vendor prefix (#9572)
-	camelCase: function( string ) {
-		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
-	},
-
-	nodeName: function( elem, name ) {
-		return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
-	},
-
-	// args is for internal usage only
-	each: function( obj, callback, args ) {
-		var value,
-			i = 0,
-			length = obj.length,
-			isArray = isArraylike( obj );
-
-		if ( args ) {
-			if ( isArray ) {
-				for ( ; i < length; i++ ) {
-					value = callback.apply( obj[ i ], args );
-
-					if ( value === false ) {
-						break;
-					}
-				}
-			} else {
-				for ( i in obj ) {
-					value = callback.apply( obj[ i ], args );
-
-					if ( value === false ) {
-						break;
-					}
-				}
-			}
-
-		// A special, fast, case for the most common use of each
-		} else {
-			if ( isArray ) {
-				for ( ; i < length; i++ ) {
-					value = callback.call( obj[ i ], i, obj[ i ] );
-
-					if ( value === false ) {
-						break;
-					}
-				}
-			} else {
-				for ( i in obj ) {
-					value = callback.call( obj[ i ], i, obj[ i ] );
-
-					if ( value === false ) {
-						break;
-					}
-				}
-			}
-		}
-
-		return obj;
-	},
-
-	// Use native String.trim function wherever possible
-	trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
-		function( text ) {
-			return text == null ?
-				"" :
-				core_trim.call( text );
-		} :
-
-		// Otherwise use our own trimming functionality
-		function( text ) {
-			return text == null ?
-				"" :
-				( text + "" ).replace( rtrim, "" );
-		},
-
-	// results is for internal usage only
-	makeArray: function( arr, results ) {
-		var ret = results || [];
-
-		if ( arr != null ) {
-			if ( isArraylike( Object(arr) ) ) {
-				jQuery.merge( ret,
-					typeof arr === "string" ?
-					[ arr ] : arr
-				);
-			} else {
-				core_push.call( ret, arr );
-			}
-		}
-
-		return ret;
-	},
-
-	inArray: function( elem, arr, i ) {
-		var len;
-
-		if ( arr ) {
-			if ( core_indexOf ) {
-				return core_indexOf.call( arr, elem, i );
-			}
-
-			len = arr.length;
-			i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
-
-			for ( ; i < len; i++ ) {
-				// Skip accessing in sparse arrays
-				if ( i in arr && arr[ i ] === elem ) {
-					return i;
-				}
-			}
-		}
-
-		return -1;
-	},
-
-	merge: function( first, second ) {
-		var l = second.length,
-			i = first.length,
-			j = 0;
-
-		if ( typeof l === "number" ) {
-			for ( ; j < l; j++ ) {
-				first[ i++ ] = second[ j ];
-			}
-		} else {
-			while ( second[j] !== undefined ) {
-				first[ i++ ] = second[ j++ ];
-			}
-		}
-
-		first.length = i;
-
-		return first;
-	},
-
-	grep: function( elems, callback, inv ) {
-		var retVal,
-			ret = [],
-			i = 0,
-			length = elems.length;
-		inv = !!inv;
-
-		// Go through the array, only saving the items
-		// that pass the validator function
-		for ( ; i < length; i++ ) {
-			retVal = !!callback( elems[ i ], i );
-			if ( inv !== retVal ) {
-				ret.push( elems[ i ] );
-			}
-		}
-
-		return ret;
-	},
-
-	// arg is for internal usage only
-	map: function( elems, callback, arg ) {
-		var value,
-			i = 0,
-			length = elems.length,
-			isArray = isArraylike( elems ),
-			ret = [];
-
-		// Go through the array, translating each of the items to their
-		if ( isArray ) {
-			for ( ; i < length; i++ ) {
-				value = callback( elems[ i ], i, arg );
-
-				if ( value != null ) {
-					ret[ ret.length ] = value;
-				}
-			}
-
-		// Go through every key on the object,
-		} else {
-			for ( i in elems ) {
-				value = callback( elems[ i ], i, arg );
-
-				if ( value != null ) {
-					ret[ ret.length ] = value;
-				}
-			}
-		}
-
-		// Flatten any nested arrays
-		return core_concat.apply( [], ret );
-	},
-
-	// A global GUID counter for objects
-	guid: 1,
-
-	// Bind a function to a context, optionally partially applying any
-	// arguments.
-	proxy: function( fn, context ) {
-		var args, proxy, tmp;
-
-		if ( typeof context === "string" ) {
-			tmp = fn[ context ];
-			context = fn;
-			fn = tmp;
-		}
-
-		// Quick check to determine if target is callable, in the spec
-		// this throws a TypeError, but we will just return undefined.
-		if ( !jQuery.isFunction( fn ) ) {
-			return undefined;
-		}
-
-		// Simulated bind
-		args = core_slice.call( arguments, 2 );
-		proxy = function() {
-			return fn.apply( context || this, args.concat( core_slice.call( arguments ) ) );
-		};
-
-		// Set the guid of unique handler to the same of original handler, so it can be removed
-		proxy.guid = fn.guid = fn.guid || jQuery.guid++;
-
-		return proxy;
-	},
-
-	// Multifunctional method to get and set values of a collection
-	// The value/s can optionally be executed if it's a function
-	access: function( elems, fn, key, value, chainable, emptyGet, raw ) {
-		var i = 0,
-			length = elems.length,
-			bulk = key == null;
-
-		// Sets many values
-		if ( jQuery.type( key ) === "object" ) {
-			chainable = true;
-			for ( i in key ) {
-				jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
-			}
-
-		// Sets one value
-		} else if ( value !== undefined ) {
-			chainable = true;
-
-			if ( !jQuery.isFunction( value ) ) {
-				raw = true;
-			}
-
-			if ( bulk ) {
-				// Bulk operations run against the entire set
-				if ( raw ) {
-					fn.call( elems, value );
-					fn = null;
-
-				// ...except when executing function values
-				} else {
-					bulk = fn;
-					fn = function( elem, key, value ) {
-						return bulk.call( jQuery( elem ), value );
-					};
-				}
-			}
-
-			if ( fn ) {
-				for ( ; i < length; i++ ) {
-					fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
-				}
-			}
-		}
-
-		return chainable ?
-			elems :
-
-			// Gets
-			bulk ?
-				fn.call( elems ) :
-				length ? fn( elems[0], key ) : emptyGet;
-	},
-
-	now: function() {
-		return ( new Date() ).getTime();
-	},
-
-	// A method for quickly swapping in/out CSS properties to get correct calculations.
-	// Note: this method belongs to the css module but it's needed here for the support module.
-	// If support gets modularized, this method should be moved back to the css module.
-	swap: function( elem, options, callback, args ) {
-		var ret, name,
-			old = {};
-
-		// Remember the old values, and insert the new ones
-		for ( name in options ) {
-			old[ name ] = elem.style[ name ];
-			elem.style[ name ] = options[ name ];
-		}
-
-		ret = callback.apply( elem, args || [] );
-
-		// Revert the old values
-		for ( name in options ) {
-			elem.style[ name ] = old[ name ];
-		}
-
-		return ret;
-	}
-});
-
-jQuery.ready.promise = function( obj ) {
-	if ( !readyList ) {
-
-		readyList = jQuery.Deferred();
-
-		// Catch cases where $(document).ready() is called after the browser event has already occurred.
-		// we once tried to use readyState "interactive" here, but it caused issues like the one
-		// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
-		if ( document.readyState === "complete" ) {
-			// Handle it asynchronously to allow scripts the opportunity to delay ready
-			setTimeout( jQuery.ready );
-
-		// Standards-based browsers support DOMContentLoaded
-		} else if ( document.addEventListener ) {
-			// Use the handy event callback
-			document.addEventListener( "DOMContentLoaded", completed, false );
-
-			// A fallback to window.onload, that will always work
-			window.addEventListener( "load", completed, false );
-
-		// If IE event model is used
-		} else {
-			// Ensure firing before onload, maybe late but safe also for iframes
-			document.attachEvent( "onreadystatechange", completed );
-
-			// A fallback to window.onload, that will always work
-			window.attachEvent( "onload", completed );
-
-			// If IE and not a frame
-			// continually check to see if the document is ready
-			var top = false;
-
-			try {
-				top = window.frameElement == null && document.documentElement;
-			} catch(e) {}
-
-			if ( top && top.doScroll ) {
-				(function doScrollCheck() {
-					if ( !jQuery.isReady ) {
-
-						try {
-							// Use the trick by Diego Perini
-							// http://javascript.nwbox.com/IEContentLoaded/
-							top.doScroll("left");
-						} catch(e) {
-							return setTimeout( doScrollCheck, 50 );
-						}
-
-						// detach all dom ready events
-						detach();
-
-						// and execute any waiting functions
-						jQuery.ready();
-					}
-				})();
-			}
-		}
-	}
-	return readyList.promise( obj );
-};
-
-// Populate the class2type map
-jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
-	class2type[ "[object " + name + "]" ] = name.toLowerCase();
-});
-
-function isArraylike( obj ) {
-	var length = obj.length,
-		type = jQuery.type( obj );
-
-	if ( jQuery.isWindow( obj ) ) {
-		return false;
-	}
-
-	if ( obj.nodeType === 1 && length ) {
-		return true;
-	}
-
-	return type === "array" || type !== "function" &&
-		( length === 0 ||
-		typeof length === "number" && length > 0 && ( length - 1 ) in obj );
-}
-
-// All jQuery objects should point back to these
-rootjQuery = jQuery(document);
-/*!
- * Sizzle CSS Selector Engine v1.10.2
- * http://sizzlejs.com/
- *
- * Copyright 2013 jQuery Foundation, Inc. and other contributors
- * Released under the MIT license
- * http://jquery.org/license
- *
- * Date: 2013-07-03
- */
-(function( window, undefined ) {
-
-var i,
-	support,
-	cachedruns,
-	Expr,
-	getText,
-	isXML,
-	compile,
-	outermostContext,
-	sortInput,
-
-	// Local document vars
-	setDocument,
-	document,
-	docElem,
-	documentIsHTML,
-	rbuggyQSA,
-	rbuggyMatches,
-	matches,
-	contains,
-
-	// Instance-specific data
-	expando = "sizzle" + -(new Date()),
-	preferredDoc = window.document,
-	dirruns = 0,
-	done = 0,
-	classCache = createCache(),
-	tokenCache = createCache(),
-	compilerCache = createCache(),
-	hasDuplicate = false,
-	sortOrder = function( a, b ) {
-		if ( a === b ) {
-			hasDuplicate = true;
-			return 0;
-		}
-		return 0;
-	},
-
-	// General-purpose constants
-	strundefined = typeof undefined,
-	MAX_NEGATIVE = 1 << 31,
-
-	// Instance methods
-	hasOwn = ({}).hasOwnProperty,
-	arr = [],
-	pop = arr.pop,
-	push_native = arr.push,
-	push = arr.push,
-	slice = arr.slice,
-	// Use a stripped-down indexOf if we can't use a native one
-	indexOf = arr.indexOf || function( elem ) {
-		var i = 0,
-			len = this.length;
-		for ( ; i < len; i++ ) {
-			if ( this[i] === elem ) {
-				return i;
-			}
-		}
-		return -1;
-	},
-
-	booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
-
-	// Regular expressions
-
-	// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
-	whitespace = "[\\x20\\t\\r\\n\\f]",
-	// http://www.w3.org/TR/css3-syntax/#characters
-	characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
-
-	// Loosely modeled on CSS identifier characters
-	// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
-	// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
-	identifier = characterEncoding.replace( "w", "w#" ),
-
-	// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
-	attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
-		"*(?:([*^$|!~]?=)" + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
-
-	// Prefer arguments quoted,
-	//   then not containing pseudos/brackets,
-	//   then attribute selectors/non-parenthetical expressions,
-	//   then anything else
-	// These preferences are here to reduce the number of selectors
-	//   needing tokenize in the PSEUDO preFilter
-	pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)",
-
-	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
-	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
-
-	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
-	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
-
-	rsibling = new RegExp( whitespace + "*[+~]" ),
-	rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*)" + whitespace + "*\\]", "g" ),
-
-	rpseudo = new RegExp( pseudos ),
-	ridentifier = new RegExp( "^" + identifier + "$" ),
-
-	matchExpr = {
-		"ID": new RegExp( "^#(" + characterEncoding + ")" ),
-		"CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
-		"TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
-		"ATTR": new RegExp( "^" + attributes ),
-		"PSEUDO": new RegExp( "^" + pseudos ),
-		"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
-			"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
-			"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
-		"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
-		// For use in libraries implementing .is()
-		// We use this for POS matching in `select`
-		"needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
-			whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
-	},
-
-	rnative = /^[^{]+\{\s*\[native \w/,
-
-	// Easily-parseable/retrievable ID or TAG or CLASS selectors
-	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
-
-	rinputs = /^(?:input|select|textarea|button)$/i,
-	rheader = /^h\d$/i,
-
-	rescape = /'|\\/g,
-
-	// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
-	runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
-	funescape = function( _, escaped, escapedWhitespace ) {
-		var high = "0x" + escaped - 0x10000;
-		// NaN means non-codepoint
-		// Support: Firefox
-		// Workaround erroneous numeric interpretation of +"0x"
-		return high !== high || escapedWhitespace ?
-			escaped :
-			// BMP codepoint
-			high < 0 ?
-				String.fromCharCode( high + 0x10000 ) :
-				// Supplemental Plane codepoint (surrogate pair)
-				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
-	};
-
-// Optimize for push.apply( _, NodeList )
-try {
-	push.apply(
-		(arr = slice.call( preferredDoc.childNodes )),
-		preferredDoc.childNodes
-	);
-	// Support: Android<4.0
-	// Detect silently failing push.apply
-	arr[ preferredDoc.childNodes.length ].nodeType;
-} catch ( e ) {
-	push = { apply: arr.length ?
-
-		// Leverage slice if possible
-		function( target, els ) {
-			push_native.apply( target, slice.call(els) );
-		} :
-
-		// Support: IE<9
-		// Otherwise append directly
-		function( target, els ) {
-			var j = target.length,
-				i = 0;
-			// Can't trust NodeList.length
-			while ( (target[j++] = els[i++]) ) {}
-			target.length = j - 1;
-		}
-	};
-}
-
-function Sizzle( selector, context, results, seed ) {
-	var match, elem, m, nodeType,
-		// QSA vars
-		i, groups, old, nid, newContext, newSelector;
-
-	if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
-		setDocument( context );
-	}
-
-	context = context || document;
-	results = results || [];
-
-	if ( !selector || typeof selector !== "string" ) {
-		return results;
-	}
-
-	if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
-		return [];
-	}
-
-	if ( documentIsHTML && !seed ) {
-
-		// Shortcuts
-		if ( (match = rquickExpr.exec( selector )) ) {
-			// Speed-up: Sizzle("#ID")
-			if ( (m = match[1]) ) {
-				if ( nodeType === 9 ) {
-					elem = context.getElementById( m );
-					// Check parentNode to catch when Blackberry 4.6 returns
-					// nodes that are no longer in the document #6963
-					if ( elem && elem.parentNode ) {
-						// Handle the case where IE, Opera, and Webkit return items
-						// by name instead of ID
-						if ( elem.id === m ) {
-							results.push( elem );
-							return results;
-						}
-					} else {
-						return results;
-					}
-				} else {
-					// Context is not a document
-					if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
-						contains( context, elem ) && elem.id === m ) {
-						results.push( elem );
-						return results;
-					}
-				}
-
-			// Speed-up: Sizzle("TAG")
-			} else if ( match[2] ) {
-				push.apply( results, context.getElementsByTagName( selector ) );
-				return results;
-
-			// Speed-up: Sizzle(".CLASS")
-			} else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {
-				push.apply( results, context.getElementsByClassName( m ) );
-				return results;
-			}
-		}
-
-		// QSA path
-		if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
-			nid = old = expando;
-			newContext = context;
-			newSelector = nodeType === 9 && selector;
-
-			// qSA works strangely on Element-rooted queries
-			// We can work around this by specifying an extra ID on the root
-			// and working up from there (Thanks to Andrew Dupont for the technique)
-			// IE 8 doesn't work on object elements
-			if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
-				groups = tokenize( selector );
-
-				if ( (old = context.getAttribute("id")) ) {
-					nid = old.replace( rescape, "\\$&" );
-				} else {
-					context.setAttribute( "id", nid );
-				}
-				nid = "[id='" + nid + "'] ";
-
-				i = groups.length;
-				while ( i-- ) {
-					groups[i] = nid + toSelector( groups[i] );
-				}
-				newContext = rsibling.test( selector ) && context.parentNode || context;
-				newSelector = groups.join(",");
-			}
-
-			if ( newSelector ) {
-				try {
-					push.apply( results,
-						newContext.querySelectorAll( newSelector )
-					);
-					return results;
-				} catch(qsaError) {
-				} finally {
-					if ( !old ) {
-						context.removeAttribute("id");
-					}
-				}
-			}
-		}
-	}
-
-	// All others
-	return select( selector.replace( rtrim, "$1" ), context, results, seed );
-}
-
-/**
- * Create key-value caches of limited size
- * @returns {Function(string, Object)} Returns the Object data after storing it on itself with
- *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
- *	deleting the oldest entry
- */
-function createCache() {
-	var keys = [];
-
-	function cache( key, value ) {
-		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
-		if ( keys.push( key += " " ) > Expr.cacheLength ) {
-			// Only keep the most recent entries
-			delete cache[ keys.shift() ];
-		}
-		return (cache[ key ] = value);
-	}
-	return cache;
-}
-
-/**
- * Mark a function for special use by Sizzle
- * @param {Function} fn The function to mark
- */
-function markFunction( fn ) {
-	fn[ expando ] = true;
-	return fn;
-}
-
-/**
- * Support testing using an element
- * @param {Function} fn Passed the created div and expects a boolean result
- */
-function assert( fn ) {
-	var div = document.createElement("div");
-
-	try {
-		return !!fn( div );
-	} catch (e) {
-		return false;
-	} finally {
-		// Remove from its parent by default
-		if ( div.parentNode ) {
-			div.parentNode.removeChild( div );
-		}
-		// release memory in IE
-		div = null;
-	}
-}
-
-/**
- * Adds the same handler for all of the specified attrs
- * @param {String} attrs Pipe-separated list of attributes
- * @param {Function} handler The method that will be applied
- */
-function addHandle( attrs, handler ) {
-	var arr = attrs.split("|"),
-		i = attrs.length;
-
-	while ( i-- ) {
-		Expr.attrHandle[ arr[i] ] = handler;
-	}
-}
-
-/**
- * Checks document order of two siblings
- * @param {Element} a
- * @param {Element} b
- * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
- */
-function siblingCheck( a, b ) {
-	var cur = b && a,
-		diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
-			( ~b.sourceIndex || MAX_NEGATIVE ) -
-			( ~a.sourceIndex || MAX_NEGATIVE );
-
-	// Use IE sourceIndex if available on both nodes
-	if ( diff ) {
-		return diff;
-	}
-
-	// Check if b follows a
-	if ( cur ) {
-		while ( (cur = cur.nextSibling) ) {
-			if ( cur === b ) {
-				return -1;
-			}
-		}
-	}
-
-	return a ? 1 : -1;
-}
-
-/**
- * Returns a function to use in pseudos for input types
- * @param {String} type
- */
-function createInputPseudo( type ) {
-	return function( elem ) {
-		var name = elem.nodeName.toLowerCase();
-		return name === "input" && elem.type === type;
-	};
-}
-
-/**
- * Returns a function to use in pseudos for buttons
- * @param {String} type
- */
-function createButtonPseudo( type ) {
-	return function( elem ) {
-		var name = elem.nodeName.toLowerCase();
-		return (name === "input" || name === "button") && elem.type === type;
-	};
-}
-
-/**
- * Returns a function to use in pseudos for positionals
- * @param {Function} fn
- */
-function createPositionalPseudo( fn ) {
-	return markFunction(function( argument ) {
-		argument = +argument;
-		return markFunction(function( seed, matches ) {
-			var j,
-				matchIndexes = fn( [], seed.length, argument ),
-				i = matchIndexes.length;
-
-			// Match elements found at the specified indexes
-			while ( i-- ) {
-				if ( seed[ (j = matchIndexes[i]) ] ) {
-					seed[j] = !(matches[j] = seed[j]);
-				}
-			}
-		});
-	});
-}
-
-/**
- * Detect xml
- * @param {Element|Object} elem An element or a document
- */
-isXML = Sizzle.isXML = function( elem ) {
-	// documentElement is verified for cases where it doesn't yet exist
-	// (such as loading iframes in IE - #4833)
-	var documentElement = elem && (elem.ownerDocument || elem).documentElement;
-	return documentElement ? documentElement.nodeName !== "HTML" : false;
-};
-
-// Expose support vars for convenience
-support = Sizzle.support = {};
-
-/**
- * Sets document-related variables once based on the current document
- * @param {Element|Object} [doc] An element or document object to use to set the document
- * @returns {Object} Returns the current document
- */
-setDocument = Sizzle.setDocument = function( node ) {
-	var doc = node ? node.ownerDocument || node : preferredDoc,
-		parent = doc.defaultView;
-
-	// If no document and documentElement is available, return
-	if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
-		return document;
-	}
-
-	// Set our document
-	document = doc;
-	docElem = doc.documentElement;
-
-	// Support tests
-	documentIsHTML = !isXML( doc );
-
-	// Support: IE>8
-	// If iframe document is assigned to "document" variable and if iframe has been reloaded,
-	// IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936
-	// IE6-8 do not support the defaultView property so parent will be undefined
-	if ( parent && parent.attachEvent && parent !== parent.top ) {
-		parent.attachEvent( "onbeforeunload", function() {
-			setDocument();
-		});
-	}
-
-	/* Attributes
-	---------------------------------------------------------------------- */
-
-	// Support: IE<8
-	// Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)
-	support.attributes = assert(function( div ) {
-		div.className = "i";
-		return !div.getAttribute("className");
-	});
-
-	/* getElement(s)By*
-	---------------------------------------------------------------------- */
-
-	// Check if getElementsByTagName("*") returns only elements
-	support.getElementsByTagName = assert(function( div ) {
-		div.appendChild( doc.createComment("") );
-		return !div.getElementsByTagName("*").length;
-	});
-
-	// Check if getElementsByClassName can be trusted
-	support.getElementsByClassName = assert(function( div ) {
-		div.innerHTML = "<div class='a'></div><div class='a i'></div>";
-
-		// Support: Safari<4
-		// Catch class over-caching
-		div.firstChild.className = "i";
-		// Support: Opera<10
-		// Catch gEBCN failure to find non-leading classes
-		return div.getElementsByClassName("i").length === 2;
-	});
-
-	// Support: IE<10
-	// Check if getElementById returns elements by name
-	// The broken getElementById methods don't pick up programatically-set names,
-	// so use a roundabout getElementsByName test
-	support.getById = assert(function( div ) {
-		docElem.appendChild( div ).id = expando;
-		return !doc.getElementsByName || !doc.getElementsByName( expando ).length;
-	});
-
-	// ID find and filter
-	if ( support.getById ) {
-		Expr.find["ID"] = function( id, context ) {
-			if ( typeof context.getElementById !== strundefined && documentIsHTML ) {
-				var m = context.getElementById( id );
-				// Check parentNode to catch when Blackberry 4.6 returns
-				// nodes that are no longer in the document #6963
-				return m && m.parentNode ? [m] : [];
-			}
-		};
-		Expr.filter["ID"] = function( id ) {
-			var attrId = id.replace( runescape, funescape );
-			return function( elem ) {
-				return elem.getAttribute("id") === attrId;
-			};
-		};
-	} else {
-		// Support: IE6/7
-		// getElementById is not reliable as a find shortcut
-		delete Expr.find["ID"];
-
-		Expr.filter["ID"] =  function( id ) {
-			var attrId = id.replace( runescape, funescape );
-			return function( elem ) {
-				var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
-				return node && node.value === attrId;
-			};
-		};
-	}
-
-	// Tag
-	Expr.find["TAG"] = support.getElementsByTagName ?
-		function( tag, context ) {
-			if ( typeof context.getElementsByTagName !== strundefined ) {
-				return context.getElementsByTagName( tag );
-			}
-		} :
-		function( tag, context ) {
-			var elem,
-				tmp = [],
-				i = 0,
-				results = context.getElementsByTagName( tag );
-
-			// Filter out possible comments
-			if ( tag === "*" ) {
-				while ( (elem = results[i++]) ) {
-					if ( elem.nodeType === 1 ) {
-						tmp.push( elem );
-					}
-				}
-
-				return tmp;
-			}
-			return results;
-		};
-
-	// Class
-	Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
-		if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {
-			return context.getElementsByClassName( className );
-		}
-	};
-
-	/* QSA/matchesSelector
-	---------------------------------------------------------------------- */
-
-	// QSA and matchesSelector support
-
-	// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
-	rbuggyMatches = [];
-
-	// qSa(:focus) reports false when true (Chrome 21)
-	// We allow this because of a bug in IE8/9 that throws an error
-	// whenever `document.activeElement` is accessed on an iframe
-	// So, we allow :focus to pass through QSA all the time to avoid the IE error
-	// See http://bugs.jquery.com/ticket/13378
-	rbuggyQSA = [];
-
-	if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {
-		// Build QSA regex
-		// Regex strategy adopted from Diego Perini
-		assert(function( div ) {
-			// Select is set to empty string on purpose
-			// This is to test IE's treatment of not explicitly
-			// setting a boolean content attribute,
-			// since its presence should be enough
-			// http://bugs.jquery.com/ticket/12359
-			div.innerHTML = "<select><option selected=''></option></select>";
-
-			// Support: IE8
-			// Boolean attributes and "value" are not treated correctly
-			if ( !div.querySelectorAll("[selected]").length ) {
-				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
-			}
-
-			// Webkit/Opera - :checked should return selected option elements
-			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
-			// IE8 throws error here and will not see later tests
-			if ( !div.querySelectorAll(":checked").length ) {
-				rbuggyQSA.push(":checked");
-			}
-		});
-
-		assert(function( div ) {
-
-			// Support: Opera 10-12/IE8
-			// ^= $= *= and empty values
-			// Should not select anything
-			// Support: Windows 8 Native Apps
-			// The type attribute is restricted during .innerHTML assignment
-			var input = doc.createElement("input");
-			input.setAttribute( "type", "hidden" );
-			div.appendChild( input ).setAttribute( "t", "" );
-
-			if ( div.querySelectorAll("[t^='']").length ) {
-				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
-			}
-
-			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
-			// IE8 throws error here and will not see later tests
-			if ( !div.querySelectorAll(":enabled").length ) {
-				rbuggyQSA.push( ":enabled", ":disabled" );
-			}
-
-			// Opera 10-11 does not throw on post-comma invalid pseudos
-			div.querySelectorAll("*,:x");
-			rbuggyQSA.push(",.*:");
-		});
-	}
-
-	if ( (support.matchesSelector = rnative.test( (matches = docElem.webkitMatchesSelector ||
-		docElem.mozMatchesSelector ||
-		docElem.oMatchesSelector ||
-		docElem.msMatchesSelector) )) ) {
-
-		assert(function( div ) {
-			// Check to see if it's possible to do matchesSelector
-			// on a disconnected node (IE 9)
-			support.disconnectedMatch = matches.call( div, "div" );
-
-			// This should fail with an exception
-			// Gecko does not error, returns false instead
-			matches.call( div, "[s!='']:x" );
-			rbuggyMatches.push( "!=", pseudos );
-		});
-	}
-
-	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
-	rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
-
-	/* Contains
-	---------------------------------------------------------------------- */
-
-	// Element contains another
-	// Purposefully does not implement inclusive descendent
-	// As in, an element does not contain itself
-	contains = rnative.test( docElem.contains ) || docElem.compareDocumentPosition ?
-		function( a, b ) {
-			var adown = a.nodeType === 9 ? a.documentElement : a,
-				bup = b && b.parentNode;
-			return a === bup || !!( bup && bup.nodeType === 1 && (
-				adown.contains ?
-					adown.contains( bup ) :
-					a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
-			));
-		} :
-		function( a, b ) {
-			if ( b ) {
-				while ( (b = b.parentNode) ) {
-					if ( b === a ) {
-						return true;
-					}
-				}
-			}
-			return false;
-		};
-
-	/* Sorting
-	---------------------------------------------------------------------- */
-
-	// Document order sorting
-	sortOrder = docElem.compareDocumentPosition ?
-	function( a, b ) {
-
-		// Flag for duplicate removal
-		if ( a === b ) {
-			hasDuplicate = true;
-			return 0;
-		}
-
-		var compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b );
-
-		if ( compare ) {
-			// Disconnected nodes
-			if ( compare & 1 ||
-				(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
-
-				// Choose the first element that is related to our preferred document
-				if ( a === doc || contains(preferredDoc, a) ) {
-					return -1;
-				}
-				if ( b === doc || contains(preferredDoc, b) ) {
-					return 1;
-				}
-
-				// Maintain original order
-				return sortInput ?
-					( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
-					0;
-			}
-
-			return compare & 4 ? -1 : 1;
-		}
-
-		// Not directly comparable, sort on existence of method
-		return a.compareDocumentPosition ? -1 : 1;
-	} :
-	function( a, b ) {
-		var cur,
-			i = 0,
-			aup = a.parentNode,
-			bup = b.parentNode,
-			ap = [ a ],
-			bp = [ b ];
-
-		// Exit early if the nodes are identical
-		if ( a === b ) {
-			hasDuplicate = true;
-			return 0;
-
-		// Parentless nodes are either documents or disconnected
-		} else if ( !aup || !bup ) {
-			return a === doc ? -1 :
-				b === doc ? 1 :
-				aup ? -1 :
-				bup ? 1 :
-				sortInput ?
-				( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
-				0;
-
-		// If the nodes are siblings, we can do a quick check
-		} else if ( aup === bup ) {
-			return siblingCheck( a, b );
-		}
-
-		// Otherwise we need full lists of their ancestors for comparison
-		cur = a;
-		while ( (cur = cur.parentNode) ) {
-			ap.unshift( cur );
-		}
-		cur = b;
-		while ( (cur = cur.parentNode) ) {
-			bp.unshift( cur );
-		}
-
-		// Walk down the tree looking for a discrepancy
-		while ( ap[i] === bp[i] ) {
-			i++;
-		}
-
-		return i ?
-			// Do a sibling check if the nodes have a common ancestor
-			siblingCheck( ap[i], bp[i] ) :
-
-			// Otherwise nodes in our document sort first
-			ap[i] === preferredDoc ? -1 :
-			bp[i] === preferredDoc ? 1 :
-			0;
-	};
-
-	return doc;
-};
-
-Sizzle.matches = function( expr, elements ) {
-	return Sizzle( expr, null, null, elements );
-};
-
-Sizzle.matchesSelector = function( elem, expr ) {
-	// Set document vars if needed
-	if ( ( elem.ownerDocument || elem ) !== document ) {
-		setDocument( elem );
-	}
-
-	// Make sure that attribute selectors are quoted
-	expr = expr.replace( rattributeQuotes, "='$1']" );
-
-	if ( support.matchesSelector && documentIsHTML &&
-		( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
-		( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
-
-		try {
-			var ret = matches.call( elem, expr );
-
-			// IE 9's matchesSelector returns false on disconnected nodes
-			if ( ret || support.disconnectedMatch ||
-					// As well, disconnected nodes are said to be in a document
-					// fragment in IE 9
-					elem.document && elem.document.nodeType !== 11 ) {
-				return ret;
-			}
-		} catch(e) {}
-	}
-
-	return Sizzle( expr, document, null, [elem] ).length > 0;
-};
-
-Sizzle.contains = function( context, elem ) {
-	// Set document vars if needed
-	if ( ( context.ownerDocument || context ) !== document ) {
-		setDocument( context );
-	}
-	return contains( context, elem );
-};
-
-Sizzle.attr = function( elem, name ) {
-	// Set document vars if needed
-	if ( ( elem.ownerDocument || elem ) !== document ) {
-		setDocument( elem );
-	}
-
-	var fn = Expr.attrHandle[ name.toLowerCase() ],
-		// Don't get fooled by Object.prototype properties (jQuery #13807)
-		val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
-			fn( elem, name, !documentIsHTML ) :
-			undefined;
-
-	return val === undefined ?
-		support.attributes || !documentIsHTML ?
-			elem.getAttribute( name ) :
-			(val = elem.getAttributeNode(name)) && val.specified ?
-				val.value :
-				null :
-		val;
-};
-
-Sizzle.error = function( msg ) {
-	throw new Error( "Syntax error, unrecognized expression: " + msg );
-};
-
-/**
- * Document sorting and removing duplicates
- * @param {ArrayLike} results
- */
-Sizzle.uniqueSort = function( results ) {
-	var elem,
-		duplicates = [],
-		j = 0,
-		i = 0;
-
-	// Unless we *know* we can detect duplicates, assume their presence
-	hasDuplicate = !support.detectDuplicates;
-	sortInput = !support.sortStable && results.slice( 0 );
-	results.sort( sortOrder );
-
-	if ( hasDuplicate ) {
-		while ( (elem = results[i++]) ) {
-			if ( elem === results[ i ] ) {
-				j = duplicates.push( i );
-			}
-		}
-		while ( j-- ) {
-			results.splice( duplicates[ j ], 1 );
-		}
-	}
-
-	return results;
-};
-
-/**
- * Utility function for retrieving the text value of an array of DOM nodes
- * @param {Array|Element} elem
- */
-getText = Sizzle.getText = function( elem ) {
-	var node,
-		ret = "",
-		i = 0,
-		nodeType = elem.nodeType;
-
-	if ( !nodeType ) {
-		// If no nodeType, this is expected to be an array
-		for ( ; (node = elem[i]); i++ ) {
-			// Do not traverse comment nodes
-			ret += getText( node );
-		}
-	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
-		// Use textContent for elements
-		// innerText usage removed for consistency of new lines (see #11153)
-		if ( typeof elem.textContent === "string" ) {
-			return elem.textContent;
-		} else {
-			// Traverse its children
-			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
-				ret += getText( elem );
-			}
-		}
-	} else if ( nodeType === 3 || nodeType === 4 ) {
-		return elem.nodeValue;
-	}
-	// Do not include comment or processing instruction nodes
-
-	return ret;
-};
-
-Expr = Sizzle.selectors = {
-
-	// Can be adjusted by the user
-	cacheLength: 50,
-
-	createPseudo: markFunction,
-
-	match: matchExpr,
-
-	attrHandle: {},
-
-	find: {},
-
-	relative: {
-		">": { dir: "parentNode", first: true },
-		" ": { dir: "parentNode" },
-		"+": { dir: "previousSibling", first: true },
-		"~": { dir: "previousSibling" }
-	},
-
-	preFilter: {
-		"ATTR": function( match ) {
-			match[1] = match[1].replace( runescape, funescape );
-
-			// Move the given value to match[3] whether quoted or unquoted
-			match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape );
-
-			if ( match[2] === "~=" ) {
-				match[3] = " " + match[3] + " ";
-			}
-
-			return match.slice( 0, 4 );
-		},
-
-		"CHILD": function( match ) {
-			/* matches from matchExpr["CHILD"]
-				1 type (only|nth|...)
-				2 what (child|of-type)
-				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
-				4 xn-component of xn+y argument ([+-]?\d*n|)
-				5 sign of xn-component
-				6 x of xn-component
-				7 sign of y-component
-				8 y of y-component
-			*/
-			match[1] = match[1].toLowerCase();
-
-			if ( match[1].slice( 0, 3 ) === "nth" ) {
-				// nth-* requires argument
-				if ( !match[3] ) {
-					Sizzle.error( match[0] );
-				}
-
-				// numeric x and y parameters for Expr.filter.CHILD
-				// remember that false/true cast respectively to 0/1
-				match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
-				match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
-
-			// other types prohibit arguments
-			} else if ( match[3] ) {
-				Sizzle.error( match[0] );
-			}
-
-			return match;
-		},
-
-		"PSEUDO": function( match ) {
-			var excess,
-				unquoted = !match[5] && match[2];
-
-			if ( matchExpr["CHILD"].test( match[0] ) ) {
-				return null;
-			}
-
-			// Accept quoted arguments as-is
-			if ( match[3] && match[4] !== undefined ) {
-				match[2] = match[4];
-
-			// Strip excess characters from unquoted arguments
-			} else if ( unquoted && rpseudo.test( unquoted ) &&
-				// Get excess from tokenize (recursively)
-				(excess = tokenize( unquoted, true )) &&
-				// advance to the next closing parenthesis
-				(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
-
-				// excess is a negative index
-				match[0] = match[0].slice( 0, excess );
-				match[2] = unquoted.slice( 0, excess );
-			}
-
-			// Return only captures needed by the pseudo filter method (type and argument)
-			return match.slice( 0, 3 );
-		}
-	},
-
-	filter: {
-
-		"TAG": function( nodeNameSelector ) {
-			var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
-			return nodeNameSelector === "*" ?
-				function() { return true; } :
-				function( elem ) {
-					return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
-				};
-		},
-
-		"CLASS": function( className ) {
-			var pattern = classCache[ className + " " ];
-
-			return pattern ||
-				(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
-				classCache( className, function( elem ) {
-					return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" );
-				});
-		},
-
-		"ATTR": function( name, operator, check ) {
-			return function( elem ) {
-				var result = Sizzle.attr( elem, name );
-
-				if ( result == null ) {
-					return operator === "!=";
-				}
-				if ( !operator ) {
-					return true;
-				}
-
-				result += "";
-
-				return operator === "=" ? result === check :
-					operator === "!=" ? result !== check :
-					operator === "^=" ? check && result.indexOf( check ) === 0 :
-					operator === "*=" ? check && result.indexOf( check ) > -1 :
-					operator === "$=" ? check && result.slice( -check.length ) === check :
-					operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
-					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
-					false;
-			};
-		},
-
-		"CHILD": function( type, what, argument, first, last ) {
-			var simple = type.slice( 0, 3 ) !== "nth",
-				forward = type.slice( -4 ) !== "last",
-				ofType = what === "of-type";
-
-			return first === 1 && last === 0 ?
-
-				// Shortcut for :nth-*(n)
-				function( elem ) {
-					return !!elem.parentNode;
-				} :
-
-				function( elem, context, xml ) {
-					var cache, outerCache, node, diff, nodeIndex, start,
-						dir = simple !== forward ? "nextSibling" : "previousSibling",
-						parent = elem.parentNode,
-						name = ofType && elem.nodeName.toLowerCase(),
-						useCache = !xml && !ofType;
-
-					if ( parent ) {
-
-						// :(first|last|only)-(child|of-type)
-						if ( simple ) {
-							while ( dir ) {
-								node = elem;
-								while ( (node = node[ dir ]) ) {
-									if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {
-										return false;
-									}
-								}
-								// Reverse direction for :only-* (if we haven't yet done so)
-								start = dir = type === "only" && !start && "nextSibling";
-							}
-							return true;
-						}
-
-						start = [ forward ? parent.firstChild : parent.lastChild ];
-
-						// non-xml :nth-child(...) stores cache data on `parent`
-						if ( forward && useCache ) {
-							// Seek `elem` from a previously-cached index
-							outerCache = parent[ expando ] || (parent[ expando ] = {});
-							cache = outerCache[ type ] || [];
-							nodeIndex = cache[0] === dirruns && cache[1];
-							diff = cache[0] === dirruns && cache[2];
-							node = nodeIndex && parent.childNodes[ nodeIndex ];
-
-							while ( (node = ++nodeIndex && node && node[ dir ] ||
-
-								// Fallback to seeking `elem` from the start
-								(diff = nodeIndex = 0) || start.pop()) ) {
-
-								// When found, cache indexes on `parent` and break
-								if ( node.nodeType === 1 && ++diff && node === elem ) {
-									outerCache[ type ] = [ dirruns, nodeIndex, diff ];
-									break;
-								}
-							}
-
-						// Use previously-cached element index if available
-						} else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {
-							diff = cache[1];
-
-						// xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
-						} else {
-							// Use the same loop as above to seek `elem` from the start
-							while ( (node = ++nodeIndex && node && node[ dir ] ||
-								(diff = nodeIndex = 0) || start.pop()) ) {
-
-								if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {
-									// Cache the index of each encountered element
-									if ( useCache ) {
-										(node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];
-									}
-
-									if ( node === elem ) {
-										break;
-									}
-								}
-							}
-						}
-
-						// Incorporate the offset, then check against cycle size
-						diff -= last;
-						return diff === first || ( diff % first === 0 && diff / first >= 0 );
-					}
-				};
-		},
-
-		"PSEUDO": function( pseudo, argument ) {
-			// pseudo-class names are case-insensitive
-			// http://www.w3.org/TR/selectors/#pseudo-classes
-			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
-			// Remember that setFilters inherits from pseudos
-			var args,
-				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
-					Sizzle.error( "unsupported pseudo: " + pseudo );
-
-			// The user may use createPseudo to indicate that
-			// arguments are needed to create the filter function
-			// just as Sizzle does
-			if ( fn[ expando ] ) {
-				return fn( argument );
-			}
-
-			// But maintain support for old signatures
-			if ( fn.length > 1 ) {
-				args = [ pseudo, pseudo, "", argument ];
-				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
-					markFunction(function( seed, matches ) {
-						var idx,
-							matched = fn( seed, argument ),
-							i = matched.length;
-						while ( i-- ) {
-							idx = indexOf.call( seed, matched[i] );
-							seed[ idx ] = !( matches[ idx ] = matched[i] );
-						}
-					}) :
-					function( elem ) {
-						return fn( elem, 0, args );
-					};
-			}
-
-			return fn;
-		}
-	},
-
-	pseudos: {
-		// Potentially complex pseudos
-		"not": markFunction(function( selector ) {
-			// Trim the selector passed to compile
-			// to avoid treating leading and trailing
-			// spaces as combinators
-			var input = [],
-				results = [],
-				matcher = compile( selector.replace( rtrim, "$1" ) );
-
-			return matcher[ expando ] ?
-				markFunction(function( seed, matches, context, xml ) {
-					var elem,
-						unmatched = matcher( seed, null, xml, [] ),
-						i = seed.length;
-
-					// Match elements unmatched by `matcher`
-					while ( i-- ) {
-						if ( (elem = unmatched[i]) ) {
-							seed[i] = !(matches[i] = elem);
-						}
-					}
-				}) :
-				function( elem, context, xml ) {
-					input[0] = elem;
-					matcher( input, null, xml, results );
-					return !results.pop();
-				};
-		}),
-
-		"has": markFunction(function( selector ) {
-			return function( elem ) {
-				return Sizzle( selector, elem ).length > 0;
-			};
-		}),
-
-		"contains": markFunction(function( text ) {
-			return function( elem ) {
-				return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
-			};
-		}),
-
-		// "Whether an element is represented by a :lang() selector
-		// is based solely on the element's language value
-		// being equal to the identifier C,
-		// or beginning with the identifier C immediately followed by "-".
-		// The matching of C against the element's language value is performed case-insensitively.
-		// The identifier C does not have to be a valid language name."
-		// http://www.w3.org/TR/selectors/#lang-pseudo
-		"lang": markFunction( function( lang ) {
-			// lang value must be a valid identifier
-			if ( !ridentifier.test(lang || "") ) {
-				Sizzle.error( "unsupported lang: " + lang );
-			}
-			lang = lang.replace( runescape, funescape ).toLowerCase();
-			return function( elem ) {
-				var elemLang;
-				do {
-					if ( (elemLang = documentIsHTML ?
-						elem.lang :
-						elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
-
-						elemLang = elemLang.toLowerCase();
-						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
-					}
-				} while ( (elem = elem.parentNode) && elem.nodeType === 1 );
-				return false;
-			};
-		}),
-
-		// Miscellaneous
-		"target": function( elem ) {
-			var hash = window.location && window.location.hash;
-			return hash && hash.slice( 1 ) === elem.id;
-		},
-
-		"root": function( elem ) {
-			return elem === docElem;
-		},
-
-		"focus": function( elem ) {
-			return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
-		},
-
-		// Boolean properties
-		"enabled": function( elem ) {
-			return elem.disabled === false;
-		},
-
-		"disabled": function( elem ) {
-			return elem.disabled === true;
-		},
-
-		"checked": function( elem ) {
-			// In CSS3, :checked should return both checked and selected elements
-			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
-			var nodeName = elem.nodeName.toLowerCase();
-			return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
-		},
-
-		"selected": function( elem ) {
-			// Accessing this property makes selected-by-default
-			// options in Safari work properly
-			if ( elem.parentNode ) {
-				elem.parentNode.selectedIndex;
-			}
-
-			return elem.selected === true;
-		},
-
-		// Contents
-		"empty": function( elem ) {
-			// http://www.w3.org/TR/selectors/#empty-pseudo
-			// :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),
-			//   not comment, processing instructions, or others
-			// Thanks to Diego Perini for the nodeName shortcut
-			//   Greater than "@" means alpha characters (specifically not starting with "#" or "?")
-			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
-				if ( elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4 ) {
-					return false;
-				}
-			}
-			return true;
-		},
-
-		"parent": function( elem ) {
-			return !Expr.pseudos["empty"]( elem );
-		},
-
-		// Element/input types
-		"header": function( elem ) {
-			return rheader.test( elem.nodeName );
-		},
-
-		"input": function( elem ) {
-			return rinputs.test( elem.nodeName );
-		},
-
-		"button": function( elem ) {
-			var name = elem.nodeName.toLowerCase();
-			return name === "input" && elem.type === "button" || name === "button";
-		},
-
-		"text": function( elem ) {
-			var attr;
-			// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
-			// use getAttribute instead to test this case
-			return elem.nodeName.toLowerCase() === "input" &&
-				elem.type === "text" &&
-				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === elem.type );
-		},
-
-		// Position-in-collection
-		"first": createPositionalPseudo(function() {
-			return [ 0 ];
-		}),
-
-		"last": createPositionalPseudo(function( matchIndexes, length ) {
-			return [ length - 1 ];
-		}),
-
-		"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
-			return [ argument < 0 ? argument + length : argument ];
-		}),
-
-		"even": createPositionalPseudo(function( matchIndexes, length ) {
-			var i = 0;
-			for ( ; i < length; i += 2 ) {
-				matchIndexes.push( i );
-			}
-			return matchIndexes;
-		}),
-
-		"odd": createPositionalPseudo(function( matchIndexes, length ) {
-			var i = 1;
-			for ( ; i < length; i += 2 ) {
-				matchIndexes.push( i );
-			}
-			return matchIndexes;
-		}),
-
-		"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
-			var i = argument < 0 ? argument + length : argument;
-			for ( ; --i >= 0; ) {
-				matchIndexes.push( i );
-			}
-			return matchIndexes;
-		}),
-
-		"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
-			var i = argument < 0 ? argument + length : argument;
-			for ( ; ++i < length; ) {
-				matchIndexes.push( i );
-			}
-			return matchIndexes;
-		})
-	}
-};
-
-Expr.pseudos["nth"] = Expr.pseudos["eq"];
-
-// Add button/input type pseudos
-for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
-	Expr.pseudos[ i ] = createInputPseudo( i );
-}
-for ( i in { submit: true, reset: true } ) {
-	Expr.pseudos[ i ] = createButtonPseudo( i );
-}
-
-// Easy API for creating new setFilters
-function setFilters() {}
-setFilters.prototype = Expr.filters = Expr.pseudos;
-Expr.setFilters = new setFilters();
-
-function tokenize( selector, parseOnly ) {
-	var matched, match, tokens, type,
-		soFar, groups, preFilters,
-		cached = tokenCache[ selector + " " ];
-
-	if ( cached ) {
-		return parseOnly ? 0 : cached.slice( 0 );
-	}
-
-	soFar = selector;
-	groups = [];
-	preFilters = Expr.preFilter;
-
-	while ( soFar ) {
-
-		// Comma and first run
-		if ( !matched || (match = rcomma.exec( soFar )) ) {
-			if ( match ) {
-				// Don't consume trailing commas as valid
-				soFar = soFar.slice( match[0].length ) || soFar;
-			}
-			groups.push( tokens = [] );
-		}
-
-		matched = false;
-
-		// Combinators
-		if ( (match = rcombinators.exec( soFar )) ) {
-			matched = match.shift();
-			tokens.push({
-				value: matched,
-				// Cast descendant combinators to space
-				type: match[0].replace( rtrim, " " )
-			});
-			soFar = soFar.slice( matched.length );
-		}
-
-		// Filters
-		for ( type in Expr.filter ) {
-			if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
-				(match = preFilters[ type ]( match ))) ) {
-				matched = match.shift();
-				tokens.push({
-					value: matched,
-					type: type,
-					matches: match
-				});
-				soFar = soFar.slice( matched.length );
-			}
-		}
-
-		if ( !matched ) {
-			break;
-		}
-	}
-
-	// Return the length of the invalid excess
-	// if we're just parsing
-	// Otherwise, throw an error or return tokens
-	return parseOnly ?
-		soFar.length :
-		soFar ?
-			Sizzle.error( selector ) :
-			// Cache the tokens
-			tokenCache( selector, groups ).slice( 0 );
-}
-
-function toSelector( tokens ) {
-	var i = 0,
-		len = tokens.length,
-		selector = "";
-	for ( ; i < len; i++ ) {
-		selector += tokens[i].value;
-	}
-	return selector;
-}
-
-function addCombinator( matcher, combinator, base ) {
-	var dir = combinator.dir,
-		checkNonElements = base && dir === "parentNode",
-		doneName = done++;
-
-	return combinator.first ?
-		// Check against closest ancestor/preceding element
-		function( elem, context, xml ) {
-			while ( (elem = elem[ dir ]) ) {
-				if ( elem.nodeType === 1 || checkNonElements ) {
-					return matcher( elem, context, xml );
-				}
-			}
-		} :
-
-		// Check against all ancestor/preceding elements
-		function( elem, context, xml ) {
-			var data, cache, outerCache,
-				dirkey = dirruns + " " + doneName;
-
-			// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
-			if ( xml ) {
-				while ( (elem = elem[ dir ]) ) {
-					if ( elem.nodeType === 1 || checkNonElements ) {
-						if ( matcher( elem, context, xml ) ) {
-							return true;
-						}
-					}
-				}
-			} else {
-				while ( (elem = elem[ dir ]) ) {
-					if ( elem.nodeType === 1 || checkNonElements ) {
-						outerCache = elem[ expando ] || (elem[ expando ] = {});
-						if ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {
-							if ( (data = cache[1]) === true || data === cachedruns ) {
-								return data === true;
-							}
-						} else {
-							cache = outerCache[ dir ] = [ dirkey ];
-							cache[1] = matcher( elem, context, xml ) || cachedruns;
-							if ( cache[1] === true ) {
-								return true;
-							}
-						}
-					}
-				}
-			}
-		};
-}
-
-function elementMatcher( matchers ) {
-	return matchers.length > 1 ?
-		function( elem, context, xml ) {
-			var i = matchers.length;
-			while ( i-- ) {
-				if ( !matchers[i]( elem, context, xml ) ) {
-					return false;
-				}
-			}
-			return true;
-		} :
-		matchers[0];
-}
-
-function condense( unmatched, map, filter, context, xml ) {
-	var elem,
-		newUnmatched = [],
-		i = 0,
-		len = unmatched.length,
-		mapped = map != null;
-
-	for ( ; i < len; i++ ) {
-		if ( (elem = unmatched[i]) ) {
-			if ( !filter || filter( elem, context, xml ) ) {
-				newUnmatched.push( elem );
-				if ( mapped ) {
-					map.push( i );
-				}
-			}
-		}
-	}
-
-	return newUnmatched;
-}
-
-function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
-	if ( postFilter && !postFilter[ expando ] ) {
-		postFilter = setMatcher( postFilter );
-	}
-	if ( postFinder && !postFinder[ expando ] ) {
-		postFinder = setMatcher( postFinder, postSelector );
-	}
-	return markFunction(function( seed, results, context, xml ) {
-		var temp, i, elem,
-			preMap = [],
-			postMap = [],
-			preexisting = results.length,
-
-			// Get initial elements from seed or context
-			elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
-
-			// Prefilter to get matcher input, preserving a map for seed-results synchronization
-			matcherIn = preFilter && ( seed || !selector ) ?
-				condense( elems, preMap, preFilter, context, xml ) :
-				elems,
-
-			matcherOut = matcher ?
-				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
-				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
-
-					// ...intermediate processing is necessary
-					[] :
-
-					// ...otherwise use results directly
-					results :
-				matcherIn;
-
-		// Find primary matches
-		if ( matcher ) {
-			matcher( matcherIn, matcherOut, context, xml );
-		}
-
-		// Apply postFilter
-		if ( postFilter ) {
-			temp = condense( matcherOut, postMap );
-			postFilter( temp, [], context, xml );
-
-			// Un-match failing elements by moving them back to matcherIn
-			i = temp.length;
-			while ( i-- ) {
-				if ( (elem = temp[i]) ) {
-					matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
-				}
-			}
-		}
-
-		if ( seed ) {
-			if ( postFinder || preFilter ) {
-				if ( postFinder ) {
-					// Get the final matcherOut by condensing this intermediate into postFinder contexts
-					temp = [];
-					i = matcherOut.length;
-					while ( i-- ) {
-						if ( (elem = matcherOut[i]) ) {
-							// Restore matcherIn since elem is not yet a final match
-							temp.push( (matcherIn[i] = elem) );
-						}
-					}
-					postFinder( null, (matcherOut = []), temp, xml );
-				}
-
-				// Move matched elements from seed to results to keep them synchronized
-				i = matcherOut.length;
-				while ( i-- ) {
-					if ( (elem = matcherOut[i]) &&
-						(temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
-
-						seed[temp] = !(results[temp] = elem);
-					}
-				}
-			}
-
-		// Add elements to results, through postFinder if defined
-		} else {
-			matcherOut = condense(
-				matcherOut === results ?
-					matcherOut.splice( preexisting, matcherOut.length ) :
-					matcherOut
-			);
-			if ( postFinder ) {
-				postFinder( null, results, matcherOut, xml );
-			} else {
-				push.apply( results, matcherOut );
-			}
-		}
-	});
-}
-
-function matcherFromTokens( tokens ) {
-	var checkContext, matcher, j,
-		len = tokens.length,
-		leadingRelative = Expr.relative[ tokens[0].type ],
-		implicitRelative = leadingRelative || Expr.relative[" "],
-		i = leadingRelative ? 1 : 0,
-
-		// The foundational matcher ensures that elements are reachable from top-level context(s)
-		matchContext = addCombinator( function( elem ) {
-			return elem === checkContext;
-		}, implicitRelative, true ),
-		matchAnyContext = addCombinator( function( elem ) {
-			return indexOf.call( checkContext, elem ) > -1;
-		}, implicitRelative, true ),
-		matchers = [ function( elem, context, xml ) {
-			return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
-				(checkContext = context).nodeType ?
-					matchContext( elem, context, xml ) :
-					matchAnyContext( elem, context, xml ) );
-		} ];
-
-	for ( ; i < len; i++ ) {
-		if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
-			matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
-		} else {
-			matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
-
-			// Return special upon seeing a positional matcher
-			if ( matcher[ expando ] ) {
-				// Find the next relative operator (if any) for proper handling
-				j = ++i;
-				for ( ; j < len; j++ ) {
-					if ( Expr.relative[ tokens[j].type ] ) {
-						break;
-					}
-				}
-				return setMatcher(
-					i > 1 && elementMatcher( matchers ),
-					i > 1 && toSelector(
-						// If the preceding token was a descendant combinator, insert an implicit any-element `*`
-						tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
-					).replace( rtrim, "$1" ),
-					matcher,
-					i < j && matcherFromTokens( tokens.slice( i, j ) ),
-					j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
-					j < len && toSelector( tokens )
-				);
-			}
-			matchers.push( matcher );
-		}
-	}
-
-	return elementMatcher( matchers );
-}
-
-function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
-	// A counter to specify which element is currently being matched
-	var matcherCachedRuns = 0,
-		bySet = setMatchers.length > 0,
-		byElement = elementMatchers.length > 0,
-		superMatcher = function( seed, context, xml, results, expandContext ) {
-			var elem, j, matcher,
-				setMatched = [],
-				matchedCount = 0,
-				i = "0",
-				unmatched = seed && [],
-				outermost = expandContext != null,
-				contextBackup = outermostContext,
-				// We must always have either seed elements or context
-				elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ),
-				// Use integer dirruns iff this is the outermost matcher
-				dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1);
-
-			if ( outermost ) {
-				outermostContext = context !== document && context;
-				cachedruns = matcherCachedRuns;
-			}
-
-			// Add elements passing elementMatchers directly to results
-			// Keep `i` a string if there are no elements so `matchedCount` will be "00" below
-			for ( ; (elem = elems[i]) != null; i++ ) {
-				if ( byElement && elem ) {
-					j = 0;
-					while ( (matcher = elementMatchers[j++]) ) {
-						if ( matcher( elem, context, xml ) ) {
-							results.push( elem );
-							break;
-						}
-					}
-					if ( outermost ) {
-						dirruns = dirrunsUnique;
-						cachedruns = ++matcherCachedRuns;
-					}
-				}
-
-				// Track unmatched elements for set filters
-				if ( bySet ) {
-					// They will have gone through all possible matchers
-					if ( (elem = !matcher && elem) ) {
-						matchedCount--;
-					}
-
-					// Lengthen the array for every element, matched or not
-					if ( seed ) {
-						unmatched.push( elem );
-					}
-				}
-			}
-
-			// Apply set filters to unmatched elements
-			matchedCount += i;
-			if ( bySet && i !== matchedCount ) {
-				j = 0;
-				while ( (matcher = setMatchers[j++]) ) {
-					matcher( unmatched, setMatched, context, xml );
-				}
-
-				if ( seed ) {
-					// Reintegrate element matches to eliminate the need for sorting
-					if ( matchedCount > 0 ) {
-						while ( i-- ) {
-							if ( !(unmatched[i] || setMatched[i]) ) {
-								setMatched[i] = pop.call( results );
-							}
-						}
-					}
-
-					// Discard index placeholder values to get only actual matches
-					setMatched = condense( setMatched );
-				}
-
-				// Add matches to results
-				push.apply( results, setMatched );
-
-				// Seedless set matches succeeding multiple successful matchers stipulate sorting
-				if ( outermost && !seed && setMatched.length > 0 &&
-					( matchedCount + setMatchers.length ) > 1 ) {
-
-					Sizzle.uniqueSort( results );
-				}
-			}
-
-			// Override manipulation of globals by nested matchers
-			if ( outermost ) {
-				dirruns = dirrunsUnique;
-				outermostContext = contextBackup;
-			}
-
-			return unmatched;
-		};
-
-	return bySet ?
-		markFunction( superMatcher ) :
-		superMatcher;
-}
-
-compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {
-	var i,
-		setMatchers = [],
-		elementMatchers = [],
-		cached = compilerCache[ selector + " " ];
-
-	if ( !cached ) {
-		// Generate a function of recursive functions that can be used to check each element
-		if ( !group ) {
-			group = tokenize( selector );
-		}
-		i = group.length;
-		while ( i-- ) {
-			cached = matcherFromTokens( group[i] );
-			if ( cached[ expando ] ) {
-				setMatchers.push( cached );
-			} else {
-				elementMatchers.push( cached );
-			}
-		}
-
-		// Cache the compiled function
-		cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
-	}
-	return cached;
-};
-
-function multipleContexts( selector, contexts, results ) {
-	var i = 0,
-		len = contexts.length;
-	for ( ; i < len; i++ ) {
-		Sizzle( selector, contexts[i], results );
-	}
-	return results;
-}
-
-function select( selector, context, results, seed ) {
-	var i, tokens, token, type, find,
-		match = tokenize( selector );
-
-	if ( !seed ) {
-		// Try to minimize operations if there is only one group
-		if ( match.length === 1 ) {
-
-			// Take a shortcut and set the context if the root selector is an ID
-			tokens = match[0] = match[0].slice( 0 );
-			if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
-					support.getById && context.nodeType === 9 && documentIsHTML &&
-					Expr.relative[ tokens[1].type ] ) {
-
-				context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
-				if ( !context ) {
-					return results;
-				}
-				selector = selector.slice( tokens.shift().value.length );
-			}
-
-			// Fetch a seed set for right-to-left matching
-			i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
-			while ( i-- ) {
-				token = tokens[i];
-
-				// Abort if we hit a combinator
-				if ( Expr.relative[ (type = token.type) ] ) {
-					break;
-				}
-				if ( (find = Expr.find[ type ]) ) {
-					// Search, expanding context for leading sibling combinators
-					if ( (seed = find(
-						token.matches[0].replace( runescape, funescape ),
-						rsibling.test( tokens[0].type ) && context.parentNode || context
-					)) ) {
-
-						// If seed is empty or no tokens remain, we can return early
-						tokens.splice( i, 1 );
-						selector = seed.length && toSelector( tokens );
-						if ( !selector ) {
-							push.apply( results, seed );
-							return results;
-						}
-
-						break;
-					}
-				}
-			}
-		}
-	}
-
-	// Compile and execute a filtering function
-	// Provide `match` to avoid retokenization if we modified the selector above
-	compile( selector, match )(
-		seed,
-		context,
-		!documentIsHTML,
-		results,
-		rsibling.test( selector )
-	);
-	return results;
-}
-
-// One-time assignments
-
-// Sort stability
-support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
-
-// Support: Chrome<14
-// Always assume duplicates if they aren't passed to the comparison function
-support.detectDuplicates = hasDuplicate;
-
-// Initialize against the default document
-setDocument();
-
-// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
-// Detached nodes confoundingly follow *each other*
-support.sortDetached = assert(function( div1 ) {
-	// Should return 1, but returns 4 (following)
-	return div1.compareDocumentPosition( document.createElement("div") ) & 1;
-});
-
-// Support: IE<8
-// Prevent attribute/property "interpolation"
-// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
-if ( !assert(function( div ) {
-	div.innerHTML = "<a href='#'></a>";
-	return div.firstChild.getAttribute("href") === "#" ;
-}) ) {
-	addHandle( "type|href|height|width", function( elem, name, isXML ) {
-		if ( !isXML ) {
-			return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
-		}
-	});
-}
-
-// Support: IE<9
-// Use defaultValue in place of getAttribute("value")
-if ( !support.attributes || !assert(function( div ) {
-	div.innerHTML = "<input/>";
-	div.firstChild.setAttribute( "value", "" );
-	return div.firstChild.getAttribute( "value" ) === "";
-}) ) {
-	addHandle( "value", function( elem, name, isXML ) {
-		if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
-			return elem.defaultValue;
-		}
-	});
-}
-
-// Support: IE<9
-// Use getAttributeNode to fetch booleans when getAttribute lies
-if ( !assert(function( div ) {
-	return div.getAttribute("disabled") == null;
-}) ) {
-	addHandle( booleans, function( elem, name, isXML ) {
-		var val;
-		if ( !isXML ) {
-			return (val = elem.getAttributeNode( name )) && val.specified ?
-				val.value :
-				elem[ name ] === true ? name.toLowerCase() : null;
-		}
-	});
-}
-
-jQuery.find = Sizzle;
-jQuery.expr = Sizzle.selectors;
-jQuery.expr[":"] = jQuery.expr.pseudos;
-jQuery.unique = Sizzle.uniqueSort;
-jQuery.text = Sizzle.getText;
-jQuery.isXMLDoc = Sizzle.isXML;
-jQuery.contains = Sizzle.contains;
-
-
-})( window );
-// String to Object options format cache
-var optionsCache = {};
-
-// Convert String-formatted options into Object-formatted ones and store in cache
-function createOptions( options ) {
-	var object = optionsCache[ options ] = {};
-	jQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) {
-		object[ flag ] = true;
-	});
-	return object;
-}
-
-/*
- * Create a callback list using the following parameters:
- *
- *	options: an optional list of space-separated options that will change how
- *			the callback list behaves or a more traditional option object
- *
- * By default a callback list will act like an event callback list and can be
- * "fired" multiple times.
- *
- * Possible options:
- *
- *	once:			will ensure the callback list can only be fired once (like a Deferred)
- *
- *	memory:			will keep track of previous values and will call any callback added
- *					after the list has been fired right away with the latest "memorized"
- *					values (like a Deferred)
- *
- *	unique:			will ensure a callback can only be added once (no duplicate in the list)
- *
- *	stopOnFalse:	interrupt callings when a callback returns false
- *
- */
-jQuery.Callbacks = function( options ) {
-
-	// Convert options from String-formatted to Object-formatted if needed
-	// (we check in cache first)
-	options = typeof options === "string" ?
-		( optionsCache[ options ] || createOptions( options ) ) :
-		jQuery.extend( {}, options );
-
-	var // Flag to know if list is currently firing
-		firing,
-		// Last fire value (for non-forgettable lists)
-		memory,
-		// Flag to know if list was already fired
-		fired,
-		// End of the loop when firing
-		firingLength,
-		// Index of currently firing callback (modified by remove if needed)
-		firingIndex,
-		// First callback to fire (used internally by add and fireWith)
-		firingStart,
-		// Actual callback list
-		list = [],
-		// Stack of fire calls for repeatable lists
-		stack = !options.once && [],
-		// Fire callbacks
-		fire = function( data ) {
-			memory = options.memory && data;
-			fired = true;
-			firingIndex = firingStart || 0;
-			firingStart = 0;
-			firingLength = list.length;
-			firing = true;
-			for ( ; list && firingIndex < firingLength; firingIndex++ ) {
-				if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
-					memory = false; // To prevent further calls using add
-					break;
-				}
-			}
-			firing = false;
-			if ( list ) {
-				if ( stack ) {
-					if ( stack.length ) {
-						fire( stack.shift() );
-					}
-				} else if ( memory ) {
-					list = [];
-				} else {
-					self.disable();
-				}
-			}
-		},
-		// Actual Callbacks object
-		self = {
-			// Add a callback or a collection of callbacks to the list
-			add: function() {
-				if ( list ) {
-					// First, we save the current length
-					var start = list.length;
-					(function add( args ) {
-						jQuery.each( args, function( _, arg ) {
-							var type = jQuery.type( arg );
-							if ( type === "function" ) {
-								if ( !options.unique || !self.has( arg ) ) {
-									list.push( arg );
-								}
-							} else if ( arg && arg.length && type !== "string" ) {
-								// Inspect recursively
-								add( arg );
-							}
-						});
-					})( arguments );
-					// Do we need to add the callbacks to the
-					// current firing batch?
-					if ( firing ) {
-						firingLength = list.length;
-					// With memory, if we're not firing then
-					// we should call right away
-					} else if ( memory ) {
-						firingStart = start;
-						fire( memory );
-					}
-				}
-				return this;
-			},
-			// Remove a callback from the list
-			remove: function() {
-				if ( list ) {
-					jQuery.each( arguments, function( _, arg ) {
-						var index;
-						while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
-							list.splice( index, 1 );
-							// Handle firing indexes
-							if ( firing ) {
-								if ( index <= firingLength ) {
-									firingLength--;
-								}
-								if ( index <= firingIndex ) {
-									firingIndex--;
-								}
-							}
-						}
-					});
-				}
-				return this;
-			},
-			// Check if a given callback is in the list.
-			// If no argument is given, return whether or not list has callbacks attached.
-			has: function( fn ) {
-				return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );
-			},
-			// Remove all callbacks from the list
-			empty: function() {
-				list = [];
-				firingLength = 0;
-				return this;
-			},
-			// Have the list do nothing anymore
-			disable: function() {
-				list = stack = memory = undefined;
-				return this;
-			},
-			// Is it disabled?
-			disabled: function() {
-				return !list;
-			},
-			// Lock the list in its current state
-			lock: function() {
-				stack = undefined;
-				if ( !memory ) {
-					self.disable();
-				}
-				return this;
-			},
-			// Is it locked?
-			locked: function() {
-				return !stack;
-			},
-			// Call all callbacks with the given context and arguments
-			fireWith: function( context, args ) {
-				if ( list && ( !fired || stack ) ) {
-					args = args || [];
-					args = [ context, args.slice ? args.slice() : args ];
-					if ( firing ) {
-						stack.push( args );
-					} else {
-						fire( args );
-					}
-				}
-				return this;
-			},
-			// Call all the callbacks with the given arguments
-			fire: function() {
-				self.fireWith( this, arguments );
-				return this;
-			},
-			// To know if the callbacks have already been called at least once
-			fired: function() {
-				return !!fired;
-			}
-		};
-
-	return self;
-};
-jQuery.extend({
-
-	Deferred: function( func ) {
-		var tuples = [
-				// action, add listener, listener list, final state
-				[ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
-				[ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
-				[ "notify", "progress", jQuery.Callbacks("memory") ]
-			],
-			state = "pending",
-			promise = {
-				state: function() {
-					return state;
-				},
-				always: function() {
-					deferred.done( arguments ).fail( arguments );
-					return this;
-				},
-				then: function( /* fnDone, fnFail, fnProgress */ ) {
-					var fns = arguments;
-					return jQuery.Deferred(function( newDefer ) {
-						jQuery.each( tuples, function( i, tuple ) {
-							var action = tuple[ 0 ],
-								fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
-							// deferred[ done | fail | progress ] for forwarding actions to newDefer
-							deferred[ tuple[1] ](function() {
-								var returned = fn && fn.apply( this, arguments );
-								if ( returned && jQuery.isFunction( returned.promise ) ) {
-									returned.promise()
-										.done( newDefer.resolve )
-										.fail( newDefer.reject )
-										.progress( newDefer.notify );
-								} else {
-									newDefer[ action + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
-								}
-							});
-						});
-						fns = null;
-					}).promise();
-				},
-				// Get a promise for this deferred
-				// If obj is provided, the promise aspect is added to the object
-				promise: function( obj ) {
-					return obj != null ? jQuery.extend( obj, promise ) : promise;
-				}
-			},
-			deferred = {};
-
-		// Keep pipe for back-compat
-		promise.pipe = promise.then;
-
-		// Add list-specific methods
-		jQuery.each( tuples, function( i, tuple ) {
-			var list = tuple[ 2 ],
-				stateString = tuple[ 3 ];
-
-			// promise[ done | fail | progress ] = list.add
-			promise[ tuple[1] ] = list.add;
-
-			// Handle state
-			if ( stateString ) {
-				list.add(function() {
-					// state = [ resolved | rejected ]
-					state = stateString;
-
-				// [ reject_list | resolve_list ].disable; progress_list.lock
-				}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
-			}
-
-			// deferred[ resolve | reject | notify ]
-			deferred[ tuple[0] ] = function() {
-				deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
-				return this;
-			};
-			deferred[ tuple[0] + "With" ] = list.fireWith;
-		});
-
-		// Make the deferred a promise
-		promise.promise( deferred );
-
-		// Call given func if any
-		if ( func ) {
-			func.call( deferred, deferred );
-		}
-
-		// All done!
-		return deferred;
-	},
-
-	// Deferred helper
-	when: function( subordinate /* , ..., subordinateN */ ) {
-		var i = 0,
-			resolveValues = core_slice.call( arguments ),
-			length = resolveValues.length,
-
-			// the count of uncompleted subordinates
-			remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
-
-			// the master Deferred. If resolveValues consist of only a single Deferred, just use that.
-			deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
-
-			// Update function for both resolve and progress values
-			updateFunc = function( i, contexts, values ) {
-				return function( value ) {
-					contexts[ i ] = this;
-					values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
-					if( values === progressValues ) {
-						deferred.notifyWith( contexts, values );
-					} else if ( !( --remaining ) ) {
-						deferred.resolveWith( contexts, values );
-					}
-				};
-			},
-
-			progressValues, progressContexts, resolveContexts;
-
-		// add listeners to Deferred subordinates; treat others as resolved
-		if ( length > 1 ) {
-			progressValues = new Array( length );
-			progressContexts = new Array( length );
-			resolveContexts = new Array( length );
-			for ( ; i < length; i++ ) {
-				if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
-					resolveValues[ i ].promise()
-						.done( updateFunc( i, resolveContexts, resolveValues ) )
-						.fail( deferred.reject )
-						.progress( updateFunc( i, progressContexts, progressValues ) );
-				} else {
-					--remaining;
-				}
-			}
-		}
-
-		// if we're not waiting on anything, resolve the master
-		if ( !remaining ) {
-			deferred.resolveWith( resolveContexts, resolveValues );
-		}
-
-		return deferred.promise();
-	}
-});
-jQuery.support = (function( support ) {
-
-	var all, a, input, select, fragment, opt, eventName, isSupported, i,
-		div = document.createElement("div");
-
-	// Setup
-	div.setAttribute( "className", "t" );
-	div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
-
-	// Finish early in limited (non-browser) environments
-	all = div.getElementsByTagName("*") || [];
-	a = div.getElementsByTagName("a")[ 0 ];
-	if ( !a || !a.style || !all.length ) {
-		return support;
-	}
-
-	// First batch of tests
-	select = document.createElement("select");
-	opt = select.appendChild( document.createElement("option") );
-	input = div.getElementsByTagName("input")[ 0 ];
-
-	a.style.cssText = "top:1px;float:left;opacity:.5";
-
-	// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
-	support.getSetAttribute = div.className !== "t";
-
-	// IE strips leading whitespace when .innerHTML is used
-	support.leadingWhitespace = div.firstChild.nodeType === 3;
-
-	// Make sure that tbody elements aren't automatically inserted
-	// IE will insert them into empty tables
-	support.tbody = !div.getElementsByTagName("tbody").length;
-
-	// Make sure that link elements get serialized correctly by innerHTML
-	// This requires a wrapper element in IE
-	support.htmlSerialize = !!div.getElementsByTagName("link").length;
-
-	// Get the style information from getAttribute
-	// (IE uses .cssText instead)
-	support.style = /top/.test( a.getAttribute("style") );
-
-	// Make sure that URLs aren't manipulated
-	// (IE normalizes it by default)
-	support.hrefNormalized = a.getAttribute("href") === "/a";
-
-	// Make sure that element opacity exists
-	// (IE uses filter instead)
-	// Use a regex to work around a WebKit issue. See #5145
-	support.opacity = /^0.5/.test( a.style.opacity );
-
-	// Verify style float existence
-	// (IE uses styleFloat instead of cssFloat)
-	support.cssFloat = !!a.style.cssFloat;
-
-	// Check the default checkbox/radio value ("" on WebKit; "on" elsewhere)
-	support.checkOn = !!input.value;
-
-	// Make sure that a selected-by-default option has a working selected property.
-	// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
-	support.optSelected = opt.selected;
-
-	// Tests for enctype support on a form (#6743)
-	support.enctype = !!document.createElement("form").enctype;
-
-	// Makes sure cloning an html5 element does not cause problems
-	// Where outerHTML is undefined, this still works
-	support.html5Clone = document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>";
-
-	// Will be defined later
-	support.inlineBlockNeedsLayout = false;
-	support.shrinkWrapBlocks = false;
-	support.pixelPosition = false;
-	support.deleteExpando = true;
-	support.noCloneEvent = true;
-	support.reliableMarginRight = true;
-	support.boxSizingReliable = true;
-
-	// Make sure checked status is properly cloned
-	input.checked = true;
-	support.noCloneChecked = input.cloneNode( true ).checked;
-
-	// Make sure that the options inside disabled selects aren't marked as disabled
-	// (WebKit marks them as disabled)
-	select.disabled = true;
-	support.optDisabled = !opt.disabled;
-
-	// Support: IE<9
-	try {
-		delete div.test;
-	} catch( e ) {
-		support.deleteExpando = false;
-	}
-
-	// Check if we can trust getAttribute("value")
-	input = document.createElement("input");
-	input.setAttribute( "value", "" );
-	support.input = input.getAttribute( "value" ) === "";
-
-	// Check if an input maintains its value after becoming a radio
-	input.value = "t";
-	input.setAttribute( "type", "radio" );
-	support.radioValue = input.value === "t";
-
-	// #11217 - WebKit loses check when the name is after the checked attribute
-	input.setAttribute( "checked", "t" );
-	input.setAttribute( "name", "t" );
-
-	fragment = document.createDocumentFragment();
-	fragment.appendChild( input );
-
-	// Check if a disconnected checkbox will retain its checked
-	// value of true after appended to the DOM (IE6/7)
-	support.appendChecked = input.checked;
-
-	// WebKit doesn't clone checked state correctly in fragments
-	support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
-
-	// Support: IE<9
-	// Opera does not clone events (and typeof div.attachEvent === undefined).
-	// IE9-10 clones events bound via attachEvent, but they don't trigger with .click()
-	if ( div.attachEvent ) {
-		div.attachEvent( "onclick", function() {
-			support.noCloneEvent = false;
-		});
-
-		div.cloneNode( true ).click();
-	}
-
-	// Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event)
-	// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)
-	for ( i in { submit: true, change: true, focusin: true }) {
-		div.setAttribute( eventName = "on" + i, "t" );
-
-		support[ i + "Bubbles" ] = eventName in window || div.attributes[ eventName ].expando === false;
-	}
-
-	div.style.backgroundClip = "content-box";
-	div.cloneNode( true ).style.backgroundClip = "";
-	support.clearCloneStyle = div.style.backgroundClip === "content-box";
-
-	// Support: IE<9
-	// Iteration over object's inherited properties before its own.
-	for ( i in jQuery( support ) ) {
-		break;
-	}
-	support.ownLast = i !== "0";
-
-	// Run tests that need a body at doc ready
-	jQuery(function() {
-		var container, marginDiv, tds,
-			divReset = "padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",
-			body = document.getElementsByTagName("body")[0];
-
-		if ( !body ) {
-			// Return for frameset docs that don't have a body
-			return;
-		}
-
-		container = document.createElement("div");
-		container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px";
-
-		body.appendChild( container ).appendChild( div );
-
-		// Support: IE8
-		// Check if table cells still have offsetWidth/Height when they are set
-		// to display:none and there are still other visible table cells in a
-		// table row; if so, offsetWidth/Height are not reliable for use when
-		// determining if an element has been hidden directly using
-		// display:none (it is still safe to use offsets if a parent element is
-		// hidden; don safety goggles and see bug #4512 for more information).
-		div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
-		tds = div.getElementsByTagName("td");
-		tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
-		isSupported = ( tds[ 0 ].offsetHeight === 0 );
-
-		tds[ 0 ].style.display = "";
-		tds[ 1 ].style.display = "none";
-
-		// Support: IE8
-		// Check if empty table cells still have offsetWidth/Height
-		support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
-
-		// Check box-sizing and margin behavior.
-		div.innerHTML = "";
-		div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
-
-		// Workaround failing boxSizing test due to offsetWidth returning wrong value
-		// with some non-1 values of body zoom, ticket #13543
-		jQuery.swap( body, body.style.zoom != null ? { zoom: 1 } : {}, function() {
-			support.boxSizing = div.offsetWidth === 4;
-		});
-
-		// Use window.getComputedStyle because jsdom on node.js will break without it.
-		if ( window.getComputedStyle ) {
-			support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
-			support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
-
-			// Check if div with explicit width and no margin-right incorrectly
-			// gets computed margin-right based on width of container. (#3333)
-			// Fails in WebKit before Feb 2011 nightlies
-			// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
-			marginDiv = div.appendChild( document.createElement("div") );
-			marginDiv.style.cssText = div.style.cssText = divReset;
-			marginDiv.style.marginRight = marginDiv.style.width = "0";
-			div.style.width = "1px";
-
-			support.reliableMarginRight =
-				!parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
-		}
-
-		if ( typeof div.style.zoom !== core_strundefined ) {
-			// Support: IE<8
-			// Check if natively block-level elements act like inline-block
-			// elements when setting their display to 'inline' and giving
-			// them layout
-			div.innerHTML = "";
-			div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
-			support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
-
-			// Support: IE6
-			// Check if elements with layout shrink-wrap their children
-			div.style.display = "block";
-			div.innerHTML = "<div></div>";
-			div.firstChild.style.width = "5px";
-			support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
-
-			if ( support.inlineBlockNeedsLayout ) {
-				// Prevent IE 6 from affecting layout for positioned elements #11048
-				// Prevent IE from shrinking the body in IE 7 mode #12869
-				// Support: IE<8
-				body.style.zoom = 1;
-			}
-		}
-
-		body.removeChild( container );
-
-		// Null elements to avoid leaks in IE
-		container = div = tds = marginDiv = null;
-	});
-
-	// Null elements to avoid leaks in IE
-	all = select = fragment = opt = a = input = null;
-
-	return support;
-})({});
-
-var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
-	rmultiDash = /([A-Z])/g;
-
-function internalData( elem, name, data, pvt /* Internal Use Only */ ){
-	if ( !jQuery.acceptData( elem ) ) {
-		return;
-	}
-
-	var ret, thisCache,
-		internalKey = jQuery.expando,
-
-		// We have to handle DOM nodes and JS objects differently because IE6-7
-		// can't GC object references properly across the DOM-JS boundary
-		isNode = elem.nodeType,
-
-		// Only DOM nodes need the global jQuery cache; JS object data is
-		// attached directly to the object so GC can occur automatically
-		cache = isNode ? jQuery.cache : elem,
-
-		// Only defining an ID for JS objects if its cache already exists allows
-		// the code to shortcut on the same path as a DOM node with no cache
-		id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
-
-	// Avoid doing any more work than we need to when trying to get data on an
-	// object that has no data at all
-	if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === "string" ) {
-		return;
-	}
-
-	if ( !id ) {
-		// Only DOM nodes need a new unique ID for each element since their data
-		// ends up in the global cache
-		if ( isNode ) {
-			id = elem[ internalKey ] = core_deletedIds.pop() || jQuery.guid++;
-		} else {
-			id = internalKey;
-		}
-	}
-
-	if ( !cache[ id ] ) {
-		// Avoid exposing jQuery metadata on plain JS objects when the object
-		// is serialized using JSON.stringify
-		cache[ id ] = isNode ? {} : { toJSON: jQuery.noop };
-	}
-
-	// An object can be passed to jQuery.data instead of a key/value pair; this gets
-	// shallow copied over onto the existing cache
-	if ( typeof name === "object" || typeof name === "function" ) {
-		if ( pvt ) {
-			cache[ id ] = jQuery.extend( cache[ id ], name );
-		} else {
-			cache[ id ].data = jQuery.extend( cache[ id ].data, name );
-		}
-	}
-
-	thisCache = cache[ id ];
-
-	// jQuery data() is stored in a separate object inside the object's internal data
-	// cache in order to avoid key collisions between internal data and user-defined
-	// data.
-	if ( !pvt ) {
-		if ( !thisCache.data ) {
-			thisCache.data = {};
-		}
-
-		thisCache = thisCache.data;
-	}
-
-	if ( data !== undefined ) {
-		thisCache[ jQuery.camelCase( name ) ] = data;
-	}
-
-	// Check for both converted-to-camel and non-converted data property names
-	// If a data property was specified
-	if ( typeof name === "string" ) {
-
-		// First Try to find as-is property data
-		ret = thisCache[ name ];
-
-		// Test for null|undefined property data
-		if ( ret == null ) {
-
-			// Try to find the camelCased property
-			ret = thisCache[ jQuery.camelCase( name ) ];
-		}
-	} else {
-		ret = thisCache;
-	}
-
-	return ret;
-}
-
-function internalRemoveData( elem, name, pvt ) {
-	if ( !jQuery.acceptData( elem ) ) {
-		return;
-	}
-
-	var thisCache, i,
-		isNode = elem.nodeType,
-
-		// See jQuery.data for more information
-		cache = isNode ? jQuery.cache : elem,
-		id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
-
-	// If there is already no cache entry for this object, there is no
-	// purpose in continuing
-	if ( !cache[ id ] ) {
-		return;
-	}
-
-	if ( name ) {
-
-		thisCache = pvt ? cache[ id ] : cache[ id ].data;
-
-		if ( thisCache ) {
-
-			// Support array or space separated string names for data keys
-			if ( !jQuery.isArray( name ) ) {
-
-				// try the string as a key before any manipulation
-				if ( name in thisCache ) {
-					name = [ name ];
-				} else {
-
-					// split the camel cased version by spaces unless a key with the spaces exists
-					name = jQuery.camelCase( name );
-					if ( name in thisCache ) {
-						name = [ name ];
-					} else {
-						name = name.split(" ");
-					}
-				}
-			} else {
-				// If "name" is an array of keys...
-				// When data is initially created, via ("key", "val") signature,
-				// keys will be converted to camelCase.
-				// Since there is no way to tell _how_ a key was added, remove
-				// both plain key and camelCase key. #12786
-				// This will only penalize the array argument path.
-				name = name.concat( jQuery.map( name, jQuery.camelCase ) );
-			}
-
-			i = name.length;
-			while ( i-- ) {
-				delete thisCache[ name[i] ];
-			}
-
-			// If there is no data left in the cache, we want to continue
-			// and let the cache object itself get destroyed
-			if ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) {
-				return;
-			}
-		}
-	}
-
-	// See jQuery.data for more information
-	if ( !pvt ) {
-		delete cache[ id ].data;
-
-		// Don't destroy the parent cache unless the internal data object
-		// had been the only thing left in it
-		if ( !isEmptyDataObject( cache[ id ] ) ) {
-			return;
-		}
-	}
-
-	// Destroy the cache
-	if ( isNode ) {
-		jQuery.cleanData( [ elem ], true );
-
-	// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
-	/* jshint eqeqeq: false */
-	} else if ( jQuery.support.deleteExpando || cache != cache.window ) {
-		/* jshint eqeqeq: true */
-		delete cache[ id ];
-
-	// When all else fails, null
-	} else {
-		cache[ id ] = null;
-	}
-}
-
-jQuery.extend({
-	cache: {},
-
-	// The following elements throw uncatchable exceptions if you
-	// attempt to add expando properties to them.
-	noData: {
-		"applet": true,
-		"embed": true,
-		// Ban all objects except for Flash (which handle expandos)
-		"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
-	},
-
-	hasData: function( elem ) {
-		elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
-		return !!elem && !isEmptyDataObject( elem );
-	},
-
-	data: function( elem, name, data ) {
-		return internalData( elem, name, data );
-	},
-
-	removeData: function( elem, name ) {
-		return internalRemoveData( elem, name );
-	},
-
-	// For internal use only.
-	_data: function( elem, name, data ) {
-		return internalData( elem, name, data, true );
-	},
-
-	_removeData: function( elem, name ) {
-		return internalRemoveData( elem, name, true );
-	},
-
-	// A method for determining if a DOM node can handle the data expando
-	acceptData: function( elem ) {
-		// Do not set data on non-element because it will not be cleared (#8335).
-		if ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) {
-			return false;
-		}
-
-		var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
-
-		// nodes accept data unless otherwise specified; rejection can be conditional
-		return !noData || noData !== true && elem.getAttribute("classid") === noData;
-	}
-});
-
-jQuery.fn.extend({
-	data: function( key, value ) {
-		var attrs, name,
-			data = null,
-			i = 0,
-			elem = this[0];
-
-		// Special expections of .data basically thwart jQuery.access,
-		// so implement the relevant behavior ourselves
-
-		// Gets all values
-		if ( key === undefined ) {
-			if ( this.length ) {
-				data = jQuery.data( elem );
-
-				if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
-					attrs = elem.attributes;
-					for ( ; i < attrs.length; i++ ) {
-						name = attrs[i].name;
-
-						if ( name.indexOf("data-") === 0 ) {
-							name = jQuery.camelCase( name.slice(5) );
-
-							dataAttr( elem, name, data[ name ] );
-						}
-					}
-					jQuery._data( elem, "parsedAttrs", true );
-				}
-			}
-
-			return data;
-		}
-
-		// Sets multiple values
-		if ( typeof key === "object" ) {
-			return this.each(function() {
-				jQuery.data( this, key );
-			});
-		}
-
-		return arguments.length > 1 ?
-
-			// Sets one value
-			this.each(function() {
-				jQuery.data( this, key, value );
-			}) :
-
-			// Gets one value
-			// Try to fetch any internally stored data first
-			elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null;
-	},
-
-	removeData: function( key ) {
-		return this.each(function() {
-			jQuery.removeData( this, key );
-		});
-	}
-});
-
-function dataAttr( elem, key, data ) {
-	// If nothing was found internally, try to fetch any
-	// data from the HTML5 data-* attribute
-	if ( data === undefined && elem.nodeType === 1 ) {
-
-		var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
-
-		data = elem.getAttribute( name );
-
-		if ( typeof data === "string" ) {
-			try {
-				data = data === "true" ? true :
-					data === "false" ? false :
-					data === "null" ? null :
-					// Only convert to a number if it doesn't change the string
-					+data + "" === data ? +data :
-					rbrace.test( data ) ? jQuery.parseJSON( data ) :
-						data;
-			} catch( e ) {}
-
-			// Make sure we set the data so it isn't changed later
-			jQuery.data( elem, key, data );
-
-		} else {
-			data = undefined;
-		}
-	}
-
-	return data;
-}
-
-// checks a cache object for emptiness
-function isEmptyDataObject( obj ) {
-	var name;
-	for ( name in obj ) {
-
-		// if the public data object is empty, the private is still empty
-		if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
-			continue;
-		}
-		if ( name !== "toJSON" ) {
-			return false;
-		}
-	}
-
-	return true;
-}
-jQuery.extend({
-	queue: function( elem, type, data ) {
-		var queue;
-
-		if ( elem ) {
-			type = ( type || "fx" ) + "queue";
-			queue = jQuery._data( elem, type );
-
-			// Speed up dequeue by getting out quickly if this is just a lookup
-			if ( data ) {
-				if ( !queue || jQuery.isArray(data) ) {
-					queue = jQuery._data( elem, type, jQuery.makeArray(data) );
-				} else {
-					queue.push( data );
-				}
-			}
-			return queue || [];
-		}
-	},
-
-	dequeue: function( elem, type ) {
-		type = type || "fx";
-
-		var queue = jQuery.queue( elem, type ),
-			startLength = queue.length,
-			fn = queue.shift(),
-			hooks = jQuery._queueHooks( elem, type ),
-			next = function() {
-				jQuery.dequeue( elem, type );
-			};
-
-		// If the fx queue is dequeued, always remove the progress sentinel
-		if ( fn === "inprogress" ) {
-			fn = queue.shift();
-			startLength--;
-		}
-
-		if ( fn ) {
-
-			// Add a progress sentinel to prevent the fx queue from being
-			// automatically dequeued
-			if ( type === "fx" ) {
-				queue.unshift( "inprogress" );
-			}
-
-			// clear up the last queue stop function
-			delete hooks.stop;
-			fn.call( elem, next, hooks );
-		}
-
-		if ( !startLength && hooks ) {
-			hooks.empty.fire();
-		}
-	},
-
-	// not intended for public consumption - generates a queueHooks object, or returns the current one
-	_queueHooks: function( elem, type ) {
-		var key = type + "queueHooks";
-		return jQuery._data( elem, key ) || jQuery._data( elem, key, {
-			empty: jQuery.Callbacks("once memory").add(function() {
-				jQuery._removeData( elem, type + "queue" );
-				jQuery._removeData( elem, key );
-			})
-		});
-	}
-});
-
-jQuery.fn.extend({
-	queue: function( type, data ) {
-		var setter = 2;
-
-		if ( typeof type !== "string" ) {
-			data = type;
-			type = "fx";
-			setter--;
-		}
-
-		if ( arguments.length < setter ) {
-			return jQuery.queue( this[0], type );
-		}
-
-		return data === undefined ?
-			this :
-			this.each(function() {
-				var queue = jQuery.queue( this, type, data );
-
-				// ensure a hooks for this queue
-				jQuery._queueHooks( this, type );
-
-				if ( type === "fx" && queue[0] !== "inprogress" ) {
-					jQuery.dequeue( this, type );
-				}
-			});
-	},
-	dequeue: function( type ) {
-		return this.each(function() {
-			jQuery.dequeue( this, type );
-		});
-	},
-	// Based off of the plugin by Clint Helfers, with permission.
-	// http://blindsignals.com/index.php/2009/07/jquery-delay/
-	delay: function( time, type ) {
-		time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
-		type = type || "fx";
-
-		return this.queue( type, function( next, hooks ) {
-			var timeout = setTimeout( next, time );
-			hooks.stop = function() {
-				clearTimeout( timeout );
-			};
-		});
-	},
-	clearQueue: function( type ) {
-		return this.queue( type || "fx", [] );
-	},
-	// Get a promise resolved when queues of a certain type
-	// are emptied (fx is the type by default)
-	promise: function( type, obj ) {
-		var tmp,
-			count = 1,
-			defer = jQuery.Deferred(),
-			elements = this,
-			i = this.length,
-			resolve = function() {
-				if ( !( --count ) ) {
-					defer.resolveWith( elements, [ elements ] );
-				}
-			};
-
-		if ( typeof type !== "string" ) {
-			obj = type;
-			type = undefined;
-		}
-		type = type || "fx";
-
-		while( i-- ) {
-			tmp = jQuery._data( elements[ i ], type + "queueHooks" );
-			if ( tmp && tmp.empty ) {
-				count++;
-				tmp.empty.add( resolve );
-			}
-		}
-		resolve();
-		return defer.promise( obj );
-	}
-});
-var nodeHook, boolHook,
-	rclass = /[\t\r\n\f]/g,
-	rreturn = /\r/g,
-	rfocusable = /^(?:input|select|textarea|button|object)$/i,
-	rclickable = /^(?:a|area)$/i,
-	ruseDefault = /^(?:checked|selected)$/i,
-	getSetAttribute = jQuery.support.getSetAttribute,
-	getSetInput = jQuery.support.input;
-
-jQuery.fn.extend({
-	attr: function( name, value ) {
-		return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
-	},
-
-	removeAttr: function( name ) {
-		return this.each(function() {
-			jQuery.removeAttr( this, name );
-		});
-	},
-
-	prop: function( name, value ) {
-		return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
-	},
-
-	removeProp: function( name ) {
-		name = jQuery.propFix[ name ] || name;
-		return this.each(function() {
-			// try/catch handles cases where IE balks (such as removing a property on window)
-			try {
-				this[ name ] = undefined;
-				delete this[ name ];
-			} catch( e ) {}
-		});
-	},
-
-	addClass: function( value ) {
-		var classes, elem, cur, clazz, j,
-			i = 0,
-			len = this.length,
-			proceed = typeof value === "string" && value;
-
-		if ( jQuery.isFunction( value ) ) {
-			return this.each(function( j ) {
-				jQuery( this ).addClass( value.call( this, j, this.className ) );
-			});
-		}
-
-		if ( proceed ) {
-			// The disjunction here is for better compressibility (see removeClass)
-			classes = ( value || "" ).match( core_rnotwhite ) || [];
-
-			for ( ; i < len; i++ ) {
-				elem = this[ i ];
-				cur = elem.nodeType === 1 && ( elem.className ?
-					( " " + elem.className + " " ).replace( rclass, " " ) :
-					" "
-				);
-
-				if ( cur ) {
-					j = 0;
-					while ( (clazz = classes[j++]) ) {
-						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
-							cur += clazz + " ";
-						}
-					}
-					elem.className = jQuery.trim( cur );
-
-				}
-			}
-		}
-
-		return this;
-	},
-
-	removeClass: function( value ) {
-		var classes, elem, cur, clazz, j,
-			i = 0,
-			len = this.length,
-			proceed = arguments.length === 0 || typeof value === "string" && value;
-
-		if ( jQuery.isFunction( value ) ) {
-			return this.each(function( j ) {
-				jQuery( this ).removeClass( value.call( this, j, this.className ) );
-			});
-		}
-		if ( proceed ) {
-			classes = ( value || "" ).match( core_rnotwhite ) || [];
-
-			for ( ; i < len; i++ ) {
-				elem = this[ i ];
-				// This expression is here for better compressibility (see addClass)
-				cur = elem.nodeType === 1 && ( elem.className ?
-					( " " + elem.className + " " ).replace( rclass, " " ) :
-					""
-				);
-
-				if ( cur ) {
-					j = 0;
-					while ( (clazz = classes[j++]) ) {
-						// Remove *all* instances
-						while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
-							cur = cur.replace( " " + clazz + " ", " " );
-						}
-					}
-					elem.className = value ? jQuery.trim( cur ) : "";
-				}
-			}
-		}
-
-		return this;
-	},
-
-	toggleClass: function( value, stateVal ) {
-		var type = typeof value;
-
-		if ( typeof stateVal === "boolean" && type === "string" ) {
-			return stateVal ? this.addClass( value ) : this.removeClass( value );
-		}
-
-		if ( jQuery.isFunction( value ) ) {
-			return this.each(function( i ) {
-				jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
-			});
-		}
-
-		return this.each(function() {
-			if ( type === "string" ) {
-				// toggle individual class names
-				var className,
-					i = 0,
-					self = jQuery( this ),
-					classNames = value.match( core_rnotwhite ) || [];
-
-				while ( (className = classNames[ i++ ]) ) {
-					// check each className given, space separated list
-					if ( self.hasClass( className ) ) {
-						self.removeClass( className );
-					} else {
-						self.addClass( className );
-					}
-				}
-
-			// Toggle whole class name
-			} else if ( type === core_strundefined || type === "boolean" ) {
-				if ( this.className ) {
-					// store className if set
-					jQuery._data( this, "__className__", this.className );
-				}
-
-				// If the element has a class name or if we're passed "false",
-				// then remove the whole classname (if there was one, the above saved it).
-				// Otherwise bring back whatever was previously saved (if anything),
-				// falling back to the empty string if nothing was stored.
-				this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
-			}
-		});
-	},
-
-	hasClass: function( selector ) {
-		var className = " " + selector + " ",
-			i = 0,
-			l = this.length;
-		for ( ; i < l; i++ ) {
-			if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
-				return true;
-			}
-		}
-
-		return false;
-	},
-
-	val: function( value ) {
-		var ret, hooks, isFunction,
-			elem = this[0];
-
-		if ( !arguments.length ) {
-			if ( elem ) {
-				hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
-
-				if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
-					return ret;
-				}
-
-				ret = elem.value;
-
-				return typeof ret === "string" ?
-					// handle most common string cases
-					ret.replace(rreturn, "") :
-					// handle cases where value is null/undef or number
-					ret == null ? "" : ret;
-			}
-
-			return;
-		}
-
-		isFunction = jQuery.isFunction( value );
-
-		return this.each(function( i ) {
-			var val;
-
-			if ( this.nodeType !== 1 ) {
-				return;
-			}
-
-			if ( isFunction ) {
-				val = value.call( this, i, jQuery( this ).val() );
-			} else {
-				val = value;
-			}
-
-			// Treat null/undefined as ""; convert numbers to string
-			if ( val == null ) {
-				val = "";
-			} else if ( typeof val === "number" ) {
-				val += "";
-			} else if ( jQuery.isArray( val ) ) {
-				val = jQuery.map(val, function ( value ) {
-					return value == null ? "" : value + "";
-				});
-			}
-
-			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
-
-			// If set returns undefined, fall back to normal setting
-			if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
-				this.value = val;
-			}
-		});
-	}
-});
-
-jQuery.extend({
-	valHooks: {
-		option: {
-			get: function( elem ) {
-				// Use proper attribute retrieval(#6932, #12072)
-				var val = jQuery.find.attr( elem, "value" );
-				return val != null ?
-					val :
-					elem.text;
-			}
-		},
-		select: {
-			get: function( elem ) {
-				var value, option,
-					options = elem.options,
-					index = elem.selectedIndex,
-					one = elem.type === "select-one" || index < 0,
-					values = one ? null : [],
-					max = one ? index + 1 : options.length,
-					i = index < 0 ?
-						max :
-						one ? index : 0;
-
-				// Loop through all the selected options
-				for ( ; i < max; i++ ) {
-					option = options[ i ];
-
-					// oldIE doesn't update selected after form reset (#2551)
-					if ( ( option.selected || i === index ) &&
-							// Don't return options that are disabled or in a disabled optgroup
-							( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
-							( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
-
-						// Get the specific value for the option
-						value = jQuery( option ).val();
-
-						// We don't need an array for one selects
-						if ( one ) {
-							return value;
-						}
-
-						// Multi-Selects return an array
-						values.push( value );
-					}
-				}
-
-				return values;
-			},
-
-			set: function( elem, value ) {
-				var optionSet, option,
-					options = elem.options,
-					values = jQuery.makeArray( value ),
-					i = options.length;
-
-				while ( i-- ) {
-					option = options[ i ];
-					if ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) {
-						optionSet = true;
-					}
-				}
-
-				// force browsers to behave consistently when non-matching value is set
-				if ( !optionSet ) {
-					elem.selectedIndex = -1;
-				}
-				return values;
-			}
-		}
-	},
-
-	attr: function( elem, name, value ) {
-		var hooks, ret,
-			nType = elem.nodeType;
-
-		// don't get/set attributes on text, comment and attribute nodes
-		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
-			return;
-		}
-
-		// Fallback to prop when attributes are not supported
-		if ( typeof elem.getAttribute === core_strundefined ) {
-			return jQuery.prop( elem, name, value );
-		}
-
-		// All attributes are lowercase
-		// Grab necessary hook if one is defined
-		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
-			name = name.toLowerCase();
-			hooks = jQuery.attrHooks[ name ] ||
-				( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
-		}
-
-		if ( value !== undefined ) {
-
-			if ( value === null ) {
-				jQuery.removeAttr( elem, name );
-
-			} else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
-				return ret;
-
-			} else {
-				elem.setAttribute( name, value + "" );
-				return value;
-			}
-
-		} else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
-			return ret;
-
-		} else {
-			ret = jQuery.find.attr( elem, name );
-
-			// Non-existent attributes return null, we normalize to undefined
-			return ret == null ?
-				undefined :
-				ret;
-		}
-	},
-
-	removeAttr: function( elem, value ) {
-		var name, propName,
-			i = 0,
-			attrNames = value && value.match( core_rnotwhite );
-
-		if ( attrNames && elem.nodeType === 1 ) {
-			while ( (name = attrNames[i++]) ) {
-				propName = jQuery.propFix[ name ] || name;
-
-				// Boolean attributes get special treatment (#10870)
-				if ( jQuery.expr.match.bool.test( name ) ) {
-					// Set corresponding property to false
-					if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
-						elem[ propName ] = false;
-					// Support: IE<9
-					// Also clear defaultChecked/defaultSelected (if appropriate)
-					} else {
-						elem[ jQuery.camelCase( "default-" + name ) ] =
-							elem[ propName ] = false;
-					}
-
-				// See #9699 for explanation of this approach (setting first, then removal)
-				} else {
-					jQuery.attr( elem, name, "" );
-				}
-
-				elem.removeAttribute( getSetAttribute ? name : propName );
-			}
-		}
-	},
-
-	attrHooks: {
-		type: {
-			set: function( elem, value ) {
-				if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
-					// Setting the type on a radio button after the value resets the value in IE6-9
-					// Reset value to default in case type is set after value during creation
-					var val = elem.value;
-					elem.setAttribute( "type", value );
-					if ( val ) {
-						elem.value = val;
-					}
-					return value;
-				}
-			}
-		}
-	},
-
-	propFix: {
-		"for": "htmlFor",
-		"class": "className"
-	},
-
-	prop: function( elem, name, value ) {
-		var ret, hooks, notxml,
-			nType = elem.nodeType;
-
-		// don't get/set properties on text, comment and attribute nodes
-		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
-			return;
-		}
-
-		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
-
-		if ( notxml ) {
-			// Fix name and attach hooks
-			name = jQuery.propFix[ name ] || name;
-			hooks = jQuery.propHooks[ name ];
-		}
-
-		if ( value !== undefined ) {
-			return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?
-				ret :
-				( elem[ name ] = value );
-
-		} else {
-			return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ?
-				ret :
-				elem[ name ];
-		}
-	},
-
-	propHooks: {
-		tabIndex: {
-			get: function( elem ) {
-				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
-				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
-				// Use proper attribute retrieval(#12072)
-				var tabindex = jQuery.find.attr( elem, "tabindex" );
-
-				return tabindex ?
-					parseInt( tabindex, 10 ) :
-					rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
-						0 :
-						-1;
-			}
-		}
-	}
-});
-
-// Hooks for boolean attributes
-boolHook = {
-	set: function( elem, value, name ) {
-		if ( value === false ) {
-			// Remove boolean attributes when set to false
-			jQuery.removeAttr( elem, name );
-		} else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
-			// IE<8 needs the *property* name
-			elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );
-
-		// Use defaultChecked and defaultSelected for oldIE
-		} else {
-			elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true;
-		}
-
-		return name;
-	}
-};
-jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
-	var getter = jQuery.expr.attrHandle[ name ] || jQuery.find.attr;
-
-	jQuery.expr.attrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ?
-		function( elem, name, isXML ) {
-			var fn = jQuery.expr.attrHandle[ name ],
-				ret = isXML ?
-					undefined :
-					/* jshint eqeqeq: false */
-					(jQuery.expr.attrHandle[ name ] = undefined) !=
-						getter( elem, name, isXML ) ?
-
-						name.toLowerCase() :
-						null;
-			jQuery.expr.attrHandle[ name ] = fn;
-			return ret;
-		} :
-		function( elem, name, isXML ) {
-			return isXML ?
-				undefined :
-				elem[ jQuery.camelCase( "default-" + name ) ] ?
-					name.toLowerCase() :
-					null;
-		};
-});
-
-// fix oldIE attroperties
-if ( !getSetInput || !getSetAttribute ) {
-	jQuery.attrHooks.value = {
-		set: function( elem, value, name ) {
-			if ( jQuery.nodeName( elem, "input" ) ) {
-				// Does not return so that setAttribute is also used
-				elem.defaultValue = value;
-			} else {
-				// Use nodeHook if defined (#1954); otherwise setAttribute is fine
-				return nodeHook && nodeHook.set( elem, value, name );
-			}
-		}
-	};
-}
-
-// IE6/7 do not support getting/setting some attributes with get/setAttribute
-if ( !getSetAttribute ) {
-
-	// Use this for any attribute in IE6/7
-	// This fixes almost every IE6/7 issue
-	nodeHook = {
-		set: function( elem, value, name ) {
-			// Set the existing or create a new attribute node
-			var ret = elem.getAttributeNode( name );
-			if ( !ret ) {
-				elem.setAttributeNode(
-					(ret = elem.ownerDocument.createAttribute( name ))
-				);
-			}
-
-			ret.value = value += "";
-
-			// Break association with cloned elements by also using setAttribute (#9646)
-			return name === "value" || value === elem.getAttribute( name ) ?
-				value :
-				undefined;
-		}
-	};
-	jQuery.expr.attrHandle.id = jQuery.expr.attrHandle.name = jQuery.expr.attrHandle.coords =
-		// Some attributes are constructed with empty-string values when not defined
-		function( elem, name, isXML ) {
-			var ret;
-			return isXML ?
-				undefined :
-				(ret = elem.getAttributeNode( name )) && ret.value !== "" ?
-					ret.value :
-					null;
-		};
-	jQuery.valHooks.button = {
-		get: function( elem, name ) {
-			var ret = elem.getAttributeNode( name );
-			return ret && ret.specified ?
-				ret.value :
-				undefined;
-		},
-		set: nodeHook.set
-	};
-
-	// Set contenteditable to false on removals(#10429)
-	// Setting to empty string throws an error as an invalid value
-	jQuery.attrHooks.contenteditable = {
-		set: function( elem, value, name ) {
-			nodeHook.set( elem, value === "" ? false : value, name );
-		}
-	};
-
-	// Set width and height to auto instead of 0 on empty string( Bug #8150 )
-	// This is for removals
-	jQuery.each([ "width", "height" ], function( i, name ) {
-		jQuery.attrHooks[ name ] = {
-			set: function( elem, value ) {
-				if ( value === "" ) {
-					elem.setAttribute( name, "auto" );
-					return value;
-				}
-			}
-		};
-	});
-}
-
-
-// Some attributes require a special call on IE
-// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
-if ( !jQuery.support.hrefNormalized ) {
-	// href/src property should get the full normalized URL (#10299/#12915)
-	jQuery.each([ "href", "src" ], function( i, name ) {
-		jQuery.propHooks[ name ] = {
-			get: function( elem ) {
-				return elem.getAttribute( name, 4 );
-			}
-		};
-	});
-}
-
-if ( !jQuery.support.style ) {
-	jQuery.attrHooks.style = {
-		get: function( elem ) {
-			// Return undefined in the case of empty string
-			// Note: IE uppercases css property names, but if we were to .toLowerCase()
-			// .cssText, that would destroy case senstitivity in URL's, like in "background"
-			return elem.style.cssText || undefined;
-		},
-		set: function( elem, value ) {
-			return ( elem.style.cssText = value + "" );
-		}
-	};
-}
-
-// Safari mis-reports the default selected property of an option
-// Accessing the parent's selectedIndex property fixes it
-if ( !jQuery.support.optSelected ) {
-	jQuery.propHooks.selected = {
-		get: function( elem ) {
-			var parent = elem.parentNode;
-
-			if ( parent ) {
-				parent.selectedIndex;
-
-				// Make sure that it also works with optgroups, see #5701
-				if ( parent.parentNode ) {
-					parent.parentNode.selectedIndex;
-				}
-			}
-			return null;
-		}
-	};
-}
-
-jQuery.each([
-	"tabIndex",
-	"readOnly",
-	"maxLength",
-	"cellSpacing",
-	"cellPadding",
-	"rowSpan",
-	"colSpan",
-	"useMap",
-	"frameBorder",
-	"contentEditable"
-], function() {
-	jQuery.propFix[ this.toLowerCase() ] = this;
-});
-
-// IE6/7 call enctype encoding
-if ( !jQuery.support.enctype ) {
-	jQuery.propFix.enctype = "encoding";
-}
-
-// Radios and checkboxes getter/setter
-jQuery.each([ "radio", "checkbox" ], function() {
-	jQuery.valHooks[ this ] = {
-		set: function( elem, value ) {
-			if ( jQuery.isArray( value ) ) {
-				return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
-			}
-		}
-	};
-	if ( !jQuery.support.checkOn ) {
-		jQuery.valHooks[ this ].get = function( elem ) {
-			// Support: Webkit
-			// "" is returned instead of "on" if a value isn't specified
-			return elem.getAttribute("value") === null ? "on" : elem.value;
-		};
-	}
-});
-var rformElems = /^(?:input|select|textarea)$/i,
-	rkeyEvent = /^key/,
-	rmouseEvent = /^(?:mouse|contextmenu)|click/,
-	rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
-	rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
-
-function returnTrue() {
-	return true;
-}
-
-function returnFalse() {
-	return false;
-}
-
-function safeActiveElement() {
-	try {
-		return document.activeElement;
-	} catch ( err ) { }
-}
-
-/*
- * Helper functions for managing events -- not part of the public interface.
- * Props to Dean Edwards' addEvent library for many of the ideas.
- */
-jQuery.event = {
-
-	global: {},
-
-	add: function( elem, types, handler, data, selector ) {
-		var tmp, events, t, handleObjIn,
-			special, eventHandle, handleObj,
-			handlers, type, namespaces, origType,
-			elemData = jQuery._data( elem );
-
-		// Don't attach events to noData or text/comment nodes (but allow plain objects)
-		if ( !elemData ) {
-			return;
-		}
-
-		// Caller can pass in an object of custom data in lieu of the handler
-		if ( handler.handler ) {
-			handleObjIn = handler;
-			handler = handleObjIn.handler;
-			selector = handleObjIn.selector;
-		}
-
-		// Make sure that the handler has a unique ID, used to find/remove it later
-		if ( !handler.guid ) {
-			handler.guid = jQuery.guid++;
-		}
-
-		// Init the element's event structure and main handler, if this is the first
-		if ( !(events = elemData.events) ) {
-			events = elemData.events = {};
-		}
-		if ( !(eventHandle = elemData.handle) ) {
-			eventHandle = elemData.handle = function( e ) {
-				// Discard the second event of a jQuery.event.trigger() and
-				// when an event is called after a page has unloaded
-				return typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ?
-					jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
-					undefined;
-			};
-			// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
-			eventHandle.elem = elem;
-		}
-
-		// Handle multiple events separated by a space
-		types = ( types || "" ).match( core_rnotwhite ) || [""];
-		t = types.length;
-		while ( t-- ) {
-			tmp = rtypenamespace.exec( types[t] ) || [];
-			type = origType = tmp[1];
-			namespaces = ( tmp[2] || "" ).split( "." ).sort();
-
-			// There *must* be a type, no attaching namespace-only handlers
-			if ( !type ) {
-				continue;
-			}
-
-			// If event changes its type, use the special event handlers for the changed type
-			special = jQuery.event.special[ type ] || {};
-
-			// If selector defined, determine special event api type, otherwise given type
-			type = ( selector ? special.delegateType : special.bindType ) || type;
-
-			// Update special based on newly reset type
-			special = jQuery.event.special[ type ] || {};
-
-			// handleObj is passed to all event handlers
-			handleObj = jQuery.extend({
-				type: type,
-				origType: origType,
-				data: data,
-				handler: handler,
-				guid: handler.guid,
-				selector: selector,
-				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
-				namespace: namespaces.join(".")
-			}, handleObjIn );
-
-			// Init the event handler queue if we're the first
-			if ( !(handlers = events[ type ]) ) {
-				handlers = events[ type ] = [];
-				handlers.delegateCount = 0;
-
-				// Only use addEventListener/attachEvent if the special events handler returns false
-				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
-					// Bind the global event handler to the element
-					if ( elem.addEventListener ) {
-						elem.addEventListener( type, eventHandle, false );
-
-					} else if ( elem.attachEvent ) {
-						elem.attachEvent( "on" + type, eventHandle );
-					}
-				}
-			}
-
-			if ( special.add ) {
-				special.add.call( elem, handleObj );
-
-				if ( !handleObj.handler.guid ) {
-					handleObj.handler.guid = handler.guid;
-				}
-			}
-
-			// Add to the element's handler list, delegates in front
-			if ( selector ) {
-				handlers.splice( handlers.delegateCount++, 0, handleObj );
-			} else {
-				handlers.push( handleObj );
-			}
-
-			// Keep track of which events have ever been used, for event optimization
-			jQuery.event.global[ type ] = true;
-		}
-
-		// Nullify elem to prevent memory leaks in IE
-		elem = null;
-	},
-
-	// Detach an event or set of events from an element
-	remove: function( elem, types, handler, selector, mappedTypes ) {
-		var j, handleObj, tmp,
-			origCount, t, events,
-			special, handlers, type,
-			namespaces, origType,
-			elemData = jQuery.hasData( elem ) && jQuery._data( elem );
-
-		if ( !elemData || !(events = elemData.events) ) {
-			return;
-		}
-
-		// Once for each type.namespace in types; type may be omitted
-		types = ( types || "" ).match( core_rnotwhite ) || [""];
-		t = types.length;
-		while ( t-- ) {
-			tmp = rtypenamespace.exec( types[t] ) || [];
-			type = origType = tmp[1];
-			namespaces = ( tmp[2] || "" ).split( "." ).sort();
-
-			// Unbind all events (on this namespace, if provided) for the element
-			if ( !type ) {
-				for ( type in events ) {
-					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
-				}
-				continue;
-			}
-
-			special = jQuery.event.special[ type ] || {};
-			type = ( selector ? special.delegateType : special.bindType ) || type;
-			handlers = events[ type ] || [];
-			tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
-
-			// Remove matching events
-			origCount = j = handlers.length;
-			while ( j-- ) {
-				handleObj = handlers[ j ];
-
-				if ( ( mappedTypes || origType === handleObj.origType ) &&
-					( !handler || handler.guid === handleObj.guid ) &&
-					( !tmp || tmp.test( handleObj.namespace ) ) &&
-					( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
-					handlers.splice( j, 1 );
-
-					if ( handleObj.selector ) {
-						handlers.delegateCount--;
-					}
-					if ( special.remove ) {
-						special.remove.call( elem, handleObj );
-					}
-				}
-			}
-
-			// Remove generic event handler if we removed something and no more handlers exist
-			// (avoids potential for endless recursion during removal of special event handlers)
-			if ( origCount && !handlers.length ) {
-				if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
-					jQuery.removeEvent( elem, type, elemData.handle );
-				}
-
-				delete events[ type ];
-			}
-		}
-
-		// Remove the expando if it's no longer used
-		if ( jQuery.isEmptyObject( events ) ) {
-			delete elemData.handle;
-
-			// removeData also checks for emptiness and clears the expando if empty
-			// so use it instead of delete
-			jQuery._removeData( elem, "events" );
-		}
-	},
-
-	trigger: function( event, data, elem, onlyHandlers ) {
-		var handle, ontype, cur,
-			bubbleType, special, tmp, i,
-			eventPath = [ elem || document ],
-			type = core_hasOwn.call( event, "type" ) ? event.type : event,
-			namespaces = core_hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
-
-		cur = tmp = elem = elem || document;
-
-		// Don't do events on text and comment nodes
-		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
-			return;
-		}
-
-		// focus/blur morphs to focusin/out; ensure we're not firing them right now
-		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
-			return;
-		}
-
-		if ( type.indexOf(".") >= 0 ) {
-			// Namespaced trigger; create a regexp to match event type in handle()
-			namespaces = type.split(".");
-			type = namespaces.shift();
-			namespaces.sort();
-		}
-		ontype = type.indexOf(":") < 0 && "on" + type;
-
-		// Caller can pass in a jQuery.Event object, Object, or just an event type string
-		event = event[ jQuery.expando ] ?
-			event :
-			new jQuery.Event( type, typeof event === "object" && event );
-
-		// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
-		event.isTrigger = onlyHandlers ? 2 : 3;
-		event.namespace = namespaces.join(".");
-		event.namespace_re = event.namespace ?
-			new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
-			null;
-
-		// Clean up the event in case it is being reused
-		event.result = undefined;
-		if ( !event.target ) {
-			event.target = elem;
-		}
-
-		// Clone any incoming data and prepend the event, creating the handler arg list
-		data = data == null ?
-			[ event ] :
-			jQuery.makeArray( data, [ event ] );
-
-		// Allow special events to draw outside the lines
-		special = jQuery.event.special[ type ] || {};
-		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
-			return;
-		}
-
-		// Determine event propagation path in advance, per W3C events spec (#9951)
-		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
-		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
-
-			bubbleType = special.delegateType || type;
-			if ( !rfocusMorph.test( bubbleType + type ) ) {
-				cur = cur.parentNode;
-			}
-			for ( ; cur; cur = cur.parentNode ) {
-				eventPath.push( cur );
-				tmp = cur;
-			}
-
-			// Only add window if we got to document (e.g., not plain obj or detached DOM)
-			if ( tmp === (elem.ownerDocument || document) ) {
-				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
-			}
-		}
-
-		// Fire handlers on the event path
-		i = 0;
-		while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
-
-			event.type = i > 1 ?
-				bubbleType :
-				special.bindType || type;
-
-			// jQuery handler
-			handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
-			if ( handle ) {
-				handle.apply( cur, data );
-			}
-
-			// Native handler
-			handle = ontype && cur[ ontype ];
-			if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {
-				event.preventDefault();
-			}
-		}
-		event.type = type;
-
-		// If nobody prevented the default action, do it now
-		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
-
-			if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&
-				jQuery.acceptData( elem ) ) {
-
-				// Call a native DOM method on the target with the same name name as the event.
-				// Can't use an .isFunction() check here because IE6/7 fails that test.
-				// Don't do default actions on window, that's where global variables be (#6170)
-				if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {
-
-					// Don't re-trigger an onFOO event when we call its FOO() method
-					tmp = elem[ ontype ];
-
-					if ( tmp ) {
-						elem[ ontype ] = null;
-					}
-
-					// Prevent re-triggering of the same event, since we already bubbled it above
-					jQuery.event.triggered = type;
-					try {
-						elem[ type ]();
-					} catch ( e ) {
-						// IE<9 dies on focus/blur to hidden element (#1486,#12518)
-						// only reproducible on winXP IE8 native, not IE9 in IE8 mode
-					}
-					jQuery.event.triggered = undefined;
-
-					if ( tmp ) {
-						elem[ ontype ] = tmp;
-					}
-				}
-			}
-		}
-
-		return event.result;
-	},
-
-	dispatch: function( event ) {
-
-		// Make a writable jQuery.Event from the native event object
-		event = jQuery.event.fix( event );
-
-		var i, ret, handleObj, matched, j,
-			handlerQueue = [],
-			args = core_slice.call( arguments ),
-			handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [],
-			special = jQuery.event.special[ event.type ] || {};
-
-		// Use the fix-ed jQuery.Event rather than the (read-only) native event
-		args[0] = event;
-		event.delegateTarget = this;
-
-		// Call the preDispatch hook for the mapped type, and let it bail if desired
-		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
-			return;
-		}
-
-		// Determine handlers
-		handlerQueue = jQuery.event.handlers.call( this, event, handlers );
-
-		// Run delegates first; they may want to stop propagation beneath us
-		i = 0;
-		while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
-			event.currentTarget = matched.elem;
-
-			j = 0;
-			while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
-
-				// Triggered event must either 1) have no namespace, or
-				// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
-				if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
-
-					event.handleObj = handleObj;
-					event.data = handleObj.data;
-
-					ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
-							.apply( matched.elem, args );
-
-					if ( ret !== undefined ) {
-						if ( (event.result = ret) === false ) {
-							event.preventDefault();
-							event.stopPropagation();
-						}
-					}
-				}
-			}
-		}
-
-		// Call the postDispatch hook for the mapped type
-		if ( special.postDispatch ) {
-			special.postDispatch.call( this, event );
-		}
-
-		return event.result;
-	},
-
-	handlers: function( event, handlers ) {
-		var sel, handleObj, matches, i,
-			handlerQueue = [],
-			delegateCount = handlers.delegateCount,
-			cur = event.target;
-
-		// Find delegate handlers
-		// Black-hole SVG <use> instance trees (#13180)
-		// Avoid non-left-click bubbling in Firefox (#3861)
-		if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
-
-			/* jshint eqeqeq: false */
-			for ( ; cur != this; cur = cur.parentNode || this ) {
-				/* jshint eqeqeq: true */
-
-				// Don't check non-elements (#13208)
-				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
-				if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) {
-					matches = [];
-					for ( i = 0; i < delegateCount; i++ ) {
-						handleObj = handlers[ i ];
-
-						// Don't conflict with Object.prototype properties (#13203)
-						sel = handleObj.selector + " ";
-
-						if ( matches[ sel ] === undefined ) {
-							matches[ sel ] = handleObj.needsContext ?
-								jQuery( sel, this ).index( cur ) >= 0 :
-								jQuery.find( sel, this, null, [ cur ] ).length;
-						}
-						if ( matches[ sel ] ) {
-							matches.push( handleObj );
-						}
-					}
-					if ( matches.length ) {
-						handlerQueue.push({ elem: cur, handlers: matches });
-					}
-				}
-			}
-		}
-
-		// Add the remaining (directly-bound) handlers
-		if ( delegateCount < handlers.length ) {
-			handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
-		}
-
-		return handlerQueue;
-	},
-
-	fix: function( event ) {
-		if ( event[ jQuery.expando ] ) {
-			return event;
-		}
-
-		// Create a writable copy of the event object and normalize some properties
-		var i, prop, copy,
-			type = event.type,
-			originalEvent = event,
-			fixHook = this.fixHooks[ type ];
-
-		if ( !fixHook ) {
-			this.fixHooks[ type ] = fixHook =
-				rmouseEvent.test( type ) ? this.mouseHooks :
-				rkeyEvent.test( type ) ? this.keyHooks :
-				{};
-		}
-		copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
-
-		event = new jQuery.Event( originalEvent );
-
-		i = copy.length;
-		while ( i-- ) {
-			prop = copy[ i ];
-			event[ prop ] = originalEvent[ prop ];
-		}
-
-		// Support: IE<9
-		// Fix target property (#1925)
-		if ( !event.target ) {
-			event.target = originalEvent.srcElement || document;
-		}
-
-		// Support: Chrome 23+, Safari?
-		// Target should not be a text node (#504, #13143)
-		if ( event.target.nodeType === 3 ) {
-			event.target = event.target.parentNode;
-		}
-
-		// Support: IE<9
-		// For mouse/key events, metaKey==false if it's undefined (#3368, #11328)
-		event.metaKey = !!event.metaKey;
-
-		return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
-	},
-
-	// Includes some event props shared by KeyEvent and MouseEvent
-	props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
-
-	fixHooks: {},
-
-	keyHooks: {
-		props: "char charCode key keyCode".split(" "),
-		filter: function( event, original ) {
-
-			// Add which for key events
-			if ( event.which == null ) {
-				event.which = original.charCode != null ? original.charCode : original.keyCode;
-			}
-
-			return event;
-		}
-	},
-
-	mouseHooks: {
-		props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
-		filter: function( event, original ) {
-			var body, eventDoc, doc,
-				button = original.button,
-				fromElement = original.fromElement;
-
-			// Calculate pageX/Y if missing and clientX/Y available
-			if ( event.pageX == null && original.clientX != null ) {
-				eventDoc = event.target.ownerDocument || document;
-				doc = eventDoc.documentElement;
-				body = eventDoc.body;
-
-				event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
-				event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
-			}
-
-			// Add relatedTarget, if necessary
-			if ( !event.relatedTarget && fromElement ) {
-				event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
-			}
-
-			// Add which for click: 1 === left; 2 === middle; 3 === right
-			// Note: button is not normalized, so don't use it
-			if ( !event.which && button !== undefined ) {
-				event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
-			}
-
-			return event;
-		}
-	},
-
-	special: {
-		load: {
-			// Prevent triggered image.load events from bubbling to window.load
-			noBubble: true
-		},
-		focus: {
-			// Fire native event if possible so blur/focus sequence is correct
-			trigger: function() {
-				if ( this !== safeActiveElement() && this.focus ) {
-					try {
-						this.focus();
-						return false;
-					} catch ( e ) {
-						// Support: IE<9
-						// If we error on focus to hidden element (#1486, #12518),
-						// let .trigger() run the handlers
-					}
-				}
-			},
-			delegateType: "focusin"
-		},
-		blur: {
-			trigger: function() {
-				if ( this === safeActiveElement() && this.blur ) {
-					this.blur();
-					return false;
-				}
-			},
-			delegateType: "focusout"
-		},
-		click: {
-			// For checkbox, fire native event so checked state will be right
-			trigger: function() {
-				if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) {
-					this.click();
-					return false;
-				}
-			},
-
-			// For cross-browser consistency, don't fire native .click() on links
-			_default: function( event ) {
-				return jQuery.nodeName( event.target, "a" );
-			}
-		},
-
-		beforeunload: {
-			postDispatch: function( event ) {
-
-				// Even when returnValue equals to undefined Firefox will still show alert
-				if ( event.result !== undefined ) {
-					event.originalEvent.returnValue = event.result;
-				}
-			}
-		}
-	},
-
-	simulate: function( type, elem, event, bubble ) {
-		// Piggyback on a donor event to simulate a different one.
-		// Fake originalEvent to avoid donor's stopPropagation, but if the
-		// simulated event prevents default then we do the same on the donor.
-		var e = jQuery.extend(
-			new jQuery.Event(),
-			event,
-			{
-				type: type,
-				isSimulated: true,
-				originalEvent: {}
-			}
-		);
-		if ( bubble ) {
-			jQuery.event.trigger( e, null, elem );
-		} else {
-			jQuery.event.dispatch.call( elem, e );
-		}
-		if ( e.isDefaultPrevented() ) {
-			event.preventDefault();
-		}
-	}
-};
-
-jQuery.removeEvent = document.removeEventListener ?
-	function( elem, type, handle ) {
-		if ( elem.removeEventListener ) {
-			elem.removeEventListener( type, handle, false );
-		}
-	} :
-	function( elem, type, handle ) {
-		var name = "on" + type;
-
-		if ( elem.detachEvent ) {
-
-			// #8545, #7054, preventing memory leaks for custom events in IE6-8
-			// detachEvent needed property on element, by name of that event, to properly expose it to GC
-			if ( typeof elem[ name ] === core_strundefined ) {
-				elem[ name ] = null;
-			}
-
-			elem.detachEvent( name, handle );
-		}
-	};
-
-jQuery.Event = function( src, props ) {
-	// Allow instantiation without the 'new' keyword
-	if ( !(this instanceof jQuery.Event) ) {
-		return new jQuery.Event( src, props );
-	}
-
-	// Event object
-	if ( src && src.type ) {
-		this.originalEvent = src;
-		this.type = src.type;
-
-		// Events bubbling up the document may have been marked as prevented
-		// by a handler lower down the tree; reflect the correct value.
-		this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
-			src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
-
-	// Event type
-	} else {
-		this.type = src;
-	}
-
-	// Put explicitly provided properties onto the event object
-	if ( props ) {
-		jQuery.extend( this, props );
-	}
-
-	// Create a timestamp if incoming event doesn't have one
-	this.timeStamp = src && src.timeStamp || jQuery.now();
-
-	// Mark it as fixed
-	this[ jQuery.expando ] = true;
-};
-
-// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
-// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
-jQuery.Event.prototype = {
-	isDefaultPrevented: returnFalse,
-	isPropagationStopped: returnFalse,
-	isImmediatePropagationStopped: returnFalse,
-
-	preventDefault: function() {
-		var e = this.originalEvent;
-
-		this.isDefaultPrevented = returnTrue;
-		if ( !e ) {
-			return;
-		}
-
-		// If preventDefault exists, run it on the original event
-		if ( e.preventDefault ) {
-			e.preventDefault();
-
-		// Support: IE
-		// Otherwise set the returnValue property of the original event to false
-		} else {
-			e.returnValue = false;
-		}
-	},
-	stopPropagation: function() {
-		var e = this.originalEvent;
-
-		this.isPropagationStopped = returnTrue;
-		if ( !e ) {
-			return;
-		}
-		// If stopPropagation exists, run it on the original event
-		if ( e.stopPropagation ) {
-			e.stopPropagation();
-		}
-
-		// Support: IE
-		// Set the cancelBubble property of the original event to true
-		e.cancelBubble = true;
-	},
-	stopImmediatePropagation: function() {
-		this.isImmediatePropagationStopped = returnTrue;
-		this.stopPropagation();
-	}
-};
-
-// Create mouseenter/leave events using mouseover/out and event-time checks
-jQuery.each({
-	mouseenter: "mouseover",
-	mouseleave: "mouseout"
-}, function( orig, fix ) {
-	jQuery.event.special[ orig ] = {
-		delegateType: fix,
-		bindType: fix,
-
-		handle: function( event ) {
-			var ret,
-				target = this,
-				related = event.relatedTarget,
-				handleObj = event.handleObj;
-
-			// For mousenter/leave call the handler if related is outside the target.
-			// NB: No relatedTarget if the mouse left/entered the browser window
-			if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
-				event.type = handleObj.origType;
-				ret = handleObj.handler.apply( this, arguments );
-				event.type = fix;
-			}
-			return ret;
-		}
-	};
-});
-
-// IE submit delegation
-if ( !jQuery.support.submitBubbles ) {
-
-	jQuery.event.special.submit = {
-		setup: function() {
-			// Only need this for delegated form submit events
-			if ( jQuery.nodeName( this, "form" ) ) {
-				return false;
-			}
-
-			// Lazy-add a submit handler when a descendant form may potentially be submitted
-			jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
-				// Node name check avoids a VML-related crash in IE (#9807)
-				var elem = e.target,
-					form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
-				if ( form && !jQuery._data( form, "submitBubbles" ) ) {
-					jQuery.event.add( form, "submit._submit", function( event ) {
-						event._submit_bubble = true;
-					});
-					jQuery._data( form, "submitBubbles", true );
-				}
-			});
-			// return undefined since we don't need an event listener
-		},
-
-		postDispatch: function( event ) {
-			// If form was submitted by the user, bubble the event up the tree
-			if ( event._submit_bubble ) {
-				delete event._submit_bubble;
-				if ( this.parentNode && !event.isTrigger ) {
-					jQuery.event.simulate( "submit", this.parentNode, event, true );
-				}
-			}
-		},
-
-		teardown: function() {
-			// Only need this for delegated form submit events
-			if ( jQuery.nodeName( this, "form" ) ) {
-				return false;
-			}
-
-			// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
-			jQuery.event.remove( this, "._submit" );
-		}
-	};
-}
-
-// IE change delegation and checkbox/radio fix
-if ( !jQuery.support.changeBubbles ) {
-
-	jQuery.event.special.change = {
-
-		setup: function() {
-
-			if ( rformElems.test( this.nodeName ) ) {
-				// IE doesn't fire change on a check/radio until blur; trigger it on click
-				// after a propertychange. Eat the blur-change in special.change.handle.
-				// This still fires onchange a second time for check/radio after blur.
-				if ( this.type === "checkbox" || this.type === "radio" ) {
-					jQuery.event.add( this, "propertychange._change", function( event ) {
-						if ( event.originalEvent.propertyName === "checked" ) {
-							this._just_changed = true;
-						}
-					});
-					jQuery.event.add( this, "click._change", function( event ) {
-						if ( this._just_changed && !event.isTrigger ) {
-							this._just_changed = false;
-						}
-						// Allow triggered, simulated change events (#11500)
-						jQuery.event.simulate( "change", this, event, true );
-					});
-				}
-				return false;
-			}
-			// Delegated event; lazy-add a change handler on descendant inputs
-			jQuery.event.add( this, "beforeactivate._change", function( e ) {
-				var elem = e.target;
-
-				if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) {
-					jQuery.event.add( elem, "change._change", function( event ) {
-						if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
-							jQuery.event.simulate( "change", this.parentNode, event, true );
-						}
-					});
-					jQuery._data( elem, "changeBubbles", true );
-				}
-			});
-		},
-
-		handle: function( event ) {
-			var elem = event.target;
-
-			// Swallow native change events from checkbox/radio, we already triggered them above
-			if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
-				return event.handleObj.handler.apply( this, arguments );
-			}
-		},
-
-		teardown: function() {
-			jQuery.event.remove( this, "._change" );
-
-			return !rformElems.test( this.nodeName );
-		}
-	};
-}
-
-// Create "bubbling" focus and blur events
-if ( !jQuery.support.focusinBubbles ) {
-	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
-
-		// Attach a single capturing handler while someone wants focusin/focusout
-		var attaches = 0,
-			handler = function( event ) {
-				jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
-			};
-
-		jQuery.event.special[ fix ] = {
-			setup: function() {
-				if ( attaches++ === 0 ) {
-					document.addEventListener( orig, handler, true );
-				}
-			},
-			teardown: function() {
-				if ( --attaches === 0 ) {
-					document.removeEventListener( orig, handler, true );
-				}
-			}
-		};
-	});
-}
-
-jQuery.fn.extend({
-
-	on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
-		var type, origFn;
-
-		// Types can be a map of types/handlers
-		if ( typeof types === "object" ) {
-			// ( types-Object, selector, data )
-			if ( typeof selector !== "string" ) {
-				// ( types-Object, data )
-				data = data || selector;
-				selector = undefined;
-			}
-			for ( type in types ) {
-				this.on( type, selector, data, types[ type ], one );
-			}
-			return this;
-		}
-
-		if ( data == null && fn == null ) {
-			// ( types, fn )
-			fn = selector;
-			data = selector = undefined;
-		} else if ( fn == null ) {
-			if ( typeof selector === "string" ) {
-				// ( types, selector, fn )
-				fn = data;
-				data = undefined;
-			} else {
-				// ( types, data, fn )
-				fn = data;
-				data = selector;
-				selector = undefined;
-			}
-		}
-		if ( fn === false ) {
-			fn = returnFalse;
-		} else if ( !fn ) {
-			return this;
-		}
-
-		if ( one === 1 ) {
-			origFn = fn;
-			fn = function( event ) {
-				// Can use an empty set, since event contains the info
-				jQuery().off( event );
-				return origFn.apply( this, arguments );
-			};
-			// Use same guid so caller can remove using origFn
-			fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
-		}
-		return this.each( function() {
-			jQuery.event.add( this, types, fn, data, selector );
-		});
-	},
-	one: function( types, selector, data, fn ) {
-		return this.on( types, selector, data, fn, 1 );
-	},
-	off: function( types, selector, fn ) {
-		var handleObj, type;
-		if ( types && types.preventDefault && types.handleObj ) {
-			// ( event )  dispatched jQuery.Event
-			handleObj = types.handleObj;
-			jQuery( types.delegateTarget ).off(
-				handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
-				handleObj.selector,
-				handleObj.handler
-			);
-			return this;
-		}
-		if ( typeof types === "object" ) {
-			// ( types-object [, selector] )
-			for ( type in types ) {
-				this.off( type, selector, types[ type ] );
-			}
-			return this;
-		}
-		if ( selector === false || typeof selector === "function" ) {
-			// ( types [, fn] )
-			fn = selector;
-			selector = undefined;
-		}
-		if ( fn === false ) {
-			fn = returnFalse;
-		}
-		return this.each(function() {
-			jQuery.event.remove( this, types, fn, selector );
-		});
-	},
-
-	trigger: function( type, data ) {
-		return this.each(function() {
-			jQuery.event.trigger( type, data, this );
-		});
-	},
-	triggerHandler: function( type, data ) {
-		var elem = this[0];
-		if ( elem ) {
-			return jQuery.event.trigger( type, data, elem, true );
-		}
-	}
-});
-var isSimple = /^.[^:#\[\.,]*$/,
-	rparentsprev = /^(?:parents|prev(?:Until|All))/,
-	rneedsContext = jQuery.expr.match.needsContext,
-	// methods guaranteed to produce a unique set when starting from a unique set
-	guaranteedUnique = {
-		children: true,
-		contents: true,
-		next: true,
-		prev: true
-	};
-
-jQuery.fn.extend({
-	find: function( selector ) {
-		var i,
-			ret = [],
-			self = this,
-			len = self.length;
-
-		if ( typeof selector !== "string" ) {
-			return this.pushStack( jQuery( selector ).filter(function() {
-				for ( i = 0; i < len; i++ ) {
-					if ( jQuery.contains( self[ i ], this ) ) {
-						return true;
-					}
-				}
-			}) );
-		}
-
-		for ( i = 0; i < len; i++ ) {
-			jQuery.find( selector, self[ i ], ret );
-		}
-
-		// Needed because $( selector, context ) becomes $( context ).find( selector )
-		ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
-		ret.selector = this.selector ? this.selector + " " + selector : selector;
-		return ret;
-	},
-
-	has: function( target ) {
-		var i,
-			targets = jQuery( target, this ),
-			len = targets.length;
-
-		return this.filter(function() {
-			for ( i = 0; i < len; i++ ) {
-				if ( jQuery.contains( this, targets[i] ) ) {
-					return true;
-				}
-			}
-		});
-	},
-
-	not: function( selector ) {
-		return this.pushStack( winnow(this, selector || [], true) );
-	},
-
-	filter: function( selector ) {
-		return this.pushStack( winnow(this, selector || [], false) );
-	},
-
-	is: function( selector ) {
-		return !!winnow(
-			this,
-
-			// If this is a positional/relative selector, check membership in the returned set
-			// so $("p:first").is("p:last") won't return true for a doc with two "p".
-			typeof selector === "string" && rneedsContext.test( selector ) ?
-				jQuery( selector ) :
-				selector || [],
-			false
-		).length;
-	},
-
-	closest: function( selectors, context ) {
-		var cur,
-			i = 0,
-			l = this.length,
-			ret = [],
-			pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
-				jQuery( selectors, context || this.context ) :
-				0;
-
-		for ( ; i < l; i++ ) {
-			for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {
-				// Always skip document fragments
-				if ( cur.nodeType < 11 && (pos ?
-					pos.index(cur) > -1 :
-
-					// Don't pass non-elements to Sizzle
-					cur.nodeType === 1 &&
-						jQuery.find.matchesSelector(cur, selectors)) ) {
-
-					cur = ret.push( cur );
-					break;
-				}
-			}
-		}
-
-		return this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret );
-	},
-
-	// Determine the position of an element within
-	// the matched set of elements
-	index: function( elem ) {
-
-		// No argument, return index in parent
-		if ( !elem ) {
-			return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1;
-		}
-
-		// index in selector
-		if ( typeof elem === "string" ) {
-			return jQuery.inArray( this[0], jQuery( elem ) );
-		}
-
-		// Locate the position of the desired element
-		return jQuery.inArray(
-			// If it receives a jQuery object, the first element is used
-			elem.jquery ? elem[0] : elem, this );
-	},
-
-	add: function( selector, context ) {
-		var set = typeof selector === "string" ?
-				jQuery( selector, context ) :
-				jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
-			all = jQuery.merge( this.get(), set );
-
-		return this.pushStack( jQuery.unique(all) );
-	},
-
-	addBack: function( selector ) {
-		return this.add( selector == null ?
-			this.prevObject : this.prevObject.filter(selector)
-		);
-	}
-});
-
-function sibling( cur, dir ) {
-	do {
-		cur = cur[ dir ];
-	} while ( cur && cur.nodeType !== 1 );
-
-	return cur;
-}
-
-jQuery.each({
-	parent: function( elem ) {
-		var parent = elem.parentNode;
-		return parent && parent.nodeType !== 11 ? parent : null;
-	},
-	parents: function( elem ) {
-		return jQuery.dir( elem, "parentNode" );
-	},
-	parentsUntil: function( elem, i, until ) {
-		return jQuery.dir( elem, "parentNode", until );
-	},
-	next: function( elem ) {
-		return sibling( elem, "nextSibling" );
-	},
-	prev: function( elem ) {
-		return sibling( elem, "previousSibling" );
-	},
-	nextAll: function( elem ) {
-		return jQuery.dir( elem, "nextSibling" );
-	},
-	prevAll: function( elem ) {
-		return jQuery.dir( elem, "previousSibling" );
-	},
-	nextUntil: function( elem, i, until ) {
-		return jQuery.dir( elem, "nextSibling", until );
-	},
-	prevUntil: function( elem, i, until ) {
-		return jQuery.dir( elem, "previousSibling", until );
-	},
-	siblings: function( elem ) {
-		return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
-	},
-	children: function( elem ) {
-		return jQuery.sibling( elem.firstChild );
-	},
-	contents: function( elem ) {
-		return jQuery.nodeName( elem, "iframe" ) ?
-			elem.contentDocument || elem.contentWindow.document :
-			jQuery.merge( [], elem.childNodes );
-	}
-}, function( name, fn ) {
-	jQuery.fn[ name ] = function( until, selector ) {
-		var ret = jQuery.map( this, fn, until );
-
-		if ( name.slice( -5 ) !== "Until" ) {
-			selector = until;
-		}
-
-		if ( selector && typeof selector === "string" ) {
-			ret = jQuery.filter( selector, ret );
-		}
-
-		if ( this.length > 1 ) {
-			// Remove duplicates
-			if ( !guaranteedUnique[ name ] ) {
-				ret = jQuery.unique( ret );
-			}
-
-			// Reverse order for parents* and prev-derivatives
-			if ( rparentsprev.test( name ) ) {
-				ret = ret.reverse();
-			}
-		}
-
-		return this.pushStack( ret );
-	};
-});
-
-jQuery.extend({
-	filter: function( expr, elems, not ) {
-		var elem = elems[ 0 ];
-
-		if ( not ) {
-			expr = ":not(" + expr + ")";
-		}
-
-		return elems.length === 1 && elem.nodeType === 1 ?
-			jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
-			jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
-				return elem.nodeType === 1;
-			}));
-	},
-
-	dir: function( elem, dir, until ) {
-		var matched = [],
-			cur = elem[ dir ];
-
-		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
-			if ( cur.nodeType === 1 ) {
-				matched.push( cur );
-			}
-			cur = cur[dir];
-		}
-		return matched;
-	},
-
-	sibling: function( n, elem ) {
-		var r = [];
-
-		for ( ; n; n = n.nextSibling ) {
-			if ( n.nodeType === 1 && n !== elem ) {
-				r.push( n );
-			}
-		}
-
-		return r;
-	}
-});
-
-// Implement the identical functionality for filter and not
-function winnow( elements, qualifier, not ) {
-	if ( jQuery.isFunction( qualifier ) ) {
-		return jQuery.grep( elements, function( elem, i ) {
-			/* jshint -W018 */
-			return !!qualifier.call( elem, i, elem ) !== not;
-		});
-
-	}
-
-	if ( qualifier.nodeType ) {
-		return jQuery.grep( elements, function( elem ) {
-			return ( elem === qualifier ) !== not;
-		});
-
-	}
-
-	if ( typeof qualifier === "string" ) {
-		if ( isSimple.test( qualifier ) ) {
-			return jQuery.filter( qualifier, elements, not );
-		}
-
-		qualifier = jQuery.filter( qualifier, elements );
-	}
-
-	return jQuery.grep( elements, function( elem ) {
-		return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not;
-	});
-}
-function createSafeFragment( document ) {
-	var list = nodeNames.split( "|" ),
-		safeFrag = document.createDocumentFragment();
-
-	if ( safeFrag.createElement ) {
-		while ( list.length ) {
-			safeFrag.createElement(
-				list.pop()
-			);
-		}
-	}
-	return safeFrag;
-}
-
-var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
-		"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
-	rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
-	rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
-	rleadingWhitespace = /^\s+/,
-	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
-	rtagName = /<([\w:]+)/,
-	rtbody = /<tbody/i,
-	rhtml = /<|&#?\w+;/,
-	rnoInnerhtml = /<(?:script|style|link)/i,
-	manipulation_rcheckableType = /^(?:checkbox|radio)$/i,
-	// checked="checked" or checked
-	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
-	rscriptType = /^$|\/(?:java|ecma)script/i,
-	rscriptTypeMasked = /^true\/(.*)/,
-	rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
-
-	// We have to close these tags to support XHTML (#13200)
-	wrapMap = {
-		option: [ 1, "<select multiple='multiple'>", "</select>" ],
-		legend: [ 1, "<fieldset>", "</fieldset>" ],
-		area: [ 1, "<map>", "</map>" ],
-		param: [ 1, "<object>", "</object>" ],
-		thead: [ 1, "<table>", "</table>" ],
-		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
-		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
-		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
-
-		// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
-		// unless wrapped in a div with non-breaking characters in front of it.
-		_default: jQuery.support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X<div>", "</div>"  ]
-	},
-	safeFragment = createSafeFragment( document ),
-	fragmentDiv = safeFragment.appendChild( document.createElement("div") );
-
-wrapMap.optgroup = wrapMap.option;
-wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
-wrapMap.th = wrapMap.td;
-
-jQuery.fn.extend({
-	text: function( value ) {
-		return jQuery.access( this, function( value ) {
-			return value === undefined ?
-				jQuery.text( this ) :
-				this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
-		}, null, value, arguments.length );
-	},
-
-	append: function() {
-		return this.domManip( arguments, function( elem ) {
-			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
-				var target = manipulationTarget( this, elem );
-				target.appendChild( elem );
-			}
-		});
-	},
-
-	prepend: function() {
-		return this.domManip( arguments, function( elem ) {
-			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
-				var target = manipulationTarget( this, elem );
-				target.insertBefore( elem, target.firstChild );
-			}
-		});
-	},
-
-	before: function() {
-		return this.domManip( arguments, function( elem ) {
-			if ( this.parentNode ) {
-				this.parentNode.insertBefore( elem, this );
-			}
-		});
-	},
-
-	after: function() {
-		return this.domManip( arguments, function( elem ) {
-			if ( this.parentNode ) {
-				this.parentNode.insertBefore( elem, this.nextSibling );
-			}
-		});
-	},
-
-	// keepData is for internal use only--do not document
-	remove: function( selector, keepData ) {
-		var elem,
-			elems = selector ? jQuery.filter( selector, this ) : this,
-			i = 0;
-
-		for ( ; (elem = elems[i]) != null; i++ ) {
-
-			if ( !keepData && elem.nodeType === 1 ) {
-				jQuery.cleanData( getAll( elem ) );
-			}
-
-			if ( elem.parentNode ) {
-				if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
-					setGlobalEval( getAll( elem, "script" ) );
-				}
-				elem.parentNode.removeChild( elem );
-			}
-		}
-
-		return this;
-	},
-
-	empty: function() {
-		var elem,
-			i = 0;
-
-		for ( ; (elem = this[i]) != null; i++ ) {
-			// Remove element nodes and prevent memory leaks
-			if ( elem.nodeType === 1 ) {
-				jQuery.cleanData( getAll( elem, false ) );
-			}
-
-			// Remove any remaining nodes
-			while ( elem.firstChild ) {
-				elem.removeChild( elem.firstChild );
-			}
-
-			// If this is a select, ensure that it displays empty (#12336)
-			// Support: IE<9
-			if ( elem.options && jQuery.nodeName( elem, "select" ) ) {
-				elem.options.length = 0;
-			}
-		}
-
-		return this;
-	},
-
-	clone: function( dataAndEvents, deepDataAndEvents ) {
-		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
-		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
-
-		return this.map( function () {
-			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
-		});
-	},
-
-	html: function( value ) {
-		return jQuery.access( this, function( value ) {
-			var elem = this[0] || {},
-				i = 0,
-				l = this.length;
-
-			if ( value === undefined ) {
-				return elem.nodeType === 1 ?
-					elem.innerHTML.replace( rinlinejQuery, "" ) :
-					undefined;
-			}
-
-			// See if we can take a shortcut and just use innerHTML
-			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
-				( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&
-				( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
-				!wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
-
-				value = value.replace( rxhtmlTag, "<$1></$2>" );
-
-				try {
-					for (; i < l; i++ ) {
-						// Remove element nodes and prevent memory leaks
-						elem = this[i] || {};
-						if ( elem.nodeType === 1 ) {
-							jQuery.cleanData( getAll( elem, false ) );
-							elem.innerHTML = value;
-						}
-					}
-
-					elem = 0;
-
-				// If using innerHTML throws an exception, use the fallback method
-				} catch(e) {}
-			}
-
-			if ( elem ) {
-				this.empty().append( value );
-			}
-		}, null, value, arguments.length );
-	},
-
-	replaceWith: function() {
-		var
-			// Snapshot the DOM in case .domManip sweeps something relevant into its fragment
-			args = jQuery.map( this, function( elem ) {
-				return [ elem.nextSibling, elem.parentNode ];
-			}),
-			i = 0;
-
-		// Make the changes, replacing each context element with the new content
-		this.domManip( arguments, function( elem ) {
-			var next = args[ i++ ],
-				parent = args[ i++ ];
-
-			if ( parent ) {
-				// Don't use the snapshot next if it has moved (#13810)
-				if ( next && next.parentNode !== parent ) {
-					next = this.nextSibling;
-				}
-				jQuery( this ).remove();
-				parent.insertBefore( elem, next );
-			}
-		// Allow new content to include elements from the context set
-		}, true );
-
-		// Force removal if there was no new content (e.g., from empty arguments)
-		return i ? this : this.remove();
-	},
-
-	detach: function( selector ) {
-		return this.remove( selector, true );
-	},
-
-	domManip: function( args, callback, allowIntersection ) {
-
-		// Flatten any nested arrays
-		args = core_concat.apply( [], args );
-
-		var first, node, hasScripts,
-			scripts, doc, fragment,
-			i = 0,
-			l = this.length,
-			set = this,
-			iNoClone = l - 1,
-			value = args[0],
-			isFunction = jQuery.isFunction( value );
-
-		// We can't cloneNode fragments that contain checked, in WebKit
-		if ( isFunction || !( l <= 1 || typeof value !== "string" || jQuery.support.checkClone || !rchecked.test( value ) ) ) {
-			return this.each(function( index ) {
-				var self = set.eq( index );
-				if ( isFunction ) {
-					args[0] = value.call( this, index, self.html() );
-				}
-				self.domManip( args, callback, allowIntersection );
-			});
-		}
-
-		if ( l ) {
-			fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, !allowIntersection && this );
-			first = fragment.firstChild;
-
-			if ( fragment.childNodes.length === 1 ) {
-				fragment = first;
-			}
-
-			if ( first ) {
-				scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
-				hasScripts = scripts.length;
-
-				// Use the original fragment for the last item instead of the first because it can end up
-				// being emptied incorrectly in certain situations (#8070).
-				for ( ; i < l; i++ ) {
-					node = fragment;
-
-					if ( i !== iNoClone ) {
-						node = jQuery.clone( node, true, true );
-
-						// Keep references to cloned scripts for later restoration
-						if ( hasScripts ) {
-							jQuery.merge( scripts, getAll( node, "script" ) );
-						}
-					}
-
-					callback.call( this[i], node, i );
-				}
-
-				if ( hasScripts ) {
-					doc = scripts[ scripts.length - 1 ].ownerDocument;
-
-					// Reenable scripts
-					jQuery.map( scripts, restoreScript );
-
-					// Evaluate executable scripts on first document insertion
-					for ( i = 0; i < hasScripts; i++ ) {
-						node = scripts[ i ];
-						if ( rscriptType.test( node.type || "" ) &&
-							!jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
-
-							if ( node.src ) {
-								// Hope ajax is available...
-								jQuery._evalUrl( node.src );
-							} else {
-								jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) );
-							}
-						}
-					}
-				}
-
-				// Fix #11809: Avoid leaking memory
-				fragment = first = null;
-			}
-		}
-
-		return this;
-	}
-});
-
-// Support: IE<8
-// Manipulating tables requires a tbody
-function manipulationTarget( elem, content ) {
-	return jQuery.nodeName( elem, "table" ) &&
-		jQuery.nodeName( content.nodeType === 1 ? content : content.firstChild, "tr" ) ?
-
-		elem.getElementsByTagName("tbody")[0] ||
-			elem.appendChild( elem.ownerDocument.createElement("tbody") ) :
-		elem;
-}
-
-// Replace/restore the type attribute of script elements for safe DOM manipulation
-function disableScript( elem ) {
-	elem.type = (jQuery.find.attr( elem, "type" ) !== null) + "/" + elem.type;
-	return elem;
-}
-function restoreScript( elem ) {
-	var match = rscriptTypeMasked.exec( elem.type );
-	if ( match ) {
-		elem.type = match[1];
-	} else {
-		elem.removeAttribute("type");
-	}
-	return elem;
-}
-
-// Mark scripts as having already been evaluated
-function setGlobalEval( elems, refElements ) {
-	var elem,
-		i = 0;
-	for ( ; (elem = elems[i]) != null; i++ ) {
-		jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) );
-	}
-}
-
-function cloneCopyEvent( src, dest ) {
-
-	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
-		return;
-	}
-
-	var type, i, l,
-		oldData = jQuery._data( src ),
-		curData = jQuery._data( dest, oldData ),
-		events = oldData.events;
-
-	if ( events ) {
-		delete curData.handle;
-		curData.events = {};
-
-		for ( type in events ) {
-			for ( i = 0, l = events[ type ].length; i < l; i++ ) {
-				jQuery.event.add( dest, type, events[ type ][ i ] );
-			}
-		}
-	}
-
-	// make the cloned public data object a copy from the original
-	if ( curData.data ) {
-		curData.data = jQuery.extend( {}, curData.data );
-	}
-}
-
-function fixCloneNodeIssues( src, dest ) {
-	var nodeName, e, data;
-
-	// We do not need to do anything for non-Elements
-	if ( dest.nodeType !== 1 ) {
-		return;
-	}
-
-	nodeName = dest.nodeName.toLowerCase();
-
-	// IE6-8 copies events bound via attachEvent when using cloneNode.
-	if ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ) {
-		data = jQuery._data( dest );
-
-		for ( e in data.events ) {
-			jQuery.removeEvent( dest, e, data.handle );
-		}
-
-		// Event data gets referenced instead of copied if the expando gets copied too
-		dest.removeAttribute( jQuery.expando );
-	}
-
-	// IE blanks contents when cloning scripts, and tries to evaluate newly-set text
-	if ( nodeName === "script" && dest.text !== src.text ) {
-		disableScript( dest ).text = src.text;
-		restoreScript( dest );
-
-	// IE6-10 improperly clones children of object elements using classid.
-	// IE10 throws NoModificationAllowedError if parent is null, #12132.
-	} else if ( nodeName === "object" ) {
-		if ( dest.parentNode ) {
-			dest.outerHTML = src.outerHTML;
-		}
-
-		// This path appears unavoidable for IE9. When cloning an object
-		// element in IE9, the outerHTML strategy above is not sufficient.
-		// If the src has innerHTML and the destination does not,
-		// copy the src.innerHTML into the dest.innerHTML. #10324
-		if ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {
-			dest.innerHTML = src.innerHTML;
-		}
-
-	} else if ( nodeName === "input" && manipulation_rcheckableType.test( src.type ) ) {
-		// IE6-8 fails to persist the checked state of a cloned checkbox
-		// or radio button. Worse, IE6-7 fail to give the cloned element
-		// a checked appearance if the defaultChecked value isn't also set
-
-		dest.defaultChecked = dest.checked = src.checked;
-
-		// IE6-7 get confused and end up setting the value of a cloned
-		// checkbox/radio button to an empty string instead of "on"
-		if ( dest.value !== src.value ) {
-			dest.value = src.value;
-		}
-
-	// IE6-8 fails to return the selected option to the default selected
-	// state when cloning options
-	} else if ( nodeName === "option" ) {
-		dest.defaultSelected = dest.selected = src.defaultSelected;
-
-	// IE6-8 fails to set the defaultValue to the correct value when
-	// cloning other types of input fields
-	} else if ( nodeName === "input" || nodeName === "textarea" ) {
-		dest.defaultValue = src.defaultValue;
-	}
-}
-
-jQuery.each({
-	appendTo: "append",
-	prependTo: "prepend",
-	insertBefore: "before",
-	insertAfter: "after",
-	replaceAll: "replaceWith"
-}, function( name, original ) {
-	jQuery.fn[ name ] = function( selector ) {
-		var elems,
-			i = 0,
-			ret = [],
-			insert = jQuery( selector ),
-			last = insert.length - 1;
-
-		for ( ; i <= last; i++ ) {
-			elems = i === last ? this : this.clone(true);
-			jQuery( insert[i] )[ original ]( elems );
-
-			// Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()
-			core_push.apply( ret, elems.get() );
-		}
-
-		return this.pushStack( ret );
-	};
-});
-
-function getAll( context, tag ) {
-	var elems, elem,
-		i = 0,
-		found = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName( tag || "*" ) :
-			typeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll( tag || "*" ) :
-			undefined;
-
-	if ( !found ) {
-		for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {
-			if ( !tag || jQuery.nodeName( elem, tag ) ) {
-				found.push( elem );
-			} else {
-				jQuery.merge( found, getAll( elem, tag ) );
-			}
-		}
-	}
-
-	return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
-		jQuery.merge( [ context ], found ) :
-		found;
-}
-
-// Used in buildFragment, fixes the defaultChecked property
-function fixDefaultChecked( elem ) {
-	if ( manipulation_rcheckableType.test( elem.type ) ) {
-		elem.defaultChecked = elem.checked;
-	}
-}
-
-jQuery.extend({
-	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
-		var destElements, node, clone, i, srcElements,
-			inPage = jQuery.contains( elem.ownerDocument, elem );
-
-		if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
-			clone = elem.cloneNode( true );
-
-		// IE<=8 does not properly clone detached, unknown element nodes
-		} else {
-			fragmentDiv.innerHTML = elem.outerHTML;
-			fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
-		}
-
-		if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
-				(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
-
-			// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
-			destElements = getAll( clone );
-			srcElements = getAll( elem );
-
-			// Fix all IE cloning issues
-			for ( i = 0; (node = srcElements[i]) != null; ++i ) {
-				// Ensure that the destination node is not null; Fixes #9587
-				if ( destElements[i] ) {
-					fixCloneNodeIssues( node, destElements[i] );
-				}
-			}
-		}
-
-		// Copy the events from the original to the clone
-		if ( dataAndEvents ) {
-			if ( deepDataAndEvents ) {
-				srcElements = srcElements || getAll( elem );
-				destElements = destElements || getAll( clone );
-
-				for ( i = 0; (node = srcElements[i]) != null; i++ ) {
-					cloneCopyEvent( node, destElements[i] );
-				}
-			} else {
-				cloneCopyEvent( elem, clone );
-			}
-		}
-
-		// Preserve script evaluation history
-		destElements = getAll( clone, "script" );
-		if ( destElements.length > 0 ) {
-			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
-		}
-
-		destElements = srcElements = node = null;
-
-		// Return the cloned set
-		return clone;
-	},
-
-	buildFragment: function( elems, context, scripts, selection ) {
-		var j, elem, contains,
-			tmp, tag, tbody, wrap,
-			l = elems.length,
-
-			// Ensure a safe fragment
-			safe = createSafeFragment( context ),
-
-			nodes = [],
-			i = 0;
-
-		for ( ; i < l; i++ ) {
-			elem = elems[ i ];
-
-			if ( elem || elem === 0 ) {
-
-				// Add nodes directly
-				if ( jQuery.type( elem ) === "object" ) {
-					jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
-
-				// Convert non-html into a text node
-				} else if ( !rhtml.test( elem ) ) {
-					nodes.push( context.createTextNode( elem ) );
-
-				// Convert html into DOM nodes
-				} else {
-					tmp = tmp || safe.appendChild( context.createElement("div") );
-
-					// Deserialize a standard representation
-					tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase();
-					wrap = wrapMap[ tag ] || wrapMap._default;
-
-					tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[2];
-
-					// Descend through wrappers to the right content
-					j = wrap[0];
-					while ( j-- ) {
-						tmp = tmp.lastChild;
-					}
-
-					// Manually add leading whitespace removed by IE
-					if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
-						nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );
-					}
-
-					// Remove IE's autoinserted <tbody> from table fragments
-					if ( !jQuery.support.tbody ) {
-
-						// String was a <table>, *may* have spurious <tbody>
-						elem = tag === "table" && !rtbody.test( elem ) ?
-							tmp.firstChild :
-
-							// String was a bare <thead> or <tfoot>
-							wrap[1] === "<table>" && !rtbody.test( elem ) ?
-								tmp :
-								0;
-
-						j = elem && elem.childNodes.length;
-						while ( j-- ) {
-							if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) {
-								elem.removeChild( tbody );
-							}
-						}
-					}
-
-					jQuery.merge( nodes, tmp.childNodes );
-
-					// Fix #12392 for WebKit and IE > 9
-					tmp.textContent = "";
-
-					// Fix #12392 for oldIE
-					while ( tmp.firstChild ) {
-						tmp.removeChild( tmp.firstChild );
-					}
-
-					// Remember the top-level container for proper cleanup
-					tmp = safe.lastChild;
-				}
-			}
-		}
-
-		// Fix #11356: Clear elements from fragment
-		if ( tmp ) {
-			safe.removeChild( tmp );
-		}
-
-		// Reset defaultChecked for any radios and checkboxes
-		// about to be appended to the DOM in IE 6/7 (#8060)
-		if ( !jQuery.support.appendChecked ) {
-			jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked );
-		}
-
-		i = 0;
-		while ( (elem = nodes[ i++ ]) ) {
-
-			// #4087 - If origin and destination elements are the same, and this is
-			// that element, do not do anything
-			if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
-				continue;
-			}
-
-			contains = jQuery.contains( elem.ownerDocument, elem );
-
-			// Append to fragment
-			tmp = getAll( safe.appendChild( elem ), "script" );
-
-			// Preserve script evaluation history
-			if ( contains ) {
-				setGlobalEval( tmp );
-			}
-
-			// Capture executables
-			if ( scripts ) {
-				j = 0;
-				while ( (elem = tmp[ j++ ]) ) {
-					if ( rscriptType.test( elem.type || "" ) ) {
-						scripts.push( elem );
-					}
-				}
-			}
-		}
-
-		tmp = null;
-
-		return safe;
-	},
-
-	cleanData: function( elems, /* internal */ acceptData ) {
-		var elem, type, id, data,
-			i = 0,
-			internalKey = jQuery.expando,
-			cache = jQuery.cache,
-			deleteExpando = jQuery.support.deleteExpando,
-			special = jQuery.event.special;
-
-		for ( ; (elem = elems[i]) != null; i++ ) {
-
-			if ( acceptData || jQuery.acceptData( elem ) ) {
-
-				id = elem[ internalKey ];
-				data = id && cache[ id ];
-
-				if ( data ) {
-					if ( data.events ) {
-						for ( type in data.events ) {
-							if ( special[ type ] ) {
-								jQuery.event.remove( elem, type );
-
-							// This is a shortcut to avoid jQuery.event.remove's overhead
-							} else {
-								jQuery.removeEvent( elem, type, data.handle );
-							}
-						}
-					}
-
-					// Remove cache only if it was not already removed by jQuery.event.remove
-					if ( cache[ id ] ) {
-
-						delete cache[ id ];
-
-						// IE does not allow us to delete expando properties from nodes,
-						// nor does it have a removeAttribute function on Document nodes;
-						// we must handle all of these cases
-						if ( deleteExpando ) {
-							delete elem[ internalKey ];
-
-						} else if ( typeof elem.removeAttribute !== core_strundefined ) {
-							elem.removeAttribute( internalKey );
-
-						} else {
-							elem[ internalKey ] = null;
-						}
-
-						core_deletedIds.push( id );
-					}
-				}
-			}
-		}
-	},
-
-	_evalUrl: function( url ) {
-		return jQuery.ajax({
-			url: url,
-			type: "GET",
-			dataType: "script",
-			async: false,
-			global: false,
-			"throws": true
-		});
-	}
-});
-jQuery.fn.extend({
-	wrapAll: function( html ) {
-		if ( jQuery.isFunction( html ) ) {
-			return this.each(function(i) {
-				jQuery(this).wrapAll( html.call(this, i) );
-			});
-		}
-
-		if ( this[0] ) {
-			// The elements to wrap the target around
-			var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
-
-			if ( this[0].parentNode ) {
-				wrap.insertBefore( this[0] );
-			}
-
-			wrap.map(function() {
-				var elem = this;
-
-				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
-					elem = elem.firstChild;
-				}
-
-				return elem;
-			}).append( this );
-		}
-
-		return this;
-	},
-
-	wrapInner: function( html ) {
-		if ( jQuery.isFunction( html ) ) {
-			return this.each(function(i) {
-				jQuery(this).wrapInner( html.call(this, i) );
-			});
-		}
-
-		return this.each(function() {
-			var self = jQuery( this ),
-				contents = self.contents();
-
-			if ( contents.length ) {
-				contents.wrapAll( html );
-
-			} else {
-				self.append( html );
-			}
-		});
-	},
-
-	wrap: function( html ) {
-		var isFunction = jQuery.isFunction( html );
-
-		return this.each(function(i) {
-			jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
-		});
-	},
-
-	unwrap: function() {
-		return this.parent().each(function() {
-			if ( !jQuery.nodeName( this, "body" ) ) {
-				jQuery( this ).replaceWith( this.childNodes );
-			}
-		}).end();
-	}
-});
-var iframe, getStyles, curCSS,
-	ralpha = /alpha\([^)]*\)/i,
-	ropacity = /opacity\s*=\s*([^)]*)/,
-	rposition = /^(top|right|bottom|left)$/,
-	// swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
-	// see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
-	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
-	rmargin = /^margin/,
-	rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
-	rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
-	rrelNum = new RegExp( "^([+-])=(" + core_pnum + ")", "i" ),
-	elemdisplay = { BODY: "block" },
-
-	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
-	cssNormalTransform = {
-		letterSpacing: 0,
-		fontWeight: 400
-	},
-
-	cssExpand = [ "Top", "Right", "Bottom", "Left" ],
-	cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
-
-// return a css property mapped to a potentially vendor prefixed property
-function vendorPropName( style, name ) {
-
-	// shortcut for names that are not vendor prefixed
-	if ( name in style ) {
-		return name;
-	}
-
-	// check for vendor prefixed names
-	var capName = name.charAt(0).toUpperCase() + name.slice(1),
-		origName = name,
-		i = cssPrefixes.length;
-
-	while ( i-- ) {
-		name = cssPrefixes[ i ] + capName;
-		if ( name in style ) {
-			return name;
-		}
-	}
-
-	return origName;
-}
-
-function isHidden( elem, el ) {
-	// isHidden might be called from jQuery#filter function;
-	// in that case, element will be second argument
-	elem = el || elem;
-	return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
-}
-
-function showHide( elements, show ) {
-	var display, elem, hidden,
-		values = [],
-		index = 0,
-		length = elements.length;
-
-	for ( ; index < length; index++ ) {
-		elem = elements[ index ];
-		if ( !elem.style ) {
-			continue;
-		}
-
-		values[ index ] = jQuery._data( elem, "olddisplay" );
-		display = elem.style.display;
-		if ( show ) {
-			// Reset the inline display of this element to learn if it is
-			// being hidden by cascaded rules or not
-			if ( !values[ index ] && display === "none" ) {
-				elem.style.display = "";
-			}
-
-			// Set elements which have been overridden with display: none
-			// in a stylesheet to whatever the default browser style is
-			// for such an element
-			if ( elem.style.display === "" && isHidden( elem ) ) {
-				values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
-			}
-		} else {
-
-			if ( !values[ index ] ) {
-				hidden = isHidden( elem );
-
-				if ( display && display !== "none" || !hidden ) {
-					jQuery._data( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) );
-				}
-			}
-		}
-	}
-
-	// Set the display of most of the elements in a second loop
-	// to avoid the constant reflow
-	for ( index = 0; index < length; index++ ) {
-		elem = elements[ index ];
-		if ( !elem.style ) {
-			continue;
-		}
-		if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
-			elem.style.display = show ? values[ index ] || "" : "none";
-		}
-	}
-
-	return elements;
-}
-
-jQuery.fn.extend({
-	css: function( name, value ) {
-		return jQuery.access( this, function( elem, name, value ) {
-			var len, styles,
-				map = {},
-				i = 0;
-
-			if ( jQuery.isArray( name ) ) {
-				styles = getStyles( elem );
-				len = name.length;
-
-				for ( ; i < len; i++ ) {
-					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
-				}
-
-				return map;
-			}
-
-			return value !== undefined ?
-				jQuery.style( elem, name, value ) :
-				jQuery.css( elem, name );
-		}, name, value, arguments.length > 1 );
-	},
-	show: function() {
-		return showHide( this, true );
-	},
-	hide: function() {
-		return showHide( this );
-	},
-	toggle: function( state ) {
-		if ( typeof state === "boolean" ) {
-			return state ? this.show() : this.hide();
-		}
-
-		return this.each(function() {
-			if ( isHidden( this ) ) {
-				jQuery( this ).show();
-			} else {
-				jQuery( this ).hide();
-			}
-		});
-	}
-});
-
-jQuery.extend({
-	// Add in style property hooks for overriding the default
-	// behavior of getting and setting a style property
-	cssHooks: {
-		opacity: {
-			get: function( elem, computed ) {
-				if ( computed ) {
-					// We should always get a number back from opacity
-					var ret = curCSS( elem, "opacity" );
-					return ret === "" ? "1" : ret;
-				}
-			}
-		}
-	},
-
-	// Don't automatically add "px" to these possibly-unitless properties
-	cssNumber: {
-		"columnCount": true,
-		"fillOpacity": true,
-		"fontWeight": true,
-		"lineHeight": true,
-		"opacity": true,
-		"order": true,
-		"orphans": true,
-		"widows": true,
-		"zIndex": true,
-		"zoom": true
-	},
-
-	// Add in properties whose names you wish to fix before
-	// setting or getting the value
-	cssProps: {
-		// normalize float css property
-		"float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
-	},
-
-	// Get and set the style property on a DOM Node
-	style: function( elem, name, value, extra ) {
-		// Don't set styles on text and comment nodes
-		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
-			return;
-		}
-
-		// Make sure that we're working with the right name
-		var ret, type, hooks,
-			origName = jQuery.camelCase( name ),
-			style = elem.style;
-
-		name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
-
-		// gets hook for the prefixed version
-		// followed by the unprefixed version
-		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
-
-		// Check if we're setting a value
-		if ( value !== undefined ) {
-			type = typeof value;
-
-			// convert relative number strings (+= or -=) to relative numbers. #7345
-			if ( type === "string" && (ret = rrelNum.exec( value )) ) {
-				value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
-				// Fixes bug #9237
-				type = "number";
-			}
-
-			// Make sure that NaN and null values aren't set. See: #7116
-			if ( value == null || type === "number" && isNaN( value ) ) {
-				return;
-			}
-
-			// If a number was passed in, add 'px' to the (except for certain CSS properties)
-			if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
-				value += "px";
-			}
-
-			// Fixes #8908, it can be done more correctly by specifing setters in cssHooks,
-			// but it would mean to define eight (for every problematic property) identical functions
-			if ( !jQuery.support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) {
-				style[ name ] = "inherit";
-			}
-
-			// If a hook was provided, use that value, otherwise just set the specified value
-			if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
-
-				// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
-				// Fixes bug #5509
-				try {
-					style[ name ] = value;
-				} catch(e) {}
-			}
-
-		} else {
-			// If a hook was provided get the non-computed value from there
-			if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
-				return ret;
-			}
-
-			// Otherwise just get the value from the style object
-			return style[ name ];
-		}
-	},
-
-	css: function( elem, name, extra, styles ) {
-		var num, val, hooks,
-			origName = jQuery.camelCase( name );
-
-		// Make sure that we're working with the right name
-		name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
-
-		// gets hook for the prefixed version
-		// followed by the unprefixed version
-		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
-
-		// If a hook was provided get the computed value from there
-		if ( hooks && "get" in hooks ) {
-			val = hooks.get( elem, true, extra );
-		}
-
-		// Otherwise, if a way to get the computed value exists, use that
-		if ( val === undefined ) {
-			val = curCSS( elem, name, styles );
-		}
-
-		//convert "normal" to computed value
-		if ( val === "normal" && name in cssNormalTransform ) {
-			val = cssNormalTransform[ name ];
-		}
-
-		// Return, converting to number if forced or a qualifier was provided and val looks numeric
-		if ( extra === "" || extra ) {
-			num = parseFloat( val );
-			return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
-		}
-		return val;
-	}
-});
-
-// NOTE: we've included the "window" in window.getComputedStyle
-// because jsdom on node.js will break without it.
-if ( window.getComputedStyle ) {
-	getStyles = function( elem ) {
-		return window.getComputedStyle( elem, null );
-	};
-
-	curCSS = function( elem, name, _computed ) {
-		var width, minWidth, maxWidth,
-			computed = _computed || getStyles( elem ),
-
-			// getPropertyValue is only needed for .css('filter') in IE9, see #12537
-			ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined,
-			style = elem.style;
-
-		if ( computed ) {
-
-			if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
-				ret = jQuery.style( elem, name );
-			}
-
-			// A tribute to the "awesome hack by Dean Edwards"
-			// Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
-			// Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
-			// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
-			if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
-
-				// Remember the original values
-				width = style.width;
-				minWidth = style.minWidth;
-				maxWidth = style.maxWidth;
-
-				// Put in the new values to get a computed value out
-				style.minWidth = style.maxWidth = style.width = ret;
-				ret = computed.width;
-
-				// Revert the changed values
-				style.width = width;
-				style.minWidth = minWidth;
-				style.maxWidth = maxWidth;
-			}
-		}
-
-		return ret;
-	};
-} else if ( document.documentElement.currentStyle ) {
-	getStyles = function( elem ) {
-		return elem.currentStyle;
-	};
-
-	curCSS = function( elem, name, _computed ) {
-		var left, rs, rsLeft,
-			computed = _computed || getStyles( elem ),
-			ret = computed ? computed[ name ] : undefined,
-			style = elem.style;
-
-		// Avoid setting ret to empty string here
-		// so we don't default to auto
-		if ( ret == null && style && style[ name ] ) {
-			ret = style[ name ];
-		}
-
-		// From the awesome hack by Dean Edwards
-		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
-
-		// If we're not dealing with a regular pixel number
-		// but a number that has a weird ending, we need to convert it to pixels
-		// but not position css attributes, as those are proportional to the parent element instead
-		// and we can't measure the parent instead because it might trigger a "stacking dolls" problem
-		if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
-
-			// Remember the original values
-			left = style.left;
-			rs = elem.runtimeStyle;
-			rsLeft = rs && rs.left;
-
-			// Put in the new values to get a computed value out
-			if ( rsLeft ) {
-				rs.left = elem.currentStyle.left;
-			}
-			style.left = name === "fontSize" ? "1em" : ret;
-			ret = style.pixelLeft + "px";
-
-			// Revert the changed values
-			style.left = left;
-			if ( rsLeft ) {
-				rs.left = rsLeft;
-			}
-		}
-
-		return ret === "" ? "auto" : ret;
-	};
-}
-
-function setPositiveNumber( elem, value, subtract ) {
-	var matches = rnumsplit.exec( value );
-	return matches ?
-		// Guard against undefined "subtract", e.g., when used as in cssHooks
-		Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
-		value;
-}
-
-function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
-	var i = extra === ( isBorderBox ? "border" : "content" ) ?
-		// If we already have the right measurement, avoid augmentation
-		4 :
-		// Otherwise initialize for horizontal or vertical properties
-		name === "width" ? 1 : 0,
-
-		val = 0;
-
-	for ( ; i < 4; i += 2 ) {
-		// both box models exclude margin, so add it if we want it
-		if ( extra === "margin" ) {
-			val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
-		}
-
-		if ( isBorderBox ) {
-			// border-box includes padding, so remove it if we want content
-			if ( extra === "content" ) {
-				val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
-			}
-
-			// at this point, extra isn't border nor margin, so remove border
-			if ( extra !== "margin" ) {
-				val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
-			}
-		} else {
-			// at this point, extra isn't content, so add padding
-			val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
-
-			// at this point, extra isn't content nor padding, so add border
-			if ( extra !== "padding" ) {
-				val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
-			}
-		}
-	}
-
-	return val;
-}
-
-function getWidthOrHeight( elem, name, extra ) {
-
-	// Start with offset property, which is equivalent to the border-box value
-	var valueIsBorderBox = true,
-		val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
-		styles = getStyles( elem ),
-		isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
-
-	// some non-html elements return undefined for offsetWidth, so check for null/undefined
-	// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
-	// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
-	if ( val <= 0 || val == null ) {
-		// Fall back to computed then uncomputed css if necessary
-		val = curCSS( elem, name, styles );
-		if ( val < 0 || val == null ) {
-			val = elem.style[ name ];
-		}
-
-		// Computed unit is not pixels. Stop here and return.
-		if ( rnumnonpx.test(val) ) {
-			return val;
-		}
-
-		// we need the check for style in case a browser which returns unreliable values
-		// for getComputedStyle silently falls back to the reliable elem.style
-		valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );
-
-		// Normalize "", auto, and prepare for extra
-		val = parseFloat( val ) || 0;
-	}
-
-	// use the active box-sizing model to add/subtract irrelevant styles
-	return ( val +
-		augmentWidthOrHeight(
-			elem,
-			name,
-			extra || ( isBorderBox ? "border" : "content" ),
-			valueIsBorderBox,
-			styles
-		)
-	) + "px";
-}
-
-// Try to determine the default display value of an element
-function css_defaultDisplay( nodeName ) {
-	var doc = document,
-		display = elemdisplay[ nodeName ];
-
-	if ( !display ) {
-		display = actualDisplay( nodeName, doc );
-
-		// If the simple way fails, read from inside an iframe
-		if ( display === "none" || !display ) {
-			// Use the already-created iframe if possible
-			iframe = ( iframe ||
-				jQuery("<iframe frameborder='0' width='0' height='0'/>")
-				.css( "cssText", "display:block !important" )
-			).appendTo( doc.documentElement );
-
-			// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
-			doc = ( iframe[0].contentWindow || iframe[0].contentDocument ).document;
-			doc.write("<!doctype html><html><body>");
-			doc.close();
-
-			display = actualDisplay( nodeName, doc );
-			iframe.detach();
-		}
-
-		// Store the correct default display
-		elemdisplay[ nodeName ] = display;
-	}
-
-	return display;
-}
-
-// Called ONLY from within css_defaultDisplay
-function actualDisplay( name, doc ) {
-	var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
-		display = jQuery.css( elem[0], "display" );
-	elem.remove();
-	return display;
-}
-
-jQuery.each([ "height", "width" ], function( i, name ) {
-	jQuery.cssHooks[ name ] = {
-		get: function( elem, computed, extra ) {
-			if ( computed ) {
-				// certain elements can have dimension info if we invisibly show them
-				// however, it must have a current display style that would benefit from this
-				return elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, "display" ) ) ?
-					jQuery.swap( elem, cssShow, function() {
-						return getWidthOrHeight( elem, name, extra );
-					}) :
-					getWidthOrHeight( elem, name, extra );
-			}
-		},
-
-		set: function( elem, value, extra ) {
-			var styles = extra && getStyles( elem );
-			return setPositiveNumber( elem, value, extra ?
-				augmentWidthOrHeight(
-					elem,
-					name,
-					extra,
-					jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
-					styles
-				) : 0
-			);
-		}
-	};
-});
-
-if ( !jQuery.support.opacity ) {
-	jQuery.cssHooks.opacity = {
-		get: function( elem, computed ) {
-			// IE uses filters for opacity
-			return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
-				( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
-				computed ? "1" : "";
-		},
-
-		set: function( elem, value ) {
-			var style = elem.style,
-				currentStyle = elem.currentStyle,
-				opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
-				filter = currentStyle && currentStyle.filter || style.filter || "";
-
-			// IE has trouble with opacity if it does not have layout
-			// Force it by setting the zoom level
-			style.zoom = 1;
-
-			// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
-			// if value === "", then remove inline opacity #12685
-			if ( ( value >= 1 || value === "" ) &&
-					jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
-					style.removeAttribute ) {
-
-				// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
-				// if "filter:" is present at all, clearType is disabled, we want to avoid this
-				// style.removeAttribute is IE Only, but so apparently is this code path...
-				style.removeAttribute( "filter" );
-
-				// if there is no filter style applied in a css rule or unset inline opacity, we are done
-				if ( value === "" || currentStyle && !currentStyle.filter ) {
-					return;
-				}
-			}
-
-			// otherwise, set new filter values
-			style.filter = ralpha.test( filter ) ?
-				filter.replace( ralpha, opacity ) :
-				filter + " " + opacity;
-		}
-	};
-}
-
-// These hooks cannot be added until DOM ready because the support test
-// for it is not run until after DOM ready
-jQuery(function() {
-	if ( !jQuery.support.reliableMarginRight ) {
-		jQuery.cssHooks.marginRight = {
-			get: function( elem, computed ) {
-				if ( computed ) {
-					// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
-					// Work around by temporarily setting element display to inline-block
-					return jQuery.swap( elem, { "display": "inline-block" },
-						curCSS, [ elem, "marginRight" ] );
-				}
-			}
-		};
-	}
-
-	// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
-	// getComputedStyle returns percent when specified for top/left/bottom/right
-	// rather than make the css module depend on the offset module, we just check for it here
-	if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
-		jQuery.each( [ "top", "left" ], function( i, prop ) {
-			jQuery.cssHooks[ prop ] = {
-				get: function( elem, computed ) {
-					if ( computed ) {
-						computed = curCSS( elem, prop );
-						// if curCSS returns percentage, fallback to offset
-						return rnumnonpx.test( computed ) ?
-							jQuery( elem ).position()[ prop ] + "px" :
-							computed;
-					}
-				}
-			};
-		});
-	}
-
-});
-
-if ( jQuery.expr && jQuery.expr.filters ) {
-	jQuery.expr.filters.hidden = function( elem ) {
-		// Support: Opera <= 12.12
-		// Opera reports offsetWidths and offsetHeights less than zero on some elements
-		return elem.offsetWidth <= 0 && elem.offsetHeight <= 0 ||
-			(!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
-	};
-
-	jQuery.expr.filters.visible = function( elem ) {
-		return !jQuery.expr.filters.hidden( elem );
-	};
-}
-
-// These hooks are used by animate to expand properties
-jQuery.each({
-	margin: "",
-	padding: "",
-	border: "Width"
-}, function( prefix, suffix ) {
-	jQuery.cssHooks[ prefix + suffix ] = {
-		expand: function( value ) {
-			var i = 0,
-				expanded = {},
-
-				// assumes a single number if not a string
-				parts = typeof value === "string" ? value.split(" ") : [ value ];
-
-			for ( ; i < 4; i++ ) {
-				expanded[ prefix + cssExpand[ i ] + suffix ] =
-					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
-			}
-
-			return expanded;
-		}
-	};
-
-	if ( !rmargin.test( prefix ) ) {
-		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
-	}
-});
-var r20 = /%20/g,
-	rbracket = /\[\]$/,
-	rCRLF = /\r?\n/g,
-	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
-	rsubmittable = /^(?:input|select|textarea|keygen)/i;
-
-jQuery.fn.extend({
-	serialize: function() {
-		return jQuery.param( this.serializeArray() );
-	},
-	serializeArray: function() {
-		return this.map(function(){
-			// Can add propHook for "elements" to filter or add form elements
-			var elements = jQuery.prop( this, "elements" );
-			return elements ? jQuery.makeArray( elements ) : this;
-		})
-		.filter(function(){
-			var type = this.type;
-			// Use .is(":disabled") so that fieldset[disabled] works
-			return this.name && !jQuery( this ).is( ":disabled" ) &&
-				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
-				( this.checked || !manipulation_rcheckableType.test( type ) );
-		})
-		.map(function( i, elem ){
-			var val = jQuery( this ).val();
-
-			return val == null ?
-				null :
-				jQuery.isArray( val ) ?
-					jQuery.map( val, function( val ){
-						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
-					}) :
-					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
-		}).get();
-	}
-});
-
-//Serialize an array of form elements or a set of
-//key/values into a query string
-jQuery.param = function( a, traditional ) {
-	var prefix,
-		s = [],
-		add = function( key, value ) {
-			// If value is a function, invoke it and return its value
-			value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
-			s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
-		};
-
-	// Set traditional to true for jQuery <= 1.3.2 behavior.
-	if ( traditional === undefined ) {
-		traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
-	}
-
-	// If an array was passed in, assume that it is an array of form elements.
-	if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
-		// Serialize the form elements
-		jQuery.each( a, function() {
-			add( this.name, this.value );
-		});
-
-	} else {
-		// If traditional, encode the "old" way (the way 1.3.2 or older
-		// did it), otherwise encode params recursively.
-		for ( prefix in a ) {
-			buildParams( prefix, a[ prefix ], traditional, add );
-		}
-	}
-
-	// Return the resulting serialization
-	return s.join( "&" ).replace( r20, "+" );
-};
-
-function buildParams( prefix, obj, traditional, add ) {
-	var name;
-
-	if ( jQuery.isArray( obj ) ) {
-		// Serialize array item.
-		jQuery.each( obj, function( i, v ) {
-			if ( traditional || rbracket.test( prefix ) ) {
-				// Treat each array item as a scalar.
-				add( prefix, v );
-
-			} else {
-				// Item is non-scalar (array or object), encode its numeric index.
-				buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
-			}
-		});
-
-	} else if ( !traditional && jQuery.type( obj ) === "object" ) {
-		// Serialize object item.
-		for ( name in obj ) {
-			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
-		}
-
-	} else {
-		// Serialize scalar item.
-		add( prefix, obj );
-	}
-}
-jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
-	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
-	"change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
-
-	// Handle event binding
-	jQuery.fn[ name ] = function( data, fn ) {
-		return arguments.length > 0 ?
-			this.on( name, null, data, fn ) :
-			this.trigger( name );
-	};
-});
-
-jQuery.fn.extend({
-	hover: function( fnOver, fnOut ) {
-		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
-	},
-
-	bind: function( types, data, fn ) {
-		return this.on( types, null, data, fn );
-	},
-	unbind: function( types, fn ) {
-		return this.off( types, null, fn );
-	},
-
-	delegate: function( selector, types, data, fn ) {
-		return this.on( types, selector, data, fn );
-	},
-	undelegate: function( selector, types, fn ) {
-		// ( namespace ) or ( selector, types [, fn] )
-		return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
-	}
-});
-var
-	// Document location
-	ajaxLocParts,
-	ajaxLocation,
-	ajax_nonce = jQuery.now(),
-
-	ajax_rquery = /\?/,
-	rhash = /#.*$/,
-	rts = /([?&])_=[^&]*/,
-	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
-	// #7653, #8125, #8152: local protocol detection
-	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
-	rnoContent = /^(?:GET|HEAD)$/,
-	rprotocol = /^\/\//,
-	rurl = /^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
-
-	// Keep a copy of the old load method
-	_load = jQuery.fn.load,
-
-	/* Prefilters
-	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
-	 * 2) These are called:
-	 *    - BEFORE asking for a transport
-	 *    - AFTER param serialization (s.data is a string if s.processData is true)
-	 * 3) key is the dataType
-	 * 4) the catchall symbol "*" can be used
-	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
-	 */
-	prefilters = {},
-
-	/* Transports bindings
-	 * 1) key is the dataType
-	 * 2) the catchall symbol "*" can be used
-	 * 3) selection will start with transport dataType and THEN go to "*" if needed
-	 */
-	transports = {},
-
-	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
-	allTypes = "*/".concat("*");
-
-// #8138, IE may throw an exception when accessing
-// a field from window.location if document.domain has been set
-try {
-	ajaxLocation = location.href;
-} catch( e ) {
-	// Use the href attribute of an A element
-	// since IE will modify it given document.location
-	ajaxLocation = document.createElement( "a" );
-	ajaxLocation.href = "";
-	ajaxLocation = ajaxLocation.href;
-}
-
-// Segment location into parts
-ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
-
-// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
-function addToPrefiltersOrTransports( structure ) {
-
-	// dataTypeExpression is optional and defaults to "*"
-	return function( dataTypeExpression, func ) {
-
-		if ( typeof dataTypeExpression !== "string" ) {
-			func = dataTypeExpression;
-			dataTypeExpression = "*";
-		}
-
-		var dataType,
-			i = 0,
-			dataTypes = dataTypeExpression.toLowerCase().match( core_rnotwhite ) || [];
-
-		if ( jQuery.isFunction( func ) ) {
-			// For each dataType in the dataTypeExpression
-			while ( (dataType = dataTypes[i++]) ) {
-				// Prepend if requested
-				if ( dataType[0] === "+" ) {
-					dataType = dataType.slice( 1 ) || "*";
-					(structure[ dataType ] = structure[ dataType ] || []).unshift( func );
-
-				// Otherwise append
-				} else {
-					(structure[ dataType ] = structure[ dataType ] || []).push( func );
-				}
-			}
-		}
-	};
-}
-
-// Base inspection function for prefilters and transports
-function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
-
-	var inspected = {},
-		seekingTransport = ( structure === transports );
-
-	function inspect( dataType ) {
-		var selected;
-		inspected[ dataType ] = true;
-		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
-			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
-			if( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
-				options.dataTypes.unshift( dataTypeOrTransport );
-				inspect( dataTypeOrTransport );
-				return false;
-			} else if ( seekingTransport ) {
-				return !( selected = dataTypeOrTransport );
-			}
-		});
-		return selected;
-	}
-
-	return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
-}
-
-// A special extend for ajax options
-// that takes "flat" options (not to be deep extended)
-// Fixes #9887
-function ajaxExtend( target, src ) {
-	var deep, key,
-		flatOptions = jQuery.ajaxSettings.flatOptions || {};
-
-	for ( key in src ) {
-		if ( src[ key ] !== undefined ) {
-			( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
-		}
-	}
-	if ( deep ) {
-		jQuery.extend( true, target, deep );
-	}
-
-	return target;
-}
-
-jQuery.fn.load = function( url, params, callback ) {
-	if ( typeof url !== "string" && _load ) {
-		return _load.apply( this, arguments );
-	}
-
-	var selector, response, type,
-		self = this,
-		off = url.indexOf(" ");
-
-	if ( off >= 0 ) {
-		selector = url.slice( off, url.length );
-		url = url.slice( 0, off );
-	}
-
-	// If it's a function
-	if ( jQuery.isFunction( params ) ) {
-
-		// We assume that it's the callback
-		callback = params;
-		params = undefined;
-
-	// Otherwise, build a param string
-	} else if ( params && typeof params === "object" ) {
-		type = "POST";
-	}
-
-	// If we have elements to modify, make the request
-	if ( self.length > 0 ) {
-		jQuery.ajax({
-			url: url,
-
-			// if "type" variable is undefined, then "GET" method will be used
-			type: type,
-			dataType: "html",
-			data: params
-		}).done(function( responseText ) {
-
-			// Save response for use in complete callback
-			response = arguments;
-
-			self.html( selector ?
-
-				// If a selector was specified, locate the right elements in a dummy div
-				// Exclude scripts to avoid IE 'Permission Denied' errors
-				jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
-
-				// Otherwise use the full result
-				responseText );
-
-		}).complete( callback && function( jqXHR, status ) {
-			self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
-		});
-	}
-
-	return this;
-};
-
-// Attach a bunch of functions for handling common AJAX events
-jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ){
-	jQuery.fn[ type ] = function( fn ){
-		return this.on( type, fn );
-	};
-});
-
-jQuery.extend({
-
-	// Counter for holding the number of active queries
-	active: 0,
-
-	// Last-Modified header cache for next request
-	lastModified: {},
-	etag: {},
-
-	ajaxSettings: {
-		url: ajaxLocation,
-		type: "GET",
-		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
-		global: true,
-		processData: true,
-		async: true,
-		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
-		/*
-		timeout: 0,
-		data: null,
-		dataType: null,
-		username: null,
-		password: null,
-		cache: null,
-		throws: false,
-		traditional: false,
-		headers: {},
-		*/
-
-		accepts: {
-			"*": allTypes,
-			text: "text/plain",
-			html: "text/html",
-			xml: "application/xml, text/xml",
-			json: "application/json, text/javascript"
-		},
-
-		contents: {
-			xml: /xml/,
-			html: /html/,
-			json: /json/
-		},
-
-		responseFields: {
-			xml: "responseXML",
-			text: "responseText",
-			json: "responseJSON"
-		},
-
-		// Data converters
-		// Keys separate source (or catchall "*") and destination types with a single space
-		converters: {
-
-			// Convert anything to text
-			"* text": String,
-
-			// Text to html (true = no transformation)
-			"text html": true,
-
-			// Evaluate text as a json expression
-			"text json": jQuery.parseJSON,
-
-			// Parse text as xml
-			"text xml": jQuery.parseXML
-		},
-
-		// For options that shouldn't be deep extended:
-		// you can add your own custom options here if
-		// and when you create one that shouldn't be
-		// deep extended (see ajaxExtend)
-		flatOptions: {
-			url: true,
-			context: true
-		}
-	},
-
-	// Creates a full fledged settings object into target
-	// with both ajaxSettings and settings fields.
-	// If target is omitted, writes into ajaxSettings.
-	ajaxSetup: function( target, settings ) {
-		return settings ?
-
-			// Building a settings object
-			ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
-
-			// Extending ajaxSettings
-			ajaxExtend( jQuery.ajaxSettings, target );
-	},
-
-	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
-	ajaxTransport: addToPrefiltersOrTransports( transports ),
-
-	// Main method
-	ajax: function( url, options ) {
-
-		// If url is an object, simulate pre-1.5 signature
-		if ( typeof url === "object" ) {
-			options = url;
-			url = undefined;
-		}
-
-		// Force options to be an object
-		options = options || {};
-
-		var // Cross-domain detection vars
-			parts,
-			// Loop variable
-			i,
-			// URL without anti-cache param
-			cacheURL,
-			// Response headers as string
-			responseHeadersString,
-			// timeout handle
-			timeoutTimer,
-
-			// To know if global events are to be dispatched
-			fireGlobals,
-
-			transport,
-			// Response headers
-			responseHeaders,
-			// Create the final options object
-			s = jQuery.ajaxSetup( {}, options ),
-			// Callbacks context
-			callbackContext = s.context || s,
-			// Context for global events is callbackContext if it is a DOM node or jQuery collection
-			globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?
-				jQuery( callbackContext ) :
-				jQuery.event,
-			// Deferreds
-			deferred = jQuery.Deferred(),
-			completeDeferred = jQuery.Callbacks("once memory"),
-			// Status-dependent callbacks
-			statusCode = s.statusCode || {},
-			// Headers (they are sent all at once)
-			requestHeaders = {},
-			requestHeadersNames = {},
-			// The jqXHR state
-			state = 0,
-			// Default abort message
-			strAbort = "canceled",
-			// Fake xhr
-			jqXHR = {
-				readyState: 0,
-
-				// Builds headers hashtable if needed
-				getResponseHeader: function( key ) {
-					var match;
-					if ( state === 2 ) {
-						if ( !responseHeaders ) {
-							responseHeaders = {};
-							while ( (match = rheaders.exec( responseHeadersString )) ) {
-								responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
-							}
-						}
-						match = responseHeaders[ key.toLowerCase() ];
-					}
-					return match == null ? null : match;
-				},
-
-				// Raw string
-				getAllResponseHeaders: function() {
-					return state === 2 ? responseHeadersString : null;
-				},
-
-				// Caches the header
-				setRequestHeader: function( name, value ) {
-					var lname = name.toLowerCase();
-					if ( !state ) {
-						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
-						requestHeaders[ name ] = value;
-					}
-					return this;
-				},
-
-				// Overrides response content-type header
-				overrideMimeType: function( type ) {
-					if ( !state ) {
-						s.mimeType = type;
-					}
-					return this;
-				},
-
-				// Status-dependent callbacks
-				statusCode: function( map ) {
-					var code;
-					if ( map ) {
-						if ( state < 2 ) {
-							for ( code in map ) {
-								// Lazy-add the new callback in a way that preserves old ones
-								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
-							}
-						} else {
-							// Execute the appropriate callbacks
-							jqXHR.always( map[ jqXHR.status ] );
-						}
-					}
-					return this;
-				},
-
-				// Cancel the request
-				abort: function( statusText ) {
-					var finalText = statusText || strAbort;
-					if ( transport ) {
-						transport.abort( finalText );
-					}
-					done( 0, finalText );
-					return this;
-				}
-			};
-
-		// Attach deferreds
-		deferred.promise( jqXHR ).complete = completeDeferred.add;
-		jqXHR.success = jqXHR.done;
-		jqXHR.error = jqXHR.fail;
-
-		// Remove hash character (#7531: and string promotion)
-		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
-		// Handle falsy url in the settings object (#10093: consistency with old signature)
-		// We also use the url parameter if available
-		s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
-
-		// Alias method option to type as per ticket #12004
-		s.type = options.method || options.type || s.method || s.type;
-
-		// Extract dataTypes list
-		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( core_rnotwhite ) || [""];
-
-		// A cross-domain request is in order when we have a protocol:host:port mismatch
-		if ( s.crossDomain == null ) {
-			parts = rurl.exec( s.url.toLowerCase() );
-			s.crossDomain = !!( parts &&
-				( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
-					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !==
-						( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) )
-			);
-		}
-
-		// Convert data if not already a string
-		if ( s.data && s.processData && typeof s.data !== "string" ) {
-			s.data = jQuery.param( s.data, s.traditional );
-		}
-
-		// Apply prefilters
-		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
-
-		// If request was aborted inside a prefilter, stop there
-		if ( state === 2 ) {
-			return jqXHR;
-		}
-
-		// We can fire global events as of now if asked to
-		fireGlobals = s.global;
-
-		// Watch for a new set of requests
-		if ( fireGlobals && jQuery.active++ === 0 ) {
-			jQuery.event.trigger("ajaxStart");
-		}
-
-		// Uppercase the type
-		s.type = s.type.toUpperCase();
-
-		// Determine if request has content
-		s.hasContent = !rnoContent.test( s.type );
-
-		// Save the URL in case we're toying with the If-Modified-Since
-		// and/or If-None-Match header later on
-		cacheURL = s.url;
-
-		// More options handling for requests with no content
-		if ( !s.hasContent ) {
-
-			// If data is available, append data to url
-			if ( s.data ) {
-				cacheURL = ( s.url += ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
-				// #9682: remove data so that it's not used in an eventual retry
-				delete s.data;
-			}
-
-			// Add anti-cache in url if needed
-			if ( s.cache === false ) {
-				s.url = rts.test( cacheURL ) ?
-
-					// If there is already a '_' parameter, set its value
-					cacheURL.replace( rts, "$1_=" + ajax_nonce++ ) :
-
-					// Otherwise add one to the end
-					cacheURL + ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ajax_nonce++;
-			}
-		}
-
-		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
-		if ( s.ifModified ) {
-			if ( jQuery.lastModified[ cacheURL ] ) {
-				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
-			}
-			if ( jQuery.etag[ cacheURL ] ) {
-				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
-			}
-		}
-
-		// Set the correct header, if data is being sent
-		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
-			jqXHR.setRequestHeader( "Content-Type", s.contentType );
-		}
-
-		// Set the Accepts header for the server, depending on the dataType
-		jqXHR.setRequestHeader(
-			"Accept",
-			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
-				s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
-				s.accepts[ "*" ]
-		);
-
-		// Check for headers option
-		for ( i in s.headers ) {
-			jqXHR.setRequestHeader( i, s.headers[ i ] );
-		}
-
-		// Allow custom headers/mimetypes and early abort
-		if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
-			// Abort if not done already and return
-			return jqXHR.abort();
-		}
-
-		// aborting is no longer a cancellation
-		strAbort = "abort";
-
-		// Install callbacks on deferreds
-		for ( i in { success: 1, error: 1, complete: 1 } ) {
-			jqXHR[ i ]( s[ i ] );
-		}
-
-		// Get transport
-		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
-
-		// If no transport, we auto-abort
-		if ( !transport ) {
-			done( -1, "No Transport" );
-		} else {
-			jqXHR.readyState = 1;
-
-			// Send global event
-			if ( fireGlobals ) {
-				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
-			}
-			// Timeout
-			if ( s.async && s.timeout > 0 ) {
-				timeoutTimer = setTimeout(function() {
-					jqXHR.abort("timeout");
-				}, s.timeout );
-			}
-
-			try {
-				state = 1;
-				transport.send( requestHeaders, done );
-			} catch ( e ) {
-				// Propagate exception as error if not done
-				if ( state < 2 ) {
-					done( -1, e );
-				// Simply rethrow otherwise
-				} else {
-					throw e;
-				}
-			}
-		}
-
-		// Callback for when everything is done
-		function done( status, nativeStatusText, responses, headers ) {
-			var isSuccess, success, error, response, modified,
-				statusText = nativeStatusText;
-
-			// Called once
-			if ( state === 2 ) {
-				return;
-			}
-
-			// State is "done" now
-			state = 2;
-
-			// Clear timeout if it exists
-			if ( timeoutTimer ) {
-				clearTimeout( timeoutTimer );
-			}
-
-			// Dereference transport for early garbage collection
-			// (no matter how long the jqXHR object will be used)
-			transport = undefined;
-
-			// Cache response headers
-			responseHeadersString = headers || "";
-
-			// Set readyState
-			jqXHR.readyState = status > 0 ? 4 : 0;
-
-			// Determine if successful
-			isSuccess = status >= 200 && status < 300 || status === 304;
-
-			// Get response data
-			if ( responses ) {
-				response = ajaxHandleResponses( s, jqXHR, responses );
-			}
-
-			// Convert no matter what (that way responseXXX fields are always set)
-			response = ajaxConvert( s, response, jqXHR, isSuccess );
-
-			// If successful, handle type chaining
-			if ( isSuccess ) {
-
-				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
-				if ( s.ifModified ) {
-					modified = jqXHR.getResponseHeader("Last-Modified");
-					if ( modified ) {
-						jQuery.lastModified[ cacheURL ] = modified;
-					}
-					modified = jqXHR.getResponseHeader("etag");
-					if ( modified ) {
-						jQuery.etag[ cacheURL ] = modified;
-					}
-				}
-
-				// if no content
-				if ( status === 204 || s.type === "HEAD" ) {
-					statusText = "nocontent";
-
-				// if not modified
-				} else if ( status === 304 ) {
-					statusText = "notmodified";
-
-				// If we have data, let's convert it
-				} else {
-					statusText = response.state;
-					success = response.data;
-					error = response.error;
-					isSuccess = !error;
-				}
-			} else {
-				// We extract error from statusText
-				// then normalize statusText and status for non-aborts
-				error = statusText;
-				if ( status || !statusText ) {
-					statusText = "error";
-					if ( status < 0 ) {
-						status = 0;
-					}
-				}
-			}
-
-			// Set data for the fake xhr object
-			jqXHR.status = status;
-			jqXHR.statusText = ( nativeStatusText || statusText ) + "";
-
-			// Success/Error
-			if ( isSuccess ) {
-				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
-			} else {
-				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
-			}
-
-			// Status-dependent callbacks
-			jqXHR.statusCode( statusCode );
-			statusCode = undefined;
-
-			if ( fireGlobals ) {
-				globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
-					[ jqXHR, s, isSuccess ? success : error ] );
-			}
-
-			// Complete
-			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
-
-			if ( fireGlobals ) {
-				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
-				// Handle the global AJAX counter
-				if ( !( --jQuery.active ) ) {
-					jQuery.event.trigger("ajaxStop");
-				}
-			}
-		}
-
-		return jqXHR;
-	},
-
-	getJSON: function( url, data, callback ) {
-		return jQuery.get( url, data, callback, "json" );
-	},
-
-	getScript: function( url, callback ) {
-		return jQuery.get( url, undefined, callback, "script" );
-	}
-});
-
-jQuery.each( [ "get", "post" ], function( i, method ) {
-	jQuery[ method ] = function( url, data, callback, type ) {
-		// shift arguments if data argument was omitted
-		if ( jQuery.isFunction( data ) ) {
-			type = type || callback;
-			callback = data;
-			data = undefined;
-		}
-
-		return jQuery.ajax({
-			url: url,
-			type: method,
-			dataType: type,
-			data: data,
-			success: callback
-		});
-	};
-});
-
-/* Handles responses to an ajax request:
- * - finds the right dataType (mediates between content-type and expected dataType)
- * - returns the corresponding response
- */
-function ajaxHandleResponses( s, jqXHR, responses ) {
-	var firstDataType, ct, finalDataType, type,
-		contents = s.contents,
-		dataTypes = s.dataTypes;
-
-	// Remove auto dataType and get content-type in the process
-	while( dataTypes[ 0 ] === "*" ) {
-		dataTypes.shift();
-		if ( ct === undefined ) {
-			ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
-		}
-	}
-
-	// Check if we're dealing with a known content-type
-	if ( ct ) {
-		for ( type in contents ) {
-			if ( contents[ type ] && contents[ type ].test( ct ) ) {
-				dataTypes.unshift( type );
-				break;
-			}
-		}
-	}
-
-	// Check to see if we have a response for the expected dataType
-	if ( dataTypes[ 0 ] in responses ) {
-		finalDataType = dataTypes[ 0 ];
-	} else {
-		// Try convertible dataTypes
-		for ( type in responses ) {
-			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
-				finalDataType = type;
-				break;
-			}
-			if ( !firstDataType ) {
-				firstDataType = type;
-			}
-		}
-		// Or just use first one
-		finalDataType = finalDataType || firstDataType;
-	}
-
-	// If we found a dataType
-	// We add the dataType to the list if needed
-	// and return the corresponding response
-	if ( finalDataType ) {
-		if ( finalDataType !== dataTypes[ 0 ] ) {
-			dataTypes.unshift( finalDataType );
-		}
-		return responses[ finalDataType ];
-	}
-}
-
-/* Chain conversions given the request and the original response
- * Also sets the responseXXX fields on the jqXHR instance
- */
-function ajaxConvert( s, response, jqXHR, isSuccess ) {
-	var conv2, current, conv, tmp, prev,
-		converters = {},
-		// Work with a copy of dataTypes in case we need to modify it for conversion
-		dataTypes = s.dataTypes.slice();
-
-	// Create converters map with lowercased keys
-	if ( dataTypes[ 1 ] ) {
-		for ( conv in s.converters ) {
-			converters[ conv.toLowerCase() ] = s.converters[ conv ];
-		}
-	}
-
-	current = dataTypes.shift();
-
-	// Convert to each sequential dataType
-	while ( current ) {
-
-		if ( s.responseFields[ current ] ) {
-			jqXHR[ s.responseFields[ current ] ] = response;
-		}
-
-		// Apply the dataFilter if provided
-		if ( !prev && isSuccess && s.dataFilter ) {
-			response = s.dataFilter( response, s.dataType );
-		}
-
-		prev = current;
-		current = dataTypes.shift();
-
-		if ( current ) {
-
-			// There's only work to do if current dataType is non-auto
-			if ( current === "*" ) {
-
-				current = prev;
-
-			// Convert response if prev dataType is non-auto and differs from current
-			} else if ( prev !== "*" && prev !== current ) {
-
-				// Seek a direct converter
-				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
-
-				// If none found, seek a pair
-				if ( !conv ) {
-					for ( conv2 in converters ) {
-
-						// If conv2 outputs current
-						tmp = conv2.split( " " );
-						if ( tmp[ 1 ] === current ) {
-
-							// If prev can be converted to accepted input
-							conv = converters[ prev + " " + tmp[ 0 ] ] ||
-								converters[ "* " + tmp[ 0 ] ];
-							if ( conv ) {
-								// Condense equivalence converters
-								if ( conv === true ) {
-									conv = converters[ conv2 ];
-
-								// Otherwise, insert the intermediate dataType
-								} else if ( converters[ conv2 ] !== true ) {
-									current = tmp[ 0 ];
-									dataTypes.unshift( tmp[ 1 ] );
-								}
-								break;
-							}
-						}
-					}
-				}
-
-				// Apply converter (if not an equivalence)
-				if ( conv !== true ) {
-
-					// Unless errors are allowed to bubble, catch and return them
-					if ( conv && s[ "throws" ] ) {
-						response = conv( response );
-					} else {
-						try {
-							response = conv( response );
-						} catch ( e ) {
-							return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
-						}
-					}
-				}
-			}
-		}
-	}
-
-	return { state: "success", data: response };
-}
-// Install script dataType
-jQuery.ajaxSetup({
-	accepts: {
-		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
-	},
-	contents: {
-		script: /(?:java|ecma)script/
-	},
-	converters: {
-		"text script": function( text ) {
-			jQuery.globalEval( text );
-			return text;
-		}
-	}
-});
-
-// Handle cache's special case and global
-jQuery.ajaxPrefilter( "script", function( s ) {
-	if ( s.cache === undefined ) {
-		s.cache = false;
-	}
-	if ( s.crossDomain ) {
-		s.type = "GET";
-		s.global = false;
-	}
-});
-
-// Bind script tag hack transport
-jQuery.ajaxTransport( "script", function(s) {
-
-	// This transport only deals with cross domain requests
-	if ( s.crossDomain ) {
-
-		var script,
-			head = document.head || jQuery("head")[0] || document.documentElement;
-
-		return {
-
-			send: function( _, callback ) {
-
-				script = document.createElement("script");
-
-				script.async = true;
-
-				if ( s.scriptCharset ) {
-					script.charset = s.scriptCharset;
-				}
-
-				script.src = s.url;
-
-				// Attach handlers for all browsers
-				script.onload = script.onreadystatechange = function( _, isAbort ) {
-
-					if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
-
-						// Handle memory leak in IE
-						script.onload = script.onreadystatechange = null;
-
-						// Remove the script
-						if ( script.parentNode ) {
-							script.parentNode.removeChild( script );
-						}
-
-						// Dereference the script
-						script = null;
-
-						// Callback if not abort
-						if ( !isAbort ) {
-							callback( 200, "success" );
-						}
-					}
-				};
-
-				// Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
-				// Use native DOM manipulation to avoid our domManip AJAX trickery
-				head.insertBefore( script, head.firstChild );
-			},
-
-			abort: function() {
-				if ( script ) {
-					script.onload( undefined, true );
-				}
-			}
-		};
-	}
-});
-var oldCallbacks = [],
-	rjsonp = /(=)\?(?=&|$)|\?\?/;
-
-// Default jsonp settings
-jQuery.ajaxSetup({
-	jsonp: "callback",
-	jsonpCallback: function() {
-		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( ajax_nonce++ ) );
-		this[ callback ] = true;
-		return callback;
-	}
-});
-
-// Detect, normalize options and install callbacks for jsonp requests
-jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
-
-	var callbackName, overwritten, responseContainer,
-		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
-			"url" :
-			typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
-		);
-
-	// Handle iff the expected data type is "jsonp" or we have a parameter to set
-	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
-
-		// Get callback name, remembering preexisting value associated with it
-		callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
-			s.jsonpCallback() :
-			s.jsonpCallback;
-
-		// Insert callback into url or form data
-		if ( jsonProp ) {
-			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
-		} else if ( s.jsonp !== false ) {
-			s.url += ( ajax_rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
-		}
-
-		// Use data converter to retrieve json after script execution
-		s.converters["script json"] = function() {
-			if ( !responseContainer ) {
-				jQuery.error( callbackName + " was not called" );
-			}
-			return responseContainer[ 0 ];
-		};
-
-		// force json dataType
-		s.dataTypes[ 0 ] = "json";
-
-		// Install callback
-		overwritten = window[ callbackName ];
-		window[ callbackName ] = function() {
-			responseContainer = arguments;
-		};
-
-		// Clean-up function (fires after converters)
-		jqXHR.always(function() {
-			// Restore preexisting value
-			window[ callbackName ] = overwritten;
-
-			// Save back as free
-			if ( s[ callbackName ] ) {
-				// make sure that re-using the options doesn't screw things around
-				s.jsonpCallback = originalSettings.jsonpCallback;
-
-				// save the callback name for future use
-				oldCallbacks.push( callbackName );
-			}
-
-			// Call if it was a function and we have a response
-			if ( responseContainer && jQuery.isFunction( overwritten ) ) {
-				overwritten( responseContainer[ 0 ] );
-			}
-
-			responseContainer = overwritten = undefined;
-		});
-
-		// Delegate to script
-		return "script";
-	}
-});
-var xhrCallbacks, xhrSupported,
-	xhrId = 0,
-	// #5280: Internet Explorer will keep connections alive if we don't abort on unload
-	xhrOnUnloadAbort = window.ActiveXObject && function() {
-		// Abort all pending requests
-		var key;
-		for ( key in xhrCallbacks ) {
-			xhrCallbacks[ key ]( undefined, true );
-		}
-	};
-
-// Functions to create xhrs
-function createStandardXHR() {
-	try {
-		return new window.XMLHttpRequest();
-	} catch( e ) {}
-}
-
-function createActiveXHR() {
-	try {
-		return new window.ActiveXObject("Microsoft.XMLHTTP");
-	} catch( e ) {}
-}
-
-// Create the request object
-// (This is still attached to ajaxSettings for backward compatibility)
-jQuery.ajaxSettings.xhr = window.ActiveXObject ?
-	/* Microsoft failed to properly
-	 * implement the XMLHttpRequest in IE7 (can't request local files),
-	 * so we use the ActiveXObject when it is available
-	 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
-	 * we need a fallback.
-	 */
-	function() {
-		return !this.isLocal && createStandardXHR() || createActiveXHR();
-	} :
-	// For all other browsers, use the standard XMLHttpRequest object
-	createStandardXHR;
-
-// Determine support properties
-xhrSupported = jQuery.ajaxSettings.xhr();
-jQuery.support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
-xhrSupported = jQuery.support.ajax = !!xhrSupported;
-
-// Create transport if the browser can provide an xhr
-if ( xhrSupported ) {
-
-	jQuery.ajaxTransport(function( s ) {
-		// Cross domain only allowed if supported through XMLHttpRequest
-		if ( !s.crossDomain || jQuery.support.cors ) {
-
-			var callback;
-
-			return {
-				send: function( headers, complete ) {
-
-					// Get a new xhr
-					var handle, i,
-						xhr = s.xhr();
-
-					// Open the socket
-					// Passing null username, generates a login popup on Opera (#2865)
-					if ( s.username ) {
-						xhr.open( s.type, s.url, s.async, s.username, s.password );
-					} else {
-						xhr.open( s.type, s.url, s.async );
-					}
-
-					// Apply custom fields if provided
-					if ( s.xhrFields ) {
-						for ( i in s.xhrFields ) {
-							xhr[ i ] = s.xhrFields[ i ];
-						}
-					}
-
-					// Override mime type if needed
-					if ( s.mimeType && xhr.overrideMimeType ) {
-						xhr.overrideMimeType( s.mimeType );
-					}
-
-					// X-Requested-With header
-					// For cross-domain requests, seeing as conditions for a preflight are
-					// akin to a jigsaw puzzle, we simply never set it to be sure.
-					// (it can always be set on a per-request basis or even using ajaxSetup)
-					// For same-domain requests, won't change header if already provided.
-					if ( !s.crossDomain && !headers["X-Requested-With"] ) {
-						headers["X-Requested-With"] = "XMLHttpRequest";
-					}
-
-					// Need an extra try/catch for cross domain requests in Firefox 3
-					try {
-						for ( i in headers ) {
-							xhr.setRequestHeader( i, headers[ i ] );
-						}
-					} catch( err ) {}
-
-					// Do send the request
-					// This may raise an exception which is actually
-					// handled in jQuery.ajax (so no try/catch here)
-					xhr.send( ( s.hasContent && s.data ) || null );
-
-					// Listener
-					callback = function( _, isAbort ) {
-						var status, responseHeaders, statusText, responses;
-
-						// Firefox throws exceptions when accessing properties
-						// of an xhr when a network error occurred
-						// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
-						try {
-
-							// Was never called and is aborted or complete
-							if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
-
-								// Only called once
-								callback = undefined;
-
-								// Do not keep as active anymore
-								if ( handle ) {
-									xhr.onreadystatechange = jQuery.noop;
-									if ( xhrOnUnloadAbort ) {
-										delete xhrCallbacks[ handle ];
-									}
-								}
-
-								// If it's an abort
-								if ( isAbort ) {
-									// Abort it manually if needed
-									if ( xhr.readyState !== 4 ) {
-										xhr.abort();
-									}
-								} else {
-									responses = {};
-									status = xhr.status;
-									responseHeaders = xhr.getAllResponseHeaders();
-
-									// When requesting binary data, IE6-9 will throw an exception
-									// on any attempt to access responseText (#11426)
-									if ( typeof xhr.responseText === "string" ) {
-										responses.text = xhr.responseText;
-									}
-
-									// Firefox throws an exception when accessing
-									// statusText for faulty cross-domain requests
-									try {
-										statusText = xhr.statusText;
-									} catch( e ) {
-										// We normalize with Webkit giving an empty statusText
-										statusText = "";
-									}
-
-									// Filter status for non standard behaviors
-
-									// If the request is local and we have data: assume a success
-									// (success with no data won't get notified, that's the best we
-									// can do given current implementations)
-									if ( !status && s.isLocal && !s.crossDomain ) {
-										status = responses.text ? 200 : 404;
-									// IE - #1450: sometimes returns 1223 when it should be 204
-									} else if ( status === 1223 ) {
-										status = 204;
-									}
-								}
-							}
-						} catch( firefoxAccessException ) {
-							if ( !isAbort ) {
-								complete( -1, firefoxAccessException );
-							}
-						}
-
-						// Call complete if needed
-						if ( responses ) {
-							complete( status, statusText, responses, responseHeaders );
-						}
-					};
-
-					if ( !s.async ) {
-						// if we're in sync mode we fire the callback
-						callback();
-					} else if ( xhr.readyState === 4 ) {
-						// (IE6 & IE7) if it's in cache and has been
-						// retrieved directly we need to fire the callback
-						setTimeout( callback );
-					} else {
-						handle = ++xhrId;
-						if ( xhrOnUnloadAbort ) {
-							// Create the active xhrs callbacks list if needed
-							// and attach the unload handler
-							if ( !xhrCallbacks ) {
-								xhrCallbacks = {};
-								jQuery( window ).unload( xhrOnUnloadAbort );
-							}
-							// Add to list of active xhrs callbacks
-							xhrCallbacks[ handle ] = callback;
-						}
-						xhr.onreadystatechange = callback;
-					}
-				},
-
-				abort: function() {
-					if ( callback ) {
-						callback( undefined, true );
-					}
-				}
-			};
-		}
-	});
-}
-var fxNow, timerId,
-	rfxtypes = /^(?:toggle|show|hide)$/,
-	rfxnum = new RegExp( "^(?:([+-])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
-	rrun = /queueHooks$/,
-	animationPrefilters = [ defaultPrefilter ],
-	tweeners = {
-		"*": [function( prop, value ) {
-			var tween = this.createTween( prop, value ),
-				target = tween.cur(),
-				parts = rfxnum.exec( value ),
-				unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
-
-				// Starting value computation is required for potential unit mismatches
-				start = ( jQuery.cssNumber[ prop ] || unit !== "px" && +target ) &&
-					rfxnum.exec( jQuery.css( tween.elem, prop ) ),
-				scale = 1,
-				maxIterations = 20;
-
-			if ( start && start[ 3 ] !== unit ) {
-				// Trust units reported by jQuery.css
-				unit = unit || start[ 3 ];
-
-				// Make sure we update the tween properties later on
-				parts = parts || [];
-
-				// Iteratively approximate from a nonzero starting point
-				start = +target || 1;
-
-				do {
-					// If previous iteration zeroed out, double until we get *something*
-					// Use a string for doubling factor so we don't accidentally see scale as unchanged below
-					scale = scale || ".5";
-
-					// Adjust and apply
-					start = start / scale;
-					jQuery.style( tween.elem, prop, start + unit );
-
-				// Update scale, tolerating zero or NaN from tween.cur()
-				// And breaking the loop if scale is unchanged or perfect, or if we've just had enough
-				} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
-			}
-
-			// Update tween properties
-			if ( parts ) {
-				start = tween.start = +start || +target || 0;
-				tween.unit = unit;
-				// If a +=/-= token was provided, we're doing a relative animation
-				tween.end = parts[ 1 ] ?
-					start + ( parts[ 1 ] + 1 ) * parts[ 2 ] :
-					+parts[ 2 ];
-			}
-
-			return tween;
-		}]
-	};
-
-// Animations created synchronously will run synchronously
-function createFxNow() {
-	setTimeout(function() {
-		fxNow = undefined;
-	});
-	return ( fxNow = jQuery.now() );
-}
-
-function createTween( value, prop, animation ) {
-	var tween,
-		collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
-		index = 0,
-		length = collection.length;
-	for ( ; index < length; index++ ) {
-		if ( (tween = collection[ index ].call( animation, prop, value )) ) {
-
-			// we're done with this property
-			return tween;
-		}
-	}
-}
-
-function Animation( elem, properties, options ) {
-	var result,
-		stopped,
-		index = 0,
-		length = animationPrefilters.length,
-		deferred = jQuery.Deferred().always( function() {
-			// don't match elem in the :animated selector
-			delete tick.elem;
-		}),
-		tick = function() {
-			if ( stopped ) {
-				return false;
-			}
-			var currentTime = fxNow || createFxNow(),
-				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
-				// archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
-				temp = remaining / animation.duration || 0,
-				percent = 1 - temp,
-				index = 0,
-				length = animation.tweens.length;
-
-			for ( ; index < length ; index++ ) {
-				animation.tweens[ index ].run( percent );
-			}
-
-			deferred.notifyWith( elem, [ animation, percent, remaining ]);
-
-			if ( percent < 1 && length ) {
-				return remaining;
-			} else {
-				deferred.resolveWith( elem, [ animation ] );
-				return false;
-			}
-		},
-		animation = deferred.promise({
-			elem: elem,
-			props: jQuery.extend( {}, properties ),
-			opts: jQuery.extend( true, { specialEasing: {} }, options ),
-			originalProperties: properties,
-			originalOptions: options,
-			startTime: fxNow || createFxNow(),
-			duration: options.duration,
-			tweens: [],
-			createTween: function( prop, end ) {
-				var tween = jQuery.Tween( elem, animation.opts, prop, end,
-						animation.opts.specialEasing[ prop ] || animation.opts.easing );
-				animation.tweens.push( tween );
-				return tween;
-			},
-			stop: function( gotoEnd ) {
-				var index = 0,
-					// if we are going to the end, we want to run all the tweens
-					// otherwise we skip this part
-					length = gotoEnd ? animation.tweens.length : 0;
-				if ( stopped ) {
-					return this;
-				}
-				stopped = true;
-				for ( ; index < length ; index++ ) {
-					animation.tweens[ index ].run( 1 );
-				}
-
-				// resolve when we played the last frame
-				// otherwise, reject
-				if ( gotoEnd ) {
-					deferred.resolveWith( elem, [ animation, gotoEnd ] );
-				} else {
-					deferred.rejectWith( elem, [ animation, gotoEnd ] );
-				}
-				return this;
-			}
-		}),
-		props = animation.props;
-
-	propFilter( props, animation.opts.specialEasing );
-
-	for ( ; index < length ; index++ ) {
-		result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
-		if ( result ) {
-			return result;
-		}
-	}
-
-	jQuery.map( props, createTween, animation );
-
-	if ( jQuery.isFunction( animation.opts.start ) ) {
-		animation.opts.start.call( elem, animation );
-	}
-
-	jQuery.fx.timer(
-		jQuery.extend( tick, {
-			elem: elem,
-			anim: animation,
-			queue: animation.opts.queue
-		})
-	);
-
-	// attach callbacks from options
-	return animation.progress( animation.opts.progress )
-		.done( animation.opts.done, animation.opts.complete )
-		.fail( animation.opts.fail )
-		.always( animation.opts.always );
-}
-
-function propFilter( props, specialEasing ) {
-	var index, name, easing, value, hooks;
-
-	// camelCase, specialEasing and expand cssHook pass
-	for ( index in props ) {
-		name = jQuery.camelCase( index );
-		easing = specialEasing[ name ];
-		value = props[ index ];
-		if ( jQuery.isArray( value ) ) {
-			easing = value[ 1 ];
-			value = props[ index ] = value[ 0 ];
-		}
-
-		if ( index !== name ) {
-			props[ name ] = value;
-			delete props[ index ];
-		}
-
-		hooks = jQuery.cssHooks[ name ];
-		if ( hooks && "expand" in hooks ) {
-			value = hooks.expand( value );
-			delete props[ name ];
-
-			// not quite $.extend, this wont overwrite keys already present.
-			// also - reusing 'index' from above because we have the correct "name"
-			for ( index in value ) {
-				if ( !( index in props ) ) {
-					props[ index ] = value[ index ];
-					specialEasing[ index ] = easing;
-				}
-			}
-		} else {
-			specialEasing[ name ] = easing;
-		}
-	}
-}
-
-jQuery.Animation = jQuery.extend( Animation, {
-
-	tweener: function( props, callback ) {
-		if ( jQuery.isFunction( props ) ) {
-			callback = props;
-			props = [ "*" ];
-		} else {
-			props = props.split(" ");
-		}
-
-		var prop,
-			index = 0,
-			length = props.length;
-
-		for ( ; index < length ; index++ ) {
-			prop = props[ index ];
-			tweeners[ prop ] = tweeners[ prop ] || [];
-			tweeners[ prop ].unshift( callback );
-		}
-	},
-
-	prefilter: function( callback, prepend ) {
-		if ( prepend ) {
-			animationPrefilters.unshift( callback );
-		} else {
-			animationPrefilters.push( callback );
-		}
-	}
-});
-
-function defaultPrefilter( elem, props, opts ) {
-	/* jshint validthis: true */
-	var prop, value, toggle, tween, hooks, oldfire,
-		anim = this,
-		orig = {},
-		style = elem.style,
-		hidden = elem.nodeType && isHidden( elem ),
-		dataShow = jQuery._data( elem, "fxshow" );
-
-	// handle queue: false promises
-	if ( !opts.queue ) {
-		hooks = jQuery._queueHooks( elem, "fx" );
-		if ( hooks.unqueued == null ) {
-			hooks.unqueued = 0;
-			oldfire = hooks.empty.fire;
-			hooks.empty.fire = function() {
-				if ( !hooks.unqueued ) {
-					oldfire();
-				}
-			};
-		}
-		hooks.unqueued++;
-
-		anim.always(function() {
-			// doing this makes sure that the complete handler will be called
-			// before this completes
-			anim.always(function() {
-				hooks.unqueued--;
-				if ( !jQuery.queue( elem, "fx" ).length ) {
-					hooks.empty.fire();
-				}
-			});
-		});
-	}
-
-	// height/width overflow pass
-	if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
-		// Make sure that nothing sneaks out
-		// Record all 3 overflow attributes because IE does not
-		// change the overflow attribute when overflowX and
-		// overflowY are set to the same value
-		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
-
-		// Set display property to inline-block for height/width
-		// animations on inline elements that are having width/height animated
-		if ( jQuery.css( elem, "display" ) === "inline" &&
-				jQuery.css( elem, "float" ) === "none" ) {
-
-			// inline-level elements accept inline-block;
-			// block-level elements need to be inline with layout
-			if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) {
-				style.display = "inline-block";
-
-			} else {
-				style.zoom = 1;
-			}
-		}
-	}
-
-	if ( opts.overflow ) {
-		style.overflow = "hidden";
-		if ( !jQuery.support.shrinkWrapBlocks ) {
-			anim.always(function() {
-				style.overflow = opts.overflow[ 0 ];
-				style.overflowX = opts.overflow[ 1 ];
-				style.overflowY = opts.overflow[ 2 ];
-			});
-		}
-	}
-
-
-	// show/hide pass
-	for ( prop in props ) {
-		value = props[ prop ];
-		if ( rfxtypes.exec( value ) ) {
-			delete props[ prop ];
-			toggle = toggle || value === "toggle";
-			if ( value === ( hidden ? "hide" : "show" ) ) {
-				continue;
-			}
-			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
-		}
-	}
-
-	if ( !jQuery.isEmptyObject( orig ) ) {
-		if ( dataShow ) {
-			if ( "hidden" in dataShow ) {
-				hidden = dataShow.hidden;
-			}
-		} else {
-			dataShow = jQuery._data( elem, "fxshow", {} );
-		}
-
-		// store state if its toggle - enables .stop().toggle() to "reverse"
-		if ( toggle ) {
-			dataShow.hidden = !hidden;
-		}
-		if ( hidden ) {
-			jQuery( elem ).show();
-		} else {
-			anim.done(function() {
-				jQuery( elem ).hide();
-			});
-		}
-		anim.done(function() {
-			var prop;
-			jQuery._removeData( elem, "fxshow" );
-			for ( prop in orig ) {
-				jQuery.style( elem, prop, orig[ prop ] );
-			}
-		});
-		for ( prop in orig ) {
-			tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
-
-			if ( !( prop in dataShow ) ) {
-				dataShow[ prop ] = tween.start;
-				if ( hidden ) {
-					tween.end = tween.start;
-					tween.start = prop === "width" || prop === "height" ? 1 : 0;
-				}
-			}
-		}
-	}
-}
-
-function Tween( elem, options, prop, end, easing ) {
-	return new Tween.prototype.init( elem, options, prop, end, easing );
-}
-jQuery.Tween = Tween;
-
-Tween.prototype = {
-	constructor: Tween,
-	init: function( elem, options, prop, end, easing, unit ) {
-		this.elem = elem;
-		this.prop = prop;
-		this.easing = easing || "swing";
-		this.options = options;
-		this.start = this.now = this.cur();
-		this.end = end;
-		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
-	},
-	cur: function() {
-		var hooks = Tween.propHooks[ this.prop ];
-
-		return hooks && hooks.get ?
-			hooks.get( this ) :
-			Tween.propHooks._default.get( this );
-	},
-	run: function( percent ) {
-		var eased,
-			hooks = Tween.propHooks[ this.prop ];
-
-		if ( this.options.duration ) {
-			this.pos = eased = jQuery.easing[ this.easing ](
-				percent, this.options.duration * percent, 0, 1, this.options.duration
-			);
-		} else {
-			this.pos = eased = percent;
-		}
-		this.now = ( this.end - this.start ) * eased + this.start;
-
-		if ( this.options.step ) {
-			this.options.step.call( this.elem, this.now, this );
-		}
-
-		if ( hooks && hooks.set ) {
-			hooks.set( this );
-		} else {
-			Tween.propHooks._default.set( this );
-		}
-		return this;
-	}
-};
-
-Tween.prototype.init.prototype = Tween.prototype;
-
-Tween.propHooks = {
-	_default: {
-		get: function( tween ) {
-			var result;
-
-			if ( tween.elem[ tween.prop ] != null &&
-				(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
-				return tween.elem[ tween.prop ];
-			}
-
-			// passing an empty string as a 3rd parameter to .css will automatically
-			// attempt a parseFloat and fallback to a string if the parse fails
-			// so, simple values such as "10px" are parsed to Float.
-			// complex values such as "rotate(1rad)" are returned as is.
-			result = jQuery.css( tween.elem, tween.prop, "" );
-			// Empty strings, null, undefined and "auto" are converted to 0.
-			return !result || result === "auto" ? 0 : result;
-		},
-		set: function( tween ) {
-			// use step hook for back compat - use cssHook if its there - use .style if its
-			// available and use plain properties where available
-			if ( jQuery.fx.step[ tween.prop ] ) {
-				jQuery.fx.step[ tween.prop ]( tween );
-			} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
-				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
-			} else {
-				tween.elem[ tween.prop ] = tween.now;
-			}
-		}
-	}
-};
-
-// Support: IE <=9
-// Panic based approach to setting things on disconnected nodes
-
-Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
-	set: function( tween ) {
-		if ( tween.elem.nodeType && tween.elem.parentNode ) {
-			tween.elem[ tween.prop ] = tween.now;
-		}
-	}
-};
-
-jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
-	var cssFn = jQuery.fn[ name ];
-	jQuery.fn[ name ] = function( speed, easing, callback ) {
-		return speed == null || typeof speed === "boolean" ?
-			cssFn.apply( this, arguments ) :
-			this.animate( genFx( name, true ), speed, easing, callback );
-	};
-});
-
-jQuery.fn.extend({
-	fadeTo: function( speed, to, easing, callback ) {
-
-		// show any hidden elements after setting opacity to 0
-		return this.filter( isHidden ).css( "opacity", 0 ).show()
-
-			// animate to the value specified
-			.end().animate({ opacity: to }, speed, easing, callback );
-	},
-	animate: function( prop, speed, easing, callback ) {
-		var empty = jQuery.isEmptyObject( prop ),
-			optall = jQuery.speed( speed, easing, callback ),
-			doAnimation = function() {
-				// Operate on a copy of prop so per-property easing won't be lost
-				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
-
-				// Empty animations, or finishing resolves immediately
-				if ( empty || jQuery._data( this, "finish" ) ) {
-					anim.stop( true );
-				}
-			};
-			doAnimation.finish = doAnimation;
-
-		return empty || optall.queue === false ?
-			this.each( doAnimation ) :
-			this.queue( optall.queue, doAnimation );
-	},
-	stop: function( type, clearQueue, gotoEnd ) {
-		var stopQueue = function( hooks ) {
-			var stop = hooks.stop;
-			delete hooks.stop;
-			stop( gotoEnd );
-		};
-
-		if ( typeof type !== "string" ) {
-			gotoEnd = clearQueue;
-			clearQueue = type;
-			type = undefined;
-		}
-		if ( clearQueue && type !== false ) {
-			this.queue( type || "fx", [] );
-		}
-
-		return this.each(function() {
-			var dequeue = true,
-				index = type != null && type + "queueHooks",
-				timers = jQuery.timers,
-				data = jQuery._data( this );
-
-			if ( index ) {
-				if ( data[ index ] && data[ index ].stop ) {
-					stopQueue( data[ index ] );
-				}
-			} else {
-				for ( index in data ) {
-					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
-						stopQueue( data[ index ] );
-					}
-				}
-			}
-
-			for ( index = timers.length; index--; ) {
-				if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
-					timers[ index ].anim.stop( gotoEnd );
-					dequeue = false;
-					timers.splice( index, 1 );
-				}
-			}
-
-			// start the next in the queue if the last step wasn't forced
-			// timers currently will call their complete callbacks, which will dequeue
-			// but only if they were gotoEnd
-			if ( dequeue || !gotoEnd ) {
-				jQuery.dequeue( this, type );
-			}
-		});
-	},
-	finish: function( type ) {
-		if ( type !== false ) {
-			type = type || "fx";
-		}
-		return this.each(function() {
-			var index,
-				data = jQuery._data( this ),
-				queue = data[ type + "queue" ],
-				hooks = data[ type + "queueHooks" ],
-				timers = jQuery.timers,
-				length = queue ? queue.length : 0;
-
-			// enable finishing flag on private data
-			data.finish = true;
-
-			// empty the queue first
-			jQuery.queue( this, type, [] );
-
-			if ( hooks && hooks.stop ) {
-				hooks.stop.call( this, true );
-			}
-
-			// look for any active animations, and finish them
-			for ( index = timers.length; index--; ) {
-				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
-					timers[ index ].anim.stop( true );
-					timers.splice( index, 1 );
-				}
-			}
-
-			// look for any animations in the old queue and finish them
-			for ( index = 0; index < length; index++ ) {
-				if ( queue[ index ] && queue[ index ].finish ) {
-					queue[ index ].finish.call( this );
-				}
-			}
-
-			// turn off finishing flag
-			delete data.finish;
-		});
-	}
-});
-
-// Generate parameters to create a standard animation
-function genFx( type, includeWidth ) {
-	var which,
-		attrs = { height: type },
-		i = 0;
-
-	// if we include width, step value is 1 to do all cssExpand values,
-	// if we don't include width, step value is 2 to skip over Left and Right
-	includeWidth = includeWidth? 1 : 0;
-	for( ; i < 4 ; i += 2 - includeWidth ) {
-		which = cssExpand[ i ];
-		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
-	}
-
-	if ( includeWidth ) {
-		attrs.opacity = attrs.width = type;
-	}
-
-	return attrs;
-}
-
-// Generate shortcuts for custom animations
-jQuery.each({
-	slideDown: genFx("show"),
-	slideUp: genFx("hide"),
-	slideToggle: genFx("toggle"),
-	fadeIn: { opacity: "show" },
-	fadeOut: { opacity: "hide" },
-	fadeToggle: { opacity: "toggle" }
-}, function( name, props ) {
-	jQuery.fn[ name ] = function( speed, easing, callback ) {
-		return this.animate( props, speed, easing, callback );
-	};
-});
-
-jQuery.speed = function( speed, easing, fn ) {
-	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
-		complete: fn || !fn && easing ||
-			jQuery.isFunction( speed ) && speed,
-		duration: speed,
-		easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
-	};
-
-	opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
-		opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
-
-	// normalize opt.queue - true/undefined/null -> "fx"
-	if ( opt.queue == null || opt.queue === true ) {
-		opt.queue = "fx";
-	}
-
-	// Queueing
-	opt.old = opt.complete;
-
-	opt.complete = function() {
-		if ( jQuery.isFunction( opt.old ) ) {
-			opt.old.call( this );
-		}
-
-		if ( opt.queue ) {
-			jQuery.dequeue( this, opt.queue );
-		}
-	};
-
-	return opt;
-};
-
-jQuery.easing = {
-	linear: function( p ) {
-		return p;
-	},
-	swing: function( p ) {
-		return 0.5 - Math.cos( p*Math.PI ) / 2;
-	}
-};
-
-jQuery.timers = [];
-jQuery.fx = Tween.prototype.init;
-jQuery.fx.tick = function() {
-	var timer,
-		timers = jQuery.timers,
-		i = 0;
-
-	fxNow = jQuery.now();
-
-	for ( ; i < timers.length; i++ ) {
-		timer = timers[ i ];
-		// Checks the timer has not already been removed
-		if ( !timer() && timers[ i ] === timer ) {
-			timers.splice( i--, 1 );
-		}
-	}
-
-	if ( !timers.length ) {
-		jQuery.fx.stop();
-	}
-	fxNow = undefined;
-};
-
-jQuery.fx.timer = function( timer ) {
-	if ( timer() && jQuery.timers.push( timer ) ) {
-		jQuery.fx.start();
-	}
-};
-
-jQuery.fx.interval = 13;
-
-jQuery.fx.start = function() {
-	if ( !timerId ) {
-		timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
-	}
-};
-
-jQuery.fx.stop = function() {
-	clearInterval( timerId );
-	timerId = null;
-};
-
-jQuery.fx.speeds = {
-	slow: 600,
-	fast: 200,
-	// Default speed
-	_default: 400
-};
-
-// Back Compat <1.8 extension point
-jQuery.fx.step = {};
-
-if ( jQuery.expr && jQuery.expr.filters ) {
-	jQuery.expr.filters.animated = function( elem ) {
-		return jQuery.grep(jQuery.timers, function( fn ) {
-			return elem === fn.elem;
-		}).length;
-	};
-}
-jQuery.fn.offset = function( options ) {
-	if ( arguments.length ) {
-		return options === undefined ?
-			this :
-			this.each(function( i ) {
-				jQuery.offset.setOffset( this, options, i );
-			});
-	}
-
-	var docElem, win,
-		box = { top: 0, left: 0 },
-		elem = this[ 0 ],
-		doc = elem && elem.ownerDocument;
-
-	if ( !doc ) {
-		return;
-	}
-
-	docElem = doc.documentElement;
-
-	// Make sure it's not a disconnected DOM node
-	if ( !jQuery.contains( docElem, elem ) ) {
-		return box;
-	}
-
-	// If we don't have gBCR, just use 0,0 rather than error
-	// BlackBerry 5, iOS 3 (original iPhone)
-	if ( typeof elem.getBoundingClientRect !== core_strundefined ) {
-		box = elem.getBoundingClientRect();
-	}
-	win = getWindow( doc );
-	return {
-		top: box.top  + ( win.pageYOffset || docElem.scrollTop )  - ( docElem.clientTop  || 0 ),
-		left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )
-	};
-};
-
-jQuery.offset = {
-
-	setOffset: function( elem, options, i ) {
-		var position = jQuery.css( elem, "position" );
-
-		// set position first, in-case top/left are set even on static elem
-		if ( position === "static" ) {
-			elem.style.position = "relative";
-		}
-
-		var curElem = jQuery( elem ),
-			curOffset = curElem.offset(),
-			curCSSTop = jQuery.css( elem, "top" ),
-			curCSSLeft = jQuery.css( elem, "left" ),
-			calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
-			props = {}, curPosition = {}, curTop, curLeft;
-
-		// need to be able to calculate position if either top or left is auto and position is either absolute or fixed
-		if ( calculatePosition ) {
-			curPosition = curElem.position();
-			curTop = curPosition.top;
-			curLeft = curPosition.left;
-		} else {
-			curTop = parseFloat( curCSSTop ) || 0;
-			curLeft = parseFloat( curCSSLeft ) || 0;
-		}
-
-		if ( jQuery.isFunction( options ) ) {
-			options = options.call( elem, i, curOffset );
-		}
-
-		if ( options.top != null ) {
-			props.top = ( options.top - curOffset.top ) + curTop;
-		}
-		if ( options.left != null ) {
-			props.left = ( options.left - curOffset.left ) + curLeft;
-		}
-
-		if ( "using" in options ) {
-			options.using.call( elem, props );
-		} else {
-			curElem.css( props );
-		}
-	}
-};
-
-
-jQuery.fn.extend({
-
-	position: function() {
-		if ( !this[ 0 ] ) {
-			return;
-		}
-
-		var offsetParent, offset,
-			parentOffset = { top: 0, left: 0 },
-			elem = this[ 0 ];
-
-		// fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent
-		if ( jQuery.css( elem, "position" ) === "fixed" ) {
-			// we assume that getBoundingClientRect is available when computed position is fixed
-			offset = elem.getBoundingClientRect();
-		} else {
-			// Get *real* offsetParent
-			offsetParent = this.offsetParent();
-
-			// Get correct offsets
-			offset = this.offset();
-			if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
-				parentOffset = offsetParent.offset();
-			}
-
-			// Add offsetParent borders
-			parentOffset.top  += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
-			parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
-		}
-
-		// Subtract parent offsets and element margins
-		// note: when an element has margin: auto the offsetLeft and marginLeft
-		// are the same in Safari causing offset.left to incorrectly be 0
-		return {
-			top:  offset.top  - parentOffset.top - jQuery.css( elem, "marginTop", true ),
-			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true)
-		};
-	},
-
-	offsetParent: function() {
-		return this.map(function() {
-			var offsetParent = this.offsetParent || docElem;
-			while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position") === "static" ) ) {
-				offsetParent = offsetParent.offsetParent;
-			}
-			return offsetParent || docElem;
-		});
-	}
-});
-
-
-// Create scrollLeft and scrollTop methods
-jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
-	var top = /Y/.test( prop );
-
-	jQuery.fn[ method ] = function( val ) {
-		return jQuery.access( this, function( elem, method, val ) {
-			var win = getWindow( elem );
-
-			if ( val === undefined ) {
-				return win ? (prop in win) ? win[ prop ] :
-					win.document.documentElement[ method ] :
-					elem[ method ];
-			}
-
-			if ( win ) {
-				win.scrollTo(
-					!top ? val : jQuery( win ).scrollLeft(),
-					top ? val : jQuery( win ).scrollTop()
-				);
-
-			} else {
-				elem[ method ] = val;
-			}
-		}, method, val, arguments.length, null );
-	};
-});
-
-function getWindow( elem ) {
-	return jQuery.isWindow( elem ) ?
-		elem :
-		elem.nodeType === 9 ?
-			elem.defaultView || elem.parentWindow :
-			false;
-}
-// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
-jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
-	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
-		// margin is only for outerHeight, outerWidth
-		jQuery.fn[ funcName ] = function( margin, value ) {
-			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
-				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
-
-			return jQuery.access( this, function( elem, type, value ) {
-				var doc;
-
-				if ( jQuery.isWindow( elem ) ) {
-					// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
-					// isn't a whole lot we can do. See pull request at this URL for discussion:
-					// https://github.com/jquery/jquery/pull/764
-					return elem.document.documentElement[ "client" + name ];
-				}
-
-				// Get document width or height
-				if ( elem.nodeType === 9 ) {
-					doc = elem.documentElement;
-
-					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
-					// unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
-					return Math.max(
-						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
-						elem.body[ "offset" + name ], doc[ "offset" + name ],
-						doc[ "client" + name ]
-					);
-				}
-
-				return value === undefined ?
-					// Get width or height on the element, requesting but not forcing parseFloat
-					jQuery.css( elem, type, extra ) :
-
-					// Set width or height on the element
-					jQuery.style( elem, type, value, extra );
-			}, type, chainable ? margin : undefined, chainable, null );
-		};
-	});
-});
-// Limit scope pollution from any deprecated API
-// (function() {
-
-// The number of elements contained in the matched element set
-jQuery.fn.size = function() {
-	return this.length;
-};
-
-jQuery.fn.andSelf = jQuery.fn.addBack;
-
-// })();
-if ( typeof module === "object" && module && typeof module.exports === "object" ) {
-	// Expose jQuery as module.exports in loaders that implement the Node
-	// module pattern (including browserify). Do not create the global, since
-	// the user will be storing it themselves locally, and globals are frowned
-	// upon in the Node module world.
-	module.exports = jQuery;
-} else {
-	// Otherwise expose jQuery to the global object as usual
-	window.jQuery = window.$ = jQuery;
-
-	// Register as a named AMD module, since jQuery can be concatenated with other
-	// files that may use define, but not via a proper concatenation script that
-	// understands anonymous AMD modules. A named AMD is safest and most robust
-	// way to register. Lowercase jquery is used because AMD module names are
-	// derived from file names, and jQuery is normally delivered in a lowercase
-	// file name. Do this after creating the global so that if an AMD module wants
-	// to call noConflict to hide this version of jQuery, it will work.
-	if ( typeof define === "function" && define.amd ) {
-		define( "jquery", [], function () { return jQuery; } );
-	}
-}
-
-})( window );
diff --git a/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/images/ui-bg_diagonals-thick_90_eeeeee_40x40.png b/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/images/ui-bg_diagonals-thick_90_eeeeee_40x40.png
deleted file mode 100644
index e839a1d..0000000
--- a/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/images/ui-bg_diagonals-thick_90_eeeeee_40x40.png
+++ /dev/null
Binary files differ
diff --git a/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/images/ui-bg_glass_100_e4f1fb_1x400.png b/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/images/ui-bg_glass_100_e4f1fb_1x400.png
deleted file mode 100644
index 4ac3393..0000000
--- a/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/images/ui-bg_glass_100_e4f1fb_1x400.png
+++ /dev/null
Binary files differ
diff --git a/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/images/ui-bg_glass_50_3baae3_1x400.png b/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/images/ui-bg_glass_50_3baae3_1x400.png
deleted file mode 100644
index 9320245..0000000
--- a/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/images/ui-bg_glass_50_3baae3_1x400.png
+++ /dev/null
Binary files differ
diff --git a/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/images/ui-bg_glass_80_d7ebf9_1x400.png b/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/images/ui-bg_glass_80_d7ebf9_1x400.png
deleted file mode 100644
index ad35dda..0000000
--- a/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/images/ui-bg_glass_80_d7ebf9_1x400.png
+++ /dev/null
Binary files differ
diff --git a/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png b/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png
deleted file mode 100644
index 22d1d28..0000000
--- a/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png
+++ /dev/null
Binary files differ
diff --git a/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/images/ui-bg_highlight-hard_70_000000_1x100.png b/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/images/ui-bg_highlight-hard_70_000000_1x100.png
deleted file mode 100644
index 481b41c..0000000
--- a/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/images/ui-bg_highlight-hard_70_000000_1x100.png
+++ /dev/null
Binary files differ
diff --git a/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/images/ui-bg_highlight-soft_100_deedf7_1x100.png b/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/images/ui-bg_highlight-soft_100_deedf7_1x100.png
deleted file mode 100644
index 4073ca3..0000000
--- a/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/images/ui-bg_highlight-soft_100_deedf7_1x100.png
+++ /dev/null
Binary files differ
diff --git a/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/images/ui-bg_highlight-soft_25_ffef8f_1x100.png b/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/images/ui-bg_highlight-soft_25_ffef8f_1x100.png
deleted file mode 100644
index 4023140..0000000
--- a/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/images/ui-bg_highlight-soft_25_ffef8f_1x100.png
+++ /dev/null
Binary files differ
diff --git a/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/images/ui-icons_2694e8_256x240.png b/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/images/ui-icons_2694e8_256x240.png
deleted file mode 100644
index 2a3ae78..0000000
--- a/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/images/ui-icons_2694e8_256x240.png
+++ /dev/null
Binary files differ
diff --git a/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/images/ui-icons_2e83ff_256x240.png b/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/images/ui-icons_2e83ff_256x240.png
deleted file mode 100644
index f2bf838..0000000
--- a/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/images/ui-icons_2e83ff_256x240.png
+++ /dev/null
Binary files differ
diff --git a/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/images/ui-icons_3d80b3_256x240.png b/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/images/ui-icons_3d80b3_256x240.png
deleted file mode 100644
index ad8c68a..0000000
--- a/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/images/ui-icons_3d80b3_256x240.png
+++ /dev/null
Binary files differ
diff --git a/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/images/ui-icons_72a7cf_256x240.png b/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/images/ui-icons_72a7cf_256x240.png
deleted file mode 100644
index 508f22a..0000000
--- a/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/images/ui-icons_72a7cf_256x240.png
+++ /dev/null
Binary files differ
diff --git a/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/images/ui-icons_ffffff_256x240.png b/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/images/ui-icons_ffffff_256x240.png
deleted file mode 100644
index 4d66f59..0000000
--- a/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/images/ui-icons_ffffff_256x240.png
+++ /dev/null
Binary files differ
diff --git a/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/jquery-ui.min.css b/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/jquery-ui.min.css
deleted file mode 100644
index ab93646..0000000
--- a/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/jquery-ui.min.css
+++ /dev/null
@@ -1,7 +0,0 @@
-/*! jQuery UI - v1.11.4 - 2016-03-01
-* http://jqueryui.com
-* Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, menu.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css
-* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Lucida%20Grande%2CLucida%20Sans%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=deedf7&bgTextureHeader=highlight_soft&bgImgOpacityHeader=100&borderColorHeader=aed0ea&fcHeader=222222&iconColorHeader=72a7cf&bgColorContent=f2f5f7&bgTextureContent=highlight_hard&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=362b36&iconColorContent=72a7cf&bgColorDefault=d7ebf9&bgTextureDefault=glass&bgImgOpacityDefault=80&borderColorDefault=aed0ea&fcDefault=2779aa&iconColorDefault=3d80b3&bgColorHover=e4f1fb&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=74b2e2&fcHover=0070a3&iconColorHover=2694e8&bgColorActive=3baae3&bgTextureActive=glass&bgImgOpacityActive=50&borderColorActive=2694e8&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=ffef8f&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=25&borderColorHighlight=f9dd34&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=cd0a0a&bgTextureError=flat&bgImgOpacityError=15&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffffff&bgColorOverlay=eeeeee&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=90&opacityOverlay=80&bgColorShadow=000000&bgTextureShadow=highlight_hard&bgImgOpacityShadow=70&opacityShadow=30&thicknessShadow=7px&offsetTopShadow=-7px&offsetLeftShadow=-7px&cornerRadiusShadow=8px
-* Copyright jQuery Foundation and other contributors; Licensed MIT */
-
-.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;min-height:0;font-size:100%}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{overflow:hidden;position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:none}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{position:relative;margin:0;padding:3px 1em 3px .4em;cursor:pointer;min-height:0;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-button{display:inline-block;overflow:hidden;position:relative;text-decoration:none;cursor:pointer}.ui-selectmenu-button span.ui-icon{right:0.5em;left:auto;margin-top:-8px;position:absolute;top:50%}.ui-selectmenu-button span.ui-selectmenu-text{text-align:left;padding:0.4em 2.1em 0.4em 1em;display:block;line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Lucida Grande,Lucida Sans,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Lucida Grande,Lucida Sans,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #ddd;background:#f2f5f7 url("images/ui-bg_highlight-hard_100_f2f5f7_1x100.png") 50% top repeat-x;color:#362b36}.ui-widget-content a{color:#362b36}.ui-widget-header{border:1px solid #aed0ea;background:#deedf7 url("images/ui-bg_highlight-soft_100_deedf7_1x100.png") 50% 50% repeat-x;color:#222;font-weight:bold}.ui-widget-header a{color:#222}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #aed0ea;background:#d7ebf9 url("images/ui-bg_glass_80_d7ebf9_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#2779aa}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#2779aa;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #74b2e2;background:#e4f1fb url("images/ui-bg_glass_100_e4f1fb_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#0070a3}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#0070a3;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #2694e8;background:#3baae3 url("images/ui-bg_glass_50_3baae3_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #f9dd34;background:#ffef8f url("images/ui-bg_highlight-soft_25_ffef8f_1x100.png") 50% top repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#cd0a0a;color:#fff}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#fff}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#fff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_72a7cf_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_72a7cf_256x240.png")}.ui-state-default .ui-icon{background-image:url("images/ui-icons_3d80b3_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url("images/ui-icons_2694e8_256x240.png")}.ui-state-active .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-highlight .ui-icon{background-image:url("images/ui-icons_2e83ff_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:6px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:6px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:6px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:6px}.ui-widget-overlay{background:#eee url("images/ui-bg_diagonals-thick_90_eeeeee_40x40.png") 50% 50% repeat;opacity:.8;filter:Alpha(Opacity=80)}.ui-widget-shadow{margin:-7px 0 0 -7px;padding:7px;background:#000 url("images/ui-bg_highlight-hard_70_000000_1x100.png") 50% top repeat-x;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px}
\ No newline at end of file
diff --git a/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/jquery-ui.min.js b/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/jquery-ui.min.js
deleted file mode 100644
index a88046f..0000000
--- a/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/jquery-ui.min.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/*! jQuery UI - v1.11.4 - 2016-02-28
-* http://jqueryui.com
-* Includes: core.js, widget.js, mouse.js, position.js, draggable.js, droppable.js, resizable.js, selectable.js, sortable.js, accordion.js, autocomplete.js, button.js, datepicker.js, dialog.js, menu.js, progressbar.js, selectmenu.js, slider.js, spinner.js, tabs.js, tooltip.js, effect.js, effect-blind.js, effect-bounce.js, effect-clip.js, effect-drop.js, effect-explode.js, effect-fade.js, effect-fold.js, effect-highlight.js, effect-puff.js, effect-pulsate.js, effect-scale.js, effect-shake.js, effect-size.js, effect-slide.js, effect-transfer.js
-* Copyright jQuery Foundation and other contributors; Licensed MIT */
-
-(function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e(jQuery)})(function(e){function t(t,s){var n,a,o,r=t.nodeName.toLowerCase();return"area"===r?(n=t.parentNode,a=n.name,t.href&&a&&"map"===n.nodeName.toLowerCase()?(o=e("img[usemap='#"+a+"']")[0],!!o&&i(o)):!1):(/^(input|select|textarea|button|object)$/.test(r)?!t.disabled:"a"===r?t.href||s:s)&&i(t)}function i(t){return e.expr.filters.visible(t)&&!e(t).parents().addBack().filter(function(){return"hidden"===e.css(this,"visibility")}).length}function s(e){for(var t,i;e.length&&e[0]!==document;){if(t=e.css("position"),("absolute"===t||"relative"===t||"fixed"===t)&&(i=parseInt(e.css("zIndex"),10),!isNaN(i)&&0!==i))return i;e=e.parent()}return 0}function n(){this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-datepicker-div",this._inlineClass="ui-datepicker-inline",this._appendClass="ui-datepicker-append",this._triggerClass="ui-datepicker-trigger",this._dialogClass="ui-datepicker-dialog",this._disableClass="ui-datepicker-disabled",this._unselectableClass="ui-datepicker-unselectable",this._currentClass="ui-datepicker-current-day",this._dayOverClass="ui-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},e.extend(this._defaults,this.regional[""]),this.regional.en=e.extend(!0,{},this.regional[""]),this.regional["en-US"]=e.extend(!0,{},this.regional.en),this.dpDiv=a(e("<div id='"+this._mainDivId+"' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"))}function a(t){var i="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return t.delegate(i,"mouseout",function(){e(this).removeClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&e(this).removeClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&e(this).removeClass("ui-datepicker-next-hover")}).delegate(i,"mouseover",o)}function o(){e.datepicker._isDisabledDatepicker(v.inline?v.dpDiv.parent()[0]:v.input[0])||(e(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),e(this).addClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&e(this).addClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&e(this).addClass("ui-datepicker-next-hover"))}function r(t,i){e.extend(t,i);for(var s in i)null==i[s]&&(t[s]=i[s]);return t}function h(e){return function(){var t=this.element.val();e.apply(this,arguments),this._refresh(),t!==this.element.val()&&this._trigger("change")}}e.ui=e.ui||{},e.extend(e.ui,{version:"1.11.4",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({scrollParent:function(t){var i=this.css("position"),s="absolute"===i,n=t?/(auto|scroll|hidden)/:/(auto|scroll)/,a=this.parents().filter(function(){var t=e(this);return s&&"static"===t.css("position")?!1:n.test(t.css("overflow")+t.css("overflow-y")+t.css("overflow-x"))}).eq(0);return"fixed"!==i&&a.length?a:e(this[0].ownerDocument||document)},uniqueId:function(){var e=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++e)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&e(this).removeAttr("id")})}}),e.extend(e.expr[":"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(i){return!!e.data(i,t)}}):function(t,i,s){return!!e.data(t,s[3])},focusable:function(i){return t(i,!isNaN(e.attr(i,"tabindex")))},tabbable:function(i){var s=e.attr(i,"tabindex"),n=isNaN(s);return(n||s>=0)&&t(i,!n)}}),e("<a>").outerWidth(1).jquery||e.each(["Width","Height"],function(t,i){function s(t,i,s,a){return e.each(n,function(){i-=parseFloat(e.css(t,"padding"+this))||0,s&&(i-=parseFloat(e.css(t,"border"+this+"Width"))||0),a&&(i-=parseFloat(e.css(t,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],a=i.toLowerCase(),o={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn["inner"+i]=function(t){return void 0===t?o["inner"+i].call(this):this.each(function(){e(this).css(a,s(this,t)+"px")})},e.fn["outer"+i]=function(t,n){return"number"!=typeof t?o["outer"+i].call(this,t):this.each(function(){e(this).css(a,s(this,t,!0,n)+"px")})}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e("<a>").data("a-b","a").removeData("a-b").data("a-b")&&(e.fn.removeData=function(t){return function(i){return arguments.length?t.call(this,e.camelCase(i)):t.call(this)}}(e.fn.removeData)),e.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),e.fn.extend({focus:function(t){return function(i,s){return"number"==typeof i?this.each(function(){var t=this;setTimeout(function(){e(t).focus(),s&&s.call(t)},i)}):t.apply(this,arguments)}}(e.fn.focus),disableSelection:function(){var e="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.bind(e+".ui-disableSelection",function(e){e.preventDefault()})}}(),enableSelection:function(){return this.unbind(".ui-disableSelection")},zIndex:function(t){if(void 0!==t)return this.css("zIndex",t);if(this.length)for(var i,s,n=e(this[0]);n.length&&n[0]!==document;){if(i=n.css("position"),("absolute"===i||"relative"===i||"fixed"===i)&&(s=parseInt(n.css("zIndex"),10),!isNaN(s)&&0!==s))return s;n=n.parent()}return 0}}),e.ui.plugin={add:function(t,i,s){var n,a=e.ui[t].prototype;for(n in s)a.plugins[n]=a.plugins[n]||[],a.plugins[n].push([i,s[n]])},call:function(e,t,i,s){var n,a=e.plugins[t];if(a&&(s||e.element[0].parentNode&&11!==e.element[0].parentNode.nodeType))for(n=0;a.length>n;n++)e.options[a[n][0]]&&a[n][1].apply(e.element,i)}};var l=0,u=Array.prototype.slice;e.cleanData=function(t){return function(i){var s,n,a;for(a=0;null!=(n=i[a]);a++)try{s=e._data(n,"events"),s&&s.remove&&e(n).triggerHandler("remove")}catch(o){}t(i)}}(e.cleanData),e.widget=function(t,i,s){var n,a,o,r,h={},l=t.split(".")[0];return t=t.split(".")[1],n=l+"-"+t,s||(s=i,i=e.Widget),e.expr[":"][n.toLowerCase()]=function(t){return!!e.data(t,n)},e[l]=e[l]||{},a=e[l][t],o=e[l][t]=function(e,t){return this._createWidget?(arguments.length&&this._createWidget(e,t),void 0):new o(e,t)},e.extend(o,a,{version:s.version,_proto:e.extend({},s),_childConstructors:[]}),r=new i,r.options=e.widget.extend({},r.options),e.each(s,function(t,s){return e.isFunction(s)?(h[t]=function(){var e=function(){return i.prototype[t].apply(this,arguments)},n=function(e){return i.prototype[t].apply(this,e)};return function(){var t,i=this._super,a=this._superApply;return this._super=e,this._superApply=n,t=s.apply(this,arguments),this._super=i,this._superApply=a,t}}(),void 0):(h[t]=s,void 0)}),o.prototype=e.widget.extend(r,{widgetEventPrefix:a?r.widgetEventPrefix||t:t},h,{constructor:o,namespace:l,widgetName:t,widgetFullName:n}),a?(e.each(a._childConstructors,function(t,i){var s=i.prototype;e.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete a._childConstructors):i._childConstructors.push(o),e.widget.bridge(t,o),o},e.widget.extend=function(t){for(var i,s,n=u.call(arguments,1),a=0,o=n.length;o>a;a++)for(i in n[a])s=n[a][i],n[a].hasOwnProperty(i)&&void 0!==s&&(t[i]=e.isPlainObject(s)?e.isPlainObject(t[i])?e.widget.extend({},t[i],s):e.widget.extend({},s):s);return t},e.widget.bridge=function(t,i){var s=i.prototype.widgetFullName||t;e.fn[t]=function(n){var a="string"==typeof n,o=u.call(arguments,1),r=this;return a?this.each(function(){var i,a=e.data(this,s);return"instance"===n?(r=a,!1):a?e.isFunction(a[n])&&"_"!==n.charAt(0)?(i=a[n].apply(a,o),i!==a&&void 0!==i?(r=i&&i.jquery?r.pushStack(i.get()):i,!1):void 0):e.error("no such method '"+n+"' for "+t+" widget instance"):e.error("cannot call methods on "+t+" prior to initialization; "+"attempted to call method '"+n+"'")}):(o.length&&(n=e.widget.extend.apply(null,[n].concat(o))),this.each(function(){var t=e.data(this,s);t?(t.option(n||{}),t._init&&t._init()):e.data(this,s,new i(n,this))})),r}},e.Widget=function(){},e.Widget._childConstructors=[],e.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{disabled:!1,create:null},_createWidget:function(t,i){i=e(i||this.defaultElement||this)[0],this.element=e(i),this.uuid=l++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=e(),this.hoverable=e(),this.focusable=e(),i!==this&&(e.data(i,this.widgetFullName,this),this._on(!0,this.element,{remove:function(e){e.target===i&&this.destroy()}}),this.document=e(i.style?i.ownerDocument:i.document||i),this.window=e(this.document[0].defaultView||this.document[0].parentWindow)),this.options=e.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:e.noop,_getCreateEventData:e.noop,_create:e.noop,_init:e.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetFullName).removeData(e.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:e.noop,widget:function(){return this.element},option:function(t,i){var s,n,a,o=t;if(0===arguments.length)return e.widget.extend({},this.options);if("string"==typeof t)if(o={},s=t.split("."),t=s.shift(),s.length){for(n=o[t]=e.widget.extend({},this.options[t]),a=0;s.length-1>a;a++)n[s[a]]=n[s[a]]||{},n=n[s[a]];if(t=s.pop(),1===arguments.length)return void 0===n[t]?null:n[t];n[t]=i}else{if(1===arguments.length)return void 0===this.options[t]?null:this.options[t];o[t]=i}return this._setOptions(o),this},_setOptions:function(e){var t;for(t in e)this._setOption(t,e[t]);return this},_setOption:function(e,t){return this.options[e]=t,"disabled"===e&&(this.widget().toggleClass(this.widgetFullName+"-disabled",!!t),t&&(this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus"))),this},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_on:function(t,i,s){var n,a=this;"boolean"!=typeof t&&(s=i,i=t,t=!1),s?(i=n=e(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),e.each(s,function(s,o){function r(){return t||a.options.disabled!==!0&&!e(this).hasClass("ui-state-disabled")?("string"==typeof o?a[o]:o).apply(a,arguments):void 0}"string"!=typeof o&&(r.guid=o.guid=o.guid||r.guid||e.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+a.eventNamespace,u=h[2];u?n.delegate(u,l,r):i.bind(l,r)})},_off:function(t,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,t.unbind(i).undelegate(i),this.bindings=e(this.bindings.not(t).get()),this.focusable=e(this.focusable.not(t).get()),this.hoverable=e(this.hoverable.not(t).get())},_delay:function(e,t){function i(){return("string"==typeof e?s[e]:e).apply(s,arguments)}var s=this;return setTimeout(i,t||0)},_hoverable:function(t){this.hoverable=this.hoverable.add(t),this._on(t,{mouseenter:function(t){e(t.currentTarget).addClass("ui-state-hover")},mouseleave:function(t){e(t.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(t){this.focusable=this.focusable.add(t),this._on(t,{focusin:function(t){e(t.currentTarget).addClass("ui-state-focus")},focusout:function(t){e(t.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(t,i,s){var n,a,o=this.options[t];if(s=s||{},i=e.Event(i),i.type=(t===this.widgetEventPrefix?t:this.widgetEventPrefix+t).toLowerCase(),i.target=this.element[0],a=i.originalEvent)for(n in a)n in i||(i[n]=a[n]);return this.element.trigger(i,s),!(e.isFunction(o)&&o.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},e.each({show:"fadeIn",hide:"fadeOut"},function(t,i){e.Widget.prototype["_"+t]=function(s,n,a){"string"==typeof n&&(n={effect:n});var o,r=n?n===!0||"number"==typeof n?i:n.effect||i:t;n=n||{},"number"==typeof n&&(n={duration:n}),o=!e.isEmptyObject(n),n.complete=a,n.delay&&s.delay(n.delay),o&&e.effects&&e.effects.effect[r]?s[t](n):r!==t&&s[r]?s[r](n.duration,n.easing,a):s.queue(function(i){e(this)[t](),a&&a.call(s[0]),i()})}}),e.widget;var d=!1;e(document).mouseup(function(){d=!1}),e.widget("ui.mouse",{version:"1.11.4",options:{cancel:"input,textarea,button,select,option",distance:1,delay:0},_mouseInit:function(){var t=this;this.element.bind("mousedown."+this.widgetName,function(e){return t._mouseDown(e)}).bind("click."+this.widgetName,function(i){return!0===e.data(i.target,t.widgetName+".preventClickEvent")?(e.removeData(i.target,t.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName),this._mouseMoveDelegate&&this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(t){if(!d){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(t),this._mouseDownEvent=t;var i=this,s=1===t.which,n="string"==typeof this.options.cancel&&t.target.nodeName?e(t.target).closest(this.options.cancel).length:!1;return s&&!n&&this._mouseCapture(t)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(t)!==!1,!this._mouseStarted)?(t.preventDefault(),!0):(!0===e.data(t.target,this.widgetName+".preventClickEvent")&&e.removeData(t.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(e){return i._mouseMove(e)},this._mouseUpDelegate=function(e){return i._mouseUp(e)},this.document.bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),t.preventDefault(),d=!0,!0)):!0}},_mouseMove:function(t){if(this._mouseMoved){if(e.ui.ie&&(!document.documentMode||9>document.documentMode)&&!t.button)return this._mouseUp(t);if(!t.which)return this._mouseUp(t)}return(t.which||t.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,t)!==!1,this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted)},_mouseUp:function(t){return this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&e.data(t.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(t)),d=!1,!1},_mouseDistanceMet:function(e){return Math.max(Math.abs(this._mouseDownEvent.pageX-e.pageX),Math.abs(this._mouseDownEvent.pageY-e.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),function(){function t(e,t,i){return[parseFloat(e[0])*(p.test(e[0])?t/100:1),parseFloat(e[1])*(p.test(e[1])?i/100:1)]}function i(t,i){return parseInt(e.css(t,i),10)||0}function s(t){var i=t[0];return 9===i.nodeType?{width:t.width(),height:t.height(),offset:{top:0,left:0}}:e.isWindow(i)?{width:t.width(),height:t.height(),offset:{top:t.scrollTop(),left:t.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:t.outerWidth(),height:t.outerHeight(),offset:t.offset()}}e.ui=e.ui||{};var n,a,o=Math.max,r=Math.abs,h=Math.round,l=/left|center|right/,u=/top|center|bottom/,d=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,p=/%$/,f=e.fn.position;e.position={scrollbarWidth:function(){if(void 0!==n)return n;var t,i,s=e("<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),a=s.children()[0];return e("body").append(s),t=a.offsetWidth,s.css("overflow","scroll"),i=a.offsetWidth,t===i&&(i=s[0].clientWidth),s.remove(),n=t-i},getScrollInfo:function(t){var i=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),s=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),n="scroll"===i||"auto"===i&&t.width<t.element[0].scrollWidth,a="scroll"===s||"auto"===s&&t.height<t.element[0].scrollHeight;return{width:a?e.position.scrollbarWidth():0,height:n?e.position.scrollbarWidth():0}},getWithinInfo:function(t){var i=e(t||window),s=e.isWindow(i[0]),n=!!i[0]&&9===i[0].nodeType;return{element:i,isWindow:s,isDocument:n,offset:i.offset()||{left:0,top:0},scrollLeft:i.scrollLeft(),scrollTop:i.scrollTop(),width:s||n?i.width():i.outerWidth(),height:s||n?i.height():i.outerHeight()}}},e.fn.position=function(n){if(!n||!n.of)return f.apply(this,arguments);n=e.extend({},n);var p,m,g,v,y,b,_=e(n.of),x=e.position.getWithinInfo(n.within),w=e.position.getScrollInfo(x),k=(n.collision||"flip").split(" "),T={};return b=s(_),_[0].preventDefault&&(n.at="left top"),m=b.width,g=b.height,v=b.offset,y=e.extend({},v),e.each(["my","at"],function(){var e,t,i=(n[this]||"").split(" ");1===i.length&&(i=l.test(i[0])?i.concat(["center"]):u.test(i[0])?["center"].concat(i):["center","center"]),i[0]=l.test(i[0])?i[0]:"center",i[1]=u.test(i[1])?i[1]:"center",e=d.exec(i[0]),t=d.exec(i[1]),T[this]=[e?e[0]:0,t?t[0]:0],n[this]=[c.exec(i[0])[0],c.exec(i[1])[0]]}),1===k.length&&(k[1]=k[0]),"right"===n.at[0]?y.left+=m:"center"===n.at[0]&&(y.left+=m/2),"bottom"===n.at[1]?y.top+=g:"center"===n.at[1]&&(y.top+=g/2),p=t(T.at,m,g),y.left+=p[0],y.top+=p[1],this.each(function(){var s,l,u=e(this),d=u.outerWidth(),c=u.outerHeight(),f=i(this,"marginLeft"),b=i(this,"marginTop"),D=d+f+i(this,"marginRight")+w.width,S=c+b+i(this,"marginBottom")+w.height,M=e.extend({},y),C=t(T.my,u.outerWidth(),u.outerHeight());"right"===n.my[0]?M.left-=d:"center"===n.my[0]&&(M.left-=d/2),"bottom"===n.my[1]?M.top-=c:"center"===n.my[1]&&(M.top-=c/2),M.left+=C[0],M.top+=C[1],a||(M.left=h(M.left),M.top=h(M.top)),s={marginLeft:f,marginTop:b},e.each(["left","top"],function(t,i){e.ui.position[k[t]]&&e.ui.position[k[t]][i](M,{targetWidth:m,targetHeight:g,elemWidth:d,elemHeight:c,collisionPosition:s,collisionWidth:D,collisionHeight:S,offset:[p[0]+C[0],p[1]+C[1]],my:n.my,at:n.at,within:x,elem:u})}),n.using&&(l=function(e){var t=v.left-M.left,i=t+m-d,s=v.top-M.top,a=s+g-c,h={target:{element:_,left:v.left,top:v.top,width:m,height:g},element:{element:u,left:M.left,top:M.top,width:d,height:c},horizontal:0>i?"left":t>0?"right":"center",vertical:0>a?"top":s>0?"bottom":"middle"};d>m&&m>r(t+i)&&(h.horizontal="center"),c>g&&g>r(s+a)&&(h.vertical="middle"),h.important=o(r(t),r(i))>o(r(s),r(a))?"horizontal":"vertical",n.using.call(this,e,h)}),u.offset(e.extend(M,{using:l}))})},e.ui.position={fit:{left:function(e,t){var i,s=t.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=e.left-t.collisionPosition.marginLeft,h=n-r,l=r+t.collisionWidth-a-n;t.collisionWidth>a?h>0&&0>=l?(i=e.left+h+t.collisionWidth-a-n,e.left+=h-i):e.left=l>0&&0>=h?n:h>l?n+a-t.collisionWidth:n:h>0?e.left+=h:l>0?e.left-=l:e.left=o(e.left-r,e.left)},top:function(e,t){var i,s=t.within,n=s.isWindow?s.scrollTop:s.offset.top,a=t.within.height,r=e.top-t.collisionPosition.marginTop,h=n-r,l=r+t.collisionHeight-a-n;t.collisionHeight>a?h>0&&0>=l?(i=e.top+h+t.collisionHeight-a-n,e.top+=h-i):e.top=l>0&&0>=h?n:h>l?n+a-t.collisionHeight:n:h>0?e.top+=h:l>0?e.top-=l:e.top=o(e.top-r,e.top)}},flip:{left:function(e,t){var i,s,n=t.within,a=n.offset.left+n.scrollLeft,o=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=e.left-t.collisionPosition.marginLeft,u=l-h,d=l+t.collisionWidth-o-h,c="left"===t.my[0]?-t.elemWidth:"right"===t.my[0]?t.elemWidth:0,p="left"===t.at[0]?t.targetWidth:"right"===t.at[0]?-t.targetWidth:0,f=-2*t.offset[0];0>u?(i=e.left+c+p+f+t.collisionWidth-o-a,(0>i||r(u)>i)&&(e.left+=c+p+f)):d>0&&(s=e.left-t.collisionPosition.marginLeft+c+p+f-h,(s>0||d>r(s))&&(e.left+=c+p+f))},top:function(e,t){var i,s,n=t.within,a=n.offset.top+n.scrollTop,o=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=e.top-t.collisionPosition.marginTop,u=l-h,d=l+t.collisionHeight-o-h,c="top"===t.my[1],p=c?-t.elemHeight:"bottom"===t.my[1]?t.elemHeight:0,f="top"===t.at[1]?t.targetHeight:"bottom"===t.at[1]?-t.targetHeight:0,m=-2*t.offset[1];0>u?(s=e.top+p+f+m+t.collisionHeight-o-a,(0>s||r(u)>s)&&(e.top+=p+f+m)):d>0&&(i=e.top-t.collisionPosition.marginTop+p+f+m-h,(i>0||d>r(i))&&(e.top+=p+f+m))}},flipfit:{left:function(){e.ui.position.flip.left.apply(this,arguments),e.ui.position.fit.left.apply(this,arguments)},top:function(){e.ui.position.flip.top.apply(this,arguments),e.ui.position.fit.top.apply(this,arguments)}}},function(){var t,i,s,n,o,r=document.getElementsByTagName("body")[0],h=document.createElement("div");t=document.createElement(r?"div":"body"),s={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},r&&e.extend(s,{position:"absolute",left:"-1000px",top:"-1000px"});for(o in s)t.style[o]=s[o];t.appendChild(h),i=r||document.documentElement,i.insertBefore(t,i.firstChild),h.style.cssText="position: absolute; left: 10.7432222px;",n=e(h).offset().left,a=n>10&&11>n,t.innerHTML="",i.removeChild(t)}()}(),e.ui.position,e.widget("ui.draggable",e.ui.mouse,{version:"1.11.4",widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1,drag:null,start:null,stop:null},_create:function(){"original"===this.options.helper&&this._setPositionRelative(),this.options.addClasses&&this.element.addClass("ui-draggable"),this.options.disabled&&this.element.addClass("ui-draggable-disabled"),this._setHandleClassName(),this._mouseInit()},_setOption:function(e,t){this._super(e,t),"handle"===e&&(this._removeHandleClassName(),this._setHandleClassName())},_destroy:function(){return(this.helper||this.element).is(".ui-draggable-dragging")?(this.destroyOnClear=!0,void 0):(this.element.removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled"),this._removeHandleClassName(),this._mouseDestroy(),void 0)},_mouseCapture:function(t){var i=this.options;return this._blurActiveElement(t),this.helper||i.disabled||e(t.target).closest(".ui-resizable-handle").length>0?!1:(this.handle=this._getHandle(t),this.handle?(this._blockFrames(i.iframeFix===!0?"iframe":i.iframeFix),!0):!1)},_blockFrames:function(t){this.iframeBlocks=this.document.find(t).map(function(){var t=e(this);return e("<div>").css("position","absolute").appendTo(t.parent()).outerWidth(t.outerWidth()).outerHeight(t.outerHeight()).offset(t.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_blurActiveElement:function(t){var i=this.document[0];if(this.handleElement.is(t.target))try{i.activeElement&&"body"!==i.activeElement.nodeName.toLowerCase()&&e(i.activeElement).blur()}catch(s){}},_mouseStart:function(t){var i=this.options;return this.helper=this._createHelper(t),this.helper.addClass("ui-draggable-dragging"),this._cacheHelperProportions(),e.ui.ddmanager&&(e.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(!0),this.offsetParent=this.helper.offsetParent(),this.hasFixedAncestor=this.helper.parents().filter(function(){return"fixed"===e(this).css("position")}).length>0,this.positionAbs=this.element.offset(),this._refreshOffsets(t),this.originalPosition=this.position=this._generatePosition(t,!1),this.originalPageX=t.pageX,this.originalPageY=t.pageY,i.cursorAt&&this._adjustOffsetFromHelper(i.cursorAt),this._setContainment(),this._trigger("start",t)===!1?(this._clear(),!1):(this._cacheHelperProportions(),e.ui.ddmanager&&!i.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this._normalizeRightBottom(),this._mouseDrag(t,!0),e.ui.ddmanager&&e.ui.ddmanager.dragStart(this,t),!0)},_refreshOffsets:function(e){this.offset={top:this.positionAbs.top-this.margins.top,left:this.positionAbs.left-this.margins.left,scroll:!1,parent:this._getParentOffset(),relative:this._getRelativeOffset()},this.offset.click={left:e.pageX-this.offset.left,top:e.pageY-this.offset.top}},_mouseDrag:function(t,i){if(this.hasFixedAncestor&&(this.offset.parent=this._getParentOffset()),this.position=this._generatePosition(t,!0),this.positionAbs=this._convertPositionTo("absolute"),!i){var s=this._uiHash();if(this._trigger("drag",t,s)===!1)return this._mouseUp({}),!1;this.position=s.position}return this.helper[0].style.left=this.position.left+"px",this.helper[0].style.top=this.position.top+"px",e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),!1},_mouseStop:function(t){var i=this,s=!1;return e.ui.ddmanager&&!this.options.dropBehaviour&&(s=e.ui.ddmanager.drop(this,t)),this.dropped&&(s=this.dropped,this.dropped=!1),"invalid"===this.options.revert&&!s||"valid"===this.options.revert&&s||this.options.revert===!0||e.isFunction(this.options.revert)&&this.options.revert.call(this.element,s)?e(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){i._trigger("stop",t)!==!1&&i._clear()}):this._trigger("stop",t)!==!1&&this._clear(),!1},_mouseUp:function(t){return this._unblockFrames(),e.ui.ddmanager&&e.ui.ddmanager.dragStop(this,t),this.handleElement.is(t.target)&&this.element.focus(),e.ui.mouse.prototype._mouseUp.call(this,t)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear(),this},_getHandle:function(t){return this.options.handle?!!e(t.target).closest(this.element.find(this.options.handle)).length:!0},_setHandleClassName:function(){this.handleElement=this.options.handle?this.element.find(this.options.handle):this.element,this.handleElement.addClass("ui-draggable-handle")},_removeHandleClassName:function(){this.handleElement.removeClass("ui-draggable-handle")},_createHelper:function(t){var i=this.options,s=e.isFunction(i.helper),n=s?e(i.helper.apply(this.element[0],[t])):"clone"===i.helper?this.element.clone().removeAttr("id"):this.element;return n.parents("body").length||n.appendTo("parent"===i.appendTo?this.element[0].parentNode:i.appendTo),s&&n[0]===this.element[0]&&this._setPositionRelative(),n[0]===this.element[0]||/(fixed|absolute)/.test(n.css("position"))||n.css("position","absolute"),n},_setPositionRelative:function(){/^(?:r|a|f)/.test(this.element.css("position"))||(this.element[0].style.position="relative")},_adjustOffsetFromHelper:function(t){"string"==typeof t&&(t=t.split(" ")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_isRootNode:function(e){return/(html|body)/i.test(e.tagName)||e===this.document[0]},_getParentOffset:function(){var t=this.offsetParent.offset(),i=this.document[0];return"absolute"===this.cssPosition&&this.scrollParent[0]!==i&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop()),this._isRootNode(this.offsetParent[0])&&(t={top:0,left:0}),{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"!==this.cssPosition)return{top:0,left:0};var e=this.element.position(),t=this._isRootNode(this.scrollParent[0]);return{top:e.top-(parseInt(this.helper.css("top"),10)||0)+(t?0:this.scrollParent.scrollTop()),left:e.left-(parseInt(this.helper.css("left"),10)||0)+(t?0:this.scrollParent.scrollLeft())}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t,i,s,n=this.options,a=this.document[0];return this.relativeContainer=null,n.containment?"window"===n.containment?(this.containment=[e(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,e(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,e(window).scrollLeft()+e(window).width()-this.helperProportions.width-this.margins.left,e(window).scrollTop()+(e(window).height()||a.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):"document"===n.containment?(this.containment=[0,0,e(a).width()-this.helperProportions.width-this.margins.left,(e(a).height()||a.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):n.containment.constructor===Array?(this.containment=n.containment,void 0):("parent"===n.containment&&(n.containment=this.helper[0].parentNode),i=e(n.containment),s=i[0],s&&(t=/(scroll|auto)/.test(i.css("overflow")),this.containment=[(parseInt(i.css("borderLeftWidth"),10)||0)+(parseInt(i.css("paddingLeft"),10)||0),(parseInt(i.css("borderTopWidth"),10)||0)+(parseInt(i.css("paddingTop"),10)||0),(t?Math.max(s.scrollWidth,s.offsetWidth):s.offsetWidth)-(parseInt(i.css("borderRightWidth"),10)||0)-(parseInt(i.css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(t?Math.max(s.scrollHeight,s.offsetHeight):s.offsetHeight)-(parseInt(i.css("borderBottomWidth"),10)||0)-(parseInt(i.css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relativeContainer=i),void 0):(this.containment=null,void 0)},_convertPositionTo:function(e,t){t||(t=this.position);var i="absolute"===e?1:-1,s=this._isRootNode(this.scrollParent[0]);return{top:t.top+this.offset.relative.top*i+this.offset.parent.top*i-("fixed"===this.cssPosition?-this.offset.scroll.top:s?0:this.offset.scroll.top)*i,left:t.left+this.offset.relative.left*i+this.offset.parent.left*i-("fixed"===this.cssPosition?-this.offset.scroll.left:s?0:this.offset.scroll.left)*i}},_generatePosition:function(e,t){var i,s,n,a,o=this.options,r=this._isRootNode(this.scrollParent[0]),h=e.pageX,l=e.pageY;return r&&this.offset.scroll||(this.offset.scroll={top:this.scrollParent.scrollTop(),left:this.scrollParent.scrollLeft()}),t&&(this.containment&&(this.relativeContainer?(s=this.relativeContainer.offset(),i=[this.containment[0]+s.left,this.containment[1]+s.top,this.containment[2]+s.left,this.containment[3]+s.top]):i=this.containment,e.pageX-this.offset.click.left<i[0]&&(h=i[0]+this.offset.click.left),e.pageY-this.offset.click.top<i[1]&&(l=i[1]+this.offset.click.top),e.pageX-this.offset.click.left>i[2]&&(h=i[2]+this.offset.click.left),e.pageY-this.offset.click.top>i[3]&&(l=i[3]+this.offset.click.top)),o.grid&&(n=o.grid[1]?this.originalPageY+Math.round((l-this.originalPageY)/o.grid[1])*o.grid[1]:this.originalPageY,l=i?n-this.offset.click.top>=i[1]||n-this.offset.click.top>i[3]?n:n-this.offset.click.top>=i[1]?n-o.grid[1]:n+o.grid[1]:n,a=o.grid[0]?this.originalPageX+Math.round((h-this.originalPageX)/o.grid[0])*o.grid[0]:this.originalPageX,h=i?a-this.offset.click.left>=i[0]||a-this.offset.click.left>i[2]?a:a-this.offset.click.left>=i[0]?a-o.grid[0]:a+o.grid[0]:a),"y"===o.axis&&(h=this.originalPageX),"x"===o.axis&&(l=this.originalPageY)),{top:l-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.offset.scroll.top:r?0:this.offset.scroll.top),left:h-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.offset.scroll.left:r?0:this.offset.scroll.left)}
-},_clear:function(){this.helper.removeClass("ui-draggable-dragging"),this.helper[0]===this.element[0]||this.cancelHelperRemoval||this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1,this.destroyOnClear&&this.destroy()},_normalizeRightBottom:function(){"y"!==this.options.axis&&"auto"!==this.helper.css("right")&&(this.helper.width(this.helper.width()),this.helper.css("right","auto")),"x"!==this.options.axis&&"auto"!==this.helper.css("bottom")&&(this.helper.height(this.helper.height()),this.helper.css("bottom","auto"))},_trigger:function(t,i,s){return s=s||this._uiHash(),e.ui.plugin.call(this,t,[i,s,this],!0),/^(drag|start|stop)/.test(t)&&(this.positionAbs=this._convertPositionTo("absolute"),s.offset=this.positionAbs),e.Widget.prototype._trigger.call(this,t,i,s)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),e.ui.plugin.add("draggable","connectToSortable",{start:function(t,i,s){var n=e.extend({},i,{item:s.element});s.sortables=[],e(s.options.connectToSortable).each(function(){var i=e(this).sortable("instance");i&&!i.options.disabled&&(s.sortables.push(i),i.refreshPositions(),i._trigger("activate",t,n))})},stop:function(t,i,s){var n=e.extend({},i,{item:s.element});s.cancelHelperRemoval=!1,e.each(s.sortables,function(){var e=this;e.isOver?(e.isOver=0,s.cancelHelperRemoval=!0,e.cancelHelperRemoval=!1,e._storedCSS={position:e.placeholder.css("position"),top:e.placeholder.css("top"),left:e.placeholder.css("left")},e._mouseStop(t),e.options.helper=e.options._helper):(e.cancelHelperRemoval=!0,e._trigger("deactivate",t,n))})},drag:function(t,i,s){e.each(s.sortables,function(){var n=!1,a=this;a.positionAbs=s.positionAbs,a.helperProportions=s.helperProportions,a.offset.click=s.offset.click,a._intersectsWith(a.containerCache)&&(n=!0,e.each(s.sortables,function(){return this.positionAbs=s.positionAbs,this.helperProportions=s.helperProportions,this.offset.click=s.offset.click,this!==a&&this._intersectsWith(this.containerCache)&&e.contains(a.element[0],this.element[0])&&(n=!1),n})),n?(a.isOver||(a.isOver=1,s._parent=i.helper.parent(),a.currentItem=i.helper.appendTo(a.element).data("ui-sortable-item",!0),a.options._helper=a.options.helper,a.options.helper=function(){return i.helper[0]},t.target=a.currentItem[0],a._mouseCapture(t,!0),a._mouseStart(t,!0,!0),a.offset.click.top=s.offset.click.top,a.offset.click.left=s.offset.click.left,a.offset.parent.left-=s.offset.parent.left-a.offset.parent.left,a.offset.parent.top-=s.offset.parent.top-a.offset.parent.top,s._trigger("toSortable",t),s.dropped=a.element,e.each(s.sortables,function(){this.refreshPositions()}),s.currentItem=s.element,a.fromOutside=s),a.currentItem&&(a._mouseDrag(t),i.position=a.position)):a.isOver&&(a.isOver=0,a.cancelHelperRemoval=!0,a.options._revert=a.options.revert,a.options.revert=!1,a._trigger("out",t,a._uiHash(a)),a._mouseStop(t,!0),a.options.revert=a.options._revert,a.options.helper=a.options._helper,a.placeholder&&a.placeholder.remove(),i.helper.appendTo(s._parent),s._refreshOffsets(t),i.position=s._generatePosition(t,!0),s._trigger("fromSortable",t),s.dropped=!1,e.each(s.sortables,function(){this.refreshPositions()}))})}}),e.ui.plugin.add("draggable","cursor",{start:function(t,i,s){var n=e("body"),a=s.options;n.css("cursor")&&(a._cursor=n.css("cursor")),n.css("cursor",a.cursor)},stop:function(t,i,s){var n=s.options;n._cursor&&e("body").css("cursor",n._cursor)}}),e.ui.plugin.add("draggable","opacity",{start:function(t,i,s){var n=e(i.helper),a=s.options;n.css("opacity")&&(a._opacity=n.css("opacity")),n.css("opacity",a.opacity)},stop:function(t,i,s){var n=s.options;n._opacity&&e(i.helper).css("opacity",n._opacity)}}),e.ui.plugin.add("draggable","scroll",{start:function(e,t,i){i.scrollParentNotHidden||(i.scrollParentNotHidden=i.helper.scrollParent(!1)),i.scrollParentNotHidden[0]!==i.document[0]&&"HTML"!==i.scrollParentNotHidden[0].tagName&&(i.overflowOffset=i.scrollParentNotHidden.offset())},drag:function(t,i,s){var n=s.options,a=!1,o=s.scrollParentNotHidden[0],r=s.document[0];o!==r&&"HTML"!==o.tagName?(n.axis&&"x"===n.axis||(s.overflowOffset.top+o.offsetHeight-t.pageY<n.scrollSensitivity?o.scrollTop=a=o.scrollTop+n.scrollSpeed:t.pageY-s.overflowOffset.top<n.scrollSensitivity&&(o.scrollTop=a=o.scrollTop-n.scrollSpeed)),n.axis&&"y"===n.axis||(s.overflowOffset.left+o.offsetWidth-t.pageX<n.scrollSensitivity?o.scrollLeft=a=o.scrollLeft+n.scrollSpeed:t.pageX-s.overflowOffset.left<n.scrollSensitivity&&(o.scrollLeft=a=o.scrollLeft-n.scrollSpeed))):(n.axis&&"x"===n.axis||(t.pageY-e(r).scrollTop()<n.scrollSensitivity?a=e(r).scrollTop(e(r).scrollTop()-n.scrollSpeed):e(window).height()-(t.pageY-e(r).scrollTop())<n.scrollSensitivity&&(a=e(r).scrollTop(e(r).scrollTop()+n.scrollSpeed))),n.axis&&"y"===n.axis||(t.pageX-e(r).scrollLeft()<n.scrollSensitivity?a=e(r).scrollLeft(e(r).scrollLeft()-n.scrollSpeed):e(window).width()-(t.pageX-e(r).scrollLeft())<n.scrollSensitivity&&(a=e(r).scrollLeft(e(r).scrollLeft()+n.scrollSpeed)))),a!==!1&&e.ui.ddmanager&&!n.dropBehaviour&&e.ui.ddmanager.prepareOffsets(s,t)}}),e.ui.plugin.add("draggable","snap",{start:function(t,i,s){var n=s.options;s.snapElements=[],e(n.snap.constructor!==String?n.snap.items||":data(ui-draggable)":n.snap).each(function(){var t=e(this),i=t.offset();this!==s.element[0]&&s.snapElements.push({item:this,width:t.outerWidth(),height:t.outerHeight(),top:i.top,left:i.left})})},drag:function(t,i,s){var n,a,o,r,h,l,u,d,c,p,f=s.options,m=f.snapTolerance,g=i.offset.left,v=g+s.helperProportions.width,y=i.offset.top,b=y+s.helperProportions.height;for(c=s.snapElements.length-1;c>=0;c--)h=s.snapElements[c].left-s.margins.left,l=h+s.snapElements[c].width,u=s.snapElements[c].top-s.margins.top,d=u+s.snapElements[c].height,h-m>v||g>l+m||u-m>b||y>d+m||!e.contains(s.snapElements[c].item.ownerDocument,s.snapElements[c].item)?(s.snapElements[c].snapping&&s.options.snap.release&&s.options.snap.release.call(s.element,t,e.extend(s._uiHash(),{snapItem:s.snapElements[c].item})),s.snapElements[c].snapping=!1):("inner"!==f.snapMode&&(n=m>=Math.abs(u-b),a=m>=Math.abs(d-y),o=m>=Math.abs(h-v),r=m>=Math.abs(l-g),n&&(i.position.top=s._convertPositionTo("relative",{top:u-s.helperProportions.height,left:0}).top),a&&(i.position.top=s._convertPositionTo("relative",{top:d,left:0}).top),o&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h-s.helperProportions.width}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l}).left)),p=n||a||o||r,"outer"!==f.snapMode&&(n=m>=Math.abs(u-y),a=m>=Math.abs(d-b),o=m>=Math.abs(h-g),r=m>=Math.abs(l-v),n&&(i.position.top=s._convertPositionTo("relative",{top:u,left:0}).top),a&&(i.position.top=s._convertPositionTo("relative",{top:d-s.helperProportions.height,left:0}).top),o&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l-s.helperProportions.width}).left)),!s.snapElements[c].snapping&&(n||a||o||r||p)&&s.options.snap.snap&&s.options.snap.snap.call(s.element,t,e.extend(s._uiHash(),{snapItem:s.snapElements[c].item})),s.snapElements[c].snapping=n||a||o||r||p)}}),e.ui.plugin.add("draggable","stack",{start:function(t,i,s){var n,a=s.options,o=e.makeArray(e(a.stack)).sort(function(t,i){return(parseInt(e(t).css("zIndex"),10)||0)-(parseInt(e(i).css("zIndex"),10)||0)});o.length&&(n=parseInt(e(o[0]).css("zIndex"),10)||0,e(o).each(function(t){e(this).css("zIndex",n+t)}),this.css("zIndex",n+o.length))}}),e.ui.plugin.add("draggable","zIndex",{start:function(t,i,s){var n=e(i.helper),a=s.options;n.css("zIndex")&&(a._zIndex=n.css("zIndex")),n.css("zIndex",a.zIndex)},stop:function(t,i,s){var n=s.options;n._zIndex&&e(i.helper).css("zIndex",n._zIndex)}}),e.ui.draggable,e.widget("ui.droppable",{version:"1.11.4",widgetEventPrefix:"drop",options:{accept:"*",activeClass:!1,addClasses:!0,greedy:!1,hoverClass:!1,scope:"default",tolerance:"intersect",activate:null,deactivate:null,drop:null,out:null,over:null},_create:function(){var t,i=this.options,s=i.accept;this.isover=!1,this.isout=!0,this.accept=e.isFunction(s)?s:function(e){return e.is(s)},this.proportions=function(){return arguments.length?(t=arguments[0],void 0):t?t:t={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight}},this._addToManager(i.scope),i.addClasses&&this.element.addClass("ui-droppable")},_addToManager:function(t){e.ui.ddmanager.droppables[t]=e.ui.ddmanager.droppables[t]||[],e.ui.ddmanager.droppables[t].push(this)},_splice:function(e){for(var t=0;e.length>t;t++)e[t]===this&&e.splice(t,1)},_destroy:function(){var t=e.ui.ddmanager.droppables[this.options.scope];this._splice(t),this.element.removeClass("ui-droppable ui-droppable-disabled")},_setOption:function(t,i){if("accept"===t)this.accept=e.isFunction(i)?i:function(e){return e.is(i)};else if("scope"===t){var s=e.ui.ddmanager.droppables[this.options.scope];this._splice(s),this._addToManager(i)}this._super(t,i)},_activate:function(t){var i=e.ui.ddmanager.current;this.options.activeClass&&this.element.addClass(this.options.activeClass),i&&this._trigger("activate",t,this.ui(i))},_deactivate:function(t){var i=e.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass),i&&this._trigger("deactivate",t,this.ui(i))},_over:function(t){var i=e.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.addClass(this.options.hoverClass),this._trigger("over",t,this.ui(i)))},_out:function(t){var i=e.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("out",t,this.ui(i)))},_drop:function(t,i){var s=i||e.ui.ddmanager.current,n=!1;return s&&(s.currentItem||s.element)[0]!==this.element[0]?(this.element.find(":data(ui-droppable)").not(".ui-draggable-dragging").each(function(){var i=e(this).droppable("instance");return i.options.greedy&&!i.options.disabled&&i.options.scope===s.options.scope&&i.accept.call(i.element[0],s.currentItem||s.element)&&e.ui.intersect(s,e.extend(i,{offset:i.element.offset()}),i.options.tolerance,t)?(n=!0,!1):void 0}),n?!1:this.accept.call(this.element[0],s.currentItem||s.element)?(this.options.activeClass&&this.element.removeClass(this.options.activeClass),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("drop",t,this.ui(s)),this.element):!1):!1},ui:function(e){return{draggable:e.currentItem||e.element,helper:e.helper,position:e.position,offset:e.positionAbs}}}),e.ui.intersect=function(){function e(e,t,i){return e>=t&&t+i>e}return function(t,i,s,n){if(!i.offset)return!1;var a=(t.positionAbs||t.position.absolute).left+t.margins.left,o=(t.positionAbs||t.position.absolute).top+t.margins.top,r=a+t.helperProportions.width,h=o+t.helperProportions.height,l=i.offset.left,u=i.offset.top,d=l+i.proportions().width,c=u+i.proportions().height;switch(s){case"fit":return a>=l&&d>=r&&o>=u&&c>=h;case"intersect":return a+t.helperProportions.width/2>l&&d>r-t.helperProportions.width/2&&o+t.helperProportions.height/2>u&&c>h-t.helperProportions.height/2;case"pointer":return e(n.pageY,u,i.proportions().height)&&e(n.pageX,l,i.proportions().width);case"touch":return(o>=u&&c>=o||h>=u&&c>=h||u>o&&h>c)&&(a>=l&&d>=a||r>=l&&d>=r||l>a&&r>d);default:return!1}}}(),e.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(t,i){var s,n,a=e.ui.ddmanager.droppables[t.options.scope]||[],o=i?i.type:null,r=(t.currentItem||t.element).find(":data(ui-droppable)").addBack();e:for(s=0;a.length>s;s++)if(!(a[s].options.disabled||t&&!a[s].accept.call(a[s].element[0],t.currentItem||t.element))){for(n=0;r.length>n;n++)if(r[n]===a[s].element[0]){a[s].proportions().height=0;continue e}a[s].visible="none"!==a[s].element.css("display"),a[s].visible&&("mousedown"===o&&a[s]._activate.call(a[s],i),a[s].offset=a[s].element.offset(),a[s].proportions({width:a[s].element[0].offsetWidth,height:a[s].element[0].offsetHeight}))}},drop:function(t,i){var s=!1;return e.each((e.ui.ddmanager.droppables[t.options.scope]||[]).slice(),function(){this.options&&(!this.options.disabled&&this.visible&&e.ui.intersect(t,this,this.options.tolerance,i)&&(s=this._drop.call(this,i)||s),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],t.currentItem||t.element)&&(this.isout=!0,this.isover=!1,this._deactivate.call(this,i)))}),s},dragStart:function(t,i){t.element.parentsUntil("body").bind("scroll.droppable",function(){t.options.refreshPositions||e.ui.ddmanager.prepareOffsets(t,i)})},drag:function(t,i){t.options.refreshPositions&&e.ui.ddmanager.prepareOffsets(t,i),e.each(e.ui.ddmanager.droppables[t.options.scope]||[],function(){if(!this.options.disabled&&!this.greedyChild&&this.visible){var s,n,a,o=e.ui.intersect(t,this,this.options.tolerance,i),r=!o&&this.isover?"isout":o&&!this.isover?"isover":null;r&&(this.options.greedy&&(n=this.options.scope,a=this.element.parents(":data(ui-droppable)").filter(function(){return e(this).droppable("instance").options.scope===n}),a.length&&(s=e(a[0]).droppable("instance"),s.greedyChild="isover"===r)),s&&"isover"===r&&(s.isover=!1,s.isout=!0,s._out.call(s,i)),this[r]=!0,this["isout"===r?"isover":"isout"]=!1,this["isover"===r?"_over":"_out"].call(this,i),s&&"isout"===r&&(s.isout=!1,s.isover=!0,s._over.call(s,i)))}})},dragStop:function(t,i){t.element.parentsUntil("body").unbind("scroll.droppable"),t.options.refreshPositions||e.ui.ddmanager.prepareOffsets(t,i)}},e.ui.droppable,e.widget("ui.resizable",e.ui.mouse,{version:"1.11.4",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(e){return parseInt(e,10)||0},_isNumber:function(e){return!isNaN(parseInt(e,10))},_hasScroll:function(t,i){if("hidden"===e(t).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return t[s]>0?!0:(t[s]=1,n=t[s]>0,t[s]=0,n)},_create:function(){var t,i,s,n,a,o=this,r=this.options;if(this.element.addClass("ui-resizable"),e.extend(this,{_aspectRatio:!!r.aspectRatio,aspectRatio:r.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:r.helper||r.ghost||r.animate?r.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(e("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=r.handles||(e(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=e(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),t=this.handles.split(","),this.handles={},i=0;t.length>i;i++)s=e.trim(t[i]),a="ui-resizable-"+s,n=e("<div class='ui-resizable-handle "+a+"'></div>"),n.css({zIndex:r.zIndex}),"se"===s&&n.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[s]=".ui-resizable-"+s,this.element.append(n);this._renderAxis=function(t){var i,s,n,a;t=t||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=e(this.handles[i]),this._on(this.handles[i],{mousedown:o._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=e(this.handles[i],this.element),a=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),t.css(n,a),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.mouseover(function(){o.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),o.axis=n&&n[1]?n[1]:"se")}),r.autoHide&&(this._handles.hide(),e(this.element).addClass("ui-resizable-autohide").mouseenter(function(){r.disabled||(e(this).removeClass("ui-resizable-autohide"),o._handles.show())}).mouseleave(function(){r.disabled||o.resizing||(e(this).addClass("ui-resizable-autohide"),o._handles.hide())})),this._mouseInit()},_destroy:function(){this._mouseDestroy();var t,i=function(t){e(t).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").removeData("ui-resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),t=this.element,this.originalElement.css({position:t.css("position"),width:t.outerWidth(),height:t.outerHeight(),top:t.css("top"),left:t.css("left")}).insertAfter(t),t.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_mouseCapture:function(t){var i,s,n=!1;for(i in this.handles)s=e(this.handles[i])[0],(s===t.target||e.contains(s,t.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(t){var i,s,n,a=this.options,o=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),a.containment&&(i+=e(a.containment).scrollLeft()||0,s+=e(a.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:o.width(),height:o.height()},this.originalSize=this._helper?{width:o.outerWidth(),height:o.outerHeight()}:{width:o.width(),height:o.height()},this.sizeDiff={width:o.outerWidth()-o.width(),height:o.outerHeight()-o.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof a.aspectRatio?a.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=e(".ui-resizable-"+this.axis).css("cursor"),e("body").css("cursor","auto"===n?this.axis+"-resize":n),o.addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var i,s,n=this.originalMousePosition,a=this.axis,o=t.pageX-n.left||0,r=t.pageY-n.top||0,h=this._change[a];return this._updatePrevProperties(),h?(i=h.apply(this,[t,o,r]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(i=this._updateRatio(i,t)),i=this._respectSize(i,t),this._updateCache(i),this._propagate("resize",t),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),e.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(t){this.resizing=!1;var i,s,n,a,o,r,h,l=this.options,u=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:u.sizeDiff.height,a=s?0:u.sizeDiff.width,o={width:u.helper.width()-a,height:u.helper.height()-n},r=parseInt(u.element.css("left"),10)+(u.position.left-u.originalPosition.left)||null,h=parseInt(u.element.css("top"),10)+(u.position.top-u.originalPosition.top)||null,l.animate||this.element.css(e.extend(o,{top:h,left:r})),u.helper.height(u.size.height),u.helper.width(u.size.width),this._helper&&!l.animate&&this._proportionallyResize()),e("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var e={};return this.position.top!==this.prevPosition.top&&(e.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(e.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(e.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(e.height=this.size.height+"px"),this.helper.css(e),e},_updateVirtualBoundaries:function(e){var t,i,s,n,a,o=this.options;a={minWidth:this._isNumber(o.minWidth)?o.minWidth:0,maxWidth:this._isNumber(o.maxWidth)?o.maxWidth:1/0,minHeight:this._isNumber(o.minHeight)?o.minHeight:0,maxHeight:this._isNumber(o.maxHeight)?o.maxHeight:1/0},(this._aspectRatio||e)&&(t=a.minHeight*this.aspectRatio,s=a.minWidth/this.aspectRatio,i=a.maxHeight*this.aspectRatio,n=a.maxWidth/this.aspectRatio,t>a.minWidth&&(a.minWidth=t),s>a.minHeight&&(a.minHeight=s),a.maxWidth>i&&(a.maxWidth=i),a.maxHeight>n&&(a.maxHeight=n)),this._vBoundaries=a},_updateCache:function(e){this.offset=this.helper.offset(),this._isNumber(e.left)&&(this.position.left=e.left),this._isNumber(e.top)&&(this.position.top=e.top),this._isNumber(e.height)&&(this.size.height=e.height),this._isNumber(e.width)&&(this.size.width=e.width)},_updateRatio:function(e){var t=this.position,i=this.size,s=this.axis;return this._isNumber(e.height)?e.width=e.height*this.aspectRatio:this._isNumber(e.width)&&(e.height=e.width/this.aspectRatio),"sw"===s&&(e.left=t.left+(i.width-e.width),e.top=null),"nw"===s&&(e.top=t.top+(i.height-e.height),e.left=t.left+(i.width-e.width)),e},_respectSize:function(e){var t=this._vBoundaries,i=this.axis,s=this._isNumber(e.width)&&t.maxWidth&&t.maxWidth<e.width,n=this._isNumber(e.height)&&t.maxHeight&&t.maxHeight<e.height,a=this._isNumber(e.width)&&t.minWidth&&t.minWidth>e.width,o=this._isNumber(e.height)&&t.minHeight&&t.minHeight>e.height,r=this.originalPosition.left+this.originalSize.width,h=this.position.top+this.size.height,l=/sw|nw|w/.test(i),u=/nw|ne|n/.test(i);return a&&(e.width=t.minWidth),o&&(e.height=t.minHeight),s&&(e.width=t.maxWidth),n&&(e.height=t.maxHeight),a&&l&&(e.left=r-t.minWidth),s&&l&&(e.left=r-t.maxWidth),o&&u&&(e.top=h-t.minHeight),n&&u&&(e.top=h-t.maxHeight),e.width||e.height||e.left||!e.top?e.width||e.height||e.top||!e.left||(e.left=null):e.top=null,e},_getPaddingPlusBorderDimensions:function(e){for(var t=0,i=[],s=[e.css("borderTopWidth"),e.css("borderRightWidth"),e.css("borderBottomWidth"),e.css("borderLeftWidth")],n=[e.css("paddingTop"),e.css("paddingRight"),e.css("paddingBottom"),e.css("paddingLeft")];4>t;t++)i[t]=parseInt(s[t],10)||0,i[t]+=parseInt(n[t],10)||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var e,t=0,i=this.helper||this.element;this._proportionallyResizeElements.length>t;t++)e=this._proportionallyResizeElements[t],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(e)),e.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var t=this.element,i=this.options;this.elementOffset=t.offset(),this._helper?(this.helper=this.helper||e("<div style='overflow:hidden;'></div>"),this.helper.addClass(this._helper).css({width:this.element.outerWidth()-1,height:this.element.outerHeight()-1,position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(e,t){return{width:this.originalSize.width+t}},w:function(e,t){var i=this.originalSize,s=this.originalPosition;return{left:s.left+t,width:i.width-t}},n:function(e,t,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(e,t,i){return{height:this.originalSize.height+i}},se:function(t,i,s){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,i,s]))},sw:function(t,i,s){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,i,s]))},ne:function(t,i,s){return e.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,i,s]))},nw:function(t,i,s){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,i,s]))}},_propagate:function(t,i){e.ui.plugin.call(this,t,[i,this.ui()]),"resize"!==t&&this._trigger(t,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),e.ui.plugin.add("resizable","animate",{stop:function(t){var i=e(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,a=n.length&&/textarea/i.test(n[0].nodeName),o=a&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=a?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-o},l=parseInt(i.element.css("left"),10)+(i.position.left-i.originalPosition.left)||null,u=parseInt(i.element.css("top"),10)+(i.position.top-i.originalPosition.top)||null;i.element.animate(e.extend(h,u&&l?{top:u,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseInt(i.element.css("width"),10),height:parseInt(i.element.css("height"),10),top:parseInt(i.element.css("top"),10),left:parseInt(i.element.css("left"),10)};n&&n.length&&e(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",t)}})}}),e.ui.plugin.add("resizable","containment",{start:function(){var t,i,s,n,a,o,r,h=e(this).resizable("instance"),l=h.options,u=h.element,d=l.containment,c=d instanceof e?d.get(0):/parent/.test(d)?u.parent().get(0):d;c&&(h.containerElement=e(c),/document/.test(d)||d===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}):(t=e(c),i=[],e(["Top","Right","Left","Bottom"]).each(function(e,s){i[e]=h._num(t.css("padding"+s))}),h.containerOffset=t.offset(),h.containerPosition=t.position(),h.containerSize={height:t.innerHeight()-i[3],width:t.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,a=h.containerSize.width,o=h._hasScroll(c,"left")?c.scrollWidth:a,r=h._hasScroll(c)?c.scrollHeight:n,h.parentData={element:c,left:s.left,top:s.top,width:o,height:r}))},resize:function(t){var i,s,n,a,o=e(this).resizable("instance"),r=o.options,h=o.containerOffset,l=o.position,u=o._aspectRatio||t.shiftKey,d={top:0,left:0},c=o.containerElement,p=!0;c[0]!==document&&/static/.test(c.css("position"))&&(d=h),l.left<(o._helper?h.left:0)&&(o.size.width=o.size.width+(o._helper?o.position.left-h.left:o.position.left-d.left),u&&(o.size.height=o.size.width/o.aspectRatio,p=!1),o.position.left=r.helper?h.left:0),l.top<(o._helper?h.top:0)&&(o.size.height=o.size.height+(o._helper?o.position.top-h.top:o.position.top),u&&(o.size.width=o.size.height*o.aspectRatio,p=!1),o.position.top=o._helper?h.top:0),n=o.containerElement.get(0)===o.element.parent().get(0),a=/relative|absolute/.test(o.containerElement.css("position")),n&&a?(o.offset.left=o.parentData.left+o.position.left,o.offset.top=o.parentData.top+o.position.top):(o.offset.left=o.element.offset().left,o.offset.top=o.element.offset().top),i=Math.abs(o.sizeDiff.width+(o._helper?o.offset.left-d.left:o.offset.left-h.left)),s=Math.abs(o.sizeDiff.height+(o._helper?o.offset.top-d.top:o.offset.top-h.top)),i+o.size.width>=o.parentData.width&&(o.size.width=o.parentData.width-i,u&&(o.size.height=o.size.width/o.aspectRatio,p=!1)),s+o.size.height>=o.parentData.height&&(o.size.height=o.parentData.height-s,u&&(o.size.width=o.size.height*o.aspectRatio,p=!1)),p||(o.position.left=o.prevPosition.left,o.position.top=o.prevPosition.top,o.size.width=o.prevSize.width,o.size.height=o.prevSize.height)},stop:function(){var t=e(this).resizable("instance"),i=t.options,s=t.containerOffset,n=t.containerPosition,a=t.containerElement,o=e(t.helper),r=o.offset(),h=o.outerWidth()-t.sizeDiff.width,l=o.outerHeight()-t.sizeDiff.height;t._helper&&!i.animate&&/relative/.test(a.css("position"))&&e(this).css({left:r.left-n.left-s.left,width:h,height:l}),t._helper&&!i.animate&&/static/.test(a.css("position"))&&e(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),e.ui.plugin.add("resizable","alsoResize",{start:function(){var t=e(this).resizable("instance"),i=t.options;e(i.alsoResize).each(function(){var t=e(this);t.data("ui-resizable-alsoresize",{width:parseInt(t.width(),10),height:parseInt(t.height(),10),left:parseInt(t.css("left"),10),top:parseInt(t.css("top"),10)})})},resize:function(t,i){var s=e(this).resizable("instance"),n=s.options,a=s.originalSize,o=s.originalPosition,r={height:s.size.height-a.height||0,width:s.size.width-a.width||0,top:s.position.top-o.top||0,left:s.position.left-o.left||0};e(n.alsoResize).each(function(){var t=e(this),s=e(this).data("ui-resizable-alsoresize"),n={},a=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(a,function(e,t){var i=(s[t]||0)+(r[t]||0);i&&i>=0&&(n[t]=i||null)}),t.css(n)})},stop:function(){e(this).removeData("resizable-alsoresize")}}),e.ui.plugin.add("resizable","ghost",{start:function(){var t=e(this).resizable("instance"),i=t.options,s=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:s.height,width:s.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass("string"==typeof i.ghost?i.ghost:""),t.ghost.appendTo(t.helper)},resize:function(){var t=e(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=e(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),e.ui.plugin.add("resizable","grid",{resize:function(){var t,i=e(this).resizable("instance"),s=i.options,n=i.size,a=i.originalSize,o=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,u=h[1]||1,d=Math.round((n.width-a.width)/l)*l,c=Math.round((n.height-a.height)/u)*u,p=a.width+d,f=a.height+c,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,v=s.minWidth&&s.minWidth>p,y=s.minHeight&&s.minHeight>f;s.grid=h,v&&(p+=l),y&&(f+=u),m&&(p-=l),g&&(f-=u),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=o.top-c):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=o.left-d):((0>=f-u||0>=p-l)&&(t=i._getPaddingPlusBorderDimensions(this)),f-u>0?(i.size.height=f,i.position.top=o.top-c):(f=u-t.height,i.size.height=f,i.position.top=o.top+a.height-f),p-l>0?(i.size.width=p,i.position.left=o.left-d):(p=l-t.width,i.size.width=p,i.position.left=o.left+a.width-p))}}),e.ui.resizable,e.widget("ui.selectable",e.ui.mouse,{version:"1.11.4",options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch",selected:null,selecting:null,start:null,stop:null,unselected:null,unselecting:null},_create:function(){var t,i=this;
-this.element.addClass("ui-selectable"),this.dragged=!1,this.refresh=function(){t=e(i.options.filter,i.element[0]),t.addClass("ui-selectee"),t.each(function(){var t=e(this),i=t.offset();e.data(this,"selectable-item",{element:this,$element:t,left:i.left,top:i.top,right:i.left+t.outerWidth(),bottom:i.top+t.outerHeight(),startselected:!1,selected:t.hasClass("ui-selected"),selecting:t.hasClass("ui-selecting"),unselecting:t.hasClass("ui-unselecting")})})},this.refresh(),this.selectees=t.addClass("ui-selectee"),this._mouseInit(),this.helper=e("<div class='ui-selectable-helper'></div>")},_destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item"),this.element.removeClass("ui-selectable ui-selectable-disabled"),this._mouseDestroy()},_mouseStart:function(t){var i=this,s=this.options;this.opos=[t.pageX,t.pageY],this.options.disabled||(this.selectees=e(s.filter,this.element[0]),this._trigger("start",t),e(s.appendTo).append(this.helper),this.helper.css({left:t.pageX,top:t.pageY,width:0,height:0}),s.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var s=e.data(this,"selectable-item");s.startselected=!0,t.metaKey||t.ctrlKey||(s.$element.removeClass("ui-selected"),s.selected=!1,s.$element.addClass("ui-unselecting"),s.unselecting=!0,i._trigger("unselecting",t,{unselecting:s.element}))}),e(t.target).parents().addBack().each(function(){var s,n=e.data(this,"selectable-item");return n?(s=!t.metaKey&&!t.ctrlKey||!n.$element.hasClass("ui-selected"),n.$element.removeClass(s?"ui-unselecting":"ui-selected").addClass(s?"ui-selecting":"ui-unselecting"),n.unselecting=!s,n.selecting=s,n.selected=s,s?i._trigger("selecting",t,{selecting:n.element}):i._trigger("unselecting",t,{unselecting:n.element}),!1):void 0}))},_mouseDrag:function(t){if(this.dragged=!0,!this.options.disabled){var i,s=this,n=this.options,a=this.opos[0],o=this.opos[1],r=t.pageX,h=t.pageY;return a>r&&(i=r,r=a,a=i),o>h&&(i=h,h=o,o=i),this.helper.css({left:a,top:o,width:r-a,height:h-o}),this.selectees.each(function(){var i=e.data(this,"selectable-item"),l=!1;i&&i.element!==s.element[0]&&("touch"===n.tolerance?l=!(i.left>r||a>i.right||i.top>h||o>i.bottom):"fit"===n.tolerance&&(l=i.left>a&&r>i.right&&i.top>o&&h>i.bottom),l?(i.selected&&(i.$element.removeClass("ui-selected"),i.selected=!1),i.unselecting&&(i.$element.removeClass("ui-unselecting"),i.unselecting=!1),i.selecting||(i.$element.addClass("ui-selecting"),i.selecting=!0,s._trigger("selecting",t,{selecting:i.element}))):(i.selecting&&((t.metaKey||t.ctrlKey)&&i.startselected?(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.$element.addClass("ui-selected"),i.selected=!0):(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.startselected&&(i.$element.addClass("ui-unselecting"),i.unselecting=!0),s._trigger("unselecting",t,{unselecting:i.element}))),i.selected&&(t.metaKey||t.ctrlKey||i.startselected||(i.$element.removeClass("ui-selected"),i.selected=!1,i.$element.addClass("ui-unselecting"),i.unselecting=!0,s._trigger("unselecting",t,{unselecting:i.element})))))}),!1}},_mouseStop:function(t){var i=this;return this.dragged=!1,e(".ui-unselecting",this.element[0]).each(function(){var s=e.data(this,"selectable-item");s.$element.removeClass("ui-unselecting"),s.unselecting=!1,s.startselected=!1,i._trigger("unselected",t,{unselected:s.element})}),e(".ui-selecting",this.element[0]).each(function(){var s=e.data(this,"selectable-item");s.$element.removeClass("ui-selecting").addClass("ui-selected"),s.selecting=!1,s.selected=!0,s.startselected=!0,i._trigger("selected",t,{selected:s.element})}),this._trigger("stop",t),this.helper.remove(),!1}}),e.widget("ui.sortable",e.ui.mouse,{version:"1.11.4",widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_isOverAxis:function(e,t,i){return e>=t&&t+i>e},_isFloating:function(e){return/left|right/.test(e.css("float"))||/inline|table-cell/.test(e.css("display"))},_create:function(){this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.offset=this.element.offset(),this._mouseInit(),this._setHandleClassName(),this.ready=!0},_setOption:function(e,t){this._super(e,t),"handle"===e&&this._setHandleClassName()},_setHandleClassName:function(){this.element.find(".ui-sortable-handle").removeClass("ui-sortable-handle"),e.each(this.items,function(){(this.instance.options.handle?this.item.find(this.instance.options.handle):this.item).addClass("ui-sortable-handle")})},_destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").find(".ui-sortable-handle").removeClass("ui-sortable-handle"),this._mouseDestroy();for(var e=this.items.length-1;e>=0;e--)this.items[e].item.removeData(this.widgetName+"-item");return this},_mouseCapture:function(t,i){var s=null,n=!1,a=this;return this.reverting?!1:this.options.disabled||"static"===this.options.type?!1:(this._refreshItems(t),e(t.target).parents().each(function(){return e.data(this,a.widgetName+"-item")===a?(s=e(this),!1):void 0}),e.data(t.target,a.widgetName+"-item")===a&&(s=e(t.target)),s?!this.options.handle||i||(e(this.options.handle,s).find("*").addBack().each(function(){this===t.target&&(n=!0)}),n)?(this.currentItem=s,this._removeCurrentsFromItems(),!0):!1:!1)},_mouseStart:function(t,i,s){var n,a,o=this.options;if(this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(t),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},e.extend(this.offset,{click:{left:t.pageX-this.offset.left,top:t.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(t),this.originalPageX=t.pageX,this.originalPageY=t.pageY,o.cursorAt&&this._adjustOffsetFromHelper(o.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!==this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),o.containment&&this._setContainment(),o.cursor&&"auto"!==o.cursor&&(a=this.document.find("body"),this.storedCursor=a.css("cursor"),a.css("cursor",o.cursor),this.storedStylesheet=e("<style>*{ cursor: "+o.cursor+" !important; }</style>").appendTo(a)),o.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",o.opacity)),o.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",o.zIndex)),this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",t,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!s)for(n=this.containers.length-1;n>=0;n--)this.containers[n]._trigger("activate",t,this._uiHash(this));return e.ui.ddmanager&&(e.ui.ddmanager.current=this),e.ui.ddmanager&&!o.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(t),!0},_mouseDrag:function(t){var i,s,n,a,o=this.options,r=!1;for(this.position=this._generatePosition(t),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-t.pageY<o.scrollSensitivity?this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop+o.scrollSpeed:t.pageY-this.overflowOffset.top<o.scrollSensitivity&&(this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop-o.scrollSpeed),this.overflowOffset.left+this.scrollParent[0].offsetWidth-t.pageX<o.scrollSensitivity?this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft+o.scrollSpeed:t.pageX-this.overflowOffset.left<o.scrollSensitivity&&(this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft-o.scrollSpeed)):(t.pageY-this.document.scrollTop()<o.scrollSensitivity?r=this.document.scrollTop(this.document.scrollTop()-o.scrollSpeed):this.window.height()-(t.pageY-this.document.scrollTop())<o.scrollSensitivity&&(r=this.document.scrollTop(this.document.scrollTop()+o.scrollSpeed)),t.pageX-this.document.scrollLeft()<o.scrollSensitivity?r=this.document.scrollLeft(this.document.scrollLeft()-o.scrollSpeed):this.window.width()-(t.pageX-this.document.scrollLeft())<o.scrollSensitivity&&(r=this.document.scrollLeft(this.document.scrollLeft()+o.scrollSpeed))),r!==!1&&e.ui.ddmanager&&!o.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t)),this.positionAbs=this._convertPositionTo("absolute"),this.options.axis&&"y"===this.options.axis||(this.helper[0].style.left=this.position.left+"px"),this.options.axis&&"x"===this.options.axis||(this.helper[0].style.top=this.position.top+"px"),i=this.items.length-1;i>=0;i--)if(s=this.items[i],n=s.item[0],a=this._intersectsWithPointer(s),a&&s.instance===this.currentContainer&&n!==this.currentItem[0]&&this.placeholder[1===a?"next":"prev"]()[0]!==n&&!e.contains(this.placeholder[0],n)&&("semi-dynamic"===this.options.type?!e.contains(this.element[0],n):!0)){if(this.direction=1===a?"down":"up","pointer"!==this.options.tolerance&&!this._intersectsWithSides(s))break;this._rearrange(t,s),this._trigger("change",t,this._uiHash());break}return this._contactContainers(t),e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),this._trigger("sort",t,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(t,i){if(t){if(e.ui.ddmanager&&!this.options.dropBehaviour&&e.ui.ddmanager.drop(this,t),this.options.revert){var s=this,n=this.placeholder.offset(),a=this.options.axis,o={};a&&"x"!==a||(o.left=n.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollLeft)),a&&"y"!==a||(o.top=n.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollTop)),this.reverting=!0,e(this.helper).animate(o,parseInt(this.options.revert,10)||500,function(){s._clear(t)})}else this._clear(t,i);return!1}},cancel:function(){if(this.dragging){this._mouseUp({target:null}),"original"===this.options.helper?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var t=this.containers.length-1;t>=0;t--)this.containers[t]._trigger("deactivate",null,this._uiHash(this)),this.containers[t].containerCache.over&&(this.containers[t]._trigger("out",null,this._uiHash(this)),this.containers[t].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),"original"!==this.options.helper&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),e.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?e(this.domPosition.prev).after(this.currentItem):e(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(t){var i=this._getItemsAsjQuery(t&&t.connected),s=[];return t=t||{},e(i).each(function(){var i=(e(t.item||this).attr(t.attribute||"id")||"").match(t.expression||/(.+)[\-=_](.+)/);i&&s.push((t.key||i[1]+"[]")+"="+(t.key&&t.expression?i[1]:i[2]))}),!s.length&&t.key&&s.push(t.key+"="),s.join("&")},toArray:function(t){var i=this._getItemsAsjQuery(t&&t.connected),s=[];return t=t||{},i.each(function(){s.push(e(t.item||this).attr(t.attribute||"id")||"")}),s},_intersectsWith:function(e){var t=this.positionAbs.left,i=t+this.helperProportions.width,s=this.positionAbs.top,n=s+this.helperProportions.height,a=e.left,o=a+e.width,r=e.top,h=r+e.height,l=this.offset.click.top,u=this.offset.click.left,d="x"===this.options.axis||s+l>r&&h>s+l,c="y"===this.options.axis||t+u>a&&o>t+u,p=d&&c;return"pointer"===this.options.tolerance||this.options.forcePointerForContainers||"pointer"!==this.options.tolerance&&this.helperProportions[this.floating?"width":"height"]>e[this.floating?"width":"height"]?p:t+this.helperProportions.width/2>a&&o>i-this.helperProportions.width/2&&s+this.helperProportions.height/2>r&&h>n-this.helperProportions.height/2},_intersectsWithPointer:function(e){var t="x"===this.options.axis||this._isOverAxis(this.positionAbs.top+this.offset.click.top,e.top,e.height),i="y"===this.options.axis||this._isOverAxis(this.positionAbs.left+this.offset.click.left,e.left,e.width),s=t&&i,n=this._getDragVerticalDirection(),a=this._getDragHorizontalDirection();return s?this.floating?a&&"right"===a||"down"===n?2:1:n&&("down"===n?2:1):!1},_intersectsWithSides:function(e){var t=this._isOverAxis(this.positionAbs.top+this.offset.click.top,e.top+e.height/2,e.height),i=this._isOverAxis(this.positionAbs.left+this.offset.click.left,e.left+e.width/2,e.width),s=this._getDragVerticalDirection(),n=this._getDragHorizontalDirection();return this.floating&&n?"right"===n&&i||"left"===n&&!i:s&&("down"===s&&t||"up"===s&&!t)},_getDragVerticalDirection:function(){var e=this.positionAbs.top-this.lastPositionAbs.top;return 0!==e&&(e>0?"down":"up")},_getDragHorizontalDirection:function(){var e=this.positionAbs.left-this.lastPositionAbs.left;return 0!==e&&(e>0?"right":"left")},refresh:function(e){return this._refreshItems(e),this._setHandleClassName(),this.refreshPositions(),this},_connectWith:function(){var e=this.options;return e.connectWith.constructor===String?[e.connectWith]:e.connectWith},_getItemsAsjQuery:function(t){function i(){r.push(this)}var s,n,a,o,r=[],h=[],l=this._connectWith();if(l&&t)for(s=l.length-1;s>=0;s--)for(a=e(l[s],this.document[0]),n=a.length-1;n>=0;n--)o=e.data(a[n],this.widgetFullName),o&&o!==this&&!o.options.disabled&&h.push([e.isFunction(o.options.items)?o.options.items.call(o.element):e(o.options.items,o.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),o]);for(h.push([e.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):e(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]),s=h.length-1;s>=0;s--)h[s][0].each(i);return e(r)},_removeCurrentsFromItems:function(){var t=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=e.grep(this.items,function(e){for(var i=0;t.length>i;i++)if(t[i]===e.item[0])return!1;return!0})},_refreshItems:function(t){this.items=[],this.containers=[this];var i,s,n,a,o,r,h,l,u=this.items,d=[[e.isFunction(this.options.items)?this.options.items.call(this.element[0],t,{item:this.currentItem}):e(this.options.items,this.element),this]],c=this._connectWith();if(c&&this.ready)for(i=c.length-1;i>=0;i--)for(n=e(c[i],this.document[0]),s=n.length-1;s>=0;s--)a=e.data(n[s],this.widgetFullName),a&&a!==this&&!a.options.disabled&&(d.push([e.isFunction(a.options.items)?a.options.items.call(a.element[0],t,{item:this.currentItem}):e(a.options.items,a.element),a]),this.containers.push(a));for(i=d.length-1;i>=0;i--)for(o=d[i][1],r=d[i][0],s=0,l=r.length;l>s;s++)h=e(r[s]),h.data(this.widgetName+"-item",o),u.push({item:h,instance:o,width:0,height:0,left:0,top:0})},refreshPositions:function(t){this.floating=this.items.length?"x"===this.options.axis||this._isFloating(this.items[0].item):!1,this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());var i,s,n,a;for(i=this.items.length-1;i>=0;i--)s=this.items[i],s.instance!==this.currentContainer&&this.currentContainer&&s.item[0]!==this.currentItem[0]||(n=this.options.toleranceElement?e(this.options.toleranceElement,s.item):s.item,t||(s.width=n.outerWidth(),s.height=n.outerHeight()),a=n.offset(),s.left=a.left,s.top=a.top);if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(i=this.containers.length-1;i>=0;i--)a=this.containers[i].element.offset(),this.containers[i].containerCache.left=a.left,this.containers[i].containerCache.top=a.top,this.containers[i].containerCache.width=this.containers[i].element.outerWidth(),this.containers[i].containerCache.height=this.containers[i].element.outerHeight();return this},_createPlaceholder:function(t){t=t||this;var i,s=t.options;s.placeholder&&s.placeholder.constructor!==String||(i=s.placeholder,s.placeholder={element:function(){var s=t.currentItem[0].nodeName.toLowerCase(),n=e("<"+s+">",t.document[0]).addClass(i||t.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper");return"tbody"===s?t._createTrPlaceholder(t.currentItem.find("tr").eq(0),e("<tr>",t.document[0]).appendTo(n)):"tr"===s?t._createTrPlaceholder(t.currentItem,n):"img"===s&&n.attr("src",t.currentItem.attr("src")),i||n.css("visibility","hidden"),n},update:function(e,n){(!i||s.forcePlaceholderSize)&&(n.height()||n.height(t.currentItem.innerHeight()-parseInt(t.currentItem.css("paddingTop")||0,10)-parseInt(t.currentItem.css("paddingBottom")||0,10)),n.width()||n.width(t.currentItem.innerWidth()-parseInt(t.currentItem.css("paddingLeft")||0,10)-parseInt(t.currentItem.css("paddingRight")||0,10)))}}),t.placeholder=e(s.placeholder.element.call(t.element,t.currentItem)),t.currentItem.after(t.placeholder),s.placeholder.update(t,t.placeholder)},_createTrPlaceholder:function(t,i){var s=this;t.children().each(function(){e("<td>&#160;</td>",s.document[0]).attr("colspan",e(this).attr("colspan")||1).appendTo(i)})},_contactContainers:function(t){var i,s,n,a,o,r,h,l,u,d,c=null,p=null;for(i=this.containers.length-1;i>=0;i--)if(!e.contains(this.currentItem[0],this.containers[i].element[0]))if(this._intersectsWith(this.containers[i].containerCache)){if(c&&e.contains(this.containers[i].element[0],c.element[0]))continue;c=this.containers[i],p=i}else this.containers[i].containerCache.over&&(this.containers[i]._trigger("out",t,this._uiHash(this)),this.containers[i].containerCache.over=0);if(c)if(1===this.containers.length)this.containers[p].containerCache.over||(this.containers[p]._trigger("over",t,this._uiHash(this)),this.containers[p].containerCache.over=1);else{for(n=1e4,a=null,u=c.floating||this._isFloating(this.currentItem),o=u?"left":"top",r=u?"width":"height",d=u?"clientX":"clientY",s=this.items.length-1;s>=0;s--)e.contains(this.containers[p].element[0],this.items[s].item[0])&&this.items[s].item[0]!==this.currentItem[0]&&(h=this.items[s].item.offset()[o],l=!1,t[d]-h>this.items[s][r]/2&&(l=!0),n>Math.abs(t[d]-h)&&(n=Math.abs(t[d]-h),a=this.items[s],this.direction=l?"up":"down"));if(!a&&!this.options.dropOnEmpty)return;if(this.currentContainer===this.containers[p])return this.currentContainer.containerCache.over||(this.containers[p]._trigger("over",t,this._uiHash()),this.currentContainer.containerCache.over=1),void 0;a?this._rearrange(t,a,null,!0):this._rearrange(t,null,this.containers[p].element,!0),this._trigger("change",t,this._uiHash()),this.containers[p]._trigger("change",t,this._uiHash(this)),this.currentContainer=this.containers[p],this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[p]._trigger("over",t,this._uiHash(this)),this.containers[p].containerCache.over=1}},_createHelper:function(t){var i=this.options,s=e.isFunction(i.helper)?e(i.helper.apply(this.element[0],[t,this.currentItem])):"clone"===i.helper?this.currentItem.clone():this.currentItem;return s.parents("body").length||e("parent"!==i.appendTo?i.appendTo:this.currentItem[0].parentNode)[0].appendChild(s[0]),s[0]===this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(!s[0].style.width||i.forceHelperSize)&&s.width(this.currentItem.width()),(!s[0].style.height||i.forceHelperSize)&&s.height(this.currentItem.height()),s},_adjustOffsetFromHelper:function(t){"string"==typeof t&&(t=t.split(" ")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var t=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==this.document[0]&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===this.document[0].body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&e.ui.ie)&&(t={top:0,left:0}),{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var e=this.currentItem.position();return{top:e.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:e.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t,i,s,n=this.options;"parent"===n.containment&&(n.containment=this.helper[0].parentNode),("document"===n.containment||"window"===n.containment)&&(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,"document"===n.containment?this.document.width():this.window.width()-this.helperProportions.width-this.margins.left,("document"===n.containment?this.document.width():this.window.height()||this.document[0].body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),/^(document|window|parent)$/.test(n.containment)||(t=e(n.containment)[0],i=e(n.containment).offset(),s="hidden"!==e(t).css("overflow"),this.containment=[i.left+(parseInt(e(t).css("borderLeftWidth"),10)||0)+(parseInt(e(t).css("paddingLeft"),10)||0)-this.margins.left,i.top+(parseInt(e(t).css("borderTopWidth"),10)||0)+(parseInt(e(t).css("paddingTop"),10)||0)-this.margins.top,i.left+(s?Math.max(t.scrollWidth,t.offsetWidth):t.offsetWidth)-(parseInt(e(t).css("borderLeftWidth"),10)||0)-(parseInt(e(t).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,i.top+(s?Math.max(t.scrollHeight,t.offsetHeight):t.offsetHeight)-(parseInt(e(t).css("borderTopWidth"),10)||0)-(parseInt(e(t).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top])},_convertPositionTo:function(t,i){i||(i=this.position);var s="absolute"===t?1:-1,n="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,a=/(html|body)/i.test(n[0].tagName);return{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():a?0:n.scrollTop())*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():a?0:n.scrollLeft())*s}},_generatePosition:function(t){var i,s,n=this.options,a=t.pageX,o=t.pageY,r="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,h=/(html|body)/i.test(r[0].tagName);return"relative"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&this.scrollParent[0]!==this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset()),this.originalPosition&&(this.containment&&(t.pageX-this.offset.click.left<this.containment[0]&&(a=this.containment[0]+this.offset.click.left),t.pageY-this.offset.click.top<this.containment[1]&&(o=this.containment[1]+this.offset.click.top),t.pageX-this.offset.click.left>this.containment[2]&&(a=this.containment[2]+this.offset.click.left),t.pageY-this.offset.click.top>this.containment[3]&&(o=this.containment[3]+this.offset.click.top)),n.grid&&(i=this.originalPageY+Math.round((o-this.originalPageY)/n.grid[1])*n.grid[1],o=this.containment?i-this.offset.click.top>=this.containment[1]&&i-this.offset.click.top<=this.containment[3]?i:i-this.offset.click.top>=this.containment[1]?i-n.grid[1]:i+n.grid[1]:i,s=this.originalPageX+Math.round((a-this.originalPageX)/n.grid[0])*n.grid[0],a=this.containment?s-this.offset.click.left>=this.containment[0]&&s-this.offset.click.left<=this.containment[2]?s:s-this.offset.click.left>=this.containment[0]?s-n.grid[0]:s+n.grid[0]:s)),{top:o-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():h?0:r.scrollTop()),left:a-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():h?0:r.scrollLeft())}},_rearrange:function(e,t,i,s){i?i[0].appendChild(this.placeholder[0]):t.item[0].parentNode.insertBefore(this.placeholder[0],"down"===this.direction?t.item[0]:t.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var n=this.counter;this._delay(function(){n===this.counter&&this.refreshPositions(!s)})},_clear:function(e,t){function i(e,t,i){return function(s){i._trigger(e,s,t._uiHash(t))}}this.reverting=!1;var s,n=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(s in this._storedCSS)("auto"===this._storedCSS[s]||"static"===this._storedCSS[s])&&(this._storedCSS[s]="");this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();for(this.fromOutside&&!t&&n.push(function(e){this._trigger("receive",e,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(".ui-sortable-helper")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||t||n.push(function(e){this._trigger("update",e,this._uiHash())}),this!==this.currentContainer&&(t||(n.push(function(e){this._trigger("remove",e,this._uiHash())}),n.push(function(e){return function(t){e._trigger("receive",t,this._uiHash(this))}}.call(this,this.currentContainer)),n.push(function(e){return function(t){e._trigger("update",t,this._uiHash(this))}}.call(this,this.currentContainer)))),s=this.containers.length-1;s>=0;s--)t||n.push(i("deactivate",this,this.containers[s])),this.containers[s].containerCache.over&&(n.push(i("out",this,this.containers[s])),this.containers[s].containerCache.over=0);if(this.storedCursor&&(this.document.find("body").css("cursor",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex","auto"===this._storedZIndex?"":this._storedZIndex),this.dragging=!1,t||this._trigger("beforeStop",e,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.cancelHelperRemoval||(this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null),!t){for(s=0;n.length>s;s++)n[s].call(this,e);this._trigger("stop",e,this._uiHash())}return this.fromOutside=!1,!this.cancelHelperRemoval},_trigger:function(){e.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(t){var i=t||this;return{helper:i.helper,placeholder:i.placeholder||e([]),position:i.position,originalPosition:i.originalPosition,offset:i.positionAbs,item:i.currentItem,sender:t?t.element:null}}}),e.widget("ui.accordion",{version:"1.11.4",options:{active:0,animate:{},collapsible:!1,event:"click",header:"> li > :first-child,> :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},hideProps:{borderTopWidth:"hide",borderBottomWidth:"hide",paddingTop:"hide",paddingBottom:"hide",height:"hide"},showProps:{borderTopWidth:"show",borderBottomWidth:"show",paddingTop:"show",paddingBottom:"show",height:"show"},_create:function(){var t=this.options;this.prevShow=this.prevHide=e(),this.element.addClass("ui-accordion ui-widget ui-helper-reset").attr("role","tablist"),t.collapsible||t.active!==!1&&null!=t.active||(t.active=0),this._processPanels(),0>t.active&&(t.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():e()}},_createIcons:function(){var t=this.options.icons;t&&(e("<span>").addClass("ui-accordion-header-icon ui-icon "+t.header).prependTo(this.headers),this.active.children(".ui-accordion-header-icon").removeClass(t.header).addClass(t.activeHeader),this.headers.addClass("ui-accordion-icons"))},_destroyIcons:function(){this.headers.removeClass("ui-accordion-icons").children(".ui-accordion-header-icon").remove()},_destroy:function(){var e;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role"),this.headers.removeClass("ui-accordion-header ui-accordion-header-active ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("aria-controls").removeAttr("tabIndex").removeUniqueId(),this._destroyIcons(),e=this.headers.next().removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-state-disabled").css("display","").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeUniqueId(),"content"!==this.options.heightStyle&&e.css("height","")},_setOption:function(e,t){return"active"===e?(this._activate(t),void 0):("event"===e&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(t)),this._super(e,t),"collapsible"!==e||t||this.options.active!==!1||this._activate(0),"icons"===e&&(this._destroyIcons(),t&&this._createIcons()),"disabled"===e&&(this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this.headers.add(this.headers.next()).toggleClass("ui-state-disabled",!!t)),void 0)},_keydown:function(t){if(!t.altKey&&!t.ctrlKey){var i=e.ui.keyCode,s=this.headers.length,n=this.headers.index(t.target),a=!1;switch(t.keyCode){case i.RIGHT:case i.DOWN:a=this.headers[(n+1)%s];break;case i.LEFT:case i.UP:a=this.headers[(n-1+s)%s];break;case i.SPACE:case i.ENTER:this._eventHandler(t);break;case i.HOME:a=this.headers[0];break;case i.END:a=this.headers[s-1]}a&&(e(t.target).attr("tabIndex",-1),e(a).attr("tabIndex",0),a.focus(),t.preventDefault())}},_panelKeyDown:function(t){t.keyCode===e.ui.keyCode.UP&&t.ctrlKey&&e(t.currentTarget).prev().focus()},refresh:function(){var t=this.options;this._processPanels(),t.active===!1&&t.collapsible===!0||!this.headers.length?(t.active=!1,this.active=e()):t.active===!1?this._activate(0):this.active.length&&!e.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(t.active=!1,this.active=e()):this._activate(Math.max(0,t.active-1)):t.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){var e=this.headers,t=this.panels;this.headers=this.element.find(this.options.header).addClass("ui-accordion-header ui-state-default ui-corner-all"),this.panels=this.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom").filter(":not(.ui-accordion-content-active)").hide(),t&&(this._off(e.not(this.headers)),this._off(t.not(this.panels)))
-},_refresh:function(){var t,i=this.options,s=i.heightStyle,n=this.element.parent();this.active=this._findActive(i.active).addClass("ui-accordion-header-active ui-state-active ui-corner-top").removeClass("ui-corner-all"),this.active.next().addClass("ui-accordion-content-active").show(),this.headers.attr("role","tab").each(function(){var t=e(this),i=t.uniqueId().attr("id"),s=t.next(),n=s.uniqueId().attr("id");t.attr("aria-controls",n),s.attr("aria-labelledby",i)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}).next().attr({"aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}).next().attr({"aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(i.event),"fill"===s?(t=n.height(),this.element.siblings(":visible").each(function(){var i=e(this),s=i.css("position");"absolute"!==s&&"fixed"!==s&&(t-=i.outerHeight(!0))}),this.headers.each(function(){t-=e(this).outerHeight(!0)}),this.headers.next().each(function(){e(this).height(Math.max(0,t-e(this).innerHeight()+e(this).height()))}).css("overflow","auto")):"auto"===s&&(t=0,this.headers.next().each(function(){t=Math.max(t,e(this).css("height","").height())}).height(t))},_activate:function(t){var i=this._findActive(t)[0];i!==this.active[0]&&(i=i||this.active[0],this._eventHandler({target:i,currentTarget:i,preventDefault:e.noop}))},_findActive:function(t){return"number"==typeof t?this.headers.eq(t):e()},_setupEvents:function(t){var i={keydown:"_keydown"};t&&e.each(t.split(" "),function(e,t){i[t]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(t){var i=this.options,s=this.active,n=e(t.currentTarget),a=n[0]===s[0],o=a&&i.collapsible,r=o?e():n.next(),h=s.next(),l={oldHeader:s,oldPanel:h,newHeader:o?e():n,newPanel:r};t.preventDefault(),a&&!i.collapsible||this._trigger("beforeActivate",t,l)===!1||(i.active=o?!1:this.headers.index(n),this.active=a?e():n,this._toggle(l),s.removeClass("ui-accordion-header-active ui-state-active"),i.icons&&s.children(".ui-accordion-header-icon").removeClass(i.icons.activeHeader).addClass(i.icons.header),a||(n.removeClass("ui-corner-all").addClass("ui-accordion-header-active ui-state-active ui-corner-top"),i.icons&&n.children(".ui-accordion-header-icon").removeClass(i.icons.header).addClass(i.icons.activeHeader),n.next().addClass("ui-accordion-content-active")))},_toggle:function(t){var i=t.newPanel,s=this.prevShow.length?this.prevShow:t.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=i,this.prevHide=s,this.options.animate?this._animate(i,s,t):(s.hide(),i.show(),this._toggleComplete(t)),s.attr({"aria-hidden":"true"}),s.prev().attr({"aria-selected":"false","aria-expanded":"false"}),i.length&&s.length?s.prev().attr({tabIndex:-1,"aria-expanded":"false"}):i.length&&this.headers.filter(function(){return 0===parseInt(e(this).attr("tabIndex"),10)}).attr("tabIndex",-1),i.attr("aria-hidden","false").prev().attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_animate:function(e,t,i){var s,n,a,o=this,r=0,h=e.css("box-sizing"),l=e.length&&(!t.length||e.index()<t.index()),u=this.options.animate||{},d=l&&u.down||u,c=function(){o._toggleComplete(i)};return"number"==typeof d&&(a=d),"string"==typeof d&&(n=d),n=n||d.easing||u.easing,a=a||d.duration||u.duration,t.length?e.length?(s=e.show().outerHeight(),t.animate(this.hideProps,{duration:a,easing:n,step:function(e,t){t.now=Math.round(e)}}),e.hide().animate(this.showProps,{duration:a,easing:n,complete:c,step:function(e,i){i.now=Math.round(e),"height"!==i.prop?"content-box"===h&&(r+=i.now):"content"!==o.options.heightStyle&&(i.now=Math.round(s-t.outerHeight()-r),r=0)}}),void 0):t.animate(this.hideProps,a,n,c):e.animate(this.showProps,a,n,c)},_toggleComplete:function(e){var t=e.oldPanel;t.removeClass("ui-accordion-content-active").prev().removeClass("ui-corner-top").addClass("ui-corner-all"),t.length&&(t.parent()[0].className=t.parent()[0].className),this._trigger("activate",null,e)}}),e.widget("ui.menu",{version:"1.11.4",defaultElement:"<ul>",delay:300,options:{icons:{submenu:"ui-icon-carat-1-e"},items:"> *",menus:"ul",position:{my:"left-1 top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().addClass("ui-menu ui-widget ui-widget-content").toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length).attr({role:this.options.role,tabIndex:0}),this.options.disabled&&this.element.addClass("ui-state-disabled").attr("aria-disabled","true"),this._on({"mousedown .ui-menu-item":function(e){e.preventDefault()},"click .ui-menu-item":function(t){var i=e(t.target);!this.mouseHandled&&i.not(".ui-state-disabled").length&&(this.select(t),t.isPropagationStopped()||(this.mouseHandled=!0),i.has(".ui-menu").length?this.expand(t):!this.element.is(":focus")&&e(this.document[0].activeElement).closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(t){if(!this.previousFilter){var i=e(t.currentTarget);i.siblings(".ui-state-active").removeClass("ui-state-active"),this.focus(t,i)}},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(e,t){var i=this.active||this.element.find(this.options.items).eq(0);t||this.focus(e,i)},blur:function(t){this._delay(function(){e.contains(this.element[0],this.document[0].activeElement)||this.collapseAll(t)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(e){this._closeOnDocumentClick(e)&&this.collapseAll(e),this.mouseHandled=!1}})},_destroy:function(){this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeClass("ui-menu ui-widget ui-widget-content ui-menu-icons ui-front").removeAttr("role").removeAttr("tabIndex").removeAttr("aria-labelledby").removeAttr("aria-expanded").removeAttr("aria-hidden").removeAttr("aria-disabled").removeUniqueId().show(),this.element.find(".ui-menu-item").removeClass("ui-menu-item").removeAttr("role").removeAttr("aria-disabled").removeUniqueId().removeClass("ui-state-hover").removeAttr("tabIndex").removeAttr("role").removeAttr("aria-haspopup").children().each(function(){var t=e(this);t.data("ui-menu-submenu-carat")&&t.remove()}),this.element.find(".ui-menu-divider").removeClass("ui-menu-divider ui-widget-content")},_keydown:function(t){var i,s,n,a,o=!0;switch(t.keyCode){case e.ui.keyCode.PAGE_UP:this.previousPage(t);break;case e.ui.keyCode.PAGE_DOWN:this.nextPage(t);break;case e.ui.keyCode.HOME:this._move("first","first",t);break;case e.ui.keyCode.END:this._move("last","last",t);break;case e.ui.keyCode.UP:this.previous(t);break;case e.ui.keyCode.DOWN:this.next(t);break;case e.ui.keyCode.LEFT:this.collapse(t);break;case e.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(t);break;case e.ui.keyCode.ENTER:case e.ui.keyCode.SPACE:this._activate(t);break;case e.ui.keyCode.ESCAPE:this.collapse(t);break;default:o=!1,s=this.previousFilter||"",n=String.fromCharCode(t.keyCode),a=!1,clearTimeout(this.filterTimer),n===s?a=!0:n=s+n,i=this._filterMenuItems(n),i=a&&-1!==i.index(this.active.next())?this.active.nextAll(".ui-menu-item"):i,i.length||(n=String.fromCharCode(t.keyCode),i=this._filterMenuItems(n)),i.length?(this.focus(t,i),this.previousFilter=n,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}o&&t.preventDefault()},_activate:function(e){this.active.is(".ui-state-disabled")||(this.active.is("[aria-haspopup='true']")?this.expand(e):this.select(e))},refresh:function(){var t,i,s=this,n=this.options.icons.submenu,a=this.element.find(this.options.menus);this.element.toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length),a.filter(":not(.ui-menu)").addClass("ui-menu ui-widget ui-widget-content ui-front").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var t=e(this),i=t.parent(),s=e("<span>").addClass("ui-menu-icon ui-icon "+n).data("ui-menu-submenu-carat",!0);i.attr("aria-haspopup","true").prepend(s),t.attr("aria-labelledby",i.attr("id"))}),t=a.add(this.element),i=t.find(this.options.items),i.not(".ui-menu-item").each(function(){var t=e(this);s._isDivider(t)&&t.addClass("ui-widget-content ui-menu-divider")}),i.not(".ui-menu-item, .ui-menu-divider").addClass("ui-menu-item").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),i.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!e.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(e,t){"icons"===e&&this.element.find(".ui-menu-icon").removeClass(this.options.icons.submenu).addClass(t.submenu),"disabled"===e&&this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this._super(e,t)},focus:function(e,t){var i,s;this.blur(e,e&&"focus"===e.type),this._scrollIntoView(t),this.active=t.first(),s=this.active.addClass("ui-state-focus").removeClass("ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",s.attr("id")),this.active.parent().closest(".ui-menu-item").addClass("ui-state-active"),e&&"keydown"===e.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=t.children(".ui-menu"),i.length&&e&&/^mouse/.test(e.type)&&this._startOpening(i),this.activeMenu=t.parent(),this._trigger("focus",e,{item:t})},_scrollIntoView:function(t){var i,s,n,a,o,r;this._hasScroll()&&(i=parseFloat(e.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(e.css(this.activeMenu[0],"paddingTop"))||0,n=t.offset().top-this.activeMenu.offset().top-i-s,a=this.activeMenu.scrollTop(),o=this.activeMenu.height(),r=t.outerHeight(),0>n?this.activeMenu.scrollTop(a+n):n+r>o&&this.activeMenu.scrollTop(a+n-o+r))},blur:function(e,t){t||clearTimeout(this.timer),this.active&&(this.active.removeClass("ui-state-focus"),this.active=null,this._trigger("blur",e,{item:this.active}))},_startOpening:function(e){clearTimeout(this.timer),"true"===e.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(e)},this.delay))},_open:function(t){var i=e.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(t.parents(".ui-menu")).hide().attr("aria-hidden","true"),t.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(i)},collapseAll:function(t,i){clearTimeout(this.timer),this.timer=this._delay(function(){var s=i?this.element:e(t&&t.target).closest(this.element.find(".ui-menu"));s.length||(s=this.element),this._close(s),this.blur(t),this.activeMenu=s},this.delay)},_close:function(e){e||(e=this.active?this.active.parent():this.element),e.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false").end().find(".ui-state-active").not(".ui-state-focus").removeClass("ui-state-active")},_closeOnDocumentClick:function(t){return!e(t.target).closest(".ui-menu").length},_isDivider:function(e){return!/[^\-\u2014\u2013\s]/.test(e.text())},collapse:function(e){var t=this.active&&this.active.parent().closest(".ui-menu-item",this.element);t&&t.length&&(this._close(),this.focus(e,t))},expand:function(e){var t=this.active&&this.active.children(".ui-menu ").find(this.options.items).first();t&&t.length&&(this._open(t.parent()),this._delay(function(){this.focus(e,t)}))},next:function(e){this._move("next","first",e)},previous:function(e){this._move("prev","last",e)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(e,t,i){var s;this.active&&(s="first"===e||"last"===e?this.active["first"===e?"prevAll":"nextAll"](".ui-menu-item").eq(-1):this.active[e+"All"](".ui-menu-item").eq(0)),s&&s.length&&this.active||(s=this.activeMenu.find(this.options.items)[t]()),this.focus(i,s)},nextPage:function(t){var i,s,n;return this.active?(this.isLastItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return i=e(this),0>i.offset().top-s-n}),this.focus(t,i)):this.focus(t,this.activeMenu.find(this.options.items)[this.active?"last":"first"]())),void 0):(this.next(t),void 0)},previousPage:function(t){var i,s,n;return this.active?(this.isFirstItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return i=e(this),i.offset().top-s+n>0}),this.focus(t,i)):this.focus(t,this.activeMenu.find(this.options.items).first())),void 0):(this.next(t),void 0)},_hasScroll:function(){return this.element.outerHeight()<this.element.prop("scrollHeight")},select:function(t){this.active=this.active||e(t.target).closest(".ui-menu-item");var i={item:this.active};this.active.has(".ui-menu").length||this.collapseAll(t,!0),this._trigger("select",t,i)},_filterMenuItems:function(t){var i=t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&"),s=RegExp("^"+i,"i");return this.activeMenu.find(this.options.items).filter(".ui-menu-item").filter(function(){return s.test(e.trim(e(this).text()))})}}),e.widget("ui.autocomplete",{version:"1.11.4",defaultElement:"<input>",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,_create:function(){var t,i,s,n=this.element[0].nodeName.toLowerCase(),a="textarea"===n,o="input"===n;this.isMultiLine=a?!0:o?!1:this.element.prop("isContentEditable"),this.valueMethod=this.element[a||o?"val":"text"],this.isNewMenu=!0,this.element.addClass("ui-autocomplete-input").attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return t=!0,s=!0,i=!0,void 0;t=!1,s=!1,i=!1;var a=e.ui.keyCode;switch(n.keyCode){case a.PAGE_UP:t=!0,this._move("previousPage",n);break;case a.PAGE_DOWN:t=!0,this._move("nextPage",n);break;case a.UP:t=!0,this._keyEvent("previous",n);break;case a.DOWN:t=!0,this._keyEvent("next",n);break;case a.ENTER:this.menu.active&&(t=!0,n.preventDefault(),this.menu.select(n));break;case a.TAB:this.menu.active&&this.menu.select(n);break;case a.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(t)return t=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),void 0;if(!i){var n=e.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(e){return s?(s=!1,e.preventDefault(),void 0):(this._searchTimeout(e),void 0)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(e){return this.cancelBlur?(delete this.cancelBlur,void 0):(clearTimeout(this.searching),this.close(e),this._change(e),void 0)}}),this._initSource(),this.menu=e("<ul>").addClass("ui-autocomplete ui-front").appendTo(this._appendTo()).menu({role:null}).hide().menu("instance"),this._on(this.menu.element,{mousedown:function(t){t.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur});var i=this.menu.element[0];e(t.target).closest(".ui-menu-item").length||this._delay(function(){var t=this;this.document.one("mousedown",function(s){s.target===t.element[0]||s.target===i||e.contains(i,s.target)||t.close()})})},menufocus:function(t,i){var s,n;return this.isNewMenu&&(this.isNewMenu=!1,t.originalEvent&&/^mouse/.test(t.originalEvent.type))?(this.menu.blur(),this.document.one("mousemove",function(){e(t.target).trigger(t.originalEvent)}),void 0):(n=i.item.data("ui-autocomplete-item"),!1!==this._trigger("focus",t,{item:n})&&t.originalEvent&&/^key/.test(t.originalEvent.type)&&this._value(n.value),s=i.item.attr("aria-label")||n.value,s&&e.trim(s).length&&(this.liveRegion.children().hide(),e("<div>").text(s).appendTo(this.liveRegion)),void 0)},menuselect:function(e,t){var i=t.item.data("ui-autocomplete-item"),s=this.previous;this.element[0]!==this.document[0].activeElement&&(this.element.focus(),this.previous=s,this._delay(function(){this.previous=s,this.selectedItem=i})),!1!==this._trigger("select",e,{item:i})&&this._value(i.value),this.term=this._value(),this.close(e),this.selectedItem=i}}),this.liveRegion=e("<span>",{role:"status","aria-live":"assertive","aria-relevant":"additions"}).addClass("ui-helper-hidden-accessible").appendTo(this.document[0].body),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(e,t){this._super(e,t),"source"===e&&this._initSource(),"appendTo"===e&&this.menu.element.appendTo(this._appendTo()),"disabled"===e&&t&&this.xhr&&this.xhr.abort()},_appendTo:function(){var t=this.options.appendTo;return t&&(t=t.jquery||t.nodeType?e(t):this.document.find(t).eq(0)),t&&t[0]||(t=this.element.closest(".ui-front")),t.length||(t=this.document[0].body),t},_initSource:function(){var t,i,s=this;e.isArray(this.options.source)?(t=this.options.source,this.source=function(i,s){s(e.ui.autocomplete.filter(t,i.term))}):"string"==typeof this.options.source?(i=this.options.source,this.source=function(t,n){s.xhr&&s.xhr.abort(),s.xhr=e.ajax({url:i,data:t,dataType:"json",success:function(e){n(e)},error:function(){n([])}})}):this.source=this.options.source},_searchTimeout:function(e){clearTimeout(this.searching),this.searching=this._delay(function(){var t=this.term===this._value(),i=this.menu.element.is(":visible"),s=e.altKey||e.ctrlKey||e.metaKey||e.shiftKey;(!t||t&&!i&&!s)&&(this.selectedItem=null,this.search(null,e))},this.options.delay)},search:function(e,t){return e=null!=e?e:this._value(),this.term=this._value(),e.length<this.options.minLength?this.close(t):this._trigger("search",t)!==!1?this._search(e):void 0},_search:function(e){this.pending++,this.element.addClass("ui-autocomplete-loading"),this.cancelSearch=!1,this.source({term:e},this._response())},_response:function(){var t=++this.requestIndex;return e.proxy(function(e){t===this.requestIndex&&this.__response(e),this.pending--,this.pending||this.element.removeClass("ui-autocomplete-loading")},this)},__response:function(e){e&&(e=this._normalize(e)),this._trigger("response",null,{content:e}),!this.options.disabled&&e&&e.length&&!this.cancelSearch?(this._suggest(e),this._trigger("open")):this._close()},close:function(e){this.cancelSearch=!0,this._close(e)},_close:function(e){this.menu.element.is(":visible")&&(this.menu.element.hide(),this.menu.blur(),this.isNewMenu=!0,this._trigger("close",e))},_change:function(e){this.previous!==this._value()&&this._trigger("change",e,{item:this.selectedItem})},_normalize:function(t){return t.length&&t[0].label&&t[0].value?t:e.map(t,function(t){return"string"==typeof t?{label:t,value:t}:e.extend({},t,{label:t.label||t.value,value:t.value||t.label})})},_suggest:function(t){var i=this.menu.element.empty();this._renderMenu(i,t),this.isNewMenu=!0,this.menu.refresh(),i.show(),this._resizeMenu(),i.position(e.extend({of:this.element},this.options.position)),this.options.autoFocus&&this.menu.next()},_resizeMenu:function(){var e=this.menu.element;e.outerWidth(Math.max(e.width("").outerWidth()+1,this.element.outerWidth()))},_renderMenu:function(t,i){var s=this;e.each(i,function(e,i){s._renderItemData(t,i)})},_renderItemData:function(e,t){return this._renderItem(e,t).data("ui-autocomplete-item",t)},_renderItem:function(t,i){return e("<li>").text(i.label).appendTo(t)},_move:function(e,t){return this.menu.element.is(":visible")?this.menu.isFirstItem()&&/^previous/.test(e)||this.menu.isLastItem()&&/^next/.test(e)?(this.isMultiLine||this._value(this.term),this.menu.blur(),void 0):(this.menu[e](t),void 0):(this.search(null,t),void 0)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(e,t){(!this.isMultiLine||this.menu.element.is(":visible"))&&(this._move(e,t),t.preventDefault())}}),e.extend(e.ui.autocomplete,{escapeRegex:function(e){return e.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(t,i){var s=RegExp(e.ui.autocomplete.escapeRegex(i),"i");return e.grep(t,function(e){return s.test(e.label||e.value||e)})}}),e.widget("ui.autocomplete",e.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(e){return e+(e>1?" results are":" result is")+" available, use up and down arrow keys to navigate."}}},__response:function(t){var i;this._superApply(arguments),this.options.disabled||this.cancelSearch||(i=t&&t.length?this.options.messages.results(t.length):this.options.messages.noResults,this.liveRegion.children().hide(),e("<div>").text(i).appendTo(this.liveRegion))}}),e.ui.autocomplete;var c,p="ui-button ui-widget ui-state-default ui-corner-all",f="ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",m=function(){var t=e(this);setTimeout(function(){t.find(":ui-button").button("refresh")},1)},g=function(t){var i=t.name,s=t.form,n=e([]);return i&&(i=i.replace(/'/g,"\\'"),n=s?e(s).find("[name='"+i+"'][type=radio]"):e("[name='"+i+"'][type=radio]",t.ownerDocument).filter(function(){return!this.form})),n};e.widget("ui.button",{version:"1.11.4",defaultElement:"<button>",options:{disabled:null,text:!0,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset"+this.eventNamespace).bind("reset"+this.eventNamespace,m),"boolean"!=typeof this.options.disabled?this.options.disabled=!!this.element.prop("disabled"):this.element.prop("disabled",this.options.disabled),this._determineButtonType(),this.hasTitle=!!this.buttonElement.attr("title");var t=this,i=this.options,s="checkbox"===this.type||"radio"===this.type,n=s?"":"ui-state-active";null===i.label&&(i.label="input"===this.type?this.buttonElement.val():this.buttonElement.html()),this._hoverable(this.buttonElement),this.buttonElement.addClass(p).attr("role","button").bind("mouseenter"+this.eventNamespace,function(){i.disabled||this===c&&e(this).addClass("ui-state-active")}).bind("mouseleave"+this.eventNamespace,function(){i.disabled||e(this).removeClass(n)}).bind("click"+this.eventNamespace,function(e){i.disabled&&(e.preventDefault(),e.stopImmediatePropagation())}),this._on({focus:function(){this.buttonElement.addClass("ui-state-focus")},blur:function(){this.buttonElement.removeClass("ui-state-focus")}}),s&&this.element.bind("change"+this.eventNamespace,function(){t.refresh()}),"checkbox"===this.type?this.buttonElement.bind("click"+this.eventNamespace,function(){return i.disabled?!1:void 0}):"radio"===this.type?this.buttonElement.bind("click"+this.eventNamespace,function(){if(i.disabled)return!1;e(this).addClass("ui-state-active"),t.buttonElement.attr("aria-pressed","true");var s=t.element[0];g(s).not(s).map(function(){return e(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed","false")}):(this.buttonElement.bind("mousedown"+this.eventNamespace,function(){return i.disabled?!1:(e(this).addClass("ui-state-active"),c=this,t.document.one("mouseup",function(){c=null}),void 0)}).bind("mouseup"+this.eventNamespace,function(){return i.disabled?!1:(e(this).removeClass("ui-state-active"),void 0)}).bind("keydown"+this.eventNamespace,function(t){return i.disabled?!1:((t.keyCode===e.ui.keyCode.SPACE||t.keyCode===e.ui.keyCode.ENTER)&&e(this).addClass("ui-state-active"),void 0)}).bind("keyup"+this.eventNamespace+" blur"+this.eventNamespace,function(){e(this).removeClass("ui-state-active")}),this.buttonElement.is("a")&&this.buttonElement.keyup(function(t){t.keyCode===e.ui.keyCode.SPACE&&e(this).click()})),this._setOption("disabled",i.disabled),this._resetButton()},_determineButtonType:function(){var e,t,i;this.type=this.element.is("[type=checkbox]")?"checkbox":this.element.is("[type=radio]")?"radio":this.element.is("input")?"input":"button","checkbox"===this.type||"radio"===this.type?(e=this.element.parents().last(),t="label[for='"+this.element.attr("id")+"']",this.buttonElement=e.find(t),this.buttonElement.length||(e=e.length?e.siblings():this.element.siblings(),this.buttonElement=e.filter(t),this.buttonElement.length||(this.buttonElement=e.find(t))),this.element.addClass("ui-helper-hidden-accessible"),i=this.element.is(":checked"),i&&this.buttonElement.addClass("ui-state-active"),this.buttonElement.prop("aria-pressed",i)):this.buttonElement=this.element},widget:function(){return this.buttonElement},_destroy:function(){this.element.removeClass("ui-helper-hidden-accessible"),this.buttonElement.removeClass(p+" ui-state-active "+f).removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html()),this.hasTitle||this.buttonElement.removeAttr("title")},_setOption:function(e,t){return this._super(e,t),"disabled"===e?(this.widget().toggleClass("ui-state-disabled",!!t),this.element.prop("disabled",!!t),t&&("checkbox"===this.type||"radio"===this.type?this.buttonElement.removeClass("ui-state-focus"):this.buttonElement.removeClass("ui-state-focus ui-state-active")),void 0):(this._resetButton(),void 0)},refresh:function(){var t=this.element.is("input, button")?this.element.is(":disabled"):this.element.hasClass("ui-button-disabled");t!==this.options.disabled&&this._setOption("disabled",t),"radio"===this.type?g(this.element[0]).each(function(){e(this).is(":checked")?e(this).button("widget").addClass("ui-state-active").attr("aria-pressed","true"):e(this).button("widget").removeClass("ui-state-active").attr("aria-pressed","false")}):"checkbox"===this.type&&(this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed","true"):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed","false"))},_resetButton:function(){if("input"===this.type)return this.options.label&&this.element.val(this.options.label),void 0;var t=this.buttonElement.removeClass(f),i=e("<span></span>",this.document[0]).addClass("ui-button-text").html(this.options.label).appendTo(t.empty()).text(),s=this.options.icons,n=s.primary&&s.secondary,a=[];s.primary||s.secondary?(this.options.text&&a.push("ui-button-text-icon"+(n?"s":s.primary?"-primary":"-secondary")),s.primary&&t.prepend("<span class='ui-button-icon-primary ui-icon "+s.primary+"'></span>"),s.secondary&&t.append("<span class='ui-button-icon-secondary ui-icon "+s.secondary+"'></span>"),this.options.text||(a.push(n?"ui-button-icons-only":"ui-button-icon-only"),this.hasTitle||t.attr("title",e.trim(i)))):a.push("ui-button-text-only"),t.addClass(a.join(" "))}}),e.widget("ui.buttonset",{version:"1.11.4",options:{items:"button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(ui-button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(e,t){"disabled"===e&&this.buttons.button("option",e,t),this._super(e,t)},refresh:function(){var t="rtl"===this.element.css("direction"),i=this.element.find(this.options.items),s=i.filter(":ui-button");i.not(":ui-button").button(),s.button("refresh"),this.buttons=i.map(function(){return e(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass(t?"ui-corner-right":"ui-corner-left").end().filter(":last").addClass(t?"ui-corner-left":"ui-corner-right").end().end()},_destroy:function(){this.element.removeClass("ui-buttonset"),this.buttons.map(function(){return e(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy")}}),e.ui.button,e.extend(e.ui,{datepicker:{version:"1.11.4"}});var v;e.extend(n.prototype,{markerClassName:"hasDatepicker",maxRows:4,_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(e){return r(this._defaults,e||{}),this},_attachDatepicker:function(t,i){var s,n,a;s=t.nodeName.toLowerCase(),n="div"===s||"span"===s,t.id||(this.uuid+=1,t.id="dp"+this.uuid),a=this._newInst(e(t),n),a.settings=e.extend({},i||{}),"input"===s?this._connectDatepicker(t,a):n&&this._inlineDatepicker(t,a)},_newInst:function(t,i){var s=t[0].id.replace(/([^A-Za-z0-9_\-])/g,"\\\\$1");return{id:s,input:t,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:i,dpDiv:i?a(e("<div class='"+this._inlineClass+" ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")):this.dpDiv}},_connectDatepicker:function(t,i){var s=e(t);i.append=e([]),i.trigger=e([]),s.hasClass(this.markerClassName)||(this._attachments(s,i),s.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp),this._autoSize(i),e.data(t,"datepicker",i),i.settings.disabled&&this._disableDatepicker(t))},_attachments:function(t,i){var s,n,a,o=this._get(i,"appendText"),r=this._get(i,"isRTL");i.append&&i.append.remove(),o&&(i.append=e("<span class='"+this._appendClass+"'>"+o+"</span>"),t[r?"before":"after"](i.append)),t.unbind("focus",this._showDatepicker),i.trigger&&i.trigger.remove(),s=this._get(i,"showOn"),("focus"===s||"both"===s)&&t.focus(this._showDatepicker),("button"===s||"both"===s)&&(n=this._get(i,"buttonText"),a=this._get(i,"buttonImage"),i.trigger=e(this._get(i,"buttonImageOnly")?e("<img/>").addClass(this._triggerClass).attr({src:a,alt:n,title:n}):e("<button type='button'></button>").addClass(this._triggerClass).html(a?e("<img/>").attr({src:a,alt:n,title:n}):n)),t[r?"before":"after"](i.trigger),i.trigger.click(function(){return e.datepicker._datepickerShowing&&e.datepicker._lastInput===t[0]?e.datepicker._hideDatepicker():e.datepicker._datepickerShowing&&e.datepicker._lastInput!==t[0]?(e.datepicker._hideDatepicker(),e.datepicker._showDatepicker(t[0])):e.datepicker._showDatepicker(t[0]),!1}))},_autoSize:function(e){if(this._get(e,"autoSize")&&!e.inline){var t,i,s,n,a=new Date(2009,11,20),o=this._get(e,"dateFormat");o.match(/[DM]/)&&(t=function(e){for(i=0,s=0,n=0;e.length>n;n++)e[n].length>i&&(i=e[n].length,s=n);return s},a.setMonth(t(this._get(e,o.match(/MM/)?"monthNames":"monthNamesShort"))),a.setDate(t(this._get(e,o.match(/DD/)?"dayNames":"dayNamesShort"))+20-a.getDay())),e.input.attr("size",this._formatDate(e,a).length)}},_inlineDatepicker:function(t,i){var s=e(t);s.hasClass(this.markerClassName)||(s.addClass(this.markerClassName).append(i.dpDiv),e.data(t,"datepicker",i),this._setDate(i,this._getDefaultDate(i),!0),this._updateDatepicker(i),this._updateAlternate(i),i.settings.disabled&&this._disableDatepicker(t),i.dpDiv.css("display","block"))},_dialogDatepicker:function(t,i,s,n,a){var o,h,l,u,d,c=this._dialogInst;return c||(this.uuid+=1,o="dp"+this.uuid,this._dialogInput=e("<input type='text' id='"+o+"' style='position: absolute; top: -100px; width: 0px;'/>"),this._dialogInput.keydown(this._doKeyDown),e("body").append(this._dialogInput),c=this._dialogInst=this._newInst(this._dialogInput,!1),c.settings={},e.data(this._dialogInput[0],"datepicker",c)),r(c.settings,n||{}),i=i&&i.constructor===Date?this._formatDate(c,i):i,this._dialogInput.val(i),this._pos=a?a.length?a:[a.pageX,a.pageY]:null,this._pos||(h=document.documentElement.clientWidth,l=document.documentElement.clientHeight,u=document.documentElement.scrollLeft||document.body.scrollLeft,d=document.documentElement.scrollTop||document.body.scrollTop,this._pos=[h/2-100+u,l/2-150+d]),this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),c.settings.onSelect=s,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),e.blockUI&&e.blockUI(this.dpDiv),e.data(this._dialogInput[0],"datepicker",c),this
-},_destroyDatepicker:function(t){var i,s=e(t),n=e.data(t,"datepicker");s.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),e.removeData(t,"datepicker"),"input"===i?(n.append.remove(),n.trigger.remove(),s.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)):("div"===i||"span"===i)&&s.removeClass(this.markerClassName).empty(),v===n&&(v=null))},_enableDatepicker:function(t){var i,s,n=e(t),a=e.data(t,"datepicker");n.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),"input"===i?(t.disabled=!1,a.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().removeClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!1)),this._disabledInputs=e.map(this._disabledInputs,function(e){return e===t?null:e}))},_disableDatepicker:function(t){var i,s,n=e(t),a=e.data(t,"datepicker");n.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),"input"===i?(t.disabled=!0,a.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().addClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!0)),this._disabledInputs=e.map(this._disabledInputs,function(e){return e===t?null:e}),this._disabledInputs[this._disabledInputs.length]=t)},_isDisabledDatepicker:function(e){if(!e)return!1;for(var t=0;this._disabledInputs.length>t;t++)if(this._disabledInputs[t]===e)return!0;return!1},_getInst:function(t){try{return e.data(t,"datepicker")}catch(i){throw"Missing instance data for this datepicker"}},_optionDatepicker:function(t,i,s){var n,a,o,h,l=this._getInst(t);return 2===arguments.length&&"string"==typeof i?"defaults"===i?e.extend({},e.datepicker._defaults):l?"all"===i?e.extend({},l.settings):this._get(l,i):null:(n=i||{},"string"==typeof i&&(n={},n[i]=s),l&&(this._curInst===l&&this._hideDatepicker(),a=this._getDateDatepicker(t,!0),o=this._getMinMaxDate(l,"min"),h=this._getMinMaxDate(l,"max"),r(l.settings,n),null!==o&&void 0!==n.dateFormat&&void 0===n.minDate&&(l.settings.minDate=this._formatDate(l,o)),null!==h&&void 0!==n.dateFormat&&void 0===n.maxDate&&(l.settings.maxDate=this._formatDate(l,h)),"disabled"in n&&(n.disabled?this._disableDatepicker(t):this._enableDatepicker(t)),this._attachments(e(t),l),this._autoSize(l),this._setDate(l,a),this._updateAlternate(l),this._updateDatepicker(l)),void 0)},_changeDatepicker:function(e,t,i){this._optionDatepicker(e,t,i)},_refreshDatepicker:function(e){var t=this._getInst(e);t&&this._updateDatepicker(t)},_setDateDatepicker:function(e,t){var i=this._getInst(e);i&&(this._setDate(i,t),this._updateDatepicker(i),this._updateAlternate(i))},_getDateDatepicker:function(e,t){var i=this._getInst(e);return i&&!i.inline&&this._setDateFromField(i,t),i?this._getDate(i):null},_doKeyDown:function(t){var i,s,n,a=e.datepicker._getInst(t.target),o=!0,r=a.dpDiv.is(".ui-datepicker-rtl");if(a._keyEvent=!0,e.datepicker._datepickerShowing)switch(t.keyCode){case 9:e.datepicker._hideDatepicker(),o=!1;break;case 13:return n=e("td."+e.datepicker._dayOverClass+":not(."+e.datepicker._currentClass+")",a.dpDiv),n[0]&&e.datepicker._selectDay(t.target,a.selectedMonth,a.selectedYear,n[0]),i=e.datepicker._get(a,"onSelect"),i?(s=e.datepicker._formatDate(a),i.apply(a.input?a.input[0]:null,[s,a])):e.datepicker._hideDatepicker(),!1;case 27:e.datepicker._hideDatepicker();break;case 33:e.datepicker._adjustDate(t.target,t.ctrlKey?-e.datepicker._get(a,"stepBigMonths"):-e.datepicker._get(a,"stepMonths"),"M");break;case 34:e.datepicker._adjustDate(t.target,t.ctrlKey?+e.datepicker._get(a,"stepBigMonths"):+e.datepicker._get(a,"stepMonths"),"M");break;case 35:(t.ctrlKey||t.metaKey)&&e.datepicker._clearDate(t.target),o=t.ctrlKey||t.metaKey;break;case 36:(t.ctrlKey||t.metaKey)&&e.datepicker._gotoToday(t.target),o=t.ctrlKey||t.metaKey;break;case 37:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,r?1:-1,"D"),o=t.ctrlKey||t.metaKey,t.originalEvent.altKey&&e.datepicker._adjustDate(t.target,t.ctrlKey?-e.datepicker._get(a,"stepBigMonths"):-e.datepicker._get(a,"stepMonths"),"M");break;case 38:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,-7,"D"),o=t.ctrlKey||t.metaKey;break;case 39:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,r?-1:1,"D"),o=t.ctrlKey||t.metaKey,t.originalEvent.altKey&&e.datepicker._adjustDate(t.target,t.ctrlKey?+e.datepicker._get(a,"stepBigMonths"):+e.datepicker._get(a,"stepMonths"),"M");break;case 40:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,7,"D"),o=t.ctrlKey||t.metaKey;break;default:o=!1}else 36===t.keyCode&&t.ctrlKey?e.datepicker._showDatepicker(this):o=!1;o&&(t.preventDefault(),t.stopPropagation())},_doKeyPress:function(t){var i,s,n=e.datepicker._getInst(t.target);return e.datepicker._get(n,"constrainInput")?(i=e.datepicker._possibleChars(e.datepicker._get(n,"dateFormat")),s=String.fromCharCode(null==t.charCode?t.keyCode:t.charCode),t.ctrlKey||t.metaKey||" ">s||!i||i.indexOf(s)>-1):void 0},_doKeyUp:function(t){var i,s=e.datepicker._getInst(t.target);if(s.input.val()!==s.lastVal)try{i=e.datepicker.parseDate(e.datepicker._get(s,"dateFormat"),s.input?s.input.val():null,e.datepicker._getFormatConfig(s)),i&&(e.datepicker._setDateFromField(s),e.datepicker._updateAlternate(s),e.datepicker._updateDatepicker(s))}catch(n){}return!0},_showDatepicker:function(t){if(t=t.target||t,"input"!==t.nodeName.toLowerCase()&&(t=e("input",t.parentNode)[0]),!e.datepicker._isDisabledDatepicker(t)&&e.datepicker._lastInput!==t){var i,n,a,o,h,l,u;i=e.datepicker._getInst(t),e.datepicker._curInst&&e.datepicker._curInst!==i&&(e.datepicker._curInst.dpDiv.stop(!0,!0),i&&e.datepicker._datepickerShowing&&e.datepicker._hideDatepicker(e.datepicker._curInst.input[0])),n=e.datepicker._get(i,"beforeShow"),a=n?n.apply(t,[t,i]):{},a!==!1&&(r(i.settings,a),i.lastVal=null,e.datepicker._lastInput=t,e.datepicker._setDateFromField(i),e.datepicker._inDialog&&(t.value=""),e.datepicker._pos||(e.datepicker._pos=e.datepicker._findPos(t),e.datepicker._pos[1]+=t.offsetHeight),o=!1,e(t).parents().each(function(){return o|="fixed"===e(this).css("position"),!o}),h={left:e.datepicker._pos[0],top:e.datepicker._pos[1]},e.datepicker._pos=null,i.dpDiv.empty(),i.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),e.datepicker._updateDatepicker(i),h=e.datepicker._checkOffset(i,h,o),i.dpDiv.css({position:e.datepicker._inDialog&&e.blockUI?"static":o?"fixed":"absolute",display:"none",left:h.left+"px",top:h.top+"px"}),i.inline||(l=e.datepicker._get(i,"showAnim"),u=e.datepicker._get(i,"duration"),i.dpDiv.css("z-index",s(e(t))+1),e.datepicker._datepickerShowing=!0,e.effects&&e.effects.effect[l]?i.dpDiv.show(l,e.datepicker._get(i,"showOptions"),u):i.dpDiv[l||"show"](l?u:null),e.datepicker._shouldFocusInput(i)&&i.input.focus(),e.datepicker._curInst=i))}},_updateDatepicker:function(t){this.maxRows=4,v=t,t.dpDiv.empty().append(this._generateHTML(t)),this._attachHandlers(t);var i,s=this._getNumberOfMonths(t),n=s[1],a=17,r=t.dpDiv.find("."+this._dayOverClass+" a");r.length>0&&o.apply(r.get(0)),t.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),n>1&&t.dpDiv.addClass("ui-datepicker-multi-"+n).css("width",a*n+"em"),t.dpDiv[(1!==s[0]||1!==s[1]?"add":"remove")+"Class"]("ui-datepicker-multi"),t.dpDiv[(this._get(t,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),t===e.datepicker._curInst&&e.datepicker._datepickerShowing&&e.datepicker._shouldFocusInput(t)&&t.input.focus(),t.yearshtml&&(i=t.yearshtml,setTimeout(function(){i===t.yearshtml&&t.yearshtml&&t.dpDiv.find("select.ui-datepicker-year:first").replaceWith(t.yearshtml),i=t.yearshtml=null},0))},_shouldFocusInput:function(e){return e.input&&e.input.is(":visible")&&!e.input.is(":disabled")&&!e.input.is(":focus")},_checkOffset:function(t,i,s){var n=t.dpDiv.outerWidth(),a=t.dpDiv.outerHeight(),o=t.input?t.input.outerWidth():0,r=t.input?t.input.outerHeight():0,h=document.documentElement.clientWidth+(s?0:e(document).scrollLeft()),l=document.documentElement.clientHeight+(s?0:e(document).scrollTop());return i.left-=this._get(t,"isRTL")?n-o:0,i.left-=s&&i.left===t.input.offset().left?e(document).scrollLeft():0,i.top-=s&&i.top===t.input.offset().top+r?e(document).scrollTop():0,i.left-=Math.min(i.left,i.left+n>h&&h>n?Math.abs(i.left+n-h):0),i.top-=Math.min(i.top,i.top+a>l&&l>a?Math.abs(a+r):0),i},_findPos:function(t){for(var i,s=this._getInst(t),n=this._get(s,"isRTL");t&&("hidden"===t.type||1!==t.nodeType||e.expr.filters.hidden(t));)t=t[n?"previousSibling":"nextSibling"];return i=e(t).offset(),[i.left,i.top]},_hideDatepicker:function(t){var i,s,n,a,o=this._curInst;!o||t&&o!==e.data(t,"datepicker")||this._datepickerShowing&&(i=this._get(o,"showAnim"),s=this._get(o,"duration"),n=function(){e.datepicker._tidyDialog(o)},e.effects&&(e.effects.effect[i]||e.effects[i])?o.dpDiv.hide(i,e.datepicker._get(o,"showOptions"),s,n):o.dpDiv["slideDown"===i?"slideUp":"fadeIn"===i?"fadeOut":"hide"](i?s:null,n),i||n(),this._datepickerShowing=!1,a=this._get(o,"onClose"),a&&a.apply(o.input?o.input[0]:null,[o.input?o.input.val():"",o]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),e.blockUI&&(e.unblockUI(),e("body").append(this.dpDiv))),this._inDialog=!1)},_tidyDialog:function(e){e.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(t){if(e.datepicker._curInst){var i=e(t.target),s=e.datepicker._getInst(i[0]);(i[0].id!==e.datepicker._mainDivId&&0===i.parents("#"+e.datepicker._mainDivId).length&&!i.hasClass(e.datepicker.markerClassName)&&!i.closest("."+e.datepicker._triggerClass).length&&e.datepicker._datepickerShowing&&(!e.datepicker._inDialog||!e.blockUI)||i.hasClass(e.datepicker.markerClassName)&&e.datepicker._curInst!==s)&&e.datepicker._hideDatepicker()}},_adjustDate:function(t,i,s){var n=e(t),a=this._getInst(n[0]);this._isDisabledDatepicker(n[0])||(this._adjustInstDate(a,i+("M"===s?this._get(a,"showCurrentAtPos"):0),s),this._updateDatepicker(a))},_gotoToday:function(t){var i,s=e(t),n=this._getInst(s[0]);this._get(n,"gotoCurrent")&&n.currentDay?(n.selectedDay=n.currentDay,n.drawMonth=n.selectedMonth=n.currentMonth,n.drawYear=n.selectedYear=n.currentYear):(i=new Date,n.selectedDay=i.getDate(),n.drawMonth=n.selectedMonth=i.getMonth(),n.drawYear=n.selectedYear=i.getFullYear()),this._notifyChange(n),this._adjustDate(s)},_selectMonthYear:function(t,i,s){var n=e(t),a=this._getInst(n[0]);a["selected"+("M"===s?"Month":"Year")]=a["draw"+("M"===s?"Month":"Year")]=parseInt(i.options[i.selectedIndex].value,10),this._notifyChange(a),this._adjustDate(n)},_selectDay:function(t,i,s,n){var a,o=e(t);e(n).hasClass(this._unselectableClass)||this._isDisabledDatepicker(o[0])||(a=this._getInst(o[0]),a.selectedDay=a.currentDay=e("a",n).html(),a.selectedMonth=a.currentMonth=i,a.selectedYear=a.currentYear=s,this._selectDate(t,this._formatDate(a,a.currentDay,a.currentMonth,a.currentYear)))},_clearDate:function(t){var i=e(t);this._selectDate(i,"")},_selectDate:function(t,i){var s,n=e(t),a=this._getInst(n[0]);i=null!=i?i:this._formatDate(a),a.input&&a.input.val(i),this._updateAlternate(a),s=this._get(a,"onSelect"),s?s.apply(a.input?a.input[0]:null,[i,a]):a.input&&a.input.trigger("change"),a.inline?this._updateDatepicker(a):(this._hideDatepicker(),this._lastInput=a.input[0],"object"!=typeof a.input[0]&&a.input.focus(),this._lastInput=null)},_updateAlternate:function(t){var i,s,n,a=this._get(t,"altField");a&&(i=this._get(t,"altFormat")||this._get(t,"dateFormat"),s=this._getDate(t),n=this.formatDate(i,s,this._getFormatConfig(t)),e(a).each(function(){e(this).val(n)}))},noWeekends:function(e){var t=e.getDay();return[t>0&&6>t,""]},iso8601Week:function(e){var t,i=new Date(e.getTime());return i.setDate(i.getDate()+4-(i.getDay()||7)),t=i.getTime(),i.setMonth(0),i.setDate(1),Math.floor(Math.round((t-i)/864e5)/7)+1},parseDate:function(t,i,s){if(null==t||null==i)throw"Invalid arguments";if(i="object"==typeof i?""+i:i+"",""===i)return null;var n,a,o,r,h=0,l=(s?s.shortYearCutoff:null)||this._defaults.shortYearCutoff,u="string"!=typeof l?l:(new Date).getFullYear()%100+parseInt(l,10),d=(s?s.dayNamesShort:null)||this._defaults.dayNamesShort,c=(s?s.dayNames:null)||this._defaults.dayNames,p=(s?s.monthNamesShort:null)||this._defaults.monthNamesShort,f=(s?s.monthNames:null)||this._defaults.monthNames,m=-1,g=-1,v=-1,y=-1,b=!1,_=function(e){var i=t.length>n+1&&t.charAt(n+1)===e;return i&&n++,i},x=function(e){var t=_(e),s="@"===e?14:"!"===e?20:"y"===e&&t?4:"o"===e?3:2,n="y"===e?s:1,a=RegExp("^\\d{"+n+","+s+"}"),o=i.substring(h).match(a);if(!o)throw"Missing number at position "+h;return h+=o[0].length,parseInt(o[0],10)},w=function(t,s,n){var a=-1,o=e.map(_(t)?n:s,function(e,t){return[[t,e]]}).sort(function(e,t){return-(e[1].length-t[1].length)});if(e.each(o,function(e,t){var s=t[1];return i.substr(h,s.length).toLowerCase()===s.toLowerCase()?(a=t[0],h+=s.length,!1):void 0}),-1!==a)return a+1;throw"Unknown name at position "+h},k=function(){if(i.charAt(h)!==t.charAt(n))throw"Unexpected literal at position "+h;h++};for(n=0;t.length>n;n++)if(b)"'"!==t.charAt(n)||_("'")?k():b=!1;else switch(t.charAt(n)){case"d":v=x("d");break;case"D":w("D",d,c);break;case"o":y=x("o");break;case"m":g=x("m");break;case"M":g=w("M",p,f);break;case"y":m=x("y");break;case"@":r=new Date(x("@")),m=r.getFullYear(),g=r.getMonth()+1,v=r.getDate();break;case"!":r=new Date((x("!")-this._ticksTo1970)/1e4),m=r.getFullYear(),g=r.getMonth()+1,v=r.getDate();break;case"'":_("'")?k():b=!0;break;default:k()}if(i.length>h&&(o=i.substr(h),!/^\s+/.test(o)))throw"Extra/unparsed characters found in date: "+o;if(-1===m?m=(new Date).getFullYear():100>m&&(m+=(new Date).getFullYear()-(new Date).getFullYear()%100+(u>=m?0:-100)),y>-1)for(g=1,v=y;;){if(a=this._getDaysInMonth(m,g-1),a>=v)break;g++,v-=a}if(r=this._daylightSavingAdjust(new Date(m,g-1,v)),r.getFullYear()!==m||r.getMonth()+1!==g||r.getDate()!==v)throw"Invalid date";return r},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:1e7*60*60*24*(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925)),formatDate:function(e,t,i){if(!t)return"";var s,n=(i?i.dayNamesShort:null)||this._defaults.dayNamesShort,a=(i?i.dayNames:null)||this._defaults.dayNames,o=(i?i.monthNamesShort:null)||this._defaults.monthNamesShort,r=(i?i.monthNames:null)||this._defaults.monthNames,h=function(t){var i=e.length>s+1&&e.charAt(s+1)===t;return i&&s++,i},l=function(e,t,i){var s=""+t;if(h(e))for(;i>s.length;)s="0"+s;return s},u=function(e,t,i,s){return h(e)?s[t]:i[t]},d="",c=!1;if(t)for(s=0;e.length>s;s++)if(c)"'"!==e.charAt(s)||h("'")?d+=e.charAt(s):c=!1;else switch(e.charAt(s)){case"d":d+=l("d",t.getDate(),2);break;case"D":d+=u("D",t.getDay(),n,a);break;case"o":d+=l("o",Math.round((new Date(t.getFullYear(),t.getMonth(),t.getDate()).getTime()-new Date(t.getFullYear(),0,0).getTime())/864e5),3);break;case"m":d+=l("m",t.getMonth()+1,2);break;case"M":d+=u("M",t.getMonth(),o,r);break;case"y":d+=h("y")?t.getFullYear():(10>t.getYear()%100?"0":"")+t.getYear()%100;break;case"@":d+=t.getTime();break;case"!":d+=1e4*t.getTime()+this._ticksTo1970;break;case"'":h("'")?d+="'":c=!0;break;default:d+=e.charAt(s)}return d},_possibleChars:function(e){var t,i="",s=!1,n=function(i){var s=e.length>t+1&&e.charAt(t+1)===i;return s&&t++,s};for(t=0;e.length>t;t++)if(s)"'"!==e.charAt(t)||n("'")?i+=e.charAt(t):s=!1;else switch(e.charAt(t)){case"d":case"m":case"y":case"@":i+="0123456789";break;case"D":case"M":return null;case"'":n("'")?i+="'":s=!0;break;default:i+=e.charAt(t)}return i},_get:function(e,t){return void 0!==e.settings[t]?e.settings[t]:this._defaults[t]},_setDateFromField:function(e,t){if(e.input.val()!==e.lastVal){var i=this._get(e,"dateFormat"),s=e.lastVal=e.input?e.input.val():null,n=this._getDefaultDate(e),a=n,o=this._getFormatConfig(e);try{a=this.parseDate(i,s,o)||n}catch(r){s=t?"":s}e.selectedDay=a.getDate(),e.drawMonth=e.selectedMonth=a.getMonth(),e.drawYear=e.selectedYear=a.getFullYear(),e.currentDay=s?a.getDate():0,e.currentMonth=s?a.getMonth():0,e.currentYear=s?a.getFullYear():0,this._adjustInstDate(e)}},_getDefaultDate:function(e){return this._restrictMinMax(e,this._determineDate(e,this._get(e,"defaultDate"),new Date))},_determineDate:function(t,i,s){var n=function(e){var t=new Date;return t.setDate(t.getDate()+e),t},a=function(i){try{return e.datepicker.parseDate(e.datepicker._get(t,"dateFormat"),i,e.datepicker._getFormatConfig(t))}catch(s){}for(var n=(i.toLowerCase().match(/^c/)?e.datepicker._getDate(t):null)||new Date,a=n.getFullYear(),o=n.getMonth(),r=n.getDate(),h=/([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,l=h.exec(i);l;){switch(l[2]||"d"){case"d":case"D":r+=parseInt(l[1],10);break;case"w":case"W":r+=7*parseInt(l[1],10);break;case"m":case"M":o+=parseInt(l[1],10),r=Math.min(r,e.datepicker._getDaysInMonth(a,o));break;case"y":case"Y":a+=parseInt(l[1],10),r=Math.min(r,e.datepicker._getDaysInMonth(a,o))}l=h.exec(i)}return new Date(a,o,r)},o=null==i||""===i?s:"string"==typeof i?a(i):"number"==typeof i?isNaN(i)?s:n(i):new Date(i.getTime());return o=o&&"Invalid Date"==""+o?s:o,o&&(o.setHours(0),o.setMinutes(0),o.setSeconds(0),o.setMilliseconds(0)),this._daylightSavingAdjust(o)},_daylightSavingAdjust:function(e){return e?(e.setHours(e.getHours()>12?e.getHours()+2:0),e):null},_setDate:function(e,t,i){var s=!t,n=e.selectedMonth,a=e.selectedYear,o=this._restrictMinMax(e,this._determineDate(e,t,new Date));e.selectedDay=e.currentDay=o.getDate(),e.drawMonth=e.selectedMonth=e.currentMonth=o.getMonth(),e.drawYear=e.selectedYear=e.currentYear=o.getFullYear(),n===e.selectedMonth&&a===e.selectedYear||i||this._notifyChange(e),this._adjustInstDate(e),e.input&&e.input.val(s?"":this._formatDate(e))},_getDate:function(e){var t=!e.currentYear||e.input&&""===e.input.val()?null:this._daylightSavingAdjust(new Date(e.currentYear,e.currentMonth,e.currentDay));return t},_attachHandlers:function(t){var i=this._get(t,"stepMonths"),s="#"+t.id.replace(/\\\\/g,"\\");t.dpDiv.find("[data-handler]").map(function(){var t={prev:function(){e.datepicker._adjustDate(s,-i,"M")},next:function(){e.datepicker._adjustDate(s,+i,"M")},hide:function(){e.datepicker._hideDatepicker()},today:function(){e.datepicker._gotoToday(s)},selectDay:function(){return e.datepicker._selectDay(s,+this.getAttribute("data-month"),+this.getAttribute("data-year"),this),!1},selectMonth:function(){return e.datepicker._selectMonthYear(s,this,"M"),!1},selectYear:function(){return e.datepicker._selectMonthYear(s,this,"Y"),!1}};e(this).bind(this.getAttribute("data-event"),t[this.getAttribute("data-handler")])})},_generateHTML:function(e){var t,i,s,n,a,o,r,h,l,u,d,c,p,f,m,g,v,y,b,_,x,w,k,T,D,S,M,C,N,A,P,I,H,z,F,E,O,j,W,L=new Date,R=this._daylightSavingAdjust(new Date(L.getFullYear(),L.getMonth(),L.getDate())),Y=this._get(e,"isRTL"),B=this._get(e,"showButtonPanel"),J=this._get(e,"hideIfNoPrevNext"),q=this._get(e,"navigationAsDateFormat"),K=this._getNumberOfMonths(e),V=this._get(e,"showCurrentAtPos"),U=this._get(e,"stepMonths"),Q=1!==K[0]||1!==K[1],G=this._daylightSavingAdjust(e.currentDay?new Date(e.currentYear,e.currentMonth,e.currentDay):new Date(9999,9,9)),X=this._getMinMaxDate(e,"min"),$=this._getMinMaxDate(e,"max"),Z=e.drawMonth-V,et=e.drawYear;if(0>Z&&(Z+=12,et--),$)for(t=this._daylightSavingAdjust(new Date($.getFullYear(),$.getMonth()-K[0]*K[1]+1,$.getDate())),t=X&&X>t?X:t;this._daylightSavingAdjust(new Date(et,Z,1))>t;)Z--,0>Z&&(Z=11,et--);for(e.drawMonth=Z,e.drawYear=et,i=this._get(e,"prevText"),i=q?this.formatDate(i,this._daylightSavingAdjust(new Date(et,Z-U,1)),this._getFormatConfig(e)):i,s=this._canAdjustMonth(e,-1,et,Z)?"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>":J?"":"<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>",n=this._get(e,"nextText"),n=q?this.formatDate(n,this._daylightSavingAdjust(new Date(et,Z+U,1)),this._getFormatConfig(e)):n,a=this._canAdjustMonth(e,1,et,Z)?"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>":J?"":"<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>",o=this._get(e,"currentText"),r=this._get(e,"gotoCurrent")&&e.currentDay?G:R,o=q?this.formatDate(o,r,this._getFormatConfig(e)):o,h=e.inline?"":"<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>"+this._get(e,"closeText")+"</button>",l=B?"<div class='ui-datepicker-buttonpane ui-widget-content'>"+(Y?h:"")+(this._isInRange(e,r)?"<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'>"+o+"</button>":"")+(Y?"":h)+"</div>":"",u=parseInt(this._get(e,"firstDay"),10),u=isNaN(u)?0:u,d=this._get(e,"showWeek"),c=this._get(e,"dayNames"),p=this._get(e,"dayNamesMin"),f=this._get(e,"monthNames"),m=this._get(e,"monthNamesShort"),g=this._get(e,"beforeShowDay"),v=this._get(e,"showOtherMonths"),y=this._get(e,"selectOtherMonths"),b=this._getDefaultDate(e),_="",w=0;K[0]>w;w++){for(k="",this.maxRows=4,T=0;K[1]>T;T++){if(D=this._daylightSavingAdjust(new Date(et,Z,e.selectedDay)),S=" ui-corner-all",M="",Q){if(M+="<div class='ui-datepicker-group",K[1]>1)switch(T){case 0:M+=" ui-datepicker-group-first",S=" ui-corner-"+(Y?"right":"left");break;case K[1]-1:M+=" ui-datepicker-group-last",S=" ui-corner-"+(Y?"left":"right");break;default:M+=" ui-datepicker-group-middle",S=""}M+="'>"}for(M+="<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix"+S+"'>"+(/all|left/.test(S)&&0===w?Y?a:s:"")+(/all|right/.test(S)&&0===w?Y?s:a:"")+this._generateMonthYearHeader(e,Z,et,X,$,w>0||T>0,f,m)+"</div><table class='ui-datepicker-calendar'><thead>"+"<tr>",C=d?"<th class='ui-datepicker-week-col'>"+this._get(e,"weekHeader")+"</th>":"",x=0;7>x;x++)N=(x+u)%7,C+="<th scope='col'"+((x+u+6)%7>=5?" class='ui-datepicker-week-end'":"")+">"+"<span title='"+c[N]+"'>"+p[N]+"</span></th>";for(M+=C+"</tr></thead><tbody>",A=this._getDaysInMonth(et,Z),et===e.selectedYear&&Z===e.selectedMonth&&(e.selectedDay=Math.min(e.selectedDay,A)),P=(this._getFirstDayOfMonth(et,Z)-u+7)%7,I=Math.ceil((P+A)/7),H=Q?this.maxRows>I?this.maxRows:I:I,this.maxRows=H,z=this._daylightSavingAdjust(new Date(et,Z,1-P)),F=0;H>F;F++){for(M+="<tr>",E=d?"<td class='ui-datepicker-week-col'>"+this._get(e,"calculateWeek")(z)+"</td>":"",x=0;7>x;x++)O=g?g.apply(e.input?e.input[0]:null,[z]):[!0,""],j=z.getMonth()!==Z,W=j&&!y||!O[0]||X&&X>z||$&&z>$,E+="<td class='"+((x+u+6)%7>=5?" ui-datepicker-week-end":"")+(j?" ui-datepicker-other-month":"")+(z.getTime()===D.getTime()&&Z===e.selectedMonth&&e._keyEvent||b.getTime()===z.getTime()&&b.getTime()===D.getTime()?" "+this._dayOverClass:"")+(W?" "+this._unselectableClass+" ui-state-disabled":"")+(j&&!v?"":" "+O[1]+(z.getTime()===G.getTime()?" "+this._currentClass:"")+(z.getTime()===R.getTime()?" ui-datepicker-today":""))+"'"+(j&&!v||!O[2]?"":" title='"+O[2].replace(/'/g,"&#39;")+"'")+(W?"":" data-handler='selectDay' data-event='click' data-month='"+z.getMonth()+"' data-year='"+z.getFullYear()+"'")+">"+(j&&!v?"&#xa0;":W?"<span class='ui-state-default'>"+z.getDate()+"</span>":"<a class='ui-state-default"+(z.getTime()===R.getTime()?" ui-state-highlight":"")+(z.getTime()===G.getTime()?" ui-state-active":"")+(j?" ui-priority-secondary":"")+"' href='#'>"+z.getDate()+"</a>")+"</td>",z.setDate(z.getDate()+1),z=this._daylightSavingAdjust(z);M+=E+"</tr>"}Z++,Z>11&&(Z=0,et++),M+="</tbody></table>"+(Q?"</div>"+(K[0]>0&&T===K[1]-1?"<div class='ui-datepicker-row-break'></div>":""):""),k+=M}_+=k}return _+=l,e._keyEvent=!1,_},_generateMonthYearHeader:function(e,t,i,s,n,a,o,r){var h,l,u,d,c,p,f,m,g=this._get(e,"changeMonth"),v=this._get(e,"changeYear"),y=this._get(e,"showMonthAfterYear"),b="<div class='ui-datepicker-title'>",_="";if(a||!g)_+="<span class='ui-datepicker-month'>"+o[t]+"</span>";else{for(h=s&&s.getFullYear()===i,l=n&&n.getFullYear()===i,_+="<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>",u=0;12>u;u++)(!h||u>=s.getMonth())&&(!l||n.getMonth()>=u)&&(_+="<option value='"+u+"'"+(u===t?" selected='selected'":"")+">"+r[u]+"</option>");_+="</select>"}if(y||(b+=_+(!a&&g&&v?"":"&#xa0;")),!e.yearshtml)if(e.yearshtml="",a||!v)b+="<span class='ui-datepicker-year'>"+i+"</span>";else{for(d=this._get(e,"yearRange").split(":"),c=(new Date).getFullYear(),p=function(e){var t=e.match(/c[+\-].*/)?i+parseInt(e.substring(1),10):e.match(/[+\-].*/)?c+parseInt(e,10):parseInt(e,10);return isNaN(t)?c:t},f=p(d[0]),m=Math.max(f,p(d[1]||"")),f=s?Math.max(f,s.getFullYear()):f,m=n?Math.min(m,n.getFullYear()):m,e.yearshtml+="<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";m>=f;f++)e.yearshtml+="<option value='"+f+"'"+(f===i?" selected='selected'":"")+">"+f+"</option>";e.yearshtml+="</select>",b+=e.yearshtml,e.yearshtml=null}return b+=this._get(e,"yearSuffix"),y&&(b+=(!a&&g&&v?"":"&#xa0;")+_),b+="</div>"},_adjustInstDate:function(e,t,i){var s=e.drawYear+("Y"===i?t:0),n=e.drawMonth+("M"===i?t:0),a=Math.min(e.selectedDay,this._getDaysInMonth(s,n))+("D"===i?t:0),o=this._restrictMinMax(e,this._daylightSavingAdjust(new Date(s,n,a)));e.selectedDay=o.getDate(),e.drawMonth=e.selectedMonth=o.getMonth(),e.drawYear=e.selectedYear=o.getFullYear(),("M"===i||"Y"===i)&&this._notifyChange(e)},_restrictMinMax:function(e,t){var i=this._getMinMaxDate(e,"min"),s=this._getMinMaxDate(e,"max"),n=i&&i>t?i:t;return s&&n>s?s:n},_notifyChange:function(e){var t=this._get(e,"onChangeMonthYear");t&&t.apply(e.input?e.input[0]:null,[e.selectedYear,e.selectedMonth+1,e])},_getNumberOfMonths:function(e){var t=this._get(e,"numberOfMonths");return null==t?[1,1]:"number"==typeof t?[1,t]:t},_getMinMaxDate:function(e,t){return this._determineDate(e,this._get(e,t+"Date"),null)},_getDaysInMonth:function(e,t){return 32-this._daylightSavingAdjust(new Date(e,t,32)).getDate()},_getFirstDayOfMonth:function(e,t){return new Date(e,t,1).getDay()},_canAdjustMonth:function(e,t,i,s){var n=this._getNumberOfMonths(e),a=this._daylightSavingAdjust(new Date(i,s+(0>t?t:n[0]*n[1]),1));return 0>t&&a.setDate(this._getDaysInMonth(a.getFullYear(),a.getMonth())),this._isInRange(e,a)},_isInRange:function(e,t){var i,s,n=this._getMinMaxDate(e,"min"),a=this._getMinMaxDate(e,"max"),o=null,r=null,h=this._get(e,"yearRange");return h&&(i=h.split(":"),s=(new Date).getFullYear(),o=parseInt(i[0],10),r=parseInt(i[1],10),i[0].match(/[+\-].*/)&&(o+=s),i[1].match(/[+\-].*/)&&(r+=s)),(!n||t.getTime()>=n.getTime())&&(!a||t.getTime()<=a.getTime())&&(!o||t.getFullYear()>=o)&&(!r||r>=t.getFullYear())},_getFormatConfig:function(e){var t=this._get(e,"shortYearCutoff");return t="string"!=typeof t?t:(new Date).getFullYear()%100+parseInt(t,10),{shortYearCutoff:t,dayNamesShort:this._get(e,"dayNamesShort"),dayNames:this._get(e,"dayNames"),monthNamesShort:this._get(e,"monthNamesShort"),monthNames:this._get(e,"monthNames")}},_formatDate:function(e,t,i,s){t||(e.currentDay=e.selectedDay,e.currentMonth=e.selectedMonth,e.currentYear=e.selectedYear);var n=t?"object"==typeof t?t:this._daylightSavingAdjust(new Date(s,i,t)):this._daylightSavingAdjust(new Date(e.currentYear,e.currentMonth,e.currentDay));return this.formatDate(this._get(e,"dateFormat"),n,this._getFormatConfig(e))}}),e.fn.datepicker=function(t){if(!this.length)return this;e.datepicker.initialized||(e(document).mousedown(e.datepicker._checkExternalClick),e.datepicker.initialized=!0),0===e("#"+e.datepicker._mainDivId).length&&e("body").append(e.datepicker.dpDiv);var i=Array.prototype.slice.call(arguments,1);return"string"!=typeof t||"isDisabled"!==t&&"getDate"!==t&&"widget"!==t?"option"===t&&2===arguments.length&&"string"==typeof arguments[1]?e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this[0]].concat(i)):this.each(function(){"string"==typeof t?e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this].concat(i)):e.datepicker._attachDatepicker(this,t)}):e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this[0]].concat(i))},e.datepicker=new n,e.datepicker.initialized=!1,e.datepicker.uuid=(new Date).getTime(),e.datepicker.version="1.11.4",e.datepicker,e.widget("ui.dialog",{version:"1.11.4",options:{appendTo:"body",autoOpen:!0,buttons:[],closeOnEscape:!0,closeText:"Close",dialogClass:"",draggable:!0,hide:null,height:"auto",maxHeight:null,maxWidth:null,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",of:window,collision:"fit",using:function(t){var i=e(this).css(t).offset().top;0>i&&e(this).css("top",t.top-i)}},resizable:!0,show:null,title:null,width:300,beforeClose:null,close:null,drag:null,dragStart:null,dragStop:null,focus:null,open:null,resize:null,resizeStart:null,resizeStop:null},sizeRelatedOptions:{buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},resizableRelatedOptions:{maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0},_create:function(){this.originalCss={display:this.element[0].style.display,width:this.element[0].style.width,minHeight:this.element[0].style.minHeight,maxHeight:this.element[0].style.maxHeight,height:this.element[0].style.height},this.originalPosition={parent:this.element.parent(),index:this.element.parent().children().index(this.element)},this.originalTitle=this.element.attr("title"),this.options.title=this.options.title||this.originalTitle,this._createWrapper(),this.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(this.uiDialog),this._createTitlebar(),this._createButtonPane(),this.options.draggable&&e.fn.draggable&&this._makeDraggable(),this.options.resizable&&e.fn.resizable&&this._makeResizable(),this._isOpen=!1,this._trackFocus()},_init:function(){this.options.autoOpen&&this.open()},_appendTo:function(){var t=this.options.appendTo;return t&&(t.jquery||t.nodeType)?e(t):this.document.find(t||"body").eq(0)},_destroy:function(){var e,t=this.originalPosition;this._untrackInstance(),this._destroyOverlay(),this.element.removeUniqueId().removeClass("ui-dialog-content ui-widget-content").css(this.originalCss).detach(),this.uiDialog.stop(!0,!0).remove(),this.originalTitle&&this.element.attr("title",this.originalTitle),e=t.parent.children().eq(t.index),e.length&&e[0]!==this.element[0]?e.before(this.element):t.parent.append(this.element)},widget:function(){return this.uiDialog},disable:e.noop,enable:e.noop,close:function(t){var i,s=this;if(this._isOpen&&this._trigger("beforeClose",t)!==!1){if(this._isOpen=!1,this._focusedElement=null,this._destroyOverlay(),this._untrackInstance(),!this.opener.filter(":focusable").focus().length)try{i=this.document[0].activeElement,i&&"body"!==i.nodeName.toLowerCase()&&e(i).blur()}catch(n){}this._hide(this.uiDialog,this.options.hide,function(){s._trigger("close",t)})}},isOpen:function(){return this._isOpen},moveToTop:function(){this._moveToTop()},_moveToTop:function(t,i){var s=!1,n=this.uiDialog.siblings(".ui-front:visible").map(function(){return+e(this).css("z-index")}).get(),a=Math.max.apply(null,n);return a>=+this.uiDialog.css("z-index")&&(this.uiDialog.css("z-index",a+1),s=!0),s&&!i&&this._trigger("focus",t),s},open:function(){var t=this;
-return this._isOpen?(this._moveToTop()&&this._focusTabbable(),void 0):(this._isOpen=!0,this.opener=e(this.document[0].activeElement),this._size(),this._position(),this._createOverlay(),this._moveToTop(null,!0),this.overlay&&this.overlay.css("z-index",this.uiDialog.css("z-index")-1),this._show(this.uiDialog,this.options.show,function(){t._focusTabbable(),t._trigger("focus")}),this._makeFocusTarget(),this._trigger("open"),void 0)},_focusTabbable:function(){var e=this._focusedElement;e||(e=this.element.find("[autofocus]")),e.length||(e=this.element.find(":tabbable")),e.length||(e=this.uiDialogButtonPane.find(":tabbable")),e.length||(e=this.uiDialogTitlebarClose.filter(":tabbable")),e.length||(e=this.uiDialog),e.eq(0).focus()},_keepFocus:function(t){function i(){var t=this.document[0].activeElement,i=this.uiDialog[0]===t||e.contains(this.uiDialog[0],t);i||this._focusTabbable()}t.preventDefault(),i.call(this),this._delay(i)},_createWrapper:function(){this.uiDialog=e("<div>").addClass("ui-dialog ui-widget ui-widget-content ui-corner-all ui-front "+this.options.dialogClass).hide().attr({tabIndex:-1,role:"dialog"}).appendTo(this._appendTo()),this._on(this.uiDialog,{keydown:function(t){if(this.options.closeOnEscape&&!t.isDefaultPrevented()&&t.keyCode&&t.keyCode===e.ui.keyCode.ESCAPE)return t.preventDefault(),this.close(t),void 0;if(t.keyCode===e.ui.keyCode.TAB&&!t.isDefaultPrevented()){var i=this.uiDialog.find(":tabbable"),s=i.filter(":first"),n=i.filter(":last");t.target!==n[0]&&t.target!==this.uiDialog[0]||t.shiftKey?t.target!==s[0]&&t.target!==this.uiDialog[0]||!t.shiftKey||(this._delay(function(){n.focus()}),t.preventDefault()):(this._delay(function(){s.focus()}),t.preventDefault())}},mousedown:function(e){this._moveToTop(e)&&this._focusTabbable()}}),this.element.find("[aria-describedby]").length||this.uiDialog.attr({"aria-describedby":this.element.uniqueId().attr("id")})},_createTitlebar:function(){var t;this.uiDialogTitlebar=e("<div>").addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(this.uiDialog),this._on(this.uiDialogTitlebar,{mousedown:function(t){e(t.target).closest(".ui-dialog-titlebar-close")||this.uiDialog.focus()}}),this.uiDialogTitlebarClose=e("<button type='button'></button>").button({label:this.options.closeText,icons:{primary:"ui-icon-closethick"},text:!1}).addClass("ui-dialog-titlebar-close").appendTo(this.uiDialogTitlebar),this._on(this.uiDialogTitlebarClose,{click:function(e){e.preventDefault(),this.close(e)}}),t=e("<span>").uniqueId().addClass("ui-dialog-title").prependTo(this.uiDialogTitlebar),this._title(t),this.uiDialog.attr({"aria-labelledby":t.attr("id")})},_title:function(e){this.options.title||e.html("&#160;"),e.text(this.options.title)},_createButtonPane:function(){this.uiDialogButtonPane=e("<div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),this.uiButtonSet=e("<div>").addClass("ui-dialog-buttonset").appendTo(this.uiDialogButtonPane),this._createButtons()},_createButtons:function(){var t=this,i=this.options.buttons;return this.uiDialogButtonPane.remove(),this.uiButtonSet.empty(),e.isEmptyObject(i)||e.isArray(i)&&!i.length?(this.uiDialog.removeClass("ui-dialog-buttons"),void 0):(e.each(i,function(i,s){var n,a;s=e.isFunction(s)?{click:s,text:i}:s,s=e.extend({type:"button"},s),n=s.click,s.click=function(){n.apply(t.element[0],arguments)},a={icons:s.icons,text:s.showText},delete s.icons,delete s.showText,e("<button></button>",s).button(a).appendTo(t.uiButtonSet)}),this.uiDialog.addClass("ui-dialog-buttons"),this.uiDialogButtonPane.appendTo(this.uiDialog),void 0)},_makeDraggable:function(){function t(e){return{position:e.position,offset:e.offset}}var i=this,s=this.options;this.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(s,n){e(this).addClass("ui-dialog-dragging"),i._blockFrames(),i._trigger("dragStart",s,t(n))},drag:function(e,s){i._trigger("drag",e,t(s))},stop:function(n,a){var o=a.offset.left-i.document.scrollLeft(),r=a.offset.top-i.document.scrollTop();s.position={my:"left top",at:"left"+(o>=0?"+":"")+o+" "+"top"+(r>=0?"+":"")+r,of:i.window},e(this).removeClass("ui-dialog-dragging"),i._unblockFrames(),i._trigger("dragStop",n,t(a))}})},_makeResizable:function(){function t(e){return{originalPosition:e.originalPosition,originalSize:e.originalSize,position:e.position,size:e.size}}var i=this,s=this.options,n=s.resizable,a=this.uiDialog.css("position"),o="string"==typeof n?n:"n,e,s,w,se,sw,ne,nw";this.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:this.element,maxWidth:s.maxWidth,maxHeight:s.maxHeight,minWidth:s.minWidth,minHeight:this._minHeight(),handles:o,start:function(s,n){e(this).addClass("ui-dialog-resizing"),i._blockFrames(),i._trigger("resizeStart",s,t(n))},resize:function(e,s){i._trigger("resize",e,t(s))},stop:function(n,a){var o=i.uiDialog.offset(),r=o.left-i.document.scrollLeft(),h=o.top-i.document.scrollTop();s.height=i.uiDialog.height(),s.width=i.uiDialog.width(),s.position={my:"left top",at:"left"+(r>=0?"+":"")+r+" "+"top"+(h>=0?"+":"")+h,of:i.window},e(this).removeClass("ui-dialog-resizing"),i._unblockFrames(),i._trigger("resizeStop",n,t(a))}}).css("position",a)},_trackFocus:function(){this._on(this.widget(),{focusin:function(t){this._makeFocusTarget(),this._focusedElement=e(t.target)}})},_makeFocusTarget:function(){this._untrackInstance(),this._trackingInstances().unshift(this)},_untrackInstance:function(){var t=this._trackingInstances(),i=e.inArray(this,t);-1!==i&&t.splice(i,1)},_trackingInstances:function(){var e=this.document.data("ui-dialog-instances");return e||(e=[],this.document.data("ui-dialog-instances",e)),e},_minHeight:function(){var e=this.options;return"auto"===e.height?e.minHeight:Math.min(e.minHeight,e.height)},_position:function(){var e=this.uiDialog.is(":visible");e||this.uiDialog.show(),this.uiDialog.position(this.options.position),e||this.uiDialog.hide()},_setOptions:function(t){var i=this,s=!1,n={};e.each(t,function(e,t){i._setOption(e,t),e in i.sizeRelatedOptions&&(s=!0),e in i.resizableRelatedOptions&&(n[e]=t)}),s&&(this._size(),this._position()),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option",n)},_setOption:function(e,t){var i,s,n=this.uiDialog;"dialogClass"===e&&n.removeClass(this.options.dialogClass).addClass(t),"disabled"!==e&&(this._super(e,t),"appendTo"===e&&this.uiDialog.appendTo(this._appendTo()),"buttons"===e&&this._createButtons(),"closeText"===e&&this.uiDialogTitlebarClose.button({label:""+t}),"draggable"===e&&(i=n.is(":data(ui-draggable)"),i&&!t&&n.draggable("destroy"),!i&&t&&this._makeDraggable()),"position"===e&&this._position(),"resizable"===e&&(s=n.is(":data(ui-resizable)"),s&&!t&&n.resizable("destroy"),s&&"string"==typeof t&&n.resizable("option","handles",t),s||t===!1||this._makeResizable()),"title"===e&&this._title(this.uiDialogTitlebar.find(".ui-dialog-title")))},_size:function(){var e,t,i,s=this.options;this.element.show().css({width:"auto",minHeight:0,maxHeight:"none",height:0}),s.minWidth>s.width&&(s.width=s.minWidth),e=this.uiDialog.css({height:"auto",width:s.width}).outerHeight(),t=Math.max(0,s.minHeight-e),i="number"==typeof s.maxHeight?Math.max(0,s.maxHeight-e):"none","auto"===s.height?this.element.css({minHeight:t,maxHeight:i,height:"auto"}):this.element.height(Math.max(0,s.height-e)),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())},_blockFrames:function(){this.iframeBlocks=this.document.find("iframe").map(function(){var t=e(this);return e("<div>").css({position:"absolute",width:t.outerWidth(),height:t.outerHeight()}).appendTo(t.parent()).offset(t.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_allowInteraction:function(t){return e(t.target).closest(".ui-dialog").length?!0:!!e(t.target).closest(".ui-datepicker").length},_createOverlay:function(){if(this.options.modal){var t=!0;this._delay(function(){t=!1}),this.document.data("ui-dialog-overlays")||this._on(this.document,{focusin:function(e){t||this._allowInteraction(e)||(e.preventDefault(),this._trackingInstances()[0]._focusTabbable())}}),this.overlay=e("<div>").addClass("ui-widget-overlay ui-front").appendTo(this._appendTo()),this._on(this.overlay,{mousedown:"_keepFocus"}),this.document.data("ui-dialog-overlays",(this.document.data("ui-dialog-overlays")||0)+1)}},_destroyOverlay:function(){if(this.options.modal&&this.overlay){var e=this.document.data("ui-dialog-overlays")-1;e?this.document.data("ui-dialog-overlays",e):this.document.unbind("focusin").removeData("ui-dialog-overlays"),this.overlay.remove(),this.overlay=null}}}),e.widget("ui.progressbar",{version:"1.11.4",options:{max:100,value:0,change:null,complete:null},min:0,_create:function(){this.oldValue=this.options.value=this._constrainedValue(),this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min}),this.valueDiv=e("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element),this._refreshValue()},_destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.valueDiv.remove()},value:function(e){return void 0===e?this.options.value:(this.options.value=this._constrainedValue(e),this._refreshValue(),void 0)},_constrainedValue:function(e){return void 0===e&&(e=this.options.value),this.indeterminate=e===!1,"number"!=typeof e&&(e=0),this.indeterminate?!1:Math.min(this.options.max,Math.max(this.min,e))},_setOptions:function(e){var t=e.value;delete e.value,this._super(e),this.options.value=this._constrainedValue(t),this._refreshValue()},_setOption:function(e,t){"max"===e&&(t=Math.max(this.min,t)),"disabled"===e&&this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this._super(e,t)},_percentage:function(){return this.indeterminate?100:100*(this.options.value-this.min)/(this.options.max-this.min)},_refreshValue:function(){var t=this.options.value,i=this._percentage();this.valueDiv.toggle(this.indeterminate||t>this.min).toggleClass("ui-corner-right",t===this.options.max).width(i.toFixed(0)+"%"),this.element.toggleClass("ui-progressbar-indeterminate",this.indeterminate),this.indeterminate?(this.element.removeAttr("aria-valuenow"),this.overlayDiv||(this.overlayDiv=e("<div class='ui-progressbar-overlay'></div>").appendTo(this.valueDiv))):(this.element.attr({"aria-valuemax":this.options.max,"aria-valuenow":t}),this.overlayDiv&&(this.overlayDiv.remove(),this.overlayDiv=null)),this.oldValue!==t&&(this.oldValue=t,this._trigger("change")),t===this.options.max&&this._trigger("complete")}}),e.widget("ui.selectmenu",{version:"1.11.4",defaultElement:"<select>",options:{appendTo:null,disabled:null,icons:{button:"ui-icon-triangle-1-s"},position:{my:"left top",at:"left bottom",collision:"none"},width:null,change:null,close:null,focus:null,open:null,select:null},_create:function(){var e=this.element.uniqueId().attr("id");this.ids={element:e,button:e+"-button",menu:e+"-menu"},this._drawButton(),this._drawMenu(),this.options.disabled&&this.disable()},_drawButton:function(){var t=this;this.label=e("label[for='"+this.ids.element+"']").attr("for",this.ids.button),this._on(this.label,{click:function(e){this.button.focus(),e.preventDefault()}}),this.element.hide(),this.button=e("<span>",{"class":"ui-selectmenu-button ui-widget ui-state-default ui-corner-all",tabindex:this.options.disabled?-1:0,id:this.ids.button,role:"combobox","aria-expanded":"false","aria-autocomplete":"list","aria-owns":this.ids.menu,"aria-haspopup":"true"}).insertAfter(this.element),e("<span>",{"class":"ui-icon "+this.options.icons.button}).prependTo(this.button),this.buttonText=e("<span>",{"class":"ui-selectmenu-text"}).appendTo(this.button),this._setText(this.buttonText,this.element.find("option:selected").text()),this._resizeButton(),this._on(this.button,this._buttonEvents),this.button.one("focusin",function(){t.menuItems||t._refreshMenu()}),this._hoverable(this.button),this._focusable(this.button)},_drawMenu:function(){var t=this;this.menu=e("<ul>",{"aria-hidden":"true","aria-labelledby":this.ids.button,id:this.ids.menu}),this.menuWrap=e("<div>",{"class":"ui-selectmenu-menu ui-front"}).append(this.menu).appendTo(this._appendTo()),this.menuInstance=this.menu.menu({role:"listbox",select:function(e,i){e.preventDefault(),t._setSelection(),t._select(i.item.data("ui-selectmenu-item"),e)},focus:function(e,i){var s=i.item.data("ui-selectmenu-item");null!=t.focusIndex&&s.index!==t.focusIndex&&(t._trigger("focus",e,{item:s}),t.isOpen||t._select(s,e)),t.focusIndex=s.index,t.button.attr("aria-activedescendant",t.menuItems.eq(s.index).attr("id"))}}).menu("instance"),this.menu.addClass("ui-corner-bottom").removeClass("ui-corner-all"),this.menuInstance._off(this.menu,"mouseleave"),this.menuInstance._closeOnDocumentClick=function(){return!1},this.menuInstance._isDivider=function(){return!1}},refresh:function(){this._refreshMenu(),this._setText(this.buttonText,this._getSelectedItem().text()),this.options.width||this._resizeButton()},_refreshMenu:function(){this.menu.empty();var e,t=this.element.find("option");t.length&&(this._parseOptions(t),this._renderMenu(this.menu,this.items),this.menuInstance.refresh(),this.menuItems=this.menu.find("li").not(".ui-selectmenu-optgroup"),e=this._getSelectedItem(),this.menuInstance.focus(null,e),this._setAria(e.data("ui-selectmenu-item")),this._setOption("disabled",this.element.prop("disabled")))},open:function(e){this.options.disabled||(this.menuItems?(this.menu.find(".ui-state-focus").removeClass("ui-state-focus"),this.menuInstance.focus(null,this._getSelectedItem())):this._refreshMenu(),this.isOpen=!0,this._toggleAttr(),this._resizeMenu(),this._position(),this._on(this.document,this._documentClick),this._trigger("open",e))},_position:function(){this.menuWrap.position(e.extend({of:this.button},this.options.position))},close:function(e){this.isOpen&&(this.isOpen=!1,this._toggleAttr(),this.range=null,this._off(this.document),this._trigger("close",e))},widget:function(){return this.button},menuWidget:function(){return this.menu},_renderMenu:function(t,i){var s=this,n="";e.each(i,function(i,a){a.optgroup!==n&&(e("<li>",{"class":"ui-selectmenu-optgroup ui-menu-divider"+(a.element.parent("optgroup").prop("disabled")?" ui-state-disabled":""),text:a.optgroup}).appendTo(t),n=a.optgroup),s._renderItemData(t,a)})},_renderItemData:function(e,t){return this._renderItem(e,t).data("ui-selectmenu-item",t)},_renderItem:function(t,i){var s=e("<li>");return i.disabled&&s.addClass("ui-state-disabled"),this._setText(s,i.label),s.appendTo(t)},_setText:function(e,t){t?e.text(t):e.html("&#160;")},_move:function(e,t){var i,s,n=".ui-menu-item";this.isOpen?i=this.menuItems.eq(this.focusIndex):(i=this.menuItems.eq(this.element[0].selectedIndex),n+=":not(.ui-state-disabled)"),s="first"===e||"last"===e?i["first"===e?"prevAll":"nextAll"](n).eq(-1):i[e+"All"](n).eq(0),s.length&&this.menuInstance.focus(t,s)},_getSelectedItem:function(){return this.menuItems.eq(this.element[0].selectedIndex)},_toggle:function(e){this[this.isOpen?"close":"open"](e)},_setSelection:function(){var e;this.range&&(window.getSelection?(e=window.getSelection(),e.removeAllRanges(),e.addRange(this.range)):this.range.select(),this.button.focus())},_documentClick:{mousedown:function(t){this.isOpen&&(e(t.target).closest(".ui-selectmenu-menu, #"+this.ids.button).length||this.close(t))}},_buttonEvents:{mousedown:function(){var e;window.getSelection?(e=window.getSelection(),e.rangeCount&&(this.range=e.getRangeAt(0))):this.range=document.selection.createRange()},click:function(e){this._setSelection(),this._toggle(e)},keydown:function(t){var i=!0;switch(t.keyCode){case e.ui.keyCode.TAB:case e.ui.keyCode.ESCAPE:this.close(t),i=!1;break;case e.ui.keyCode.ENTER:this.isOpen&&this._selectFocusedItem(t);break;case e.ui.keyCode.UP:t.altKey?this._toggle(t):this._move("prev",t);break;case e.ui.keyCode.DOWN:t.altKey?this._toggle(t):this._move("next",t);break;case e.ui.keyCode.SPACE:this.isOpen?this._selectFocusedItem(t):this._toggle(t);break;case e.ui.keyCode.LEFT:this._move("prev",t);break;case e.ui.keyCode.RIGHT:this._move("next",t);break;case e.ui.keyCode.HOME:case e.ui.keyCode.PAGE_UP:this._move("first",t);break;case e.ui.keyCode.END:case e.ui.keyCode.PAGE_DOWN:this._move("last",t);break;default:this.menu.trigger(t),i=!1}i&&t.preventDefault()}},_selectFocusedItem:function(e){var t=this.menuItems.eq(this.focusIndex);t.hasClass("ui-state-disabled")||this._select(t.data("ui-selectmenu-item"),e)},_select:function(e,t){var i=this.element[0].selectedIndex;this.element[0].selectedIndex=e.index,this._setText(this.buttonText,e.label),this._setAria(e),this._trigger("select",t,{item:e}),e.index!==i&&this._trigger("change",t,{item:e}),this.close(t)},_setAria:function(e){var t=this.menuItems.eq(e.index).attr("id");this.button.attr({"aria-labelledby":t,"aria-activedescendant":t}),this.menu.attr("aria-activedescendant",t)},_setOption:function(e,t){"icons"===e&&this.button.find("span.ui-icon").removeClass(this.options.icons.button).addClass(t.button),this._super(e,t),"appendTo"===e&&this.menuWrap.appendTo(this._appendTo()),"disabled"===e&&(this.menuInstance.option("disabled",t),this.button.toggleClass("ui-state-disabled",t).attr("aria-disabled",t),this.element.prop("disabled",t),t?(this.button.attr("tabindex",-1),this.close()):this.button.attr("tabindex",0)),"width"===e&&this._resizeButton()},_appendTo:function(){var t=this.options.appendTo;return t&&(t=t.jquery||t.nodeType?e(t):this.document.find(t).eq(0)),t&&t[0]||(t=this.element.closest(".ui-front")),t.length||(t=this.document[0].body),t},_toggleAttr:function(){this.button.toggleClass("ui-corner-top",this.isOpen).toggleClass("ui-corner-all",!this.isOpen).attr("aria-expanded",this.isOpen),this.menuWrap.toggleClass("ui-selectmenu-open",this.isOpen),this.menu.attr("aria-hidden",!this.isOpen)},_resizeButton:function(){var e=this.options.width;e||(e=this.element.show().outerWidth(),this.element.hide()),this.button.outerWidth(e)},_resizeMenu:function(){this.menu.outerWidth(Math.max(this.button.outerWidth(),this.menu.width("").outerWidth()+1))},_getCreateOptions:function(){return{disabled:this.element.prop("disabled")}},_parseOptions:function(t){var i=[];t.each(function(t,s){var n=e(s),a=n.parent("optgroup");i.push({element:n,index:t,value:n.val(),label:n.text(),optgroup:a.attr("label")||"",disabled:a.prop("disabled")||n.prop("disabled")})}),this.items=i},_destroy:function(){this.menuWrap.remove(),this.button.remove(),this.element.show(),this.element.removeUniqueId(),this.label.attr("for",this.ids.element)}}),e.widget("ui.slider",e.ui.mouse,{version:"1.11.4",widgetEventPrefix:"slide",options:{animate:!1,distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null,change:null,slide:null,start:null,stop:null},numPages:5,_create:function(){this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this._calculateNewMax(),this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget"+" ui-widget-content"+" ui-corner-all"),this._refresh(),this._setOption("disabled",this.options.disabled),this._animateOff=!1},_refresh:function(){this._createRange(),this._createHandles(),this._setupEvents(),this._refreshValue()},_createHandles:function(){var t,i,s=this.options,n=this.element.find(".ui-slider-handle").addClass("ui-state-default ui-corner-all"),a="<span class='ui-slider-handle ui-state-default ui-corner-all' tabindex='0'></span>",o=[];for(i=s.values&&s.values.length||1,n.length>i&&(n.slice(i).remove(),n=n.slice(0,i)),t=n.length;i>t;t++)o.push(a);this.handles=n.add(e(o.join("")).appendTo(this.element)),this.handle=this.handles.eq(0),this.handles.each(function(t){e(this).data("ui-slider-handle-index",t)})},_createRange:function(){var t=this.options,i="";t.range?(t.range===!0&&(t.values?t.values.length&&2!==t.values.length?t.values=[t.values[0],t.values[0]]:e.isArray(t.values)&&(t.values=t.values.slice(0)):t.values=[this._valueMin(),this._valueMin()]),this.range&&this.range.length?this.range.removeClass("ui-slider-range-min ui-slider-range-max").css({left:"",bottom:""}):(this.range=e("<div></div>").appendTo(this.element),i="ui-slider-range ui-widget-header ui-corner-all"),this.range.addClass(i+("min"===t.range||"max"===t.range?" ui-slider-range-"+t.range:""))):(this.range&&this.range.remove(),this.range=null)},_setupEvents:function(){this._off(this.handles),this._on(this.handles,this._handleEvents),this._hoverable(this.handles),this._focusable(this.handles)},_destroy:function(){this.handles.remove(),this.range&&this.range.remove(),this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-widget ui-widget-content ui-corner-all"),this._mouseDestroy()},_mouseCapture:function(t){var i,s,n,a,o,r,h,l,u=this,d=this.options;return d.disabled?!1:(this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()},this.elementOffset=this.element.offset(),i={x:t.pageX,y:t.pageY},s=this._normValueFromMouse(i),n=this._valueMax()-this._valueMin()+1,this.handles.each(function(t){var i=Math.abs(s-u.values(t));(n>i||n===i&&(t===u._lastChangedValue||u.values(t)===d.min))&&(n=i,a=e(this),o=t)}),r=this._start(t,o),r===!1?!1:(this._mouseSliding=!0,this._handleIndex=o,a.addClass("ui-state-active").focus(),h=a.offset(),l=!e(t.target).parents().addBack().is(".ui-slider-handle"),this._clickOffset=l?{left:0,top:0}:{left:t.pageX-h.left-a.width()/2,top:t.pageY-h.top-a.height()/2-(parseInt(a.css("borderTopWidth"),10)||0)-(parseInt(a.css("borderBottomWidth"),10)||0)+(parseInt(a.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(t,o,s),this._animateOff=!0,!0))},_mouseStart:function(){return!0},_mouseDrag:function(e){var t={x:e.pageX,y:e.pageY},i=this._normValueFromMouse(t);return this._slide(e,this._handleIndex,i),!1},_mouseStop:function(e){return this.handles.removeClass("ui-state-active"),this._mouseSliding=!1,this._stop(e,this._handleIndex),this._change(e,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation="vertical"===this.options.orientation?"vertical":"horizontal"},_normValueFromMouse:function(e){var t,i,s,n,a;return"horizontal"===this.orientation?(t=this.elementSize.width,i=e.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(t=this.elementSize.height,i=e.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),s=i/t,s>1&&(s=1),0>s&&(s=0),"vertical"===this.orientation&&(s=1-s),n=this._valueMax()-this._valueMin(),a=this._valueMin()+s*n,this._trimAlignValue(a)},_start:function(e,t){var i={handle:this.handles[t],value:this.value()};return this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._trigger("start",e,i)},_slide:function(e,t,i){var s,n,a;this.options.values&&this.options.values.length?(s=this.values(t?0:1),2===this.options.values.length&&this.options.range===!0&&(0===t&&i>s||1===t&&s>i)&&(i=s),i!==this.values(t)&&(n=this.values(),n[t]=i,a=this._trigger("slide",e,{handle:this.handles[t],value:i,values:n}),s=this.values(t?0:1),a!==!1&&this.values(t,i))):i!==this.value()&&(a=this._trigger("slide",e,{handle:this.handles[t],value:i}),a!==!1&&this.value(i))},_stop:function(e,t){var i={handle:this.handles[t],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._trigger("stop",e,i)},_change:function(e,t){if(!this._keySliding&&!this._mouseSliding){var i={handle:this.handles[t],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._lastChangedValue=t,this._trigger("change",e,i)}},value:function(e){return arguments.length?(this.options.value=this._trimAlignValue(e),this._refreshValue(),this._change(null,0),void 0):this._value()},values:function(t,i){var s,n,a;if(arguments.length>1)return this.options.values[t]=this._trimAlignValue(i),this._refreshValue(),this._change(null,t),void 0;if(!arguments.length)return this._values();if(!e.isArray(arguments[0]))return this.options.values&&this.options.values.length?this._values(t):this.value();for(s=this.options.values,n=arguments[0],a=0;s.length>a;a+=1)s[a]=this._trimAlignValue(n[a]),this._change(null,a);this._refreshValue()},_setOption:function(t,i){var s,n=0;switch("range"===t&&this.options.range===!0&&("min"===i?(this.options.value=this._values(0),this.options.values=null):"max"===i&&(this.options.value=this._values(this.options.values.length-1),this.options.values=null)),e.isArray(this.options.values)&&(n=this.options.values.length),"disabled"===t&&this.element.toggleClass("ui-state-disabled",!!i),this._super(t,i),t){case"orientation":this._detectOrientation(),this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation),this._refreshValue(),this.handles.css("horizontal"===i?"bottom":"left","");break;case"value":this._animateOff=!0,this._refreshValue(),this._change(null,0),this._animateOff=!1;break;case"values":for(this._animateOff=!0,this._refreshValue(),s=0;n>s;s+=1)this._change(null,s);this._animateOff=!1;break;case"step":case"min":case"max":this._animateOff=!0,this._calculateNewMax(),this._refreshValue(),this._animateOff=!1;break;case"range":this._animateOff=!0,this._refresh(),this._animateOff=!1}},_value:function(){var e=this.options.value;return e=this._trimAlignValue(e)},_values:function(e){var t,i,s;if(arguments.length)return t=this.options.values[e],t=this._trimAlignValue(t);if(this.options.values&&this.options.values.length){for(i=this.options.values.slice(),s=0;i.length>s;s+=1)i[s]=this._trimAlignValue(i[s]);return i}return[]},_trimAlignValue:function(e){if(this._valueMin()>=e)return this._valueMin();if(e>=this._valueMax())return this._valueMax();var t=this.options.step>0?this.options.step:1,i=(e-this._valueMin())%t,s=e-i;return 2*Math.abs(i)>=t&&(s+=i>0?t:-t),parseFloat(s.toFixed(5))},_calculateNewMax:function(){var e=this.options.max,t=this._valueMin(),i=this.options.step,s=Math.floor(+(e-t).toFixed(this._precision())/i)*i;e=s+t,this.max=parseFloat(e.toFixed(this._precision()))},_precision:function(){var e=this._precisionOf(this.options.step);return null!==this.options.min&&(e=Math.max(e,this._precisionOf(this.options.min))),e},_precisionOf:function(e){var t=""+e,i=t.indexOf(".");return-1===i?0:t.length-i-1},_valueMin:function(){return this.options.min},_valueMax:function(){return this.max},_refreshValue:function(){var t,i,s,n,a,o=this.options.range,r=this.options,h=this,l=this._animateOff?!1:r.animate,u={};this.options.values&&this.options.values.length?this.handles.each(function(s){i=100*((h.values(s)-h._valueMin())/(h._valueMax()-h._valueMin())),u["horizontal"===h.orientation?"left":"bottom"]=i+"%",e(this).stop(1,1)[l?"animate":"css"](u,r.animate),h.options.range===!0&&("horizontal"===h.orientation?(0===s&&h.range.stop(1,1)[l?"animate":"css"]({left:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({width:i-t+"%"},{queue:!1,duration:r.animate})):(0===s&&h.range.stop(1,1)[l?"animate":"css"]({bottom:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({height:i-t+"%"},{queue:!1,duration:r.animate}))),t=i}):(s=this.value(),n=this._valueMin(),a=this._valueMax(),i=a!==n?100*((s-n)/(a-n)):0,u["horizontal"===this.orientation?"left":"bottom"]=i+"%",this.handle.stop(1,1)[l?"animate":"css"](u,r.animate),"min"===o&&"horizontal"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({width:i+"%"},r.animate),"max"===o&&"horizontal"===this.orientation&&this.range[l?"animate":"css"]({width:100-i+"%"},{queue:!1,duration:r.animate}),"min"===o&&"vertical"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({height:i+"%"},r.animate),"max"===o&&"vertical"===this.orientation&&this.range[l?"animate":"css"]({height:100-i+"%"},{queue:!1,duration:r.animate}))},_handleEvents:{keydown:function(t){var i,s,n,a,o=e(t.target).data("ui-slider-handle-index");switch(t.keyCode){case e.ui.keyCode.HOME:case e.ui.keyCode.END:case e.ui.keyCode.PAGE_UP:case e.ui.keyCode.PAGE_DOWN:case e.ui.keyCode.UP:case e.ui.keyCode.RIGHT:case e.ui.keyCode.DOWN:case e.ui.keyCode.LEFT:if(t.preventDefault(),!this._keySliding&&(this._keySliding=!0,e(t.target).addClass("ui-state-active"),i=this._start(t,o),i===!1))return}switch(a=this.options.step,s=n=this.options.values&&this.options.values.length?this.values(o):this.value(),t.keyCode){case e.ui.keyCode.HOME:n=this._valueMin();break;case e.ui.keyCode.END:n=this._valueMax();break;case e.ui.keyCode.PAGE_UP:n=this._trimAlignValue(s+(this._valueMax()-this._valueMin())/this.numPages);break;case e.ui.keyCode.PAGE_DOWN:n=this._trimAlignValue(s-(this._valueMax()-this._valueMin())/this.numPages);break;case e.ui.keyCode.UP:case e.ui.keyCode.RIGHT:if(s===this._valueMax())return;n=this._trimAlignValue(s+a);break;case e.ui.keyCode.DOWN:case e.ui.keyCode.LEFT:if(s===this._valueMin())return;n=this._trimAlignValue(s-a)}this._slide(t,o,n)},keyup:function(t){var i=e(t.target).data("ui-slider-handle-index");this._keySliding&&(this._keySliding=!1,this._stop(t,i),this._change(t,i),e(t.target).removeClass("ui-state-active"))}}}),e.widget("ui.spinner",{version:"1.11.4",defaultElement:"<input>",widgetEventPrefix:"spin",options:{culture:null,icons:{down:"ui-icon-triangle-1-s",up:"ui-icon-triangle-1-n"},incremental:!0,max:null,min:null,numberFormat:null,page:10,step:1,change:null,spin:null,start:null,stop:null},_create:function(){this._setOption("max",this.options.max),this._setOption("min",this.options.min),this._setOption("step",this.options.step),""!==this.value()&&this._value(this.element.val(),!0),this._draw(),this._on(this._events),this._refresh(),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_getCreateOptions:function(){var t={},i=this.element;return e.each(["min","max","step"],function(e,s){var n=i.attr(s);void 0!==n&&n.length&&(t[s]=n)}),t},_events:{keydown:function(e){this._start(e)&&this._keydown(e)&&e.preventDefault()},keyup:"_stop",focus:function(){this.previous=this.element.val()},blur:function(e){return this.cancelBlur?(delete this.cancelBlur,void 0):(this._stop(),this._refresh(),this.previous!==this.element.val()&&this._trigger("change",e),void 0)},mousewheel:function(e,t){if(t){if(!this.spinning&&!this._start(e))return!1;this._spin((t>0?1:-1)*this.options.step,e),clearTimeout(this.mousewheelTimer),this.mousewheelTimer=this._delay(function(){this.spinning&&this._stop(e)},100),e.preventDefault()}},"mousedown .ui-spinner-button":function(t){function i(){var e=this.element[0]===this.document[0].activeElement;e||(this.element.focus(),this.previous=s,this._delay(function(){this.previous=s}))}var s;s=this.element[0]===this.document[0].activeElement?this.previous:this.element.val(),t.preventDefault(),i.call(this),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,i.call(this)}),this._start(t)!==!1&&this._repeat(null,e(t.currentTarget).hasClass("ui-spinner-up")?1:-1,t)},"mouseup .ui-spinner-button":"_stop","mouseenter .ui-spinner-button":function(t){return e(t.currentTarget).hasClass("ui-state-active")?this._start(t)===!1?!1:(this._repeat(null,e(t.currentTarget).hasClass("ui-spinner-up")?1:-1,t),void 0):void 0},"mouseleave .ui-spinner-button":"_stop"},_draw:function(){var e=this.uiSpinner=this.element.addClass("ui-spinner-input").attr("autocomplete","off").wrap(this._uiSpinnerHtml()).parent().append(this._buttonHtml());this.element.attr("role","spinbutton"),this.buttons=e.find(".ui-spinner-button").attr("tabIndex",-1).button().removeClass("ui-corner-all"),this.buttons.height()>Math.ceil(.5*e.height())&&e.height()>0&&e.height(e.height()),this.options.disabled&&this.disable()
-},_keydown:function(t){var i=this.options,s=e.ui.keyCode;switch(t.keyCode){case s.UP:return this._repeat(null,1,t),!0;case s.DOWN:return this._repeat(null,-1,t),!0;case s.PAGE_UP:return this._repeat(null,i.page,t),!0;case s.PAGE_DOWN:return this._repeat(null,-i.page,t),!0}return!1},_uiSpinnerHtml:function(){return"<span class='ui-spinner ui-widget ui-widget-content ui-corner-all'></span>"},_buttonHtml:function(){return"<a class='ui-spinner-button ui-spinner-up ui-corner-tr'><span class='ui-icon "+this.options.icons.up+"'>&#9650;</span>"+"</a>"+"<a class='ui-spinner-button ui-spinner-down ui-corner-br'>"+"<span class='ui-icon "+this.options.icons.down+"'>&#9660;</span>"+"</a>"},_start:function(e){return this.spinning||this._trigger("start",e)!==!1?(this.counter||(this.counter=1),this.spinning=!0,!0):!1},_repeat:function(e,t,i){e=e||500,clearTimeout(this.timer),this.timer=this._delay(function(){this._repeat(40,t,i)},e),this._spin(t*this.options.step,i)},_spin:function(e,t){var i=this.value()||0;this.counter||(this.counter=1),i=this._adjustValue(i+e*this._increment(this.counter)),this.spinning&&this._trigger("spin",t,{value:i})===!1||(this._value(i),this.counter++)},_increment:function(t){var i=this.options.incremental;return i?e.isFunction(i)?i(t):Math.floor(t*t*t/5e4-t*t/500+17*t/200+1):1},_precision:function(){var e=this._precisionOf(this.options.step);return null!==this.options.min&&(e=Math.max(e,this._precisionOf(this.options.min))),e},_precisionOf:function(e){var t=""+e,i=t.indexOf(".");return-1===i?0:t.length-i-1},_adjustValue:function(e){var t,i,s=this.options;return t=null!==s.min?s.min:0,i=e-t,i=Math.round(i/s.step)*s.step,e=t+i,e=parseFloat(e.toFixed(this._precision())),null!==s.max&&e>s.max?s.max:null!==s.min&&s.min>e?s.min:e},_stop:function(e){this.spinning&&(clearTimeout(this.timer),clearTimeout(this.mousewheelTimer),this.counter=0,this.spinning=!1,this._trigger("stop",e))},_setOption:function(e,t){if("culture"===e||"numberFormat"===e){var i=this._parse(this.element.val());return this.options[e]=t,this.element.val(this._format(i)),void 0}("max"===e||"min"===e||"step"===e)&&"string"==typeof t&&(t=this._parse(t)),"icons"===e&&(this.buttons.first().find(".ui-icon").removeClass(this.options.icons.up).addClass(t.up),this.buttons.last().find(".ui-icon").removeClass(this.options.icons.down).addClass(t.down)),this._super(e,t),"disabled"===e&&(this.widget().toggleClass("ui-state-disabled",!!t),this.element.prop("disabled",!!t),this.buttons.button(t?"disable":"enable"))},_setOptions:h(function(e){this._super(e)}),_parse:function(e){return"string"==typeof e&&""!==e&&(e=window.Globalize&&this.options.numberFormat?Globalize.parseFloat(e,10,this.options.culture):+e),""===e||isNaN(e)?null:e},_format:function(e){return""===e?"":window.Globalize&&this.options.numberFormat?Globalize.format(e,this.options.numberFormat,this.options.culture):e},_refresh:function(){this.element.attr({"aria-valuemin":this.options.min,"aria-valuemax":this.options.max,"aria-valuenow":this._parse(this.element.val())})},isValid:function(){var e=this.value();return null===e?!1:e===this._adjustValue(e)},_value:function(e,t){var i;""!==e&&(i=this._parse(e),null!==i&&(t||(i=this._adjustValue(i)),e=this._format(i))),this.element.val(e),this._refresh()},_destroy:function(){this.element.removeClass("ui-spinner-input").prop("disabled",!1).removeAttr("autocomplete").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.uiSpinner.replaceWith(this.element)},stepUp:h(function(e){this._stepUp(e)}),_stepUp:function(e){this._start()&&(this._spin((e||1)*this.options.step),this._stop())},stepDown:h(function(e){this._stepDown(e)}),_stepDown:function(e){this._start()&&(this._spin((e||1)*-this.options.step),this._stop())},pageUp:h(function(e){this._stepUp((e||1)*this.options.page)}),pageDown:h(function(e){this._stepDown((e||1)*this.options.page)}),value:function(e){return arguments.length?(h(this._value).call(this,e),void 0):this._parse(this.element.val())},widget:function(){return this.uiSpinner}}),e.widget("ui.tabs",{version:"1.11.4",delay:300,options:{active:null,collapsible:!1,event:"click",heightStyle:"content",hide:null,show:null,activate:null,beforeActivate:null,beforeLoad:null,load:null},_isLocal:function(){var e=/#.*$/;return function(t){var i,s;t=t.cloneNode(!1),i=t.href.replace(e,""),s=location.href.replace(e,"");try{i=decodeURIComponent(i)}catch(n){}try{s=decodeURIComponent(s)}catch(n){}return t.hash.length>1&&i===s}}(),_create:function(){var t=this,i=this.options;this.running=!1,this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all").toggleClass("ui-tabs-collapsible",i.collapsible),this._processTabs(),i.active=this._initialActive(),e.isArray(i.disabled)&&(i.disabled=e.unique(i.disabled.concat(e.map(this.tabs.filter(".ui-state-disabled"),function(e){return t.tabs.index(e)}))).sort()),this.active=this.options.active!==!1&&this.anchors.length?this._findActive(i.active):e(),this._refresh(),this.active.length&&this.load(i.active)},_initialActive:function(){var t=this.options.active,i=this.options.collapsible,s=location.hash.substring(1);return null===t&&(s&&this.tabs.each(function(i,n){return e(n).attr("aria-controls")===s?(t=i,!1):void 0}),null===t&&(t=this.tabs.index(this.tabs.filter(".ui-tabs-active"))),(null===t||-1===t)&&(t=this.tabs.length?0:!1)),t!==!1&&(t=this.tabs.index(this.tabs.eq(t)),-1===t&&(t=i?!1:0)),!i&&t===!1&&this.anchors.length&&(t=0),t},_getCreateEventData:function(){return{tab:this.active,panel:this.active.length?this._getPanelForTab(this.active):e()}},_tabKeydown:function(t){var i=e(this.document[0].activeElement).closest("li"),s=this.tabs.index(i),n=!0;if(!this._handlePageNav(t)){switch(t.keyCode){case e.ui.keyCode.RIGHT:case e.ui.keyCode.DOWN:s++;break;case e.ui.keyCode.UP:case e.ui.keyCode.LEFT:n=!1,s--;break;case e.ui.keyCode.END:s=this.anchors.length-1;break;case e.ui.keyCode.HOME:s=0;break;case e.ui.keyCode.SPACE:return t.preventDefault(),clearTimeout(this.activating),this._activate(s),void 0;case e.ui.keyCode.ENTER:return t.preventDefault(),clearTimeout(this.activating),this._activate(s===this.options.active?!1:s),void 0;default:return}t.preventDefault(),clearTimeout(this.activating),s=this._focusNextTab(s,n),t.ctrlKey||t.metaKey||(i.attr("aria-selected","false"),this.tabs.eq(s).attr("aria-selected","true"),this.activating=this._delay(function(){this.option("active",s)},this.delay))}},_panelKeydown:function(t){this._handlePageNav(t)||t.ctrlKey&&t.keyCode===e.ui.keyCode.UP&&(t.preventDefault(),this.active.focus())},_handlePageNav:function(t){return t.altKey&&t.keyCode===e.ui.keyCode.PAGE_UP?(this._activate(this._focusNextTab(this.options.active-1,!1)),!0):t.altKey&&t.keyCode===e.ui.keyCode.PAGE_DOWN?(this._activate(this._focusNextTab(this.options.active+1,!0)),!0):void 0},_findNextTab:function(t,i){function s(){return t>n&&(t=0),0>t&&(t=n),t}for(var n=this.tabs.length-1;-1!==e.inArray(s(),this.options.disabled);)t=i?t+1:t-1;return t},_focusNextTab:function(e,t){return e=this._findNextTab(e,t),this.tabs.eq(e).focus(),e},_setOption:function(e,t){return"active"===e?(this._activate(t),void 0):"disabled"===e?(this._setupDisabled(t),void 0):(this._super(e,t),"collapsible"===e&&(this.element.toggleClass("ui-tabs-collapsible",t),t||this.options.active!==!1||this._activate(0)),"event"===e&&this._setupEvents(t),"heightStyle"===e&&this._setupHeightStyle(t),void 0)},_sanitizeSelector:function(e){return e?e.replace(/[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g,"\\$&"):""},refresh:function(){var t=this.options,i=this.tablist.children(":has(a[href])");t.disabled=e.map(i.filter(".ui-state-disabled"),function(e){return i.index(e)}),this._processTabs(),t.active!==!1&&this.anchors.length?this.active.length&&!e.contains(this.tablist[0],this.active[0])?this.tabs.length===t.disabled.length?(t.active=!1,this.active=e()):this._activate(this._findNextTab(Math.max(0,t.active-1),!1)):t.active=this.tabs.index(this.active):(t.active=!1,this.active=e()),this._refresh()},_refresh:function(){this._setupDisabled(this.options.disabled),this._setupEvents(this.options.event),this._setupHeightStyle(this.options.heightStyle),this.tabs.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}),this.panels.not(this._getPanelForTab(this.active)).hide().attr({"aria-hidden":"true"}),this.active.length?(this.active.addClass("ui-tabs-active ui-state-active").attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}),this._getPanelForTab(this.active).show().attr({"aria-hidden":"false"})):this.tabs.eq(0).attr("tabIndex",0)},_processTabs:function(){var t=this,i=this.tabs,s=this.anchors,n=this.panels;this.tablist=this._getList().addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").attr("role","tablist").delegate("> li","mousedown"+this.eventNamespace,function(t){e(this).is(".ui-state-disabled")&&t.preventDefault()}).delegate(".ui-tabs-anchor","focus"+this.eventNamespace,function(){e(this).closest("li").is(".ui-state-disabled")&&this.blur()}),this.tabs=this.tablist.find("> li:has(a[href])").addClass("ui-state-default ui-corner-top").attr({role:"tab",tabIndex:-1}),this.anchors=this.tabs.map(function(){return e("a",this)[0]}).addClass("ui-tabs-anchor").attr({role:"presentation",tabIndex:-1}),this.panels=e(),this.anchors.each(function(i,s){var n,a,o,r=e(s).uniqueId().attr("id"),h=e(s).closest("li"),l=h.attr("aria-controls");t._isLocal(s)?(n=s.hash,o=n.substring(1),a=t.element.find(t._sanitizeSelector(n))):(o=h.attr("aria-controls")||e({}).uniqueId()[0].id,n="#"+o,a=t.element.find(n),a.length||(a=t._createPanel(o),a.insertAfter(t.panels[i-1]||t.tablist)),a.attr("aria-live","polite")),a.length&&(t.panels=t.panels.add(a)),l&&h.data("ui-tabs-aria-controls",l),h.attr({"aria-controls":o,"aria-labelledby":r}),a.attr("aria-labelledby",r)}),this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").attr("role","tabpanel"),i&&(this._off(i.not(this.tabs)),this._off(s.not(this.anchors)),this._off(n.not(this.panels)))},_getList:function(){return this.tablist||this.element.find("ol,ul").eq(0)},_createPanel:function(t){return e("<div>").attr("id",t).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").data("ui-tabs-destroy",!0)},_setupDisabled:function(t){e.isArray(t)&&(t.length?t.length===this.anchors.length&&(t=!0):t=!1);for(var i,s=0;i=this.tabs[s];s++)t===!0||-1!==e.inArray(s,t)?e(i).addClass("ui-state-disabled").attr("aria-disabled","true"):e(i).removeClass("ui-state-disabled").removeAttr("aria-disabled");this.options.disabled=t},_setupEvents:function(t){var i={};t&&e.each(t.split(" "),function(e,t){i[t]="_eventHandler"}),this._off(this.anchors.add(this.tabs).add(this.panels)),this._on(!0,this.anchors,{click:function(e){e.preventDefault()}}),this._on(this.anchors,i),this._on(this.tabs,{keydown:"_tabKeydown"}),this._on(this.panels,{keydown:"_panelKeydown"}),this._focusable(this.tabs),this._hoverable(this.tabs)},_setupHeightStyle:function(t){var i,s=this.element.parent();"fill"===t?(i=s.height(),i-=this.element.outerHeight()-this.element.height(),this.element.siblings(":visible").each(function(){var t=e(this),s=t.css("position");"absolute"!==s&&"fixed"!==s&&(i-=t.outerHeight(!0))}),this.element.children().not(this.panels).each(function(){i-=e(this).outerHeight(!0)}),this.panels.each(function(){e(this).height(Math.max(0,i-e(this).innerHeight()+e(this).height()))}).css("overflow","auto")):"auto"===t&&(i=0,this.panels.each(function(){i=Math.max(i,e(this).height("").height())}).height(i))},_eventHandler:function(t){var i=this.options,s=this.active,n=e(t.currentTarget),a=n.closest("li"),o=a[0]===s[0],r=o&&i.collapsible,h=r?e():this._getPanelForTab(a),l=s.length?this._getPanelForTab(s):e(),u={oldTab:s,oldPanel:l,newTab:r?e():a,newPanel:h};t.preventDefault(),a.hasClass("ui-state-disabled")||a.hasClass("ui-tabs-loading")||this.running||o&&!i.collapsible||this._trigger("beforeActivate",t,u)===!1||(i.active=r?!1:this.tabs.index(a),this.active=o?e():a,this.xhr&&this.xhr.abort(),l.length||h.length||e.error("jQuery UI Tabs: Mismatching fragment identifier."),h.length&&this.load(this.tabs.index(a),t),this._toggle(t,u))},_toggle:function(t,i){function s(){a.running=!1,a._trigger("activate",t,i)}function n(){i.newTab.closest("li").addClass("ui-tabs-active ui-state-active"),o.length&&a.options.show?a._show(o,a.options.show,s):(o.show(),s())}var a=this,o=i.newPanel,r=i.oldPanel;this.running=!0,r.length&&this.options.hide?this._hide(r,this.options.hide,function(){i.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),n()}):(i.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),r.hide(),n()),r.attr("aria-hidden","true"),i.oldTab.attr({"aria-selected":"false","aria-expanded":"false"}),o.length&&r.length?i.oldTab.attr("tabIndex",-1):o.length&&this.tabs.filter(function(){return 0===e(this).attr("tabIndex")}).attr("tabIndex",-1),o.attr("aria-hidden","false"),i.newTab.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_activate:function(t){var i,s=this._findActive(t);s[0]!==this.active[0]&&(s.length||(s=this.active),i=s.find(".ui-tabs-anchor")[0],this._eventHandler({target:i,currentTarget:i,preventDefault:e.noop}))},_findActive:function(t){return t===!1?e():this.tabs.eq(t)},_getIndex:function(e){return"string"==typeof e&&(e=this.anchors.index(this.anchors.filter("[href$='"+e+"']"))),e},_destroy:function(){this.xhr&&this.xhr.abort(),this.element.removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible"),this.tablist.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").removeAttr("role"),this.anchors.removeClass("ui-tabs-anchor").removeAttr("role").removeAttr("tabIndex").removeUniqueId(),this.tablist.unbind(this.eventNamespace),this.tabs.add(this.panels).each(function(){e.data(this,"ui-tabs-destroy")?e(this).remove():e(this).removeClass("ui-state-default ui-state-active ui-state-disabled ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel").removeAttr("tabIndex").removeAttr("aria-live").removeAttr("aria-busy").removeAttr("aria-selected").removeAttr("aria-labelledby").removeAttr("aria-hidden").removeAttr("aria-expanded").removeAttr("role")}),this.tabs.each(function(){var t=e(this),i=t.data("ui-tabs-aria-controls");i?t.attr("aria-controls",i).removeData("ui-tabs-aria-controls"):t.removeAttr("aria-controls")}),this.panels.show(),"content"!==this.options.heightStyle&&this.panels.css("height","")},enable:function(t){var i=this.options.disabled;i!==!1&&(void 0===t?i=!1:(t=this._getIndex(t),i=e.isArray(i)?e.map(i,function(e){return e!==t?e:null}):e.map(this.tabs,function(e,i){return i!==t?i:null})),this._setupDisabled(i))},disable:function(t){var i=this.options.disabled;if(i!==!0){if(void 0===t)i=!0;else{if(t=this._getIndex(t),-1!==e.inArray(t,i))return;i=e.isArray(i)?e.merge([t],i).sort():[t]}this._setupDisabled(i)}},load:function(t,i){t=this._getIndex(t);var s=this,n=this.tabs.eq(t),a=n.find(".ui-tabs-anchor"),o=this._getPanelForTab(n),r={tab:n,panel:o},h=function(e,t){"abort"===t&&s.panels.stop(!1,!0),n.removeClass("ui-tabs-loading"),o.removeAttr("aria-busy"),e===s.xhr&&delete s.xhr};this._isLocal(a[0])||(this.xhr=e.ajax(this._ajaxSettings(a,i,r)),this.xhr&&"canceled"!==this.xhr.statusText&&(n.addClass("ui-tabs-loading"),o.attr("aria-busy","true"),this.xhr.done(function(e,t,n){setTimeout(function(){o.html(e),s._trigger("load",i,r),h(n,t)},1)}).fail(function(e,t){setTimeout(function(){h(e,t)},1)})))},_ajaxSettings:function(t,i,s){var n=this;return{url:t.attr("href"),beforeSend:function(t,a){return n._trigger("beforeLoad",i,e.extend({jqXHR:t,ajaxSettings:a},s))}}},_getPanelForTab:function(t){var i=e(t).attr("aria-controls");return this.element.find(this._sanitizeSelector("#"+i))}}),e.widget("ui.tooltip",{version:"1.11.4",options:{content:function(){var t=e(this).attr("title")||"";return e("<a>").text(t).html()},hide:!0,items:"[title]:not([disabled])",position:{my:"left top+15",at:"left bottom",collision:"flipfit flip"},show:!0,tooltipClass:null,track:!1,close:null,open:null},_addDescribedBy:function(t,i){var s=(t.attr("aria-describedby")||"").split(/\s+/);s.push(i),t.data("ui-tooltip-id",i).attr("aria-describedby",e.trim(s.join(" ")))},_removeDescribedBy:function(t){var i=t.data("ui-tooltip-id"),s=(t.attr("aria-describedby")||"").split(/\s+/),n=e.inArray(i,s);-1!==n&&s.splice(n,1),t.removeData("ui-tooltip-id"),s=e.trim(s.join(" ")),s?t.attr("aria-describedby",s):t.removeAttr("aria-describedby")},_create:function(){this._on({mouseover:"open",focusin:"open"}),this.tooltips={},this.parents={},this.options.disabled&&this._disable(),this.liveRegion=e("<div>").attr({role:"log","aria-live":"assertive","aria-relevant":"additions"}).addClass("ui-helper-hidden-accessible").appendTo(this.document[0].body)},_setOption:function(t,i){var s=this;return"disabled"===t?(this[i?"_disable":"_enable"](),this.options[t]=i,void 0):(this._super(t,i),"content"===t&&e.each(this.tooltips,function(e,t){s._updateContent(t.element)}),void 0)},_disable:function(){var t=this;e.each(this.tooltips,function(i,s){var n=e.Event("blur");n.target=n.currentTarget=s.element[0],t.close(n,!0)}),this.element.find(this.options.items).addBack().each(function(){var t=e(this);t.is("[title]")&&t.data("ui-tooltip-title",t.attr("title")).removeAttr("title")})},_enable:function(){this.element.find(this.options.items).addBack().each(function(){var t=e(this);t.data("ui-tooltip-title")&&t.attr("title",t.data("ui-tooltip-title"))})},open:function(t){var i=this,s=e(t?t.target:this.element).closest(this.options.items);s.length&&!s.data("ui-tooltip-id")&&(s.attr("title")&&s.data("ui-tooltip-title",s.attr("title")),s.data("ui-tooltip-open",!0),t&&"mouseover"===t.type&&s.parents().each(function(){var t,s=e(this);s.data("ui-tooltip-open")&&(t=e.Event("blur"),t.target=t.currentTarget=this,i.close(t,!0)),s.attr("title")&&(s.uniqueId(),i.parents[this.id]={element:this,title:s.attr("title")},s.attr("title",""))}),this._registerCloseHandlers(t,s),this._updateContent(s,t))},_updateContent:function(e,t){var i,s=this.options.content,n=this,a=t?t.type:null;return"string"==typeof s?this._open(t,e,s):(i=s.call(e[0],function(i){n._delay(function(){e.data("ui-tooltip-open")&&(t&&(t.type=a),this._open(t,e,i))})}),i&&this._open(t,e,i),void 0)},_open:function(t,i,s){function n(e){l.of=e,o.is(":hidden")||o.position(l)}var a,o,r,h,l=e.extend({},this.options.position);if(s){if(a=this._find(i))return a.tooltip.find(".ui-tooltip-content").html(s),void 0;i.is("[title]")&&(t&&"mouseover"===t.type?i.attr("title",""):i.removeAttr("title")),a=this._tooltip(i),o=a.tooltip,this._addDescribedBy(i,o.attr("id")),o.find(".ui-tooltip-content").html(s),this.liveRegion.children().hide(),s.clone?(h=s.clone(),h.removeAttr("id").find("[id]").removeAttr("id")):h=s,e("<div>").html(h).appendTo(this.liveRegion),this.options.track&&t&&/^mouse/.test(t.type)?(this._on(this.document,{mousemove:n}),n(t)):o.position(e.extend({of:i},this.options.position)),o.hide(),this._show(o,this.options.show),this.options.show&&this.options.show.delay&&(r=this.delayedShow=setInterval(function(){o.is(":visible")&&(n(l.of),clearInterval(r))},e.fx.interval)),this._trigger("open",t,{tooltip:o})}},_registerCloseHandlers:function(t,i){var s={keyup:function(t){if(t.keyCode===e.ui.keyCode.ESCAPE){var s=e.Event(t);s.currentTarget=i[0],this.close(s,!0)}}};i[0]!==this.element[0]&&(s.remove=function(){this._removeTooltip(this._find(i).tooltip)}),t&&"mouseover"!==t.type||(s.mouseleave="close"),t&&"focusin"!==t.type||(s.focusout="close"),this._on(!0,i,s)},close:function(t){var i,s=this,n=e(t?t.currentTarget:this.element),a=this._find(n);return a?(i=a.tooltip,a.closing||(clearInterval(this.delayedShow),n.data("ui-tooltip-title")&&!n.attr("title")&&n.attr("title",n.data("ui-tooltip-title")),this._removeDescribedBy(n),a.hiding=!0,i.stop(!0),this._hide(i,this.options.hide,function(){s._removeTooltip(e(this))}),n.removeData("ui-tooltip-open"),this._off(n,"mouseleave focusout keyup"),n[0]!==this.element[0]&&this._off(n,"remove"),this._off(this.document,"mousemove"),t&&"mouseleave"===t.type&&e.each(this.parents,function(t,i){e(i.element).attr("title",i.title),delete s.parents[t]}),a.closing=!0,this._trigger("close",t,{tooltip:i}),a.hiding||(a.closing=!1)),void 0):(n.removeData("ui-tooltip-open"),void 0)},_tooltip:function(t){var i=e("<div>").attr("role","tooltip").addClass("ui-tooltip ui-widget ui-corner-all ui-widget-content "+(this.options.tooltipClass||"")),s=i.uniqueId().attr("id");return e("<div>").addClass("ui-tooltip-content").appendTo(i),i.appendTo(this.document[0].body),this.tooltips[s]={element:t,tooltip:i}},_find:function(e){var t=e.data("ui-tooltip-id");return t?this.tooltips[t]:null},_removeTooltip:function(e){e.remove(),delete this.tooltips[e.attr("id")]},_destroy:function(){var t=this;e.each(this.tooltips,function(i,s){var n=e.Event("blur"),a=s.element;n.target=n.currentTarget=a[0],t.close(n,!0),e("#"+i).remove(),a.data("ui-tooltip-title")&&(a.attr("title")||a.attr("title",a.data("ui-tooltip-title")),a.removeData("ui-tooltip-title"))}),this.liveRegion.remove()}});var y="ui-effects-",b=e;e.effects={effect:{}},function(e,t){function i(e,t,i){var s=d[t.type]||{};return null==e?i||!t.def?null:t.def:(e=s.floor?~~e:parseFloat(e),isNaN(e)?t.def:s.mod?(e+s.mod)%s.mod:0>e?0:e>s.max?s.max:e)}function s(i){var s=l(),n=s._rgba=[];return i=i.toLowerCase(),f(h,function(e,a){var o,r=a.re.exec(i),h=r&&a.parse(r),l=a.space||"rgba";return h?(o=s[l](h),s[u[l].cache]=o[u[l].cache],n=s._rgba=o._rgba,!1):t}),n.length?("0,0,0,0"===n.join()&&e.extend(n,a.transparent),s):a[i]}function n(e,t,i){return i=(i+1)%1,1>6*i?e+6*(t-e)*i:1>2*i?t:2>3*i?e+6*(t-e)*(2/3-i):e}var a,o="backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",r=/^([\-+])=\s*(\d+\.?\d*)/,h=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(e){return[e[1],e[2],e[3],e[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(e){return[2.55*e[1],2.55*e[2],2.55*e[3],e[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(e){return[parseInt(e[1],16),parseInt(e[2],16),parseInt(e[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(e){return[parseInt(e[1]+e[1],16),parseInt(e[2]+e[2],16),parseInt(e[3]+e[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(e){return[e[1],e[2]/100,e[3]/100,e[4]]}}],l=e.Color=function(t,i,s,n){return new e.Color.fn.parse(t,i,s,n)},u={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},d={"byte":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},c=l.support={},p=e("<p>")[0],f=e.each;p.style.cssText="background-color:rgba(1,1,1,.5)",c.rgba=p.style.backgroundColor.indexOf("rgba")>-1,f(u,function(e,t){t.cache="_"+e,t.props.alpha={idx:3,type:"percent",def:1}}),l.fn=e.extend(l.prototype,{parse:function(n,o,r,h){if(n===t)return this._rgba=[null,null,null,null],this;(n.jquery||n.nodeType)&&(n=e(n).css(o),o=t);var d=this,c=e.type(n),p=this._rgba=[];return o!==t&&(n=[n,o,r,h],c="array"),"string"===c?this.parse(s(n)||a._default):"array"===c?(f(u.rgba.props,function(e,t){p[t.idx]=i(n[t.idx],t)}),this):"object"===c?(n instanceof l?f(u,function(e,t){n[t.cache]&&(d[t.cache]=n[t.cache].slice())}):f(u,function(t,s){var a=s.cache;f(s.props,function(e,t){if(!d[a]&&s.to){if("alpha"===e||null==n[e])return;d[a]=s.to(d._rgba)}d[a][t.idx]=i(n[e],t,!0)}),d[a]&&0>e.inArray(null,d[a].slice(0,3))&&(d[a][3]=1,s.from&&(d._rgba=s.from(d[a])))}),this):t},is:function(e){var i=l(e),s=!0,n=this;return f(u,function(e,a){var o,r=i[a.cache];return r&&(o=n[a.cache]||a.to&&a.to(n._rgba)||[],f(a.props,function(e,i){return null!=r[i.idx]?s=r[i.idx]===o[i.idx]:t})),s}),s},_space:function(){var e=[],t=this;return f(u,function(i,s){t[s.cache]&&e.push(i)}),e.pop()},transition:function(e,t){var s=l(e),n=s._space(),a=u[n],o=0===this.alpha()?l("transparent"):this,r=o[a.cache]||a.to(o._rgba),h=r.slice();return s=s[a.cache],f(a.props,function(e,n){var a=n.idx,o=r[a],l=s[a],u=d[n.type]||{};null!==l&&(null===o?h[a]=l:(u.mod&&(l-o>u.mod/2?o+=u.mod:o-l>u.mod/2&&(o-=u.mod)),h[a]=i((l-o)*t+o,n)))}),this[n](h)},blend:function(t){if(1===this._rgba[3])return this;var i=this._rgba.slice(),s=i.pop(),n=l(t)._rgba;return l(e.map(i,function(e,t){return(1-s)*n[t]+s*e}))},toRgbaString:function(){var t="rgba(",i=e.map(this._rgba,function(e,t){return null==e?t>2?1:0:e});return 1===i[3]&&(i.pop(),t="rgb("),t+i.join()+")"},toHslaString:function(){var t="hsla(",i=e.map(this.hsla(),function(e,t){return null==e&&(e=t>2?1:0),t&&3>t&&(e=Math.round(100*e)+"%"),e});return 1===i[3]&&(i.pop(),t="hsl("),t+i.join()+")"},toHexString:function(t){var i=this._rgba.slice(),s=i.pop();return t&&i.push(~~(255*s)),"#"+e.map(i,function(e){return e=(e||0).toString(16),1===e.length?"0"+e:e}).join("")},toString:function(){return 0===this._rgba[3]?"transparent":this.toRgbaString()}}),l.fn.parse.prototype=l.fn,u.hsla.to=function(e){if(null==e[0]||null==e[1]||null==e[2])return[null,null,null,e[3]];var t,i,s=e[0]/255,n=e[1]/255,a=e[2]/255,o=e[3],r=Math.max(s,n,a),h=Math.min(s,n,a),l=r-h,u=r+h,d=.5*u;return t=h===r?0:s===r?60*(n-a)/l+360:n===r?60*(a-s)/l+120:60*(s-n)/l+240,i=0===l?0:.5>=d?l/u:l/(2-u),[Math.round(t)%360,i,d,null==o?1:o]},u.hsla.from=function(e){if(null==e[0]||null==e[1]||null==e[2])return[null,null,null,e[3]];var t=e[0]/360,i=e[1],s=e[2],a=e[3],o=.5>=s?s*(1+i):s+i-s*i,r=2*s-o;return[Math.round(255*n(r,o,t+1/3)),Math.round(255*n(r,o,t)),Math.round(255*n(r,o,t-1/3)),a]},f(u,function(s,n){var a=n.props,o=n.cache,h=n.to,u=n.from;l.fn[s]=function(s){if(h&&!this[o]&&(this[o]=h(this._rgba)),s===t)return this[o].slice();var n,r=e.type(s),d="array"===r||"object"===r?s:arguments,c=this[o].slice();return f(a,function(e,t){var s=d["object"===r?e:t.idx];null==s&&(s=c[t.idx]),c[t.idx]=i(s,t)}),u?(n=l(u(c)),n[o]=c,n):l(c)},f(a,function(t,i){l.fn[t]||(l.fn[t]=function(n){var a,o=e.type(n),h="alpha"===t?this._hsla?"hsla":"rgba":s,l=this[h](),u=l[i.idx];return"undefined"===o?u:("function"===o&&(n=n.call(this,u),o=e.type(n)),null==n&&i.empty?this:("string"===o&&(a=r.exec(n),a&&(n=u+parseFloat(a[2])*("+"===a[1]?1:-1))),l[i.idx]=n,this[h](l)))})})}),l.hook=function(t){var i=t.split(" ");f(i,function(t,i){e.cssHooks[i]={set:function(t,n){var a,o,r="";if("transparent"!==n&&("string"!==e.type(n)||(a=s(n)))){if(n=l(a||n),!c.rgba&&1!==n._rgba[3]){for(o="backgroundColor"===i?t.parentNode:t;(""===r||"transparent"===r)&&o&&o.style;)try{r=e.css(o,"backgroundColor"),o=o.parentNode}catch(h){}n=n.blend(r&&"transparent"!==r?r:"_default")}n=n.toRgbaString()}try{t.style[i]=n}catch(h){}}},e.fx.step[i]=function(t){t.colorInit||(t.start=l(t.elem,i),t.end=l(t.end),t.colorInit=!0),e.cssHooks[i].set(t.elem,t.start.transition(t.end,t.pos))}})},l.hook(o),e.cssHooks.borderColor={expand:function(e){var t={};return f(["Top","Right","Bottom","Left"],function(i,s){t["border"+s+"Color"]=e}),t}},a=e.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(b),function(){function t(t){var i,s,n=t.ownerDocument.defaultView?t.ownerDocument.defaultView.getComputedStyle(t,null):t.currentStyle,a={};if(n&&n.length&&n[0]&&n[n[0]])for(s=n.length;s--;)i=n[s],"string"==typeof n[i]&&(a[e.camelCase(i)]=n[i]);else for(i in n)"string"==typeof n[i]&&(a[i]=n[i]);return a}function i(t,i){var s,a,o={};for(s in i)a=i[s],t[s]!==a&&(n[s]||(e.fx.step[s]||!isNaN(parseFloat(a)))&&(o[s]=a));return o}var s=["add","remove","toggle"],n={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};e.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(t,i){e.fx.step[i]=function(e){("none"!==e.end&&!e.setAttr||1===e.pos&&!e.setAttr)&&(b.style(e.elem,i,e.end),e.setAttr=!0)}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e.effects.animateClass=function(n,a,o,r){var h=e.speed(a,o,r);return this.queue(function(){var a,o=e(this),r=o.attr("class")||"",l=h.children?o.find("*").addBack():o;l=l.map(function(){var i=e(this);return{el:i,start:t(this)}}),a=function(){e.each(s,function(e,t){n[t]&&o[t+"Class"](n[t])})},a(),l=l.map(function(){return this.end=t(this.el[0]),this.diff=i(this.start,this.end),this}),o.attr("class",r),l=l.map(function(){var t=this,i=e.Deferred(),s=e.extend({},h,{queue:!1,complete:function(){i.resolve(t)}});return this.el.animate(this.diff,s),i.promise()}),e.when.apply(e,l.get()).done(function(){a(),e.each(arguments,function(){var t=this.el;e.each(this.diff,function(e){t.css(e,"")})}),h.complete.call(o[0])})})},e.fn.extend({addClass:function(t){return function(i,s,n,a){return s?e.effects.animateClass.call(this,{add:i},s,n,a):t.apply(this,arguments)}}(e.fn.addClass),removeClass:function(t){return function(i,s,n,a){return arguments.length>1?e.effects.animateClass.call(this,{remove:i},s,n,a):t.apply(this,arguments)}}(e.fn.removeClass),toggleClass:function(t){return function(i,s,n,a,o){return"boolean"==typeof s||void 0===s?n?e.effects.animateClass.call(this,s?{add:i}:{remove:i},n,a,o):t.apply(this,arguments):e.effects.animateClass.call(this,{toggle:i},s,n,a)}}(e.fn.toggleClass),switchClass:function(t,i,s,n,a){return e.effects.animateClass.call(this,{add:i,remove:t},s,n,a)}})}(),function(){function t(t,i,s,n){return e.isPlainObject(t)&&(i=t,t=t.effect),t={effect:t},null==i&&(i={}),e.isFunction(i)&&(n=i,s=null,i={}),("number"==typeof i||e.fx.speeds[i])&&(n=s,s=i,i={}),e.isFunction(s)&&(n=s,s=null),i&&e.extend(t,i),s=s||i.duration,t.duration=e.fx.off?0:"number"==typeof s?s:s in e.fx.speeds?e.fx.speeds[s]:e.fx.speeds._default,t.complete=n||i.complete,t}function i(t){return!t||"number"==typeof t||e.fx.speeds[t]?!0:"string"!=typeof t||e.effects.effect[t]?e.isFunction(t)?!0:"object"!=typeof t||t.effect?!1:!0:!0}e.extend(e.effects,{version:"1.11.4",save:function(e,t){for(var i=0;t.length>i;i++)null!==t[i]&&e.data(y+t[i],e[0].style[t[i]])},restore:function(e,t){var i,s;for(s=0;t.length>s;s++)null!==t[s]&&(i=e.data(y+t[s]),void 0===i&&(i=""),e.css(t[s],i))},setMode:function(e,t){return"toggle"===t&&(t=e.is(":hidden")?"show":"hide"),t},getBaseline:function(e,t){var i,s;switch(e[0]){case"top":i=0;break;case"middle":i=.5;break;case"bottom":i=1;break;default:i=e[0]/t.height}switch(e[1]){case"left":s=0;break;case"center":s=.5;break;case"right":s=1;break;default:s=e[1]/t.width}return{x:s,y:i}},createWrapper:function(t){if(t.parent().is(".ui-effects-wrapper"))return t.parent();var i={width:t.outerWidth(!0),height:t.outerHeight(!0),"float":t.css("float")},s=e("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),n={width:t.width(),height:t.height()},a=document.activeElement;try{a.id}catch(o){a=document.body}return t.wrap(s),(t[0]===a||e.contains(t[0],a))&&e(a).focus(),s=t.parent(),"static"===t.css("position")?(s.css({position:"relative"}),t.css({position:"relative"})):(e.extend(i,{position:t.css("position"),zIndex:t.css("z-index")}),e.each(["top","left","bottom","right"],function(e,s){i[s]=t.css(s),isNaN(parseInt(i[s],10))&&(i[s]="auto")}),t.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),t.css(n),s.css(i).show()},removeWrapper:function(t){var i=document.activeElement;
-return t.parent().is(".ui-effects-wrapper")&&(t.parent().replaceWith(t),(t[0]===i||e.contains(t[0],i))&&e(i).focus()),t},setTransition:function(t,i,s,n){return n=n||{},e.each(i,function(e,i){var a=t.cssUnit(i);a[0]>0&&(n[i]=a[0]*s+a[1])}),n}}),e.fn.extend({effect:function(){function i(t){function i(){e.isFunction(a)&&a.call(n[0]),e.isFunction(t)&&t()}var n=e(this),a=s.complete,r=s.mode;(n.is(":hidden")?"hide"===r:"show"===r)?(n[r](),i()):o.call(n[0],s,i)}var s=t.apply(this,arguments),n=s.mode,a=s.queue,o=e.effects.effect[s.effect];return e.fx.off||!o?n?this[n](s.duration,s.complete):this.each(function(){s.complete&&s.complete.call(this)}):a===!1?this.each(i):this.queue(a||"fx",i)},show:function(e){return function(s){if(i(s))return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode="show",this.effect.call(this,n)}}(e.fn.show),hide:function(e){return function(s){if(i(s))return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode="hide",this.effect.call(this,n)}}(e.fn.hide),toggle:function(e){return function(s){if(i(s)||"boolean"==typeof s)return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode="toggle",this.effect.call(this,n)}}(e.fn.toggle),cssUnit:function(t){var i=this.css(t),s=[];return e.each(["em","px","%","pt"],function(e,t){i.indexOf(t)>0&&(s=[parseFloat(i),t])}),s}})}(),function(){var t={};e.each(["Quad","Cubic","Quart","Quint","Expo"],function(e,i){t[i]=function(t){return Math.pow(t,e+2)}}),e.extend(t,{Sine:function(e){return 1-Math.cos(e*Math.PI/2)},Circ:function(e){return 1-Math.sqrt(1-e*e)},Elastic:function(e){return 0===e||1===e?e:-Math.pow(2,8*(e-1))*Math.sin((80*(e-1)-7.5)*Math.PI/15)},Back:function(e){return e*e*(3*e-2)},Bounce:function(e){for(var t,i=4;((t=Math.pow(2,--i))-1)/11>e;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*t-2)/22-e,2)}}),e.each(t,function(t,i){e.easing["easeIn"+t]=i,e.easing["easeOut"+t]=function(e){return 1-i(1-e)},e.easing["easeInOut"+t]=function(e){return.5>e?i(2*e)/2:1-i(-2*e+2)/2}})}(),e.effects,e.effects.effect.blind=function(t,i){var s,n,a,o=e(this),r=/up|down|vertical/,h=/up|left|vertical|horizontal/,l=["position","top","bottom","left","right","height","width"],u=e.effects.setMode(o,t.mode||"hide"),d=t.direction||"up",c=r.test(d),p=c?"height":"width",f=c?"top":"left",m=h.test(d),g={},v="show"===u;o.parent().is(".ui-effects-wrapper")?e.effects.save(o.parent(),l):e.effects.save(o,l),o.show(),s=e.effects.createWrapper(o).css({overflow:"hidden"}),n=s[p](),a=parseFloat(s.css(f))||0,g[p]=v?n:0,m||(o.css(c?"bottom":"right",0).css(c?"top":"left","auto").css({position:"absolute"}),g[f]=v?a:n+a),v&&(s.css(p,0),m||s.css(f,a+n)),s.animate(g,{duration:t.duration,easing:t.easing,queue:!1,complete:function(){"hide"===u&&o.hide(),e.effects.restore(o,l),e.effects.removeWrapper(o),i()}})},e.effects.effect.bounce=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","height","width"],h=e.effects.setMode(o,t.mode||"effect"),l="hide"===h,u="show"===h,d=t.direction||"up",c=t.distance,p=t.times||5,f=2*p+(u||l?1:0),m=t.duration/f,g=t.easing,v="up"===d||"down"===d?"top":"left",y="up"===d||"left"===d,b=o.queue(),_=b.length;for((u||l)&&r.push("opacity"),e.effects.save(o,r),o.show(),e.effects.createWrapper(o),c||(c=o["top"===v?"outerHeight":"outerWidth"]()/3),u&&(a={opacity:1},a[v]=0,o.css("opacity",0).css(v,y?2*-c:2*c).animate(a,m,g)),l&&(c/=Math.pow(2,p-1)),a={},a[v]=0,s=0;p>s;s++)n={},n[v]=(y?"-=":"+=")+c,o.animate(n,m,g).animate(a,m,g),c=l?2*c:c/2;l&&(n={opacity:0},n[v]=(y?"-=":"+=")+c,o.animate(n,m,g)),o.queue(function(){l&&o.hide(),e.effects.restore(o,r),e.effects.removeWrapper(o),i()}),_>1&&b.splice.apply(b,[1,0].concat(b.splice(_,f+1))),o.dequeue()},e.effects.effect.clip=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","height","width"],h=e.effects.setMode(o,t.mode||"hide"),l="show"===h,u=t.direction||"vertical",d="vertical"===u,c=d?"height":"width",p=d?"top":"left",f={};e.effects.save(o,r),o.show(),s=e.effects.createWrapper(o).css({overflow:"hidden"}),n="IMG"===o[0].tagName?s:o,a=n[c](),l&&(n.css(c,0),n.css(p,a/2)),f[c]=l?a:0,f[p]=l?0:a/2,n.animate(f,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){l||o.hide(),e.effects.restore(o,r),e.effects.removeWrapper(o),i()}})},e.effects.effect.drop=function(t,i){var s,n=e(this),a=["position","top","bottom","left","right","opacity","height","width"],o=e.effects.setMode(n,t.mode||"hide"),r="show"===o,h=t.direction||"left",l="up"===h||"down"===h?"top":"left",u="up"===h||"left"===h?"pos":"neg",d={opacity:r?1:0};e.effects.save(n,a),n.show(),e.effects.createWrapper(n),s=t.distance||n["top"===l?"outerHeight":"outerWidth"](!0)/2,r&&n.css("opacity",0).css(l,"pos"===u?-s:s),d[l]=(r?"pos"===u?"+=":"-=":"pos"===u?"-=":"+=")+s,n.animate(d,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}})},e.effects.effect.explode=function(t,i){function s(){b.push(this),b.length===d*c&&n()}function n(){p.css({visibility:"visible"}),e(b).remove(),m||p.hide(),i()}var a,o,r,h,l,u,d=t.pieces?Math.round(Math.sqrt(t.pieces)):3,c=d,p=e(this),f=e.effects.setMode(p,t.mode||"hide"),m="show"===f,g=p.show().css("visibility","hidden").offset(),v=Math.ceil(p.outerWidth()/c),y=Math.ceil(p.outerHeight()/d),b=[];for(a=0;d>a;a++)for(h=g.top+a*y,u=a-(d-1)/2,o=0;c>o;o++)r=g.left+o*v,l=o-(c-1)/2,p.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-o*v,top:-a*y}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:v,height:y,left:r+(m?l*v:0),top:h+(m?u*y:0),opacity:m?0:1}).animate({left:r+(m?0:l*v),top:h+(m?0:u*y),opacity:m?1:0},t.duration||500,t.easing,s)},e.effects.effect.fade=function(t,i){var s=e(this),n=e.effects.setMode(s,t.mode||"toggle");s.animate({opacity:n},{queue:!1,duration:t.duration,easing:t.easing,complete:i})},e.effects.effect.fold=function(t,i){var s,n,a=e(this),o=["position","top","bottom","left","right","height","width"],r=e.effects.setMode(a,t.mode||"hide"),h="show"===r,l="hide"===r,u=t.size||15,d=/([0-9]+)%/.exec(u),c=!!t.horizFirst,p=h!==c,f=p?["width","height"]:["height","width"],m=t.duration/2,g={},v={};e.effects.save(a,o),a.show(),s=e.effects.createWrapper(a).css({overflow:"hidden"}),n=p?[s.width(),s.height()]:[s.height(),s.width()],d&&(u=parseInt(d[1],10)/100*n[l?0:1]),h&&s.css(c?{height:0,width:u}:{height:u,width:0}),g[f[0]]=h?n[0]:u,v[f[1]]=h?n[1]:0,s.animate(g,m,t.easing).animate(v,m,t.easing,function(){l&&a.hide(),e.effects.restore(a,o),e.effects.removeWrapper(a),i()})},e.effects.effect.highlight=function(t,i){var s=e(this),n=["backgroundImage","backgroundColor","opacity"],a=e.effects.setMode(s,t.mode||"show"),o={backgroundColor:s.css("backgroundColor")};"hide"===a&&(o.opacity=0),e.effects.save(s,n),s.show().css({backgroundImage:"none",backgroundColor:t.color||"#ffff99"}).animate(o,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===a&&s.hide(),e.effects.restore(s,n),i()}})},e.effects.effect.size=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","width","height","overflow","opacity"],h=["position","top","bottom","left","right","overflow","opacity"],l=["width","height","overflow"],u=["fontSize"],d=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],c=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],p=e.effects.setMode(o,t.mode||"effect"),f=t.restore||"effect"!==p,m=t.scale||"both",g=t.origin||["middle","center"],v=o.css("position"),y=f?r:h,b={height:0,width:0,outerHeight:0,outerWidth:0};"show"===p&&o.show(),s={height:o.height(),width:o.width(),outerHeight:o.outerHeight(),outerWidth:o.outerWidth()},"toggle"===t.mode&&"show"===p?(o.from=t.to||b,o.to=t.from||s):(o.from=t.from||("show"===p?b:s),o.to=t.to||("hide"===p?b:s)),a={from:{y:o.from.height/s.height,x:o.from.width/s.width},to:{y:o.to.height/s.height,x:o.to.width/s.width}},("box"===m||"both"===m)&&(a.from.y!==a.to.y&&(y=y.concat(d),o.from=e.effects.setTransition(o,d,a.from.y,o.from),o.to=e.effects.setTransition(o,d,a.to.y,o.to)),a.from.x!==a.to.x&&(y=y.concat(c),o.from=e.effects.setTransition(o,c,a.from.x,o.from),o.to=e.effects.setTransition(o,c,a.to.x,o.to))),("content"===m||"both"===m)&&a.from.y!==a.to.y&&(y=y.concat(u).concat(l),o.from=e.effects.setTransition(o,u,a.from.y,o.from),o.to=e.effects.setTransition(o,u,a.to.y,o.to)),e.effects.save(o,y),o.show(),e.effects.createWrapper(o),o.css("overflow","hidden").css(o.from),g&&(n=e.effects.getBaseline(g,s),o.from.top=(s.outerHeight-o.outerHeight())*n.y,o.from.left=(s.outerWidth-o.outerWidth())*n.x,o.to.top=(s.outerHeight-o.to.outerHeight)*n.y,o.to.left=(s.outerWidth-o.to.outerWidth)*n.x),o.css(o.from),("content"===m||"both"===m)&&(d=d.concat(["marginTop","marginBottom"]).concat(u),c=c.concat(["marginLeft","marginRight"]),l=r.concat(d).concat(c),o.find("*[width]").each(function(){var i=e(this),s={height:i.height(),width:i.width(),outerHeight:i.outerHeight(),outerWidth:i.outerWidth()};f&&e.effects.save(i,l),i.from={height:s.height*a.from.y,width:s.width*a.from.x,outerHeight:s.outerHeight*a.from.y,outerWidth:s.outerWidth*a.from.x},i.to={height:s.height*a.to.y,width:s.width*a.to.x,outerHeight:s.height*a.to.y,outerWidth:s.width*a.to.x},a.from.y!==a.to.y&&(i.from=e.effects.setTransition(i,d,a.from.y,i.from),i.to=e.effects.setTransition(i,d,a.to.y,i.to)),a.from.x!==a.to.x&&(i.from=e.effects.setTransition(i,c,a.from.x,i.from),i.to=e.effects.setTransition(i,c,a.to.x,i.to)),i.css(i.from),i.animate(i.to,t.duration,t.easing,function(){f&&e.effects.restore(i,l)})})),o.animate(o.to,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){0===o.to.opacity&&o.css("opacity",o.from.opacity),"hide"===p&&o.hide(),e.effects.restore(o,y),f||("static"===v?o.css({position:"relative",top:o.to.top,left:o.to.left}):e.each(["top","left"],function(e,t){o.css(t,function(t,i){var s=parseInt(i,10),n=e?o.to.left:o.to.top;return"auto"===i?n+"px":s+n+"px"})})),e.effects.removeWrapper(o),i()}})},e.effects.effect.scale=function(t,i){var s=e(this),n=e.extend(!0,{},t),a=e.effects.setMode(s,t.mode||"effect"),o=parseInt(t.percent,10)||(0===parseInt(t.percent,10)?0:"hide"===a?0:100),r=t.direction||"both",h=t.origin,l={height:s.height(),width:s.width(),outerHeight:s.outerHeight(),outerWidth:s.outerWidth()},u={y:"horizontal"!==r?o/100:1,x:"vertical"!==r?o/100:1};n.effect="size",n.queue=!1,n.complete=i,"effect"!==a&&(n.origin=h||["middle","center"],n.restore=!0),n.from=t.from||("show"===a?{height:0,width:0,outerHeight:0,outerWidth:0}:l),n.to={height:l.height*u.y,width:l.width*u.x,outerHeight:l.outerHeight*u.y,outerWidth:l.outerWidth*u.x},n.fade&&("show"===a&&(n.from.opacity=0,n.to.opacity=1),"hide"===a&&(n.from.opacity=1,n.to.opacity=0)),s.effect(n)},e.effects.effect.puff=function(t,i){var s=e(this),n=e.effects.setMode(s,t.mode||"hide"),a="hide"===n,o=parseInt(t.percent,10)||150,r=o/100,h={height:s.height(),width:s.width(),outerHeight:s.outerHeight(),outerWidth:s.outerWidth()};e.extend(t,{effect:"scale",queue:!1,fade:!0,mode:n,complete:i,percent:a?o:100,from:a?h:{height:h.height*r,width:h.width*r,outerHeight:h.outerHeight*r,outerWidth:h.outerWidth*r}}),s.effect(t)},e.effects.effect.pulsate=function(t,i){var s,n=e(this),a=e.effects.setMode(n,t.mode||"show"),o="show"===a,r="hide"===a,h=o||"hide"===a,l=2*(t.times||5)+(h?1:0),u=t.duration/l,d=0,c=n.queue(),p=c.length;for((o||!n.is(":visible"))&&(n.css("opacity",0).show(),d=1),s=1;l>s;s++)n.animate({opacity:d},u,t.easing),d=1-d;n.animate({opacity:d},u,t.easing),n.queue(function(){r&&n.hide(),i()}),p>1&&c.splice.apply(c,[1,0].concat(c.splice(p,l+1))),n.dequeue()},e.effects.effect.shake=function(t,i){var s,n=e(this),a=["position","top","bottom","left","right","height","width"],o=e.effects.setMode(n,t.mode||"effect"),r=t.direction||"left",h=t.distance||20,l=t.times||3,u=2*l+1,d=Math.round(t.duration/u),c="up"===r||"down"===r?"top":"left",p="up"===r||"left"===r,f={},m={},g={},v=n.queue(),y=v.length;for(e.effects.save(n,a),n.show(),e.effects.createWrapper(n),f[c]=(p?"-=":"+=")+h,m[c]=(p?"+=":"-=")+2*h,g[c]=(p?"-=":"+=")+2*h,n.animate(f,d,t.easing),s=1;l>s;s++)n.animate(m,d,t.easing).animate(g,d,t.easing);n.animate(m,d,t.easing).animate(f,d/2,t.easing).queue(function(){"hide"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}),y>1&&v.splice.apply(v,[1,0].concat(v.splice(y,u+1))),n.dequeue()},e.effects.effect.slide=function(t,i){var s,n=e(this),a=["position","top","bottom","left","right","width","height"],o=e.effects.setMode(n,t.mode||"show"),r="show"===o,h=t.direction||"left",l="up"===h||"down"===h?"top":"left",u="up"===h||"left"===h,d={};e.effects.save(n,a),n.show(),s=t.distance||n["top"===l?"outerHeight":"outerWidth"](!0),e.effects.createWrapper(n).css({overflow:"hidden"}),r&&n.css(l,u?isNaN(s)?"-"+s:-s:s),d[l]=(r?u?"+=":"-=":u?"-=":"+=")+s,n.animate(d,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}})},e.effects.effect.transfer=function(t,i){var s=e(this),n=e(t.to),a="fixed"===n.css("position"),o=e("body"),r=a?o.scrollTop():0,h=a?o.scrollLeft():0,l=n.offset(),u={top:l.top-r,left:l.left-h,height:n.innerHeight(),width:n.innerWidth()},d=s.offset(),c=e("<div class='ui-effects-transfer'></div>").appendTo(document.body).addClass(t.className).css({top:d.top-r,left:d.left-h,height:s.innerHeight(),width:s.innerWidth(),position:a?"fixed":"absolute"}).animate(u,t.duration,t.easing,function(){c.remove(),i()})}});
\ No newline at end of file
diff --git a/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/jquery-ui.structure.min.css b/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/jquery-ui.structure.min.css
deleted file mode 100644
index ec1a396..0000000
--- a/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/jquery-ui.structure.min.css
+++ /dev/null
@@ -1,5 +0,0 @@
-/*! jQuery UI - v1.11.4 - 2016-02-28
-* http://jqueryui.com
-* Copyright jQuery Foundation and other contributors; Licensed MIT */
-
-.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;min-height:0;font-size:100%}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{overflow:hidden;position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:none}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{position:relative;margin:0;padding:3px 1em 3px .4em;cursor:pointer;min-height:0;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-button{display:inline-block;overflow:hidden;position:relative;text-decoration:none;cursor:pointer}.ui-selectmenu-button span.ui-icon{right:0.5em;left:auto;margin-top:-8px;position:absolute;top:50%}.ui-selectmenu-button span.ui-selectmenu-text{text-align:left;padding:0.4em 2.1em 0.4em 1em;display:block;line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px}
\ No newline at end of file
diff --git a/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/jquery-ui.theme.min.css b/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/jquery-ui.theme.min.css
deleted file mode 100644
index 2304485..0000000
--- a/console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/jquery-ui.theme.min.css
+++ /dev/null
@@ -1,5 +0,0 @@
-/*! jQuery UI - v1.11.4 - 2016-03-01
-* http://jqueryui.com
-* Copyright jQuery Foundation and other contributors; Licensed MIT */
-
-.ui-widget{font-family:Lucida Grande,Lucida Sans,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Lucida Grande,Lucida Sans,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #ddd;background:#f2f5f7 url("images/ui-bg_highlight-hard_100_f2f5f7_1x100.png") 50% top repeat-x;color:#362b36}.ui-widget-content a{color:#362b36}.ui-widget-header{border:1px solid #aed0ea;background:#deedf7 url("images/ui-bg_highlight-soft_100_deedf7_1x100.png") 50% 50% repeat-x;color:#222;font-weight:bold}.ui-widget-header a{color:#222}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #aed0ea;background:#d7ebf9 url("images/ui-bg_glass_80_d7ebf9_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#2779aa}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#2779aa;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #74b2e2;background:#e4f1fb url("images/ui-bg_glass_100_e4f1fb_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#0070a3}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#0070a3;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #2694e8;background:#3baae3 url("images/ui-bg_glass_50_3baae3_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #f9dd34;background:#ffef8f url("images/ui-bg_highlight-soft_25_ffef8f_1x100.png") 50% top repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#cd0a0a;color:#fff}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#fff}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#fff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_72a7cf_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_72a7cf_256x240.png")}.ui-state-default .ui-icon{background-image:url("images/ui-icons_3d80b3_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url("images/ui-icons_2694e8_256x240.png")}.ui-state-active .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-highlight .ui-icon{background-image:url("images/ui-icons_2e83ff_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:6px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:6px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:6px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:6px}.ui-widget-overlay{background:#eee url("images/ui-bg_diagonals-thick_90_eeeeee_40x40.png") 50% 50% repeat;opacity:.8;filter:Alpha(Opacity=80)}.ui-widget-shadow{margin:-7px 0 0 -7px;padding:7px;background:#000 url("images/ui-bg_highlight-hard_70_000000_1x100.png") 50% top repeat-x;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px}
\ No newline at end of file
diff --git a/console/servlets/webapp_content/js/ext/sankey_edgent.js b/console/servlets/webapp_content/js/ext/sankey_edgent.js
deleted file mode 100644
index f127a46..0000000
--- a/console/servlets/webapp_content/js/ext/sankey_edgent.js
+++ /dev/null
@@ -1,293 +0,0 @@
-d3.sankey = function() {
-  var sankey = {},
-      nodeWidth = 24,
-      nodePadding = 8,
-      size = [1, 1],
-      nodes = [],
-      links = [];
-
-  sankey.nodeWidth = function(_) {
-    if (!arguments.length) return nodeWidth;
-    nodeWidth = +_;
-    return sankey;
-  };
-
-  sankey.nodePadding = function(_) {
-    if (!arguments.length) return nodePadding;
-    nodePadding = +_;
-    return sankey;
-  };
-
-  sankey.nodes = function(_) {
-    if (!arguments.length) return nodes;
-    nodes = _;
-    return sankey;
-  };
-
-  sankey.links = function(_) {
-    if (!arguments.length) return links;
-    links = _;
-    return sankey;
-  };
-
-  sankey.size = function(_) {
-    if (!arguments.length) return size;
-    size = _;
-    return sankey;
-  };
-
-  sankey.layout = function(iterations) {
-    computeNodeLinks();
-    computeNodeValues();
-    computeNodeBreadths();
-    computeNodeDepths(iterations);
-    computeLinkDepths();
-    return sankey;
-  };
-
-  sankey.relayout = function() {
-    computeLinkDepths();
-    return sankey;
-  };
-
-  sankey.link = function() {
-    var curvature = .5;
-
-    function link(d) {
-        var x0 = d.sourceIdx.x + d.sourceIdx.dx,
-        x1 = d.targetIdx.x,
-        xi = d3.interpolateNumber(x0, x1),
-        x2 = xi(curvature),
-        x3 = xi(1 - curvature),
-        y0 = d.sourceIdx.y + d.sy + d.dy / 2,
-        y1 = d.targetIdx.y + d.ty + d.dy / 2;
-    return "M" + x0 + "," + y0
-         + "C" + x2 + "," + y0
-         + " " + x3 + "," + y1
-         + " " + x1 + "," + y1;
-    }
-
-    link.curvature = function(_) {
-      if (!arguments.length) return curvature;
-      curvature = +_;
-      return link;
-    };
-
-    return link;
-  };
-
-  // Populate the sourceLinks and targetLinks for each node.
-  // Also, if the source and target are not objects, assume they are indices.
-  function computeNodeLinks() {
-    nodes.forEach(function(node) {
-      node.sourceLinks = [];
-      node.targetLinks = [];
-    });
-    links.forEach(function(link) {
-      var source = link.sourceIdx,
-          target = link.targetIdx;
-      if (typeof source === "number") source = link.sourceIdx = nodes[link.sourceIdx];
-      if (typeof target === "number") target = link.targetIdx = nodes[link.targetIdx];
-      source.sourceLinks.push(link);
-      target.targetLinks.push(link);
-    });
-  }
-
-  // Compute the value (size) of each node by summing the associated links.
-  function computeNodeValues() {
-    nodes.forEach(function(node) {
-      node.value = Math.max(
-        d3.sum(node.sourceLinks, value),
-        d3.sum(node.targetLinks, value)
-      );
-    });
-  }
-
-  // Iteratively assign the breadth (x-position) for each node.
-  // Nodes are assigned the maximum breadth of incoming neighbors plus one;
-  // nodes with no incoming links are assigned breadth zero, while
-  // nodes with no outgoing links are assigned the maximum breadth.
-  function computeNodeBreadths() {
-    var remainingNodes = nodes,
-        nextNodes,
-        x = 0;
-    while (remainingNodes.length) {
-      nextNodes = [];
-      remainingNodes.forEach(function(node) {
-    	  node.x = x;
-        node.dx = nodeWidth;
-        node.sourceLinks.forEach(function(link) {
-            if (nextNodes.indexOf(link.targetIdx) < 0) {
-            	nextNodes.push(link.targetIdx);
-          }
-        });
-      });
-      remainingNodes = nextNodes;
-      ++x;
-    }
-
-    //
-    moveSinksRight(x);
-    scaleNodeBreadths((size[0] - nodeWidth) / (x - 1));
-  }
-
-  function moveSourcesRight() {
-    nodes.forEach(function(node) {
-      if (!node.targetLinks.length) {
-        node.x = d3.min(node.sourceLinks, function(d) { return d.target.x; }) - 1;
-      }
-    });
-  }
-
-  function moveSinksRight(x) {
-    nodes.forEach(function(node) {
-      if (!node.sourceLinks.length) {
-        node.x = x - 1;
-      }
-    });
-  }
-
-  function scaleNodeBreadths(kx) {
-    nodes.forEach(function(node) {
-      node.x *= kx;
-    });
-  }
-
-  function computeNodeDepths(iterations) {
-    var nodesByBreadth = d3.nest()
-        .key(function(d) { return d.x; })
-        .sortKeys(d3.ascending)
-        .entries(nodes)
-        .map(function(d) { return d.values; });
-
-    //
-    initializeNodeDepth();
-    resolveCollisions();
-    for (var alpha = 1; iterations > 0; --iterations) {
-      relaxRightToLeft(alpha *= .99);
-      resolveCollisions();
-      relaxLeftToRight(alpha);
-      resolveCollisions();
-    }
-
-    function initializeNodeDepth() {
-      var ky = d3.min(nodesByBreadth, function(nodes) {
-        return (size[1] - (nodes.length - 1) * nodePadding) / d3.sum(nodes, value);
-      });
-
-      nodesByBreadth.forEach(function(nodes) {
-        nodes.forEach(function(node, i) {
-          node.y = i;
-          node.dy = node.value * ky;
-        });
-      });
-
-      links.forEach(function(link) {
-        link.dy = link.value * ky;
-      });
-    }
-
-    function relaxLeftToRight(alpha) {
-      nodesByBreadth.forEach(function(nodes, breadth) {
-        nodes.forEach(function(node) {
-          if (node.targetLinks.length) {
-            var y = d3.sum(node.targetLinks, weightedSource) / d3.sum(node.targetLinks, value);
-            node.y += (y - center(node)) * alpha;
-          }
-        });
-      });
-
-      function weightedSource(link) {
-        return center(link.sourceId) * link.value;
-      }
-    }
-
-    function relaxRightToLeft(alpha) {
-      nodesByBreadth.slice().reverse().forEach(function(nodes) {
-        nodes.forEach(function(node) {
-          if (node.sourceLinks.length) {
-            var y = d3.sum(node.sourceLinks, weightedTarget) / d3.sum(node.sourceLinks, value);
-            node.y += (y - center(node)) * alpha;
-          }
-        });
-      });
-
-      function weightedTarget(link) {
-        return center(link.targetIdx) * link.value;
-      }
-    }
-
-    function resolveCollisions() {
-      nodesByBreadth.forEach(function(nodes) {
-        var node,
-            dy,
-            y0 = 0,
-            n = nodes.length,
-            i;
-
-        // Push any overlapping nodes down.
-        nodes.sort(ascendingDepth);
-        for (i = 0; i < n; ++i) {
-          node = nodes[i];
-          dy = y0 - node.y;
-          if (dy > 0) node.y += dy;
-          y0 = node.y + node.dy + nodePadding;
-        }
-
-        // If the bottommost node goes outside the bounds, push it back up.
-        dy = y0 - nodePadding - size[1];
-        if (dy > 0) {
-          y0 = node.y -= dy;
-
-          // Push any overlapping nodes back up.
-          for (i = n - 2; i >= 0; --i) {
-            node = nodes[i];
-            dy = node.y + node.dy + nodePadding - y0;
-            if (dy > 0) node.y -= dy;
-            y0 = node.y;
-          }
-        }
-      });
-    }
-
-    function ascendingDepth(a, b) {
-      return a.y - b.y;
-    }
-  }
-
-  function computeLinkDepths() {
-    nodes.forEach(function(node) {
-      node.sourceLinks.sort(ascendingTargetDepth);
-      node.targetLinks.sort(ascendingSourceDepth);
-    });
-    nodes.forEach(function(node) {
-      var sy = 0, ty = 0;
-      node.sourceLinks.forEach(function(link) {
-        link.sy = sy;
-        sy += link.dy;
-      });
-      node.targetLinks.forEach(function(link) {
-        link.ty = ty;
-        ty += link.dy;
-      });
-    });
-
-    function ascendingSourceDepth(a, b) {
-      return a.sourceIdx.y - b.sourceIdx.y;
-    }
-
-    function ascendingTargetDepth(a, b) {
-      return a.targetIdx.y - b.targetIdx.y;
-    }
-  }
-
-  function center(node) {
-    return node.y + node.dy / 2;
-  }
-
-  function value(link) {
-    return link.value;
-  }
-
-  return sankey;
-};
\ No newline at end of file
diff --git a/distribution/pom.xml b/distribution/pom.xml
new file mode 100644
index 0000000..bc0f098
--- /dev/null
+++ b/distribution/pom.xml
@@ -0,0 +1,205 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-parent</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-distribution</artifactId>
+
+  <name>Apache Edgent (Java 8): Distribution</name>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-assembly-plugin</artifactId>
+        <configuration>
+          <descriptor>src/assembly/distribution.xml</descriptor>
+        </configuration>
+        <executions>
+          <execution>
+            <id>create-archive</id>
+            <phase>package</phase>
+            <goals>
+              <goal>single</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      <!-- We don't need any jars as output in this module -->
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>default-jar</id>
+            <phase>none</phase>
+          </execution>
+          <execution>
+            <id>default</id>
+            <phase>none</phase>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <!-- The general strategy here is to only declare "top-level"
+         Edgent artifacts, like an Edgent application pom would,
+         and let those artifacts pull in their dependent
+         Edgent artifacts, etc.
+         So declare Providers, Analytics, Utils, Connectors.
+    -->
+
+    <!-- Providers -->
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-providers-development</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-providers-iot</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+
+    <!-- Analytics -->
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-analytics-math3</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-analytics-sensors</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+
+    <!-- Utils -->
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-utils-metrics</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-utils-streamscope</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+
+    <!-- Connectors -->
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-connectors-command</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-connectors-common</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-connectors-csv</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-connectors-file</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-connectors-http</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-connectors-iot</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-connectors-iotp</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-connectors-jdbc</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-connectors-kafka</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-connectors-mqtt</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-connectors-pubsub</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-connectors-serial</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-connectors-websocket</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-connectors-websocket-jetty</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+
+    <!-- Include console-servlets.war to enable a user to run
+         it in their own Servlets engine.
+         It's bundled in the edgent-console-server.jar.
+         Note, edgent-console-server is pulled in as a dependency
+         of the development provider.
+    -->
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-console-servlets</artifactId>
+      <version>1.2.0</version>
+      <type>war</type>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/distribution/src/assembly/distribution.xml b/distribution/src/assembly/distribution.xml
new file mode 100644
index 0000000..d40b567
--- /dev/null
+++ b/distribution/src/assembly/distribution.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
+          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+          xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
+
+  <!--
+    NOTE: each platform (platforms/java7 and platforms/android) have their
+    own distribution project and a copy of this configuration file that
+    must be manually kept in sync. 
+   -->
+   
+  <id>bin</id>
+
+  <formats>
+    <format>tar.gz</format>
+    <format>tar.bz2</format>
+    <format>zip</format>
+  </formats>
+
+  <fileSets>
+    <!--fileSet>
+      <directory>${project.basedir}/..</directory>
+      <outputDirectory/>
+      <includes>
+        <include>DISCLAIMER</include>
+        <include>LICENSE</include>
+        <include>NOTICE</include>
+      </includes>
+    </fileSet>
+
+    <fileSet>
+      <directory>${project.basedir}/../src/main/appended-resources/licenses</directory>
+      <outputDirectory>licenses</outputDirectory>
+    </fileSet-->
+
+    <fileSet>
+      <directory>${project.build.outputDirectory}/META-INF</directory>
+      <includes>
+        <include>DEPENDENCIES</include>
+      </includes>
+      <outputDirectory/>
+    </fileSet>
+
+    <fileSet>
+      <directory>${project.build.outputDirectory}</directory>
+      <includes>
+        <include>README</include>
+      </includes>
+      <outputDirectory/>
+    </fileSet>
+
+    <!--fileSet>
+      <directory>${project.build.directory}/site</directory>
+      <outputDirectory>docs</outputDirectory>
+    </fileSet-->
+  </fileSets>
+
+  <dependencySets>
+    <!-- Any edgent libs -->
+    <dependencySet>
+      <outputDirectory>libs</outputDirectory>
+      <scope>runtime</scope>
+      <includes>
+        <include>org.apache.edgent*</include>
+      </includes>
+      <excludes>
+        <exclude>org.apache.edgent*:edgent-distribution</exclude>
+      </excludes>
+    </dependencySet>
+
+    <!-- All other libs are treated as external libs -->
+    <dependencySet>
+      <outputDirectory>ext</outputDirectory>
+      <scope>runtime</scope>
+      <excludes>
+        <exclude>org.apache.edgent*</exclude>
+      </excludes>
+    </dependencySet>
+  </dependencySets>
+
+</assembly>
diff --git a/distribution/src/main/resources/README b/distribution/src/main/resources/README
new file mode 100644
index 0000000..d91c7ff
--- /dev/null
+++ b/distribution/src/main/resources/README
@@ -0,0 +1,12 @@
+This bundle includes a number of artifacts with separate
+copyright notices and license terms.  Your use of an artifact
+is subject to that artifact’s licensing terms and conditions.
+
+The Apache Edgent artifacts (everything in lib) all have the
+license “Apache License Version 2.0”.
+
+Edgent’s dependent artifacts in “ext” have all been evaluated
+to be compatible with Edgent’s license.
+
+A bundled artifact's advertised license information may be
+found in the DEPENDENCIES file in this bundle.
diff --git a/edgent_overview.html b/edgent_overview.html
index a22e9ac..2207101 100644
--- a/edgent_overview.html
+++ b/edgent_overview.html
@@ -18,8 +18,7 @@
 -->
 
 <body>
-Edgent provides an programming model and micro-service style runtime
-for executing streaming analytics at the <i>edge</i>.
+Apache Edgent is an SDK for developing and executing streaming analytics at the <i>edge</i>.
 <P>
 <em>
 Apache Edgent is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by Apache Incubator PMC. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.
@@ -33,11 +32,18 @@
 </OL>
 <a name="overview"></a>
 <H2>Overview</H2>
-Edgent provides an programming model and runtime for executing streaming
-analytics at the <i>edge</i>. Edgent is focusing on two edge cases:
+Apache Edgent is an SDK for developing and executing streaming analytics at the <i>edge</i>.
+Edgent provides a stream processing style programming model for 
+composing stream processing graphs and a micro-services style runtime for
+executing the graphs.  Some analytics and a rich collection
+of connectors are provided. Users can easily develop and use their 
+own analytics and connectors.  
+A framework for testing processing graphs is also included.
+<P>
+Edgent is focusing on two edge cases:
 <UL>
-<LI>Internet of Things (IoT) - Widely distributed and/or mobile devices.</LI>
-<LI>Enterprise Embedded - Edge analytics within an enterprise, such as local analytic applications of eash system in a machine room, or error log analytics in application servers.</LI>
+<LI>Internet of Things (IoT) - Widely distributed and/or mobile devices and gateways.</LI>
+<LI>Enterprise Embedded - Edge analytics within an enterprise, such as local analytic applications of each system in a machine room, or error log analytics in application servers.</LI>
 </UL>
 In both cases Edgent applications analyze live data and
 send results of that analytics and/or data intermittently
@@ -122,124 +128,9 @@
 by downstream connected oplet invocations.
 <a name="start"></a>
 <H2>Getting Started</H2>
-Below, {@code <edgent-target>} refers to an Edgent release's platform target
-directory such as {@code .../edgent/java8}.
 <P>
 A number of sample Java applications are provided that demonstrate use of Edgent.
-<BR>
-The Java code for the samples is under {@code <edgent-target>/samples}.
-<P>
-Shell scripts to run the samples are {@code <edgent-target>/scripts}.
-See the {@code README} there.
-<P>
-Summary of samples:
-<TABLE border=1 width="80%" table-layout="auto">
-<TR class="rowColor"><TH>Sample</TH><TH>Description</TH><TH>Focus</TH></TR>
-<TR class="altColor"><TD>{@link org.apache.edgent.samples.topology.HelloEdgent}</TD>
-  <TD>Prints Hello Edgent! to standard output.</TD>
-  <TD>Basic mechanics of declaring a topology and executing it.</TD></TR>
-<TR class="altColor"><TD>{@link org.apache.edgent.samples.topology.PeriodicSource}</TD>
-  <TD>Polls a random number generator for a new value every second
-      and then prints out the raw value and a filtered and transformed stream.</TD>
-  <TD>Polling of a data value to create a source stream.</TD></TR>
-<TR class="altColor"><TD>{@link org.apache.edgent.samples.topology.SensorsAggregates}</TD>
-  <TD>Demonstrates partitioned aggregation and filtering of simulated sensors
-      that are bursty in nature, so that only intermittently
-      is the data output to {@code System.out}</TD>
-  <TD>Simulated sensors with windowed aggregation</TD></TR>
-<TR class="altColor"><TD>{@link org.apache.edgent.samples.topology.SimpleFilterTransform}</TD>
-  <TD></TD>
-  <TD></TD></TR>
-<TR class="altColor"><TD><a href="{@docRoot}/org/apache/edgent/samples/connectors/file/package-summary.html">
-      File</a></TD>
-  <TD>Write a stream of tuples to files.  Watch a directory for new files
-      and create a stream of tuples from the file contents.</TD>
-  <TD>Use of the <a href="{@docRoot}/org/apache/edgent/connectors/file/package-summary.html">
-      File stream connector</a></TD></TR>
-<TR class="altColor"><TD><a href="{@docRoot}/org/apache/edgent/samples/connectors/iotp/package-summary.html">
-      iotp</a></TD>
-  <TD>Sends simulated sensor readings to an IBM Watson IoT Platform instance as device events.
-      Receive device commands.</TD>
-  <TD>Use of the <a href="{@docRoot}/org/apache/edgent/connectors/iotp/package-summary.html">
-      IBM Watson IoT Platform connector</a> to send device events and receive device commands.</TD></TR>
-<TR class="altColor"><TD><a href="{@docRoot}/org/apache/edgent/samples/connectors/jdbc/package-summary.html">
-      JDBC</a></TD>
-  <TD>Write a stream of tuples to an Apache Derby database table.
-      Create a stream of tuples by reading a table.</TD>
-  <TD>Use of the <a href="{@docRoot}/org/apache/edgent/connectors/jdbc/package-summary.html">
-      JDBC stream connector</a></TD></TR>
-<TR class="altColor"><TD><a href="{@docRoot}/org/apache/edgent/samples/connectors/kafka/package-summary.html">
-      Kafka</a></TD>
-  <TD>Publish a stream of tuples to a Kafka topic. 
-      Create a stream of tuples by subscribing to a topic and receiving 
-      messages from it.</TD>
-  <TD>Use of the <a href="{@docRoot}/org/apache/edgent/connectors/kafka/package-summary.html">
-      Kafka stream connector</a></TD></TR>
-<TR class="altColor"><TD><a href="{@docRoot}/org/apache/edgent/samples/connectors/mqtt/package-summary.html">
-      MQTT</a></TD>
-  <TD>Publish a stream of tuples to a MQTT topic. 
-      Create a stream of tuples by subscribing to a topic and receiving 
-      messages from it.</TD>
-  <TD>Use of the <a href="{@docRoot}/org/apache/edgent/connectors/mqtt/package-summary.html">
-      MQTT stream connector</a></TD></TR>
-<TR class="altColor"><TD><a href="{@docRoot}/org/apache/edgent/samples/apps/sensorAnalytics/package-summary.html">
-      SensorAnalytics</a></TD>
-  <TD>Demonstrates a Sensor Analytics application that includes: 
-      configuration control, a device of one or more sensors and
-      some typical analytics, use of MQTT for publishing results and receiving
-      commands, local results logging, conditional stream tracing.</TD>
-  <TD>A more complete sample application demonstrating common themes.</TD></TR>
-</TABLE>
-<BR>
-Other samples are also provided but have not yet been fully documented.
-Feel free to explore them.
-<H2>Building Applications</H2>
-You need to include one or more Edgent jars in your {@code classpath} depending
-on what features your application uses.
-<P>
-Include one or more of the topology providers:
-<ul>
-<li>{@code <edgent-target>/lib/edgent.providers.iot.jar} - if you use the
-{@link org.apache.edgent.providers.iot.IotProvider IotProvider}</li>
-<li>{@code <edgent-target>/lib/edgent.providers.direct.jar} - if you use the
-{@link org.apache.edgent.providers.direct.DirectProvider DirectProvider}</li>
-<li>{@code <edgent-target>/lib/edgent.providers.development.jar} - if you use the
-{@link org.apache.edgent.providers.development.DevelopmentProvider DevelopmentProvider}</li>
-</ul>
-Include the jar of any Edgent connector you use:
-<ul>
-<li>{@code <edgent-target>/connectors/command/lib/edgent.connectors.command.jar}</li>
-<li>{@code <edgent-target>/connectors/csv/lib/edgent.connectors.csv.jar}</li>
-<li>{@code <edgent-target>/connectors/file/lib/edgent.connectors.file.jar}</li>
-<li>{@code <edgent-target>/connectors/http/lib/edgent.connectors.http.jar}</li>
-<li>{@code <edgent-target>/connectors/iotp/lib/edgent.connectors.iotp.jar}</li>
-<li>{@code <edgent-target>/connectors/jdbc/lib/edgent.connectors.jdbc.jar}</li>
-<li>{@code <edgent-target>/connectors/kafka/lib/edgent.connectors.kafka.jar}</li>
-<li>{@code <edgent-target>/connectors/mqtt/lib/edgent.connectors.mqtt.jar}</li>
-<li>{@code <edgent-target>/connectors/pubsub/lib/edgent.connectors.pubsub.jar}</li>
-<li>{@code <edgent-target>/connectors/wsclient-javax.websocket/lib/edgent.connectors.wsclient.javax.websocket.jar} [*]</li>
-</ul>
-[*] You also need to include a {@code javax.websocket} client implementation
-if you use the {@code wsclient} connector.  Include the following to use
-an Eclipse Jetty based implementation:
-<ul>
-<li>{@code <edgent-target>/connectors/javax.websocket-client/lib/javax.websocket-client.jar}</li>
-</ul>
-<p>
-Include jars for any Edgent analytic features you use:
-<ul>
-<li>{@code <edgent-target>/analytics/math3/lib/edgent.analytics.math3.jar}</li>
-<li>{@code <edgent-target>/analytics/sensors/lib/edgent.analytics.sensors.jar}</li>
-</ul>
-Include jars for any Edgent utility features you use:
-<ul>
-<li>{@code <edgent-target>/utils/metrics/lib/edgent.utils.metrics.jar} - for the {@code org.apache.edgent.metrics} package</li>
-</ul>
-Edgent uses <a href="www.slf4j.org">slf4j</a> for logging,
-leaving the decision of the actual logging implementation to your application
-(e.g., {@code java.util.logging} or {@code log4j}).  
-For {@code java.util.logging} you can include:
-<ul>
-<li>{@code <edgent-target>/ext/ slf4j-jdk14-1.7.12.jar}</li>
-</ul>
+General information about Edgent Application development and 
+some development utilities are included.
+See <a href="https://edgent.apache.org/docs/edgent-getting-started">Getting Started</a>.
 </body>
diff --git a/ext/.classpath b/ext/.classpath
deleted file mode 100644
index 87f01c5..0000000
--- a/ext/.classpath
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-    <classpathentry exported="true" kind="lib" path="../externalJars/java8/ext/gson-2.2.4.jar"/>
-	<classpathentry exported="true" kind="lib" path="../externalJars/java8/ext/metrics-core-3.1.2.jar"/>
-	<classpathentry exported="true" kind="lib" path="../externalJars/java8/ext/slf4j-api-1.7.12.jar"/>
-	<classpathentry exported="true" kind="lib" path="../externalJars/java8/ext/slf4j-jdk14-1.7.12.jar"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/ext/.project b/ext/.project
deleted file mode 100644
index 7c7e1c0..0000000
--- a/ext/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>ext</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/gradle/jacoco.gradle b/gradle/jacoco.gradle
deleted file mode 100644
index bcdb738..0000000
--- a/gradle/jacoco.gradle
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
- 
-task jacocoTestReport {
-  description = "Generates a coverage report from all subprojects (use after 'test')"
-  ext.test7AdjustJacocoReport = false
-}
-jacocoTestReport << {
-
-  ant.delete(dir: "${target_report_dir}/coverage")
-
-  def libDir = new File("${target_java8_dir}", "lib")
-  def utilsDir = new File("${target_java8_dir}", "utils")
-  def connectorsDir = new File("${target_java8_dir}", "connectors")
-  def analyticsDir = new File("${target_java8_dir}", "analytics")
-  def consoleDir = new File("${target_java8_dir}", "console")
-
-  if( !libDir.exists() ) { libDir.mkdirs() }
-  if( !utilsDir.exists() ) { utilsDir.mkdirs() }
-  if( !connectorsDir.exists() ) { connectorsDir.mkdirs() }
-  if( !analyticsDir.exists() ) { analyticsDir.mkdirs() }
-  if( !consoleDir.exists() ) { consoleDir.mkdirs() }
-
-  FileCollection executionData = files()
-
-  subprojects.findAll { subproject ->
-    subproject.pluginManager.hasPlugin('java') && subproject.pluginManager.hasPlugin('jacoco')
-  }.each { subproject ->
-    executionData += subproject.tasks.jacocoTestReport.executionData
-  }
-
-  executionData = files(executionData.findAll {
-    it.exists()
-  })
-  ant.taskdef(name: 'jacocoReport', classname: 'org.jacoco.ant.ReportTask',
-          classpath: configurations.junitLibs.asPath)
-  ant.jacocoReport {
-    executiondata {
-      executionData.addToAntBuilder(ant, 'resources')
-    }
-
-    platformTargetDir = target_java8_dir
-    if (test7AdjustJacocoReport) {
-      platformTargetDir = target_java7_dir
-    }
-
-    structure(name: project.name) {
-      group(name: "Edgent API") {
-        classfiles {
-          fileset(dir: "$platformTargetDir/lib", includes: "edgent.api.*.jar")
-        }
-        sourcefiles {
-          fileset(dir: "./api/function/src/main/java", includes: "**/*.java")
-          fileset(dir: "./api/execution/src/main/java", includes: "**/*.java")
-          fileset(dir: "./api/oplet/src/main/java", includes: "**/*.java")
-          fileset(dir: "./api/graph/src/main/java", includes: "**/*.java")
-          fileset(dir: "./api/topology/src/main/java", includes: "**/*.java")
-        }
-      }
-      group(name: "Edgent SPI") {
-        classfiles {
-          fileset(dir: "$platformTargetDir/lib", includes: "edgent.spi.*.jar")
-        }
-        sourcefiles {
-          fileset(dir: "./spi/graph/src/main/java", includes: "**/*.java")
-          fileset(dir: "./spi/topology/src/main/java", includes: "**/*.java")
-        }
-      }
-      group(name: "Edgent Runtime") {
-        classfiles {
-          fileset(dir: "$platformTargetDir/lib", includes: "edgent.runtime.*.jar")
-        }
-        sourcefiles {
-          fileset(dir: "./runtime/etiao/src/main/java", includes: "**/*.java")
-          fileset(dir: "./runtime/jmxcontrol/src/main/java", includes: "**/*.java")
-        }
-      }
-      group(name: "Edgent Utilities") {
-        classfiles {
-          fileset(dir: "$platformTargetDir/utils", includes: "**/edgent.utils.*.jar")
-        }
-        sourcefiles {
-          fileset(dir: "./utils/metrics/src/main/java", includes: "**/*.java")
-          fileset(dir: "./utils/streamscope/src/main/java", includes: "**/*.java")
-        }
-      }
-      group(name: "Edgent Connectors") {
-        classfiles {
-          fileset(dir: "$platformTargetDir/connectors", includes: "**/edgent.connectors.*.jar")
-        }
-        sourcefiles {
-          fileset(dir: "./connectors/common/src/main/java", includes: "**/*.java")
-          fileset(dir: "./connectors/command/src/main/java", includes: "**/*.java")
-          fileset(dir: "./connectors/csv/src/main/java", includes: "**/*.java")
-          fileset(dir: "./connectors/file/src/main/java", includes: "**/*.java")
-          fileset(dir: "./connectors/iot/src/main/java", includes: "**/*.java")
-          fileset(dir: "./connectors/iotp/src/main/java", includes: "**/*.java")
-          fileset(dir: "./connectors/jdbc/src/main/java", includes: "**/*.java")
-          fileset(dir: "./connectors/kafka/src/main/java", includes: "**/*.java")
-          fileset(dir: "./connectors/mqtt/src/main/java", includes: "**/*.java")
-          fileset(dir: "./connectors/http/src/main/java", includes: "**/*.java")
-          fileset(dir: "./connectors/wsclient/src/main/java", includes: "**/*.java")
-          fileset(dir: "./connectors/wsclient-javax.websocket/src/main/java", includes: "**/*.java")
-        }
-      }
-      group(name: "Edgent Providers") {
-        classfiles {
-          fileset(dir: "$platformTargetDir/lib", includes: "edgent.providers.*.jar")
-        }
-        sourcefiles {
-          fileset(dir: "./providers/direct/src/main/java", includes: "**/*.java")
-          fileset(dir: "./providers/development/src/main/java", includes: "**/*.java")
-        }
-      }
-      if (!test7AdjustJacocoReport) {
-        group(name: "Edgent Analytics") {
-          classfiles {
-            fileset(dir: "$platformTargetDir/analytics", includes: "**/edgent.analytics.*.jar")
-          }
-          sourcefiles {
-            fileset(dir: "./analytics/math3/src/main/java", includes: "**/*.java")
-            fileset(dir: "./analytics/sensors/src/main/java", includes: "**/*.java")
-          }
-        }
-        group(name: "Edgent Console") {
-          classfiles {
-            fileset(dir: "$platformTargetDir/console", includes: "**/edgent.console.*.jar")
-          }
-          sourcefiles {
-            fileset(dir: "./console/server/src/main/java", includes: "**/*.java")
-            fileset(dir: "./console/servlets/src/main/java", includes: "**/*.java")
-          }
-        }
-      }
-    }
-    html(destdir: "${target_report_dir}/coverage/")
-    xml(destfile: "${target_report_dir}/coverage/jacoco-sessions.xml")
-  }
-}
diff --git a/gradle/javadoc.gradle b/gradle/javadoc.gradle
deleted file mode 100644
index 85bfff3..0000000
--- a/gradle/javadoc.gradle
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-task aggregateJavadoc(type: Javadoc) {
-  description = 'Create all javadoc into target_dir/docs/javadoc'
-  destinationDir file(target_javadoc_dir)
-  options.addStringOption('Xdoclint:none', '-quiet')
-  configure(options) {
-    author = true
-    version = true
-    use = true
-    docTitle "Apache Edgent (incubating) v${build_version}"
-    footer '<a href="http://edgent.incubator.apache.org">Apache Edgent (incubating)</a>'
-    bottom "Copyright &#169; ${COPYRIGHT_YEAR} The Apache Software Foundation. All Rights Reserved - ${commithash}-${DSTAMP}-${TSTAMP}"
-    overview "edgent_overview.html"
-    windowTitle "Edgent v${build_version}"
-
-    group("Edgent Providers", "org.apache.edgent.providers.*")
-    group("Edgent API", "org.apache.edgent.execution", "org.apache.edgent.function", "org.apache.edgent.topology", "org.apache.edgent.topology.json", "org.apache.edgent.topology.mbeans", "org.apache.edgent.topology.plumbing", "org.apache.edgent.topology.services", "org.apache.edgent.execution.*")
-    group("Edgent Analytics", "org.apache.edgent.analytics.*")
-    group("Edgent Utilities", "org.apache.edgent.metrics", "org.apache.edgent.metrics.*", "org.apache.edgent.streamscope", "org.apache.edgent.streamscope.*")
-    group("Edgent Connectors", "org.apache.edgent.connectors.*")
-    group("Edgent Samples", "org.apache.edgent.samples.*")
-    group("Edgent Low-Level API", "org.apache.edgent.graph", "org.apache.edgent.graph.*", "org.apache.edgent.oplet", "org.apache.edgent.oplet.*", "org.apache.edgent.window")
-    group("Edgent SPI", "org.apache.edgent.topology.spi", "org.apache.edgent.topology.spi.*")
-  }
-  source subprojects.collect { project -> project.sourceSets.main.allJava }
-  exclude "**/edgent/connectors/**/runtime"
-  exclude "**/edgent/console"
-  exclude "**/edgent/samples/scenarios/iotp/range/sensor"
-  exclude "**/android/**"
-  classpath = files(filteredSubprojects.collect { it.jar.archivePath })
-  
-  // doc-files aren't picked up automatically so get them now.
-  doLast {
-    copy {
-      from subprojects.collect { project -> project.sourceSets.main.java.srcDirs }
-      include '**/doc-files/**'
-      includeEmptyDirs = false
-      into target_javadoc_dir
-    }
-  }
-}
diff --git a/gradle/other.gradle b/gradle/other.gradle
deleted file mode 100644
index 944bacf..0000000
--- a/gradle/other.gradle
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-ext.unsupportedJava7TestProjects = [  // why not on all of these? (match ant_test7.run, see JAVA_SUPPORT.md)
-  // projects with no tests will be automatically avoided for java7 tests
-  // otherwise those that are not yet supported for java7 (not in ant_test7.{setup,run}) must be added here
-  ':api:graph',       // no runnable tests
-  ':analytics:math3',
-  ':analytics:sensors',
-  ':connectors:command',
-  ':connectors:csv',
-  ':connectors:file',
-  ':connectors:jdbc',
-  ':connectors:mqtt',
-  ':connectors:kafka',
-  ':connectors:serial',
-  ':connectors:wsclient',
-  ':connectors:wsclient-javax.websocket',
-  ':connectors:javax.websocket-client',
-  ':connectors:edgent.javax.websocket',
-  ':connectors:javax.websocket-server',
-  ':console:server',
-  ':console:servlets',
-  ':providers:development',
-  ':utils:streamscope',
-  ':test:fvtiot',
-  ':test:svt',
-]
-
-ext.projectsWithPreApacheContribs = [
-  ':analytics:math3', ':analytics:sensors',
-  ':android:topology', ':android:hardware',
-  ':api:function', ':api:execution', ':api:window', ':api:oplet',
-  ':api:graph', ':api:topology',
-  ':connectors:common', ':connectors:iot', ':connectors:serial',
-  ':connectors:file', ':connectors:http', ':connectors:iotp',
-  ':connectors:jdbc', ':connectors:kafka', ':connectors:mqtt',
-  ':connectors:edgent.javax.websocket',
-  ':connectors:javax.websocket-client', ':connectors:javax.websocket-server',
-  ':connectors:wsclient', ':connectors:wsclient-javax.websocket',
-  ':console:server', ':console:servlets',
-  ':providers:direct', ':providers:development',
-  ':runtime:etiao', ':runtime:jmxcontrol', ':runtime:jsoncontrol',
-  ':samples:utils', ':samples:apps', ':samples:topology', ':samples:connectors',
-  ':samples:console',
-  ':spi:graph', ':spi:topology',
-  ':test:svt',
-  ':utils:metrics',
-]
diff --git a/gradle/rat.gradle b/gradle/rat.gradle
deleted file mode 100644
index 2de8999..0000000
--- a/gradle/rat.gradle
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-// shamelessly copied from https://github.com/apache/samza
-
-import org.gradle.api.Plugin
-import org.gradle.api.Project
-import org.gradle.api.Task
-import org.gradle.api.internal.project.IsolatedAntBuilder
-
-apply plugin: RatPlugin
-
-class RatTask extends DefaultTask {
-  @Input
-  List<String> excludes
-
-  def reportPath = 'build/rat'
-  def stylesheet = 'gradle/resources/rat-output-to-html.xsl'
-  def xmlReport = reportPath + '/rat-report.xml'
-  def htmlReport = reportPath + '/rat-report.html'
-  def textReport = reportPath + '/rat-report.txt'
-
-  def generateTextReport(File reportDir) {
-    def antBuilder = services.get(IsolatedAntBuilder)
-    def ratClasspath = project.configurations.rat
-    antBuilder.withClasspath(ratClasspath).execute {
-      ant.taskdef(resource: 'org/apache/rat/anttasks/antlib.xml')
-      ant.report(format: 'plain', reportFile: textReport) {
-        fileset(dir: ".") {
-          patternset {
-            excludes.each {
-              exclude(name: it)
-            }
-          }
-        }
-      }
-    }
-  }
-
-  def generateXmlReport(File reportDir) {
-    def antBuilder = services.get(IsolatedAntBuilder)
-    def ratClasspath = project.configurations.rat
-    antBuilder.withClasspath(ratClasspath).execute {
-      ant.taskdef(resource: 'org/apache/rat/anttasks/antlib.xml')
-      ant.report(format: 'xml', reportFile: xmlReport) {
-        fileset(dir: ".") {
-          patternset {
-            excludes.each {
-              exclude(name: it)
-            }
-          }
-        }
-      }
-    }
-  }
-
-  def printUnknownFiles() {
-    def ratXml = new XmlParser().parse(xmlReport)
-    def unknownLicenses = 0
-    ratXml.resource.each { resource ->
-      if (resource.'license-approval'.@name[0] == "false") {
-        println('Unknown license: ' + resource.@name)
-        unknownLicenses++
-      }
-    }
-    if (unknownLicenses > 0) {
-      throw new GradleException("Found " + unknownLicenses + " files with " +
-                                "unknown licenses.")
-    }
-  }
-
-  def generateHtmlReport() {
-    def antBuilder = services.get(IsolatedAntBuilder)
-    def ratClasspath = project.configurations.rat
-    antBuilder.withClasspath(ratClasspath).execute {
-      ant.xslt(
-          in: xmlReport,
-          style: stylesheet,
-          out: htmlReport,
-          classpath: ratClasspath)
-    }
-    println('Rat report: ' + htmlReport)
-  }
-
-  @TaskAction
-  def rat() {
-    File reportDir = new File(reportPath)
-    if (!reportDir.exists()) {
-      reportDir.mkdirs()
-    }
-    generateXmlReport(reportDir)
-    generateHtmlReport()
-    generateTextReport()
-    printUnknownFiles()
-  }
-}
-
-class RatPlugin implements Plugin<Project> {
-  void apply(Project project) {
-    configureDependencies(project)
-    project.plugins.apply(JavaBasePlugin);
-    Task ratTask = project.task("rat",
-        type: RatTask,
-        group: 'Build',
-        description: 'Runs Apache Rat checks.')
-    project.tasks[JavaBasePlugin.CHECK_TASK_NAME].dependsOn ratTask
-  }
-
-  void configureDependencies(final Project project) {
-    project.configurations {
-      rat
-    }
-    project.repositories {
-      mavenCentral()
-    }
-    project.dependencies {
-      rat 'org.apache.rat:apache-rat-tasks:0.12'
-    }
-  }
-}
\ No newline at end of file
diff --git a/gradle/resources/rat-output-to-html.xsl b/gradle/resources/rat-output-to-html.xsl
deleted file mode 100644
index 291ec3e..0000000
--- a/gradle/resources/rat-output-to-html.xsl
+++ /dev/null
@@ -1,208 +0,0 @@
-<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
-
-<!--***********************************************************
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- ***********************************************************-->
-
-<!-- This style sheet converts any rat-report.xml file.  -->
-
-<!-- shamelessly copied from https://github.com/apache/samza -->
-
-<xsl:template match="/">
-
-  <html>
-    <head>
-     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
-     <style type="text/css">
-    &lt;!--
-body {margin-top: 0px;font-size: 0.8em;background-color: #F9F7ED;}
-
-h1 {color:red;}
-h2 {color:blue;}
-h3 {color:green;}
-h4 {color:orange;}
-
-/* Table Design */
-
-table,tr,td {text-align:center;font-weight:bold;border:1px solid #000;}
-caption {color:blue;text-align:left;}
-.notes, .binaries, .archives, .standards {width:25%;}
-.notes {background:#D7EDEE;}
-.binaries {background:#D0F2F4;}
-.archives {background:#ABE7E9;}
-.standards {background:#A0F0F4;}
-.licenced, .generated {width:50%;}
-.licenced {background:#C6EBDD;}
-.generated {background:#ABE9D2;}
-.java_note {background:#D6EBC6;}
-.generated_note {background:#C9E7A9;}
-.unknown {width:100%;background:#E92020;}
-.unknown-zero {color:#00CC00;}
-.center{text-align:center;margin:0 auto;}
---&gt;
-     </style>
-    </head>
-    <body>
-      <xsl:apply-templates/>
-      <xsl:call-template name="generated"/>
-    </body>
-  </html>
-</xsl:template>
-
-<xsl:template match="rat-report">
-
-  <h1>Rat Report</h1>
-  <p>This HTML version (yes, it is!) is generated from the RAT xml reports using Saxon9B. All the outputs required are displayed below, similar to the .txt version.
-           This is obviously a work in progress; and a prettier, easier to read and manage version will be available soon</p>
-<div class="center">
-<table id="rat-reports summary" cellspacing="0" summary="A snapshot summary of this rat report">
-<caption>
-Table 1: A snapshot summary of this rat report.
-</caption>
-  <tr>
-    <td colspan="1" class="notes">Notes: <xsl:value-of select="count(descendant::type[attribute::name=&quot;notice&quot;])"/></td>
-    <td colspan="1" class="binaries">Binaries: <xsl:value-of select="count(descendant::type[attribute::name=&quot;binary&quot;])"/></td>
-    <td colspan="1" class="archives">Archives: <xsl:value-of select="count(descendant::type[attribute::name=&quot;archive&quot;])"/></td>
-    <td colspan="1" class="standards">Standards: <xsl:value-of select="count(descendant::type[attribute::name=&quot;standard&quot;])"/></td>
-  </tr>
-  <tr>
-    <td colspan="2" class="licenced">Apache Licensed: <xsl:value-of select="count(descendant::header-type[attribute::name=&quot;AL   &quot;])"/></td>
-    <td colspan="2" class="generated">Generated Documents: <xsl:value-of select="count(descendant::header-type[attribute::name=&quot;GEN  &quot;])"/></td>
-  </tr>
-  <tr>
-    <td colspan="2" class="java_note">Note: JavaDocs are generated and so license header is optional</td>
-    <td colspan="2" class="generated_note">Note: Generated files do not require license headers</td>
-  </tr>
-  <tr>
-<xsl:choose>
-  <xsl:when test="count(descendant::header-type[attribute::name=&quot;?????&quot;]) &gt; 0">
-    <td colspan="4" class="unknown"><xsl:value-of select="count(descendant::header-type[attribute::name=&quot;?????&quot;])"/> Unknown Licenses - or files without a license.</td>
-  </xsl:when>
-  <xsl:otherwise>
-    <td colspan="4" class="unknown-zero"><xsl:value-of select="count(descendant::header-type[attribute::name=&quot;?????&quot;])"/> Unknown Licenses - or files without a license.</td>
-  </xsl:otherwise>
-</xsl:choose>
-  </tr>
-</table>
-</div>
-<hr/>
-  <h3>Unapproved Licenses:</h3>
-
-  <xsl:for-each select="descendant::resource[license-approval/@name=&quot;false&quot;]">
-  <xsl:text>  </xsl:text>
-  <xsl:value-of select="@name"/><br/>
-  <xsl:text>
-</xsl:text>
-</xsl:for-each>
-<hr/>
-
-<h3>Archives:</h3>
-
-<xsl:for-each select="descendant::resource[type/@name=&quot;archive&quot;]">
- + <xsl:value-of select="@name"/>
- <br/>
- </xsl:for-each>
- <hr/>
-
- <p>
-   Files with Apache License headers will be marked AL<br/>
-   Binary files (which do not require AL headers) will be marked B<br/>
-  Compressed archives will be marked A<br/>
-  Notices, licenses etc will be marked N<br/>
-  </p>
-
- <xsl:for-each select="descendant::resource">
-  <xsl:choose>
-   <xsl:when test="license-approval/@name=&quot;false&quot;">!</xsl:when>
-   <xsl:otherwise><xsl:text> </xsl:text></xsl:otherwise>
- </xsl:choose>
- <xsl:choose>
-   <xsl:when test="type/@name=&quot;notice&quot;">N   </xsl:when>
-   <xsl:when test="type/@name=&quot;archive&quot;">A   </xsl:when>
-   <xsl:when test="type/@name=&quot;binary&quot;">B   </xsl:when>
-   <xsl:when test="type/@name=&quot;standard&quot;"><xsl:value-of select="header-type/@name"/></xsl:when>
-   <xsl:otherwise>!!!!!</xsl:otherwise>
- </xsl:choose>
- <xsl:text>      </xsl:text>
- <xsl:value-of select="@name"/><br/>
- <xsl:text>
- </xsl:text>
- </xsl:for-each>
- <hr/>
-
- <h3>Printing headers for files without AL header...</h3>
-
- <xsl:for-each select="descendant::resource[header-type/@name=&quot;?????&quot;]">
-
-   <h4><xsl:value-of select="@name"/></h4>
-  <xsl:value-of select="header-sample"/>
-  <hr/>
-</xsl:for-each>
-<br/>
-
- <!-- <xsl:apply-templates select="resource"/>
-    <xsl:apply-templates select="header-sample"/>
-    <xsl:apply-templates select="header-type"/>
-    <xsl:apply-templates select="license-family"/>
-    <xsl:apply-templates select="license-approval"/>
-    <xsl:apply-templates select="type"/> -->
-
-</xsl:template>
-
-<xsl:template match="resource">
-  <div>
-    <h3>Resource: <xsl:value-of select="@name"/></h3>
-      <xsl:apply-templates/>
-    </div>
-</xsl:template>
-
-<xsl:template match="header-sample">
-  <xsl:if test="normalize-space(.) != ''">
-  <h4>First few lines of non-compliant file</h4>
-    <p>
-      <xsl:value-of select="."/>
-    </p>
-    </xsl:if>
-    <h4>Other Info:</h4>
-</xsl:template>
-
-<xsl:template match="header-type">
-  Header Type: <xsl:value-of select="@name"/>
-  <br/>
-</xsl:template>
-
-<xsl:template match="license-family">
-  License Family: <xsl:value-of select="@name"/>
-  <br/>
-</xsl:template>
-
-<xsl:template match="license-approval">
-  License Approval: <xsl:value-of select="@name"/>
-  <br/>
-</xsl:template>
-
-<xsl:template match="type">
-  Type: <xsl:value-of select="@name"/>
-  <br/>
-</xsl:template>
-
-<xsl:template name="generated">
-</xsl:template>
-</xsl:transform>
\ No newline at end of file
diff --git a/gradle/wrapper.gradle b/gradle/wrapper.gradle
deleted file mode 100644
index 557a8f8..0000000
--- a/gradle/wrapper.gradle
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-defaultTasks 'wrapper'
-
-task wrapper(type: Wrapper) {
-    description = "Initialize the gradle wrapper. Overwrites existing wrapper files."
-    jarFile = "${project.projectDir}/.gradle-wrapper/gradle-wrapper.jar"
-    
-    gradleVersion = project.gradleVersion
-    // ugh... must manually set in generated gradle-wrapper.properties
-    // distributionSha256Sum = project.gradleDistributionSha256Sum
-    
-    doLast {
-      if (project.hasProperty("gradleDistributionSha256Sum")) {
-        File wrapperProps = file(propertiesFile)
-        wrapperProps.append("distributionSha256Sum=${project.gradleDistributionSha256Sum}\n");
-      }
-    }
-    doLast {
-      println "The gradle wrapper is now initialized." +
-            "\nUse ./gradlew for subsequent build operations."
-    }
-}
-
-gradle.taskGraph.whenReady {taskGraph ->
-  if (!taskGraph.hasTask(wrapper)) {
-    if (GradleVersion.current() < GradleVersion.version(gradleVersion)) {
-      throw new GradleException('Running with unsupported Gradle Version (' + GradleVersion.current() + ').' +
-              '\nUse Gradle Wrapper or with Gradle version >= ' + gradleVersion +
-              '\nRun \'gradle\' (default task) to initialize the wrapper.')
-    }
-  }
-}
-
diff --git a/gradlew b/gradlew
deleted file mode 100755
index a8ac9b9..0000000
--- a/gradlew
+++ /dev/null
@@ -1,164 +0,0 @@
-#!/usr/bin/env bash
-
-##############################################################################
-##
-##  Gradle start up script for UN*X
-##
-##############################################################################
-
-# Attempt to set APP_HOME
-# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
-    ls=`ls -ld "$PRG"`
-    link=`expr "$ls" : '.*-> \(.*\)$'`
-    if expr "$link" : '/.*' > /dev/null; then
-        PRG="$link"
-    else
-        PRG=`dirname "$PRG"`"/$link"
-    fi
-done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
-
-APP_NAME="Gradle"
-APP_BASE_NAME=`basename "$0"`
-
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
-
-# Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD="maximum"
-
-warn ( ) {
-    echo "$*"
-}
-
-die ( ) {
-    echo
-    echo "$*"
-    echo
-    exit 1
-}
-
-# OS specific support (must be 'true' or 'false').
-cygwin=false
-msys=false
-darwin=false
-nonstop=false
-case "`uname`" in
-  CYGWIN* )
-    cygwin=true
-    ;;
-  Darwin* )
-    darwin=true
-    ;;
-  MINGW* )
-    msys=true
-    ;;
-  NONSTOP* )
-    nonstop=true
-    ;;
-esac
-
-CLASSPATH=$APP_HOME/.gradle-wrapper/gradle-wrapper.jar
-
-# Determine the Java command to use to start the JVM.
-if [ -n "$JAVA_HOME" ] ; then
-    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
-        # IBM's JDK on AIX uses strange locations for the executables
-        JAVACMD="$JAVA_HOME/jre/sh/java"
-    else
-        JAVACMD="$JAVA_HOME/bin/java"
-    fi
-    if [ ! -x "$JAVACMD" ] ; then
-        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
-    fi
-else
-    JAVACMD="java"
-    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
-fi
-
-# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
-    MAX_FD_LIMIT=`ulimit -H -n`
-    if [ $? -eq 0 ] ; then
-        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
-            MAX_FD="$MAX_FD_LIMIT"
-        fi
-        ulimit -n $MAX_FD
-        if [ $? -ne 0 ] ; then
-            warn "Could not set maximum file descriptor limit: $MAX_FD"
-        fi
-    else
-        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
-    fi
-fi
-
-# For Darwin, add options to specify how the application appears in the dock
-if $darwin; then
-    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
-fi
-
-# For Cygwin, switch paths to Windows format before running java
-if $cygwin ; then
-    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
-    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
-    JAVACMD=`cygpath --unix "$JAVACMD"`
-
-    # We build the pattern for arguments to be converted via cygpath
-    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
-    SEP=""
-    for dir in $ROOTDIRSRAW ; do
-        ROOTDIRS="$ROOTDIRS$SEP$dir"
-        SEP="|"
-    done
-    OURCYGPATTERN="(^($ROOTDIRS))"
-    # Add a user-defined pattern to the cygpath arguments
-    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
-        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
-    fi
-    # Now convert the arguments - kludge to limit ourselves to /bin/sh
-    i=0
-    for arg in "$@" ; do
-        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
-        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
-
-        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
-            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
-        else
-            eval `echo args$i`="\"$arg\""
-        fi
-        i=$((i+1))
-    done
-    case $i in
-        (0) set -- ;;
-        (1) set -- "$args0" ;;
-        (2) set -- "$args0" "$args1" ;;
-        (3) set -- "$args0" "$args1" "$args2" ;;
-        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
-        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
-        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
-        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
-        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
-        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
-    esac
-fi
-
-# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
-function splitJvmOpts() {
-    JVM_OPTS=("$@")
-}
-eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
-JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
-
-exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/gradlew.bat b/gradlew.bat
deleted file mode 100644
index 57e1569..0000000
--- a/gradlew.bat
+++ /dev/null
@@ -1,90 +0,0 @@
-@if "%DEBUG%" == "" @echo off

-@rem ##########################################################################

-@rem

-@rem  Gradle startup script for Windows

-@rem

-@rem ##########################################################################

-

-@rem Set local scope for the variables with windows NT shell

-if "%OS%"=="Windows_NT" setlocal

-

-set DIRNAME=%~dp0

-if "%DIRNAME%" == "" set DIRNAME=.

-set APP_BASE_NAME=%~n0

-set APP_HOME=%DIRNAME%

-

-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.

-set DEFAULT_JVM_OPTS=

-

-@rem Find java.exe

-if defined JAVA_HOME goto findJavaFromJavaHome

-

-set JAVA_EXE=java.exe

-%JAVA_EXE% -version >NUL 2>&1

-if "%ERRORLEVEL%" == "0" goto init

-

-echo.

-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

-echo.

-echo Please set the JAVA_HOME variable in your environment to match the

-echo location of your Java installation.

-

-goto fail

-

-:findJavaFromJavaHome

-set JAVA_HOME=%JAVA_HOME:"=%

-set JAVA_EXE=%JAVA_HOME%/bin/java.exe

-

-if exist "%JAVA_EXE%" goto init

-

-echo.

-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%

-echo.

-echo Please set the JAVA_HOME variable in your environment to match the

-echo location of your Java installation.

-

-goto fail

-

-:init

-@rem Get command-line arguments, handling Windows variants

-

-if not "%OS%" == "Windows_NT" goto win9xME_args

-if "%@eval[2+2]" == "4" goto 4NT_args

-

-:win9xME_args

-@rem Slurp the command line arguments.

-set CMD_LINE_ARGS=

-set _SKIP=2

-

-:win9xME_args_slurp

-if "x%~1" == "x" goto execute

-

-set CMD_LINE_ARGS=%*

-goto execute

-

-:4NT_args

-@rem Get arguments from the 4NT Shell from JP Software

-set CMD_LINE_ARGS=%$

-

-:execute

-@rem Setup the command line

-

-set CLASSPATH=%APP_HOME%\.gradle-wrapper\gradle-wrapper.jar

-

-@rem Execute Gradle

-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%

-

-:end

-@rem End local scope for the variables with windows NT shell

-if "%ERRORLEVEL%"=="0" goto mainEnd

-

-:fail

-rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of

-rem the _cmd.exe /c_ return code!

-if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1

-exit /b 1

-

-:mainEnd

-if "%OS%"=="Windows_NT" endlocal

-

-:omega

diff --git a/jqassistant/structural-rules.xml b/jqassistant/structural-rules.xml
new file mode 100644
index 0000000..f608f73
--- /dev/null
+++ b/jqassistant/structural-rules.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<jqa:jqassistant-rules xmlns:jqa="http://www.buschmais.com/jqassistant/core/analysis/rules/schema/v1.0">
+
+  <constraint id="structural-rules:dependency-groupid-matches-artifact-groupid">
+    <description>The groupId of every Edgent dependency must match the groupId of the artifact.</description>
+    <cypher><![CDATA[
+            MATCH
+                (m:Maven:Pom:Xml)-[DESCRIBES]->(a:Maven:Artifact)
+            WHERE
+                a.group = "org.apache.edgent.java7"
+            RETURN m
+        ]]></cypher>
+  </constraint>
+
+  <group id="default">
+    <includeConstraint refId="structural-rules:dependency-groupid-matches-artifact-groupid" />
+  </group>
+
+</jqa:jqassistant-rules>
\ No newline at end of file
diff --git a/licenses/binary-release/commons-codec-1.10.AL-2.0 b/licenses/binary-release/commons-codec-1.10.AL-2.0
deleted file mode 100644
index 75b5248..0000000
--- a/licenses/binary-release/commons-codec-1.10.AL-2.0
+++ /dev/null
@@ -1,202 +0,0 @@
-

-                                 Apache License

-                           Version 2.0, January 2004

-                        http://www.apache.org/licenses/

-

-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

-

-   1. Definitions.

-

-      "License" shall mean the terms and conditions for use, reproduction,

-      and distribution as defined by Sections 1 through 9 of this document.

-

-      "Licensor" shall mean the copyright owner or entity authorized by

-      the copyright owner that is granting the License.

-

-      "Legal Entity" shall mean the union of the acting entity and all

-      other entities that control, are controlled by, or are under common

-      control with that entity. For the purposes of this definition,

-      "control" means (i) the power, direct or indirect, to cause the

-      direction or management of such entity, whether by contract or

-      otherwise, or (ii) ownership of fifty percent (50%) or more of the

-      outstanding shares, or (iii) beneficial ownership of such entity.

-

-      "You" (or "Your") shall mean an individual or Legal Entity

-      exercising permissions granted by this License.

-

-      "Source" form shall mean the preferred form for making modifications,

-      including but not limited to software source code, documentation

-      source, and configuration files.

-

-      "Object" form shall mean any form resulting from mechanical

-      transformation or translation of a Source form, including but

-      not limited to compiled object code, generated documentation,

-      and conversions to other media types.

-

-      "Work" shall mean the work of authorship, whether in Source or

-      Object form, made available under the License, as indicated by a

-      copyright notice that is included in or attached to the work

-      (an example is provided in the Appendix below).

-

-      "Derivative Works" shall mean any work, whether in Source or Object

-      form, that is based on (or derived from) the Work and for which the

-      editorial revisions, annotations, elaborations, or other modifications

-      represent, as a whole, an original work of authorship. For the purposes

-      of this License, Derivative Works shall not include works that remain

-      separable from, or merely link (or bind by name) to the interfaces of,

-      the Work and Derivative Works thereof.

-

-      "Contribution" shall mean any work of authorship, including

-      the original version of the Work and any modifications or additions

-      to that Work or Derivative Works thereof, that is intentionally

-      submitted to Licensor for inclusion in the Work by the copyright owner

-      or by an individual or Legal Entity authorized to submit on behalf of

-      the copyright owner. For the purposes of this definition, "submitted"

-      means any form of electronic, verbal, or written communication sent

-      to the Licensor or its representatives, including but not limited to

-      communication on electronic mailing lists, source code control systems,

-      and issue tracking systems that are managed by, or on behalf of, the

-      Licensor for the purpose of discussing and improving the Work, but

-      excluding communication that is conspicuously marked or otherwise

-      designated in writing by the copyright owner as "Not a Contribution."

-

-      "Contributor" shall mean Licensor and any individual or Legal Entity

-      on behalf of whom a Contribution has been received by Licensor and

-      subsequently incorporated within the Work.

-

-   2. Grant of Copyright License. Subject to the terms and conditions of

-      this License, each Contributor hereby grants to You a perpetual,

-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable

-      copyright license to reproduce, prepare Derivative Works of,

-      publicly display, publicly perform, sublicense, and distribute the

-      Work and such Derivative Works in Source or Object form.

-

-   3. Grant of Patent License. Subject to the terms and conditions of

-      this License, each Contributor hereby grants to You a perpetual,

-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable

-      (except as stated in this section) patent license to make, have made,

-      use, offer to sell, sell, import, and otherwise transfer the Work,

-      where such license applies only to those patent claims licensable

-      by such Contributor that are necessarily infringed by their

-      Contribution(s) alone or by combination of their Contribution(s)

-      with the Work to which such Contribution(s) was submitted. If You

-      institute patent litigation against any entity (including a

-      cross-claim or counterclaim in a lawsuit) alleging that the Work

-      or a Contribution incorporated within the Work constitutes direct

-      or contributory patent infringement, then any patent licenses

-      granted to You under this License for that Work shall terminate

-      as of the date such litigation is filed.

-

-   4. Redistribution. You may reproduce and distribute copies of the

-      Work or Derivative Works thereof in any medium, with or without

-      modifications, and in Source or Object form, provided that You

-      meet the following conditions:

-

-      (a) You must give any other recipients of the Work or

-          Derivative Works a copy of this License; and

-

-      (b) You must cause any modified files to carry prominent notices

-          stating that You changed the files; and

-

-      (c) You must retain, in the Source form of any Derivative Works

-          that You distribute, all copyright, patent, trademark, and

-          attribution notices from the Source form of the Work,

-          excluding those notices that do not pertain to any part of

-          the Derivative Works; and

-

-      (d) If the Work includes a "NOTICE" text file as part of its

-          distribution, then any Derivative Works that You distribute must

-          include a readable copy of the attribution notices contained

-          within such NOTICE file, excluding those notices that do not

-          pertain to any part of the Derivative Works, in at least one

-          of the following places: within a NOTICE text file distributed

-          as part of the Derivative Works; within the Source form or

-          documentation, if provided along with the Derivative Works; or,

-          within a display generated by the Derivative Works, if and

-          wherever such third-party notices normally appear. The contents

-          of the NOTICE file are for informational purposes only and

-          do not modify the License. You may add Your own attribution

-          notices within Derivative Works that You distribute, alongside

-          or as an addendum to the NOTICE text from the Work, provided

-          that such additional attribution notices cannot be construed

-          as modifying the License.

-

-      You may add Your own copyright statement to Your modifications and

-      may provide additional or different license terms and conditions

-      for use, reproduction, or distribution of Your modifications, or

-      for any such Derivative Works as a whole, provided Your use,

-      reproduction, and distribution of the Work otherwise complies with

-      the conditions stated in this License.

-

-   5. Submission of Contributions. Unless You explicitly state otherwise,

-      any Contribution intentionally submitted for inclusion in the Work

-      by You to the Licensor shall be under the terms and conditions of

-      this License, without any additional terms or conditions.

-      Notwithstanding the above, nothing herein shall supersede or modify

-      the terms of any separate license agreement you may have executed

-      with Licensor regarding such Contributions.

-

-   6. Trademarks. This License does not grant permission to use the trade

-      names, trademarks, service marks, or product names of the Licensor,

-      except as required for reasonable and customary use in describing the

-      origin of the Work and reproducing the content of the NOTICE file.

-

-   7. Disclaimer of Warranty. Unless required by applicable law or

-      agreed to in writing, Licensor provides the Work (and each

-      Contributor provides its Contributions) on an "AS IS" BASIS,

-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or

-      implied, including, without limitation, any warranties or conditions

-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A

-      PARTICULAR PURPOSE. You are solely responsible for determining the

-      appropriateness of using or redistributing the Work and assume any

-      risks associated with Your exercise of permissions under this License.

-

-   8. Limitation of Liability. In no event and under no legal theory,

-      whether in tort (including negligence), contract, or otherwise,

-      unless required by applicable law (such as deliberate and grossly

-      negligent acts) or agreed to in writing, shall any Contributor be

-      liable to You for damages, including any direct, indirect, special,

-      incidental, or consequential damages of any character arising as a

-      result of this License or out of the use or inability to use the

-      Work (including but not limited to damages for loss of goodwill,

-      work stoppage, computer failure or malfunction, or any and all

-      other commercial damages or losses), even if such Contributor

-      has been advised of the possibility of such damages.

-

-   9. Accepting Warranty or Additional Liability. While redistributing

-      the Work or Derivative Works thereof, You may choose to offer,

-      and charge a fee for, acceptance of support, warranty, indemnity,

-      or other liability obligations and/or rights consistent with this

-      License. However, in accepting such obligations, You may act only

-      on Your own behalf and on Your sole responsibility, not on behalf

-      of any other Contributor, and only if You agree to indemnify,

-      defend, and hold each Contributor harmless for any liability

-      incurred by, or claims asserted against, such Contributor by reason

-      of your accepting any such warranty or additional liability.

-

-   END OF TERMS AND CONDITIONS

-

-   APPENDIX: How to apply the Apache License to your work.

-

-      To apply the Apache License to your work, attach the following

-      boilerplate notice, with the fields enclosed by brackets "[]"

-      replaced with your own identifying information. (Don't include

-      the brackets!)  The text should be enclosed in the appropriate

-      comment syntax for the file format. We also recommend that a

-      file or class name and description of purpose be included on the

-      same "printed page" as the copyright notice for easier

-      identification within third-party archives.

-

-   Copyright [yyyy] [name of copyright owner]

-

-   Licensed under the Apache License, Version 2.0 (the "License");

-   you may not use this file except in compliance with the License.

-   You may obtain a copy of the License at

-

-       http://www.apache.org/licenses/LICENSE-2.0

-

-   Unless required by applicable law or agreed to in writing, software

-   distributed under the License is distributed on an "AS IS" BASIS,

-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-   See the License for the specific language governing permissions and

-   limitations under the License.

diff --git a/licenses/binary-release/commons-codec-1.10.NOTICE b/licenses/binary-release/commons-codec-1.10.NOTICE
deleted file mode 100644
index efc098c..0000000
--- a/licenses/binary-release/commons-codec-1.10.NOTICE
+++ /dev/null
@@ -1,17 +0,0 @@
-Apache Commons Codec

-Copyright 2002-2014 The Apache Software Foundation

-

-This product includes software developed at

-The Apache Software Foundation (http://www.apache.org/).

-

-src/test/org/apache/commons/codec/language/DoubleMetaphoneTest.java

-contains test data from http://aspell.net/test/orig/batch0.tab.

-Copyright (C) 2002 Kevin Atkinson (kevina@gnu.org)

-

-===============================================================================

-

-The content of package org.apache.commons.codec.language.bm has been translated

-from the original php source code available at http://stevemorse.org/phoneticinfo.htm

-with permission from the original authors.

-Original source copyright:

-Copyright (c) 2008 Alexander Beider & Stephen P. Morse.

diff --git a/licenses/binary-release/commons-codec-1.9.AL-2.0 b/licenses/binary-release/commons-codec-1.9.AL-2.0
deleted file mode 100644
index 75b5248..0000000
--- a/licenses/binary-release/commons-codec-1.9.AL-2.0
+++ /dev/null
@@ -1,202 +0,0 @@
-

-                                 Apache License

-                           Version 2.0, January 2004

-                        http://www.apache.org/licenses/

-

-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

-

-   1. Definitions.

-

-      "License" shall mean the terms and conditions for use, reproduction,

-      and distribution as defined by Sections 1 through 9 of this document.

-

-      "Licensor" shall mean the copyright owner or entity authorized by

-      the copyright owner that is granting the License.

-

-      "Legal Entity" shall mean the union of the acting entity and all

-      other entities that control, are controlled by, or are under common

-      control with that entity. For the purposes of this definition,

-      "control" means (i) the power, direct or indirect, to cause the

-      direction or management of such entity, whether by contract or

-      otherwise, or (ii) ownership of fifty percent (50%) or more of the

-      outstanding shares, or (iii) beneficial ownership of such entity.

-

-      "You" (or "Your") shall mean an individual or Legal Entity

-      exercising permissions granted by this License.

-

-      "Source" form shall mean the preferred form for making modifications,

-      including but not limited to software source code, documentation

-      source, and configuration files.

-

-      "Object" form shall mean any form resulting from mechanical

-      transformation or translation of a Source form, including but

-      not limited to compiled object code, generated documentation,

-      and conversions to other media types.

-

-      "Work" shall mean the work of authorship, whether in Source or

-      Object form, made available under the License, as indicated by a

-      copyright notice that is included in or attached to the work

-      (an example is provided in the Appendix below).

-

-      "Derivative Works" shall mean any work, whether in Source or Object

-      form, that is based on (or derived from) the Work and for which the

-      editorial revisions, annotations, elaborations, or other modifications

-      represent, as a whole, an original work of authorship. For the purposes

-      of this License, Derivative Works shall not include works that remain

-      separable from, or merely link (or bind by name) to the interfaces of,

-      the Work and Derivative Works thereof.

-

-      "Contribution" shall mean any work of authorship, including

-      the original version of the Work and any modifications or additions

-      to that Work or Derivative Works thereof, that is intentionally

-      submitted to Licensor for inclusion in the Work by the copyright owner

-      or by an individual or Legal Entity authorized to submit on behalf of

-      the copyright owner. For the purposes of this definition, "submitted"

-      means any form of electronic, verbal, or written communication sent

-      to the Licensor or its representatives, including but not limited to

-      communication on electronic mailing lists, source code control systems,

-      and issue tracking systems that are managed by, or on behalf of, the

-      Licensor for the purpose of discussing and improving the Work, but

-      excluding communication that is conspicuously marked or otherwise

-      designated in writing by the copyright owner as "Not a Contribution."

-

-      "Contributor" shall mean Licensor and any individual or Legal Entity

-      on behalf of whom a Contribution has been received by Licensor and

-      subsequently incorporated within the Work.

-

-   2. Grant of Copyright License. Subject to the terms and conditions of

-      this License, each Contributor hereby grants to You a perpetual,

-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable

-      copyright license to reproduce, prepare Derivative Works of,

-      publicly display, publicly perform, sublicense, and distribute the

-      Work and such Derivative Works in Source or Object form.

-

-   3. Grant of Patent License. Subject to the terms and conditions of

-      this License, each Contributor hereby grants to You a perpetual,

-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable

-      (except as stated in this section) patent license to make, have made,

-      use, offer to sell, sell, import, and otherwise transfer the Work,

-      where such license applies only to those patent claims licensable

-      by such Contributor that are necessarily infringed by their

-      Contribution(s) alone or by combination of their Contribution(s)

-      with the Work to which such Contribution(s) was submitted. If You

-      institute patent litigation against any entity (including a

-      cross-claim or counterclaim in a lawsuit) alleging that the Work

-      or a Contribution incorporated within the Work constitutes direct

-      or contributory patent infringement, then any patent licenses

-      granted to You under this License for that Work shall terminate

-      as of the date such litigation is filed.

-

-   4. Redistribution. You may reproduce and distribute copies of the

-      Work or Derivative Works thereof in any medium, with or without

-      modifications, and in Source or Object form, provided that You

-      meet the following conditions:

-

-      (a) You must give any other recipients of the Work or

-          Derivative Works a copy of this License; and

-

-      (b) You must cause any modified files to carry prominent notices

-          stating that You changed the files; and

-

-      (c) You must retain, in the Source form of any Derivative Works

-          that You distribute, all copyright, patent, trademark, and

-          attribution notices from the Source form of the Work,

-          excluding those notices that do not pertain to any part of

-          the Derivative Works; and

-

-      (d) If the Work includes a "NOTICE" text file as part of its

-          distribution, then any Derivative Works that You distribute must

-          include a readable copy of the attribution notices contained

-          within such NOTICE file, excluding those notices that do not

-          pertain to any part of the Derivative Works, in at least one

-          of the following places: within a NOTICE text file distributed

-          as part of the Derivative Works; within the Source form or

-          documentation, if provided along with the Derivative Works; or,

-          within a display generated by the Derivative Works, if and

-          wherever such third-party notices normally appear. The contents

-          of the NOTICE file are for informational purposes only and

-          do not modify the License. You may add Your own attribution

-          notices within Derivative Works that You distribute, alongside

-          or as an addendum to the NOTICE text from the Work, provided

-          that such additional attribution notices cannot be construed

-          as modifying the License.

-

-      You may add Your own copyright statement to Your modifications and

-      may provide additional or different license terms and conditions

-      for use, reproduction, or distribution of Your modifications, or

-      for any such Derivative Works as a whole, provided Your use,

-      reproduction, and distribution of the Work otherwise complies with

-      the conditions stated in this License.

-

-   5. Submission of Contributions. Unless You explicitly state otherwise,

-      any Contribution intentionally submitted for inclusion in the Work

-      by You to the Licensor shall be under the terms and conditions of

-      this License, without any additional terms or conditions.

-      Notwithstanding the above, nothing herein shall supersede or modify

-      the terms of any separate license agreement you may have executed

-      with Licensor regarding such Contributions.

-

-   6. Trademarks. This License does not grant permission to use the trade

-      names, trademarks, service marks, or product names of the Licensor,

-      except as required for reasonable and customary use in describing the

-      origin of the Work and reproducing the content of the NOTICE file.

-

-   7. Disclaimer of Warranty. Unless required by applicable law or

-      agreed to in writing, Licensor provides the Work (and each

-      Contributor provides its Contributions) on an "AS IS" BASIS,

-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or

-      implied, including, without limitation, any warranties or conditions

-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A

-      PARTICULAR PURPOSE. You are solely responsible for determining the

-      appropriateness of using or redistributing the Work and assume any

-      risks associated with Your exercise of permissions under this License.

-

-   8. Limitation of Liability. In no event and under no legal theory,

-      whether in tort (including negligence), contract, or otherwise,

-      unless required by applicable law (such as deliberate and grossly

-      negligent acts) or agreed to in writing, shall any Contributor be

-      liable to You for damages, including any direct, indirect, special,

-      incidental, or consequential damages of any character arising as a

-      result of this License or out of the use or inability to use the

-      Work (including but not limited to damages for loss of goodwill,

-      work stoppage, computer failure or malfunction, or any and all

-      other commercial damages or losses), even if such Contributor

-      has been advised of the possibility of such damages.

-

-   9. Accepting Warranty or Additional Liability. While redistributing

-      the Work or Derivative Works thereof, You may choose to offer,

-      and charge a fee for, acceptance of support, warranty, indemnity,

-      or other liability obligations and/or rights consistent with this

-      License. However, in accepting such obligations, You may act only

-      on Your own behalf and on Your sole responsibility, not on behalf

-      of any other Contributor, and only if You agree to indemnify,

-      defend, and hold each Contributor harmless for any liability

-      incurred by, or claims asserted against, such Contributor by reason

-      of your accepting any such warranty or additional liability.

-

-   END OF TERMS AND CONDITIONS

-

-   APPENDIX: How to apply the Apache License to your work.

-

-      To apply the Apache License to your work, attach the following

-      boilerplate notice, with the fields enclosed by brackets "[]"

-      replaced with your own identifying information. (Don't include

-      the brackets!)  The text should be enclosed in the appropriate

-      comment syntax for the file format. We also recommend that a

-      file or class name and description of purpose be included on the

-      same "printed page" as the copyright notice for easier

-      identification within third-party archives.

-

-   Copyright [yyyy] [name of copyright owner]

-

-   Licensed under the Apache License, Version 2.0 (the "License");

-   you may not use this file except in compliance with the License.

-   You may obtain a copy of the License at

-

-       http://www.apache.org/licenses/LICENSE-2.0

-

-   Unless required by applicable law or agreed to in writing, software

-   distributed under the License is distributed on an "AS IS" BASIS,

-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-   See the License for the specific language governing permissions and

-   limitations under the License.

diff --git a/licenses/binary-release/commons-codec-1.9.NOTICE b/licenses/binary-release/commons-codec-1.9.NOTICE
deleted file mode 100644
index 147f78a..0000000
--- a/licenses/binary-release/commons-codec-1.9.NOTICE
+++ /dev/null
@@ -1,9 +0,0 @@
-Apache Commons Codec

-Copyright 2002-2013 The Apache Software Foundation

-

-This product includes software developed at

-The Apache Software Foundation (http://www.apache.org/).

-

-src/test/org/apache/commons/codec/language/DoubleMetaphoneTest.java

-contains test data from http://aspell.net/test/orig/batch0.tab.

-Copyright (C) 2002 Kevin Atkinson (kevina@gnu.org)

diff --git a/licenses/binary-release/commons-lang3-3.4.NOTICE b/licenses/binary-release/commons-lang3-3.4.NOTICE
deleted file mode 100644
index 592023a..0000000
--- a/licenses/binary-release/commons-lang3-3.4.NOTICE
+++ /dev/null
@@ -1,8 +0,0 @@
-Apache Commons Lang
-Copyright 2001-2015 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-
-This product includes software from the Spring Framework,
-under the Apache License 2.0 (see: StringUtils.containsWhitespace())
diff --git a/licenses/binary-release/commons-logging-1.2.AL-2.0 b/licenses/binary-release/commons-logging-1.2.AL-2.0
deleted file mode 100644
index d645695..0000000
--- a/licenses/binary-release/commons-logging-1.2.AL-2.0
+++ /dev/null
@@ -1,202 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff --git a/licenses/binary-release/commons-logging-1.2.NOTICE b/licenses/binary-release/commons-logging-1.2.NOTICE
deleted file mode 100644
index 556bd03..0000000
--- a/licenses/binary-release/commons-logging-1.2.NOTICE
+++ /dev/null
@@ -1,6 +0,0 @@
-Apache Commons Logging
-Copyright 2003-2014 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-
diff --git a/licenses/binary-release/commons-math3-3.4.1.AL-2.0 b/licenses/binary-release/commons-math3-3.4.1.AL-2.0
deleted file mode 100644
index d97b49a..0000000
--- a/licenses/binary-release/commons-math3-3.4.1.AL-2.0
+++ /dev/null
@@ -1,457 +0,0 @@
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
-
-Apache Commons Math includes the following code provided to the ASF under the
-Apache License 2.0:
-
- - The inverse error function implementation in the Erf class is based on CUDA
-   code developed by Mike Giles, Oxford-Man Institute of Quantitative Finance,
-   and published in GPU Computing Gems, volume 2, 2010 (grant received on
-   March 23th 2013)
- - The LinearConstraint, LinearObjectiveFunction, LinearOptimizer,
-   RelationShip, SimplexSolver and SimplexTableau classes in package
-   org.apache.commons.math3.optimization.linear include software developed by
-   Benjamin McCann (http://www.benmccann.com) and distributed with
-   the following copyright: Copyright 2009 Google Inc. (grant received on
-   March 16th 2009)
- - The class "org.apache.commons.math3.exception.util.LocalizedFormatsTest" which
-   is an adapted version of "OrekitMessagesTest" test class for the Orekit library
- - The "org.apache.commons.math3.analysis.interpolation.HermiteInterpolator"
-   has been imported from the Orekit space flight dynamics library.
-
-===============================================================================
- 
-
-
-APACHE COMMONS MATH DERIVATIVE WORKS: 
-
-The Apache commons-math library includes a number of subcomponents
-whose implementation is derived from original sources written
-in C or Fortran.  License terms of the original sources
-are reproduced below.
-
-===============================================================================
-For the lmder, lmpar and qrsolv Fortran routine from minpack and translated in
-the LevenbergMarquardtOptimizer class in package
-org.apache.commons.math3.optimization.general 
-Original source copyright and license statement:
-
-Minpack Copyright Notice (1999) University of Chicago.  All rights reserved
-
-Redistribution and use in source and binary forms, with or
-without modification, are permitted provided that the
-following conditions are met:
-
-1. Redistributions of source code must retain the above
-copyright notice, this list of conditions and the following
-disclaimer.
-
-2. Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following
-disclaimer in the documentation and/or other materials
-provided with the distribution.
-
-3. The end-user documentation included with the
-redistribution, if any, must include the following
-acknowledgment:
-
-   "This product includes software developed by the
-   University of Chicago, as Operator of Argonne National
-   Laboratory.
-
-Alternately, this acknowledgment may appear in the software
-itself, if and wherever such third-party acknowledgments
-normally appear.
-
-4. WARRANTY DISCLAIMER. THE SOFTWARE IS SUPPLIED "AS IS"
-WITHOUT WARRANTY OF ANY KIND. THE COPYRIGHT HOLDER, THE
-UNITED STATES, THE UNITED STATES DEPARTMENT OF ENERGY, AND
-THEIR EMPLOYEES: (1) DISCLAIM ANY WARRANTIES, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO ANY IMPLIED WARRANTIES
-OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE
-OR NON-INFRINGEMENT, (2) DO NOT ASSUME ANY LEGAL LIABILITY
-OR RESPONSIBILITY FOR THE ACCURACY, COMPLETENESS, OR
-USEFULNESS OF THE SOFTWARE, (3) DO NOT REPRESENT THAT USE OF
-THE SOFTWARE WOULD NOT INFRINGE PRIVATELY OWNED RIGHTS, (4)
-DO NOT WARRANT THAT THE SOFTWARE WILL FUNCTION
-UNINTERRUPTED, THAT IT IS ERROR-FREE OR THAT ANY ERRORS WILL
-BE CORRECTED.
-
-5. LIMITATION OF LIABILITY. IN NO EVENT WILL THE COPYRIGHT
-HOLDER, THE UNITED STATES, THE UNITED STATES DEPARTMENT OF
-ENERGY, OR THEIR EMPLOYEES: BE LIABLE FOR ANY INDIRECT,
-INCIDENTAL, CONSEQUENTIAL, SPECIAL OR PUNITIVE DAMAGES OF
-ANY KIND OR NATURE, INCLUDING BUT NOT LIMITED TO LOSS OF
-PROFITS OR LOSS OF DATA, FOR ANY REASON WHATSOEVER, WHETHER
-SUCH LIABILITY IS ASSERTED ON THE BASIS OF CONTRACT, TORT
-(INCLUDING NEGLIGENCE OR STRICT LIABILITY), OR OTHERWISE,
-EVEN IF ANY OF SAID PARTIES HAS BEEN WARNED OF THE
-POSSIBILITY OF SUCH LOSS OR DAMAGES.
-===============================================================================
-
-Copyright and license statement for the odex Fortran routine developed by
-E. Hairer and G. Wanner and translated in GraggBulirschStoerIntegrator class
-in package org.apache.commons.math3.ode.nonstiff:
-
-
-Copyright (c) 2004, Ernst Hairer
-
-Redistribution and use in source and binary forms, with or without 
-modification, are permitted provided that the following conditions are 
-met:
-
-- Redistributions of source code must retain the above copyright 
-notice, this list of conditions and the following disclaimer.
-
-- Redistributions in binary form must reproduce the above copyright 
-notice, this list of conditions and the following disclaimer in the 
-documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 
-IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 
-TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 
-PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR 
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-===============================================================================
-
-Copyright and license statement for the original Mersenne twister C
-routines translated in MersenneTwister class in package 
-org.apache.commons.math3.random:
-
-   Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura,
-   All rights reserved.                          
-
-   Redistribution and use in source and binary forms, with or without
-   modification, are permitted provided that the following conditions
-   are met:
-
-     1. Redistributions of source code must retain the above copyright
-        notice, this list of conditions and the following disclaimer.
-
-     2. Redistributions in binary form must reproduce the above copyright
-        notice, this list of conditions and the following disclaimer in the
-        documentation and/or other materials provided with the distribution.
-
-     3. The names of its contributors may not be used to endorse or promote 
-        products derived from this software without specific prior written 
-        permission.
-
-   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-   A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-===============================================================================
-
-The initial code for shuffling an array (originally in class
-"org.apache.commons.math3.random.RandomDataGenerator", now replaced by
-a method in class "org.apache.commons.math3.util.MathArrays") was
-inspired from the algorithm description provided in
-"Algorithms", by Ian Craw and John Pulham (University of Aberdeen 1999).
-The textbook (containing a proof that the shuffle is uniformly random) is
-available here:
-  http://citeseerx.ist.psu.edu/viewdoc/download;?doi=10.1.1.173.1898&rep=rep1&type=pdf
-
-===============================================================================
-License statement for the direction numbers in the resource files for Sobol sequences.
-
------------------------------------------------------------------------------
-Licence pertaining to sobol.cc and the accompanying sets of direction numbers
-
------------------------------------------------------------------------------
-Copyright (c) 2008, Frances Y. Kuo and Stephen Joe
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-
-    * Neither the names of the copyright holders nor the names of the
-      University of New South Wales and the University of Waikato
-      and its contributors may be used to endorse or promote products derived
-      from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
-EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-===============================================================================
-
-The initial commit of package "org.apache.commons.math3.ml.neuralnet" is
-an adapted version of code developed in the context of the Data Processing
-and Analysis Consortium (DPAC) of the "Gaia" project of the European Space
-Agency (ESA).
-===============================================================================
-
-The initial commit of the class "org.apache.commons.math3.special.BesselJ" is
-an adapted version of code translated from the netlib Fortran program, rjbesl
-http://www.netlib.org/specfun/rjbesl by R.J. Cody at Argonne National
-Laboratory (USA).  There is no license or copyright statement included with the
-original Fortran sources.
-===============================================================================
-
-
-The BracketFinder (package org.apache.commons.math3.optimization.univariate)
-and PowellOptimizer (package org.apache.commons.math3.optimization.general)
-classes are based on the Python code in module "optimize.py" (version 0.5)
-developed by Travis E. Oliphant for the SciPy library (http://www.scipy.org/)
-Copyright © 2003-2009 SciPy Developers.
-
-SciPy license
-Copyright © 2001, 2002 Enthought, Inc.
-All rights reserved.
-
-Copyright © 2003-2013 SciPy Developers.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-
-    * Neither the name of Enthought nor the names of the SciPy Developers may
-      be used to endorse or promote products derived from this software without
-      specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY
-EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-===============================================================================
-
diff --git a/licenses/binary-release/commons-math3-3.4.1.NOTICE b/licenses/binary-release/commons-math3-3.4.1.NOTICE
deleted file mode 100644
index ce791e4..0000000
--- a/licenses/binary-release/commons-math3-3.4.1.NOTICE
+++ /dev/null
@@ -1,9 +0,0 @@
-Apache Commons Math
-Copyright 2001-2015 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-
-This product includes software developed for Orekit by
-CS Systèmes d'Information (http://www.c-s.fr/)
-Copyright 2010-2012 CS Systèmes d'Information
diff --git a/licenses/binary-release/commons-net-3.3.AL-2.0 b/licenses/binary-release/commons-net-3.3.AL-2.0
deleted file mode 100644
index 75b5248..0000000
--- a/licenses/binary-release/commons-net-3.3.AL-2.0
+++ /dev/null
@@ -1,202 +0,0 @@
-

-                                 Apache License

-                           Version 2.0, January 2004

-                        http://www.apache.org/licenses/

-

-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

-

-   1. Definitions.

-

-      "License" shall mean the terms and conditions for use, reproduction,

-      and distribution as defined by Sections 1 through 9 of this document.

-

-      "Licensor" shall mean the copyright owner or entity authorized by

-      the copyright owner that is granting the License.

-

-      "Legal Entity" shall mean the union of the acting entity and all

-      other entities that control, are controlled by, or are under common

-      control with that entity. For the purposes of this definition,

-      "control" means (i) the power, direct or indirect, to cause the

-      direction or management of such entity, whether by contract or

-      otherwise, or (ii) ownership of fifty percent (50%) or more of the

-      outstanding shares, or (iii) beneficial ownership of such entity.

-

-      "You" (or "Your") shall mean an individual or Legal Entity

-      exercising permissions granted by this License.

-

-      "Source" form shall mean the preferred form for making modifications,

-      including but not limited to software source code, documentation

-      source, and configuration files.

-

-      "Object" form shall mean any form resulting from mechanical

-      transformation or translation of a Source form, including but

-      not limited to compiled object code, generated documentation,

-      and conversions to other media types.

-

-      "Work" shall mean the work of authorship, whether in Source or

-      Object form, made available under the License, as indicated by a

-      copyright notice that is included in or attached to the work

-      (an example is provided in the Appendix below).

-

-      "Derivative Works" shall mean any work, whether in Source or Object

-      form, that is based on (or derived from) the Work and for which the

-      editorial revisions, annotations, elaborations, or other modifications

-      represent, as a whole, an original work of authorship. For the purposes

-      of this License, Derivative Works shall not include works that remain

-      separable from, or merely link (or bind by name) to the interfaces of,

-      the Work and Derivative Works thereof.

-

-      "Contribution" shall mean any work of authorship, including

-      the original version of the Work and any modifications or additions

-      to that Work or Derivative Works thereof, that is intentionally

-      submitted to Licensor for inclusion in the Work by the copyright owner

-      or by an individual or Legal Entity authorized to submit on behalf of

-      the copyright owner. For the purposes of this definition, "submitted"

-      means any form of electronic, verbal, or written communication sent

-      to the Licensor or its representatives, including but not limited to

-      communication on electronic mailing lists, source code control systems,

-      and issue tracking systems that are managed by, or on behalf of, the

-      Licensor for the purpose of discussing and improving the Work, but

-      excluding communication that is conspicuously marked or otherwise

-      designated in writing by the copyright owner as "Not a Contribution."

-

-      "Contributor" shall mean Licensor and any individual or Legal Entity

-      on behalf of whom a Contribution has been received by Licensor and

-      subsequently incorporated within the Work.

-

-   2. Grant of Copyright License. Subject to the terms and conditions of

-      this License, each Contributor hereby grants to You a perpetual,

-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable

-      copyright license to reproduce, prepare Derivative Works of,

-      publicly display, publicly perform, sublicense, and distribute the

-      Work and such Derivative Works in Source or Object form.

-

-   3. Grant of Patent License. Subject to the terms and conditions of

-      this License, each Contributor hereby grants to You a perpetual,

-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable

-      (except as stated in this section) patent license to make, have made,

-      use, offer to sell, sell, import, and otherwise transfer the Work,

-      where such license applies only to those patent claims licensable

-      by such Contributor that are necessarily infringed by their

-      Contribution(s) alone or by combination of their Contribution(s)

-      with the Work to which such Contribution(s) was submitted. If You

-      institute patent litigation against any entity (including a

-      cross-claim or counterclaim in a lawsuit) alleging that the Work

-      or a Contribution incorporated within the Work constitutes direct

-      or contributory patent infringement, then any patent licenses

-      granted to You under this License for that Work shall terminate

-      as of the date such litigation is filed.

-

-   4. Redistribution. You may reproduce and distribute copies of the

-      Work or Derivative Works thereof in any medium, with or without

-      modifications, and in Source or Object form, provided that You

-      meet the following conditions:

-

-      (a) You must give any other recipients of the Work or

-          Derivative Works a copy of this License; and

-

-      (b) You must cause any modified files to carry prominent notices

-          stating that You changed the files; and

-

-      (c) You must retain, in the Source form of any Derivative Works

-          that You distribute, all copyright, patent, trademark, and

-          attribution notices from the Source form of the Work,

-          excluding those notices that do not pertain to any part of

-          the Derivative Works; and

-

-      (d) If the Work includes a "NOTICE" text file as part of its

-          distribution, then any Derivative Works that You distribute must

-          include a readable copy of the attribution notices contained

-          within such NOTICE file, excluding those notices that do not

-          pertain to any part of the Derivative Works, in at least one

-          of the following places: within a NOTICE text file distributed

-          as part of the Derivative Works; within the Source form or

-          documentation, if provided along with the Derivative Works; or,

-          within a display generated by the Derivative Works, if and

-          wherever such third-party notices normally appear. The contents

-          of the NOTICE file are for informational purposes only and

-          do not modify the License. You may add Your own attribution

-          notices within Derivative Works that You distribute, alongside

-          or as an addendum to the NOTICE text from the Work, provided

-          that such additional attribution notices cannot be construed

-          as modifying the License.

-

-      You may add Your own copyright statement to Your modifications and

-      may provide additional or different license terms and conditions

-      for use, reproduction, or distribution of Your modifications, or

-      for any such Derivative Works as a whole, provided Your use,

-      reproduction, and distribution of the Work otherwise complies with

-      the conditions stated in this License.

-

-   5. Submission of Contributions. Unless You explicitly state otherwise,

-      any Contribution intentionally submitted for inclusion in the Work

-      by You to the Licensor shall be under the terms and conditions of

-      this License, without any additional terms or conditions.

-      Notwithstanding the above, nothing herein shall supersede or modify

-      the terms of any separate license agreement you may have executed

-      with Licensor regarding such Contributions.

-

-   6. Trademarks. This License does not grant permission to use the trade

-      names, trademarks, service marks, or product names of the Licensor,

-      except as required for reasonable and customary use in describing the

-      origin of the Work and reproducing the content of the NOTICE file.

-

-   7. Disclaimer of Warranty. Unless required by applicable law or

-      agreed to in writing, Licensor provides the Work (and each

-      Contributor provides its Contributions) on an "AS IS" BASIS,

-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or

-      implied, including, without limitation, any warranties or conditions

-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A

-      PARTICULAR PURPOSE. You are solely responsible for determining the

-      appropriateness of using or redistributing the Work and assume any

-      risks associated with Your exercise of permissions under this License.

-

-   8. Limitation of Liability. In no event and under no legal theory,

-      whether in tort (including negligence), contract, or otherwise,

-      unless required by applicable law (such as deliberate and grossly

-      negligent acts) or agreed to in writing, shall any Contributor be

-      liable to You for damages, including any direct, indirect, special,

-      incidental, or consequential damages of any character arising as a

-      result of this License or out of the use or inability to use the

-      Work (including but not limited to damages for loss of goodwill,

-      work stoppage, computer failure or malfunction, or any and all

-      other commercial damages or losses), even if such Contributor

-      has been advised of the possibility of such damages.

-

-   9. Accepting Warranty or Additional Liability. While redistributing

-      the Work or Derivative Works thereof, You may choose to offer,

-      and charge a fee for, acceptance of support, warranty, indemnity,

-      or other liability obligations and/or rights consistent with this

-      License. However, in accepting such obligations, You may act only

-      on Your own behalf and on Your sole responsibility, not on behalf

-      of any other Contributor, and only if You agree to indemnify,

-      defend, and hold each Contributor harmless for any liability

-      incurred by, or claims asserted against, such Contributor by reason

-      of your accepting any such warranty or additional liability.

-

-   END OF TERMS AND CONDITIONS

-

-   APPENDIX: How to apply the Apache License to your work.

-

-      To apply the Apache License to your work, attach the following

-      boilerplate notice, with the fields enclosed by brackets "[]"

-      replaced with your own identifying information. (Don't include

-      the brackets!)  The text should be enclosed in the appropriate

-      comment syntax for the file format. We also recommend that a

-      file or class name and description of purpose be included on the

-      same "printed page" as the copyright notice for easier

-      identification within third-party archives.

-

-   Copyright [yyyy] [name of copyright owner]

-

-   Licensed under the Apache License, Version 2.0 (the "License");

-   you may not use this file except in compliance with the License.

-   You may obtain a copy of the License at

-

-       http://www.apache.org/licenses/LICENSE-2.0

-

-   Unless required by applicable law or agreed to in writing, software

-   distributed under the License is distributed on an "AS IS" BASIS,

-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-   See the License for the specific language governing permissions and

-   limitations under the License.

diff --git a/licenses/binary-release/commons-net-3.3.NOTICE b/licenses/binary-release/commons-net-3.3.NOTICE
deleted file mode 100644
index c14ed43..0000000
--- a/licenses/binary-release/commons-net-3.3.NOTICE
+++ /dev/null
@@ -1,5 +0,0 @@
-Apache Commons Net

-Copyright 2001-2013 The Apache Software Foundation

-

-This product includes software developed at

-The Apache Software Foundation (http://www.apache.org/).

diff --git a/licenses/binary-release/gson-2.2.4.AL-2.0 b/licenses/binary-release/gson-2.2.4.AL-2.0
deleted file mode 100644
index 892eaed..0000000
--- a/licenses/binary-release/gson-2.2.4.AL-2.0
+++ /dev/null
@@ -1,203 +0,0 @@
-Google Gson

-

-                                 Apache License

-                           Version 2.0, January 2004

-                        http://www.apache.org/licenses/

-

-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

-

-   1. Definitions.

-

-      "License" shall mean the terms and conditions for use, reproduction,

-      and distribution as defined by Sections 1 through 9 of this document.

-

-      "Licensor" shall mean the copyright owner or entity authorized by

-      the copyright owner that is granting the License.

-

-      "Legal Entity" shall mean the union of the acting entity and all

-      other entities that control, are controlled by, or are under common

-      control with that entity. For the purposes of this definition,

-      "control" means (i) the power, direct or indirect, to cause the

-      direction or management of such entity, whether by contract or

-      otherwise, or (ii) ownership of fifty percent (50%) or more of the

-      outstanding shares, or (iii) beneficial ownership of such entity.

-

-      "You" (or "Your") shall mean an individual or Legal Entity

-      exercising permissions granted by this License.

-

-      "Source" form shall mean the preferred form for making modifications,

-      including but not limited to software source code, documentation

-      source, and configuration files.

-

-      "Object" form shall mean any form resulting from mechanical

-      transformation or translation of a Source form, including but

-      not limited to compiled object code, generated documentation,

-      and conversions to other media types.

-

-      "Work" shall mean the work of authorship, whether in Source or

-      Object form, made available under the License, as indicated by a

-      copyright notice that is included in or attached to the work

-      (an example is provided in the Appendix below).

-

-      "Derivative Works" shall mean any work, whether in Source or Object

-      form, that is based on (or derived from) the Work and for which the

-      editorial revisions, annotations, elaborations, or other modifications

-      represent, as a whole, an original work of authorship. For the purposes

-      of this License, Derivative Works shall not include works that remain

-      separable from, or merely link (or bind by name) to the interfaces of,

-      the Work and Derivative Works thereof.

-

-      "Contribution" shall mean any work of authorship, including

-      the original version of the Work and any modifications or additions

-      to that Work or Derivative Works thereof, that is intentionally

-      submitted to Licensor for inclusion in the Work by the copyright owner

-      or by an individual or Legal Entity authorized to submit on behalf of

-      the copyright owner. For the purposes of this definition, "submitted"

-      means any form of electronic, verbal, or written communication sent

-      to the Licensor or its representatives, including but not limited to

-      communication on electronic mailing lists, source code control systems,

-      and issue tracking systems that are managed by, or on behalf of, the

-      Licensor for the purpose of discussing and improving the Work, but

-      excluding communication that is conspicuously marked or otherwise

-      designated in writing by the copyright owner as "Not a Contribution."

-

-      "Contributor" shall mean Licensor and any individual or Legal Entity

-      on behalf of whom a Contribution has been received by Licensor and

-      subsequently incorporated within the Work.

-

-   2. Grant of Copyright License. Subject to the terms and conditions of

-      this License, each Contributor hereby grants to You a perpetual,

-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable

-      copyright license to reproduce, prepare Derivative Works of,

-      publicly display, publicly perform, sublicense, and distribute the

-      Work and such Derivative Works in Source or Object form.

-

-   3. Grant of Patent License. Subject to the terms and conditions of

-      this License, each Contributor hereby grants to You a perpetual,

-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable

-      (except as stated in this section) patent license to make, have made,

-      use, offer to sell, sell, import, and otherwise transfer the Work,

-      where such license applies only to those patent claims licensable

-      by such Contributor that are necessarily infringed by their

-      Contribution(s) alone or by combination of their Contribution(s)

-      with the Work to which such Contribution(s) was submitted. If You

-      institute patent litigation against any entity (including a

-      cross-claim or counterclaim in a lawsuit) alleging that the Work

-      or a Contribution incorporated within the Work constitutes direct

-      or contributory patent infringement, then any patent licenses

-      granted to You under this License for that Work shall terminate

-      as of the date such litigation is filed.

-

-   4. Redistribution. You may reproduce and distribute copies of the

-      Work or Derivative Works thereof in any medium, with or without

-      modifications, and in Source or Object form, provided that You

-      meet the following conditions:

-

-      (a) You must give any other recipients of the Work or

-          Derivative Works a copy of this License; and

-

-      (b) You must cause any modified files to carry prominent notices

-          stating that You changed the files; and

-

-      (c) You must retain, in the Source form of any Derivative Works

-          that You distribute, all copyright, patent, trademark, and

-          attribution notices from the Source form of the Work,

-          excluding those notices that do not pertain to any part of

-          the Derivative Works; and

-

-      (d) If the Work includes a "NOTICE" text file as part of its

-          distribution, then any Derivative Works that You distribute must

-          include a readable copy of the attribution notices contained

-          within such NOTICE file, excluding those notices that do not

-          pertain to any part of the Derivative Works, in at least one

-          of the following places: within a NOTICE text file distributed

-          as part of the Derivative Works; within the Source form or

-          documentation, if provided along with the Derivative Works; or,

-          within a display generated by the Derivative Works, if and

-          wherever such third-party notices normally appear. The contents

-          of the NOTICE file are for informational purposes only and

-          do not modify the License. You may add Your own attribution

-          notices within Derivative Works that You distribute, alongside

-          or as an addendum to the NOTICE text from the Work, provided

-          that such additional attribution notices cannot be construed

-          as modifying the License.

-

-      You may add Your own copyright statement to Your modifications and

-      may provide additional or different license terms and conditions

-      for use, reproduction, or distribution of Your modifications, or

-      for any such Derivative Works as a whole, provided Your use,

-      reproduction, and distribution of the Work otherwise complies with

-      the conditions stated in this License.

-

-   5. Submission of Contributions. Unless You explicitly state otherwise,

-      any Contribution intentionally submitted for inclusion in the Work

-      by You to the Licensor shall be under the terms and conditions of

-      this License, without any additional terms or conditions.

-      Notwithstanding the above, nothing herein shall supersede or modify

-      the terms of any separate license agreement you may have executed

-      with Licensor regarding such Contributions.

-

-   6. Trademarks. This License does not grant permission to use the trade

-      names, trademarks, service marks, or product names of the Licensor,

-      except as required for reasonable and customary use in describing the

-      origin of the Work and reproducing the content of the NOTICE file.

-

-   7. Disclaimer of Warranty. Unless required by applicable law or

-      agreed to in writing, Licensor provides the Work (and each

-      Contributor provides its Contributions) on an "AS IS" BASIS,

-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or

-      implied, including, without limitation, any warranties or conditions

-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A

-      PARTICULAR PURPOSE. You are solely responsible for determining the

-      appropriateness of using or redistributing the Work and assume any

-      risks associated with Your exercise of permissions under this License.

-

-   8. Limitation of Liability. In no event and under no legal theory,

-      whether in tort (including negligence), contract, or otherwise,

-      unless required by applicable law (such as deliberate and grossly

-      negligent acts) or agreed to in writing, shall any Contributor be

-      liable to You for damages, including any direct, indirect, special,

-      incidental, or consequential damages of any character arising as a

-      result of this License or out of the use or inability to use the

-      Work (including but not limited to damages for loss of goodwill,

-      work stoppage, computer failure or malfunction, or any and all

-      other commercial damages or losses), even if such Contributor

-      has been advised of the possibility of such damages.

-

-   9. Accepting Warranty or Additional Liability. While redistributing

-      the Work or Derivative Works thereof, You may choose to offer,

-      and charge a fee for, acceptance of support, warranty, indemnity,

-      or other liability obligations and/or rights consistent with this

-      License. However, in accepting such obligations, You may act only

-      on Your own behalf and on Your sole responsibility, not on behalf

-      of any other Contributor, and only if You agree to indemnify,

-      defend, and hold each Contributor harmless for any liability

-      incurred by, or claims asserted against, such Contributor by reason

-      of your accepting any such warranty or additional liability.

-

-   END OF TERMS AND CONDITIONS

-

-   APPENDIX: How to apply the Apache License to your work.

-

-      To apply the Apache License to your work, attach the following

-      boilerplate notice, with the fields enclosed by brackets "[]"

-      replaced with your own identifying information. (Don't include

-      the brackets!)  The text should be enclosed in the appropriate

-      comment syntax for the file format. We also recommend that a

-      file or class name and description of purpose be included on the

-      same "printed page" as the copyright notice for easier

-      identification within third-party archives.

-

-   Copyright 2008-2011 Google Inc.

-

-   Licensed under the Apache License, Version 2.0 (the "License");

-   you may not use this file except in compliance with the License.

-   You may obtain a copy of the License at

-

-       http://www.apache.org/licenses/LICENSE-2.0

-

-   Unless required by applicable law or agreed to in writing, software

-   distributed under the License is distributed on an "AS IS" BASIS,

-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-   See the License for the specific language governing permissions and

-   limitations under the License.

diff --git a/licenses/binary-release/gson-2.6.1.AL-2.0 b/licenses/binary-release/gson-2.6.1.AL-2.0
deleted file mode 100644
index d645695..0000000
--- a/licenses/binary-release/gson-2.6.1.AL-2.0
+++ /dev/null
@@ -1,202 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff --git a/licenses/binary-release/httpclient-4.5.1.AL-2.0 b/licenses/binary-release/httpclient-4.5.1.AL-2.0
deleted file mode 100644
index d645695..0000000
--- a/licenses/binary-release/httpclient-4.5.1.AL-2.0
+++ /dev/null
@@ -1,202 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff --git a/licenses/binary-release/httpclient-4.5.1.NOTICE b/licenses/binary-release/httpclient-4.5.1.NOTICE
deleted file mode 100644
index c05d4e6..0000000
--- a/licenses/binary-release/httpclient-4.5.1.NOTICE
+++ /dev/null
@@ -1,8 +0,0 @@
-
-Apache HttpClient
-Copyright 1999-2015 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-
-
diff --git a/licenses/binary-release/httpcore-4.4.3.AL-2.0 b/licenses/binary-release/httpcore-4.4.3.AL-2.0
deleted file mode 100644
index 54e4285..0000000
--- a/licenses/binary-release/httpcore-4.4.3.AL-2.0
+++ /dev/null
@@ -1,266 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
-=========================================================================
-
-This project contains annotations in the package org.apache.http.annotation
-which are derived from JCIP-ANNOTATIONS
-Copyright (c) 2005 Brian Goetz and Tim Peierls.
-See http://www.jcip.net and the Creative Commons Attribution License
-(http://creativecommons.org/licenses/by/2.5)
-Full text: http://creativecommons.org/licenses/by/2.5/legalcode
-
-License
-
-THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
-
-BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS.
-
-1. Definitions
-
-    "Collective Work" means a work, such as a periodical issue, anthology or encyclopedia, in which the Work in its entirety in unmodified form, along with a number of other contributions, constituting separate and independent works in themselves, are assembled into a collective whole. A work that constitutes a Collective Work will not be considered a Derivative Work (as defined below) for the purposes of this License.
-    "Derivative Work" means a work based upon the Work or upon the Work and other pre-existing works, such as a translation, musical arrangement, dramatization, fictionalization, motion picture version, sound recording, art reproduction, abridgment, condensation, or any other form in which the Work may be recast, transformed, or adapted, except that a work that constitutes a Collective Work will not be considered a Derivative Work for the purpose of this License. For the avoidance of doubt, where the Work is a musical composition or sound recording, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered a Derivative Work for the purpose of this License.
-    "Licensor" means the individual or entity that offers the Work under the terms of this License.
-    "Original Author" means the individual or entity who created the Work.
-    "Work" means the copyrightable work of authorship offered under the terms of this License.
-    "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation.
-
-2. Fair Use Rights. Nothing in this license is intended to reduce, limit, or restrict any rights arising from fair use, first sale or other limitations on the exclusive rights of the copyright owner under copyright law or other applicable laws.
-
-3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below:
-
-    to reproduce the Work, to incorporate the Work into one or more Collective Works, and to reproduce the Work as incorporated in the Collective Works;
-    to create and reproduce Derivative Works;
-    to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission the Work including as incorporated in Collective Works;
-    to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission Derivative Works.
-
-    For the avoidance of doubt, where the work is a musical composition:
-        Performance Royalties Under Blanket Licenses. Licensor waives the exclusive right to collect, whether individually or via a performance rights society (e.g. ASCAP, BMI, SESAC), royalties for the public performance or public digital performance (e.g. webcast) of the Work.
-        Mechanical Rights and Statutory Royalties. Licensor waives the exclusive right to collect, whether individually or via a music rights agency or designated agent (e.g. Harry Fox Agency), royalties for any phonorecord You create from the Work ("cover version") and distribute, subject to the compulsory license created by 17 USC Section 115 of the US Copyright Act (or the equivalent in other jurisdictions).
-    Webcasting Rights and Statutory Royalties. For the avoidance of doubt, where the Work is a sound recording, Licensor waives the exclusive right to collect, whether individually or via a performance-rights society (e.g. SoundExchange), royalties for the public digital performance (e.g. webcast) of the Work, subject to the compulsory license created by 17 USC Section 114 of the US Copyright Act (or the equivalent in other jurisdictions).
-
-The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. All rights not expressly granted by Licensor are hereby reserved.
-
-4. Restrictions.The license granted in Section 3 above is expressly made subject to and limited by the following restrictions:
-
-    You may distribute, publicly display, publicly perform, or publicly digitally perform the Work only under the terms of this License, and You must include a copy of, or the Uniform Resource Identifier for, this License with every copy or phonorecord of the Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Work that alter or restrict the terms of this License or the recipients' exercise of the rights granted hereunder. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties. You may not distribute, publicly display, publicly perform, or publicly digitally perform the Work with any technological measures that control access or use of the Work in a manner inconsistent with the terms of this License Agreement. The above applies to the Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Work itself to be made subject to the terms of this License. If You create a Collective Work, upon notice from any Licensor You must, to the extent practicable, remove from the Collective Work any credit as required by clause 4(b), as requested. If You create a Derivative Work, upon notice from any Licensor You must, to the extent practicable, remove from the Derivative Work any credit as required by clause 4(b), as requested.
-    If you distribute, publicly display, publicly perform, or publicly digitally perform the Work or any Derivative Works or Collective Works, You must keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or (ii) if the Original Author and/or Licensor designate another party or parties (e.g. a sponsor institute, publishing entity, journal) for attribution in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; the title of the Work if supplied; to the extent reasonably practicable, the Uniform Resource Identifier, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and in the case of a Derivative Work, a credit identifying the use of the Work in the Derivative Work (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). Such credit may be implemented in any reasonable manner; provided, however, that in the case of a Derivative Work or Collective Work, at a minimum such credit will appear where any other comparable authorship credit appears and in a manner at least as prominent as such other comparable authorship credit.
-
-5. Representations, Warranties and Disclaimer
-
-UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
-
-6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-7. Termination
-
-    This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Derivative Works or Collective Works from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License.
-    Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above.
-
-8. Miscellaneous
-
-    Each time You distribute or publicly digitally perform the Work or a Collective Work, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License.
-    Each time You distribute or publicly digitally perform a Derivative Work, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License.
-    If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
-    No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent.
-    This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You.
diff --git a/licenses/binary-release/httpcore-4.4.3.NOTICE b/licenses/binary-release/httpcore-4.4.3.NOTICE
deleted file mode 100644
index 976db53..0000000
--- a/licenses/binary-release/httpcore-4.4.3.NOTICE
+++ /dev/null
@@ -1,10 +0,0 @@
-
-Apache HttpCore
-Copyright 2005-2015 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-
-
-This project contains annotations derived from JCIP-ANNOTATIONS
-Copyright (c) 2005 Brian Goetz and Tim Peierls. See http://www.jcip.net
diff --git a/licenses/binary-release/httpcore-4.4.4.AL-2.0 b/licenses/binary-release/httpcore-4.4.4.AL-2.0
deleted file mode 100644
index 54e4285..0000000
--- a/licenses/binary-release/httpcore-4.4.4.AL-2.0
+++ /dev/null
@@ -1,266 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
-=========================================================================
-
-This project contains annotations in the package org.apache.http.annotation
-which are derived from JCIP-ANNOTATIONS
-Copyright (c) 2005 Brian Goetz and Tim Peierls.
-See http://www.jcip.net and the Creative Commons Attribution License
-(http://creativecommons.org/licenses/by/2.5)
-Full text: http://creativecommons.org/licenses/by/2.5/legalcode
-
-License
-
-THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
-
-BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS.
-
-1. Definitions
-
-    "Collective Work" means a work, such as a periodical issue, anthology or encyclopedia, in which the Work in its entirety in unmodified form, along with a number of other contributions, constituting separate and independent works in themselves, are assembled into a collective whole. A work that constitutes a Collective Work will not be considered a Derivative Work (as defined below) for the purposes of this License.
-    "Derivative Work" means a work based upon the Work or upon the Work and other pre-existing works, such as a translation, musical arrangement, dramatization, fictionalization, motion picture version, sound recording, art reproduction, abridgment, condensation, or any other form in which the Work may be recast, transformed, or adapted, except that a work that constitutes a Collective Work will not be considered a Derivative Work for the purpose of this License. For the avoidance of doubt, where the Work is a musical composition or sound recording, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered a Derivative Work for the purpose of this License.
-    "Licensor" means the individual or entity that offers the Work under the terms of this License.
-    "Original Author" means the individual or entity who created the Work.
-    "Work" means the copyrightable work of authorship offered under the terms of this License.
-    "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation.
-
-2. Fair Use Rights. Nothing in this license is intended to reduce, limit, or restrict any rights arising from fair use, first sale or other limitations on the exclusive rights of the copyright owner under copyright law or other applicable laws.
-
-3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below:
-
-    to reproduce the Work, to incorporate the Work into one or more Collective Works, and to reproduce the Work as incorporated in the Collective Works;
-    to create and reproduce Derivative Works;
-    to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission the Work including as incorporated in Collective Works;
-    to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission Derivative Works.
-
-    For the avoidance of doubt, where the work is a musical composition:
-        Performance Royalties Under Blanket Licenses. Licensor waives the exclusive right to collect, whether individually or via a performance rights society (e.g. ASCAP, BMI, SESAC), royalties for the public performance or public digital performance (e.g. webcast) of the Work.
-        Mechanical Rights and Statutory Royalties. Licensor waives the exclusive right to collect, whether individually or via a music rights agency or designated agent (e.g. Harry Fox Agency), royalties for any phonorecord You create from the Work ("cover version") and distribute, subject to the compulsory license created by 17 USC Section 115 of the US Copyright Act (or the equivalent in other jurisdictions).
-    Webcasting Rights and Statutory Royalties. For the avoidance of doubt, where the Work is a sound recording, Licensor waives the exclusive right to collect, whether individually or via a performance-rights society (e.g. SoundExchange), royalties for the public digital performance (e.g. webcast) of the Work, subject to the compulsory license created by 17 USC Section 114 of the US Copyright Act (or the equivalent in other jurisdictions).
-
-The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. All rights not expressly granted by Licensor are hereby reserved.
-
-4. Restrictions.The license granted in Section 3 above is expressly made subject to and limited by the following restrictions:
-
-    You may distribute, publicly display, publicly perform, or publicly digitally perform the Work only under the terms of this License, and You must include a copy of, or the Uniform Resource Identifier for, this License with every copy or phonorecord of the Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Work that alter or restrict the terms of this License or the recipients' exercise of the rights granted hereunder. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties. You may not distribute, publicly display, publicly perform, or publicly digitally perform the Work with any technological measures that control access or use of the Work in a manner inconsistent with the terms of this License Agreement. The above applies to the Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Work itself to be made subject to the terms of this License. If You create a Collective Work, upon notice from any Licensor You must, to the extent practicable, remove from the Collective Work any credit as required by clause 4(b), as requested. If You create a Derivative Work, upon notice from any Licensor You must, to the extent practicable, remove from the Derivative Work any credit as required by clause 4(b), as requested.
-    If you distribute, publicly display, publicly perform, or publicly digitally perform the Work or any Derivative Works or Collective Works, You must keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or (ii) if the Original Author and/or Licensor designate another party or parties (e.g. a sponsor institute, publishing entity, journal) for attribution in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; the title of the Work if supplied; to the extent reasonably practicable, the Uniform Resource Identifier, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and in the case of a Derivative Work, a credit identifying the use of the Work in the Derivative Work (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). Such credit may be implemented in any reasonable manner; provided, however, that in the case of a Derivative Work or Collective Work, at a minimum such credit will appear where any other comparable authorship credit appears and in a manner at least as prominent as such other comparable authorship credit.
-
-5. Representations, Warranties and Disclaimer
-
-UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
-
-6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-7. Termination
-
-    This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Derivative Works or Collective Works from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License.
-    Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above.
-
-8. Miscellaneous
-
-    Each time You distribute or publicly digitally perform the Work or a Collective Work, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License.
-    Each time You distribute or publicly digitally perform a Derivative Work, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License.
-    If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
-    No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent.
-    This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You.
diff --git a/licenses/binary-release/httpcore-4.4.4.NOTICE b/licenses/binary-release/httpcore-4.4.4.NOTICE
deleted file mode 100644
index 976db53..0000000
--- a/licenses/binary-release/httpcore-4.4.4.NOTICE
+++ /dev/null
@@ -1,10 +0,0 @@
-
-Apache HttpCore
-Copyright 2005-2015 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-
-
-This project contains annotations derived from JCIP-ANNOTATIONS
-Copyright (c) 2005 Brian Goetz and Tim Peierls. See http://www.jcip.net
diff --git a/licenses/binary-release/javax-websocket-client-impl-9.3.6.AL-2.0 b/licenses/binary-release/javax-websocket-client-impl-9.3.6.AL-2.0
deleted file mode 100644
index e13b48d..0000000
--- a/licenses/binary-release/javax-websocket-client-impl-9.3.6.AL-2.0
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>19 May, 2009</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  The Content is dual licensed and is provided to you under the terms and conditions of the Eclipse Public License Version 1.0 (&quot;EPL&quot;) as well as the Apache Software License Version 2.0.  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.  A copy of the ASL is available at <a href="http://www.apache.org/licenses/LICENSE-2.0.html">http://www.apache.org/licenses/LICENSE-2.0.html</a>.  For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise indicated below, the terms and conditions of the EPL still apply to any source code in the Content and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-<p><b>jetty-util</b> artifact only:<br/><br/>The UnixCrypt.java code implements the one way cryptography used by
-Unix systems for simple password protection.  Copyright 1996 Aki Yoshida,
-modified April 2001  by Iris Van den Broeke, Daniel Deville.
-Permission to use, copy, modify and distribute UnixCrypt
-for non-commercial or commercial purposes and without fee is
-granted provided that the copyright notice appears in all copies.</p>
-
-</body>
-</html>
diff --git a/licenses/binary-release/javax.servlet-api-3.1.0.CDDL-1.0 b/licenses/binary-release/javax.servlet-api-3.1.0.CDDL-1.0
deleted file mode 100644
index a0ccc93..0000000
--- a/licenses/binary-release/javax.servlet-api-3.1.0.CDDL-1.0
+++ /dev/null
@@ -1,263 +0,0 @@
-COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0
-
-1. Definitions.
-
-   1.1. Contributor. means each individual or entity that creates or contributes to the creation of Modifications.
-
-   1.2. Contributor Version. means the combination of the Original Software, prior Modifications used by a Contributor (if any), and the Modifications made by that particular Contributor.
-
-   1.3. Covered Software. means (a) the Original Software, or (b) Modifications, or (c) the combination of files containing Original Software with files containing Modifications, in each case including portions thereof.
-
-   1.4. Executable. means the Covered Software in any form other than Source Code.
-
-   1.5. Initial Developer. means the individual or entity that first makes Original Software available under this License.
-
-   1.6. Larger Work. means a work which combines Covered Software or portions thereof with code not governed by the terms of this License.
-
-   1.7. License. means this document.
-
-   1.8. Licensable. means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein.
-
-   1.9. Modifications. means the Source Code and Executable form of any of the following:
-
-        A. Any file that results from an addition to, deletion from or modification of the contents of a file containing Original Software or previous Modifications;
-
-        B. Any new file that contains any part of the Original Software or previous Modification; or
-
-        C. Any new file that is contributed or otherwise made available under the terms of this License.
-
-   1.10. Original Software. means the Source Code and Executable form of computer software code that is originally released under this License.
-
-   1.11. Patent Claims. means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor.
-
-   1.12. Source Code. means (a) the common form of computer software code in which modifications are made and (b) associated documentation included in or with such code.
-
-   1.13. You. (or .Your.) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, .You. includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, .control. means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity.
-
-2. License Grants.
-
-      2.1. The Initial Developer Grant.
-
-      Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, the Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license:
-
-         (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer, to use, reproduce, modify, display, perform, sublicense and distribute the Original Software (or portions thereof), with or without Modifications, and/or as part of a Larger Work; and
-
-         (b) under Patent Claims infringed by the making, using or selling of Original Software, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Software (or portions thereof).
-
-        (c) The licenses granted in Sections 2.1(a) and (b) are effective on the date Initial Developer first distributes or otherwise makes the Original Software available to a third party under the terms of this License.
-
-        (d) Notwithstanding Section 2.1(b) above, no patent license is granted: (1) for code that You delete from the Original Software, or (2) for infringements caused by: (i) the modification of the Original Software, or (ii) the combination of the Original Software with other software or devices.
-
-    2.2. Contributor Grant.
-
-    Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license:
-
-        (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof), either on an unmodified basis, with other Modifications, as Covered Software and/or as part of a Larger Work; and
-
-        (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: (1) Modifications made by that Contributor (or portions thereof); and (2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination).
-
-        (c) The licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first distributes or otherwise makes the Modifications available to a third party.
-
-        (d) Notwithstanding Section 2.2(b) above, no patent license is granted: (1) for any code that Contributor has deleted from the Contributor Version; (2) for infringements caused by: (i) third party modifications of Contributor Version, or (ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or (3) under Patent Claims infringed by Covered Software in the absence of Modifications made by that Contributor.
-
-3. Distribution Obligations.
-
-      3.1. Availability of Source Code.
-      Any Covered Software that You distribute or otherwise make available in Executable form must also be made available in Source Code form and that Source Code form must be distributed only under the terms of this License. You must include a copy of this License with every copy of the Source Code form of the Covered Software You distribute or otherwise make available. You must inform recipients of any such Covered Software in Executable form as to how they can obtain such Covered Software in Source Code form in a reasonable manner on or through a medium customarily used for software exchange.
-
-      3.2. Modifications.
-      The Modifications that You create or to which You contribute are governed by the terms of this License. You represent that You believe Your Modifications are Your original creation(s) and/or You have sufficient rights to grant the rights conveyed by this License.
-
-      3.3. Required Notices.
-      You must include a notice in each of Your Modifications that identifies You as the Contributor of the Modification. You may not remove or alter any copyright, patent or trademark notices contained within the Covered Software, or any notices of licensing or any descriptive text giving attribution to any Contributor or the Initial Developer.
-
-      3.4. Application of Additional Terms.
-      You may not offer or impose any terms on any Covered Software in Source Code form that alters or restricts the applicable version of this License or the recipients. rights hereunder. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, you may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear that any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer.
-
-      3.5. Distribution of Executable Versions.
-      You may distribute the Executable form of the Covered Software under the terms of this License or under the terms of a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable form does not attempt to limit or alter the recipient.s rights in the Source Code form from the rights set forth in this License. If You distribute the Covered Software in Executable form under a different license, You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer.
-
-      3.6. Larger Works.
-      You may create a Larger Work by combining Covered Software with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Software.
-
-4. Versions of the License.
-
-      4.1. New Versions.
-      Sun Microsystems, Inc. is the initial license steward and may publish revised and/or new versions of this License from time to time. Each version will be given a distinguishing version number. Except as provided in Section 4.3, no one other than the license steward has the right to modify this License.
-
-      4.2. Effect of New Versions.
-      You may always continue to use, distribute or otherwise make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. If the Initial Developer includes a notice in the Original Software prohibiting it from being distributed or otherwise made available under any subsequent version of the License, You must distribute and make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. Otherwise, You may also choose to use, distribute or otherwise make the Covered Software available under the terms of any subsequent version of the License published by the license steward.
-
-      4.3. Modified Versions.
-      When You are an Initial Developer and You want to create a new license for Your Original Software, You may create and use a modified version of this License if You: (a) rename the license and remove any references to the name of the license steward (except to note that the license differs from this License); and (b) otherwise make it clear that the license contains terms which differ from this License.
-
-5. DISCLAIMER OF WARRANTY.
-
-   COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN .AS IS. BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
-
-6. TERMINATION.
-
-      6.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive.
-
-      6.2. If You assert a patent infringement claim (excluding declaratory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You assert such claim is referred to as .Participant.) alleging that the Participant Software (meaning the Contributor Version where the Participant is a Contributor or the Original Software where the Participant is the Initial Developer) directly or indirectly infringes any patent, then any and all rights granted directly or indirectly to You by such Participant, the Initial Developer (if the Initial Developer is not the Participant) and all Contributors under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively and automatically at the expiration of such 60 day notice period, unless if within such 60 day period You withdraw Your claim with respect to the Participant Software against such Participant either unilaterally or pursuant to a written agreement with Participant.
-
-      6.3. In the event of termination under Sections 6.1 or 6.2 above, all end user licenses that have been validly granted by You or any distributor hereunder prior to termination (excluding licenses granted to You by any distributor) shall survive termination.
-
-7. LIMITATION OF LIABILITY.
-
-   UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY.S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
-
-8. U.S. GOVERNMENT END USERS.
-
-   The Covered Software is a .commercial item,. as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of .commercial computer software. (as that term is defined at 48 C.F.R. ? 252.227-7014(a)(1)) and .commercial computer software documentation. as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Software with only those rights set forth herein. This U.S. Government Rights clause is in lieu of, and supersedes, any other FAR, DFAR, or other clause or provision that addresses Government rights in computer software under this License.
-
-9. MISCELLANEOUS.
-
-   This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by the law of the jurisdiction specified in a notice contained within the Original Software (except to the extent applicable law, if any, provides otherwise), excluding such jurisdiction.s conflict-of-law provisions. Any litigation relating to this License shall be subject to the jurisdiction of the courts located in the jurisdiction and venue specified in a notice contained within the Original Software, with the losing party responsible for costs, including, without limitation, court costs and reasonable attorneys. fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. You agree that You alone are responsible for compliance with the United States export administration regulations (and the export control laws and regulation of any other countries) when You use, distribute or otherwise make available any Covered Software.
-
-10. RESPONSIBILITY FOR CLAIMS.
-
-   As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability.
-
-   NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL)
-
-   The code released under the CDDL shall be governed by the laws of the State of California (excluding conflict-of-law provisions). Any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California and the state courts of the State of California, with venue lying in Santa Clara County, California.
-
-
-The GNU General Public License (GPL) Version 2, June 1991
-
-
-Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
-
-Preamble
-
-The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too.
-
-When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.
-
-To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.
-
-For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
-
-We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.
-
-Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.
-
-Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.
-
-The precise terms and conditions for copying, distribution and modification follow.
-
-
-TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.
-
-1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
-
-2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
-
-   a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.
-
-   b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.
-
-   c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
-
-3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:
-
-   a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
-
-   b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
-
-   c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
-
-If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.
-
-4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
-
-5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.
-
-6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.
-
-7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
-
-This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
-
-8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
-
-9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.
-
-10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
-
-NO WARRANTY
-
-11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-END OF TERMS AND CONDITIONS
-
-
-How to Apply These Terms to Your New Programs
-
-If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.
-
-To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
-
-   One line to give the program's name and a brief idea of what it does.
-
-   Copyright (C)
-
-   This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this when it starts in an interactive mode:
-
-   Gnomovision version 69, Copyright (C) year name of author
-   Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names:
-
-   Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-   signature of Ty Coon, 1 April 1989
-   Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License.
-
-
-"CLASSPATH" EXCEPTION TO THE GPL VERSION 2
-
-Certain source files distributed by Sun Microsystems, Inc. are subject to the following clarification and special exception to the GPL Version 2, but only where Sun has expressly included in the particular source file's header the words
-
-"Sun designates this particular file as subject to the "Classpath" exception as provided by Sun in the License file that accompanied this code."
-
-Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License Version 2 cover the whole combination.
-
-As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module.? An independent module is a module which is not derived from or based on this library.? If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so.? If you do not wish to do so, delete this exception statement from your version.
diff --git a/licenses/binary-release/javax.websocket-api-1.0.CDDL-1.1 b/licenses/binary-release/javax.websocket-api-1.0.CDDL-1.1
deleted file mode 100644
index 58c107c..0000000
--- a/licenses/binary-release/javax.websocket-api-1.0.CDDL-1.1
+++ /dev/null
@@ -1,209 +0,0 @@
-COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL)Version 1.1
-
-1. Definitions.
-
-1.1. “Contributor” means each individual or entity that creates or contributes to the creation of Modifications.
-1.2. “Contributor Version” means the combination of the Original Software, prior Modifications used by a Contributor (if any), and the Modifications made by that particular Contributor.
-1.3. “Covered Software” means (a) the Original Software, or (b) Modifications, or (c) the combination of files containing Original Software with files containing Modifications, in each case including portions thereof.
-1.4. “Executable” means the Covered Software in any form other than Source Code.
-1.5. “Initial Developer” means the individual or entity that first makes Original Software available under this License.
-1.6. “Larger Work” means a work which combines Covered Software or portions thereof with code not governed by the terms of this License.
-1.7. “License” means this document.
-1.8. “Licensable” means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein.
-1.9. “Modifications” means the Source Code and Executable form of any of the following:
-A. Any file that results from an addition to, deletion from or modification of the contents of a file containing Original Software or previous Modifications;
-B. Any new file that contains any part of the Original Software or previous Modification; or
-C. Any new file that is contributed or otherwise made available under the terms of this License.
-1.10. “Original Software” means the Source Code and Executable form of computer software code that is originally released under this License.
-1.11. “Patent Claims” means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor.
-1.12. “Source Code” means (a) the common form of computer software code in which modifications are made and (b) associated documentation included in or with such code.
-1.13. “You” (or “Your”) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, “You” includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity.
-2. License Grants.
-
-2.1. The Initial Developer Grant.
-Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, the Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license:
-(a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer, to use, reproduce, modify, display, perform, sublicense and distribute the Original Software (or portions thereof), with or without Modifications, and/or as part of a Larger Work; and
-(b) under Patent Claims infringed by the making, using or selling of Original Software, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Software (or portions thereof).
-(c) The licenses granted in Sections 2.1(a) and (b) are effective on the date Initial Developer first distributes or otherwise makes the Original Software available to a third party under the terms of this License.
-(d) Notwithstanding Section 2.1(b) above, no patent license is granted: (1) for code that You delete from the Original Software, or (2) for infringements caused by: (i) the modification of the Original Software, or (ii) the combination of the Original Software with other software or devices.
-2.2. Contributor Grant.
-Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license:
-(a) under intellectual property rights (other than patent or trademark) Licensable by Contributor to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof), either on an unmodified basis, with other Modifications, as Covered Software and/or as part of a Larger Work; and
-(b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: (1) Modifications made by that Contributor (or portions thereof); and (2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination).
-(c) The licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first distributes or otherwise makes the Modifications available to a third party.
-(d) Notwithstanding Section 2.2(b) above, no patent license is granted: (1) for any code that Contributor has deleted from the Contributor Version; (2) for infringements caused by: (i) third party modifications of Contributor Version, or (ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or (3) under Patent Claims infringed by Covered Software in the absence of Modifications made by that Contributor.
-3. Distribution Obligations.
-
-3.1. Availability of Source Code.
-Any Covered Software that You distribute or otherwise make available in Executable form must also be made available in Source Code form and that Source Code form must be distributed only under the terms of this License. You must include a copy of this License with every copy of the Source Code form of the Covered Software You distribute or otherwise make available. You must inform recipients of any such Covered Software in Executable form as to how they can obtain such Covered Software in Source Code form in a reasonable manner on or through a medium customarily used for software exchange.
-3.2. Modifications.
-The Modifications that You create or to which You contribute are governed by the terms of this License. You represent that You believe Your Modifications are Your original creation(s) and/or You have sufficient rights to grant the rights conveyed by this License.
-3.3. Required Notices.
-You must include a notice in each of Your Modifications that identifies You as the Contributor of the Modification. You may not remove or alter any copyright, patent or trademark notices contained within the Covered Software, or any notices of licensing or any descriptive text giving attribution to any Contributor or the Initial Developer.
-3.4. Application of Additional Terms.
-You may not offer or impose any terms on any Covered Software in Source Code form that alters or restricts the applicable version of this License or the recipients' rights hereunder. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, you may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear that any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer.
-3.5. Distribution of Executable Versions.
-You may distribute the Executable form of the Covered Software under the terms of this License or under the terms of a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable form does not attempt to limit or alter the recipient's rights in the Source Code form from the rights set forth in this License. If You distribute the Covered Software in Executable form under a different license, You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer.
-3.6. Larger Works.
-You may create a Larger Work by combining Covered Software with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Software.
-4. Versions of the License.
-
-4.1. New Versions.
-Oracle is the initial license steward and may publish revised and/or new versions of this License from time to time. Each version will be given a distinguishing version number. Except as provided in Section 4.3, no one other than the license steward has the right to modify this License.
-4.2. Effect of New Versions.
-You may always continue to use, distribute or otherwise make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. If the Initial Developer includes a notice in the Original Software prohibiting it from being distributed or otherwise made available under any subsequent version of the License, You must distribute and make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. Otherwise, You may also choose to use, distribute or otherwise make the Covered Software available under the terms of any subsequent version of the License published by the license steward.
-4.3. Modified Versions.
-When You are an Initial Developer and You want to create a new license for Your Original Software, You may create and use a modified version of this License if You: (a) rename the license and remove any references to the name of the license steward (except to note that the license differs from this License); and (b) otherwise make it clear that the license contains terms which differ from this License.
-5. DISCLAIMER OF WARRANTY.
-
-COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN “AS IS” BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
-
-6. TERMINATION.
-
-6.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive.
-6.2. If You assert a patent infringement claim (excluding declaratory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You assert such claim is referred to as “Participant”) alleging that the Participant Software (meaning the Contributor Version where the Participant is a Contributor or the Original Software where the Participant is the Initial Developer) directly or indirectly infringes any patent, then any and all rights granted directly or indirectly to You by such Participant, the Initial Developer (if the Initial Developer is not the Participant) and all Contributors under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively and automatically at the expiration of such 60 day notice period, unless if within such 60 day period You withdraw Your claim with respect to the Participant Software against such Participant either unilaterally or pursuant to a written agreement with Participant.
-6.3. If You assert a patent infringement claim against Participant alleging that the Participant Software directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license.
-6.4. In the event of termination under Sections 6.1 or 6.2 above, all end user licenses that have been validly granted by You or any distributor hereunder prior to termination (excluding licenses granted to You by any distributor) shall survive termination.
-7. LIMITATION OF LIABILITY.
-
-UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
-
-8. U.S. GOVERNMENT END USERS.
-
-The Covered Software is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software” (as that term is defined at 48 C.F.R. § 252.227-7014(a)(1)) and “commercial computer software documentation” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Software with only those rights set forth herein. This U.S. Government Rights clause is in lieu of, and supersedes, any other FAR, DFAR, or other clause or provision that addresses Government rights in computer software under this License.
-
-9. MISCELLANEOUS.
-
-This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by the law of the jurisdiction specified in a notice contained within the Original Software (except to the extent applicable law, if any, provides otherwise), excluding such jurisdiction's conflict-of-law provisions. Any litigation relating to this License shall be subject to the jurisdiction of the courts located in the jurisdiction and venue specified in a notice contained within the Original Software, with the losing party responsible for costs, including, without limitation, court costs and reasonable attorneys' fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. You agree that You alone are responsible for compliance with the United States export administration regulations (and the export control laws and regulation of any other countries) when You use, distribute or otherwise make available any Covered Software.
-
-10. RESPONSIBILITY FOR CLAIMS.
-
-As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability.
-
-NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL)
-
-The code released under the CDDL shall be governed by the laws of the State of California (excluding conflict-of-law provisions). Any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California and the state courts of the State of California, with venue lying in Santa Clara County, California.
-
-
-
-The GNU General Public License (GPL) Version 2, June 1991
-
-Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-Everyone is permitted to copy and distribute verbatim copies
-of this license document, but changing it is not allowed.
-
-Preamble
-
-The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too.
-
-When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.
-
-To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.
-
-For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
-
-We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.
-
-Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.
-
-Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.
-
-The precise terms and conditions for copying, distribution and modification follow.
-
-TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.
-
-1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
-
-2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
-
-a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.
-b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.
-c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)
-These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
-
-3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:
-
-a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
-b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
-c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)
-The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
-
-If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.
-
-4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
-
-5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.
-
-6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.
-
-7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
-
-This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
-
-8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
-
-9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.
-
-10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
-
-NO WARRANTY
-
-11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-END OF TERMS AND CONDITIONS
-
-How to Apply These Terms to Your New Programs
-
-If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.
-
-To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
-
-One line to give the program's name and a brief idea of what it does.
-Copyright (C) <year> <name of author>
-This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
-This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this when it starts in an interactive mode:
-
-Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.
-The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names:
-
-Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker.
-signature of Ty Coon, 1 April 1989
-Ty Coon, President of Vice
-This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License.
-
-"CLASSPATH" EXCEPTION TO THE GPL VERSION 2
-
-Certain source files distributed by Oracle are subject to the following clarification and special exception to the GPL Version 2, but only where Oracle has expressly included in the particular source file's header the words "Oracle designates this particular file as subject to the "Classpath" exception as provided by Oracle in the License file that accompanied this code." 
-
-Linking this library statically or dynamically with other modules is making a combined work based on this library.  Thus, the terms and conditions of the GNU General Public License Version 2 cover the whole combination. 
-
-As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module.  An independent module is a module which is not derived from or based on this library.  If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so.  If you do not wish to do so, delete this exception statement from your version.
-
-
-
diff --git a/licenses/binary-release/jetty-http-9.3.6.AL-2.0 b/licenses/binary-release/jetty-http-9.3.6.AL-2.0
deleted file mode 100644
index e13b48d..0000000
--- a/licenses/binary-release/jetty-http-9.3.6.AL-2.0
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>19 May, 2009</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  The Content is dual licensed and is provided to you under the terms and conditions of the Eclipse Public License Version 1.0 (&quot;EPL&quot;) as well as the Apache Software License Version 2.0.  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.  A copy of the ASL is available at <a href="http://www.apache.org/licenses/LICENSE-2.0.html">http://www.apache.org/licenses/LICENSE-2.0.html</a>.  For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise indicated below, the terms and conditions of the EPL still apply to any source code in the Content and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-<p><b>jetty-util</b> artifact only:<br/><br/>The UnixCrypt.java code implements the one way cryptography used by
-Unix systems for simple password protection.  Copyright 1996 Aki Yoshida,
-modified April 2001  by Iris Van den Broeke, Daniel Deville.
-Permission to use, copy, modify and distribute UnixCrypt
-for non-commercial or commercial purposes and without fee is
-granted provided that the copyright notice appears in all copies.</p>
-
-</body>
-</html>
diff --git a/licenses/binary-release/jetty-io-9.3.6.AL-2.0 b/licenses/binary-release/jetty-io-9.3.6.AL-2.0
deleted file mode 100644
index e13b48d..0000000
--- a/licenses/binary-release/jetty-io-9.3.6.AL-2.0
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>19 May, 2009</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  The Content is dual licensed and is provided to you under the terms and conditions of the Eclipse Public License Version 1.0 (&quot;EPL&quot;) as well as the Apache Software License Version 2.0.  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.  A copy of the ASL is available at <a href="http://www.apache.org/licenses/LICENSE-2.0.html">http://www.apache.org/licenses/LICENSE-2.0.html</a>.  For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise indicated below, the terms and conditions of the EPL still apply to any source code in the Content and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-<p><b>jetty-util</b> artifact only:<br/><br/>The UnixCrypt.java code implements the one way cryptography used by
-Unix systems for simple password protection.  Copyright 1996 Aki Yoshida,
-modified April 2001  by Iris Van den Broeke, Daniel Deville.
-Permission to use, copy, modify and distribute UnixCrypt
-for non-commercial or commercial purposes and without fee is
-granted provided that the copyright notice appears in all copies.</p>
-
-</body>
-</html>
diff --git a/licenses/binary-release/jetty-security-9.3.6.AL-2.0 b/licenses/binary-release/jetty-security-9.3.6.AL-2.0
deleted file mode 100644
index e13b48d..0000000
--- a/licenses/binary-release/jetty-security-9.3.6.AL-2.0
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>19 May, 2009</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  The Content is dual licensed and is provided to you under the terms and conditions of the Eclipse Public License Version 1.0 (&quot;EPL&quot;) as well as the Apache Software License Version 2.0.  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.  A copy of the ASL is available at <a href="http://www.apache.org/licenses/LICENSE-2.0.html">http://www.apache.org/licenses/LICENSE-2.0.html</a>.  For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise indicated below, the terms and conditions of the EPL still apply to any source code in the Content and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-<p><b>jetty-util</b> artifact only:<br/><br/>The UnixCrypt.java code implements the one way cryptography used by
-Unix systems for simple password protection.  Copyright 1996 Aki Yoshida,
-modified April 2001  by Iris Van den Broeke, Daniel Deville.
-Permission to use, copy, modify and distribute UnixCrypt
-for non-commercial or commercial purposes and without fee is
-granted provided that the copyright notice appears in all copies.</p>
-
-</body>
-</html>
diff --git a/licenses/binary-release/jetty-server-9.3.6.AL-2.0 b/licenses/binary-release/jetty-server-9.3.6.AL-2.0
deleted file mode 100644
index e13b48d..0000000
--- a/licenses/binary-release/jetty-server-9.3.6.AL-2.0
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>19 May, 2009</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  The Content is dual licensed and is provided to you under the terms and conditions of the Eclipse Public License Version 1.0 (&quot;EPL&quot;) as well as the Apache Software License Version 2.0.  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.  A copy of the ASL is available at <a href="http://www.apache.org/licenses/LICENSE-2.0.html">http://www.apache.org/licenses/LICENSE-2.0.html</a>.  For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise indicated below, the terms and conditions of the EPL still apply to any source code in the Content and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-<p><b>jetty-util</b> artifact only:<br/><br/>The UnixCrypt.java code implements the one way cryptography used by
-Unix systems for simple password protection.  Copyright 1996 Aki Yoshida,
-modified April 2001  by Iris Van den Broeke, Daniel Deville.
-Permission to use, copy, modify and distribute UnixCrypt
-for non-commercial or commercial purposes and without fee is
-granted provided that the copyright notice appears in all copies.</p>
-
-</body>
-</html>
diff --git a/licenses/binary-release/jetty-servlet-9.3.6.AL-2.0 b/licenses/binary-release/jetty-servlet-9.3.6.AL-2.0
deleted file mode 100644
index e13b48d..0000000
--- a/licenses/binary-release/jetty-servlet-9.3.6.AL-2.0
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>19 May, 2009</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  The Content is dual licensed and is provided to you under the terms and conditions of the Eclipse Public License Version 1.0 (&quot;EPL&quot;) as well as the Apache Software License Version 2.0.  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.  A copy of the ASL is available at <a href="http://www.apache.org/licenses/LICENSE-2.0.html">http://www.apache.org/licenses/LICENSE-2.0.html</a>.  For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise indicated below, the terms and conditions of the EPL still apply to any source code in the Content and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-<p><b>jetty-util</b> artifact only:<br/><br/>The UnixCrypt.java code implements the one way cryptography used by
-Unix systems for simple password protection.  Copyright 1996 Aki Yoshida,
-modified April 2001  by Iris Van den Broeke, Daniel Deville.
-Permission to use, copy, modify and distribute UnixCrypt
-for non-commercial or commercial purposes and without fee is
-granted provided that the copyright notice appears in all copies.</p>
-
-</body>
-</html>
diff --git a/licenses/binary-release/jetty-util-9.3.6.AL-2.0 b/licenses/binary-release/jetty-util-9.3.6.AL-2.0
deleted file mode 100644
index e13b48d..0000000
--- a/licenses/binary-release/jetty-util-9.3.6.AL-2.0
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>19 May, 2009</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  The Content is dual licensed and is provided to you under the terms and conditions of the Eclipse Public License Version 1.0 (&quot;EPL&quot;) as well as the Apache Software License Version 2.0.  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.  A copy of the ASL is available at <a href="http://www.apache.org/licenses/LICENSE-2.0.html">http://www.apache.org/licenses/LICENSE-2.0.html</a>.  For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise indicated below, the terms and conditions of the EPL still apply to any source code in the Content and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-<p><b>jetty-util</b> artifact only:<br/><br/>The UnixCrypt.java code implements the one way cryptography used by
-Unix systems for simple password protection.  Copyright 1996 Aki Yoshida,
-modified April 2001  by Iris Van den Broeke, Daniel Deville.
-Permission to use, copy, modify and distribute UnixCrypt
-for non-commercial or commercial purposes and without fee is
-granted provided that the copyright notice appears in all copies.</p>
-
-</body>
-</html>
diff --git a/licenses/binary-release/jetty-webapp-9.3.6.AL-2.0 b/licenses/binary-release/jetty-webapp-9.3.6.AL-2.0
deleted file mode 100644
index e13b48d..0000000
--- a/licenses/binary-release/jetty-webapp-9.3.6.AL-2.0
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>19 May, 2009</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  The Content is dual licensed and is provided to you under the terms and conditions of the Eclipse Public License Version 1.0 (&quot;EPL&quot;) as well as the Apache Software License Version 2.0.  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.  A copy of the ASL is available at <a href="http://www.apache.org/licenses/LICENSE-2.0.html">http://www.apache.org/licenses/LICENSE-2.0.html</a>.  For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise indicated below, the terms and conditions of the EPL still apply to any source code in the Content and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-<p><b>jetty-util</b> artifact only:<br/><br/>The UnixCrypt.java code implements the one way cryptography used by
-Unix systems for simple password protection.  Copyright 1996 Aki Yoshida,
-modified April 2001  by Iris Van den Broeke, Daniel Deville.
-Permission to use, copy, modify and distribute UnixCrypt
-for non-commercial or commercial purposes and without fee is
-granted provided that the copyright notice appears in all copies.</p>
-
-</body>
-</html>
diff --git a/licenses/binary-release/jetty-xml-9.3.6.AL-2.0 b/licenses/binary-release/jetty-xml-9.3.6.AL-2.0
deleted file mode 100644
index e13b48d..0000000
--- a/licenses/binary-release/jetty-xml-9.3.6.AL-2.0
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>19 May, 2009</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  The Content is dual licensed and is provided to you under the terms and conditions of the Eclipse Public License Version 1.0 (&quot;EPL&quot;) as well as the Apache Software License Version 2.0.  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.  A copy of the ASL is available at <a href="http://www.apache.org/licenses/LICENSE-2.0.html">http://www.apache.org/licenses/LICENSE-2.0.html</a>.  For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise indicated below, the terms and conditions of the EPL still apply to any source code in the Content and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-<p><b>jetty-util</b> artifact only:<br/><br/>The UnixCrypt.java code implements the one way cryptography used by
-Unix systems for simple password protection.  Copyright 1996 Aki Yoshida,
-modified April 2001  by Iris Van den Broeke, Daniel Deville.
-Permission to use, copy, modify and distribute UnixCrypt
-for non-commercial or commercial purposes and without fee is
-granted provided that the copyright notice appears in all copies.</p>
-
-</body>
-</html>
diff --git a/licenses/binary-release/joda-time-2.9.2.AL-2.0 b/licenses/binary-release/joda-time-2.9.2.AL-2.0
deleted file mode 100644
index 75b5248..0000000
--- a/licenses/binary-release/joda-time-2.9.2.AL-2.0
+++ /dev/null
@@ -1,202 +0,0 @@
-

-                                 Apache License

-                           Version 2.0, January 2004

-                        http://www.apache.org/licenses/

-

-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

-

-   1. Definitions.

-

-      "License" shall mean the terms and conditions for use, reproduction,

-      and distribution as defined by Sections 1 through 9 of this document.

-

-      "Licensor" shall mean the copyright owner or entity authorized by

-      the copyright owner that is granting the License.

-

-      "Legal Entity" shall mean the union of the acting entity and all

-      other entities that control, are controlled by, or are under common

-      control with that entity. For the purposes of this definition,

-      "control" means (i) the power, direct or indirect, to cause the

-      direction or management of such entity, whether by contract or

-      otherwise, or (ii) ownership of fifty percent (50%) or more of the

-      outstanding shares, or (iii) beneficial ownership of such entity.

-

-      "You" (or "Your") shall mean an individual or Legal Entity

-      exercising permissions granted by this License.

-

-      "Source" form shall mean the preferred form for making modifications,

-      including but not limited to software source code, documentation

-      source, and configuration files.

-

-      "Object" form shall mean any form resulting from mechanical

-      transformation or translation of a Source form, including but

-      not limited to compiled object code, generated documentation,

-      and conversions to other media types.

-

-      "Work" shall mean the work of authorship, whether in Source or

-      Object form, made available under the License, as indicated by a

-      copyright notice that is included in or attached to the work

-      (an example is provided in the Appendix below).

-

-      "Derivative Works" shall mean any work, whether in Source or Object

-      form, that is based on (or derived from) the Work and for which the

-      editorial revisions, annotations, elaborations, or other modifications

-      represent, as a whole, an original work of authorship. For the purposes

-      of this License, Derivative Works shall not include works that remain

-      separable from, or merely link (or bind by name) to the interfaces of,

-      the Work and Derivative Works thereof.

-

-      "Contribution" shall mean any work of authorship, including

-      the original version of the Work and any modifications or additions

-      to that Work or Derivative Works thereof, that is intentionally

-      submitted to Licensor for inclusion in the Work by the copyright owner

-      or by an individual or Legal Entity authorized to submit on behalf of

-      the copyright owner. For the purposes of this definition, "submitted"

-      means any form of electronic, verbal, or written communication sent

-      to the Licensor or its representatives, including but not limited to

-      communication on electronic mailing lists, source code control systems,

-      and issue tracking systems that are managed by, or on behalf of, the

-      Licensor for the purpose of discussing and improving the Work, but

-      excluding communication that is conspicuously marked or otherwise

-      designated in writing by the copyright owner as "Not a Contribution."

-

-      "Contributor" shall mean Licensor and any individual or Legal Entity

-      on behalf of whom a Contribution has been received by Licensor and

-      subsequently incorporated within the Work.

-

-   2. Grant of Copyright License. Subject to the terms and conditions of

-      this License, each Contributor hereby grants to You a perpetual,

-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable

-      copyright license to reproduce, prepare Derivative Works of,

-      publicly display, publicly perform, sublicense, and distribute the

-      Work and such Derivative Works in Source or Object form.

-

-   3. Grant of Patent License. Subject to the terms and conditions of

-      this License, each Contributor hereby grants to You a perpetual,

-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable

-      (except as stated in this section) patent license to make, have made,

-      use, offer to sell, sell, import, and otherwise transfer the Work,

-      where such license applies only to those patent claims licensable

-      by such Contributor that are necessarily infringed by their

-      Contribution(s) alone or by combination of their Contribution(s)

-      with the Work to which such Contribution(s) was submitted. If You

-      institute patent litigation against any entity (including a

-      cross-claim or counterclaim in a lawsuit) alleging that the Work

-      or a Contribution incorporated within the Work constitutes direct

-      or contributory patent infringement, then any patent licenses

-      granted to You under this License for that Work shall terminate

-      as of the date such litigation is filed.

-

-   4. Redistribution. You may reproduce and distribute copies of the

-      Work or Derivative Works thereof in any medium, with or without

-      modifications, and in Source or Object form, provided that You

-      meet the following conditions:

-

-      (a) You must give any other recipients of the Work or

-          Derivative Works a copy of this License; and

-

-      (b) You must cause any modified files to carry prominent notices

-          stating that You changed the files; and

-

-      (c) You must retain, in the Source form of any Derivative Works

-          that You distribute, all copyright, patent, trademark, and

-          attribution notices from the Source form of the Work,

-          excluding those notices that do not pertain to any part of

-          the Derivative Works; and

-

-      (d) If the Work includes a "NOTICE" text file as part of its

-          distribution, then any Derivative Works that You distribute must

-          include a readable copy of the attribution notices contained

-          within such NOTICE file, excluding those notices that do not

-          pertain to any part of the Derivative Works, in at least one

-          of the following places: within a NOTICE text file distributed

-          as part of the Derivative Works; within the Source form or

-          documentation, if provided along with the Derivative Works; or,

-          within a display generated by the Derivative Works, if and

-          wherever such third-party notices normally appear. The contents

-          of the NOTICE file are for informational purposes only and

-          do not modify the License. You may add Your own attribution

-          notices within Derivative Works that You distribute, alongside

-          or as an addendum to the NOTICE text from the Work, provided

-          that such additional attribution notices cannot be construed

-          as modifying the License.

-

-      You may add Your own copyright statement to Your modifications and

-      may provide additional or different license terms and conditions

-      for use, reproduction, or distribution of Your modifications, or

-      for any such Derivative Works as a whole, provided Your use,

-      reproduction, and distribution of the Work otherwise complies with

-      the conditions stated in this License.

-

-   5. Submission of Contributions. Unless You explicitly state otherwise,

-      any Contribution intentionally submitted for inclusion in the Work

-      by You to the Licensor shall be under the terms and conditions of

-      this License, without any additional terms or conditions.

-      Notwithstanding the above, nothing herein shall supersede or modify

-      the terms of any separate license agreement you may have executed

-      with Licensor regarding such Contributions.

-

-   6. Trademarks. This License does not grant permission to use the trade

-      names, trademarks, service marks, or product names of the Licensor,

-      except as required for reasonable and customary use in describing the

-      origin of the Work and reproducing the content of the NOTICE file.

-

-   7. Disclaimer of Warranty. Unless required by applicable law or

-      agreed to in writing, Licensor provides the Work (and each

-      Contributor provides its Contributions) on an "AS IS" BASIS,

-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or

-      implied, including, without limitation, any warranties or conditions

-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A

-      PARTICULAR PURPOSE. You are solely responsible for determining the

-      appropriateness of using or redistributing the Work and assume any

-      risks associated with Your exercise of permissions under this License.

-

-   8. Limitation of Liability. In no event and under no legal theory,

-      whether in tort (including negligence), contract, or otherwise,

-      unless required by applicable law (such as deliberate and grossly

-      negligent acts) or agreed to in writing, shall any Contributor be

-      liable to You for damages, including any direct, indirect, special,

-      incidental, or consequential damages of any character arising as a

-      result of this License or out of the use or inability to use the

-      Work (including but not limited to damages for loss of goodwill,

-      work stoppage, computer failure or malfunction, or any and all

-      other commercial damages or losses), even if such Contributor

-      has been advised of the possibility of such damages.

-

-   9. Accepting Warranty or Additional Liability. While redistributing

-      the Work or Derivative Works thereof, You may choose to offer,

-      and charge a fee for, acceptance of support, warranty, indemnity,

-      or other liability obligations and/or rights consistent with this

-      License. However, in accepting such obligations, You may act only

-      on Your own behalf and on Your sole responsibility, not on behalf

-      of any other Contributor, and only if You agree to indemnify,

-      defend, and hold each Contributor harmless for any liability

-      incurred by, or claims asserted against, such Contributor by reason

-      of your accepting any such warranty or additional liability.

-

-   END OF TERMS AND CONDITIONS

-

-   APPENDIX: How to apply the Apache License to your work.

-

-      To apply the Apache License to your work, attach the following

-      boilerplate notice, with the fields enclosed by brackets "[]"

-      replaced with your own identifying information. (Don't include

-      the brackets!)  The text should be enclosed in the appropriate

-      comment syntax for the file format. We also recommend that a

-      file or class name and description of purpose be included on the

-      same "printed page" as the copyright notice for easier

-      identification within third-party archives.

-

-   Copyright [yyyy] [name of copyright owner]

-

-   Licensed under the Apache License, Version 2.0 (the "License");

-   you may not use this file except in compliance with the License.

-   You may obtain a copy of the License at

-

-       http://www.apache.org/licenses/LICENSE-2.0

-

-   Unless required by applicable law or agreed to in writing, software

-   distributed under the License is distributed on an "AS IS" BASIS,

-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-   See the License for the specific language governing permissions and

-   limitations under the License.

diff --git a/licenses/binary-release/joda-time-2.9.2.NOTICE b/licenses/binary-release/joda-time-2.9.2.NOTICE
deleted file mode 100644
index ac95834..0000000
--- a/licenses/binary-release/joda-time-2.9.2.NOTICE
+++ /dev/null
@@ -1,5 +0,0 @@
-=============================================================================

-= NOTICE file corresponding to section 4d of the Apache License Version 2.0 =

-=============================================================================

-This product includes software developed by

-Joda.org (http://www.joda.org/).

diff --git a/licenses/binary-release/kafka-clients-0.8.2.2.AL-2.0 b/licenses/binary-release/kafka-clients-0.8.2.2.AL-2.0
deleted file mode 100644
index d645695..0000000
--- a/licenses/binary-release/kafka-clients-0.8.2.2.AL-2.0
+++ /dev/null
@@ -1,202 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff --git a/licenses/binary-release/kafka-clients-0.8.2.2.NOTICE b/licenses/binary-release/kafka-clients-0.8.2.2.NOTICE
deleted file mode 100644
index ac656d3..0000000
--- a/licenses/binary-release/kafka-clients-0.8.2.2.NOTICE
+++ /dev/null
@@ -1,5 +0,0 @@
-Apache Kafka
-Copyright 2012 The Apache Software Foundation.
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
diff --git a/licenses/binary-release/kafka_2.10-0.8.2.2.AL-2.0 b/licenses/binary-release/kafka_2.10-0.8.2.2.AL-2.0
deleted file mode 100644
index d645695..0000000
--- a/licenses/binary-release/kafka_2.10-0.8.2.2.AL-2.0
+++ /dev/null
@@ -1,202 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff --git a/licenses/binary-release/kafka_2.10-0.8.2.2.NOTICE b/licenses/binary-release/kafka_2.10-0.8.2.2.NOTICE
deleted file mode 100644
index ac656d3..0000000
--- a/licenses/binary-release/kafka_2.10-0.8.2.2.NOTICE
+++ /dev/null
@@ -1,5 +0,0 @@
-Apache Kafka
-Copyright 2012 The Apache Software Foundation.
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
diff --git a/licenses/binary-release/log4j-1.2.16.AL-2.0 b/licenses/binary-release/log4j-1.2.16.AL-2.0
deleted file mode 100644
index 6279e52..0000000
--- a/licenses/binary-release/log4j-1.2.16.AL-2.0
+++ /dev/null
@@ -1,202 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright 1999-2005 The Apache Software Foundation
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff --git a/licenses/binary-release/log4j-1.2.16.NOTICE b/licenses/binary-release/log4j-1.2.16.NOTICE
deleted file mode 100644
index 0375732..0000000
--- a/licenses/binary-release/log4j-1.2.16.NOTICE
+++ /dev/null
@@ -1,5 +0,0 @@
-Apache log4j
-Copyright 2007 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
\ No newline at end of file
diff --git a/licenses/binary-release/log4j-1.2.17.AL-2.0 b/licenses/binary-release/log4j-1.2.17.AL-2.0
deleted file mode 100644
index 6279e52..0000000
--- a/licenses/binary-release/log4j-1.2.17.AL-2.0
+++ /dev/null
@@ -1,202 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright 1999-2005 The Apache Software Foundation
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff --git a/licenses/binary-release/log4j-1.2.17.NOTICE b/licenses/binary-release/log4j-1.2.17.NOTICE
deleted file mode 100644
index 0375732..0000000
--- a/licenses/binary-release/log4j-1.2.17.NOTICE
+++ /dev/null
@@ -1,5 +0,0 @@
-Apache log4j
-Copyright 2007 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
\ No newline at end of file
diff --git a/licenses/binary-release/metrics-core-2.2.0.AL-2.0 b/licenses/binary-release/metrics-core-2.2.0.AL-2.0
deleted file mode 100644
index e4ba404..0000000
--- a/licenses/binary-release/metrics-core-2.2.0.AL-2.0
+++ /dev/null
@@ -1,202 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright 2010-2012 Coda Hale and Yammer, Inc.
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff --git a/licenses/binary-release/metrics-core-2.2.0.NOTICE b/licenses/binary-release/metrics-core-2.2.0.NOTICE
deleted file mode 100644
index 9c76994..0000000
--- a/licenses/binary-release/metrics-core-2.2.0.NOTICE
+++ /dev/null
@@ -1,11 +0,0 @@
-Metrics
-Copyright 2010-2012 Coda Hale and Yammer, Inc.
-
-This product includes software developed by Coda Hale and Yammer, Inc.
-
-This product includes code derived from the JSR-166 project (ThreadLocalRandom), which was released
-with the following comments:
-
-    Written by Doug Lea with assistance from members of JCP JSR-166
-    Expert Group and released to the public domain, as explained at
-    http://creativecommons.org/publicdomain/zero/1.0/
diff --git a/licenses/binary-release/metrics-core-3.1.2.AL-2.0 b/licenses/binary-release/metrics-core-3.1.2.AL-2.0
deleted file mode 100644
index e4ba404..0000000
--- a/licenses/binary-release/metrics-core-3.1.2.AL-2.0
+++ /dev/null
@@ -1,202 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright 2010-2012 Coda Hale and Yammer, Inc.
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff --git a/licenses/binary-release/metrics-core-3.1.2.NOTICE b/licenses/binary-release/metrics-core-3.1.2.NOTICE
deleted file mode 100644
index 4fe83de..0000000
--- a/licenses/binary-release/metrics-core-3.1.2.NOTICE
+++ /dev/null
@@ -1,11 +0,0 @@
-Metrics
-Copyright 2010-2013 Coda Hale and Yammer, Inc.
-
-This product includes software developed by Coda Hale and Yammer, Inc.
-
-This product includes code derived from the JSR-166 project (ThreadLocalRandom, Striped64,
-LongAdder), which was released with the following comments:
-
-    Written by Doug Lea with assistance from members of JCP JSR-166
-    Expert Group and released to the public domain, as explained at
-    http://creativecommons.org/publicdomain/zero/1.0/
diff --git a/licenses/binary-release/mqttv3-1.1.0.EDL-1.0 b/licenses/binary-release/mqttv3-1.1.0.EDL-1.0
deleted file mode 100644
index 6555a44..0000000
--- a/licenses/binary-release/mqttv3-1.1.0.EDL-1.0
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml"><head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p><em>December 9, 2013</em></p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in ("Content").  Unless otherwise 
-indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 ("EPL") and Eclipse Distribution License Version 1.0 ("EDL").
-A copy of the EPL is available at 
-<a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a> 
-and a copy of the EDL is available at 
-<a href="http://www.eclipse.org/org/documents/edl-v10.php">http://www.eclipse.org/org/documents/edl-v10.php</a>. 
-For purposes of the EPL, "Program" will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party ("Redistributor") and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
-
-</body></html>
diff --git a/licenses/binary-release/scala-2.10.4.BSD b/licenses/binary-release/scala-2.10.4.BSD
deleted file mode 100644
index 4daedef..0000000
--- a/licenses/binary-release/scala-2.10.4.BSD
+++ /dev/null
@@ -1,63 +0,0 @@
-Scala is licensed under the [BSD 3-Clause License](http://opensource.org/licenses/BSD-3-Clause).
-
-## Scala License
-
-Copyright (c) 2002-2013 EPFL
-
-Copyright (c) 2011-2013 Typesafe, Inc.
-
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-      this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright notice,
-      this list of conditions and the following disclaimer in the documentation
-      and/or other materials provided with the distribution.
-    * Neither the name of the EPFL nor the names of its contributors
-      may be used to endorse or promote products derived from this software
-      without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-# Other Licenses
-
-This software includes projects with the following licenses,
-which are also included in the `licenses/` directory:
-
-### [Apache License](http://www.apache.org/licenses/LICENSE-2.0.html)
-This license is used by the following third-party libraries:
-  * jansi
-
-### [BSD License](http://www.opensource.org/licenses/bsd-license.php)
-This license is used by the following third-party libraries:
-  * jline
-
-### [BSD 3-Clause License](http://opensource.org/licenses/BSD-3-Clause)
-This license is used by the following third-party libraries:
-  * asm
-
-### [MIT License](http://www.opensource.org/licenses/MIT)
-This license is used by the following third-party libraries:
-  * jquery
-  * jquery-ui
-  * jquery-layout
-  * sizzle
-  * tools tooltip
-
-### Public Domain
-The following libraries are freely available in the public domain:
-  * forkjoin
-
diff --git a/licenses/binary-release/slf4j1.7.12.MIT b/licenses/binary-release/slf4j1.7.12.MIT
deleted file mode 100644
index 346d556..0000000
--- a/licenses/binary-release/slf4j1.7.12.MIT
+++ /dev/null
@@ -1,22 +0,0 @@
- Copyright (c) 2004-2013 QOS.ch
- All rights reserved.
-
- Permission is hereby granted, free  of charge, to any person obtaining
- a  copy  of this  software  and  associated  documentation files  (the
- "Software"), to  deal in  the Software without  restriction, including
- without limitation  the rights to  use, copy, modify,  merge, publish,
- distribute,  sublicense, and/or sell  copies of  the Software,  and to
- permit persons to whom the Software  is furnished to do so, subject to
- the following conditions:
- 
- The  above  copyright  notice  and  this permission  notice  shall  be
- included in all copies or substantial portions of the Software.
- 
- THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
- EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
- MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-  
\ No newline at end of file
diff --git a/licenses/binary-release/watson-iot-0.2.2.EPL-1.0 b/licenses/binary-release/watson-iot-0.2.2.EPL-1.0
deleted file mode 100644
index 5032843..0000000
--- a/licenses/binary-release/watson-iot-0.2.2.EPL-1.0
+++ /dev/null
@@ -1,203 +0,0 @@
-Eclipse Public License - v 1.0
-
-THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC
-LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM
-CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
-
-1. DEFINITIONS
-
-"Contribution" means:
-
-a) in the case of the initial Contributor, the initial code and documentation
-   distributed under this Agreement, and
-b) in the case of each subsequent Contributor:
-    i) changes to the Program, and
-   ii) additions to the Program;
-
-   where such changes and/or additions to the Program originate from and are
-   distributed by that particular Contributor. A Contribution 'originates'
-   from a Contributor if it was added to the Program by such Contributor
-   itself or anyone acting on such Contributor's behalf. Contributions do not
-   include additions to the Program which: (i) are separate modules of
-   software distributed in conjunction with the Program under their own
-   license agreement, and (ii) are not derivative works of the Program.
-
-"Contributor" means any person or entity that distributes the Program.
-
-"Licensed Patents" mean patent claims licensable by a Contributor which are
-necessarily infringed by the use or sale of its Contribution alone or when
-combined with the Program.
-
-"Program" means the Contributions distributed in accordance with this
-Agreement.
-
-"Recipient" means anyone who receives the Program under this Agreement,
-including all Contributors.
-
-2. GRANT OF RIGHTS
-  a) Subject to the terms of this Agreement, each Contributor hereby grants
-     Recipient a non-exclusive, worldwide, royalty-free copyright license to
-     reproduce, prepare derivative works of, publicly display, publicly
-     perform, distribute and sublicense the Contribution of such Contributor,
-     if any, and such derivative works, in source code and object code form.
-  b) Subject to the terms of this Agreement, each Contributor hereby grants
-     Recipient a non-exclusive, worldwide, royalty-free patent license under
-     Licensed Patents to make, use, sell, offer to sell, import and otherwise
-     transfer the Contribution of such Contributor, if any, in source code and
-     object code form. This patent license shall apply to the combination of
-     the Contribution and the Program if, at the time the Contribution is
-     added by the Contributor, such addition of the Contribution causes such
-     combination to be covered by the Licensed Patents. The patent license
-     shall not apply to any other combinations which include the Contribution.
-     No hardware per se is licensed hereunder.
-  c) Recipient understands that although each Contributor grants the licenses
-     to its Contributions set forth herein, no assurances are provided by any
-     Contributor that the Program does not infringe the patent or other
-     intellectual property rights of any other entity. Each Contributor
-     disclaims any liability to Recipient for claims brought by any other
-     entity based on infringement of intellectual property rights or
-     otherwise. As a condition to exercising the rights and licenses granted
-     hereunder, each Recipient hereby assumes sole responsibility to secure
-     any other intellectual property rights needed, if any. For example, if a
-     third party patent license is required to allow Recipient to distribute
-     the Program, it is Recipient's responsibility to acquire that license
-     before distributing the Program.
-  d) Each Contributor represents that to its knowledge it has sufficient
-     copyright rights in its Contribution, if any, to grant the copyright
-     license set forth in this Agreement.
-
-3. REQUIREMENTS
-
-A Contributor may choose to distribute the Program in object code form under
-its own license agreement, provided that:
-
-  a) it complies with the terms and conditions of this Agreement; and
-  b) its license agreement:
-      i) effectively disclaims on behalf of all Contributors all warranties
-         and conditions, express and implied, including warranties or
-         conditions of title and non-infringement, and implied warranties or
-         conditions of merchantability and fitness for a particular purpose;
-     ii) effectively excludes on behalf of all Contributors all liability for
-         damages, including direct, indirect, special, incidental and
-         consequential damages, such as lost profits;
-    iii) states that any provisions which differ from this Agreement are
-         offered by that Contributor alone and not by any other party; and
-     iv) states that source code for the Program is available from such
-         Contributor, and informs licensees how to obtain it in a reasonable
-         manner on or through a medium customarily used for software exchange.
-
-When the Program is made available in source code form:
-
-  a) it must be made available under this Agreement; and
-  b) a copy of this Agreement must be included with each copy of the Program.
-     Contributors may not remove or alter any copyright notices contained
-     within the Program.
-
-Each Contributor must identify itself as the originator of its Contribution,
-if
-any, in a manner that reasonably allows subsequent Recipients to identify the
-originator of the Contribution.
-
-4. COMMERCIAL DISTRIBUTION
-
-Commercial distributors of software may accept certain responsibilities with
-respect to end users, business partners and the like. While this license is
-intended to facilitate the commercial use of the Program, the Contributor who
-includes the Program in a commercial product offering should do so in a manner
-which does not create potential liability for other Contributors. Therefore,
-if a Contributor includes the Program in a commercial product offering, such
-Contributor ("Commercial Contributor") hereby agrees to defend and indemnify
-every other Contributor ("Indemnified Contributor") against any losses,
-damages and costs (collectively "Losses") arising from claims, lawsuits and
-other legal actions brought by a third party against the Indemnified
-Contributor to the extent caused by the acts or omissions of such Commercial
-Contributor in connection with its distribution of the Program in a commercial
-product offering. The obligations in this section do not apply to any claims
-or Losses relating to any actual or alleged intellectual property
-infringement. In order to qualify, an Indemnified Contributor must:
-a) promptly notify the Commercial Contributor in writing of such claim, and
-b) allow the Commercial Contributor to control, and cooperate with the
-Commercial Contributor in, the defense and any related settlement
-negotiations. The Indemnified Contributor may participate in any such claim at
-its own expense.
-
-For example, a Contributor might include the Program in a commercial product
-offering, Product X. That Contributor is then a Commercial Contributor. If
-that Commercial Contributor then makes performance claims, or offers
-warranties related to Product X, those performance claims and warranties are
-such Commercial Contributor's responsibility alone. Under this section, the
-Commercial Contributor would have to defend claims against the other
-Contributors related to those performance claims and warranties, and if a
-court requires any other Contributor to pay any damages as a result, the
-Commercial Contributor must pay those damages.
-
-5. NO WARRANTY
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR
-IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE,
-NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each
-Recipient is solely responsible for determining the appropriateness of using
-and distributing the Program and assumes all risks associated with its
-exercise of rights under this Agreement , including but not limited to the
-risks and costs of program errors, compliance with applicable laws, damage to
-or loss of data, programs or equipment, and unavailability or interruption of
-operations.
-
-6. DISCLAIMER OF LIABILITY
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY
-CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION
-LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE
-EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY
-OF SUCH DAMAGES.
-
-7. GENERAL
-
-If any provision of this Agreement is invalid or unenforceable under
-applicable law, it shall not affect the validity or enforceability of the
-remainder of the terms of this Agreement, and without further action by the
-parties hereto, such provision shall be reformed to the minimum extent
-necessary to make such provision valid and enforceable.
-
-If Recipient institutes patent litigation against any entity (including a
-cross-claim or counterclaim in a lawsuit) alleging that the Program itself
-(excluding combinations of the Program with other software or hardware)
-infringes such Recipient's patent(s), then such Recipient's rights granted
-under Section 2(b) shall terminate as of the date such litigation is filed.
-
-All Recipient's rights under this Agreement shall terminate if it fails to
-comply with any of the material terms or conditions of this Agreement and does
-not cure such failure in a reasonable period of time after becoming aware of
-such noncompliance. If all Recipient's rights under this Agreement terminate,
-Recipient agrees to cease use and distribution of the Program as soon as
-reasonably practicable. However, Recipient's obligations under this Agreement
-and any licenses granted by Recipient relating to the Program shall continue
-and survive.
-
-Everyone is permitted to copy and distribute copies of this Agreement, but in
-order to avoid inconsistency the Agreement is copyrighted and may only be
-modified in the following manner. The Agreement Steward reserves the right to
-publish new versions (including revisions) of this Agreement from time to
-time. No one other than the Agreement Steward has the right to modify this
-Agreement. The Eclipse Foundation is the initial Agreement Steward. The
-Eclipse Foundation may assign the responsibility to serve as the Agreement
-Steward to a suitable separate entity. Each new version of the Agreement will
-be given a distinguishing version number. The Program (including
-Contributions) may always be distributed subject to the version of the
-Agreement under which it was received. In addition, after a new version of the
-Agreement is published, Contributor may elect to distribute the Program
-(including its Contributions) under the new version. Except as expressly
-stated in Sections 2(a) and 2(b) above, Recipient receives no rights or
-licenses to the intellectual property of any Contributor under this Agreement,
-whether expressly, by implication, estoppel or otherwise. All rights in the
-Program not expressly granted under this Agreement are reserved.
-
-This Agreement is governed by the laws of the State of New York and the
-intellectual property laws of the United States of America. No party to this
-Agreement will bring a legal action under this Agreement more than one year
-after the cause of action arose. Each party waives its rights to a jury trial in
-any resulting litigation.
\ No newline at end of file
diff --git a/licenses/binary-release/websocket-api-9.3.6.AL-2.0 b/licenses/binary-release/websocket-api-9.3.6.AL-2.0
deleted file mode 100644
index e13b48d..0000000
--- a/licenses/binary-release/websocket-api-9.3.6.AL-2.0
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>19 May, 2009</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  The Content is dual licensed and is provided to you under the terms and conditions of the Eclipse Public License Version 1.0 (&quot;EPL&quot;) as well as the Apache Software License Version 2.0.  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.  A copy of the ASL is available at <a href="http://www.apache.org/licenses/LICENSE-2.0.html">http://www.apache.org/licenses/LICENSE-2.0.html</a>.  For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise indicated below, the terms and conditions of the EPL still apply to any source code in the Content and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-<p><b>jetty-util</b> artifact only:<br/><br/>The UnixCrypt.java code implements the one way cryptography used by
-Unix systems for simple password protection.  Copyright 1996 Aki Yoshida,
-modified April 2001  by Iris Van den Broeke, Daniel Deville.
-Permission to use, copy, modify and distribute UnixCrypt
-for non-commercial or commercial purposes and without fee is
-granted provided that the copyright notice appears in all copies.</p>
-
-</body>
-</html>
diff --git a/licenses/binary-release/websocket-client-9.3.6.AL-2.0 b/licenses/binary-release/websocket-client-9.3.6.AL-2.0
deleted file mode 100644
index e13b48d..0000000
--- a/licenses/binary-release/websocket-client-9.3.6.AL-2.0
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>19 May, 2009</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  The Content is dual licensed and is provided to you under the terms and conditions of the Eclipse Public License Version 1.0 (&quot;EPL&quot;) as well as the Apache Software License Version 2.0.  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.  A copy of the ASL is available at <a href="http://www.apache.org/licenses/LICENSE-2.0.html">http://www.apache.org/licenses/LICENSE-2.0.html</a>.  For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise indicated below, the terms and conditions of the EPL still apply to any source code in the Content and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-<p><b>jetty-util</b> artifact only:<br/><br/>The UnixCrypt.java code implements the one way cryptography used by
-Unix systems for simple password protection.  Copyright 1996 Aki Yoshida,
-modified April 2001  by Iris Van den Broeke, Daniel Deville.
-Permission to use, copy, modify and distribute UnixCrypt
-for non-commercial or commercial purposes and without fee is
-granted provided that the copyright notice appears in all copies.</p>
-
-</body>
-</html>
diff --git a/licenses/binary-release/websocket-common-9.3.6.AL-2.0 b/licenses/binary-release/websocket-common-9.3.6.AL-2.0
deleted file mode 100644
index e13b48d..0000000
--- a/licenses/binary-release/websocket-common-9.3.6.AL-2.0
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>19 May, 2009</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  The Content is dual licensed and is provided to you under the terms and conditions of the Eclipse Public License Version 1.0 (&quot;EPL&quot;) as well as the Apache Software License Version 2.0.  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.  A copy of the ASL is available at <a href="http://www.apache.org/licenses/LICENSE-2.0.html">http://www.apache.org/licenses/LICENSE-2.0.html</a>.  For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise indicated below, the terms and conditions of the EPL still apply to any source code in the Content and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-<p><b>jetty-util</b> artifact only:<br/><br/>The UnixCrypt.java code implements the one way cryptography used by
-Unix systems for simple password protection.  Copyright 1996 Aki Yoshida,
-modified April 2001  by Iris Van den Broeke, Daniel Deville.
-Permission to use, copy, modify and distribute UnixCrypt
-for non-commercial or commercial purposes and without fee is
-granted provided that the copyright notice appears in all copies.</p>
-
-</body>
-</html>
diff --git a/licenses/binary-release/zkclient-0.3.AL-2.0 b/licenses/binary-release/zkclient-0.3.AL-2.0
deleted file mode 100644
index 2e54031..0000000
--- a/licenses/binary-release/zkclient-0.3.AL-2.0
+++ /dev/null
@@ -1,202 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright 2009 Stefan Groschupf
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff --git a/licenses/binary-release/zookeeper-3.4.6.AL-2.0 b/licenses/binary-release/zookeeper-3.4.6.AL-2.0
deleted file mode 100644
index d645695..0000000
--- a/licenses/binary-release/zookeeper-3.4.6.AL-2.0
+++ /dev/null
@@ -1,202 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff --git a/licenses/d3-legend.MIT b/licenses/d3-legend.MIT
deleted file mode 100644
index 0cde879..0000000
--- a/licenses/d3-legend.MIT
+++ /dev/null
@@ -1,23 +0,0 @@
-console/servlets/webapp_content/js/ext/d3.legend.js
-License type: MIT
-
-  Copyright (c) 2012 ziggy.jonsson.nyc@gmail.com
-
-  Permission is hereby granted, free of charge, to any person obtaining
-  a copy of this software and associated documentation files (the
-  "Software"), to deal in the Software without restriction, including
-  without limitation the rights to use, copy, modify, merge, publish,
-  distribute, sublicense, and/or sell copies of the Software, and to
-  permit persons to whom the Software is furnished to do so, subject to
-  the following conditions:
-  
-  The above copyright notice and this permission notice shall be
-  included in all copies or substantial portions of the Software.
-  
-  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/licenses/d3-sankey.BSD b/licenses/d3-sankey.BSD
deleted file mode 100644
index fd82aa0..0000000
--- a/licenses/d3-sankey.BSD
+++ /dev/null
@@ -1,30 +0,0 @@
-console/servlets/webapp_content/js/ext/sankey_edgent.js
-License type: BSD 3-Clause license
-
-  Copyright 2015, Mike Bostock
-  All rights reserved.
-
-  Redistribution and use in source and binary forms, with or without modification,
-  are permitted provided that the following conditions are met:
-
-  * Redistributions of source code must retain the above copyright notice, this
-    list of conditions and the following disclaimer.
-
-  * Redistributions in binary form must reproduce the above copyright notice,
-    this list of conditions and the following disclaimer in the documentation
-    and/or other materials provided with the distribution.
-
-  * Neither the name of the author nor the names of contributors may be used to
-    endorse or promote products derived from this software without specific prior
-    written permission.
-
-  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-  ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-  ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/licenses/d3.BSD b/licenses/d3.BSD
deleted file mode 100644
index 73508ef..0000000
--- a/licenses/d3.BSD
+++ /dev/null
@@ -1,30 +0,0 @@
-console/servlets/webapp_content/js/ext/d3.min.js
-License type: BSD 3-Clause license
-
-  Copyright 2010-2016 Mike Bostock
-  All rights reserved.
-
-  Redistribution and use in source and binary forms, with or without modification,
-  are permitted provided that the following conditions are met:
-
-  * Redistributions of source code must retain the above copyright notice, this
-    list of conditions and the following disclaimer.
-
-  * Redistributions in binary form must reproduce the above copyright notice,
-    this list of conditions and the following disclaimer in the documentation
-    and/or other materials provided with the distribution.
-
-  * Neither the name of the author nor the names of contributors may be used to
-    endorse or promote products derived from this software without specific prior
-    written permission.
-
-  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-  ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-  ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/licenses/jquery-ui.MIT b/licenses/jquery-ui.MIT
deleted file mode 100644
index bb8f130..0000000
--- a/licenses/jquery-ui.MIT
+++ /dev/null
@@ -1,27 +0,0 @@
-console/servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom
-License type: MIT
-
-  Copyright jQuery Foundation and other contributors, https://jquery.org/
-  
-  This software consists of voluntary contributions made by many
-  individuals. For exact contribution history, see  the revision history
-  available at https://github.com/jquery/jquery-ui
-
-  Permission is hereby granted, free of charge, to any person obtaining
-  a copy of this software and associated documentation files (the
-  "Software"), to deal in the Software without restriction, including
-  without limitation the rights to use, copy, modify, merge, publish,
-  distribute, sublicense, and/or sell copies of the Software, and to
-  permit persons to whom the Software is furnished to do so, subject to
-  the following conditions:
-  
-  The above copyright notice and this permission notice shall be
-  included in all copies or substantial portions of the Software.
-  
-  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/licenses/jquery.MIT b/licenses/jquery.MIT
deleted file mode 100644
index 0e8956f..0000000
--- a/licenses/jquery.MIT
+++ /dev/null
@@ -1,24 +0,0 @@
-servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/external/jquery/jquery.js:
-License type: MIT
-
-Copyright 2013 jQuery Foundation and other contributors
-http://jquery.com/
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/mvnw b/mvnw
new file mode 100755
index 0000000..53d9860
--- /dev/null
+++ b/mvnw
@@ -0,0 +1,268 @@
+#!/bin/sh
+# ----------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+# Maven2 Start Up Batch script
+#
+# Required ENV vars:
+# ------------------
+#   JAVA_HOME - location of a JDK home dir
+#
+# Optional ENV vars
+# -----------------
+#   M2_HOME - location of maven2's installed home dir
+#   MAVEN_OPTS - parameters passed to the Java VM when running Maven
+#     e.g. to debug Maven itself, use
+#       set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+#   MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+# ----------------------------------------------------------------------------
+
+if [ -z "$MAVEN_SKIP_RC" ] ; then
+
+  if [ -f /etc/mavenrc ] ; then
+    . /etc/mavenrc
+  fi
+
+  if [ -f "$HOME/.mavenrc" ] ; then
+    . "$HOME/.mavenrc"
+  fi
+
+fi
+
+# OS specific support.  $var _must_ be set to either true or false.
+cygwin=false;
+darwin=false;
+mingw=false
+case "`uname`" in
+  CYGWIN*) cygwin=true ;;
+  MINGW*) mingw=true;;
+  Darwin*) darwin=true
+    # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
+    # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
+    if [ -z "$JAVA_HOME" ]; then
+      if [ -x "/usr/libexec/java_home" ]; then
+        export JAVA_HOME="`/usr/libexec/java_home`"
+      else
+        export JAVA_HOME="/Library/Java/Home"
+      fi
+    fi
+    ;;
+esac
+
+if [ -z "$JAVA_HOME" ] ; then
+  if [ -r /etc/gentoo-release ] ; then
+    JAVA_HOME=`java-config --jre-home`
+  fi
+fi
+
+if [ -z "$M2_HOME" ] ; then
+  ## resolve links - $0 may be a link to maven's home
+  PRG="$0"
+
+  # need this for relative symlinks
+  while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+      PRG="$link"
+    else
+      PRG="`dirname "$PRG"`/$link"
+    fi
+  done
+
+  saveddir=`pwd`
+
+  M2_HOME=`dirname "$PRG"`/..
+
+  # make it fully qualified
+  M2_HOME=`cd "$M2_HOME" && pwd`
+
+  cd "$saveddir"
+  # echo Using m2 at $M2_HOME
+fi
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched
+if $cygwin ; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME=`cygpath --unix "$M2_HOME"`
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+  [ -n "$CLASSPATH" ] &&
+    CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
+fi
+
+# For Mingw, ensure paths are in UNIX format before anything is touched
+if $mingw ; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME="`(cd "$M2_HOME"; pwd)`"
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
+  # TODO classpath?
+fi
+
+if [ -z "$JAVA_HOME" ]; then
+  javaExecutable="`which javac`"
+  if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
+    # readlink(1) is not available as standard on Solaris 10.
+    readLink=`which readlink`
+    if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
+      if $darwin ; then
+        javaHome="`dirname \"$javaExecutable\"`"
+        javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
+      else
+        javaExecutable="`readlink -f \"$javaExecutable\"`"
+      fi
+      javaHome="`dirname \"$javaExecutable\"`"
+      javaHome=`expr "$javaHome" : '\(.*\)/bin'`
+      JAVA_HOME="$javaHome"
+      export JAVA_HOME
+    fi
+  fi
+fi
+
+if [ -z "$JAVACMD" ] ; then
+  if [ -n "$JAVA_HOME"  ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+      # IBM's JDK on AIX uses strange locations for the executables
+      JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+      JAVACMD="$JAVA_HOME/bin/java"
+    fi
+  else
+    JAVACMD="`which java`"
+  fi
+fi
+
+if [ ! -x "$JAVACMD" ] ; then
+  echo "Error: JAVA_HOME is not defined correctly." >&2
+  echo "  We cannot execute $JAVACMD" >&2
+  exit 1
+fi
+
+if [ -z "$JAVA_HOME" ] ; then
+  echo "Warning: JAVA_HOME environment variable is not set."
+fi
+
+CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
+
+# traverses directory structure from process work directory to filesystem root
+# first directory with .mvn subdirectory is considered project base directory
+find_maven_basedir() {
+
+  if [ -z "$1" ]
+  then
+    echo "Path not specified to find_maven_basedir"
+    return 1
+  fi
+
+  basedir="$1"
+  wdir="$1"
+  while [ "$wdir" != '/' ] ; do
+    if [ -d "$wdir"/.mvn ] ; then
+      basedir=$wdir
+      break
+    fi
+    # workaround for JBEAP-8937 (on Solaris 10/Sparc)
+    if [ -d "${wdir}" ]; then
+      wdir=`cd "$wdir/.."; pwd`
+    fi
+    # end of workaround
+  done
+  echo "${basedir}"
+}
+
+# concatenates all lines of a file
+concat_lines() {
+  if [ -f "$1" ]; then
+    echo "$(tr -s '\n' ' ' < "$1")"
+  fi
+}
+
+BASE_DIR=`find_maven_basedir "$(pwd)"`
+if [ -z "$BASE_DIR" ]; then
+  exit 1;
+fi
+
+##########################################################################################
+# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+# This allows using the maven wrapper in projects that prohibit checking in binary data.
+##########################################################################################
+if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
+    echo "Found .mvn/wrapper/maven-wrapper.jar"
+else
+    echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
+
+    jarUrl="https://repo1.maven.org/maven2/io/takari/maven-wrapper/0.2.1/maven-wrapper-0.2.1.jar"
+    while IFS="=" read key value; do
+      case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
+      esac
+    done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
+    echo "Downloading from: $jarUrl"
+
+    if command -v wget > /dev/null; then
+        echo "Found wget ... using wget"
+        wget -O "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" "$jarUrl"
+    elif command -v curl > /dev/null; then
+        echo "Found curl ... using curl"
+        curl -o "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" "$jarUrl"
+    else
+        echo "Falling back to using Java to download"
+        javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
+        if [ -e "$javaClass" ]; then
+            if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+                echo " - Compiling MavenWrapperDownloader.java ..."
+                # Compiling the Java class
+                ("$JAVA_HOME/bin/javac" "$javaClass")
+            fi
+            if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+                # Running the downloader
+                echo " - Running MavenWrapperDownloader.java ..."
+                ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
+            fi
+        fi
+    fi
+fi
+##########################################################################################
+# End of extension
+##########################################################################################
+
+export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
+echo $MAVEN_PROJECTBASEDIR
+MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME=`cygpath --path --windows "$M2_HOME"`
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
+  [ -n "$CLASSPATH" ] &&
+    CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+  [ -n "$MAVEN_PROJECTBASEDIR" ] &&
+    MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
+fi
+
+WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+exec "$JAVACMD" \
+  $MAVEN_OPTS \
+  -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
+  "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
+  ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
diff --git a/mvnw.cmd b/mvnw.cmd
new file mode 100644
index 0000000..898fb06
--- /dev/null
+++ b/mvnw.cmd
@@ -0,0 +1,159 @@
+@REM ----------------------------------------------------------------------------
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements.  See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership.  The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License.  You may obtain a copy of the License at
+@REM
+@REM    http://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing,
+@REM software distributed under the License is distributed on an
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@REM KIND, either express or implied.  See the License for the
+@REM specific language governing permissions and limitations
+@REM under the License.
+@REM ----------------------------------------------------------------------------
+
+@REM ----------------------------------------------------------------------------
+@REM Maven2 Start Up Batch script
+@REM
+@REM Required ENV vars:
+@REM JAVA_HOME - location of a JDK home dir
+@REM
+@REM Optional ENV vars
+@REM M2_HOME - location of maven2's installed home dir
+@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
+@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending
+@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
+@REM     e.g. to debug Maven itself, use
+@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+@REM ----------------------------------------------------------------------------
+
+@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
+@echo off
+@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on'
+@if "%MAVEN_BATCH_ECHO%" == "on"  echo %MAVEN_BATCH_ECHO%
+
+@REM set %HOME% to equivalent of $HOME
+if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
+
+@REM Execute a user defined script before this one
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
+@REM check for pre script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
+if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
+:skipRcPre
+
+@setlocal
+
+set ERROR_CODE=0
+
+@REM To isolate internal variables from possible post scripts, we use another setlocal
+@setlocal
+
+@REM ==== START VALIDATION ====
+if not "%JAVA_HOME%" == "" goto OkJHome
+
+echo.
+echo Error: JAVA_HOME not found in your environment. >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+:OkJHome
+if exist "%JAVA_HOME%\bin\java.exe" goto init
+
+echo.
+echo Error: JAVA_HOME is set to an invalid directory. >&2
+echo JAVA_HOME = "%JAVA_HOME%" >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+@REM ==== END VALIDATION ====
+
+:init
+
+@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
+@REM Fallback to current working directory if not found.
+
+set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
+IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
+
+set EXEC_DIR=%CD%
+set WDIR=%EXEC_DIR%
+:findBaseDir
+IF EXIST "%WDIR%"\.mvn goto baseDirFound
+cd ..
+IF "%WDIR%"=="%CD%" goto baseDirNotFound
+set WDIR=%CD%
+goto findBaseDir
+
+:baseDirFound
+set MAVEN_PROJECTBASEDIR=%WDIR%
+cd "%EXEC_DIR%"
+goto endDetectBaseDir
+
+:baseDirNotFound
+set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
+cd "%EXEC_DIR%"
+
+:endDetectBaseDir
+
+IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
+
+@setlocal EnableExtensions EnableDelayedExpansion
+for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
+@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
+
+:endReadAdditionalConfig
+
+SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
+set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
+set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+set DOWNLOAD_URL="https://repo1.maven.org/maven2/io/takari/maven-wrapper/0.2.1/maven-wrapper-0.2.1.jar"
+FOR /F "tokens=1,2 delims==" %%A IN (%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties) DO (
+	IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B 
+)
+
+@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
+if exist %WRAPPER_JAR% (
+    echo Found %WRAPPER_JAR%
+) else (
+    echo Couldn't find %WRAPPER_JAR%, downloading it ...
+	echo Downloading from: %DOWNLOAD_URL%
+    powershell -Command "(New-Object Net.WebClient).DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"
+    echo Finished downloading %WRAPPER_JAR%
+)
+@REM End of extension
+
+%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
+if ERRORLEVEL 1 goto error
+goto end
+
+:error
+set ERROR_CODE=1
+
+:end
+@endlocal & set ERROR_CODE=%ERROR_CODE%
+
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
+@REM check for post script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
+if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
+:skipRcPost
+
+@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
+if "%MAVEN_BATCH_PAUSE%" == "on" pause
+
+if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
+
+exit /B %ERROR_CODE%
diff --git a/platform/android/build.gradle b/platform/android/build.gradle
deleted file mode 100644
index b57b44d..0000000
--- a/platform/android/build.gradle
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-defaultTasks 'addAndroidTargetDir'
-
-// Avoid creating/staging an empty jar (this is a 'java' subproject) 
-jar {
-  deleteAllActions()
-}
-
-// let the existing ant script do all of the work
-
-ant.importBuild('build.xml') { antTargetName ->
-  'ant_' + antTargetName
-}
-
-ant.properties['edgent8.target'] = target_java8_dir
-ant.properties['edgent7.target'] = target_java7_dir
-ant.properties['edgent.android.target'] = target_android_dir
-
-clean {
-  dependsOn ant_clean
-}
-
-task addAndroidTargetDir {
-  description = "Assemble distribution artifacts for android (from java7 artifacts)"
-  dependsOn ':platform:java7:addJava7TargetDir', clean, ant_all
-  ant_all.mustRunAfter ':platform:java7:addJava7TargetDir'
-  ant_all.mustRunAfter clean
-  
-  // TODO the following isn't cutting it for adding up-to-date for this task
-  // so as to avoid unnecessarily running clean,ant_all
-  // ... well things just don't quite work the way I hoped.
-  // A task's dependencies are run before a task is checked for UTD
-  // inputs.dir(target_java7_dir)
-  // outputs.dir(target_android_dir)
-}
-
-// unlike the above, this has the benefit(?) of producing the ant output to stdout
-// But it requires 'ant' to be in the path and doesn't (can't?) use
-// the ant that's embedded with gradle hmm...
-//
-//task androidXXX(type: Exec) {
-//  description = "Assemble distribution artifacts for android (from java7 artifacts)"
-//  dependsOn :platform:java7:java7
-//  workingDir 'platform/android'
-//  commandLine 'ant', 'clean', 'all',
-//     '-Dedgent8.target=../../build/distributions/java8',
-//     '-Dedgent7.target=../../build/distributions/java7',
-//     '-Dedgent.android.target=../../build/distributions/android'
-//}
-
diff --git a/platform/android/build.xml b/platform/android/build.xml
deleted file mode 100644
index 232308f..0000000
--- a/platform/android/build.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
- -->
-<project name="edgent.platform.android" default="all"
-  xmlns:jacoco="antlib:org.jacoco.ant"
-  >
-    <description>
-        Create the Android set of jars.
-        Copies the Java 7 jars excluding any ones not supported on Android.
-    </description>
-
-  <property name="edgent" location="../.."/>
-  <property name="edgent8.target" location="${edgent}/target/java8"/>
-  <property name="edgent7.target" location="${edgent}/target/java7"/>
-  <property name="edgent.android.target" location="${edgent}/target/android"/>
-
-  <target name="init">
-    <mkdir dir="${edgent.android.target}"/>
-  </target>
-
-  <target name="all" depends="copyFrom7"
-    description="Create the Android jars"
-    />
-
-  <target name="copyFrom7" depends="init">
-    <copy todir="${edgent.android.target}">
-       <fileset dir="${edgent7.target}"
-           excludes="scripts/** lib/edgent.runtime.jmxcontrol.jar lib/edgent.providers.development.jar console/**"
-       />
-
-    </copy>
-    <!-- Delete the Android jars from Java 8 and 7 -->
-    <!-- They get built there and are processed through the retrolambda -->
-    <delete dir="${edgent8.target}/android"/>
-    <delete dir="${edgent7.target}/android"/>
-  </target>
-
-  <target name="clean">
-    <delete dir="${edgent.android.target}"/>
-  </target>
-
-</project>
diff --git a/platform/java7/.gitignore b/platform/java7/.gitignore
deleted file mode 100644
index ecb9c02..0000000
--- a/platform/java7/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-/classes.in/
-/classes.out/
diff --git a/platform/java7/build.gradle b/platform/java7/build.gradle
deleted file mode 100644
index 4b599e2..0000000
--- a/platform/java7/build.gradle
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-defaultTasks 'addJava7TargetDir'
-
-ext.retrolambdaVersion = '2.1.0'
-ext.retrolambdaJarName = "retrolambda-${retrolambdaVersion}.jar"
-
-dependencies {
-  // TODO try the retrolambda gradle plugin!
-  addProjectExtDependency 'compile', "net.orfjackal.retrolambda:retrolambda:$retrolambdaVersion"
-}
-
-// Avoid creating/staging an empty jar (this is a 'java' subproject) 
-jar {
-  deleteAllActions()
-}
-
-// let the existing ant script do some of the work
-
-ant.importBuild('build.xml') { antTargetName ->
-  'ant_' + antTargetName
-}
-
-ant.properties['edgent'] = rootProject.projectDir
-ant.properties['edgent8.target'] = target_java8_dir
-ant.properties['edgent7.target'] = target_java7_dir
-ant.properties['ext.dir'] = target_java8_ext_dir
-
-clean {
-  dependsOn ant_clean
-}
-
-task preAntTask << {
-  // recompute/set other inputs to the ant tasks
-  ant.path(id: 'edgent.classpath') {
-    fileset(dir: target_java8_ext_dir) {
-      exclude(name: '**/slf4j-jdk*.jar')
-    }
-  }
-  ant.properties.qcp = ant.references['edgent.classpath']
-  
-  // make retrolambda available to the ant tooling
-  copyProjectExtJarsFn2 "$external_jars_dir/tools"
-  ant.properties['retrolambda.jar'] = "$external_jars_dir/tools/$retrolambdaJarName"
-  
-  // make android.jar available to the ant tooling
-  def hwProj = project(':android:hardware')
-  hwProj.copyProjectExtJarsFn "$external_jars_dir"
-  ant.properties['android.sdk.platform.jar'] = 
-    "$external_jars_dir/${hwProj.targetRelProjExtDir}/" + mkJarNameFromSpec(hwProj.androidJarSpec)
-}
-
-ant_retro7.doFirst { 
-  println "Performing a longer running ant task (e.g., ~30sec; run with --info to see it all)..."
-}
-
-task addJava7TargetDir {
-  description = "Assemble distribution artifacts for java7 (from java8 artifacts - run with JAVA_HOME==java8-VM)"
-  dependsOn ':assemble', clean, preAntTask, ant_retro7
-  ant_retro7.mustRunAfter = [ clean, ':assemble', preAntTask ]
-}
-
-// unlike the above, this has the benefit(?) of producing the ant output to stdout
-// But it requires 'ant' to be in the path and doesn't (can't?) use
-// the ant that's embedded with gradle hmm...
-//
-//task java7XXX(type: Exec) {
-//  description = "Assemble distribution artifacts for java7 (from java8 artifacts)"
-//  dependsOn ':assemble'
-//  workingDir 'platform/java7'
-//  commandLine 'ant', 'clean', 'retro7',
-//     '-Dedgent8.target=../../build/distributions/java8',
-//     '-Dedgent7.target=../../build/distributions/java7',
-//     '-Dext.dir=../../build/distributions/java8/ext',
-//     '-Dslf4j.ext.dir=""',
-//     '-Dgson.ext.dir=""',
-//     '-Dmetrics.ext.dir=""'
-//}
-
-// N.B. for java7 testing, use the test7Compile and test7Run tasks
-//
-// <edgentRepo>/gradlew :platform:java7:test7Compile (or just test7Compile) -- run with JAVA_HOME==java8-VM to check the java7 jars
-// <edgentRepo>/gradlew test7Run (or <project>:test7Run for individual project) -- run with JAVA_HOME==java7-VM (can run w/j8 to smoketest the process).
-
-task verifyJava7Built {
-  dependsOn 'ant_verify.java7.built'
-}
-
-task preAntTest7Setup {
-  description = "Stage the java8 built test classes where ant_test7.setup expects them"
-  dependsOn filteredSubprojects*.compileTestJava, preAntTask
-  doLast {
-    println "N.B. test7Compile must be run after the 'release' task (which creates the 'java7' tree in the targetdir)"
-    // copy java8 test classes where ant_test7.setup expects them
-    filteredSubprojects.each { project ->
-      ant.delete(dir: "$project.projectDir/test.classes")
-      copy {
-        from project.sourceSets.test.output.classesDir
-        into "$project.projectDir/test.classes"
-      }
-    }
-    // recompute/set other inputs to the ant tasks
-    ant.path(id: 'tc.classes') {
-      dirset(dir: rootProject.projectDir) {
-        include(name: '**/test.classes')
-      }
-    }
-    ant.properties['tccp'] = ant.references['tc.classes']
-  }
-}
-
-task test7Compile {
-  description = "Compile the test classes for java7 (run with JAVA_HOME==java8-VM)"
-  dependsOn preAntTest7Setup, 'ant_test7.setup'
-  tasks.getByName('ant_test7.setup').mustRunAfter preAntTest7Setup
-  doLast {
-    // copy ant_test7.setup generated classes to their project.buildDir/classes/java7Test
-    filteredSubprojects.each { project ->
-      ant.delete(dir: project.j7TestClassesDir)
-      copy {
-        from "$project.projectDir/test.classes"
-        into project.j7TestClassesDir
-      }
-      ant.delete(dir: "$project.projectDir/test.classes")
-    }
-  }
-}
diff --git a/platform/java7/build.xml b/platform/java7/build.xml
deleted file mode 100644
index d94d40b..0000000
--- a/platform/java7/build.xml
+++ /dev/null
@@ -1,336 +0,0 @@
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
- -->
-<project name="edgent.platform.java7" default="all"
-  xmlns:jacoco="antlib:org.jacoco.ant"
-  >
-	<description>
-        Create Java 7 versions of selected jars in java8
-        by running retrolambda against them.
-    </description>
-
-	<property environment="env"/>
-
-	<property name="edgent" location="../.."/>
-	<property name="edgent8.target" location="${edgent}/target/java8"/>
-	<property name="edgent7.target" location="${edgent}/target/java7"/>
-
-	<property name="input.dir" location="classes.in"/>
-	<property name="output.dir" location="classes.out"/>
-	<property name="ext.dir" location="${edgent}/ext"/>
-	
-    <property name="slf4j.version" value="1.7.12"/>
-    <property name="gson.version" value="2.2.4"/>
-    <property name="metrics.version" value="3.1.2"/>
-    <property name="retrolambda.version" value="2.1.0"/>
-
-	<property name="slf4j.ext.dir" value="slf4j-${slf4j.version}/"/>
-    <property name="gson.ext.dir" value="google-gson-${gson.version}/"/>
-    <property name="metrics.ext.dir" value="metrics-${metrics.version}/"/>
-    <property name="retrolambda.jar" location="ext/retrolambda-${retrolambda.version}.jar"/>
-
-    <property name="android.sdk.platform.jar" value=""/>
-<!--	
-    <condition property="android.sdk.platform.jar" value="env.ANDROID_SDK_PLATFORM_JAR">
-      <isset property="env.ANDROID_SDK_PLATFORM_JAR" />
-    </condition>
--->
-
-	<path id="edgent.classpath">
-        <pathelement location="${ext.dir}/${slf4j.ext.dir}slf4j-api-${slf4j.version}.jar"/>
-        <pathelement location="${ext.dir}/${gson.ext.dir}gson-${gson.version}.jar"/>
-        <pathelement location="${ext.dir}/${metrics.ext.dir}metrics-core-${metrics.version}.jar"/>
-	</path>
-	<property name="qcp" refid="edgent.classpath"/>
-
-	<target name="init">
-		<mkdir dir="${edgent7.target}"/>
-	</target>
-
-	<macrodef name="retro7">
-		<attribute name="qjar"/>
-		<attribute name="qdir" default="lib" />
-		<sequential>
-			<delete dir="${input.dir}"/>
-			<delete dir="${output.dir}"/>
-
-			<mkdir dir="${input.dir}"/>
-			<mkdir dir="${output.dir}"/>
-
-			<unzip dest="${input.dir}" src="${edgent8.target}/@{qdir}/@{qjar}"/>
-
-			<exec executable="java" failonerror="true">
-				<arg value="-Dretrolambda.inputDir=${input.dir}"/>
-				<arg value="-Dretrolambda.classpath=${edgent8.target}/@{qdir}/@{qjar}:${qcp}"/>
-				<arg value="-Dretrolambda.outputDir=${output.dir}"/>
-				<arg value="-Dretrolambda.defaultMethods=false"/>
-				<arg value="-jar"/>
-				<arg value="${retrolambda.jar}"/>
-			</exec>
-			<mkdir dir="${edgent7.target}/@{qdir}"/>
-			<jar destfile="${edgent7.target}/@{qdir}/@{qjar}"
-	  filesonly="true"
-	  manifest="${input.dir}/META-INF/MANIFEST.MF"
-	  >
-				<fileset dir="${output.dir}"/>
-			</jar>
-			
-            <delete dir="${input.dir}"/>
-            <delete dir="${output.dir}"/>
-		</sequential>
-	</macrodef>
-
-	<target name="all" depends="clean"
-    description="Compile Edgent and produce Java 7 jars using retrolambda. Must be run with a Java 8 virtual machine."
-    >
-		<ant dir="${edgent}" inheritAll="false">
-			<target name="clean"/>
-			<target name="all"/>
-		</ant>
-		<antcall target="retro7"/>
-	</target>
-
-	<target name="retro7" >
-		<antcall target="retro7.edgent"/>
-		<antcall target="retro7.edgent.android"/>
-	</target>
-
-        <!--
-        This contains the set of jars that are converted
-        to work on Java 7.
-
-        Matching tests must also be added to test7.setup
-        and test7.run
-        -->
-	<target name="retro7.edgent" >
-		<retro7 qjar="edgent.api.function.jar" />
-		<retro7 qjar="edgent.api.execution.jar" />
-		<retro7 qjar="edgent.api.graph.jar" />
-		<retro7 qjar="edgent.api.window.jar" />
-		<retro7 qjar="edgent.api.oplet.jar" />
-		<retro7 qjar="edgent.api.topology.jar" />
-		<retro7 qjar="edgent.spi.graph.jar" />
-		<retro7 qjar="edgent.spi.topology.jar" />
-		<retro7 qjar="edgent.runtime.etiao.jar" />
-		<retro7 qjar="edgent.runtime.appservice.jar" />
-		<retro7 qjar="edgent.runtime.jmxcontrol.jar" />
-		<retro7 qjar="edgent.runtime.jsoncontrol.jar" />
-		<retro7 qjar="edgent.runtime.jobregistry.jar" />
-
-		<retro7 qjar="edgent.utils.metrics.jar" qdir="utils/metrics/lib" />
-        <!-- utils/streamscope - why not java7? -->
-		<retro7 qjar="edgent.providers.direct.jar" />
-        <!-- providers/development - why not java7? -->
-		<retro7 qjar="edgent.connectors.common.jar"  qdir="connectors/common/lib" />
-		<retro7 qjar="edgent.connectors.iot.jar" qdir="connectors/iot/lib" />
-		<retro7 qjar="edgent.connectors.iotp.jar" qdir="connectors/iotp/lib" />
-		<retro7 qjar="edgent.connectors.http.jar" qdir="connectors/http/lib" />
-		<retro7 qjar="edgent.connectors.pubsub.jar"  qdir="connectors/pubsub/lib" />
-        <!-- connectors/command - why not java7? -->
-        <!-- connectors/csv - why not java7? -->
-        <!-- connectors/file - why not java7? -->
-        <!-- connectors/jdbc - why not java7? -->
-        <!-- connectors/mqtt - why not java7? -->
-        <!-- connectors/kafka - why not java7? -->
-        <!-- connectors/wsclient - why not java7? -->
-        <!-- connectors/javax.websocket-client - why not java7? -->
-		<retro7 qjar="edgent.apps.iot.jar"  qdir="apps/iot/lib" />
-		<retro7 qjar="edgent.apps.runtime.jar"  qdir="apps/runtime/lib" />
-        <!-- analytics/math3 - why not java7? -->
-		<retro7 qjar="edgent.providers.iot.jar" />
-		<retro7 qjar="edgent.analytics.sensors.jar" qdir="analytics/sensors/lib" />
-
-                <retro7 qjar="edgent.samples.apps.jar" qdir="samples/lib" />
-                <retro7 qjar="edgent.samples.connectors.jar" qdir="samples/lib" />
-                <retro7 qjar="edgent.samples.console.jar" qdir="samples/lib" />
-                <retro7 qjar="edgent.samples.scenarios.jar" qdir="samples/lib" />
-                <retro7 qjar="edgent.samples.topology.jar" qdir="samples/lib" />
-                <retro7 qjar="edgent.samples.utils.jar" qdir="samples/lib" />
-
-		<mkdir dir="${edgent7.target}/ext"/>
-		<copy todir="${edgent7.target}/ext">
-			<fileset dir="${edgent8.target}/ext"/>
-		</copy>
-
-		<mkdir dir="${edgent7.target}/connectors/iotp/ext"/>
-		<copy todir="${edgent7.target}/connectors/iotp/ext">
-			<fileset dir="${edgent8.target}/connectors/iotp/ext"/>
-		</copy>
-        <mkdir dir="${edgent7.target}/connectors/http/ext"/>
-        <copy todir="${edgent7.target}/connectors/http/ext">
-            <fileset dir="${edgent8.target}/connectors/http/ext"/>
-        </copy>
-		<!-- why mqtt/ext when connectors/mqtt not included above? -->
-		<mkdir dir="${edgent7.target}/connectors/mqtt/ext"/>
-		<copy todir="${edgent7.target}/connectors/mqtt/ext">
-			<fileset dir="${edgent8.target}/connectors/mqtt/ext"/>
-		</copy>
-        <!-- why math3/ext when analytics/math3 not included above? -->
-		<mkdir dir="${edgent7.target}/analytics/math3/ext"/>
-		<copy todir="${edgent7.target}/analytics/math3/ext">
-			<fileset dir="${edgent8.target}/analytics/math3/ext"/>
-		</copy>
-
-	</target>
-	<target name="retro7.edgent.android" if="android.sdk.platform.jar">
-		<retro7 qjar="edgent.android.topology.jar" qdir="android/topology/lib" />
-		<retro7 qjar="edgent.android.hardware.jar" qdir="android/hardware/lib" />
-	</target>
-
-	<path id="tc.classpath">
-		<dirset dir="${edgent}">
-			<include name="**/test.classes"/>
-		</dirset>
-	</path>
-	<property name="tccp" refid="tc.classpath"/>
-
-	<macrodef name="retro7.test.setup">
-		<attribute name="tdir"/>
-		<attribute name="ldir" default="lib"/>
-		<sequential>
-			<echo message="Testing Setup: @{tdir}"/>
-			<delete dir="${edgent}/@{tdir}/test7.classes"/>
-			<mkdir dir="${edgent}/@{tdir}/test7.classes"/>
-
-            <!-- <echo message="#### qcp7 ${qcp7}"/> -->
-            <!-- <echo message="#### qcp ${qcp}"/> -->
-            <!-- <echo message="#### tccp ${tccp}"/> -->
-			<exec executable="java" failonerror="true">
-				<arg value="-Dretrolambda.inputDir=${edgent}/@{tdir}/test.classes"/>
-				<arg value="-Dretrolambda.classpath=${qcp7}:${qcp}:${tccp}"/>
-				<arg value="-Dretrolambda.outputDir=${edgent}/@{tdir}/test7.classes"/>
-				<arg value="-Dretrolambda.defaultMethods=true"/>
-				<arg value="-jar"/>
-                <arg value="${retrolambda.jar}"/>
-			</exec>
-			<delete dir="${edgent}/@{tdir}/test.classes"/>
-			<move   file="${edgent}/@{tdir}/test7.classes"
-              tofile="${edgent}/@{tdir}/test.classes"/>
-		</sequential>
-	</macrodef>
-
-	<macrodef name="retro7.test.run">
-		<attribute name="tdir"/>
-		<attribute name="ldir" default="lib"/>
-		<sequential>
-			<echo message="Testing: @{tdir}"/>
-			<ant dir="${edgent}/@{tdir}" target="test.run" inheritAll="false">
-				<property name="lib" location="${edgent7.target}/@{ldir}"/>
-				<property name="edgent.lib" location="${edgent7.target}/lib"/>
-				<property name="edgent.utils" location="${edgent7.target}/utils"/>
-				<property name="edgent.connectors" location="${edgent7.target}/connectors"/>
-			</ant>
-		</sequential>
-	</macrodef>
-
-        <target name="verify.java7.built">
-           <fail message="Java 7 jars not built!">
-             <condition>
-               <not>
-                 <available file="${edgent7.target}/lib" type="dir"/>
-               </not>
-             </condition>
-           </fail>
-        </target>
-
-        <!--
-            This is the set of tests that are converted
-            to be used with Java 7
-        -->
-        <!-- Ensure previous separate build steps built the Java 7 jars -->
-	<target name="test7.setup" depends="verify.java7.built"
-    description="Setup  Edgent tests for the Java 7.Must be run with Java 8 to run retrolambda."
-    >
-		<path id="edgent.java7.classpath">
-			<fileset dir="${edgent7.target}/lib">
-				<include name="*.jar"/>
-			</fileset>
-			<fileset dir="${edgent7.target}/connectors">
-				<include name="*/lib/*.jar"/>
-			</fileset>
-			<fileset dir="${edgent7.target}/utils">
-				<include name="*/lib/*.jar"/>
-			</fileset>
-			<fileset dir="${edgent7.target}/analytics">
-				<include name="*/lib/*.jar"/>
-			</fileset>
-		</path>
-		<property name="qcp7" refid="edgent.java7.classpath"/>
-		<retro7.test.setup tdir="api/function"/>
-		<retro7.test.setup tdir="api/execution"/>
-		<retro7.test.setup tdir="api/graph" />
-		<retro7.test.setup tdir="api/window" />
-		<retro7.test.setup tdir="api/oplet" />
-		<retro7.test.setup tdir="api/topology" />
-		<retro7.test.setup tdir="spi/graph" />
-		<retro7.test.setup tdir="spi/topology" />
-        <retro7.test.setup tdir="runtime/appservice" />
-		<retro7.test.setup tdir="runtime/etiao" />
-		<retro7.test.setup tdir="runtime/jmxcontrol" />
-		<retro7.test.setup tdir="runtime/jsoncontrol" />
-		<retro7.test.setup tdir="runtime/jobregistry" />
-		<retro7.test.setup tdir="utils/metrics"  ldir="utils/metrics/lib"/>
-		<retro7.test.setup tdir="providers/direct" />
-		<retro7.test.setup tdir="connectors/common" ldir="connectors/common/lib"/>
-        <retro7.test.setup tdir="connectors/iot"  ldir="connectors/iot/lib"/>
-		<retro7.test.setup tdir="connectors/iotp"  ldir="connectors/iotp/lib"/>
-		<retro7.test.setup tdir="connectors/http"  ldir="connectors/http/lib"/>
-		<retro7.test.setup tdir="connectors/pubsub"  ldir="connectors/pubsub/lib"/>
-		<retro7.test.setup tdir="apps/iot"  ldir="apps/iot/lib"/>
-		<retro7.test.setup tdir="apps/runtime"  ldir="apps/runtime/lib"/>
-		<retro7.test.setup tdir="analytics/sensors"  ldir="analytics/sensors/lib"/>
-	</target>
-
-        <!--
-            This is the set of tests that are converted
-            to be used with Java 7
-        -->
-	<!-- this must be preceeded by test7.setup (run with a Java 8 vm) -->
-	<target name="test7.run" depends="verify.java7.built"
-	    description="Run Edgent tests for the Java 7. Should be run with JAVA_HOME pointing to a Java 7 virtual machine, though can also be run with Java 8"
-	    >
-		<retro7.test.run tdir="api/function"/>
-		<retro7.test.run tdir="api/execution"/>
-		<retro7.test.run tdir="api/graph" />
-		<retro7.test.run tdir="api/window" />
-		<retro7.test.run tdir="api/oplet" />
-		<retro7.test.run tdir="api/topology" />
-		<retro7.test.run tdir="spi/graph" />
-		<retro7.test.run tdir="spi/topology" />
-        <retro7.test.run tdir="runtime/appservice" />
-		<retro7.test.run tdir="runtime/etiao" />
-		<retro7.test.run tdir="runtime/jmxcontrol" />
-		<retro7.test.run tdir="runtime/jsoncontrol" />
-		<retro7.test.run tdir="runtime/jobregistry" />
-		<retro7.test.run tdir="utils/metrics"  ldir="utils/metrics/lib"/>
-		<retro7.test.run tdir="providers/direct" />
-		<retro7.test.run tdir="connectors/common" ldir="connectors/common/lib"/>
-        <retro7.test.run tdir="connectors/iot"  ldir="connectors/iot/lib"/>
-		<retro7.test.run tdir="connectors/iotp"  ldir="connectors/iotp/lib"/>
-		<retro7.test.run tdir="connectors/http"  ldir="connectors/http/lib"/>
-		<retro7.test.run tdir="connectors/pubsub"  ldir="connectors/pubsub/lib"/>
-		<retro7.test.run tdir="apps/iot"  ldir="apps/iot/lib"/>
-		<retro7.test.run tdir="apps/runtime"  ldir="apps/runtime/lib"/>
-		<retro7.test.run tdir="analytics/sensors"  ldir="analytics/sensors/lib"/>
-	</target>
-
-	<target name="clean">
-		<delete dir="${input.dir}"/>
-		<delete dir="${output.dir}"/>
-		<delete dir="${edgent7.target}"/>
-	</target>
-
-</project>
diff --git a/platforms/android/analytics/math3/pom.xml b/platforms/android/analytics/math3/pom.xml
new file mode 100644
index 0000000..36cce3b
--- /dev/null
+++ b/platforms/android/analytics/math3/pom.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-analytics</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-analytics-math3</artifactId>
+
+  <name>Apache Edgent (Android): Analytics: Math3</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent.java7</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-math3</artifactId>
+      <version>3.4.1</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/android/analytics/pom.xml b/platforms/android/analytics/pom.xml
new file mode 100644
index 0000000..78532f1
--- /dev/null
+++ b/platforms/android/analytics/pom.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-platforms-android</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-analytics</artifactId>
+  <packaging>pom</packaging>
+
+  <name>Apache Edgent (Android): Analytics</name>
+
+  <modules>
+    <module>math3</module>
+    <module>sensors</module>
+  </modules>
+
+</project>
diff --git a/platforms/android/analytics/sensors/pom.xml b/platforms/android/analytics/sensors/pom.xml
new file mode 100644
index 0000000..5766511
--- /dev/null
+++ b/platforms/android/analytics/sensors/pom.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-analytics</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-analytics-sensors</artifactId>
+
+  <name>Apache Edgent (Android): Analytics: Sensors</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent.java7</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/android/android/hardware/pom.xml b/platforms/android/android/hardware/pom.xml
new file mode 100644
index 0000000..d286ae9
--- /dev/null
+++ b/platforms/android/android/hardware/pom.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-android</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-android-hardware</artifactId>
+
+  <name>Apache Edgent (Android): Android: Hardware</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>com.google.android</groupId>
+      <artifactId>android</artifactId>
+      <version>4.1.1.4</version>
+      <scope>provided</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/android/hardware/src/main/java/org/apache/edgent/android/hardware/SensorStreams.java b/platforms/android/android/hardware/src/main/java/org/apache/edgent/android/hardware/SensorStreams.java
similarity index 100%
rename from android/hardware/src/main/java/org/apache/edgent/android/hardware/SensorStreams.java
rename to platforms/android/android/hardware/src/main/java/org/apache/edgent/android/hardware/SensorStreams.java
diff --git a/android/hardware/src/main/java/org/apache/edgent/android/hardware/runtime/SensorChangeEvents.java b/platforms/android/android/hardware/src/main/java/org/apache/edgent/android/hardware/runtime/SensorChangeEvents.java
similarity index 100%
rename from android/hardware/src/main/java/org/apache/edgent/android/hardware/runtime/SensorChangeEvents.java
rename to platforms/android/android/hardware/src/main/java/org/apache/edgent/android/hardware/runtime/SensorChangeEvents.java
diff --git a/android/hardware/src/main/java/org/apache/edgent/android/hardware/runtime/SensorSourceSetup.java b/platforms/android/android/hardware/src/main/java/org/apache/edgent/android/hardware/runtime/SensorSourceSetup.java
similarity index 100%
rename from android/hardware/src/main/java/org/apache/edgent/android/hardware/runtime/SensorSourceSetup.java
rename to platforms/android/android/hardware/src/main/java/org/apache/edgent/android/hardware/runtime/SensorSourceSetup.java
diff --git a/platforms/android/android/pom.xml b/platforms/android/android/pom.xml
new file mode 100644
index 0000000..5973752
--- /dev/null
+++ b/platforms/android/android/pom.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-platforms-android</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-android</artifactId>
+  <packaging>pom</packaging>
+
+  <name>Apache Edgent (Android): Android</name>
+
+  <modules>
+    <module>hardware</module>
+    <module>topology</module>
+  </modules>
+
+  <build>
+    <plugins>
+      <!-- Convert the Java8 classes to Java7 classes -->
+      <plugin>
+        <groupId>net.orfjackal.retrolambda</groupId>
+        <artifactId>retrolambda-maven-plugin</artifactId>
+        <version>2.5.1</version>
+        <executions>
+          <execution>
+            <goals>
+              <goal>process-main</goal>
+              <goal>process-test</goal>
+            </goals>
+            <configuration>
+              <!-- I was getting random failures if not running retrolambda in a separate process -->
+              <fork>true</fork>
+              <java8home>${java8.home}</java8home>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>
diff --git a/platforms/android/android/topology/pom.xml b/platforms/android/android/topology/pom.xml
new file mode 100644
index 0000000..e891e9a
--- /dev/null
+++ b/platforms/android/android/topology/pom.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-android</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-android-topology</artifactId>
+
+  <name>Apache Edgent (Android): Android: Topology</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-oplet</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>com.google.android</groupId>
+      <artifactId>android</artifactId>
+      <version>4.1.1.4</version>
+      <scope>provided</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/android/topology/src/main/java/org/apache/edgent/android/oplet/RunOnUIThread.java b/platforms/android/android/topology/src/main/java/org/apache/edgent/android/oplet/RunOnUIThread.java
similarity index 96%
rename from android/topology/src/main/java/org/apache/edgent/android/oplet/RunOnUIThread.java
rename to platforms/android/android/topology/src/main/java/org/apache/edgent/android/oplet/RunOnUIThread.java
index a68834d..88ac5ce 100644
--- a/android/topology/src/main/java/org/apache/edgent/android/oplet/RunOnUIThread.java
+++ b/platforms/android/android/topology/src/main/java/org/apache/edgent/android/oplet/RunOnUIThread.java
@@ -31,7 +31,7 @@
     }
 
     @Override
-    public void accept(T value) {       
+    public void accept(final T value) {
         activity.runOnUiThread(() -> getDestination().accept(value));
     }
 
diff --git a/android/topology/src/main/java/org/apache/edgent/android/topology/ActivityStreams.java b/platforms/android/android/topology/src/main/java/org/apache/edgent/android/topology/ActivityStreams.java
similarity index 82%
rename from android/topology/src/main/java/org/apache/edgent/android/topology/ActivityStreams.java
rename to platforms/android/android/topology/src/main/java/org/apache/edgent/android/topology/ActivityStreams.java
index 86bf743..0396bca 100644
--- a/android/topology/src/main/java/org/apache/edgent/android/topology/ActivityStreams.java
+++ b/platforms/android/android/topology/src/main/java/org/apache/edgent/android/topology/ActivityStreams.java
@@ -18,7 +18,6 @@
 */
 package org.apache.edgent.android.topology;
 
-import android.app.Activity;
 import org.apache.edgent.android.oplet.RunOnUIThread;
 import org.apache.edgent.function.Consumer;
 import org.apache.edgent.function.Function;
@@ -26,6 +25,8 @@
 import org.apache.edgent.topology.TStream;
 import org.apache.edgent.topology.plumbing.PlumbingStreams;
 
+import android.app.Activity;
+
 /**
  * Stream utilities for an Android {@code Activity}.
  */
@@ -42,11 +43,12 @@
     * @param activity Activity
     * @param stream Stream to be sinked.
     * @param sinker Function that will be executed on the UI thread.
+    * @return sink element representing termination of this stream.
     *
-    * @see org.apache.edgent.topology.TStream#sink(edgent.function.Consumer)
+    * @see org.apache.edgent.topology.TStream#sink(org.apache.edgent.function.Consumer)
     */
-    public static <T> TSink sinkOnUIThread(Activity activity, TStream<T> stream, Consumer<T> sinker) { 
-        return stream.pipe(new RunOnUIThread<>(activity)).sink(sinker);
+    public static <T> TSink<T> sinkOnUIThread(Activity activity, TStream<T> stream, Consumer<T> sinker) { 
+        return stream.pipe(new RunOnUIThread<T>(activity)).sink(sinker);
     }
     
     /**
@@ -66,13 +68,15 @@
     * @param mapper Function that will be executed on the UI thread.
     * @param ordered True if tuple ordering must be maintained after the
     * execution on the UI thread. False if ordering is not required.
+    * @return Stream that will contain tuples of type {@code U} mapped from this
+    *         stream's tuples.
     *
-    * @see org.apache.edgent.topology.TStream#map(edgent.function.Function)
+    * @see org.apache.edgent.topology.TStream#map(org.apache.edgent.function.Function)
     */
     public static <T,U> TStream<U> mapOnUIThread(Activity activity, TStream<T> stream, Function<T,U> mapper, boolean ordered) {  
         
         // Switch to the UI thread
-        stream = stream.pipe(new RunOnUIThread<>(activity));
+        stream = stream.pipe(new RunOnUIThread<T>(activity));
         
         // execute the map on the UI thread
         TStream<U> resultStream = stream.map(mapper);
diff --git a/platforms/android/api/execution/pom.xml b/platforms/android/api/execution/pom.xml
new file mode 100644
index 0000000..5f3ba83
--- /dev/null
+++ b/platforms/android/api/execution/pom.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-api</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-api-execution</artifactId>
+
+  <name>Apache Edgent (Android): API: Execution</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent.java7</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-function</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>com.google.code.gson</groupId>
+      <artifactId>gson</artifactId>
+      <version>2.8.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/android/api/function/pom.xml b/platforms/android/api/function/pom.xml
new file mode 100644
index 0000000..0e1e6af
--- /dev/null
+++ b/platforms/android/api/function/pom.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-api</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-api-function</artifactId>
+
+  <name>Apache Edgent (Android): API: Function</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent.java7</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>
diff --git a/platforms/android/api/graph/pom.xml b/platforms/android/api/graph/pom.xml
new file mode 100644
index 0000000..93947bb
--- /dev/null
+++ b/platforms/android/api/graph/pom.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-api</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-api-graph</artifactId>
+
+  <name>Apache Edgent (Android): API: Graph</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent.java7</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-oplet</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/android/api/oplet/pom.xml b/platforms/android/api/oplet/pom.xml
new file mode 100644
index 0000000..27f4e20
--- /dev/null
+++ b/platforms/android/api/oplet/pom.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-api</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-api-oplet</artifactId>
+
+  <name>Apache Edgent (Android): API: Oplet</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent.java7</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-function</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-execution</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-window</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/android/api/pom.xml b/platforms/android/api/pom.xml
new file mode 100644
index 0000000..ec6cc25
--- /dev/null
+++ b/platforms/android/api/pom.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-platforms-android</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-api</artifactId>
+  <packaging>pom</packaging>
+
+  <name>Apache Edgent (Android): API</name>
+
+  <modules>
+    <module>execution</module>
+    <module>function</module>
+    <module>graph</module>
+    <module>oplet</module>
+    <module>topology</module>
+    <module>window</module>
+  </modules>
+
+</project>
diff --git a/platforms/android/api/topology/pom.xml b/platforms/android/api/topology/pom.xml
new file mode 100644
index 0000000..f0553d7
--- /dev/null
+++ b/platforms/android/api/topology/pom.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-api</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-api-topology</artifactId>
+
+  <name>Apache Edgent (Android): API: Topology</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent.java7</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-execution</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-function</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-graph</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-oplet</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/android/api/window/pom.xml b/platforms/android/api/window/pom.xml
new file mode 100644
index 0000000..1739ee7
--- /dev/null
+++ b/platforms/android/api/window/pom.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-api</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-api-window</artifactId>
+
+  <name>Apache Edgent (Android): API: Window</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent.java7</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-function</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/android/apps/iot/pom.xml b/platforms/android/apps/iot/pom.xml
new file mode 100644
index 0000000..df57c66
--- /dev/null
+++ b/platforms/android/apps/iot/pom.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-apps</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-apps-iot</artifactId>
+
+  <name>Apache Edgent (Android): Apps: IoT</name>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent.java7</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-connectors-iot</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-connectors-pubsub</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/android/apps/pom.xml b/platforms/android/apps/pom.xml
new file mode 100644
index 0000000..63177f1
--- /dev/null
+++ b/platforms/android/apps/pom.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-platforms-android</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-apps</artifactId>
+  <packaging>pom</packaging>
+
+  <name>Apache Edgent (Android): Apps</name>
+
+  <modules>
+    <module>iot</module>
+    <module>runtime</module>
+  </modules>
+
+</project>
diff --git a/platforms/android/apps/runtime/pom.xml b/platforms/android/apps/runtime/pom.xml
new file mode 100644
index 0000000..574c9d3
--- /dev/null
+++ b/platforms/android/apps/runtime/pom.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-apps</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-apps-runtime</artifactId>
+
+  <name>Apache Edgent (Android): Apps: Runtime</name>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent.java7</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-runtime-jobregistry</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/android/connectors/command/pom.xml b/platforms/android/connectors/command/pom.xml
new file mode 100644
index 0000000..10498b7
--- /dev/null
+++ b/platforms/android/connectors/command/pom.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-command</artifactId>
+
+  <name>Apache Edgent (Android): Connectors: Command</name>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent.java7</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-connectors-common</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/android/connectors/common/pom.xml b/platforms/android/connectors/common/pom.xml
new file mode 100644
index 0000000..f917e12
--- /dev/null
+++ b/platforms/android/connectors/common/pom.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-common</artifactId>
+
+  <name>Apache Edgent (Android): Connectors: Common</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent.java7</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/android/connectors/csv/pom.xml b/platforms/android/connectors/csv/pom.xml
new file mode 100644
index 0000000..6670826
--- /dev/null
+++ b/platforms/android/connectors/csv/pom.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-csv</artifactId>
+
+  <name>Apache Edgent (Android): Connectors: CSV</name>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent.java7</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>com.google.code.gson</groupId>
+      <artifactId>gson</artifactId>
+      <version>2.8.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/android/connectors/file/pom.xml b/platforms/android/connectors/file/pom.xml
new file mode 100644
index 0000000..c45dd1f
--- /dev/null
+++ b/platforms/android/connectors/file/pom.xml
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-file</artifactId>
+
+  <name>Apache Edgent (Android): Connectors: File</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent.java7</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-function</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-oplet</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/platforms/android/connectors/http/pom.xml b/platforms/android/connectors/http/pom.xml
new file mode 100644
index 0000000..bcd9d71
--- /dev/null
+++ b/platforms/android/connectors/http/pom.xml
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-http</artifactId>
+
+  <name>Apache Edgent (Android): Connectors: HTTP</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent.java7</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.httpcomponents</groupId>
+      <artifactId>httpclient</artifactId>
+      <version>4.5.1</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.httpcomponents</groupId>
+      <artifactId>httpcore</artifactId>
+      <version>4.4.4</version>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/platforms/android/connectors/iot/pom.xml b/platforms/android/connectors/iot/pom.xml
new file mode 100644
index 0000000..e27cfb4
--- /dev/null
+++ b/platforms/android/connectors/iot/pom.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-iot</artifactId>
+
+  <name>Apache Edgent (Android): Connectors: IoT</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent.java7</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-function</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/platforms/android/connectors/iotp/pom.xml b/platforms/android/connectors/iotp/pom.xml
new file mode 100644
index 0000000..9191b25
--- /dev/null
+++ b/platforms/android/connectors/iotp/pom.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-iotp</artifactId>
+
+  <name>Apache Edgent (Android): Connectors: IoTP</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent.java7</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-function</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-connectors-iot</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>com.ibm.messaging</groupId>
+      <artifactId>watson-iot</artifactId>
+      <version>0.2.2</version>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/platforms/android/connectors/jdbc/pom.xml b/platforms/android/connectors/jdbc/pom.xml
new file mode 100644
index 0000000..44acc0b
--- /dev/null
+++ b/platforms/android/connectors/jdbc/pom.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-jdbc</artifactId>
+
+  <name>Apache Edgent (Android): Connectors: JDBC</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent.java7</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-function</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/android/connectors/kafka/pom.xml b/platforms/android/connectors/kafka/pom.xml
new file mode 100644
index 0000000..5f20b25
--- /dev/null
+++ b/platforms/android/connectors/kafka/pom.xml
@@ -0,0 +1,164 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-kafka</artifactId>
+
+  <name>Apache Edgent (Android): Connectors: Kafka</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent.java7</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <!--
+  The pom for kafka includes dependencies that don't make sense for us.
+  In at least one case kafka dependencies include a slf4j *implementation* jar
+  and that conflicts with our samples' binding to a particular
+  version of slf4j implementation.
+  This all seems like fallout from, I believe, the kafka jars containing
+  the code for their cli tools too, and possibly tests, which need things like:
+    slf4j-log4j12, snappy-java, jline, jopt-simple, junit-3.8.1
+  
+  So at least for now, avoid transitive and just match our ant/gradle based
+  config.  Include only the exact dependencies that our kafka
+  dependency requires to function properly.
+  -->
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.kafka</groupId>
+      <artifactId>kafka_2.10</artifactId>
+      <version>0.8.2.2</version>
+      <exclusions>
+        <exclusion> <!-- not transitive -->
+          <groupId>*</groupId>
+          <artifactId>*</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.kafka</groupId>
+      <artifactId>kafka-clients</artifactId>
+      <version>0.8.2.2</version>
+      <exclusions>
+        <exclusion> <!-- not transitive -->
+          <groupId>*</groupId>
+          <artifactId>*</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
+      <version>1.2.16</version>
+      <exclusions>
+        <exclusion> <!-- not transitive -->
+          <groupId>*</groupId>
+          <artifactId>*</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>com.yammer.metrics</groupId>
+      <artifactId>metrics-core</artifactId>
+      <version>2.2.0</version>
+      <exclusions>
+        <exclusion> <!-- not transitive -->
+          <groupId>*</groupId>
+          <artifactId>*</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>org.scala-lang</groupId>
+      <artifactId>scala-library</artifactId>
+      <version>2.10.4</version>
+      <exclusions>
+        <exclusion> <!-- not transitive -->
+          <groupId>*</groupId>
+          <artifactId>*</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>com.101tec</groupId>
+      <artifactId>zkclient</artifactId>
+      <version>0.3</version>
+      <exclusions>
+        <exclusion> <!-- not transitive -->
+          <groupId>*</groupId>
+          <artifactId>*</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.zookeeper</groupId>
+      <artifactId>zookeeper</artifactId>
+      <version>3.4.6</version>
+      <exclusions>
+        <exclusion> <!-- not transitive -->
+          <groupId>*</groupId>
+          <artifactId>*</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/platforms/android/connectors/mqtt/pom.xml b/platforms/android/connectors/mqtt/pom.xml
new file mode 100644
index 0000000..0cd2340
--- /dev/null
+++ b/platforms/android/connectors/mqtt/pom.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-mqtt</artifactId>
+
+  <name>Apache Edgent (Android): Connectors: MQTT</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent.java7</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-connectors-iot</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-connectors-common</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.paho</groupId>
+      <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
+      <version>1.1.0</version>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/platforms/android/connectors/pom.xml b/platforms/android/connectors/pom.xml
new file mode 100644
index 0000000..9b91650
--- /dev/null
+++ b/platforms/android/connectors/pom.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-platforms-android</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors</artifactId>
+  <packaging>pom</packaging>
+
+  <name>Apache Edgent (Android): Connectors</name>
+
+  <modules>
+    <module>command</module>
+    <module>common</module>
+    <module>csv</module>
+    <module>file</module>
+    <module>http</module>
+    <module>iot</module>
+    <module>iotp</module>
+    <module>jdbc</module>
+    <module>kafka</module>
+    <module>mqtt</module>
+    <module>pubsub</module>
+    <module>serial</module>
+    <module>websocket</module>
+    <module>websocket-base</module>
+    <module>websocket-jetty</module>
+    <module>websocket-misc</module>
+    <module>websocket-server</module>
+  </modules>
+
+</project>
diff --git a/platforms/android/connectors/pubsub/pom.xml b/platforms/android/connectors/pubsub/pom.xml
new file mode 100644
index 0000000..45c1909
--- /dev/null
+++ b/platforms/android/connectors/pubsub/pom.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-pubsub</artifactId>
+
+  <name>Apache Edgent (Android): Connectors: PubSub</name>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent.java7</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/android/connectors/serial/pom.xml b/platforms/android/connectors/serial/pom.xml
new file mode 100644
index 0000000..d056dc2
--- /dev/null
+++ b/platforms/android/connectors/serial/pom.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-serial</artifactId>
+
+  <name>Apache Edgent (Android): Connectors: Serial</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent.java7</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/android/connectors/websocket-base/pom.xml b/platforms/android/connectors/websocket-base/pom.xml
new file mode 100644
index 0000000..51ca363
--- /dev/null
+++ b/platforms/android/connectors/websocket-base/pom.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-websocket-base</artifactId>
+
+  <name>Apache Edgent (Android): Connectors: Websocket: Base</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent.java7</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/android/connectors/websocket-jetty/pom.xml b/platforms/android/connectors/websocket-jetty/pom.xml
new file mode 100644
index 0000000..4d273c4
--- /dev/null
+++ b/platforms/android/connectors/websocket-jetty/pom.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-websocket-jetty</artifactId>
+
+  <name>Apache Edgent (Android): Connectors: Websocket: Jetty</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent.java7</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-connectors-websocket-misc</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.websocket</groupId>
+      <artifactId>javax-websocket-client-impl</artifactId>
+      <version>9.3.6.v20151106</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/android/connectors/websocket-misc/pom.xml b/platforms/android/connectors/websocket-misc/pom.xml
new file mode 100644
index 0000000..b8d09d8
--- /dev/null
+++ b/platforms/android/connectors/websocket-misc/pom.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-websocket-misc</artifactId>
+
+  <name>Apache Edgent (Android): Connectors: Websocket: Misc</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent.java7</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>javax.websocket</groupId>
+      <artifactId>javax.websocket-api</artifactId>
+      <version>1.0</version>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/platforms/android/connectors/websocket-server/pom.xml b/platforms/android/connectors/websocket-server/pom.xml
new file mode 100644
index 0000000..d6b2019
--- /dev/null
+++ b/platforms/android/connectors/websocket-server/pom.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-websocket-server</artifactId>
+
+  <name>Apache Edgent (Android): Connectors: Websocket: Server</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent.java7</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-connectors-websocket-jetty</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.websocket</groupId>
+      <artifactId>javax-websocket-server-impl</artifactId>
+      <version>9.3.6.v20151106</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/android/connectors/websocket/pom.xml b/platforms/android/connectors/websocket/pom.xml
new file mode 100644
index 0000000..16a0783
--- /dev/null
+++ b/platforms/android/connectors/websocket/pom.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-websocket</artifactId>
+
+  <name>Apache Edgent (Android): Connectors: Websocket</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent.java7</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-connectors-common</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-connectors-websocket-misc</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-connectors-websocket-base</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>javax.websocket</groupId>
+      <artifactId>javax.websocket-api</artifactId>
+      <version>1.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/android/distribution/pom.xml b/platforms/android/distribution/pom.xml
new file mode 100644
index 0000000..c58342c
--- /dev/null
+++ b/platforms/android/distribution/pom.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-platforms-android</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-distribution</artifactId>
+
+  <name>Apache Edgent (Android): Distribution</name>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-assembly-plugin</artifactId>
+        <configuration>
+          <descriptor>src/assembly/distribution.xml</descriptor>
+        </configuration>
+        <executions>
+          <execution>
+            <id>create-archive</id>
+            <phase>package</phase>
+            <goals>
+              <goal>single</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      <!-- We don't need any jars as output in this module -->
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>default-jar</id>
+            <phase>none</phase>
+          </execution>
+          <execution>
+            <id>default</id>
+            <phase>none</phase>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <!-- The general strategy here is to only declare "top-level"
+         Edgent artifacts, like an Edgent application pom would,
+         and let those artifacts pull in their dependent
+         Edgent artifacts, etc.
+         So declare Providers, Analytics, Utils, Connectors.
+    -->
+
+    <!-- Providers -->
+    <!-- Not on android <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-providers-development</artifactId>
+      <version>1.2.0-SNAPSHOT</version>
+    </dependency-->
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-providers-iot</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+
+    <!-- Android platform speficic -->
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-android-hardware</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-android-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+
+    <!-- Analytics -->
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-analytics-math3</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-analytics-sensors</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+
+    <!-- Utils -->
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-utils-metrics</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-utils-streamscope</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+
+    <!-- Connectors -->
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-connectors-command</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-connectors-common</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-connectors-csv</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-connectors-file</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-connectors-http</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-connectors-iot</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-connectors-iotp</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-connectors-jdbc</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-connectors-kafka</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-connectors-mqtt</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-connectors-pubsub</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-connectors-serial</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-connectors-websocket</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-connectors-websocket-jetty</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+
+    <!-- Include console-servlets.war to enable a user to run
+         it in their own Servlets engine.
+         It's bundled in the edgent-console-server.jar.
+         Note, edgent-console-server is pulled in as a dependency
+         of the development provider.
+    -->
+    <!-- Not on android <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-console-servlets</artifactId>
+      <version>1.2.0-SNAPSHOT</version>
+      <type>war</type>
+    </dependency-->
+  </dependencies>
+
+</project>
diff --git a/platforms/android/distribution/src/assembly/distribution.xml b/platforms/android/distribution/src/assembly/distribution.xml
new file mode 100644
index 0000000..e497d5f
--- /dev/null
+++ b/platforms/android/distribution/src/assembly/distribution.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
+          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+          xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
+
+  <id>bin</id>
+
+  <formats>
+    <format>tar.gz</format>
+    <format>tar.bz2</format>
+    <format>zip</format>
+  </formats>
+
+  <fileSets>
+    <!--fileSet>
+      <directory>${project.basedir}/../../..</directory>
+      <outputDirectory/>
+      <includes>
+        <include>DISCLAIMER</include>
+        <include>LICENSE</include>
+        <include>NOTICE</include>
+      </includes>
+    </fileSet>
+
+    <fileSet>
+      <directory>${project.basedir}/../../../src/main/appended-resources/licenses</directory>
+      <outputDirectory>licenses</outputDirectory>
+    </fileSet-->
+
+    <fileSet>
+      <directory>${project.build.outputDirectory}/META-INF</directory>
+      <includes>
+        <include>DEPENDENCIES</include>
+      </includes>
+      <outputDirectory/>
+    </fileSet>
+
+    <fileSet>
+      <directory>${project.build.outputDirectory}</directory>
+      <includes>
+        <include>README</include>
+      </includes>
+      <outputDirectory/>
+    </fileSet>
+
+    <!--fileSet>
+      <directory>${project.build.directory}/site</directory>
+      <outputDirectory>docs</outputDirectory>
+    </fileSet-->
+  </fileSets>
+
+  <dependencySets>
+    <!-- Any edgent libs -->
+    <dependencySet>
+      <outputDirectory>libs</outputDirectory>
+      <scope>runtime</scope>
+      <includes>
+        <include>org.apache.edgent*</include>
+      </includes>
+      <excludes>
+        <exclude>org.apache.edgent*:edgent-distribution</exclude>
+      </excludes>
+    </dependencySet>
+
+    <!-- All other libs are treated as external libs -->
+    <dependencySet>
+      <outputDirectory>ext</outputDirectory>
+      <scope>runtime</scope>
+      <excludes>
+        <exclude>org.apache.edgent*</exclude>
+      </excludes>
+    </dependencySet>
+  </dependencySets>
+
+</assembly>
diff --git a/platforms/android/distribution/src/main/resources/README b/platforms/android/distribution/src/main/resources/README
new file mode 100644
index 0000000..d91c7ff
--- /dev/null
+++ b/platforms/android/distribution/src/main/resources/README
@@ -0,0 +1,12 @@
+This bundle includes a number of artifacts with separate
+copyright notices and license terms.  Your use of an artifact
+is subject to that artifact’s licensing terms and conditions.
+
+The Apache Edgent artifacts (everything in lib) all have the
+license “Apache License Version 2.0”.
+
+Edgent’s dependent artifacts in “ext” have all been evaluated
+to be compatible with Edgent’s license.
+
+A bundled artifact's advertised license information may be
+found in the DEPENDENCIES file in this bundle.
diff --git a/platforms/android/pom.xml b/platforms/android/pom.xml
new file mode 100644
index 0000000..e1ae9f8
--- /dev/null
+++ b/platforms/android/pom.xml
@@ -0,0 +1,164 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-platforms</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <groupId>org.apache.edgent.android</groupId>
+  <artifactId>edgent-platforms-android</artifactId>
+  <packaging>pom</packaging>
+
+  <name>Apache Edgent (Android): Platforms: Android</name>
+
+  <modules>
+    <!-- Real modules -->
+    <module>android</module>
+
+    <!-- Repacked modules -->
+    <module>analytics</module>
+    <module>api</module>
+    <module>apps</module>
+    <module>connectors</module>
+    <module>providers</module>
+    <module>runtime</module>
+    <module>spi</module>
+    <module>utils</module>
+  </modules>
+
+  <build>
+    <plugins>
+      <!-- Check artifacts against Java7 signatures -->
+      <!--
+          Let the plugin run in the process-test-classes so we immediately know if
+          test run problems could be related to using APIs unavailable to Java7.
+      -->
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>animal-sniffer-maven-plugin</artifactId>
+        <version>1.15</version>
+        <executions>
+          <execution>
+            <id>check-jdk-signatures</id>
+            <phase>process-test-classes</phase>
+            <goals>
+              <goal>check</goal>
+            </goals>
+          </execution>
+        </executions>
+        <configuration>
+          <signature>
+            <groupId>org.codehaus.mojo.signature</groupId>
+            <artifactId>java18</artifactId>
+            <version>1.0</version>
+          </signature>
+        </configuration>
+      </plugin>
+      <!-- We don't do testing on Android ;-) -->
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>default</id>
+            <goals>
+              <goal>test-jar</goal>
+            </goals>
+            <configuration>
+              <skip>true</skip>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <!--
+          The android platform depends on the modules of the java7 platform,
+          so we have to make sure that profile is activated too.
+      -->
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-enforcer-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>enforce-java7-profile-is-activated</id>
+            <goals>
+              <goal>enforce</goal>
+            </goals>
+            <configuration>
+              <rules>
+                <requireProperty>
+                  <property>platform.java7</property>
+                  <message>the 'platform-java7' profile must be activated!</message>
+                </requireProperty>
+              </rules>
+              <fail>true</fail>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+
+    <pluginManagement>
+      <plugins>
+        <!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+        <plugin>
+          <groupId>org.eclipse.m2e</groupId>
+          <artifactId>lifecycle-mapping</artifactId>
+          <version>1.0.0</version>
+          <configuration>
+            <lifecycleMappingMetadata>
+              <pluginExecutions>
+                <pluginExecution>
+                  <pluginExecutionFilter>
+                    <groupId>net.orfjackal.retrolambda</groupId>
+                    <artifactId>retrolambda-maven-plugin</artifactId>
+                    <versionRange>[2.5.1,)</versionRange>
+                    <goals>
+                      <goal>process-main</goal>
+                      <goal>process-test</goal>
+                    </goals>
+                  </pluginExecutionFilter>
+                  <action>
+                    <ignore />
+                  </action>
+                </pluginExecution>
+              </pluginExecutions>
+            </lifecycleMappingMetadata>
+          </configuration>
+        </plugin>
+      </plugins>
+    </pluginManagement>
+    
+  </build>
+
+  <!-- Additionally build the binary distribution package. -->
+  <profiles>
+    <profile>
+      <id>distribution</id>
+      <modules>
+        <module>distribution</module>
+      </modules>
+    </profile>
+  </profiles>
+
+</project>
diff --git a/platforms/android/providers/direct/pom.xml b/platforms/android/providers/direct/pom.xml
new file mode 100644
index 0000000..a296afa
--- /dev/null
+++ b/platforms/android/providers/direct/pom.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-providers</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-providers-direct</artifactId>
+
+  <name>Apache Edgent (Android): Providers: Direct</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent.java7</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-spi-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-spi-graph</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-runtime-appservice</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-runtime-etiao</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-runtime-jsoncontrol</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/android/providers/iot/pom.xml b/platforms/android/providers/iot/pom.xml
new file mode 100644
index 0000000..4727b39
--- /dev/null
+++ b/platforms/android/providers/iot/pom.xml
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-providers</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-providers-iot</artifactId>
+
+  <name>Apache Edgent (Android): Providers: IoT</name>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent.java7</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-runtime-jsoncontrol</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-runtime-appservice</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-connectors-iot</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-connectors-pubsub</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-apps-iot</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-apps-runtime</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/android/providers/pom.xml b/platforms/android/providers/pom.xml
new file mode 100644
index 0000000..f6ef2eb
--- /dev/null
+++ b/platforms/android/providers/pom.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-platforms-android</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-providers</artifactId>
+  <packaging>pom</packaging>
+
+  <name>Apache Edgent (Android): Providers</name>
+
+  <modules>
+    <module>direct</module>
+    <module>iot</module>
+  </modules>
+
+</project>
diff --git a/platforms/android/runtime/appservice/pom.xml b/platforms/android/runtime/appservice/pom.xml
new file mode 100644
index 0000000..ace6437
--- /dev/null
+++ b/platforms/android/runtime/appservice/pom.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-runtime</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-runtime-appservice</artifactId>
+
+  <name>Apache Edgent (Android): Runtime: AppService</name>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent.java7</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-execution</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/android/runtime/etiao/pom.xml b/platforms/android/runtime/etiao/pom.xml
new file mode 100644
index 0000000..dbcb03b
--- /dev/null
+++ b/platforms/android/runtime/etiao/pom.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-runtime</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-runtime-etiao</artifactId>
+
+  <name>Apache Edgent (Android): Runtime: Etiao</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent.java7</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-execution</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-graph</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-spi-graph</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/android/runtime/jobregistry/pom.xml b/platforms/android/runtime/jobregistry/pom.xml
new file mode 100644
index 0000000..4448880
--- /dev/null
+++ b/platforms/android/runtime/jobregistry/pom.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-runtime</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-runtime-jobregistry</artifactId>
+
+  <name>Apache Edgent (Android): Runtime: JobRegistry</name>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent.java7</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-execution</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/android/runtime/jsoncontrol/pom.xml b/platforms/android/runtime/jsoncontrol/pom.xml
new file mode 100644
index 0000000..6ffe186
--- /dev/null
+++ b/platforms/android/runtime/jsoncontrol/pom.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-runtime</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-runtime-jsoncontrol</artifactId>
+
+  <name>Apache Edgent (Android): Runtime: JSONControl</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent.java7</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-execution</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-function</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/android/runtime/pom.xml b/platforms/android/runtime/pom.xml
new file mode 100644
index 0000000..730f880
--- /dev/null
+++ b/platforms/android/runtime/pom.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-platforms-android</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-runtime</artifactId>
+  <packaging>pom</packaging>
+
+  <name>Apache Edgent (Android): Runtimes</name>
+
+  <modules>
+    <module>appservice</module>
+    <module>etiao</module>
+    <module>jobregistry</module>
+    <module>jsoncontrol</module>
+  </modules>
+
+</project>
diff --git a/platforms/android/spi/graph/pom.xml b/platforms/android/spi/graph/pom.xml
new file mode 100644
index 0000000..61f5ea3
--- /dev/null
+++ b/platforms/android/spi/graph/pom.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-spi</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-spi-graph</artifactId>
+
+  <name>Apache Edgent (Android): SPI: Graph</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent.java7</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-execution</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-graph</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/android/spi/pom.xml b/platforms/android/spi/pom.xml
new file mode 100644
index 0000000..6b26bf6
--- /dev/null
+++ b/platforms/android/spi/pom.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-platforms-android</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-spi</artifactId>
+  <packaging>pom</packaging>
+
+  <name>Apache Edgent (Android): SPI</name>
+
+  <modules>
+    <module>graph</module>
+    <module>topology</module>
+  </modules>
+
+</project>
diff --git a/platforms/android/spi/topology/pom.xml b/platforms/android/spi/topology/pom.xml
new file mode 100644
index 0000000..432667b
--- /dev/null
+++ b/platforms/android/spi/topology/pom.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-spi</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-spi-topology</artifactId>
+
+  <name>Apache Edgent (Android): SPI: Topology</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent.java7</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/android/utils/metrics/pom.xml b/platforms/android/utils/metrics/pom.xml
new file mode 100644
index 0000000..aaae1b2
--- /dev/null
+++ b/platforms/android/utils/metrics/pom.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-utils</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-utils-metrics</artifactId>
+
+  <name>Apache Edgent (Android): Utils: Metrics</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent.java7</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/android/utils/pom.xml b/platforms/android/utils/pom.xml
new file mode 100644
index 0000000..366ee77
--- /dev/null
+++ b/platforms/android/utils/pom.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-platforms-android</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-utils</artifactId>
+  <packaging>pom</packaging>
+
+  <name>Apache Edgent (Android): Utils</name>
+
+  <modules>
+    <module>metrics</module>
+    <module>streamscope</module>
+  </modules>
+
+</project>
diff --git a/platforms/android/utils/streamscope/pom.xml b/platforms/android/utils/streamscope/pom.xml
new file mode 100644
index 0000000..45d1cf6
--- /dev/null
+++ b/platforms/android/utils/streamscope/pom.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.android</groupId>
+    <artifactId>edgent-utils</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-utils-streamscope</artifactId>
+
+  <name>Apache Edgent (Android): Utils: Streamscope</name>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent.java7</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.android</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/java7/analytics/math3/pom.xml b/platforms/java7/analytics/math3/pom.xml
new file mode 100644
index 0000000..7275b1e
--- /dev/null
+++ b/platforms/java7/analytics/math3/pom.xml
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-analytics</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-analytics-math3</artifactId>
+
+  <name>Apache Edgent (Java 7): Analytics: Math3</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-math3</artifactId>
+      <version>3.4.1</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/java7/analytics/pom.xml b/platforms/java7/analytics/pom.xml
new file mode 100644
index 0000000..fe530c0
--- /dev/null
+++ b/platforms/java7/analytics/pom.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-platforms-java7</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-analytics</artifactId>
+  <packaging>pom</packaging>
+
+  <name>Apache Edgent (Java 7): Analytics</name>
+
+  <modules>
+    <module>math3</module>
+    <module>sensors</module>
+  </modules>
+
+</project>
diff --git a/platforms/java7/analytics/sensors/pom.xml b/platforms/java7/analytics/sensors/pom.xml
new file mode 100644
index 0000000..0c10701
--- /dev/null
+++ b/platforms/java7/analytics/sensors/pom.xml
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-analytics</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-analytics-sensors</artifactId>
+
+  <name>Apache Edgent (Java 7): Analytics: Sensors</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+              <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/java7/api/execution/pom.xml b/platforms/java7/api/execution/pom.xml
new file mode 100644
index 0000000..6e4a305
--- /dev/null
+++ b/platforms/java7/api/execution/pom.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-api</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-api-execution</artifactId>
+
+  <name>Apache Edgent (Java 7): API: Execution</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-function</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>com.google.code.gson</groupId>
+      <artifactId>gson</artifactId>
+      <version>2.8.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/java7/api/function/pom.xml b/platforms/java7/api/function/pom.xml
new file mode 100644
index 0000000..7cf5a2f
--- /dev/null
+++ b/platforms/java7/api/function/pom.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-api</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-api-function</artifactId>
+
+  <name>Apache Edgent (Java 7): API: Function</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>
diff --git a/platforms/java7/api/graph/pom.xml b/platforms/java7/api/graph/pom.xml
new file mode 100644
index 0000000..a464edc
--- /dev/null
+++ b/platforms/java7/api/graph/pom.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-api</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-api-graph</artifactId>
+
+  <name>Apache Edgent (Java 7): API: Graph</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-oplet</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/java7/api/oplet/pom.xml b/platforms/java7/api/oplet/pom.xml
new file mode 100644
index 0000000..45f5cdc
--- /dev/null
+++ b/platforms/java7/api/oplet/pom.xml
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-api</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-api-oplet</artifactId>
+
+  <name>Apache Edgent (Java 7): API: Oplet</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-function</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-execution</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-window</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/java7/api/pom.xml b/platforms/java7/api/pom.xml
new file mode 100644
index 0000000..0d15e8d
--- /dev/null
+++ b/platforms/java7/api/pom.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-platforms-java7</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-api</artifactId>
+  <packaging>pom</packaging>
+
+  <name>Apache Edgent (Java 7): API</name>
+
+  <modules>
+    <module>execution</module>
+    <module>function</module>
+    <module>graph</module>
+    <module>oplet</module>
+    <module>topology</module>
+    <module>window</module>
+  </modules>
+
+</project>
diff --git a/platforms/java7/api/topology/pom.xml b/platforms/java7/api/topology/pom.xml
new file mode 100644
index 0000000..ad1fd70
--- /dev/null
+++ b/platforms/java7/api/topology/pom.xml
@@ -0,0 +1,148 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-api</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-api-topology</artifactId>
+
+  <name>Apache Edgent (Java 7): API: Topology</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+        <executions>
+          <!--
+              Make the default test-jar exclude the service descriptor
+              Or some tests would succeed where they should fail.
+          -->
+          <execution>
+            <id>default</id>
+            <goals>
+              <goal>test-jar</goal>
+            </goals>
+            <configuration>
+              <excludes>
+                <exclude>META-INF/services/**</exclude>
+              </excludes>
+            </configuration>
+          </execution>
+          <!--
+              Create a second test-jar that contains only the dummy
+              Server and the service descriptor for that. This is used
+              by other modules unit-tests.
+          -->
+          <execution>
+            <id>dummy-server-jar</id>
+            <phase>package</phase>
+            <goals>
+              <goal>test-jar</goal>
+            </goals>
+            <configuration>
+              <classifier>test-server</classifier>
+              <includes>
+                <include>**/services/**</include>
+                <include>META-INF/services/**</include>
+              </includes>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-execution</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-function</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-graph</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-oplet</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/java7/api/window/pom.xml b/platforms/java7/api/window/pom.xml
new file mode 100644
index 0000000..dcfd3e0
--- /dev/null
+++ b/platforms/java7/api/window/pom.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-api</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-api-window</artifactId>
+
+  <name>Apache Edgent (Java 7): API: Window</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-function</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/java7/apps/iot/pom.xml b/platforms/java7/apps/iot/pom.xml
new file mode 100644
index 0000000..354ac9e
--- /dev/null
+++ b/platforms/java7/apps/iot/pom.xml
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-apps</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-apps-iot</artifactId>
+
+  <name>Apache Edgent (Java 7): Apps: IoT</name>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-connectors-iot</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-connectors-pubsub</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/java7/apps/pom.xml b/platforms/java7/apps/pom.xml
new file mode 100644
index 0000000..84c2fec
--- /dev/null
+++ b/platforms/java7/apps/pom.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-platforms-java7</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-apps</artifactId>
+  <packaging>pom</packaging>
+
+  <name>Apache Edgent (Java 7): Apps</name>
+
+  <modules>
+    <module>iot</module>
+    <module>runtime</module>
+  </modules>
+
+</project>
diff --git a/platforms/java7/apps/runtime/pom.xml b/platforms/java7/apps/runtime/pom.xml
new file mode 100644
index 0000000..87469e6
--- /dev/null
+++ b/platforms/java7/apps/runtime/pom.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-apps</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-apps-runtime</artifactId>
+
+  <name>Apache Edgent (Java 7): Apps: Runtime</name>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-runtime-jobregistry</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-runtime-jmxcontrol</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/java7/connectors/command/pom.xml b/platforms/java7/connectors/command/pom.xml
new file mode 100644
index 0000000..419ad77
--- /dev/null
+++ b/platforms/java7/connectors/command/pom.xml
@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-command</artifactId>
+
+  <name>Apache Edgent (Java 7): Connectors: Command</name>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-connectors-common</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-connectors-common</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/java7/connectors/common/pom.xml b/platforms/java7/connectors/common/pom.xml
new file mode 100644
index 0000000..aabe743
--- /dev/null
+++ b/platforms/java7/connectors/common/pom.xml
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-common</artifactId>
+
+  <name>Apache Edgent (Java 7): Connectors: Common</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/java7/connectors/csv/pom.xml b/platforms/java7/connectors/csv/pom.xml
new file mode 100644
index 0000000..46860cc
--- /dev/null
+++ b/platforms/java7/connectors/csv/pom.xml
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-csv</artifactId>
+
+  <name>Apache Edgent (Java 7): Connectors: CSV</name>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>com.google.code.gson</groupId>
+      <artifactId>gson</artifactId>
+      <version>2.8.0</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+      <type>test-jar</type>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/java7/connectors/file/pom.xml b/platforms/java7/connectors/file/pom.xml
new file mode 100644
index 0000000..f0f215b
--- /dev/null
+++ b/platforms/java7/connectors/file/pom.xml
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-file</artifactId>
+
+  <name>Apache Edgent (Java 7): Connectors: File</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-function</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-oplet</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-connectors-common</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/platforms/java7/connectors/http/pom.xml b/platforms/java7/connectors/http/pom.xml
new file mode 100644
index 0000000..0f776a6
--- /dev/null
+++ b/platforms/java7/connectors/http/pom.xml
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-http</artifactId>
+
+  <name>Apache Edgent (Java 7): Connectors: HTTP</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.httpcomponents</groupId>
+      <artifactId>httpclient</artifactId>
+      <version>4.5.1</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.httpcomponents</groupId>
+      <artifactId>httpcore</artifactId>
+      <version>4.4.4</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/platforms/java7/connectors/iot/pom.xml b/platforms/java7/connectors/iot/pom.xml
new file mode 100644
index 0000000..c5d09f9
--- /dev/null
+++ b/platforms/java7/connectors/iot/pom.xml
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-iot</artifactId>
+
+  <name>Apache Edgent (Java 7): Connectors: IoT</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-function</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/platforms/java7/connectors/iotp/pom.xml b/platforms/java7/connectors/iotp/pom.xml
new file mode 100644
index 0000000..390e2bf
--- /dev/null
+++ b/platforms/java7/connectors/iotp/pom.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-iotp</artifactId>
+
+  <name>Apache Edgent (Java 7): Connectors: IoTP</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-function</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-connectors-iot</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>com.ibm.messaging</groupId>
+      <artifactId>watson-iot</artifactId>
+      <version>0.2.2</version>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/platforms/java7/connectors/jdbc/pom.xml b/platforms/java7/connectors/jdbc/pom.xml
new file mode 100644
index 0000000..068843b
--- /dev/null
+++ b/platforms/java7/connectors/jdbc/pom.xml
@@ -0,0 +1,155 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-jdbc</artifactId>
+
+  <name>Apache Edgent (Java 7): Connectors: JDBC</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <configuration>
+          <!--
+                Set an environment variable to make sure any derby log is created
+                inside the target directory as well as pass in a location for
+                creating the database.
+          -->
+          <systemProperties>
+            <property>
+              <name>jdbcStreamsTest.tmpdir</name>
+              <value>${project.build.directory}/jdbc-test-tmp</value>
+            </property>
+            <property>
+              <name>derby.stream.error.file</name>
+              <value>${project.build.directory}/derby.log</value>
+            </property>
+          </systemProperties>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-function</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-connectors-common</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <!-- https://mvnrepository.com/artifact/org.apache.derby/derby -->
+    <dependency>
+      <groupId>org.apache.derby</groupId>
+      <artifactId>derby</artifactId>
+      <!--  requires java8: <version>10.13.1.1</version-->
+      <version>10.12.1.1</version> <!-- latest Java 6 and Higher -->
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/java7/connectors/kafka/pom.xml b/platforms/java7/connectors/kafka/pom.xml
new file mode 100644
index 0000000..1b752b6
--- /dev/null
+++ b/platforms/java7/connectors/kafka/pom.xml
@@ -0,0 +1,211 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-kafka</artifactId>
+
+  <name>Apache Edgent (Java 7): Connectors: Kafka</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <!--
+  The pom for kafka includes dependencies that don't make sense for us.
+  In at least one case kafka dependencies include a slf4j *implementation* jar
+  and that conflicts with our samples' binding to a particular
+  version of slf4j implementation.
+  This all seems like fallout from, I believe, the kafka jars containing
+  the code for their cli tools too, and possibly tests, which need things like:
+    slf4j-log4j12, snappy-java, jline, jopt-simple, junit-3.8.1
+  
+  So at least for now, avoid transitive and just match our ant/gradle based
+  config.  Include only the exact dependencies that our kafka
+  dependency requires to function properly.
+  -->
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.kafka</groupId>
+      <artifactId>kafka_2.10</artifactId>
+      <version>0.8.2.2</version>
+      <exclusions>
+        <exclusion> <!-- not transitive -->
+          <groupId>*</groupId>
+          <artifactId>*</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.kafka</groupId>
+      <artifactId>kafka-clients</artifactId>
+      <version>0.8.2.2</version>
+      <exclusions>
+        <exclusion> <!-- not transitive -->
+          <groupId>*</groupId>
+          <artifactId>*</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
+      <version>1.2.16</version>
+      <exclusions>
+        <exclusion> <!-- not transitive -->
+          <groupId>*</groupId>
+          <artifactId>*</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>com.yammer.metrics</groupId>
+      <artifactId>metrics-core</artifactId>
+      <version>2.2.0</version>
+      <exclusions>
+        <exclusion> <!-- not transitive -->
+          <groupId>*</groupId>
+          <artifactId>*</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>org.scala-lang</groupId>
+      <artifactId>scala-library</artifactId>
+      <version>2.10.4</version>
+      <exclusions>
+        <exclusion> <!-- not transitive -->
+          <groupId>*</groupId>
+          <artifactId>*</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>com.101tec</groupId>
+      <artifactId>zkclient</artifactId>
+      <version>0.3</version>
+      <exclusions>
+        <exclusion> <!-- not transitive -->
+          <groupId>*</groupId>
+          <artifactId>*</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.zookeeper</groupId>
+      <artifactId>zookeeper</artifactId>
+      <version>3.4.6</version>
+      <exclusions>
+        <exclusion> <!-- not transitive -->
+          <groupId>*</groupId>
+          <artifactId>*</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-connectors-common</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/platforms/java7/connectors/mqtt/pom.xml b/platforms/java7/connectors/mqtt/pom.xml
new file mode 100644
index 0000000..fdf9a83
--- /dev/null
+++ b/platforms/java7/connectors/mqtt/pom.xml
@@ -0,0 +1,141 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-mqtt</artifactId>
+
+  <name>Apache Edgent (Java 7): Connectors: MQTT</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-connectors-iot</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-connectors-common</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.paho</groupId>
+      <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
+      <version>1.1.0</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-connectors-common</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
+      <version>3.4</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/platforms/java7/connectors/pom.xml b/platforms/java7/connectors/pom.xml
new file mode 100644
index 0000000..4bead79
--- /dev/null
+++ b/platforms/java7/connectors/pom.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-platforms-java7</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors</artifactId>
+  <packaging>pom</packaging>
+
+  <name>Apache Edgent (Java 7): Connectors</name>
+
+  <modules>
+    <module>command</module>
+    <module>common</module>
+    <module>csv</module>
+    <module>file</module>
+    <module>http</module>
+    <module>iot</module>
+    <module>iotp</module>
+    <module>jdbc</module>
+    <module>kafka</module>
+    <module>mqtt</module>
+    <module>pubsub</module>
+    <module>serial</module>
+    <module>websocket</module>
+    <module>websocket-base</module>
+    <!-- Downgraded the jetty version to 9.2.21.v20170120 to support Java7 -->
+    <module>websocket-jetty</module>
+    <module>websocket-misc</module>
+    <module>websocket-server</module>
+  </modules>
+
+</project>
diff --git a/platforms/java7/connectors/pubsub/pom.xml b/platforms/java7/connectors/pubsub/pom.xml
new file mode 100644
index 0000000..6797622
--- /dev/null
+++ b/platforms/java7/connectors/pubsub/pom.xml
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-pubsub</artifactId>
+
+  <name>Apache Edgent (Java 7): Connectors: PubSub</name>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/java7/connectors/serial/pom.xml b/platforms/java7/connectors/serial/pom.xml
new file mode 100644
index 0000000..750cf0d
--- /dev/null
+++ b/platforms/java7/connectors/serial/pom.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-serial</artifactId>
+
+  <name>Apache Edgent (Java 7): Connectors: Serial</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/java7/connectors/websocket-base/pom.xml b/platforms/java7/connectors/websocket-base/pom.xml
new file mode 100644
index 0000000..c07e5cf
--- /dev/null
+++ b/platforms/java7/connectors/websocket-base/pom.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-websocket-base</artifactId>
+
+  <name>Apache Edgent (Java 7): Connectors: Websocket: Base</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/java7/connectors/websocket-jetty/pom.xml b/platforms/java7/connectors/websocket-jetty/pom.xml
new file mode 100644
index 0000000..7639ec5
--- /dev/null
+++ b/platforms/java7/connectors/websocket-jetty/pom.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-websocket-jetty</artifactId>
+
+  <name>Apache Edgent (Java 7): Connectors: Websocket: Jetty</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/*,META-INF/maven/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <artifactId>maven-jar-plugin</artifactId>
+        <configuration>
+          <classesDirectory>${project.build.directory}/classes</classesDirectory>
+          <includes>
+            <include>META-INF/services/**</include>
+            <include>org/apache/edgent/javax/websocket/impl/*.class</include>
+          </includes>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-connectors-websocket-misc</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.websocket</groupId>
+      <artifactId>javax-websocket-client-impl</artifactId>
+      <version>9.3.6.v20151106</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/java7/connectors/websocket-misc/pom.xml b/platforms/java7/connectors/websocket-misc/pom.xml
new file mode 100644
index 0000000..067a2b3
--- /dev/null
+++ b/platforms/java7/connectors/websocket-misc/pom.xml
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-websocket-misc</artifactId>
+
+  <name>Apache Edgent (Java 7): Connectors: Websocket: Misc</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>javax.websocket</groupId>
+      <artifactId>javax.websocket-api</artifactId>
+      <version>1.0</version>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/platforms/java7/connectors/websocket-server/pom.xml b/platforms/java7/connectors/websocket-server/pom.xml
new file mode 100644
index 0000000..e05f330
--- /dev/null
+++ b/platforms/java7/connectors/websocket-server/pom.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-websocket-server</artifactId>
+
+  <name>Apache Edgent (Java 7): Connectors: Websocket: Server</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-connectors-websocket-jetty</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.websocket</groupId>
+      <artifactId>javax-websocket-server-impl</artifactId>
+      <version>9.3.6.v20151106</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/java7/connectors/websocket/pom.xml b/platforms/java7/connectors/websocket/pom.xml
new file mode 100644
index 0000000..076ff0e
--- /dev/null
+++ b/platforms/java7/connectors/websocket/pom.xml
@@ -0,0 +1,166 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-connectors</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-connectors-websocket</artifactId>
+
+  <name>Apache Edgent (Java 7): Connectors: Websocket</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-connectors-common</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-connectors-websocket-misc</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-connectors-websocket-base</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>javax.websocket</groupId>
+      <artifactId>javax.websocket-api</artifactId>
+      <version>1.0</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-http</artifactId>
+      <version>${jetty.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-server</artifactId>
+      <version>${jetty.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-servlet</artifactId>
+      <version>${jetty.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty.websocket</groupId>
+      <artifactId>javax-websocket-server-impl</artifactId>
+      <version>${jetty.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-connectors-common</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-connectors-websocket-jetty</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/java7/console/pom.xml b/platforms/java7/console/pom.xml
new file mode 100644
index 0000000..2169499
--- /dev/null
+++ b/platforms/java7/console/pom.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-platforms-java7</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-console</artifactId>
+  <packaging>pom</packaging>
+
+  <name>Apache Edgent (Java 7): Console</name>
+
+  <modules>
+    <module>server</module>
+    <module>servlets</module>
+  </modules>
+
+</project>
diff --git a/platforms/java7/console/server/pom.xml b/platforms/java7/console/server/pom.xml
new file mode 100644
index 0000000..09b1702
--- /dev/null
+++ b/platforms/java7/console/server/pom.xml
@@ -0,0 +1,190 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-console</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-console-server</artifactId>
+
+  <name>Apache Edgent (Java 7): Console: Server</name>
+
+  <build>
+    <resources>
+      <resource>
+        <directory>${project.basedir}/src/main/resources</directory>
+        <targetPath>${project.build.outputDirectory}/</targetPath>
+      </resource>
+      <resource>
+        <directory>${project.basedir}/../../../../src/main/appended-resources/licenses</directory>
+        <targetPath>${project.build.outputDirectory}/META-INF/licenses</targetPath>
+      </resource>
+    </resources>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <!--
+           Copy the servlets.war into the build output so it is embedded as
+           resource into the jar.
+          -->
+          <execution>
+            <id>copy-war</id>
+            <phase>generate-resources</phase>
+            <goals>
+              <goal>copy</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent.java7</groupId>
+                  <artifactId>edgent-console-servlets</artifactId>
+                  <version>${project.version}</version>
+                  <type>war</type>
+                  <outputDirectory>${project.build.outputDirectory}/resources</outputDirectory>
+                  <destFileName>servlets.war</destFileName>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**,resources/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <reporting>
+    <plugins>
+      <!-- For some strange reason this report is causing trouble -->
+      <plugin>
+        <groupId>org.jacoco</groupId>
+        <artifactId>jacoco-maven-plugin</artifactId>
+        <version>0.7.9</version>
+        <configuration>
+          <skip>true</skip>
+        </configuration>
+      </plugin>
+    </plugins>
+  </reporting>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-http</artifactId>
+      <version>${jetty.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-io</artifactId>
+      <version>${jetty.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-security</artifactId>
+      <version>${jetty.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-server</artifactId>
+      <version>${jetty.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-servlet</artifactId>
+      <version>${jetty.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-util</artifactId>
+      <version>${jetty.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-webapp</artifactId>
+      <version>${jetty.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-xml</artifactId>
+      <version>${jetty.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+      <version>1.7.12</version>
+    </dependency>
+
+    <!--
+        This artifact is needed by the maven-dependency-plugin
+        by marking this dependency optional, it is not included
+        in the resulting artifact, but Maven ensures it is built
+        prior to this module.
+    -->
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-console-servlets</artifactId>
+      <version>1.2.0</version>
+      <type>war</type>
+      <optional>true</optional>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/java7/console/server/src/main/remote-resources/META-INF/LICENSE b/platforms/java7/console/server/src/main/remote-resources/META-INF/LICENSE
new file mode 100644
index 0000000..bc4b691
--- /dev/null
+++ b/platforms/java7/console/server/src/main/remote-resources/META-INF/LICENSE
@@ -0,0 +1,41 @@
+
+===============================================================================
+APACHE EDGENT SUBCOMPONENTS:
+
+This binary includes a number of subcomponents with separate
+copyright notices and license terms.  Your use of this binary
+is subject to the terms and conditions of the following licenses.
+
+===============================================================================
+License: Apache License Version 2.0
+For details, see META-INF/licenses/apache-license-version-2.0.txt
+
+gson (com.google.code.gson:gson:2.2.4)
+metrics-core (io.dropwizard.metrics:metrics-core:3.1.2)
+
+===============================================================================
+License: MIT
+
+jquery (org.webjars:jquery:1.11.2)
+    For details, see META-INF/licenses/jquery-1_11_2-MIT.txt.
+
+jquery-ui (org.webjars:jquery-ui:1.11.4)
+    For details, see META-INF/licenses/jquery-ui-1_11_4-MIT.txt.
+
+d3.legend.js (https://gist.githubusercontent.com/ZJONSSON/3918369/raw/bf9bce6b68a3b70f87450f155436ca4a84af1ba4/d3.legend.js)
+    For details, see META-INF/licenses/d3.legend-MIT.txt.
+
+===============================================================================
+License: BSD 3-Clause
+
+d3 (org.webjars.bower:d3:3.3.9)
+    For details, see META-INF/licenses/d3-3_3_9-BSD.txt.
+
+===============================================================================
+License: BSD 2-Clause
+
+d3-plugins-sankey (org.webjars.bower:d3-plugins-sankey:1.1.0)
+    For details, see META-INF/licenses/d3-plugins-sankey-1_1_0-BSD.txt.
+
+===============================================================================
+
diff --git a/platforms/java7/console/server/src/main/remote-resources/META-INF/NOTICE b/platforms/java7/console/server/src/main/remote-resources/META-INF/NOTICE
new file mode 100644
index 0000000..9c9e7e9
--- /dev/null
+++ b/platforms/java7/console/server/src/main/remote-resources/META-INF/NOTICE
@@ -0,0 +1,28 @@
+===============================================================================
+
+Portions of this software were developed by IBM Corp.
+Copyright IBM Corp. 2015, 2016
+
+===============================================================================
+
+APACHE EDGENT SUBCOMPONENTS:
+
+This product includes a number of subcomponents with separate
+copyright notices and license terms.  The following notices apply.
+
+-------------------------------------------------------------------------------
+metrics-core (io.dropwizard.metrics:metrics-core:3.1.2)
+
+Metrics
+Copyright 2010-2013 Coda Hale and Yammer, Inc.
+
+This product includes software developed by Coda Hale and Yammer, Inc.
+
+This product includes code derived from the JSR-166 project (ThreadLocalRandom,
+Striped64, LongAdder) with the following comments:
+
+          Written by Doug Lea with assistance from members of JCP JSR-166
+          Expert Group and released to the public domain, as explained at
+          http://creativecommons.org/publicdomain/zero/1.0/
+
+===============================================================================
diff --git a/platforms/java7/console/servlets/pom.xml b/platforms/java7/console/servlets/pom.xml
new file mode 100644
index 0000000..92d921c
--- /dev/null
+++ b/platforms/java7/console/servlets/pom.xml
@@ -0,0 +1,137 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-console</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-console-servlets</artifactId>
+  <packaging>war</packaging>
+
+  <name>Apache Edgent (Java 7): Console: Servlets</name>
+
+  <build>
+    <resources>
+      <resource>
+        <directory>${project.basedir}/../../../../src/main/appended-resources/licenses</directory>
+        <targetPath>${project.build.directory}/${project.artifactId}-${project.version}/META-INF/licenses</targetPath>
+      </resource>
+    </resources>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-remote-resources-plugin</artifactId>
+        <configuration>
+          <outputDirectory>${project.build.directory}/${project.artifactId}-${project.version}</outputDirectory>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <type>war</type>
+                  <outputDirectory>${project.build.directory}/${project.artifactId}-${project.version}</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>net.orfjackal.retrolambda</groupId>
+        <artifactId>retrolambda-maven-plugin</artifactId>
+        <version>2.5.1</version>
+        <executions>
+          <execution>
+            <goals>
+              <goal>process-main</goal>
+              <goal>process-test</goal>
+            </goals>
+            <configuration>
+              <!-- I was getting random failures if not running retrolambda in a separate process -->
+              <fork>true</fork>
+              <mainInputDir>${project.build.directory}/${project.artifactId}-${project.version}/WEB-INF/classes</mainInputDir>
+              <mainOutputDir>${project.build.directory}/${project.artifactId}-${project.version}/WEB-INF/classes</mainOutputDir>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-war-plugin</artifactId>
+        <version>2.6</version>
+        <configuration>
+          <failOnMissingWebXml>false</failOnMissingWebXml>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-utils-streamscope</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>javax.servlet</groupId>
+      <artifactId>javax.servlet-api</artifactId>
+      <version>3.1.0</version>
+      <scope>provided</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/java7/console/servlets/src/main/remote-resources/META-INF/LICENSE b/platforms/java7/console/servlets/src/main/remote-resources/META-INF/LICENSE
new file mode 100644
index 0000000..4e78974
--- /dev/null
+++ b/platforms/java7/console/servlets/src/main/remote-resources/META-INF/LICENSE
@@ -0,0 +1,40 @@
+
+===============================================================================
+APACHE EDGENT SUBCOMPONENTS:
+
+This binary includes a number of subcomponents with separate
+copyright notices and license terms.  Your use of this binary
+is subject to the terms and conditions of the following licenses.
+
+===============================================================================
+License: Apache License Version 2.0
+For details, see META-INF/licenses/apache-license-version-2.0.txt
+
+gson (com.google.code.gson:gson:2.2.4)
+metrics-core (io.dropwizard.metrics:metrics-core:3.1.2)
+
+===============================================================================
+License: MIT
+
+jquery (org.webjars:jquery:1.11.2)
+    For details, see META-INF/licenses/jquery-1_11_2-MIT.txt.
+
+jquery-ui (org.webjars:jquery-ui:1.11.4)
+    For details, see META-INF/licenses/jquery-ui-1_11_4-MIT.txt.
+
+d3.legend.js (https://gist.githubusercontent.com/ZJONSSON/3918369/raw/bf9bce6b68a3b70f87450f155436ca4a84af1ba4/d3.legend.js)
+    For details, see META-INF/licenses/d3.legend-MIT.txt.
+
+===============================================================================
+License: BSD 3-Clause
+
+d3 (org.webjars.bower:d3:3.3.9)
+    For details, see META-INF/licenses/d3-3_3_9-BSD.txt.
+
+===============================================================================
+License: BSD 2-Clause
+
+d3-plugins-sankey (org.webjars.bower:d3-plugins-sankey:1.1.0)
+    For details, see META-INF/licenses/d3-plugins-sankey-1_1_0-BSD.txt.
+
+===============================================================================
diff --git a/platforms/java7/console/servlets/src/main/remote-resources/META-INF/NOTICE b/platforms/java7/console/servlets/src/main/remote-resources/META-INF/NOTICE
new file mode 100644
index 0000000..9c9e7e9
--- /dev/null
+++ b/platforms/java7/console/servlets/src/main/remote-resources/META-INF/NOTICE
@@ -0,0 +1,28 @@
+===============================================================================
+
+Portions of this software were developed by IBM Corp.
+Copyright IBM Corp. 2015, 2016
+
+===============================================================================
+
+APACHE EDGENT SUBCOMPONENTS:
+
+This product includes a number of subcomponents with separate
+copyright notices and license terms.  The following notices apply.
+
+-------------------------------------------------------------------------------
+metrics-core (io.dropwizard.metrics:metrics-core:3.1.2)
+
+Metrics
+Copyright 2010-2013 Coda Hale and Yammer, Inc.
+
+This product includes software developed by Coda Hale and Yammer, Inc.
+
+This product includes code derived from the JSR-166 project (ThreadLocalRandom,
+Striped64, LongAdder) with the following comments:
+
+          Written by Doug Lea with assistance from members of JCP JSR-166
+          Expert Group and released to the public domain, as explained at
+          http://creativecommons.org/publicdomain/zero/1.0/
+
+===============================================================================
diff --git a/platforms/java7/distribution/pom.xml b/platforms/java7/distribution/pom.xml
new file mode 100644
index 0000000..adc407f
--- /dev/null
+++ b/platforms/java7/distribution/pom.xml
@@ -0,0 +1,205 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-platforms-java7</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-distribution</artifactId>
+
+  <name>Apache Edgent (Java 7): Distribution</name>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-assembly-plugin</artifactId>
+        <configuration>
+          <descriptor>src/assembly/distribution.xml</descriptor>
+        </configuration>
+        <executions>
+          <execution>
+            <id>create-archive</id>
+            <phase>package</phase>
+            <goals>
+              <goal>single</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      <!-- We don't need any jars as output in this module -->
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>default-jar</id>
+            <phase>none</phase>
+          </execution>
+          <execution>
+            <id>default</id>
+            <phase>none</phase>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <!-- The general strategy here is to only declare "top-level"
+         Edgent artifacts, like an Edgent application pom would,
+         and let those artifacts pull in their dependent
+         Edgent artifacts, etc.
+         So declare Providers, Analytics, Utils, Connectors.
+    -->
+
+    <!-- Providers -->
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-providers-development</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-providers-iot</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+
+    <!-- Analytics -->
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-analytics-math3</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-analytics-sensors</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+
+    <!-- Utils -->
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-utils-metrics</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-utils-streamscope</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+
+    <!-- Connectors -->
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-connectors-command</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-connectors-common</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-connectors-csv</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-connectors-file</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-connectors-http</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-connectors-iot</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-connectors-iotp</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-connectors-jdbc</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-connectors-kafka</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-connectors-mqtt</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-connectors-pubsub</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-connectors-serial</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-connectors-websocket</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-connectors-websocket-jetty</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+
+    <!-- Include console-servlets.war to enable a user to run
+         it in their own Servlets engine.
+         It's bundled in the edgent-console-server.jar.
+         Note, edgent-console-server is pulled in as a dependency
+         of the development provider.
+    -->
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-console-servlets</artifactId>
+      <version>1.2.0</version>
+      <type>war</type>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/java7/distribution/src/assembly/distribution.xml b/platforms/java7/distribution/src/assembly/distribution.xml
new file mode 100644
index 0000000..e497d5f
--- /dev/null
+++ b/platforms/java7/distribution/src/assembly/distribution.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
+          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+          xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
+
+  <id>bin</id>
+
+  <formats>
+    <format>tar.gz</format>
+    <format>tar.bz2</format>
+    <format>zip</format>
+  </formats>
+
+  <fileSets>
+    <!--fileSet>
+      <directory>${project.basedir}/../../..</directory>
+      <outputDirectory/>
+      <includes>
+        <include>DISCLAIMER</include>
+        <include>LICENSE</include>
+        <include>NOTICE</include>
+      </includes>
+    </fileSet>
+
+    <fileSet>
+      <directory>${project.basedir}/../../../src/main/appended-resources/licenses</directory>
+      <outputDirectory>licenses</outputDirectory>
+    </fileSet-->
+
+    <fileSet>
+      <directory>${project.build.outputDirectory}/META-INF</directory>
+      <includes>
+        <include>DEPENDENCIES</include>
+      </includes>
+      <outputDirectory/>
+    </fileSet>
+
+    <fileSet>
+      <directory>${project.build.outputDirectory}</directory>
+      <includes>
+        <include>README</include>
+      </includes>
+      <outputDirectory/>
+    </fileSet>
+
+    <!--fileSet>
+      <directory>${project.build.directory}/site</directory>
+      <outputDirectory>docs</outputDirectory>
+    </fileSet-->
+  </fileSets>
+
+  <dependencySets>
+    <!-- Any edgent libs -->
+    <dependencySet>
+      <outputDirectory>libs</outputDirectory>
+      <scope>runtime</scope>
+      <includes>
+        <include>org.apache.edgent*</include>
+      </includes>
+      <excludes>
+        <exclude>org.apache.edgent*:edgent-distribution</exclude>
+      </excludes>
+    </dependencySet>
+
+    <!-- All other libs are treated as external libs -->
+    <dependencySet>
+      <outputDirectory>ext</outputDirectory>
+      <scope>runtime</scope>
+      <excludes>
+        <exclude>org.apache.edgent*</exclude>
+      </excludes>
+    </dependencySet>
+  </dependencySets>
+
+</assembly>
diff --git a/platforms/java7/distribution/src/main/resources/README b/platforms/java7/distribution/src/main/resources/README
new file mode 100644
index 0000000..d91c7ff
--- /dev/null
+++ b/platforms/java7/distribution/src/main/resources/README
@@ -0,0 +1,12 @@
+This bundle includes a number of artifacts with separate
+copyright notices and license terms.  Your use of an artifact
+is subject to that artifact’s licensing terms and conditions.
+
+The Apache Edgent artifacts (everything in lib) all have the
+license “Apache License Version 2.0”.
+
+Edgent’s dependent artifacts in “ext” have all been evaluated
+to be compatible with Edgent’s license.
+
+A bundled artifact's advertised license information may be
+found in the DEPENDENCIES file in this bundle.
diff --git a/platforms/java7/jqassistant/structural-rules.xml b/platforms/java7/jqassistant/structural-rules.xml
new file mode 100644
index 0000000..f3d15b1
--- /dev/null
+++ b/platforms/java7/jqassistant/structural-rules.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<jqa:jqassistant-rules xmlns:jqa="http://www.buschmais.com/jqassistant/core/analysis/rules/schema/v1.0"
+                       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                       xsi:schemaLocation="http://www.buschmais.com/jqassistant/core/analysis/rules/schema/v1.0 https://raw.githubusercontent.com/buschmais/jqassistant-examples/master/core/analysis/src/main/resources/META-INF/xsd/jqassistant-rules-1.0.xsd">
+
+  <constraint id="structural-rules:unpack-matching-artifacts">
+    <description>All Java 7 modules must use the matching Java 8 modules as source.</description>
+    <cypher><![CDATA[
+            MATCH
+                (m:Maven:Pom:Xml)-[DESCRIBES]->(a:Maven:Artifact)
+            WHERE
+                a.group = "org.apache.edgent.java7"
+            RETURN m
+        ]]></cypher>
+  </constraint>
+
+  <constraint id="structural-rules:matching-dependencies">
+    <description>All Java 7 modules must have the same dependencies as the matching Java 8 modules.</description>
+    <cypher><![CDATA[
+            MATCH
+                (t:Junit4:Test:Class)
+            WHERE NOT
+                t.name =~ ".*Test"
+            RETURN
+                t AS InvalidTestClass
+        ]]></cypher>
+  </constraint>
+
+  <group id="default">
+    <includeConstraint refId="structural-rules:unpack-matching-artifacts" />
+    <includeConstraint refId="structural-rules:matching-dependencies" />
+  </group>
+
+</jqa:jqassistant-rules>
\ No newline at end of file
diff --git a/platforms/java7/pom.xml b/platforms/java7/pom.xml
new file mode 100644
index 0000000..c5e7c10
--- /dev/null
+++ b/platforms/java7/pom.xml
@@ -0,0 +1,229 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-platforms</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <groupId>org.apache.edgent.java7</groupId>
+  <artifactId>edgent-platforms-java7</artifactId>
+  <packaging>pom</packaging>
+
+  <name>Apache Edgent (Java 7): Platforms: Java7</name>
+
+  <properties>
+    <!-- The 9.2 version is the last to support Java7 -->
+    <jetty.version>9.2.21.v20170120</jetty.version>
+  </properties>
+
+  <modules>
+    <!-- Real modules -->
+
+    <!-- Repacked modules -->
+    <module>analytics</module>
+    <module>api</module>
+    <module>apps</module>
+    <module>connectors</module>
+    <module>console</module>
+    <module>providers</module>
+    <module>runtime</module>
+    <module>spi</module>
+    <module>test</module>
+    <module>utils</module>
+  </modules>
+
+  <build>
+    <plugins>
+      <!-- Convert the Java8 classes to Java7 classes -->
+      <plugin>
+        <groupId>net.orfjackal.retrolambda</groupId>
+        <artifactId>retrolambda-maven-plugin</artifactId>
+        <version>2.5.1</version>
+        <executions>
+          <execution>
+            <goals>
+              <goal>process-main</goal>
+              <goal>process-test</goal>
+            </goals>
+            <configuration>
+              <!-- I was getting random failures if not running retrolambda in a separate process -->
+              <fork>true</fork>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <configuration>
+          <includes>
+            <include>**/*Test.class</include>
+          </includes>
+          <testClassesDirectory>${project.build.testOutputDirectory}</testClassesDirectory>
+        </configuration>
+      </plugin>
+      <!-- Check artifacts against Java7 signatures -->
+      <!--
+          Let the plugin run in the process-test-classes so we immediately know if
+          test run problems could be related to using APIs unavailable to Java7.
+      -->
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>animal-sniffer-maven-plugin</artifactId>
+        <version>1.15</version>
+        <executions>
+          <execution>
+            <id>check-jdk-signatures</id>
+            <phase>process-test-classes</phase>
+            <goals>
+              <goal>check</goal>
+            </goals>
+          </execution>
+        </executions>
+        <configuration>
+          <signature>
+            <groupId>org.codehaus.mojo.signature</groupId>
+            <artifactId>java17</artifactId>
+            <version>1.0</version>
+          </signature>
+        </configuration>
+      </plugin>
+    </plugins>
+    <pluginManagement>
+        <plugins>
+            <!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+            <plugin>
+                <groupId>org.eclipse.m2e</groupId>
+                <artifactId>lifecycle-mapping</artifactId>
+                <version>1.0.0</version>
+                <configuration>
+                    <lifecycleMappingMetadata>
+                        <pluginExecutions>
+                            <pluginExecution>
+                                <pluginExecutionFilter>
+                                    <groupId>
+                                        net.orfjackal.retrolambda
+                                    </groupId>
+                                    <artifactId>
+                                        retrolambda-maven-plugin
+                                    </artifactId>
+                                    <versionRange>
+                                        [2.5.1,)
+                                    </versionRange>
+                                    <goals>
+                                        <goal>process-main</goal>
+                                        <goal>process-test</goal>
+                                    </goals>
+                                </pluginExecutionFilter>
+                                <action>
+                                    <ignore />
+                                </action>
+                            </pluginExecution>
+                        </pluginExecutions>
+                    </lifecycleMappingMetadata>
+                </configuration>
+            </plugin>
+        </plugins>
+    </pluginManagement>
+  </build>
+
+  <profiles>
+    <!-- Additionally build the binary distribution package. -->
+    <profile>
+      <id>distribution</id>
+      <modules>
+        <module>distribution</module>
+      </modules>
+    </profile>
+    <!-- Switch all default plugins to use Java7 instead of Java8 -->
+    <profile>
+      <id>toolchain</id>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-toolchains-plugin</artifactId>
+            <version>1.1</version>
+            <executions>
+              <execution>
+                <goals>
+                  <goal>toolchain</goal>
+                </goals>
+              </execution>
+            </executions>
+            <configuration>
+              <toolchains>
+                <jdk>
+                  <version>1.7</version>
+                  <vendor>oracle</vendor>
+                </jdk>
+              </toolchains>
+            </configuration>
+          </plugin>
+          <!--
+              The retrolambda plugin requires Java 8 to operate, but we set the toolchain
+              to Java 7. Therefore we need to provide a path to the Java 8 home directory.
+              This check ensures this property is set and provides an understandable error
+              message.
+          -->
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-enforcer-plugin</artifactId>
+            <version>1.4.1</version>
+            <executions>
+              <execution>
+                <id>enforce-property</id>
+                <goals>
+                  <goal>enforce</goal>
+                </goals>
+                <configuration>
+                  <rules>
+                    <requireProperty>
+                      <property>java8.home</property>
+                      <message>The retrolambda-maven-plugin requires a path to Java 8. You must set a 'java8.home' property!</message>
+                    </requireProperty>
+                  </rules>
+                  <fail>true</fail>
+                </configuration>
+              </execution>
+            </executions>
+          </plugin>
+          <plugin>
+            <groupId>net.orfjackal.retrolambda</groupId>
+            <artifactId>retrolambda-maven-plugin</artifactId>
+            <version>2.5.1</version>
+            <executions>
+              <execution>
+                <configuration>
+                  <java8home>${java8.home}</java8home>
+                </configuration>
+              </execution>
+            </executions>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+  </profiles>
+
+</project>
diff --git a/platforms/java7/providers/development/pom.xml b/platforms/java7/providers/development/pom.xml
new file mode 100644
index 0000000..e813e1c
--- /dev/null
+++ b/platforms/java7/providers/development/pom.xml
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-providers</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-providers-development</artifactId>
+
+  <name>Apache Edgent (Java 7): Providers: Development</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-console-server</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-utils-metrics</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-utils-streamscope</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-runtime-jmxcontrol</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-utils-streamscope</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/java7/providers/direct/pom.xml b/platforms/java7/providers/direct/pom.xml
new file mode 100644
index 0000000..1b0d704
--- /dev/null
+++ b/platforms/java7/providers/direct/pom.xml
@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-providers</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-providers-direct</artifactId>
+
+  <name>Apache Edgent (Java 7): Providers: Direct</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-appservice-jar</id>
+            <phase>pre-integration-test</phase>
+            <goals>
+              <goal>copy</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent.java7</groupId>
+                  <artifactId>edgent-test-appservice-applications</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/test-resources</outputDirectory>
+                  <destFileName>test-appservice-applications.jar</destFileName>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-spi-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-spi-graph</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-runtime-appservice</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-runtime-etiao</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-runtime-jsoncontrol</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-utils-metrics</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-utils-metrics</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/java7/providers/iot/pom.xml b/platforms/java7/providers/iot/pom.xml
new file mode 100644
index 0000000..f341656
--- /dev/null
+++ b/platforms/java7/providers/iot/pom.xml
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-providers</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-providers-iot</artifactId>
+
+  <name>Apache Edgent (Java 7): Providers: IoT</name>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-runtime-jsoncontrol</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-runtime-appservice</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-connectors-iot</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-connectors-pubsub</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-apps-iot</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-apps-runtime</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/java7/providers/pom.xml b/platforms/java7/providers/pom.xml
new file mode 100644
index 0000000..7601063
--- /dev/null
+++ b/platforms/java7/providers/pom.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-platforms-java7</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-providers</artifactId>
+  <packaging>pom</packaging>
+
+  <name>Apache Edgent (Java 7): Providers</name>
+
+  <modules>
+    <module>development</module>
+    <module>direct</module>
+    <module>iot</module>
+  </modules>
+
+</project>
diff --git a/platforms/java7/runtime/appservice/pom.xml b/platforms/java7/runtime/appservice/pom.xml
new file mode 100644
index 0000000..8c10624
--- /dev/null
+++ b/platforms/java7/runtime/appservice/pom.xml
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-runtime</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-runtime-appservice</artifactId>
+
+  <name>Apache Edgent (Java 7): Runtime: AppService</name>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-execution</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+
+    <!-- Just needed to make sure it is scheduled before this module in the reactor -->
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-test-appservice-applications</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/java7/runtime/etiao/pom.xml b/platforms/java7/runtime/etiao/pom.xml
new file mode 100644
index 0000000..3741eac
--- /dev/null
+++ b/platforms/java7/runtime/etiao/pom.xml
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-runtime</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-runtime-etiao</artifactId>
+
+  <name>Apache Edgent (Java 7): Runtime: Etiao</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-execution</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-graph</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-spi-graph</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-graph</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/java7/runtime/jmxcontrol/pom.xml b/platforms/java7/runtime/jmxcontrol/pom.xml
new file mode 100644
index 0000000..66ee3ed
--- /dev/null
+++ b/platforms/java7/runtime/jmxcontrol/pom.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-runtime</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-runtime-jmxcontrol</artifactId>
+
+  <name>Apache Edgent (Java 7): Runtime: JMXControl</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-execution</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-function</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/java7/runtime/jobregistry/pom.xml b/platforms/java7/runtime/jobregistry/pom.xml
new file mode 100644
index 0000000..427cf33
--- /dev/null
+++ b/platforms/java7/runtime/jobregistry/pom.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-runtime</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-runtime-jobregistry</artifactId>
+
+  <name>Apache Edgent (Java 7): Runtime: JobRegistry</name>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-execution</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/java7/runtime/jsoncontrol/pom.xml b/platforms/java7/runtime/jsoncontrol/pom.xml
new file mode 100644
index 0000000..f85f235
--- /dev/null
+++ b/platforms/java7/runtime/jsoncontrol/pom.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-runtime</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-runtime-jsoncontrol</artifactId>
+
+  <name>Apache Edgent (Java 7): Runtime: JSONControl</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-execution</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-function</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/java7/runtime/pom.xml b/platforms/java7/runtime/pom.xml
new file mode 100644
index 0000000..f5e240f
--- /dev/null
+++ b/platforms/java7/runtime/pom.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-platforms-java7</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-runtime</artifactId>
+  <packaging>pom</packaging>
+
+  <name>Apache Edgent (Java 7): Runtime</name>
+
+  <modules>
+    <module>appservice</module>
+    <module>etiao</module>
+    <module>jmxcontrol</module>
+    <module>jobregistry</module>
+    <module>jsoncontrol</module>
+  </modules>
+
+</project>
diff --git a/platforms/java7/spi/graph/pom.xml b/platforms/java7/spi/graph/pom.xml
new file mode 100644
index 0000000..f8a6c8c
--- /dev/null
+++ b/platforms/java7/spi/graph/pom.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-spi</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-spi-graph</artifactId>
+
+  <name>Apache Edgent (Java 7): SPI: Graph</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-execution</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-graph</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/java7/spi/pom.xml b/platforms/java7/spi/pom.xml
new file mode 100644
index 0000000..69415a0
--- /dev/null
+++ b/platforms/java7/spi/pom.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-platforms-java7</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-spi</artifactId>
+  <packaging>pom</packaging>
+
+  <name>Apache Edgent (Java 7): SPI</name>
+
+  <modules>
+    <module>graph</module>
+    <module>topology</module>
+  </modules>
+
+</project>
diff --git a/platforms/java7/spi/topology/pom.xml b/platforms/java7/spi/topology/pom.xml
new file mode 100644
index 0000000..107cf03
--- /dev/null
+++ b/platforms/java7/spi/topology/pom.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-spi</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-spi-topology</artifactId>
+
+  <name>Apache Edgent (Java 7): SPI: Topology</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/java7/test/appservice-applications/pom.xml b/platforms/java7/test/appservice-applications/pom.xml
new file mode 100644
index 0000000..6652dac
--- /dev/null
+++ b/platforms/java7/test/appservice-applications/pom.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-test</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-test-appservice-applications</artifactId>
+
+  <name>Apache Edgent (Java 7): Test: AppService Applications</name>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/*,META-INF/maven/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <artifactId>maven-jar-plugin</artifactId>
+        <configuration>
+          <classesDirectory>${project.build.directory}/classes</classesDirectory>
+          <includes>
+            <include>META-INF/services/**</include>
+            <include>org/apache/edgent/test/topology/services/*.class</include>
+          </includes>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/java7/test/fvtiot/pom.xml b/platforms/java7/test/fvtiot/pom.xml
new file mode 100644
index 0000000..b100be5
--- /dev/null
+++ b/platforms/java7/test/fvtiot/pom.xml
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-test</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-test-fvtiot</artifactId>
+
+  <name>Apache Edgent (Java 7): Test: fvtiot</name>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-appservice-jar</id>
+            <phase>pre-integration-test</phase>
+            <goals>
+              <goal>copy</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent.java7</groupId>
+                  <artifactId>edgent-test-appservice-applications</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/test-resources</outputDirectory>
+                  <destFileName>test-appservice-applications.jar</destFileName>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-connectors-pubsub</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-runtime-jsoncontrol</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-apps-iot</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-apps-iot</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-providers-iot</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/java7/test/pom.xml b/platforms/java7/test/pom.xml
new file mode 100644
index 0000000..3088fde
--- /dev/null
+++ b/platforms/java7/test/pom.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-platforms-java7</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-test</artifactId>
+  <packaging>pom</packaging>
+
+  <name>Apache Edgent (Java 7): Test</name>
+
+  <modules>
+    <module>appservice-applications</module>
+    <module>fvtiot</module>
+    <module>svt</module>
+  </modules>
+
+</project>
diff --git a/platforms/java7/test/svt/pom.xml b/platforms/java7/test/svt/pom.xml
new file mode 100644
index 0000000..92c4203
--- /dev/null
+++ b/platforms/java7/test/svt/pom.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-test</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-test-svt</artifactId>
+
+  <name>Apache Edgent (Java 7): Test: SVT</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-console-server</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-utils-metrics</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-providers-development</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/java7/utils/metrics/pom.xml b/platforms/java7/utils/metrics/pom.xml
new file mode 100644
index 0000000..86a9ce9
--- /dev/null
+++ b/platforms/java7/utils/metrics/pom.xml
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-utils</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-utils-metrics</artifactId>
+
+  <name>Apache Edgent (Java 7): Utils: Metrics</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+
+    <!-- TODO: This is only required because of a dependency to TopologyAbstractTest -> Would suggest to move test-util stutt into a dedicated test-utils artifact -->
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/java7/utils/pom.xml b/platforms/java7/utils/pom.xml
new file mode 100644
index 0000000..612e4c3
--- /dev/null
+++ b/platforms/java7/utils/pom.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-platforms-java7</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-utils</artifactId>
+  <packaging>pom</packaging>
+
+  <name>Apache Edgent (Java 7): Utils</name>
+
+  <modules>
+    <module>metrics</module>
+    <module>streamscope</module>
+  </modules>
+
+</project>
diff --git a/platforms/java7/utils/streamscope/pom.xml b/platforms/java7/utils/streamscope/pom.xml
new file mode 100644
index 0000000..eb47e00
--- /dev/null
+++ b/platforms/java7/utils/streamscope/pom.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent.java7</groupId>
+    <artifactId>edgent-utils</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-utils-streamscope</artifactId>
+
+  <name>Apache Edgent (Java 7): Utils: Streamscope</name>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-test</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <classifier>tests</classifier>
+                  <outputDirectory>${project.build.directory}/test-classes</outputDirectory>
+                  <excludes>META-INF/**</excludes>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+
+    <!-- TODO: This is only required because of a dependency to TopologyAbstractTest -> Would suggest to move test-util stutt into a dedicated test-utils artifact -->
+    <dependency>
+      <groupId>org.apache.edgent.java7</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/platforms/pom.xml b/platforms/pom.xml
new file mode 100644
index 0000000..dbe9b82
--- /dev/null
+++ b/platforms/pom.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-parent</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-platforms</artifactId>
+  <packaging>pom</packaging>
+
+  <name>Apache Edgent (Java 8): Platforms</name>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-remote-resources-plugin</artifactId>
+        <version>1.5</version><!--$NO-MVN-MAN-VER$-->
+        <executions>
+          <execution>
+            <id>process-resource-bundles</id>
+            <goals>
+              <goal>process</goal>
+            </goals>
+            <configuration>
+              <resourceBundles>
+                <resourceBundle>org.apache:apache-jar-resource-bundle:1.4</resourceBundle>
+                <!-- Will generate META-INF/DISCLAIMER  -->
+                <resourceBundle>org.apache.apache.resources:apache-incubator-disclaimer-resource-bundle:1.2-SNAPSHOT</resourceBundle>
+              </resourceBundles>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <profiles>
+    <profile>
+      <id>platform-java7</id>
+      <modules>
+        <module>java7</module>
+      </modules>
+      <properties>
+        <platform.java7>true</platform.java7>
+      </properties>
+    </profile>
+    <profile>
+      <id>platform-android</id>
+      <modules>
+        <module>android</module>
+      </modules>
+      <properties>
+        <platform.android>true</platform.android>
+      </properties>
+    </profile>
+  </profiles>
+
+</project>
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..b1b6172
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,910 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache</groupId>
+    <artifactId>apache</artifactId>
+    <version>18</version>
+  </parent>
+
+  <groupId>org.apache.edgent</groupId>
+  <artifactId>edgent-parent</artifactId>
+  <version>1.2.0</version>
+  <packaging>pom</packaging>
+
+  <name>Apache Edgent</name>
+  <description>The Apache Edgent Project</description>
+
+  <!-- Needed by the remote-resources-maven-plugin to generate the project time-span in the NOTICE files -->
+  <inceptionYear>2016</inceptionYear>
+
+  <scm>
+    <connection>scm:git:https://git-wip-us.apache.org/repos/asf/incubator-edgent.git</connection>
+    <developerConnection>scm:git:https://git-wip-us.apache.org/repos/asf/incubator-edgent.git</developerConnection>
+    <url>https://github.com/apache/incubator-edgent</url>
+    <tag>edgent-1.2.0</tag>
+  </scm>
+
+  <properties>
+    <java.version>1.8</java.version>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <project.reporting.outputencoding>UTF-8</project.reporting.outputencoding>
+    <maven.version>3.3.1</maven.version>
+
+    <jetty.version>9.3.6.v20151106</jetty.version>
+    <gson.version>2.2.4</gson.version>
+    <slf4j.version>1.7.12</slf4j.version>
+
+    <!-- URL of the ASF SonarQube server -->
+    <sonar.host.url>https://builds.apache.org/analysis</sonar.host.url>
+    <!-- Exclude all generated code -->
+    <sonar.exclusions>file:**/generated-sources/**</sonar.exclusions>
+    <!-- Tell sonar where the coverage reports are located -->
+    <sonar.jacoco.reportPath>${project.build.directory}/coverage-reports/jacoco-ut.exec</sonar.jacoco.reportPath>
+    <sonar.jacoco.itReportPath>${project.build.directory}/coverage-reports/jacoco-it.exec</sonar.jacoco.itReportPath>
+
+    <remote-resources-maven-plugin.remote-resources.dir>src/main/remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <!-- Only configure the site distribution as the rest is handled by the apache parent -->
+  <distributionManagement>
+    <site>
+      <id>apache.website</id>
+      <url>scm:git:https://git-wip-us.apache.org/repos/asf/incubator-edgent.git</url>
+    </site>
+  </distributionManagement>
+
+  <issueManagement>
+    <system>Jira</system>
+    <url>https://issues.apache.org/jira/browse/EDGENT</url>
+  </issueManagement>
+
+  <mailingLists>
+    <mailingList>
+      <name>Apache Edgent Developer List</name>
+      <subscribe>dev-subscribe@edgent.apache.org</subscribe>
+      <unsubscribe>dev-unsubscribe@edgent.apache.org</unsubscribe>
+      <post>dev@edgent.apache.org</post>
+      <archive>http://mail-archives.apache.org/mod_mbox/edgent-dev/</archive>
+    </mailingList>
+  </mailingLists>
+
+  <modules>
+    <module>analytics</module>
+    <module>api</module>
+    <module>apps</module>
+    <module>connectors</module>
+    <module>console</module>
+    <module>providers</module>
+    <module>runtime</module>
+    <!-- <module>samples</module> intentionally omitted -->
+    <module>spi</module>
+    <module>test</module>
+    <module>utils</module>
+    <module>platforms</module>
+  </modules>
+
+  <build>
+    <pluginManagement>
+      <plugins>
+        <plugin>
+          <groupId>com.buschmais.jqassistant</groupId>
+          <artifactId>jqassistant-maven-plugin</artifactId>
+          <version>1.3.0</version>
+        </plugin>
+
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-compiler-plugin</artifactId>
+          <version>3.6.1</version>
+          <configuration>
+            <source>${java.version}</source>
+            <target>${java.version}</target>
+            <testSource>${java.version}</testSource>
+            <testTarget>${java.version}</testTarget>
+          </configuration>
+        </plugin>
+
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-jar-plugin</artifactId>
+          <version>3.0.2</version>
+          <dependencies>
+            <!-- Try to get rid of out of heap errors on travis. -->
+            <dependency>
+              <groupId>org.codehaus.plexus</groupId>
+              <artifactId>plexus-archiver</artifactId>
+              <version>3.3</version>
+            </dependency>
+          </dependencies>
+        </plugin>
+
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-install-plugin</artifactId>
+          <version>2.5.2</version>
+        </plugin>
+
+        <plugin>
+          <groupId>org.apache.rat</groupId>
+          <artifactId>apache-rat-plugin</artifactId>
+          <version>0.12</version>
+          <configuration>
+            <!--
+                Make rat output the files with missing licensed directly into the
+                build output (This way we don't have to look into the rat.txt to find
+                out which ones)
+            -->
+            <consoleOutput>true</consoleOutput>
+          </configuration>
+          <dependencies>
+            <dependency>
+              <groupId>org.apache.maven.doxia</groupId>
+              <artifactId>doxia-core</artifactId>
+              <version>1.6</version>
+              <exclusions>
+                <exclusion>
+                  <groupId>xerces</groupId>
+                  <artifactId>xercesImpl</artifactId>
+                </exclusion>
+              </exclusions>
+            </dependency>
+          </dependencies>
+        </plugin>
+
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-javadoc-plugin</artifactId>
+          <version>2.10.4</version>
+          <configuration>
+            <failOnError>false</failOnError>
+          </configuration>
+        </plugin>
+
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-source-plugin</artifactId>
+          <version>3.0.1</version>
+          <executions>
+            <execution>
+              <id>attach-sources</id>
+              <phase>verify</phase>
+              <goals>
+                <goal>jar-no-fork</goal>
+              </goals>
+            </execution>
+          </executions>
+        </plugin>
+
+        <plugin>
+          <groupId>org.sonarsource.scanner.maven</groupId>
+          <artifactId>sonar-maven-plugin</artifactId>
+          <version>3.3.0.603</version>
+        </plugin>
+
+        <!--
+              This is a fake plugin which is used to tell m2e (Eclipse) how
+              to process this maven project.
+        -->
+        <plugin>
+          <groupId>org.eclipse.m2e</groupId>
+          <artifactId>lifecycle-mapping</artifactId>
+          <version>1.0.0</version>
+          <configuration>
+            <lifecycleMappingMetadata>
+              <pluginExecutions>
+                <pluginExecution>
+                  <pluginExecutionFilter>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-dependency-plugin</artifactId>
+                    <versionRange>[1.0.0,)</versionRange>
+                    <goals>
+                      <goal>copy</goal>
+                    </goals>
+                  </pluginExecutionFilter>
+                  <action>
+                    <ignore />
+                  </action>
+                </pluginExecution>
+                <pluginExecution>
+                  <pluginExecutionFilter>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-remote-resources-plugin</artifactId>
+                    <versionRange>[1.0.0,)</versionRange>
+                    <goals>
+                      <goal>process</goal>
+                    </goals>
+                  </pluginExecutionFilter>
+                  <action>
+                    <ignore />
+                  </action>
+                </pluginExecution>
+                <pluginExecution>
+                  <pluginExecutionFilter>
+                    <groupId>com.googlecode.maven-download-plugin</groupId>
+                    <artifactId>download-maven-plugin</artifactId>
+                    <versionRange>[1.0.0,)</versionRange>
+                    <goals>
+                      <goal>wget</goal>
+                    </goals>
+                  </pluginExecutionFilter>
+                  <action>
+                    <ignore />
+                  </action>
+                </pluginExecution>
+              </pluginExecutions>
+            </lifecycleMappingMetadata>
+          </configuration>
+        </plugin>
+
+        <!-- Inject the "incubating" into the output filename
+           N.B. this finalName config spec is currently ignored/overridden
+           by the "apache-release" profile based configuration
+           in this pom. See that config for the finalName.
+           Retain this for now in case we get to the point where
+           that "apache-release" config is no longer needed.
+         -->
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-assembly-plugin</artifactId>
+          <version>2.5.3</version>
+          <configuration>
+            <finalName>apache-edgent-${project.version}-incubating</finalName>
+          </configuration>
+        </plugin>
+
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-dependency-plugin</artifactId>
+          <version>3.0.1</version>
+        </plugin>
+
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-surefire-plugin</artifactId>
+          <version>2.20</version>
+        </plugin>
+
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-failsafe-plugin</artifactId>
+          <version>2.20</version>
+        </plugin>
+
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-site-plugin</artifactId>
+          <version>3.6</version>
+        </plugin>
+      </plugins>
+    </pluginManagement>
+
+    <plugins>
+      <!-- Check if all source files have the required apache license headers -->
+      <plugin>
+        <groupId>org.apache.rat</groupId>
+        <artifactId>apache-rat-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>license-check</id>
+            <phase>verify</phase>
+            <goals>
+              <goal>check</goal>
+            </goals>
+          </execution>
+        </executions>
+        <configuration>
+          <excludes>
+            <!-- License texts -->
+            <exclude>src/main/appended-resources/licenses/**</exclude>
+
+            <!-- Git related files -->
+            <exclude>**/.git/**</exclude>
+            <exclude>**/.gitignore</exclude>
+
+            <!-- Maven related files -->
+            <exclude>**/target/**</exclude>
+
+            <!-- Eclipse related files -->
+            <exclude>**/.project</exclude>
+            <exclude>**/.settings/**</exclude>
+            <exclude>**/.classpath</exclude>
+
+            <!-- IntelliJ related files -->
+            <exclude>**/.idea/**</exclude>
+            <exclude>**/*.iml</exclude>
+
+            <!-- Documentation related files -->
+            <exclude>.mailmap</exclude>
+
+            <!-- Stuff needed by the Jenkins Multibranch Pipeline build -->
+            <exclude>.repository/**</exclude>
+
+            <!-- Other files
+                TODO: Should be examined
+            -->
+            <exclude>*.patch</exclude>
+            <exclude>**/.cache/**</exclude>
+            <exclude>binary-release/apache-notice</exclude>
+            <exclude>binary-release/ibm-contrib-notice</exclude>
+            <exclude>licenses/d3-sankey.BSD</exclude>
+            <exclude>licenses/d3.BSD</exclude>
+            <exclude>licenses/binary-release/javax.servlet-api-3.1.0.CDDL-1.0</exclude>
+            <exclude>licenses/binary-release/javax.websocket-api-1.0.CDDL-1.1</exclude>
+            <exclude>licenses/binary-release/mqttv3-1.1.0.EDL-1.0</exclude>
+            <exclude>licenses/binary-release/watson-iot-0.2.2.EPL-1.0</exclude>
+            <exclude>samples/**</exclude>  <!-- samples are separate -->
+          </excludes>
+        </configuration>
+      </plugin>
+
+      <plugin>
+        <groupId>com.buschmais.jqassistant</groupId>
+        <artifactId>jqassistant-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <goals>
+              <goal>scan</goal>
+              <!--goal>analyze</goal-->
+            </goals>
+            <configuration>
+              <!--failOnSeverity>MAJOR</failOnSeverity-->
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+
+      <!--
+        This plugin doesn't really do much, it makes sure the jacoco agent
+        is downloaded and that the path to this is saved in an environment
+        variable so we can access this later on in the build.
+      -->
+      <plugin>
+        <groupId>org.jacoco</groupId>
+        <artifactId>jacoco-maven-plugin</artifactId>
+        <version>0.7.9</version>
+        <executions>
+          <!--
+              Prepares the property pointing to the JaCoCo runtime agent which
+              is passed as VM argument when Maven the Surefire plugin is executed.
+          -->
+          <execution>
+            <id>pre-unit-test</id>
+            <goals>
+              <goal>prepare-agent</goal>
+            </goals>
+            <configuration>
+              <!--
+                  Sets the name of the property containing the settings
+                  for JaCoCo runtime agent.
+              -->
+              <propertyName>surefireArgLine</propertyName>
+            </configuration>
+          </execution>
+          <!--
+              Prepares the property pointing to the JaCoCo runtime agent which
+              is passed as VM argument when Maven the Failsafe plugin is executed.
+          -->
+          <execution>
+            <id>pre-integration-test</id>
+            <phase>pre-integration-test</phase>
+            <goals>
+              <goal>prepare-agent</goal>
+            </goals>
+            <configuration>
+              <!--
+                  Sets the name of the property containing the settings
+                  for JaCoCo runtime agent.
+              -->
+              <propertyName>failsafeArgLine</propertyName>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+
+      <!--
+        Make the surefire execute all unit-tests
+      -->
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <configuration>
+          <!--
+                Notice the @ instead of the $ as prefix? That's late evaluation.
+          -->
+          <argLine>@{surefireArgLine}</argLine>
+        </configuration>
+      </plugin>
+
+      <!--
+        Make the failsafe execute all integration-tests
+      -->
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-failsafe-plugin</artifactId>
+        <executions>
+          <execution>
+            <goals>
+              <goal>integration-test</goal>
+              <goal>verify</goal>
+            </goals>
+          </execution>
+        </executions>
+        <configuration>
+          <!--
+                Notice the @ instead of the $ as prefix? That's late evaluation.
+          -->
+          <argLine>@{failsafeArgLine}</argLine>
+        </configuration>
+      </plugin>
+
+      <!--
+        Ensure the test classes are also packaged into a test-jar.
+        We need this for generating the Java7 and Android modules.
+      -->
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+        <executions>
+          <execution>
+            <goals>
+              <goal>test-jar</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+
+      <!-- Make sure the DISCLAIMER contains the incubator version -->
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-remote-resources-plugin</artifactId>
+        <version>1.5</version><!--$NO-MVN-MAN-VER$-->
+        <executions>
+          <execution>
+            <id>process-resource-bundles</id>
+            <goals>
+              <goal>process</goal>
+            </goals>
+            <configuration>
+              <resourceBundles>
+                <!-- Will generate META-INF/{DEPENDENCIES,LICENSE,NOTICE} -->
+                <resourceBundle>org.apache:apache-jar-resource-bundle:1.4</resourceBundle>
+                <!-- Will generate META-INF/DISCLAIMER  -->
+                <resourceBundle>org.apache:apache-incubator-disclaimer-resource-bundle:1.1</resourceBundle>
+              </resourceBundles>
+              <!-- Content in this directory will be appended to generated resources -->
+              <appendedResourcesDirectory>${remote-resources-maven-plugin.remote-resources.dir}</appendedResourcesDirectory>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+
+      <!-- Configure the Site generation -->
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-site-plugin</artifactId>
+        <!-- get errors with site:site task when using the default (3.6) version -->
+        <version>3.4</version><!--$NO-MVN-MAN-VER$-->
+        <configuration>
+          <generateReports>true</generateReports>
+          <generateSitemap>true</generateSitemap>
+          <relativizeDecorationLinks>false</relativizeDecorationLinks>
+          <locales>en</locales>
+          <inputEncoding>${project.build.sourceEncoding}</inputEncoding>
+          <outputEncoding>${project.reporting.outputencoding}</outputEncoding>
+        </configuration>
+        <dependencies>
+          <!-- All dependencies needed by the reflow skin -->
+          <dependency>
+            <groupId>lt.velykis.maven.skins</groupId>
+            <artifactId>reflow-velocity-tools</artifactId>
+            <version>1.1.1</version>
+          </dependency>
+          <dependency>
+            <groupId>org.apache.velocity</groupId>
+            <artifactId>velocity</artifactId>
+            <version>1.7</version>
+          </dependency>
+          <dependency>
+            <groupId>org.apache.maven.doxia</groupId>
+            <artifactId>doxia-core</artifactId>
+            <version>1.6</version>
+          </dependency>
+          <!-- add support for scm/git site deployment -->
+          <dependency>
+            <groupId>org.apache.maven.wagon</groupId>
+            <artifactId>wagon-scm</artifactId>
+            <version>2.12</version>
+          </dependency>
+          <dependency>
+            <groupId>org.apache.maven.scm</groupId>
+            <artifactId>maven-scm-api</artifactId>
+            <version>1.9.5</version>
+          </dependency>
+          <dependency>
+            <groupId>org.apache.maven.scm</groupId>
+            <artifactId>maven-scm-manager-plexus</artifactId>
+            <version>1.9.5</version>
+          </dependency>
+          <dependency>
+            <groupId>org.apache.maven.scm</groupId>
+            <artifactId>maven-scm-provider-gitexe</artifactId>
+            <version>1.9.5</version>
+          </dependency>
+          <!-- Add support for asciidoctor -->
+          <dependency>
+            <groupId>org.asciidoctor</groupId>
+            <artifactId>asciidoctor-maven-plugin</artifactId>
+            <version>1.5.5</version>
+          </dependency>
+          <dependency>
+            <groupId>org.jruby</groupId>
+            <artifactId>jruby-complete</artifactId>
+            <version>9.1.10.0</version>
+          </dependency>
+          <dependency>
+            <groupId>org.asciidoctor</groupId>
+            <artifactId>asciidoctorj</artifactId>
+            <version>1.5.5</version>
+          </dependency>
+          <dependency>
+            <groupId>org.asciidoctor</groupId>
+            <artifactId>asciidoctorj-diagram</artifactId>
+            <version>1.5.4</version>
+          </dependency>
+        </dependencies>
+      </plugin>
+
+      <!--
+        Make the maven-site-plugin stage the output in the "asf-site" branch
+      -->
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-scm-publish-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>scm-publish</id>
+            <phase>site-deploy</phase>
+            <!-- deploy site with maven-scm-publish-plugin -->
+            <goals>
+              <goal>publish-scm</goal>
+            </goals>
+            <configuration>
+              <!-- mono-module doesn't require site:stage -->
+              <content>${project.build.directory}/site</content>
+              <!-- branch where to deploy -->
+              <scmBranch>asf-site</scmBranch>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+
+      <!--
+        Verify that the generated classes match Java 8 signatures
+      -->
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>animal-sniffer-maven-plugin</artifactId>
+        <version>1.15</version>
+        <executions>
+          <execution>
+            <id>check-jdk-signatures</id>
+            <phase>process-test-classes</phase>
+            <goals>
+              <goal>check</goal>
+            </goals>
+          </execution>
+        </executions>
+        <configuration>
+          <signature>
+            <groupId>org.codehaus.mojo.signature</groupId>
+            <artifactId>java18</artifactId>
+            <version>1.0</version>
+          </signature>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+
+  <reporting>
+    <plugins>
+      <plugin>
+        <groupId>com.buschmais.jqassistant</groupId>
+        <artifactId>jqassistant-maven-plugin</artifactId>
+        <reportSets>
+          <reportSet>
+            <reports>
+              <report>report</report>
+            </reports>
+          </reportSet>
+        </reportSets>
+      </plugin>
+
+      <!-- Generates a changelog report from GIT commits -->
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-changelog-plugin</artifactId>
+        <version>2.3</version>
+        <configuration>
+          <!-- Automatically link Jira issues -->
+          <issueLinkUrl>https://issues.apache.org/jira/browse/%ISSUE%</issueLinkUrl>
+        </configuration>
+      </plugin>
+
+      <!-- Generates a report with the details of the unit- and integrationtests -->
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-report-plugin</artifactId>
+        <version>2.20</version>
+        <reportSets>
+          <reportSet>
+            <reports>
+              <report>report-only</report>
+              <report>failsafe-report-only</report>
+            </reports>
+          </reportSet>
+        </reportSets>
+      </plugin>
+
+      <!-- Generates a report with the test coverages -->
+      <plugin>
+        <groupId>org.jacoco</groupId>
+        <artifactId>jacoco-maven-plugin</artifactId>
+        <version>0.7.9</version>
+        <reportSets>
+          <reportSet>
+            <reports>
+              <report>report</report>
+              <report>report-integration</report>
+            </reports>
+          </reportSet>
+        </reportSets>
+      </plugin>
+
+      <!-- Generates a report with the SonarQube analysis reports -->
+      <plugin>
+        <groupId>org.codehaus.sonar-plugins</groupId>
+        <artifactId>maven-report</artifactId>
+        <version>0.1</version>
+      </plugin>
+
+      <!-- Generate the JavaDoc API documentation -->
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-javadoc-plugin</artifactId>
+        <version>3.0.0-M1</version><!-- was 2.10.4 -->
+        <reportSets>
+          <reportSet>
+            <id>non-aggregate</id>
+            <reports>
+              <report>javadoc-no-fork</report>
+              <report>test-javadoc-no-fork</report>
+            </reports>
+          </reportSet>
+          <!-- Generate an aggregate report only in the root -->
+          <!-- Disabled this as this runs before the build of the modules and the java7 and android modules javadocs
+          require the java8 versions being built first -->
+          <!--reportSet>
+            <id>aggregate</id>
+            <inherited>false</inherited>
+            <reports>
+              <report>aggregate</report>
+            </reports>
+          </reportSet-->
+        </reportSets>
+        <!-- hmm... configuration is having no effect for 'mvn javadoc:aggregate'
+          only for 'mvn site'
+         -->
+        <configuration>
+          <windowtitle>${project.name} (incubating) v${project.version} API</windowtitle>
+          <doctitle>${project.name} (incubating) v${project.version} API</doctitle>
+          <overview>${basedir}/edgent_overview.html</overview>
+          <!-- Exclude
+            o.a.e.test.*               don't want showing up in Other Packages
+            o.a.e.oplet.core.mbeans    there are no classes and it shows up in Low-Level Packages
+            o.a.e.connectors.*.runtime it's impl not API
+                sigh, maven seems to really only support '*' at the beginning or end.
+                (what about '**' ?)
+                When in the middle like above it's causing an empty, hence omitted,
+                Connectors group (it's like excluding o.a.e.connectors.*)
+                and o.e.e.runtime.* is being omitted from Other Packages
+                (it's like excluding *.runtime).
+                So we have to enumerate each connector runtime exclusion.
+            o.a.e.javax.websocket      it's impl not API
+            o.a.e.console.*            it's impl not API
+            o.a.e.analytics.math3.utils.Java7Helper   it's impl not API
+            o.a.e.analytics.sensors.utils.Java7Helper it's impl not API
+           -->
+          <excludePackageNames>
+            org.apache.edgent.test.*:org.apache.edgent.oplet.core.mbeans:org.apache.edgent.console.*:org.apache.edgent.analytics.math3.utils.Java7Helper:org.apache.edgent.analytics.sensors.utils.Java7Helper:*.connectors.command.runtime:*.connectors.file.runtime:*.connectors.http.runtime:*.connectors.iotp.runtime:*.connectors.jdbc.runtime:*.connectors.kafka.runtime:*.connectors.mqtt.runtime:*.connectors.runtime:*.connectors.wsclient.javax.websocket.runtime:org.apache.edgent.javax.websocket
+          </excludePackageNames>
+          <groups>
+            <group>
+              <title>Edgent Providers</title>
+              <packages>org.apache.edgent.providers.*</packages>
+            </group>
+            <group>
+              <title>Edgent API</title>
+              <packages>
+                org.apache.edgent.execution:org.apache.edgent.function:org.apache.edgent.topology:org.apache.edgent.topology.json:org.apache.edgent.topology.mbeans:org.apache.edgent.topology.plumbing:org.apache.edgent.topology.services:org.apache.edgent.execution.*
+              </packages>
+            </group>
+            <group>
+              <title>Edgent Analytics</title>
+              <packages>org.apache.edgent.analytics.*</packages>
+            </group>
+            <group>
+              <title>Edgent Connectors</title>
+              <packages>org.apache.edgent.connectors.*</packages>
+            </group>
+            <group>
+              <title>Edgent Utilities</title>
+              <packages>
+                org.apache.edgent.metrics:org.apache.edgent.metrics.*:org.apache.edgent.streamscope:org.apache.edgent.streamscope.*
+              </packages>
+            </group>
+            <group>
+              <title>Edgent Tester</title>
+              <packages>org.apache.edgent.topology.tester:org.apache.edgent.topology.tester.*</packages>
+            </group>
+            <group>
+              <title>Edgent Low-Level API</title>
+              <packages>
+                org.apache.edgent.graph:org.apache.edgent.graph.*:org.apache.edgent.oplet:org.apache.edgent.oplet.*:org.apache.edgent.window
+              </packages>
+            </group>
+            <group>
+              <title>Edgent SPI</title>
+              <packages>org.apache.edgent.topology.spi:org.apache.edgent.topology.spi.*</packages>
+            </group>
+            <!-- everything else is automatically added to a "Other Packages" group -->
+          </groups>
+        </configuration>
+      </plugin>
+    </plugins>
+  </reporting>
+
+  <profiles>
+    <profile>
+      <!-- configure -Pdistribution to include our binary distribution projects. -->
+      <id>distribution</id>
+      <modules>
+        <module>distribution</module>
+      </modules>
+    </profile>
+    <profile>
+      <!-- configure -Papache-release source release bundle processing -->
+      <id>apache-release</id>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-assembly-plugin</artifactId>
+            <executions>
+              <execution>
+                <id>source-release-assembly</id>
+                <phase>package</phase>
+                <goals>
+                  <goal>single</goal>
+                </goals>
+                <!-- heads up: combine.self in the following is highlighted
+                    as an error in Eclipse's xml editor view.
+                    Just ignore that.
+                    See  https://issues.apache.org/jira/browse/MNG-5454  sigh.
+                 -->
+                <configuration combine.self="override">
+                  <runOnlyAtExecutionRoot>true</runOnlyAtExecutionRoot>
+                  <descriptors>
+                    <descriptor>src/assembly/source-release.xml</descriptor>
+                  </descriptors>
+                  <tarLongFileMode>gnu</tarLongFileMode>
+                  <finalName>apache-edgent-${project.version}-incubating</finalName>
+                </configuration>
+              </execution>
+            </executions>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+  </profiles>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+      <version>${slf4j.version}</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>io.dropwizard.metrics</groupId>
+      <artifactId>metrics-core</artifactId>
+      <version>3.1.2</version>
+      <exclusions>
+        <exclusion>
+          <groupId>org.slf4j</groupId>
+          <artifactId>slf4j-api</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>4.12</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-jdk14</artifactId>
+      <version>${slf4j.version}</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+  <repositories>
+    <repository>
+      <id>apache-release</id>
+      <url>https://repository.apache.org/content/repositories/releases</url>
+      <releases>
+        <enabled>true</enabled>
+      </releases>
+      <snapshots>
+        <enabled>false</enabled>
+      </snapshots>
+    </repository>
+    <repository>
+      <id>apache-snapshots</id>
+      <url>https://repository.apache.org/content/repositories/snapshots</url>
+      <releases>
+        <enabled>false</enabled>
+      </releases>
+      <snapshots>
+        <enabled>true</enabled>
+      </snapshots>
+    </repository>
+  </repositories>
+
+  <pluginRepositories>
+    <pluginRepository>
+      <id>apache-plugins-release</id>
+      <url>https://repository.apache.org/content/repositories/releases</url>
+      <releases>
+        <enabled>true</enabled>
+      </releases>
+      <snapshots>
+        <enabled>false</enabled>
+      </snapshots>
+    </pluginRepository>
+    <pluginRepository>
+      <id>apache-plugins-snapshots</id>
+      <url>https://repository.apache.org/content/repositories/snapshots</url>
+      <releases>
+        <enabled>false</enabled>
+      </releases>
+      <snapshots>
+        <enabled>true</enabled>
+      </snapshots>
+    </pluginRepository>
+  </pluginRepositories>
+
+</project>
diff --git a/providers/.classpath b/providers/.classpath
deleted file mode 100644
index 0b27a0d..0000000
--- a/providers/.classpath
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="development/src/main/java"/>
-	<classpathentry kind="src" path="development/src/test/java"/>
-	<classpathentry kind="src" path="direct/src/main/java"/>
-	<classpathentry kind="src" path="direct/src/test/java"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/api"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/ext"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/runtime"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/spi"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/utils"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/console"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/providers/.gitignore b/providers/.gitignore
deleted file mode 100644
index 948fe44..0000000
--- a/providers/.gitignore
+++ /dev/null
@@ -1,5 +0,0 @@
-/classes/
-**/test.classes/
-**/classes/
-**/unittests/
-/bin/
diff --git a/providers/.project b/providers/.project
deleted file mode 100644
index 3691b13..0000000
--- a/providers/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>providers</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/providers/README.md b/providers/README.md
index d512df1..d7b8ab3 100644
--- a/providers/README.md
+++ b/providers/README.md
@@ -1 +1,19 @@
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
 embedded contains a TopologyProvider that directly builds an executable graph.
\ No newline at end of file
diff --git a/providers/development/build.gradle b/providers/development/build.gradle
deleted file mode 100644
index a7b9879..0000000
--- a/providers/development/build.gradle
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-dependencies {
-  addTargetDirProjectJarDependency 'compile', ':providers:direct'
-  addTargetDirProjectJarDependency 'compile', ':console:server'
-  addTargetDirProjectJarDependency 'compile', ':utils:metrics'
-  addTargetDirProjectJarDependency 'compile', ':utils:streamscope'
-  addTargetDirProjectJarDependency 'compile', ':runtime:jmxcontrol'
-
-  // N.B. root project adds test common dependencies
-}
-
-addCompileTestDependencies ':api:topology', ':utils:streamscope'
diff --git a/providers/development/pom.xml b/providers/development/pom.xml
new file mode 100644
index 0000000..e109de6
--- /dev/null
+++ b/providers/development/pom.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-providers</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-providers-development</artifactId>
+
+  <name>Apache Edgent (Java 8): Providers: Development</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-console-server</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-utils-metrics</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-utils-streamscope</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-runtime-jmxcontrol</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-utils-streamscope</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/providers/direct/build.gradle b/providers/direct/build.gradle
deleted file mode 100644
index 2994a8b..0000000
--- a/providers/direct/build.gradle
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-dependencies {
-  addTargetDirProjectJarDependency 'compile', ':api:topology'
-  addTargetDirProjectJarDependency 'compile', ':spi:topology'
-  addTargetDirProjectJarDependency 'compile', ':spi:graph'
-  addTargetDirProjectJarDependency 'compile', ':runtime:appservice'
-  addTargetDirProjectJarDependency 'compile', ':runtime:etiao'
-  addTargetDirProjectJarDependency 'compile', ':runtime:jsoncontrol'
-  addTargetDirCoreExtJarDependencies 'compile'
-
-  addTargetDirProjectJarDependency 'testCompile', ':utils:metrics'
-  // N.B. root project adds test common dependencies
-}
-
-addCompileTestDependencies ':api:topology', ':utils:metrics', ':runtime:appservice'
diff --git a/providers/direct/pom.xml b/providers/direct/pom.xml
new file mode 100644
index 0000000..0996730
--- /dev/null
+++ b/providers/direct/pom.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-providers</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-providers-direct</artifactId>
+
+  <name>Apache Edgent (Java 8): Providers: Direct</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>pre-integration-test</phase>
+            <goals>
+              <goal>copy</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>edgent-test-appservice-applications</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/test-resources</outputDirectory>
+                  <destFileName>test-appservice-applications.jar</destFileName>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-spi-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-spi-graph</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-runtime-appservice</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-runtime-etiao</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-runtime-jsoncontrol</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-utils-metrics</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-utils-metrics</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/providers/direct/src/test/java/org/apache/edgent/test/providers/direct/DirectJobTest.java b/providers/direct/src/test/java/org/apache/edgent/test/providers/direct/DirectJobTest.java
index 8b8a605..4617b91 100644
--- a/providers/direct/src/test/java/org/apache/edgent/test/providers/direct/DirectJobTest.java
+++ b/providers/direct/src/test/java/org/apache/edgent/test/providers/direct/DirectJobTest.java
@@ -37,7 +37,6 @@
 import org.apache.edgent.oplet.core.PeriodicSource;
 import org.apache.edgent.oplet.core.Pipe;
 import org.apache.edgent.providers.direct.DirectProvider;
-import org.apache.edgent.test.topology.TopologyAbstractTest;
 import org.apache.edgent.topology.TStream;
 import org.apache.edgent.topology.Topology;
 import org.junit.Test;
diff --git a/providers/direct/src/test/java/org/apache/edgent/test/providers/direct/DirectTopologyTestBase.java b/providers/direct/src/test/java/org/apache/edgent/test/providers/direct/DirectTopologyTestBase.java
index bef74f0..f87b563 100644
--- a/providers/direct/src/test/java/org/apache/edgent/test/providers/direct/DirectTopologyTestBase.java
+++ b/providers/direct/src/test/java/org/apache/edgent/test/providers/direct/DirectTopologyTestBase.java
@@ -1,3 +1,21 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
 package org.apache.edgent.test.providers.direct;
 
 import org.apache.edgent.execution.Job;
diff --git a/providers/direct/src/test/java/org/apache/edgent/test/providers/direct/appservice/AppServiceTest.java b/providers/direct/src/test/java/org/apache/edgent/test/providers/direct/appservice/AppServiceIT.java
similarity index 86%
rename from providers/direct/src/test/java/org/apache/edgent/test/providers/direct/appservice/AppServiceTest.java
rename to providers/direct/src/test/java/org/apache/edgent/test/providers/direct/appservice/AppServiceIT.java
index 8c88bef..3cbe505 100644
--- a/providers/direct/src/test/java/org/apache/edgent/test/providers/direct/appservice/AppServiceTest.java
+++ b/providers/direct/src/test/java/org/apache/edgent/test/providers/direct/appservice/AppServiceIT.java
@@ -30,7 +30,7 @@
 import org.apache.edgent.topology.services.ApplicationService;
 import org.junit.Test;
 
-public class AppServiceTest {
+public class AppServiceIT {
     
     
     @Test
@@ -65,24 +65,33 @@
         
         appService.registerTopology("", (t,c) -> t.strings("a"));      
     }
-    
+
     @Test
     public void testRegisterJar() throws Exception {
         DirectProvider direct = new DirectProvider();
         ApplicationService appService = AppService.createAndRegister(direct, direct);
-        
-        String qd = System.getProperty("edgent.test.root.dir");
-        assertNotNull(qd);
-        File testAppsJar = new File(qd, "api/topology/build/lib/test/edgent.api.topology.APPS.TEST.jar");
+
+        // Make sure the applications haven't been available before registering the jar.
+        assertEquals(0, appService.getApplicationNames().size());
+
+        File testAppsJar = getServerJar();
+        assertNotNull(testAppsJar);
         assertTrue(testAppsJar.exists());
-        
+        System.out.println("Using server jar at: " + testAppsJar.toString());
+
         URL testAppsJarURL = testAppsJar.toURI().toURL();
 
         appService.registerJar(testAppsJarURL.toExternalForm(), null);
-        
+
+        System.out.println(appService.getApplicationNames());
         assertEquals(3, appService.getApplicationNames().size());
         assertTrue(appService.getApplicationNames().contains("FirstJarApp"));
         assertTrue(appService.getApplicationNames().contains("SecondJarApp"));
         assertTrue(appService.getApplicationNames().contains("ThirdJarApp"));  
     }
+
+    private File getServerJar() {
+        return new File("target/test-resources/test-appservice-applications.jar");
+    }
+
 }
diff --git a/providers/iot/.classpath b/providers/iot/.classpath
deleted file mode 100644
index 8b39d38..0000000
--- a/providers/iot/.classpath
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src/main/java"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/connectors"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/providers"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/api"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/ext"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/spi"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/runtime"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/apps"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/providers/iot/.gitignore b/providers/iot/.gitignore
deleted file mode 100644
index ae3c172..0000000
--- a/providers/iot/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/bin/
diff --git a/providers/iot/.project b/providers/iot/.project
deleted file mode 100644
index 1d8b2b3..0000000
--- a/providers/iot/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>provider_iot</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/providers/iot/build.gradle b/providers/iot/build.gradle
deleted file mode 100644
index 75548ac..0000000
--- a/providers/iot/build.gradle
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-dependencies {
-  addTargetDirProjectJarDependency 'compile', ':providers:direct'
-  addTargetDirProjectJarDependency 'compile', ':runtime:jsoncontrol'
-  addTargetDirProjectJarDependency 'compile', ':runtime:appservice'
-  addTargetDirProjectJarDependency 'compile', ':connectors:iot'
-  addTargetDirProjectJarDependency 'compile', ':connectors:pubsub'
-  addTargetDirProjectJarDependency 'compile', ':apps:iot'
-  addTargetDirProjectJarDependency 'compile', ':apps:runtime'
-
-  // N.B. root project adds test common dependencies
-}
-
-addCompileTestDependencies ':api:topology'
diff --git a/providers/iot/pom.xml b/providers/iot/pom.xml
new file mode 100644
index 0000000..7668f6e
--- /dev/null
+++ b/providers/iot/pom.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-providers</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-providers-iot</artifactId>
+
+  <name>Apache Edgent (Java 8): Providers: IoT</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-runtime-jsoncontrol</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-runtime-appservice</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-connectors-iot</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-connectors-pubsub</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-apps-iot</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-apps-runtime</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/providers/iot/src/main/java/org/apache/edgent/providers/iot/IotProvider.java b/providers/iot/src/main/java/org/apache/edgent/providers/iot/IotProvider.java
index 4ebdcca..6f3017d 100644
--- a/providers/iot/src/main/java/org/apache/edgent/providers/iot/IotProvider.java
+++ b/providers/iot/src/main/java/org/apache/edgent/providers/iot/IotProvider.java
@@ -131,7 +131,7 @@
  * class MyApp implements TopologyBuilder {  // be loadable by registerJar()
  *   &#64;Override
  *   public BiConsumer&lt;Topology t, JsonConfig c&gt; getBuilder() {
- *     return (t, c) -> buildTopology(IotDevicePubSub.addIotDevice(t), c);
+ *     return (t, c) -&gt; buildTopology(IotDevicePubSub.addIotDevice(t), c);
  *   }
  *   private void buildTopology(IotDevice iotDevice, JsonConfig c) {
  *     Topology t = iotDevice.getTopology();
diff --git a/providers/pom.xml b/providers/pom.xml
new file mode 100644
index 0000000..a08d910
--- /dev/null
+++ b/providers/pom.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-parent</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-providers</artifactId>
+  <packaging>pom</packaging>
+
+  <name>Apache Edgent (Java 8): Providers</name>
+
+  <modules>
+    <module>development</module>
+    <module>direct</module>
+    <module>iot</module>
+  </modules>
+
+</project>
diff --git a/runtime/.classpath b/runtime/.classpath
deleted file mode 100644
index 5274a6a..0000000
--- a/runtime/.classpath
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="appservice/src/main/java"/>
-	<classpathentry kind="src" path="jobregistry/src/main/java"/>
-	<classpathentry kind="src" path="jobregistry/src/test/java"/>
-	<classpathentry kind="src" path="etiao/src/main/java"/>
-	<classpathentry kind="src" path="etiao/src/test/java"/>
-	<classpathentry kind="src" path="jmxcontrol/src/main/java"/>
-	<classpathentry kind="src" path="jmxcontrol/src/test/java"/>
-	<classpathentry kind="src" path="jsoncontrol/src/main/java"/>
-	<classpathentry kind="src" path="jsoncontrol/src/test/java"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/api"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/ext"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/spi"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/runtime/.gitignore b/runtime/.gitignore
deleted file mode 100644
index 948fe44..0000000
--- a/runtime/.gitignore
+++ /dev/null
@@ -1,5 +0,0 @@
-/classes/
-**/test.classes/
-**/classes/
-**/unittests/
-/bin/
diff --git a/runtime/.project b/runtime/.project
deleted file mode 100644
index 91c0089..0000000
--- a/runtime/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>runtime</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/runtime/appservice/build.gradle b/runtime/appservice/build.gradle
deleted file mode 100644
index af0d4c1..0000000
--- a/runtime/appservice/build.gradle
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-dependencies {
-  addTargetDirProjectJarDependency 'compile', ':api:execution'
-  addTargetDirProjectJarDependency 'compile', ':api:topology'
-  addTargetDirCoreExtJarDependencies 'compile'
-
-  // N.B. root project adds test common dependencies
-}
diff --git a/runtime/appservice/pom.xml b/runtime/appservice/pom.xml
new file mode 100644
index 0000000..c304d57
--- /dev/null
+++ b/runtime/appservice/pom.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-runtime</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-runtime-appservice</artifactId>
+
+  <name>Apache Edgent (Java 8): Runtime: AppService</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-execution</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+
+    <!-- Just needed to make sure it is scheduled before this module in the reactor -->
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-test-appservice-applications</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/runtime/etiao/build.gradle b/runtime/etiao/build.gradle
deleted file mode 100644
index c9153c2..0000000
--- a/runtime/etiao/build.gradle
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-dependencies {
-  addTargetDirProjectJarDependency 'compile', ':api:execution'
-  addTargetDirProjectJarDependency 'compile', ':api:graph'
-  addTargetDirProjectJarDependency 'compile', ':spi:graph'
-  addTargetDirCoreExtJarDependencies 'compile'
-
-  // N.B. root project adds test common dependencies
-}
-
-addCompileTestDependencies ':api:graph'
diff --git a/runtime/etiao/pom.xml b/runtime/etiao/pom.xml
new file mode 100644
index 0000000..161a2af
--- /dev/null
+++ b/runtime/etiao/pom.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-runtime</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-runtime-etiao</artifactId>
+
+  <name>Apache Edgent (Java 8): Runtime: Etiao</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-execution</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-graph</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-spi-graph</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-graph</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/runtime/etiao/src/main/java/org/apache/edgent/runtime/etiao/Executable.java b/runtime/etiao/src/main/java/org/apache/edgent/runtime/etiao/Executable.java
index 2d3eefd..46c7de0 100644
--- a/runtime/etiao/src/main/java/org/apache/edgent/runtime/etiao/Executable.java
+++ b/runtime/etiao/src/main/java/org/apache/edgent/runtime/etiao/Executable.java
@@ -206,6 +206,16 @@
             logger.warn("Scheduler could not finish {} tasks", unfinished.size());
         }
     }
+    
+    private static long getTimeoutValue(long timeout, TimeUnit units) {
+        // try to protect the tests from timing out prematurely
+        // in the face of overloaded/slow build/test servers.
+        if (Boolean.getBoolean("edgent.build.ci")) {
+            // could do something like base the decision of the current value of timeout and/or units
+            return timeout * 2; // try to minimize
+        }
+        return timeout;
+    }
 
     private void invokeAction(Consumer<Invocation<?, ?, ?>> action) {
         ExecutorCompletionService<Boolean> completer = new ExecutorCompletionService<>(controlScheduler);
@@ -216,13 +226,18 @@
             });
         }
 
+        long getFutureTimeout = 10;
+        TimeUnit getFutureTimeoutUnits = TimeUnit.SECONDS;
+        getFutureTimeout = getTimeoutValue(getFutureTimeout, getFutureTimeoutUnits);
+        
         int remainingTasks = invocations.size();
         while (remainingTasks > 0) {
             try {
-                Future<Boolean> completed = completer.poll(10, TimeUnit.SECONDS);
+                Future<Boolean> completed = completer.poll(getFutureTimeout, getFutureTimeoutUnits);
                 if (completed == null) {
                     // TODO during close log exception and wait on the next task to complete
-                    throw new RuntimeException(new TimeoutException());
+                    throw new RuntimeException(new TimeoutException(
+                            String.format("%d%s timeout", getFutureTimeout, getFutureTimeoutUnits.toString())));
                 }
                 else {
                     try {
diff --git a/runtime/etiao/src/main/java/org/apache/edgent/runtime/etiao/TrackingScheduledExecutor.java b/runtime/etiao/src/main/java/org/apache/edgent/runtime/etiao/TrackingScheduledExecutor.java
index c4dc44d..fef4105 100644
--- a/runtime/etiao/src/main/java/org/apache/edgent/runtime/etiao/TrackingScheduledExecutor.java
+++ b/runtime/etiao/src/main/java/org/apache/edgent/runtime/etiao/TrackingScheduledExecutor.java
@@ -117,11 +117,32 @@
 
     private int cancelAllAsyncTasks(boolean mayInterruptIfRunning) {
         int notCanceled = 0;
+        // follow the iterator access pattern doc'd by Collections:synchronizedSet()
         synchronized (asyncTasks) {
-            for (RunnableScheduledFuture<?> task : asyncTasks) {
+            // hmm have gotten CMEs here with testMultiTopologyPollWithError.
+            // This seems to follow the required access pattern for synchronized collection iterator.
+            // But obviously something's amiss.  There seem to be only a few other
+            // asyncTasks modifiers:
+            //    trackTask() - add
+            //    hasActiveTasks() - iterates while synchronized and can remove
+            //    removeTrack() - remove
+            // Just to make things iron clad, synch the add and remove too
+            // hmm... got another CME even after mods to the above.
+            //   java.util.ConcurrentModificationException
+            //   at java.util.HashMap$HashIterator.nextNode(HashMap.java:1437)
+            //   at java.util.HashMap$KeyIterator.next(HashMap.java:1461)
+            //   at: for (RunnableScheduledFuture<?> task : asyncTasks)
+//            for (RunnableScheduledFuture<?> task : asyncTasks) {
+//                if (!task.cancel(mayInterruptIfRunning))
+//                    notCanceled++;
+//            }
+            Iterator<RunnableScheduledFuture<?>> i = asyncTasks.iterator();
+            while (i.hasNext()) {
+                RunnableScheduledFuture<?> task = i.next();
                 if (!task.cancel(mayInterruptIfRunning))
                     notCanceled++;
             }
+
             // remove tasks which are done
             hasActiveTasks();
         }
@@ -134,7 +155,7 @@
      */
     private <V> RunnableScheduledFuture<V> trackTask(RunnableScheduledFuture<V> task) {
         task = new TrackedFuture<V>(task);
-        asyncTasks.add(task);
+        synchronized(asyncTasks) { asyncTasks.add(task); } // see cancelAllAsyncTasks
         return task;
     }
 
@@ -214,7 +235,7 @@
          * the scheduler seems to have no work.
          */
         private void removeTrack() {
-            asyncTasks.remove(this);
+            synchronized(asyncTasks) { asyncTasks.remove(this); } // see cancelAllAsyncTasks
 
             // Notify the completer if the following is true:
             // no asyncTasks (user tasks) pending, or the executor's task 
diff --git a/runtime/jmxcontrol/build.gradle b/runtime/jmxcontrol/build.gradle
deleted file mode 100644
index 2e5ded3..0000000
--- a/runtime/jmxcontrol/build.gradle
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-dependencies {
-  addTargetDirProjectJarDependency 'compile', ':api:execution'
-  addTargetDirProjectJarDependency 'compile', ':api:function'
-  addTargetDirCoreExtJarDependencies 'compile'
-
-  // N.B. root project adds test common dependencies
-}
diff --git a/runtime/jmxcontrol/pom.xml b/runtime/jmxcontrol/pom.xml
new file mode 100644
index 0000000..ce18e88
--- /dev/null
+++ b/runtime/jmxcontrol/pom.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-runtime</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-runtime-jmxcontrol</artifactId>
+
+  <name>Apache Edgent (Java 8): Runtime: JMXControl</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-execution</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-function</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/runtime/jobregistry/build.gradle b/runtime/jobregistry/build.gradle
deleted file mode 100644
index af0d4c1..0000000
--- a/runtime/jobregistry/build.gradle
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-dependencies {
-  addTargetDirProjectJarDependency 'compile', ':api:execution'
-  addTargetDirProjectJarDependency 'compile', ':api:topology'
-  addTargetDirCoreExtJarDependencies 'compile'
-
-  // N.B. root project adds test common dependencies
-}
diff --git a/runtime/jobregistry/pom.xml b/runtime/jobregistry/pom.xml
new file mode 100644
index 0000000..c4a22ee
--- /dev/null
+++ b/runtime/jobregistry/pom.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-runtime</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-runtime-jobregistry</artifactId>
+
+  <name>Apache Edgent (Java 8): Runtime: JobRegistry</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-execution</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/runtime/jsoncontrol/build.gradle b/runtime/jsoncontrol/build.gradle
deleted file mode 100644
index 2e5ded3..0000000
--- a/runtime/jsoncontrol/build.gradle
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-dependencies {
-  addTargetDirProjectJarDependency 'compile', ':api:execution'
-  addTargetDirProjectJarDependency 'compile', ':api:function'
-  addTargetDirCoreExtJarDependencies 'compile'
-
-  // N.B. root project adds test common dependencies
-}
diff --git a/runtime/jsoncontrol/pom.xml b/runtime/jsoncontrol/pom.xml
new file mode 100644
index 0000000..8ccd3a2
--- /dev/null
+++ b/runtime/jsoncontrol/pom.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-runtime</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-runtime-jsoncontrol</artifactId>
+
+  <name>Apache Edgent (Java 8): Runtime: JSONControl</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-execution</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-function</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/runtime/pom.xml b/runtime/pom.xml
new file mode 100644
index 0000000..5c42b55
--- /dev/null
+++ b/runtime/pom.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-parent</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-runtime</artifactId>
+  <packaging>pom</packaging>
+
+  <name>Apache Edgent (Java 8): Runtime</name>
+
+  <modules>
+    <module>appservice</module>
+    <module>etiao</module>
+    <module>jmxcontrol</module>
+    <module>jobregistry</module>
+    <module>jsoncontrol</module>
+  </modules>
+
+</project>
diff --git a/samples/.classpath b/samples/.classpath
deleted file mode 100644
index 2922346..0000000
--- a/samples/.classpath
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="apps/src/main/java"/>
-	<classpathentry kind="src" path="connectors/src/main/java"/>
-	<classpathentry kind="src" path="console/src/main/java"/>
-	<classpathentry excluding="org/apache/edgent/samples/scenarios/iotp/range/sensor/" kind="src" path="scenarios/src/main/java"/>
-	<classpathentry kind="src" path="topology/src/main/java"/>
-	<classpathentry kind="src" path="utils/src/main/java"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/analytics"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/api"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/connectors"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/console"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/ext"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/providers"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/spi"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/utils"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/runtime"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/provider_iot"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/apps"/>
-    <classpathentry kind="lib" path="../externalJars/java8/connectors/iotp/ext/watson-iot-0.2.2.jar"/>
-    <classpathentry kind="lib" path="../externalJars/java8/connectors/iotp/ext/org.eclipse.paho.client.mqttv3-1.1.0.jar"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/samples/.gitignore b/samples/.gitignore
deleted file mode 100644
index 948fe44..0000000
--- a/samples/.gitignore
+++ /dev/null
@@ -1,5 +0,0 @@
-/classes/
-**/test.classes/
-**/classes/
-**/unittests/
-/bin/
diff --git a/samples/.project b/samples/.project
deleted file mode 100644
index 883815e..0000000
--- a/samples/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>samples</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/samples/README.md b/samples/README.md
deleted file mode 100644
index d7ad8fd..0000000
--- a/samples/README.md
+++ /dev/null
@@ -1 +0,0 @@
-Samples for the embedded streams API.
diff --git a/samples/apps/build.gradle b/samples/apps/build.gradle
deleted file mode 100644
index b94804b..0000000
--- a/samples/apps/build.gradle
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-dependencies {
-  // N.B. common dependencies are set in root build.gradle
-
-  addTargetDirProjectJarDependency 'compile', ':connectors:mqtt'
-  addTargetDirProjectJarDependency 'compile', ':connectors:file'
-  addTargetDirProjectJarDependency 'compile', ':connectors:serial'
-  addTargetDirProjectJarDependency 'compile', ':analytics:math3'
-  addTargetDirProjectJarDependency 'compile', ':analytics:sensors'
-  addTargetDirProjectJarDependency 'compile', ':samples:utils'
-
-  // N.B. root project adds test common dependencies
-}
diff --git a/samples/apps/src/main/java/org/apache/edgent/samples/apps/AbstractApplication.java b/samples/apps/src/main/java/org/apache/edgent/samples/apps/AbstractApplication.java
deleted file mode 100644
index 10099dd..0000000
--- a/samples/apps/src/main/java/org/apache/edgent/samples/apps/AbstractApplication.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.apps;
-
-import java.io.File;
-import java.nio.file.Files;
-import java.util.Properties;
-
-import org.apache.edgent.console.server.HttpServer;
-import org.apache.edgent.providers.direct.DirectProvider;
-import org.apache.edgent.samples.apps.mqtt.AbstractMqttApplication;
-import org.apache.edgent.topology.Topology;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * An Application base class.
- * <p>
- * Application instances need to:
- * <ul>
- * <li>define an implementation for {@link #buildTopology(Topology)}</li>
- * <li>call {@link #run()} to build and submit the topology for execution.</li>
- * </ul>
- * <p>
- * The class provides some common processing needs:
- * <ul>
- * <li>Support for an external configuration file</li>
- * <li>Provides a {@link TopologyProviderFactory}</li>
- * <li>Provides a {@link ApplicationUtilities}</li>
- * </ul>
- * @see AbstractMqttApplication
- */
-public abstract class AbstractApplication {
-    
-    protected final String propsPath;
-    protected final Properties props;
-    private final ApplicationUtilities applicationUtilities;
-    private static final Logger logger = LoggerFactory.getLogger(AbstractApplication.class);
-
-    protected Topology t;
-    
-    public AbstractApplication(String propsPath) throws Exception {
-        this.propsPath = propsPath;
-        props = new Properties();
-        props.load(Files.newBufferedReader(new File(propsPath).toPath()));
-        applicationUtilities = new ApplicationUtilities(props);
-    }
-    
-    /**
-     * Construct and run the application's topology.
-     * @throws Exception on failure
-     */
-    protected void run() throws Exception {
-// TODO need to setup logging to squelch stderr output from the runtime/connectors, 
-// including paho output
-
-        TopologyProviderFactory tpFactory = new TopologyProviderFactory(props);
-        
-        DirectProvider tp = tpFactory.newProvider();
-        
-        // Create a topology for the application
-        t = tp.newTopology(config().getProperty("application.name"));
-        
-        preBuildTopology(t);
-        
-        buildTopology(t);
-        
-        // Run the topology
-        HttpServer httpServer = tp.getServices().getService(HttpServer.class);
-        if (httpServer != null) {
-            System.out.println("Edgent Console URL for the job: "
-                                + httpServer.getConsoleUrl());
-        }
-        tp.submit(t);
-    }
-    
-    /**
-     * Get the application's raw configuration information.
-     * @return the configuration
-     */
-    public Properties config() {
-        return props;
-    }
-    
-    /**
-     * Get the application's 
-     * @return the helper
-     */
-    public ApplicationUtilities utils() {
-        return applicationUtilities;
-    }
-
-    /**
-     * A hook for a subclass to do things prior to the invocation
-     * of {@link #buildTopology(Topology)}.
-     * <p>
-     * The default implementation is a no-op.
-     * @param t the application's topology
-     */
-    protected void preBuildTopology(Topology t) {
-        return;
-    }
-    
-    /**
-     * Build the application's topology.
-     * @param t Topology to add to
-     */
-    abstract protected void buildTopology(Topology t);
-    
-    public void handleRuntimeError(String msg, Exception e) {
-        logger.error("A runtime error occurred", e);
-    }
-
-}
diff --git a/samples/apps/src/main/java/org/apache/edgent/samples/apps/ApplicationUtilities.java b/samples/apps/src/main/java/org/apache/edgent/samples/apps/ApplicationUtilities.java
deleted file mode 100644
index b8a0cee..0000000
--- a/samples/apps/src/main/java/org/apache/edgent/samples/apps/ApplicationUtilities.java
+++ /dev/null
@@ -1,255 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.apps;
-
-import java.io.File;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.Properties;
-import java.util.Set;
-
-import org.apache.edgent.analytics.sensors.Range;
-import org.apache.edgent.analytics.sensors.Ranges;
-import org.apache.edgent.connectors.file.FileStreams;
-import org.apache.edgent.connectors.file.FileWriterCycleConfig;
-import org.apache.edgent.connectors.file.FileWriterFlushConfig;
-import org.apache.edgent.connectors.file.FileWriterPolicy;
-import org.apache.edgent.connectors.file.FileWriterRetentionConfig;
-import org.apache.edgent.function.Predicate;
-import org.apache.edgent.function.Supplier;
-import org.apache.edgent.topology.TStream;
-
-/**
- * Some general purpose application configuration driven utilities.
- * <p>
- * Utilities include:
- * <ul>
- * <li>Get a property name for a sensor configuration item</li>
- * <li>Get a Range value for a sensor range item</li>
- * <li>Log a stream</li>
- * <li>Conditionally trace a stream</li>
- * </ul>
- */
-public class ApplicationUtilities {
-    
-    private final Properties props;
-    
-    public ApplicationUtilities(Properties props) {
-        this.props = props;
-    }
-
-    private Properties config() {
-        return props;
-    }
-    
-    /**
-     * Trace a stream to System.out if the sensor id's "label" has been configured
-     * to enable tracing.
-     * <p>
-     * If tracing has not been enabled in the config, the topology will not
-     * be augmented to trace the stream.
-     *
-     * @param <T> Tuple type
-     * @param stream the stream to trace
-     * @param sensorId the sensor id
-     * @param label some unique label
-     * @return the input stream
-     */
-    public <T> TStream<T> traceStream(TStream<T> stream, String sensorId, Supplier<String> label) {
-        return traceStream(stream, () -> sensorId+"."+label.get());
-    }
-
-    /**
-     * Trace a stream to System.out if the "label" has been configured
-     * to enable tracing.
-     * <p>
-     * If tracing has not been enabled in the config, the topology will not
-     * be augmented to trace the stream.
-     * 
-     * @param <T> Tuple type
-     * @param stream the stream to trace
-     * @param label some unique label
-     * @return the input stream
-     */
-    public <T> TStream<T> traceStream(TStream<T> stream, Supplier<String> label) {
-        if (includeTraceStreamOps(label.get())) {
-            TStream<?> s = stream.filter(traceTuplesFn(label.get())).tag(label.get()+".trace");
-            s.peek(sample -> System.out.println(String.format("%s: %s", label.get(), sample.toString())));
-        }
-        return stream;
-    }
-    
-    private boolean includeTraceStreamOps(String label) {
-        String includesCsv = config().getProperty("stream.tracing.includes.csv", "");
-        String includesRegex = config().getProperty("stream.tracing.includes.regex", "");
-        String excludesCsv = config().getProperty("stream.tracing.excludes.csv", "");
-        String excludesRegex = config().getProperty("stream.tracing.excludes.regex", "");
-        
-        Set<String> includesSet = new HashSet<>();
-        for (String s : includesCsv.split(","))
-            includesSet.add(s.trim());
-        Set<String> excludesSet = new HashSet<>();
-        for (String s : excludesCsv.split(","))
-            excludesSet.add(s.trim());
-        
-        boolean isIncluded = false;
-        if (includesSet.contains(label) || label.matches(includesRegex))
-            isIncluded = true;
-        if (excludesSet.contains(label) || label.matches(excludesRegex))
-            isIncluded = false;
-        
-        return isIncluded;
-    }
-    
-    private <T> Predicate<T> traceTuplesFn(String label) {
-        return tuple -> true; // TODO make dynamic config; affected by "label" value
-        // check label for match against csv or regex from props
-    }
-    
-    /**
-     * Get the property name for a sensor's configuration item.
-     * @param sensorId the sensor's id
-     * @param label the label for an instance of "kind" (e.g., "tempThreshold")
-     * @param kind the kind of configuration item (e.g., "range")
-     * @return the configuration property name
-     */
-    public String getSensorPropertyName(String sensorId, String label, String kind) {
-        String name = kind + "." + label;  // kind.label
-        if (sensorId!=null && !sensorId.isEmpty())
-            name = sensorId + "." + name;  // sensorId.kind.label
-        return name;
-    }
-
-    private String getSensorConfigValue(String sensorId, String label, String kind) {
-        String name = getSensorPropertyName(sensorId, label, kind);
-        String val = config().getProperty(name);
-        if (val==null)
-            throw new IllegalArgumentException("Missing configuration property "+name);
-        return val;
-    }
-    
-    /**
-     * Get the Range for a sensor range configuration item.
-     * @param sensorId the sensor's id
-     * @param label the range's label
-     * @return the Range
-     */
-    public Range<Integer> getRangeInteger(String sensorId, String label) {
-        String val = getSensorConfigValue(sensorId, label, "range");
-        return Ranges.valueOfInteger(val);
-    }
-    
-    /**
-     * Get the Range for a sensor range configuration item.
-     * @param sensorId the sensor's id
-     * @param label the range's label
-     * @return the Range
-     */
-    public Range<Byte> getRangeByte(String sensorId, String label) {
-        String val = getSensorConfigValue(sensorId, label, "range");
-        return Ranges.valueOfByte(val);
-    }
-    
-    /**
-     * Get the Range for a sensor range configuration item.
-     * @param sensorId the sensor's id
-     * @param label the range's label
-     * @return the Range
-     */
-    public Range<Short> getRangeShort(String sensorId, String label) {
-        String val = getSensorConfigValue(sensorId, label, "range");
-        return Ranges.valueOfShort(val);
-    }
-    
-    /**
-     * Get the Range for a sensor range configuration item.
-     * @param sensorId the sensor's id
-     * @param label the range's label
-     * @return the Range
-     */
-    public Range<Float> getRangeFloat(String sensorId, String label) {
-        String val = getSensorConfigValue(sensorId, label, "range");
-        return Ranges.valueOfFloat(val);
-    }
-    
-    /**
-     * Get the Range for a sensor range configuration item.
-     * @param sensorId the sensor's id
-     * @param label the range's label
-     * @return the Range
-     */
-    public Range<Double> getRangeDouble(String sensorId, String label) {
-        String val = getSensorConfigValue(sensorId, label, "range");
-        return Ranges.valueOfDouble(val);
-    }
-
-    /**
-     * Log every tuple on the stream using the {@code FileStreams} connector.
-     * <p>
-     * The logs are added to the directory as specified
-     * by the "application.log.dir" property.
-     * The directory will be created as needed.
-     * <p>
-     * The "active" (open / being written) log file name is {@code .<baseName>}.
-     * <br>
-     * Completed stable logs have a name of {@code <baseName>_YYYYMMDD_HHMMSS}.
-     * <p>
-     * The log entry format being used is:
-     * {@code [<date>] [<eventTag>] <tuple>.toString()}
-     * <p>
-     * See {@link FileStreams#textFileWriter(TStream, org.apache.edgent.function.Supplier, org.apache.edgent.function.Supplier)}
-     * 
-     * @param <T> Tuple type
-     * @param stream the TStream
-     * @param baseName the base log name
-     * @param eventTag a tag that gets added to the log entry
-     * @return the input stream
-     */
-    public <T> TStream<T> logStream(TStream<T> stream, String eventTag, String baseName) {
-        // Define the writer policy.
-        // TODO could make the policy configurable via config()
-        FileWriterPolicy<String> policy = new FileWriterPolicy<String>(
-                FileWriterFlushConfig.newTimeBasedConfig(2_000/*msec*/), // flush every 2sec
-                FileWriterCycleConfig.newFileSizeBasedConfig(10_000),  // new file every 10KB
-                FileWriterRetentionConfig.newFileCountBasedConfig(1)   // retain 1 file
-                );
-        
-        // Compose the base file pathname
-        File dir = new File(config().getProperty("application.log.dir"));
-        String basePathname = new File(dir, baseName).toString();
-         
-        // Transform the stream to a TStream<String> of string log entry values
-        TStream<String> stringEntries = stream.map(sample -> String.format("[%s] [%s] %s", new Date().toString(), eventTag, sample.toString()))
-                .tag(baseName+".log");
-
-        // Use the FileStreams connector to write the logs.
-        //
-        // A hack for getting the log directories created at runtime
-        // TODO add another policy thing... or simply make textFileWriter do it?
-        //
-        FileStreams.textFileWriter(stringEntries,
-                () -> { if (!dir.exists()) dir.mkdirs();
-                        return basePathname;
-                      },
-                () -> policy);
-        
-        return stream;
-    }
-
-}
diff --git a/samples/apps/src/main/java/org/apache/edgent/samples/apps/JsonTuples.java b/samples/apps/src/main/java/org/apache/edgent/samples/apps/JsonTuples.java
deleted file mode 100644
index 0c231c8..0000000
--- a/samples/apps/src/main/java/org/apache/edgent/samples/apps/JsonTuples.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.apps;
-
-import static org.apache.edgent.analytics.math3.stat.Statistic.MAX;
-import static org.apache.edgent.analytics.math3.stat.Statistic.MEAN;
-import static org.apache.edgent.analytics.math3.stat.Statistic.MIN;
-import static org.apache.edgent.analytics.math3.stat.Statistic.STDDEV;
-
-import java.util.List;
-
-import org.apache.commons.math3.util.Pair;
-import org.apache.edgent.analytics.math3.json.JsonAnalytics;
-import org.apache.edgent.analytics.math3.stat.Statistic;
-import org.apache.edgent.function.BiFunction;
-import org.apache.edgent.function.Function;
-import org.apache.edgent.topology.TStream;
-
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-
-/**
- * Utilties to ease working working with sensor "samples" by wrapping them
- * in JsonObjects.
- * <p>
- * The Json Tuple sensor "samples" have a standard collection of properties.
- */
-public class JsonTuples {
-        
-    /*
-     * Common attributes in the JsonObject
-     */
-    public static final String KEY_ID = "id";
-    public static final String KEY_TS = "msec";
-    public static final String KEY_READING = "reading";
-    public static final String KEY_AGG_BEGIN_TS = "agg.begin.msec";
-    public static final String KEY_AGG_COUNT = "agg.count";
-    
-    /**
-     * Create a JsonObject wrapping a raw {@code Pair<Long msec,T reading>>} sample.
-     * @param <T> Tuple type
-     * @param sample the raw sample
-     * @param id the sensor's Id
-     * @return the wrapped sample
-     */
-    public static <T> JsonObject wrap(Pair<Long,T> sample, String id) {
-        JsonObject jo = new JsonObject();
-        jo.addProperty(KEY_ID, id);
-        jo.addProperty(KEY_TS, sample.getFirst());
-        T value = sample.getSecond();
-        if (value instanceof Number)
-            jo.addProperty(KEY_READING, (Number)sample.getSecond());
-        else if (value instanceof String)
-            jo.addProperty(KEY_READING, (String)sample.getSecond());
-        else if (value instanceof Boolean)
-            jo.addProperty(KEY_READING, (Boolean)sample.getSecond());
-//        else if (value instanceof array) {
-//            // TODO cvt to JsonArray
-//        }
-//        else if (value instanceof Object) {
-//            // TODO cvt to JsonObject
-//        }
-        else {
-            Class<?> clazz = value != null ? value.getClass() : Object.class;
-            throw new IllegalArgumentException("Unhandled value type: "+ clazz);
-        }
-        return jo;
-    }
-    
-    /**
-     * Create a stream of JsonObject wrapping a stream of 
-     * raw {@code Pair<Long msec,T reading>>} samples.
-     *
-     * @param <T> Tuple type
-     * @param stream the raw input stream
-     * @param id the sensor's Id
-     * @return the wrapped stream
-     */
-    public static <T> TStream<JsonObject> wrap(TStream<Pair<Long,T>> stream, String id) {
-        return stream.map(pair -> wrap(pair, id));
-    }
-    
-    /**
-     * The partition key function for wrapped sensor samples.
-     * <p>
-     * The {@code KEY_ID} property is returned for the key.
-     * @return the function
-     */
-    public static Function<JsonObject,String> keyFn() {
-        return sample -> sample.get(KEY_ID).getAsString();
-    }
-    
-    
-    /**
-     * Get a statistic value from a sample.
-     * <p>
-     * Same as {@code getStatistic(jo, JsonTuples.KEY_READING, stat)}.
-     * 
-     * @param jo the sample
-     * @param stat the Statistic of interest
-     * @return the JsonElement for the Statistic
-     * @throws RuntimeException of the stat isn't present
-     */
-    public static JsonElement getStatistic(JsonObject jo, Statistic stat) {
-        return getStatistic(jo, JsonTuples.KEY_READING, stat);
-    }
-    
-    /**
-     * Get a statistic value from a sample.
-     * <p>
-     * Convenience for working with samples containing a property
-     * whose value is one or more {@link Statistic}
-     * as created by 
-     * {@link JsonAnalytics#aggregate(org.apache.edgent.topology.TWindow, String, String, org.apache.edgent.analytics.math3.json.JsonUnivariateAggregate...) JsonAnalytics.aggregate()}
-     * 
-     * @param jo the sample
-     * @param valueKey the name of the property containing the JsonObject of Statistics
-     * @param stat the Statistic of interest
-     * @return the JsonElement for the Statistic
-     * @throws RuntimeException of the stat isn't present
-     */
-    public static JsonElement getStatistic(JsonObject jo, String valueKey, Statistic stat) {
-        JsonObject statsjo = jo.get(valueKey).getAsJsonObject();
-        return statsjo.get(stat.name());
-    }
-
-    /**
-     * Create a function that computes the specified statistics on the list of
-     * samples and returns a new sample containing the result.
-     * <p>
-     * The single tuple contains the specified statistics computed over
-     * all of the {@code JsonTuple.KEY_READING} 
-     * values from {@code List<JsonObject>}.
-     * <p>
-     * The resulting sample contains the properties:
-     * <ul>
-     * <li>JsonTuple.KEY_ID</li>
-     * <li>JsonTuple.KEY_MSEC - msecTimestamp of the last sample in the window</li>
-     * <li>JsonTuple.KEY_AGG_BEGIN_MSEC - msecTimestamp of the first sample in the window</li>
-     * <li>JsonTuple.KEY_AGG_COUNT - number of samples in the window ({@code value=factor})</li>
-     * <li>JsonTuple.KEY_READING - a JsonObject of the statistics
-     *                      as defined by
-     *                     {@link JsonAnalytics#aggregate(org.apache.edgent.topology.TWindow, String, String, org.apache.edgent.analytics.math3.json.JsonUnivariateAggregate...) JsonAnalytics.aggregate()}
-     * </ul>
-     * <p>
-     * Sample use:
-     * <pre>{@code
-     * TStream<JsonObject> s = ...
-     * // reduce s by a factor of 100 with stats MEAN and STDEV 
-     * TStream<JsonObject> reduced = s.batch(100, statistics(Statistic.MEAN, Statistic.STDDEV));
-     * }</pre>
-     * 
-     * @param statistics the statistics to calculate over the window
-     * @return {@code TStream<JsonObject>} for the reduced {@code stream}
-     */
-    public static BiFunction<List<JsonObject>,String,JsonObject> statistics(Statistic... statistics) {
-        BiFunction<List<JsonObject>,JsonElement,JsonObject> statsFn = 
-                JsonAnalytics.aggregateList(KEY_ID, KEY_READING,
-                    j -> j.get(KEY_READING).getAsDouble(), 
-                    MIN, MAX, MEAN, STDDEV);
-
-        return (samples, key) -> {
-                    JsonObject jo = statsFn.apply(samples, samples.get(0).get(KEY_ID));
-                    JsonTuples.addAggStdInfo(jo, samples);
-                    return jo;
-                };
-    }
-
-    private static void addAggStdInfo(JsonObject jo, List<JsonObject> samples) {
-        // beginMsec, endMsec, nSamples
-        long msec = samples.get(0).get(KEY_TS).getAsLong();
-        long msec2 = samples.get(samples.size()-1).get(KEY_TS).getAsLong();
-        int nSamples = samples.size();
-        
-        jo.addProperty(KEY_TS, msec2);
-        jo.addProperty(KEY_AGG_BEGIN_TS, msec);
-        jo.addProperty(KEY_AGG_COUNT, nSamples);
-    }
-
-}
diff --git a/samples/apps/src/main/java/org/apache/edgent/samples/apps/TopologyProviderFactory.java b/samples/apps/src/main/java/org/apache/edgent/samples/apps/TopologyProviderFactory.java
deleted file mode 100644
index 1128fcb..0000000
--- a/samples/apps/src/main/java/org/apache/edgent/samples/apps/TopologyProviderFactory.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.apps;
-
-import java.util.Properties;
-
-import org.apache.edgent.providers.direct.DirectProvider;
-
-/**
- * A configuration driven factory for an Edgent topology provider.
- */
-public class TopologyProviderFactory {
-    private final Properties props;
-    
-    /**
-     * Construct a factory
-     * @param props configuration information.
-     */
-    public TopologyProviderFactory(Properties props) {
-        this.props = props;
-    }
-    
-    /**
-     * Get a new topology provider.
-     * <p>
-     * The default provider is {@code org.apache.edgent.providers.direct.DirectProvider}.
-     * <p>
-     * The {@code topology.provider} configuration property can specify
-     * an alternative.
-     * 
-     * @return the provider
-     * @throws Exception if the provider couldn't be created
-     */
-    public DirectProvider newProvider() throws Exception {
-        String name = props.getProperty("topology.provider", "org.apache.edgent.providers.direct.DirectProvider");
-        Class<?> clazz = null;
-        try {
-            clazz = Class.forName(name);
-        }
-        catch (ClassNotFoundException e) {
-            String msg = "Class not found: "+e.getLocalizedMessage();
-            System.err.println(msg);
-            throw new IllegalStateException(msg);
-        }
-        return (DirectProvider) clazz.newInstance();
-    }
-}
diff --git a/samples/apps/src/main/java/org/apache/edgent/samples/apps/applicationTemplate.properties b/samples/apps/src/main/java/org/apache/edgent/samples/apps/applicationTemplate.properties
deleted file mode 100644
index c45d3db..0000000
--- a/samples/apps/src/main/java/org/apache/edgent/samples/apps/applicationTemplate.properties
+++ /dev/null
@@ -1,81 +0,0 @@
-# A template file for Application Configuration properties
-#
-# The default Edgent topology provider is DirectProvider
-#topology.provider=org.apache.edgent.providers.development.DevelopmentProvider
-#
-application.name=MyAnalytics
-#
-
-# =========================================================================
-# Application stream logging configuration
-# Where the app puts its stream logs.  
-# The directory will be created when the topology
-# runs if it doesn't already exist.
-application.log.dir=/tmp/MyAnalytics/logs
-
-# =========================================================================
-# Application "ranges" - e.g., for threshold detections
-# Specify values generated by Range.toString():
-#  <lowerBoundType><lowerBound>..<upperBound><upperBoundType>
-#  where
-#      lowerBoundType is "[" inclusive or "(" exclusive
-#      upperBoundType is "]" inclusive or ")" exclusive
-#      lowerBound or upperBound is "*" for open ranges,
-#         e.g., [*..50]  for "atMost" 50
-#
-sensor1.range.outside1hzMeanRange=[124..129]
-
-# =========================================================================
-# MQTT Device and Connector configuration info.
-#
-# MQTT Device -- See org.apache.edgent.connectors.mqtt.device.MqttDevice for all
-# of the properties.
-#
-# An optional topic prefix.  It can be used to isolate users or applications
-# in shared MQTT broker configurations.  By default it is incorporated
-# into device topics and the MQTT clientId.
-# If you use a public MQTT broker you may want to change the topic
-# prefix so it is still unique for you but doesn't include the
-# user name or application name.
-mqttDevice.topic.prefix=ibm.xyzzy-streams.samples/user/{user.name}/{application.name}/
-#
-# The device id used for identifying the device's events and commands
-# in the MQTT topic namespace.
-# By default it also gets incorporated into the MQTT clientId value.
-mqttDevice.id=012345
-#
-# The MQTT clientId.  Only one instance of a MqttDevice can connect
-# to the MQTT broker with a given clientId.
-#mqttDevice.mqtt.clientId={mqttDevice.topic.prefix}id/{mqttDevice.id}
-#
-# MQTT Connector  See org.apache.edgent.connectors.mqtt.MqttConfig.fromProperties()
-#
-# The default configuration is for a local MQTT broker.
-# See mosquitto.org for instructions on downloading a MQTT broker.
-# Or use some other MQTT broker available in your environment.
-mqtt.serverURLs=tcp://localhost:1883
-#
-# Alternatively, there are some public MQTT brokers available to experiment with.
-# Their availability status isn't guaranteed.  If you're unable to connect
-# to the broker, it's likely that it isn't up or your firewalls don't
-# allow you to connect.  DO NOT PUBLISH ANYTHING SENSITIVE - anyone
-# can be listing.
-#mqtt.serverURLs=tcp://iot.eclipse.org:1883
-#mqtt.serverURLs=tcp://test.mosquitto.org:1883
-#
-#mqtt.userName=xyzzy
-#mqtt.password=myMosquittoPw
-
-# =========================================================================
-# Patterns for identifying which streams to trace to System.out
-# To enable use include.csv and/or includes.regex.
-# To exclude an otherwise included file, use excludes.csv and/or excludes.regex
-#
-# Some tracing labels
-# sensor1.raw1khz,sensor1.j1khz,sensor1.j1hzStats,sensor1.outside1hzMeanRange*,
-# sensor1.periodicLastN*
-#
-#stream.tracing.includes.csv=sensor1.j1hzStats
-stream.tracing.includes.regex=sensor1.outside1hzMeanRange.*
-#stream.tracing.excludes.regex=.*
-#stream.tracing.excludes.csv=sensor1.raw1khz
diff --git a/samples/apps/src/main/java/org/apache/edgent/samples/apps/mqtt/AbstractMqttApplication.java b/samples/apps/src/main/java/org/apache/edgent/samples/apps/mqtt/AbstractMqttApplication.java
deleted file mode 100644
index 6bd943a..0000000
--- a/samples/apps/src/main/java/org/apache/edgent/samples/apps/mqtt/AbstractMqttApplication.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.apps.mqtt;
-
-import static org.apache.edgent.connectors.iot.IotDevice.CMD_PAYLOAD;
-
-import java.util.Arrays;
-
-import org.apache.edgent.connectors.mqtt.iot.MqttDevice;
-import org.apache.edgent.samples.apps.AbstractApplication;
-import org.apache.edgent.samples.apps.ApplicationUtilities;
-import org.apache.edgent.samples.apps.TopologyProviderFactory;
-import org.apache.edgent.topology.Topology;
-
-import com.google.gson.JsonObject;
-
-/**
- * An MQTT Application base class.
- * <p>
- * Application instances need to:
- * <ul>
- * <li>define an implementation for {@link #buildTopology(Topology)}</li>
- * <li>call {@link #run()} to build and submit the topology for execution.</li>
- * </ul>
- * <p>
- * The class provides some common processing needs:
- * <ul>
- * <li>Support for an external configuration file</li>
- * <li>Provides a {@link TopologyProviderFactory}</li>
- * <li>Provides a {@link ApplicationUtilities}</li>
- * <li>Provides a {@link MqttDevice}</li>
- * </ul>
- */
-public abstract class AbstractMqttApplication extends AbstractApplication {
-    
-    private MqttDevice mqttDevice;
-    
-    public AbstractMqttApplication(String propsPath) throws Exception {
-        super(propsPath);
-    }
-    
-    @Override
-    protected void preBuildTopology(Topology t) {
-        // Add an MQTT device communication manager to the topology
-        updateTopicPrefix();
-        mqttDevice = new MqttDevice(t, props);
-        System.out.println("MqttDevice serverURLs " + Arrays.toString(mqttDevice.getMqttConfig().getServerURLs()));
-        System.out.println("MqttDevice clientId " + mqttDevice.getMqttConfig().getClientId());
-        System.out.println("MqttDevice deviceId " + props.getProperty("mqttDevice.id"));
-        System.out.println("MqttDevice event topic pattern " + mqttDevice.eventTopic(null));
-        System.out.println("MqttDevice command topic pattern " + mqttDevice.commandTopic(null));
-    }
-    
-    /**
-     * Get the application's MqttDevice
-     * @return the MqttDevice
-     */
-    public MqttDevice mqttDevice() {
-        return mqttDevice;
-    }
-    
-    private void updateTopicPrefix() {
-        String val = props.getProperty("mqttDevice.topic.prefix");
-        if (val != null) {
-            val = val.replace("{user.name}", System.getProperty("user.name"));
-            val = val.replace("{application.name}", props.getProperty("application.name"));
-            props.setProperty("mqttDevice.topic.prefix", val);
-        }
-    }
-    
-    /**
-     * Compose a MqttDevice eventId for the sensor.
-     * @param sensorId the sensor id
-     * @param eventId the sensor's eventId
-     * @return the device eventId
-     */
-    public String sensorEventId(String sensorId, String eventId) {
-        return sensorId + "." + eventId;
-    }
-    
-    /**
-     * Compose a MqttDevice commandId for the sensor
-     * @param sensorId the sensor id
-     * @param commandId the sensor's commandId
-     * @return the device commandId
-     */
-    public String commandId(String sensorId, String commandId) {
-        return sensorId + "." + commandId;
-    }
-    
-    /**
-     * Extract a simple string valued command arg 
-     * from a {@link MqttDevice#commands(String...)} returned
-     * JsonObject tuple.
-     * <p>
-     * Interpret the JsonObject's embedded payload as a JsonObject with a single
-     * "value" property.
-     * @param jo the command tuple.
-     * @return the command's argument value 
-     */
-    public String getCommandValueString(JsonObject jo) {
-        return jo.get(CMD_PAYLOAD).getAsJsonObject().get("value").getAsString();
-    }
-
-}
diff --git a/samples/apps/src/main/java/org/apache/edgent/samples/apps/mqtt/DeviceCommsApp.java b/samples/apps/src/main/java/org/apache/edgent/samples/apps/mqtt/DeviceCommsApp.java
deleted file mode 100644
index 70deaa4..0000000
--- a/samples/apps/src/main/java/org/apache/edgent/samples/apps/mqtt/DeviceCommsApp.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.apps.mqtt;
-
-import org.apache.edgent.connectors.iot.QoS;
-import org.apache.edgent.connectors.mqtt.MqttStreams;
-import org.apache.edgent.topology.TStream;
-import org.apache.edgent.topology.Topology;
-import org.apache.edgent.topology.json.JsonFunctions;
-
-import com.google.gson.JsonObject;
-
-/**
- * An MQTT Device Communications client for watching device events
- * and sending commands.
- * <p>
- * This is an "application properties" aware client that gets MQTT configuration
- * from an Edgent sample app application configuration properties file.
- * <p>
- * This client avoids the need for other MQTT clients (e.g., from a mosquitto
- * installation) to observe and control the applications.
- */
-public class DeviceCommsApp extends AbstractMqttApplication {
-    
-    private static final String usage = "Usage: watch | send <cmdLabel> <cmdArg>";
-
-    private String mode;
-    private String cmdLabel;
-    private String cmdArg;
-    
-    public static void main(String[] args) throws Exception {
-        if (args.length < 1)
-            throw new Exception("missing pathname to application properties file");
-        
-        try {
-            int i = 0;
-            DeviceCommsApp application = new DeviceCommsApp(args[i++]);
-            String mode = args[i++];
-            if (!("watch".equals(mode) || "send".equals(mode))) {
-                throw new IllegalArgumentException("Unsupport mode: "+application.mode);
-            }
-            application.mode = mode;
-            if (application.mode.equals("send")) {
-                application.cmdLabel = args[i++];
-                application.cmdArg = args[i++];
-            }
-        
-            application.run();
-        }
-        catch (IllegalArgumentException | IndexOutOfBoundsException e) {
-            throw new IllegalArgumentException(e.getMessage()
-                    +"\n"+usage);
-        }
-    }
-    
-    /**
-     * Create an application instance.
-     * @param propsPath pathname to an application configuration file
-     * @throws Exception
-     */
-    DeviceCommsApp(String propsPath) throws Exception {
-        super(propsPath);
-    }
-    
-    @Override
-    protected void buildTopology(Topology t) {
-        mqttDevice().getMqttConfig().setClientId(null);
-        MqttStreams mqtt = new MqttStreams(t, () -> mqttDevice().getMqttConfig());
-        if (mode.equals("send")) {
-            String topic = mqttDevice().commandTopic(cmdLabel);
-            JsonObject jo = new JsonObject();
-            jo.addProperty("value", cmdArg);
-            System.out.println("Publishing command: topic="+topic+"  value="+jo);
-            TStream<String> cmd = t.strings(JsonFunctions.asString().apply(jo));
-            mqtt.publish(cmd, topic, QoS.FIRE_AND_FORGET, false/*retain*/);
-            // Hmm... the paho MQTT *non-daemon* threads prevent the app
-            // from exiting after returning from main() following job submit().
-            // Lacking MqttStreams.shutdown() or such...
-            // Delay a bit and then explicitly exit().  Ugh.
-            cmd.sink(tuple -> { 
-                try {
-                    Thread.sleep(3*1000);
-                } catch (Exception e) { }
-                System.exit(0); });
-        }
-        else if (mode.equals("watch")) {
-            String topicFilter = mqttDevice().eventTopic(null);
-            System.out.println("Watching topic filter "+topicFilter);
-            TStream<String> events = mqtt.subscribe(topicFilter, QoS.FIRE_AND_FORGET,
-                    (topic,payload) -> { 
-                        String s = "\n# topic "+topic;
-                        s += "\n" + new String(payload);
-                        return s;
-                    });
-            events.print();
-        }
-    }
-}
diff --git a/samples/apps/src/main/java/org/apache/edgent/samples/apps/mqtt/package-info.java b/samples/apps/src/main/java/org/apache/edgent/samples/apps/mqtt/package-info.java
deleted file mode 100644
index 54598cb..0000000
--- a/samples/apps/src/main/java/org/apache/edgent/samples/apps/mqtt/package-info.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-/**
- * Base support for Edgent MQTT based application samples.
- * <p>
- * This package builds on {@code org.apache.edgent.samples.apps} providing
- * additional common capabilities in the area of MQTT based device appliations.
- */
-package org.apache.edgent.samples.apps.mqtt;
\ No newline at end of file
diff --git a/samples/apps/src/main/java/org/apache/edgent/samples/apps/package-info.java b/samples/apps/src/main/java/org/apache/edgent/samples/apps/package-info.java
deleted file mode 100644
index cf62ba2..0000000
--- a/samples/apps/src/main/java/org/apache/edgent/samples/apps/package-info.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-/**
- * Support for some more complex Edgent application samples.
- * <p>
- * This package provides some commonly needed capabilities particularly in
- * the area of an external configuration description influence on various
- * things.
- * <p>
- * Focal areas:
- * <ul>
- * <li>{@link org.apache.edgent.samples.apps.AbstractApplication} - a base class for
- *     Edgent applications providing commonly needed features.
- *     </li>
- * <li>{@link org.apache.edgent.samples.apps.TopologyProviderFactory} - a configuration
- *     driven factory for an Edgent topology provider.
- *     </li>
- * <li>{@link org.apache.edgent.samples.apps.ApplicationUtilities} - some
- *     general configuration driven utilities. 
- *     </li>
- * <li>{@link org.apache.edgent.samples.apps.JsonTuples} - utilities for wrapping
- *     sensor samples in a JsonObject and operating on it.
- *     </li>
- * </ul>
- */
-package org.apache.edgent.samples.apps;
\ No newline at end of file
diff --git a/samples/apps/src/main/java/org/apache/edgent/samples/apps/sensorAnalytics/Sensor1.java b/samples/apps/src/main/java/org/apache/edgent/samples/apps/sensorAnalytics/Sensor1.java
deleted file mode 100644
index bdad9f4..0000000
--- a/samples/apps/src/main/java/org/apache/edgent/samples/apps/sensorAnalytics/Sensor1.java
+++ /dev/null
@@ -1,286 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.apps.sensorAnalytics;
-
-import static org.apache.edgent.analytics.math3.stat.Statistic.MAX;
-import static org.apache.edgent.analytics.math3.stat.Statistic.MEAN;
-import static org.apache.edgent.analytics.math3.stat.Statistic.MIN;
-import static org.apache.edgent.analytics.math3.stat.Statistic.STDDEV;
-import static org.apache.edgent.samples.apps.JsonTuples.KEY_ID;
-import static org.apache.edgent.samples.apps.JsonTuples.KEY_READING;
-import static org.apache.edgent.samples.apps.JsonTuples.KEY_TS;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicReference;
-
-import org.apache.commons.math3.util.Pair;
-import org.apache.edgent.analytics.sensors.Range;
-import org.apache.edgent.analytics.sensors.Ranges;
-import org.apache.edgent.connectors.iot.QoS;
-import org.apache.edgent.function.Supplier;
-import org.apache.edgent.samples.apps.JsonTuples;
-import org.apache.edgent.samples.utils.sensor.PeriodicRandomSensor;
-import org.apache.edgent.topology.TStream;
-import org.apache.edgent.topology.Topology;
-import org.apache.edgent.topology.plumbing.PlumbingStreams;
-
-import com.google.gson.JsonArray;
-import com.google.gson.JsonObject;
-
-/**
- * Analytics for "Sensor1".
- * <p>
- * This sample demonstrates some common continuous sensor analytic themes.
- * <p>
- * In this case we have a simulated sensor producing 1000 samples per second
- * of an integer type in the range of 0-255.
- * <p>
- * The processing pipeline created is roughly:
- * <ul>
- * <li>Batched Data Reduction - reduce the sensor's 1000 samples per second
- *     down to 1 sample per second simple statistical aggregation of the readings.
- *     </li>
- * <li>Compute historical information - each 1hz sample is augmented
- *     with a 30 second trailing average of the 1hz readings.
- *     </li>
- * <li>Threshold detection - each 1hz sample's value is compared
- *     against a target range and outliers are identified.
- *     </li>
- * <li>Local logging - outliers are logged to a local file
- *     </li>
- * <li>Publishing results to a MQTT broker:
- *     <ul>
- *     <li>when enabled, invdividual outliers are published.</li>
- *     <li>Every 30 seconds a list of the last 10 outliers is published.</li>
- *     </ul>
- *     </li>
- * </ul>
- * <p>
- * The sample also demonstrates:
- * <ul>
- * <li>Dynamic configuration control - subscribe to a MQTT broker
- *     to receive commands to adjust the threshold detection range value. 
- *     </li>
- * <li>Generally, the configuration of the processing is driven via an
- *     external configuration description.
- *     </li>
- * <li>Conditional stream tracing - configuration controlled inclusion of tracing.
- *     </li>
- * <li>Use of {@link TStream#tag(String...)} to improve information provided by
- *     the Edgent DevelopmentProvider console.</li>
- * </ul>
- */
-public class Sensor1 {
-    private final SensorAnalyticsApplication app;
-    private final Topology t;
-    private final String sensorId = "sensor1";
-
-    public Sensor1(Topology t, SensorAnalyticsApplication app) {
-        this.t = t;
-        this.app = app;
-    }
-    
-    /**
-     * Add the sensor's analytics to the topology.
-     */
-    public void addAnalytics() {
-
-        // Need synchronization for set/get of dynamically changeable values.
-        AtomicReference<Range<Integer>> range = new AtomicReference<>();
-        AtomicReference<Boolean> isPublish1hzOutsideRange = new AtomicReference<>();
-        
-        // Initialize the controls
-        range.set(app.utils().getRangeInteger(sensorId, "outside1hzMeanRange"));
-        isPublish1hzOutsideRange.set(false);
-        
-        // Handle the sensor's device commands
-        app.mqttDevice().commands(commandId("set1hzMeanRangeThreshold"))
-            .tag(commandId("set1hzMeanRangeThresholdCmd"))
-            .sink(jo -> {
-                    Range<Integer> newRange = Ranges.valueOfInteger(getCommandValue(jo));
-                    System.out.println("===== Changing range to "+newRange+" ======");
-                    range.set(newRange);
-                });
-        app.mqttDevice().commands(commandId("setPublish1hzOutsideRange"))
-            .tag(commandId("setPublish1hzOutsideRangeCmd"))
-            .sink(jo -> {
-                    Boolean b = new Boolean(getCommandValue(jo));
-                    System.out.println("===== Changing isPublish1hzOutsideRange to "+b+" ======");
-                    isPublish1hzOutsideRange.set(b);
-                });
-        
-        // Create a raw simulated sensor stream of 1000 tuples/sec.
-        // Each tuple is Pair<Long timestampMsec, sensor-reading (0..255)>.
-        PeriodicRandomSensor simulatedSensorFactory = new PeriodicRandomSensor();
-        TStream<Pair<Long,Integer>> raw1khz = 
-                simulatedSensorFactory.newInteger(t, 1/*periodMsec*/, 255)
-                .tag("raw1khz");
-        traceStream(raw1khz, "raw1khz");
-        
-        // Wrap the raw sensor reading in a JsonObject for convenience.
-        TStream<JsonObject> j1khz = JsonTuples.wrap(raw1khz, sensorId)
-                .tag("j1khz");
-        traceStream(j1khz, "j1khz");
-        
-        // Data-reduction: reduce 1khz samples down to
-        // 1hz aggregate statistics samples.
-        TStream<JsonObject> j1hzStats = j1khz.last(1000, JsonTuples.keyFn())
-                .batch(JsonTuples.statistics(MIN, MAX, MEAN, STDDEV))
-                .tag("1hzStats");
-        
-        // Create a 30 second sliding window of average trailing Mean values
-        // and enrich samples with that information.
-        j1hzStats = j1hzStats.last(30, JsonTuples.keyFn()).aggregate(
-            (samples, key) -> {
-                // enrich and return the most recently added tuple
-                JsonObject jo = samples.get(samples.size()-1);
-                double meanSum = 0;
-                for (JsonObject js : samples) {
-                    meanSum += JsonTuples.getStatistic(js, MEAN).getAsDouble();
-                }
-                jo.addProperty("AvgTrailingMean", Math.round(meanSum / samples.size()));
-                jo.addProperty("AvgTrailingMeanCnt", samples.size());
-                return jo;
-            })
-            .tag("1hzStats.enriched");
-        traceStream(j1hzStats, "j1hzStats");
-
-        // Detect 1hz samples whose MEAN value are
-        // outside the configuration specified range.
-        TStream<JsonObject> outside1hzMeanRange = j1hzStats.filter(
-                sample -> {
-                    int value = JsonTuples.getStatistic(sample, MEAN).getAsInt();
-                    return !range.get().contains(value);
-                })
-                .tag("outside1hzMeanRange");
-        traceStream(outside1hzMeanRange, () -> "outside1hzMeanRange"+range.get()); 
-        
-        // Log every outside1hzMeanRange event
-        app.utils().logStream(outside1hzMeanRange, "ALERT", "outside1hzMeanRange");
-        
-        // Conditionally publish every outside1hzMeanRange event.
-        // Use a pressureReliever to prevent backpressure if the broker
-        // can't be contacted.
-        // TODO enhance MqttDevice with configurable reliever. 
-        app.mqttDevice().events(
-                PlumbingStreams.pressureReliever(
-                    outside1hzMeanRange.filter(tuple -> isPublish1hzOutsideRange.get())
-                                       .tag("outside1hzMeanRangeEvent.conditional"),
-                    tuple -> 0, 30).tag("outside1hzMeanRangeEvent.pressureRelieved"),
-                app.sensorEventId(sensorId, "outside1hzMeanRangeEvent"), QoS.FIRE_AND_FORGET);
-        
-        // Demonstrate periodic publishing of a sliding window if
-        // something changed since it was last published.
-        periodicallyPublishLastNInfo(outside1hzMeanRange, 10, 30,
-                "periodicLastOutsideRangeEvent");
-        
-        // TODO histogram: #alerts over the last 8hr
-
-    }
-    
-    /**
-     * Periodically publish the lastN on a stream.
-     * @param stream tuples to 
-     * @param count sliding window size "lastN"
-     * @param nSec publish frequency
-     * @param event sensor's publish event label
-     */
-    private void periodicallyPublishLastNInfo(TStream<JsonObject> stream, 
-            int count, int nSec, String event) {
-
-        // Demonstrate periodic publishing of a sliding window if
-        // something changed since it was last published.
-
-        // Maintain a sliding window of the last N tuples.
-        // TODO today, windows don't provide "anytime" access to their collection
-        // so maintain our own current copy of the collection that we can
-        // access it when needed.
-        // 
-        List<JsonObject> lastN = Collections.synchronizedList(new ArrayList<>());
-        stream.last(count, JsonTuples.keyFn())
-            .aggregate((samples, key) -> samples)
-            .tag(event+".lastN")
-            .sink(samples -> {
-                    // Capture the new list/window.  
-                    synchronized(lastN) {
-                        lastN.clear();
-                        lastN.addAll(samples);
-                    }
-                });
-    
-        // Publish the lastN (with trimmed down info) every nSec seconds
-        // if anything changed since the last publish.
-        TStream<JsonObject> periodicLastN = 
-                t.poll(() -> 1, nSec, TimeUnit.SECONDS).tag(event+".trigger")
-                .filter(trigger -> !lastN.isEmpty()).tag(event+".changed")
-                .map(trigger -> {
-                    synchronized(lastN) {
-                        // create a single JsonObject with the list
-                        // of reduced-content samples
-                        JsonObject jo = new JsonObject();
-                        jo.addProperty(KEY_ID, sensorId);
-                        jo.addProperty(KEY_TS, System.currentTimeMillis());
-                        jo.addProperty("window", count);
-                        jo.addProperty("pubFreqSec", nSec);
-                        JsonArray ja = new JsonArray();
-                        jo.add("lastN", ja);
-                        for (JsonObject j : lastN) {
-                            JsonObject jo2 = new JsonObject();
-                            ja.add(jo2);
-                            jo2.add(KEY_TS, j.get(KEY_TS));
-                            // reduce size: include only 2 significant digits
-                            jo2.addProperty(KEY_READING, String.format("%.2f", 
-                                JsonTuples.getStatistic(j, MEAN).getAsDouble()));
-                        }
-                        lastN.clear();
-                        return jo;
-                    }
-                })
-                .tag(event);
-
-        traceStream(periodicLastN, event);
-
-        // Use a pressureReliever to prevent backpressure if the broker
-        // can't be contacted.
-        // TODO enhance MqttDevice with configurable reliever. 
-        app.mqttDevice().events(
-                PlumbingStreams.pressureReliever(periodicLastN, tuple -> 0, 30)
-                    .tag(event+".pressureRelieved"),
-                app.sensorEventId(sensorId, event), QoS.FIRE_AND_FORGET);
-    }
-    
-    private String commandId(String commandId) {
-        return app.commandId(sensorId, commandId);
-    }
-    
-    private String getCommandValue(JsonObject jo) {
-        return app.getCommandValueString(jo);
-    }
-    
-    private <T> TStream<T> traceStream(TStream<T> stream, String label) {
-        return traceStream(stream, () -> label); 
-    }
-    
-    private <T> TStream<T> traceStream(TStream<T> stream, Supplier<String> label) {
-        return app.utils().traceStream(stream, sensorId, label); 
-    }
-}
diff --git a/samples/apps/src/main/java/org/apache/edgent/samples/apps/sensorAnalytics/SensorAnalyticsApplication.java b/samples/apps/src/main/java/org/apache/edgent/samples/apps/sensorAnalytics/SensorAnalyticsApplication.java
deleted file mode 100644
index 061bf95..0000000
--- a/samples/apps/src/main/java/org/apache/edgent/samples/apps/sensorAnalytics/SensorAnalyticsApplication.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.apps.sensorAnalytics;
-
-import org.apache.edgent.samples.apps.mqtt.AbstractMqttApplication;
-import org.apache.edgent.topology.Topology;
-
-/**
- * A sample application demonstrating some common sensor analytic processing
- * themes.
- */
-public class SensorAnalyticsApplication extends AbstractMqttApplication {
-    
-    public static void main(String[] args) throws Exception {
-        if (args.length != 1)
-            throw new Exception("missing pathname to application properties file");
-        
-        SensorAnalyticsApplication application = new SensorAnalyticsApplication(args[0]);
-        
-        application.run();
-    }
-    
-    /**
-     * Create an application instance.
-     * @param propsPath pathname to an application configuration file
-     * @throws Exception
-     */
-    SensorAnalyticsApplication(String propsPath) throws Exception {
-        super(propsPath);
-    }
-    
-    @Override
-    protected void buildTopology(Topology t) {
-        
-        // Add the "sensor1" analytics to the topology
-        new Sensor1(t, this).addAnalytics();
-        
-        // TODO Add the "sensor2" analytics to the topology
-        // TODO Add the "sensor3" analytics to the topology
-    }
-}
diff --git a/samples/apps/src/main/java/org/apache/edgent/samples/apps/sensorAnalytics/package-info.java b/samples/apps/src/main/java/org/apache/edgent/samples/apps/sensorAnalytics/package-info.java
deleted file mode 100644
index 6ce82b6..0000000
--- a/samples/apps/src/main/java/org/apache/edgent/samples/apps/sensorAnalytics/package-info.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-/**
- * The Sensor Analytics sample application demonstrates some common 
- * continuous sensor analytic application themes.
- * See {@link org.apache.edgent.samples.apps.sensorAnalytics.Sensor1 Sensor1} for the
- * core of the analytics processing and  
- * {@link org.apache.edgent.samples.apps.sensorAnalytics.SensorAnalyticsApplication
- * SensorAnalyticsApplication}
- * for the main program.
- * <p>
- * The themes include:
- * <ul>
- * <li>Batched Data Reduction - reducing higher frequency sensor reading
- *     samples down to a lower frequency using statistical aggregations
- *     of the raw readings.
- *     </li>
- * <li>Computing continuous historical statistics such as a
- *     30 second trailing average of sensor readings.
- *     </li>
- * <li>Outlier / threshold detection against a configurable range</li>
- * <li>Local logging of stream tuples</li>
- * <li>Publishing analytic results to an MQTT broker</li>
- * <li>Dynamic configuration control - subscribing to a MQTT broker
- *     to receive commands to adjust the threshold detection range value. 
- *     </li>
- * <li>Generally, the configuration of the processing is driven via an
- *     external configuration description.
- *     </li>
- * <li>Conditional stream tracing - configuration controlled inclusion of tracing.
- *     </li>
- * </ul>
- * 
- * <h2>Prerequisites:</h2>
- * <p>
- * The default configuration is for a local MQTT broker.
- * A good resource is <a href="http://mosquitto.org">mosquitto.org</a>
- * if you want to download and setup your own MQTT broker.
- * Or you can use some other broker available in your environment.
- * <p>
- * Alternatively, there are some public MQTT brokers available to experiment with.
- * Their availability status isn't guaranteed.  If you're unable to connect
- * to the broker, it's likely that it isn't up or your firewalls don't
- * allow you to connect.  DO NOT PUBLISH ANYTHING SENSITIVE - anyone
- * can be listing.  A couple of public broker locations are noted
- * in the application's properties file.
- * <p>
- * The default {@code mqttDevice.topic.prefix} value, used by default in 
- * generated MQTT topic values and MQTT clientId, contains the user's
- * local login id.  The SensorAnalytics sample application does not have any
- * other sensitive information.
- * <p>
- * Edit {@code <edgent-release>/java8/scripts/apps/sensorAnalytics/sensoranalytics.properties}
- * to change the broker location or topic prefix.
- * 
- * <h2>Application output:</h2>
- * <p>
- * The application periodically (every 30sec), publishes a list of
- * the last 10 outliers to MQTT.  When enabled, it also publishes 
- * full details of individual outliers as they occur.
- * It also subscribes to MQTT topics for commands to dynamically change the
- * threshold range and whether to publish individual outliers.
- * <p>
- * All MQTT configuration information, including topic patterns,
- * are in the application.properties file.
- * <p>
- * The application logs outlier events in local files.  The actual location
- * is specified in the application.properties file.
- * <p>
- * The application generates some output on stdout and stderr.
- * The information includes:
- * <ul>
- * <li>MQTT device info. Lines 1 through 5 in the sample console output below.</li>
- * <li>URL for the Edgent development console.  Line 6.</li>
- * <li>Trace of the outlier event stream. Line 7.
- *     The output is a label, which includes the active threshold range,
- *     followed by the event's JSON.
- *     These are the events that will also be logged and conditionally published
- *     as well as included in the periodic lastN info published every 30sec.
- *     </li>
- * <li>Announcement when a "change threshold" or "enable publish of 1khz outliers"
- *     command is received and processed.
- *     Line 8 and 9. 
- *     </li>
- * <li>At this time some INFO trace output from the MQTT connector</li>
- * <li>At this time some INFO trace output from the File connector</li>
- * </ul>
- * Sample console output:
- * <pre>{@code
- * [1] MqttDevice serverURLs [tcp://localhost:1883]
- * [2] MqttDevice clientId id/012345
- * [3] MqttDevice deviceId 012345
- * [4] MqttDevice event topic pattern id/012345/evt/+/fmt/json
- * [5] MqttDevice command topic pattern id/012345/cmd/+/fmt/json
- * [6] Edgent Console URL for the job: http://localhost:57324/console
- * [7] sensor1.outside1hzMeanRange[124..129]: {"id":"sensor1","reading":{"N":1000,"MIN":0.0,"MAX":254.0,"MEAN":130.23200000000006,"STDDEV":75.5535473324351},"msec":1454623874408,"agg.begin.msec":1454623873410,"agg.count":1000,"AvgTrailingMean":128,"AvgTrailingMeanCnt":4}
- * ...
- * [8] ===== Changing range to [125..127] ======
- * sensor1.outside1hzMeanRange[125..127]: {"id":"sensor1","reading":{"N":1000,"MIN":0.0,"MAX":254.0,"MEAN":129.00099999999978,"STDDEV":74.3076080870567},"msec":1454624142419,"agg.begin.msec":1454624141420,"agg.count":1000,"AvgTrailingMean":127,"AvgTrailingMeanCnt":30}
- * [9] ===== Changing isPublish1hzOutsideRange to true ======
- * ...
- * }</pre>
- * 
- * <h2>Running, observing and controlling the application:</h2>
- * <pre>{@code
- * $ ./runSensorAnalytics.sh
- * }</pre>
- * <p>
- * To observe the locally logged outlier events:
- * <pre>{@code
- * $ tail -f /tmp/SensorAnalytics/logs/.outside1hzMeanRange
- * }</pre>
- * <p>
- * To observe the events that are getting published to MQTT:
- * <pre>{@code
- * $ ./runDeviceComms.sh watch
- * }</pre>
- * <p>
- * To change the outlier threshold setting:
- * <br>The command value is the new range string: {@code [<lowerBound>..<upperBound>]}.
- * <pre>{@code
- * $ ./runDeviceComms.sh send sensor1.set1hzMeanRangeThreshold "[125..127]"
- * }</pre>
- * <p>
- * To change the "publish individual 1hz outliers" control:
- * <pre>{@code
- * $ ./runDeviceComms.sh send sensor1.setPublish1hzOutsideRange true
- * }</pre>
- * 
- * <h3>Alternative MQTT clients</h3>
- * You can use any MQTT client but you will have to specify the 
- * MQTT server, the event topics to watch / subscribe to, and the command topics
- * and JSON for publish commands.  The MqttDevice output above provides most
- * of the necessary information.
- * <p>
- * For example, the {@code mosquitto_pub} and
- * {@code mosquitto_sub} commands equivalent to the above runDeviceComms.sh
- * commands are:
- * <pre>{@code
- * # Watch the device's event topics
- * $ /usr/local/bin/mosquitto_sub -t id/012345/evt/+/fmt/json
- * # change the outlier threshold setting
- * $ /usr/local/bin/mosquitto_pub -m '{"value":"[125..127]"}' -t id/012345/cmd/sensor1.set1hzMeanRangeThreshold/fmt/json
- * # change the "publish individual 1hz outliers" control
- * $ /usr/local/bin/mosquitto_pub -m '{"value":"true"}' -t id/012345/cmd/sensor1.setPublish1hzOutsideRange/fmt/json
- * }</pre>
- */
-package org.apache.edgent.samples.apps.sensorAnalytics;
diff --git a/samples/connectors/build.gradle b/samples/connectors/build.gradle
deleted file mode 100644
index 909a8e6..0000000
--- a/samples/connectors/build.gradle
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-dependencies {
-  // N.B. common dependencies are set in root build.gradle
-
-  addTargetDirProjectJarDependency 'compile', ':analytics:math3'
-  addTargetDirProjectJarDependency 'compile', ':connectors:mqtt'
-  addTargetDirProjectJarDependency 'compile', ':connectors:kafka'
-  addTargetDirProjectJarDependency 'compile', ':connectors:file'
-  addTargetDirProjectJarDependency 'compile', ':connectors:iotp'
-  addTargetDirProjectJarDependency 'compile', ':connectors:jdbc'
-  addTargetDirProjectJarDependency 'compile', ':connectors:serial'
-  addTargetDirProjectJarDependency 'compile', ':samples:topology'
-  addTargetDirProjectJarDependency 'compile', ':samples:utils'
-
-  // N.B. root project adds test common dependencies
-}
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/MsgSupplier.java b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/MsgSupplier.java
deleted file mode 100644
index 13f2b4e..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/MsgSupplier.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.connectors;
-
-import org.apache.edgent.function.Supplier;
-
-/**
- * A Supplier&lt;String&gt; for creating sample messages to publish.
- */
-public class MsgSupplier implements Supplier<String> {
-    private static final long serialVersionUID = 1L;
-    private final int maxCnt;
-    private int cnt;
-    private boolean done;
-    
-    public MsgSupplier(int maxCnt) {
-        this.maxCnt = maxCnt;
-    }
-
-    @Override
-    public synchronized String get() {
-        ++cnt;
-        if (maxCnt >= 0 && cnt >= maxCnt) {
-            if (!done) {
-                done = true;
-                System.out.println("poll: no more messages to generate.");
-            }
-            return null;
-        }
-        String msg = String.format("Message-%d from %s", cnt, Util.simpleTS());
-        System.out.println("poll generated msg to publish: " + msg);
-        return msg;
-    }
-}
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/Options.java b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/Options.java
deleted file mode 100644
index fcab5c5..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/Options.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.connectors;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.edgent.function.Function;
-
-/**
- * Simple command option processor.
- */
-public class Options {
-    private static final Map<String,Function<String,?>> handlers = new HashMap<>();
-    private static final Map<String,Object> options = new HashMap<>();
-    private static final Map<String,Object> defaults = new HashMap<>();
-    
-    public <T> void addHandler(String opt, Function<String,T> cvtFn) {
-        addHandler(opt, cvtFn, null);
-    }
-    
-    public <T> void addHandler(String opt, Function<String,T> cvtFn, T dflt) {
-        handlers.put(opt, cvtFn);
-        if (dflt != null)
-            defaults.put(opt, dflt);
-    }
-    
-    public void processArgs(String[] args) {
-        for (Map.Entry<String,Function<String,?>> e : handlers.entrySet()) {
-            handleOpt(e.getKey(), e.getValue(), args);
-        }
-
-        for (String arg : args) {
-            String[] item = arg.split("=");
-            if (!handlers.containsKey(item[0]))
-                throw new IllegalArgumentException("Unrecognized argument '"+arg+"'");
-        }
-    }
-    
-    private void handleOpt(String opt, Function<String,?> cvtFn, String[] args) {
-        String v = getArg(cvtFn!=null ? opt : opt+"=true", args);
-        if (v != null)
-            options.put(opt, cvtFn==null ? true : cvtFn.apply(v));
-        else if (defaults.get(opt) != null)
-            options.put(opt, defaults.get(opt));
-    }
-
-    public <T> T get(String opt) {
-        return get(opt, null);
-    }
-    
-    @SuppressWarnings("unchecked")
-    public <T> T get(String opt, T dflt) {
-        return options.get(opt) == null ? dflt : (T)options.get(opt); 
-    }
-    
-    public Set<Map.Entry<String,Object>> getAll() {
-        return Collections.unmodifiableSet(options.entrySet());
-    }
-    
-    public void put(String opt, Object value) {
-        options.put(opt, value);
-    }
-    
-    private String getArg(String item, String[] args) {
-        String[] itemParts = item.split("=");
-        if (itemParts.length>1)
-            item = itemParts[0];
-        for (String arg : args) {
-            String[] parts = arg.split("=");
-            if (item.equals(parts[0])) {
-                if (parts.length > 1)
-                    return parts[1];
-                else
-                    return itemParts.length > 1 ? itemParts[1] : parts[1];
-            }
-        }
-        return null;
-    }
-}
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/Util.java b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/Util.java
deleted file mode 100644
index d9803ef..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/Util.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.connectors;
-
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.edgent.execution.Job;
-
-/**
- * Utilities for connector samples.
- */
-public class Util {
-
-    /**
-     * Generate a simple timestamp with the form {@code HH:mm:ss.SSS}
-     * @return the timestamp
-     */
-    public static String simpleTS() {
-        return new SimpleDateFormat("HH:mm:ss.SSS").format(new Date());
-    }
-
-    
-    /**
-     * Wait for the job to reach the specified state.
-     * <p>
-     * A placeholder till GraphJob directly supports awaitState()?
-     * @param job the job
-     * @param state the state to wait for
-     * @param timeout specify -1 to wait forever (until interrupted)
-     * @param unit may be null if timeout is -1
-     * @return true if the state was reached, false otherwise: the time limit
-     * was reached of the thread was interrupted.
-     */
-    public static boolean awaitState(Job job, Job.State state, long timeout, TimeUnit unit) {
-        long endWait = -1;
-        if (timeout != -1) {
-            endWait = System.currentTimeMillis()
-                        + unit.toMillis(timeout);
-        }
-        while (true) {
-            Job.State curState = job.getCurrentState();
-            if (curState == state)
-                return true;
-            if (endWait != -1) {
-                long now = System.currentTimeMillis();
-                if (now >= endWait)
-                    return false;
-            }
-            try {
-                Thread.sleep(1000);
-            } catch (InterruptedException e) {
-                return false;
-            }
-        }
-    }
-
-}
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/elm327/Cmd.java b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/elm327/Cmd.java
deleted file mode 100644
index f3ae61a..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/elm327/Cmd.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.connectors.elm327;
-
-import java.io.IOException;
-import java.io.OutputStream;
-
-import com.google.gson.JsonObject;
-
-/**
- * ELM327 and OBD-II command interface.
- *
- */
-public interface Cmd {
-    /**
-     * Key ({@value}) for PID identifier in JSON result.
-     */
-    String PID = "pid";
-
-    /**
-     * Key ({@value}) for timestamp in JSON result. Timestamp value is the
-     * number of milliseconds since the 1907 epoch.
-     */
-    String TS = "ts";
-    
-    /**
-     * Key ({@value}) for the returned value in JSON result.
-     * May not be present.
-     */
-    String VALUE = "value";
-
-    /**
-     * How the command is written to the serial port.
-     * 
-     * @param out
-     *            OutputStream to write bytes to.
-     * @throws IOException
-     *             Exception writing bytes.
-     */
-    void writeCmd(OutputStream out) throws IOException;
-
-    /**
-     * Process the reply into a result.
-     * 
-     * @param result
-     *            JSON object to populate with the result.
-     * @param reply
-     *            Bytes that were returned from the command execution.
-     *            
-     * @return {@code true} result is valid, {@code false} otherwise.
-     */
-    boolean result(JsonObject result, byte[] reply);
-
-    /**
-     * Unique identifier of the command.
-     * 
-     * @return Unique identifier of the command.
-     */
-    String id();
-}
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/elm327/Elm327Cmds.java b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/elm327/Elm327Cmds.java
deleted file mode 100644
index aed0c23..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/elm327/Elm327Cmds.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.connectors.elm327;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.nio.charset.StandardCharsets;
-
-import org.apache.edgent.connectors.serial.SerialDevice;
-import org.apache.edgent.samples.connectors.elm327.runtime.CommandExecutor;
-
-import com.google.gson.JsonObject;
-
-/**
- * ELM327 commands.
- * 
- * 
- */
-public enum Elm327Cmds implements Cmd {
-
-    INIT("ATZ"),
-    ECHO_OFF("ATE0"),
-    PROTOCOL_3("ATSP3"),
-    PROTOCOL_5("ATSP5"),
-    BYPASS_INIT("ATBI"),
-    FAST_INIT("ATFI"),
-    SLOW_INIT("ATSI"),;
-
-    private byte[] cmd;
-
-    Elm327Cmds(String code) {
-        cmd = (code + "\r").getBytes(StandardCharsets.US_ASCII);
-    }
-
-    @Override
-    public void writeCmd(OutputStream out) throws IOException {
-        out.write(cmd);
-    }
-
-    @Override
-    public boolean result(JsonObject result, byte[] data) {
-        return true;
-    }
-
-    @Override
-    public String id() {
-        return name();
-    }
-    
-    /**
-     * Initialize the ELM327 to a specific protocol.
-     * @param device Serial device the ELM327 is connected to.
-     * @param protocol OBD-II protocol to initialize to.
-     */
-    public static void initializeProtocol(SerialDevice device, Elm327Cmds protocol) {
-        device.setInitializer(port -> CommandExecutor.initialize(protocol, port.getOutput(), port.getInput()));
-    }
-
-}
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/elm327/Elm327Streams.java b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/elm327/Elm327Streams.java
deleted file mode 100644
index dbaf4db..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/elm327/Elm327Streams.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.connectors.elm327;
-
-import java.util.concurrent.TimeUnit;
-
-import org.apache.edgent.connectors.serial.SerialDevice;
-import org.apache.edgent.function.Supplier;
-import org.apache.edgent.samples.connectors.elm327.runtime.CommandExecutor;
-import org.apache.edgent.topology.TStream;
-
-import com.google.gson.JsonArray;
-
-/**
- * Streams fetching OBD-II data from an ELM327 through
- * a serial device.
- *
- * @see <a href="https://en.wikipedia.org/wiki/ELM327">ELM327</a>
- */
-public class Elm327Streams {
-	
-    /**
-     * Periodically execute a number of ELM327 commands.
-     * Each tuple on the returned stream is a JSON array containing
-     * the result for each command.
-     * <BR>
-     * Each result is a JSON object containing the
-     * {@link Cmd#id() command identifier} with key {@link Cmd#PID pid}
-     * and any result set by the individual command, typically with
-     * the key {@link Cmd#VALUE value}.
-     * 
-     * @param device Serial device the ELM327 is connected to.
-     * @param period Period to poll.
-     * @param unit Unit of {@code period}.
-     * @param cmds Commands to execute.
-     * @return Stream containing the results of the command exections.
-     */
-	public static TStream<JsonArray> poll(SerialDevice device, long period, TimeUnit unit, Cmd ... cmds) {
-		
-		Supplier<JsonArray> data = device.getSource(
-				port ->
-		{
-			JsonArray array = new JsonArray();
-			for (Cmd cmd : cmds) {
-				array.add(CommandExecutor.execute(cmd, port.getOutput(), port.getInput()));
-			}
-			return array;
-			
-		});
-		
-		return device.topology().poll(data, period, unit);
-
-	}
-}
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/elm327/Pids01.java b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/elm327/Pids01.java
deleted file mode 100644
index b42beb3..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/elm327/Pids01.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.connectors.elm327;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.nio.charset.StandardCharsets;
-
-import org.apache.edgent.samples.connectors.elm327.runtime.CommandExecutor;
-
-import com.google.gson.JsonObject;
-
-/**
- * OBD-II Standard Mode 01 Pids.
- *
- * 
- * @see <a href="https://en.wikipedia.org/wiki/OBD-II_PIDs#Mode_01">OBD-II Mode 01 Pids</a>
- */
-public enum Pids01 implements Cmd {
-    
-    /**
-     * Get the list of available PIDs.
-     */
-	AVAILABLE_PIDS("00"),
-	
-	/**
-	 * Engine coolant temperature in degrees C.
-	 */
-	ENGINE_COOLANT_TEMP("05") {
-		@Override
-		protected boolean decode(JsonObject result, byte[] reply) {
-			
-			int[] binary = CommandExecutor.binary(reply, 4, 2);
-			
-			int c = binary[0] - 40;
-			result.addProperty(VALUE, c);
-			
-			return true;
-		}
-	},
-
-	/**
-	 * Engine speed in rpm.
-	 */
-	RPM("0C") {
-		@Override
-		protected boolean decode(JsonObject result, byte[] reply) {
-			
-			int[] binary = CommandExecutor.binary(reply, 4, 4);
-			int rpm = ((binary[0] * 256) + binary[1])/4;
-			result.addProperty(VALUE, rpm);
-			
-			return true;
-		}
-	},
-	
-	/**
-	 * Vehicle speed in km/h.
-	 */
-	SPEED("0D"){
-		@Override
-		protected boolean decode(JsonObject result, byte[] reply) {
-			
-			int[] binary = CommandExecutor.binary(reply, 4, 2);
-			
-			result.addProperty(VALUE, binary[0]);
-			
-			return true;
-		}
-	},
-	
-	/**
-     * Engine air intake temperature in degrees C.
-     */
-	AIR_INTAKE_TEMP("0F"){
-		@Override
-		protected boolean decode(JsonObject result, byte[] reply) {
-			
-			int[] binary = CommandExecutor.binary(reply, 4, 2);
-			
-			int c = binary[0] - 40;
-			result.addProperty(VALUE, c);
-			
-			return true;
-		}
-	},
-	;
-
-    private final String pid;
-	private final byte[] cmd;
-	
-	Pids01(String pid) {
-		this.pid = pid;
-		cmd = ("01" + pid + "1\r").getBytes(StandardCharsets.US_ASCII);
-	}
-	
-	public String id() {
-		return pid;
-	}
-	
-	@Override
-	public void writeCmd(OutputStream out) throws IOException {
-		out.write(cmd);
-	}
-	@Override
-	public final boolean result(JsonObject result, byte[] data) {
-		return validateReply(data) && decode(result, data);
-	}
-	 boolean decode(JsonObject result, byte[] data) {
-		 return true;
-	 }
-	
-	boolean validateReply(byte[] reply) {
-		if (reply[0] != '4')
-			return false;
-		if (reply[1] != '1')
-			return false;
-		if (reply[2] != pid.charAt(0))
-			return false;
-		if (reply[3] != pid.charAt(1))
-			return false;
-		
-		return true;
-	}
-}
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/elm327/package-info.java b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/elm327/package-info.java
deleted file mode 100644
index 9d3a9b9..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/elm327/package-info.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-/**
- * OBD-II protocol sample using ELM327.
- * 
- * ELM327 devices allow connectivity to a vehicle's OBD-II information.
- *
- * @see <a href="https://en.wikipedia.org/wiki/OBD-II">OBD-II</a>
- * @see <a href="https://en.wikipedia.org/wiki/ELM327">ELM327</a>
- */
-package org.apache.edgent.samples.connectors.elm327;
\ No newline at end of file
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/elm327/runtime/CommandExecutor.java b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/elm327/runtime/CommandExecutor.java
deleted file mode 100644
index b5a342f..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/elm327/runtime/CommandExecutor.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.connectors.elm327.runtime;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-import org.apache.edgent.samples.connectors.elm327.Cmd;
-import org.apache.edgent.samples.connectors.elm327.Elm327Cmds;
-
-import com.google.gson.JsonObject;
-
-/**
- * Runtime execution of ELM327 &amp; OBD-II commands.
- *
- */
-public class CommandExecutor {
-
-    public static int[] binary(byte[] reply, int offset, int length) {
-        int[] binary = new int[length / 2];
-        for (int i = 0; i < binary.length; i++) {
-            int h = Character.digit(reply[offset++], 16);
-            int l = Character.digit(reply[offset++], 16);
-            binary[i] = ((h * 16) + l);
-        }
-        return binary;
-    }
-
-    public static void initialize(Cmd protocol, OutputStream out, InputStream in) {
-        try {
-
-            executeUntilOK(10, Elm327Cmds.INIT, out, in);
-            Thread.sleep(1000);
-
-            executeUntilOK(1, Elm327Cmds.ECHO_OFF, out, in);
-
-            executeUntilOK(1, protocol, out, in);
-            executeUntilOK(1, Elm327Cmds.SLOW_INIT, out, in);
-            Thread.sleep(1000);
-
-        } catch (Exception ioe) {
-            throw new RuntimeException(ioe);
-        }
-    }
-
-    private static boolean readUntilPrompt(InputStream in, ByteArrayOutputStream bytes) throws IOException {
-        bytes.reset();
-        for (;;) {
-            int b = in.read();
-            if (b == -1)
-                return false;
-            if (b == ' ')
-                continue;
-            if (b == '\r')
-                continue;
-            if (b == '>')
-                return true;
-
-            bytes.write(b);
-        }
-    }
-
-    public static JsonObject executeUntilOK(int n, Cmd cmd, OutputStream out, InputStream in) throws IOException {
-        try (ByteArrayOutputStream bytes = new ByteArrayOutputStream(16)) {
-            for (int i = 0; i < n; i++) {
-                cmd.writeCmd(out);
-                out.flush();
-
-                if (!readUntilPrompt(in, bytes))
-                    continue;
-
-                byte[] reply = bytes.toByteArray();
-                JsonObject j = new JsonObject();
-                if (cmd.result(j, reply))
-                    return j;
-                break;
-            }
-        }
-        throw new IllegalStateException("Could not execute command:" + cmd);
-    }
-
-    public static JsonObject execute(Cmd cmd, OutputStream out, InputStream in) {
-        try (ByteArrayOutputStream bytes = new ByteArrayOutputStream(16)) {
-            cmd.writeCmd(out);
-            out.flush();
-
-            JsonObject result = new JsonObject();
-            result.addProperty(Cmd.PID, cmd.id());
-            result.addProperty(Cmd.TS, System.currentTimeMillis());
-
-            readUntilPrompt(in, bytes);
-
-            cmd.result(result, bytes.toByteArray());
-
-            return result;
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        }
-    }
-}
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/file/FileReaderApp.java b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/file/FileReaderApp.java
deleted file mode 100644
index 80086b7..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/file/FileReaderApp.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.connectors.file;
-
-import java.io.File;
-
-import org.apache.edgent.connectors.file.FileStreams;
-import org.apache.edgent.console.server.HttpServer;
-import org.apache.edgent.providers.development.DevelopmentProvider;
-import org.apache.edgent.topology.TStream;
-import org.apache.edgent.topology.Topology;
-
-/**
- * Watch a directory for files and convert their contents into a stream.
- */
-public class FileReaderApp {
-    private final String directory;
-    private static final String baseLeafname = "FileSample";
-
-    public static void main(String[] args) throws Exception {
-        if (args.length != 1)
-            throw new Exception("missing pathname to an existing directory");
-        FileReaderApp reader = new FileReaderApp(args[0]);
-        reader.run();
-    }
-   
-    /**
-     * 
-     * @param directory an existing directory to watch for file
-     */
-    public FileReaderApp(String directory) {
-        File dir = new File(directory);
-        if (!dir.exists())
-            throw new IllegalArgumentException("directory doesn't exist");
-        this.directory = directory;
-    }
-    
-    public void run() throws Exception {
-        DevelopmentProvider tp = new DevelopmentProvider();
-        
-        // build the application / topology
-        
-        Topology t = tp.newTopology("FileSample consumer");
-
-        // watch for files
-        TStream<String> pathnames = FileStreams.directoryWatcher(t, () -> directory);
-        
-        // create a stream containing the files' contents.
-        // use a preFn to include a separator in the results.
-        // use a postFn to delete the file once its been processed.
-        TStream<String> contents = FileStreams.textFileReader(pathnames,
-                tuple -> "<PRE-FUNCTION> "+tuple, 
-                (tuple,exception) -> {
-                    // exercise a little caution in case the user pointed
-                    // us at a directory with other things in it
-                    if (tuple.contains("/"+baseLeafname+"_")) { 
-                        new File(tuple).delete();
-                    }
-                    return null;
-                });
-        
-        // print out what's being read
-        contents.print();
-        
-        // run the application / topology
-        System.out.println("starting the reader watching directory " + directory);
-        System.out.println("Console URL for the job: "
-                + tp.getServices().getService(HttpServer.class).getConsoleUrl());
-        tp.submit(t);
-    }
-
-}
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/file/FileWriterApp.java b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/file/FileWriterApp.java
deleted file mode 100644
index c956cb6..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/file/FileWriterApp.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.connectors.file;
-
-import java.io.File;
-import java.util.Date;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.apache.edgent.connectors.file.FileStreams;
-import org.apache.edgent.connectors.file.FileWriterCycleConfig;
-import org.apache.edgent.connectors.file.FileWriterFlushConfig;
-import org.apache.edgent.connectors.file.FileWriterPolicy;
-import org.apache.edgent.connectors.file.FileWriterRetentionConfig;
-import org.apache.edgent.console.server.HttpServer;
-import org.apache.edgent.providers.development.DevelopmentProvider;
-import org.apache.edgent.topology.TStream;
-import org.apache.edgent.topology.Topology;
-
-/**
- * Write a TStream&lt;String&gt; to files.
- */
-public class FileWriterApp {
-    private final String directory;
-    private final String basePathname;
-    private static final String baseLeafname = "FileSample";
-    
-    public static void main(String[] args) throws Exception {
-        if (args.length != 1)
-            throw new Exception("missing pathname to an existing directory");
-        FileWriterApp writer = new FileWriterApp(args[0]);
-        writer.run();
-    }
-    
-    /**
-     * 
-     * @param directory an existing directory to create files in
-     */
-    public FileWriterApp(String directory) {
-        File dir = new File(directory);
-        if (!dir.exists())
-            throw new IllegalArgumentException("directory doesn't exist");
-        this.directory = directory;
-        basePathname = directory+"/"+baseLeafname;
-    }
-    
-    public void run() throws Exception {
-        DevelopmentProvider tp = new DevelopmentProvider();
-        
-        // build the application / topology
-        
-        Topology t = tp.newTopology("FileSample producer");
-        
-        FileWriterPolicy<String> policy = new FileWriterPolicy<String>(
-                FileWriterFlushConfig.newImplicitConfig(),
-                FileWriterCycleConfig.newCountBasedConfig(5),
-                FileWriterRetentionConfig.newFileCountBasedConfig(3));
-
-        // create a tuple stream to write out
-        AtomicInteger cnt = new AtomicInteger();
-        TStream<String> stream = t.poll(() -> {
-                String str = String.format("sample tuple %d %s",
-                        cnt.incrementAndGet(), new Date().toString());
-                System.out.println("created tuple: "+str);
-                return str;
-            }, 1, TimeUnit.SECONDS);
-        
-        // write the stream
-        FileStreams.textFileWriter(stream, () -> basePathname, () -> policy);
-        
-        // run the application / topology
-        System.out.println("starting the producer writing to directory " + directory);
-        System.out.println("Console URL for the job: "
-                + tp.getServices().getService(HttpServer.class).getConsoleUrl());
-        tp.submit(t);
-    }
-
-}
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/file/README b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/file/README
deleted file mode 100644
index 4477518..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/file/README
+++ /dev/null
@@ -1,11 +0,0 @@
-Sample File Streams connector topology applications.
-
-The file writer application writes a stream's tuples to files.
-
-The file reader application watches a directory for files and reads their
-contents into a stream of tuples.
-
-see scripts/connectors/file/README to run them
-
-FileWriterApp.java - the writer application topology
-FileReaderApp.java - the reader application topology
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/file/package-info.java b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/file/package-info.java
deleted file mode 100644
index a2cfe74..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/file/package-info.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-/**
- * Samples showing use of the 
- * <a href="{@docRoot}/org/apache/edgent/connectors/file/package-summary.html">
- *     File stream connector</a>.
- * <p>
- * See &lt;edgent-release&gt;/scripts/connectors/file/README to run the samples.
- * <p>
- * The following samples are provided:
- * <ul>
- * <li>FileReaderApp.java - a simple directory watcher and file reader application topology</li>
- * <li>FileWriterApp.java - a simple file writer application topology</li>
- * </ul>
- */
-package org.apache.edgent.samples.connectors.file;
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/iotp/IotpAppClient.java b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/iotp/IotpAppClient.java
deleted file mode 100644
index 4f4e2dc..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/iotp/IotpAppClient.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.connectors.iotp;
-
-import java.io.File;
-import java.io.FileReader;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Properties;
-
-import com.google.gson.JsonObject;
-import com.ibm.iotf.client.app.ApplicationClient;
-import com.ibm.iotf.client.app.Command;
-import com.ibm.iotf.client.app.Event;
-import com.ibm.iotf.client.app.EventCallback;
-
-/**
- * An IBM Watson IoT Platform ApplicationClient that publishes device cmds 
- * and subscribes to device events for
- * {@link IotpDeviceSample} and {@link IotpGWDeviceSample}.
- * <p>
- * Usage: {@code [useGW] <app-cfg-path> # see scripts/connectors/iotp/iotp-app-client.cfg}
- * <p>
- * This connects to your IBM Watson IoT Platform service
- * as the Application defined in a application config file.
- * The file format is the standard one for IBM Watson IoT Platform.
- * <p>
- * Note, the config file also contains some additional information for this application.
- *
- * <p>See {@code scripts/connectors/iotp/README} for information about a
- * prototype application configuration file and running the application.
- */
-public class IotpAppClient {
-  
-  private static final String usage = "[useGW] <app-cfg-path> # see scripts/connectors/iotp/iotp-app-client.cfg";
-  
-  public static void main(String[] args) throws Exception {
-    if (args.length == 0)
-      throw new Exception("Usage: " + usage);
-    List<String> argList = Arrays.asList(args);
-    boolean useGW = argList.contains("useGW");
-    String deviceCfgPath = argList.get(argList.size() - 1);
-
-    Properties cfgProps = new Properties();
-    cfgProps.load(new FileReader(new File(deviceCfgPath)));
-    
-    String iotpOrg = getProperty(cfgProps, "Organization-ID", "org");
-    String iotpAppId = getProperty(cfgProps, "id");
-    String iotpApiKey = getProperty(cfgProps, "API-Key", "auth-key");
-    System.out.println("org:     " + iotpOrg);
-    System.out.println("id:      " + iotpAppId);
-    System.out.println("ApiKey:  " + iotpApiKey);
-
-    String iotpDevType = cfgProps.getProperty("deviceType");
-    String iotpDevId = cfgProps.getProperty("deviceId");
-    if (useGW) {
-      iotpDevType = cfgProps.getProperty("gwDeviceType");
-      iotpDevId = cfgProps.getProperty("gwDeviceId");
-    }
-    System.out.println("deviceType: " + iotpDevType);
-    System.out.println("deviceId:   " + iotpDevId);
-
-    ApplicationClient client = new ApplicationClient(cfgProps);
-    
-    client.connect();
-    
-    boolean sendCmd = true;
-    if (sendCmd) {
-      sendCmd(client, iotpDevType, iotpDevId);
-      if (useGW) {
-        sendCmd(client, cfgProps.getProperty("cn-dev1-type"), cfgProps.getProperty("cn-dev1-id"));
-      }
-    }
-    
-    boolean subscribeToEvents = true;
-    if (subscribeToEvents) {
-      System.out.println("Subscribing to events...");
-      client.subscribeToDeviceEvents();
-      client.setEventCallback(new EventCallback() {
-
-        @Override
-        public void processCommand(Command cmd) {
-          // TODO Auto-generated method stub
-          
-        }
-
-        @SuppressWarnings("deprecation")
-        @Override
-        public void processEvent(Event event) {
-          System.out.println(
-              String.format("Received event: %s %s:%s %s %s", event.getEvent(),
-                  event.getDeviceType(), event.getDeviceId(),
-                  event.getFormat(),
-                  event.getPayload()));
-        }
-        
-      });
-      Thread.sleep(Integer.MAX_VALUE);
-    }
-    
-    client.disconnect();
-  }
-  
-  private static int msgNum = 0;
-  private static void sendCmd(ApplicationClient client, String iotpDevType, String iotpDevId) throws Exception {
-    String command = "cmdId-1";
-    JsonObject jo = new JsonObject();
-    jo.addProperty("msgNum", ++msgNum);
-    jo.addProperty("deviceTypeAndId", iotpDevType + "/" + iotpDevId);
-    jo.addProperty("cmdId", command);
-    jo.addProperty("str", "a-string");
-    jo.addProperty("num", 12345);
-    JsonObject data = jo;
-    
-    System.out.println("Sending "+iotpDevType+"/"+iotpDevId+" command: "+command+" data: "+data);
-    
-    boolean ok = client.publishCommand(iotpDevType, iotpDevId, command, data);
-    
-    System.out.println("Sent: " + (ok ? "OK" : "NOT-OK"));
-  }
-  
-  private static String getProperty(Properties props, String... keys) {
-    for (String key : keys) {
-      String val = props.getProperty(key);
-      if (val != null)
-        return val;
-    }
-    return null;
-  }
-
-}
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/iotp/IotpDeviceSample.java b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/iotp/IotpDeviceSample.java
deleted file mode 100644
index 2880c99..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/iotp/IotpDeviceSample.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.connectors.iotp;
-
-import java.io.File;
-import java.io.FileReader;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Properties;
-import java.util.Random;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.edgent.connectors.iot.QoS;
-import org.apache.edgent.connectors.iotp.IotpDevice;
-import org.apache.edgent.providers.direct.DirectProvider;
-import org.apache.edgent.topology.TStream;
-import org.apache.edgent.topology.Topology;
-
-import com.google.gson.JsonObject;
-import com.ibm.iotf.client.device.DeviceClient;
-import com.ibm.iotf.devicemgmt.DeviceData;
-import com.ibm.iotf.devicemgmt.device.ManagedDevice;
-
-/**
- * Send device events and subscribe to device commands as a registered IoT device
- * using a standard IBM Watson IoT Platform service instance.
- * <P>
- * Use {@link IotpAppClient} to print published events and generate a command
- * (start this app before running IotpAppClient). 
- * <P>
- * This sample demonstrates:
- * <UL>
- * <LI>Using the IotpDevice connector</LI>
- * <LI>Initializing the IotpDevice connector using the WIoTP API objects</LI>
- * <LI>Publishing and subscribing to device events and commands</LI>
- * </UL>
- * <p>
- * This connects to your IBM Watson IoT Platform service
- * as the Device defined in a device config file.
- * The file format is the standard one for IBM Watson IoT Platform.
- *
- * <p>See {@code scripts/connectors/iotp/README} for information about a
- * prototype device configuration file and running the sample.
- */
-public class IotpDeviceSample {
-    private static final String usage = "[useDeviceClient|useManagedDevice] [useHttp] <device-cfg-path>";
-
-    public static void main(String[] args) throws Exception {
-        if (args.length == 0)
-          throw new Exception("Usage: " + usage);
-        List<String> argList = Arrays.asList(args);
-        boolean useDeviceClient = argList.contains("useDeviceClient");
-        boolean useManagedDevice = argList.contains("useManagedDevice");
-        boolean useInternalDeviceClient = !(useDeviceClient || useManagedDevice);
-        boolean useHttp = argList.contains("useHttp");
-        String deviceCfgPath = argList.get(argList.size() - 1);
-
-        DirectProvider tp = new DirectProvider();
-        Topology topology = tp.newTopology("IotpDeviceSample");
-        
-        Properties cfgProps = new Properties();
-        cfgProps.load(new FileReader(new File(deviceCfgPath)));
-        
-        String iotpOrg = getProperty(cfgProps, "Organization-ID", "org");
-        String iotpDevType = getProperty(cfgProps, "Device-Type", "type");
-        String iotpDevId = getProperty(cfgProps, "Device-ID", "id");
-        System.out.println("org:  " + iotpOrg);
-        System.out.println("DeviceType: " + iotpDevType);
-        System.out.println("DeviceId:   " + iotpDevId);
-        
-        // System.out.println("mosquitto_pub -u <api-auth-key> -P <api-quth-token> -h "+iotpOrg+".messaging.internetofthings.ibmcloud.com -p 1883 -i a:"+iotpOrg+":appId1 -t iot-2/type/"+iotpDevType+"/id/"+iotpDevId+"/cmd/cmd-1/fmt/json -m '{}'");
-        // System.out.println("mosquitto_sub -d -u <api-auth-key> -P <api-quth-token> -h "+iotpOrg+".messaging.internetofthings.ibmcloud.com -p 1883 -i a:"+iotpOrg+":appId2 -t iot-2/type/+/id/+/evt/+/fmt/+");
-        
-        IotpDevice device;
-        if (useInternalDeviceClient) {
-          System.out.println("Using internal DeviceClient");
-          device = new IotpDevice(topology, cfgProps);
-        }
-        else if (useDeviceClient) {
-          System.out.println("Using WIoTP DeviceClient");
-          device = new IotpDevice(topology, new DeviceClient(cfgProps));
-        }
-        else if (useManagedDevice) {
-          System.out.println("Using WIoTP ManagedDevice");
-          DeviceData deviceData = new DeviceData.Builder().build();
-          device = new IotpDevice(topology, new ManagedDevice(cfgProps, deviceData));
-        }
-        else
-          throw new Exception("woops");
-             
-        Random r = new Random();
-        TStream<double[]> raw = topology.poll(() -> {
-            double[]  v = new double[3];
-            
-            v[0] = r.nextGaussian() * 10.0 + 40.0;
-            v[1] = r.nextGaussian() * 10.0 + 50.0;
-            v[2] = r.nextGaussian() * 10.0 + 60.0;
-            
-            return v;
-        }, 3, TimeUnit.SECONDS);
-        
-        TStream<JsonObject> json = raw.map(v -> {
-            JsonObject j = new JsonObject();
-            j.addProperty("temp", v[0]);
-            j.addProperty("humidity", v[1]);
-            j.addProperty("objectTemp", v[2]);
-            return j;
-        });
-        
-        if (!useHttp) {
-          device.events(json, "sensors", QoS.FIRE_AND_FORGET);
-        }
-        else {
-          System.out.println("Publishing events using HTTP");
-          device.httpEvents(json, "sensors");
-        }
-        
-        // subscribe to / report device cmds 
-        device.commands().sink(jo -> System.out.println("Received cmd: " + jo));
-
-        tp.submit(topology);
-    }
-    
-    private static String getProperty(Properties props, String... keys) {
-      for (String key : keys) {
-        String val = props.getProperty(key);
-        if (val != null)
-          return val;
-      }
-      return null;
-    }
-}
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/iotp/IotpGWDeviceSample.java b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/iotp/IotpGWDeviceSample.java
deleted file mode 100644
index 74ec4d9..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/iotp/IotpGWDeviceSample.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.connectors.iotp;
-
-import java.io.File;
-import java.io.FileReader;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Random;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.edgent.connectors.iot.IotDevice;
-import org.apache.edgent.connectors.iot.QoS;
-import org.apache.edgent.connectors.iotp.IotpGateway;
-import org.apache.edgent.providers.direct.DirectProvider;
-import org.apache.edgent.topology.TStream;
-import org.apache.edgent.topology.Topology;
-
-import com.google.gson.JsonObject;
-import com.ibm.iotf.client.gateway.GatewayClient;
-import com.ibm.iotf.devicemgmt.DeviceData;
-import com.ibm.iotf.devicemgmt.gateway.ManagedGateway;
-
-/**
- * Similar to IotpDeviceSample but behaving as a registered IoT Gateway device.
- * <P>
- * Use {@link IotpAppClient} to print published events and generate a command
- * (start this app before running IotpAppClient with the "useGW" option). 
- * <P>
- * This sample demonstrates:
- * <UL>
- * <LI>Using the IotpGateway connector</LI>
- * <LI>Initializing the IotpGateway connector using the WIoTP API objects</LI>
- * <LI>Publishing and subscribing to Gateway device events and commands</LI>
- * <LI>Publishing and subscribing to connected device events and commands</LI>
- * </UL>
- * <p>
- * This connects to your IBM Watson IoT Platform service
- * as the Gateway defined in a gateway config file.
- * The file format is the standard one for IBM Watson IoT Platform.
- *
- * <p>See {@code scripts/connectors/iotp/README} for information about a
- * prototype gateway device configuration file and running the sample.
- */
-public class IotpGWDeviceSample {
-  
-    private static final String usage = "[useGatewayClient|useManagedGateway] [useHttp] <device-cfg-path>";
-
-    public static void main(String[] args) throws Exception {
-        if (args.length == 0)
-          throw new Exception("Usage: " + usage);
-        List<String> argList = Arrays.asList(args);
-        boolean useGatewayClient = argList.contains("useGatewayClient");
-        boolean useManagedGateway = argList.contains("useManagedGateway");
-        boolean useInternalGatewayClient = !(useGatewayClient || useManagedGateway);
-        boolean useHttp = argList.contains("useHttp");
-        String deviceCfgPath = argList.get(argList.size() - 1);
-
-        DirectProvider tp = new DirectProvider();
-        Topology topology = tp.newTopology("IotpGWDeviceSample");
-        
-        Properties cfgProps = new Properties();
-        cfgProps.load(new FileReader(new File(deviceCfgPath)));
-        
-        String iotpOrg = getProperty(cfgProps, "Organization-ID", "org");
-        String iotpGWDevType = getProperty(cfgProps, "Gateway-Type", "Device-Type", "type");
-        String iotpGWDevId = getProperty(cfgProps, "Gateway-ID", "Device-ID", "id");
-        String iotpCnDev1Type = cfgProps.getProperty("cn-dev1-type");
-        String iotpCnDev1Id = cfgProps.getProperty("cn-dev1-id");
-        
-        System.out.println("orgId:  " + iotpOrg);
-        System.out.println("GWDeviceType: " + iotpGWDevType);
-        System.out.println("GWDeviceId:   " + iotpGWDevId);
-        System.out.println("cn-dev1 DeviceType: " + iotpCnDev1Type);
-        System.out.println("cn-dev1 DeviceId:   " + iotpCnDev1Id);
-        
-        // System.out.println("GW mosquitto_pub -u <api-auth-key> -P <api-auth-token> -h "+iotpOrg+".messaging.internetofthings.ibmcloud.com -p 1883 -i a:"+iotpOrg+":appId1 -t iot-2/type/"+iotpGWDevType+"/id/"+iotpGWDevId+"/cmd/cmd-1/fmt/json -m '{}'");
-        // System.out.println("GW mosquitto_sub -d -u <api-auth-key> -P <api-auth-token> -h "+iotpOrg+".messaging.internetofthings.ibmcloud.com -p 1883 -i a:"+iotpOrg+":appId2 -t iot-2/type/+/id/+/evt/+/fmt/+");
-        // System.out.println("cn-dev1 mosquitto_pub -u <api-auth-key> -P <api-quth-token> -h "+iotpOrg+".messaging.internetofthings.ibmcloud.com -p 1883 -i a:"+iotpOrg+":appId1 -t iot-2/type/"+iotpCnDev1Type+"/id/"+iotpCnDev1Id+"/cmd/cmd-1/fmt/json -m '{}'");
-
-        IotpGateway gwDevice;
-        if (useInternalGatewayClient) {
-          System.out.println("Using internal GatewayClient");
-          gwDevice = new IotpGateway(topology, cfgProps);
-        }
-        else if (useGatewayClient) {
-          System.out.println("Using WIoTP GatewayClient");
-          gwDevice = new IotpGateway(topology, new GatewayClient(cfgProps));
-        }
-        else if (useManagedGateway) {
-          System.out.println("Using WIoTP ManagedGateway");
-          DeviceData deviceData = new DeviceData.Builder().build();
-          gwDevice = new IotpGateway(topology, new ManagedGateway(cfgProps, deviceData));
-        }
-        else
-          throw new IllegalStateException("woops");
-
-        Map<String,String> devAttrMap = new HashMap<>();
-        devAttrMap.put(IotpGateway.ATTR_DEVICE_TYPE, iotpCnDev1Type);
-        devAttrMap.put(IotpGateway.ATTR_DEVICE_ID, iotpCnDev1Id);
-        
-        String cnDev1FqDeviceId = gwDevice.getIotDeviceId(devAttrMap);
-        IotDevice cnDev1Device = gwDevice.getIotDevice(cnDev1FqDeviceId);
-        
-        System.out.println("GW fqDeviceId: " + gwDevice.getDeviceId());
-        System.out.println("cn-dev1 fqDeviceId:  " + cnDev1FqDeviceId);
-        System.out.println("IotDevice cn-dev1 fqDeviceId:  " + cnDev1Device.getDeviceId());
-             
-        Random r = new Random();
-        TStream<double[]> raw = topology.poll(() -> {
-            double[]  v = new double[3];
-            
-            v[0] = r.nextGaussian() * 10.0 + 40.0;
-            v[1] = r.nextGaussian() * 10.0 + 50.0;
-            v[2] = r.nextGaussian() * 10.0 + 60.0;
-            
-            return v;
-        }, 3, TimeUnit.SECONDS);
-        
-        // Create a stream of Gateway device events
-        TStream<JsonObject> gwJson = raw.map(v -> {
-          JsonObject jo2 = new JsonObject();
-          jo2.addProperty("gw-fqDeviceId", gwDevice.getDeviceId());
-          jo2.addProperty("temp", v[0]);
-          return jo2;
-        });
-        
-        // Create a stream of a connected device's events
-        TStream<JsonObject> cnDev1Json = raw.map(v -> {
-          JsonObject jo2 = new JsonObject();
-          jo2.addProperty("cnDev1-fqDeviceId", cnDev1Device.getDeviceId());
-          jo2.addProperty("humidity", v[1]);
-          return jo2;
-        });
-
-        if (!useHttp) {
-          gwDevice.events(gwJson, "gw-device", QoS.FIRE_AND_FORGET);
-          gwDevice.eventsForDevice(cnDev1FqDeviceId, cnDev1Json, "gw-events-for-cnDev1", QoS.FIRE_AND_FORGET);
-          cnDev1Device.events(cnDev1Json, "cnDev1-events", QoS.FIRE_AND_FORGET);
-        }
-        else {
-          System.out.println("Publishing events using HTTP");
-          throw new IllegalStateException("GW httpEvents is NYI");
-          // gwDevice.httpEvents(json, "sensors");
-          // gwDevice.httpEventsForDevice(cnDev1FqDeviceId, cnDev1Json, "gw-events-for-cnDev1");
-        }
-
-        // subscribe to / report cmds for the GW and all its connected devices
-        gwDevice.commandsForDevice(Collections.emptySet()).sink(jo -> System.out.println("Received all-cmds cmd: " + jo));
-        
-        // subscribe to / report just GW device cmds
-        gwDevice.commands().sink(jo -> System.out.println("Received gwDevice cmd: " + jo));
-        
-        // subscribe to / report just cnDev1 device cmds
-        gwDevice.commandsForDevice(cnDev1FqDeviceId).sink(jo -> System.out.println("Received gwDevice-for-cnDev1 cmd: " + jo));
-        cnDev1Device.commands().sink(jo -> System.out.println("Received cnDev1 cmd: " + jo));
-        
-        // subscribe to / report just cmds for a specific device type
-        gwDevice.commandsForType(iotpGWDevType).sink(jo -> System.out.println("Received for-type-gwDeviceType cmd: " + jo));
-        gwDevice.commandsForType(iotpCnDev1Type).sink(jo -> System.out.println("Received for-type-cnDev1DeviceType cmd: " + jo));
-
-        tp.submit(topology);
-    }
-    
-    private static String getProperty(Properties props, String... keys) {
-      for (String key : keys) {
-        String val = props.getProperty(key);
-        if (val != null)
-          return val;
-      }
-      return null;
-    }
- }
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/iotp/IotpQuickstart.java b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/iotp/IotpQuickstart.java
deleted file mode 100644
index 3bd2414..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/iotp/IotpQuickstart.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.connectors.iotp;
-
-import java.util.Random;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.edgent.connectors.iot.IotDevice;
-import org.apache.edgent.connectors.iot.QoS;
-import org.apache.edgent.connectors.iotp.IotpDevice;
-import org.apache.edgent.providers.direct.DirectProvider;
-import org.apache.edgent.topology.TStream;
-import org.apache.edgent.topology.Topology;
-
-import com.google.gson.JsonObject;
-
-/**
- * IBM Watson IoT Platform Quickstart sample.
- * Submits a JSON device event every second using the
- * same format as the Quickstart device simulator,
- * with keys {@code temp}, {@code humidity}  and {@code objectTemp}
- * and random values.
- * <P>
- * The device type is {@code iotsamples-edgent} and a random
- * device identifier is generated. Both are printed out when
- * the application starts.
- * </P>
- * A URL is also printed that allows viewing of the data
- * as it received by the Quickstart service.
- *
- * <p>See {@code scripts/connectors/iotp/README} for information about running the sample.
- */
-public class IotpQuickstart {
-
-    public static void main(String[] args) {
-
-        DirectProvider tp = new DirectProvider();
-        Topology topology = tp.newTopology("IotpQuickstart");
-        
-        // Declare a connection to IoTF Quickstart service
-        String deviceId = "qs" + Long.toHexString(new Random().nextLong());
-        IotDevice device = IotpDevice.quickstart(topology, deviceId);
-        
-        System.out.println("Quickstart device type:" + IotpDevice.QUICKSTART_DEVICE_TYPE);
-        System.out.println("Quickstart device id  :" + deviceId);
-        System.out.println("https://quickstart.internetofthings.ibmcloud.com/#/device/"
-             + deviceId);
-             
-        Random r = new Random();
-        TStream<double[]> raw = topology.poll(() -> {
-            double[]  v = new double[3];
-            
-            v[0] = r.nextGaussian() * 10.0 + 40.0;
-            v[1] = r.nextGaussian() * 10.0 + 50.0;
-            v[2] = r.nextGaussian() * 10.0 + 60.0;
-            
-            return v;
-        }, 1, TimeUnit.SECONDS);
-        
-        TStream<JsonObject> json = raw.map(v -> {
-            JsonObject j = new JsonObject();
-            j.addProperty("temp", v[0]);
-            j.addProperty("humidity", v[1]);
-            j.addProperty("objectTemp", v[2]);
-            return j;
-        });
-        
-        device.events(json, "sensors", QoS.FIRE_AND_FORGET);
-
-        tp.submit(topology);
-    }
-}
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/iotp/IotpQuickstart2.java b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/iotp/IotpQuickstart2.java
deleted file mode 100644
index ac4ee92..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/iotp/IotpQuickstart2.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.connectors.iotp;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Properties;
-import java.util.Random;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.edgent.connectors.iot.QoS;
-import org.apache.edgent.connectors.iotp.IotpDevice;
-import org.apache.edgent.providers.direct.DirectProvider;
-import org.apache.edgent.topology.TStream;
-import org.apache.edgent.topology.Topology;
-
-import com.google.gson.JsonObject;
-import com.ibm.iotf.client.device.DeviceClient;
-import com.ibm.iotf.devicemgmt.DeviceData;
-import com.ibm.iotf.devicemgmt.device.ManagedDevice;
-
-/**
- * IBM Watson IoT Platform Quickstart sample.
- * Submits a JSON device event every second using the
- * same format as the Quickstart device simulator,
- * with keys {@code temp}, {@code humidity}  and {@code objectTemp}
- * and random values.
- * <P>
- * The device type is {@code iotsamples-edgent} and a random
- * device identifier is generated. Both are printed out when
- * the application starts.
- * <P>
- * A URL is also printed that allows viewing of the data
- * as it received by the Quickstart service.
- * <P>
- * This sample demonstrates using the WIoTP API to initialize the IotpDevice
- * connector as well as the ability to publish events using the WIoTP HTTP protocol.
- *
- * <p>See {@code scripts/connectors/iotp/README} for information about running the sample.
- */
-public class IotpQuickstart2 {
-
-    public static void main(String[] args) throws Exception {
-        List<String> argList = Arrays.asList(args);
-        boolean useDeviceClient = argList.contains("useDeviceClient");
-        boolean useHttp = argList.contains("useHttp");
-
-        DirectProvider tp = new DirectProvider();
-        Topology topology = tp.newTopology("IotpQuickstart");
-        
-        // Declare a connector to IoTP Quickstart service, initializing with WIoTP API
-        String deviceId = "qs" + Long.toHexString(new Random().nextLong());
-        Properties options = new Properties();
-        options.setProperty("org", "quickstart");
-        options.setProperty("type", IotpDevice.QUICKSTART_DEVICE_TYPE);
-        options.setProperty("id", deviceId);
-        IotpDevice device;
-        if (useDeviceClient) {
-          System.out.println("Using WIoTP DeviceClient");
-          device = new IotpDevice(topology, new DeviceClient(options));
-        }
-        else {
-          System.out.println("Using WIoTP ManagedDevice");
-          DeviceData deviceData = new DeviceData.Builder().build();
-          device = new IotpDevice(topology, new ManagedDevice(options, deviceData));
-        }
-        
-        System.out.println("Quickstart device type:" + IotpDevice.QUICKSTART_DEVICE_TYPE);
-        System.out.println("Quickstart device id  :" + deviceId);
-        System.out.println("https://quickstart.internetofthings.ibmcloud.com/#/device/"
-             + deviceId);
-             
-        Random r = new Random();
-        TStream<double[]> raw = topology.poll(() -> {
-            double[]  v = new double[3];
-            
-            v[0] = r.nextGaussian() * 10.0 + 40.0;
-            v[1] = r.nextGaussian() * 10.0 + 50.0;
-            v[2] = r.nextGaussian() * 10.0 + 60.0;
-            
-            return v;
-        }, 1, TimeUnit.SECONDS);
-        
-        TStream<JsonObject> json = raw.map(v -> {
-            JsonObject j = new JsonObject();
-            j.addProperty("temp", v[0]);
-            j.addProperty("humidity", v[1]);
-            j.addProperty("objectTemp", v[2]);
-            return j;
-        });
-
-        if (!useHttp) {
-          device.events(json, "sensors", QoS.FIRE_AND_FORGET);
-        }
-        else {
-          System.out.println("Publishing events using HTTP");
-          device.httpEvents(json, "sensors");
-        }
-
-        tp.submit(topology);
-    }
- }
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/iotp/IotpSensors.java b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/iotp/IotpSensors.java
deleted file mode 100644
index e2f4b12..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/iotp/IotpSensors.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-package org.apache.edgent.samples.connectors.iotp;
-
-import java.io.File;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.edgent.connectors.iot.HeartBeat;
-import org.apache.edgent.connectors.iot.IotDevice;
-import org.apache.edgent.connectors.iot.QoS;
-import org.apache.edgent.connectors.iotp.IotpDevice;
-import org.apache.edgent.providers.direct.DirectProvider;
-import org.apache.edgent.providers.direct.DirectTopology;
-import org.apache.edgent.samples.topology.SensorsAggregates;
-import org.apache.edgent.topology.TStream;
-
-import com.google.gson.JsonObject;
-
-/**
- * Sample sending sensor device events to IBM Watson IoT Platform. <BR>
- * Simulates a couple of bursty sensors and sends the readings from the sensors
- * to IBM Watson IoT Platform as device events with id {@code sensors}. <BR>
- * Subscribes to device commands with identifier {@code display}.
- * <P>
- * In addition a device event with id {@code hearbeat} is sent
- * every minute. This ensure a connection attempt to IBM Watson IoT Platform
- * is made immediately rather than waiting for a bursty sensor to become
- * active.
- * <P>
- * This sample requires an IBM Watson IoT Platform service and a device configuration.<BR>
- * In order to see commands send from IBM Watson IoT Platform
- * there must be an analytic application
- * that sends commands with the identifier {@code display}.
- * </P>
- *
- * <p>See {@code scripts/connectors/iotp/README} for information about a
- * prototype device configuration file and running the sample.
- */
-public class IotpSensors {
-
-    /**
-     * Run the IotpSensors application.
-     * 
-     * Takes a single argument that is the path to the
-     * device configuration file containing the connection
-     * authentication information.
-     * 
-     * @param args Must contain the path to the device configuration file.
-     * 
-     * @see IotpDevice#IotpDevice(org.apache.edgent.topology.Topology, File)
-     */
-    public static void main(String[] args) {
-        
-        String deviceCfg = args[0];
-
-        DirectProvider tp = new DirectProvider();
-        DirectTopology topology = tp.newTopology("IotpSensors");
-
-        // Declare a connection to IoTF
-        IotDevice device = new IotpDevice(topology, new File(deviceCfg));
-
-        // Simulated sensors for this device.
-        simulatedSensors(device, true);
-        
-        // Heartbeat
-        heartBeat(device, true);
-
-        // Subscribe to commands of id "display" for this
-        // device and print them to standard out
-        displayMessages(device, true);
-
-        tp.submit(topology);
-    }
-
-
-    /**
-     * Simulate two bursty sensors and send the readings as IoTF device events
-     * with an identifier of {@code sensors}.
-     * 
-     * @param device
-     *            IoT device
-     * @param print
-     *            True if the data submitted as events should also be printed to
-     *            standard out.
-     */
-    public static void simulatedSensors(IotDevice device, boolean print) {
-
-        TStream<JsonObject> sensors = SensorsAggregates.sensorsAB(device.topology());
-        if (print)
-            sensors.print();
-
-        // Send the device streams as IoTF device events
-        // with event identifier "sensors".
-        device.events(sensors, "sensors", QoS.FIRE_AND_FORGET);
-    }
-    
-    /**
-     * Create a heart beat device event with
-     * identifier {@code heartbeat} to
-     * ensure there is some immediate output and
-     * the connection to IoTF happens as soon as possible.
-     * @param device IoT device
-     * @param print true to print generated heartbeat tuples to System.out.
-     */
-    public static void heartBeat(IotDevice device, boolean print) {
-      TStream<JsonObject> hbs = 
-          HeartBeat.addHeartBeat(device, 1, TimeUnit.MINUTES, "heartbeat");
-      if (print)
-        hbs.print();
-    }
-    
-
-    /**
-     * Subscribe to IoTP device commands with identifier {@code display}.
-     * Subscribing to device commands returns a stream of JSON objects that
-     * include a timestamp ({@code tsms}), command identifier ({@code command})
-     * and payload ({@code payload}). Payload is the application specific
-     * portion of the command. <BR>
-     * In this case the payload is expected to be a JSON object containing a
-     * {@code msg} key with a string display message. <BR>
-     * The returned stream consists of the display message string extracted from
-     * the JSON payload.
-     * <P>
-     * Note to receive commands a analytic application must exist that generates
-     * them through IBM Watson IoT Platform.
-     * </P>
-     *
-     * @param device the device
-     * @param print true to print the received command's payload to System.out.
-     * @return the stream
-     * @see IotDevice#commands(String...)
-     */
-    public static TStream<String> displayMessages(IotDevice device, boolean print) {
-        // Subscribe to commands of id "display" for this device
-        TStream<JsonObject> statusMsgs = device.commands("display");
-
-        // The returned JSON object includes several fields
-        // tsms - Timestamp in milliseconds (this is generic to a command)
-        // payload.msg - Status message (this is specific to this application)
-
-        // Map to a String object containing the message
-        TStream<String> messages = statusMsgs.map(j -> j.getAsJsonObject("payload").getAsJsonPrimitive("msg").getAsString());
-        if (print)
-            messages.print();
-        return messages;
-    }
-}
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/iotp/package-info.java b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/iotp/package-info.java
deleted file mode 100644
index 43dcfe9..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/iotp/package-info.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-/**
- * Samples showing use of the IBM Watson IoT Platform connector
- * to publish device events and subscribe to device
- * commands.
- * 
- * <p>The "Quickstart" samples connect to the IBM Watson IoT Platform
- * using its Quickstart feature that does not require device registration.
- * When the samples are run they print out a URL which allows a browser
- * to see the data being sent from this sample.
- * 
- * <p>The other samples connect to your IBM Watson IoT Platform service instance
- * using device and application registrations that you have created with your
- * service instance.
- * 
- * <p>See each sample's Javadoc for more information.
- * 
- * <p>See {@code scripts/connectors/iotp/README} for information about running the samples.
- */
-package org.apache.edgent.samples.connectors.iotp;
-
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/jdbc/DbUtils.java b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/jdbc/DbUtils.java
deleted file mode 100644
index a0264f1..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/jdbc/DbUtils.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.connectors.jdbc;
-
-import java.lang.reflect.Method;
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.Properties;
-
-import javax.sql.DataSource;
-
-/**
- * Utilities for the sample's non-streaming JDBC database related actions.
- */
-public class DbUtils {
-    
-    /**
-     * Get the JDBC {@link DataSource} for the database.
-     * <p>
-     * The "db.name" property specifies the name of the database.
-     * Defaults to "JdbcConnectorSampleDb".
-     * 
-     * @param props configuration properties
-     * @return the DataSource
-     * @throws Exception on failure
-     */
-    public static DataSource getDataSource(Properties props) throws Exception {
-        return createDerbyEmbeddedDataSource(props);
-    }
-    
-    /**
-     * Initialize the sample's database.
-     * <p>
-     * Tables are created as needed and purged.
-     * @param ds the DataSource
-     * @throws Exception on failure
-     */
-    public static void initDb(DataSource ds) throws Exception {
-        createTables(ds);
-        purgeTables(ds);
-    }
-    
-    /**
-     * Purge the sample's tables
-     * @param ds the DataSource
-     * @throws Exception on failure
-     */
-    public static void purgeTables(DataSource ds) throws Exception {
-        try (Connection cn = ds.getConnection()) {
-            Statement stmt = cn.createStatement();
-            stmt.execute("DELETE FROM persons");
-        }
-    }
-
-    private static void createTables(DataSource ds) throws Exception {
-        try (Connection cn = ds.getConnection()) {
-            Statement stmt = cn.createStatement();
-            stmt.execute("CREATE TABLE persons "
-                    + "("
-                    + "id INTEGER NOT NULL,"
-                    + "firstname VARCHAR(40) NOT NULL,"
-                    + "lastname VARCHAR(40) NOT NULL,"
-                    + "PRIMARY KEY (id)"
-                    + ")"
-                    );
-        }
-        catch (SQLException e) {
-            if (e.getLocalizedMessage().contains("already exists"))
-                return;
-            else
-                throw e;
-        }
-   }
-
-   private static DataSource createDerbyEmbeddedDataSource(Properties props) throws Exception
-   {
-       String dbName = props.getProperty("db.name", "JdbcConnectorSampleDb");
-       
-       // For our sample, avoid a compile-time dependency to the jdbc driver.
-       // At runtime, require that the classpath can find it.
-
-       String DERBY_DATA_SOURCE = "org.apache.derby.jdbc.EmbeddedDataSource";
-   
-       Class<?> nsDataSource = null;
-       try {
-           nsDataSource = Class.forName(DERBY_DATA_SOURCE);
-       }
-       catch (ClassNotFoundException e) {
-           String msg = "Fix the test classpath. ";
-           if (System.getenv("DERBY_HOME") == null) {
-               msg += "DERBY_HOME not set. ";
-           }
-           msg += "Class not found: "+e.getLocalizedMessage();
-           System.err.println(msg);
-           throw new IllegalStateException(msg);
-       }
-       DataSource ds = (DataSource) nsDataSource.newInstance();
-
-       @SuppressWarnings("rawtypes")
-       Class[] methodParams = new Class[] {String.class};
-       Method dbname = nsDataSource.getMethod("setDatabaseName", methodParams);
-       Object[] args = new Object[] {dbName};
-       dbname.invoke(ds, args);
-
-       // create the db if necessary
-       Method create = nsDataSource.getMethod("setCreateDatabase", methodParams);
-       args = new Object[] {"create"};
-       create.invoke(ds, args);
-
-       // set the user
-       Method setuser = nsDataSource.getMethod("setUser", methodParams);
-       args = new Object[] { props.getProperty("db.user", System.getProperty("user.name")) };
-       setuser.invoke(ds, args);
-
-       // optionally set the pw
-       Method setpw = nsDataSource.getMethod("setPassword", methodParams);
-       args = new Object[] { props.getProperty("db.password") };
-       if (args[0] != null)
-           setpw.invoke(ds, args);
-   
-       return ds;
-   }
-}
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/jdbc/Person.java b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/jdbc/Person.java
deleted file mode 100644
index bb57629..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/jdbc/Person.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.connectors.jdbc;
-
-/**
- * A Person object for the sample.
- */
-public class Person {
-    int id;
-    String firstName;
-    String lastName;
-    Person(int id, String first, String last) {
-        this.id = id;
-        this.firstName = first;
-        this.lastName = last;
-    }
-    public String toString() {
-        return String.format("id=%d first=%s last=%s",
-                id, firstName, lastName);
-    }
-}
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/jdbc/PersonData.java b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/jdbc/PersonData.java
deleted file mode 100644
index f7f1211..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/jdbc/PersonData.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.connectors.jdbc;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Properties;
-import java.util.stream.Collectors;
-
-/**
- * Utilities for loading the sample's person data.
- */
-public class PersonData {
-    
-    /**
-     * Load the person data from the path specified by the "persondata.path"
-     * property.
-     * @param props configuration properties
-     * @return the loaded person data
-     * @throws Exception on failure
-     */
-    public static List<Person> loadPersonData(Properties props) throws Exception {
-        String pathname = props.getProperty("persondata.path");
-        List<Person> persons = new ArrayList<>();
-        Path path = new File(pathname).toPath();
-        try (BufferedReader br = Files.newBufferedReader(path)) {
-            int lineno = 0;
-            String line;
-            while ((line = br.readLine()) != null) {
-                lineno++;
-                Object[] fields = parseLine(line, lineno, pathname);
-                if (fields == null)
-                    continue;
-                persons.add(new Person((Integer)fields[0], (String)fields[1], (String)fields[2]));
-            }
-        }
-        return persons;
-    }
-    
-    private static Object[] parseLine(String line, int lineno, String pathname) {
-        line = line.trim();
-        if (line.startsWith("#"))
-            return null;
-
-        // id,firstName,lastName
-        String[] items = line.split(",");
-        if (items.length < 3)
-            throw new IllegalArgumentException("Invalid data on line "+lineno+" in "+pathname);
-        int id;
-        try {
-           id = new Integer(items[0]);
-           if (id < 1)
-               throw new IllegalArgumentException("Invalid data on line "+lineno+" in "+pathname);
-        }
-        catch (NumberFormatException e) {
-            throw new IllegalArgumentException("Invalid data on line "+lineno+" in "+pathname);
-        }
-        
-        Object[] fields = new Object[3];
-        fields[0] = id;
-        fields[1] = items[1].trim();
-        fields[2] = items[2].trim();
-        return fields;
-    }
-
-    /**
-     * Convert a {@code List<Person>} to a {@code List<PersonId>}
-     * @param persons the person list
-     * @return the person id list
-     */
-    public static List<PersonId> toPersonIds(List<Person> persons) {
-        return persons.stream()
-            .map(person -> new PersonId(person.id))
-            .collect(Collectors.toList());
-    }
-}
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/jdbc/PersonId.java b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/jdbc/PersonId.java
deleted file mode 100644
index 218a027..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/jdbc/PersonId.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.connectors.jdbc;
-
-/**
- * Another class containing a person id for the sample.
- */
-public class PersonId {
-    int id;
-    PersonId(int id) {
-        this.id = id;
-    }
-    public String toString() {
-        return String.format("id=%d", id);
-    }
-}
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/jdbc/SimpleReaderApp.java b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/jdbc/SimpleReaderApp.java
deleted file mode 100644
index 006b459..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/jdbc/SimpleReaderApp.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.connectors.jdbc;
-
-import java.io.File;
-import java.nio.file.Files;
-import java.util.List;
-import java.util.Properties;
-
-import org.apache.edgent.connectors.jdbc.JdbcStreams;
-import org.apache.edgent.providers.direct.DirectProvider;
-import org.apache.edgent.topology.TStream;
-import org.apache.edgent.topology.Topology;
-
-/**
- * A simple JDBC connector sample demonstrating streaming read access
- * of a dbms table and creating stream tuples from the results.
- */
-public class SimpleReaderApp {
-    private final Properties props;
-
-    public static void main(String[] args) throws Exception {
-        if (args.length != 1)
-            throw new Exception("missing pathname to jdbc.properties file");
-        SimpleReaderApp reader = new SimpleReaderApp(args[0]);
-        reader.run();
-    }
-
-    /**
-     * @param jdbcPropsPath pathname to properties file
-     */
-    SimpleReaderApp(String jdbcPropsPath) throws Exception {
-        props = new Properties();
-        props.load(Files.newBufferedReader(new File(jdbcPropsPath).toPath()));
-    }
-    
-    /**
-     * Create a topology for the writer application and run it.
-     */
-    private void run() throws Exception {
-        DirectProvider tp = new DirectProvider();
-        
-        // build the application/topology
-        
-        Topology t = tp.newTopology("jdbcSampleWriter");
-
-        // Create the JDBC connector
-        JdbcStreams myDb = new JdbcStreams(t,
-                () -> DbUtils.getDataSource(props),
-                dataSource -> dataSource.getConnection());
-        
-        // Create a sample stream of tuples containing a person id
-        List<PersonId> personIdList = PersonData.toPersonIds(PersonData.loadPersonData(props));
-        personIdList.add(new PersonId(99999));
-        TStream<PersonId> personIds = t.collection(personIdList);
-        
-        // For each tuple on the stream, read info from the db table
-        // using the "id", and create a Person tuple on the result stream.
-        TStream<Person> persons = myDb.executeStatement(personIds,
-                () -> "SELECT id, firstname, lastname FROM persons WHERE id = ?",
-                (personId,stmt) -> stmt.setInt(1, personId.id),
-                (personId,rSet,exc,resultStream) -> {
-                        if (exc != null) {
-                            // some failure processing this tuple. an error was logged.
-                            System.err.println("Unable to process id="+personId+": "+exc);
-                            return;
-                        }
-                        if (rSet.next()) {
-                            resultStream.accept(
-                                    new Person(rSet.getInt("id"),
-                                            rSet.getString("firstname"),
-                                            rSet.getString("lastname")));
-                        }
-                        else {
-                            System.err.println("Unknown person id="+personId.id);
-                        }
-                    }
-                );
-        
-        // print out Person tuples as they are retrieved 
-        persons.sink(person -> System.out.println("retrieved person: "+person));
-        
-        // run the application / topology
-        tp.submit(t);
-    }
-}
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/jdbc/SimpleWriterApp.java b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/jdbc/SimpleWriterApp.java
deleted file mode 100644
index 018c97b..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/jdbc/SimpleWriterApp.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.connectors.jdbc;
-
-import java.io.File;
-import java.nio.file.Files;
-import java.util.Properties;
-
-import org.apache.edgent.connectors.jdbc.JdbcStreams;
-import org.apache.edgent.providers.direct.DirectProvider;
-import org.apache.edgent.topology.TStream;
-import org.apache.edgent.topology.Topology;
-
-/**
- * A simple JDBC connector sample demonstrating streaming write access
- * of a dbms to add stream tuples to a table.
- */
-public class SimpleWriterApp {
-    private final Properties props;
-
-    public static void main(String[] args) throws Exception {
-        if (args.length != 1)
-            throw new Exception("missing pathname to jdbc.properties file");
-        SimpleWriterApp writer = new SimpleWriterApp(args[0]);
-        DbUtils.initDb(DbUtils.getDataSource(writer.props));
-        writer.run();
-    }
-
-    /**
-     * @param jdbcPropsPath pathname to properties file
-     */
-    SimpleWriterApp(String jdbcPropsPath) throws Exception {
-        props = new Properties();
-        props.load(Files.newBufferedReader(new File(jdbcPropsPath).toPath()));
-    }
-    
-    /**
-     * Create a topology for the writer application and run it.
-     */
-    private void run() throws Exception {
-        DirectProvider tp = new DirectProvider();
-        
-        // build the application/topology
-        
-        Topology t = tp.newTopology("jdbcSampleWriter");
-
-        // Create the JDBC connector
-        JdbcStreams myDb = new JdbcStreams(t,
-                () -> DbUtils.getDataSource(props),
-                dataSource -> dataSource.getConnection());
-        
-        // Create a sample stream of Person tuples
-        TStream<Person> persons = t.collection(PersonData.loadPersonData(props));
-        
-        // Write stream tuples to a table.
-        myDb.executeStatement(persons,
-                () -> "INSERT INTO persons VALUES(?,?,?)",
-                (person,stmt) -> {
-                    System.out.println("Inserting into persons table: person "+person);
-                    stmt.setInt(1, person.id);
-                    stmt.setString(2, person.firstName);
-                    stmt.setString(3, person.lastName);
-                    }
-                );
-        
-        // run the application / topology
-        tp.submit(t);
-    }
-}
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/jdbc/package-info.java b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/jdbc/package-info.java
deleted file mode 100644
index 4e88b77..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/jdbc/package-info.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-/**
- * Samples showing use of the
- * <a href="{@docRoot}/org/apache/edgent/connectors/jdbc/package-summary.html">
- *     JDBC stream connector</a>.
- * <p>
- * See &lt;edgent-release&gt;/scripts/connectors/jdbc/README to run the samples.
- * <p>
- * The following samples are provided:
- * <ul>
- * <li>SimpleReaderApp.java - a simple dbms reader application topology</li>
- * <li>SimpleWriterApp.java - a simple dbms writer application topology</li>
- * </ul>
- */
-package org.apache.edgent.samples.connectors.jdbc;
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/kafka/KafkaClient.java b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/kafka/KafkaClient.java
deleted file mode 100644
index 7d5a530..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/kafka/KafkaClient.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.connectors.kafka;
-
-import org.apache.edgent.samples.connectors.Options;
-
-/**
- * Demonstrate integrating with the Apache Kafka messaging system
- * <a href="http://kafka.apache.org">http://kafka.apache.org</a>.
- * <p>
- * {@link org.apache.edgent.connectors.kafka.KafkaProducer KafkaProducer} is
- * a connector used to create a bridge between topology streams
- * and publishing to Kafka topics.
- * <p>
- * {@link org.apache.edgent.connectors.kafka.KafkaConsumer KafkaConsumer} is
- * a connector used to create a bridge between topology streams
- * and subscribing to Kafka topics.
- * <p>
- * The client either publishes messages to a topic or   
- * subscribes to the topic and reports the messages received.
- * <p>
- * By default, a running Kafka cluster with the following
- * characteristics is assumed:
- * <ul>
- * <li>{@code bootstrap.servers="localhost:9092"}</li>
- * <li>{@code zookeeper.connect="localhost:2181"}</li>
- * <li>kafka topic {@code "kafkaSampleTopic"} exists</li>
- * </ul>
- * <p>
- * See the Apache Kafka link above for information about setting up a Kafka
- * cluster as well as creating a topic.
- * <p>
- * This may be executed from as:
- * <UL>
- * <LI>
- * {@code java -cp samples/lib/org.apache.edgent.samples.connectors.kafka.jar
- *  org.apache.edgent.samples.connectors.kafka.KafkaClient -h
- * } - Run directly from the command line.
- * </LI>
- * </UL>
- * <UL>
- * <LI>
- * An application execution within your IDE once you set the class path to include the correct jars.</LI>
- * </UL>
- */
-public class KafkaClient {
-    private static final String usage = "usage: "
-            + "\n" + "[-v] [-h]"
-            + "\n" + "pub | sub"
-            + "\n" + "[bootstrap.servers=<value>]"
-            + "\n" + "[zookeeper.connect=<value>]"
-            + "\n" + "[group.id=<value>]"
-            + "\n" + "[pubcnt=<value>]"
-            ;
-
-    public static void main(String[] args) throws Exception {
-        Options options = processArgs(args);
-        if (options == null)
-            return;
-
-        Runner.run(options);
-    }
-     
-    private static Options processArgs(String[] args) {
-        Options options = new Options();
-        initHandlers(options);
-        try {
-            options.processArgs(args);
-        }
-        catch (Exception e) {
-            System.err.println(e);
-            System.out.println(usage);
-            return null;
-        }
-        
-        if ((Boolean)options.get(OPT_HELP)) {
-            System.out.println(usage);
-            return null;
-        }
-        
-        if (!(Boolean)options.get(OPT_PUB) && !(Boolean)options.get(OPT_SUB)) {
-            System.err.println(String.format("Missing argument '%s' or '%s'.", OPT_PUB, OPT_SUB));
-            System.out.println(usage);
-            return null;
-        }
-        
-        String[] announceOpts = new String[] {
-        };
-        if ((Boolean)options.get(OPT_VERBOSE))
-            announceOpts = options.getAll().stream().map(e -> e.getKey()).toArray(String[]::new);
-        for (String opt : announceOpts) {
-            Object value = options.get(opt);
-            if (value != null) {
-                if (opt.toLowerCase().contains("password"))
-                    value = "*****";
-                System.out.println("Using "+opt+"="+value);
-            }
-        }
-        
-        return options;
-    }
-    
-    static final String OPT_VERBOSE = "-v";
-    static final String OPT_HELP = "-h";
-    static final String OPT_PUB = "pub";
-    static final String OPT_SUB = "sub";
-    static final String OPT_BOOTSTRAP_SERVERS = "bootstrap.servers";
-    static final String OPT_ZOOKEEPER_CONNECT = "zookeeper.connect";
-    static final String OPT_GROUP_ID = "group.id";
-    static final String OPT_TOPIC = "topic";
-    static final String OPT_PUB_CNT = "pubcnt";
-    
-    private static void initHandlers(Options opts) {
-        // options for which we have a default
-        opts.addHandler(OPT_HELP, null, false);
-        opts.addHandler(OPT_VERBOSE, null, false);
-        opts.addHandler(OPT_PUB, null, false);
-        opts.addHandler(OPT_SUB, null, false);
-        opts.addHandler(OPT_BOOTSTRAP_SERVERS, v -> v, "localhost:9092");
-        opts.addHandler(OPT_ZOOKEEPER_CONNECT, v -> v, "localhost:2181");
-        opts.addHandler(OPT_TOPIC, v -> v, "kafkaSampleTopic");
-        opts.addHandler(OPT_PUB_CNT, v -> Integer.valueOf(v), -1);
-
-        // optional options (no default value)
-        opts.addHandler(OPT_GROUP_ID, v -> v);
-    }
-    
-}
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/kafka/PublisherApp.java b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/kafka/PublisherApp.java
deleted file mode 100644
index 6746a7d..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/kafka/PublisherApp.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.connectors.kafka;
-
-import static org.apache.edgent.samples.connectors.kafka.KafkaClient.OPT_BOOTSTRAP_SERVERS;
-import static org.apache.edgent.samples.connectors.kafka.KafkaClient.OPT_PUB_CNT;
-import static org.apache.edgent.samples.connectors.kafka.KafkaClient.OPT_TOPIC;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.edgent.samples.connectors.MsgSupplier;
-import org.apache.edgent.samples.connectors.Options;
-import org.apache.edgent.topology.TStream;
-import org.apache.edgent.topology.Topology;
-import org.apache.edgent.topology.TopologyProvider;
-
-import org.apache.edgent.connectors.kafka.KafkaProducer;
-
-/**
- * A Kafka producer/publisher topology application.
- */
-public class PublisherApp {
-    private final TopologyProvider tp;
-    private final Options options;
-
-    /**
-     * @param tp the TopologyProvider to use.
-     * @param options
-     */
-    PublisherApp(TopologyProvider tp, Options options) {
-        this.tp = tp;
-        this.options = options;
-    }
-    
-    /**
-     * Create a topology for the publisher application.
-     * @return the Topology
-     */
-    public Topology buildAppTopology() {
-        Topology t = tp.newTopology("kafkaClientPublisher");
-        
-        // Create a sample stream of tuples to publish
-        TStream<String> msgs = t.poll(new MsgSupplier(options.get(OPT_PUB_CNT)),
-                                        1L, TimeUnit.SECONDS);
-
-        // Create the KafkaProducer broker connector
-        Map<String,Object> config = newConfig();
-        KafkaProducer kafka = new KafkaProducer(t, () -> config);
-        
-        // Publish the stream to the topic.  The String tuple is the message value.
-        kafka.publish(msgs, options.get(OPT_TOPIC));
-        
-        return t;
-    }
-    
-    private Map<String,Object> newConfig() {
-        Map<String,Object> config = new HashMap<>();
-        // required kafka configuration items
-        config.put("bootstrap.servers", options.get(OPT_BOOTSTRAP_SERVERS));
-        return config;
-    }
-
-}
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/kafka/README b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/kafka/README
deleted file mode 100644
index 6554f8b..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/kafka/README
+++ /dev/null
@@ -1,26 +0,0 @@
-Sample Kafka Publisher and Subscriber topology applications.
-
-By default the samples assume the following kafka broker configuration:
-- bootstrap.servers="localhost:9092"
-- zookeeper.connect="localhost:2181"
-- kafka topic "kafkaSampleTopic" exists
-- no authentication
-
-See http://kafka.apache.org for the code and setup information for
-a Kafka broker.
-
-see scripts/connectors/kafka/README to run them
-
-The simple sample
------------------
-
-SimplePublisherApp.java - build and run the simple publisher application topology
-SimpleSubscriberApp.java - build and run the simple subscriber application topology
-
-The fully configurable client
------------------------------
-
-Runner.java - build and run the publisher or subscriber
-PublisherApp.java - build the publisher application topology
-SubscriberApp.java - build the subscriber application topology
-KafkaClient.java - the client's command line interface
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/kafka/Runner.java b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/kafka/Runner.java
deleted file mode 100644
index 2ffccfc..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/kafka/Runner.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.connectors.kafka;
-
-import static org.apache.edgent.samples.connectors.kafka.KafkaClient.OPT_BOOTSTRAP_SERVERS;
-import static org.apache.edgent.samples.connectors.kafka.KafkaClient.OPT_PUB;
-import static org.apache.edgent.samples.connectors.kafka.KafkaClient.OPT_TOPIC;
-import static org.apache.edgent.samples.connectors.kafka.KafkaClient.OPT_ZOOKEEPER_CONNECT;
-
-import org.apache.edgent.console.server.HttpServer;
-import org.apache.edgent.providers.development.DevelopmentProvider;
-import org.apache.edgent.samples.connectors.Options;
-import org.apache.edgent.topology.Topology;
-
-/**
- * Build and run the publisher or subscriber application.
- */
-public class Runner {
-    /**
-     * Build and run the publisher or subscriber application.
-     * @param options command line options
-     * @throws Exception on failure
-     */
-    public static void run(Options options) throws Exception {
-        boolean isPub = options.get(OPT_PUB); 
-
-        // Get a topology runtime provider
-        DevelopmentProvider tp = new DevelopmentProvider();
-
-        Topology top;
-        if (isPub) {
-            PublisherApp publisher = new PublisherApp(tp, options);
-            top = publisher.buildAppTopology();
-        }
-        else {
-            SubscriberApp subscriber = new SubscriberApp(tp, options);
-            top = subscriber.buildAppTopology();
-        }
-        
-        // Submit the app/topology; send or receive the messages.
-        System.out.println(
-                "Using Kafka cluster at bootstrap.servers="
-                + options.get(OPT_BOOTSTRAP_SERVERS)
-                + " zookeeper.connect=" + options.get(OPT_ZOOKEEPER_CONNECT)
-                + "\n" + (isPub ? "Publishing" : "Subscribing") 
-                + " to topic " + options.get(OPT_TOPIC));
-        System.out.println("Console URL for the job: "
-                + tp.getServices().getService(HttpServer.class).getConsoleUrl());
-        tp.submit(top);
-    }
-
-}
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/kafka/SimplePublisherApp.java b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/kafka/SimplePublisherApp.java
deleted file mode 100644
index a8b9492..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/kafka/SimplePublisherApp.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.connectors.kafka;
-
-import java.io.File;
-import java.nio.file.Files;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.apache.edgent.console.server.HttpServer;
-import org.apache.edgent.providers.development.DevelopmentProvider;
-import org.apache.edgent.samples.connectors.Util;
-import org.apache.edgent.topology.TStream;
-import org.apache.edgent.topology.Topology;
-
-import org.apache.edgent.connectors.kafka.KafkaProducer;
-
-/**
- * A simple Kafka publisher topology application.
- */
-public class SimplePublisherApp {
-    private final Properties props;
-    private final String topic;
-
-    public static void main(String[] args) throws Exception {
-        if (args.length != 1)
-            throw new Exception("missing pathname to kafka.properties file");
-        SimplePublisherApp publisher = new SimplePublisherApp(args[0]);
-        publisher.run();
-    }
-
-    /**
-     * @param kafkaPropsPath pathname to properties file
-     */
-    SimplePublisherApp(String kafkaPropsPath) throws Exception {
-        props = new Properties();
-        props.load(Files.newBufferedReader(new File(kafkaPropsPath).toPath()));
-        topic = props.getProperty("topic");
-    }
-    
-    private Map<String,Object> createKafkaConfig() {
-        Map<String,Object> kafkaConfig = new HashMap<>();
-        kafkaConfig.put("bootstrap.servers", props.get("bootstrap.servers"));
-        return kafkaConfig;
-    }
-    
-    /**
-     * Create a topology for the publisher application and run it.
-     */
-    private void run() throws Exception {
-        DevelopmentProvider tp = new DevelopmentProvider();
-        
-        // build the application/topology
-        
-        Topology t = tp.newTopology("kafkaSamplePublisher");
-
-        // Create the Kafka Producer broker connector
-        Map<String,Object> kafkaConfig = createKafkaConfig();
-        KafkaProducer kafka = new KafkaProducer(t, () -> kafkaConfig);
-        
-        // Create a sample stream of tuples to publish
-        AtomicInteger cnt = new AtomicInteger();
-        TStream<String> msgs = t.poll(
-                () -> {
-                    String msg = String.format("Message-%d from %s",
-                            cnt.incrementAndGet(), Util.simpleTS());
-                    System.out.println("poll generated msg to publish: " + msg);
-                    return msg;
-                }, 1L, TimeUnit.SECONDS);
-        
-        // Publish the stream to the topic.  The String tuple is the message value.
-        kafka.publish(msgs, topic);
-        
-        // run the application / topology
-        System.out.println("Console URL for the job: "
-                + tp.getServices().getService(HttpServer.class).getConsoleUrl());
-        tp.submit(t);
-    }
-
-}
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/kafka/SimpleSubscriberApp.java b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/kafka/SimpleSubscriberApp.java
deleted file mode 100644
index 7cef424..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/kafka/SimpleSubscriberApp.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.connectors.kafka;
-
-import java.io.File;
-import java.nio.file.Files;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
-
-import org.apache.edgent.console.server.HttpServer;
-import org.apache.edgent.providers.development.DevelopmentProvider;
-import org.apache.edgent.samples.connectors.Util;
-import org.apache.edgent.topology.TStream;
-import org.apache.edgent.topology.Topology;
-
-import org.apache.edgent.connectors.kafka.KafkaConsumer;
-
-/**
- * A simple Kafka subscriber topology application.
- */
-public class SimpleSubscriberApp {
-    private final Properties props;
-    private final String topic;
-
-    public static void main(String[] args) throws Exception {
-        if (args.length != 1)
-            throw new Exception("missing pathname to kafka.properties file");
-        SimpleSubscriberApp subscriber = new SimpleSubscriberApp(args[0]);
-        subscriber.run();
-    }
-
-    /**
-     * @param kafkaPropsPath pathname to properties file
-     */
-    SimpleSubscriberApp(String kafkaPropsPath) throws Exception {
-        props = new Properties();
-        props.load(Files.newBufferedReader(new File(kafkaPropsPath).toPath()));
-        topic = props.getProperty("topic");
-    }
-    
-    private Map<String,Object> createKafkaConfig() {
-        Map<String,Object> kafkaConfig = new HashMap<>();
-        kafkaConfig.put("zookeeper.connect", props.get("zookeeper.connect"));
-        // for the sample, be insensitive to old/multiple consumers for
-        // the topic/groupId hanging around
-        kafkaConfig.put("group.id", 
-                "kafkaSampleConsumer_" + Util.simpleTS().replaceAll(":", ""));
-        return kafkaConfig;
-    }
-    
-    /**
-     * Create a topology for the subscriber application and run it.
-     */
-    private void run() throws Exception {
-        DevelopmentProvider tp = new DevelopmentProvider();
-        
-        // build the application/topology
-        
-        Topology t = tp.newTopology("kafkaSampleSubscriber");
-        
-        // Create the Kafka Consumer broker connector
-        Map<String,Object> kafkaConfig = createKafkaConfig();
-        KafkaConsumer kafka = new KafkaConsumer(t, () -> kafkaConfig);
-        
-        // Subscribe to the topic and create a stream of messages
-        TStream<String> msgs = kafka.subscribe(rec -> rec.value(), topic);
-        
-        // Process the received msgs - just print them out
-        msgs.sink(tuple -> System.out.println(
-                String.format("[%s] received: %s", Util.simpleTS(), tuple)));
-        
-        // run the application / topology
-        System.out.println("Console URL for the job: "
-                + tp.getServices().getService(HttpServer.class).getConsoleUrl());
-        tp.submit(t);
-    }
-
-}
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/kafka/SubscriberApp.java b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/kafka/SubscriberApp.java
deleted file mode 100644
index 7405f39..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/kafka/SubscriberApp.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.connectors.kafka;
-
-import static org.apache.edgent.samples.connectors.kafka.KafkaClient.OPT_GROUP_ID;
-import static org.apache.edgent.samples.connectors.kafka.KafkaClient.OPT_TOPIC;
-import static org.apache.edgent.samples.connectors.kafka.KafkaClient.OPT_ZOOKEEPER_CONNECT;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.edgent.samples.connectors.Options;
-import org.apache.edgent.samples.connectors.Util;
-import org.apache.edgent.topology.TStream;
-import org.apache.edgent.topology.Topology;
-import org.apache.edgent.topology.TopologyProvider;
-
-import org.apache.edgent.connectors.kafka.KafkaConsumer;
-
-/**
- * A Kafka consumer/subscriber topology application.
- */
-public class SubscriberApp {
-    private final TopologyProvider tp;
-    private final Options options;
-    private final String uniq = Util.simpleTS();
-
-    /**
-     * @param top the TopologyProvider to use.
-     * @param options
-     */
-    SubscriberApp(TopologyProvider tp, Options options) {
-        this.tp = tp;
-        this.options = options;
-    }
-    
-    /**
-     * Create a topology for the subscriber application.
-     * @return the Topology
-     */
-    public Topology buildAppTopology() {
-        Topology t = tp.newTopology("kafkaClientSubscriber");
-
-        // Create the KafkaConsumer broker connector
-        Map<String,Object> config = newConfig(t);
-        KafkaConsumer kafka = new KafkaConsumer(t, () -> config);
-        
-        System.out.println("Using Kafka consumer group.id "
-                            + config.get(OPT_GROUP_ID));
-        
-        // Subscribe to the topic and create a stream of messages
-        TStream<String> msgs = kafka.subscribe(rec -> rec.value(),
-                                                (String)options.get(OPT_TOPIC));
-        
-        // Process the received msgs - just print them out
-        msgs.sink(tuple -> System.out.println(
-                String.format("[%s] received: %s", Util.simpleTS(), tuple)));
-        
-        return t;
-    }
-    
-    private Map<String,Object> newConfig(Topology t) {
-        Map<String,Object> config = new HashMap<>();
-        // required kafka configuration items
-        config.put("zookeeper.connect", options.get(OPT_ZOOKEEPER_CONNECT));
-        config.put("group.id", options.get(OPT_GROUP_ID, newGroupId(t.getName())));
-        return config;
-    }
-    
-    private String newGroupId(String name) {
-        // be insensitive to old consumers for the topic/groupId hanging around
-        String groupId = name + "_" + uniq.replaceAll(":", "");
-        return groupId;
-    }
-}
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/kafka/package-info.java b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/kafka/package-info.java
deleted file mode 100644
index 761d053..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/kafka/package-info.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-/**
- * Samples showing use of the
- * <a href="{@docRoot}/org/apache/edgent/connectors/kafka/package-summary.html">
- *     Apache Kafka stream connector</a>.
- * <p>
- * See &lt;edgent-release&gt;/scripts/connectors/kafka/README to run the samples.
- * <p>
- * The following simple samples are provided:
- * <ul>
- * <li>SimplePublisherApp.java - a simple publisher application topology</li>
- * <li>SimpleSubscriberApp.java - a simple subscriber application topology</li>
- * </ul>
- * The remaining classes are part of a sample that more fully exposes
- * controlling various configuration options.
- */
-package org.apache.edgent.samples.connectors.kafka;
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/mqtt/MqttClient.java b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/mqtt/MqttClient.java
deleted file mode 100644
index 9cf6c37..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/mqtt/MqttClient.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.connectors.mqtt;
-
-import org.apache.edgent.samples.connectors.Options;
-
-/**
- * Demonstrate integrating with the MQTT messaging system
- * <a href="http://mqtt.org">http://mqtt.org</a>.
- * <p>
- * {@link org.apache.edgent.connectors.mqtt.MqttStreams MqttStreams} is
- * a connector used to create a bridge between topology streams
- * and an MQTT broker.
- * <p>
- * The client either publishes some messages to a MQTT topic  
- * or subscribes to the topic and reports the messages received.
- * <p>
- * By default, a running MQTT broker with the following
- * characteristics is assumed:
- * <ul>
- * <li>the broker's connection is {@code tcp://localhost:1883}</li>
- * <li>the broker is configured for no authentication</li>
- * </ul>
- * <p>
- * See the MQTT link above for information about setting up a MQTT broker.
- * <p>
- * This may be executed as:
- * <UL>
- * <LI>
- * {@code java -cp samples/lib/org.apache.edgent.samples.connectors.mqtt.jar
- *  org.apache.edgent.samples.connectors.mqtt.MqttClient -h
- * } - Run directly from the command line.
- * </LI>
- * <LI>
- * Specify absolute pathnames if using the {@code trustStore}
- * or {@code keyStore} arguments.
- * </LI>
- * <LI>
- * An application execution within your IDE once you set the class path to include the correct jars.
- * </LI>
- * </UL>
- */
-public class MqttClient {
-    private static final String usage = "usage: "
-            + "\n" + "[-v] [-h]"
-            + "\n" + "pub | sub"
-            + "\n" + "[serverURI=<value>]"
-            + "\n" + "[clientId=<value>]"
-            + "\n" + "[cleanSession=<true|false>]"
-            + "\n" + "[topic=<value>] [qos=<value>]"
-            + "\n" + "[retain]"
-            + "\n" + "[pubcnt=<value>]"
-            + "\n" + "[cnTimeout=<value>]"
-            + "\n" + "[actionTimeoutMillis=<value>]"
-            + "\n" + "[idleTimeout=<value>]"
-            + "\n" + "[idleReconnectInterval=<value>]"
-            + "\n" + "[userID=<value>] [password=<value>]"
-            + "\n" + "[trustStore=<value>] [trustStorePassword=<value>]"
-            + "\n" + "[keyStore=<value>] [keyStorePassword=<value>]"
-            ;
-
-    public static void main(String[] args) throws Exception {
-        Options options = processArgs(args);
-        if (options == null)
-            return;
-
-        Runner.run(options);
-    }
-    
-    private static Options processArgs(String[] args) {
-        Options options = new Options();
-        initHandlers(options);
-        try {
-            options.processArgs(args);
-        }
-        catch (Exception e) {
-            System.err.println(e);
-            System.out.println(usage);
-            return null;
-        }
-        
-        if ((Boolean)options.get(OPT_HELP)) {
-            System.out.println(usage);
-            return null;
-        }
-               
-        if (!(Boolean)options.get(OPT_PUB) && !(Boolean)options.get(OPT_SUB)) {
-            System.err.println(String.format("Missing argument '%s' or '%s'.", OPT_PUB, OPT_SUB));
-            System.out.println(usage);
-            return null;
-        }
-
-        if (options.get(OPT_PASSWORD) != null)
-            options.put(OPT_USER_ID, options.get(OPT_USER_ID, System.getProperty("user.name")));
-        
-        String[] announceOpts = new String[] {
-                OPT_USER_ID,
-                OPT_PASSWORD,
-                OPT_TRUST_STORE,
-                OPT_TRUST_STORE_PASSWORD,
-                OPT_KEY_STORE,
-                OPT_KEY_STORE_PASSWORD
-        };
-        if ((Boolean)options.get(OPT_VERBOSE))
-            announceOpts = options.getAll().stream().map(e -> e.getKey()).toArray(String[]::new);
-        for (String opt : announceOpts) {
-            Object value = options.get(opt);
-            if (value != null) {
-                if (opt.toLowerCase().contains("password"))
-                    value = "*****";
-                System.out.println("Using "+opt+"="+value);
-            }
-        }
-        
-        return options;
-    }
-    
-    static final String OPT_VERBOSE = "-v";
-    static final String OPT_HELP = "-h";
-    static final String OPT_PUB = "pub";
-    static final String OPT_SUB = "sub";
-    static final String OPT_SERVER_URI = "serverURI";
-    static final String OPT_CLIENT_ID = "clientId";
-    static final String OPT_CN_TIMEOUT_SEC = "cnTimeout";
-    static final String OPT_ACTION_TIMEOUT_MILLIS = "actionTimeoutMillis";
-    static final String OPT_QOS = "qos";
-    static final String OPT_TOPIC = "topic";
-    static final String OPT_CLEAN_SESSION = "cleanSession";
-    static final String OPT_RETAIN = "retain";
-    static final String OPT_USER_ID = "userID";
-    static final String OPT_PASSWORD = "password";
-    static final String OPT_TRUST_STORE = "trustStore";
-    static final String OPT_TRUST_STORE_PASSWORD = "trustStorePassword";
-    static final String OPT_KEY_STORE = "keyStore";
-    static final String OPT_KEY_STORE_PASSWORD = "keyStorePassword";
-    static final String OPT_PUB_CNT = "pubcnt";
-    static final String OPT_IDLE_TIMEOUT_SEC = "idleTimeout";
-    static final String OPT_IDLE_RECONNECT_INTERVAL_SEC = "idleReconnectInterval";
-    
-    private static void initHandlers(Options opts) {
-        // options for which we have a default
-        opts.addHandler(OPT_HELP, null, false);
-        opts.addHandler(OPT_VERBOSE, null, false);
-        opts.addHandler(OPT_PUB, null, false);
-        opts.addHandler(OPT_SUB, null, false);
-        opts.addHandler(OPT_SERVER_URI, v -> v, "tcp://localhost:1883");
-        opts.addHandler(OPT_TOPIC, v -> v, "mqttSampleTopic");
-        opts.addHandler(OPT_RETAIN, null, false);
-        opts.addHandler(OPT_PUB_CNT, v -> Integer.valueOf(v), -1);
-        opts.addHandler(OPT_QOS, v -> Integer.valueOf(v), 0);
-
-        // optional options (no default value)
-        opts.addHandler(OPT_CLIENT_ID, v -> v);
-        opts.addHandler(OPT_CN_TIMEOUT_SEC, v -> Integer.valueOf(v));
-        opts.addHandler(OPT_ACTION_TIMEOUT_MILLIS, v -> Long.valueOf(v));
-        opts.addHandler(OPT_CLEAN_SESSION, v -> Boolean.valueOf(v));
-        opts.addHandler(OPT_USER_ID, v -> v);
-        opts.addHandler(OPT_PASSWORD, v -> v);
-        opts.addHandler(OPT_TRUST_STORE, v -> v);
-        opts.addHandler(OPT_TRUST_STORE_PASSWORD, v -> v);
-        opts.addHandler(OPT_KEY_STORE, v -> v);
-        opts.addHandler(OPT_KEY_STORE_PASSWORD, v -> v);
-        opts.addHandler(OPT_IDLE_TIMEOUT_SEC, v -> Integer.valueOf(v));
-        opts.addHandler(OPT_IDLE_RECONNECT_INTERVAL_SEC, v -> Integer.valueOf(v));
-    }
-    
-}
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/mqtt/PublisherApp.java b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/mqtt/PublisherApp.java
deleted file mode 100644
index 4be6ce5..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/mqtt/PublisherApp.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.connectors.mqtt;
-
-import static org.apache.edgent.samples.connectors.mqtt.MqttClient.OPT_PUB_CNT;
-import static org.apache.edgent.samples.connectors.mqtt.MqttClient.OPT_QOS;
-import static org.apache.edgent.samples.connectors.mqtt.MqttClient.OPT_RETAIN;
-import static org.apache.edgent.samples.connectors.mqtt.MqttClient.OPT_TOPIC;
-
-import java.util.concurrent.TimeUnit;
-
-import org.apache.edgent.connectors.mqtt.MqttConfig;
-import org.apache.edgent.connectors.mqtt.MqttStreams;
-import org.apache.edgent.samples.connectors.MsgSupplier;
-import org.apache.edgent.samples.connectors.Options;
-import org.apache.edgent.topology.TStream;
-import org.apache.edgent.topology.Topology;
-import org.apache.edgent.topology.TopologyProvider;
-
-/**
- * A MQTT publisher topology application.
- */
-public class PublisherApp {
-    private final TopologyProvider tp;
-    private final Options options;
-
-    /**
-     * @param tp the TopologyProvider to use.
-     * @param options
-     */
-    PublisherApp(TopologyProvider tp, Options options) {
-        this.tp = tp;
-        this.options = options;
-    }
-    
-    /**
-     * Create a topology for the publisher application.
-     * @return the Topology
-     */
-    public Topology buildAppTopology() {
-        Topology t = tp.newTopology("mqttClientPublisher");
-        
-        // Create a sample stream of tuples to publish
-        TStream<String> msgs = t.poll(new MsgSupplier(options.get(OPT_PUB_CNT)),
-                                        1L, TimeUnit.SECONDS);
-
-        // Create the MQTT broker connector
-        MqttConfig config= Runner.newConfig(options);
-        MqttStreams mqtt = new MqttStreams(t, () -> config);
-        
-        // Publish the stream to the topic.  The String tuple is the message value.
-        mqtt.publish(msgs, options.get(OPT_TOPIC), 
-                    options.get(OPT_QOS), options.get(OPT_RETAIN));
-        
-        return t;
-    }
-
-}
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/mqtt/README b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/mqtt/README
deleted file mode 100644
index 7760f50..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/mqtt/README
+++ /dev/null
@@ -1,24 +0,0 @@
-Sample MQTT Publisher and Subscriber topology applications.
-
-By default, the following MQTT broker configuration is assumed:
-- the broker's connection URL is tcp://localhost:1883
-- the broker is configured for no authentication
-
-See http://mqtt.org for the code and setup information for
-a mqtt broker.
-
-see scripts/connectors/mqtt/README to run them
-
-The simple sample
------------------
-
-SimplePublisherApp.java - build and run the simple publisher application topology
-SimpleSubscriberApp.java - build and run the simple subscriber application topology
-
-The fully configurable clients
-------------------------------
-
-Runner.java - build and run the publisher or subscriber
-PublisherApp.java - build the publisher application topology
-SubscriberApp.java - build the subscriber application topology
-MqttClient.java - the client's command line interface
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/mqtt/Runner.java b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/mqtt/Runner.java
deleted file mode 100644
index 5e9ee4a..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/mqtt/Runner.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.connectors.mqtt;
-
-import static org.apache.edgent.samples.connectors.mqtt.MqttClient.OPT_ACTION_TIMEOUT_MILLIS;
-import static org.apache.edgent.samples.connectors.mqtt.MqttClient.OPT_CLEAN_SESSION;
-import static org.apache.edgent.samples.connectors.mqtt.MqttClient.OPT_CLIENT_ID;
-import static org.apache.edgent.samples.connectors.mqtt.MqttClient.OPT_CN_TIMEOUT_SEC;
-import static org.apache.edgent.samples.connectors.mqtt.MqttClient.OPT_IDLE_RECONNECT_INTERVAL_SEC;
-import static org.apache.edgent.samples.connectors.mqtt.MqttClient.OPT_IDLE_TIMEOUT_SEC;
-import static org.apache.edgent.samples.connectors.mqtt.MqttClient.OPT_KEY_STORE;
-import static org.apache.edgent.samples.connectors.mqtt.MqttClient.OPT_KEY_STORE_PASSWORD;
-import static org.apache.edgent.samples.connectors.mqtt.MqttClient.OPT_PASSWORD;
-import static org.apache.edgent.samples.connectors.mqtt.MqttClient.OPT_PUB;
-import static org.apache.edgent.samples.connectors.mqtt.MqttClient.OPT_SERVER_URI;
-import static org.apache.edgent.samples.connectors.mqtt.MqttClient.OPT_TOPIC;
-import static org.apache.edgent.samples.connectors.mqtt.MqttClient.OPT_TRUST_STORE;
-import static org.apache.edgent.samples.connectors.mqtt.MqttClient.OPT_TRUST_STORE_PASSWORD;
-import static org.apache.edgent.samples.connectors.mqtt.MqttClient.OPT_USER_ID;
-
-import org.apache.edgent.connectors.mqtt.MqttConfig;
-import org.apache.edgent.console.server.HttpServer;
-import org.apache.edgent.providers.development.DevelopmentProvider;
-import org.apache.edgent.samples.connectors.Options;
-import org.apache.edgent.topology.Topology;
-
-/**
- * Build and run the publisher or subscriber application.
- */
-public class Runner {
-    
-    /**
-     * Build and run the publisher or subscriber application.
-     * @param options command line options
-     * @throws Exception on failure
-     */
-    public static void run(Options options) throws Exception {
-        boolean isPub = options.get(OPT_PUB); 
-
-        // Get a topology runtime provider
-        DevelopmentProvider tp = new DevelopmentProvider();
-
-        Topology top;
-        if (isPub) {
-            PublisherApp publisher = new PublisherApp(tp, options);
-            top = publisher.buildAppTopology();
-        }
-        else {
-            SubscriberApp subscriber = new SubscriberApp(tp, options);
-            top = subscriber.buildAppTopology();
-        }
-
-        // System.setProperty("javax.net.debug", "ssl"); // or "all"; "help" for full list
-        
-        // Submit the app/topology; send or receive the messages.
-        System.out.println(
-                "Using MQTT broker at " + options.get(OPT_SERVER_URI)
-                + "\n" + (isPub ? "Publishing" : "Subscribing")
-                + " to topic "+options.get(OPT_TOPIC));
-        System.out.println("Console URL for the job: "
-                + tp.getServices().getService(HttpServer.class).getConsoleUrl());
-        tp.submit(top);
-    }
-
-    /**
-     * Build a MqttConfig broker connector configuration.
-     * @param options command line options
-     * @return the connector configuration
-     */
-    static MqttConfig newConfig(Options options) {
-        // Only the serverURI is required.  Everything else is optional.
-        MqttConfig config = new MqttConfig(options.get(OPT_SERVER_URI),
-                                            options.get(OPT_CLIENT_ID));
-        
-        if (options.get(OPT_CLEAN_SESSION) != null)
-            config.setCleanSession(options.get(OPT_CLEAN_SESSION));
-        if (options.get(OPT_CN_TIMEOUT_SEC) != null)
-            config.setConnectionTimeout(options.get(OPT_CN_TIMEOUT_SEC));
-        if (options.get(OPT_ACTION_TIMEOUT_MILLIS) != null)
-            config.setActionTimeToWaitMillis(options.get(OPT_ACTION_TIMEOUT_MILLIS));
-        if (options.get(OPT_IDLE_TIMEOUT_SEC) != null)
-            config.setIdleTimeout(options.get(OPT_IDLE_TIMEOUT_SEC));
-        if (options.get(OPT_IDLE_RECONNECT_INTERVAL_SEC) != null)
-            config.setSubscriberIdleReconnectInterval(options.get(OPT_IDLE_RECONNECT_INTERVAL_SEC));
-        if (options.get(OPT_USER_ID) != null)
-            config.setUserName(options.get(OPT_USER_ID));
-        if (options.get(OPT_PASSWORD) != null)
-            config.setPassword(((String)options.get(OPT_PASSWORD)).toCharArray());
-        if (options.get(OPT_TRUST_STORE) != null)
-            config.setTrustStore(options.get(OPT_TRUST_STORE));
-        if (options.get(OPT_TRUST_STORE_PASSWORD) != null)
-            config.setTrustStore(options.get(OPT_TRUST_STORE_PASSWORD));
-        if (options.get(OPT_KEY_STORE) != null)
-            config.setKeyStore(options.get(OPT_KEY_STORE));
-        if (options.get(OPT_KEY_STORE_PASSWORD) != null)
-            config.setTrustStore(options.get(OPT_KEY_STORE_PASSWORD));
-        return config;
-    }
-
-}
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/mqtt/SimplePublisherApp.java b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/mqtt/SimplePublisherApp.java
deleted file mode 100644
index bc6395a..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/mqtt/SimplePublisherApp.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.connectors.mqtt;
-
-import java.io.File;
-import java.nio.file.Files;
-import java.util.Properties;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.apache.edgent.connectors.mqtt.MqttConfig;
-import org.apache.edgent.connectors.mqtt.MqttStreams;
-import org.apache.edgent.console.server.HttpServer;
-import org.apache.edgent.providers.development.DevelopmentProvider;
-import org.apache.edgent.samples.connectors.Util;
-import org.apache.edgent.topology.TStream;
-import org.apache.edgent.topology.Topology;
-
-/**
- * A simple MQTT publisher topology application.
- */
-public class SimplePublisherApp {
-    private final Properties props;
-    private final String topic;
-
-    public static void main(String[] args) throws Exception {
-        if (args.length != 1)
-            throw new Exception("missing pathname to mqtt.properties file");
-        SimplePublisherApp publisher = new SimplePublisherApp(args[0]);
-        publisher.run();
-    }
-
-    /**
-     * @param mqttPropsPath pathname to properties file
-     */
-    SimplePublisherApp(String mqttPropsPath) throws Exception {
-        props = new Properties();
-        props.load(Files.newBufferedReader(new File(mqttPropsPath).toPath()));
-        topic = props.getProperty("mqtt.topic");
-    }
-    
-    private MqttConfig createMqttConfig() {
-        MqttConfig mqttConfig = MqttConfig.fromProperties(props);
-        return mqttConfig;
-    }
-    
-    /**
-     * Create a topology for the publisher application and run it.
-     */
-    private void run() throws Exception {
-        DevelopmentProvider tp = new DevelopmentProvider();
-        
-        // build the application/topology
-        
-        Topology t = tp.newTopology("mqttSamplePublisher");
-        
-        // System.setProperty("javax.net.debug", "ssl"); // or "all"; "help" for full list
-
-        // Create the MQTT broker connector
-        MqttConfig mqttConfig = createMqttConfig();
-        MqttStreams mqtt = new MqttStreams(t, () -> mqttConfig);
-        
-        // Create a sample stream of tuples to publish
-        AtomicInteger cnt = new AtomicInteger();
-        TStream<String> msgs = t.poll(
-                () -> {
-                    String msg = String.format("Message-%d from %s",
-                            cnt.incrementAndGet(), Util.simpleTS());
-                    System.out.println("poll generated msg to publish: " + msg);
-                    return msg;
-                }, 1L, TimeUnit.SECONDS);
-        
-        // Publish the stream to the topic.  The String tuple is the message value.
-        mqtt.publish(msgs, topic, 0/*qos*/, false/*retain*/);
-        
-        // run the application / topology
-        System.out.println("Console URL for the job: "
-                + tp.getServices().getService(HttpServer.class).getConsoleUrl());
-        tp.submit(t);
-    }
-
-}
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/mqtt/SimpleSubscriberApp.java b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/mqtt/SimpleSubscriberApp.java
deleted file mode 100644
index efa1d95..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/mqtt/SimpleSubscriberApp.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.connectors.mqtt;
-
-import java.io.File;
-import java.nio.file.Files;
-import java.util.Properties;
-
-import org.apache.edgent.connectors.mqtt.MqttConfig;
-import org.apache.edgent.connectors.mqtt.MqttStreams;
-import org.apache.edgent.console.server.HttpServer;
-import org.apache.edgent.providers.development.DevelopmentProvider;
-import org.apache.edgent.samples.connectors.Util;
-import org.apache.edgent.topology.TStream;
-import org.apache.edgent.topology.Topology;
-
-/**
- * A simple MQTT subscriber topology application.
- */
-public class SimpleSubscriberApp {
-    private final Properties props;
-    private final String topic;
-
-    public static void main(String[] args) throws Exception {
-        if (args.length != 1)
-            throw new Exception("missing pathname to mqtt.properties file");
-        SimpleSubscriberApp subscriber = new SimpleSubscriberApp(args[0]);
-        subscriber.run();
-    }
-
-    /**
-     * @param mqttPropsPath pathname to properties file
-     */
-    SimpleSubscriberApp(String mqttPropsPath) throws Exception {
-        props = new Properties();
-        props.load(Files.newBufferedReader(new File(mqttPropsPath).toPath()));
-        topic = props.getProperty("mqtt.topic");
-    }
-    
-    private MqttConfig createMqttConfig() {
-        MqttConfig mqttConfig = MqttConfig.fromProperties(props);
-        return mqttConfig;
-    }
-    
-    /**
-     * Create a topology for the subscriber application and run it.
-     */
-    private void run() throws Exception {
-        DevelopmentProvider tp = new DevelopmentProvider();
-        
-        // build the application/topology
-        
-        Topology t = tp.newTopology("mqttSampleSubscriber");
-        
-        // System.setProperty("javax.net.debug", "ssl"); // or "all"; "help" for full list
-
-        // Create the MQTT broker connector
-        MqttConfig mqttConfig = createMqttConfig();
-        MqttStreams mqtt = new MqttStreams(t, () -> mqttConfig);
-        
-        // Subscribe to the topic and create a stream of messages
-        TStream<String> msgs = mqtt.subscribe(topic, 0/*qos*/);
-        
-        // Process the received msgs - just print them out
-        msgs.sink(tuple -> System.out.println(
-                String.format("[%s] received: %s", Util.simpleTS(), tuple)));
-        
-        // run the application / topology
-        System.out.println("Console URL for the job: "
-                + tp.getServices().getService(HttpServer.class).getConsoleUrl());
-        tp.submit(t);
-    }
-
-}
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/mqtt/SubscriberApp.java b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/mqtt/SubscriberApp.java
deleted file mode 100644
index e30f767..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/mqtt/SubscriberApp.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.connectors.mqtt;
-
-import static org.apache.edgent.samples.connectors.mqtt.MqttClient.OPT_QOS;
-import static org.apache.edgent.samples.connectors.mqtt.MqttClient.OPT_TOPIC;
-
-import org.apache.edgent.connectors.mqtt.MqttConfig;
-import org.apache.edgent.connectors.mqtt.MqttStreams;
-import org.apache.edgent.samples.connectors.Options;
-import org.apache.edgent.samples.connectors.Util;
-import org.apache.edgent.topology.TStream;
-import org.apache.edgent.topology.Topology;
-import org.apache.edgent.topology.TopologyProvider;
-
-/**
- * A MQTT subscriber topology application.
- */
-public class SubscriberApp {
-    private final TopologyProvider tp;
-    private final Options options;
-
-    /**
-     * @param top the TopologyProvider to use.
-     * @param options
-     */
-    SubscriberApp(TopologyProvider tp, Options options) {
-        this.tp = tp;
-        this.options = options;
-    }
-    
-    /**
-     * Create a topology for the subscriber application.
-     * @return the Topology
-     */
-    public Topology buildAppTopology() {
-        Topology t = tp.newTopology("mqttClientSubscriber");
-
-        // Create the MQTT broker connector
-        MqttConfig config = Runner.newConfig(options);
-        MqttStreams mqtt = new MqttStreams(t, () -> config);
-        
-        System.out.println("Using MQTT clientId " + config.getClientId());
-        
-        // Subscribe to the topic and create a stream of messages
-        TStream<String> msgs = mqtt.subscribe(options.get(OPT_TOPIC),
-                                                options.get(OPT_QOS));
-        
-        // Process the received msgs - just print them out
-        msgs.sink(tuple -> System.out.println(
-                String.format("[%s] received: %s", Util.simpleTS(), tuple)));
-        
-        return t;
-    }
-    
-}
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/mqtt/package-info.java b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/mqtt/package-info.java
deleted file mode 100644
index 85602ef..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/mqtt/package-info.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-/**
- * Samples showing use of the
- * <a href="{@docRoot}/org/apache/edgent/connectors/mqtt/package-summary.html">
- *     MQTT stream connector</a>.
- * <p>
- * See &lt;edgent-release&gt;/scripts/connectors/mqtt/README to run the samples.
- * <p>
- * The following simple samples are provided:
- * <ul>
- * <li>SimplePublisherApp.java - a simple publisher application topology</li>
- * <li>SimpleSubscriberApp.java - a simple subscriber application topology</li>
- * </ul>
- * The remaining classes are part of a sample that more fully exposes
- * controlling various configuration options.
- */
-package org.apache.edgent.samples.connectors.mqtt;
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/obd2/Obd2Streams.java b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/obd2/Obd2Streams.java
deleted file mode 100644
index 13ab20a..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/obd2/Obd2Streams.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.connectors.obd2;
-
-import static java.util.concurrent.TimeUnit.MINUTES;
-import static java.util.concurrent.TimeUnit.SECONDS;
-import static org.apache.edgent.analytics.math3.stat.Regression.SLOPE;
-import static org.apache.edgent.analytics.math3.stat.Statistic.MAX;
-import static org.apache.edgent.samples.connectors.elm327.Cmd.PID;
-import static org.apache.edgent.samples.connectors.elm327.Cmd.VALUE;
-import static org.apache.edgent.samples.connectors.elm327.Pids01.AIR_INTAKE_TEMP;
-import static org.apache.edgent.samples.connectors.elm327.Pids01.ENGINE_COOLANT_TEMP;
-import static org.apache.edgent.samples.connectors.elm327.Pids01.RPM;
-import static org.apache.edgent.samples.connectors.elm327.Pids01.SPEED;
-
-import java.util.concurrent.TimeUnit;
-
-import org.apache.edgent.analytics.math3.json.JsonAnalytics;
-import org.apache.edgent.connectors.serial.SerialDevice;
-import org.apache.edgent.samples.connectors.elm327.Elm327Streams;
-import org.apache.edgent.topology.TStream;
-import org.apache.edgent.topology.TWindow;
-
-import com.google.gson.JsonArray;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-
-/**
- * Sample OBD-II streams.
- *
- */
-public class Obd2Streams {
-
-    /**
-     * Get a stream of temperature readings which
-     * are increasing over the last minute.
-     * 
-     * Poll temperatures every five seconds and
-     * calculate the maximum reading and rate of change
-     * (slope) over the last minute, partitioned by parameter
-     * {@link org.apache.edgent.samples.connectors.elm327.Cmd#PID pid}. Filter so that only
-     * those with a rate of increase greater than
-     * or equal to 1 degree C/minute is present on the returned stream.
-     * 
-     * Temperatures included are
-     * {@link org.apache.edgent.samples.connectors.elm327.Pids01#AIR_INTAKE_TEMP AIR_INTAKE_TEMP} and
-     * {@link org.apache.edgent.samples.connectors.elm327.Pids01#ENGINE_COOLANT_TEMP ENGINE_COOLANT_TEMP}.
-     * 
-     * @param device Serial device the ELM327 is connected to.
-     * @return Stream that will contain parameters with increasing temperatures.
-     */
-    public static TStream<JsonObject> increasingTemps(SerialDevice device) {
-
-        TStream<JsonArray> tempsA = Elm327Streams.poll(device, 5, SECONDS,
-                AIR_INTAKE_TEMP,
-                ENGINE_COOLANT_TEMP);
-
-        TStream<JsonObject> temps = tempsA.flatMap(je -> je).map(je -> je.getAsJsonObject());
-
-        TWindow<JsonObject, JsonElement> window = temps.last(1, MINUTES, j -> j.get(PID));
-
-        TStream<JsonObject> temperatureRate = JsonAnalytics.aggregate(window, PID, VALUE, MAX, SLOPE);
-
-        // Have the stream contain only tuples where
-        // the rise in temperatures >= 1 degree C/minute
-        temperatureRate = temperatureRate.filter(j -> {
-            JsonObject v = getObject(j, "value");
-            return v.has("SLOPE") && getDouble(v, "SLOPE") >= 1.0;
-        });
-
-        return temperatureRate;
-    }
-    
-    /**
-     * Get a stream containing vehicle speed (km/h)
-     * and engine revs (rpm).
-     * 
-     * {@link org.apache.edgent.samples.connectors.elm327.Pids01#SPEED Speed}
-     * and {@link org.apache.edgent.samples.connectors.elm327.Pids01#RPM engine revs}
-     * are polled every 200ms and returned as a stream
-     * containing JSON objects with keys {@code speed}
-     * and {@code rpm}.
-     * 
-     * The two readings may not be exactly consistent with
-     * each other as there are fetched sequentially from
-     * the ELM327. 
-     * 
-     * @param device Serial device the ELM327 is connected to.
-     * @return Stream that will contain speed and engine revolutions.
-     */
-    public static TStream<JsonObject> tach(SerialDevice device) {
-
-        TStream<JsonArray> rpmSpeed = Elm327Streams.poll(device, 200, TimeUnit.MILLISECONDS,
-                SPEED, RPM);
-
-        TStream<JsonObject> tach = rpmSpeed.map(ja -> {
-            JsonObject j = new JsonObject();
-            
-            double speed = getDouble(ja.get(0), VALUE);
-            double rpm = getDouble(ja.get(1), VALUE);
-            j.addProperty("speed", speed);
-            j.addProperty("rpm", rpm);
-                            
-            return j;
-        });
-
-        return tach;
-    }
-    
-    /**
-     * Utility method to simplify accessing a JSON object.
-     * @param json JSON object containing the object to be got.
-     * @param key Key of the object to be got.
-     * @return JSON object with key {@code key} from {@code json}.
-     */
-    public static JsonObject getObject(JsonObject json, String key) {
-        return json.getAsJsonObject(key);
-    }
-
-    /**
-     * Utility method to simplify accessing a number as a double.
-     * @param json JSON object containing the number to be got.
-     * @param key Key of the number to be got.
-     * @return Number with key {@code key} from {@code json}.
-     */
-    public static double getDouble(JsonElement json, String key) {
-        return json.getAsJsonObject().get(key).getAsDouble();
-    }
-}
diff --git a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/package-info.java b/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/package-info.java
deleted file mode 100644
index 4936d92..0000000
--- a/samples/connectors/src/main/java/org/apache/edgent/samples/connectors/package-info.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-/**
- * General support for connector samples.
- */
-package org.apache.edgent.samples.connectors;
\ No newline at end of file
diff --git a/samples/console/build.gradle b/samples/console/build.gradle
deleted file mode 100644
index 23795fc..0000000
--- a/samples/console/build.gradle
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-dependencies {
-  // N.B. common dependencies are set in root build.gradle
-
-  addTargetDirProjectJarDependency 'compile', ':console:server'
-
-  // N.B. root project adds test common dependencies
-}
diff --git a/samples/console/src/main/java/org/apache/edgent/samples/console/ConsoleWaterDetector.java b/samples/console/src/main/java/org/apache/edgent/samples/console/ConsoleWaterDetector.java
deleted file mode 100644
index 9f6675c..0000000
--- a/samples/console/src/main/java/org/apache/edgent/samples/console/ConsoleWaterDetector.java
+++ /dev/null
@@ -1,412 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.console;
-
-import java.io.PrintWriter;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map.Entry;
-import java.util.Random;
-import java.util.Set;
-import java.util.SortedMap;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.edgent.console.server.HttpServer;
-import org.apache.edgent.metrics.Metrics;
-import org.apache.edgent.providers.development.DevelopmentProvider;
-import org.apache.edgent.providers.direct.DirectProvider;
-import org.apache.edgent.topology.TStream;
-import org.apache.edgent.topology.Topology;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.codahale.metrics.Counter;
-import com.codahale.metrics.MetricRegistry;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-
-/**
- * 
- * Demonstrates some of the features of the console.
- * <P>
- * The topology graph in the console currently allows for 3 distinct "views" of the topology:
- * <ul>
- * <li>Static flow</li>
- * <li>Tuple count</li>
- * <li>Oplet kind</li>
- * </ul>
- * <P>
- * Selecting any of these, with the exception of "Static flow", adds a legend to the topology which
- * allows the user to identify elements of the view.
- * </P>
- * <P> The "Static flow" view shows the toology in an unchanging state - that is if tuple counts are available the
- * lines (connections) representing the edges of the topology are not updated, nor are the circles (representing the vertices) dimensions updated.  
- * The purpose of this view is to give the user an indication of the topology map of the application.
- * </P>
- * <P>
- * The "Oplet kind" view colors the oplets or vertices displayed in the topology graph (the circles) by their
- * corresponding Oplet kind.
- * </P>
- * <P>
- * If "Tuple count" is selected the legend reflects ranges of tuple counts measured since the application was started.
- * </P>
- * <P>
- * Note: The DevelopmentProvider class overrides the submit method of the DirectProvider class
- * and adds a Metrics counter to the submitted topology.
- * If a counter is not added to the topology (or to an individual oplet), the "Tuple count" view selection is not enabled.
- * </P>
- * 
- * <P>
- * In the lower half of the edgent console is a chart displaying metrics, if available.  In this example metrics
- * are available since the DevelopmentProvider class is being used.  Note that the DevelopmentProvider class adds a Metrics counter
- * to all oplets in the topology, with the exception of certain oplet types.  For further information
- * about how metrics are added to a topology, see the details in the org.apache.edgent.metrics.Metrics class and the counter method.
- * <br>
- * A counter can be added to an individual oplet, and not the entire topology.  For an example of this
- * see the org.apache.edgent.samples.utils.metrics.DevelopmentMetricsSample.
- * </P>
- * <P>
- * The org.apache.edgent.metric.Metrics class also provides a rate meter.  Rate meters must be added to individual oplets and are not currently
- * available for the entire topology.
- * </P>
-
- * <P>
- * The metrics chart displayed is a bar chart by default.  If a rate meter is added to an oplet it will be displayed
- * as a line chart over the last 20 measures (the interval to refresh the line chart is every 2 1/2 seconds).
- * If a counter is added to a single oplet, the tuple count can also be displayed as a line chart.
- * </P>
- * 
- * <P>
- * ConsoleWaterDetector scenario:
- * A county agency is responsible for ensuring the safety of residents well water.  Each well they monitor has four different 
- * sensor types:
- * <ul>
- * <li>Temperature</li>
- * <li>Acidity</li>
- * <li>Ecoli</li>
- * <li>Lead</li>
- * </ul>
- * <P>
- * This application topology monitors 3 wells:
- * <ul>
- * <li>
- * Each well that is to be measured is added to the topology.  The topology polls each sensor for each well as a unit.  
- * All the sensor readings for a single well are 'unioned' into a single TStream&lt;JsonObject&gt;.
- * </li>
- * <li>
- * Now, each well has a single stream with each of the sensors readings as a property with a name and value in the JsonObject.  
- * Each well's sensors are then checked to see if their values are in an acceptable range.  The filter oplet is used to check each sensor's range.  
- * If any of the sensor's readings are out of the acceptable range the tuple is passed along. Those that are within an acceptable range 
- * are discarded.
- * </li>
- * <li>
- * If the tuples in the stream for the well are out of range they are then passed to the split oplet. The split oplet breaks the single
- * TStream&lt;JsonObject&gt; into individual streams for each sensor type for the well.  
- * </li>
- * <li>
- * Well1 and Well3's temperature sensor streams have rate meters placed on them.  This will be used to compare the rate of tuples flowing through these
- * streams that are a result of out of range readings for Well1 and Well3 respectively.
- * </li>
- * <li>
- * Each stream that is produced from the split prints out the value for the sensor reading that it is monitoring along with the wellId.
- * </li>
- * </ul>
- *
- */
-
-public class ConsoleWaterDetector {
-
-	/**
-	 * Hypothetical values for all the sensor types: temp, acidity, ecoli and Lead
-	 */
-	static int TEMP_ALERT_MIN = 49;
-	static int TEMP_ALERT_MAX = 81;
-	static int TEMP_RANDOM_LOW = 40;
-	static int TEMP_RANDOM_HIGH = 90;
-	static String TEMP_ALERT_TAG = "TEMP out of range";
-	
-	static int ACIDITY_ALERT_MIN = 4;
-	static int ACIDITY_ALERT_MAX = 9;
-	static int ACIDITY_RANDOM_LOW = 1;
-	static int ACIDITY_RANDOM_HIGH = 11;
-	static String ACIDITY_ALERT_TAG = "ACIDITY out of range";
-	
-	static int ECOLI_ALERT = 1;
-	static int ECOLI_RANDOM_LOW = 0;
-	static int ECOLI_RANDOM_HIGH = 3;
-	static String ECOLI_ALERT_TAG = "ECOLI out of range";
-
-	static int LEAD_ALERT_MAX = 10;
-	static int LEAD_RANDOM_LOW = 0;
-	static int LEAD_RANDOM_HIGH = 15;
-	static String LEAD_ALERT_TAG = "LEAD out of range";
-	
-	private static final Logger logger = LoggerFactory.getLogger(ConsoleWaterDetector.class);
-
-	public static void main(String[] args) throws Exception {
-		DirectProvider dp = new DevelopmentProvider();
-		
-		System.out.println(dp.getServices().getService(HttpServer.class).getConsoleUrl());
-		
-        try {
-            PrintWriter writer = new PrintWriter("consoleUrl.txt", "UTF-8");
-            writer.println(dp.getServices().getService(HttpServer.class).getConsoleUrl());
-            writer.close();
-        } catch ( Exception e) {
-            logger.error("Exception caught", e);
-        }
-		
-		Topology wellTopology = dp.newTopology("ConsoleWaterDetector");
-		
-		TStream<JsonObject> well1 = waterDetector(wellTopology, 1);
-		TStream<JsonObject> well2 = waterDetector(wellTopology, 2);
-		TStream<JsonObject> well3 = waterDetector(wellTopology, 3);
-				
-		TStream<JsonObject> filteredReadings1 = alertFilter(well1, 1, false);
-		TStream<JsonObject> filteredReadings2 = alertFilter(well2, 2, true);
-		TStream<JsonObject> filteredReadings3 = alertFilter(well3, 3, false);
-		
-		List<TStream<JsonObject>> individualAlerts1 = splitAlert(filteredReadings1, 1);
-		
-		// Put a rate meter on well1's temperature sensor output
-		Metrics.rateMeter(individualAlerts1.get(0));
-		individualAlerts1.get(0).tag(TEMP_ALERT_TAG, "well1").sink(tuple -> System.out.println("\n" + formatAlertOutput(tuple, "1", "temp")));
-		individualAlerts1.get(1).tag(ACIDITY_ALERT_TAG, "well1").sink(tuple -> System.out.println(formatAlertOutput(tuple, "1", "acidity")));
-		individualAlerts1.get(2).tag(ECOLI_ALERT_TAG, "well1").sink(tuple -> System.out.println(formatAlertOutput(tuple, "1", "ecoli")));
-		individualAlerts1.get(3).tag(LEAD_ALERT_TAG, "well1").sink(tuple -> System.out.println(formatAlertOutput(tuple, "1", "lead")));
-		
-		List<TStream<JsonObject>> individualAlerts2 = splitAlert(filteredReadings2, 2);
-		
-	    TStream<JsonObject> alert0Well2 = individualAlerts2.get(0);
-		alert0Well2  = Metrics.counter(alert0Well2);
-		alert0Well2.tag("well2", "temp");
-		
-		TStream<JsonObject> alert1Well2 = individualAlerts2.get(1);
-		alert1Well2  = Metrics.counter(alert1Well2);
-		alert1Well2.tag("well2", "acidity");
-		
-		TStream<JsonObject> alert2Well2 = individualAlerts2.get(2);
-		alert2Well2  = Metrics.counter(alert2Well2);
-		alert2Well2.tag("well2", "ecoli");
-		
-		TStream<JsonObject> alert3Well2 = individualAlerts2.get(3);
-		alert3Well2  = Metrics.counter(alert3Well2);
-		alert3Well2.tag("well2", "lead");	
-
-		List<TStream<JsonObject>> individualAlerts3 = splitAlert(filteredReadings3, 3);
-		
-		// Put a rate meter on well3's temperature sensor output
-		Metrics.rateMeter(individualAlerts3.get(0));
-		individualAlerts3.get(0).tag(TEMP_ALERT_TAG, "well3").sink(tuple -> System.out.println(formatAlertOutput(tuple, "3", "temp")));
-		individualAlerts3.get(1).tag(ACIDITY_ALERT_TAG, "well3").sink(tuple -> System.out.println(formatAlertOutput(tuple, "3", "acidity")));
-		individualAlerts3.get(2).tag(ECOLI_ALERT_TAG, "well3").sink(tuple -> System.out.println(formatAlertOutput(tuple, "3", "ecoli")));
-		individualAlerts3.get(3).tag(LEAD_ALERT_TAG, "well3").sink(tuple -> System.out.println(formatAlertOutput(tuple, "3", "lead")));
-		
-		dp.submit(wellTopology);
-
-		while (true) {
-	            MetricRegistry metricRegistry = dp.getServices().getService(MetricRegistry.class);
-                    SortedMap<String, Counter> counters = metricRegistry.getCounters();
-
-                    Set<Entry<String, Counter>> values = counters.entrySet();
-                    for (Entry<String, Counter> e : values) {
-            		if (e.getValue().getCount() == 0) {
-            		   System.out.println("Counter Op:" + e.getKey() + " has a tuple count of zero!");
-            		}
-            	    }
-                    Thread.sleep(2000);
-        	}
-	}
-	
-	/**
-	 * Creates a TStream&lt;JsonObject&gt; for each sensor reading for each well. Unions all the TStream&lt;JsonObject&gt; into a
-	 * single one representing all readings on the well.
-	 * @param topology Topology providing the tuples for the sensors
-	 * @param wellId Id of the well sending the measurements
-	 * @return TStream&lt;JsonObject&gt; containing a measurement from each sensor type.
-	 * Creates a single TStream&lt;JsonObject&gt; from polling the four sensor types as TStream&lt;Integer&gt;
-	 */
-	public static TStream<JsonObject> waterDetector(Topology topology, int wellId) {
-		Random rNum = new Random();
-		TStream<Integer> temp = topology.poll(() -> rNum.nextInt(TEMP_RANDOM_HIGH - TEMP_RANDOM_LOW) + TEMP_RANDOM_LOW, 1, TimeUnit.SECONDS);
-		TStream<Integer> acidity = topology.poll(() -> rNum.nextInt(ACIDITY_RANDOM_HIGH - ACIDITY_RANDOM_LOW) + ACIDITY_RANDOM_LOW, 1, TimeUnit.SECONDS); 
-		TStream<Integer> ecoli = topology.poll(() -> rNum.nextInt(ECOLI_RANDOM_HIGH - ECOLI_RANDOM_LOW) + ECOLI_RANDOM_LOW, 1, TimeUnit.SECONDS);
-		TStream<Integer> lead = topology.poll(() -> rNum.nextInt(LEAD_RANDOM_HIGH - LEAD_RANDOM_LOW) + LEAD_RANDOM_LOW, 1, TimeUnit.SECONDS);
-		TStream<Integer> id = topology.poll(() -> wellId, 1, TimeUnit.SECONDS);
-		
-		// add tags to each sensor
-		temp.tag("temperature", "well" + wellId);
-		acidity.tag("acidity", "well" + wellId);
-		ecoli.tag("ecoli", "well" + wellId);
-		lead.tag("lead", "well" + wellId);
-		id.tag("well" + wellId);
-		
-		TStream<JsonObject> tempObj = temp.map(t -> {
-			JsonObject jObj = new JsonObject();
-			jObj.addProperty("temp", t);
-			return jObj;
-		});
-		
-		TStream<JsonObject> acidityObj = acidity.map(a -> {
-			JsonObject jObj = new JsonObject();
-			jObj.addProperty("acidity", a);
-			return jObj;
-		});
-
-		TStream<JsonObject> ecoliObj = ecoli.map(e -> {
-			JsonObject jObj = new JsonObject();
-			jObj.addProperty("ecoli", e);
-			return jObj;
-		});
-		
-		TStream<JsonObject> leadObj = lead.map(l -> {
-			JsonObject jObj = new JsonObject();
-			jObj.addProperty("lead", l);
-			return jObj;
-		});
-
-		TStream<JsonObject> idObj = id.map(i -> {
-			JsonObject jObj = new JsonObject();
-			jObj.addProperty("id", i);
-			return jObj;
-		});
-
-		// ArrayAsList
-		HashSet<TStream<JsonObject>> set = new HashSet <TStream<JsonObject>>();
-		set.add(acidityObj);
-		set.add(acidityObj);
-		set.add(ecoliObj);
-		set.add(leadObj);
-		set.add(idObj);
-		
-		TStream<JsonObject> allReadings = tempObj.union(set);
-
-		return allReadings;
-	}
-	
-	/**
-	 * Look through the stream and check to see if any of the measurements cause concern.
-	 * Only a TStream that has one or more of the readings at "alert" level are passed through
-	 * @param readingsDetector The TStream&lt;JsonObject&gt; that represents all of the different sensor readings for the well
-	 * @param wellId The id of the well
-	 * @param simulateNormal Make this stream simulate all readings within the normal range, and therefore will not pass through the filter
-	 * @return TStream&lt;JsonObject&gt; that contain readings that could cause concern.  Note: if any reading is out of range the tuple 
-	 * will be returned
-	 */
-	
-	public static TStream<JsonObject> alertFilter(TStream<JsonObject> readingsDetector, int wellId, boolean simulateNormal) {
-		readingsDetector = readingsDetector.filter(r -> {
-			if (simulateNormal == true) {
-				return false;
-			}
-			
-			JsonElement tempElement = r.get("temp");
-			if (tempElement != null) {			
-				int temp = tempElement.getAsInt();
-				return (temp <= TEMP_ALERT_MIN || temp >= TEMP_ALERT_MAX);
-			}
-			
-			JsonElement acidElement = r.get("acidity");
-			if (acidElement != null) {
-				int acid = acidElement.getAsInt();
-				return  (acid <= ACIDITY_ALERT_MIN || acid >= ACIDITY_ALERT_MAX);
-			}
-			
-			JsonElement ecoliElement = r.get("ecoli");
-			if (ecoliElement != null) {
-				int ecoli = ecoliElement.getAsInt();
-				return ecoli >= ECOLI_ALERT;
-			}
-			
-			JsonElement leadElement = r.get("lead");
-			if (leadElement != null) {
-				int lead = leadElement.getAsInt();
-				return lead >= LEAD_ALERT_MAX;
-			}
-			
-			return false;
-		});
-		
-		return readingsDetector;
-	}
-	/**
-	 * Splits the incoming TStream&lt;JsonObject&gt; into individual TStreams based on the sensor type
-	 * @param alertStream The TStream&lt;JsonObject&gt; that we know has some out of range condition - it could be temp, acidity, ecoli or lead 
-	 * - or all of them
-	 * @param wellId The id of the well that has the out of range readings
-	 * @return List&lt;TStream&lt;JsonObject&gt;&gt; - one for each sensor.   
-	 */
-	public static List<TStream<JsonObject>> splitAlert(TStream<JsonObject> alertStream, int wellId) {
-		
-		List<TStream<JsonObject>> allStreams = alertStream.split(5, tuple -> {
-            if (tuple.get("temp") != null) {
-            	JsonObject tempObj = new JsonObject();
-		int temp = tuple.get("temp").getAsInt();
-            	if (temp <= TEMP_ALERT_MIN || temp >= TEMP_ALERT_MAX) {
-            		tempObj.addProperty("temp", temp);
-            		return 0;
-            	} else {
-            		return -1;
-            	}
-            } else if (tuple.get("acidity") != null){
-            	JsonObject acidObj = new JsonObject();
-              	int acid = tuple.get("acidity").getAsInt();
-            	if (acid <= ACIDITY_ALERT_MIN || acid >= ACIDITY_ALERT_MAX) {
-            		acidObj.addProperty("acidity", acid);
-            		return 1;
-            	} else {
-            		return -1;
-            	}
-            } else if (tuple.get("ecoli") != null) {
-            	JsonObject ecoliObj = new JsonObject();
-            	int ecoli = tuple.get("ecoli").getAsInt();
-            	if (ecoli >= ECOLI_ALERT) {
-            		ecoliObj.addProperty("ecoli", ecoli);
-            		return 2;
-            	} else {
-            		return -1;
-            	}
-            } else if (tuple.get("lead") != null) {
-            	JsonObject leadObj = new JsonObject();
-            	int lead = tuple.get("lead").getAsInt();
-            	if (lead >= LEAD_ALERT_MAX) {
-            		leadObj.addProperty("lead", lead);
-            		return 3;
-            	} else {
-            		return -1;
-            	}
-            } else {
-            	 return -1;
-            }
-        });
-		
-		return allStreams;
-	}
-	
-	/**
-	 * Formats the output of the alert, containing the well id, sensor type and value of the sensor
-	 * @param alertObj The tuple that contains out of range readings
-	 * @param wellId The id of the well
-	 * @param alertType The type of sensor that has the possible alert on it
-	 * @return String containing the wellId, sensor type and sensor value
-	 */
-	public static String formatAlertOutput(JsonObject alertObj, String wellId, String alertType) {
-		return "Well" + wellId + " alert, " + alertType + " value is " + alertObj.get(alertType).getAsInt();
-	}
-}
diff --git a/samples/console/src/main/java/org/apache/edgent/samples/console/HttpServerSample.java b/samples/console/src/main/java/org/apache/edgent/samples/console/HttpServerSample.java
deleted file mode 100644
index 1885e57..0000000
--- a/samples/console/src/main/java/org/apache/edgent/samples/console/HttpServerSample.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-package org.apache.edgent.samples.console;
-
-import org.apache.edgent.console.server.HttpServer;
-
-public class HttpServerSample {
-
-    public static void main(String[] args)  {
-
-        try {
-        HttpServer server = HttpServer.getInstance();
-        server.startServer();
-        String consolePath = server.getConsoleUrl();
-        System.out.println("Point your browser to :");
-        System.out.println(consolePath);
-        }
-        catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-}
diff --git a/samples/console/src/main/java/org/apache/edgent/samples/console/package-info.java b/samples/console/src/main/java/org/apache/edgent/samples/console/package-info.java
deleted file mode 100644
index 3beac82..0000000
--- a/samples/console/src/main/java/org/apache/edgent/samples/console/package-info.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-/**
- * Samples showing use of the Console web application.
- * The following simple samples are provided:
- * <ul>
- * <li>ConsoleWaterDetector.java - a simple application topology demonstrating features of the console like viewing the topology by
- * Stream tags, Oplet kind and Tuple count.  A DevelopmentProvider is used which automatically adds a Metrics counter to the topology.
- * </li>
- * <li>HttpServerSample.java - a <i>very</i> simple application that just brings up the Edgent console - with no jobs.</li>
- * </ul>
- */
-package org.apache.edgent.samples.console;
\ No newline at end of file
diff --git a/samples/scenarios/build.gradle b/samples/scenarios/build.gradle
deleted file mode 100644
index f05b459..0000000
--- a/samples/scenarios/build.gradle
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-sourceSets {
-  main {
-    java {
-      if (System.env.PI4J_LIB == null) {
-        exclude "**/scenarios/iotp/range/sensor/**"
-        logger.lifecycle 'PI4J_LIB ev not set. Omitting scenarios/iotp/range/sensor/.'
-      } 
-    }
-  }
-}
-
-dependencies {
-  // N.B. common dependencies are set in root build.gradle
-
-  addTargetDirProjectJarDependency 'compile', ':analytics:math3'
-  addTargetDirProjectJarDependency 'compile', ':samples:connectors'
-  addTargetDirProjectJarDependency 'compile', ':providers:iot'
-  addTargetDirProjectJarDependency 'compile', ':connectors:iot'
-  addTargetDirProjectJarDependency 'compile', ':connectors:iotp'
-  
-  // N.B. pi4J is strictly LGPL and hence incompatible with ASF licensing.
-  // Users will have to download it themselves and build the sample.
-  // addProjectExtDependency 'compile', 'com.pi4j:pi4j-core:1.0'
-  if (System.env.PI4J_LIB != null) {
-    // addProjectExtDependency 'compile', files("$System.env.PI4J_LIB/pi4j-core.jar")
-    compile files("$System.env.PI4J_LIB/pi4j-core.jar")
-  }
-
-  // N.B. root project adds test common dependencies
-}
diff --git a/samples/scenarios/src/main/java/org/apache/edgent/samples/scenarios/iotp/IotpFullScenario.java b/samples/scenarios/src/main/java/org/apache/edgent/samples/scenarios/iotp/IotpFullScenario.java
deleted file mode 100644
index 5fd37d9..0000000
--- a/samples/scenarios/src/main/java/org/apache/edgent/samples/scenarios/iotp/IotpFullScenario.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.scenarios.iotp;
-
-
-import java.io.File;
-
-import org.apache.edgent.connectors.iotp.IotpDevice;
-import org.apache.edgent.providers.iot.IotProvider;
-import org.apache.edgent.samples.connectors.iotp.IotpSensors;
-
-/**
- * Sample IotProvider scenario using IBM Watson IoT Platform.
- * <BR>
- * IotProvider with three registered applications that
- * are not started but can be started by a a remote
- * application sending device commands through
- * IBM Watson IoT Platform.
- * <P>
- * This is equivalent to the {@link IotpSensors} application
- * but executing as three separate applications using
- * {@link IotProvider} rather than the lower level
- * {@link org.apache.edgent.providers.direct.DirectProvider}.
- * 
- * </P>
- * 
- * @see org.apache.edgent.topology.mbeans.ApplicationServiceMXBean
- * @see <a href="{@docRoot}/org/apache/edgent/topology/mbeans/package-summary.html">org.apache.edgent.topology.mbeans</a>
- */
-public class IotpFullScenario {
-    
-    /**
-     * Run the IotpFullScenario application.
-     * 
-     * Takes a single argument that is the path to the
-     * device configuration file containing the connection
-     * authentication information.
-     * 
-     * @param args Must contain the path to the device configuration file.
-     * @throws Exception on failure
-     * @see IotpDevice#IotpDevice(org.apache.edgent.topology.Topology, File)
-     */
-    public static void main(String[] args) throws Exception {
-        String deviceCfg = args[0];
-        
-        // Create an IotProvider that will use
-        // an IotpDevice as the connectivity to
-        // the IBM Watson IoT Platform message hub.
-        IotProvider provider = new IotProvider(
-                topology -> new IotpDevice(topology, new File(deviceCfg)));
-              
-        // Register three applications
-        registerHeartbeat(provider);       
-        registerSensors(provider);
-        registerDisplay(provider);
-        
-        // Start this provider
-        // the three applications will not start
-        provider.start();
-    }
-    
-    public static void registerHeartbeat(IotProvider provider) {
-        provider.registerTopology("Heartbeat",
-                (iotDevice,config) -> IotpSensors.heartBeat(iotDevice, true));
-    }
-    
-    public static void registerSensors(IotProvider provider) {
-        provider.registerTopology("Sensors",
-                (iotDevice,config) -> IotpSensors.simulatedSensors(iotDevice, true));
-    }
-    public static void registerDisplay(IotProvider provider) {
-        provider.registerTopology("Display",
-                (iotDevice,config) -> IotpSensors.displayMessages(iotDevice, true));
-    }
-
-}
\ No newline at end of file
diff --git a/samples/scenarios/src/main/java/org/apache/edgent/samples/scenarios/iotp/range/sensor/IotpRangeSensor.java b/samples/scenarios/src/main/java/org/apache/edgent/samples/scenarios/iotp/range/sensor/IotpRangeSensor.java
deleted file mode 100644
index b75be33..0000000
--- a/samples/scenarios/src/main/java/org/apache/edgent/samples/scenarios/iotp/range/sensor/IotpRangeSensor.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.scenarios.iotp.range.sensor;
-
-import static org.apache.edgent.analytics.math3.stat.Statistic.MAX;
-import static org.apache.edgent.analytics.math3.stat.Statistic.MEAN;
-import static org.apache.edgent.analytics.math3.stat.Statistic.MIN;
-import static org.apache.edgent.analytics.math3.stat.Statistic.STDDEV;
-
-import java.io.File;
-import java.util.Date;
-import java.util.Random;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.edgent.analytics.math3.json.JsonAnalytics;
-import org.apache.edgent.connectors.iot.IotDevice;
-import org.apache.edgent.connectors.iot.QoS;
-import org.apache.edgent.connectors.iotp.IotpDevice;
-import org.apache.edgent.function.Supplier;
-import org.apache.edgent.providers.direct.DirectProvider;
-import org.apache.edgent.providers.direct.DirectTopology;
-import org.apache.edgent.topology.TStream;
-import org.apache.edgent.topology.TWindow;
-
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import com.pi4j.io.gpio.Pin;
-import com.pi4j.io.gpio.RaspiPin;
-
-public class IotpRangeSensor {
-    private static final Pin echoPin = RaspiPin.GPIO_05; // PI4J custom
-                                                         // numbering (pin 18 on
-                                                         // RPi2)
-    private static final Pin trigPin = RaspiPin.GPIO_04; // PI4J custom
-                                                         // numbering (pin 16 on
-                                                         // RPi2)
-    private static final Pin ledPin = RaspiPin.GPIO_01; // PI4J custom numbering
-                                                        // (pin 12 on RPi2)
-
-    public static void main(String[] args) {
-
-        if (args.length != 3) {
-            System.out.println("Proper Usage is:\n   " + "   java program device.cfg sensorIsSimulated LEDIsSimulated\n"
-                    + "Example: \n"
-                    + "   java -cp $EDGENT/build/distributions/java8/samples/lib/edgent.samples.scenarios.jar org.apache.edgent.samples.scenarios.iotp.range.sensor.IotpRangeSensor device.cfg false true");
-            System.exit(0);
-        }
-
-        String deviceCfg = args[0];
-        Boolean simulatedRange = Boolean.parseBoolean(args[1]);
-        Boolean simulatedLED = Boolean.parseBoolean(args[2]);
-
-        DirectProvider tp = new DirectProvider();
-        DirectTopology topology = tp.newTopology("IotpRangeSensor");
-
-        IotDevice device = getIotDevice(deviceCfg, topology);
-
-        // HC-SR04 Range sensor for this device.
-        rangeSensor(device, simulatedRange, true);
-
-        // In addition create a heart beat event to
-        // ensure there is some immediate output and
-        // the connection to IoTF happens as soon as possible.
-        TStream<Date> hb = topology.poll(() -> new Date(), 1, TimeUnit.MINUTES);
-
-        // Convert to JSON
-        TStream<JsonObject> hbj = hb.map(d -> {
-            JsonObject j = new JsonObject();
-            j.addProperty("when", d.toString());
-            j.addProperty("hearbeat", d.getTime());
-            return j;
-        });
-        hbj.print();
-        device.events(hbj, "heartbeat", QoS.FIRE_AND_FORGET);
-
-        // Subscribe to commands of id "display" for this
-        // device and print them to standard out
-        TStream<String> statusMsgs = displayMessages(device);
-        statusMsgs.print();
-
-        // Flash an LED for 1second when we receive commands from IoTF
-        if (!simulatedLED) {
-            LED led = new LED(ledPin);
-            statusMsgs.sink(j -> led.flash(1000));
-        } else {
-            statusMsgs.sink(j -> System.out.println("*******Simulated LED Flash!*******"));
-        }
-
-        tp.submit(topology);
-    }
-
-    /*
-     * Returns an IotDevice based on the device config parameter. If the type is
-     * "quickstart" then we also output the URL to view the data.
-     */
-    private static IotDevice getIotDevice(String deviceCfg, DirectTopology topology) {
-        IotDevice device;
-
-        if (deviceCfg.equalsIgnoreCase("quickstart")) {
-            // Declare a connection to IoTF Quickstart service
-            String deviceId = "qs" + Long.toHexString(new Random().nextLong());
-            device = IotpDevice.quickstart(topology, deviceId);
-
-            System.out.println("Quickstart device type:" + IotpDevice.QUICKSTART_DEVICE_TYPE);
-            System.out.println("Quickstart device id  :" + deviceId);
-            System.out.println("https://quickstart.internetofthings.ibmcloud.com/#/device/" + deviceId);
-        } else {
-            // Declare a connection to IoTF
-            device = new IotpDevice(topology, new File(deviceCfg));
-        }
-
-        return device;
-    }
-
-    /**
-     * Connect to an HC-SR04 Range Sensor
-     * 
-     * @param device
-     *            IoTF device
-     * @param print
-     *            True if the data submitted as events should also be printed to
-     *            standard out.
-     * @param simulated
-     *            boolean flag
-     */
-    public static void rangeSensor(IotDevice device, boolean simulated, boolean print) {
-
-        Supplier<Double> sensor;
-
-        if (simulated) {
-            sensor = new SimulatedRangeSensor();
-        } else {
-            sensor = new RangeSensor(echoPin, trigPin);
-        }
-
-        TStream<Double> distanceReadings = device.topology().poll(sensor, 1, TimeUnit.SECONDS);
-        distanceReadings.print();
-
-        // filter out bad readings that are out of the sensor's 4m range
-        distanceReadings = distanceReadings.filter(j -> j < 400.0);
-
-        TStream<JsonObject> sensorJSON = distanceReadings.map(v -> {
-            JsonObject j = new JsonObject();
-            j.addProperty("name", "rangeSensor");
-            j.addProperty("reading", v);
-            return j;
-        });
-
-        // Create a window on the stream of the last 10 readings partitioned
-        // by sensor name. In this case we only have one range sensor so there
-        // will be one partition.
-        TWindow<JsonObject, JsonElement> sensorWindow = sensorJSON.last(10, j -> j.get("name"));
-
-        // Aggregate the windows calculating the min, max, mean and standard
-        // deviation
-        // across each window independently.
-        sensorJSON = JsonAnalytics.aggregate(sensorWindow, "name", "reading", MIN, MAX, MEAN, STDDEV);
-
-        // Filter so that only when the mean sensor reading is that an object is
-        // closer than 30cm send data.
-        sensorJSON = sensorJSON
-                .filter(j -> Math.abs(j.get("reading").getAsJsonObject().get("MEAN").getAsDouble()) < 30.0);
-
-        if (print)
-            sensorJSON.print();
-
-        // Send the device streams as IoTF device events
-        // with event identifier "sensors".
-        device.events(sensorJSON, "sensors", QoS.FIRE_AND_FORGET);
-    }
-
-    /**
-     * Subscribe to IoTF device commands with identifier {@code display}.
-     * Subscribing to device commands returns a stream of JSON objects that
-     * include a timestamp ({@code tsms}), command identifier ({@code command})
-     * and payload ({@code payload}). Payload is the application specific
-     * portion of the command. <BR>
-     * In this case the payload is expected to be a JSON object containing a
-     * {@code msg} key with a string display message. <BR>
-     * The returned stream consists of the display message string extracted from
-     * the JSON payload.
-     * <P>
-     * Note to receive commands a analytic application must exist that generates
-     * them through IBM Watson IoT Platform.
-     * </P>
-     *
-     * @param device IoTF device
-     * @return JSON object includes tsms(timestamp) and payload.msg(status)
-     *
-     * @see IotDevice#commands(String...)
-     */
-    public static TStream<String> displayMessages(IotDevice device) {
-        // Subscribe to commands of id "status" for this device
-        TStream<JsonObject> statusMsgs = device.commands("display");
-
-        // The returned JSON object includes several fields
-        // tsms - Timestamp in milliseconds (this is generic to a command)
-        // payload.msg - Status message (this is specific to this application)
-
-        // Map to a String object containing the message
-        return statusMsgs.map(j -> j.getAsJsonObject("payload").getAsJsonPrimitive("msg").getAsString());
-    }
-}
diff --git a/samples/scenarios/src/main/java/org/apache/edgent/samples/scenarios/iotp/range/sensor/LED.java b/samples/scenarios/src/main/java/org/apache/edgent/samples/scenarios/iotp/range/sensor/LED.java
deleted file mode 100644
index 30507d9..0000000
--- a/samples/scenarios/src/main/java/org/apache/edgent/samples/scenarios/iotp/range/sensor/LED.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.scenarios.iotp.range.sensor;
-
-import com.pi4j.io.gpio.GpioController;
-import com.pi4j.io.gpio.GpioFactory;
-import com.pi4j.io.gpio.GpioPinDigitalOutput;
-import com.pi4j.io.gpio.Pin;
-import com.pi4j.io.gpio.PinState;
-
-public class LED {
-    private final GpioController gpio = GpioFactory.getInstance();
-    private GpioPinDigitalOutput pin;
-
-    public LED(Pin pin) {
-        this.pin = gpio.provisionDigitalOutputPin(pin, "LED", PinState.HIGH);
-        this.pin.setShutdownOptions(true, PinState.LOW);
-        this.pin.low();
-    }
-
-    public void on() {
-        this.pin.high();
-    }
-
-    public void off() {
-        this.pin.low();
-    }
-
-    public void toggle() {
-        this.pin.toggle();
-    }
-
-    public void flash(long ms) {
-        this.pin.pulse(ms);
-    }
-}
diff --git a/samples/scenarios/src/main/java/org/apache/edgent/samples/scenarios/iotp/range/sensor/README.md b/samples/scenarios/src/main/java/org/apache/edgent/samples/scenarios/iotp/range/sensor/README.md
deleted file mode 100644
index de23cc6..0000000
--- a/samples/scenarios/src/main/java/org/apache/edgent/samples/scenarios/iotp/range/sensor/README.md
+++ /dev/null
@@ -1,37 +0,0 @@
-# edgent.IoTFRangeSensor
-
-See the Recipe this was created for [here](https://developer.ibm.com/recipes/tutorials/apache-quarks-on-pi-to-watson-iot-foundation/).  If that link doesn't work, try [here](https://developer.ibm.com/recipes/tutorials/apache-edgent-on-pi-to-watson-iot-foundation/). 
-
-## Requirements: 
-* You must have Pi4J installed on the device (if you are running outside of a Raspberry Pi, you will have to download the JARs and include them in your classpath)
-* You must have Edgent downloaded and built
-* You will need to have an HC-SR04 Range sensor hooked up with your EchoPin set to pin 18 and your TripPin at pin 16 (see these instructions on hardware setup: http://www.modmypi.com/blog/hc-sr04-ultrasonic-range-sensor-on-the-raspberry-pi). To use a simulated sensor, pass in true as your second argument. 
-* You will need to have an LED hooked up to pin 12 (See these instructions to set up an LED, however use pin 12 as your control pin: https://projects.drogon.net/raspberry-pi/gpio-examples/tux-crossing/gpio-examples-1-a-single-led/). To use a simulated LED, pass in true as your third argument. 
-* You will need to have your device registered with Watson IoTF and a device.cfg file, or you can use a quickstart version by passing in "quickstart" as your first argument.
- 
-To compile, export your Edgent install and PI4J libraries (on Raspberry Pi, the default Pi4J location is `/opt/pi4j/lib`):
-
-`$ EDGENT=<edgent-root-dir>`
-
-`$ export PI4J_LIB=<Pi4J-libs>  # directory where pi4j-core.jar resides`
-
-`$ cd $EDGENT`
-
-`$ ./gradlew  # builds the range sensor sample only if the PI4J_LIB environment variable is set`
-
-To run: 
- 
-`$ CP=$EDGENT/build/distributions/java8/samples/lib/edgent.samples.scenarios.jar`
-
-`$ MAIN=org.apache.edgent.samples.scenarios.iotp.range.sensor.IotpRangeSensor`
-
-
-`$ java -cp $CP $MAIN <device cfg file> <simulatedSensor?> <simulatedLED?>`
-
-To run with a device.cfg file, range sensor, and LED:
-
-`$ java -cp $CP $MAIN device.cfg false false`
-
-To run in fully simulated mode (no sensors and using IoTF quickstart): 
-
-`$ java -cp $CP $MAIN quickstart true true`
\ No newline at end of file
diff --git a/samples/scenarios/src/main/java/org/apache/edgent/samples/scenarios/iotp/range/sensor/RangeSensor.java b/samples/scenarios/src/main/java/org/apache/edgent/samples/scenarios/iotp/range/sensor/RangeSensor.java
deleted file mode 100644
index da749bc..0000000
--- a/samples/scenarios/src/main/java/org/apache/edgent/samples/scenarios/iotp/range/sensor/RangeSensor.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.scenarios.iotp.range.sensor;
-
-import org.apache.edgent.function.Supplier;
-
-import com.pi4j.io.gpio.GpioController;
-import com.pi4j.io.gpio.GpioFactory;
-import com.pi4j.io.gpio.GpioPinDigitalInput;
-import com.pi4j.io.gpio.GpioPinDigitalOutput;
-import com.pi4j.io.gpio.Pin;
-
-public class RangeSensor implements Supplier<Double> {
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 1L;
-    private final static Double SPEED_OF_SOUND = 340.29; // speed of sound
-    private final GpioPinDigitalInput echoPin;
-    private final GpioPinDigitalOutput trigPin;
-    private final int MAX_CYCLES = 3000;
-
-    private final static GpioController gpio = GpioFactory.getInstance();
-
-    public RangeSensor(Pin echoPin, Pin trigPin) {
-        this.echoPin = gpio.provisionDigitalInputPin(echoPin);
-        this.trigPin = gpio.provisionDigitalOutputPin(trigPin);
-        this.trigPin.low();
-    }
-
-    /*
-     * Get the distance in cm. Distance is (timeOfSignal * SpeedOfSound) / 2
-     * (divide by 10000 is for units)
-     */
-    public Double getDistance() {
-        triggerSensor();
-
-        long reboundTimeMicroSeconds = getSignalDuration();
-        Double distance = reboundTimeMicroSeconds * SPEED_OF_SOUND / (2 * 10000); // gives
-                                                                                  // distance
-                                                                                  // in
-                                                                                  // cm
-        return distance;
-    }
-
-    /*
-     * Send signal for 10 microseconds
-     */
-    private void triggerSensor() {
-        this.trigPin.high();
-        try {
-            Thread.sleep(0, 10000);
-        } catch (InterruptedException e) {
-            e.printStackTrace();
-        }
-        this.trigPin.low();
-    }
-
-    /*
-     * Measure signal duration
-     */
-    private long getSignalDuration() {
-        int cycles = 0;
-        long start = System.nanoTime();
-
-        while (this.echoPin.isLow() && cycles < MAX_CYCLES) {
-            // only iterate through MAX_CYCLES times before giving up
-            start = System.nanoTime();
-            cycles++;
-        }
-
-        cycles = 0;
-
-        while (this.echoPin.isHigh() && cycles < MAX_CYCLES) {
-            // only iterate through MAX_CYCLES times before giving up
-            cycles++;
-        }
-        long end = System.nanoTime();
-        long microSeconds = (long) Math.ceil((end - start) / 1000.0);
-        return microSeconds;
-    }
-
-    @Override
-    public Double get() {
-        return getDistance();
-    }
-
-}
diff --git a/samples/scenarios/src/main/java/org/apache/edgent/samples/scenarios/iotp/range/sensor/SimulatedRangeSensor.java b/samples/scenarios/src/main/java/org/apache/edgent/samples/scenarios/iotp/range/sensor/SimulatedRangeSensor.java
deleted file mode 100644
index f7b8f22..0000000
--- a/samples/scenarios/src/main/java/org/apache/edgent/samples/scenarios/iotp/range/sensor/SimulatedRangeSensor.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.scenarios.iotp.range.sensor;
-
-import java.util.Random;
-
-import org.apache.edgent.function.Supplier;
-
-public class SimulatedRangeSensor implements Supplier<Double> {
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 1L;
-    Random rand;
-
-    public SimulatedRangeSensor() {
-        rand = new Random();
-    }
-
-    @Override
-    public Double get() {
-        Double distance = 20 + rand.nextDouble() * 20;
-        return distance;
-    }
-
-}
diff --git a/samples/scenarios/src/main/java/org/apache/edgent/samples/scenarios/iotp/range/sensor/device.cfg b/samples/scenarios/src/main/java/org/apache/edgent/samples/scenarios/iotp/range/sensor/device.cfg
deleted file mode 100644
index 1d9bd6a..0000000
--- a/samples/scenarios/src/main/java/org/apache/edgent/samples/scenarios/iotp/range/sensor/device.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-org = <org-name>
-type = <device-type>
-id = <device-id>
-auth-method = token
-auth-token = <auth-token>
diff --git a/samples/topology/build.gradle b/samples/topology/build.gradle
deleted file mode 100644
index 5a8a2b6..0000000
--- a/samples/topology/build.gradle
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-dependencies {
-  // N.B. common dependencies are set in root build.gradle
-
-  addTargetDirProjectJarDependency 'compile', ':analytics:math3'
-  addTargetDirProjectJarDependency 'compile', ':runtime:jobregistry'
-  addTargetDirProjectJarDependency 'compile', ':samples:utils'
-
-  // N.B. root project adds test common dependencies
-}
diff --git a/samples/topology/src/main/java/org/apache/edgent/samples/topology/CombiningStreamsProcessingResults.java b/samples/topology/src/main/java/org/apache/edgent/samples/topology/CombiningStreamsProcessingResults.java
deleted file mode 100644
index b46e5d4..0000000
--- a/samples/topology/src/main/java/org/apache/edgent/samples/topology/CombiningStreamsProcessingResults.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.topology;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.edgent.console.server.HttpServer;
-import org.apache.edgent.providers.development.DevelopmentProvider;
-import org.apache.edgent.providers.direct.DirectProvider;
-import org.apache.edgent.samples.utils.sensor.HeartMonitorSensor;
-import org.apache.edgent.topology.TStream;
-import org.apache.edgent.topology.Topology;
-
-/**
- * Applying different processing against a set of streams and combining the
- * resulting streams into a single stream.
- *
- *  @see HeartMonitorSensor
- */
-public class CombiningStreamsProcessingResults {
-    /**
-     * Polls a simulated heart monitor to periodically obtain blood pressure readings.
-     * Splits the readings by blood pressure category into separate streams.
-     * Applies different processing on each stream to generate alert streams.
-     * Combines the alert streams into a single stream and prints the alerts.
-     *
-     * @param args command arguments
-     * @throws Exception on failure
-     */
-    public static void main(String[] args) throws Exception {
-        HeartMonitorSensor monitor = new HeartMonitorSensor();
-
-        DirectProvider dp = new DevelopmentProvider();
-
-        System.out.println(dp.getServices().getService(HttpServer.class).getConsoleUrl());
-
-        Topology top = dp.newTopology("heartMonitor");
-
-        // Generate a stream of heart monitor readings
-        TStream<Map<String, Integer>> readings = top
-                .poll(monitor, 1, TimeUnit.MILLISECONDS)
-                .filter(tuple -> tuple.get("Systolic") > 50 && tuple.get("Diastolic") > 30)
-                .filter(tuple -> tuple.get("Systolic") < 200 && tuple.get("Diastolic") < 130);
-
-        // Split the stream by blood pressure category
-        List<TStream<Map<String, Integer>>> categories = readings.split(6, tuple -> {
-            int s = tuple.get("Systolic");
-            int d = tuple.get("Diastolic");
-            if (s < 120 && d < 80) {
-                // Normal
-                return 0;
-            } else if ((s >= 120 && s <= 139) || (d >= 80 && d <= 89)) {
-                // Prehypertension
-                return 1;
-            } else if ((s >= 140 && s <= 159) || (d >= 90 && d <= 99)) {
-                // High Blood Pressure (Hypertension) Stage 1
-                return 2;
-            } else if ((s >= 160 && s <= 179) || (d >= 100 && d <= 109)) {
-                // High Blood Pressure (Hypertension) Stage 2
-                return 3;
-            } else if (s >= 180 && d >= 110)  {
-                // Hypertensive Crisis
-                return 4;
-            } else {
-                // Invalid
-                return -1;
-            }
-        });
-
-        // Get each individual stream
-        TStream<Map<String, Integer>> normal = categories.get(0).tag("normal");
-        TStream<Map<String, Integer>> prehypertension = categories.get(1).tag("prehypertension");
-        TStream<Map<String, Integer>> hypertension_stage1 = categories.get(2).tag("hypertension_stage1");
-        TStream<Map<String, Integer>> hypertension_stage2 = categories.get(3).tag("hypertension_stage2");
-        TStream<Map<String, Integer>> hypertensive = categories.get(4).tag("hypertensive");
-
-        // Perform analytics on each stream and generate alerts for each blood pressure category
-
-        // Category: Normal
-        TStream<String> normalAlerts = normal
-                .filter(tuple -> tuple.get("Systolic") > 80 && tuple.get("Diastolic") > 50)
-                .tag("normal")
-                .map(tuple -> {
-                    return "All is normal. BP is " + tuple.get("Systolic") + "/" +
-                            tuple.get("Diastolic") + ".\n"; })
-                .tag("normal");
-
-        // Category: Prehypertension category
-        TStream<String> prehypertensionAlerts = prehypertension
-                .map(tuple -> {
-                    return "At high risk for developing hypertension. BP is " +
-                            tuple.get("Systolic") + "/" + tuple.get("Diastolic") + ".\n"; })
-                .tag("prehypertension");
-
-        // Category: High Blood Pressure (Hypertension) Stage 1
-        TStream<String> hypertension_stage1Alerts = hypertension_stage1
-                .map(tuple -> {
-                    return "Monitor closely, patient has high blood pressure. " +
-                           "BP is " + tuple.get("Systolic") + "/" + tuple.get("Diastolic") + ".\n"; })
-                .tag("hypertension_stage1")
-                .modify(tuple -> "High Blood Pressure (Hypertension) Stage 1\n" + tuple)
-                .tag("hypertension_stage1");
-
-        // Category: High Blood Pressure (Hypertension) Stage 2
-        TStream<String> hypertension_stage2Alerts = hypertension_stage2
-                .filter(tuple -> tuple.get("Systolic") >= 170 && tuple.get("Diastolic") >= 105)
-                .tag("hypertension_stage2")
-                .peek(tuple ->
-                    System.out.println("BP: " + tuple.get("Systolic") + "/" + tuple.get("Diastolic")))
-                .map(tuple -> {
-                    return "Warning! Monitor closely, patient is at risk of a hypertensive crisis!\n"; })
-                .tag("hypertension_stage2")
-                .modify(tuple -> "High Blood Pressure (Hypertension) Stage 2\n" + tuple)
-                .tag("hypertension_stage2");
-
-        // Category: Hypertensive Crisis
-        TStream<String> hypertensiveAlerts = hypertensive
-                .filter(tuple -> tuple.get("Systolic") >= 180)
-                .tag("hypertensive")
-                .peek(tuple ->
-                    System.out.println("BP: " + tuple.get("Systolic") + "/" + tuple.get("Diastolic")))
-                .map(tuple -> { return "Emergency! See to patient immediately!\n"; })
-                .tag("hypertensive")
-                .modify(tuple -> tuple.toUpperCase())
-                .tag("hypertensive")
-                .modify(tuple -> "Hypertensive Crisis!!!\n" + tuple)
-                .tag("hypertensive");
-
-        // Additional processing for these streams could go here. In this case, union two streams
-        // to obtain a single stream containing alerts from the normal and prehypertension alert streams.
-        TStream<String> normalAndPrehypertensionAlerts = normalAlerts.union(prehypertensionAlerts);
-
-        // Set of streams containing alerts from the other categories
-        Set<TStream<String>> otherAlerts = new HashSet<>();
-        otherAlerts.add(hypertension_stage1Alerts);
-        otherAlerts.add(hypertension_stage2Alerts);
-        otherAlerts.add(hypertensiveAlerts);
-
-        // Union a stream with a set of streams to obtain a single stream containing alerts from
-        // all alert streams
-        TStream<String> allAlerts = normalAndPrehypertensionAlerts.union(otherAlerts);
-
-        // Terminate the stream by printing out alerts from all categories
-        allAlerts.sink(tuple -> System.out.println(tuple));
-
-        dp.submit(top);
-    }
-}
diff --git a/samples/topology/src/main/java/org/apache/edgent/samples/topology/DevelopmentMetricsSample.java b/samples/topology/src/main/java/org/apache/edgent/samples/topology/DevelopmentMetricsSample.java
deleted file mode 100644
index b2f08dc..0000000
--- a/samples/topology/src/main/java/org/apache/edgent/samples/topology/DevelopmentMetricsSample.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.topology;
-
-import java.util.Random;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.edgent.console.server.HttpServer;
-import org.apache.edgent.metrics.Metrics;
-import org.apache.edgent.providers.development.DevelopmentProvider;
-import org.apache.edgent.topology.TStream;
-import org.apache.edgent.topology.Topology;
-
-public class DevelopmentMetricsSample {
-
-    public static void main(String[] args) throws Exception {
-        DevelopmentProvider dtp = new DevelopmentProvider();
-        DevelopmentProvider dtp2 = new DevelopmentProvider();
-        
-        Topology t = dtp.newTopology("DevelopmentMetricsSample");
-        Topology t2 = dtp2.newTopology("another one");
-        
-        Random r = new Random();
-        Random r2 = new Random();
-        TStream<Double> gaussian = t.poll(() -> r.nextGaussian(), 1, TimeUnit.SECONDS);
-        
-        TStream<Double> gaussian2 = t2.poll(() -> r2.nextGaussian(), 1, TimeUnit.SECONDS);
-
-        // A filter
-        gaussian = gaussian.filter(g -> g > 0.5);
-        
-        // Measure tuple arrival rate after filtering
-        gaussian = Metrics.rateMeter(gaussian);
-
-        // A transformation
-        @SuppressWarnings("unused")
-        TStream<String> gs = gaussian.map(g -> "G:" + g + ":");
-        @SuppressWarnings("unused")
-        TStream<String> gs2 = gaussian2.map(g -> "G:" + g + ":");
-        
-        dtp.submit(t);
-        dtp2.submit(t2);
-        
-        System.out.println(dtp2.getServices().getService(HttpServer.class).getConsoleUrl());
-        
-        Thread.sleep(1000000);
-    }
-}
diff --git a/samples/topology/src/main/java/org/apache/edgent/samples/topology/DevelopmentSample.java b/samples/topology/src/main/java/org/apache/edgent/samples/topology/DevelopmentSample.java
deleted file mode 100644
index 403e8da..0000000
--- a/samples/topology/src/main/java/org/apache/edgent/samples/topology/DevelopmentSample.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-package org.apache.edgent.samples.topology;
-
-import java.util.Random;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.edgent.console.server.HttpServer;
-import org.apache.edgent.providers.development.DevelopmentProvider;
-import org.apache.edgent.topology.TStream;
-import org.apache.edgent.topology.Topology;
-
-public class DevelopmentSample {
-    
-    public static void main(String[] args) throws Exception {
-        DevelopmentProvider dtp = new DevelopmentProvider();
-        
-        Topology t = dtp.newTopology("DevelopmentSample");
-        
-        Random r = new Random();
-        
-        TStream<Double> d  = t.poll(() -> r.nextGaussian(), 100, TimeUnit.MILLISECONDS);
-        
-        d.sink(tuple -> System.out.print("."));
-        
-        dtp.submit(t);
-        
-        System.out.println(dtp.getServices().getService(HttpServer.class).getConsoleUrl());
-    }
-}
diff --git a/samples/topology/src/main/java/org/apache/edgent/samples/topology/DevelopmentSampleJobMXBean.java b/samples/topology/src/main/java/org/apache/edgent/samples/topology/DevelopmentSampleJobMXBean.java
deleted file mode 100644
index c694309..0000000
--- a/samples/topology/src/main/java/org/apache/edgent/samples/topology/DevelopmentSampleJobMXBean.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-package org.apache.edgent.samples.topology;
-
-import java.lang.management.ManagementFactory;
-import java.util.Iterator;
-import java.util.Random;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-
-import javax.management.MBeanServer;
-import javax.management.ObjectInstance;
-import javax.management.ObjectName;
-
-import org.apache.edgent.console.server.HttpServer;
-import org.apache.edgent.providers.development.DevelopmentProvider;
-import org.apache.edgent.topology.TStream;
-import org.apache.edgent.topology.Topology;
-
-public class DevelopmentSampleJobMXBean {
-    public static void main(String[] args) throws Exception {
-        DevelopmentProvider dtp = new DevelopmentProvider();
-        
-        Topology t = dtp.newTopology("DevelopmentSampleJobMXBean");
-        
-        Random r = new Random();
-        
-        TStream<Double> d  = t.poll(() -> r.nextGaussian(), 100, TimeUnit.MILLISECONDS);
-        
-        d.sink(tuple -> System.out.print("."));
-        
-        dtp.submit(t);
-        
-        System.out.println(dtp.getServices().getService(HttpServer.class).getConsoleUrl());
-        
-        MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
-
-        StringBuffer sbuf = new StringBuffer();
-        sbuf.append(DevelopmentProvider.JMX_DOMAIN);
-        sbuf.append(":interface=");
-        sbuf.append(ObjectName.quote("org.apache.edgent.execution.mbeans.JobMXBean"));
-        sbuf.append(",type=");
-        sbuf.append(ObjectName.quote("job"));
-        sbuf.append(",*");
-        
-        System.out.println("Looking for MBeans of type job: " + sbuf.toString());
-        
-        ObjectName jobObjName = new ObjectName(sbuf.toString());
-        Set<ObjectInstance> jobInstances = mBeanServer.queryMBeans(jobObjName, null);
-        Iterator<ObjectInstance> jobIterator = jobInstances.iterator();
-
-        while (jobIterator.hasNext()) {
-        	ObjectInstance jobInstance = jobIterator.next();
-        	ObjectName objectName = jobInstance.getObjectName();
-
-        	String jobId = (String) mBeanServer.getAttribute(objectName, "Id");
-        	String jobName = (String) mBeanServer.getAttribute(objectName, "Name");
-        	String jobCurState = (String) mBeanServer.getAttribute(objectName, "CurrentState");
-        	String jobNextState = (String) mBeanServer.getAttribute(objectName, "NextState");
-            String jobHealth = (String) mBeanServer.getAttribute(objectName, "Health");
-            String jobLastError = (String) mBeanServer.getAttribute(objectName, "LastError");
-        	
-        	System.out.println("Found a job with JobId: " + jobId + " Name: " + jobName + 
-                    " CurrentState: " + jobCurState + " NextState: " + jobNextState + 
-                    " Health: " + jobHealth + " LastError: \"" + jobLastError + "\"");
-        }
-    }
-}
diff --git a/samples/topology/src/main/java/org/apache/edgent/samples/topology/HelloEdgent.java b/samples/topology/src/main/java/org/apache/edgent/samples/topology/HelloEdgent.java
deleted file mode 100644
index c221179..0000000
--- a/samples/topology/src/main/java/org/apache/edgent/samples/topology/HelloEdgent.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.topology;
-
-import org.apache.edgent.providers.direct.DirectProvider;
-import org.apache.edgent.topology.TStream;
-import org.apache.edgent.topology.Topology;
-
-/**
- * Hello Edgent Topology sample.
- *
- */
-public class HelloEdgent {
-
-    /**
-     * Print "Hello Edgent!" as two tuples.
-     * @param args command arguments
-     * @throws Exception on failure
-     */
-    public static void main(String[] args) throws Exception {
-
-        DirectProvider dp = new DirectProvider();
-
-        Topology top = dp.newTopology();
-
-        TStream<String> helloStream = top.strings("Hello", "Edgent!");
-
-        helloStream.print();
-
-        dp.submit(top);
-    }
-}
diff --git a/samples/topology/src/main/java/org/apache/edgent/samples/topology/JobEventsSample.java b/samples/topology/src/main/java/org/apache/edgent/samples/topology/JobEventsSample.java
deleted file mode 100644
index b62ad54..0000000
--- a/samples/topology/src/main/java/org/apache/edgent/samples/topology/JobEventsSample.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.topology;
-
-import java.util.Random;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.edgent.execution.Job;
-import org.apache.edgent.execution.services.JobRegistryService;
-import org.apache.edgent.providers.direct.DirectProvider;
-import org.apache.edgent.runtime.jobregistry.JobEvents;
-import org.apache.edgent.runtime.jobregistry.JobRegistry;
-import org.apache.edgent.topology.TStream;
-import org.apache.edgent.topology.Topology;
-
-import com.google.gson.JsonObject;
-
-/**
- * Demonstrates job monitoring using the {@link JobRegistryService} service.
- * <p>
- * The example starts a system monitoring application, then concurrently 
- * submits two jobs.
- * The job monitoring application generates job event tuples when jobs 
- * are added or removed from registry, or when a job gets updated. 
- * Tuples are pushed to a sink, which prints them onto the system output.</p>
- * <p>
- * Note that the original job events stream processing is executed by the
- * JobRegistryService event {@linkplain 
- * JobRegistryService#addListener(org.apache.edgent.function.BiConsumer) listeners}
- * invoker thread. 
- * It is considered good practice to isolate the event source from the rest 
- * of the graph, in order for the processing of tuples to be executed by a
- * different thread.</p>
- */
-public class JobEventsSample {
-    private final DirectProvider dp;
-
-    public static void main(String[] args) throws Exception {
-        
-        JobEventsSample sample = new JobEventsSample();
-        ScheduledExecutorService executor = Executors.newScheduledThreadPool(2);
-
-        // Monitoring app
-        sample.startJobMonitorApp();
-
-        // Asynchronously start two applications
-        executor.schedule(sample.runMonitoredApp("MonitoredApp1"), 300, TimeUnit.MILLISECONDS);
-        executor.schedule(sample.runMonitoredApp("MonitoredApp2"), 3000, TimeUnit.MILLISECONDS);
-    }
-
-    JobEventsSample() throws Exception {
-        this.dp = new DirectProvider();
-        JobRegistry.createAndRegister(dp.getServices());
-    }
-
-    /**
-     * Declares and submits a monitored application.
-     * <p>
-     * Note that inline sleeps are introduced to simulate the timing 
-     * of a real-life application lifecycle.
-     * 
-     * @param name application name
-     */
-    void monitored(String name) throws InterruptedException, ExecutionException {
-        // Declare topology
-        Topology t = dp.newTopology(name);
-        
-        Random r = new Random();
-        TStream<Double> d  = t.poll(() -> r.nextGaussian(), 100, TimeUnit.MILLISECONDS);
-        d.sink(tuple -> System.out.print("."));
-
-        // Submit job after 2 seconds
-        Thread.sleep(2000);
-        Future<Job> f = dp.submit(t);
-        Job job = f.get();
-        
-        // Run for 5 seconds, then close job
-        Thread.sleep(5000);
-        job.stateChange(Job.Action.CLOSE);
-
-        // Unregister job after 2 seconds
-        Thread.sleep(2000);
-        provider().getServices().getService(JobRegistryService.class).removeJob(job.getId());
-    }
-
-    /**
-     * Monitoring application generates tuples on job registrations, removals, 
-     * and on registered job updates.
-     */
-    Job startJobMonitorApp() throws InterruptedException, ExecutionException {
-        Topology topology = dp.newTopology("JobMonitorApp");
-
-        TStream<JsonObject> jobEvents = JobEvents.source(
-                topology, 
-                (evType, job) -> { return JobEventsSample.wrap(evType, job); });
-
-        jobEvents.sink(tuple -> {
-                System.err.println(tuple.toString());
-            });
-
-        Future<Job> f = dp.submit(topology);
-        return f.get();
-    }
-    
-    /**
-     * Creates a JsonObject wrapping a JobRegistryService event type and 
-     * Job info.
-     * 
-     * @param evType the event type
-     * @param job the job
-     * @return the wrapped data
-     */
-    static JsonObject wrap(JobRegistryService.EventType evType, Job job) {
-        JsonObject value = new JsonObject();
-        value.addProperty("time", (Number)System.currentTimeMillis());
-        value.addProperty("event", evType.toString());
-        JsonObject obj = new JsonObject();
-        obj.addProperty("id", job.getId());
-        obj.addProperty("name", job.getName());
-        obj.addProperty("state", job.getCurrentState().toString());
-        obj.addProperty("nextState", job.getNextState().toString());
-        obj.addProperty("health", job.getHealth().toString());
-        obj.addProperty("lastError", job.getLastError());
-        value.add("job", obj);
-        return value;
-    }
-
-    private DirectProvider provider() {
-        return dp;
-    }
-    
-    private Runnable runMonitoredApp(String name) {
-        return new Runnable() {
-
-            @Override
-            public void run() {
-                try {
-                    monitored(name);
-                } catch (Throwable t) {
-                    throw new RuntimeException(t);
-                }
-            }
-        };
-    }
-}
diff --git a/samples/topology/src/main/java/org/apache/edgent/samples/topology/JobExecution.java b/samples/topology/src/main/java/org/apache/edgent/samples/topology/JobExecution.java
deleted file mode 100644
index 9e53949..0000000
--- a/samples/topology/src/main/java/org/apache/edgent/samples/topology/JobExecution.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.topology;
-
-import java.util.Random;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-
-import org.apache.edgent.execution.Job;
-import org.apache.edgent.providers.direct.DirectProvider;
-import org.apache.edgent.topology.TStream;
-import org.apache.edgent.topology.Topology;
-
-/**
- * Using the Job API to get/set a job's state.
- */
-public class JobExecution {
-    public final static long JOB_LIFE_MILLIS = 10000;
-    public final static long WAIT_AFTER_CLOSE = 2000;
-
-    public static void main(String[] args) throws ExecutionException {
-
-        DirectProvider tp = new DirectProvider();
-
-        Topology t = tp.newTopology("JobExecution");
-
-        // Source
-        Random r = new Random();
-        TStream<Double> gaussian = t.poll(() -> r.nextGaussian(), 1, TimeUnit.SECONDS);
-
-        // Peek
-        gaussian = gaussian.peek(g -> System.out.println("R:" + g));
-  
-        // Transform to strings
-        TStream<String> gsPeriodic = gaussian.map(g -> "G:" + g + ":");
-        gsPeriodic.print();
-  
-        // Submit job and poll its status for a while
-        Future<Job> futureJob = tp.submit(t);
-        Reporter reporter = new Reporter();
-        try {
-            Job job = futureJob.get();
-            reporter.start(job);
-
-            // Wait for the job to complete
-            try {
-                job.complete(JOB_LIFE_MILLIS, TimeUnit.MILLISECONDS);
-                System.out.println("The job completed successfully");
-            } catch (ExecutionException e) {
-                System.out.println("The job aborted by throwing exception: " + e);
-            }
-            catch (InterruptedException e) {
-                System.out.println("Interrupted while waiting for the job to complete");
-            }
-            catch (TimeoutException e) {
-                System.out.println("Timed out while waiting for the job to complete");
-            }
-            finally {
-                System.out.println("Closing the job...");
-                job.stateChange(Job.Action.CLOSE);
-            }
-            System.out.println("Sleep after job close for " + WAIT_AFTER_CLOSE + " ms");
-            Thread.sleep(WAIT_AFTER_CLOSE);
-        }
-        catch (InterruptedException e) {
-            System.err.println("Interrupted!");
-        }
-        finally {
-            reporter.stop();
-        }
-    }
-
-    static class Reporter implements Runnable {
-        private volatile Job job;
-        private volatile Thread runner;
-        
-        @Override
-        public void run() {
-            try {
-                while (true) {
-                    if (job != null)
-                        System.out.println("Job state is: current=" + job.getCurrentState() + 
-                                " next=" + job.getNextState());
-                    Thread.sleep(500);
-                }
-            } catch (InterruptedException e) {
-                System.out.println("Reporter interrupted");
-            } catch (Exception e) {
-                throw new RuntimeException(e);
-            }
-        }
-        
-        void start(Job job) {
-            this.job = job;
-            runner = Executors.defaultThreadFactory().newThread(this);
-            runner.setName("Reporter");
-            runner.setDaemon(false);
-            runner.start();
-        }
-        
-        void stop() {
-            runner.interrupt();
-        }
-    }
-}
diff --git a/samples/topology/src/main/java/org/apache/edgent/samples/topology/PeriodicSource.java b/samples/topology/src/main/java/org/apache/edgent/samples/topology/PeriodicSource.java
deleted file mode 100644
index ad13b84..0000000
--- a/samples/topology/src/main/java/org/apache/edgent/samples/topology/PeriodicSource.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-package org.apache.edgent.samples.topology;
-
-import java.util.Random;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.edgent.providers.direct.DirectProvider;
-import org.apache.edgent.topology.TStream;
-import org.apache.edgent.topology.Topology;
-
-/**
- * Periodic polling of source data.
- *
- */
-public class PeriodicSource {
-    /**
-     * Shows polling a data source to periodically obtain a value.
-     * Polls a random number generator for a new value every second
-     * and then prints out the raw value and a filtered and transformed stream.
-     * @param args command arguments
-     * @throws Exception on failure
-     */
-    public static void main(String[] args) throws Exception {
-
-        DirectProvider tp = new DirectProvider();
-
-        Topology t = tp.newTopology("PeriodicSource");
-
-        // Since this is the Direct provider the graph can access
-        // objects created while the topology is being defined
-        // (in this case the Random object r).
-        Random r = new Random();
-        TStream<Double> gaussian = t.poll(() -> r.nextGaussian(), 1, TimeUnit.SECONDS);
-
-        // Peek at the value on the Stream printing it to System.out
-        gaussian = gaussian.peek(g -> System.out.println("R:" + g));
-
-        // A filter
-        gaussian = gaussian.filter(g -> g > 0.5);
-
-        // A transformation
-        TStream<String> gs = gaussian.map(g -> "G:" + g + ":");
-        gs.print();
-
-        tp.submit(t);
-    }
-}
diff --git a/samples/topology/src/main/java/org/apache/edgent/samples/topology/SensorsAggregates.java b/samples/topology/src/main/java/org/apache/edgent/samples/topology/SensorsAggregates.java
deleted file mode 100644
index c260ecf..0000000
--- a/samples/topology/src/main/java/org/apache/edgent/samples/topology/SensorsAggregates.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-package org.apache.edgent.samples.topology;
-
-import static org.apache.edgent.analytics.math3.stat.Statistic.MAX;
-import static org.apache.edgent.analytics.math3.stat.Statistic.MEAN;
-import static org.apache.edgent.analytics.math3.stat.Statistic.MIN;
-import static org.apache.edgent.analytics.math3.stat.Statistic.STDDEV;
-
-import org.apache.edgent.analytics.math3.json.JsonAnalytics;
-import org.apache.edgent.console.server.HttpServer;
-import org.apache.edgent.providers.development.DevelopmentProvider;
-import org.apache.edgent.providers.direct.DirectProvider;
-import org.apache.edgent.samples.utils.sensor.SimulatedSensors;
-import org.apache.edgent.topology.TStream;
-import org.apache.edgent.topology.TWindow;
-import org.apache.edgent.topology.Topology;
-
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-
-/**
- * Aggregation of sensor readings.
- * 
- * Demonstrates partitioned aggregation and filtering of simulated sensors
- * that are bursty in nature, so that only intermittently
- * is the data output to {@code System.out}.
- * <P>
- * The two sensors are read as independent streams but combined
- * into a single stream and then aggregated across the last 50 readings
- * using windows. The window is partitioned by the sensor name
- * so that each sensor will have its own independent window.
- * This partitioning is automatic so that the same code would
- * work if readings from one hundred different sensors were
- * on the same stream, is it just driven by a key function.
- * <BR>
- * The windows are then aggregated using Apache Common Math
- * provided statistics and the final stream filtered so
- * that it will only contain values when each sensor 
- * is (independently) out of range.
- * </P>
- *
- * @see SimulatedSensors#burstySensor(Topology, String)
- */
-public class SensorsAggregates {
-	
-    /**
-     * Run a topology with two bursty sensors printing them to standard out.
-     * @param args command arguments
-     * @throws Exception on failure
-     */
-    public static void main(String[] args) throws Exception {
-    	
-    	System.out.println("SensorsAggregates: Output will be randomly intermittent, be patient!");
-
-        DirectProvider tp = new DevelopmentProvider();
-        
-        Topology topology = tp.newTopology("SensorsReadingAggregates");
-        
-        TStream<JsonObject> sensors = sensorsAB(topology);
-        
-        sensors.print();
-
-        System.out.println("#### Console URL for the job: "
-            + tp.getServices().getService(HttpServer.class).getConsoleUrl());
-
-        tp.submit(topology);
-    }
-    
-    /**
-     * Create a stream containing two aggregates from two bursty
-     * sensors A and B that only produces output when the sensors
-     * (independently) are having a burst period out of their normal range.
-     * @param topology Topology to add the sub-graph to.
-     * @return Stream containing two aggregates from two bursty
-     * sensors A and B
-     */
-    public static TStream<JsonObject> sensorsAB(Topology topology) {
-    	
-    	// Simulate two sensors, A and B, both randomly bursty
-        TStream<JsonObject> sensorA = SimulatedSensors.burstySensor(topology, "A");
-        TStream<JsonObject> sensorB = SimulatedSensors.burstySensor(topology, "B");
-        
-        // Combine the sensor readings into a single stream
-        TStream<JsonObject> sensors = sensorA.union(sensorB);
-        
-        // Create a window on the stream of the last 50 readings partitioned
-        // by sensor name. In this case two independent windows are created (for a and b)
-        TWindow<JsonObject,JsonElement> sensorWindow = sensors.last(50, j -> j.get("name"));
-        
-        // Aggregate the windows calculating the min, max, mean and standard deviation
-        // across each window independently.
-        sensors = JsonAnalytics.aggregate(sensorWindow, "name", "reading", MIN, MAX, MEAN, STDDEV);
-        
-        // Filter so that only when the sensor is beyond 2.0 (absolute) is a reading sent.
-        sensors = sensors.filter(j -> Math.abs(j.get("reading").getAsJsonObject().get("MEAN").getAsDouble()) > 2.0);
-        
-        return sensors;
-
-    }
-}
diff --git a/samples/topology/src/main/java/org/apache/edgent/samples/topology/SimpleFilterTransform.java b/samples/topology/src/main/java/org/apache/edgent/samples/topology/SimpleFilterTransform.java
deleted file mode 100644
index 7cd38b9..0000000
--- a/samples/topology/src/main/java/org/apache/edgent/samples/topology/SimpleFilterTransform.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-package org.apache.edgent.samples.topology;
-
-import java.util.Random;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.edgent.execution.Job;
-import org.apache.edgent.providers.direct.DirectProvider;
-import org.apache.edgent.topology.TStream;
-import org.apache.edgent.topology.Topology;
-
-public class SimpleFilterTransform {
-    public static void main(String[] args) throws Exception {
-
-        DirectProvider tp = new DirectProvider();
-
-        Topology t = tp.newTopology("SimpleFilterTransform");
-
-        Random r = new Random();
-        TStream<Double> gaussian = t.generate(() -> r.nextGaussian());
-
-        // testing Peek!
-        gaussian = gaussian.peek(g -> System.out.println("R:" + g));
-
-        // A filter
-        gaussian = gaussian.filter(g -> g > 0.5);
-
-        // A transformation
-        TStream<String> gs = gaussian.map(g -> "G:" + g + ":");
-        gs.print();
-
-        // Submit the job, then close it after a while 
-        Future<Job> futureJob = tp.submit(t);
-        Job job = futureJob.get();
-        Thread.sleep(TimeUnit.SECONDS.toMillis(5));
-        job.stateChange(Job.Action.CLOSE);
-    }
-}
diff --git a/samples/topology/src/main/java/org/apache/edgent/samples/topology/SplitWithEnumSample.java b/samples/topology/src/main/java/org/apache/edgent/samples/topology/SplitWithEnumSample.java
deleted file mode 100644
index 3e59074..0000000
--- a/samples/topology/src/main/java/org/apache/edgent/samples/topology/SplitWithEnumSample.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * <p>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.edgent.samples.topology;
-
-import java.util.EnumMap;
-import java.util.Random;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.edgent.console.server.HttpServer;
-import org.apache.edgent.providers.development.DevelopmentProvider;
-import org.apache.edgent.topology.TStream;
-import org.apache.edgent.topology.Topology;
-
-public class SplitWithEnumSample {
-
-    public enum LogSeverityEnum {
-
-        ALERT(1), CRITICAL(2), ERROR(3), WARNING(4), NOTICE(5), INFO(6), DEBUG(7);
-
-        @SuppressWarnings("unused")
-        private final int code;
-
-        LogSeverityEnum(final int code) {
-            this.code = code;
-        }
-    }
-
-    public static void main(String[] args) throws Exception {
-        DevelopmentProvider dtp = new DevelopmentProvider();
-
-        Topology t = dtp.newTopology("SplitWithEnumSample");
-
-        Random r = new Random();
-
-        LogSeverityEnum[] values = LogSeverityEnum.values();
-        TStream<String> d = t.poll(() -> values[r.nextInt(values.length)].toString()+ "_Log", 500, TimeUnit.MILLISECONDS);
-
-        EnumMap<LogSeverityEnum, TStream<String>> categories = d
-            .split(LogSeverityEnum.class, e -> LogSeverityEnum.valueOf(e.split("_")[0]));
-
-        TStream<String> warnStream = categories.get(LogSeverityEnum.WARNING).tag("WARN");
-        TStream<String> errorStream = categories.get(LogSeverityEnum.ERROR).tag("ERROR");
-        TStream<String> infoStream = categories.get(LogSeverityEnum.INFO).tag("INFO");
-
-        warnStream.sink(data -> System.out.println("warnStream = " + data));
-        errorStream.sink(data -> System.out.println("errorStream = " + data));
-        infoStream.sink(data -> System.out.println("infoStream = " + data));
-
-        dtp.submit(t);
-
-        System.out.println(dtp.getServices().getService(HttpServer.class).getConsoleUrl());
-    }
-}
diff --git a/samples/topology/src/main/java/org/apache/edgent/samples/topology/StreamTags.java b/samples/topology/src/main/java/org/apache/edgent/samples/topology/StreamTags.java
deleted file mode 100644
index 3eb3fa9..0000000
--- a/samples/topology/src/main/java/org/apache/edgent/samples/topology/StreamTags.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.topology;
-
-import java.util.List;
-import java.util.Random;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.edgent.console.server.HttpServer;
-import org.apache.edgent.providers.development.DevelopmentProvider;
-import org.apache.edgent.topology.TStream;
-import org.apache.edgent.topology.Topology;
-
-/**
- * Illustrates tagging TStreams with string labels.
- */
-public class StreamTags {
-    public static void main(String[] args) throws Exception {
-        DevelopmentProvider dtp = new DevelopmentProvider();
-        
-        Topology t = dtp.newTopology("StreamTags");
-        
-        // Tag the source stream with 
-        Random r = new Random();
-        TStream<Double> d  = t.poll(() -> (r.nextDouble() * 3), 
-                100, TimeUnit.MILLISECONDS).tag("dots", "hashes", "ats");
-
-        List<TStream<Double>> splits = d.split(3, tuple -> {
-            switch (tuple.intValue()) {
-            case 0:
-                return 0;
-            case 1:
-                return 1;
-            default:
-                return 2;
-            }
-        });
-
-        splits.get(0).tag("dots").sink(tuple -> System.out.print("."));
-        splits.get(1).tag("hashes").sink(tuple -> System.out.print("#"));
-        splits.get(2).tag("ats").sink(tuple -> System.out.print("@"));
-        
-        dtp.submit(t);
-        
-        System.out.println(dtp.getServices().getService(HttpServer.class).getConsoleUrl());
-    }
-}
diff --git a/samples/topology/src/main/java/org/apache/edgent/samples/topology/TerminateAfterNTuples.java b/samples/topology/src/main/java/org/apache/edgent/samples/topology/TerminateAfterNTuples.java
deleted file mode 100644
index f15b3d0..0000000
--- a/samples/topology/src/main/java/org/apache/edgent/samples/topology/TerminateAfterNTuples.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-package org.apache.edgent.samples.topology;
-
-import java.util.Random;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.apache.edgent.providers.direct.DirectProvider;
-import org.apache.edgent.topology.TStream;
-import org.apache.edgent.topology.Topology;
-
-/**
- * This application simulates a crash and terminates the JVM after processing
- * a preset number of tuples. This application is used in conjunction with a 
- * monitoring script to demonstrate the restart of a JVM which has terminated
- * because of an Edgent application crash.
- */
-public class TerminateAfterNTuples {
-    /** The application will terminate the JVM after this tuple count */
-    public final static int TERMINATE_COUNT = 15;
-    
-    public static void main(String[] args) throws Exception {
-
-        DirectProvider tp = new DirectProvider();
-
-        Topology t = tp.newTopology("PeriodicSource");
-
-        // Since this is the Direct provider the graph can access
-        // objects created while the topology is being defined
-        // (in this case the Random object r).
-        Random r = new Random();
-        TStream<Double> gaussian = t.poll(() -> r.nextGaussian(), 1, TimeUnit.SECONDS);
-
-        // Program termination
-        AtomicInteger count = new AtomicInteger(0);
-        gaussian = gaussian.peek(g -> {
-            if (count.incrementAndGet() >= TERMINATE_COUNT) {
-                System.err.println("The JVM terminates after processing " + 
-                        TERMINATE_COUNT + " tuples");
-                System.exit(1);
-            }
-        });
-
-        // Peek at the value on the Stream printing it to System.out
-        gaussian = gaussian.peek(g -> System.out.println("R:" + g));
-
-        tp.submit(t);
-    }
-}
diff --git a/samples/utils/build.gradle b/samples/utils/build.gradle
deleted file mode 100644
index c70a06d..0000000
--- a/samples/utils/build.gradle
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-dependencies {
-  // N.B. common dependencies are set in root build.gradle
-
-  addTargetDirProjectJarDependency 'compile', ':utils:metrics'
-  addTargetDirProjectJarDependency 'compile', ':analytics:math3'
-  addTargetDirProjectJarDependency 'compile', ':analytics:sensors'
-
-  // N.B. root project adds test common dependencies
-}
diff --git a/samples/utils/src/main/java/org/apache/edgent/samples/utils/metrics/PeriodicSourceWithMetrics.java b/samples/utils/src/main/java/org/apache/edgent/samples/utils/metrics/PeriodicSourceWithMetrics.java
deleted file mode 100644
index b883e3e..0000000
--- a/samples/utils/src/main/java/org/apache/edgent/samples/utils/metrics/PeriodicSourceWithMetrics.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.utils.metrics;
-
-import java.util.Random;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.edgent.metrics.Metrics;
-import org.apache.edgent.metrics.MetricsSetup;
-import org.apache.edgent.providers.direct.DirectProvider;
-import org.apache.edgent.topology.TStream;
-import org.apache.edgent.topology.Topology;
-
-import com.codahale.metrics.MetricRegistry;
-
-public class PeriodicSourceWithMetrics {
-    public static void main(String[] args) throws InterruptedException {
-
-        DirectProvider tp = new DirectProvider();
-
-        Topology t = tp.newTopology("PeriodicSource");
-
-        Random r = new Random();
-        TStream<Double> gaussian = t.poll(() -> r.nextGaussian(), 1, TimeUnit.SECONDS);
-
-        // Testing Peek
-        gaussian = gaussian.peek(g -> System.out.println("R:" + g));
-
-        // Measure the tuple count for the gaussian TStream
-        gaussian = Metrics.counter(gaussian);
-        
-        // A filter
-        gaussian = gaussian.filter(g -> g > 0.5);
-
-        // Measure tuple arrival rate after filtering
-        gaussian = Metrics.rateMeter(gaussian);
-
-        // A transformation
-        TStream<String> gs = gaussian.map(g -> "G:" + g + ":");
-        gs.print();
-
-        // Initialize the metrics service
-        MetricRegistry metrics = new MetricRegistry();
-        
-        // Start metrics JMX reporter
-        MetricsSetup.withRegistry(tp.getServices(), metrics).startJMXReporter(
-                PeriodicSourceWithMetrics.class.getName());
-
-        // Submit the topology
-        tp.submit(t);
-    }
-}
diff --git a/samples/utils/src/main/java/org/apache/edgent/samples/utils/metrics/SplitWithMetrics.java b/samples/utils/src/main/java/org/apache/edgent/samples/utils/metrics/SplitWithMetrics.java
deleted file mode 100644
index 43d4444..0000000
--- a/samples/utils/src/main/java/org/apache/edgent/samples/utils/metrics/SplitWithMetrics.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.utils.metrics;
-
-import java.util.List;
-import java.util.Random;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.edgent.console.server.HttpServer;
-import org.apache.edgent.metrics.Metrics;
-import org.apache.edgent.providers.development.DevelopmentProvider;
-import org.apache.edgent.topology.TStream;
-import org.apache.edgent.topology.Topology;
-
-/**
- * Instruments a topology with a tuple counter on a specified stream.
- */
-public class SplitWithMetrics {
-
-    public static void main(String[] args) throws Exception {
-        DevelopmentProvider dtp = new DevelopmentProvider();
-        
-        Topology t = dtp.newTopology(SplitWithMetrics.class.getSimpleName());
-        
-        Random r = new Random();
-        
-        TStream<Integer> d  = t.poll(() -> (int)(r.nextGaussian() * 3.0), 
-                100, TimeUnit.MILLISECONDS);
-
-        List<TStream<Integer>> splits = d.split(3, tuple -> {
-            switch (tuple.intValue()) {
-            case 0:
-                return 0;
-            case 1:
-                return 1;
-            default:
-                return 2;
-            }
-        });
-
-        /* 
-         * Insert a metric counter for the zeroes stream.  Note that the 
-         * DevelopmentProvider submitter will insert metric counters at 
-         * submit time on the output of each oplet, including the counter
-         * explicitly inserted below.
-         */
-        Metrics.counter(splits.get(0)).sink(tuple -> System.out.print("."));
-
-        splits.get(1).sink(tuple -> System.out.print("#"));
-        splits.get(2).sink(tuple -> System.out.print("@"));
-        
-        dtp.submit(t);
-        System.out.println(dtp.getServices().getService(HttpServer.class).getConsoleUrl());
-    }
-}
diff --git a/samples/utils/src/main/java/org/apache/edgent/samples/utils/sensor/HeartMonitorSensor.java b/samples/utils/src/main/java/org/apache/edgent/samples/utils/sensor/HeartMonitorSensor.java
deleted file mode 100644
index 729b4ca..0000000
--- a/samples/utils/src/main/java/org/apache/edgent/samples/utils/sensor/HeartMonitorSensor.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.utils.sensor;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Random;
-
-import org.apache.edgent.function.Supplier;
-
-/**
- * Streams of simulated heart monitor sensors.
- *
- */
-public class HeartMonitorSensor implements Supplier<Map<String,Integer>> {
-    private static final long serialVersionUID = 1L;
-    // Initial blood pressure
-    public Integer currentSystolic = 115;
-    public Integer currentDiastolic = 75;
-    Random rand;
-
-    public HeartMonitorSensor() {
-        rand = new Random();
-    }
-
-    /**
-     * Every call to this method returns a map containing a random systolic
-     * pressure and a random diastolic pressure.
-     */
-    @Override
-    public Map<String, Integer> get() {
-        // Change the current pressure by some random amount between -2 and 2
-        Integer newSystolic = rand.nextInt(2 + 1 + 2) - 2 + currentSystolic;
-        currentSystolic = newSystolic;
-
-        Integer newDiastolic = rand.nextInt(2 + 1 + 2) - 2 + currentDiastolic;
-        currentDiastolic = newDiastolic;
-
-        Map<String, Integer> pressures = new HashMap<String, Integer>();
-        pressures.put("Systolic", currentSystolic);
-        pressures.put("Diastolic", currentDiastolic);
-        return pressures;
-    }
-}
diff --git a/samples/utils/src/main/java/org/apache/edgent/samples/utils/sensor/PeriodicRandomSensor.java b/samples/utils/src/main/java/org/apache/edgent/samples/utils/sensor/PeriodicRandomSensor.java
deleted file mode 100644
index 93aa20f..0000000
--- a/samples/utils/src/main/java/org/apache/edgent/samples/utils/sensor/PeriodicRandomSensor.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.samples.utils.sensor;
-
-import java.util.Random;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.commons.math3.util.Pair;
-import org.apache.edgent.topology.TStream;
-import org.apache.edgent.topology.Topology;
-
-/**
- * A factory of simple periodic random sensor reading streams.
- * <p>
- * The generated {@link TStream} has a {@code org.apache.commons.math3.utils.Pair}
- * tuple type where {@link Pair#getFirst()} the reading's msecTimestamp
- * and {@link Pair#getSecond()} is the sensor value reading.
- * <p>
- * The sensor reading values are randomly generated via {@link Random}
- * and have the value distributions, as defined by {@code Random}.
- * <p>
- * Each stream has its own {@code Random} object instance.
- */
-public class PeriodicRandomSensor {
-    private Long seed;
-    
-    /**
-     * Create a new random periodic sensor factory configured
-     * to use {@link Random#Random()}. 
-     */
-    public PeriodicRandomSensor() {
-    }
-    
-    /**
-     * Create a new random periodic sensor factory configured
-     * to use {@link Random#Random(long)}. 
-     * 
-     * @param seed seed to use when creating new sensor streams.
-     */
-    public PeriodicRandomSensor(long seed) {
-        this.seed = seed;
-    }
-    
-    /**
-     * Set the seed to be used by subsequently created sensor streams.
-     * @param seed the seed value
-     */
-    public void setSeed(long seed) {
-        this.seed = seed;
-    }
-    
-    private Random newRandom() {
-        if (seed != null)
-            return new Random(seed);
-        return new Random();
-    }
-    
-    /**
-     * Create a periodic sensor stream with readings from {@link Random#nextGaussian()}.
-     * @param t the topology to add the sensor stream to
-     * @param periodMsec how frequently to generate a reading
-     * @return the sensor value stream
-     */
-    public TStream<Pair<Long,Double>> newGaussian(Topology t, long periodMsec) {
-        Random r = newRandom();
-        return t.poll(() -> new Pair<Long,Double>(System.currentTimeMillis(), r.nextGaussian()), 
-                periodMsec, TimeUnit.MILLISECONDS);
-        
-    }
-    
-    /**
-     * Create a periodic sensor stream with readings from {@link Random#nextDouble()}.
-     * @param t the topology to add the sensor stream to
-     * @param periodMsec how frequently to generate a reading
-     * @return the sensor value stream
-     */
-    public TStream<Pair<Long,Double>> newDouble(Topology t, long periodMsec) {
-        Random r = newRandom();
-        return t.poll(() -> new Pair<Long,Double>(System.currentTimeMillis(), r.nextDouble()), 
-                periodMsec, TimeUnit.MILLISECONDS);
-        
-    }
-    
-    /**
-     * Create a periodic sensor stream with readings from {@link Random#nextFloat()}.
-     * @param t the topology to add the sensor stream to
-     * @param periodMsec how frequently to generate a reading
-     * @return the sensor value stream
-     */
-    public TStream<Pair<Long,Float>> newFloat(Topology t, long periodMsec) {
-        Random r = newRandom();
-        return t.poll(() -> new Pair<Long,Float>(System.currentTimeMillis(), r.nextFloat()), 
-                periodMsec, TimeUnit.MILLISECONDS);
-        
-    }
-    
-    /**
-     * Create a periodic sensor stream with readings from {@link Random#nextLong()}.
-     * @param t the topology to add the sensor stream to
-     * @param periodMsec how frequently to generate a reading
-     * @return the sensor value stream
-     */
-    public TStream<Pair<Long,Long>> newLong(Topology t, long periodMsec) {
-        Random r = newRandom();
-        return t.poll(() -> new Pair<Long,Long>(System.currentTimeMillis(), r.nextLong()), 
-                periodMsec, TimeUnit.MILLISECONDS);
-        
-    }
-    
-    /**
-     * Create a periodic sensor stream with readings from {@link Random#nextInt()}.
-     * @param t the topology to add the sensor stream to
-     * @param periodMsec how frequently to generate a reading
-     * @return the sensor value stream
-     */
-    public TStream<Pair<Long,Integer>> newInteger(Topology t, long periodMsec) {
-        Random r = newRandom();
-        return t.poll(() -> new Pair<Long,Integer>(System.currentTimeMillis(), r.nextInt()), 
-                periodMsec, TimeUnit.MILLISECONDS);
-        
-    }
-    
-    /**
-     * Create a periodic sensor stream with readings from {@link Random#nextInt(int)}.
-     * @param t the topology to add the sensor stream to
-     * @param periodMsec how frequently to generate a reading
-     * @param bound the upper bound (exclusive). Must be positive.
-     * @return the sensor value stream
-     */
-    public TStream<Pair<Long,Integer>> newInteger(Topology t, long periodMsec, int bound) {
-        Random r = newRandom();
-        return t.poll(() -> new Pair<Long,Integer>(System.currentTimeMillis(), r.nextInt(bound)), 
-                periodMsec, TimeUnit.MILLISECONDS);
-        
-    }
-    
-    /**
-     * Create a periodic sensor stream with readings from {@link Random#nextBoolean()}.
-     * @param t the topology to add the sensor stream to
-     * @param periodMsec how frequently to generate a reading
-     * @return the sensor value stream
-     */
-    public TStream<Pair<Long,Boolean>> newBoolean(Topology t, long periodMsec) {
-        Random r = newRandom();
-        return t.poll(() -> new Pair<Long,Boolean>(System.currentTimeMillis(), r.nextBoolean()), 
-                periodMsec, TimeUnit.MILLISECONDS);
-        
-    }
-    
-    /**
-     * Create a periodic sensor stream with readings from {@link Random#nextBytes(byte[])}.
-     * @param t the topology to add the sensor stream to
-     * @param periodMsec how frequently to generate a reading
-     * @param nBytes the number of bytes in each reading tuple
-     * @return the sensor value stream
-     */
-    public TStream<Pair<Long,byte[]>> newBytes(Topology t, long periodMsec, int nBytes) {
-        Random r = newRandom();
-        return t.poll(() -> { byte[] bytes = new byte[nBytes];
-                              r.nextBytes(bytes);
-                              return new Pair<Long,byte[]>(System.currentTimeMillis(), bytes);
-                            }, 
-                periodMsec, TimeUnit.MILLISECONDS);
-    }
-
-}
diff --git a/samples/utils/src/main/java/org/apache/edgent/samples/utils/sensor/SimpleSimulatedSensor.java b/samples/utils/src/main/java/org/apache/edgent/samples/utils/sensor/SimpleSimulatedSensor.java
deleted file mode 100644
index 0e306ca..0000000
--- a/samples/utils/src/main/java/org/apache/edgent/samples/utils/sensor/SimpleSimulatedSensor.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-package org.apache.edgent.samples.utils.sensor;
-
-import java.text.DecimalFormat;
-import java.util.Random;
-
-import org.apache.edgent.analytics.sensors.Range;
-import org.apache.edgent.function.Supplier;
-
-/**
- * A simple simulated sensor.
- * <p>
- * The sensor starts off with an initial value.
- * Each call to {@link #get()} changes the current value by
- * a random amount between plus/minus {@code deltaFactor}.
- * The new current value is limited to a {@code range}
- * and then rounded to 1 fractional digit. 
- * See {@link #setNumberFractionalDigits(int)}.
- * </p><p>
- * Sample use:
- * <pre>{@code
- * Topology t = ...;
- * // a miles-per-gallon sensor
- * SimpleSimulatedSensor avgMpgSensor = new SimpleSimulatedSensor(10.5, 0.4,
- *                                          Ranges<Double>.closed(7.0,14.0));
- * TStream<Double> avgMpg = t.poll(avgMpgSensor, 1, TimeUnit.SECONDS);
- * 
- * // an integer valued sensor
- * SimpleSimulatedSensor doubleSensor = new SimpleSimulatedSensor();
- * TStream<Integer> intSensor = t.poll(() -> doubleSensor.get().intValue(),
- *                                          1, TimeUnit.SECONDS);
- * }</pre>
- */
-public class SimpleSimulatedSensor implements Supplier<Double> {
-    private static final long serialVersionUID = 1L;
-    private int numFracDigits;
-    private volatile DecimalFormat df;
-    private Random r = new Random();
-    private final Range<Double> range;
-    private final double deltaFactor;
-    private double currentValue;
-   
-    /**
-     * Create a sensor.
-     * <p>
-     * Same as {@code SimpleSimulatedSensor(0.0, 1.0, null)};
-     * </p>
-     */
-    public SimpleSimulatedSensor() {
-        this(0.0, 1.0, null);
-    }
-    
-    /**
-     * Create a sensor.
-     * <p>
-     * Same as {@code SimpleSimulatedSensor(initialValue, 1.0, null)};
-     * </p>
-     * @param initialValue the initial value
-     */
-    public SimpleSimulatedSensor(double initialValue) {
-        this(initialValue, 1.0, null);
-    }
-    
-    /**
-     * Create a sensor.
-     * 
-     * <p>
-     * Same as {@code SimpleSimulatedSensor(initialValue, deltaFactor, null)};
-     * </p>
-     * @param initialValue the initial value.
-     * @param deltaFactor maximum plus/minus change on each {@code get()}.
-     *              e.g., 1.0 to limit change to +/- 1.0.
-     *              Must be &gt; 0.0
-     */
-    public SimpleSimulatedSensor(double initialValue, double deltaFactor) {
-        this(initialValue, deltaFactor, null);
-    }
-    
-    /**
-     * Create a sensor.
-     * 
-     * @param initialValue the initial value.  Must be within range.
-     * @param deltaFactor maximum plus/minus change on each {@link #get()}.
-     *              e.g., 1.0 to limit change to +/- 1.0.
-     *              Must be &gt; 0.0
-     * @param range maximum sensor value range. Unlimited if null.
-     */
-    public SimpleSimulatedSensor(double initialValue,
-            double deltaFactor, Range<Double> range) {
-        if (range!=null && !range.contains(initialValue))
-            throw new IllegalArgumentException("initialValue");
-        if (deltaFactor <= 0.0)
-            throw new IllegalArgumentException("deltaFactor");
-        this.currentValue = initialValue;
-        this.deltaFactor = deltaFactor;
-        this.range = range;
-        setNumberFractionalDigits(1);
-    }
-    
-    /**
-     * Set number of fractional digits to round sensor values to.
-     * <p>
-     * This class offers rounding as a convenience and because
-     * ancestors of this implementation had such a scheme.
-     * </p>
-     * @param numFracDigits  if &lt;= 0, no rounding will be performed
-     */
-    public void setNumberFractionalDigits(int numFracDigits) {
-        this.numFracDigits = numFracDigits;
-        if (numFracDigits <= 0) {
-            df = null;
-        }
-        else {
-            String fracPattern = "";
-            for (int i = 0; i < numFracDigits; i++)
-                fracPattern += "#";
-            df = new DecimalFormat("#."+fracPattern);
-        }
-    }
-    
-    /** Get the number of fractional digits setting
-     * @return the value
-     */
-    public int getNumberFractionalDigits() {
-        return numFracDigits;
-    }
-    
-    /** Get the range setting
-     * @return the value
-     */
-    public Range<Double> getRange() {
-        return range;
-    }
-    
-    /** Get the deltaFactor setting
-     * @return the value
-     */
-    public double getDeltaFactor() {
-        return deltaFactor;
-    }
-    
-    /** Get the next sensor value as described in the class documentation. */
-    @Override
-    public Double get() {
-        double delta = 2 * r.nextDouble() - 1.0; // between -1.0 and 1.0
-        double nextValue = currentValue + delta * deltaFactor;
-        if (range!=null && !range.contains(nextValue)) {
-            nextValue = nextValue > currentValue
-                        ? range.upperEndpoint()
-                        : range.lowerEndpoint();
-        }
-        if (df != null)
-            nextValue = Double.valueOf(df.format(nextValue));
-        currentValue = nextValue;
-        return currentValue;
-    }
-}
diff --git a/samples/utils/src/main/java/org/apache/edgent/samples/utils/sensor/SimulatedSensors.java b/samples/utils/src/main/java/org/apache/edgent/samples/utils/sensor/SimulatedSensors.java
deleted file mode 100644
index b1856ff..0000000
--- a/samples/utils/src/main/java/org/apache/edgent/samples/utils/sensor/SimulatedSensors.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-package org.apache.edgent.samples.utils.sensor;
-
-import java.util.Random;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.edgent.topology.TStream;
-import org.apache.edgent.topology.Topology;
-
-import com.google.gson.JsonObject;
-
-/**
- * Streams of simulated sensors.
- *
- */
-public class SimulatedSensors {
-
-    /**
-     * Create a stream of simulated bursty sensor readings.
-     * 
-     * Simulation of reading a sensor every 100ms with the readings
-     * generally falling below 2.0 (absolute) but randomly have
-     * prolonged bursts of higher values.
-     * 
-     * Each tuple is a JSON object containing:
-     * <UL>
-     * <LI>{@code name} - Name of the sensor from {@code name}.</LI>
-     * <LI>{@code reading} - Value.</LI>
-     * </UL>
-     * 
-     * @param topology Topology to be added to.
-     * @param name Name of the sensor in the JSON output.
-     * @return Stream containing bursty data.
-     */
-    public static TStream<JsonObject> burstySensor(Topology topology, String name) {
-
-        Random r = new Random();
-
-        TStream<Double> sensor = topology.poll(() -> r.nextGaussian(), 100, TimeUnit.MILLISECONDS);
-
-        boolean[] abnormal = new boolean[1];
-        int[] count = new int[1];
-        double[] delta = new double[1];
-        sensor = sensor.modify(t -> {
-            if (abnormal[0] || r.nextInt(100) < 4) {
-                if (!abnormal[0]) {
-                    delta[0] = 0.5 + 2 * r.nextGaussian();
-                    count[0] = 5 + r.nextInt(20);
-                    abnormal[0] = true;
-                }
-                count[0]--;
-                if (count[0] <= 0)
-                    abnormal[0] = false;
-                return t + delta[0];
-            } else
-                return t;
-        });
-
-        sensor = sensor.filter(t -> Math.abs(t) > 1.5);
-
-        return sensor.map(t -> {
-            JsonObject j = new JsonObject();
-            j.addProperty("name", name);
-            j.addProperty("reading", t);
-            return j;
-        });
-
-    }
-
-}
diff --git a/samples/utils/src/main/java/org/apache/edgent/samples/utils/sensor/SimulatedTemperatureSensor.java b/samples/utils/src/main/java/org/apache/edgent/samples/utils/sensor/SimulatedTemperatureSensor.java
deleted file mode 100644
index e749ce8..0000000
--- a/samples/utils/src/main/java/org/apache/edgent/samples/utils/sensor/SimulatedTemperatureSensor.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-package org.apache.edgent.samples.utils.sensor;
-
-import java.util.Objects;
-
-import org.apache.edgent.analytics.sensors.Range;
-import org.apache.edgent.analytics.sensors.Ranges;
-import org.apache.edgent.function.Supplier;
-
-/**
- * A Simulated temperature sensor.
- * <p>
- * The sensor starts off with an initial value.
- * Each call to {@link #get()} changes the current value by
- * a random amount between plus/minus a {@code deltaFactor}.
- * The new current value is limited to a {@code tempRange}
- * and then rounded to 1 fractional digit.
- * </p><p>
- * No temperature scale is implied (e.g., Fahrenheit, Kelvin, ...).
- * The {@code double} temperature values are simply generated as described.
- * The user of the class decides how to interpret them.
- * </p><p>
- * Sample use:
- * <pre>{@code
- * Topology t = ...;
- * SimulatedTemperatureSensor tempSensor = new SimulatedTemperatureSensor();
- * TStream<Double> temp = t.poll(tempSensor, 1, TimeUnit.SECONDS);
- * }</pre>
- * @see SimpleSimulatedSensor
- */
-public class SimulatedTemperatureSensor implements Supplier<Double> {
-    private static final long serialVersionUID = 1L;
-    private final SimpleSimulatedSensor sensor;
-   
-    /**
-     * Create a temperature sensor.
-     * <p>
-     * Same as {@code SimulatedTemperatureSensor(80.0, 
-     *              Ranges.closed(28.0, 112.0), 1.0)}
-     * </p><p>
-     * These default values roughly correspond to normal air temperature
-     * in the Fahrenheit scale.
-     * </p>
-     */
-    public SimulatedTemperatureSensor() {
-        this(80.0, Ranges.closed(28.0, 112.0), 1.0);
-    }
-    
-    /**
-     * Create a temperature sensor.
-     * <p>
-     * No temperature scale is implied.
-     * </p> 
-     * @param initialTemp the initial temperature.  Must be within tempRange.
-     * @param tempRange maximum sensor value range
-     * @param deltaFactor maximum plus/minus change on each {@code get()}.
-     *              e.g., 1.0 to limit change to +/- 1.0.
-     *              Must be &gt; 0.0
-     */
-    public SimulatedTemperatureSensor(double initialTemp,
-            Range<Double> tempRange, double deltaFactor) {
-        Objects.requireNonNull(tempRange, "tempRange");
-        if (!tempRange.contains(initialTemp))
-            throw new IllegalArgumentException("initialTemp");
-        if (deltaFactor <= 0.0)
-            throw new IllegalArgumentException("deltaFactor");
-        sensor = new SimpleSimulatedSensor(initialTemp, deltaFactor, tempRange);
-    }
-    
-    /** Get the tempRange setting
-     * @return the value
-     */
-    public Range<Double> getTempRange() {
-        return sensor.getRange();
-    }
-    
-    /** Get the deltaFactor setting
-     * @return the value
-     */
-    public double getDeltaFactor() {
-        return sensor.getDeltaFactor();
-    }
-    
-    /** Get the next sensor value. */
-    @Override
-    public Double get() {
-        return sensor.get();
-    }
-}
diff --git a/scripts/.project b/scripts/.project
deleted file mode 100644
index 18d5249..0000000
--- a/scripts/.project
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>scripts</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-	</buildSpec>
-	<natures>
-	</natures>
-</projectDescription>
diff --git a/scripts/README b/scripts/README
deleted file mode 100644
index d725317..0000000
--- a/scripts/README
+++ /dev/null
@@ -1,14 +0,0 @@
-Scripts for running the samples.
-
-The source code for the samples is in the <edgent-release>/samples directory.
-
-The samples can be run via by their run*.sh
-shell scripts from this directory.  e.g.,
-
-$ ./runhelloedgent.sh
-
-Note: On Windows, use an environment like Cygwin 
-to run these linux shell scripts.
-
-See the README files in the connectors directory
-for information about running those samples.
diff --git a/scripts/apps/sensorAnalytics/README b/scripts/apps/sensorAnalytics/README
deleted file mode 100644
index 2e0b504..0000000
--- a/scripts/apps/sensorAnalytics/README
+++ /dev/null
@@ -1,27 +0,0 @@
-Sensor Analytics sample application.
-
-The application demonstrates a more complete sample that includes
-some common themes.
-
-The source code for the application can be found under the 
-<edgent-release>/<target>/samples/src directory.
-
-Use:
-
-See the SensorAnalytics sample link in <edgent-release>/docs/javadoc/overview-summary.html
-for full information on configuring and running the application
-and observing its behavior.  In particular, the default configuration
-connects to MQTT server url "tcp://localhost:1883".
-
-# run the application
-# the application runs forever printing out and publishing information
-$ ./runSensorAnalytics.sh
-
-# Watch and report the device's MQTT event topics
-$ ./runDeviceComms.sh watch
-
-# Publish a command to change a sensor1 threshold
-$ ./runDeviceComms.sh send sensor1.set1hzMeanRangeThreshold "[125..127]"
-
-# Publish a command telling the device to publish each outlier event as they occur
-$ ./runDeviceComms.sh send sensor1.setPublish1hzOutsideRange true
diff --git a/scripts/apps/sensorAnalytics/runDeviceComms.sh b/scripts/apps/sensorAnalytics/runDeviceComms.sh
deleted file mode 100755
index 61a0dd4..0000000
--- a/scripts/apps/sensorAnalytics/runDeviceComms.sh
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-edgent=../../..
-
-# Runs the DeviceComms client
-#
-# ./runDeviceComms.sh watch | send <commandLabel> <commandArg>
-#
-# no checking is done for the validity of commandLabel or commandArg
-
-export CLASSPATH=${edgent}/samples/lib/edgent.samples.apps.jar
-
-java org.apache.edgent.samples.apps.mqtt.DeviceCommsApp sensorAnalytics.properties $*
diff --git a/scripts/apps/sensorAnalytics/runSensorAnalytics.sh b/scripts/apps/sensorAnalytics/runSensorAnalytics.sh
deleted file mode 100755
index a411b7a..0000000
--- a/scripts/apps/sensorAnalytics/runSensorAnalytics.sh
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-edgent=../../..
-
-# Runs the SensorAnalytics sample application
-#
-# ./runSensorAnalytics.sh
-
-export CLASSPATH=${edgent}/samples/lib/edgent.samples.apps.jar
-
-java org.apache.edgent.samples.apps.sensorAnalytics.SensorAnalyticsApplication sensorAnalytics.properties
diff --git a/scripts/apps/sensorAnalytics/sensorAnalytics.properties b/scripts/apps/sensorAnalytics/sensorAnalytics.properties
deleted file mode 100644
index 9a1e812..0000000
--- a/scripts/apps/sensorAnalytics/sensorAnalytics.properties
+++ /dev/null
@@ -1,82 +0,0 @@
-# Application Configuration properties
-#
-# The default topology provider is DirectProvider.
-topology.provider=org.apache.edgent.providers.development.DevelopmentProvider
-#
-application.name=SensorAnalytics
-#
-
-# =========================================================================
-# Application stream logging configuration
-# Where the app puts its stream logs.  
-# The directory will be created when the topology
-# runs if it doesn't already exist.
-application.log.dir=/tmp/SensorAnalytics/logs
-
-# =========================================================================
-# Application "ranges" - e.g., for threshold detections
-# Specify values generated by Range.toString():
-#  <lowerBoundType><lowerBound>..<upperBound><upperBoundType>
-#  where
-#      lowerBoundType is "[" inclusive or "(" exclusive
-#      upperBoundType is "]" inclusive or ")" exclusive
-#      lowerBound or upperBound is "*" for open ranges,
-#         e.g., [*..50]  for "atMost" 50
-#
-sensor1.range.outside1hzMeanRange=[124..129]
-
-# =========================================================================
-# MQTT Device and Connector configuration info.
-#
-# MQTT Device -- See org.apache.edgent.connectors.mqtt.device.MqttDevice for all
-# of the properties.
-#
-# An optional topic prefix.  It can be used to isolate users or applications
-# in shared MQTT broker configurations.  By default it is incorporated
-# into device topics and the MQTT clientId.
-# If you use a public MQTT broker you may want to change the topic
-# prefix so it is still unique for you but doesn't include the
-# user name or application name.
-mqttDevice.topic.prefix=ibm.xyzzy-streams.samples/user/{user.name}/{application.name}/
-#
-# The device id used for identifying the device's events and commands
-# in the MQTT topic namespace.
-# By default it also gets incorporated into the MQTT clientId value.
-mqttDevice.id=012345
-#
-# The MQTT clientId.  Only one instance of a MqttDevice can connect
-# to the MQTT broker with a given clientId.
-#mqttDevice.mqtt.clientId={mqttDevice.topic.prefix}id/{mqttDevice.id}
-#
-# MQTT Connector  See org.apache.edgent.connectors.mqtt.MqttConfig.fromProperties()
-#
-# The default configuration is for a local MQTT broker.
-# See mosquitto.org for instructions on downloading a MQTT broker.
-# Or use some other MQTT broker available in your environment.
-mqtt.serverURLs=tcp://localhost:1883
-#
-# Alternatively, there are some public MQTT brokers available to experiment with.
-# Their availability status isn't guaranteed.  If you're unable to connect
-# to the broker, it's likely that it isn't up or your firewalls don't
-# allow you to connect.  DO NOT PUBLISH ANYTHING SENSITIVE - anyone
-# can be listing.
-#mqtt.serverURLs=tcp://iot.eclipse.org:1883
-#mqtt.serverURLs=tcp://test.mosquitto.org:1883
-#
-# default username is System.getProperty("user.name") value
-#mqtt.userName=xyzzy
-#mqtt.password=myMosquittoPw
-
-# =========================================================================
-# Patterns for identifying which streams to trace to System.out
-# To enable use include.csv and/or includes.regex.
-# To exclude an otherwise included file, use excludes.csv and/or excludes.regex
-#
-# Some tracing labels
-# sensor1.raw1khz,sensor1.j1khz,sensor1.j1hzStats,sensor1.outside1hzMeanRange*,
-# sensor1.periodicLastN*
-#
-#stream.tracing.includes.csv=sensor1.j1hzStats
-stream.tracing.includes.regex=sensor1.outside1hzMeanRange.*
-#stream.tracing.excludes.regex=.*
-#stream.tracing.excludes.csv=sensor1.raw1khz
diff --git a/scripts/connectors/file/README b/scripts/connectors/file/README
deleted file mode 100644
index 13629d0..0000000
--- a/scripts/connectors/file/README
+++ /dev/null
@@ -1,21 +0,0 @@
-Sample File Streams connector topology applications.
-
-The file writer application writes a stream's tuples to files.
-
-The file reader application watches a directory for files and reads their
-contents into a stream of tuples.
-
-The source code for the samples is in the <edgent-release>/samples directory.
-
-Use:
-
-# create a new directory for the sample to use
-$ mkdir /tmp/fileSample
-
-# run the sample file watcher / reader
-# the reader runs forever printing out content from files read
-$ ./runfilesample.sh reader /tmp/fileSample
-
-# run the sample file writer
-# the writer runs forever printing out each generated tuple
-$ ./runfilesample.sh writer /tmp/fileSample
diff --git a/scripts/connectors/file/runfilesample.sh b/scripts/connectors/file/runfilesample.sh
deleted file mode 100755
index e4b2dc1..0000000
--- a/scripts/connectors/file/runfilesample.sh
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-edgent=../../..
-
-# Runs the File connector sample
-#
-# ./runfilesample.sh writer
-# ./runfilesample.sh reader
-
-sampledir=/tmp/fileConnectorSample
-if [ ! -e $sampledir ]; then
-    mkdir $sampledir
-fi 
-
-export CLASSPATH=${edgent}/samples/lib/edgent.samples.connectors.jar
-
-app=$1; shift
-if [ "$app" == "writer" ]; then
-    java org.apache.edgent.samples.connectors.file.FileWriterApp $sampledir
-elif [ "$app" == "reader" ]; then
-    java org.apache.edgent.samples.connectors.file.FileReaderApp $sampledir
-else
-    echo "unrecognized mode '$app'"
-    echo "usage: $0 'writer|reader'"
-    exit 1
-fi
diff --git a/scripts/connectors/iotp/README b/scripts/connectors/iotp/README
deleted file mode 100644
index eccb2f8..0000000
--- a/scripts/connectors/iotp/README
+++ /dev/null
@@ -1,36 +0,0 @@
-
-# ##########
-# The "Quickstart" samples connect to the IBM Watson IoT Platform
-# using the Quickstart feature that does not require device registration.
-# When the samples are run they print out a URL which allows a browser
-# to see the data being sent from this sample.
-#
-# IotpQuickstart2 demonstrates using the WIoTP API to initialize the IotpDevice
-# connector as well as the ability to publish events using the WIoTP HTTP protocol.
-
-IotpQuickstart  - ./runquickstart.sh
-IotpQuickstart2 - ./runquickstart2.sh [useHttp]
-
-# ##########
-# IotpSensors connects to your IBM Watson IoT Platform service
-# as the device defined in your device config file.
-#
-# A prototype config file for your WIoTP registered device information 
-# is provided in device.cfg.
-
-IotpSensors     - ./runiotsensors.sh device-cfg-path
-
-# ##########
-# IotpDeviceSample and IotpGatewaySample
-# connect to your IBM Watson IoT Platform service.
-# They publish device events and print out received device commands.
-# Use IotpAppClient to print out the generated device events and
-# to generate the device commands.
-#
-# Prototype config files for your WIoTP registered device, gateway,
-# and application client information are provided in
-# iotp-device-sample.cfg, iotp-gwdevice-sample.cfg and iotp-app-client.cfg
-
-IotpDeviceSample  - ./run-iotp-device-sample.sh [useDeviceClient|useManagedDevice] [useHttp] <device-cfg-path>
-IotpGatewaySample - ./run-iotp-gwdevice-sample.sh [useGatewayClient|useManagedGateway] [useHttp] <device-cfg-path>
-IotpAppClient     - ./run-iotp-client-app.sh [useGW] <app-cfg-path>
\ No newline at end of file
diff --git a/scripts/connectors/iotp/device.cfg b/scripts/connectors/iotp/device.cfg
deleted file mode 100644
index 9c67292..0000000
--- a/scripts/connectors/iotp/device.cfg
+++ /dev/null
@@ -1,7 +0,0 @@
-[device]
-org =
-type = 
-id = 
-auth-method = token
-auth-token = 
-
diff --git a/scripts/connectors/iotp/iotp-app-client.cfg b/scripts/connectors/iotp/iotp-app-client.cfg
deleted file mode 100644
index 177e6b5..0000000
--- a/scripts/connectors/iotp/iotp-app-client.cfg
+++ /dev/null
@@ -1,25 +0,0 @@
-# configuration properties for the IotpAppSample app
-
-[application]
-# WIoTP defined application configuration properties
-
-Organization-ID = 
-id = 
-Authentication-Method = apikey
-API-Key = 
-Authentication-Token = 
-
-# --------------------------------------------------------
-# Input for the sample app, not WIoTP App props
-
-# Non-gateway mode target registered device
-# Corresponding values from the iotp-device-sample.cfg file
-deviceType = 
-deviceId = 
-
-# Gateway mode target registered gateway device and the connected device
-# Corresponding values from the iotp-gwdevice-sample.cfg file 
-gwDeviceType = 
-gwDeviceId = 
-cn-dev1-type = myCnDev1Type
-cn-dev1-id = myCnDev1Id
diff --git a/scripts/connectors/iotp/iotp-device-sample.cfg b/scripts/connectors/iotp/iotp-device-sample.cfg
deleted file mode 100644
index 3a2aefb..0000000
--- a/scripts/connectors/iotp/iotp-device-sample.cfg
+++ /dev/null
@@ -1,10 +0,0 @@
-# configuration properties for IotpDeviceSample
-
-[device]
-# WIoTP defined IoT device configuration properties
-
-Organization-ID = 
-Device-Type = 
-Device-ID = 
-Authentication-Method = token
-Authentication-Token = 
diff --git a/scripts/connectors/iotp/iotp-gwdevice-sample.cfg b/scripts/connectors/iotp/iotp-gwdevice-sample.cfg
deleted file mode 100644
index 1845fcc..0000000
--- a/scripts/connectors/iotp/iotp-gwdevice-sample.cfg
+++ /dev/null
@@ -1,17 +0,0 @@
-# configuration properties for IotpGWDeviceSample
-
-[device]
-# WIoTP defined IoT Gateway device configuration properties
-
-Organization-ID = 
-Gateway-Type = 
-Gateway-ID = 
-Authentication-Method = token
-Authentication-Token = 
-
-# --------------------------------------------------------
-# Input for the sample app, not WIoTP device props
-
-# a type and id for a device connected to the gateway - pick anything
-cn-dev1-type = myCnDev1Type
-cn-dev1-id = myCnDev1Id
diff --git a/scripts/connectors/iotp/run-iotp-app-client.sh b/scripts/connectors/iotp/run-iotp-app-client.sh
deleted file mode 100755
index 21502e5..0000000
--- a/scripts/connectors/iotp/run-iotp-app-client.sh
+++ /dev/null
@@ -1,45 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-edgent=../../..
-
-# Runs IBM Watson IoT Platform IotpAppClient sample.
-#
-# run-iotp-app-client.sh [useGW] <app-cfg-path>  # see iotp-app-client.cfg
-#
-# Connects to WIoTP and sends device commands to the 
-# IotpDeviceSample or IotpGWDeviceSample device samples.
-#
-# This connects to your IBM Watson IoT Platform service
-# as the Application defined in a application config file.
-# The file format is the standard one for IBM Watson IoT Platform.
-#
-# Note, the config file also contains some additional information for this application.
-# A sample iot-app-client.cfg is in the scripts/connectors/iotp directory.
-
-
-export CLASSPATH=${edgent}/samples/lib/edgent.samples.connectors.jar
-
-# https://github.com/ibm-watson-iot/iot-java/tree/master#migration-from-release-015-to-021
-# Uncomment the following to use the pre-0.2.1 WIoTP client behavior.
-#
-#USE_OLD_EVENT_FORMAT=-Dcom.ibm.iotf.enableCustomFormat=false
-
-VM_OPTS=${USE_OLD_EVENT_FORMAT}
-
-java ${VM_OPTS} org.apache.edgent.samples.connectors.iotp.IotpAppClient $* 
diff --git a/scripts/connectors/iotp/run-iotp-device-sample.sh b/scripts/connectors/iotp/run-iotp-device-sample.sh
deleted file mode 100755
index 35eb6fc..0000000
--- a/scripts/connectors/iotp/run-iotp-device-sample.sh
+++ /dev/null
@@ -1,43 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-edgent=../../..
-
-# Runs IBM Watson IoT Platform IotpDeviceSample sample.
-#
-# run-iotp-device-sample.sh [useDeviceClient|useManagedDevice] [useHttp] <device-cfg-path>  # see iotp-device-sample.cfg
-#
-# Connects to WIoTP and sends device events and receives device commands.
-#
-# This connects to your IBM Watson IoT Platform service
-# as the Device defined in a device config file.
-# The file format is the standard one for IBM Watson IoT Platform.
-#
-# Note, the config file also contains some additional information for this application.
-# A sample iot-device-sample.cfg is in the scripts/connectors/iotp directory.
-
-export CLASSPATH=${edgent}/samples/lib/edgent.samples.connectors.jar
-
-# https://github.com/ibm-watson-iot/iot-java/tree/master#migration-from-release-015-to-021
-# Uncomment the following to use the pre-0.2.1 WIoTP client behavior.
-#
-#USE_OLD_EVENT_FORMAT=-Dcom.ibm.iotf.enableCustomFormat=false
-
-VM_OPTS=${USE_OLD_EVENT_FORMAT}
-
-java ${VM_OPTS} org.apache.edgent.samples.connectors.iotp.IotpDeviceSample $* 
diff --git a/scripts/connectors/iotp/run-iotp-gwdevice-sample.sh b/scripts/connectors/iotp/run-iotp-gwdevice-sample.sh
deleted file mode 100755
index aeba5dc..0000000
--- a/scripts/connectors/iotp/run-iotp-gwdevice-sample.sh
+++ /dev/null
@@ -1,44 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-edgent=../../..
-
-# Runs IBM Watson IoT Platform IotpGWDeviceSample sample.
-#
-# run-iotp-gwdevice-sample.sh [useGatewayClient|useManagedGateway] [useHttp] <device-cfg-path>  # see iotp-gwdevice-sample.cfg
-#
-# Connects to WIoTP and sends Gateway and connected device events and receives device commands.
-#
-# This connects to your IBM Watson IoT Platform service
-# as the Gateway defined in a gateway config file.
-# The file format is the standard one for IBM Watson IoT Platform.
-# 
-# Note, the config file also contains some additional information for this application.
-# A sample iot-gwdevice-sample.cfg is in the scripts/connectors/iotp directory.
-
-
-export CLASSPATH=${edgent}/samples/lib/edgent.samples.connectors.jar
-
-# https://github.com/ibm-watson-iot/iot-java/tree/master#migration-from-release-015-to-021
-# Uncomment the following to use the pre-0.2.1 WIoTP client behavior.
-#
-#USE_OLD_EVENT_FORMAT=-Dcom.ibm.iotf.enableCustomFormat=false
-
-VM_OPTS=${USE_OLD_EVENT_FORMAT}
-
-java ${VM_OPTS} org.apache.edgent.samples.connectors.iotp.IotpGWDeviceSample $* 
diff --git a/scripts/connectors/iotp/runiotpquickstart.sh b/scripts/connectors/iotp/runiotpquickstart.sh
deleted file mode 100755
index c2c9ebb..0000000
--- a/scripts/connectors/iotp/runiotpquickstart.sh
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-edgent=../../..
-
-# Runs IBM Watson IoT Plaform Quickstart sample.
-#
-# runiotpquickstart.sh
-#
-# This connectors to the Qucikstart IBM Watson IoT Platform service
-# which requires no registration at all.
-#
-# The application prints out a URL which allows a browser
-# to see the data being sent from this sample to
-# IBM Watson IoT Plaform Quickstart sample.
-
-export CLASSPATH=${edgent}/samples/lib/edgent.samples.connectors.jar
-
-# https://github.com/ibm-watson-iot/iot-java/tree/master#migration-from-release-015-to-021
-# Uncomment the following to use the pre-0.2.1 WIoTP client behavior.
-#
-#USE_OLD_EVENT_FORMAT=-Dcom.ibm.iotf.enableCustomFormat=false
-
-VM_OPTS=${USE_OLD_EVENT_FORMAT}
-
-java ${VM_OPTS} org.apache.edgent.samples.connectors.iotp.IotpQuickstart
diff --git a/scripts/connectors/iotp/runiotpquickstart2.sh b/scripts/connectors/iotp/runiotpquickstart2.sh
deleted file mode 100755
index 4a1ff9f..0000000
--- a/scripts/connectors/iotp/runiotpquickstart2.sh
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-edgent=../../..
-
-# Runs IBM Watson IoT Plaform Quickstart sample.
-#
-# runiotpquickstart2.sh
-#
-# This connects to the Quickstart IBM Watson IoT Platform service
-# which requires no registration at all.
-#
-# The application prints out a URL which allows a browser
-# to see the data being sent from this sample to
-# IBM Watson IoT Platform Quickstart sample.
-
-export CLASSPATH=${edgent}/samples/lib/edgent.samples.connectors.jar
-
-# https://github.com/ibm-watson-iot/iot-java/tree/master#migration-from-release-015-to-021
-# Uncomment the following to use the pre-0.2.1 WIoTP client behavior.
-#
-#USE_OLD_EVENT_FORMAT=-Dcom.ibm.iotf.enableCustomFormat=false
-
-VM_OPTS=${USE_OLD_EVENT_FORMAT}
-
-java ${VM_OPTS} org.apache.edgent.samples.connectors.iotp.IotpQuickstart2 $*
diff --git a/scripts/connectors/iotp/runiotpsensors.sh b/scripts/connectors/iotp/runiotpsensors.sh
deleted file mode 100755
index d712495..0000000
--- a/scripts/connectors/iotp/runiotpsensors.sh
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-edgent=../../..
-
-# Runs IBM Watson IoT Plaform sample.
-#
-# runiotpsensors.sh path/device.cfg
-#
-# e.g. runiotpsensors.sh $HOME/device.cfg
-#
-# This connectors to your IBM Watson IoT Platform service
-# as the device defined in the device.cfg.
-# The format of device.cfg is the standard one for
-# IBM Watson IoT Platform and a sample is in this directory
-# (omitting values for the authorization tokens).
-
-export CLASSPATH=${edgent}/samples/lib/edgent.samples.connectors.jar
-
-# https://github.com/ibm-watson-iot/iot-java/tree/master#migration-from-release-015-to-021
-# Uncomment the following to use the pre-0.2.1 WIoTP client behavior.
-#
-#USE_OLD_EVENT_FORMAT=-Dcom.ibm.iotf.enableCustomFormat=false
-
-VM_OPTS=${USE_OLD_EVENT_FORMAT}
-
-java ${VM_OPTS} org.apache.edgent.samples.connectors.iotp.IotpSensors $1
diff --git a/scripts/connectors/jdbc/README b/scripts/connectors/jdbc/README
deleted file mode 100644
index 112e02e..0000000
--- a/scripts/connectors/jdbc/README
+++ /dev/null
@@ -1,35 +0,0 @@
-Sample JDBC connector dbms writer and reader topology applications.
-
-The following configuration is assumed:
-- Apache Derby is installed and the environment variable DERBY_HOME is set
-
-The writer is a simple JDBC connector sample demonstrating
-streaming write access of a dbms to add stream tuples to a table.
-
-The reader is a simple JDBC connector sample demonstrating
-streaming read access of a dbms table and creating stream
-tuples from the results.
-
-The source code for the samples is in the <edgent-release>/samples directory.
-
-Running the simple sample
--------------------------
-
-Modify the jdbc.properties file if required.
-
-# run the simple sample writer
-# the writer runs briefly and prints out additions to the table
-$ ./runjdbcsample.sh writer
-Inserting into persons table: person id=1 first=John last=Doe
-Inserting into persons table: person id=2 first=Jane last=Doe
-Inserting into persons table: person id=3 first=Billy last=McDoe
-$
-
-# run the simple sample reader
-# the reader runs briefly and prints out retrieved info
-$ ./runjdbcsample.sh reader
-retrieved person: id=1 first=John last=Doe
-retrieved person: id=2 first=Jane last=Doe
-retrieved person: id=3 first=Billy last=McDoe
-Unknown person id=99999
-$
diff --git a/scripts/connectors/jdbc/jdbc.properties b/scripts/connectors/jdbc/jdbc.properties
deleted file mode 100644
index 96a196a..0000000
--- a/scripts/connectors/jdbc/jdbc.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-#db.name=      # defaults to "JdbcConnectorSampleDb"
-#db.user=      # defaults to System.getProperties("user.name")
-#db.password=  # defaults to no password
-persondata.path=persondata.txt
diff --git a/scripts/connectors/jdbc/persondata.txt b/scripts/connectors/jdbc/persondata.txt
deleted file mode 100644
index 9037c44..0000000
--- a/scripts/connectors/jdbc/persondata.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-# id,firstName,lastName
-1,John,Doe
-2,Jane,Doe
-3,Billy,McDoe
diff --git a/scripts/connectors/jdbc/runjdbcsample.sh b/scripts/connectors/jdbc/runjdbcsample.sh
deleted file mode 100755
index 46d8f04..0000000
--- a/scripts/connectors/jdbc/runjdbcsample.sh
+++ /dev/null
@@ -1,46 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-edgent=../../..
-
-# Runs the Sample JDBC Writer or Reader
-#
-# ./runjdbcsample.sh writer
-# ./runjdbcsample.sh reader
-
-if [ -z "$DERBY_HOME" ]; then
-    echo "\$DERBY_HOME not defined."
-    exit 1;
-fi
-if [ ! -f $DERBY_HOME/lib/derby.jar ]; then
-    echo "\$DERBY_HOME/lib/derby.jar: file not found"
-    exit 1;
-fi
-
-export CLASSPATH=${edgent}/samples/lib/edgent.samples.connectors.jar:$DERBY_HOME/lib/derby.jar
-
-app=$1; shift
-if [ "$app" == "writer" ]; then
-    java org.apache.edgent.samples.connectors.jdbc.SimpleWriterApp jdbc.properties
-elif [ "$app" == "reader" ]; then
-    java org.apache.edgent.samples.connectors.jdbc.SimpleReaderApp jdbc.properties
-else
-    echo "unrecognized mode '$app'"
-    echo "usage: $0 writer|reader"
-    exit 1
-fi
diff --git a/scripts/connectors/kafka/README b/scripts/connectors/kafka/README
deleted file mode 100644
index b1c6bec..0000000
--- a/scripts/connectors/kafka/README
+++ /dev/null
@@ -1,39 +0,0 @@
-Sample Kafka Publisher and Subscriber topology applications.
-
-By default the samples require the following kafka broker configuration:
-- bootstrap.servers="localhost:9092"
-- zookeeper.connect="localhost:2181"
-- kafka topic "kafkaSampleTopic" exists
-- no authentication
-
-See README-kafka for information about setting up a kafka server
-and creating the topic.
-
-The source code for the samples is in the <edgent-release>/samples directory.
-
-Running the simple sample
--------------------------
-
-Modify the kafka.properties file if required.
-
-# run the simple sample subscriber
-# the subscriber runs forever printing out each received message
-$ ./runkafkasample.sh sub
-
-# run the simple sample publisher
-# the publisher runs forever printing out each published message
-$ ./runkafkasample.sh pub
-
-Running the fully configurable clients
---------------------------------------
-
-# To see how to specify different values:
-$ ./runkafkaclient.sh -h
-
-# run the sample subscriber
-# the subscriber runs forever printing out each received message
-$ ./runkafkaclient.sh sub
-
-# run the sample producer
-# the producer runs forever printing out each published message
-$ ./runkafkaclient.sh pub
diff --git a/scripts/connectors/kafka/README-kafka b/scripts/connectors/kafka/README-kafka
deleted file mode 100644
index e253963..0000000
--- a/scripts/connectors/kafka/README-kafka
+++ /dev/null
@@ -1,25 +0,0 @@
-Setting up a Kafka/Zookeeper config on the default localhost ports is simple
-and well documented at https://kafka.apache.org/quickstart.  This should do it:
-
-After downloading kafka:
-
-tar zxf ~/Downloads/kafka_2.11-0.10.1.0.tgz
-cd kafka_2.11-0.10.1.0/
-
-# start the servers (best in separate windows)
-bin/zookeeper-server-start.sh config/zookeeper.properties
-bin/kafka-server-start.sh config/server.properties
-
-The sample requires a topic.  Create it:
-
-# create our kafka sample topic
-bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic kafkaSampleTopic
-bin/kafka-topics.sh --list --zookeeper localhost:2181
-
-# quick verify
-bin/kafka-console-producer.sh --broker-list localhost:9092 --topic kafkaSampleTopic
-hi
-there
-^D
-bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic kafkaSampleTopic --from-beginning
-... you should see the "hi" and "there" messages.
diff --git a/scripts/connectors/kafka/kafka.properties b/scripts/connectors/kafka/kafka.properties
deleted file mode 100644
index 2470078..0000000
--- a/scripts/connectors/kafka/kafka.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-# bootstrap.servers is for a kafka consumer
-bootstrap.servers=localhost:9092
-# zookeeper.connect is for a kafka producer
-zookeeper.connect=localhost:2181
-#group.id=
-topic=kafkaSampleTopic
diff --git a/scripts/connectors/kafka/runkafkaclient.sh b/scripts/connectors/kafka/runkafkaclient.sh
deleted file mode 100755
index edf3828..0000000
--- a/scripts/connectors/kafka/runkafkaclient.sh
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-edgent=../../..
-
-# Runs the Kafka Publisher or Subscriber Client
-#
-# ./runkafkaclient.sh pub
-# ./runkafkaclient.sh sub
-# ./runkafkaclient.sh -h
-
-export CLASSPATH=${edgent}/lib/edgent.samples.connectors.jar
-
-java org.apache.edgent.samples.connectors.kafka.KafkaClient $@
diff --git a/scripts/connectors/kafka/runkafkasample.sh b/scripts/connectors/kafka/runkafkasample.sh
deleted file mode 100755
index 89fe871..0000000
--- a/scripts/connectors/kafka/runkafkasample.sh
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-edgent=../../..
-
-# Runs the Sample Kafka Publisher or Subscriber
-#
-# ./runkafkasample.sh pub
-# ./runkafkasample.sh sub
-
-export CLASSPATH=${edgent}/samples/lib/edgent.samples.connectors.jar
-
-app=$1; shift
-if [ "$app" == "pub" ]; then
-    java org.apache.edgent.samples.connectors.kafka.SimplePublisherApp kafka.properties
-elif [ "$app" == "sub" ]; then
-    java org.apache.edgent.samples.connectors.kafka.SimpleSubscriberApp kafka.properties
-else
-    echo "unrecognized mode '$app'"
-    echo "usage: $0 pub|sub"
-    exit 1
-fi
diff --git a/scripts/connectors/mqtt/README b/scripts/connectors/mqtt/README
deleted file mode 100644
index 922807c..0000000
--- a/scripts/connectors/mqtt/README
+++ /dev/null
@@ -1,37 +0,0 @@
-Sample MQTT Publisher and Subscriber topology applications.
-
-By default, the following MQTT broker configuration is assumed:
-- the broker's connection URL is tcp://localhost:1883
-- the broker is configured for no authentication
-
-See http://mqtt.org for the code and setup information for
-a mqtt broker.
-
-The source code for the samples is in the <edgent-release>/samples directory.
-
-Running the simple sample
--------------------------
-
-Modify the mqtt.properties file if required.
-
-# run the simple sample subscriber
-# the subscriber runs forever printing out each received message
-$ ./runmqttsample.sh sub
-
-# run the simple sample publisher
-# the publisher runs forever printing out each published message
-$ ./runmqttsample.sh pub
-
-Running the fully configurable clients
---------------------------------------
-
-# To see how to specify different values:
-$ ./runmqttclient.sh -h
-
-# run the subscriber client
-# the subscriber runs forever printing out each received message
-$ ./runmqttclient.sh sub
-
-# run the publisher client
-# the publisher runs forever printing out each published message
-$ ./runmqttclient.sh pub
diff --git a/scripts/connectors/mqtt/mqtt.properties b/scripts/connectors/mqtt/mqtt.properties
deleted file mode 100644
index 9f28c7c..0000000
--- a/scripts/connectors/mqtt/mqtt.properties
+++ /dev/null
@@ -1,10 +0,0 @@
-mqtt.serverURLs=tcp://localhost:1883
-#mqtt.serverURLs=tcp://test.mosquitto.org:1883
-#mqtt.serverURLs=tcp://iot.eclipse.org:1883
-mqtt.topic=mqttSampleTopic
-#mqtt.userName=
-#mqtt.password=
-#mqtt.trustStore=
-#mqtt.trustStorePassword=
-#mqtt.keyStore=
-#mqtt.keyStorePassword=
diff --git a/scripts/connectors/mqtt/runmqttclient.sh b/scripts/connectors/mqtt/runmqttclient.sh
deleted file mode 100755
index 0904d34..0000000
--- a/scripts/connectors/mqtt/runmqttclient.sh
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-edgent=../../..
-
-# Runs the MQTT Publisher or Subscriber client
-#
-# ./runmqttclient.sh pub
-# ./runmqttclient.sh sub
-# ./runmqttclient.sh -h
-
-export CLASSPATH=${edgent}/samples/lib/edgent.samples.connectors.jar
-
-java org.apache.edgent.samples.connectors.mqtt.MqttClient $@
diff --git a/scripts/connectors/mqtt/runmqttsample.sh b/scripts/connectors/mqtt/runmqttsample.sh
deleted file mode 100755
index ddb22c0..0000000
--- a/scripts/connectors/mqtt/runmqttsample.sh
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-edgent=../../..
-
-# Runs the Sample MQTT Publisher or Subscriber
-#
-# ./runmqttsample.sh pub
-# ./runmqttsample.sh sub
-
-export CLASSPATH=${edgent}/samples/lib/edgent.samples.connectors.jar
-
-app=$1; shift
-if [ "$app" == "pub" ]; then
-    java org.apache.edgent.samples.connectors.mqtt.SimplePublisherApp mqtt.properties
-elif [ "$app" == "sub" ]; then
-    java org.apache.edgent.samples.connectors.mqtt.SimpleSubscriberApp mqtt.properties
-else
-    echo "unrecognized mode '$app'"
-    echo "usage: $0 pub|sub"
-    exit 1
-fi
diff --git a/scripts/cron/README b/scripts/cron/README
deleted file mode 100644
index d6cf0b2..0000000
--- a/scripts/cron/README
+++ /dev/null
@@ -1,30 +0,0 @@
-Restarting Edgent if the JVM crashes
-
-The startapp.sh script can be setup to run as a cron job every minute in order
-to monitor a JVM running an Edgent application and restart Edgent if the 
-JVM crashes. The script checks whether the pid of the JVM indicates
-a process which is still running.  If the pid is not there, it executes the 
-command to start the application in the first place.
-
-A crontab entry file contains information which cron uses to schedule the job.
-The sample startapp.cron file is configured to execute the 
-org.apache.edgent.samples.topology.TerminateAfterNTuples sample application,
-which terminates the JVM after processing a preset number of tuples.
-
-To setup cron to restart the sample application every minute:
-
-1. Edit the startapp.cron file:
-   - Set the EDGENT environment variable to point to your edgent installation,
-     for example: EDGENT=/home/your_userid/edgent-release/edgent/java8
-   - Set JAVA_HOME to point to your Java install directory. 
-
-2. Install startapp.cron:
-
-   $ crontab ./startapp.cron
-
-   Note: if you wish to have your ~/.profile executed you must explicitly
-   do so in the crontab entry or in a script called by the entry.
-
-3. To remove the current crontab entries:
-
-   $ crontab -r
diff --git a/scripts/cron/startapp.cron b/scripts/cron/startapp.cron
deleted file mode 100644
index 2b2f807..0000000
--- a/scripts/cron/startapp.cron
+++ /dev/null
@@ -1,27 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-# Crontab file which contains settings for scheduling the execution of a 
-# monitoring script every minute using cron.
-#
-# You must set the EDGENT environment variable to point to your Edgent 
-# installation:
-# EDGENT=/home/your_userid/edgent/java8
-#
-# Make sure that JAVA_HOME is set in the environment used by cron:
-# JAVA_HOME=/usr/lib/jvm/jre
-
-* * * * * $EDGENT/scripts/cron/startapp.sh $EDGENT/samples/lib/edgent.samples.topology.jar org.apache.edgent.samples.topology.TerminateAfterNTuples /tmp >> /tmp/edgent-cron.log
diff --git a/scripts/cron/startapp.sh b/scripts/cron/startapp.sh
deleted file mode 100755
index 1ec57dd..0000000
--- a/scripts/cron/startapp.sh
+++ /dev/null
@@ -1,117 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-_usage() {
-  echo -e "Usage: ${0} {classpath} {mainclass} [dir]\n\n\
-Runs a Java application while saving its stdout to dir/mainclass.out, its stderr to dir/mainclass.err, and its process id to dir/mainclass.pid.\n\
-\n\
-This script starts a Java application only if it cannot find its pid. If the process id specified by dir/mainclass.pid exists, then the script will not start the application.\n\
-\n\
-    classpath The application's class path.\n\
-    classname The name of the class to be launched.\n\
-    dir       The directory where the process stdout, stderr and pid files are\n\
-              written. If dir is not specified, then the files are saved into\n\
-              the current directory.\n\
-"
-}
-
-# _get_pid program [pidfile]
-# Set $pid to pids from /tmp* for {program}.
-# $pid should be declared local in the caller.
-_get_pid() {
-  local base=${1##*/}
-  local pid_file=${2:-/tmp/$base.pid}
-
-  pid=
-  if [ -f "$pid_file" ] ; then
-    local p
-
-    [ ! -r "$pid_file" ] && return 1 # "Cannot access pid file"
-
-    p=$(cat "$pid_file")
-    [ -z "${p//[0-9]/}" ] && [ -d "/proc/$p" ] && pid="$p"
-    if [ -n "$pid" ]; then
-        return 0
-    fi
-    return 2 # "Program is not running but pid file exists"
-  fi
-  return 3 # "Program pid file does not exist"
-}
-
-# _readlink path
-# Output the full path, replacement for readlink -f
-_readlink() {
-  (
-  pushd ${1%/*} > /dev/null 2>&1
-  echo $PWD/${1##*/}
-  popd > /dev/null 2>&1
-  )
-}
-
-# _dirname path
-# Get the directory name, replacement for dirname.
-_dirname() {
-  echo ${1%/*}
-}
-
-_error() {
-  echo $1; exit 1
-}
-
-
-## Main script
-[ ! -n "${EDGENT:-}" ] && EDGENT=../..
-[ ! -n "${JAVA_HOME:-}" ] && _error "JAVA_HOME must be set"
-
-if [ $# -lt 2 ]; then
-  _usage
-  exit 1
-fi
-
-classpath=${1}
-main_class=${2}
-out_dir=${3:-.}
-
-# Command to start the application.
-command="${JAVA_HOME}/bin/java -cp ${classpath} ${main_class}"
-
-if [[ ! -d ${out_dir} || ${out_dir:0:1} != '/' ]]; then
-  ## out_dir as absolute path
-  out_dir=$(_readlink ${out_dir})
-  out_dir=$(_dirname ${out_dir})
-fi
-
-pid_file=${out_dir}/${main_class}.pid
-out_file=${out_dir}/${main_class}.out
-err_file=${out_dir}/${main_class}.err
-pid=
-
-_get_pid $main_class $pid_file
-RC="$?"
-[ $RC == "1" ] && _error "Cannot access pid file $pid_file"
-
-if [ -z "$pid" ]; then
-  $command >> $out_file 2>> $err_file &
-  pid="$!"
-  echo $pid >| $pid_file
-  echo -e "The program was restarted with command:\n\
-${command}\n\
-Process id: $pid"
-else
-  echo "The program's process id is $pid"
-fi
diff --git a/scripts/runhelloedgent.cmd b/scripts/runhelloedgent.cmd
deleted file mode 100644
index 7cf2241..0000000
--- a/scripts/runhelloedgent.cmd
+++ /dev/null
@@ -1,20 +0,0 @@
-@echo OFF
-
-REM Licensed to the Apache Software Foundation (ASF) under one or more
-REM contributor license agreements.  See the NOTICE file distributed with
-REM this work for additional information regarding copyright ownership.
-REM The ASF licenses this file to You under the Apache License, Version 2.0
-REM (the "License"); you may not use this file except in compliance with
-REM the License.  You may obtain a copy of the License at
-REM
-REM    http://www.apache.org/licenses/LICENSE-2.0
-REM
-REM Unless required by applicable law or agreed to in writing, software
-REM distributed under the License is distributed on an "AS IS" BASIS,
-REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-REM See the License for the specific language governing permissions and
-REM limitations under the License.
-
-REM Runs HelloEdgent
-set CLASSPATH=..\samples\lib\edgent.samples.topology.jar
-java org.apache.edgent.samples.topology.HelloEdgent
diff --git a/scripts/runperiodicsource.cmd b/scripts/runperiodicsource.cmd
deleted file mode 100644
index 46c00a8..0000000
--- a/scripts/runperiodicsource.cmd
+++ /dev/null
@@ -1,20 +0,0 @@
-@echo OFF
-
-REM Licensed to the Apache Software Foundation (ASF) under one or more
-REM contributor license agreements.  See the NOTICE file distributed with
-REM this work for additional information regarding copyright ownership.
-REM The ASF licenses this file to You under the Apache License, Version 2.0
-REM (the "License"); you may not use this file except in compliance with
-REM the License.  You may obtain a copy of the License at
-REM
-REM    http://www.apache.org/licenses/LICENSE-2.0
-REM
-REM Unless required by applicable law or agreed to in writing, software
-REM distributed under the License is distributed on an "AS IS" BASIS,
-REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-REM See the License for the specific language governing permissions and
-REM limitations under the License.
-
-REM Runs PeriodSource
-set CLASSPATH=..\samples\lib\edgent.samples.topology.jar
-java org.apache.edgent.samples.topology.PeriodicSource
diff --git a/scripts/runperiodicsource.sh b/scripts/runperiodicsource.sh
deleted file mode 100755
index 567247d..0000000
--- a/scripts/runperiodicsource.sh
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-edgent=..
-
-# Runs PeriodSource
-#
-export CLASSPATH="${edgent}/samples/lib/edgent.samples.topology.jar"
-java org.apache.edgent.samples.topology.PeriodicSource
diff --git a/scripts/runsensoraggregates.cmd b/scripts/runsensoraggregates.cmd
deleted file mode 100644
index 2b94539..0000000
--- a/scripts/runsensoraggregates.cmd
+++ /dev/null
@@ -1,20 +0,0 @@
-@echo OFF
-
-REM Licensed to the Apache Software Foundation (ASF) under one or more
-REM contributor license agreements.  See the NOTICE file distributed with
-REM this work for additional information regarding copyright ownership.
-REM The ASF licenses this file to You under the Apache License, Version 2.0
-REM (the "License"); you may not use this file except in compliance with
-REM the License.  You may obtain a copy of the License at
-REM
-REM    http://www.apache.org/licenses/LICENSE-2.0
-REM
-REM Unless required by applicable law or agreed to in writing, software
-REM distributed under the License is distributed on an "AS IS" BASIS,
-REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-REM See the License for the specific language governing permissions and
-REM limitations under the License.
-
-REM Runs SensorsReadingAggregates
-set CLASSPATH=..\samples\lib\edgent.samples.topology.jar
-java org.apache.edgent.samples.topology.SensorsAggregates
diff --git a/scripts/runsensoraggregates.sh b/scripts/runsensoraggregates.sh
deleted file mode 100755
index c6e4e51..0000000
--- a/scripts/runsensoraggregates.sh
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-edgent=..
-
-# Runs SensorsReadingAggregates
-#
-export CLASSPATH="${edgent}/samples/lib/edgent.samples.topology.jar"
-java org.apache.edgent.samples.topology.SensorsAggregates
diff --git a/scripts/runsimplefiltertransform.cmd b/scripts/runsimplefiltertransform.cmd
deleted file mode 100644
index 9ab9db9..0000000
--- a/scripts/runsimplefiltertransform.cmd
+++ /dev/null
@@ -1,20 +0,0 @@
-@echo OFF
-
-REM Licensed to the Apache Software Foundation (ASF) under one or more
-REM contributor license agreements.  See the NOTICE file distributed with
-REM this work for additional information regarding copyright ownership.
-REM The ASF licenses this file to You under the Apache License, Version 2.0
-REM (the "License"); you may not use this file except in compliance with
-REM the License.  You may obtain a copy of the License at
-REM
-REM    http://www.apache.org/licenses/LICENSE-2.0
-REM
-REM Unless required by applicable law or agreed to in writing, software
-REM distributed under the License is distributed on an "AS IS" BASIS,
-REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-REM See the License for the specific language governing permissions and
-REM limitations under the License.
-
-REM Runs SimpleFilterTransform
-set CLASSPATH=..\samples\lib\edgent.samples.topology.jar
-java org.apache.edgent.samples.topology.SimpleFilterTransform
diff --git a/scripts/runsimplefiltertransform.sh b/scripts/runsimplefiltertransform.sh
deleted file mode 100755
index f92d040..0000000
--- a/scripts/runsimplefiltertransform.sh
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-edgent=..
-
-# Runs SimpleFilterTransform
-#
-export CLASSPATH="${edgent}/samples/lib/edgent.samples.topology.jar"
-java org.apache.edgent.samples.topology.SimpleFilterTransform
diff --git a/settings.gradle b/settings.gradle
deleted file mode 100644
index 8a0a385..0000000
--- a/settings.gradle
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
- 
-// N.B. if you add a subproject to a new 'aggregator only' project
-// adjust the 'aggregatorOnlyProjects' list in build.gradle
-
-include 'api:function'
-include 'api:execution'
-include 'api:window'
-include 'api:oplet'
-include 'api:graph'
-include 'api:topology'
-include 'spi:graph'
-include 'spi:topology'
-include 'runtime:appservice'
-include 'runtime:etiao'
-include 'runtime:jmxcontrol'
-include 'runtime:jsoncontrol'
-include 'runtime:jobregistry'
-include 'utils:metrics'
-include 'utils:streamscope'
-include 'providers:direct'
-include 'connectors:command'
-include 'connectors:common'
-include 'connectors:csv'
-include 'connectors:iot'
-include 'connectors:serial'
-include 'connectors:file'
-include 'connectors:http'
-include 'connectors:iotp'
-include 'connectors:jdbc'
-include 'connectors:kafka'
-include 'connectors:mqtt'
-include 'connectors:pubsub'
-include 'connectors:edgent.javax.websocket'
-include 'connectors:javax.websocket-client'
-include 'connectors:javax.websocket-server'
-include 'connectors:wsclient'
-include 'connectors:wsclient-javax.websocket'
-include 'console:server'
-include 'console:servlets'
-include 'apps:iot'
-include 'apps:runtime'
-include 'providers:development'
-include 'providers:iot'
-include 'analytics:math3'
-include 'analytics:sensors'
-include 'samples:utils'
-include 'samples:apps'
-include 'samples:topology'
-include 'samples:connectors'
-include 'samples:console'
-include 'samples:scenarios'
-include 'test:fvtiot'
-include 'test:svt'
-include 'platform:java7'
-include 'platform:android'
-include 'android:topology'
-include 'android:hardware'
-
-rootProject.name = build_name
diff --git a/spi/.classpath b/spi/.classpath
deleted file mode 100644
index 7d0d7e2..0000000
--- a/spi/.classpath
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="graph/src/main/java"/>
-	<classpathentry kind="src" path="topology/src/main/java"/>
-	<classpathentry kind="src" path="topology/src/test/java"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/api"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/ext"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/spi/.gitignore b/spi/.gitignore
deleted file mode 100644
index 948fe44..0000000
--- a/spi/.gitignore
+++ /dev/null
@@ -1,5 +0,0 @@
-/classes/
-**/test.classes/
-**/classes/
-**/unittests/
-/bin/
diff --git a/spi/.project b/spi/.project
deleted file mode 100644
index 68c2be8..0000000
--- a/spi/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>spi</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/spi/README.md b/spi/README.md
index 47d5c58..7cdc2cb 100644
--- a/spi/README.md
+++ b/spi/README.md
@@ -1,2 +1,20 @@
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
 spi provides bases classes for building the apis
 * topology base classes for building a TopologyProvider. It is not required that a TopologyProvider uses these classes.
\ No newline at end of file
diff --git a/spi/graph/build.gradle b/spi/graph/build.gradle
deleted file mode 100644
index 3a36a93..0000000
--- a/spi/graph/build.gradle
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-dependencies {
-  addTargetDirProjectJarDependency 'compile', ':api:execution'
-  addTargetDirProjectJarDependency 'compile', ':api:graph'
-  addTargetDirCoreExtJarDependencies 'compile'
-
-  // N.B. root project adds test common dependencies
-}
diff --git a/spi/graph/pom.xml b/spi/graph/pom.xml
new file mode 100644
index 0000000..4147de3
--- /dev/null
+++ b/spi/graph/pom.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-spi</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-spi-graph</artifactId>
+
+  <name>Apache Edgent (Java 8): SPI: Graph</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-execution</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-graph</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/spi/pom.xml b/spi/pom.xml
new file mode 100644
index 0000000..9ca15f5
--- /dev/null
+++ b/spi/pom.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-parent</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-spi</artifactId>
+  <packaging>pom</packaging>
+
+  <name>Apache Edgent (Java 8): SPI</name>
+
+  <modules>
+    <module>graph</module>
+    <module>topology</module>
+  </modules>
+
+</project>
diff --git a/spi/topology/build.gradle b/spi/topology/build.gradle
deleted file mode 100644
index a524e59..0000000
--- a/spi/topology/build.gradle
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-dependencies {
-  addTargetDirProjectJarDependency 'compile', ':api:topology'
-  addTargetDirCoreExtJarDependencies 'compile'
-
-  // N.B. root project adds test common dependencies
-}
diff --git a/spi/topology/pom.xml b/spi/topology/pom.xml
new file mode 100644
index 0000000..07cbafd
--- /dev/null
+++ b/spi/topology/pom.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-spi</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-spi-topology</artifactId>
+
+  <name>Apache Edgent (Java 8): SPI: Topology</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/spi/topology/src/main/java/org/apache/edgent/topology/spi/tester/AbstractTester.java b/spi/topology/src/main/java/org/apache/edgent/topology/spi/tester/AbstractTester.java
index 270d3fd..3dee72a 100644
--- a/spi/topology/src/main/java/org/apache/edgent/topology/spi/tester/AbstractTester.java
+++ b/spi/topology/src/main/java/org/apache/edgent/topology/spi/tester/AbstractTester.java
@@ -22,8 +22,8 @@
 import java.util.concurrent.TimeUnit;
 
 import org.apache.edgent.execution.Job;
-import org.apache.edgent.execution.Submitter;
 import org.apache.edgent.execution.Job.State;
+import org.apache.edgent.execution.Submitter;
 import org.apache.edgent.topology.Topology;
 import org.apache.edgent.topology.tester.Condition;
 import org.apache.edgent.topology.tester.Tester;
@@ -33,12 +33,33 @@
 public abstract class AbstractTester implements Tester { 
     
     private Job job;
+    
+    private static long getTimeoutValue(long timeout, TimeUnit units) {
+        // try to protect the tests from timing out prematurely
+        // in the face of overloaded/slow build/test servers.
+        //
+        // One problem with the following "generally bump the timeout value"
+        // scheme is that there are some tests that expect / test-for something
+        // to NOT happen - within some timeout tolerance.
+        // Ideally we don't want such tests to always take this extra-long timeout.
+        // Not sure what to do about that.  The first step is to just try this and
+        // see if it generally addresses the slow-test-server problem.
+        // Then we can review test execution times to identify those that fall
+        // into this case and then contemplate what to do about them.
+        
+        if (Boolean.getBoolean("edgent.build.ci")) {
+            // could do something like base the decision of the current value of timeout and/or units
+            return timeout * 2;  // minimize the multiplier because of the aforementioned await-tmo test cases
+        }
+        return timeout;
+    }
 
     @Override
     public boolean complete(Submitter<Topology, ? extends Job> submitter, JsonObject config, Condition<?> endCondition,
             long timeout, TimeUnit unit) throws Exception {
 
         long tmoMsec = Math.max(unit.toMillis(timeout), 1000);
+        tmoMsec = getTimeoutValue(tmoMsec, TimeUnit.MILLISECONDS);
         long maxTime = System.currentTimeMillis() + tmoMsec;
 
         Future<?> future = submitter.submit(topology(), config);
@@ -52,8 +73,14 @@
             Thread.sleep(100);
         }
         
+        if (!endCondition.valid() && getJob().getCurrentState() != State.CLOSED) {
+            System.err.println("complete(): timed out after " + tmoMsec + "msec");
+        }
+        
         if (getJob().getCurrentState() != State.CLOSED)
             getJob().stateChange(Job.Action.CLOSE);
+        else
+            System.out.println("complete(): Job already closed");
 
         return endCondition.valid();
     }
diff --git a/src/assembly/source-release.xml b/src/assembly/source-release.xml
new file mode 100644
index 0000000..e49aeb4
--- /dev/null
+++ b/src/assembly/source-release.xml
@@ -0,0 +1,87 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+
+<assembly>
+  <id>source-release</id>
+  <formats>
+    <format>zip</format>
+    <format>tar.gz</format>
+  </formats>
+
+  <fileSets>
+    <!-- main project directory structure -->
+    <fileSet>
+      <directory>.</directory>
+      <outputDirectory></outputDirectory>
+      <useDefaultExcludes>true</useDefaultExcludes>
+      <excludes>
+        <!-- build output -->
+        <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/).*${project.build.directory}.*]</exclude>
+        <!-- Maven wrapper binaries -->
+        <exclude>.mvn/wrapper/maven-wrapper.jar</exclude>
+        <exclude>.mvn/wrapper/MavenWrapperDownloader.class</exclude>
+        <!-- Samples -->
+        <exclude>samples/**</exclude>
+
+        <!-- NOTE: Most of the following excludes should not be required
+             if the standard release process is followed. This is because the
+             release plugin checks out project sources into a location like
+             target/checkout, then runs the build from there. The result is
+             a source-release archive that comes from a pretty clean directory
+             structure.
+
+             HOWEVER, if the release plugin is configured to run extra goals
+             or generate a project website, it's definitely possible that some
+             of these files will be present. So, it's safer to exclude them.
+        -->
+
+        <!-- IDEs -->
+        <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?maven-eclipse\.xml]</exclude>
+        <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?\.project]</exclude>
+        <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?\.classpath]</exclude>
+        <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?[^/]*\.iws]</exclude>
+        <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?\.idea(/.*)?]</exclude>
+        <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?out(/.*)?]</exclude>
+        <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?[^/]*\.ipr]</exclude>
+        <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?[^/]*\.iml]</exclude>
+        <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?\.settings(/.*)?]</exclude>
+        <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?\.externalToolBuilders(/.*)?]</exclude>
+        <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?\.deployables(/.*)?]</exclude>
+        <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?\.wtpmodules(/.*)?]</exclude>
+
+        <!-- Editors -->
+        <exclude>**~</exclude>
+
+        <!-- misc -->
+        <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?cobertura\.ser]</exclude>
+
+        <!-- release-plugin temp files -->
+        <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?pom\.xml\.releaseBackup]</exclude>
+        <exclude>%regex[(?!((?!${project.build.directory}/)[^/]+/)*src/)(.*/)?release\.properties]</exclude>
+        
+      </excludes>
+    </fileSet>
+    <!-- license, readme, etc. calculated at build time -->
+    <fileSet>
+      <directory>${project.build.directory}/maven-shared-archive-resources/META-INF</directory>
+      <outputDirectory></outputDirectory>
+    </fileSet>
+  </fileSets>
+</assembly>
diff --git a/licenses/binary-release/commons-lang3-3.4.AL-2.0 b/src/main/appended-resources/licenses/apache-license-version-2.0.txt
similarity index 100%
rename from licenses/binary-release/commons-lang3-3.4.AL-2.0
rename to src/main/appended-resources/licenses/apache-license-version-2.0.txt
diff --git a/src/main/appended-resources/licenses/d3-3_3_9-BSD.txt b/src/main/appended-resources/licenses/d3-3_3_9-BSD.txt
new file mode 100644
index 0000000..5ef0134
--- /dev/null
+++ b/src/main/appended-resources/licenses/d3-3_3_9-BSD.txt
@@ -0,0 +1,41 @@
+d3 (org.webjars.bower:d3:3.3.9)
+License type: BSD 3-Clause license
+
+The artifact's associated pom.xml states:
+    <license>
+            <name>BSD 3-Clause</name>
+            <url>https://spdx.org/licenses/BSD 3-Clause#licenseText</url>
+            <distribution>repo</distribution>
+    </license>
+
+The URL is bad. The appropriate value is
+https://spdx.org/licenses/BSD-3-Clause#licenseText
+
+The LICENSE file embedded in the artifact is:
+
+Copyright (c) 2013, Michael Bostock
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+  list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+  this list of conditions and the following disclaimer in the documentation
+  and/or other materials provided with the distribution.
+
+* The name Michael Bostock may not be used to endorse or promote products
+  derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL MICHAEL BOSTOCK BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/licenses/sizzle.MIT b/src/main/appended-resources/licenses/d3-legend-MIT.txt
similarity index 74%
rename from licenses/sizzle.MIT
rename to src/main/appended-resources/licenses/d3-legend-MIT.txt
index 7dced1a..f8bd27f 100644
--- a/licenses/sizzle.MIT
+++ b/src/main/appended-resources/licenses/d3-legend-MIT.txt
@@ -1,9 +1,15 @@
-servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/external/jquery/jquery.js:
-For included Sizzle.js
+d3.legend.js  (https://gist.githubusercontent.com/ZJONSSON/3918369/raw/bf9bce6b68a3b70f87450f155436ca4a84af1ba4/d3.legend.js)
 License type: MIT
 
-Copyright 2013 jQuery Foundation and other contributors
-http://jquery.com/
+The artifact only contains/supplies the following license information:
+
+// (C) 2012 ziggy.jonsson.nyc@gmail.com
+// MIT licence
+
+The generic MIT license text is:
+
+MIT License
+Copyright (c) <year> <copyright holders>
 
 Permission is hereby granted, free of charge, to any person obtaining
 a copy of this software and associated documentation files (the
diff --git a/src/main/appended-resources/licenses/d3-plugins-sankey-1_1_0-BSD.txt b/src/main/appended-resources/licenses/d3-plugins-sankey-1_1_0-BSD.txt
new file mode 100644
index 0000000..20330c5
--- /dev/null
+++ b/src/main/appended-resources/licenses/d3-plugins-sankey-1_1_0-BSD.txt
@@ -0,0 +1,39 @@
+d3-plugins-sankey (org.webjars.bower:d3-plugins-sankey:1.1.0)
+License type: BSD 2-Clause license
+
+The artifact's associated pom.xml states:
+    <license>
+            <name>BSD 2-Clause</name>
+            <url>https://spdx.org/licenses/BSD 2-Clause#licenseText</url>
+            <distribution>repo</distribution>
+    </license>
+
+The URL is bad. The appropriate value is
+https://spdx.org/licenses/BSD-2-Clause#licenseText
+
+The artifact has no other embedded license information.
+
+The generic BSD 2-Clause license at that URL is:
+
+Copyright (c) <year> <owner> All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+  list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+  this list of conditions and the following disclaimer in the documentation
+  and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL MICHAEL BOSTOCK BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
diff --git a/licenses/sizzle.MIT b/src/main/appended-resources/licenses/jquery-1_11_2-MIT.txt
similarity index 70%
copy from licenses/sizzle.MIT
copy to src/main/appended-resources/licenses/jquery-1_11_2-MIT.txt
index 7dced1a..6cfe3ec 100644
--- a/licenses/sizzle.MIT
+++ b/src/main/appended-resources/licenses/jquery-1_11_2-MIT.txt
@@ -1,9 +1,19 @@
-servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/external/jquery/jquery.js:
-For included Sizzle.js
+jquery (org.webjars:jquery:1.11.2)
 License type: MIT
 
-Copyright 2013 jQuery Foundation and other contributors
-http://jquery.com/
+The artifact's pom.xml states:
+    <license>
+            <name>MIT License</name>
+            <url>https://github.com/jquery/jquery/blob/master/MIT-LICENSE.txt</url>
+            <distribution>repo</distribution>
+    </license>
+
+The URL is bad and would not yield artifact-version specific content.
+
+The generic MIT license is:
+
+MIT License
+Copyright (c) <year> <copyright holders>
 
 Permission is hereby granted, free of charge, to any person obtaining
 a copy of this software and associated documentation files (the
@@ -22,4 +32,4 @@
 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
diff --git a/licenses/sizzle.MIT b/src/main/appended-resources/licenses/jquery-ui-1_11_4-MIT.txt
similarity index 67%
copy from licenses/sizzle.MIT
copy to src/main/appended-resources/licenses/jquery-ui-1_11_4-MIT.txt
index 7dced1a..7ccc799 100644
--- a/licenses/sizzle.MIT
+++ b/src/main/appended-resources/licenses/jquery-ui-1_11_4-MIT.txt
@@ -1,9 +1,21 @@
-servlets/webapp_content/js/ext/jquery-ui-1.11.4.custom/external/jquery/jquery.js:
-For included Sizzle.js
+jquery-ui (org.webjars:jquery-ui:1.11.4)
 License type: MIT
 
-Copyright 2013 jQuery Foundation and other contributors
-http://jquery.com/
+The artifact's associated pom.xml states:
+    <license>
+            <name>MIT License</name>
+            <url>https://github.com/jquery/jquery-ui/blob/master/MIT-LICENSE.txt</url>
+            <distribution>repo</distribution>
+    </license>
+
+The URL is bad and would not yield artifact-version specific content.
+
+The artifact has no other embedded license information.
+
+The generic MIT license is:
+
+MIT License
+Copyright (c) <year> <copyright holders>
 
 Permission is hereby granted, free of charge, to any person obtaining
 a copy of this software and associated documentation files (the
diff --git a/src/main/ibm-remote-resources/META-INF/NOTICE b/src/main/ibm-remote-resources/META-INF/NOTICE
new file mode 100644
index 0000000..b1cc91e
--- /dev/null
+++ b/src/main/ibm-remote-resources/META-INF/NOTICE
@@ -0,0 +1,5 @@
+===============================================================================
+
+Portions of this software were developed by IBM Corp.
+Copyright IBM Corp. 2015, 2016
+
diff --git a/src/site/asciidoc/docs.adoc b/src/site/asciidoc/docs.adoc
new file mode 100644
index 0000000..5e56e41
--- /dev/null
+++ b/src/site/asciidoc/docs.adoc
@@ -0,0 +1,22 @@
+////
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+////
+
+# Test
+
+Blah blah blah ...
\ No newline at end of file
diff --git a/src/site/asciidoc/releasing.adoc b/src/site/asciidoc/releasing.adoc
new file mode 100644
index 0000000..d7a6525
--- /dev/null
+++ b/src/site/asciidoc/releasing.adoc
@@ -0,0 +1,57 @@
+////
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+////
+
+# Releasing Edgent
+
+In general the `master` branch contains the repository state of the latest release of Edgent.
+No commit should be done to `master` except for merging after a successful release.
+
+Normal development is done in the `develop` branch or in feature branches that are merged to `develop` after they are finished.
+
+A version is built up of three parts: `major`.`minor`.`bugfix`. For each major and minor version a corresponding `release` branch is maintained.
+This allows shipping of bug-fix releases, if this is required. For bug-fix releases no new branch is created.
+
+Assuming develop is currently in version `1.2.0-SNAPSHOT` and we are preparing a new release, then we would first create a `release/1.2` branch. Within this branch, the Edgent version is `1.2.0-SNAPSHOT` and develop becomes `1.3.0-SNAPSHOT`.
+In the `release/1.2` branch all work prior to cutting a release or for fixing bug-fixes in an existing release can be performed. This branch is usually used to stabilize the software prior to a release.
+
+As soon as the release branch is stable enough, the release manager cuts a release.
+
+When doing this, all modules versions are set to a release version, this version is committed and tagged and then the version is usually incremented to the next higher bug-fix version.
+So if the `release/1.2` branch is currently in version `1.2.0-SNAPSHOT`, the versions are changed to `1.2.0` and after the committing and tagging the version is updated to `1.2.1-SNAPSHOT`.
+
+All of these steps are automated by the `maven-release-plugin`.
+
+## Creating the release branch
+
+A new release branch is always created from the `develop` branch. So make sure all changes have been pulled and the repo is up to date.
+
+The following command performs the branching:
+
+    mvn release:branch -P platform-android,platform-java7,distribution -DbranchName=release/1.2 -DautoVersionSubmodules=true
+
+Without the `-DautoVersionSubmodules=true` we would have to specify the version for each module separately. This way we only have to specify the version of the root module and all children will inherit this version.
+
+Also the only way all modules are processed, is if we enable the `distribution` and the two `platform-android` and `platform-java7` profiles.
+
+After this the branches and the changes are committed, but not yet pushed. So as a last step here the release-manager needs to push the changes in his git repo.
+
+
+## Preparing a release
+
+To be continued ...
\ No newline at end of file
diff --git a/src/site/site.xml b/src/site/site.xml
new file mode 100644
index 0000000..4ae9ff4
--- /dev/null
+++ b/src/site/site.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!--
+ 
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+ 
+ http://www.apache.org/licenses/LICENSE-2.0
+ 
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ 
+ -->
+<project name="Edgent">
+
+    <skin>
+        <groupId>lt.velykis.maven.skins</groupId>
+        <artifactId>reflow-maven-skin</artifactId>
+        <version>1.1.1</version>
+    </skin>
+
+    <!--
+    Details on how to configure the reflow skin:
+    http://andriusvelykis.github.io/reflow-maven-skin/skin/
+-->
+    <custom>
+        <reflowSkin>
+            <theme>bootswatch-cerulean</theme>
+            <titleTemplate>Apache Edgent® (Incubating) - %2$s</titleTemplate>
+            <slogan position="bannerRight">Accelerating Analytics at the Edge</slogan>
+            <toc>top</toc>
+            <tocTopFlatten>true</tocTopFlatten>
+            <topNav>reports|modules|parent</topNav>
+            <bottomNav>
+                <column>reports</column>
+                <column>modules</column>
+                <column>parent</column>
+            </bottomNav>
+            <brand>
+                <name>Apache Edgent (Incubating)</name>
+                <href>https://edgent.apache.org/</href>
+            </brand>
+            <bottomDescription>
+                Apache Edgent is an effort undergoing Incubation at The Apache Software Foundation
+                (ASF), sponsored by the Incubator. Incubation is required of all newly accepted
+                projects until a further review indicates that the infrastructure, communications,
+                and decision making process have stabilized in a manner consistent with other
+                successful ASF projects. While incubation status is not necessarily a reflection
+                of the completeness or stability of the code, it does indicate that the project
+                has yet to be fully endorsed by the ASF.
+            </bottomDescription>
+            <breadcrumbs>true</breadcrumbs>
+            <highlightJs>true</highlightJs>
+            <pages>
+                <developer-info>
+                    <toc>sidebar</toc>
+                </developer-info>
+            </pages>
+        </reflowSkin>
+    </custom>
+
+    <bannerLeft>
+        <name>Apache Edgent (incubating)</name>
+        <src>https://edgent.apache.org/img/apache_logo.png</src>
+        <href>https://edgent.apache.org/</href>
+    </bannerLeft>
+
+    <bannerRight>
+        <name>Apache Incubator</name>
+        <src>https://incubator.apache.org/images/incubator_feather_egg_logo_sm.png</src>
+        <href>http://incubator.apache.org/</href>
+    </bannerRight>
+
+    <body>
+        <links>
+            <item name="Wiki" href="https://cwiki.apache.org/confluence/display/EDGENT"/>
+            <item name="Issues" href="https://issues.apache.org/jira/projects/EDGENT"/>
+            <item name="CI" href="https://builds.apache.org/view/E-G/view/Edgent/"/>
+        </links>
+        <menu ref="reports" inherit="top"/>
+        <menu ref="parent" inherit="top"/>
+        <menu ref="modules" inherit="top"/>
+    </body>
+
+</project>
\ No newline at end of file
diff --git a/test/.classpath b/test/.classpath
deleted file mode 100644
index e37cef6..0000000
--- a/test/.classpath
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="fvtiot/src/test/java"/>
-	<classpathentry kind="src" path="svt/src/main/java"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/analytics"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/api"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/connectors"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/console"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/ext"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/providers"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/spi"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/utils"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/apps"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/runtime"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/provider_iot"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/samples"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/test/.project b/test/.project
deleted file mode 100644
index b0299db..0000000
--- a/test/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>test</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/test/appservice-applications/pom.xml b/test/appservice-applications/pom.xml
new file mode 100644
index 0000000..6f38e2c
--- /dev/null
+++ b/test/appservice-applications/pom.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-test</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-test-appservice-applications</artifactId>
+
+  <name>Apache Edgent (Java 8): Test: AppService Applications</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/api/topology/src/test/java/org/apache/edgent/test/topology/services/TestApplications.java b/test/appservice-applications/src/main/java/org/apache/edgent/test/topology/services/TestApplications.java
similarity index 99%
rename from api/topology/src/test/java/org/apache/edgent/test/topology/services/TestApplications.java
rename to test/appservice-applications/src/main/java/org/apache/edgent/test/topology/services/TestApplications.java
index 0053328..874808a 100644
--- a/api/topology/src/test/java/org/apache/edgent/test/topology/services/TestApplications.java
+++ b/test/appservice-applications/src/main/java/org/apache/edgent/test/topology/services/TestApplications.java
@@ -18,12 +18,11 @@
 */
 package org.apache.edgent.test.topology.services;
 
+import com.google.gson.JsonObject;
 import org.apache.edgent.function.BiConsumer;
 import org.apache.edgent.topology.Topology;
 import org.apache.edgent.topology.services.TopologyBuilder;
 
-import com.google.gson.JsonObject;
-
 /**
  * Some dummy test applications that will be part of this
  * jar including having service provider entries.
diff --git a/test/appservice-applications/src/main/resources/META-INF/services/org.apache.edgent.topology.services.TopologyBuilder b/test/appservice-applications/src/main/resources/META-INF/services/org.apache.edgent.topology.services.TopologyBuilder
new file mode 100644
index 0000000..5794307
--- /dev/null
+++ b/test/appservice-applications/src/main/resources/META-INF/services/org.apache.edgent.topology.services.TopologyBuilder
@@ -0,0 +1,19 @@
+#
+#  Licensed to the Apache Software Foundation (ASF) under one or more
+#  contributor license agreements.  See the NOTICE file distributed with
+#  this work for additional information regarding copyright ownership.
+#  The ASF licenses this file to You under the Apache License, Version 2.0
+#  (the "License"); you may not use this file except in compliance with
+#  the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#  See the License for the specific language governing permissions and
+#  limitations under the License.
+#
+org.apache.edgent.test.topology.services.TestApplications$AppOne
+org.apache.edgent.test.topology.services.TestApplications$AppTwo
+org.apache.edgent.test.topology.services.TestApplications$AppThree
\ No newline at end of file
diff --git a/test/fvtiot/build.gradle b/test/fvtiot/build.gradle
deleted file mode 100644
index 7dca64e..0000000
--- a/test/fvtiot/build.gradle
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-dependencies {
-  addTargetDirProjectJarDependency 'compile', ':providers:iot'
-  addTargetDirProjectJarDependency 'compile', ':runtime:appservice'
-  addTargetDirProjectJarDependency 'compile', ':runtime:jsoncontrol'
-  addTargetDirCoreExtJarDependencies 'compile'
-
-  // N.B. root project adds test common dependencies
-}
-
-addCompileTestDependencies ':apps:iot'
\ No newline at end of file
diff --git a/test/fvtiot/pom.xml b/test/fvtiot/pom.xml
new file mode 100644
index 0000000..7c21902
--- /dev/null
+++ b/test/fvtiot/pom.xml
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-test</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-test-fvtiot</artifactId>
+
+  <name>Apache Edgent (Java 8): Test: fvtiot</name>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>pre-integration-test</phase>
+            <goals>
+              <goal>copy</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.edgent</groupId>
+                  <artifactId>edgent-test-appservice-applications</artifactId>
+                  <version>${project.version}</version>
+                  <outputDirectory>${project.build.directory}/test-resources</outputDirectory>
+                  <destFileName>test-appservice-applications.jar</destFileName>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-connectors-pubsub</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-runtime-jsoncontrol</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-providers-direct</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-apps-iot</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-apps-iot</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-providers-iot</artifactId>
+      <version>1.2.0</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/test/fvtiot/src/test/java/org/apache/edgent/test/fvt/iot/IotAppServiceTest.java b/test/fvtiot/src/test/java/org/apache/edgent/test/fvt/iot/IotAppServiceIT.java
similarity index 91%
rename from test/fvtiot/src/test/java/org/apache/edgent/test/fvt/iot/IotAppServiceTest.java
rename to test/fvtiot/src/test/java/org/apache/edgent/test/fvt/iot/IotAppServiceIT.java
index b1ba247..efea710 100644
--- a/test/fvtiot/src/test/java/org/apache/edgent/test/fvt/iot/IotAppServiceTest.java
+++ b/test/fvtiot/src/test/java/org/apache/edgent/test/fvt/iot/IotAppServiceIT.java
@@ -37,7 +37,7 @@
 import com.google.gson.JsonObject;
 import com.google.gson.JsonPrimitive;
 
-public class IotAppServiceTest {
+public class IotAppServiceIT {
     
     @Test
     public void testAppService() throws Exception {
@@ -61,6 +61,7 @@
     }
     
     @Test
+    //@Ignore("This test relies on an existing war in a given location ... need to refactor this")
     public void testAppServiceJar() throws Exception {
         
         DirectProvider provider = new DirectProvider();
@@ -68,11 +69,12 @@
         JsonControlService control = new JsonControlService();
         provider.getServices().addService(ControlService.class, control);        
         AppService.createAndRegister(provider, provider);
-        String qd = System.getProperty("edgent.test.root.dir");
-        assertNotNull(qd);
-        File testAppsJar = new File(qd, "api/topology/build/lib/test/edgent.api.topology.APPS.TEST.jar");
+
+        File testAppsJar = getServerJar();
+        assertNotNull(testAppsJar);
         assertTrue(testAppsJar.exists());
-        
+        System.out.println("Using server jar at: " + testAppsJar.toString());
+
         URL testAppsJarURL = testAppsJar.toURI().toURL();
         JsonObject registerJar = newRegisterJarRequest(testAppsJarURL.toExternalForm());       
         JsonElement crr = control.controlRequest(registerJar);    
@@ -99,6 +101,7 @@
         
         return submitApp;
     }
+
     public static JsonObject newRegisterJarRequest(String jarURL) {
         JsonObject submitApp = new JsonObject();   
         submitApp.addProperty(JsonControlService.TYPE_KEY, ApplicationServiceMXBean.TYPE);
@@ -111,6 +114,9 @@
         
         return submitApp;
     }
-    
+
+    private File getServerJar() {
+        return new File("target/test-resources/test-appservice-applications.jar");
+    }
 
 }
diff --git a/test/fvtiot/src/test/java/org/apache/edgent/test/fvt/iot/IotProviderTest.java b/test/fvtiot/src/test/java/org/apache/edgent/test/fvt/iot/IotProviderIT.java
similarity index 97%
rename from test/fvtiot/src/test/java/org/apache/edgent/test/fvt/iot/IotProviderTest.java
rename to test/fvtiot/src/test/java/org/apache/edgent/test/fvt/iot/IotProviderIT.java
index a55562c..c7b774f 100644
--- a/test/fvtiot/src/test/java/org/apache/edgent/test/fvt/iot/IotProviderTest.java
+++ b/test/fvtiot/src/test/java/org/apache/edgent/test/fvt/iot/IotProviderIT.java
@@ -58,7 +58,7 @@
 /**
  * Test IotProvider using the EchoIotDevice.
  */
-public class IotProviderTest {
+public class IotProviderIT {
     
     /**
      * Basic test we can start applications
@@ -77,7 +77,7 @@
         IotTestApps.registerApplications(provider);
 
         // Create a Submit AppOne request
-        JsonObject submitAppOne = IotAppServiceTest.newSubmitRequest("AppOne");
+        JsonObject submitAppOne = IotAppServiceIT.newSubmitRequest("AppOne");
         
         // Create a test application that listens for the
         // output of AppOne (as a published topic).
@@ -125,7 +125,7 @@
         IotTestApps.registerApplications(provider);
 
         // Create a Submit AppOne request
-        JsonObject submitAppOne = IotAppServiceTest.newSubmitRequest("AppOne");
+        JsonObject submitAppOne = IotAppServiceIT.newSubmitRequest("AppOne");
         
         // Create an application that sends a device event
         // with the submit job command, and this will be echoed
diff --git a/test/pom.xml b/test/pom.xml
new file mode 100644
index 0000000..d63cd7f
--- /dev/null
+++ b/test/pom.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-parent</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-test</artifactId>
+  <packaging>pom</packaging>
+
+  <name>Apache Edgent (Java 8): Test</name>
+
+  <modules>
+    <module>appservice-applications</module>
+    <module>fvtiot</module>
+    <module>svt</module>
+  </modules>
+
+  <!-- TODO: Add the license headers or remove the files -->
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.rat</groupId>
+        <artifactId>apache-rat-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>license-check</id>
+            <phase>verify</phase>
+            <goals>
+              <goal>check</goal>
+            </goals>
+          </execution>
+        </executions>
+        <configuration>
+          <excludes combine.children="append">
+            <exclude>consoleUrl.txt</exclude>
+            <exclude>GpsObdAnalyticsApplication.properties</exclude>
+            <exclude>iotfUrl.txt</exclude>
+          </excludes>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>
diff --git a/test/svt/build.gradle b/test/svt/build.gradle
deleted file mode 100644
index 2d16e70..0000000
--- a/test/svt/build.gradle
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-def lib= "$target_java8_dir/$project.simpleGroupName/$project.name"
-
-//def lib="${project.distsDir}/lib"
-
-dependencies {
-  addTargetDirProjectJarDependency 'compile', ':providers:development'
-  addTargetDirProjectJarDependency 'compile', ':samples:apps'
-  addTargetDirProjectJarDependency 'compile', ':connectors:iotp'
-  addTargetDirCoreExtJarDependencies 'compile'
-
-  // N.B. root project adds test common dependencies
-}
-
-tasks.build.doFirst(){
-  mkdir lib 
-}
-
-tasks.build.doLast(){
-  delete lib
-}
diff --git a/test/svt/pom.xml b/test/svt/pom.xml
new file mode 100644
index 0000000..092b9b0
--- /dev/null
+++ b/test/svt/pom.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-test</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-test-svt</artifactId>
+
+  <name>Apache Edgent (Java 8): Test: SVT</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-console-server</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-utils-metrics</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-providers-development</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/test/svt/src/main/java/org/apache/edgent/test/svt/apps/FleetManagementAnalyticsClientApplication.java b/test/svt/src/main/java/org/apache/edgent/test/svt/apps/FleetManagementAnalyticsClientApplication.java
deleted file mode 100644
index 3518567..0000000
--- a/test/svt/src/main/java/org/apache/edgent/test/svt/apps/FleetManagementAnalyticsClientApplication.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
- */
-package org.apache.edgent.test.svt.apps;
-
-import org.apache.edgent.test.svt.apps.iotp.AbstractIotpApplication;
-import org.apache.edgent.topology.Topology;
-
-/**
- * A Global Positional System and On-Board Diagnostics application to perform
- * analytics defined in {@link GpsAnalyticsApplication} and
- * {@link ObdAnalyticsApplication}.
- * <p>
- * The Edgent console URL is written to the console and to file consoleUrl.txt.
- * <p>
- * The Watson IotF URL is written to the console and to file iotfUrl.txt
- * 
- * <p>
- * Argument: specify pathname to application properties file. If running in
- * Eclipse, you can specify GpsObdAnalyticsApplication.properties.
- */
-public class FleetManagementAnalyticsClientApplication extends AbstractIotpApplication {
-
-    public static void main(String[] args) throws Exception {
-        if (args.length < 1)
-            throw new Exception("missing pathname to application properties file");
-
-        FleetManagementAnalyticsClientApplication application = new FleetManagementAnalyticsClientApplication(args[0]);
-
-        application.run();
-    }
-
-    /**
-     * Create an application instance.
-     * 
-     * @param propsPath
-     *            pathname to an application configuration file
-     * @throws Exception
-     */
-    FleetManagementAnalyticsClientApplication(String propsPath) throws Exception {
-        super(propsPath);
-    }
-
-    @Override
-    protected void buildTopology(Topology t) {
-
-        // Add the GPS analytics to the topology
-        new GpsAnalyticsApplication(t, this).addAnalytics();
-
-        // TODO Add the OBD analytics to the topology
-        // new ObdAnalyticsApplication(t, this).addAnalytics();
-    }
-}
\ No newline at end of file
diff --git a/test/svt/src/main/java/org/apache/edgent/test/svt/apps/GpsAnalyticsApplication.java b/test/svt/src/main/java/org/apache/edgent/test/svt/apps/GpsAnalyticsApplication.java
deleted file mode 100644
index c059400..0000000
--- a/test/svt/src/main/java/org/apache/edgent/test/svt/apps/GpsAnalyticsApplication.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.test.svt.apps;
-
-import java.util.concurrent.TimeUnit;
-
-import org.apache.edgent.connectors.iot.QoS;
-import org.apache.edgent.test.svt.utils.sensor.gps.GpsSensor;
-import org.apache.edgent.test.svt.utils.sensor.gps.SimulatedGeofence;
-import org.apache.edgent.test.svt.utils.sensor.gps.SimulatedGpsSensor;
-import org.apache.edgent.topology.TStream;
-import org.apache.edgent.topology.TWindow;
-import org.apache.edgent.topology.Topology;
-
-import com.google.gson.JsonObject;
-
-/**
- * GPS analytics
- * <p>
- * Source is a stream of GPS sensor data {@link GpsSensor}
- * <p>
- * Here's an outline of the topology
- * <ul>
- * <li>Log GPS coordinates by publishing to IotF. The data may be used by a
- * server application to display the vehicle on a map.</li>
- * <li>Filter to detect speeds above a threshold and publish alert IotF</li>
- * <li>Filter for GPS coordinates that are outside of a defined Geofence
- * boundary</li>
- * <li>Windowing to detect hard driving: hard braking or hard acceleration and
- * publish alert to IotF</li>
- * </ul>
- */
-public class GpsAnalyticsApplication {
-
-    private final FleetManagementAnalyticsClientApplication app;
-    private final Topology topology;
-
-    // TODO: make these configurable properties
-    boolean trackGpsLocation = true;
-    boolean trackSpeeding = true;
-    boolean trackGeofence = true;
-    boolean trackHardDriving = true;
-    // Hard braking and acceleration thresholds may depend on the vehicle model
-    double hardBrakingThreshold_MphPerSec = -8.25;
-    double hardAccelerationThreshold_MphPerSec = 7.37;
-    String driverId = "driver1";
-    String VIN = "123456";
-    double maxSpeed_Mph = 70;
-
-    static double MILES_PER_HOUR_TO_METERS_PER_SEC = 0.44704;
-    double METERS_PER_HOUR_TO_MILES_PER_SEC = 1 / MILES_PER_HOUR_TO_METERS_PER_SEC;
-    // Convert 70 miles per hour to meters to sec
-    double MAX_SPEED_METERS_PER_SEC = maxSpeed_Mph * MILES_PER_HOUR_TO_METERS_PER_SEC;
-    static double MPS_TO_MPH = 3.6;
-
-    public GpsAnalyticsApplication(Topology t, FleetManagementAnalyticsClientApplication app) {
-        this.topology = t;
-        this.app = app;
-    }
-
-    /**
-     * Add the GPS sensor analytics to the topology.
-     */
-    public void addAnalytics() {
-
-        // Generate source GPS data
-        SimulatedGpsSensor g = new SimulatedGpsSensor();
-        TStream<GpsSensor> gpsSensor = topology.poll(() -> g.nextGps(), 500, TimeUnit.MILLISECONDS);
-
-        // Publish GPS data to IotF every 1 second
-        if (trackGpsLocation) {
-            TStream<GpsSensor> logGps = gpsSensor.peek(t -> System.out.println("log GPS: " + t.toString()));
-            logGps.tag("logGps");
-            // Publish GPS location to IotF
-            app.iotDevice().events(JsonGps(logGps), "GPS: " + driverId, QoS.FIRE_AND_FORGET);
-        }
-
-        // Filter for actual speeding and publish to IoTF and local file
-        if (trackSpeeding) {
-            TStream<GpsSensor> speeding = gpsSensor.filter(t -> t.getSpeedMetersPerSec() > MAX_SPEED_METERS_PER_SEC);
-
-            speeding.tag("speeding");
-            // Count speeding tuples
-            // TODO investigate why publish doesn't appear to work when a
-            // counter is set
-            // Metrics.counter(speeding);
-
-            speeding.peek(t -> System.out.println("Alert: speeding - " + t.toString()));
-            // Write speeding event to IotF
-            app.iotDevice().events(JsonSpeed(speeding), "Speeding: " + driverId, QoS.FIRE_AND_FORGET);
-        }
-
-        // Filter for Geofence boundary exceptions and publish to IoTF
-        if (trackGeofence) {
-            TStream<GpsSensor> geofence = gpsSensor
-                    .filter(t -> SimulatedGeofence.outsideGeofence(t.getLatitude(), t.getLongitude()));
-
-            geofence.tag("geofence");
-            // Count Geofence exceptions
-            // TODO investigate why publish doesn't appear to work when a
-            // counter is set
-            // Metrics.counter(geofence);
-
-            geofence.peek(t -> System.out.println("Alert: geofence - " + t.toString()));
-            // Write Geofence exceptions to IotF
-            app.iotDevice().events(JsonGeofence(geofence), "Geofence: " + driverId, QoS.FIRE_AND_FORGET);
-        }
-
-        /*
-         * Hard braking: (speed1 - speed0)/(time1 - time0) <
-         * hardBrakingThreshold_KphPerSec Hard acceleration: (speed1 -
-         * speed0)/(time1 - time0) > hardAccelerationThreshold_KphPerSec 1 mps =
-         * 3.6 kph
-         */
-        if (trackHardDriving) {
-            TStream<GpsSensor> hardDriving = gpsSensor;
-            // TODO replace hardcoded "2" in "last(2," to force seeing
-            // hardDriving alter
-            TWindow<GpsSensor, Object> window = hardDriving.last(2, tuple -> 0);
-            TStream<GpsSensor[]> logHardDriving = window.batch((tuples, key) -> {
-                GpsSensor[] results = null;
-                Object[] tuplesArray = tuples.toArray();
-
-                GpsSensor gps1 = (GpsSensor) tuplesArray[1];
-                GpsSensor gps0 = (GpsSensor) tuplesArray[0];
-                double speed1 = gps1.getSpeedMetersPerSec();
-                double speed0 = gps0.getSpeedMetersPerSec();
-                long time1 = gps1.getTime();
-                long time0 = gps0.getTime();
-
-                // Check for hard braking or hard acceleration
-                // Avoid division by 0
-                if (time1 - time0 != 0) {
-                    double mphPerSec = (speed1 - speed0) / (time1 - time0) * MPS_TO_MPH;
-                    if (mphPerSec < hardBrakingThreshold_MphPerSec || mphPerSec > hardAccelerationThreshold_MphPerSec) {
-                        results = new GpsSensor[2];
-                        results[0] = gps0;
-                        results[1] = gps1;
-                    }
-                }
-                return results;
-            }).peek(t -> System.out.println("hardDriving: t0=" + t[0].toString() + " t[1]=" + t[1].toString()))
-                    .tag("hardDriving");
-
-            app.iotDevice().events(JsonHardDriving(logHardDriving), "hardDriving: " + driverId, QoS.FIRE_AND_FORGET);
-        }
-    }
-
-    private TStream<JsonObject> JsonGps(TStream<GpsSensor> gpsSensor) {
-        return gpsSensor.map(t -> {
-            JsonObject j = new JsonObject();
-            j.addProperty("lat", t.getLatitude());
-            j.addProperty("long", t.getLongitude());
-            j.addProperty("alt", t.geAltitude());
-            j.addProperty("mph", t.getSpeedMetersPerSec() * METERS_PER_HOUR_TO_MILES_PER_SEC);
-            j.addProperty("course", t.getCourse());
-            j.addProperty("time", t.getTime());
-            return j;
-        });
-    }
-
-    private TStream<JsonObject> JsonSpeed(TStream<GpsSensor> gpsSensor) {
-        return gpsSensor.map(t -> {
-            JsonObject j = new JsonObject();
-            j.addProperty("lat", t.getLatitude());
-            j.addProperty("long", t.getLongitude());
-            j.addProperty("mph", t.getSpeedMetersPerSec() * METERS_PER_HOUR_TO_MILES_PER_SEC);
-            j.addProperty("time", t.getTime());
-            return j;
-        });
-    }
-
-    private TStream<JsonObject> JsonGeofence(TStream<GpsSensor> gpsSensor) {
-        return gpsSensor.map(t -> {
-            JsonObject j = new JsonObject();
-            j.addProperty("lat", t.getLatitude());
-            j.addProperty("long", t.getLongitude());
-            j.addProperty("time", t.getTime());
-            return j;
-        });
-    }
-
-    private TStream<JsonObject> JsonHardDriving(TStream<GpsSensor[]> gpsSensors) {
-        return gpsSensors.map(t -> {
-            JsonObject j = new JsonObject();
-            j.addProperty("lat1", t[0].getLatitude());
-            j.addProperty("long1", t[0].getLongitude());
-            j.addProperty("time1", t[0].getTime());
-            j.addProperty("speed1", t[0].getSpeedMetersPerSec());
-            j.addProperty("lat2", t[1].getLatitude());
-            j.addProperty("long2", t[1].getLongitude());
-            j.addProperty("time2", t[1].getTime());
-            j.addProperty("speed2", t[1].getSpeedMetersPerSec());
-            j.addProperty("mphPerSec", (t[1].getSpeedMetersPerSec() - t[0].getSpeedMetersPerSec()) * MPS_TO_MPH
-                    / (t[1].getTime() - t[0].getTime()));
-            return j;
-        });
-    }
-}
diff --git a/test/svt/src/main/java/org/apache/edgent/test/svt/apps/ObdAnalyticsApplication.java b/test/svt/src/main/java/org/apache/edgent/test/svt/apps/ObdAnalyticsApplication.java
deleted file mode 100644
index c10d6e9..0000000
--- a/test/svt/src/main/java/org/apache/edgent/test/svt/apps/ObdAnalyticsApplication.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.test.svt.apps;
-
-import org.apache.edgent.topology.Topology;
-public class ObdAnalyticsApplication{
-// TODO:
-//    private final FleetManagementAnalyticsClientApplication app;
-//    private final Topology t;
-//    private final String sensorId = "obd";
-
-    public ObdAnalyticsApplication(Topology t, FleetManagementAnalyticsClientApplication app) {
-//        this.t = t;
-//        this.app = app;
-    }
-    
-    /**
-     * Add the ODB sensor's analytics to the topology.
-     */
-    public void addAnalytics() {
-
-    }
-}
diff --git a/test/svt/src/main/java/org/apache/edgent/test/svt/apps/iotp/AbstractIotpApplication.java b/test/svt/src/main/java/org/apache/edgent/test/svt/apps/iotp/AbstractIotpApplication.java
deleted file mode 100644
index cc1053f..0000000
--- a/test/svt/src/main/java/org/apache/edgent/test/svt/apps/iotp/AbstractIotpApplication.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
- */
-package org.apache.edgent.test.svt.apps.iotp;
-
-import java.io.PrintWriter;
-import java.util.Random;
-
-import org.apache.edgent.connectors.iot.IotDevice;
-import org.apache.edgent.connectors.iotp.IotpDevice;
-import org.apache.edgent.samples.apps.AbstractApplication;
-import org.apache.edgent.samples.apps.ApplicationUtilities;
-import org.apache.edgent.samples.apps.TopologyProviderFactory;
-import org.apache.edgent.topology.Topology;
-
-/**
- * An IotF Application base class.
- * <p>
- * Application instances need to:
- * <ul>
- * <li>define an implementation for {@link #buildTopology(Topology)}</li>
- * <li>call {@link #run()} to build and submit the topology for execution.</li>
- * </ul>
- * <p>
- * The class provides some common processing needs:
- * <ul>
- * <li>Support for an external configuration file</li>
- * <li>Provides a {@link TopologyProviderFactory}</li>
- * <li>Provides a {@link ApplicationUtilities}</li>
- * <li>Provides a {@link IotDevice}</li>
- * </ul>
- */
-public abstract class AbstractIotpApplication extends AbstractApplication {
-
-    private IotDevice device;
-
-    public AbstractIotpApplication(String propsPath) throws Exception {
-        super(propsPath);
-    }
-
-    @Override
-    protected void preBuildTopology(Topology topology) {
-        // Add an Iotp device communication manager to the topology
-        // Declare a connection to IoTF Quickstart service
-        String deviceId = "qs" + Long.toHexString(new Random().nextLong());
-        device = IotpDevice.quickstart(topology, deviceId);
-
-        // TODO replace quickstart
-        // iotfDevice = new IotpDevice(topology, new File("device.cfg"));
-
-        System.out.println("Quickstart device type:" + IotpDevice.QUICKSTART_DEVICE_TYPE);
-        System.out.println("Quickstart device id  :" + deviceId);
-        System.out.println("https://quickstart.internetofthings.ibmcloud.com/#/device/" + deviceId);
-        // Also write this information to file quickstartUrl.txt in case the
-        // console scrolls too fast
-        try {
-            PrintWriter writer = new PrintWriter("iotfUrl.txt", "UTF-8");
-            writer.println("Quickstart device type:" + IotpDevice.QUICKSTART_DEVICE_TYPE);
-            writer.println("Quickstart device id  :" + deviceId);
-            writer.println("https://quickstart.internetofthings.ibmcloud.com/#/device/" + deviceId);
-            writer.close();
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    /**
-     * Get the application's IotDevice
-     * 
-     * @return the IotDevice
-     */
-    public IotDevice iotDevice() {
-        return device;
-    }
-
-    /**
-     * Compose a IotDevice eventId for the sensor.
-     * 
-     * @param sensorId
-     *            the sensor id
-     * @param eventId
-     *            the sensor's eventId
-     * @return the device eventId
-     */
-    public String sensorEventId(String sensorId, String eventId) {
-        return sensorId + "." + eventId;
-    }
-
-    /**
-     * Compose a IotpDevice commandId for the sensor
-     * 
-     * @param sensorId
-     *            the sensor id
-     * @param commandId
-     *            the sensor's commandId
-     * @return the device commandId
-     */
-    public String commandId(String sensorId, String commandId) {
-        return sensorId + "." + commandId;
-    }
-}
diff --git a/test/svt/src/main/java/org/apache/edgent/test/svt/utils/sensor/gps/GpsSensor.java b/test/svt/src/main/java/org/apache/edgent/test/svt/utils/sensor/gps/GpsSensor.java
deleted file mode 100644
index fd7e081..0000000
--- a/test/svt/src/main/java/org/apache/edgent/test/svt/utils/sensor/gps/GpsSensor.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.test.svt.utils.sensor.gps;
-
-public class GpsSensor {
-
-    private double latitude;
-    private double longitude;
-    private double altitude;
-    private double speedMetersPerSec; // meters per sec
-    private long time;
-    private double course;
-
-    public GpsSensor(double latitude, double longitude, double altitude, double speedMetersPerSec, long time,
-            double course) {
-
-        this.latitude = latitude;
-        this.longitude = longitude;
-        this.altitude = altitude;
-        this.speedMetersPerSec = speedMetersPerSec;
-        this.time = time;
-        this.course = course;
-    }
-
-    public double getLatitude() {
-        return latitude;
-    }
-
-    public double getLongitude() {
-        return longitude;
-    }
-
-    public double geAltitude() {
-        return altitude;
-    }
-
-    public double getSpeedMetersPerSec() {
-        return speedMetersPerSec;
-    }
-
-    public long getTime() {
-        return time;
-    }
-
-    public double getCourse() {
-        return course;
-    }
-
-    @Override
-    public String toString() {
-        return latitude + ", " + longitude + ", " + altitude + ", " + speedMetersPerSec + ", " + time + ", " + course;
-
-    }
-}
diff --git a/test/svt/src/main/java/org/apache/edgent/test/svt/utils/sensor/gps/SimulatedGeofence.java b/test/svt/src/main/java/org/apache/edgent/test/svt/utils/sensor/gps/SimulatedGeofence.java
deleted file mode 100644
index d38cb64..0000000
--- a/test/svt/src/main/java/org/apache/edgent/test/svt/utils/sensor/gps/SimulatedGeofence.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.edgent.test.svt.utils.sensor.gps;
-
-public class SimulatedGeofence {
-    protected static double GEOFENCE_LATITUDE_MAX = 37.21;
-    protected static double GEOFENCE_LATITUDE_MIN = 37.0;
-    protected static double GEOFENCE_LONGITUDE_MAX = -121.75;
-    protected static double GEOFENCE_LONGITUDE_MIN = -122.0;
-
-    // Simple Geofence test
-    public static boolean outsideGeofence(double latitude, double longitude) {
-
-        if (latitude < GEOFENCE_LATITUDE_MIN || latitude > GEOFENCE_LATITUDE_MAX || longitude < GEOFENCE_LONGITUDE_MIN
-                || longitude > GEOFENCE_LONGITUDE_MAX)
-            return true;
-        else
-            return false;
-    }
-}
diff --git a/test/svt/src/main/java/org/apache/edgent/test/svt/utils/sensor/gps/SimulatedGpsSensor.java b/test/svt/src/main/java/org/apache/edgent/test/svt/utils/sensor/gps/SimulatedGpsSensor.java
deleted file mode 100644
index 5d4c2aa..0000000
--- a/test/svt/src/main/java/org/apache/edgent/test/svt/utils/sensor/gps/SimulatedGpsSensor.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
- */
-package org.apache.edgent.test.svt.utils.sensor.gps;
-
-public class SimulatedGpsSensor {
-    private int currentIndex;
-    private int simulatedSec;
-    private int requestedIterations = -1; // -1 means loop through gpsDataArray
-                                          // forever
-    private int currentIteration = 0;
-
-    public SimulatedGpsSensor() {
-        this.currentIndex = -1;
-        this.simulatedSec = 1;
-    }
-
-    // TODO: Replace hard-coded data to reading in GPS data from file
-    // GPS data from IBM Silicon Valley Lab to IBM Almaden Research and back to
-    // IBM SVL
-    private static double[][] gpsDataArray = { { 37.195647, -121.748087 }, // IBM
-                                                                           // Silicon
-                                                                           // Valley
-                                                                           // Lab
-                                                                           // 555
-                                                                           // Bailey
-                                                                           // Ave
-            { 37.18110679999999, -121.7865003 }, // Calero Reservoir McKean
-            { 37.19926299999999, -121.82234399999999 }, // Santa Clara Horsemen
-                                                        // Association 20350
-                                                        // McKean
-            { 37.198632, -121.82234399999999 }, // Forestry & Fire Protection
-                                                // 20255 McKean
-            { 37.19875469999999, -121.82320830000003 }, // St. Anthony Church
-                                                        // 20101 McKean
-            { 37.2004004, -121.82578030000002 }, // Challenger School 19950
-                                                 // McKean
-            { 37.199576, -121.82468900000003 }, // Firehouse No.28 19911 McKean
-                                                // Rd
-            { 37.211053, -121.806949 }, // IBM Almaden Research Harry Road
-            // then go back the reverse direction
-            { 37.199576, -121.82468900000003 }, // Firehouse No.28 19911 McKean
-                                                // Rd
-            { 37.2004004, -121.82578030000002 }, // Challenger School 19950
-                                                 // McKean
-            { 37.19875469999999, -121.82320830000003 }, // St. Anthony Church
-                                                        // 20101 McKean
-            { 37.198632, -121.82234399999999 }, // Forestry & Fire Protection
-                                                // 20255 McKean
-            { 37.19926299999999, -121.82234399999999 }, // Santa Clara Horsemen
-                                                        // Association 20350
-                                                        // McKean
-            { 37.18110679999999, -121.7865003 }, // Calero Reservoir McKean
-            { 37.195647, -121.748087 }, // IBM Silicon Valley Lab 555 Bailey Ave
-    };
-
-    // TODO Re-write kluge code to read from a file
-    // Returns a GpsSensor using the hard-coded list, then repeats through the
-    // list
-    // forever when requestedIterations = -1, or until iterations is reached.
-    public GpsSensor nextGps() {
-
-        GpsSensor result = null;
-        if (requestedIterations == -1 || currentIteration < requestedIterations) {
-            simulatedSec++;
-
-            // Determine the index to use for generating the next GPS coordinate
-            // If currentIndex is already at the end of the array, then set
-            // currentIndex to start over at the array beginning at index 0
-            // Otherwise, increment currentIndex
-            if (currentIndex >= gpsDataArray.length - 1) {
-                currentIndex = 0;
-                currentIteration++;
-            } else
-                currentIndex++;
-
-            // hardcode other data (altitude, course, time, speed, etc.) and at
-            // index 5 for hard braking and acceleration speed
-            if (currentIndex == 5)
-                result = new GpsSensor(gpsDataArray[currentIndex][0], gpsDataArray[currentIndex][1], 32.1, 42.4,
-                        simulatedSec, 38.2);
-            else
-                result = new GpsSensor(gpsDataArray[currentIndex][0], gpsDataArray[currentIndex][1], 20.1, 29.0,
-                        simulatedSec, 28.2);
-
-        }
-        return result;
-    }
-}
diff --git a/toolchains-travis.xml b/toolchains-travis.xml
new file mode 100644
index 0000000..49dc20e
--- /dev/null
+++ b/toolchains-travis.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<toolchains>
+  <!-- Paths taken from:
+      https://github.com/travis-ci/travis-cookbooks/blob/4f2272ce76c853c6e33cb4ff876c32a4341754f6/ci_environment/java/templates/ubuntu/jdk_switcher.sh.erb
+  -->
+  <toolchain>
+    <type>jdk</type>
+    <provides>
+      <version>1.8</version>
+      <vendor>oracle</vendor>
+    </provides>
+    <configuration>
+      <jdkHome>/usr/lib/jvm/java-8-oracle</jdkHome>
+    </configuration>
+  </toolchain>
+  <toolchain>
+    <type>jdk</type>
+    <provides>
+      <version>1.7</version>
+      <vendor>oracle</vendor>
+    </provides>
+    <configuration>
+      <jdkHome>/usr/lib/jvm/java-7-oracle</jdkHome>
+    </configuration>
+  </toolchain>
+</toolchains>
\ No newline at end of file
diff --git a/utils/.classpath b/utils/.classpath
deleted file mode 100644
index 1539f57..0000000
--- a/utils/.classpath
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="metrics/src/main/java"/>
-	<classpathentry kind="src" path="metrics/src/test/java"/>
-	<classpathentry kind="src" path="streamscope/src/main/java"/>
-	<classpathentry kind="src" path="streamscope/src/test/java"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/api"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/ext"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/utils/.gitignore b/utils/.gitignore
deleted file mode 100644
index 948fe44..0000000
--- a/utils/.gitignore
+++ /dev/null
@@ -1,5 +0,0 @@
-/classes/
-**/test.classes/
-**/classes/
-**/unittests/
-/bin/
diff --git a/utils/.project b/utils/.project
deleted file mode 100644
index 22e7562..0000000
--- a/utils/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>utils</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/utils/metrics/build.gradle b/utils/metrics/build.gradle
deleted file mode 100644
index 98c37aa..0000000
--- a/utils/metrics/build.gradle
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-dependencies {
-  addTargetDirProjectJarDependency 'compile', ':api:topology'
-  addTargetDirCoreExtJarDependencies 'compile'
-
-  // N.B. root project adds test common dependencies
-}
-
-addCompileTestDependencies ':api:topology'
diff --git a/utils/metrics/pom.xml b/utils/metrics/pom.xml
new file mode 100644
index 0000000..25d8e6b
--- /dev/null
+++ b/utils/metrics/pom.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-utils</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-utils-metrics</artifactId>
+
+  <name>Apache Edgent (Java 8): Utils: Metrics</name>
+
+  <properties>
+    <remote-resources-maven-plugin.remote-resources.dir>../../src/main/ibm-remote-resources</remote-resources-maven-plugin.remote-resources.dir>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+
+    <!-- TODO: This is only required because of a dependency to TopologyAbstractTest -> Would suggest to move test-util stutt into a dedicated test-utils artifact -->
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/utils/metrics/src/test/java/org/apache/edgent/test/metrics/MetricsEverywhereTest.java b/utils/metrics/src/test/java/org/apache/edgent/test/metrics/MetricsEverywhereTest.java
index 7411a2b..b051173 100644
--- a/utils/metrics/src/test/java/org/apache/edgent/test/metrics/MetricsEverywhereTest.java
+++ b/utils/metrics/src/test/java/org/apache/edgent/test/metrics/MetricsEverywhereTest.java
@@ -219,7 +219,7 @@
     /**
      * Test Peek. This will only work with an embedded setup.
      * 
-     * @throws Exception
+     * @throws Exception on failure
      */
     @Test
     public void metricsEverywherePeek() throws Exception {
diff --git a/utils/pom.xml b/utils/pom.xml
new file mode 100644
index 0000000..bc7487e
--- /dev/null
+++ b/utils/pom.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-parent</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-utils</artifactId>
+  <packaging>pom</packaging>
+
+  <name>Apache Edgent (Java 8): Utils</name>
+
+  <modules>
+    <module>metrics</module>
+    <module>streamscope</module>
+  </modules>
+
+</project>
diff --git a/utils/streamscope/build.gradle b/utils/streamscope/build.gradle
deleted file mode 100644
index 4276e03..0000000
--- a/utils/streamscope/build.gradle
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-dependencies {
-  addTargetDirProjectJarDependency 'compile', ':api:topology'
-  addTargetDirCoreExtJarDependencies 'compile'
-
-  // N.B. root project adds test common dependencies
-}
-
-addCompileTestDependencies ':api:topology'
-
-test {
-  // this project lacks tests and this task fails if attempted 
-  enabled = false
-}
diff --git a/utils/streamscope/pom.xml b/utils/streamscope/pom.xml
new file mode 100644
index 0000000..913213c
--- /dev/null
+++ b/utils/streamscope/pom.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.edgent</groupId>
+    <artifactId>edgent-utils</artifactId>
+    <version>1.2.0</version>
+  </parent>
+
+  <artifactId>edgent-utils-streamscope</artifactId>
+
+  <name>Apache Edgent (Java 8): Utils: Streamscope</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+    </dependency>
+
+    <!-- TODO: This is only required because of a dependency to TopologyAbstractTest -> Would suggest to move test-util stutt into a dedicated test-utils artifact -->
+    <dependency>
+      <groupId>org.apache.edgent</groupId>
+      <artifactId>edgent-api-topology</artifactId>
+      <version>1.2.0</version>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+</project>