Add Polymer3 to third_party.
Change-Id: I1d63e06e68f40fcae14d8a6f4937d6f1d0c338a9
Reviewed-on: https://chromium-review.googlesource.com/1060344
Reviewed-by: Annie Sullivan <sullivan@chromium.org>
Reviewed-by: David Tu <dtu@chromium.org>
Commit-Queue: Ben Hayden <benjhayden@chromium.org>
diff --git a/third_party/polymer3/LICENSE.polymer b/third_party/polymer3/LICENSE.polymer
new file mode 100644
index 0000000..87c683b
--- /dev/null
+++ b/third_party/polymer3/LICENSE.polymer
@@ -0,0 +1,27 @@
+// Copyright (c) 2017 The Polymer Authors. 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 Google Inc. 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.
diff --git a/third_party/polymer3/README.chromium b/third_party/polymer3/README.chromium
new file mode 100644
index 0000000..9e9897b
--- /dev/null
+++ b/third_party/polymer3/README.chromium
@@ -0,0 +1,24 @@
+Name: Polymer
+Short Name: polymer
+URL: http://www.polymer-project.org
+Version: 3.0.0
+Revision: (Run `bower install` and see bower_components/polymer/.bower.json)
+License: BSD
+License File: LICENSE.polymer
+Security Critical: no
+
+Description:
+This directory contains a subset of the components provided by the
+Polymer project. See bower.json for a full list of components.
+
+The license can be found in bower_components/polymer/LICENSE.txt.
+
+The source git repositories can be found at:
+https://github.com/Polymer/<component>
+
+Note on Bower:
+Install bower using `npm install -g bower`.
+Install new bower components using `bower install --save $COMPONENT_NAME`.
+
+Local Modifications:
+None
diff --git a/third_party/polymer3/bower.json b/third_party/polymer3/bower.json
new file mode 100644
index 0000000..b69a892
--- /dev/null
+++ b/third_party/polymer3/bower.json
@@ -0,0 +1,7 @@
+{
+ "name": "catapult",
+ "private": true,
+ "dependencies": {
+ "polymer": "Polymer/polymer#^3.0.0"
+ }
+}
diff --git a/third_party/polymer3/bower_components/polymer/.bower.json b/third_party/polymer3/bower_components/polymer/.bower.json
new file mode 100644
index 0000000..739fc88
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/.bower.json
@@ -0,0 +1,14 @@
+{
+ "name": "polymer",
+ "homepage": "https://github.com/Polymer/polymer",
+ "version": "3.0.2",
+ "_release": "3.0.2",
+ "_resolution": {
+ "type": "version",
+ "tag": "v3.0.2",
+ "commit": "1476ce71c3edae89274f7d2db72a0f0551b28cdd"
+ },
+ "_source": "https://github.com/Polymer/polymer.git",
+ "_target": "^3.0.0",
+ "_originalSource": "Polymer/polymer"
+}
\ No newline at end of file
diff --git a/third_party/polymer3/bower_components/polymer/.eslintrc.json b/third_party/polymer3/bower_components/polymer/.eslintrc.json
new file mode 100644
index 0000000..77b19fd
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/.eslintrc.json
@@ -0,0 +1,45 @@
+{
+ "extends": "eslint:recommended",
+ "parser": "babel-eslint",
+ "parserOptions": {
+ "ecmaVersion": 6,
+ "sourceType": "module"
+ },
+ "rules": {
+ "no-console": "off",
+ "no-var": "error",
+ "semi": "error",
+ "strict": "error",
+ "valid-jsdoc": ["error", {
+ "requireReturn": false,
+ "prefer": {
+ "arg": "param",
+ "argument": "param",
+ "returns": "return"
+ },
+ "preferType": {
+ "Boolean": "boolean",
+ "Number": "number",
+ "String": "string",
+ "object": "Object",
+ "array": "Array"
+ }
+ }],
+ "no-useless-escape": "off"
+ },
+ "env": {
+ "browser": true,
+ "es6": true
+ },
+ "plugins": [
+ "html"
+ ],
+ "globals": {
+ "customElements": true,
+ "HTMLImports": true,
+ "Polymer": true,
+ "ShadyDOM": true,
+ "ShadyCSS": true,
+ "JSCompiler_renameProperty": true
+ }
+}
diff --git a/third_party/polymer3/bower_components/polymer/.gitattributes b/third_party/polymer3/bower_components/polymer/.gitattributes
new file mode 100644
index 0000000..176a458
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/.gitattributes
@@ -0,0 +1 @@
+* text=auto
diff --git a/third_party/polymer3/bower_components/polymer/.github/CODEOWNERS b/third_party/polymer3/bower_components/polymer/.github/CODEOWNERS
new file mode 100644
index 0000000..4046195
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+# Code owners for Polymer
+* @sorvell @kevinpschaaf @TimvdLippe @azakus
\ No newline at end of file
diff --git a/third_party/polymer3/bower_components/polymer/.github/ISSUE_TEMPLATE.md b/third_party/polymer3/bower_components/polymer/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 0000000..ffe1bc4
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,50 @@
+<!--
+If you are asking a question rather than filing a bug, try one of these instead:
+- StackOverflow (https://stackoverflow.com/questions/tagged/polymer)
+- Polymer Slack Channel (https://bit.ly/polymerslack)
+- Mailing List (https://groups.google.com/forum/#!forum/polymer-dev)
+-->
+<!-- Instructions For Filing a Bug: https://github.com/Polymer/polymer/blob/master/CONTRIBUTING.md#filing-bugs -->
+### Description
+<!-- Example: Error thrown when calling `appendChild` on Polymer element -->
+
+#### Live Demo
+<!-- jsBin starting point (fork and edit) -->
+https://jsbin.com/luhaxab/edit
+<!-- glitch.me starting point (remix and edit -- must be logged in to persist!) -->
+https://glitch.com/edit/#!/polymer-repro?path=my-element.html:2:0
+<!-- ...or provide your own repro URL -->
+
+#### Steps to Reproduce
+<!--
+Example:
+
+1. Create `my-element`
+2. Append `my-element` to document.body
+3. Create `div`.
+4. Append `div` to `my-element`
+-->
+
+
+#### Expected Results
+<!-- Example: No error is throw -->
+
+#### Actual Results
+<!-- Example: Error is thrown -->
+
+### Browsers Affected
+<!-- Check all that apply -->
+- [ ] Chrome
+- [ ] Firefox
+- [ ] Edge
+- [ ] Safari 9
+- [ ] Safari 8
+- [ ] IE 11
+
+### Versions
+<!--
+`Polymer.version` will show the version for Polymer
+`bower ls` or `npm ls` will show the version of webcomponents.js or webcomponents-lite.js
+-->
+- Polymer: vX.X.X
+- webcomponents: vX.X.X
diff --git a/third_party/polymer3/bower_components/polymer/.github/PULL_REQUEST_TEMPLATE.md b/third_party/polymer3/bower_components/polymer/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 0000000..94d4331
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,3 @@
+<!-- Instructions: https://github.com/Polymer/polymer/blob/master/CONTRIBUTING.md#contributing-pull-requests -->
+### Reference Issue
+<!-- Example: Fixes #1234 -->
diff --git a/third_party/polymer3/bower_components/polymer/.gitignore b/third_party/polymer3/bower_components/polymer/.gitignore
new file mode 100644
index 0000000..d3d42de
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/.gitignore
@@ -0,0 +1,17 @@
+# dependencies
+bower_components
+node_modules
+
+# compiled output
+dist
+
+# IDEs
+.idea
+.vscode
+
+# misc
+.DS_Store
+npm-debug.log
+
+# Analyzer output used in the docs
+analysis.json
diff --git a/third_party/polymer3/bower_components/polymer/.npmignore b/third_party/polymer3/bower_components/polymer/.npmignore
new file mode 100644
index 0000000..2f38c9a
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/.npmignore
@@ -0,0 +1,4 @@
+test/
+util/
+img/
+\..*
diff --git a/third_party/polymer3/bower_components/polymer/.travis.yml b/third_party/polymer3/bower_components/polymer/.travis.yml
new file mode 100644
index 0000000..7c7acc8
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/.travis.yml
@@ -0,0 +1,26 @@
+language: node_js
+sudo: false
+dist: trusty
+node_js: '9'
+addons:
+ firefox: latest
+ chrome: stable
+cache:
+ directories:
+ - node_modules
+before_script:
+- npm install -g gulp-cli@1
+- gulp lint-eslint
+# TODO(dfreedm): re-enable after making update-types work
+#- >-
+# npm run update-types && git diff --exit-code || (echo -e
+# '\n\033[31mERROR:\033[0m Typings are stale. Please run "npm run
+# update-types".' && false)
+script:
+- node ./node_modules/.bin/polymer test --npm --module-resolution=node -l chrome
+- node ./node_modules/.bin/polymer test --npm --module-resolution=node -l firefox
+- if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then travis_wait 30 ./util/travis-sauce-test.sh; fi
+env:
+ global:
+ - secure: bfF/o1ewpOxDNqTzWfvlwgRgGfP8OXhSQLLdEwZ6izO9tckMJuSNghk3qBXCEQJwTcUEyXP6EqfzIrRAvDXPa0H3OoinbrooDyV2wIDaVRK++WR2iZIqzqo3hGOdzm4tdrGJZe5av5Rk661Hls8aPfLbjdzcGuYXi8B4wZq2xMI=
+ - secure: jBrKtQBdoL2dsXi9BQpw5tMkYZOsQAy2iSB+0xPOxhPI8EbXKnm8OhWQDEJ5TdduLWUxLLc12IJwjBy9ocLlC1ZvzgOXNfqOUkLD03qSPnyT/LomTXeP4XuojUAemc/w1MHd61nFz4YJaO8cQ+yfy6GOX2susabW+Y80mnIeGJk=
diff --git a/third_party/polymer3/bower_components/polymer/CHANGELOG.md b/third_party/polymer3/bower_components/polymer/CHANGELOG.md
new file mode 100644
index 0000000..fb53b5a
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/CHANGELOG.md
@@ -0,0 +1,5894 @@
+# Change Log
+
+## [v3.0.1](https://github.com/Polymer/polymer/tree/v3.0.1) (2018-05-09)
+- [ci skip] update changelog ([commit](https://github.com/Polymer/polymer/commit/3a4b8b89))
+
+- Remove importHref from 3.0 ([commit](https://github.com/Polymer/polymer/commit/fd416a21))
+
+## [v3.0.0](https://github.com/Polymer/polymer/tree/v3.0.0) (2018-05-08)
+- use released versions of shadycss and webcomponentsjs ([commit](https://github.com/Polymer/polymer/commit/8f79ec40))
+
+- Bump dependencies ([commit](https://github.com/Polymer/polymer/commit/8894e22b))
+
+- Run Chrome & FF serially to try and help flakiness ([commit](https://github.com/Polymer/polymer/commit/95740463))
+
+- Fix lint warning ([commit](https://github.com/Polymer/polymer/commit/ecf36f8a))
+
+- Bump to cli 1.7.0 ([commit](https://github.com/Polymer/polymer/commit/ccb29d27))
+
+- Removing support for returning strings from template getter. (Per previous documented deprecation: https://www.polymer-project.org/2.0/docs/devguide/dom-template#templateobject) ([commit](https://github.com/Polymer/polymer/commit/ba4491d5))
+
+- Fix typos and nits ([commit](https://github.com/Polymer/polymer/commit/c54ff70a))
+
+- Update to Gulp 4 ([commit](https://github.com/Polymer/polymer/commit/4e31768c))
+
+- Add serve command to package.json and update package-lock.json ([commit](https://github.com/Polymer/polymer/commit/eb72d5aa))
+
+- Fix for browsers that don't have input.labels. ([commit](https://github.com/Polymer/polymer/commit/036e4f66))
+
+- Tweak introductory note, fix webpack capitalization ([commit](https://github.com/Polymer/polymer/commit/b823620e))
+
+- gestures: Avoid spreading non-iterable in older browsers ([commit](https://github.com/Polymer/polymer/commit/2ce4f700))
+
+- wip ([commit](https://github.com/Polymer/polymer/commit/f4534c6a))
+
+- Readme: very small tweaks ([commit](https://github.com/Polymer/polymer/commit/d896cdd0))
+
+- Tweak wording. ([commit](https://github.com/Polymer/polymer/commit/fb7630c3))
+
+- Fix link ([commit](https://github.com/Polymer/polymer/commit/fc0ce189))
+
+- Re-order sections ([commit](https://github.com/Polymer/polymer/commit/ee6a67ee))
+
+- Fix LitElement typo ([commit](https://github.com/Polymer/polymer/commit/928c47fc))
+
+- Depend on polymer-cli rather than wct ([commit](https://github.com/Polymer/polymer/commit/503f5631))
+
+- Minor tweaks ([commit](https://github.com/Polymer/polymer/commit/e924ba86))
+
+- Update README for 3.x ([commit](https://github.com/Polymer/polymer/commit/956bba73))
+
+- Update Edge testing versions. ([commit](https://github.com/Polymer/polymer/commit/445c979b))
+
+- Exclude all Edge versions from keyframe/font tests. ([commit](https://github.com/Polymer/polymer/commit/85278860))
+
+- Update wcjs version. ([commit](https://github.com/Polymer/polymer/commit/4805e31f))
+
+- Add .npmignore file (#5215) ([commit](https://github.com/Polymer/polymer/commit/b3c36df7))
+
+- Use node 9 ([commit](https://github.com/Polymer/polymer/commit/0bb5d7c5))
+
+- Use module flags for wct ([commit](https://github.com/Polymer/polymer/commit/8abf2ec9))
+
+- Use babel parser for aslant for dynamic import. ([commit](https://github.com/Polymer/polymer/commit/bddeff4a))
+
+- Fix lint errors. ([commit](https://github.com/Polymer/polymer/commit/dea23515))
+
+- 3.0.0-pre.13 ([commit](https://github.com/Polymer/polymer/commit/da2d66dc))
+
+- [package.json] Remove version script ([commit](https://github.com/Polymer/polymer/commit/e88c1eef))
+
+- Update dependencies ([commit](https://github.com/Polymer/polymer/commit/1ed2b310))
+
+- Fix test typo on Chrome ([commit](https://github.com/Polymer/polymer/commit/a11febe7))
+
+- Fixes IE11 test issues ([commit](https://github.com/Polymer/polymer/commit/8b5803c2))
+
+- Fixes styling tests related to using HTML Imports ([commit](https://github.com/Polymer/polymer/commit/26747422))
+
+- Remove crufty global (fixes globals.html test) ([commit](https://github.com/Polymer/polymer/commit/676f5f3d))
+
+- Update to webcomponents 2.0.0 and webcomponents-bundle.js ([commit](https://github.com/Polymer/polymer/commit/a4d80d09))
+
+- Fix meaningful whitespace in test assertion ([commit](https://github.com/Polymer/polymer/commit/bff03b2d))
+
+- Fix latent mistake using old SD API ([commit](https://github.com/Polymer/polymer/commit/3f24f71d))
+
+- Add global for wct callback when amd compiling ([commit](https://github.com/Polymer/polymer/commit/7f9de46c))
+
+- Eliminate pre-module code from resolveUrl tests ([commit](https://github.com/Polymer/polymer/commit/a93f81f1))
+
+- Improve documentation and legibility. ([commit](https://github.com/Polymer/polymer/commit/ab103dc1))
+
+- Add some global whitelists ([commit](https://github.com/Polymer/polymer/commit/d6821e45))
+
+- Fix references to js files instead of html files ([commit](https://github.com/Polymer/polymer/commit/dfcaadb2))
+
+- Fix glob patterns for eslint ([commit](https://github.com/Polymer/polymer/commit/206cf724))
+
+- Fix ESLint warnings ([commit](https://github.com/Polymer/polymer/commit/6d240138))
+
+- Eliminate more canonical path usage ([commit](https://github.com/Polymer/polymer/commit/1761c79b))
+
+- Eliminate canonical path to wcjs ([commit](https://github.com/Polymer/polymer/commit/4b7cd869))
+
+- Remove extra polymer-legacy.js imports ([commit](https://github.com/Polymer/polymer/commit/f39aaa8c))
+
+- Clean up Polymer fn import ([commit](https://github.com/Polymer/polymer/commit/8069dff4))
+
+- Add WCT config used by all tests ([commit](https://github.com/Polymer/polymer/commit/f1266845))
+
+- Clean up exports ([commit](https://github.com/Polymer/polymer/commit/0b75920f))
+
+- Allow Polymer fn's call to Class to be overridden. ([commit](https://github.com/Polymer/polymer/commit/65d73f17))
+
+- add sill-relevant, deleted tests back in ([commit](https://github.com/Polymer/polymer/commit/180a92ff))
+
+- manually change inter-package dep imports from paths to names ([commit](https://github.com/Polymer/polymer/commit/d913614d))
+
+- manually add assetpath (import.meta.url) for tests that require it ([commit](https://github.com/Polymer/polymer/commit/0c850659))
+
+- move behavior definition to before usage ([commit](https://github.com/Polymer/polymer/commit/09b11fa4))
+
+- define omitted class declaration ([commit](https://github.com/Polymer/polymer/commit/ec36165e))
+
+- remove < and replace with < for innerHTML ([commit](https://github.com/Polymer/polymer/commit/5ce0d24d))
+
+- fixed typo causing test to fail ([commit](https://github.com/Polymer/polymer/commit/0caa7dab))
+
+- fix missing dom-module in modulization ([commit](https://github.com/Polymer/polymer/commit/6c7c770c))
+
+- revert module wait ([commit](https://github.com/Polymer/polymer/commit/12a650b1))
+
+- wait for elements in other modules to be defined ([commit](https://github.com/Polymer/polymer/commit/f0376406))
+
+- no more undefined.hasShadow ([commit](https://github.com/Polymer/polymer/commit/0985652e))
+
+- removed link rel import type css tests ([commit](https://github.com/Polymer/polymer/commit/57d4190c))
+
+- delete debugger ([commit](https://github.com/Polymer/polymer/commit/6905dd10))
+
+- skip link rel import type css tests on native imports ([commit](https://github.com/Polymer/polymer/commit/811ee301))
+
+- add missing css html import ([commit](https://github.com/Polymer/polymer/commit/a52148a3))
+
+- remove importHref tests ([commit](https://github.com/Polymer/polymer/commit/a84ad782))
+
+- Import Polymer function in tests from legacy/polymer-fn.js ([commit](https://github.com/Polymer/polymer/commit/232b0042))
+
+- Export Polymer function from polymer-legacy.js ([commit](https://github.com/Polymer/polymer/commit/69f488b2))
+
+- Add new wct deps. ([commit](https://github.com/Polymer/polymer/commit/a4bedbfd))
+
+- Fixup a few places where comments were misplaced. ([commit](https://github.com/Polymer/polymer/commit/ac2fa81f))
+
+- Fixup license comments. ([commit](https://github.com/Polymer/polymer/commit/f664f251))
+
+- Update package.json from modulizer's output, set polymer-element.js as main. ([commit](https://github.com/Polymer/polymer/commit/5abf4728))
+
+- Replace sources with modulizer output. ([commit](https://github.com/Polymer/polymer/commit/cf3b7215))
+
+- Rename HTML files to .js files to trick git's rename detection. ([commit](https://github.com/Polymer/polymer/commit/527d2cdd))
+
+- Delete typings for now. ([commit](https://github.com/Polymer/polymer/commit/03d85982))
+
+- Add reasoning for suppress missingProperties ([commit](https://github.com/Polymer/polymer/commit/61ca60e4))
+
+- Don't rely on dom-module synchronously until WCR. ([commit](https://github.com/Polymer/polymer/commit/e64bd0ba))
+
+- Avoid closure warnings. ([commit](https://github.com/Polymer/polymer/commit/412bb1e0))
+
+- Add ability to define importMeta on legacy elements. Fixes #5163 ([commit](https://github.com/Polymer/polymer/commit/616f6662))
+
+- Allow legacy element property definitions with only a type. Fixes #5173 ([commit](https://github.com/Polymer/polymer/commit/d321c6c9))
+
+- Update docs. ([commit](https://github.com/Polymer/polymer/commit/c8c9e24d))
+
+- Use Polymer.ResolveUrl.pathFromUrl ([commit](https://github.com/Polymer/polymer/commit/d9d3e439))
+
+- Fix test under shadydom. Slight logic refactor. ([commit](https://github.com/Polymer/polymer/commit/2128ebe2))
+
+- Fix lint warning ([commit](https://github.com/Polymer/polymer/commit/fb741ee3))
+
+- Add importMeta getter to derive importPath from modules. Fixes #5163 ([commit](https://github.com/Polymer/polymer/commit/f7672da9))
+
+- Reference dependencies as siblings in tests. ([commit](https://github.com/Polymer/polymer/commit/2561d868))
+
+- Update types ([commit](https://github.com/Polymer/polymer/commit/23ba7dee))
+
+- Add note about performance vs correctness ([commit](https://github.com/Polymer/polymer/commit/89ab7385))
+
+- Update types. ([commit](https://github.com/Polymer/polymer/commit/5357d64a))
+
+- Lint clean. ([commit](https://github.com/Polymer/polymer/commit/f78b0518))
+
+- Pass through fourth namespace param on attributeChangedCallback. ([commit](https://github.com/Polymer/polymer/commit/91d4aeba))
+
+- Add a @const annotation to help the Closure Compiler understand that Polymer.Debouncer is the name of a type. ([commit](https://github.com/Polymer/polymer/commit/e5a5725d))
+
+- [ci skip] update changelog ([commit](https://github.com/Polymer/polymer/commit/92d282a9))
+
+- Update docs and types ([commit](https://github.com/Polymer/polymer/commit/211c223f))
+
+- Update perf test to use strict-binding-parser ([commit](https://github.com/Polymer/polymer/commit/f53e9e8a))
+
+- Correct import paths ([commit](https://github.com/Polymer/polymer/commit/ab93ab08))
+
+- Only store method once for dynamic functions ([commit](https://github.com/Polymer/polymer/commit/0f0ccdad))
+
+- Move strict-binding-parser to lib/mixins ([commit](https://github.com/Polymer/polymer/commit/a4d4eb9a))
+
+- Rename to StrictBindingParser ([commit](https://github.com/Polymer/polymer/commit/19d4b8cb))
+
+- Fix linter errors ([commit](https://github.com/Polymer/polymer/commit/d8cf449e))
+
+- Extract to a mixin ([commit](https://github.com/Polymer/polymer/commit/57a14236))
+
+- Add missing dependency to bower.json ([commit](https://github.com/Polymer/polymer/commit/333a4664))
+
+- Fix linter warning ([commit](https://github.com/Polymer/polymer/commit/14fac019))
+
+- Add documentation ([commit](https://github.com/Polymer/polymer/commit/df0ee354))
+
+- Add performance test for binding-expressions ([commit](https://github.com/Polymer/polymer/commit/42f7d785))
+
+- Rewrite parser to use switch-case instead of functions ([commit](https://github.com/Polymer/polymer/commit/423074d1))
+
+- Remove escaping from bindings ([commit](https://github.com/Polymer/polymer/commit/8cd49479))
+
+- Fix linter warning ([commit](https://github.com/Polymer/polymer/commit/8a5525b0))
+
+- Refactor to be functional and add more tests ([commit](https://github.com/Polymer/polymer/commit/7eb1a627))
+
+- Fix linter warnings ([commit](https://github.com/Polymer/polymer/commit/79d05b8a))
+
+- Rewrite expression parser to state machine ([commit](https://github.com/Polymer/polymer/commit/13b834df))
+
+## [v2.6.0](https://github.com/Polymer/polymer/tree/v2.6.0) (2018-03-22)
+- Use function instead of Set ([commit](https://github.com/Polymer/polymer/commit/33d2e1a8))
+
+- [ci skip] Fix typo ([commit](https://github.com/Polymer/polymer/commit/0d1b1c2e))
+
+- Fix test in shady DOM ([commit](https://github.com/Polymer/polymer/commit/a586b72c))
+
+- Deduplicate style includes ([commit](https://github.com/Polymer/polymer/commit/acfef71d))
+
+- use a clearer test for shadowRoot ([commit](https://github.com/Polymer/polymer/commit/b2fb1cfd))
+
+- Returning null in template should nullify parent template ([commit](https://github.com/Polymer/polymer/commit/2a6c0a2a))
+
+- [ci skip] Add clarifying comment ([commit](https://github.com/Polymer/polymer/commit/0573d483))
+
+- Correct the JSBin version ([commit](https://github.com/Polymer/polymer/commit/cb1ae7d3))
+
+- Put attribute capitalization fix in property-effects ([commit](https://github.com/Polymer/polymer/commit/d45dd575))
+
+- Add note about pre v3 releases ([commit](https://github.com/Polymer/polymer/commit/f9391618))
+
+- Add note for npm package ([commit](https://github.com/Polymer/polymer/commit/8f2cc0d5))
+
+- Add iron-component-page dev-dependency ([commit](https://github.com/Polymer/polymer/commit/d93dd1ce))
+
+- Update several gulp dependencies ([commit](https://github.com/Polymer/polymer/commit/ca57a1f3))
+
+- Update dom5 to 3.0.0 ([commit](https://github.com/Polymer/polymer/commit/d4a0914e))
+
+- Update Google Closure Compiler version and fix cast ([commit](https://github.com/Polymer/polymer/commit/4004c9c4))
+
+- Update types ([commit](https://github.com/Polymer/polymer/commit/bb61a20d))
+
+- Fix several issues in the documentation of dom-* elements ([commit](https://github.com/Polymer/polymer/commit/8e1b3f45))
+
+- Handle `disabled` attribute correctly for tap gesture ([commit](https://github.com/Polymer/polymer/commit/5c0f3e6a))
+
+- add test case for nested label ([commit](https://github.com/Polymer/polymer/commit/c11c99b2))
+
+- Add docs and cleanup matchingLabels ([commit](https://github.com/Polymer/polymer/commit/e1df1662))
+
+- Add tests ([commit](https://github.com/Polymer/polymer/commit/70edf1f8))
+
+- update types ([commit](https://github.com/Polymer/polymer/commit/2d674e75))
+
+- fix tests and add dependency import ([commit](https://github.com/Polymer/polymer/commit/a37ba7e2))
+
+- fix typings ([commit](https://github.com/Polymer/polymer/commit/8f8135b2))
+
+- Ensure DisableUpgradeMixin extends PropertiesMixin ([commit](https://github.com/Polymer/polymer/commit/7e74e363))
+
+- Format comment and remove deduping mixin ([commit](https://github.com/Polymer/polymer/commit/b8c66ded))
+
+- update types ([commit](https://github.com/Polymer/polymer/commit/1fd5f9cf))
+
+- update types ([commit](https://github.com/Polymer/polymer/commit/5bc45ce3))
+
+- Add mixin to automatically detect capitalized HTML attributes ([commit](https://github.com/Polymer/polymer/commit/37fd5ffe))
+
+- Add instructions for locally viewing the source documentation ([commit](https://github.com/Polymer/polymer/commit/206d3610))
+
+- Simplify condition checking in stylesFromModule function ([commit](https://github.com/Polymer/polymer/commit/e6903821))
+
+- Bump type generator and generate new typings. (#5119) ([commit](https://github.com/Polymer/polymer/commit/5c027309))
+
+- dispatchEvent returns boolean (#5117) ([commit](https://github.com/Polymer/polymer/commit/9d86135c))
+
+- Update types ([commit](https://github.com/Polymer/polymer/commit/63e7bbc7))
+
+- Fix license links ([commit](https://github.com/Polymer/polymer/commit/f3939875))
+
+- Fix issue with not genering the Templatizer docs ([commit](https://github.com/Polymer/polymer/commit/55708acf))
+
+- Bump TS type generator to pick up transitive mixin handling. ([commit](https://github.com/Polymer/polymer/commit/c3dad540))
+
+- Remove unnecessary mutableData property from MutableData mixin ([commit](https://github.com/Polymer/polymer/commit/92b83249))
+
+- Update types ([commit](https://github.com/Polymer/polymer/commit/868fba7c))
+
+- Add note to updateStyles regarding updates to CSS mixins ([commit](https://github.com/Polymer/polymer/commit/d458bab3))
+
+- Avoid timing issues with polyfilled Promise ([commit](https://github.com/Polymer/polymer/commit/6b3e007e))
+
+- Revert use of async/await due to lack of build/serve support. ([commit](https://github.com/Polymer/polymer/commit/d4a7a45b))
+
+- Revert types. ([commit](https://github.com/Polymer/polymer/commit/dea90802))
+
+- Update eslint parserOptions to es2017 for async/await support. ([commit](https://github.com/Polymer/polymer/commit/ef579e29))
+
+- Use stronger check for PropertyEffects clients. Fixes #5017 ([commit](https://github.com/Polymer/polymer/commit/e6d558ec))
+
+- Remove unneeded file ([commit](https://github.com/Polymer/polymer/commit/a5393b6d))
+
+- [PropertiesChanged]: allow old data to be gc'd after `_propertiesChanged` ([commit](https://github.com/Polymer/polymer/commit/74907b9a))
+
+- Update package-lock.json ([commit](https://github.com/Polymer/polymer/commit/c58f3e0d))
+
+- Make Travis update-types failure style the same as the elements. ([commit](https://github.com/Polymer/polymer/commit/8189382d))
+
+- Bump TypeScript generator version. ([commit](https://github.com/Polymer/polymer/commit/3e432190))
+
+- Make EventApi.path EventTarget type non-nullable. ([commit](https://github.com/Polymer/polymer/commit/3ede9b51))
+
+- Lint and type fixes ([commit](https://github.com/Polymer/polymer/commit/5607a2d8))
+
+- [PropertiesChanged]: adds _shouldPropertiesChange ([commit](https://github.com/Polymer/polymer/commit/c1885a6a))
+
+- Update docs: templatize() cannot be called multiple times ([commit](https://github.com/Polymer/polymer/commit/27fc21c5))
+
+- [ci skip] update changelog ([commit](https://github.com/Polymer/polymer/commit/65b4df86))
+
+- Update types. ([commit](https://github.com/Polymer/polymer/commit/c3b6236a))
+
+- Fix JSDoc example formatting ([commit](https://github.com/Polymer/polymer/commit/699cd87f))
+
+- Use latest webcomponents polyfill bundle ([commit](https://github.com/Polymer/polymer/commit/8fef6776))
+
+- Fix label tap by checking matched label pairs ([commit](https://github.com/Polymer/polymer/commit/a77d64e5))
+
+- Defer creation related work via `disable-upgrade` ([commit](https://github.com/Polymer/polymer/commit/a7eb9754))
+
+- lint fixes ([commit](https://github.com/Polymer/polymer/commit/de0ac5a2))
+
+- Adds `Polymer.DisableUpgradeMixin` ([commit](https://github.com/Polymer/polymer/commit/62ce3148))
+
+## [v2.5.0](https://github.com/Polymer/polymer/tree/v2.5.0) (2018-02-02)
+- Update types ([commit](https://github.com/Polymer/polymer/commit/5fa059fa))
+
+- Update JSDocs to use <dom-repeat> tags ([commit](https://github.com/Polymer/polymer/commit/636abae0))
+
+- Fix type declarations inadvertedtly referencing Polymer.Element. (#5084) ([commit](https://github.com/Polymer/polymer/commit/82cd3dad))
+
+- Use class syntax in <dom-repeat> documentation (#5077) ([commit](https://github.com/Polymer/polymer/commit/97837c7c))
+
+- Add hash/abs URL resolution tests. ([commit](https://github.com/Polymer/polymer/commit/d97373dd))
+
+- Update types. ([commit](https://github.com/Polymer/polymer/commit/892df3f3))
+
+- Add comments about resolveUrl idiosyncrasies. ([commit](https://github.com/Polymer/polymer/commit/a829cbce))
+
+- Revert "Move absolute url logic to element-mixin" ([commit](https://github.com/Polymer/polymer/commit/127bc866))
+
+- Added Polymer.version to polymer-externs (#5079) ([commit](https://github.com/Polymer/polymer/commit/b52ab81d))
+
+- Avoid tracking parentNode since it's unncessary ([commit](https://github.com/Polymer/polymer/commit/1463e3b2))
+
+- Update types. ([commit](https://github.com/Polymer/polymer/commit/2253e0db))
+
+- Fix nit. ([commit](https://github.com/Polymer/polymer/commit/c9208fd6))
+
+- Avoid comment constructor for IE support. ([commit](https://github.com/Polymer/polymer/commit/a39cfd11))
+
+- Disallow non-templates as interpolations in Polymer.html (#5023) ([commit](https://github.com/Polymer/polymer/commit/eeb71600))
+
+- Exclude index.html from type generation. (#5076) ([commit](https://github.com/Polymer/polymer/commit/6fc285c4))
+
+- update types ([commit](https://github.com/Polymer/polymer/commit/5521e43e))
+
+- [element-mixin] Do not create property accessors unless a property effect exists ([commit](https://github.com/Polymer/polymer/commit/4177d9ce))
+
+- Use containers for testing again (#5070) ([commit](https://github.com/Polymer/polymer/commit/5e2990e3))
+
+- Invoke JS compiler rename for properties ([commit](https://github.com/Polymer/polymer/commit/74a4626a))
+
+- Add package-lock.json back ([commit](https://github.com/Polymer/polymer/commit/c90eeb67))
+
+- fix test. ([commit](https://github.com/Polymer/polymer/commit/1c74ecde))
+
+- Enhance robustness by replacing slot with a comment ([commit](https://github.com/Polymer/polymer/commit/b76d81ee))
+
+- Avoid use of element accessors on doc frag to fix IE/Edge. ([commit](https://github.com/Polymer/polymer/commit/ecb1005e))
+
+- Fix linter errors ([commit](https://github.com/Polymer/polymer/commit/5e0bee77))
+
+- Fix issue with observers being called twice ([commit](https://github.com/Polymer/polymer/commit/291e4f56))
+
+- Revert package-lock change ([commit](https://github.com/Polymer/polymer/commit/86ecd982))
+
+- [ci-skip] Update changelog (2.4.0) ([commit](https://github.com/Polymer/polymer/commit/cb88252d))
+
+- Add package-lock.json to .gitignore ([commit](https://github.com/Polymer/polymer/commit/e53db30f))
+
+- Update types ([commit](https://github.com/Polymer/polymer/commit/7a52cda2))
+
+- Add comments re: instanceProps ([commit](https://github.com/Polymer/polymer/commit/cf5f818e))
+
+- Change if-condition to check for arguments.length ([commit](https://github.com/Polymer/polymer/commit/27750109))
+
+- Delete package-lock.json ([commit](https://github.com/Polymer/polymer/commit/e77149e2))
+
+- [ci skip] Fix test case name ([commit](https://github.com/Polymer/polymer/commit/eee609d4))
+
+- Fix issue where el.splice could not clear full array ([commit](https://github.com/Polymer/polymer/commit/a51de9e3))
+
+- Make owner optional as well. ([commit](https://github.com/Polymer/polymer/commit/b52c315e))
+
+- Update package-lock.json ([commit](https://github.com/Polymer/polymer/commit/38c0e443))
+
+- Update typescript types again, after fixing jsdoc. ([commit](https://github.com/Polymer/polymer/commit/3045e4b7))
+
+- Fix lint warnings. ([commit](https://github.com/Polymer/polymer/commit/715cde47))
+
+- Update typescript types. ([commit](https://github.com/Polymer/polymer/commit/c218ae62))
+
+- Ensure path notifications from templatized instances don't throw. Fixes #3422 ([commit](https://github.com/Polymer/polymer/commit/a9f71bd1))
+
+- Allow templatizer to be used without owner or host prop forwarding. Fixes #4458 ([commit](https://github.com/Polymer/polymer/commit/bde5898e))
+
+- Templatize: remove slots when hiding children ([commit](https://github.com/Polymer/polymer/commit/ea0abb95))
+
+- Clarify API docs for PropertyAccessors mixin ([commit](https://github.com/Polymer/polymer/commit/ae58e88b))
+
+## [v2.4.0](https://github.com/Polymer/polymer/tree/v2.4.0) (2018-01-26)
+- Simplify code for <dom-repeat>'s `sort` and `filter` properties ([commit](https://github.com/Polymer/polymer/commit/88cca860))
+
+- fix test for normal escaping ([commit](https://github.com/Polymer/polymer/commit/5fa02aa2))
+
+- Use javascript string escaping in Polymer.html ([commit](https://github.com/Polymer/polymer/commit/4c662141))
+
+- [ci skip] Add CODEOWNERS file (#5061) ([commit](https://github.com/Polymer/polymer/commit/90199f3b))
+
+- Fix incorrect path modification in dom-repeat __handleObservedPaths() (#4983) (#5048) ([commit](https://github.com/Polymer/polymer/commit/4b58f54b))
+
+- Skip certain tests in Edge 16 ([commit](https://github.com/Polymer/polymer/commit/09897d18))
+
+- add Edge 16 testing ([commit](https://github.com/Polymer/polymer/commit/36fa08ae))
+
+- Fix tests (#5050) ([commit](https://github.com/Polymer/polymer/commit/ecd1ba3a))
+
+- Update to latest wct. ([commit](https://github.com/Polymer/polymer/commit/a85ff3fc))
+
+- HTTPS, please ([commit](https://github.com/Polymer/polymer/commit/c868575c))
+
+- Remove unnecessary limit check ([commit](https://github.com/Polymer/polymer/commit/5fb9c559))
+
+- Fix documentation in typescript ([commit](https://github.com/Polymer/polymer/commit/bc95c5ad))
+
+- test(logging): improve _log with single parameter with sinon.spy ([commit](https://github.com/Polymer/polymer/commit/9891f31a))
+
+- Add article "a" ([commit](https://github.com/Polymer/polymer/commit/cefdaa93))
+
+- Update mixinBehaviors annotation. Behaviors don't satisfy PolymerInit. (#5036) ([commit](https://github.com/Polymer/polymer/commit/d7ea2464))
+
+- add correct return type for `querySelectorAll` (#5034) ([commit](https://github.com/Polymer/polymer/commit/6ab5c4a4))
+
+- Gestures: fall back to event.target when composedPath is empty. (#5029) ([commit](https://github.com/Polymer/polymer/commit/98b5aadc))
+
+- add void return type annotations (#5000) ([commit](https://github.com/Polymer/polymer/commit/589684a5))
+
+- Easy script to update closure and typescript typings (#5026) ([commit](https://github.com/Polymer/polymer/commit/60e7121d))
+
+- Prefer jsBin since glitch.me requires signin to not be gc'ed. ([commit](https://github.com/Polymer/polymer/commit/e7722243))
+
+- Note that glitch editing environment is not IE11 friendly. ([commit](https://github.com/Polymer/polymer/commit/06ca708b))
+
+- Add links to glitch.me template using polyserve. Fixes #5016 ([commit](https://github.com/Polymer/polymer/commit/9f2ec5f6))
+
+- Update .travis.yml ([commit](https://github.com/Polymer/polymer/commit/9715ab8f))
+
+- [ci skip] Add comment to aid archeology ([commit](https://github.com/Polymer/polymer/commit/e76a2b90))
+
+- Move absolute url logic to element-mixin ([commit](https://github.com/Polymer/polymer/commit/9c189ac9))
+
+- Use double tabs ([commit](https://github.com/Polymer/polymer/commit/6f7b8608))
+
+- indentation fix ([commit](https://github.com/Polymer/polymer/commit/5dca5cd0))
+
+- Remove trailing spaces and extra lines in CONTRIBUTING.md ([commit](https://github.com/Polymer/polymer/commit/8ed376e6))
+
+- test(logging.html): #5007 make sure _logger called one time ([commit](https://github.com/Polymer/polymer/commit/fe48dfa4))
+
+- _loggertest(logging.html): make seperate test suite for _logger ([commit](https://github.com/Polymer/polymer/commit/bd5821b6))
+
+- test(logging.html): missing semicolon ([commit](https://github.com/Polymer/polymer/commit/df3c3c02))
+
+- test(logging): _log with single parameter #5007 ([commit](https://github.com/Polymer/polymer/commit/818c537d))
+
+- fix(legacy-element-mixin): syntax error in _logger ([commit](https://github.com/Polymer/polymer/commit/e0affe3f))
+
+- fix(legacy-element-mixin): _log with single parameter #5006 ([commit](https://github.com/Polymer/polymer/commit/f4ecbae5))
+
+- Fix settings so that its properly picked up by both gen-ts and modulizer ([commit](https://github.com/Polymer/polymer/commit/0356b2df))
+
+- Unbreak the build by changing back the type ([commit](https://github.com/Polymer/polymer/commit/d5dc2a21))
+
+- Enable gulp generate-typescript on Travis ([commit](https://github.com/Polymer/polymer/commit/764146cd))
+
+- Make sure that Travis fails when there are non-updated generated files ([commit](https://github.com/Polymer/polymer/commit/b2cd4370))
+
+- run `gulp generate-typescript` ([commit](https://github.com/Polymer/polymer/commit/541d1f89))
+
+- fix ArraySplice types to more closely match code ([commit](https://github.com/Polymer/polymer/commit/f6182b34))
+
+- [ProperitesChanged] Fix deserialization (#4996) ([commit](https://github.com/Polymer/polymer/commit/2719a9d6))
+
+- fix(FlattenedNodesObserver): do not fail on node without children ([commit](https://github.com/Polymer/polymer/commit/09bb6cd8))
+
+- Address latest round of comments. ([commit](https://github.com/Polymer/polymer/commit/7b581de9))
+
+- Update PropertyEffects interface name in remap config. ([commit](https://github.com/Polymer/polymer/commit/0ebfc24d))
+
+- Tighten more types for TypeScript and Closure (#4998) ([commit](https://github.com/Polymer/polymer/commit/e8729822))
+
+- Add renameTypes config. ([commit](https://github.com/Polymer/polymer/commit/73666c39))
+
+- New typings. ([commit](https://github.com/Polymer/polymer/commit/a1f33174))
+
+- Bump gen-typescript version. ([commit](https://github.com/Polymer/polymer/commit/266d599a))
+
+- Tighten Closure type annotations. (#4997) ([commit](https://github.com/Polymer/polymer/commit/ee4445f8))
+
+- Mark some FlattenedNodesObserver things private. ([commit](https://github.com/Polymer/polymer/commit/5190a89c))
+
+- Add TypeScript equivalent to Closure ITemplateArray. ([commit](https://github.com/Polymer/polymer/commit/a77310af))
+
+- Fix compilation errors. ([commit](https://github.com/Polymer/polymer/commit/f0e31f2d))
+
+- Use glob patterns instead of RegExps to exclude files. ([commit](https://github.com/Polymer/polymer/commit/8f8e54ca))
+
+- Bump version of gen-typescript-declarations. ([commit](https://github.com/Polymer/polymer/commit/cf11a826))
+
+- Handle case where there are no elements in the template ([commit](https://github.com/Polymer/polymer/commit/2d6b4684))
+
+- Update various Polymer annotations to constrain generated types. ([commit](https://github.com/Polymer/polymer/commit/ffc35e48))
+
+- Fix typo in comment ([commit](https://github.com/Polymer/polymer/commit/ade5e796))
+
+- Fix regression with imported css ([commit](https://github.com/Polymer/polymer/commit/706e6021))
+
+- Bring in latest gen-typescript-declarations updates. ([commit](https://github.com/Polymer/polymer/commit/6a0d214d))
+
+- Apply `listeners` in constructor rather than `ready` ([commit](https://github.com/Polymer/polymer/commit/35e3c54b))
+
+- Replace `disconnectedCallback` stub since this change is breaking. ([commit](https://github.com/Polymer/polymer/commit/c8acc183))
+
+- Minor fixes ([commit](https://github.com/Polymer/polymer/commit/1b514b4f))
+
+- Fix html-tag import path. ([commit](https://github.com/Polymer/polymer/commit/c9be530d))
+
+- Update CHANGELOG. ([commit](https://github.com/Polymer/polymer/commit/3ffb895e))
+
+- Fix import path for html-tag. ([commit](https://github.com/Polymer/polymer/commit/eb309934))
+
+- Add generated TypeScript declarations. ([commit](https://github.com/Polymer/polymer/commit/60450bf4))
+
+- Add script to generate TypeScript declarations. ([commit](https://github.com/Polymer/polymer/commit/1f9be786))
+
+- Annotate klass class as @private. Annotate that dedupingMixin returns T. ([commit](https://github.com/Polymer/polymer/commit/b02c4583))
+
+- fix eslint error for unused var in _setPendingProperty ([commit](https://github.com/Polymer/polymer/commit/a89c9ba0))
+
+- fix closure typing with Polymer.html function ([commit](https://github.com/Polymer/polymer/commit/c519796f))
+
+- re-add AsyncInterface definition, fix comment ([commit](https://github.com/Polymer/polymer/commit/986fb3e9))
+
+- Avoid _setPendingProperty warning due to types not understanding deduping mixin. ([commit](https://github.com/Polymer/polymer/commit/40d47f24))
+
+- [ci skip] Update changelog ([commit](https://github.com/Polymer/polymer/commit/f6cc61bd))
+
+- add test for legacy Polymer({}) elements ([commit](https://github.com/Polymer/polymer/commit/8a1c76cd))
+
+- Rename html-fn to html-tag ([commit](https://github.com/Polymer/polymer/commit/02c06aa3))
+
+- Fix most closure warnings. ([commit](https://github.com/Polymer/polymer/commit/a12934c5))
+
+- Add back disconnectedCallback. ([commit](https://github.com/Polymer/polymer/commit/fa40f205))
+
+- Merge with master ([commit](https://github.com/Polymer/polymer/commit/b158e082))
+
+- Move function out of closure. Add comments. ([commit](https://github.com/Polymer/polymer/commit/ad539fe7))
+
+- [ci skip] TODO for link to docs and comment spellcheck ([commit](https://github.com/Polymer/polymer/commit/5c919850))
+
+- Use values.reduce instead of a temporary array ([commit](https://github.com/Polymer/polymer/commit/be9d6210))
+
+- Add deprecation notice for class.template returning a string ([commit](https://github.com/Polymer/polymer/commit/530a68b4))
+
+- [skip-ci] update comment for Polymer.html ([commit](https://github.com/Polymer/polymer/commit/bdfa5fcb))
+
+- remove null/undefined to empty string ([commit](https://github.com/Polymer/polymer/commit/75d873a0))
+
+- Address feedback ([commit](https://github.com/Polymer/polymer/commit/d5070bbe))
+
+- `html` tag function for generating templates ([commit](https://github.com/Polymer/polymer/commit/1bba3abb))
+
+- Add example for flattened-nodes-observer ([commit](https://github.com/Polymer/polymer/commit/08ad6e37))
+
+- Minor updates based on review. ([commit](https://github.com/Polymer/polymer/commit/ed1454d6))
+
+- Use correct assertation. ([commit](https://github.com/Polymer/polymer/commit/4692510f))
+
+- Add tests for non-JSON literals on object props. ([commit](https://github.com/Polymer/polymer/commit/7d49e803))
+
+- Remove PropertiesElement in favor of PropertiesMixin. ([commit](https://github.com/Polymer/polymer/commit/40f02ea1))
+
+- FIx typo ([commit](https://github.com/Polymer/polymer/commit/8af14800))
+
+- Skip test in old browsers. ([commit](https://github.com/Polymer/polymer/commit/a1bd9a4f))
+
+- Remove `propertyNameForAttribute` since it's never needed. ([commit](https://github.com/Polymer/polymer/commit/8d57a6e9))
+
+- Fix subclassing and simplify. ([commit](https://github.com/Polymer/polymer/commit/e09285db))
+
+- Move property<->attribute case mapping to PropertiesChanged. ([commit](https://github.com/Polymer/polymer/commit/603123e1))
+
+- Allow non-JSON literals when property type is "Object". ([commit](https://github.com/Polymer/polymer/commit/77b17b43))
+
+- Update tests ([commit](https://github.com/Polymer/polymer/commit/82cf96bb))
+
+- [PropertiesMixin] Fix mapping property names from attributes ([commit](https://github.com/Polymer/polymer/commit/feac9328))
+
+- Add test for observing id attribute. ([commit](https://github.com/Polymer/polymer/commit/c56f74f9))
+
+- Cleanup based on review. ([commit](https://github.com/Polymer/polymer/commit/4b9170ab))
+
+- Fix deserializing dates. ([commit](https://github.com/Polymer/polymer/commit/8d24c212))
+
+- Factoring improvements around attribute serialize/deserialize ([commit](https://github.com/Polymer/polymer/commit/a7b46b15))
+
+- Remove crufty comment. ([commit](https://github.com/Polymer/polymer/commit/fb0f90bc))
+
+- Lint fix ([commit](https://github.com/Polymer/polymer/commit/e8c27671))
+
+- Add tests for setting custom `attribute` name ([commit](https://github.com/Polymer/polymer/commit/1e903a94))
+
+- Expose less protected data. ([commit](https://github.com/Polymer/polymer/commit/74fb5151))
+
+- ElementMixin uses PropertiesMixin for ([commit](https://github.com/Polymer/polymer/commit/0fe9434f))
+
+- PropertiesMixin ([commit](https://github.com/Polymer/polymer/commit/3c50f44a))
+
+- PropertyAccessors ([commit](https://github.com/Polymer/polymer/commit/5846d582))
+
+- PropertiesChanged ([commit](https://github.com/Polymer/polymer/commit/05cb5d2c))
+
+- Force literal true` to be set as an attribute with a value of empty string. ([commit](https://github.com/Polymer/polymer/commit/1b501944))
+
+- Better attribute suppport ([commit](https://github.com/Polymer/polymer/commit/c91b9d19))
+
+- fix some formatting and closure linting ([commit](https://github.com/Polymer/polymer/commit/5ae21a08))
+
+- Lint fixes. ([commit](https://github.com/Polymer/polymer/commit/946aad5c))
+
+- Renamed basic element to properties element ([commit](https://github.com/Polymer/polymer/commit/e3e128ba))
+
+- Implement `basic-element` with `properties-changed` ([commit](https://github.com/Polymer/polymer/commit/d26955b4))
+
+- Fix lint issues ([commit](https://github.com/Polymer/polymer/commit/b8fd241a))
+
+- Improve docs and add test for case conversion. ([commit](https://github.com/Polymer/polymer/commit/152f896f))
+
+- Add test to runner. ([commit](https://github.com/Polymer/polymer/commit/dcdb750b))
+
+- Adds `Polymer.BasicElement` ([commit](https://github.com/Polymer/polymer/commit/717a4f41))
+
+- Factor PropertiesChanged out of PropertyAccessors ([commit](https://github.com/Polymer/polymer/commit/aa4f186e))
+
+- Add `accessor` property to properties object ([commit](https://github.com/Polymer/polymer/commit/c7b43f78))
+
+- Factor to treeshake better ([commit](https://github.com/Polymer/polymer/commit/e91b6a75))
+
+## [v2.3.1](https://github.com/Polymer/polymer/tree/v2.3.1) (2017-12-07)
+- Add test that would fail with the "last style" behavior in master ([commit](https://github.com/Polymer/polymer/commit/913dfce6))
+
+- Use padding-top to get correct computed style on older safari ([commit](https://github.com/Polymer/polymer/commit/b7c56173))
+
+- Handle styles that are not direct children of templates correctly ([commit](https://github.com/Polymer/polymer/commit/0b1cd70a))
+
+- [ci skip] update changelog again ([commit](https://github.com/Polymer/polymer/commit/2d739c75))
+
+## [v2.3.0](https://github.com/Polymer/polymer/tree/v2.3.0) (2017-12-05)
+- [ci skip] update changelog ([commit](https://github.com/Polymer/polymer/commit/c727d35d))
+
+## [v2.2.1](https://github.com/Polymer/polymer/tree/v2.2.1) (2017-12-05)
+- [ci skip] commit new version in lib/utils/boot.html when using npm version ([commit](https://github.com/Polymer/polymer/commit/71fbf6ef))
+
+- change PolymerElement extern to var ([commit](https://github.com/Polymer/polymer/commit/5c3d58aa))
+
+- update node devDependencies ([commit](https://github.com/Polymer/polymer/commit/a39f3f41))
+
+- fix lint error ([commit](https://github.com/Polymer/polymer/commit/f242e197))
+
+- Fix :dir selectors with nested custom elements ([commit](https://github.com/Polymer/polymer/commit/3b76e86f))
+
+- Update test to be more descriptive ([commit](https://github.com/Polymer/polymer/commit/86a64b6c))
+
+- Annotate Polymer function with @global. (#4967) ([commit](https://github.com/Polymer/polymer/commit/b124b707))
+
+- make PASSIVE_TOUCH take an argument ([commit](https://github.com/Polymer/polymer/commit/c5407a8b))
+
+- Do not set touchend listeners to passive ([commit](https://github.com/Polymer/polymer/commit/84fa3bf3))
+
+- Add some @function annotations to APIs that are defined by assignment. ([commit](https://github.com/Polymer/polymer/commit/29f2a0e7))
+
+- add return jsdoc to void functions ([commit](https://github.com/Polymer/polymer/commit/a8105e55))
+
+- Update CONTRIBUTING.md ([commit](https://github.com/Polymer/polymer/commit/14fd53c3))
+
+- Fix typo. ([commit](https://github.com/Polymer/polymer/commit/581483f2))
+
+- Comment reworded based on feedback. ([commit](https://github.com/Polymer/polymer/commit/80a7f1e5))
+
+- Semantic issue (proposal) plus minor fixes ([commit](https://github.com/Polymer/polymer/commit/42ec14bf))
+
+- Depend on webcomponents and shadycss with shady-unscoped support ([commit](https://github.com/Polymer/polymer/commit/8241b887))
+
+- Also clarify `delay` units. Fixes #4707 ([commit](https://github.com/Polymer/polymer/commit/348ed92c))
+
+- Ensure re-sort/filter always happens after array item set. Fixes #3626 ([commit](https://github.com/Polymer/polymer/commit/f6d4771c))
+
+- Clarify docs on target-framerate. Fixes #4897 ([commit](https://github.com/Polymer/polymer/commit/c18a5349))
+
+- move test after ([commit](https://github.com/Polymer/polymer/commit/45598302))
+
+- test more permutations ([commit](https://github.com/Polymer/polymer/commit/f03e8d1b))
+
+- Fix missing comma in `Path.translate` JSDoc ([commit](https://github.com/Polymer/polymer/commit/41616c6f))
+
+- fix(bower): standardized version tagging (#4921) ([commit](https://github.com/Polymer/polymer/commit/6e3ae2e5))
+
+- Minor fixes (update URLs) ([commit](https://github.com/Polymer/polymer/commit/8e7024e6))
+
+- add license headers ([commit](https://github.com/Polymer/polymer/commit/518b4699))
+
+- Prep for processing of `shady-unscoped` moving to ShadyCSS ([commit](https://github.com/Polymer/polymer/commit/08c3a02e))
+
+- Implement type change in Polymer.ElementMixin ([commit](https://github.com/Polymer/polymer/commit/cda62d5f))
+
+- instance.$.foo should only give Elements ([commit](https://github.com/Polymer/polymer/commit/4837e4a8))
+
+- Annotate DomApi with @memberof Polymer ([commit](https://github.com/Polymer/polymer/commit/7308d8b6))
+
+- Clarify all elements between changes must apply mixing. Fixes #4914 ([commit](https://github.com/Polymer/polymer/commit/7360f42a))
+
+- add safari 11 to sauce testing ([commit](https://github.com/Polymer/polymer/commit/428ad8c2))
+
+- Fix tests on Firefox. ([commit](https://github.com/Polymer/polymer/commit/9a468335))
+
+- Update externs again. ([commit](https://github.com/Polymer/polymer/commit/1c5b731f))
+
+- Update externs. ([commit](https://github.com/Polymer/polymer/commit/8683b27c))
+
+- Lint fixes ([commit](https://github.com/Polymer/polymer/commit/092b210f))
+
+- Allow style elements to be separate in the element template. ([commit](https://github.com/Polymer/polymer/commit/819652eb))
+
+- Lint fix. ([commit](https://github.com/Polymer/polymer/commit/982d28c6))
+
+- Add support for styles with a `shady-unscoped` attribute ([commit](https://github.com/Polymer/polymer/commit/d77e073e))
+
+- [ci skip] Update CHANGELOG ([commit](https://github.com/Polymer/polymer/commit/314bada5))
+
+- [ci skip] version script did not work as expected ([commit](https://github.com/Polymer/polymer/commit/4265cba1))
+
+- adding test case for 4696 4706 ([commit](https://github.com/Polymer/polymer/commit/939ce63c))
+
+- Support property observers which are direct function references in addition to strings. Provides better static analysis and refactoring support in multiple tools. Alleviates the need for property reflection with Closure-compiler renaming. ([commit](https://github.com/Polymer/polymer/commit/4bae2b62))
+
+- removing package-lock.json from PR ([commit](https://github.com/Polymer/polymer/commit/0da00a1d))
+
+- implementing the code review suggestions ([commit](https://github.com/Polymer/polymer/commit/1b51f601))
+
+- Updating deserialize function (use of ternary operation). Fixes #4696 ([commit](https://github.com/Polymer/polymer/commit/ca139ed0))
+
+- Updating deserialize function. Fixes #4696 ([commit](https://github.com/Polymer/polymer/commit/277ca89a))
+
+## [v2.2.0](https://github.com/Polymer/polymer/tree/v2.2.0) (2017-10-18)
+- [ci skip] Autoupdate version when releasing ([commit](https://github.com/Polymer/polymer/commit/d893d6ae))
+
+- add edge 15, use chrome stable ([commit](https://github.com/Polymer/polymer/commit/c6f2d817))
+
+- super it and put back takeRecords ([commit](https://github.com/Polymer/polymer/commit/02e2f148))
+
+- more feedback ([commit](https://github.com/Polymer/polymer/commit/15cbdff5))
+
+- Address feedback ([commit](https://github.com/Polymer/polymer/commit/e71b84a8))
+
+- add some description of the dir mixin ([commit](https://github.com/Polymer/polymer/commit/f98ad117))
+
+- Fix linting ([commit](https://github.com/Polymer/polymer/commit/624189a3))
+
+- Always do the :dir transform ([commit](https://github.com/Polymer/polymer/commit/31c0ebc7))
+
+- Clean up closure externs ([commit](https://github.com/Polymer/polymer/commit/1e5ea942))
+
+- remove bogus semicolon ([commit](https://github.com/Polymer/polymer/commit/7d044b49))
+
+- Declare Polymer.Templatizer directly, for Closure. (#4870) ([commit](https://github.com/Polymer/polymer/commit/3b155173))
+
+- First draft of a `:dir` aware element mixin ([commit](https://github.com/Polymer/polymer/commit/2ef65aa6))
+
+- [ci-skip] Update CHANGELOG ([commit](https://github.com/Polymer/polymer/commit/28e60271))
+
+## [v2.1.1](https://github.com/Polymer/polymer/tree/v2.1.1) (2017-09-28)
+- Prepare for release 2.1.1 ([commit](https://github.com/Polymer/polymer/commit/f049dd91))
+
+- Move @externs before @license because Closure likes that. ([commit](https://github.com/Polymer/polymer/commit/c3f31455))
+
+- just move the style instead ([commit](https://github.com/Polymer/polymer/commit/61b2c8a5))
+
+- Copy <custom-style> styles to main document ([commit](https://github.com/Polymer/polymer/commit/155ab8a2))
+
+- Fix typos and jsdoc (#4846) ([commit](https://github.com/Polymer/polymer/commit/b19e180a))
+
+- [ci skip] update changelog ([commit](https://github.com/Polymer/polymer/commit/44fd1eaa))
+
+- Fix shady dom style querySelector ([commit](https://github.com/Polymer/polymer/commit/d5b6bad3))
+
+- Fix linter error ([commit](https://github.com/Polymer/polymer/commit/2da30c33))
+
+- Exclude script and style tags for parsing bindings ([commit](https://github.com/Polymer/polymer/commit/41fa90b3))
+
+- Special-case undefined textarea.value same as input. Fixes #4630 ([commit](https://github.com/Polymer/polymer/commit/8aa201b9))
+
+## [v2.1.0](https://github.com/Polymer/polymer/tree/v2.1.0) (2017-09-19)
+- [ci skip] bump version to 2.1.0 ([commit](https://github.com/Polymer/polymer/commit/64788aad))
+
+- Port #3844 to 2.x ([commit](https://github.com/Polymer/polymer/commit/00bc76e4))
+
+- Provide a `Polymer.setPassiveTouchGestures()` function ([commit](https://github.com/Polymer/polymer/commit/3547fd37))
+
+- Make sure closure types have braces ([commit](https://github.com/Polymer/polymer/commit/fb8039e0))
+
+- a few more comments in return ([commit](https://github.com/Polymer/polymer/commit/f6f0a3b7))
+
+- Fix setting, add smoke test ([commit](https://github.com/Polymer/polymer/commit/6312da57))
+
+- Optional passive touch listeners for gestures ([commit](https://github.com/Polymer/polymer/commit/5f7597f7))
+
+- Don't have `return /** comment */` lines ([commit](https://github.com/Polymer/polymer/commit/c802b8b2))
+
+- [ci skip] disable closure lint for now (travis java errors) ([commit](https://github.com/Polymer/polymer/commit/e45e5bba))
+
+- try to avoid introducing spelling errors in changelogs ([commit](https://github.com/Polymer/polymer/commit/7616e3c9))
+
+- spelling: webcomponents ([commit](https://github.com/Polymer/polymer/commit/70504627))
+
+- spelling: veiling ([commit](https://github.com/Polymer/polymer/commit/43f6b971))
+
+- spelling: unnecessary ([commit](https://github.com/Polymer/polymer/commit/dc0573f8))
+
+- spelling: toolkit ([commit](https://github.com/Polymer/polymer/commit/42edf634))
+
+- spelling: together ([commit](https://github.com/Polymer/polymer/commit/7d6e4351))
+
+- spelling: there-when ([commit](https://github.com/Polymer/polymer/commit/240701ec))
+
+- spelling: theming ([commit](https://github.com/Polymer/polymer/commit/d991cce1))
+
+- spelling: supported ([commit](https://github.com/Polymer/polymer/commit/4a2e7750))
+
+- spelling: stylesheet ([commit](https://github.com/Polymer/polymer/commit/d138df3c))
+
+- spelling: static ([commit](https://github.com/Polymer/polymer/commit/4354e710))
+
+- spelling: sometimes ([commit](https://github.com/Polymer/polymer/commit/802817dc))
+
+- spelling: shuffling ([commit](https://github.com/Polymer/polymer/commit/93a18c58))
+
+- spelling: returns ([commit](https://github.com/Polymer/polymer/commit/3f744c3c))
+
+- spelling: restart ([commit](https://github.com/Polymer/polymer/commit/58111054))
+
+- spelling: responsive ([commit](https://github.com/Polymer/polymer/commit/d1da7314))
+
+- spelling: resilient ([commit](https://github.com/Polymer/polymer/commit/d45855d9))
+
+- spelling: resetting ([commit](https://github.com/Polymer/polymer/commit/8fb47431))
+
+- spelling: reentrancy ([commit](https://github.com/Polymer/polymer/commit/5ea03d60))
+
+- spelling: readonly ([commit](https://github.com/Polymer/polymer/commit/ff294a90))
+
+- spelling: prototype ([commit](https://github.com/Polymer/polymer/commit/bbe54cc2))
+
+- spelling: protocols ([commit](https://github.com/Polymer/polymer/commit/83df6dad))
+
+- spelling: properties ([commit](https://github.com/Polymer/polymer/commit/bb74d2da))
+
+- spelling: preferring ([commit](https://github.com/Polymer/polymer/commit/00e0567e))
+
+- spelling: polyfill ([commit](https://github.com/Polymer/polymer/commit/ce0ca630))
+
+- spelling: parameterize ([commit](https://github.com/Polymer/polymer/commit/141cefe3))
+
+- spelling: omit ([commit](https://github.com/Polymer/polymer/commit/e3b04e51))
+
+- spelling: offset ([commit](https://github.com/Polymer/polymer/commit/ea0acb0d))
+
+- spelling: notification ([commit](https://github.com/Polymer/polymer/commit/ee741143))
+
+- spelling: name ([commit](https://github.com/Polymer/polymer/commit/159803a7))
+
+- spelling: multiple ([commit](https://github.com/Polymer/polymer/commit/602ee780))
+
+- spelling: loaded ([commit](https://github.com/Polymer/polymer/commit/f4529864))
+
+- spelling: jquery ([commit](https://github.com/Polymer/polymer/commit/88ce972d))
+
+- spelling: javascript ([commit](https://github.com/Polymer/polymer/commit/f1f7f669))
+
+- spelling: instead ([commit](https://github.com/Polymer/polymer/commit/c4be7f60))
+
+- spelling: initial ([commit](https://github.com/Polymer/polymer/commit/3862ce0a))
+
+- spelling: increments ([commit](https://github.com/Polymer/polymer/commit/8bda7f93))
+
+- spelling: identify ([commit](https://github.com/Polymer/polymer/commit/17678e1a))
+
+- spelling: github ([commit](https://github.com/Polymer/polymer/commit/0781b322))
+
+- spelling: getting ([commit](https://github.com/Polymer/polymer/commit/c1d7c3e8))
+
+- spelling: function ([commit](https://github.com/Polymer/polymer/commit/b9b22854))
+
+- spelling: falsy ([commit](https://github.com/Polymer/polymer/commit/d472919a))
+
+- spelling: enqueuing ([commit](https://github.com/Polymer/polymer/commit/96c8ed81))
+
+- spelling: element ([commit](https://github.com/Polymer/polymer/commit/d4e54c72))
+
+- spelling: effective ([commit](https://github.com/Polymer/polymer/commit/139edd00))
+
+- spelling: doesn't ([commit](https://github.com/Polymer/polymer/commit/aa35d779))
+
+- spelling: does ([commit](https://github.com/Polymer/polymer/commit/01f943d9))
+
+- spelling: disappearing ([commit](https://github.com/Polymer/polymer/commit/508c005a))
+
+- spelling: deserialized ([commit](https://github.com/Polymer/polymer/commit/2acbf5df))
+
+- spelling: customize ([commit](https://github.com/Polymer/polymer/commit/0a0ac248))
+
+- spelling: containing ([commit](https://github.com/Polymer/polymer/commit/2b09e75c))
+
+- spelling: components ([commit](https://github.com/Polymer/polymer/commit/e11d4d6b))
+
+- spelling: collection ([commit](https://github.com/Polymer/polymer/commit/38645c08))
+
+- spelling: children ([commit](https://github.com/Polymer/polymer/commit/c30c5d03))
+
+- spelling: changed ([commit](https://github.com/Polymer/polymer/commit/1579bf36))
+
+- spelling: behavior ([commit](https://github.com/Polymer/polymer/commit/65f27655))
+
+- spelling: attribute ([commit](https://github.com/Polymer/polymer/commit/d8f3f57d))
+
+- spelling: attached ([commit](https://github.com/Polymer/polymer/commit/adc4f0e1))
+
+- spelling: asynchronous ([commit](https://github.com/Polymer/polymer/commit/6c59f53b))
+
+- Explicitly set display none on dom-* elements (#4821) ([commit](https://github.com/Polymer/polymer/commit/65859b1c))
+
+- Publish DomBind in Polymer. scope ([commit](https://github.com/Polymer/polymer/commit/60054350))
+
+- Fix missing semi-colons in test folder ([commit](https://github.com/Polymer/polymer/commit/72a59f77))
+
+- Enable ESLint 'semi' rule ([commit](https://github.com/Polymer/polymer/commit/75c6fff7))
+
+- [ci skip] update package-lock ([commit](https://github.com/Polymer/polymer/commit/ca1ce196))
+
+- [ci skip] Add license headers to externs ([commit](https://github.com/Polymer/polymer/commit/f4a9e06e))
+
+- Polymer.Path.get accepts both a string path or an Array path, so functions that call this should allow for either as well. Already changed for Polymer.prototype.push here: ([commit](https://github.com/Polymer/polymer/commit/42ce5a88))
+
+- lint with closure as well ([commit](https://github.com/Polymer/polymer/commit/cc649e97))
+
+- Update closure compiler to support polymer pass v2 ([commit](https://github.com/Polymer/polymer/commit/a4591abc))
+
+- Revert "Adds `restamp` mode to dom-repeat." ([commit](https://github.com/Polymer/polymer/commit/d439960a))
+
+- Add test to verify that importHref can be called twice ([commit](https://github.com/Polymer/polymer/commit/6ce904b3))
+
+- Fix compiling with Polymer({}) calls ([commit](https://github.com/Polymer/polymer/commit/d937d5fe))
+
+- Remove double space ([commit](https://github.com/Polymer/polymer/commit/bbf0e7c8))
+
+- Add development workflow-related files to gitignore (#4612) ([commit](https://github.com/Polymer/polymer/commit/d5c2629f))
+
+- Allow arbitrary whitespace in CSS imports ([commit](https://github.com/Polymer/polymer/commit/5c250d44))
+
+- Fix dom-module API docs with static `import` function ([commit](https://github.com/Polymer/polymer/commit/9f7df4cf))
+
+- [ci skip] update externs more from #4776 ([commit](https://github.com/Polymer/polymer/commit/c20b6574))
+
+- imported css modules should always be before element's styles ([commit](https://github.com/Polymer/polymer/commit/679a49e4))
+
+- Update closure annotation for Polymer.prototype.push ([commit](https://github.com/Polymer/polymer/commit/eb170cbb))
+
+- Fixed formatting. ([commit](https://github.com/Polymer/polymer/commit/48fac922))
+
+- Fix formatting of code in API docs (#4771) ([commit](https://github.com/Polymer/polymer/commit/eb406c71))
+
+- Lint clean. ([commit](https://github.com/Polymer/polymer/commit/4095e12d))
+
+- Separate scripts that modify configuration properties, as their ordering constraints are unusual. ([commit](https://github.com/Polymer/polymer/commit/49dbacb6))
+
+- test: convert XNestedRepeat to use an inlined string template. ([commit](https://github.com/Polymer/polymer/commit/c89155ba))
+
+- Don't rely on implicitly creating a global, does not. ([commit](https://github.com/Polymer/polymer/commit/28ed27e0))
+
+- Refer to Gestures.recognizers consistently. ([commit](https://github.com/Polymer/polymer/commit/3555b458))
+
+- Make test work in strict mode. ([commit](https://github.com/Polymer/polymer/commit/328ce594))
+
+- In tests, explicitly write to window when creating a new global for clarity. ([commit](https://github.com/Polymer/polymer/commit/674d4685))
+
+- [ci skip] remove duplicate definition for __dataHost in externs ([commit](https://github.com/Polymer/polymer/commit/5ab9032c))
+
+- [ci skip] update polymer-build and run-sequence ([commit](https://github.com/Polymer/polymer/commit/0c6aa882))
+
+- Fix tests in non-Chrome browsers ([commit](https://github.com/Polymer/polymer/commit/5a54c32b))
+
+- Better distinguish param name from namespaced name ([commit](https://github.com/Polymer/polymer/commit/a3d6e56b))
+
+- use wct 6 npm package ([commit](https://github.com/Polymer/polymer/commit/fbe8dcc4))
+
+- add mixin class instance properties to externs ([commit](https://github.com/Polymer/polymer/commit/34d22acd))
+
+- Add sanitizeDOMValue to settings.html ([commit](https://github.com/Polymer/polymer/commit/4d730e16))
+
+- Remove reference to Polymer._toOverride, it seems like an incomplete feature/part of the test. ([commit](https://github.com/Polymer/polymer/commit/981a7600))
+
+- Update custom-style API doc ([commit](https://github.com/Polymer/polymer/commit/52a7328e))
+
+- Use customElements.get rather than referring to the global for Polymer.DomModule ([commit](https://github.com/Polymer/polymer/commit/bb202378))
+
+- Add import of dom-module to file that uses it. ([commit](https://github.com/Polymer/polymer/commit/dbedcfc0))
+
+- Do not assign to a readonly property on window ([commit](https://github.com/Polymer/polymer/commit/b64e4862))
+
+- [ci skip] Fix documentation in PropertyAccessors ([commit](https://github.com/Polymer/polymer/commit/0f695d90))
+
+- [ci skip] fix closure warning ([commit](https://github.com/Polymer/polymer/commit/2e7dc00b))
+
+- Fix event path for tap event on touch ([commit](https://github.com/Polymer/polymer/commit/50bf45c3))
+
+- [ci skip] Update changelog ([commit](https://github.com/Polymer/polymer/commit/466624ae))
+
+- Update web-component-tester to stable version ([commit](https://github.com/Polymer/polymer/commit/ae78564c))
+
+- Disable closure linting until the count is driven down to a reasonable level ([commit](https://github.com/Polymer/polymer/commit/6335b24f))
+
+- Adds `restamp` mode to dom-repeat. ([commit](https://github.com/Polymer/polymer/commit/6cebeace))
+
+## [v2.0.2](https://github.com/Polymer/polymer/tree/v2.0.2) (2017-07-14)
+- remove broken npm script ([commit](https://github.com/Polymer/polymer/commit/27c67125))
+
+- depend on webcomponentsjs 1.0.2 ([commit](https://github.com/Polymer/polymer/commit/d522de0f))
+
+- cleanup and update npm dependencies ([commit](https://github.com/Polymer/polymer/commit/4176c6c2))
+
+- Update LegacyElementMixin.distributeContent ([commit](https://github.com/Polymer/polymer/commit/2daf9de2))
+
+- Remove crufty test ([commit](https://github.com/Polymer/polymer/commit/c96350b4))
+
+- [ci skip] remove one new closure warning for updating closure ([commit](https://github.com/Polymer/polymer/commit/0cb560a4))
+
+- Meaningful closure fixes from @ChadKillingsworth ([commit](https://github.com/Polymer/polymer/commit/88043077))
+
+- [ci skip] clean up mixin fn and regen externs ([commit](https://github.com/Polymer/polymer/commit/72022f27))
+
+- address some concerns from kschaaf ([commit](https://github.com/Polymer/polymer/commit/44653813))
+
+- zero warnings left ([commit](https://github.com/Polymer/polymer/commit/3e14a1d8))
+
+- [ci skip] Fix link closing quotes. ([commit](https://github.com/Polymer/polymer/commit/d1ad0c33))
+
+- Remove @suppress {missingProperties} ([commit](https://github.com/Polymer/polymer/commit/2efccb95))
+
+- Annotate Debouncer summary. (#4691) ([commit](https://github.com/Polymer/polymer/commit/806119ae))
+
+- Fix typo in templatize.html ([commit](https://github.com/Polymer/polymer/commit/de181d6e))
+
+- Move Debouncer memberof annotation to right place, and add a summary. (#4690) ([commit](https://github.com/Polymer/polymer/commit/77f06712))
+
+- remove PolymerPropertyEffects type, inline DataTrigger and DataEffect types ([commit](https://github.com/Polymer/polymer/commit/7612df67))
+
+- remove polymer-element dependency introduced by a merge conflict ([commit](https://github.com/Polymer/polymer/commit/3b7eedb8))
+
+- update closure log ([commit](https://github.com/Polymer/polymer/commit/344ebb4c))
+
+- remove dommodule imports ([commit](https://github.com/Polymer/polymer/commit/fc886306))
+
+- Create style-gather.html ([commit](https://github.com/Polymer/polymer/commit/73fbbb45))
+
+- README: fix typo ([commit](https://github.com/Polymer/polymer/commit/5355252a))
+
+- Remove unused `__needFullRefresh` ([commit](https://github.com/Polymer/polymer/commit/bdbbfa19))
+
+- Fixes #4650: if an observed path changes, the repeat should render but in addition, the path should be notified. This is necessary since “mutableData” is optional. ([commit](https://github.com/Polymer/polymer/commit/22d27aa0))
+
+- last two stragglers ([commit](https://github.com/Polymer/polymer/commit/9bd89203))
+
+- fix eslint warnings ([commit](https://github.com/Polymer/polymer/commit/ba720124))
+
+- Down to 30ish warnings, need PolymerPass v2 ([commit](https://github.com/Polymer/polymer/commit/de87c585))
+
+- Add lib/utils/settings.html to hold legacy settings and rootPath ([commit](https://github.com/Polymer/polymer/commit/3183e3f7))
+
+- Fix typo in dom-repeat.html ([commit](https://github.com/Polymer/polymer/commit/d6941a34))
+
+- guard all dommodule references ([commit](https://github.com/Polymer/polymer/commit/c3866a59))
+
+- add more missing imports ([commit](https://github.com/Polymer/polymer/commit/8c71456d))
+
+- Add mixin.html import to gesture-event-listeners.html ([commit](https://github.com/Polymer/polymer/commit/352dc33a))
+
+- more fixes ([commit](https://github.com/Polymer/polymer/commit/872e1c27))
+
+- rebaseline warnings with NTI specific warnings disabled, for now ([commit](https://github.com/Polymer/polymer/commit/abc229e5))
+
+- Fix parsing for argument whitespace. Fixes #4643. ([commit](https://github.com/Polymer/polymer/commit/a29d8876))
+
+- Upgrade babel-preset-babili to include RegExp fix from https://github.com/babel/babili/pull/490 ([commit](https://github.com/Polymer/polymer/commit/308cae6e))
+
+- Not an RC anymore ([commit](https://github.com/Polymer/polymer/commit/8290002b))
+
+- Just ensure content frag from _contentForTemplate is inert. Edge does not seem to always use the exact same owner document for templates. ([commit](https://github.com/Polymer/polymer/commit/b73caea0))
+
+- Fix typo in prop of FlattenedNodesObserver ([commit](https://github.com/Polymer/polymer/commit/57fe7dca))
+
+- [ci skip] Update Changelog ([commit](https://github.com/Polymer/polymer/commit/e03b2cce))
+
+- Fix some ElementMixin warnings. ([commit](https://github.com/Polymer/polymer/commit/c0a816f6))
+
+- Fix template.assetpath with typedef ([commit](https://github.com/Polymer/polymer/commit/ec3e948d))
+
+- fix dom-module related errors ([commit](https://github.com/Polymer/polymer/commit/07443645))
+
+- Fix fn binding error ([commit](https://github.com/Polymer/polymer/commit/bc504f64))
+
+- Reduce closure warnings in PropertyAccessors ([commit](https://github.com/Polymer/polymer/commit/3591be8b))
+
+- reduce closure warnings in TemplateStamp ([commit](https://github.com/Polymer/polymer/commit/c34ef0b2))
+
+- [ci skip] parameterize entries for closure task ([commit](https://github.com/Polymer/polymer/commit/3a80ad8f))
+
+- [ci skip] generating externs should be explicit ([commit](https://github.com/Polymer/polymer/commit/a8a57bf5))
+
+- Avoid firstElementChild on DocFrag for IE11 ([commit](https://github.com/Polymer/polymer/commit/02e31d78))
+
+- update externs for merge, update dependencies ([commit](https://github.com/Polymer/polymer/commit/e927bc9a))
+
+- Fix impl of _contentForTemplate. Add template-stamp tests. Fixes #4597 ([commit](https://github.com/Polymer/polymer/commit/06190c9d))
+
+- ensure latest closure, stay on polymer-build 1.1 until warnings can be ignored ([commit](https://github.com/Polymer/polymer/commit/7abd7037))
+
+- @mixes -> @appliesMixin ([commit](https://github.com/Polymer/polymer/commit/1f21ab1a))
+
+- @polymerMixin/@polymerMixinClass -> @mixinFunction/@mixinClass ([commit](https://github.com/Polymer/polymer/commit/f7e8021e))
+
+- @polymerElement -> @customElement/@polymer ([commit](https://github.com/Polymer/polymer/commit/231b21c0))
+
+- fix lint error ([commit](https://github.com/Polymer/polymer/commit/e5de1782))
+
+- remove all "global this" warnings ([commit](https://github.com/Polymer/polymer/commit/c0ddc60b))
+
+- remove `TemplateStamp`’s implicit dependency on `_initializeProperties` ([commit](https://github.com/Polymer/polymer/commit/f821e46a))
+
+- fix typing for Polymer.Element ([commit](https://github.com/Polymer/polymer/commit/0b152938))
+
+- inline cachingMixin into deduplicatingMixin ([commit](https://github.com/Polymer/polymer/commit/c3da5073))
+
+- initialize properties in `_initializeProperties` rather than `constructor` (allows work to be done before `_initializeProperties` and is needed for proto/instance property initialization . ([commit](https://github.com/Polymer/polymer/commit/f15e4ee6))
+
+- LegacyElementMixin to `@unrestricted` ([commit](https://github.com/Polymer/polymer/commit/c1eda7af))
+
+- set `isAttached` constructor (for closure) but set to undefined so not picked up as proto property (avoids initial binding value) ([commit](https://github.com/Polymer/polymer/commit/6a995a23))
+
+- Fix dedupingMixin ([commit](https://github.com/Polymer/polymer/commit/2c9ffac3))
+
+- Fix more closure warnings ([commit](https://github.com/Polymer/polymer/commit/f04d6311))
+
+- Fix more closure warnings ([commit](https://github.com/Polymer/polymer/commit/d0f78122))
+
+- Fix more closure warnings. ([commit](https://github.com/Polymer/polymer/commit/0c3e3c5f))
+
+- Fix more closure warnings. ([commit](https://github.com/Polymer/polymer/commit/b686cd77))
+
+- Fix more closure warnings. ([commit](https://github.com/Polymer/polymer/commit/0b22959f))
+
+- Fix more closure warnings. ([commit](https://github.com/Polymer/polymer/commit/2627e63a))
+
+- slighly better typing for mixin function ([commit](https://github.com/Polymer/polymer/commit/b3dfd38e))
+
+- gesture fixes ([commit](https://github.com/Polymer/polymer/commit/346e2d57))
+
+- Fix more closure warnings. ([commit](https://github.com/Polymer/polymer/commit/fa9823f7))
+
+- Fix some closure warnings. ([commit](https://github.com/Polymer/polymer/commit/f1a14982))
+
+- Fix some closure warnings. ([commit](https://github.com/Polymer/polymer/commit/51855541))
+
+- automate generating closure externs ([commit](https://github.com/Polymer/polymer/commit/89b12301))
+
+- Fix some closure warnings. ([commit](https://github.com/Polymer/polymer/commit/37abc4e3))
+
+- fix some closure warnings. ([commit](https://github.com/Polymer/polymer/commit/80f54421))
+
+## [v2.0.1](https://github.com/Polymer/polymer/tree/v2.0.1) (2017-05-25)
+- [ci skip] Prepare 2.0.1 ([commit](https://github.com/Polymer/polymer/commit/061b1048))
+
+- Improve comment more ([commit](https://github.com/Polymer/polymer/commit/39877086))
+
+- Improve comment ([commit](https://github.com/Polymer/polymer/commit/fa1469a9))
+
+- Add comment. ([commit](https://github.com/Polymer/polymer/commit/250067b3))
+
+- * Improve clarity: change `__dataInitialized` to `__dataReady` * When `_flushClients` is called, ensure that clients are always enabled or flushed as appropriate. This ensures that (1) clients that are enabled before the host is enabled flush properly, and (2) clients that are stamped but not enabled properly enable when the host flushes. ([commit](https://github.com/Polymer/polymer/commit/8e8692f7))
+
+- Fix typo in runBindingEffect documentation ([commit](https://github.com/Polymer/polymer/commit/6bd8dcfa))
+
+- Fixes #4601. Client elements can be readied that have already enabled properties. This can happen when templatize is used to create instances with no properties. In this case, in order for properties to flush properly to clients, clients must be flushed. ([commit](https://github.com/Polymer/polymer/commit/06df53d9))
+
+- [ci skip] Update Changelog ([commit](https://github.com/Polymer/polymer/commit/c4e516f6))
+
+## [v2.0.0](https://github.com/Polymer/polymer/tree/v2.0.0) (2017-05-15)
+- [ci skip] bump version to 2.0.0 ([commit](https://github.com/Polymer/polymer/commit/712230fc))
+
+- [ci skip] Update Changelog ([commit](https://github.com/Polymer/polymer/commit/21ee3b4d))
+
+## [v2.0.0-rc.9](https://github.com/Polymer/polymer/tree/v2.0.0-rc.9) (2017-05-12)
+- [ci skip] Add alacarte usage smoke tests. ([commit](https://github.com/Polymer/polymer/commit/e54bc5f8))
+
+- [skip ci] doc fixes ([commit](https://github.com/Polymer/polymer/commit/b943aa0d))
+
+- Docs and slight renaming. ([commit](https://github.com/Polymer/polymer/commit/4eb252fe))
+
+- Add tests. ([commit](https://github.com/Polymer/polymer/commit/1f83fd7c))
+
+- Move hostStack to property-effects and make readyClients explicit ([commit](https://github.com/Polymer/polymer/commit/c7a81ea8))
+
+- Turn on accessors (via __dataInitialized) only after clients have completely flushed. ([commit](https://github.com/Polymer/polymer/commit/2f1e964c))
+
+- Adds `_enableProperties` as a new entry point that must be called to turn on properties. Prevents a bug where `_readyClients` can be called twice. ([commit](https://github.com/Polymer/polymer/commit/c6f9b315))
+
+- [ci skip] Fix doc createPropertyEffect -> addPropertyEffect ([commit](https://github.com/Polymer/polymer/commit/90e8cd95))
+
+- [ci skip] Update Changelog ([commit](https://github.com/Polymer/polymer/commit/448149d2))
+
+## [v2.0.0-rc.8](https://github.com/Polymer/polymer/tree/v2.0.0-rc.8) (2017-05-11)
+- Add test for boolean dynamicFn ([commit](https://github.com/Polymer/polymer/commit/03d21ce8))
+
+- Accept boolean or object map for dynamicFns ([commit](https://github.com/Polymer/polymer/commit/f197ce24))
+
+- update dependencies for v1 polyfills ([commit](https://github.com/Polymer/polymer/commit/d9b5b8f9))
+
+- Null the links when unbinding. ([commit](https://github.com/Polymer/polymer/commit/42230437))
+
+- Dedupe API docs. ([commit](https://github.com/Polymer/polymer/commit/e97a6eb7))
+
+- Move setup to suiteSetup ([commit](https://github.com/Polymer/polymer/commit/d5b282fa))
+
+- Uncomment previous tests ([commit](https://github.com/Polymer/polymer/commit/55b2d160))
+
+- Add tests ([commit](https://github.com/Polymer/polymer/commit/0f4ebf62))
+
+- [ci skip] port gen-changelog from 1.x ([commit](https://github.com/Polymer/polymer/commit/24dd897d))
+
+- Add static API for creating property fx and minor code refactoring. ([commit](https://github.com/Polymer/polymer/commit/7497065a))
+
+- [ci skip] remove bower.json version, add npm devDependencies & np publish config ([commit](https://github.com/Polymer/polymer/commit/6b6092e0))
+
+- Fix comment. ([commit](https://github.com/Polymer/polymer/commit/6f1dde76))
+
+- Fixes #4585. Data notifications do not flush host if host has not initialized clients. This preserves the Polymer 1.x guarantee that client dom is fully “readied” when data observers run. ([commit](https://github.com/Polymer/polymer/commit/3b6981d4))
+
+- Ensure no warnings for dynamic fns. Fixes #4575 ([commit](https://github.com/Polymer/polymer/commit/d72baf9d))
+
+- Corrected minor Method comments ([commit](https://github.com/Polymer/polymer/commit/8a2aeb65))
+
+- Removes the `disable-upgrade` feature from Polymer 2.0. Due to #4550, the feature has a flaw for native ES6 classes and would be better implemented as either a mixin or patch to `customElements.define`. ([commit](https://github.com/Polymer/polymer/commit/972b2bab))
+
+- Fix jsBin link. ([commit](https://github.com/Polymer/polymer/commit/811c334e))
+
+- Ensure tags in markdown are backtracked. Short-term stopgap to ensure they are not rendered in HTML. ([commit](https://github.com/Polymer/polymer/commit/e90ef30d))
+
+- Clean up gulpfile ([commit](https://github.com/Polymer/polymer/commit/764448c9))
+
+- bump wct version ([commit](https://github.com/Polymer/polymer/commit/bafa1ecd))
+
+- Disabling `lint-closure` until the error count is driven to 0 ([commit](https://github.com/Polymer/polymer/commit/c98e3799))
+
+- fix test failures on safari 9 and chrome 41 w/focus event ([commit](https://github.com/Polymer/polymer/commit/0b00f2d9))
+
+- update debounce example. ([commit](https://github.com/Polymer/polymer/commit/5be7ec99))
+
+- Fixes #4553, #4554 ([commit](https://github.com/Polymer/polymer/commit/36792f94))
+
+- save closure warnings to "closure.log" file ([commit](https://github.com/Polymer/polymer/commit/25cfc882))
+
+- use shadycss externs directly, now only 498 warnings ([commit](https://github.com/Polymer/polymer/commit/c21a63db))
+
+- add gulp task to lint for closure warnings ([commit](https://github.com/Polymer/polymer/commit/4e782741))
+
+## [v2.0.0-rc.7](https://github.com/Polymer/polymer/tree/v2.0.0-rc.7) (2017-04-19)
+- Add more tests. ([commit](https://github.com/Polymer/polymer/commit/73df8c5b))
+
+- Update jsBin template for 2.0 ([commit](https://github.com/Polymer/polymer/commit/4a2db9ca))
+
+- [ci skip] Update link to jsBin template for 2.0. ([commit](https://github.com/Polymer/polymer/commit/0aeb3170))
+
+- Move computeLinkedPaths out of hot path and into sync setter. ([commit](https://github.com/Polymer/polymer/commit/d722cb9c))
+
+- [ci skip] Add note re: purpose of test ([commit](https://github.com/Polymer/polymer/commit/7ecbf258))
+
+- Fix test for fallback \_readyClients. Fixes #4547 ([commit](https://github.com/Polymer/polymer/commit/85184e8b))
+
+- Process paths regardless of accessor, & loop on computeLinkedPaths. Fixes #4542 ([commit](https://github.com/Polymer/polymer/commit/e2d17020))
+
+## [v2.0.0-rc.6](https://github.com/Polymer/polymer/tree/v2.0.0-rc.6) (2017-04-17)
+- [ci skip] Fix API docs ([commit](https://github.com/Polymer/polymer/commit/5a4427bf))
+
+- Guard against overwriting bound values with hasOwnProperty. Fixes #4540 ([commit](https://github.com/Polymer/polymer/commit/4c023740))
+
+- [ci skip] reduce warnings ([commit](https://github.com/Polymer/polymer/commit/00f9e3eb))
+
+- fix globals for goog.reflect.objectProperty -> JSCompiler_renameProperty swap ([commit](https://github.com/Polymer/polymer/commit/8867fde5))
+
+- [ci skip] remove outdated externs file ([commit](https://github.com/Polymer/polymer/commit/626a085d))
+
+- lint and compile successfully ([commit](https://github.com/Polymer/polymer/commit/a2fa1005))
+
+- update dependencies ([commit](https://github.com/Polymer/polymer/commit/36603bc4))
+
+- Rename `setPrivate` -> `setReadOnly` ([commit](https://github.com/Polymer/polymer/commit/521ed3de))
+
+- Add `setPrivate` arg to `setProperties` ([commit](https://github.com/Polymer/polymer/commit/e6e4803f))
+
+- Never accidental test change ([commit](https://github.com/Polymer/polymer/commit/28c15caa))
+
+- Remove unused @method ([commit](https://github.com/Polymer/polymer/commit/6d636138))
+
+- Standardize @return, @param, type case. ([commit](https://github.com/Polymer/polymer/commit/8cab18b1))
+
+- Fix jsdoc warnings. ([commit](https://github.com/Polymer/polymer/commit/dab794b2))
+
+- jsdoc fixes. ([commit](https://github.com/Polymer/polymer/commit/38a13f66))
+
+- Fix jsdoc issues. ([commit](https://github.com/Polymer/polymer/commit/86d2eebc))
+
+- Fix jsdoc issues. ([commit](https://github.com/Polymer/polymer/commit/8a11c8c3))
+
+- Enable error on jsdoc mistake. ([commit](https://github.com/Polymer/polymer/commit/72a454e9))
+
+- fix @license comments & shadycss imports. Remove custom style from externs ([commit](https://github.com/Polymer/polymer/commit/59350ad4))
+
+- closure advanced compilation ([commit](https://github.com/Polymer/polymer/commit/eea1ca23))
+
+## [v2.0.0-rc.5](https://github.com/Polymer/polymer/tree/v2.0.0-rc.5) (2017-04-13)
+- Eliminate rest args for better perf on stable chrome. ([commit](https://github.com/Polymer/polymer/commit/fa67457c))
+
+- Fix perf regressions. ([commit](https://github.com/Polymer/polymer/commit/86e35e3a))
+
+- Move second tap test to the correct spot. ([commit](https://github.com/Polymer/polymer/commit/6e4b87c1))
+
+- Add GestureEventListeners to dom-bind. ([commit](https://github.com/Polymer/polymer/commit/4f628fd9))
+
+- Add more comments ([commit](https://github.com/Polymer/polymer/commit/d0bd96d4))
+
+- [ci skip] Fix comment. ([commit](https://github.com/Polymer/polymer/commit/becd1d3b))
+
+- alias another way ([commit](https://github.com/Polymer/polymer/commit/d297047e))
+
+- use chrome beta ([commit](https://github.com/Polymer/polymer/commit/0724f187))
+
+- Add more HTMLImports.whenReady ([commit](https://github.com/Polymer/polymer/commit/bc713187))
+
+- Address feedback from review: * Refactor `_bindTemplate` to remove problematic `hasCreatedAccessors` * Remove vestigial `dom` from `_bindTemplate` call * Rename `_unstampTemplate` to `_removeBoundDom` * Add `infoIndex` to `nodeInfo` (and renamed parent & index) * Add test to ensure runtime accessors created for new props in runtime stamped template * Changed custom binding test to use different prop names * Added test for #first count after removing bound dom ([commit](https://github.com/Polymer/polymer/commit/b9fafb7e))
+
+- Fix lint error. ([commit](https://github.com/Polymer/polymer/commit/dff5f2bc))
+
+- Ensure prototype wasn't affected by runtime effects. ([commit](https://github.com/Polymer/polymer/commit/bf2dbe0a))
+
+- Add tests for adding/removing runtime property effects. ([commit](https://github.com/Polymer/polymer/commit/14711067))
+
+- Added tests for custom parsing, effects, and binding. ([commit](https://github.com/Polymer/polymer/commit/1cf955b9))
+
+- Add initial runtime stamping tests. ([commit](https://github.com/Polymer/polymer/commit/eb6ab63e))
+
+- Fix changelog generation ([commit](https://github.com/Polymer/polymer/commit/8c103d98))
+
+- Address feedback based on review. * PropertyAccessors must call `_flushProperties` to enable * Avoid tearing off oldProps (unnecessary) * Add `addBinding` docs * Merge notifyListeners into `setupBindings` * Add comment re: path-bindings not being overridable * Remove `dom` argument from `_bindTemplate` * Rename `_stampBoundTemplate` back to `_stampTemplate` ([commit](https://github.com/Polymer/polymer/commit/6af84c45))
+
+- Put $ on dom, and assign to element as needed. Eliminate _templateInfo reference. ([commit](https://github.com/Polymer/polymer/commit/03bed19d))
+
+- Fix _hasAccessor for readOnly. Collapse addBinding & addBindingEffects ([commit](https://github.com/Polymer/polymer/commit/396c102c))
+
+- Improvements to binding API: - Adds override points for _parseBindings and _evaluateBinding - Adds support for runtime template binding - Moves ready(), _hasAccessor tracking, and instance property swizzle at ready time to PropertyAccessors ([commit](https://github.com/Polymer/polymer/commit/ea4e7d97))
+
+## [v2.0.0-rc.4](https://github.com/Polymer/polymer/tree/v2.0.0-rc.4) (2017-04-12)
+- fix lint error ([commit](https://github.com/Polymer/polymer/commit/e397c434))
+
+- Only style elements with templates ([commit](https://github.com/Polymer/polymer/commit/2356f7b8))
+
+- [ci skip] note safari bugs ([commit](https://github.com/Polymer/polymer/commit/ef90168b))
+
+- Various Safari 10.1 fixes ([commit](https://github.com/Polymer/polymer/commit/dea052a2))
+
+- Add `@memberof` annotation for Polymer.Debouncer ([commit](https://github.com/Polymer/polymer/commit/352878d5))
+
+- Import mutable-data.html in dom-bind ([commit](https://github.com/Polymer/polymer/commit/bbc0373c))
+
+- Correct changelog version title ([commit](https://github.com/Polymer/polymer/commit/9555ca34))
+
+- Fix readme. ([commit](https://github.com/Polymer/polymer/commit/bbfea905))
+
+- tighten up custom-style-late test ([commit](https://github.com/Polymer/polymer/commit/2106f656))
+
+- Fixes #4478 by adding a better warning for attributes that cannot deserialize from JSON. ([commit](https://github.com/Polymer/polymer/commit/dba28c06))
+
+- Adds back the `beforeRegister` method. Users can no longer set the `is` property in this method; however, dynamic property effects can still be installed here. ([commit](https://github.com/Polymer/polymer/commit/7639cf81))
+
+- Fixes #4447. Re-introduce the `hostStack` in order to maintain “client before host” ordering when `_flushProperties` is called before `connectedCallback` (e.g. as Templatize does). ([commit](https://github.com/Polymer/polymer/commit/8467a696))
+
+- Fix custom-style-late tests ([commit](https://github.com/Polymer/polymer/commit/caafef79))
+
+- Add test for ensuring complicated mixin ordering is correct ([commit](https://github.com/Polymer/polymer/commit/6d663354))
+
+- move lazy-upgrade out to separate mixins repo ([commit](https://github.com/Polymer/polymer/commit/deb5a9a5))
+
+- Only check bounding client rect on clicks that target elements ([commit](https://github.com/Polymer/polymer/commit/af37d04c))
+
+- Adds tests from https://github.com/Polymer/polymer/pull/4099. The other changes from the PR are no longer needed. ([commit](https://github.com/Polymer/polymer/commit/c5710666))
+
+- clean up code, factor processing lazy candidates, better docs ([commit](https://github.com/Polymer/polymer/commit/189a2083))
+
+- Update templatize.html ([commit](https://github.com/Polymer/polymer/commit/2abfe09e))
+
+- Doc fix (correct callback name) ([commit](https://github.com/Polymer/polymer/commit/57d22f4c))
+
+- Fixed templatize typo ([commit](https://github.com/Polymer/polymer/commit/b6b43f36))
+
+- Work around IE/Edge bug with :not([attr]) selectors ([commit](https://github.com/Polymer/polymer/commit/c3036232))
+
+- Remove support for lazy-upgrade inside dom-if and dom-repeat ([commit](https://github.com/Polymer/polymer/commit/1b4a9781))
+
+- Fix image in README ([commit](https://github.com/Polymer/polymer/commit/b860594a))
+
+- Remove useless id check on mixins ([commit](https://github.com/Polymer/polymer/commit/8c1a5765))
+
+- move dom-change listener for lazy-upgrade before `super.ready()` ([commit](https://github.com/Polymer/polymer/commit/ba60b820))
+
+- [ci skip] Update doc ([commit](https://github.com/Polymer/polymer/commit/f87790d6))
+
+- [ci skip] Update doc ([commit](https://github.com/Polymer/polymer/commit/b9774801))
+
+- Add API docs. ([commit](https://github.com/Polymer/polymer/commit/1eb0df49))
+
+- nodeInfo -> nodeInfoList ([commit](https://github.com/Polymer/polymer/commit/eed67504))
+
+- Updates based on PR feedback. API docs in progress. ([commit](https://github.com/Polymer/polymer/commit/627352db))
+
+- * ensure element cannot return to “disabled” state after upgrading. * ensure nested `beforeNextRender` calls always go before the next render * ensure nested `afterNextRender` are called after additional renders ([commit](https://github.com/Polymer/polymer/commit/e9c58add))
+
+- Fixes #4437. Ensure `_registered` is called 1x for each element class using `LegacyElementMixin`. Ensure that a behaviors’s `registered` method is called for any extending class. ([commit](https://github.com/Polymer/polymer/commit/de09d730))
+
+- Separate binding-specific code from template stamp. Expose override points. ([commit](https://github.com/Polymer/polymer/commit/e95afeb1))
+
+- Use webcomponents-lite for test ([commit](https://github.com/Polymer/polymer/commit/50ae3bb7))
+
+- add lazy-upgrade tests ([commit](https://github.com/Polymer/polymer/commit/71b70aaa))
+
+- make a mixin for lazy upgrading ([commit](https://github.com/Polymer/polymer/commit/9891e484))
+
+- implements `disable-upgrade` attribute which prevents readying an element until the attribute is removed. ([commit](https://github.com/Polymer/polymer/commit/a222078e))
+
+## [v2.0.0-rc.3](https://github.com/Polymer/polymer/tree/v2.0.0-rc.3) (2017-03-15)
+- add properties, behaviors, observers, hostAttributes, listeners on prototype ([commit](https://github.com/Polymer/polymer/commit/93cf3246))
+
+- [skip ci] update test comments ([commit](https://github.com/Polymer/polymer/commit/bb52071b))
+
+- better comment ([commit](https://github.com/Polymer/polymer/commit/a081e669))
+
+- get behaviors only from prototypes ([commit](https://github.com/Polymer/polymer/commit/8bac5c60))
+
+- behaviors ONLY on the prototype ([commit](https://github.com/Polymer/polymer/commit/444c043c))
+
+- add instance behaviors ([commit](https://github.com/Polymer/polymer/commit/4bf7bdd7))
+
+- [ci skip] minor doc edits. ([commit](https://github.com/Polymer/polymer/commit/4ae65ba2))
+
+- [ci skip] expand range of dependencies to all rcs ([commit](https://github.com/Polymer/polymer/commit/46c10465))
+
+## [v2.0.0-rc.2](https://github.com/Polymer/polymer/tree/v2.0.0-rc.2) (2017-03-07)
+- another test fix. ([commit](https://github.com/Polymer/polymer/commit/d9418e1a))
+
+- fix behavior warn test. ([commit](https://github.com/Polymer/polymer/commit/4439436f))
+
+- update to latest webcomponents rc. ([commit](https://github.com/Polymer/polymer/commit/46219a39))
+
+- move mutable data mixin to be loaded by polymer.html ([commit](https://github.com/Polymer/polymer/commit/7cebe120))
+
+- Fix 4387. Ensure `dom-change` fired with `composed: true`. ([commit](https://github.com/Polymer/polymer/commit/3e683297))
+
+- Allow hybrid elements (like iron-list) to make template instances with mutable data ([commit](https://github.com/Polymer/polymer/commit/ea392e3f))
+
+- Don't override the goog namespace if it already exists ([commit](https://github.com/Polymer/polymer/commit/b30deb22))
+
+- Use correct version ([commit](https://github.com/Polymer/polymer/commit/3b7d4484))
+
+- Fix spelling error ([commit](https://github.com/Polymer/polymer/commit/c14ea57f))
+
+- [ci skip] Fix note re: transpilation ([commit](https://github.com/Polymer/polymer/commit/8fd1b212))
+
+- [ci skip] Remove obsolete note re: pre-upgrade attribute vs. property priority ([commit](https://github.com/Polymer/polymer/commit/3dd776fe))
+
+- [ci skip] Fix note re: attached ([commit](https://github.com/Polymer/polymer/commit/b67736ec))
+
+- [ci skip] Add back intro README content from 1.x, updated to 2.x syntax. ([commit](https://github.com/Polymer/polymer/commit/1235f449))
+
+## [v2.0.0-rc.1](https://github.com/Polymer/polymer/tree/v2.0.0-rc.1) (2017-03-06)
+
+<!-- the changelog tool broke, so this is ported from https://www.polymer-project.org/2.0/docs/release-notes#v-2-0-0-rc.1 -->
+The following notable changes have been made since the 2.0 Preview announcement.
+
+- The `config` getter on element classes has been replaced by individual `properties` and
+ `observers` getters, more closely resembling the 1.x syntax.
+
+ ```js
+ static get properties() {
+ return {
+ aProp: String,
+ bProp: Number
+ }
+ }
+ static get observers() {
+ return [
+ '_observeStuff(aProp,bProp)'
+ ]
+ }
+ ```
+
+- 1.x-style dirty checking has been reinstated for better performance. An optional mixin is
+ available for elements to skip dirty checking of objects and arrays, which may be more easy to
+ integrate with some state management systems. For details, see
+ [Using the MutableData mixin](devguide/data-system#mutable-data) in Data system concepts.
+
+- Support for dynamically-created `custom-style` elements has been added.
+
+- Support for the external style sheet syntax, `<link rel="import" type="css">` has
+ been added. This was deprecated in 1.x, but will be retained until an alternate solution is
+ available for importing unprocessed CSS.
+
+- New properties `rootPath` and `basePath` were added to `Polymer.Element` to allow authors
+ to configure how URLs are rewritten inside templates. For details, see the
+ [Update URLs in templates](./upgrade#urls-in-templates) in the Upgrade guide.
+
+
+## [v1.9.1-dev](https://github.com/Polymer/polymer/tree/v1.9.1-dev) (2017-04-17)
+- Remove use of ES6 API. ([commit](https://github.com/Polymer/polymer/commit/96010657))
+
+- Remove use of ES6 API. ([commit](https://github.com/Polymer/polymer/commit/646dce69))
+
+- Ensure optimization uses hybrid parentNode ([commit](https://github.com/Polymer/polymer/commit/b7f00992))
+
+- Use local `parentNode` ([commit](https://github.com/Polymer/polymer/commit/2e4290f8))
+
+- Capture hybridDomRepeat. ([commit](https://github.com/Polymer/polymer/commit/ee3b9a69))
+
+- Fix dom-if detachment ([commit](https://github.com/Polymer/polymer/commit/2722532b))
+
+- Add dom-if test for add/remove. ([commit](https://github.com/Polymer/polymer/commit/a2825650))
+
+- Add test for add & remove ([commit](https://github.com/Polymer/polymer/commit/4c87e1d9))
+
+- Add 2.x hybrid affordances for stamping template content. Fixes #4536 ([commit](https://github.com/Polymer/polymer/commit/53053eb4))
+
+- Fix lint ([commit](https://github.com/Polymer/polymer/commit/f29104f2))
+
+- Make tests more strict. ([commit](https://github.com/Polymer/polymer/commit/ea65a6d0))
+
+- Use `_importPath` in `resolveUrl` so it available early. Fixes #4532 ([commit](https://github.com/Polymer/polymer/commit/1a7d3b11))
+
+- [ci skip] update Changelog ([commit](https://github.com/Polymer/polymer/commit/3ce4e176))
+
+## [v1.9.0-dev](https://github.com/Polymer/polymer/tree/v1.9.0-dev) (2017-04-13)
+- [ci skip] skip looking in build log, again ([commit](https://github.com/Polymer/polymer/commit/1d282c7f))
+
+- [ci skip] backport changelog fixes ([commit](https://github.com/Polymer/polymer/commit/d6a7ac71))
+
+- * allow setting `rootPath` * disallow setting `importPath` (this is supported in 2.x but not 1.x) ([commit](https://github.com/Polymer/polymer/commit/ac067652))
+
+- Add `importPath` and `rootPath` to support 2.x hybrid compatible elements. ([commit](https://github.com/Polymer/polymer/commit/daaf460a))
+
+- [ci skip] Update Changelog ([commit](https://github.com/Polymer/polymer/commit/80c899f4))
+
+- Add missing semicolon after variable assignment ([commit](https://github.com/Polymer/polymer/commit/afb21c8f))
+
+- Update PRIMER.md ([commit](https://github.com/Polymer/polymer/commit/4d66a353))
+
+## [v1.8.1-dev](https://github.com/Polymer/polymer/tree/v1.8.1-dev) (2017-02-27)
+- Exclude SD polyfill tests for Edge due to lack of workarounds for Edge DocFrag bugs. ([commit](https://github.com/Polymer/polymer/commit/de45ba02))
+
+- [ci skip] Update comment to include reference to problem browser. ([commit](https://github.com/Polymer/polymer/commit/72f21fe6))
+
+- Check documentElement instead of body to guarantee it's there. ([commit](https://github.com/Polymer/polymer/commit/a0ad3bbe))
+
+- add tests ([commit](https://github.com/Polymer/polymer/commit/20de9287))
+
+- Adds a setting `preserveStyleIncludes` which, when used with a shadow dom targeted css build and native custom properties, will copy styles into the Shadow DOM template rather than collapsing them into a single style. This will (1) allow the browser to optimize parsing of shared styles because they remain intact, (2) reduce the size of the css build resources when shared styles are used since they are not pre-collapsed. This option does perform registration runtime work to add included styles to element templates. ([commit](https://github.com/Polymer/polymer/commit/2315547e))
+
+- Fix test failures by feature detecting instance `properties` accessors. Can't rely on `__proto__` on IE10, but that browser doesn't need to avoid `properties`. ([commit](https://github.com/Polymer/polymer/commit/f2a12cb1))
+
+- Read properties off of proto during configuration. ([commit](https://github.com/Polymer/polymer/commit/a68c0b3e))
+
+- remove cruft. ([commit](https://github.com/Polymer/polymer/commit/632f0e47))
+
+- Ensure disable-upgrade elements are not "configured". Fixes #4302 ([commit](https://github.com/Polymer/polymer/commit/b36915f6))
+
+- change lastresponse to last-response in dom-bind example ([commit](https://github.com/Polymer/polymer/commit/4427b0b6))
+
+- [ci skip] Update Changelog ([commit](https://github.com/Polymer/polymer/commit/2d804a28))
+
+## [v1.8.0-dev](https://github.com/Polymer/polymer/tree/v1.8.0-dev) (2017-02-06)
+- Add comment. ([commit](https://github.com/Polymer/polymer/commit/a42cb209))
+
+- Only keep `disable-upgrade` attribute if it is an attribute binding. ([commit](https://github.com/Polymer/polymer/commit/62e9b84b))
+
+- spacing. ([commit](https://github.com/Polymer/polymer/commit/5030c1b9))
+
+- Update webcomponentsjs dependency ([commit](https://github.com/Polymer/polymer/commit/ca7dbb84))
+
+- Change `isInert` to `disable-upgrade` and feature is now supported only via the `disable-upgrade` attribute. ([commit](https://github.com/Polymer/polymer/commit/f8f903cf))
+
+- Add tests for `is-inert` ([commit](https://github.com/Polymer/polymer/commit/e1561f65))
+
+- Prevent annotator from removing the `is-inert` attribute. ([commit](https://github.com/Polymer/polymer/commit/91925148))
+
+- fixes for users of Polymer.Class ([commit](https://github.com/Polymer/polymer/commit/0f53bef4))
+
+- Add support for `isInert` to allow elements to boot up in an inert state. e.g. `<x-foo is-inert></x-foo>`. Setting `xFoo.isInert = false` causes the element to boot up. ([commit](https://github.com/Polymer/polymer/commit/ca3f59d3))
+
+- Small typos updated ([commit](https://github.com/Polymer/polymer/commit/bc023648))
+
+- work around older firefox handling of the "properties" property on HTMLElement prototype ([commit](https://github.com/Polymer/polymer/commit/13f36c7f))
+
+- improve comments ([commit](https://github.com/Polymer/polymer/commit/c76ba5b9))
+
+- Add comments. Behavior fast copy flag changed to `_noAccessors`. ([commit](https://github.com/Polymer/polymer/commit/52ea6002))
+
+- Fix tests on IE10 and simplify constructor shortcut. ([commit](https://github.com/Polymer/polymer/commit/e588f1f5))
+
+- Make dom-module work on older Safari. ([commit](https://github.com/Polymer/polymer/commit/73b62a63))
+
+- micro-optimizations: (1) favor mixin over extends where possible, (2) unroll behavior lifecycle calls, (3) avoid creating a custom constructor when not used, (4) provide `_skipDefineProperty` setting on behaviors which copies properties via assignment rather than `copyOwnProperty` ([commit](https://github.com/Polymer/polymer/commit/a1c1285d))
+
+- Ensure done. ([commit](https://github.com/Polymer/polymer/commit/08753237))
+
+- Test positive case of suppressBindingNotifications ([commit](https://github.com/Polymer/polymer/commit/1b19b784))
+
+- Add notifyDomBind to dom-bind. ([commit](https://github.com/Polymer/polymer/commit/ad7f91d6))
+
+- Test Polymer.Settings inside test. ([commit](https://github.com/Polymer/polymer/commit/4b286f19))
+
+- Revert unnecessary change. ([commit](https://github.com/Polymer/polymer/commit/dcde6d4c))
+
+- Fix test lint issue. ([commit](https://github.com/Polymer/polymer/commit/26c669ce))
+
+- Add global flags to suppress unnecessary notification events. Fixes #4262. * `Polymer.Settings.suppressTemplateNotifications `- disables `dom-change` and `rendered-item-count` events from `dom-if`, `dom-repeat`, and `don-bind`. Users can opt back into `dom-change` events by setting the `notify-dom-change` attribute (`notifyDomChange: true` property) to `dom-if`/`don-repeat` instances. * `Polymer.Settings.suppressBindingNotifications` - disables notify effects when propagating data downward via bindings. Generally these are never useful unless users are explicitly doing something like `<my-el foo="{{foo}} on-foo-changed="{{handleFoo}}">` or calling `addEventListener('foo-changed', ...)` on an element where `foo` is bound (we attempted to make this the default some time back but needed to revert it when we found via https://github.com/Polymer/polymer/issues/3077 that users were indeed doing this). Users that avoid these patterns can enjoy the potentially significant benefit of suppressing unnecessary events during downward data flow by opting into this flag. ([commit](https://github.com/Polymer/polymer/commit/83e14c43))
+
+- Fix `strip-whitespace` for nested templates. ([commit](https://github.com/Polymer/polymer/commit/a3b75eb3))
+
+- [ci skip] update changelog v1.7.1 ([commit](https://github.com/Polymer/polymer/commit/03e22a1c))
+
+- Close backtick in ISSUE_TEMPLATE.md ([commit](https://github.com/Polymer/polymer/commit/b0dea8bc))
+
+## [v1.7.1-dev](https://github.com/Polymer/polymer/tree/v1.7.1-dev) (2016-12-14)
+- Remove dependency on WebComponents for IE detection ([commit](https://github.com/Polymer/polymer/commit/650c16a9))
+
+- Make sure text nodes are distributed when translating slot to content ([commit](https://github.com/Polymer/polymer/commit/87e312f1))
+
+- always use the document listener ([commit](https://github.com/Polymer/polymer/commit/5ddcb8d1))
+
+- Add tests for no-gesture interop ([commit](https://github.com/Polymer/polymer/commit/4be7e9f6))
+
+- fix lint error ([commit](https://github.com/Polymer/polymer/commit/9c8eaa9d))
+
+- Use document-wide passive touch listener to update ghostclick blocker target ([commit](https://github.com/Polymer/polymer/commit/947172f8))
+
+- only need to recalc if styleProperties missing ([commit](https://github.com/Polymer/polymer/commit/5bfe2792))
+
+- simpler implementation, only recompute when using shim variables ([commit](https://github.com/Polymer/polymer/commit/5231d87f))
+
+- [ci skip] update travis.yml from 2.0 ([commit](https://github.com/Polymer/polymer/commit/1a9c5c8c))
+
+- Always update style properties when calling getComputedStyleValue ([commit](https://github.com/Polymer/polymer/commit/fb8575c6))
+
+- Add tests ([commit](https://github.com/Polymer/polymer/commit/29de0055))
+
+- Fix #4123: Memory leak when using `importHref` ([commit](https://github.com/Polymer/polymer/commit/132010ea))
+
+- Prevent _showHideChildren from being called on placeholders. ([commit](https://github.com/Polymer/polymer/commit/0468c60a))
+
+- fix broken link to Google JavaScript syle guide in documentation ([commit](https://github.com/Polymer/polymer/commit/376d146f))
+
+- Better explanation thanks to @kevinpschaaf ([commit](https://github.com/Polymer/polymer/commit/0dae8f0d))
+
+- [ci skip] fix changelog title ([commit](https://github.com/Polymer/polymer/commit/16712cb6))
+
+- [ci skip] Update Changelog for 1.7.0 ([commit](https://github.com/Polymer/polymer/commit/d6af21b5))
+
+- Resolving issue #1745 with Polymer docs ([commit](https://github.com/Polymer/polymer/commit/bb875275))
+
+- fixed broken tests/missing web components ([commit](https://github.com/Polymer/polymer/commit/f2b01e34))
+
+- 3430 - ie memory leak fixes - disable event caching, fixed resolver url adding to root doc, and weak map ie issues ([commit](https://github.com/Polymer/polymer/commit/a6e66f92))
+
+- Briefly explain how to split element definition ([commit](https://github.com/Polymer/polymer/commit/c6462286))
+
+- Fix copy&pasted comment ([commit](https://github.com/Polymer/polymer/commit/d595c0cc))
+
+## [v1.7.0](https://github.com/Polymer/polymer/tree/v1.7.0) (2016-09-28)
+- Fix IE style cache performance ([commit](https://github.com/Polymer/polymer/commit/d08b694))
+
+- no need for :root to be first in the selector ([commit](https://github.com/Polymer/polymer/commit/63433c8))
+
+- fix tests on !chrome browsers ([commit](https://github.com/Polymer/polymer/commit/7ce981b))
+
+- Translate `:root` to `:host > *` for element styles ([commit](https://github.com/Polymer/polymer/commit/fea64b9))
+
+- Define checkRoot only once ([commit](https://github.com/Polymer/polymer/commit/a49b366))
+
+- Fix normalizeRootSelector ([commit](https://github.com/Polymer/polymer/commit/c2278a0))
+
+- Comment on using the ast walker to replace selector ([commit](https://github.com/Polymer/polymer/commit/9658665))
+
+- update travis config ([commit](https://github.com/Polymer/polymer/commit/c00687a))
+
+- Transform ::slotted() to ::content ([commit](https://github.com/Polymer/polymer/commit/541fdfb))
+
+- Test on native shadow DOM also. ([commit](https://github.com/Polymer/polymer/commit/11afc1f))
+
+- Reorder. ([commit](https://github.com/Polymer/polymer/commit/cbae058))
+
+- Remove unused. ([commit](https://github.com/Polymer/polymer/commit/92d1d8a))
+
+- Add fallback support/test. ([commit](https://github.com/Polymer/polymer/commit/037abdd))
+
+- A little more dry. ([commit](https://github.com/Polymer/polymer/commit/6fd0e1f))
+
+- Use name. ([commit](https://github.com/Polymer/polymer/commit/4aa8da2))
+
+- Support default slot semantics. ([commit](https://github.com/Polymer/polymer/commit/d458dd3))
+
+- Remove opt-in. Exclude content from copy. ([commit](https://github.com/Polymer/polymer/commit/41e5dc0))
+
+- Make sure click events can always trigger tap, even on touch only devices ([commit](https://github.com/Polymer/polymer/commit/02441ca))
+
+- Add support for slot->content transformation. Need to bikeshed opt-in attribute (currently "auto-content") ([commit](https://github.com/Polymer/polymer/commit/ebf31ca))
+
+- Support more expressive `:root` and `html` selectors ([commit](https://github.com/Polymer/polymer/commit/2a8f21a))
+
+- Fix typo ([commit](https://github.com/Polymer/polymer/commit/192eb56))
+
+- test for mixins in custom-style ordering ([commit](https://github.com/Polymer/polymer/commit/37646f7))
+
+- Do not insert semicolon when fixing var() syntax ([commit](https://github.com/Polymer/polymer/commit/0a338a7))
+
+- Make sure mixins are applied no matter the ordering of definition ([commit](https://github.com/Polymer/polymer/commit/9daea3d))
+
+- Update gulp-eslint to 3.x ([commit](https://github.com/Polymer/polymer/commit/8b89f02))
+
+- Fixes #3676: retain `<style>` in `<template preserve-content/>` ([commit](https://github.com/Polymer/polymer/commit/8a4c00c))
+
+- [ci skip] Update Changelog for v1.6.1 ([commit](https://github.com/Polymer/polymer/commit/ec04461))
+
+- Apply to _marshalArgs. ([commit](https://github.com/Polymer/polymer/commit/b2cd932))
+
+- Rename Path.head() to Path.root(). ([commit](https://github.com/Polymer/polymer/commit/77808d9))
+
+- Use head in templatizer ([commit](https://github.com/Polymer/polymer/commit/478978d))
+
+- Modify _annotationPathEffect ([commit](https://github.com/Polymer/polymer/commit/852aba0))
+
+- Use isDescendant ([commit](https://github.com/Polymer/polymer/commit/b9944fe))
+
+- Use isDeep ([commit](https://github.com/Polymer/polymer/commit/5627a55))
+
+- Replace _fixPath. ([commit](https://github.com/Polymer/polymer/commit/6d1dd88))
+
+- Replace _modelForPath. ([commit](https://github.com/Polymer/polymer/commit/b02eda0))
+
+- Replace _patchMatchesEffect. ([commit](https://github.com/Polymer/polymer/commit/6ad9295))
+
+- Add path library. ([commit](https://github.com/Polymer/polymer/commit/0320763))
+
+- Revert "Fix _patchMatchesEffect. (#3631)" ([commit](https://github.com/Polymer/polymer/commit/a64f227))
+
+## [v1.6.1](https://github.com/Polymer/polymer/tree/v1.6.1) (2016-08-01)
+- Property Shim needs to handle build output from apply shim ([commit](https://github.com/Polymer/polymer/commit/d726a51))
+
+- Do not resolve urls with leading slash and other protocols ([commit](https://github.com/Polymer/polymer/commit/94f95ec))
+
+- Mark that non-inheritable properties being set to `inherit` is not supported ([commit](https://github.com/Polymer/polymer/commit/0a2b31e))
+
+- Put `getInitialValueForProperty` on ApplyShim ([commit](https://github.com/Polymer/polymer/commit/0489ccf))
+
+- Skip `initial` and `inherit` on IE 10 and 11 ([commit](https://github.com/Polymer/polymer/commit/63c3bfb))
+
+- Handle mixins with property values of inherit and initial ([commit](https://github.com/Polymer/polymer/commit/c7571e5))
+
+- Split tests for use-before-create and reusing mixin names for variables ([commit](https://github.com/Polymer/polymer/commit/8de1bec))
+
+- Make sure we don't populate the mixin map for every variable ([commit](https://github.com/Polymer/polymer/commit/6265ade))
+
+- [apply shim] Track dependencies for mixins before creation ([commit](https://github.com/Polymer/polymer/commit/2cab461))
+
+- [property shim] Make sure "initial" and "inherit" behave as they would natively ([commit](https://github.com/Polymer/polymer/commit/0887dba))
+
+- fix lint issue. ([commit](https://github.com/Polymer/polymer/commit/95eadbd))
+
+- Fixes #3801. Ensure style host calculates custom properties before element. This ensures the scope's styles are prepared to be inspected by the element for matching rules. ([commit](https://github.com/Polymer/polymer/commit/5967f2d))
+
+- Clean up custom-style use of apply shim ([commit](https://github.com/Polymer/polymer/commit/0859803))
+
+- gate comparing css text on using native css properties ([commit](https://github.com/Polymer/polymer/commit/8fcb5f6))
+
+- Only invalidate mixin if it defines new properties ([commit](https://github.com/Polymer/polymer/commit/b27f842))
+
+- Make __currentElementProto optional for build tool ([commit](https://github.com/Polymer/polymer/commit/64d41e6))
+
+- Rerun Apply Shim when mixins with consumers are redefined ([commit](https://github.com/Polymer/polymer/commit/498e23f))
+
+- updateNativeStyles should only remove styles set by updateNativeStyles ([commit](https://github.com/Polymer/polymer/commit/831be4f))
+
+- [ci skip] add smoke test for scope caching with custom-style ([commit](https://github.com/Polymer/polymer/commit/43955ea))
+
+- Remove unused arg. ([commit](https://github.com/Polymer/polymer/commit/95cd415))
+
+- Remove dirty check for custom events; unnecessary after #3678. Fixes #3677. ([commit](https://github.com/Polymer/polymer/commit/92a9398))
+
+- Use _configValue to avoid setting readOnly. Add tests. ([commit](https://github.com/Polymer/polymer/commit/36467fa))
+
+- Missing piece to fixing #3094 ([commit](https://github.com/Polymer/polymer/commit/694b35e))
+
+- Opt in to "even lazier" behavior by setting `lazyRegister` to "max". This was done to preserve compatibility with the existing feature. Specifically, when "max" is used, setting `is` in `beforeRegister` and defining `factoryImpl` may only be done on an element's prototype and not its behaviors. In addition, the element's `beforeRegister` is called *before* its behaviors' `beforeRegisters` rather than *after* as in the normal case. ([commit](https://github.com/Polymer/polymer/commit/b271a88))
+
+- Replace 'iff' with 'if and only if' ([commit](https://github.com/Polymer/polymer/commit/f7659eb))
+
+- Fix test in IE10. ([commit](https://github.com/Polymer/polymer/commit/fb95dc8))
+
+- cleanup check for sourceCapabilities ([commit](https://github.com/Polymer/polymer/commit/4c44fb7))
+
+- Fix #3786 by adding a `noUrlSettings` flag to Polymer.Settings ([commit](https://github.com/Polymer/polymer/commit/8a26759))
+
+- Fix mouse input delay on systems with a touchscreen ([commit](https://github.com/Polymer/polymer/commit/ed4c18a))
+
+- Ensure properties override attributes at upgrade time. Fixes #3779. ([commit](https://github.com/Polymer/polymer/commit/f2938ec))
+
+- Refresh cache'd styles contents in IE 10 and 11 ([commit](https://github.com/Polymer/polymer/commit/80be0df))
+
+- change travis config ([commit](https://github.com/Polymer/polymer/commit/1256301))
+
+- Fix css shady build mistakenly matching root rules as host rules ([commit](https://github.com/Polymer/polymer/commit/5dfb9c9))
+
+- [ci skip] update changelog for v1.6.0 ([commit](https://github.com/Polymer/polymer/commit/d8bab9c))
+
+- Make lazyRegister have 'even lazier' behavior such that behaviors are not mixed in until first-instance time. ([commit](https://github.com/Polymer/polymer/commit/9676d6d))
+
+- need takeRecords in complex var example ([commit](https://github.com/Polymer/polymer/commit/b40561b))
+
+- add reduced test case ([commit](https://github.com/Polymer/polymer/commit/26fe9b9))
+
+- Replace VAR_MATCH regex with a simple state machine / callback ([commit](https://github.com/Polymer/polymer/commit/4ebec15))
+
+- Expose an `lazierRegister` flag to defer additional work until first create time. This change requires that a behavior not implement a custom constructor or set the element's `is` property. ([commit](https://github.com/Polymer/polymer/commit/5c5b18e))
+
+- Improve type signatures: `Polymer.Base.extend` and `Polymer.Base.mixin` ([commit](https://github.com/Polymer/polymer/commit/8382aa7))
+
+- Fix for changing property to the same value ([commit](https://github.com/Polymer/polymer/commit/66e6e22))
+
+- Include iron-component-page in devDependencies ([commit](https://github.com/Polymer/polymer/commit/639d5d8))
+
+- Ensure fromAbove in _forwardParentProp. ([commit](https://github.com/Polymer/polymer/commit/072dcff))
+
+## [v1.6.0](https://github.com/Polymer/polymer/tree/v1.6.0) (2016-06-29)
+- Fix test to account for pseudo element differences x-browser. ([commit](https://github.com/Polymer/polymer/commit/54a462d))
+
+- Restore functionality of selectors like `:host(.foo)::after`. ([commit](https://github.com/Polymer/polymer/commit/ff88e17))
+
+- add comment. ([commit](https://github.com/Polymer/polymer/commit/e770343))
+
+- re-support selectors like `:host[inline]` since this was previously supported under shady-dom. ([commit](https://github.com/Polymer/polymer/commit/4e51ef6))
+
+- fix linting ([commit](https://github.com/Polymer/polymer/commit/4817d61))
+
+- Add test for not matching `x-foox-bar` given `:host(x-bar)` used inside `x-foo` ([commit](https://github.com/Polymer/polymer/commit/4e08fa1))
+
+- fix test in IE/FF. ([commit](https://github.com/Polymer/polymer/commit/ec111f1))
+
+- simplify :host fixup ([commit](https://github.com/Polymer/polymer/commit/c3355fd))
+
+- Fixes #3739: correctly shim `:host(.element-name)` as `element-name.element-name`. ([commit](https://github.com/Polymer/polymer/commit/997240a))
+
+- Fixes #3734: address HI/CE timing issue in importHref. Fixes upgrade time dependencies of scripts on previous elements in async imports. ([commit](https://github.com/Polymer/polymer/commit/84662b9))
+
+- Ensure element scope selectors are updated correctly when updateStyles is called when element is not in dom. ([commit](https://github.com/Polymer/polymer/commit/6d90480))
+
+- add comment. ([commit](https://github.com/Polymer/polymer/commit/620e59f))
+
+- remove unneeded flag. ([commit](https://github.com/Polymer/polymer/commit/b5b8a2a))
+
+- Fixes #3730 and inspired by (https://github.com/Polymer/polymer/pull/3585) ([commit](https://github.com/Polymer/polymer/commit/ab431ed))
+
+- custom-style triggers updateStyles if root scope (StyleDefaults) has style properties when the custom-style is created. ([commit](https://github.com/Polymer/polymer/commit/4852f6c))
+
+- Fix _patchMatchesEffect. (#3631) ([commit](https://github.com/Polymer/polymer/commit/b78e5af))
+
+- Fixes #3555. Ensure selectors including `::content` without a prefix … (#3721) ([commit](https://github.com/Polymer/polymer/commit/1058896))
+
+- Fixes #3530. When `updateStyles` is called and an element is not attached, invalidate its styling so that when it is attached, its custom properties will be updated. ([commit](https://github.com/Polymer/polymer/commit/ae4a07e))
+
+- Make sure effect functions receive latest values ([commit](https://github.com/Polymer/polymer/commit/34b2c79))
+
+- [ci skip] data binding edge case smoke test ([commit](https://github.com/Polymer/polymer/commit/a54c1f2))
+
+- Use `whenReady` to apply custom styles. ([commit](https://github.com/Polymer/polymer/commit/129488b))
+
+- Use firefox 46 for testing ([commit](https://github.com/Polymer/polymer/commit/fbe5b0f))
+
+- Need to wait until render to test. ([commit](https://github.com/Polymer/polymer/commit/92293f9))
+
+- address feedback ([commit](https://github.com/Polymer/polymer/commit/4dc780a))
+
+- Fix lint, use query params instead of duplicate file. ([commit](https://github.com/Polymer/polymer/commit/e4880d9))
+
+- Ensure custom styles updated after adding custom-style async. Fixes #3705. ([commit](https://github.com/Polymer/polymer/commit/f770438))
+
+- Store cacheablility on the scope ([commit](https://github.com/Polymer/polymer/commit/bc9519e))
+
+- fix decorateStyles with custom-style ([commit](https://github.com/Polymer/polymer/commit/57a6769))
+
+- Do not scope cache elements with media rules, :host(), or :host-context() selectors ([commit](https://github.com/Polymer/polymer/commit/5c3b917))
+
+- Support preventDefault() on touch (#3693) ([commit](https://github.com/Polymer/polymer/commit/b9c874e))
+
+- Shim CSS Mixins in terms of CSS Custom Properties (#3587) ([commit](https://github.com/Polymer/polymer/commit/6c0acef))
+
+- [ci skip] update changelog ([commit](https://github.com/Polymer/polymer/commit/adef722))
+
+## [v1.5.0](https://github.com/Polymer/polymer/tree/v1.5.0) (2016-05-31)
+- Fix test in Firefox that was hacked to work in Canary (instead filed https://bugs.chromium.org/p/chromium/issues/detail?id=614198). ([commit](https://github.com/Polymer/polymer/commit/1e2aed5))
+
+- remove unneeded argument ([commit](https://github.com/Polymer/polymer/commit/4a99b83))
+
+- slight optimization, avoid work if no cssText is set. ([commit](https://github.com/Polymer/polymer/commit/ce0bf86))
+
+- More efficient fix for #3661. Re-uses cached style element that needs to be replaced in the document rather than creating a new one. ([commit](https://github.com/Polymer/polymer/commit/63f91ae))
+
+- Fixes #3661: ensure that cached style points to the applied style for Shady DOM styling. This ensures that the cache can be used to determine if a style needs to be applied to the document and prevents extra unnecessary styles from being added. This could happen when a property cascaded to a nested element and updateStyles was called after properties have changed. ([commit](https://github.com/Polymer/polymer/commit/717fc3a))
+
+- Fix flakey attached/detached timing test. ([commit](https://github.com/Polymer/polymer/commit/04da868))
+
+- remove HTML comment ([commit](https://github.com/Polymer/polymer/commit/d339b28))
+
+- add more style[include] doc ([commit](https://github.com/Polymer/polymer/commit/b8fd12d))
+
+- Update the package.json name to match the actual npm published package. (#3570) ([commit](https://github.com/Polymer/polymer/commit/e57eb49))
+
+- Remove unused event cache store (#3591) ([commit](https://github.com/Polymer/polymer/commit/364ede9))
+
+- [ci skip] sudo should be "required" ([commit](https://github.com/Polymer/polymer/commit/c0e0a73))
+
+- transition to travis trusty images ([commit](https://github.com/Polymer/polymer/commit/b7c0b1f))
+
+- fine, console.dir then ([commit](https://github.com/Polymer/polymer/commit/c8cb3be))
+
+- fix ie missing console.table for stubbing ([commit](https://github.com/Polymer/polymer/commit/6d39644))
+
+- Support the devtools console.log api (multiple strings) for polymer logging ([commit](https://github.com/Polymer/polymer/commit/909ee82))
+
+- Compute and use correct annotation value during config ([commit](https://github.com/Polymer/polymer/commit/1b02e96))
+
+- Set propertyName on parent props for config phase. ([commit](https://github.com/Polymer/polymer/commit/d9c03a4))
+
+- Refactorings around how computational expressions get their arguments ([commit](https://github.com/Polymer/polymer/commit/677f10c))
+
+- Fix safari 7 again ([commit](https://github.com/Polymer/polymer/commit/b30f962))
+
+- Expose public API to reset mouse cancelling for testing touch ([commit](https://github.com/Polymer/polymer/commit/18bf9d4))
+
+- Delay detached callback with the same strategy as attached callback ([commit](https://github.com/Polymer/polymer/commit/7a244fa))
+
+- [ci skip] Add missing dom5 devDependency ([commit](https://github.com/Polymer/polymer/commit/5e2050a))
+
+- Don't use `translate` as a method for testing ([commit](https://github.com/Polymer/polymer/commit/f80346f))
+
+- Only fix prototype when registering at first create time. ([commit](https://github.com/Polymer/polymer/commit/7ad2bff))
+
+- Fixes #3525: Makes lazy registration compatible with platforms (like IE10) on which a custom element's prototype must be simulated. ([commit](https://github.com/Polymer/polymer/commit/4834651))
+
+- make sure gulp-cli 1 is used ([commit](https://github.com/Polymer/polymer/commit/29067ca))
+
+- Ensure Annotator recognizes dynamic fn as dependency for parent props. ([commit](https://github.com/Polymer/polymer/commit/15ff463))
+
+- [ci skip] Update CHANGELOG ([commit](https://github.com/Polymer/polymer/commit/223aa34))
+
+- Enabling caching of node_modules on Travis ([commit](https://github.com/Polymer/polymer/commit/6b6ec5d))
+
+- Fix undefined class attribute in undefined template scope ([commit](https://github.com/Polymer/polymer/commit/e21c59e))
+
+- Use a parser based html minification ([commit](https://github.com/Polymer/polymer/commit/0536e35))
+
+- Call _notifyPath instead of notifyPath in templatizer ([commit](https://github.com/Polymer/polymer/commit/067b7ed))
+
+- Keep it real for notifyPath. ([commit](https://github.com/Polymer/polymer/commit/40a1f79))
+
+- Null debounced callback to set for GC. ([commit](https://github.com/Polymer/polymer/commit/f366c1c))
+
+## [v1.4.0](https://github.com/Polymer/polymer/tree/v1.4.0) (2016-03-18)
+- Fast check in createdCallback to see if registration has finished. ([commit](https://github.com/Polymer/polymer/commit/a3fce19))
+
+- even more lazy: defer template lookup and style collection until finish register time. ([commit](https://github.com/Polymer/polymer/commit/103f790))
+
+- fix lint errors. ([commit](https://github.com/Polymer/polymer/commit/d7a2baa))
+
+- * turn on lazy registration via `Polymer.Settings.lazyRegister` * ensure registration finished by calling `Element.prototype.ensureRegisterFinished()` ([commit](https://github.com/Polymer/polymer/commit/31c785d))
+
+- remove crufty smoke test. ([commit](https://github.com/Polymer/polymer/commit/3dd1b61))
+
+- fix lint issues ([commit](https://github.com/Polymer/polymer/commit/0447228))
+
+- Change `forceRegister` to `eagerRegister` and add `Polymer.Settings.eagerRegister` flag. ([commit](https://github.com/Polymer/polymer/commit/f6597ec))
+
+- Add `forceRegister` flag to force an element to fully register when `Polymer` is called. Normally, some work is deferred until the first element instance is created. ([commit](https://github.com/Polymer/polymer/commit/d53323d))
+
+- Call registered no prototype. ([commit](https://github.com/Polymer/polymer/commit/812db6a))
+
+- Lazy register features we can be deferred until first instance. This is an optimization which can speed up page load time when elements are registered but not needed at time of first paint/interaction ([commit](https://github.com/Polymer/polymer/commit/31702ff))
+
+- Do not reflect uppercase properties ([commit](https://github.com/Polymer/polymer/commit/72d35e0))
+
+- Make sure event.path is an array ([commit](https://github.com/Polymer/polymer/commit/2dfdd7b))
+
+- fix testing failures on assert.notInclude of null ([commit](https://github.com/Polymer/polymer/commit/8066919))
+
+- [ci skip] update changelog ([commit](https://github.com/Polymer/polymer/commit/58e6713))
+
+## [v1.3.1](https://github.com/Polymer/polymer/tree/v1.3.1) (2016-03-02)
+- Fix lint errors. ([commit](https://github.com/Polymer/polymer/commit/44d06f1))
+
+- Add test. ([commit](https://github.com/Polymer/polymer/commit/02660c1))
+
+- Fix lint error. ([commit](https://github.com/Polymer/polymer/commit/e2c5f9e))
+
+- Ensure that dom-bind always waits until DOMContentLoaded to render. This ensures a script can install api on the dom-bind prior to it rendering. Previously dom-bind waited for first render, but an early parser yield can make this occur unexpectedly early. ([commit](https://github.com/Polymer/polymer/commit/cc0e9df))
+
+- Refine fix for #3461 so that the decision to apply a static or property stylesheet relies on the same info. ([commit](https://github.com/Polymer/polymer/commit/ff96f9e))
+
+- Clean the .eslintignore ([commit](https://github.com/Polymer/polymer/commit/04d06a5))
+
+- [ci skip] Add header for those asking questions ([commit](https://github.com/Polymer/polymer/commit/9d6111c))
+
+- Fixes #3461: Only avoid creating a statically scoped stylesheet when properties are consumed in an element, properly excluding properties produced as a result of consumption. ([commit](https://github.com/Polymer/polymer/commit/e26a806))
+
+- tweaks to new README ([commit](https://github.com/Polymer/polymer/commit/809352d))
+
+- [ci skip] Update Changelog ([commit](https://github.com/Polymer/polymer/commit/4f3f463))
+
+- Updated the README.md for a non-technical user to understand ([commit](https://github.com/Polymer/polymer/commit/0729cef))
+
+## [v1.3.0](https://github.com/Polymer/polymer/tree/v1.3.0) (2016-02-22)
+- [ci skip] Add instructions to pull request template ([commit](https://github.com/Polymer/polymer/commit/933c920))
+
+- [ci skip] markdown fail ([commit](https://github.com/Polymer/polymer/commit/a8e01e2))
+
+- [ci skip] Add instructions to issue template ([commit](https://github.com/Polymer/polymer/commit/ace0f72))
+
+- Make sure to configure properties on polymer elements that do not have property effects. ([commit](https://github.com/Polymer/polymer/commit/f93c3e5))
+
+- Fix lint errors. ([commit](https://github.com/Polymer/polymer/commit/5ac5ee7))
+
+- Add comment. Ensure Date deserializes to String for correctness. ([commit](https://github.com/Polymer/polymer/commit/69c7087))
+
+- Serialize before deserialize when configuring attrs. Fixes #3433. ([commit](https://github.com/Polymer/polymer/commit/ec85582))
+
+- Restrict early property set to properties that have accessors. This allows users to set properties in `created` which are listed in `properties` but which have no accessor. ([commit](https://github.com/Polymer/polymer/commit/4cfb245))
+
+- fix crlf once and for all ([commit](https://github.com/Polymer/polymer/commit/6c5afe5))
+
+- fix test linting from #3350 ([commit](https://github.com/Polymer/polymer/commit/37f7157))
+
+- Use the new .github folder for issue and pull request templates ([commit](https://github.com/Polymer/polymer/commit/58529c2))
+
+- [ci skip] Use https for jsbin ([commit](https://github.com/Polymer/polymer/commit/3e33fd4))
+
+- [ci skip] Add issue and pr template ([commit](https://github.com/Polymer/polymer/commit/cc1ef9a))
+
+- Update to gulp-eslint v2 ([commit](https://github.com/Polymer/polymer/commit/dca0dda))
+
+- fix lint errors ([commit](https://github.com/Polymer/polymer/commit/7da9a38))
+
+- Minor fixes based on review. ([commit](https://github.com/Polymer/polymer/commit/f2c1d4a))
+
+- Undo fix on IE10 where the custom elements polyfill's mixin strategy makes this unfeasible. ([commit](https://github.com/Polymer/polymer/commit/ef629f4))
+
+- Update comments. ([commit](https://github.com/Polymer/polymer/commit/b870fe0))
+
+- Add test that late resolved functions don't warn ([commit](https://github.com/Polymer/polymer/commit/0037c53))
+
+- Add support for properties defined in a behavior. ([commit](https://github.com/Polymer/polymer/commit/b6abf26))
+
+- Generalized approach supporting compute and observers ([commit](https://github.com/Polymer/polymer/commit/f4486a2))
+
+- Proper implementation ([commit](https://github.com/Polymer/polymer/commit/3c12178))
+
+- Support dynamic functions for computed annotations. ([commit](https://github.com/Polymer/polymer/commit/3f1bc4e))
+
+- ordering issue for when assert is defined in native html imports ([commit](https://github.com/Polymer/polymer/commit/d81f6bc))
+
+- Lint the tests ([commit](https://github.com/Polymer/polymer/commit/e5063ca))
+
+- Add support for one-of attribute selector while not breaking support for general sibling combinator. Fixes #3023. Fix taken from #3067. ([commit](https://github.com/Polymer/polymer/commit/5a493d8))
+
+- Fix bindings with special characters ([commit](https://github.com/Polymer/polymer/commit/d385873))
+
+- [ci skip] move linting into before_script stage ([commit](https://github.com/Polymer/polymer/commit/1b5fc9a))
+
+- Fix lint error and uncomment test. ([commit](https://github.com/Polymer/polymer/commit/c00c47f))
+
+- Add test for overriding property based :host selector from outside. ([commit](https://github.com/Polymer/polymer/commit/71c41ed))
+
+- Add comment and fix typo ([commit](https://github.com/Polymer/polymer/commit/b0e16f0))
+
+- Ensure _propertySetter is installed first. Fixes #3063 ([commit](https://github.com/Polymer/polymer/commit/6362f60))
+
+- Disable tap gesture when track gesture is firing for ancestor node ([commit](https://github.com/Polymer/polymer/commit/6f2c1fc))
+
+- Fix parsing of parenthesis in default of variable declaration ([commit](https://github.com/Polymer/polymer/commit/926d0e5))
+
+- Rename _mapRule to _mapRuleOntoParent ([commit](https://github.com/Polymer/polymer/commit/cd42595))
+
+- Test with ESLint enabled ([commit](https://github.com/Polymer/polymer/commit/acdfc1e))
+
+- Make behaviors array unique ([commit](https://github.com/Polymer/polymer/commit/4cde38a))
+
+- Use deserialize from the node. ([commit](https://github.com/Polymer/polymer/commit/a3641e2))
+
+- Actually execute case-map ([commit](https://github.com/Polymer/polymer/commit/d84d75b))
+
+- [ci skip] .eslintrc is deprecated, add .json suffix ([commit](https://github.com/Polymer/polymer/commit/c7554d9))
+
+- Make the test more look like a spec ([commit](https://github.com/Polymer/polymer/commit/db7c324))
+
+- Configure attr's with property effects. More robust fix for #3288. ([commit](https://github.com/Polymer/polymer/commit/0f55d1d))
+
+- Use ESLint for Polymer ([commit](https://github.com/Polymer/polymer/commit/f3c4bb1))
+
+- Add test suite for effects order ([commit](https://github.com/Polymer/polymer/commit/56df8f7))
+
+- Fix negation when a negated binding is changed ([commit](https://github.com/Polymer/polymer/commit/21383a3))
+
+- Add unit test suite for CaseMap ([commit](https://github.com/Polymer/polymer/commit/ee9a600))
+
+- Fixes for IE style ordering issue. ([commit](https://github.com/Polymer/polymer/commit/162f81e))
+
+- Fixes #3326. Changes inspired by #3276 and #3344 ([commit](https://github.com/Polymer/polymer/commit/b5ba9a8))
+
+- Fix for getters/setters for property become inaccessible when property set on element before it is ready ([commit](https://github.com/Polymer/polymer/commit/ecd9b09))
+
+- Non-destructive `@keyframes` rule transformation. ([commit](https://github.com/Polymer/polymer/commit/b9f2482))
+
+- Fix test regression from PR 3289 ([commit](https://github.com/Polymer/polymer/commit/5205d6a))
+
+- Move test and add to runner. ([commit](https://github.com/Polymer/polymer/commit/aeb44de))
+
+- make isDebouncerActive actually return a bool ([commit](https://github.com/Polymer/polymer/commit/dee9b98))
+
+- Lint the javascript code with eslint ([commit](https://github.com/Polymer/polymer/commit/f7d2bdf))
+
+- i suck at git ([commit](https://github.com/Polymer/polymer/commit/b40f639))
+
+- Fix for scoping when class is not specified on element (null was prepended instead of empty string) ([commit](https://github.com/Polymer/polymer/commit/24e9fc7))
+
+- Using constant rather than plain `:host` and `::content`, also create regexp object only once ([commit](https://github.com/Polymer/polymer/commit/c6c28f5))
+
+- Eliminate the need to write `:host ::content` instead of just `::content`, while keeping the same processing under the hood ([commit](https://github.com/Polymer/polymer/commit/d9f3dda))
+
+- Fix: There is no effect of kind 'computedAnnotation' ([commit](https://github.com/Polymer/polymer/commit/06cd560))
+
+- fix test case in 5d17efc ([commit](https://github.com/Polymer/polymer/commit/4a9ef8e))
+
+- add test for 3326 ([commit](https://github.com/Polymer/polymer/commit/854fdbf))
+
+- [ci skip] update CHANGELOG ([commit](https://github.com/Polymer/polymer/commit/3d2cb71))
+
+- Exclude attribute bindings from configuration. Fixes #3288. ([commit](https://github.com/Polymer/polymer/commit/246ea72))
+
+- Doubled `Polymer.CaseMap.dashToCamelCase` performance with simplified and once compiled RegExp. 5 times faster `Polymer.CaseMap.camelToDashCase` using simplified replace part, simplified and once compiled RegExp. ([commit](https://github.com/Polymer/polymer/commit/90938e3))
+
+- Update PRIMER.md ([commit](https://github.com/Polymer/polymer/commit/bb4d558))
+
+- Unit tests ([commit](https://github.com/Polymer/polymer/commit/de371bb))
+
+- Allow newlines in computed binding argument list ([commit](https://github.com/Polymer/polymer/commit/b745f45))
+
+- Remove redundant assign to window.Polymer ([commit](https://github.com/Polymer/polymer/commit/b2f8e8f))
+
+- parentProps should not override argument based props ([commit](https://github.com/Polymer/polymer/commit/898fe89))
+
+## [v1.2.4](https://github.com/Polymer/polymer/tree/v1.2.4) (2016-01-27)
+- Fixes #3337. When a doc fragment is added, only update the invalidation state of the insertion point list of the shadyRoot IFF it is not already invalid. This fixes an issue that was detected when an a doc fragment that did not include an insertion point was added after one that did but before distribution. ([commit](https://github.com/Polymer/polymer/commit/d26b003))
+
+- fix build output with new vulcanize ([commit](https://github.com/Polymer/polymer/commit/c317711))
+
+- Revert style properties change from fd5778470551f677c2aa5827398681abb1994a88 ([commit](https://github.com/Polymer/polymer/commit/0a0b580))
+
+- Fix shadow dom test. ([commit](https://github.com/Polymer/polymer/commit/6b83911))
+
+- Add shadow root support. (tests broken) ([commit](https://github.com/Polymer/polymer/commit/4b7da35))
+
+- Ensure dom-if moved into doc fragment is torn down. Fixes #3324 ([commit](https://github.com/Polymer/polymer/commit/6c4f5d5))
+
+- improve test. ([commit](https://github.com/Polymer/polymer/commit/d70c40a))
+
+- Update comment. ([commit](https://github.com/Polymer/polymer/commit/aa14687))
+
+- In addition to fragments, also handle non-distributed elements more completely. ([commit](https://github.com/Polymer/polymer/commit/fe2699e))
+
+- Simplify fix for fragment children management. ([commit](https://github.com/Polymer/polymer/commit/713377e))
+
+- Fix test under polyfill. ([commit](https://github.com/Polymer/polymer/commit/25da63d))
+
+- Ensure fragments added via Polymer.dom always have elements removed, even when distribution does not select those elements. ([commit](https://github.com/Polymer/polymer/commit/101eb3d))
+
+- Fixes #3321. Only let dom-repeat insert elements in attached if it has been previously detached; correctly avoid re-adding children in document fragments to an element's logical linked list if they are already there. ([commit](https://github.com/Polymer/polymer/commit/9f2464d))
+
+- Ugh ([commit](https://github.com/Polymer/polymer/commit/172d93c))
+
+- Fixes #3308. Use an explicit undefined check to test if logical tree information exists. ([commit](https://github.com/Polymer/polymer/commit/9106398))
+
+- add test ([commit](https://github.com/Polymer/polymer/commit/b1ea014))
+
+- use class attribute in applyElementScopeSelector ([commit](https://github.com/Polymer/polymer/commit/07d8c06))
+
+- Remove reference to _composedChildren ([commit](https://github.com/Polymer/polymer/commit/9f85acd))
+
+- Fix typo in documentation for set() ([commit](https://github.com/Polymer/polymer/commit/aa47515))
+
+- Fix typo in dom-tree-api ([commit](https://github.com/Polymer/polymer/commit/ae98a7c))
+
+- Correct use of document.contains to document.documentElement.contains on IE. ([commit](https://github.com/Polymer/polymer/commit/0e74810))
+
+- Ensure querySelector always returns `null` when a node is not found. Also optimize querySelector such that the matcher halts on the first result. ([commit](https://github.com/Polymer/polymer/commit/b9e5cce))
+
+- Fixes #3295. Only cache a false-y result for an element's owner shady root iff the element is currently in the document. ([commit](https://github.com/Polymer/polymer/commit/6e16619))
+
+- Use local references to wrapper functions; add test element tree to native shadow tests; reorder test elements. ([commit](https://github.com/Polymer/polymer/commit/47ee2ca))
+
+- Remove leftover garbage line ([commit](https://github.com/Polymer/polymer/commit/d7567b7))
+
+- Removes the case where activeElement could be in the light DOM of a ShadowRoot. ([commit](https://github.com/Polymer/polymer/commit/e848af8))
+
+- DOM API implementation of `activeElement`. ([commit](https://github.com/Polymer/polymer/commit/2984576))
+
+- Remove call to `wrap` in deepContains ([commit](https://github.com/Polymer/polymer/commit/4cbdef7))
+
+- Fixes #3270. ([commit](https://github.com/Polymer/polymer/commit/7d0485b))
+
+- Include more styling tests under ShadowDOM. Fix custom-style media query test to work under both shadow/shady. ([commit](https://github.com/Polymer/polymer/commit/33a24bb))
+
+- Remove duplicate code related to dom traversal in Polymer.dom. ([commit](https://github.com/Polymer/polymer/commit/555252b))
+
+- Fix parsing of minimized css output also for mixins ([commit](https://github.com/Polymer/polymer/commit/87d02e0))
+
+- Set position to relative to make Safari to succeed top/bottom tests ([commit](https://github.com/Polymer/polymer/commit/94f505a))
+
+- Fix parsing of minimized css output ([commit](https://github.com/Polymer/polymer/commit/f92f9ff))
+
+- Fix for `Polymer.dom(...)._query()` method doesn't exist which causes `Polymer.updateStyles()` to fail ([commit](https://github.com/Polymer/polymer/commit/0eea7a6))
+
+- Minor factoring of dom patching. ([commit](https://github.com/Polymer/polymer/commit/8c95014))
+
+- use destination insertion points when calculating the path ([commit](https://github.com/Polymer/polymer/commit/3f8b6ee))
+
+- Store all dom tree data in `__dom` private storage; implement composed patching via a linked list. ([commit](https://github.com/Polymer/polymer/commit/9a3bead))
+
+- Modernize the build ([commit](https://github.com/Polymer/polymer/commit/2b69bb1))
+
+- Add more globals to whitelist for safari ([commit](https://github.com/Polymer/polymer/commit/82b2443))
+
+- Shady patching: patch element accessors in composed tree; fixes HTMLImports polyfill support. ([commit](https://github.com/Polymer/polymer/commit/d135fef))
+
+- remove unused code; minor changes based on review. ([commit](https://github.com/Polymer/polymer/commit/c3fbd10))
+
+- added polymer-mini and polymer-micro to main ([commit](https://github.com/Polymer/polymer/commit/da5d781))
+
+- Updates the patch-don experiment to work with recent changes. ([commit](https://github.com/Polymer/polymer/commit/b9e6859))
+
+- Fixes #3113 ([commit](https://github.com/Polymer/polymer/commit/fadd455))
+
+- Polymer.dom: when adding a node, only remove the node from its existing location if it's not a fragment and has a parent. ([commit](https://github.com/Polymer/polymer/commit/9915627))
+
+- Consistently use TreeApi.Composed api for composed dom manipulation; use TreeApi.Logical methods to get node leaves. Avoid making a Polymer.dom when TreeApi.Logical can provide the needed info. ([commit](https://github.com/Polymer/polymer/commit/5033fdb))
+
+- Produce nicer error on malformed observer ([commit](https://github.com/Polymer/polymer/commit/0e248f5))
+
+- Deduplicate setup and verifying in notify-path test suite ([commit](https://github.com/Polymer/polymer/commit/68707ad))
+
+- more explicit tests for debouncer wait and no-wait behavior ([commit](https://github.com/Polymer/polymer/commit/8ef7bac))
+
+- speed up microtask testing ([commit](https://github.com/Polymer/polymer/commit/9bef4c0))
+
+- ensure isDebouncerActive returns a Boolean ([commit](https://github.com/Polymer/polymer/commit/3916493))
+
+- add more debouncer tests ([commit](https://github.com/Polymer/polymer/commit/0206852))
+
+- remove dead debounce test assertion ([commit](https://github.com/Polymer/polymer/commit/9b898c2))
+
+- Factoring of distribution logic in both add and remove cases. ([commit](https://github.com/Polymer/polymer/commit/8272d5e))
+
+- Minor typo in docs: call the debounce callback ([commit](https://github.com/Polymer/polymer/commit/02c5c79))
+
+- Correct test to avoid using `firstElementChild` on a documentFragment since it is not universally supported. ([commit](https://github.com/Polymer/polymer/commit/dfa6a44))
+
+- Remove all TODOs ([commit](https://github.com/Polymer/polymer/commit/6467ae1))
+
+- Revert "Add .gitattributes to solve line endings cross-OS (merge after other PRs)" ([commit](https://github.com/Polymer/polymer/commit/b6b8293))
+
+- Make renderedItemCount readOnly & add tests. ([commit](https://github.com/Polymer/polymer/commit/e39d5ba))
+
+- Revert "Fix parsing of minimized css output" ([commit](https://github.com/Polymer/polymer/commit/d3145e8))
+
+- Custom setProperty for bindings to hidden textNodes. Fixes #3157. ([commit](https://github.com/Polymer/polymer/commit/c6be10d))
+
+- Ensure dom-if in host does not restamp when host detaches. Fixes #3125. ([commit](https://github.com/Polymer/polymer/commit/bb85e2b))
+
+- Avoid making a copy of childNodes when a dom fragment is inserted in the logical tree. ([commit](https://github.com/Polymer/polymer/commit/dcbafbf))
+
+- Slightly faster `findAnnotatedNodes` ([commit](https://github.com/Polymer/polymer/commit/43fc853))
+
+- Add .gitattributes to solve line endings cross-OS ([commit](https://github.com/Polymer/polymer/commit/94c2bc2))
+
+- Ensure literals are excluded from parent props. Fixes #3128. Fixes #3121. ([commit](https://github.com/Polymer/polymer/commit/526fa3c))
+
+- Fix parsing of minimized css output ([commit](https://github.com/Polymer/polymer/commit/d458690))
+
+- Disable chunked dom-repeat tests on IE due to CI rAF flakiness. ([commit](https://github.com/Polymer/polymer/commit/7fe5e2b))
+
+- Add comment. ([commit](https://github.com/Polymer/polymer/commit/d8ecd45))
+
+- Make Polymer.dom.flush reentrant-safe. Fixes #3115. ([commit](https://github.com/Polymer/polymer/commit/644105a))
+
+- Fixes #3108. Moves `debounce` functionality from polymer-micro to polymer-mini. The functionality belongs at the mini tier and was never actually functional in micro. ([commit](https://github.com/Polymer/polymer/commit/3df4ef2))
+
+- Clarify this is for IE. ([commit](https://github.com/Polymer/polymer/commit/63782fa))
+
+- Patch rAF to setTimeout to reduce flakiness on CI. ([commit](https://github.com/Polymer/polymer/commit/35abadc))
+
+- added missing semicolons, removed some unused variables ([commit](https://github.com/Polymer/polymer/commit/00ed797))
+
+- ?Node ([commit](https://github.com/Polymer/polymer/commit/9385891))
+
+- Remove closures holding element references after mouseup/touchend ([commit](https://github.com/Polymer/polymer/commit/811f766))
+
+- set class attribute instead of using classname ([commit](https://github.com/Polymer/polymer/commit/690838a))
+
+- Include wildcard character in identifier. Fixes #3084. ([commit](https://github.com/Polymer/polymer/commit/c36d6c1))
+
+- Revert fromAbove in applyEffectValue. Add test. Fixes #3077. ([commit](https://github.com/Polymer/polymer/commit/156122c))
+
+- loosen isLightDescendant's @param type to Node ([commit](https://github.com/Polymer/polymer/commit/c635797))
+
+- Put beforeRegister in the behaviorProperties. ([commit](https://github.com/Polymer/polymer/commit/445b6cd))
+
+- ES5 strict doesn't like function declarations inside inner blocks. ([commit](https://github.com/Polymer/polymer/commit/51d3fa6))
+
+- Fixes #3065: Add dom-repeat.renderedItemCount property ([commit](https://github.com/Polymer/polymer/commit/b589f70))
+
+- Minor factoring; ensure base properties set on instance. ([commit](https://github.com/Polymer/polymer/commit/da15ff0))
+
+- Fix typos. ([commit](https://github.com/Polymer/polymer/commit/c12d3ed))
+
+- Simplify more. ([commit](https://github.com/Polymer/polymer/commit/186e053))
+
+- Improvements to regex. ([commit](https://github.com/Polymer/polymer/commit/a3d17d5))
+
+- Give dom-repeat#_targetFrameTime a type ([commit](https://github.com/Polymer/polymer/commit/adad9ce))
+
+- [skip ci] update travis config to firefox latest ([commit](https://github.com/Polymer/polymer/commit/608ce9f))
+
+- Add a couple of tests. ([commit](https://github.com/Polymer/polymer/commit/108b7f9))
+
+- Suppress warnings and expected errors in test suite ([commit](https://github.com/Polymer/polymer/commit/92d6fcb))
+
+- Use linked-list for element tree traversal. Factor Polymer.DomApi into shadow/shady modules. ([commit](https://github.com/Polymer/polymer/commit/306cc81))
+
+- Avoid throwing with invalid keys/paths. Fixes #3018. ([commit](https://github.com/Polymer/polymer/commit/5076ee0))
+
+- Use stricter binding parsing for efficiency and correctness. Fixes #2705. ([commit](https://github.com/Polymer/polymer/commit/04cd184))
+
+- Simpler travis config ([commit](https://github.com/Polymer/polymer/commit/68b457d))
+
+- [ci skip] Update Changelog ([commit](https://github.com/Polymer/polymer/commit/7e7600a))
+
+- Fix for incorrect CSS selectors specificity as reported in #2531 Fix for overriding mixin properties, fixes #1873 Added awareness from `@apply()` position among other rules so that it is preserved after CSS variables/mixing substitution. `Polymer.StyleUtil.clearStyleRules()` method removed as it is not used anywhere. Some unused variables removed. Typos, unused variables and unnecessary escaping in regexps corrected. Tests added. ([commit](https://github.com/Polymer/polymer/commit/fd57784))
+
+- Fix for method parsing in computed binding ([commit](https://github.com/Polymer/polymer/commit/c2e43d3))
+
+- Fix doc typo. ([commit](https://github.com/Polymer/polymer/commit/8886c2c))
+
+- Filtering causes unexpected issues ([commit](https://github.com/Polymer/polymer/commit/df22564))
+
+- Fix using value$ on input element ([commit](https://github.com/Polymer/polymer/commit/05a1e95))
+
+- added missing semicolons, removed some unused variables ([commit](https://github.com/Polymer/polymer/commit/338574d))
+
+## [v1.2.3](https://github.com/Polymer/polymer/tree/v1.2.3) (2015-11-16)
+- Call decorate instead of bootstrap for template prepping ([commit](https://github.com/Polymer/polymer/commit/e2a2cfd))
+
+- Fix global leak test. Necessary due to changes to test harness. ([commit](https://github.com/Polymer/polymer/commit/134766f))
+
+- Defer property application only when a custom-style is first created. ([commit](https://github.com/Polymer/polymer/commit/4bf0e13))
+
+- Update comment. ([commit](https://github.com/Polymer/polymer/commit/27e1dcd))
+
+- Simplify custom-style property deferment. ([commit](https://github.com/Polymer/polymer/commit/a970493))
+
+- [ci skip] update changelog ([commit](https://github.com/Polymer/polymer/commit/98acb3a))
+
+- Fixes #2692. Ensures that custom-style properties are applied async but before next render so that all properties are defined before any are consumed by custom-styles. Also refines dom-module's early upgrade code so that it does not affect other elements (corrects for example, custom-styles upgrading before expected). ([commit](https://github.com/Polymer/polymer/commit/b829f2a))
+
+- Remove undesired full-stop from outputs ([commit](https://github.com/Polymer/polymer/commit/68d5c55))
+
+- Fix Formatting ([commit](https://github.com/Polymer/polymer/commit/724e1bc))
+
+## [v1.2.2](https://github.com/Polymer/polymer/tree/v1.2.2) (2015-11-12)
+- use local reference for wrap. ([commit](https://github.com/Polymer/polymer/commit/b15e5b9))
+
+- Add Polymer.DomApi.wrap ([commit](https://github.com/Polymer/polymer/commit/6cf974a))
+
+- For correctness, bind listeners must use a property's current value rather than its passed value. ([commit](https://github.com/Polymer/polymer/commit/aca404f))
+
+- Explicitly making an element's `_template` falsy is now considered an allowable setting. This means the element stamps no content, doesn't collect any styles, and avoids looking up a dom-module. This helps address #2708 and the 5 elements Polymer registers that have no template have been set with `_template: null`. ([commit](https://github.com/Polymer/polymer/commit/b905a37))
+
+- Make test work under native Shadow DOM. ([commit](https://github.com/Polymer/polymer/commit/4f9c2bd))
+
+- In `_notifyListener`, only use `e.detail` if the event has a detail. This is necessary for `::eventName` compatibility where `eventName` is a native event like `change`. ([commit](https://github.com/Polymer/polymer/commit/3ece552))
+
+- Fix TOC re: host event listeners. ([commit](https://github.com/Polymer/polymer/commit/ce32459))
+
+- Fix compound bindings with braces in literals ([commit](https://github.com/Polymer/polymer/commit/561b28b))
+
+- Re-enable listeners of the form 'a.b' (todo: make this more efficient). ([commit](https://github.com/Polymer/polymer/commit/139257b))
+
+- Avoid stomping on property objects when mixing behaviors. ([commit](https://github.com/Polymer/polymer/commit/ec4d313))
+
+- Update test to avoid template polyfill issues. ([commit](https://github.com/Polymer/polymer/commit/fa96ff3))
+
+- Ensure parent node exists when stamping. Fixes #2685. ([commit](https://github.com/Polymer/polymer/commit/62f2d2a))
+
+- Add global leak test to runner. ([commit](https://github.com/Polymer/polymer/commit/dc2255c))
+
+- Add global leak test. ([commit](https://github.com/Polymer/polymer/commit/7f71b4c))
+
+- Fix typo that prevented correct functioning of Polymer.dom under Shadow DOM and add tests to catch. ([commit](https://github.com/Polymer/polymer/commit/cdc9fde))
+
+- maintain compatibility with older `_notifyChange` arguments. ([commit](https://github.com/Polymer/polymer/commit/f5aec30))
+
+- Weird assignment fix ([commit](https://github.com/Polymer/polymer/commit/9e6f77a))
+
+- add comment. ([commit](https://github.com/Polymer/polymer/commit/f2d5f44))
+
+- For efficiency, use cached events in data system, for property and path changes. ([commit](https://github.com/Polymer/polymer/commit/da71dfe))
+
+- Fixes #2690 ([commit](https://github.com/Polymer/polymer/commit/d8b78d4))
+
+- change after render method to `Polymer.RenderStatus.afterNextRender` ([commit](https://github.com/Polymer/polymer/commit/8949c04))
+
+- When effect values are applied via bindings, use fromAbove gambit to avoid unnecessary wheel spinning. (This is now possible since we have fast lookup for readOnly where we want to avoid doing the set at all). ([commit](https://github.com/Polymer/polymer/commit/c520907))
+
+- do readOnly check for configured properties where they are handed down, rather than when they are consumed. ([commit](https://github.com/Polymer/polymer/commit/24bcedb))
+
+- Minor cleanup. ([commit](https://github.com/Polymer/polymer/commit/0b21506))
+
+- Avoid creating unnecessary placeholders for full refresh. ([commit](https://github.com/Polymer/polymer/commit/996289a))
+
+- Simplify ([commit](https://github.com/Polymer/polymer/commit/c5e1135))
+
+- Fix typo. ([commit](https://github.com/Polymer/polymer/commit/680c56d))
+
+- Update docs. ([commit](https://github.com/Polymer/polymer/commit/352ccbe))
+
+- _removeInstance -> _detachAndRemoveInstance ([commit](https://github.com/Polymer/polymer/commit/ba7a16f))
+
+- Remove limit & chunkCount API. Refactor insert/remove. ([commit](https://github.com/Polymer/polymer/commit/f447c0e))
+
+- add back deepContains (got removed incorrectly in merge). ([commit](https://github.com/Polymer/polymer/commit/d53ab57))
+
+- fix line endings. ([commit](https://github.com/Polymer/polymer/commit/0233d6d))
+
+- revert host attributes ordering change optimization as it was not worth the trouble (barely measurable and more cumbersome impl). ([commit](https://github.com/Polymer/polymer/commit/f9894a0))
+
+- rename host functions fix typos afterFirstRender is now raf+setTimeout dom-repeat: remove cruft ([commit](https://github.com/Polymer/polymer/commit/d82840b))
+
+- Fix Gestures when using SD polyfill ([commit](https://github.com/Polymer/polymer/commit/96e4bfa))
+
+- Fix for multiple consequent spaces present in CSS selectors, fixes #2670 ([commit](https://github.com/Polymer/polymer/commit/ecddb56))
+
+- avoid configuration work when unnecessary ([commit](https://github.com/Polymer/polymer/commit/e0fbfbe))
+
+- lazily create effect objects so we can more easily abort processing. avoid forEach ([commit](https://github.com/Polymer/polymer/commit/66df196))
+
+- provides support for memoizing pathFn on effect; only process effects/listeners if they exist. ([commit](https://github.com/Polymer/polymer/commit/a2376b6))
+
+- memoize pathFn on effect (note: notifyPath change made in previous commit); avoid forEach. ([commit](https://github.com/Polymer/polymer/commit/d93340a))
+
+- Avoid using .slice and .forEach ([commit](https://github.com/Polymer/polymer/commit/d2c02a9))
+
+- Added support for short unicode escape sequences, fixes #2650 ([commit](https://github.com/Polymer/polymer/commit/2c87145))
+
+- Fix for BEM-like CSS selectors under media queries, fixes #2639. Small optimization for produced CSS (empty rules produced semicolon before, now empty string). ([commit](https://github.com/Polymer/polymer/commit/35c89f1))
+
+- Fix parsing of custom properties with 'var' in value ([commit](https://github.com/Polymer/polymer/commit/61abfbd))
+
+- Clean up cruft. ([commit](https://github.com/Polymer/polymer/commit/59c27fa))
+
+- Add tests and fix issues. ([commit](https://github.com/Polymer/polymer/commit/e99e5fa))
+
+- dom-repeat chunked/throttled render API ([commit](https://github.com/Polymer/polymer/commit/e9aebd7))
+
+- Fix formatting. ([commit](https://github.com/Polymer/polymer/commit/56734a7))
+
+- Add notes on running unit tests. ([commit](https://github.com/Polymer/polymer/commit/492f310))
+
+- Corrected method name. Fixes #2649. ([commit](https://github.com/Polymer/polymer/commit/5168604))
+
+- Fix typos in more efficient array copying. ([commit](https://github.com/Polymer/polymer/commit/53f3a7d))
+
+- Adds `Polymer.RenderStatus.afterFirstRender` method. Call to perform tasks after an element first renders. ([commit](https://github.com/Polymer/polymer/commit/71b5c2a))
+
+- More efficient array management in Polymer.DomApi. ([commit](https://github.com/Polymer/polymer/commit/320d5c7))
+
+- Fixes #2652 ([commit](https://github.com/Polymer/polymer/commit/e35c4e9))
+
+- [ci skip] update changelog ([commit](https://github.com/Polymer/polymer/commit/0dc69df))
+
+- Fix whitespace around bindings. ([commit](https://github.com/Polymer/polymer/commit/d7d0ed6))
+
+- Add support for `strip-whitespace`. Should fix #2511. ([commit](https://github.com/Polymer/polymer/commit/35a1b94))
+
+- Improve efficiency of attribute configuration. ([commit](https://github.com/Polymer/polymer/commit/f7d86e9))
+
+- Remove use of Function.bind ([commit](https://github.com/Polymer/polymer/commit/25aab8b))
+
+- fix typos. ([commit](https://github.com/Polymer/polymer/commit/5fb20da))
+
+- Re-use data change events. Remove unused/undocumented listener object specific node listening feature. ([commit](https://github.com/Polymer/polymer/commit/8bdedf3))
+
+- Add flattened properties to dom-bind, templatizer, optimize by 'liming properties that are protected/private and not readOnly from list. ([commit](https://github.com/Polymer/polymer/commit/2ba08ec))
+
+- Use flattened list of properties for fast access during configuration and attribute->property ([commit](https://github.com/Polymer/polymer/commit/acdd242))
+
+- Assemble effect strings at prototype time. ([commit](https://github.com/Polymer/polymer/commit/4745e8f))
+
+- Fallback to string lookup to fix support for extra effects. ([commit](https://github.com/Polymer/polymer/commit/d3c4611))
+
+- Fix typo. ([commit](https://github.com/Polymer/polymer/commit/ead9adb))
+
+- Correct NodeList copying. ([commit](https://github.com/Polymer/polymer/commit/1d29e19))
+
+- Avoid Polymer.dom.setAttribute when unneeded. ([commit](https://github.com/Polymer/polymer/commit/9c5a404))
+
+- More efficient iteration. ([commit](https://github.com/Polymer/polymer/commit/23a9a06))
+
+- Avoid forEach ([commit](https://github.com/Polymer/polymer/commit/ebeaf80))
+
+- Copy dom NodeList faster than slice. ([commit](https://github.com/Polymer/polymer/commit/8cad475))
+
+- Avoid function lookup by string. ([commit](https://github.com/Polymer/polymer/commit/e2674bc))
+
+- Add test for parsing multi-line css comments ([commit](https://github.com/Polymer/polymer/commit/6f21ae6))
+
+## [v1.2.1](https://github.com/Polymer/polymer/tree/v1.2.1) (2015-10-29)
+- Fix test for SD polyfill ([commit](https://github.com/Polymer/polymer/commit/dd8b3e9))
+
+- Add pre-condition check for completeness. ([commit](https://github.com/Polymer/polymer/commit/89304dc))
+
+- Find non distributed children with deepContains ([commit](https://github.com/Polymer/polymer/commit/8e6f55a))
+
+- Ensure outer paths aren't forwarded to instance props. Fixes #2556. ([commit](https://github.com/Polymer/polymer/commit/01273e9))
+
+- Add `Polymer.dom.deepContains` ([commit](https://github.com/Polymer/polymer/commit/279bf63))
+
+- [ci skip] Update CHANGELOG ([commit](https://github.com/Polymer/polymer/commit/e1f83d2))
+
+- isLightDescendant should return false for self ([commit](https://github.com/Polymer/polymer/commit/a0debf4))
+
+- Fix for mixins declaration with space before colon. Allow any space character or even `{` and `}` (before and after capturing pattern correspondingly) as pattern boundaries instead of new lines only. In minified sources there might be no space, semicolon or line start, so we need to account that as well. ([commit](https://github.com/Polymer/polymer/commit/883aa5c))
+
+## [v1.2.0](https://github.com/Polymer/polymer/tree/v1.2.0) (2015-10-22)
+- A simpler travis config ([commit](https://github.com/Polymer/polymer/commit/3338b67))
+
+- Fix #2587: When Polymer.dom(el).appendChild(node) is called, cleanup work must be performed on the existing parent of node. This change fixes a missing case in this cleanup work: if the existing parent has a observer via `Polymer.dom(parent).observeNodes`, it needs to be notified that node is being removed even if the node does not have specific logical info. For example, if an observed node has no Shady DOM and has a child that is removed. A test for this case was added. ([commit](https://github.com/Polymer/polymer/commit/0d4f418))
+
+- add fancy travis status badge to the readme ([commit](https://github.com/Polymer/polymer/commit/e29fca8))
+
+- Do not configure compound property/attribute binding if literal if empty. Fixes #2583. ([commit](https://github.com/Polymer/polymer/commit/ca4724a))
+
+- Update .travis.yml ([commit](https://github.com/Polymer/polymer/commit/ef366c5))
+
+- Remove web-component-tester cache. ([commit](https://github.com/Polymer/polymer/commit/4ae23ce))
+
+- Fix IE10 regressions. Fixes #2582 * Copy attribute list before modifying it * Fall back to document for current document if no currentScript ([commit](https://github.com/Polymer/polymer/commit/ee65e68))
+
+- Allow _atEndOfMicrotask to be patchable. ([commit](https://github.com/Polymer/polymer/commit/e2d8446))
+
+- contributing copy fixup ([commit](https://github.com/Polymer/polymer/commit/ed22c50))
+
+- Update CONTRIBUTING.md ([commit](https://github.com/Polymer/polymer/commit/0c21efc))
+
+- Add travis config ([commit](https://github.com/Polymer/polymer/commit/6fb7684))
+
+- Factor into functions. ([commit](https://github.com/Polymer/polymer/commit/b2117dc))
+
+- Fix deepEqual on Safari 9 due to Safari enumeration bug. ([commit](https://github.com/Polymer/polymer/commit/445d603))
+
+- ensure distribution observers see all changes that can come from attributes under native Shadow DOM; +minor factoring ([commit](https://github.com/Polymer/polymer/commit/344f5cc))
+
+- Add <content>.getDistributedNodes observation. Refactor flush. ([commit](https://github.com/Polymer/polymer/commit/8b1face))
+
+- Add docs ([commit](https://github.com/Polymer/polymer/commit/0ede79a))
+
+- Make shadow attribute tracking automatic based on detecting a <content select> that depends on attributes; add tests. ([commit](https://github.com/Polymer/polymer/commit/54911a7))
+
+- Add comments. ([commit](https://github.com/Polymer/polymer/commit/758c483))
+
+- Fix typo. ([commit](https://github.com/Polymer/polymer/commit/74a87a0))
+
+- Replace _compoundInitializationEffect with statically-initialized literals in the template for attributes & textContent, and by configuring literal values of properties in _configureAnnotationReferences. ([commit](https://github.com/Polymer/polymer/commit/2f1bd31))
+
+- Simplify change tracking by always dirty checking at the observer level. Under Shadow DOM, use a deep MO to watch for attributes. ([commit](https://github.com/Polymer/polymer/commit/669acaa))
+
+- Fix URL to component.kitchen ([commit](https://github.com/Polymer/polymer/commit/d9af504))
+
+- Update the Google+ community link ([commit](https://github.com/Polymer/polymer/commit/c6684e5))
+
+- Fixes from review. ([commit](https://github.com/Polymer/polymer/commit/a300862))
+
+- Remove compound binding limitation from primer. ([commit](https://github.com/Polymer/polymer/commit/b1c1b35))
+
+- Exclude compound bindings from configure; revisit later. ([commit](https://github.com/Polymer/polymer/commit/1035e2d))
+
+- Apply effect value from compound parts. ([commit](https://github.com/Polymer/polymer/commit/c30ac10))
+
+- Store binding parts in notes. ([commit](https://github.com/Polymer/polymer/commit/1026498))
+
+- Fix missing var ([commit](https://github.com/Polymer/polymer/commit/68edb83))
+
+- Add radix for correctness. ([commit](https://github.com/Polymer/polymer/commit/a79f012))
+
+- Separate public & private get, flip conditions, add notifyPath API. ([commit](https://github.com/Polymer/polymer/commit/97503ec))
+
+- Fix typo in comments. ([commit](https://github.com/Polymer/polymer/commit/e59dbef))
+
+- Improvements to path API. Fixes #2509. * Allows `set` to take paths with array #keys * Allows `notifyPath` to take paths with array indices * Exposes public notifySplices API ([commit](https://github.com/Polymer/polymer/commit/10021cc))
+
+- Fix merge issue. ([commit](https://github.com/Polymer/polymer/commit/85c23e1))
+
+- Denote keys with # to disambiguate from index. Fixes #2007. ([commit](https://github.com/Polymer/polymer/commit/85d8a3a))
+
+- update CHANGELOG to 1.1.5 ([commit](https://github.com/Polymer/polymer/commit/b2b23c4))
+
+- make tests work on polyfill. ([commit](https://github.com/Polymer/polymer/commit/9ff2ee4))
+
+- add `observeNodes` tests. ([commit](https://github.com/Polymer/polymer/commit/bd90b57))
+
+- Add optional attribute tracking to support better distributed node notifications under shadow dom. ([commit](https://github.com/Polymer/polymer/commit/8242a98))
+
+- Add `Polymer.dom().notifyObservers` method to 'kick' observers, for example, when attributes change under Shadow DOM. ([commit](https://github.com/Polymer/polymer/commit/07261e4))
+
+- Add mutation tracking for distributedNodes. ([commit](https://github.com/Polymer/polymer/commit/b11f86b))
+
+- Factor dom-api's into separate helpers. ([commit](https://github.com/Polymer/polymer/commit/effedcb))
+
+- Adds `Polymer.dom(element).observeChildren(callback)` api ([commit](https://github.com/Polymer/polymer/commit/6499e83))
+
+- Adds `getEffectiveChildNodes`, `getEffectiveChildren`, `getEffectiveTextContent` ([commit](https://github.com/Polymer/polymer/commit/f34fb45))
+
+## [v1.1.5](https://github.com/Polymer/polymer/tree/v1.1.5) (2015-10-08)
+- Simplify ([commit](https://github.com/Polymer/polymer/commit/79dfe1f))
+
+- Clean up templatizer _pathEffectorImpl. ([commit](https://github.com/Polymer/polymer/commit/1a89bcf))
+
+- Add issue link. ([commit](https://github.com/Polymer/polymer/commit/e4c2433))
+
+- Missing var keyword ([commit](https://github.com/Polymer/polymer/commit/45fcbcf))
+
+- Make sure we only actually call _listen once ([commit](https://github.com/Polymer/polymer/commit/837e9b8))
+
+- Add templatizer tests. Fix issues from tests. ([commit](https://github.com/Polymer/polymer/commit/2d97cd7))
+
+- Use 'value' in place of 'object' when referring to detail. ([commit](https://github.com/Polymer/polymer/commit/f17be35))
+
+- Allow any type, not just objects, as the detail for fire. ([commit](https://github.com/Polymer/polymer/commit/ec59f57))
+
+- Make model param of stamp method optional. ([commit](https://github.com/Polymer/polymer/commit/a2e1e64))
+
+- add test to ensure unlisten events do not fire ([commit](https://github.com/Polymer/polymer/commit/bf2f694))
+
+- add tests ([commit](https://github.com/Polymer/polymer/commit/900d82b))
+
+- Only one real listener per `listen` call ([commit](https://github.com/Polymer/polymer/commit/8bd380a))
+
+- add util method for shadow children ([commit](https://github.com/Polymer/polymer/commit/1e9110a))
+
+- Add notify-path API to templatized template. Fixes #2505. ([commit](https://github.com/Polymer/polymer/commit/2e086fe))
+
+- Parent property values should come from template. Fixes #2504. ([commit](https://github.com/Polymer/polymer/commit/23c883b))
+
+- Added note about including a clear repro case. ([commit](https://github.com/Polymer/polymer/commit/e18f009))
+
+- added request to submit an issue before sending a PR ([commit](https://github.com/Polymer/polymer/commit/6ed836f))
+
+- update CHANGELOG to 1.1.4 ([commit](https://github.com/Polymer/polymer/commit/c2b7c31))
+
+## [v1.1.4](https://github.com/Polymer/polymer/tree/v1.1.4) (2015-09-25)
+- :memo: Update description ([commit](https://github.com/Polymer/polymer/commit/6afb8be))
+
+- :art: Use npm command bin lookup ([commit](https://github.com/Polymer/polymer/commit/84258d4))
+
+- :grapes: Add missing test dependency ([commit](https://github.com/Polymer/polymer/commit/5726b8e))
+
+- Reset handlers queue after finished replaying events ([commit](https://github.com/Polymer/polymer/commit/76a5f17))
+
+- Update the README.md to Polymer 1.1 ([commit](https://github.com/Polymer/polymer/commit/40c455a))
+
+- Add note on arrayDelete with array vs. path ([commit](https://github.com/Polymer/polymer/commit/d2b71a5))
+
+- Add unlinkPath tests. ([commit](https://github.com/Polymer/polymer/commit/bee110b))
+
+- Update changelog ([commit](https://github.com/Polymer/polymer/commit/573ca29))
+
+- Remove dead code; add tests. ([commit](https://github.com/Polymer/polymer/commit/ab85884))
+
+- Allow multiple paths to be linked using linkPath. Fixes #2048 ([commit](https://github.com/Polymer/polymer/commit/b221dbe))
+
+- Fix docs for stamp method ([commit](https://github.com/Polymer/polymer/commit/8adbe60))
+
+- http to https for jsbin ([commit](https://github.com/Polymer/polymer/commit/d842435))
+
+- Typo ([commit](https://github.com/Polymer/polymer/commit/d558c0d))
+
+- Fix typos in PRIMER.md ([commit](https://github.com/Polymer/polymer/commit/cf793f4))
+
+## [v1.1.3](https://github.com/Polymer/polymer/tree/v1.1.3) (2015-09-04)
+- Fixes #2403 ([commit](https://github.com/Polymer/polymer/commit/a6694b7))
+
+- Only try to decrement gesture dependency counter if dependency exists ([commit](https://github.com/Polymer/polymer/commit/8886e8c))
+
+- update changelog with v1.1.2 ([commit](https://github.com/Polymer/polymer/commit/d3a7c93))
+
+- prepare v1.1.2 ([commit](https://github.com/Polymer/polymer/commit/e78be4f))
+
+## [v1.1.2](https://github.com/Polymer/polymer/tree/v1.1.2) (2015-08-28)
+- Improve composed parent tracking. ([commit](https://github.com/Polymer/polymer/commit/4d15789))
+
+- move the mixing-in of behaviors so that it happens before `register` behaviors are invoked ([commit](https://github.com/Polymer/polymer/commit/637367c))
+
+- Fixes #2378 ([commit](https://github.com/Polymer/polymer/commit/a9f081b))
+
+- Fixes #2356: issue a warning and don't throw an exception when a style include cannot be found. Fixes #2357: include data now comes before any textContent in a style element. ([commit](https://github.com/Polymer/polymer/commit/a16ada1))
+
+- remove unneeded protection code for extends. ([commit](https://github.com/Polymer/polymer/commit/8eada87))
+
+- Add test ([commit](https://github.com/Polymer/polymer/commit/47ff0e8))
+
+- add test for `registered` behavior affecting a value then used by features ([commit](https://github.com/Polymer/polymer/commit/230528c))
+
+- add tests for new Polymer() argument support (and make Base tests aware of new abstract method `_desugarBehaviors`) ([commit](https://github.com/Polymer/polymer/commit/9734a3a))
+
+- invoke `registration` behavior before registering features, so behaviors can alter features, this requires calling behavior flattening as part of prototype desugaring instead of as part of behavior prep, so the flattened list is available early ([commit](https://github.com/Polymer/polymer/commit/6224dc3))
+
+- do `registered` behaviors before invoking `registerFeatures` so `registered` can affect properties used by features (ref #2329) ([commit](https://github.com/Polymer/polymer/commit/61d611c))
+
+- specifically create `Polymer` object on `window` to satisfy strict mode (fixes #2363) ([commit](https://github.com/Polymer/polymer/commit/a75133d))
+
+- Remove forceUpgraded check in dom-module.import ([commit](https://github.com/Polymer/polymer/commit/b85b641))
+
+- Fixes #2341: branch Polymer.dom to use native dom methods under Shadow DOM for: appendChild, insertBefore, removeChild, replaceChild, cloneNode. ([commit](https://github.com/Polymer/polymer/commit/9b1f706))
+
+- Fixes #2334: when composing nodes in shady dom, check if a node is where we expect it to be before removing it from its distributed position. We do this because the node may have been moved by Polymer.dom in a way that triggered distribution of its previous location. The node is already where it needs to be so removing it from its parent when it's no longer distributed is destructive. ([commit](https://github.com/Polymer/polymer/commit/4ea69c2))
+
+- use cached template annotations when possible ([commit](https://github.com/Polymer/polymer/commit/b0733d3))
+
+- fix comment typos ([commit](https://github.com/Polymer/polymer/commit/a0a3e0c))
+
+- Update changelog with v1.1.1 release ([commit](https://github.com/Polymer/polymer/commit/12fa867))
+
+## [v1.1.1](https://github.com/Polymer/polymer/tree/v1.1.1) (2015-08-20)
+- Fixes #2263: ensure custom-style can parse variable definitions in supported selectors (e.g. /deep/) without exception due to unknown css. ([commit](https://github.com/Polymer/polymer/commit/894492b))
+
+- Fixes #2311, #2323: when elements are removed from their previous position when they are added elsewhere, make sure to remove them from composed, not logical parent. ([commit](https://github.com/Polymer/polymer/commit/3d93116))
+
+- Update Changelog ([commit](https://github.com/Polymer/polymer/commit/039ef93))
+
+- Add selectedItem property ([commit](https://github.com/Polymer/polymer/commit/d65acd0))
+
+- Add test for large splice ([commit](https://github.com/Polymer/polymer/commit/c967583))
+
+- Use numeric sort when removing dom-repeat instances ([commit](https://github.com/Polymer/polymer/commit/fccbd8a))
+
+- Fixes #2267: properly find dom-module for mixed case elements ([commit](https://github.com/Polymer/polymer/commit/76c58b8))
+
+- Fixes #2304: avoid trying to read style data from imports that did not load. ([commit](https://github.com/Polymer/polymer/commit/0d1f206))
+
+- Avoid saving logical info on parent when a content is added inside a fragment + slight factoring. ([commit](https://github.com/Polymer/polymer/commit/36072be))
+
+- Fixes #2276: avoid losing logical information and simplify logical tree handling ([commit](https://github.com/Polymer/polymer/commit/ee61627))
+
+- Moved check earlier. Added test for negative literal. ([commit](https://github.com/Polymer/polymer/commit/1a87ab4))
+
+- Fixes #2253: refine logical tree check and populate parents of insertion points with logical info only if necessary. Fixes #2283: when a node is removed, we need to potentially distribute not only its host but also its parent. ([commit](https://github.com/Polymer/polymer/commit/6619f6c))
+
+- Support for negative numbers in computed bindings ([commit](https://github.com/Polymer/polymer/commit/fc53f50))
+
+## [v1.1.0](https://github.com/Polymer/polymer/tree/v1.1.0) (2015-08-13)
+- Add comment. ([commit](https://github.com/Polymer/polymer/commit/337b54a))
+
+- Add tests for key splice fix. ([commit](https://github.com/Polymer/polymer/commit/4bc055b))
+
+- Fixes #2251: resolve imported stylesheets against correct document. ([commit](https://github.com/Polymer/polymer/commit/68af666))
+
+- Reduce keySplices to minimum change set before notifying. Fixes #2261 ([commit](https://github.com/Polymer/polymer/commit/f74d072))
+
+- Make `clearSelection` public. ([commit](https://github.com/Polymer/polymer/commit/7497729))
+
+- Add logical info iff an element being added is an insertion point; do not add logical info for any element in a shady root. ([commit](https://github.com/Polymer/polymer/commit/45cb150))
+
+- Make `clearSelection` public. ([commit](https://github.com/Polymer/polymer/commit/d55be7d))
+
+- Fixes #2235. Manages logical information in shady distribution more directly by capturing it explicitly when needed and not whenever distribution is run. ([commit](https://github.com/Polymer/polymer/commit/21500fb))
+
+- ensure path fixup is applied correctly to styles in templates. ([commit](https://github.com/Polymer/polymer/commit/b22f3cd))
+
+- Based on feedback, change `module` to `include` in custom-style and dom-module style marshaling. ([commit](https://github.com/Polymer/polymer/commit/f469129))
+
+- Document custom-style module property. ([commit](https://github.com/Polymer/polymer/commit/398d9f7))
+
+- Add comment. ([commit](https://github.com/Polymer/polymer/commit/4e640c7))
+
+- Add tests and require `module` to be on `style` elements. ([commit](https://github.com/Polymer/polymer/commit/58d3c3b))
+
+- `custom-style` supports `module` property that accepts a `dom-module` containing style data. `don-module` style data may be specified inside `<template>` elements and style elements also support module attribute for referencing additional modules containing style data. ([commit](https://github.com/Polymer/polymer/commit/3734c4d))
+
+- don-module no longer needs to eagerly upgrade custom elements since the web components polyfills do this automatically. ([commit](https://github.com/Polymer/polymer/commit/051e1bf))
+
+## [v1.0.9](https://github.com/Polymer/polymer/tree/v1.0.9) (2015-08-07)
+- Remove undocumented return value. ([commit](https://github.com/Polymer/polymer/commit/1764d0c))
+
+- Add default, update docs. ([commit](https://github.com/Polymer/polymer/commit/ca267a5))
+
+- Add tests for isSelected. ([commit](https://github.com/Polymer/polymer/commit/15d63ef))
+
+- Default selected to empty array. Add isSelected API. ([commit](https://github.com/Polymer/polymer/commit/d4e7140))
+
+- Fixes #2218: match style properties against scope transformed selector (not property unique selector) ([commit](https://github.com/Polymer/polymer/commit/c9e9062))
+
+- Remove notify for items (unnecessary). ([commit](https://github.com/Polymer/polymer/commit/a370860))
+
+- Uncomment line. ([commit](https://github.com/Polymer/polymer/commit/b25330b))
+
+- Give toggle a default. ([commit](https://github.com/Polymer/polymer/commit/db9bda5))
+
+- Use multi-prop observer; default selected to null. ([commit](https://github.com/Polymer/polymer/commit/ba4bf38))
+
+- Add tests. Reset selection on items/multi change. Remove async. ([commit](https://github.com/Polymer/polymer/commit/5bca55b))
+
+- Property matching must check non-transformed rule selector. ([commit](https://github.com/Polymer/polymer/commit/5b9a5ce))
+
+- Make _itemsChanged depend on multi. ([commit](https://github.com/Polymer/polymer/commit/1b21397))
+
+- Make sure mouse position is not a factor for .click() in IE 10 ([commit](https://github.com/Polymer/polymer/commit/1a2fb4d))
+
+- Always trigger tap for synthetic click events ([commit](https://github.com/Polymer/polymer/commit/1eef1a7))
+
+- Fixes #2193: Implements workaround for https://code.google.com/p/chromium/issues/detail?id=516550 by adding Polymer.RenderStatus.whenReady and using it to defer `attached` ([commit](https://github.com/Polymer/polymer/commit/2bffc4c))
+
+- Fix polyfill templates ([commit](https://github.com/Polymer/polymer/commit/d78c934))
+
+- Use `_clientsReadied` to avoid missing attribute->property sets in ready. ([commit](https://github.com/Polymer/polymer/commit/165f716))
+
+- Make propagation of attribute changes at configure time more efficient ([commit](https://github.com/Polymer/polymer/commit/b269c1d))
+
+- add offsetParent smoke tests ([commit](https://github.com/Polymer/polymer/commit/0b2cfae))
+
+- Fixes #1673: ensure instance effects exist before marshaling attributes. ([commit](https://github.com/Polymer/polymer/commit/7c83df5))
+
+- Fix typo. ([commit](https://github.com/Polymer/polymer/commit/97944e4))
+
+- Clarify `fire` option defaults. Fixes #2180 ([commit](https://github.com/Polymer/polymer/commit/7c3e516))
+
+- Add cross-reference for API docs. Fixes #2180 ([commit](https://github.com/Polymer/polymer/commit/9bdcc3b))
+
+- Updated utils & removed fn signatures; defer to API docs. Fixes #2180 ([commit](https://github.com/Polymer/polymer/commit/b9b86d5))
+
+- Update core- to iron-ajax in PRIMER.md as in Polymer/docs#1276, Polymer/docs#1275 ([commit](https://github.com/Polymer/polymer/commit/e99358a))
+
+- Update core- to iron-ajax in jsdoc for dom-bind as in Polymer/docs#1276, Polymer/docs#1275 ([commit](https://github.com/Polymer/polymer/commit/07327c0))
+
+- Make properties replacement robust against properties which start with a leading `;` ([commit](https://github.com/Polymer/polymer/commit/3ea0333))
+
+- Fixes #2154: ensure Polymer.dom always sees wrapped nodes when ShadowDOM polyfill is in use. ([commit](https://github.com/Polymer/polymer/commit/fc90aa0))
+
+- Use css parser's property stripping code in custom-style. ([commit](https://github.com/Polymer/polymer/commit/756ef1b))
+
+- Deduplicate track/untrack document event listener logic ([commit](https://github.com/Polymer/polymer/commit/53037d4))
+
+- Automatically filter mouseevents without the left mouse button ([commit](https://github.com/Polymer/polymer/commit/bbc3b57))
+
+- Fixes #2113: ensures custom-style rules that use @apply combined with defining properties apply correctly. ([commit](https://github.com/Polymer/polymer/commit/69a4aa5))
+
+- Correct & simplify per spec. ([commit](https://github.com/Polymer/polymer/commit/7b8b7fd))
+
+- Clean up logic. ([commit](https://github.com/Polymer/polymer/commit/d4deb5d))
+
+- More loosely match expression function names ([commit](https://github.com/Polymer/polymer/commit/6cfa759))
+
+- Fix link to direct to Cross-scope styling ([commit](https://github.com/Polymer/polymer/commit/f9c58bc))
+
+- Update behaviors order. Fixes #2144. ([commit](https://github.com/Polymer/polymer/commit/2a51661))
+
+- Cache style.display & textContent and re-apply on true. Fixes #2037 ([commit](https://github.com/Polymer/polymer/commit/2611285))
+
+- Fixes #2118: force element `is` to be lowercase: mixing case causes confusion and breaks style shimming for type extensions. ([commit](https://github.com/Polymer/polymer/commit/c8905f9))
+
+- Allow array API's accept string & negative args. Fixes #2062. Brings the API more in line with native splice, etc. ([commit](https://github.com/Polymer/polymer/commit/7e2ceeb))
+
+- Fix #2107: improve binding expression parser to match valid javascript property names. ([commit](https://github.com/Polymer/polymer/commit/7560130))
+
+## [v1.0.8](https://github.com/Polymer/polymer/tree/v1.0.8) (2015-07-23)
+- Disable tracking if scrolling ([commit](https://github.com/Polymer/polymer/commit/ee5177d))
+
+- Fixes #2125: adds a register method to dom-module to support imperative creation. ([commit](https://github.com/Polymer/polymer/commit/861f4aa))
+
+- Move recognizer reset into start of event flow ([commit](https://github.com/Polymer/polymer/commit/a7495f7))
+
+- Fixed small typo on PRIMER.md ([commit](https://github.com/Polymer/polymer/commit/bc40821))
+
+- remove alternate calculation for _rootDataHost ([commit](https://github.com/Polymer/polymer/commit/26663cd))
+
+- Don't call `dom-change` when detached. ([commit](https://github.com/Polymer/polymer/commit/bdb8fa3))
+
+- Fix typo. ([commit](https://github.com/Polymer/polymer/commit/65911bd))
+
+- Improve code formatting. ([commit](https://github.com/Polymer/polymer/commit/3968c84))
+
+- Up flush MAX to 100 and add overflow warning. ([commit](https://github.com/Polymer/polymer/commit/8bcc416))
+
+- Fixes #1998: add api doc for `customStyle` property ([commit](https://github.com/Polymer/polymer/commit/91577c9))
+
+- Handle commentnodes correctly for textContent and innerHTML ([commit](https://github.com/Polymer/polymer/commit/6d56d2b))
+
+- Fixes #2098: don't accept undefined values as initial config ([commit](https://github.com/Polymer/polymer/commit/1a5c391))
+
+- Remove key check; int check should guarantee key. ([commit](https://github.com/Polymer/polymer/commit/dbf833e))
+
+- Add unit tests. ([commit](https://github.com/Polymer/polymer/commit/bc4b142))
+
+- Allow setting non-index array properties. Fixes #2096. ([commit](https://github.com/Polymer/polymer/commit/f8cad94))
+
+- update tests. ([commit](https://github.com/Polymer/polymer/commit/8922323))
+
+- added `render` method to dom-bind which can be called when async imports are used; documented template render functions ([commit](https://github.com/Polymer/polymer/commit/348896a))
+
+- Fixes #2039: Polymer.dom.flush now triggers Custom Elements polyfill mutations and includes an api (`Polymer.dom.addDebouncer(debouncer)`) for adding debouncers which should run at flush time. Template rendering debouncers are placed in the flush list. ([commit](https://github.com/Polymer/polymer/commit/89a767c))
+
+- Fixes #2010, fixes #1818: Shady dom mutations which trigger additional mutations are now successfully enqueued. ([commit](https://github.com/Polymer/polymer/commit/a26247b))
+
+- debounce returns debouncer. ([commit](https://github.com/Polymer/polymer/commit/fb52120))
+
+- Update index.html ([commit](https://github.com/Polymer/polymer/commit/119df98))
+
+## [v1.0.7](https://github.com/Polymer/polymer/tree/v1.0.7) (2015-07-16)
+- Replace placeholders backwards to simplify. ([commit](https://github.com/Polymer/polymer/commit/5eda235))
+
+- Remove unnecessary keys bookkeeping. ([commit](https://github.com/Polymer/polymer/commit/3e02bfd))
+
+- Minor tweaks to comments, internal API consistency. ([commit](https://github.com/Polymer/polymer/commit/82958d4))
+
+- Always use placeholders; fix insertion reference bug. ([commit](https://github.com/Polymer/polymer/commit/4a45d4f))
+
+- Simplify. ([commit](https://github.com/Polymer/polymer/commit/4eda393))
+
+- Rename variables for clarity. ([commit](https://github.com/Polymer/polymer/commit/15c1241))
+
+- Fix reuse logic to handle multiple mutations in same turn. Fixes #2009. ([commit](https://github.com/Polymer/polymer/commit/1bf5f6d))
+
+- Be more explicit. ([commit](https://github.com/Polymer/polymer/commit/a6bd5a5))
+
+- Add Polymer.instanceof & isInstance. Fixes #2083. ([commit](https://github.com/Polymer/polymer/commit/7954f93))
+
+- Fixes #2081: make Polymer.dom(element).getDistributedNodes and Polymer.dom(element).getDestinationInsertionPoints() always return at least an empty array (was generating exception under Shadow DOM); make element.getContentChildNodes and element.getContentChildren always return at least an empty array when a selector is passed that does not find a <content> (was generating exception under Shadow DOM) ([commit](https://github.com/Polymer/polymer/commit/f966381))
+
+- Fixes #2077: workaround IE text node splitting issue that can make text bindings fail. ([commit](https://github.com/Polymer/polymer/commit/312d11f))
+
+- Fixes #2078: when computing custom style properties, make sure the styling scope is valid when the element is attached to a shadowRoot whose host is not a Polymer element. ([commit](https://github.com/Polymer/polymer/commit/fab2ed7))
+
+- update CHANGELOG for 1.0.6 ([commit](https://github.com/Polymer/polymer/commit/c46ec11))
+
+\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/GitHub-Changelog-Generator) below*
+## [v1.0.6](https://github.com/Polymer/polymer/tree/v1.0.6) (2015-07-09)
+
+**Fixed issues:**
+
+- Basic support for host-context [\#1895](https://github.com/Polymer/polymer/issues/1895)
+
+- custom property resolver tripping over some selectors? [\#1938](https://github.com/Polymer/polymer/issues/1938)
+
+- Parsing compressed CSS does not work [\#1927](https://github.com/Polymer/polymer/issues/1927)
+
+- Support Polymer.dom().classList.contains [\#1907](https://github.com/Polymer/polymer/issues/1907)
+
+- Add support for :host-context [\#1900](https://github.com/Polymer/polymer/issues/1900)
+
+- Grey overlay in mobile Safari [\#1970](https://github.com/Polymer/polymer/issues/1970)
+
+- `node.unlisten` removes native event listeners too often [\#1988](https://github.com/Polymer/polymer/issues/1988)
+
+- `notifyPath` doesn't return as its documentation says [\#1966](https://github.com/Polymer/polymer/issues/1966)
+
+- "TypeError: Cannot set property 'display' of undefined" when HTML comment is present inside a dom-if template that evaluates to truthy [\#1786](https://github.com/Polymer/polymer/issues/1786)
+
+- `dom-repeat` in a falsy `dom-if` should hide newly stamped children [\#1751](https://github.com/Polymer/polymer/issues/1751)
+
+- Typo in Polymer.mixin API documentation [\#2001](https://github.com/Polymer/polymer/issues/2001)
+
+- Low-level changes for `iron-list` integration (`fire` & `modelForElement`) [\#2003](https://github.com/Polymer/polymer/issues/2003)
+
+- Normalized event difference with ShadowDOM and Shady [\#1921](https://github.com/Polymer/polymer/issues/1921)
+
+- DOM API innerHTML adds only first element [\#1972](https://github.com/Polymer/polymer/issues/1972)
+
+- with Polymer\#1.05-update, style-sheets and custom-style-elements are not parsed in my project anymore [\#1974](https://github.com/Polymer/polymer/issues/1974)
+
+- Expected behavior for importNode,cloneNode [\#1888](https://github.com/Polymer/polymer/issues/1888)
+
+- \#1.0.5 computed property function name limitations? [\#2016](https://github.com/Polymer/polymer/issues/2016)
+
+## [v1.0.5](https://github.com/Polymer/polymer/tree/v1.0.5) (2015-06-25)
+
+**Fixed issues:**
+
+- Bindings to concrete types not propagating correctly from template to collection [\#1839](https://github.com/Polymer/polymer/issues/1839)
+
+- Setting individual array elements not working [\#1854](https://github.com/Polymer/polymer/issues/1854)
+
+- `CustomStyle` change has no effect [\#1851](https://github.com/Polymer/polymer/issues/1851)
+
+- With Shady DOM, `<content>` doesn't get passed to another element inside `dom-if` [\#1902](https://github.com/Polymer/polymer/issues/1902)
+
+- Provide a convenience method for setting `customStyle` and calling `updateStyles` [\#1915](https://github.com/Polymer/polymer/issues/1915)
+
+- If an `async` callback throws an error, it's never removed from the callback list [\#1759](https://github.com/Polymer/polymer/issues/1759)
+
+- `dom-if`: undefined is considered falsy only once [\#1742](https://github.com/Polymer/polymer/issues/1742)
+
+- Setting `readOnly` AND `computed` on properties [\#1925](https://github.com/Polymer/polymer/issues/1925)
+
+- `Uncaught TypeError: this.mixin is not a function` [\#1911](https://github.com/Polymer/polymer/issues/1911)
+
+- `Polymer.Base.async` "infinite loop" condition [\#1933](https://github.com/Polymer/polymer/issues/1933)
+
+- Custom property resolver tripping over some selectors? [\#1938](https://github.com/Polymer/polymer/issues/1938)
+
+- Annotated attribute binding issues [\#1874](https://github.com/Polymer/polymer/issues/1874)
+
+- Parsing compressed CSS does not work [\#1927](https://github.com/Polymer/polymer/issues/1927)
+
+## [v1.0.4](https://github.com/Polymer/polymer/tree/v1.0.4) (2015-06-17)
+
+**Closed issues:**
+
+- Error when i put a paper-input inside a paper-drawer-panel [\#1893](https://github.com/Polymer/polymer/issues/1893)
+
+- Open the website country restrictions [\#1885](https://github.com/Polymer/polymer/issues/1885)
+
+- Observers executed twice if defined in both the properties and the observers array [\#1884](https://github.com/Polymer/polymer/issues/1884)
+
+- If I set element property before component registered I cannot change it anymore [\#1882](https://github.com/Polymer/polymer/issues/1882)
+
+- Polymer icon set not scaling with size [\#1881](https://github.com/Polymer/polymer/issues/1881)
+
+- How binding a JSON in Polymer 1.0 [\#1878](https://github.com/Polymer/polymer/issues/1878)
+
+- Annotated attribute binding issues [\#1874](https://github.com/Polymer/polymer/issues/1874)
+
+- Paper Elements don't appear on site [\#1868](https://github.com/Polymer/polymer/issues/1868)
+
+- \[1.0\] Inserted content not toggled when inside dom-if [\#1862](https://github.com/Polymer/polymer/issues/1862)
+
+- Polymer Catalog -- link-related usability issue [\#1860](https://github.com/Polymer/polymer/issues/1860)
+
+- Issues with catalog on Chromium 37.0.2062.120, 41.0.2272.76, and Firefox 38.0 [\#1859](https://github.com/Polymer/polymer/issues/1859)
+
+- documentation bug; search elements [\#1858](https://github.com/Polymer/polymer/issues/1858)
+
+- can I two way binding a properties type of 'Number' to attribute? [\#1856](https://github.com/Polymer/polymer/issues/1856)
+
+- 'this' points to Window rather than custom element when called through setTimeOut\(\) [\#1853](https://github.com/Polymer/polymer/issues/1853)
+
+- Cannot define an element in the main document \(Firefox and Internet explorer\) [\#1850](https://github.com/Polymer/polymer/issues/1850)
+
+- Feature: array variable accessor [\#1849](https://github.com/Polymer/polymer/issues/1849)
+
+- Support for expressions and filters [\#1847](https://github.com/Polymer/polymer/issues/1847)
+
+- key/value iteration support for template dom-repeat [\#1846](https://github.com/Polymer/polymer/issues/1846)
+
+- Styling local DOM [\#1842](https://github.com/Polymer/polymer/issues/1842)
+
+- Polymer bouded property not updating - or getting reset \(sometimes\) [\#1840](https://github.com/Polymer/polymer/issues/1840)
+
+- insertRule\('body /deep/ myclass' + ' {' + cssText + '}', index\); throws error in ff and ie [\#1836](https://github.com/Polymer/polymer/issues/1836)
+
+- this.insertRule\("body /deep/ someclass", index\); error [\#1835](https://github.com/Polymer/polymer/issues/1835)
+
+- \<core-scaffold\> 0.5 toolbar background coloring broken [\#1834](https://github.com/Polymer/polymer/issues/1834)
+
+- Radio buttons break when using border-box [\#1832](https://github.com/Polymer/polymer/issues/1832)
+
+- polymer 1.0 how to use dom-if ? [\#1828](https://github.com/Polymer/polymer/issues/1828)
+
+- Remove the undocumented "find nearest template" feature when registering [\#1827](https://github.com/Polymer/polymer/issues/1827)
+
+- Remove `preventDefault` from track [\#1824](https://github.com/Polymer/polymer/issues/1824)
+
+- Need a way to cancel track and tap from down [\#1823](https://github.com/Polymer/polymer/issues/1823)
+
+- Computed bindings are not updated when using polymer's this.push to add elements [\#1822](https://github.com/Polymer/polymer/issues/1822)
+
+- Two-way bindings to array members not updating when data edited in dom-repeat template \(bug or feature?\) [\#1821](https://github.com/Polymer/polymer/issues/1821)
+
+- Binding undefined does not work as expected [\#1813](https://github.com/Polymer/polymer/issues/1813)
+
+- Can't declare Boolean attributes with default of true? [\#1812](https://github.com/Polymer/polymer/issues/1812)
+
+- array-selector doesn't work with `multi` unless `toggle` is specified [\#1810](https://github.com/Polymer/polymer/issues/1810)
+
+- Style shim only converts a single ::shadow or /deep/ in a selector [\#1809](https://github.com/Polymer/polymer/issues/1809)
+
+- Incorrect style for custom CSS properties when extending a native element [\#1807](https://github.com/Polymer/polymer/issues/1807)
+
+- Document compatibility with browser [\#1805](https://github.com/Polymer/polymer/issues/1805)
+
+- Unwrapped dom-if causes DOMException [\#1804](https://github.com/Polymer/polymer/issues/1804)
+
+- \<template is=dom-if\> fails to add rows to a table if they contain \<content\> [\#1800](https://github.com/Polymer/polymer/issues/1800)
+
+- Data binding causes infinite loop if value is NaN [\#1799](https://github.com/Polymer/polymer/issues/1799)
+
+- Issues with polymer 1.0 dom-repeat templates using paper-radio-group and the selected property [\#1792](https://github.com/Polymer/polymer/issues/1792)
+
+- bind attribute replacement [\#1790](https://github.com/Polymer/polymer/issues/1790)
+
+- The Shadows sucks [\#1788](https://github.com/Polymer/polymer/issues/1788)
+
+- Is there a list of Polymer 1.0 elements in the documentations? as it used to be 0.5! [\#1782](https://github.com/Polymer/polymer/issues/1782)
+
+- Custom style variables for elements added outside of polymer [\#1781](https://github.com/Polymer/polymer/issues/1781)
+
+- Can I recover the contaminated DOM? [\#1779](https://github.com/Polymer/polymer/issues/1779)
+
+- \[1.0\] Data-binding: Is there any way to do this imperatively? [\#1778](https://github.com/Polymer/polymer/issues/1778)
+
+- DATA-BINDING [\#1772](https://github.com/Polymer/polymer/issues/1772)
+
+- \[1.0\] polymer attribute used in a string behaving differently from 0.5 [\#1770](https://github.com/Polymer/polymer/issues/1770)
+
+- \[1.0.2\] Setting property treated as idempotent, but isn't [\#1768](https://github.com/Polymer/polymer/issues/1768)
+
+- official element-table bower package [\#1767](https://github.com/Polymer/polymer/issues/1767)
+
+- Shopping card polymer element [\#1766](https://github.com/Polymer/polymer/issues/1766)
+
+- How to create a polymer element from iron-ajax element response [\#1764](https://github.com/Polymer/polymer/issues/1764)
+
+- iron-collapse is focusable \(by clicking or tabbing into it\), which produces a focus outline in browsers [\#1760](https://github.com/Polymer/polymer/issues/1760)
+
+- dom-repeat data binding: not working as expected [\#1758](https://github.com/Polymer/polymer/issues/1758)
+
+- \[1.0.3\] Do not resolve hash-only urls used for routing [\#1757](https://github.com/Polymer/polymer/issues/1757)
+
+- \[1.0.3\]Cannot start up after upgrade [\#1754](https://github.com/Polymer/polymer/issues/1754)
+
+- Content nodes in `dom-if` template do not distribute correctly [\#1753](https://github.com/Polymer/polymer/issues/1753)
+
+- overriding the custom css variables only works for the first dom element on the page [\#1752](https://github.com/Polymer/polymer/issues/1752)
+
+- paper-checkbox should have an indeterminate state [\#1749](https://github.com/Polymer/polymer/issues/1749)
+
+- nested dom-repeat with sort attribute shows duplicate entries when adding new items. [\#1744](https://github.com/Polymer/polymer/issues/1744)
+
+- `attached` handler executed in wrong order in chrome browser. [\#1743](https://github.com/Polymer/polymer/issues/1743)
+
+- \[1.0.2\] '$' is undefined when 'created' is being called [\#1728](https://github.com/Polymer/polymer/issues/1728)
+
+- \[1.0\] ::before / ::after psudo selectors in a custom-style [\#1668](https://github.com/Polymer/polymer/issues/1668)
+
+- Need Polymer.Base.unlisten to remove the event listener [\#1639](https://github.com/Polymer/polymer/issues/1639)
+
+- custom-style sometimes does not apply variables [\#1637](https://github.com/Polymer/polymer/issues/1637)
+
+- \[0.9.4\] Dom-if template doesn't stamp when its content contains a wrapped insertion point [\#1631](https://github.com/Polymer/polymer/issues/1631)
+
+- With \<template if=\> missing how can I have several different styles applied? [\#1419](https://github.com/Polymer/polymer/issues/1419)
+
+**Merged pull requests:**
+
+- Includes element defaults in the list of own properties by which elements are styled. [\#1891](https://github.com/Polymer/polymer/pull/1891) ([sorvell](https://github.com/sorvell))
+
+- Style shimming fixes [\#1857](https://github.com/Polymer/polymer/pull/1857) ([sorvell](https://github.com/sorvell))
+
+- Clear composedNodes when an element upgrades without an insertion point [\#1845](https://github.com/Polymer/polymer/pull/1845) ([sorvell](https://github.com/sorvell))
+
+- Allow user prevention of `tap` and `track` gestures from `down` [\#1843](https://github.com/Polymer/polymer/pull/1843) ([azakus](https://github.com/azakus))
+
+- Fix incorrect test for `toggle`. Fixes \#1810. [\#1841](https://github.com/Polymer/polymer/pull/1841) ([arthurevans](https://github.com/arthurevans))
+
+- Use var keyword when declaring local variable so it doesn't leak to global scope. [\#1838](https://github.com/Polymer/polymer/pull/1838) ([trevordixon](https://github.com/trevordixon))
+
+- No implicit template \(fixes \#1827\) [\#1837](https://github.com/Polymer/polymer/pull/1837) ([sjmiles](https://github.com/sjmiles))
+
+- Fix jsdoc for splice [\#1820](https://github.com/Polymer/polymer/pull/1820) ([jscissr](https://github.com/jscissr))
+
+- Fix dynamic insertion of wrapped or redistributing content. [\#1816](https://github.com/Polymer/polymer/pull/1816) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- Handle NaN correctly in bindings [\#1811](https://github.com/Polymer/polymer/pull/1811) ([azakus](https://github.com/azakus))
+
+- Fix 1752 [\#1797](https://github.com/Polymer/polymer/pull/1797) ([sorvell](https://github.com/sorvell))
+
+- Do not apply/notify keySplices if array has not been Collectionified. Fixes \#1744 [\#1795](https://github.com/Polymer/polymer/pull/1795) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- Use gulp-vulcanize concurrently for faster builds [\#1793](https://github.com/Polymer/polymer/pull/1793) ([azakus](https://github.com/azakus))
+
+- Fixes \#1757, do not resolve hash-only urls used for routing [\#1780](https://github.com/Polymer/polymer/pull/1780) ([nippur72](https://github.com/nippur72))
+
+- Add `unlisten` function [\#1740](https://github.com/Polymer/polymer/pull/1740) ([azakus](https://github.com/azakus))
+
+- Custom style fix [\#1638](https://github.com/Polymer/polymer/pull/1638) ([sorvell](https://github.com/sorvell))
+
+## [v1.0.3](https://github.com/Polymer/polymer/tree/v1.0.3) (2015-06-05)
+
+**Closed issues:**
+
+- paper-toolbar \[title\] conflicts with HTML \[title\] [\#1745](https://github.com/Polymer/polymer/issues/1745)
+
+- Bound data-\* attributes being stripped from template children [\#1737](https://github.com/Polymer/polymer/issues/1737)
+
+- Polymer.Base.splice and dom-repeat [\#1733](https://github.com/Polymer/polymer/issues/1733)
+
+- \[1.0.0\] Light DOM being replaced by shady DOM on ready [\#1732](https://github.com/Polymer/polymer/issues/1732)
+
+- \[1.0.2\] Databinding and nested objects [\#1731](https://github.com/Polymer/polymer/issues/1731)
+
+- Paper-tabs in Flexbox [\#1730](https://github.com/Polymer/polymer/issues/1730)
+
+- When not including `webcomponentsjs`, a script in `\<head\>` after imports will break `unresolved` attribute [\#1723](https://github.com/Polymer/polymer/issues/1723)
+
+- Create 1.0.x Release [\#1721](https://github.com/Polymer/polymer/issues/1721)
+
+- RENAME listeners TO events [\#1719](https://github.com/Polymer/polymer/issues/1719)
+
+- Uncaught TypeError When splicing an array into emptiness [\#1714](https://github.com/Polymer/polymer/issues/1714)
+
+- Paper-Button references \<core-icon\> [\#1709](https://github.com/Polymer/polymer/issues/1709)
+
+- Events for paper-menu or paper-item [\#1708](https://github.com/Polymer/polymer/issues/1708)
+
+- Why is there no javascript file? [\#1707](https://github.com/Polymer/polymer/issues/1707)
+
+- Evergreen browser incompatibility [\#1706](https://github.com/Polymer/polymer/issues/1706)
+
+- \[1.0\] shady dom inserts '\<content\>' more than once [\#1704](https://github.com/Polymer/polymer/issues/1704)
+
+- Issue running Polymer Started Kit 1.0.0 [\#1703](https://github.com/Polymer/polymer/issues/1703)
+
+- iron-form body data malformed [\#1702](https://github.com/Polymer/polymer/issues/1702)
+
+- \[1.0\] Attached callback is differently resolved on chrome and ff [\#1699](https://github.com/Polymer/polymer/issues/1699)
+
+- Polymer 1.0 and WebComponents.js [\#1698](https://github.com/Polymer/polymer/issues/1698)
+
+- \[dom-if\] is not as inert as \<template\> should be [\#1695](https://github.com/Polymer/polymer/issues/1695)
+
+- can't use flex inside neon-animated-pages [\#1694](https://github.com/Polymer/polymer/issues/1694)
+
+- Polymer::Attributes: couldn`t decode Array as JSON [\#1693](https://github.com/Polymer/polymer/issues/1693)
+
+- Mobile links off homepage dont work [\#1692](https://github.com/Polymer/polymer/issues/1692)
+
+- Computed property doesn't work in dom-repeat [\#1691](https://github.com/Polymer/polymer/issues/1691)
+
+- core-animated-pages any plans? [\#1689](https://github.com/Polymer/polymer/issues/1689)
+
+- Where's paper-dropdown-menu 1.0? [\#1684](https://github.com/Polymer/polymer/issues/1684)
+
+- \[1.0\] dom-repeat observe non-array values [\#1683](https://github.com/Polymer/polymer/issues/1683)
+
+- Element catalog, google-analytics, docs missing [\#1681](https://github.com/Polymer/polymer/issues/1681)
+
+- Binding not working for open text [\#1677](https://github.com/Polymer/polymer/issues/1677)
+
+- Blog link in README.md and CONTRIBUTING.md is wrong [\#1676](https://github.com/Polymer/polymer/issues/1676)
+
+- Strange lines on polymer site menu [\#1675](https://github.com/Polymer/polymer/issues/1675)
+
+- Need to parameterize path to fonts [\#1674](https://github.com/Polymer/polymer/issues/1674)
+
+- How to add dynamic classes in dom-repeat 1.0 [\#1671](https://github.com/Polymer/polymer/issues/1671)
+
+- Array mutation without using helper methods [\#1666](https://github.com/Polymer/polymer/issues/1666)
+
+- Wrapping non interpolated strings with span in 1.0 [\#1664](https://github.com/Polymer/polymer/issues/1664)
+
+- dom-if template got rendered once even if the condition is false [\#1663](https://github.com/Polymer/polymer/issues/1663)
+
+- Cannot read property 'slice' of undefined on firebase update [\#1661](https://github.com/Polymer/polymer/issues/1661)
+
+- \[1.0.2\] Global leak found in \_marshalArgs [\#1660](https://github.com/Polymer/polymer/issues/1660)
+
+- \[1.0\] Changes in appendChild from 0.9 to 1.0? [\#1657](https://github.com/Polymer/polymer/issues/1657)
+
+- Using scroll header panel together with dialog will cause backdrop to cover up dialog [\#1656](https://github.com/Polymer/polymer/issues/1656)
+
+- Color Extraction [\#1654](https://github.com/Polymer/polymer/issues/1654)
+
+- using AngularJS with paper elements [\#1649](https://github.com/Polymer/polymer/issues/1649)
+
+- Gestures event issue - No offsets management [\#1646](https://github.com/Polymer/polymer/issues/1646)
+
+- \[0.9\] event on-blur does not work on paper-input [\#1634](https://github.com/Polymer/polymer/issues/1634)
+
+- \[0.9.4\] Nested dom-if templates show invalid content [\#1632](https://github.com/Polymer/polymer/issues/1632)
+
+- paper-slider input box overflow. [\#1611](https://github.com/Polymer/polymer/issues/1611)
+
+- \[0.9\] Documentation issue \(unbind & dispose\) [\#1607](https://github.com/Polymer/polymer/issues/1607)
+
+- Better dependency management [\#1592](https://github.com/Polymer/polymer/issues/1592)
+
+**Merged pull requests:**
+
+- Make \_\_styleScoped a one-time optimization. Fixes \#1733 [\#1739](https://github.com/Polymer/polymer/pull/1739) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- Move non-webcomponents script unresolved case to `load` instead of synchronous [\#1724](https://github.com/Polymer/polymer/pull/1724) ([azakus](https://github.com/azakus))
+
+- Fix for IE. [\#1717](https://github.com/Polymer/polymer/pull/1717) ([achimnol](https://github.com/achimnol))
+
+- Fix broken link [\#1688](https://github.com/Polymer/polymer/pull/1688) ([weiland](https://github.com/weiland))
+
+- Fix syntax highlighting [\#1687](https://github.com/Polymer/polymer/pull/1687) ([weiland](https://github.com/weiland))
+
+- Fixes link license [\#1685](https://github.com/Polymer/polymer/pull/1685) ([mateusortiz](https://github.com/mateusortiz))
+
+- fixed a little typo [\#1682](https://github.com/Polymer/polymer/pull/1682) ([fredpedro](https://github.com/fredpedro))
+
+- fix html comment in README.md [\#1680](https://github.com/Polymer/polymer/pull/1680) ([campersau](https://github.com/campersau))
+
+- Changed to https like other links [\#1653](https://github.com/Polymer/polymer/pull/1653) ([henricavalcante](https://github.com/henricavalcante))
+
+- dom-if hidden state is \(this.\_hideTemplateChildren || !this.if\). [\#1635](https://github.com/Polymer/polymer/pull/1635) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- Re-insert rows when re-attaching. Fixes \#1498. Fixes \#1714. [\#1629](https://github.com/Polymer/polymer/pull/1629) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+## [v1.0.2](https://github.com/Polymer/polymer/tree/v1.0.2) (2015-05-29)
+
+## [v1.0.1](https://github.com/Polymer/polymer/tree/v1.0.1) (2015-05-29)
+
+**Implemented enhancements:**
+
+- using javascript core functions [\#1641](https://github.com/Polymer/polymer/issues/1641)
+
+**Fixed bugs:**
+
+- \[1.0\] Tap gesture does not trigger when calling `this.click` in IE10 [\#1640](https://github.com/Polymer/polymer/issues/1640)
+
+**Closed issues:**
+
+- Logic for tap distance should be "both axes within TAP\_DISTANCE" [\#1652](https://github.com/Polymer/polymer/issues/1652)
+
+- Site is not looking good in Mac Chrome Versión 43.0.2357.81 \(64-bit\) [\#1650](https://github.com/Polymer/polymer/issues/1650)
+
+- Different result is shown. [\#1647](https://github.com/Polymer/polymer/issues/1647)
+
+- Wrong end tag name in README.md [\#1645](https://github.com/Polymer/polymer/issues/1645)
+
+- on-tap doesn't trigger on checkbox 0.5 [\#1586](https://github.com/Polymer/polymer/issues/1586)
+
+**Merged pull requests:**
+
+- I want to put a space before Jim. [\#1648](https://github.com/Polymer/polymer/pull/1648) ([yutori](https://github.com/yutori))
+
+- Fixes link url [\#1643](https://github.com/Polymer/polymer/pull/1643) ([zenorocha](https://github.com/zenorocha))
+
+- Fixes typo [\#1642](https://github.com/Polymer/polymer/pull/1642) ([zenorocha](https://github.com/zenorocha))
+
+- updated readme and added contributing file [\#1628](https://github.com/Polymer/polymer/pull/1628) ([tjsavage](https://github.com/tjsavage))
+
+## [v1.0.0](https://github.com/Polymer/polymer/tree/v1.0.0) (2015-05-27)
+
+**Closed issues:**
+
+- \[0.9.4\] Data binding works only for "id" attribute? [\#1633](https://github.com/Polymer/polymer/issues/1633)
+
+- \[0.9\] when I move a dom-repeat element from one parent to another, the items will gone [\#1498](https://github.com/Polymer/polymer/issues/1498)
+
+## [v0.9.4](https://github.com/Polymer/polymer/tree/v0.9.4) (2015-05-27)
+
+**Closed issues:**
+
+- Polymer.version undefined in 0.9 [\#1625](https://github.com/Polymer/polymer/issues/1625)
+
+**Merged pull requests:**
+
+- Add back Polymer.version string [\#1626](https://github.com/Polymer/polymer/pull/1626) ([azakus](https://github.com/azakus))
+
+## [v0.9.3](https://github.com/Polymer/polymer/tree/v0.9.3) (2015-05-26)
+
+**Closed issues:**
+
+- Property values that contain a `:` inside a mixin. [\#1623](https://github.com/Polymer/polymer/issues/1623)
+
+- \[0.9.2\] dom-repeat issues in 0.9.2 [\#1615](https://github.com/Polymer/polymer/issues/1615)
+
+- \[0.9.1, 0.9.2\] Polymer.dom\(\).appendChild\(\) no longer working [\#1612](https://github.com/Polymer/polymer/issues/1612)
+
+- \[0.9\] "dom-if" not binding to an object's boolean property [\#1606](https://github.com/Polymer/polymer/issues/1606)
+
+- \[0.9\] Custom attributes on elements not working \(original: iron-icon styling troubles\) [\#1604](https://github.com/Polymer/polymer/issues/1604)
+
+- Blog down https://blog.polymer-project.org/ [\#1603](https://github.com/Polymer/polymer/issues/1603)
+
+- Improve error message if observer is missing [\#1538](https://github.com/Polymer/polymer/issues/1538)
+
+- \[0.9\] New gulp build hangs until enter key is pressed [\#1519](https://github.com/Polymer/polymer/issues/1519)
+
+- \[0.8\] better error when bound change handler is missing [\#1206](https://github.com/Polymer/polymer/issues/1206)
+
+**Merged pull requests:**
+
+- Fixes url's in style mixins. [\#1624](https://github.com/Polymer/polymer/pull/1624) ([sorvell](https://github.com/sorvell))
+
+- Initialize \_config with values set before creating accessors. [\#1618](https://github.com/Polymer/polymer/pull/1618) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- Update docs. Add warnings. [\#1614](https://github.com/Polymer/polymer/pull/1614) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- Refactor build process [\#1613](https://github.com/Polymer/polymer/pull/1613) ([azakus](https://github.com/azakus))
+
+## [v0.9.2](https://github.com/Polymer/polymer/tree/v0.9.2) (2015-05-25)
+
+**Fixed bugs:**
+
+- Default values for custom variables [\#1543](https://github.com/Polymer/polymer/issues/1543)
+
+**Closed issues:**
+
+- \[0.9.1\] Regression in styling with custom css mixins [\#1601](https://github.com/Polymer/polymer/issues/1601)
+
+- Dynamic distribution fails when using SD polyfill and host is nested in another host and has filtering insertion points [\#1595](https://github.com/Polymer/polymer/issues/1595)
+
+- Custom properties defined on `:host` shouldn't override document styles. [\#1555](https://github.com/Polymer/polymer/issues/1555)
+
+**Merged pull requests:**
+
+- Native xstyle fix [\#1605](https://github.com/Polymer/polymer/pull/1605) ([sorvell](https://github.com/sorvell))
+
+- Xstyle 1555 [\#1602](https://github.com/Polymer/polymer/pull/1602) ([sorvell](https://github.com/sorvell))
+
+## [v0.9.1](https://github.com/Polymer/polymer/tree/v0.9.1) (2015-05-23)
+
+**Implemented enhancements:**
+
+- Array helpers don't notify length change [\#1573](https://github.com/Polymer/polymer/issues/1573)
+
+- \[0.9.0-rc.1\] Method expression without arguments is not invoked [\#1516](https://github.com/Polymer/polymer/issues/1516)
+
+- \[0.8\] Polymer.dom\(\) should expose innerHTML and textContent [\#1429](https://github.com/Polymer/polymer/issues/1429)
+
+- How do you cancel job1 completely before its timeout value occur? [\#1374](https://github.com/Polymer/polymer/issues/1374)
+
+- \[0.8\] Feature request: computed properties in x-repeat [\#1337](https://github.com/Polymer/polymer/issues/1337)
+
+**Fixed bugs:**
+
+- Computed properties with no dependencies generate a syntax error [\#1348](https://github.com/Polymer/polymer/issues/1348)
+
+- \[0.8\] host-context improperly shimmed [\#1346](https://github.com/Polymer/polymer/issues/1346)
+
+**Closed issues:**
+
+- Tap event not firing the first time after tracking another element [\#1590](https://github.com/Polymer/polymer/issues/1590)
+
+- domReady [\#1587](https://github.com/Polymer/polymer/issues/1587)
+
+- Content tag does not work inside dom-if template [\#1584](https://github.com/Polymer/polymer/issues/1584)
+
+- /deep/ css selector not work in chrome browser [\#1583](https://github.com/Polymer/polymer/issues/1583)
+
+- Under native ShadowDOM "dom-if" doesn't stamp out the content even when "if" property is true [\#1582](https://github.com/Polymer/polymer/issues/1582)
+
+- Iron-Input hint not turning into label on ChromeBook apps [\#1581](https://github.com/Polymer/polymer/issues/1581)
+
+- Binding text remains in \<input value="{{value::input}}"\> on IE10 [\#1578](https://github.com/Polymer/polymer/issues/1578)
+
+- \[0.9\] Extends delays/breaks polymer element setup [\#1575](https://github.com/Polymer/polymer/issues/1575)
+
+- \[0.9\] Gesture event throws exception when dragged outside document [\#1574](https://github.com/Polymer/polymer/issues/1574)
+
+- dom-repeat filter/sort needs to be able to observe parent scope [\#1572](https://github.com/Polymer/polymer/issues/1572)
+
+- Logical Operators doesn't work anymore in 0.9 [\#1568](https://github.com/Polymer/polymer/issues/1568)
+
+- Reposted from Angular Issue \#1723: Unable to define correct CSS @Rules when CSS shimming is enabled [\#1566](https://github.com/Polymer/polymer/issues/1566)
+
+- \[0.9.0\] Problem putting a dom-if template in a light DOM when the component's \<content\> itself is wrapped in a dom-if [\#1565](https://github.com/Polymer/polymer/issues/1565)
+
+- hypergrid is a polymer custom component [\#1561](https://github.com/Polymer/polymer/issues/1561)
+
+- serializeValueToAttribute returns undefined [\#1559](https://github.com/Polymer/polymer/issues/1559)
+
+- Offsetting core drawer panel [\#1557](https://github.com/Polymer/polymer/issues/1557)
+
+- \[0.9\] How to dynamically import elements? [\#1554](https://github.com/Polymer/polymer/issues/1554)
+
+- Release process should have change log [\#1553](https://github.com/Polymer/polymer/issues/1553)
+
+- \[0.9\] on-click="kickAction\(\)" [\#1552](https://github.com/Polymer/polymer/issues/1552)
+
+- Layout functionality in 0.9 [\#1551](https://github.com/Polymer/polymer/issues/1551)
+
+- \[0.9\] hostAttributes: Noooooooo! [\#1549](https://github.com/Polymer/polymer/issues/1549)
+
+- \[0.9\] hidden$="{{isHidden}}" vs hidden=$"{{isHidden}}" [\#1548](https://github.com/Polymer/polymer/issues/1548)
+
+- seems that case sensitive properties doesn't work [\#1547](https://github.com/Polymer/polymer/issues/1547)
+
+- webcomponents loading order [\#1544](https://github.com/Polymer/polymer/issues/1544)
+
+- Data-binding to native DOM element inside of auto-binding template invokes style scoping [\#1542](https://github.com/Polymer/polymer/issues/1542)
+
+- 0.9 zip file nearly empty [\#1541](https://github.com/Polymer/polymer/issues/1541)
+
+- Polymer.dom\(parent\).querySelector polyfill is broken in 0.8 [\#1540](https://github.com/Polymer/polymer/issues/1540)
+
+- Imported resource from origin 'file://' has been blocked from loading by Cross-Origin Resource Sharing policy: Received an invalid response. Origin 'null' is therefore not allowed access. [\#1535](https://github.com/Polymer/polymer/issues/1535)
+
+- \[0.9.0-rc.1\] Cannot set property 'touchAction' of undefinedGestures.setTouchAction [\#1533](https://github.com/Polymer/polymer/issues/1533)
+
+- Could I disable the two-way binding? [\#1529](https://github.com/Polymer/polymer/issues/1529)
+
+- \[0.9\] Can't override the css property if the property is already set on the host via custom property [\#1525](https://github.com/Polymer/polymer/issues/1525)
+
+- \[0.5.6\] Hang in loading polymer [\#1524](https://github.com/Polymer/polymer/issues/1524)
+
+- \[0.0.9-rc.1\] Array changes event is not delivered [\#1523](https://github.com/Polymer/polymer/issues/1523)
+
+- \[0.9\] dom-bind not working with document.createElement [\#1515](https://github.com/Polymer/polymer/issues/1515)
+
+- Please, more info about new releases [\#1507](https://github.com/Polymer/polymer/issues/1507)
+
+- \[0.9\] Annotated computed properties don't work on autobinding template [\#1500](https://github.com/Polymer/polymer/issues/1500)
+
+- Upgrade from polymer 0.5 to 0.8 [\#1492](https://github.com/Polymer/polymer/issues/1492)
+
+- \[0.8\] Binding a property with value 'undefined' to an input value on IE11 shows the raw binding [\#1491](https://github.com/Polymer/polymer/issues/1491)
+
+- \[0.8\] SVG elements fail on IE11 due to missing classList [\#1490](https://github.com/Polymer/polymer/issues/1490)
+
+- Cross domain HTML import [\#1489](https://github.com/Polymer/polymer/issues/1489)
+
+- Using Polymer with NW.js [\#1481](https://github.com/Polymer/polymer/issues/1481)
+
+- 0.9: String literals as parameters of computed properties [\#1475](https://github.com/Polymer/polymer/issues/1475)
+
+- Inheritance of CSS Variables [\#1470](https://github.com/Polymer/polymer/issues/1470)
+
+- support data binding with ES6 module? [\#1465](https://github.com/Polymer/polymer/issues/1465)
+
+- \[0.8\] IE9 styles broken [\#1464](https://github.com/Polymer/polymer/issues/1464)
+
+- how to get polymer and requirejs working together? [\#1463](https://github.com/Polymer/polymer/issues/1463)
+
+- .8 domReady never being called [\#1460](https://github.com/Polymer/polymer/issues/1460)
+
+- TODO in polymer.js references fixed bug [\#1457](https://github.com/Polymer/polymer/issues/1457)
+
+- \[0.8\] Self-closing p tag breaks template [\#1455](https://github.com/Polymer/polymer/issues/1455)
+
+- \[0.8\] x-repeat failing to stamp instances on safari [\#1443](https://github.com/Polymer/polymer/issues/1443)
+
+- \[0.8\] `\<content select=".class"\>` and `hostAttributes` don't work together [\#1431](https://github.com/Polymer/polymer/issues/1431)
+
+- \[0.8\] Binding to "id" is not working [\#1426](https://github.com/Polymer/polymer/issues/1426)
+
+- Event handlers within x-repeat always target the first instance of an element [\#1425](https://github.com/Polymer/polymer/issues/1425)
+
+- \[0.8\] host, port, etc are reserved for anchor elements; let's avoid them [\#1417](https://github.com/Polymer/polymer/issues/1417)
+
+- \[0.8\] IE11 displays and then hides Custom Elements [\#1412](https://github.com/Polymer/polymer/issues/1412)
+
+- \[0.8\] x-repeat objectizes arrays of strings [\#1411](https://github.com/Polymer/polymer/issues/1411)
+
+- \[0.8\] style scope missing [\#1410](https://github.com/Polymer/polymer/issues/1410)
+
+- Polymer 0.8 cant bind to array item. [\#1409](https://github.com/Polymer/polymer/issues/1409)
+
+- \[0.8\]\[styling\] Want to define custom variables in the same scope as their references [\#1406](https://github.com/Polymer/polymer/issues/1406)
+
+- \[0.8\]\[styling\] Should be able to mixin sibling properties [\#1399](https://github.com/Polymer/polymer/issues/1399)
+
+- \[0.8\] Properties deserialized from native inputs lose their type [\#1396](https://github.com/Polymer/polymer/issues/1396)
+
+- Shady DOM doesn't correctly parse custom property rules. [\#1389](https://github.com/Polymer/polymer/issues/1389)
+
+- Shady DOM custom properties don't inherit. [\#1388](https://github.com/Polymer/polymer/issues/1388)
+
+- \[0.8\] dom-module nice but not perfect [\#1380](https://github.com/Polymer/polymer/issues/1380)
+
+- \[0.8\] notify: true Bad idea unless it has a huge performance gain [\#1379](https://github.com/Polymer/polymer/issues/1379)
+
+- Style mixin syntax is incompatible with Sass [\#1373](https://github.com/Polymer/polymer/issues/1373)
+
+- \[x-repeat\] can't bind to childNodes under Shadow DOM [\#1367](https://github.com/Polymer/polymer/issues/1367)
+
+- \[0.8\] - default property values are not set by the time observers are called [\#1364](https://github.com/Polymer/polymer/issues/1364)
+
+- \[0.8\]: observer callbacks changed parameter ordering [\#1363](https://github.com/Polymer/polymer/issues/1363)
+
+- \[0.8\] HTMLAnchor has a `host` property, breaks the intended behavior of `Polymer.Base.\_queryHost` [\#1359](https://github.com/Polymer/polymer/issues/1359)
+
+- \[0.8\] Style scoped immediate descendant selector no longer matches projected content [\#1312](https://github.com/Polymer/polymer/issues/1312)
+
+- Spaces in binding causes SyntaxError: Unexpected identifier. [\#1311](https://github.com/Polymer/polymer/issues/1311)
+
+- Tracking issue: Supporting CSP in 0.8+ [\#1306](https://github.com/Polymer/polymer/issues/1306)
+
+- \[0.8\] `readOnly` property without `notify` will not be `readOnly` [\#1294](https://github.com/Polymer/polymer/issues/1294)
+
+- Shady styling increases selector specificity [\#1279](https://github.com/Polymer/polymer/issues/1279)
+
+- \[0.8\] body unresolved broken [\#1271](https://github.com/Polymer/polymer/issues/1271)
+
+- \[0.8\] accidental shared state in configure value? [\#1269](https://github.com/Polymer/polymer/issues/1269)
+
+- \[0.8\] Properties observers registered too early [\#1258](https://github.com/Polymer/polymer/issues/1258)
+
+- \[0.8\] Polymer.import missing [\#1248](https://github.com/Polymer/polymer/issues/1248)
+
+- \[0.8\] Consider always assigning to native properties [\#1226](https://github.com/Polymer/polymer/issues/1226)
+
+**Merged pull requests:**
+
+- Notify array.length changes. Fixes \#1573. [\#1600](https://github.com/Polymer/polymer/pull/1600) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- Make `dom-bind` not scope element classes. Fixes \#1542 [\#1599](https://github.com/Polymer/polymer/pull/1599) ([sorvell](https://github.com/sorvell))
+
+- 1565,1582,1584 fix [\#1597](https://github.com/Polymer/polymer/pull/1597) ([sorvell](https://github.com/sorvell))
+
+- Wait until imports resolve to stamp. Fixes \#1500 [\#1594](https://github.com/Polymer/polymer/pull/1594) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- Perform dom-bind work in attached/detached. Add tests. [\#1591](https://github.com/Polymer/polymer/pull/1591) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- Clear input.value attribute before removing for IE. Fixes \#1491. Fixe… [\#1589](https://github.com/Polymer/polymer/pull/1589) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- iterate behavior mixins in reverse order as the `hasOwnProperty` chec… [\#1588](https://github.com/Polymer/polymer/pull/1588) ([sjmiles](https://github.com/sjmiles))
+
+- serializeValueToAttribute always provokes distribute if necessary [\#1580](https://github.com/Polymer/polymer/pull/1580) ([sorvell](https://github.com/sorvell))
+
+- Use more resilient shadowroot checking [\#1579](https://github.com/Polymer/polymer/pull/1579) ([azakus](https://github.com/azakus))
+
+- Literal args comma fix [\#1577](https://github.com/Polymer/polymer/pull/1577) ([sjmiles](https://github.com/sjmiles))
+
+- allow behavior arrays to contain nested behavior arrays [\#1576](https://github.com/Polymer/polymer/pull/1576) ([sjmiles](https://github.com/sjmiles))
+
+- X style fixes [\#1570](https://github.com/Polymer/polymer/pull/1570) ([sorvell](https://github.com/sorvell))
+
+- Fix typo in PRIMER.md [\#1569](https://github.com/Polymer/polymer/pull/1569) ([ragingwind](https://github.com/ragingwind))
+
+- Remove unused keyCodes enum [\#1564](https://github.com/Polymer/polymer/pull/1564) ([jklein24](https://github.com/jklein24))
+
+- Xstyle [\#1556](https://github.com/Polymer/polymer/pull/1556) ([sorvell](https://github.com/sorvell))
+
+## [v0.9.0](https://github.com/Polymer/polymer/tree/v0.9.0) (2015-05-14)
+
+**Implemented enhancements:**
+
+- Expose dom-repeat.\_instanceForElement [\#1501](https://github.com/Polymer/polymer/issues/1501)
+
+**Closed issues:**
+
+- Change color of main panel [\#1536](https://github.com/Polymer/polymer/issues/1536)
+
+- \[0.8.0-rc.5\] observers as an array [\#1527](https://github.com/Polymer/polymer/issues/1527)
+
+- \[0.9\] Touch scroll gesture, setScrollDirection doesn't work any longer [\#1520](https://github.com/Polymer/polymer/issues/1520)
+
+- \[0.9\] Data binding? [\#1517](https://github.com/Polymer/polymer/issues/1517)
+
+- `this.$.\*` isn't set if an element \* is inside a `dom-if` block and the condition evaluates to true [\#1513](https://github.com/Polymer/polymer/issues/1513)
+
+- Paper-action-dialog with backdrop disables window [\#1509](https://github.com/Polymer/polymer/issues/1509)
+
+- How to pass data from polymer element [\#1503](https://github.com/Polymer/polymer/issues/1503)
+
+- \[0.9\] auto-binding, x-repeat template not working [\#1502](https://github.com/Polymer/polymer/issues/1502)
+
+- \[0.9\] if="{{ 1 \< 2 }}" not supported?! [\#1499](https://github.com/Polymer/polymer/issues/1499)
+
+- \[0.9\] touch track fails on iPhone, .touchIdentifier vs .identifier [\#1496](https://github.com/Polymer/polymer/issues/1496)
+
+- Internet Explorer 11 "Failed to open data:text/javascript;charset=utf-8," [\#1485](https://github.com/Polymer/polymer/issues/1485)
+
+- \[0.5.5\] Function calling is not working in custom element [\#1484](https://github.com/Polymer/polymer/issues/1484)
+
+- \[0.8\] Nested insertion points lose elements after distributeContent [\#1480](https://github.com/Polymer/polymer/issues/1480)
+
+- \[0.8\] Binding the value of an input box with {{value::input}} loses caret index [\#1471](https://github.com/Polymer/polymer/issues/1471)
+
+- \[0.8\] Nested property binding not working on Firefox/IE [\#1391](https://github.com/Polymer/polymer/issues/1391)
+
+- Memory Leak when using Data Bindings [\#1116](https://github.com/Polymer/polymer/issues/1116)
+
+**Merged pull requests:**
+
+- Update to wcjs 0.7.0. [\#1532](https://github.com/Polymer/polymer/pull/1532) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- 0.8 negate annotated computation [\#1528](https://github.com/Polymer/polymer/pull/1528) ([sjmiles](https://github.com/sjmiles))
+
+- Add commands to test build [\#1522](https://github.com/Polymer/polymer/pull/1522) ([azakus](https://github.com/azakus))
+
+- Implement a minimum track distance [\#1518](https://github.com/Polymer/polymer/pull/1518) ([azakus](https://github.com/azakus))
+
+- Process nested templates in base, parse method args for parentProps. [\#1514](https://github.com/Polymer/polymer/pull/1514) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- trasnacted -\> transacted in PRIMER.md [\#1512](https://github.com/Polymer/polymer/pull/1512) ([Shrugs](https://github.com/Shrugs))
+
+- Add missing comma in code example [\#1510](https://github.com/Polymer/polymer/pull/1510) ([fredj](https://github.com/fredj))
+
+- 0.8 shady api [\#1508](https://github.com/Polymer/polymer/pull/1508) ([sorvell](https://github.com/sorvell))
+
+- Fix dom-module closing tag [\#1497](https://github.com/Polymer/polymer/pull/1497) ([fredj](https://github.com/fredj))
+
+- Add more docs for Gestures [\#1495](https://github.com/Polymer/polymer/pull/1495) ([azakus](https://github.com/azakus))
+
+- Fix nits from \#1486 [\#1494](https://github.com/Polymer/polymer/pull/1494) ([azakus](https://github.com/azakus))
+
+- Change x-style to custom-style in comments [\#1493](https://github.com/Polymer/polymer/pull/1493) ([chuckh](https://github.com/chuckh))
+
+## [v0.9.0-rc.1](https://github.com/Polymer/polymer/tree/v0.9.0-rc.1) (2015-05-06)
+
+**Merged pull requests:**
+
+- Rename x-\* elements. [\#1488](https://github.com/Polymer/polymer/pull/1488) ([sorvell](https://github.com/sorvell))
+
+- 0.8 lexical template scope [\#1487](https://github.com/Polymer/polymer/pull/1487) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- 0.8 gestures in core [\#1486](https://github.com/Polymer/polymer/pull/1486) ([sjmiles](https://github.com/sjmiles))
+
+## [0.5.6](https://github.com/Polymer/polymer/tree/0.5.6) (2015-05-05)
+
+**Implemented enhancements:**
+
+- \[0.8\] `hostAttributes` should respect user-provided defaults [\#1458](https://github.com/Polymer/polymer/issues/1458)
+
+**Closed issues:**
+
+- Unable to connect to github.com... [\#1468](https://github.com/Polymer/polymer/issues/1468)
+
+- error using mixins as computed property or in template methods in 0.8.0-rc.7 [\#1456](https://github.com/Polymer/polymer/issues/1456)
+
+- \[0.8\] observers as an object. [\#1452](https://github.com/Polymer/polymer/issues/1452)
+
+- \[0.8\] getDistributedNodes\(\) does not update when distributed content changes [\#1449](https://github.com/Polymer/polymer/issues/1449)
+
+- \[0.8\] behaviors override properties on elements [\#1444](https://github.com/Polymer/polymer/issues/1444)
+
+- \[0.8\] bower.json license does not follow specification [\#1435](https://github.com/Polymer/polymer/issues/1435)
+
+- Error in 0.8 RC6 - not present in RC4 [\#1428](https://github.com/Polymer/polymer/issues/1428)
+
+- \[0.8\] Support :root in x-style [\#1415](https://github.com/Polymer/polymer/issues/1415)
+
+- \[0.8\] 'style-scope undefined' when combined with hostAttributes and x-if template [\#1400](https://github.com/Polymer/polymer/issues/1400)
+
+- \[0.8\] `\<link rel="import" type="css"\>` styles are shimmed out of order [\#1349](https://github.com/Polymer/polymer/issues/1349)
+
+- Polymer 0.5.2 release have version 0.5.1 [\#1033](https://github.com/Polymer/polymer/issues/1033)
+
+**Merged pull requests:**
+
+- 0.8 x style [\#1482](https://github.com/Polymer/polymer/pull/1482) ([sorvell](https://github.com/sorvell))
+
+- Fix translate3d call after transform refactor [\#1478](https://github.com/Polymer/polymer/pull/1478) ([azakus](https://github.com/azakus))
+
+- 0.8 array notification [\#1477](https://github.com/Polymer/polymer/pull/1477) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- don't trap `id` for marshalling if it's a binding directive + test [\#1474](https://github.com/Polymer/polymer/pull/1474) ([sjmiles](https://github.com/sjmiles))
+
+- use `hasOwnProperty` to avoid overwriting prototype methods when mixing in behaviors \(+test\) [\#1473](https://github.com/Polymer/polymer/pull/1473) ([sjmiles](https://github.com/sjmiles))
+
+- 0.8 fix xif polyfill [\#1469](https://github.com/Polymer/polymer/pull/1469) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- 0.8 patching [\#1462](https://github.com/Polymer/polymer/pull/1462) ([sorvell](https://github.com/sorvell))
+
+- 0.8 api scrub [\#1440](https://github.com/Polymer/polymer/pull/1440) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- typo in PRIMER.md [\#1430](https://github.com/Polymer/polymer/pull/1430) ([batista](https://github.com/batista))
+
+- Build polymer 0.8. [\#1402](https://github.com/Polymer/polymer/pull/1402) ([garlicnation](https://github.com/garlicnation))
+
+## [v0.8.0-rc.7](https://github.com/Polymer/polymer/tree/v0.8.0-rc.7) (2015-04-22)
+
+**Closed issues:**
+
+- \[0.8\] `readOnly` properties do not receive the initial value specified by `value` [\#1393](https://github.com/Polymer/polymer/issues/1393)
+
+**Merged pull requests:**
+
+- Fixes style scoping when elements are stamped inside repeats. [\#1439](https://github.com/Polymer/polymer/pull/1439) ([sorvell](https://github.com/sorvell))
+
+- 0.8 repeat fixes [\#1438](https://github.com/Polymer/polymer/pull/1438) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- Change user `constructor` to `factoryImpl` as an aid to compilation tool... [\#1437](https://github.com/Polymer/polymer/pull/1437) ([sorvell](https://github.com/sorvell))
+
+- No more circular dependencies, because bower. [\#1436](https://github.com/Polymer/polymer/pull/1436) ([nevir](https://github.com/nevir))
+
+- 0.8 behaviors [\#1433](https://github.com/Polymer/polymer/pull/1433) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- defeated -\> disabled [\#1423](https://github.com/Polymer/polymer/pull/1423) ([MetaMemoryT](https://github.com/MetaMemoryT))
+
+## [v0.8.0-rc.6](https://github.com/Polymer/polymer/tree/v0.8.0-rc.6) (2015-04-20)
+
+## [v0.8.0-rc.5](https://github.com/Polymer/polymer/tree/v0.8.0-rc.5) (2015-04-20)
+
+**Closed issues:**
+
+- \[0.8\] Global settings overwritten by webcomponents [\#1404](https://github.com/Polymer/polymer/issues/1404)
+
+- \[0.8\] distributeContent loses light children [\#1394](https://github.com/Polymer/polymer/issues/1394)
+
+- \[ShadyDOM\] Exception when removing non-distributed nodes [\#1366](https://github.com/Polymer/polymer/issues/1366)
+
+**Merged pull requests:**
+
+- 0.8 path effects [\#1422](https://github.com/Polymer/polymer/pull/1422) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- 0.8 nested template [\#1398](https://github.com/Polymer/polymer/pull/1398) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- 0.8 shim class [\#1397](https://github.com/Polymer/polymer/pull/1397) ([sorvell](https://github.com/sorvell))
+
+- \<iron-doc-viewer\> based index for local dev [\#1395](https://github.com/Polymer/polymer/pull/1395) ([nevir](https://github.com/nevir))
+
+- Add license to css-parse.html [\#1378](https://github.com/Polymer/polymer/pull/1378) ([garlicnation](https://github.com/garlicnation))
+
+## [v0.8.0-rc.4](https://github.com/Polymer/polymer/tree/v0.8.0-rc.4) (2015-04-10)
+
+## [v0.8.0-rc.3](https://github.com/Polymer/polymer/tree/v0.8.0-rc.3) (2015-04-09)
+
+**Closed issues:**
+
+- Polymer-micro.html broken? [\#1390](https://github.com/Polymer/polymer/issues/1390)
+
+- listener for DOMContentLoaded and window resize [\#1384](https://github.com/Polymer/polymer/issues/1384)
+
+- \[0.8\] Opting into native Shadow DOM isn't documented [\#1382](https://github.com/Polymer/polymer/issues/1382)
+
+- Polymer in 10 Minutes - 3. Create an app [\#1371](https://github.com/Polymer/polymer/issues/1371)
+
+- Polymer in 10 Minutes - Reusing other elements [\#1370](https://github.com/Polymer/polymer/issues/1370)
+
+- \[0.5.5\] Event fire error on safari [\#1362](https://github.com/Polymer/polymer/issues/1362)
+
+- \[0.8\] importHref fails in IE/FF [\#1343](https://github.com/Polymer/polymer/issues/1343)
+
+- Attribute Value of "selected" in the tutorial [\#1228](https://github.com/Polymer/polymer/issues/1228)
+
+**Merged pull requests:**
+
+- 0.8 machined [\#1386](https://github.com/Polymer/polymer/pull/1386) ([sorvell](https://github.com/sorvell))
+
+- Clarify concept of host to mean dom host. Related: [\#1372](https://github.com/Polymer/polymer/pull/1372) ([sorvell](https://github.com/sorvell))
+
+## [v0.8.0-rc.2](https://github.com/Polymer/polymer/tree/v0.8.0-rc.2) (2015-04-02)
+
+**Closed issues:**
+
+- \[0.8\] Using one-way binding to propagate upward [\#1360](https://github.com/Polymer/polymer/issues/1360)
+
+## [v0.8.0](https://github.com/Polymer/polymer/tree/v0.8.0) (2015-04-02)
+
+**Implemented enhancements:**
+
+- \[Shadow DOM\] Make Shadow DOM optional [\#1042](https://github.com/Polymer/polymer/issues/1042)
+
+**Closed issues:**
+
+- \[0.8\] extended my-input element isn't shown [\#1350](https://github.com/Polymer/polymer/issues/1350)
+
+- Polymer function not accessible in firefox/safari [\#1316](https://github.com/Polymer/polymer/issues/1316)
+
+**Merged pull requests:**
+
+- Fix undeclared variable exception in \_distributeInsertionPoint. [\#1351](https://github.com/Polymer/polymer/pull/1351) ([icetraxx](https://github.com/icetraxx))
+
+- 0.8 custom notify event [\#1335](https://github.com/Polymer/polymer/pull/1335) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+## [v0.8.0-rc.1](https://github.com/Polymer/polymer/tree/v0.8.0-rc.1) (2015-03-26)
+
+**Fixed bugs:**
+
+- \[0.8-preview\] Throws exception if left-hand-side of a property binding contains a dash [\#1161](https://github.com/Polymer/polymer/issues/1161)
+
+- Bindings in \<style\> no longer work under polyfill [\#270](https://github.com/Polymer/polymer/issues/270)
+
+**Closed issues:**
+
+- core-list needs your attention [\#1333](https://github.com/Polymer/polymer/issues/1333)
+
+- Icons oversized on Firefox on polymer-project.org [\#1328](https://github.com/Polymer/polymer/issues/1328)
+
+- \[0.8\] Unable to observe property 'hidden' [\#1322](https://github.com/Polymer/polymer/issues/1322)
+
+- \[0.8\] Unexpected token \] [\#1298](https://github.com/Polymer/polymer/issues/1298)
+
+- \[0.8\] Text bindings break if parenthesis are used [\#1297](https://github.com/Polymer/polymer/issues/1297)
+
+- \[0.8\] Shady style processor doesn't drop operator for ::content [\#1293](https://github.com/Polymer/polymer/issues/1293)
+
+- Polymer layout collision with another frameworks like Angular Material [\#1289](https://github.com/Polymer/polymer/issues/1289)
+
+- Polymer Project Site - Broken Link [\#1288](https://github.com/Polymer/polymer/issues/1288)
+
+- core-ajax [\#1287](https://github.com/Polymer/polymer/issues/1287)
+
+- demo portions of documentation are missing/404 [\#1286](https://github.com/Polymer/polymer/issues/1286)
+
+- \[0.8\] `attached` is called at different points in lifecycle for ShadeyDOM vs ShadowDOM [\#1285](https://github.com/Polymer/polymer/issues/1285)
+
+- \[0.8\] Listening to events on an element produces different results under ShadowDOM v. ShadyDOM [\#1284](https://github.com/Polymer/polymer/issues/1284)
+
+- Attribute selectors incorrectly scoped [\#1282](https://github.com/Polymer/polymer/issues/1282)
+
+- \[0.8-preview\] Shadey styles have incorrect order of precedence [\#1277](https://github.com/Polymer/polymer/issues/1277)
+
+- \[0.8\] Styling scoping not working with type extension elements [\#1275](https://github.com/Polymer/polymer/issues/1275)
+
+- Typo on website [\#1273](https://github.com/Polymer/polymer/issues/1273)
+
+- \[0.8-preview\] All properties are available for data binding [\#1262](https://github.com/Polymer/polymer/issues/1262)
+
+- \[0.8\] camel-case attributes do not deserialize to properties correctly. [\#1257](https://github.com/Polymer/polymer/issues/1257)
+
+- paper-autogrow-textarea bug [\#1255](https://github.com/Polymer/polymer/issues/1255)
+
+- \<paper-input-decorator label=“birthday”\> [\#1251](https://github.com/Polymer/polymer/issues/1251)
+
+- How addEventListener in nested template? [\#1250](https://github.com/Polymer/polymer/issues/1250)
+
+- \<paper-input-decorator label="test" autoValidate?="{{autoValidate}}"\> [\#1249](https://github.com/Polymer/polymer/issues/1249)
+
+- Installing with Bower not working [\#1246](https://github.com/Polymer/polymer/issues/1246)
+
+- Bower package not found [\#1245](https://github.com/Polymer/polymer/issues/1245)
+
+- \[0.8\] template x-repeat throws error under native ShadowDOM [\#1244](https://github.com/Polymer/polymer/issues/1244)
+
+- \[0.8\] Multiple computed properties call same method [\#1242](https://github.com/Polymer/polymer/issues/1242)
+
+- \[0.8\] value binding not working in samples.html [\#1241](https://github.com/Polymer/polymer/issues/1241)
+
+- \[0.8\] encapsulate and class binding not working well together [\#1240](https://github.com/Polymer/polymer/issues/1240)
+
+- Links in SPA tutorial are broken [\#1239](https://github.com/Polymer/polymer/issues/1239)
+
+- What is the complete Polymer Public API? [\#1233](https://github.com/Polymer/polymer/issues/1233)
+
+- content does not get wrapped on mobile devices [\#1221](https://github.com/Polymer/polymer/issues/1221)
+
+- BUG: web-component-tester, sauce-connect-launcher dependency [\#1214](https://github.com/Polymer/polymer/issues/1214)
+
+- Why calling polymer.js instead of polymer.min.js? [\#1213](https://github.com/Polymer/polymer/issues/1213)
+
+- Imperatively declared element's custom fired event does not bubble up. [\#1212](https://github.com/Polymer/polymer/issues/1212)
+
+- \[0.8\] Attribute deserialization possibly busted? [\#1208](https://github.com/Polymer/polymer/issues/1208)
+
+- \[0.8\] Undefined method in constructor [\#1207](https://github.com/Polymer/polymer/issues/1207)
+
+- Typo [\#1205](https://github.com/Polymer/polymer/issues/1205)
+
+- \[0.8\] x-template should provide bound values to elements' configure [\#1200](https://github.com/Polymer/polymer/issues/1200)
+
+- Dynamically publishing attributes [\#1198](https://github.com/Polymer/polymer/issues/1198)
+
+- Template's script doesn't execute when imported from another document \(polyfill\) [\#1197](https://github.com/Polymer/polymer/issues/1197)
+
+- \[0.8-preview\] x-repeat standalone issue [\#1192](https://github.com/Polymer/polymer/issues/1192)
+
+- Polymer.Import - handle 404's [\#1184](https://github.com/Polymer/polymer/issues/1184)
+
+- Get Started Tutorial [\#1181](https://github.com/Polymer/polymer/issues/1181)
+
+- Initialization might fail when surrounded by p-element [\#1180](https://github.com/Polymer/polymer/issues/1180)
+
+- Why no paper-label? [\#1174](https://github.com/Polymer/polymer/issues/1174)
+
+- Polymer \(inline styling\) inconsistent between Chrome and Firefox [\#1172](https://github.com/Polymer/polymer/issues/1172)
+
+- \[0.8-preview\] Bespoke element constructors [\#1151](https://github.com/Polymer/polymer/issues/1151)
+
+- \[0.8-preview\] detached not getting called when the element being removed is in the localDom of another element. [\#1145](https://github.com/Polymer/polymer/issues/1145)
+
+- \[0.8-preview\] Boolean attribute change handlers are called before `localDom` or `lightDom` are available. [\#1131](https://github.com/Polymer/polymer/issues/1131)
+
+- Reference to `HTMLLinkElement` in `Polymer.import` callback [\#1127](https://github.com/Polymer/polymer/issues/1127)
+
+- 0.8-preview: multiple arguments to computed method [\#1092](https://github.com/Polymer/polymer/issues/1092)
+
+- 0.8-preview: handle case-sensitivity problems around attributes [\#1080](https://github.com/Polymer/polymer/issues/1080)
+
+- 0.8-preview: "ready" fires before "created"? [\#1079](https://github.com/Polymer/polymer/issues/1079)
+
+- Wrong Bindings types documentation [\#980](https://github.com/Polymer/polymer/issues/980)
+
+**Merged pull requests:**
+
+- update webcomponents dependency [\#1339](https://github.com/Polymer/polymer/pull/1339) ([garlicnation](https://github.com/garlicnation))
+
+- Update bower.json to point to wcjs at 0.6.0 instead of master. [\#1338](https://github.com/Polymer/polymer/pull/1338) ([garlicnation](https://github.com/garlicnation))
+
+- Fix typo an -\> and [\#1330](https://github.com/Polymer/polymer/pull/1330) ([ragingwind](https://github.com/ragingwind))
+
+- Update PRIMER.md [\#1327](https://github.com/Polymer/polymer/pull/1327) ([mohanaravind](https://github.com/mohanaravind))
+
+- Move notify event target check to \_notifyListener. [\#1323](https://github.com/Polymer/polymer/pull/1323) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- Shady DOM optimizations: \(1\) fast path distribution when no insertion po... [\#1320](https://github.com/Polymer/polymer/pull/1320) ([sorvell](https://github.com/sorvell))
+
+- \[0.8\] Minor doc typo [\#1313](https://github.com/Polymer/polymer/pull/1313) ([fredj](https://github.com/fredj))
+
+- \[0.8\] Bye bye bowerrc [\#1310](https://github.com/Polymer/polymer/pull/1310) ([nevir](https://github.com/nevir))
+
+- 0.8 gestures [\#1309](https://github.com/Polymer/polymer/pull/1309) ([frankiefu](https://github.com/frankiefu))
+
+- Make webcomponentsjs a bower dependency [\#1307](https://github.com/Polymer/polymer/pull/1307) ([robdodson](https://github.com/robdodson))
+
+- Walk attributes backward to avoid IE veto on removeAttribute. [\#1302](https://github.com/Polymer/polymer/pull/1302) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- Update PRIMER.md [\#1301](https://github.com/Polymer/polymer/pull/1301) ([mohanaravind](https://github.com/mohanaravind))
+
+- Separate attributes function from annotations [\#1300](https://github.com/Polymer/polymer/pull/1300) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- Bugfix: ReferenceError: c is not defined [\#1295](https://github.com/Polymer/polymer/pull/1295) ([atotic](https://github.com/atotic))
+
+- Minor text edits on DOM API description [\#1281](https://github.com/Polymer/polymer/pull/1281) ([arthurevans](https://github.com/arthurevans))
+
+- Fixes typo and broken link in PRIMER. [\#1274](https://github.com/Polymer/polymer/pull/1274) ([batista](https://github.com/batista))
+
+- 0.8 demodulate [\#1264](https://github.com/Polymer/polymer/pull/1264) ([sjmiles](https://github.com/sjmiles))
+
+- 0.8 property config [\#1256](https://github.com/Polymer/polymer/pull/1256) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- Fixed insertion of numbers and booleans in the weakmap in 0.8-preview [\#1253](https://github.com/Polymer/polymer/pull/1253) ([cedric-marcone](https://github.com/cedric-marcone))
+
+- Unique comp props [\#1243](https://github.com/Polymer/polymer/pull/1243) ([ssorallen](https://github.com/ssorallen))
+
+- Standardize indentation across examples in Primer [\#1235](https://github.com/Polymer/polymer/pull/1235) ([ssorallen](https://github.com/ssorallen))
+
+- Use correct `Dom` capitalization in Primer doc [\#1222](https://github.com/Polymer/polymer/pull/1222) ([ssorallen](https://github.com/ssorallen))
+
+- Collection repeat [\#1215](https://github.com/Polymer/polymer/pull/1215) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- Fix typo in PRIMER.md [\#1204](https://github.com/Polymer/polymer/pull/1204) ([fredj](https://github.com/fredj))
+
+## [0.5.5](https://github.com/Polymer/polymer/tree/0.5.5) (2015-02-18)
+
+**Closed issues:**
+
+- Need a Polymer Core \(team member\) representative asap? [\#1194](https://github.com/Polymer/polymer/issues/1194)
+
+**Merged pull requests:**
+
+- possible fix for \[0.8-preview\] \#1192 [\#1202](https://github.com/Polymer/polymer/pull/1202) ([sjmiles](https://github.com/sjmiles))
+
+- Basic test for x-template stamping [\#1199](https://github.com/Polymer/polymer/pull/1199) ([nevir](https://github.com/nevir))
+
+## [0.5.5-rc1](https://github.com/Polymer/polymer/tree/0.5.5-rc1) (2015-02-13)
+
+**Closed issues:**
+
+- How Polymer handle elements' model communication? [\#1187](https://github.com/Polymer/polymer/issues/1187)
+
+- Polymer is failing silently without any console error [\#1171](https://github.com/Polymer/polymer/issues/1171)
+
+- Elements created at runtime, can't know when ready [\#1158](https://github.com/Polymer/polymer/issues/1158)
+
+- core-dropdown-menu is ugly magugly [\#1146](https://github.com/Polymer/polymer/issues/1146)
+
+- polymer element not compatible with IE [\#1143](https://github.com/Polymer/polymer/issues/1143)
+
+- polymer element not compatible with IE [\#1142](https://github.com/Polymer/polymer/issues/1142)
+
+- Please improve home site's colors [\#1141](https://github.com/Polymer/polymer/issues/1141)
+
+- polymer element not compatible with IE [\#1140](https://github.com/Polymer/polymer/issues/1140)
+
+- polymer element not compatible with IE [\#1139](https://github.com/Polymer/polymer/issues/1139)
+
+- polymer element not compatible with IE [\#1138](https://github.com/Polymer/polymer/issues/1138)
+
+- Element with id="exports" results in uncaught "Observer is not defined" exception [\#1134](https://github.com/Polymer/polymer/issues/1134)
+
+- Data-binding in \<template\> on objects attributes have strange behaviour \[bug?\] [\#1129](https://github.com/Polymer/polymer/issues/1129)
+
+- tipAttribute is not working properly [\#1126](https://github.com/Polymer/polymer/issues/1126)
+
+- IE 10+11 + data binding in inline style not working in Polymer v0.5.4 [\#1124](https://github.com/Polymer/polymer/issues/1124)
+
+- webcomponents.min.js:11 Uncaught TypeError: undefined is not a function [\#1122](https://github.com/Polymer/polymer/issues/1122)
+
+- TypeError: Attempting to configurable attribute of unconfigurable property. [\#1119](https://github.com/Polymer/polymer/issues/1119)
+
+- Template with svg style url\(\#id\) is shimmed with file name [\#751](https://github.com/Polymer/polymer/issues/751)
+
+**Merged pull requests:**
+
+- 0.8 dash case [\#1191](https://github.com/Polymer/polymer/pull/1191) ([sjmiles](https://github.com/sjmiles))
+
+- Add externs. [\#1165](https://github.com/Polymer/polymer/pull/1165) ([garlicnation](https://github.com/garlicnation))
+
+- primer: fix module syntax [\#1162](https://github.com/Polymer/polymer/pull/1162) ([morethanreal](https://github.com/morethanreal))
+
+- nit: fix typo in PRIMER.md [\#1147](https://github.com/Polymer/polymer/pull/1147) ([rictic](https://github.com/rictic))
+
+- Add build script for autoclave [\#1132](https://github.com/Polymer/polymer/pull/1132) ([azakus](https://github.com/azakus))
+
+## [0.5.4](https://github.com/Polymer/polymer/tree/0.5.4) (2015-01-24)
+
+**Closed issues:**
+
+- Dropdown Menu [\#1118](https://github.com/Polymer/polymer/issues/1118)
+
+- Extracting an unknown archive [\#1103](https://github.com/Polymer/polymer/issues/1103)
+
+## [0.5.3](https://github.com/Polymer/polymer/tree/0.5.3) (2015-01-21)
+
+## [0.5.3-rc2](https://github.com/Polymer/polymer/tree/0.5.3-rc2) (2015-01-21)
+
+**Closed issues:**
+
+- problems trying 0.5.3-rc [\#1117](https://github.com/Polymer/polymer/issues/1117)
+
+- Missing e in function - Tutorial [\#1110](https://github.com/Polymer/polymer/issues/1110)
+
+- Cannot find function or filter [\#1102](https://github.com/Polymer/polymer/issues/1102)
+
+- core-icons:work bug [\#1100](https://github.com/Polymer/polymer/issues/1100)
+
+- https://www.polymer-project.org/components/all-of-them/all-of-them.html [\#1096](https://github.com/Polymer/polymer/issues/1096)
+
+- Safari is not opening the demo page of polymer [\#1088](https://github.com/Polymer/polymer/issues/1088)
+
+- 0.8-preview: newline confuses findAnnotatedNode [\#1078](https://github.com/Polymer/polymer/issues/1078)
+
+**Merged pull requests:**
+
+- \[0.8\] name -\> is [\#1112](https://github.com/Polymer/polymer/pull/1112) ([nevir](https://github.com/nevir))
+
+- \[0.8\] Fix small typos in PRIMER.md [\#1098](https://github.com/Polymer/polymer/pull/1098) ([peterwmwong](https://github.com/peterwmwong))
+
+## [0.5.3-rc](https://github.com/Polymer/polymer/tree/0.5.3-rc) (2015-01-15)
+
+**Fixed bugs:**
+
+- Need consistent path behavior [\#651](https://github.com/Polymer/polymer/issues/651)
+
+**Closed issues:**
+
+- Missing scrollbars, and mouse wheel not working [\#1089](https://github.com/Polymer/polymer/issues/1089)
+
+- Very noticeable sluggishness when scrolling [\#1084](https://github.com/Polymer/polymer/issues/1084)
+
+- Can't build 0.8-preview and there is no build information at all [\#1075](https://github.com/Polymer/polymer/issues/1075)
+
+- paper-toggle-button and paper-checkbox events incorrectly documented [\#1074](https://github.com/Polymer/polymer/issues/1074)
+
+- Failed to assign list scroller to scroller of headerPanel [\#1072](https://github.com/Polymer/polymer/issues/1072)
+
+- this.$ gets polluted with shadow dom of other components [\#1069](https://github.com/Polymer/polymer/issues/1069)
+
+- Documentation Wrong and no worked Data binding on IE11 [\#1067](https://github.com/Polymer/polymer/issues/1067)
+
+- How to replace tag name depend on attribute? [\#1064](https://github.com/Polymer/polymer/issues/1064)
+
+- DataBinding not full work in IE \(polymer-0.5.2\) [\#1063](https://github.com/Polymer/polymer/issues/1063)
+
+- Template references in SVG not working [\#1061](https://github.com/Polymer/polymer/issues/1061)
+
+- Docs examples missing custom element name [\#1058](https://github.com/Polymer/polymer/issues/1058)
+
+- :host styles not rendering [\#1057](https://github.com/Polymer/polymer/issues/1057)
+
+- Redraw menu list [\#1054](https://github.com/Polymer/polymer/issues/1054)
+
+- fire message to other element [\#1045](https://github.com/Polymer/polymer/issues/1045)
+
+- img width 100% event [\#1044](https://github.com/Polymer/polymer/issues/1044)
+
+- Typo [\#1041](https://github.com/Polymer/polymer/issues/1041)
+
+- Please hire a competent technical writer [\#1036](https://github.com/Polymer/polymer/issues/1036)
+
+- Chrome: Faulty responsiveness if window size is instantly changed [\#1034](https://github.com/Polymer/polymer/issues/1034)
+
+- Polymer in 10 minutes - horizontal scroll bar doesn't work in chrome [\#1030](https://github.com/Polymer/polymer/issues/1030)
+
+- Arguments in the function expressions are not watched - binding fails [\#1021](https://github.com/Polymer/polymer/issues/1021)
+
+- core-selector doesn't work on FF/linux for core\_elements \>= 5.0 [\#1015](https://github.com/Polymer/polymer/issues/1015)
+
+- Missing web-animations-next-lite.min.js [\#1014](https://github.com/Polymer/polymer/issues/1014)
+
+- webcomponents.js doesn't work [\#1013](https://github.com/Polymer/polymer/issues/1013)
+
+- The main page and demos doesn't work on Firefox!!!! [\#1007](https://github.com/Polymer/polymer/issues/1007)
+
+- Remember scroll position of selected page and prevent auto scrolling when selecting a other page. [\#1000](https://github.com/Polymer/polymer/issues/1000)
+
+- No field view on iOS 8 [\#986](https://github.com/Polymer/polymer/issues/986)
+
+- \<meta name="layout" content="polymer or some other layout2"\> [\#959](https://github.com/Polymer/polymer/issues/959)
+
+- Stoped to render on firefox after .35 update \(trying to fix jquery conflict\) [\#697](https://github.com/Polymer/polymer/issues/697)
+
+- on-click doesn't work with bootstrap and jQuery [\#625](https://github.com/Polymer/polymer/issues/625)
+
+**Merged pull requests:**
+
+- Adjust to the new unit test layout [\#1093](https://github.com/Polymer/polymer/pull/1093) ([nevir](https://github.com/nevir))
+
+- Make `ready` independent of attached state and make distribution go top-down logically and composition unwind bottom-up [\#1039](https://github.com/Polymer/polymer/pull/1039) ([sorvell](https://github.com/sorvell))
+
+- 0.8 simplex [\#1028](https://github.com/Polymer/polymer/pull/1028) ([sorvell](https://github.com/sorvell))
+
+- Expands the `\<content\>` element to remember logical DOM [\#1017](https://github.com/Polymer/polymer/pull/1017) ([jmesserly](https://github.com/jmesserly))
+
+## [0.5.2](https://github.com/Polymer/polymer/tree/0.5.2) (2014-12-11)
+
+**Closed issues:**
+
+- Best\(?\) practice for loading & saving relational data [\#1008](https://github.com/Polymer/polymer/issues/1008)
+
+- the demos don't work in Chrome and Opera [\#1006](https://github.com/Polymer/polymer/issues/1006)
+
+- one click triggers two popup of paper-dropdown-menu [\#1004](https://github.com/Polymer/polymer/issues/1004)
+
+- polymer-project.org bad link [\#1003](https://github.com/Polymer/polymer/issues/1003)
+
+- \[Firefox\] \[Regression 0.4.2 -\> 0.5.0\] `on-tap` event not catched [\#997](https://github.com/Polymer/polymer/issues/997)
+
+- In Q&A, answer about hosting for tests is misleading [\#994](https://github.com/Polymer/polymer/issues/994)
+
+- core-overlay not working on firefox 34 [\#993](https://github.com/Polymer/polymer/issues/993)
+
+- Circular dependency between core-iconset and core-icon bower modules [\#992](https://github.com/Polymer/polymer/issues/992)
+
+- www.polymer-project.org unusable in firefox [\#991](https://github.com/Polymer/polymer/issues/991)
+
+- \<core-tooltip\> and paper-fab don't like each other. [\#988](https://github.com/Polymer/polymer/issues/988)
+
+- Weird bug in Firefox and Safari [\#984](https://github.com/Polymer/polymer/issues/984)
+
+- Polymer 0.5.0 for iOS 8 Console reports ReferenceError: Can't find variable: logFlags [\#981](https://github.com/Polymer/polymer/issues/981)
+
+- 404 Documentation Link [\#977](https://github.com/Polymer/polymer/issues/977)
+
+- scrolling over a paper-input-decorator using a touch device selects that input making it nearly impossible to scroll over paper-input fields on a mobile device [\#973](https://github.com/Polymer/polymer/issues/973)
+
+- core-item ignores clicks on polymer-project.org in Firefox [\#968](https://github.com/Polymer/polymer/issues/968)
+
+- https://www.polymer-project.org/platform/custom-elements.html has a 404 for the "Shadow dom" button [\#967](https://github.com/Polymer/polymer/issues/967)
+
+- ZIP download missing minified webcomponents.js [\#965](https://github.com/Polymer/polymer/issues/965)
+
+- Unable to get on-core-select to fire in paper-dropdown-menu [\#957](https://github.com/Polymer/polymer/issues/957)
+
+- 0.5.1 Element Name could not be inferred | Safari && Mobile Safari [\#956](https://github.com/Polymer/polymer/issues/956)
+
+- url relative path ../ not works for cross domain link import [\#955](https://github.com/Polymer/polymer/issues/955)
+
+- url relative path ../ not works for cross domain link import [\#954](https://github.com/Polymer/polymer/issues/954)
+
+- Can't get a \<core-menu-button\> component in \<core-toolbar\> to show child nodes [\#951](https://github.com/Polymer/polymer/issues/951)
+
+- paper-autogrow text not in bower update [\#949](https://github.com/Polymer/polymer/issues/949)
+
+- Need info how to test polymer elements using Selenium. [\#948](https://github.com/Polymer/polymer/issues/948)
+
+- "horizontal layout wrap" broken in fireFox [\#945](https://github.com/Polymer/polymer/issues/945)
+
+- Zip file is empty upon download [\#943](https://github.com/Polymer/polymer/issues/943)
+
+- on-tap not working on Firefox [\#941](https://github.com/Polymer/polymer/issues/941)
+
+- \[Question\] Using Polymer for progressive enhancement [\#940](https://github.com/Polymer/polymer/issues/940)
+
+- Buttons not working after vulcanize [\#935](https://github.com/Polymer/polymer/issues/935)
+
+- Dropdown Resizing [\#930](https://github.com/Polymer/polymer/issues/930)
+
+- demo content [\#929](https://github.com/Polymer/polymer/issues/929)
+
+- https://www.polymer-project.org/components/web-component-tester/browser.js not found [\#928](https://github.com/Polymer/polymer/issues/928)
+
+- web-animations.html missing from web-animations-next - \(Polymer 0.5.1\) [\#923](https://github.com/Polymer/polymer/issues/923)
+
+- Paper Menu button page on Polymer website shows example for paper dropdown menu not paper menu button [\#922](https://github.com/Polymer/polymer/issues/922)
+
+- Click handlers don't work anymore on iOS with 0.5.0 [\#918](https://github.com/Polymer/polymer/issues/918)
+
+- paper-dropdown-menu not working correctly or documentation needs update. [\#911](https://github.com/Polymer/polymer/issues/911)
+
+- Add API for communicating hide/show/resize from parents to interested children [\#849](https://github.com/Polymer/polymer/issues/849)
+
+- bower install on yosemite [\#808](https://github.com/Polymer/polymer/issues/808)
+
+- Two finger touch events - not working [\#802](https://github.com/Polymer/polymer/issues/802)
+
+- Create a core-label, associate a label with a child focusable control [\#793](https://github.com/Polymer/polymer/issues/793)
+
+- Not possible to stay on older version \(0.3.5\) [\#758](https://github.com/Polymer/polymer/issues/758)
+
+**Merged pull requests:**
+
+- 0.8 miceplay [\#1012](https://github.com/Polymer/polymer/pull/1012) ([kevinpschaaf](https://github.com/kevinpschaaf))
+
+- Spelling correction. [\#996](https://github.com/Polymer/polymer/pull/996) ([germ13](https://github.com/germ13))
+
+- Use possessive "its" [\#970](https://github.com/Polymer/polymer/pull/970) ([BrianGeppert](https://github.com/BrianGeppert))
+
+- README update [\#927](https://github.com/Polymer/polymer/pull/927) ([rottina](https://github.com/rottina))
+
+## [0.5.1](https://github.com/Polymer/polymer/tree/0.5.1) (2014-11-12)
+
+**Closed issues:**
+
+- Bug on site [\#920](https://github.com/Polymer/polymer/issues/920)
+
+- href in my element not working on iOS [\#919](https://github.com/Polymer/polymer/issues/919)
+
+- \[Polymer\#0.5.0\]\[Safari\] TypeError: undefined is not an object \(evaluating 'HTMLImports.path.resolveUrlsInStyle'\) \(url.js line 199\) [\#915](https://github.com/Polymer/polymer/issues/915)
+
+- \[Polymer\#0.5.0\]\[Firefox\] TypeError: HTMLImports.path is undefined \(platform.js line 14\) [\#914](https://github.com/Polymer/polymer/issues/914)
+
+- \[Polymer\#0.5.0\]\[Chrome\] Uncaught TypeError: Cannot read property 'parse' of undefined \(boot.js line 14\) [\#913](https://github.com/Polymer/polymer/issues/913)
+
+- web-animations-next/web-animations.html file missing [\#909](https://github.com/Polymer/polymer/issues/909)
+
+- No release notes for 0.5.0 [\#908](https://github.com/Polymer/polymer/issues/908)
+
+- Back button navigation sometimes broken on polymer-project website [\#907](https://github.com/Polymer/polymer/issues/907)
+
+- Designer Tool page appears blank [\#906](https://github.com/Polymer/polymer/issues/906)
+
+- Polymer is undefined in IE11 [\#905](https://github.com/Polymer/polymer/issues/905)
+
+- Using polymer with Jinja2 server side templating [\#904](https://github.com/Polymer/polymer/issues/904)
+
+- ERR\_CONNECTION\_CLOSED trying to visit blog.polymer-project.org [\#894](https://github.com/Polymer/polymer/issues/894)
+
+- Consider not dirty check polling when the tab is not visible [\#892](https://github.com/Polymer/polymer/issues/892)
+
+## [0.5.0](https://github.com/Polymer/polymer/tree/0.5.0) (2014-11-10)
+
+**Fixed bugs:**
+
+- Links to "\#" get rewritten to just "" which causes a refresh if clicked [\#672](https://github.com/Polymer/polymer/issues/672)
+
+**Closed issues:**
+
+- Incorrect behaviour for disabled fields with Polymer paper-input-decorator [\#901](https://github.com/Polymer/polymer/issues/901)
+
+- Ajax responseChanged return logged twice [\#900](https://github.com/Polymer/polymer/issues/900)
+
+- behavior difference between \<my-component/\> and \<my-component\>\</my-component\> [\#899](https://github.com/Polymer/polymer/issues/899)
+
+- on-tap does not cause paper-input value to be committed [\#890](https://github.com/Polymer/polymer/issues/890)
+
+- \<paper-item\> has 'iconSrc' attribute, should be 'src' like \<paper-fab\>, \<paper-icon-button\> and \<paper-menu-button\> [\#889](https://github.com/Polymer/polymer/issues/889)
+
+- paper-input documentation lacks details on field validation [\#888](https://github.com/Polymer/polymer/issues/888)
+
+- paper-input documentation inconsistently suggests theming via JS properties [\#887](https://github.com/Polymer/polymer/issues/887)
+
+- paper-input documentation suggests html /deep/ selectors, inconsistent with other elements [\#886](https://github.com/Polymer/polymer/issues/886)
+
+- paper-input cursor doesn't seem to support theming [\#885](https://github.com/Polymer/polymer/issues/885)
+
+- paper-input styling instructions lack the ::shadow pseudo-element [\#884](https://github.com/Polymer/polymer/issues/884)
+
+- paper-dropdown-menu: selectedProperty doesn't seem to work [\#881](https://github.com/Polymer/polymer/issues/881)
+
+- Add support for native ES6 class Symbol [\#880](https://github.com/Polymer/polymer/issues/880)
+
+- demo page fails https://www.polymer-project.org/components/core-ajax/demo.html [\#838](https://github.com/Polymer/polymer/issues/838)
+
+- core-icon-button does but paper-icon-button does not load core-iconset-svg [\#834](https://github.com/Polymer/polymer/issues/834)
+
+- paper-fab button href bad [\#830](https://github.com/Polymer/polymer/issues/830)
+
+- Documentation error on core-animation [\#828](https://github.com/Polymer/polymer/issues/828)
+
+- Data-binding within component inside template style [\#827](https://github.com/Polymer/polymer/issues/827)
+
+- Can't scroll using mouse or keyboard [\#817](https://github.com/Polymer/polymer/issues/817)
+
+- On-tap sends event twice on touch device [\#814](https://github.com/Polymer/polymer/issues/814)
+
+- paper-button raised attribute does not work properly when set programmatically [\#812](https://github.com/Polymer/polymer/issues/812)
+
+- Trying to import core-ajax I get an appendChild on \#document error [\#810](https://github.com/Polymer/polymer/issues/810)
+
+- core-ajax demo not working [\#807](https://github.com/Polymer/polymer/issues/807)
+
+- Disabled on Switch is not working [\#806](https://github.com/Polymer/polymer/issues/806)
+
+- core-dropdown 0.4.2 not working [\#804](https://github.com/Polymer/polymer/issues/804)
+
+- paper-button has wrong documentation [\#801](https://github.com/Polymer/polymer/issues/801)
+
+- Importing Polymer fails, cannot find WebComponents [\#797](https://github.com/Polymer/polymer/issues/797)
+
+- Link Tooling information is down [\#792](https://github.com/Polymer/polymer/issues/792)
+
+- Can't set the background color of paper-progress from javascript [\#787](https://github.com/Polymer/polymer/issues/787)
+
+- Element stops working if taken off the DOM and put back in [\#782](https://github.com/Polymer/polymer/issues/782)
+
+- paper drop down list showing in middle of screen first time. [\#776](https://github.com/Polymer/polymer/issues/776)
+
+- Template repeat index value is evaluated only after loop end [\#774](https://github.com/Polymer/polymer/issues/774)
+
+- Polymer + Cordova + PhoneGap + iOS = Very Laggy / Slow? [\#773](https://github.com/Polymer/polymer/issues/773)
+
+- Repository error [\#767](https://github.com/Polymer/polymer/issues/767)
+
+- problem accessing polymer properties from content script [\#753](https://github.com/Polymer/polymer/issues/753)
+
+- Polymer as UI only [\#752](https://github.com/Polymer/polymer/issues/752)
+
+**Merged pull requests:**
+
+- add space between "go" and "to" [\#778](https://github.com/Polymer/polymer/pull/778) ([jodytate](https://github.com/jodytate))
+
+- Create a basic jsdoc externs file for Polymer [\#769](https://github.com/Polymer/polymer/pull/769) ([rictic](https://github.com/rictic))
+
+## [0.4.2](https://github.com/Polymer/polymer/tree/0.4.2) (2014-10-02)
+
+**Closed issues:**
+
+- 'Flexible children' example doesn't work. [\#772](https://github.com/Polymer/polymer/issues/772)
+
+- Google Drive Element Error in IE [\#771](https://github.com/Polymer/polymer/issues/771)
+
+- doesn't work in a zip file [\#766](https://github.com/Polymer/polymer/issues/766)
+
+- Paper-Dialog on page load doesnt work in firefox. [\#761](https://github.com/Polymer/polymer/issues/761)
+
+- Extending input not working in Chromium 37.0.2062.94 Ubuntu 14.10 \(290621\) \(64-bit\) [\#754](https://github.com/Polymer/polymer/issues/754)
+
+- core-list scroll [\#748](https://github.com/Polymer/polymer/issues/748)
+
+- Topeka responsiveness [\#708](https://github.com/Polymer/polymer/issues/708)
+
+- Chrome - animation glitch [\#593](https://github.com/Polymer/polymer/issues/593)
+
+## [0.3.6](https://github.com/Polymer/polymer/tree/0.3.6) (2014-09-18)
+
+## [0.4.1](https://github.com/Polymer/polymer/tree/0.4.1) (2014-09-18)
+
+**Implemented enhancements:**
+
+- Feature request: testing whether a custom element extends a certain type [\#380](https://github.com/Polymer/polymer/issues/380)
+
+**Fixed bugs:**
+
+- Elements failing `instanceof` after WebComponentsReady [\#402](https://github.com/Polymer/polymer/issues/402)
+
+**Closed issues:**
+
+- OSX Yosemite [\#750](https://github.com/Polymer/polymer/issues/750)
+
+- File structure not the same, when using bower [\#747](https://github.com/Polymer/polymer/issues/747)
+
+- Closing the overlay resets the position to center of window [\#746](https://github.com/Polymer/polymer/issues/746)
+
+- noscript breaks inheritance [\#740](https://github.com/Polymer/polymer/issues/740)
+
+- In age-slider example, using space in name results in truncated name [\#739](https://github.com/Polymer/polymer/issues/739)
+
+- Improve documentation for core-icon when using custom icon sets [\#738](https://github.com/Polymer/polymer/issues/738)
+
+- Broken Link in Docs/CreatingElements/AddPropertiesAndMethods [\#737](https://github.com/Polymer/polymer/issues/737)
+
+- Miss placing script element inside a polymer element lead to miss leading error message [\#736](https://github.com/Polymer/polymer/issues/736)
+
+- Not a BUG - FYI: Update tutorial - core-icon-button [\#730](https://github.com/Polymer/polymer/issues/730)
+
+- FormData wrapper breaks XMLHttpRequest\#send\(FormData\) in Firefox [\#725](https://github.com/Polymer/polymer/issues/725)
+
+- Tap event does not fire for SVG elements anymore [\#722](https://github.com/Polymer/polymer/issues/722)
+
+- Computed property can't be data-bound from outside [\#638](https://github.com/Polymer/polymer/issues/638)
+
+- IE issues [\#592](https://github.com/Polymer/polymer/issues/592)
+
+- ShadowDOM renderer invalidated after insertion-point distribution [\#512](https://github.com/Polymer/polymer/issues/512)
+
+- Content inside `\<template\>` breaks extending `\<body\>` element. [\#421](https://github.com/Polymer/polymer/issues/421)
+
+## [0.4.0](https://github.com/Polymer/polymer/tree/0.4.0) (2014-08-28)
+
+**Implemented enhancements:**
+
+- Use the John Resig inheritance to define the component prototype [\#647](https://github.com/Polymer/polymer/issues/647)
+
+- on-\* expression support [\#446](https://github.com/Polymer/polymer/issues/446)
+
+- add component-laid-out lifecycle callback [\#434](https://github.com/Polymer/polymer/issues/434)
+
+- Allow creating \<polymer-element\>s without Shadow DOM [\#222](https://github.com/Polymer/polymer/issues/222)
+
+- Consider adding support for loading user selectable css resources per element [\#219](https://github.com/Polymer/polymer/issues/219)
+
+- Provide a provide a way to instantiate the template directly into the element [\#157](https://github.com/Polymer/polymer/issues/157)
+
+- Consider deserializing to Date from attributes, if property is Date-valued [\#119](https://github.com/Polymer/polymer/issues/119)
+
+**Fixed bugs:**
+
+- polymer-body double fire `ready`/`created`/`attached` [\#447](https://github.com/Polymer/polymer/issues/447)
+
+- Polymer's controller-styles system doesn't work well with ShadowDOMPolyfill [\#224](https://github.com/Polymer/polymer/issues/224)
+
+- Globals clobbering other globals [\#185](https://github.com/Polymer/polymer/issues/185)
+
+- `bind` boilerplate base is inflexible [\#179](https://github.com/Polymer/polymer/issues/179)
+
+**Closed issues:**
+
+- Possible shared state on core elements. [\#731](https://github.com/Polymer/polymer/issues/731)
+
+- paper-input element doesn't show keyboard on Firefox OS 2.0 [\#727](https://github.com/Polymer/polymer/issues/727)
+
+- designerr on polymer page lacks demo'd functioniality from youtube quickstart. [\#726](https://github.com/Polymer/polymer/issues/726)
+
+- PhantomJS Support [\#724](https://github.com/Polymer/polymer/issues/724)
+
+- http://www.polymer-project.org/platform/web-animations.html [\#721](https://github.com/Polymer/polymer/issues/721)
+
+- Polymer site appears broken on Safari 8 [\#719](https://github.com/Polymer/polymer/issues/719)
+
+- Non ASCII strings set in JavaScript show up as ? in Firefox [\#717](https://github.com/Polymer/polymer/issues/717)
+
+- Materials page in Polymer is not rendering correctly [\#716](https://github.com/Polymer/polymer/issues/716)
+
+- Polymer elements not rendering in Android 4.1.2 and 4.2.1. Works on 4.4.2 [\#714](https://github.com/Polymer/polymer/issues/714)
+
+- Bower private packages & stats [\#711](https://github.com/Polymer/polymer/issues/711)
+
+- Step-4 of tutorial code for post-card Polymer prototype does not use element name [\#710](https://github.com/Polymer/polymer/issues/710)
+
+- Polymer does absolutely nothing if you have an "undeclared" element [\#709](https://github.com/Polymer/polymer/issues/709)
+
+- Syntax error in example bower.json [\#707](https://github.com/Polymer/polymer/issues/707)
+
+- Semver not being followed correctly [\#704](https://github.com/Polymer/polymer/issues/704)
+
+- Safari bug when rendering a table using nested loops [\#700](https://github.com/Polymer/polymer/issues/700)
+
+- Clicking on Paper Tab execute twice [\#696](https://github.com/Polymer/polymer/issues/696)
+
+- div with tool attribute does not allow flex for div within [\#695](https://github.com/Polymer/polymer/issues/695)
+
+- it keeps resetting [\#694](https://github.com/Polymer/polymer/issues/694)
+
+- Handlers disappearing when you hide the template [\#690](https://github.com/Polymer/polymer/issues/690)
+
+- on-change event triggered twice [\#687](https://github.com/Polymer/polymer/issues/687)
+
+- Consider making core-component-page a devDependency [\#683](https://github.com/Polymer/polymer/issues/683)
+
+- custom nodes within svg aren't created [\#681](https://github.com/Polymer/polymer/issues/681)
+
+- App not rendering on IE and Firefox [\#668](https://github.com/Polymer/polymer/issues/668)
+
+- Clarification on the modularity of Polymer within external web component scripts: Is Polymer designed in a way to export it as a \(commonjs\) module? [\#666](https://github.com/Polymer/polymer/issues/666)
+
+- Future Support for Installing Polymer through Chocolatey package manager [\#657](https://github.com/Polymer/polymer/issues/657)
+
+- RangeError: Maximum call stack size exceeded. On Safari 7.0.5 [\#656](https://github.com/Polymer/polymer/issues/656)
+
+- transform-style: preserve-3d causing odd stutter on hover of custom element [\#652](https://github.com/Polymer/polymer/issues/652)
+
+- fire should only check for null and undefined. [\#646](https://github.com/Polymer/polymer/issues/646)
+
+- 'target' field in 'event' argument passed into callback function for click/pointer events refers to first element instantiated [\#641](https://github.com/Polymer/polymer/issues/641)
+
+- document.querySelectorAll sluggish on Firefox \(v30\) for large DOM [\#629](https://github.com/Polymer/polymer/issues/629)
+
+- TemplateBinding should warn/console log about using bind with references. [\#615](https://github.com/Polymer/polymer/issues/615)
+
+- platform fails to load [\#606](https://github.com/Polymer/polymer/issues/606)
+
+- Can't keyboard nav around a custom element in a div that has contenteditable="true" [\#601](https://github.com/Polymer/polymer/issues/601)
+
+- Polymer doesn't appear to work at all under iOS 8 beta 2 [\#591](https://github.com/Polymer/polymer/issues/591)
+
+- Resources not loading in http://www.polymer-project.org/tools/designer/ [\#585](https://github.com/Polymer/polymer/issues/585)
+
+- Unable to extend iframe [\#580](https://github.com/Polymer/polymer/issues/580)
+
+- Custom element that performs dynamic HTML Import gets corrupted offsetWidth when used inside \<template\> [\#554](https://github.com/Polymer/polymer/issues/554)
+
+- Wrap as UMD - Do not force window global [\#534](https://github.com/Polymer/polymer/issues/534)
+
+- Difference in inherited styles between Chrome & other browsers [\#531](https://github.com/Polymer/polymer/issues/531)
+
+- Problem during bower install [\#529](https://github.com/Polymer/polymer/issues/529)
+
+- Adding method `childrenChanged` crashes Firefox/Safari [\#528](https://github.com/Polymer/polymer/issues/528)
+
+- fire and asyncFire need return values [\#527](https://github.com/Polymer/polymer/issues/527)
+
+- Errors in Safari 7 with Polymer 0.3.1 [\#523](https://github.com/Polymer/polymer/issues/523)
+
+- Polymer not working in elementary OS [\#520](https://github.com/Polymer/polymer/issues/520)
+
+- Two way binding with Html attribute [\#519](https://github.com/Polymer/polymer/issues/519)
+
+- Polyfills crashing jsbin [\#517](https://github.com/Polymer/polymer/issues/517)
+
+- Polymer breaks dependency resolution with query strings [\#513](https://github.com/Polymer/polymer/issues/513)
+
+- binding to a builtin name fails cryptically [\#510](https://github.com/Polymer/polymer/issues/510)
+
+- Content of nested template is empty [\#500](https://github.com/Polymer/polymer/issues/500)
+
+- Extending Vanilla JS Custom Element with polymer-element [\#496](https://github.com/Polymer/polymer/issues/496)
+
+- Trouble in latest Canary reading styles in attached handler of imported element [\#493](https://github.com/Polymer/polymer/issues/493)
+
+- Keyboard Support [\#473](https://github.com/Polymer/polymer/issues/473)
+
+- HTML Imports polyfill is missing the .import property [\#471](https://github.com/Polymer/polymer/issues/471)
+
+- Pseudo-classes in \<content\> select attribute [\#470](https://github.com/Polymer/polymer/issues/470)
+
+- Using a keyword in attribute name causes error in IE11 [\#466](https://github.com/Polymer/polymer/issues/466)
+
+- Error - Uncaught Possible attempt to load Polymer twice [\#464](https://github.com/Polymer/polymer/issues/464)
+
+- Get full list of polymer-elements. [\#460](https://github.com/Polymer/polymer/issues/460)
+
+- document.registerElement raises error "Options missing required prototype property" [\#455](https://github.com/Polymer/polymer/issues/455)
+
+- Exception when updating inner child element attributes from an object property in a repeat [\#454](https://github.com/Polymer/polymer/issues/454)
+
+- Double quotes don't work in polyfill-next-selector content [\#453](https://github.com/Polymer/polymer/issues/453)
+
+- title attribute cause issue in firefox [\#451](https://github.com/Polymer/polymer/issues/451)
+
+- template bind="x as y" doesn't work on safari [\#450](https://github.com/Polymer/polymer/issues/450)
+
+- Generating an observe block in created or ready doesn't bind [\#448](https://github.com/Polymer/polymer/issues/448)
+
+- \<polymer-ui-accordion\> doesn't always work with Shadow DOM polyfill [\#444](https://github.com/Polymer/polymer/issues/444)
+
+- Polymer breaks `instanceof` for native elements. [\#424](https://github.com/Polymer/polymer/issues/424)
+
+- Add @license tag [\#413](https://github.com/Polymer/polymer/issues/413)
+
+- Can't turn body into custom element via is="..." [\#409](https://github.com/Polymer/polymer/issues/409)
+
+- bindProperties logger call refers to nonexistent variables [\#406](https://github.com/Polymer/polymer/issues/406)
+
+- Polymer fails to render elements when query string contains a slash [\#401](https://github.com/Polymer/polymer/issues/401)
+
+- Using native CustomElements and ShadowDOM polyfill together may cause unwanted attached/detached callbacks being called [\#399](https://github.com/Polymer/polymer/issues/399)
+
+- Variable picked by `constructor` attribute is set after upgrade events. [\#398](https://github.com/Polymer/polymer/issues/398)
+
+- Exception when invoking super from ready when the node is created by \<template repeat\> [\#397](https://github.com/Polymer/polymer/issues/397)
+
+- automatic node finding within a template-if [\#387](https://github.com/Polymer/polymer/issues/387)
+
+- Challenges of building a menu system in Polymer [\#382](https://github.com/Polymer/polymer/issues/382)
+
+- XSS Vulnerability [\#375](https://github.com/Polymer/polymer/issues/375)
+
+- Publishing an attribute named 'disabled' generates exception in IE10 [\#372](https://github.com/Polymer/polymer/issues/372)
+
+- template if expression, trailing blanks should be ignored [\#370](https://github.com/Polymer/polymer/issues/370)
+
+- processing bindings in a specific order [\#368](https://github.com/Polymer/polymer/issues/368)
+
+- AngularJS incompatibility: need to unwrap elements when jqLite.data\(\) is used [\#363](https://github.com/Polymer/polymer/issues/363)
+
+- Polymer makes getScreenCTM\(\) crash [\#351](https://github.com/Polymer/polymer/issues/351)
+
+- Sorting an array can result in an \*Changed method firing [\#350](https://github.com/Polymer/polymer/issues/350)
+
+- Reentrancy question: reflectPropertyToAttribute can trigger unwanted attributedChanged effects [\#349](https://github.com/Polymer/polymer/issues/349)
+
+- ShadowDOMPolyfill is way, way too intrusive! [\#346](https://github.com/Polymer/polymer/issues/346)
+
+- Separate out platform.js from polymer core [\#344](https://github.com/Polymer/polymer/issues/344)
+
+- Attribute values should be copied to property values before `created` [\#342](https://github.com/Polymer/polymer/issues/342)
+
+- custom event handler matching is case sensitive [\#340](https://github.com/Polymer/polymer/issues/340)
+
+- Fragments in links get rewritten to point to directory of import [\#339](https://github.com/Polymer/polymer/issues/339)
+
+- Address polymer-elements that take child elements [\#337](https://github.com/Polymer/polymer/issues/337)
+
+- Declarative event discovery on custom elements [\#336](https://github.com/Polymer/polymer/issues/336)
+
+- test-button element class with extends="button" can't be instantiated with \<test-button\> syntax [\#334](https://github.com/Polymer/polymer/issues/334)
+
+- Page rendering issue - navigation [\#333](https://github.com/Polymer/polymer/issues/333)
+
+- Cannot modify a template's contents while it is stamping [\#330](https://github.com/Polymer/polymer/issues/330)
+
+- Publish sub-projects on npm, add them to package.json. [\#326](https://github.com/Polymer/polymer/issues/326)
+
+- stack: "TypeError: Object \#\<Object\> has no method 'getAttr [\#325](https://github.com/Polymer/polymer/issues/325)
+
+- Support angular/django style filters [\#323](https://github.com/Polymer/polymer/issues/323)
+
+- createElement-wrapped \<img\> throws TypeError on \<canvas\> drawImage [\#316](https://github.com/Polymer/polymer/issues/316)
+
+- Databinding breaks after removing and reattaching an element to the DOM [\#311](https://github.com/Polymer/polymer/issues/311)
+
+- Ensure {{}} are removed after binding [\#304](https://github.com/Polymer/polymer/issues/304)
+
+- Getting started instructions incomplete: no polymer.min.js [\#300](https://github.com/Polymer/polymer/issues/300)
+
+- Site is not showing properly in IE11 [\#299](https://github.com/Polymer/polymer/issues/299)
+
+- Prevent event bubbling in polyfill [\#296](https://github.com/Polymer/polymer/issues/296)
+
+- Prevent duplicate ID's in polyfill [\#295](https://github.com/Polymer/polymer/issues/295)
+
+- remove use of deprecated cancelBubble? [\#292](https://github.com/Polymer/polymer/issues/292)
+
+- Polymer throws error in Canary when registering an element via import [\#290](https://github.com/Polymer/polymer/issues/290)
+
+- Type Convert Error when work with canvas [\#288](https://github.com/Polymer/polymer/issues/288)
+
+- DOM Spec Input - Virtual MutationRecords [\#281](https://github.com/Polymer/polymer/issues/281)
+
+- polymer animation not support ios [\#279](https://github.com/Polymer/polymer/issues/279)
+
+- Event.cancelBubble cannot be used for stopping event propagation in Polymer [\#275](https://github.com/Polymer/polymer/issues/275)
+
+- Consider removing controllerStyles and requiring explicitly adding stylesheets [\#272](https://github.com/Polymer/polymer/issues/272)
+
+- Write up suggestions on dealing with performance [\#269](https://github.com/Polymer/polymer/issues/269)
+
+- improve on-\* delegation by introducing control for Polymer-bubbling \(as distinct from DOM bubbling\) [\#259](https://github.com/Polymer/polymer/issues/259)
+
+- Consider issuing a warning when a polymer-element's shadowRoot contains un-upgraded custom elements [\#258](https://github.com/Polymer/polymer/issues/258)
+
+- on-tap doesn't fire all the time that on-click does [\#255](https://github.com/Polymer/polymer/issues/255)
+
+- Chrome Packaged App: including the UI elements is not convenient [\#248](https://github.com/Polymer/polymer/issues/248)
+
+- Polymer doesn't work on Iceweasel web browser [\#247](https://github.com/Polymer/polymer/issues/247)
+
+- It's confusing that you need to nest a \<template repeat\> inside an outermost \<template\>. [\#245](https://github.com/Polymer/polymer/issues/245)
+
+- http://www.polymer-project.org/tooling-strategy.html is a bit spare [\#244](https://github.com/Polymer/polymer/issues/244)
+
+- documentation for attributeChanged is wrong [\#242](https://github.com/Polymer/polymer/issues/242)
+
+- Using scoped models impacts 2-way property binding [\#220](https://github.com/Polymer/polymer/issues/220)
+
+- loader seems to fail at random, but frequently when serving from localhost [\#218](https://github.com/Polymer/polymer/issues/218)
+
+- Cloned attributes should not override user attributes in markup [\#190](https://github.com/Polymer/polymer/issues/190)
+
+- Sugaring dynamics in ShadowDOM [\#176](https://github.com/Polymer/polymer/issues/176)
+
+- Asynchronous attribute declaration [\#160](https://github.com/Polymer/polymer/issues/160)
+
+- Consider adding broadcast [\#145](https://github.com/Polymer/polymer/issues/145)
+
+- explore performance impact of import-order of components [\#108](https://github.com/Polymer/polymer/issues/108)
+
+- title attribute [\#97](https://github.com/Polymer/polymer/issues/97)
+
+- Write doc about attributes and type inference when applying to properties [\#93](https://github.com/Polymer/polymer/issues/93)
+
+- Confusing cancelBubble [\#74](https://github.com/Polymer/polymer/issues/74)
+
+## [0.3.5](https://github.com/Polymer/polymer/tree/0.3.5) (2014-08-08)
+
+**Closed issues:**
+
+- Internet explorer is not binding inside \<select\> tag [\#692](https://github.com/Polymer/polymer/issues/692)
+
+- \<core-collapse\> syntax issue. [\#689](https://github.com/Polymer/polymer/issues/689)
+
+- TemplateBinding.js Uncaught HierarchyRequestError [\#688](https://github.com/Polymer/polymer/issues/688)
+
+- TypeError: Argument 1 of Window.getDefaultComputedStyle does not implement interface Element [\#686](https://github.com/Polymer/polymer/issues/686)
+
+- Not working in Safari - Window [\#682](https://github.com/Polymer/polymer/issues/682)
+
+- Polymer should respect XHTML syntax [\#680](https://github.com/Polymer/polymer/issues/680)
+
+- polymer design tool issue [\#679](https://github.com/Polymer/polymer/issues/679)
+
+- Incomplete zip files. [\#676](https://github.com/Polymer/polymer/issues/676)
+
+- Polymer Designer always deletes everything [\#674](https://github.com/Polymer/polymer/issues/674)
+
+- Wrong import path on Designer Preview when importing polymer.html [\#670](https://github.com/Polymer/polymer/issues/670)
+
+- error 404 on core-transition demo page [\#669](https://github.com/Polymer/polymer/issues/669)
+
+- Polymer site is not reachable. [\#667](https://github.com/Polymer/polymer/issues/667)
+
+- TypeError and NetworkError when starting the designer tool from the url [\#665](https://github.com/Polymer/polymer/issues/665)
+
+- Scroll disappearing on Polymer Website [\#661](https://github.com/Polymer/polymer/issues/661)
+
+- paper-menu-button is not responsive [\#660](https://github.com/Polymer/polymer/issues/660)
+
+- Core-drawer-panel hardcoded drawer width [\#659](https://github.com/Polymer/polymer/issues/659)
+
+- the BSD license link at the bottom of http://www.polymer-project.org/ is a 404 [\#655](https://github.com/Polymer/polymer/issues/655)
+
+- Polymer breaks URL [\#653](https://github.com/Polymer/polymer/issues/653)
+
+- Cannot install polymer 0.3.4 [\#643](https://github.com/Polymer/polymer/issues/643)
+
+- Polymer breaks KnockoutJS outside of Chrome [\#640](https://github.com/Polymer/polymer/issues/640)
+
+- Paper button keeps flashing [\#639](https://github.com/Polymer/polymer/issues/639)
+
+- \<core-style\> should use an element that parses in plain text mode [\#637](https://github.com/Polymer/polymer/issues/637)
+
+- "Assertion Failed" unwrapping event [\#636](https://github.com/Polymer/polymer/issues/636)
+
+- Rating Slider Knob goes outside boundaries [\#635](https://github.com/Polymer/polymer/issues/635)
+
+- typo on http://www.polymer-project.org/docs/elements/paper-elements.html\#paper-menu-button [\#632](https://github.com/Polymer/polymer/issues/632)
+
+- core-list is inefficient in data initialization [\#631](https://github.com/Polymer/polymer/issues/631)
+
+- Closing tags with /\> leads to ignored shadow DOM content [\#628](https://github.com/Polymer/polymer/issues/628)
+
+- Paper Elements use inline scripts =\> violate Chrome packaged app CSP rules [\#613](https://github.com/Polymer/polymer/issues/613)
+
+- paper-tab::shadow \#ink glitches when click is held [\#611](https://github.com/Polymer/polymer/issues/611)
+
+- Core-toolbar breaking material design speck [\#605](https://github.com/Polymer/polymer/issues/605)
+
+- \<input list="x"\>\<datalist id="x"\> as a component used within another component [\#600](https://github.com/Polymer/polymer/issues/600)
+
+- core-scroll-header-panel won't hide navigation bar on Android \(stable and beta\) [\#569](https://github.com/Polymer/polymer/issues/569)
+
+- Scroll Header Panel flowing over panel scroll bar [\#555](https://github.com/Polymer/polymer/issues/555)
+
+- Drawer Panel is not working. [\#550](https://github.com/Polymer/polymer/issues/550)
+
+- Polymer 0.2.2 polymer-animation-group.js logs error to console [\#463](https://github.com/Polymer/polymer/issues/463)
+
+- polymer-ui-scaffold and polymer-ui-nav-arrow [\#343](https://github.com/Polymer/polymer/issues/343)
+
+- Better error when creating an element without a hyphenated name [\#303](https://github.com/Polymer/polymer/issues/303)
+
+- polymer-ajax fails silently when json is not valid json [\#257](https://github.com/Polymer/polymer/issues/257)
+
+## [0.3.4](https://github.com/Polymer/polymer/tree/0.3.4) (2014-07-11)
+
+**Fixed bugs:**
+
+- FormData.constructor fails when passed HTMLFormElement in Firefox [\#587](https://github.com/Polymer/polymer/issues/587)
+
+**Closed issues:**
+
+- Paper component focusable demo missing [\#624](https://github.com/Polymer/polymer/issues/624)
+
+- Step 1 of Tutorial incomplete [\#623](https://github.com/Polymer/polymer/issues/623)
+
+- Step-1 of tutorial instructions are missing vital CSS [\#622](https://github.com/Polymer/polymer/issues/622)
+
+- Link on paper-tabs for paper-tab is broken [\#621](https://github.com/Polymer/polymer/issues/621)
+
+- Wrong example in polymer tutorial [\#618](https://github.com/Polymer/polymer/issues/618)
+
+- Please improve the Core Elements / Scaffold example [\#617](https://github.com/Polymer/polymer/issues/617)
+
+- Polymer demos are not working in android stock browser and polymer is not working in cordova apps in JellyBean and prior versions. It is throwing "Window is not defined error in platform.js file at line number 15". [\#616](https://github.com/Polymer/polymer/issues/616)
+
+- Chrome Packaged App: Refused to evaluate a string as JavaScript because 'unsafe-eval' [\#612](https://github.com/Polymer/polymer/issues/612)
+
+- Broken doc in 'using core icons [\#610](https://github.com/Polymer/polymer/issues/610)
+
+- Navigation menu error [\#609](https://github.com/Polymer/polymer/issues/609)
+
+- IE 11 issues [\#608](https://github.com/Polymer/polymer/issues/608)
+
+- deadlink in polymer site [\#604](https://github.com/Polymer/polymer/issues/604)
+
+- extjs and polymerjs [\#603](https://github.com/Polymer/polymer/issues/603)
+
+- Mistake on proto-element.html [\#602](https://github.com/Polymer/polymer/issues/602)
+
+- paper-slider does not work properly in Safari and FireFox [\#599](https://github.com/Polymer/polymer/issues/599)
+
+- Polymer designer color-picker has no specific color palette [\#598](https://github.com/Polymer/polymer/issues/598)
+
+- Paper Elements Input does not work on iOS [\#596](https://github.com/Polymer/polymer/issues/596)
+
+- Core-Transition Demo [\#594](https://github.com/Polymer/polymer/issues/594)
+
+- Starting a webserver in Python [\#590](https://github.com/Polymer/polymer/issues/590)
+
+- simple style attribute bindings and styleObject filter not working in IE11 \(maybe other versions as well\) [\#589](https://github.com/Polymer/polymer/issues/589)
+
+- Images not rendering in the demp app tutorial [\#588](https://github.com/Polymer/polymer/issues/588)
+
+- Core-transition demo link returns 404 [\#586](https://github.com/Polymer/polymer/issues/586)
+
+- Paper-Checkbox Animation Fix [\#584](https://github.com/Polymer/polymer/issues/584)
+
+- Designer will not save [\#583](https://github.com/Polymer/polymer/issues/583)
+
+- ::content polyfill for VanillaJS Templates and Custom Elements [\#582](https://github.com/Polymer/polymer/issues/582)
+
+- core-transition-css Error: Not Found [\#581](https://github.com/Polymer/polymer/issues/581)
+
+- Polymer Tutorial step 1 multiple core-select events [\#578](https://github.com/Polymer/polymer/issues/578)
+
+- Material design link is broken [\#577](https://github.com/Polymer/polymer/issues/577)
+
+- core-scroll-header-panel background missing? [\#576](https://github.com/Polymer/polymer/issues/576)
+
+- Can't get any of the demos work?? [\#575](https://github.com/Polymer/polymer/issues/575)
+
+- paper-elements.html not found [\#574](https://github.com/Polymer/polymer/issues/574)
+
+- Tutorial Typo [\#572](https://github.com/Polymer/polymer/issues/572)
+
+- tutorial step-2: missing slash on closing div tag [\#571](https://github.com/Polymer/polymer/issues/571)
+
+- Minor Duplication: unnecessary core-icon-button declaration block to style the fill color of the favorite icon [\#570](https://github.com/Polymer/polymer/issues/570)
+
+- Layout Messed [\#568](https://github.com/Polymer/polymer/issues/568)
+
+- Chromebook [\#565](https://github.com/Polymer/polymer/issues/565)
+
+- \[Docs\] The "Learn" page on polymer-project.org crashes Safari Mobile [\#563](https://github.com/Polymer/polymer/issues/563)
+
+- core-scroll-header-panel won't hide nav bar on Chrome for Android [\#562](https://github.com/Polymer/polymer/issues/562)
+
+- Polymer flat design phonegap [\#560](https://github.com/Polymer/polymer/issues/560)
+
+- Input examples do not work in iPad iOS 7.1.1 [\#558](https://github.com/Polymer/polymer/issues/558)
+
+- Demo & Edit on GitHub links not working on component page [\#557](https://github.com/Polymer/polymer/issues/557)
+
+- Download link for checkboxes is broken [\#556](https://github.com/Polymer/polymer/issues/556)
+
+- core-slide demo not found [\#553](https://github.com/Polymer/polymer/issues/553)
+
+- Polymer website side panel menus overlaps url: http://www.polymer-project.org/docs/start/tutorial/intro.html [\#552](https://github.com/Polymer/polymer/issues/552)
+
+- document.querySelector containing ::shadow fails in Firefox 30 [\#551](https://github.com/Polymer/polymer/issues/551)
+
+- docs-menu polymer-ui-menu { position: fixed; } - Mozilla Firefox 30.0 [\#549](https://github.com/Polymer/polymer/issues/549)
+
+- Invalid Zip File [\#547](https://github.com/Polymer/polymer/issues/547)
+
+- http://www.polymer-project.org/docs/elements/core-elements.html\#core-overlay-layer links to 404 page not found [\#546](https://github.com/Polymer/polymer/issues/546)
+
+- Polymer docs gives wrong information [\#545](https://github.com/Polymer/polymer/issues/545)
+
+- Can't open .zip files.. [\#544](https://github.com/Polymer/polymer/issues/544)
+
+- \[docs tutorial\] step 3 code sample post-service closing tag [\#543](https://github.com/Polymer/polymer/issues/543)
+
+- All of the top menu functionalities are not working [\#542](https://github.com/Polymer/polymer/issues/542)
+
+- Sidebar menu elements are overlaid [\#541](https://github.com/Polymer/polymer/issues/541)
+
+- Edit on GitHub Link returning 404 error [\#540](https://github.com/Polymer/polymer/issues/540)
+
+- rendering problems with new website in FF on osx [\#539](https://github.com/Polymer/polymer/issues/539)
+
+- \[Docs\] polymer-ui-menu on docs page doesn't seem to be displaying correctly, Chromium and Firefox [\#538](https://github.com/Polymer/polymer/issues/538)
+
+- I think I found a mistake in the tutorial, not sure where to put it... [\#536](https://github.com/Polymer/polymer/issues/536)
+
+- \[In Docs\] Wrong link in "Demo" button [\#535](https://github.com/Polymer/polymer/issues/535)
+
+- I think seed-element shouldn't advise ignoring .bowerrc [\#533](https://github.com/Polymer/polymer/issues/533)
+
+- The trouble with the now-deprecated applyAuthorStyles in Polymer Elements [\#532](https://github.com/Polymer/polymer/issues/532)
+
+- Polymer does not display cyrillic characters correctly [\#498](https://github.com/Polymer/polymer/issues/498)
+
+## [0.3.3](https://github.com/Polymer/polymer/tree/0.3.3) (2014-06-20)
+
+**Closed issues:**
+
+- `stopPropagation\(\)` does not work for polymer events [\#530](https://github.com/Polymer/polymer/issues/530)
+
+- bower.json missing "main" and "moduleType" [\#525](https://github.com/Polymer/polymer/issues/525)
+
+- Published property with default value not reflected [\#509](https://github.com/Polymer/polymer/issues/509)
+
+## [0.3.2](https://github.com/Polymer/polymer/tree/0.3.2) (2014-06-09)
+
+**Closed issues:**
+
+- Since 0.3.0 binding array elements doesn't work [\#526](https://github.com/Polymer/polymer/issues/526)
+
+- minor documentation content issue [\#522](https://github.com/Polymer/polymer/issues/522)
+
+- `\<content select=".test"\>` is not observing condition updates of child elements? [\#505](https://github.com/Polymer/polymer/issues/505)
+
+## [0.3.1](https://github.com/Polymer/polymer/tree/0.3.1) (2014-05-30)
+
+**Closed issues:**
+
+- Bind to `value` on `\<input type="color"\>` [\#521](https://github.com/Polymer/polymer/issues/521)
+
+- classList not working anymore [\#518](https://github.com/Polymer/polymer/issues/518)
+
+## [0.3.0](https://github.com/Polymer/polymer/tree/0.3.0) (2014-05-27)
+
+**Implemented enhancements:**
+
+- Add Polymer.version [\#227](https://github.com/Polymer/polymer/issues/227)
+
+**Closed issues:**
+
+- Source Code Sandbox - Web Components en action - Google I / O 2013 [\#516](https://github.com/Polymer/polymer/issues/516)
+
+- Adding an event handler in an event handler can lead to infinite looping [\#511](https://github.com/Polymer/polymer/issues/511)
+
+- Polymer alters the results of scoped queries in querySelectorAll [\#508](https://github.com/Polymer/polymer/issues/508)
+
+- A non-body element marked "unresolved" still gets shown during boot [\#507](https://github.com/Polymer/polymer/issues/507)
+
+- When running Parse.FacebookUtils.init Polymer raises InvalidCharacterError exception. [\#506](https://github.com/Polymer/polymer/issues/506)
+
+- Content incorrectly rendered inside table. [\#503](https://github.com/Polymer/polymer/issues/503)
+
+- 404 on polymer-project.org/docs/start/customelements\#elementtypes [\#499](https://github.com/Polymer/polymer/issues/499)
+
+- Chrome Packaged App: Refused to evaluate a string as JavaScript because 'unsafe-eval' .... [\#252](https://github.com/Polymer/polymer/issues/252)
+
+- on-\* event delegation \(other than on host node\) does not work with non-bubbling events [\#208](https://github.com/Polymer/polymer/issues/208)
+
+## [0.2.4](https://github.com/Polymer/polymer/tree/0.2.4) (2014-05-12)
+
+**Closed issues:**
+
+- Mongolian vowel separator causing exceptions. [\#495](https://github.com/Polymer/polymer/issues/495)
+
+- Problem with root-relative URLs and the History API [\#494](https://github.com/Polymer/polymer/issues/494)
+
+- Standalone template binding docs missing? [\#491](https://github.com/Polymer/polymer/issues/491)
+
+- unable to use Polymer's dom mutation observer polyfill with mutation summary library [\#490](https://github.com/Polymer/polymer/issues/490)
+
+- I guess there is a mistake in polymer documentation [\#489](https://github.com/Polymer/polymer/issues/489)
+
+- Unclear how to bind complex data objects to new instances of polymer-element as a passed-in attribute [\#488](https://github.com/Polymer/polymer/issues/488)
+
+- Update expressions doc to clarify what's observed [\#486](https://github.com/Polymer/polymer/issues/486)
+
+- on-change doesn't get triggered when change happens programmatically [\#484](https://github.com/Polymer/polymer/issues/484)
+
+- style="color:{{person.nameColor}}" does not work in IE11 [\#483](https://github.com/Polymer/polymer/issues/483)
+
+- Publish a property by listing it in the `attributes` fails [\#482](https://github.com/Polymer/polymer/issues/482)
+
+- Can't get polymer 0.2.3 via bower \(now\) [\#481](https://github.com/Polymer/polymer/issues/481)
+
+- bower out of date? [\#480](https://github.com/Polymer/polymer/issues/480)
+
+- Crash when Polymer/Platform loaded twice [\#478](https://github.com/Polymer/polymer/issues/478)
+
+- Can't dynamically import an element definition in Canary [\#477](https://github.com/Polymer/polymer/issues/477)
+
+- Middle clicking results in navigation not new tab [\#472](https://github.com/Polymer/polymer/issues/472)
+
+## [0.2.3](https://github.com/Polymer/polymer/tree/0.2.3) (2014-04-18)
+
+**Fixed bugs:**
+
+- Including platform.js breaks YouTube's iframe API [\#468](https://github.com/Polymer/polymer/issues/468)
+
+**Closed issues:**
+
+- Custom pseudo-elements cannot be targeted outside shadow dom [\#475](https://github.com/Polymer/polymer/issues/475)
+
+- document.registerElement\('foo', {extends: undefined}\) fails [\#462](https://github.com/Polymer/polymer/issues/462)
+
+- onBeforeUnload Event broken [\#461](https://github.com/Polymer/polymer/issues/461)
+
+## [0.2.2](https://github.com/Polymer/polymer/tree/0.2.2) (2014-03-31)
+
+**Implemented enhancements:**
+
+- Consider inferring polymer-element tag name for registration [\#195](https://github.com/Polymer/polymer/issues/195)
+
+**Closed issues:**
+
+- Reusing css libraries through out Polymer elements [\#459](https://github.com/Polymer/polymer/issues/459)
+
+- Meta: Shadow DOM styling renames [\#458](https://github.com/Polymer/polymer/issues/458)
+
+- Compatibility with Angular JS - manual bootstrap fails on document.body and document.documentElement when using Platform.js [\#457](https://github.com/Polymer/polymer/issues/457)
+
+- Problem with data binding and custom attributes in Firefox 27, 29. [\#456](https://github.com/Polymer/polymer/issues/456)
+
+- addEventListener beforeunload not working [\#445](https://github.com/Polymer/polymer/issues/445)
+
+- Having any \<link rel="stylesheet"\> makes entire app fail to initialize [\#441](https://github.com/Polymer/polymer/issues/441)
+
+- Issues with platform version resolution with Bower and 0.2.1 [\#440](https://github.com/Polymer/polymer/issues/440)
+
+- Polymer event bindings don't pass Firefox Marketplace CSP checks [\#439](https://github.com/Polymer/polymer/issues/439)
+
+- Iterating over a member object [\#436](https://github.com/Polymer/polymer/issues/436)
+
+- \<template if\> evaluating all expressions twice [\#433](https://github.com/Polymer/polymer/issues/433)
+
+- Remove support for applyAuthorStyles/resetStyleInheritance [\#425](https://github.com/Polymer/polymer/issues/425)
+
+- Conflicts with Revealjs style sheets [\#410](https://github.com/Polymer/polymer/issues/410)
+
+- Bower install broken for latest and \#0.1.3 [\#407](https://github.com/Polymer/polymer/issues/407)
+
+- Add organization logo [\#361](https://github.com/Polymer/polymer/issues/361)
+
+- Add a declarative way to set applyAuthorStyles on a element's shadowRoot [\#106](https://github.com/Polymer/polymer/issues/106)
+
+## [0.2.1](https://github.com/Polymer/polymer/tree/0.2.1) (2014-03-07)
+
+**Closed issues:**
+
+- attributeChanged is not called under some circumstances [\#438](https://github.com/Polymer/polymer/issues/438)
+
+- Add polyfill support for new Shadow DOM CSS cominbators [\#435](https://github.com/Polymer/polymer/issues/435)
+
+- Problem with special characters and HTML entities [\#432](https://github.com/Polymer/polymer/issues/432)
+
+- FOUC body\[unresolved\] should be \[unresolved\] [\#431](https://github.com/Polymer/polymer/issues/431)
+
+- polymer-project.org menu scroll behaviour is distracting [\#430](https://github.com/Polymer/polymer/issues/430)
+
+- polymer-list is broken in \#0.2.0 [\#427](https://github.com/Polymer/polymer/issues/427)
+
+- polymer-project.org is slow [\#426](https://github.com/Polymer/polymer/issues/426)
+
+- Polymer setup Instructions resulted in blank screen [\#423](https://github.com/Polymer/polymer/issues/423)
+
+- Custom Elements and canvas/ctx functionality on iOS [\#422](https://github.com/Polymer/polymer/issues/422)
+
+- External styles fails to load [\#420](https://github.com/Polymer/polymer/issues/420)
+
+- Cannot access content \(childNodes\) in nested Polymer Element [\#414](https://github.com/Polymer/polymer/issues/414)
+
+**Merged pull requests:**
+
+- Update README.md [\#428](https://github.com/Polymer/polymer/pull/428) ([kentaromiura](https://github.com/kentaromiura))
+
+## [0.2.0](https://github.com/Polymer/polymer/tree/0.2.0) (2014-02-15)
+
+**Closed issues:**
+
+- HTMLImports.Loader maybe callback twice [\#418](https://github.com/Polymer/polymer/issues/418)
+
+- Binding to input type=range does not work in IE 11 [\#416](https://github.com/Polymer/polymer/issues/416)
+
+- Serveral issues on Opera browser [\#411](https://github.com/Polymer/polymer/issues/411)
+
+- Adding Polymer to a page causes Typekit fonts to break [\#408](https://github.com/Polymer/polymer/issues/408)
+
+- Polymer bind method -- should take oneTime flag? [\#405](https://github.com/Polymer/polymer/issues/405)
+
+- how to use part style in polymer? [\#376](https://github.com/Polymer/polymer/issues/376)
+
+- polymer declarative event doesn't work in lightdom mode [\#331](https://github.com/Polymer/polymer/issues/331)
+
+- Expose a way to get shadowRoots by name of creating declaration, e.g. getShadowRoot\('x-foo'\) [\#310](https://github.com/Polymer/polymer/issues/310)
+
+**Merged pull requests:**
+
+- update copyright year [\#412](https://github.com/Polymer/polymer/pull/412) ([gdi2290](https://github.com/gdi2290))
+
+## [0.1.4](https://github.com/Polymer/polymer/tree/0.1.4) (2014-01-27)
+
+**Closed issues:**
+
+- polymer-localstorage-load only fires if the value has previously been set [\#404](https://github.com/Polymer/polymer/issues/404)
+
+- CSS generated content without space goes missing \(Safari\) [\#403](https://github.com/Polymer/polymer/issues/403)
+
+- \(docs\): Core API reference page doesn't load [\#400](https://github.com/Polymer/polymer/issues/400)
+
+- Repeating a template from "content" does not work with repeat="d in data" [\#396](https://github.com/Polymer/polymer/issues/396)
+
+## [0.1.3](https://github.com/Polymer/polymer/tree/0.1.3) (2014-01-17)
+
+**Closed issues:**
+
+- polymer-ajax is missing the "body" attribute in the \<polymer-element\> declaration [\#395](https://github.com/Polymer/polymer/issues/395)
+
+- this year is 2014 [\#394](https://github.com/Polymer/polymer/issues/394)
+
+- Can't separate attributes in element's definition with vertical whitespace [\#393](https://github.com/Polymer/polymer/issues/393)
+
+- "deliverDeclarations Platform is not a function" error loading polymer.js [\#391](https://github.com/Polymer/polymer/issues/391)
+
+- Assertion Error thrown [\#388](https://github.com/Polymer/polymer/issues/388)
+
+## [0.1.2](https://github.com/Polymer/polymer/tree/0.1.2) (2014-01-10)
+
+**Closed issues:**
+
+- Polymer UI Sidebar Menu doesn't work in JSBin [\#389](https://github.com/Polymer/polymer/issues/389)
+
+- Pointer Event Example links currently 404 Not Found [\#385](https://github.com/Polymer/polymer/issues/385)
+
+- Getting started examples are all broken for tk-\* [\#383](https://github.com/Polymer/polymer/issues/383)
+
+- function strings for declarative event handlers appear in the markup [\#378](https://github.com/Polymer/polymer/issues/378)
+
+- binding to multiple mustaches \(e.g. foo="{{bar}} {{zot}}"\) causes exception [\#377](https://github.com/Polymer/polymer/issues/377)
+
+- Attribute value not correctly propagated to elements [\#374](https://github.com/Polymer/polymer/issues/374)
+
+- Calling this.super can refer to the wrong method [\#373](https://github.com/Polymer/polymer/issues/373)
+
+- "Getting the code" instructions are out of date/broken [\#369](https://github.com/Polymer/polymer/issues/369)
+
+- polymer-ui-menu-item does not show the icon [\#365](https://github.com/Polymer/polymer/issues/365)
+
+- polymer-selected class is not applied to Polymer UI elements [\#364](https://github.com/Polymer/polymer/issues/364)
+
+- InvalidCharacterError on document.register if $ exists in constructor function name [\#362](https://github.com/Polymer/polymer/issues/362)
+
+- Exception when running on Canary without Experimental Web Platform Features [\#360](https://github.com/Polymer/polymer/issues/360)
+
+- Page navigation issue [\#353](https://github.com/Polymer/polymer/issues/353)
+
+- in polymer 0.0.20131025 element id attribute not allowed [\#332](https://github.com/Polymer/polymer/issues/332)
+
+- FAQ entry on scoped animations is not accurate [\#141](https://github.com/Polymer/polymer/issues/141)
+
+## [0.1.1](https://github.com/Polymer/polymer/tree/0.1.1) (2013-12-12)
+
+**Closed issues:**
+
+- Polyfill support for reprojecting content in shadow nodes [\#367](https://github.com/Polymer/polymer/issues/367)
+
+- bower instructions don't work [\#366](https://github.com/Polymer/polymer/issues/366)
+
+- Broken Links [\#359](https://github.com/Polymer/polymer/issues/359)
+
+- Failing to import polymer.html can cause an infinite loop [\#356](https://github.com/Polymer/polymer/issues/356)
+
+- The bower pkg looks broken [\#355](https://github.com/Polymer/polymer/issues/355)
+
+- Documentation display issue [\#352](https://github.com/Polymer/polymer/issues/352)
+
+## [0.1.0](https://github.com/Polymer/polymer/tree/0.1.0) (2013-11-27)
+
+**Closed issues:**
+
+- shim styling: need to support ^ and ^^ when they are defined outside of \<polymer-element\> [\#354](https://github.com/Polymer/polymer/issues/354)
+
+- Extensions to type extension custom elements must specify an extends property when registering [\#347](https://github.com/Polymer/polymer/issues/347)
+
+- ShadowDOM polyfill breaks CSS `content: attr\(foo\)` [\#345](https://github.com/Polymer/polymer/issues/345)
+
+## [v0.0.20131107](https://github.com/Polymer/polymer/tree/v0.0.20131107) (2013-11-07)
+
+**Closed issues:**
+
+- `ready` and `created` are listed in the wrong order [\#338](https://github.com/Polymer/polymer/issues/338)
+
+- CSS: pseudo-classes don't work with :host under the polyfill [\#335](https://github.com/Polymer/polymer/issues/335)
+
+- Allow bindings to wire events to functions [\#324](https://github.com/Polymer/polymer/issues/324)
+
+## [v0.0.20131025](https://github.com/Polymer/polymer/tree/v0.0.20131025) (2013-10-25)
+
+**Implemented enhancements:**
+
+- Consider providing a mechanism to easily observe a set of property paths [\#194](https://github.com/Polymer/polymer/issues/194)
+
+**Closed issues:**
+
+- binding style attribute in IE doesn't work [\#327](https://github.com/Polymer/polymer/issues/327)
+
+- CSS: only add \[is=..\] selector if element is type-extension [\#320](https://github.com/Polymer/polymer/issues/320)
+
+- Clarification on use of template repeat for \<tr\> & \<select\> [\#318](https://github.com/Polymer/polymer/issues/318)
+
+- Autofocus doesn't work with polymer-veiling. [\#317](https://github.com/Polymer/polymer/issues/317)
+
+- Polyfill: @polyfill @host rules are broken in an extended element [\#315](https://github.com/Polymer/polymer/issues/315)
+
+- Polyfill: Parent styles are not inherited if there's no \<template\> in an extended class [\#314](https://github.com/Polymer/polymer/issues/314)
+
+**Merged pull requests:**
+
+- Event bindings [\#328](https://github.com/Polymer/polymer/pull/328) ([azakus](https://github.com/azakus))
+
+- Remove SideTable dependency [\#322](https://github.com/Polymer/polymer/pull/322) ([azakus](https://github.com/azakus))
+
+- fix Node.bind to pass the property name to reflectPropertyToAttribute [\#319](https://github.com/Polymer/polymer/pull/319) ([jmesserly](https://github.com/jmesserly))
+
+## [v0.0.20131010](https://github.com/Polymer/polymer/tree/v0.0.20131010) (2013-10-10)
+
+**Closed issues:**
+
+- trailing space in polymer attributes causes exception in IE10 [\#313](https://github.com/Polymer/polymer/issues/313)
+
+- Calling cancelUnbindAll is cumbersome under the CustomElements polyfill [\#312](https://github.com/Polymer/polymer/issues/312)
+
+- Calling methods on proxies returned when querying nodes can yield different results than calling directly on impl even without shadow dom use [\#309](https://github.com/Polymer/polymer/issues/309)
+
+- Using this.$.\[id\] syntax yields different results in Canary than when using Polyfill [\#308](https://github.com/Polymer/polymer/issues/308)
+
+- Debugging polymer apps: stack trace is wacko [\#307](https://github.com/Polymer/polymer/issues/307)
+
+- Need Object.observe-enabled builders in waterfall [\#306](https://github.com/Polymer/polymer/issues/306)
+
+- FR: Error on failed import [\#189](https://github.com/Polymer/polymer/issues/189)
+
+## [v0.0.20131003](https://github.com/Polymer/polymer/tree/v0.0.20131003) (2013-10-03)
+
+**Implemented enhancements:**
+
+- Allow hooking into the template instantiation process [\#156](https://github.com/Polymer/polymer/issues/156)
+
+- Support stylesheets in element templates [\#146](https://github.com/Polymer/polymer/issues/146)
+
+- System for automatic setting of component instance attributes [\#92](https://github.com/Polymer/polymer/issues/92)
+
+**Closed issues:**
+
+- Polymer tests failing with Object.observe enabled [\#302](https://github.com/Polymer/polymer/issues/302)
+
+- FAQ bug: polymer fails CSP because of inline script tags not XHR. [\#301](https://github.com/Polymer/polymer/issues/301)
+
+- \<propertyName\>Changed may get called twice for a single property value change [\#298](https://github.com/Polymer/polymer/issues/298)
+
+- Two-way Binding doesn't work in canary [\#297](https://github.com/Polymer/polymer/issues/297)
+
+- please create gh-pages [\#294](https://github.com/Polymer/polymer/issues/294)
+
+- Conditional attributes are not properly bound [\#293](https://github.com/Polymer/polymer/issues/293)
+
+- Bound boolean isn't set from true to false when radio button is unchecked [\#291](https://github.com/Polymer/polymer/issues/291)
+
+- Bindings in nested templates with named scopes fail to update correctly after initial population [\#285](https://github.com/Polymer/polymer/issues/285)
+
+- \<content\> not being displayed if too deep. [\#283](https://github.com/Polymer/polymer/issues/283)
+
+- polymer-element who to fire properties change? [\#282](https://github.com/Polymer/polymer/issues/282)
+
+- how to get inner element [\#280](https://github.com/Polymer/polymer/issues/280)
+
+- how to bind tap event on children node [\#278](https://github.com/Polymer/polymer/issues/278)
+
+- Provide finer control over unresolved element styling [\#276](https://github.com/Polymer/polymer/issues/276)
+
+- Question regarding your usage of a getter [\#274](https://github.com/Polymer/polymer/issues/274)
+
+- Consider removing "tools" submodule [\#271](https://github.com/Polymer/polymer/issues/271)
+
+- Community registry in the wild [\#268](https://github.com/Polymer/polymer/issues/268)
+
+- HTMLImports fails on IE9 [\#229](https://github.com/Polymer/polymer/issues/229)
+
+- External element scripts not loading [\#216](https://github.com/Polymer/polymer/issues/216)
+
+- polymer-element script tag are ignored when using innerHTML to inject polymer-element\(s\) into the page [\#205](https://github.com/Polymer/polymer/issues/205)
+
+- Galaxy Nexus Stock-Browser [\#202](https://github.com/Polymer/polymer/issues/202)
+
+- Allow body FOUC prevention to be optional [\#197](https://github.com/Polymer/polymer/issues/197)
+
+- Consider converting attributes with dashes into to camelCased properties [\#193](https://github.com/Polymer/polymer/issues/193)
+
+- \(IE only\) Last element created by \<template repeat\> is unbound [\#187](https://github.com/Polymer/polymer/issues/187)
+
+- Can't bind to the value of a custom element that extends \<input\> [\#186](https://github.com/Polymer/polymer/issues/186)
+
+- Calling offsetWidth in a style-modifying forEach is slow [\#180](https://github.com/Polymer/polymer/issues/180)
+
+- Explicitly fire ready\(\) [\#178](https://github.com/Polymer/polymer/issues/178)
+
+- Consider deserializing to Number only if property is already Number-valued [\#120](https://github.com/Polymer/polymer/issues/120)
+
+- Cannot load Google's jsapi inside of a component [\#115](https://github.com/Polymer/polymer/issues/115)
+
+- Document toolkit styling helpers [\#101](https://github.com/Polymer/polymer/issues/101)
+
+- Make sure properties are not doc'd as attributes [\#96](https://github.com/Polymer/polymer/issues/96)
+
+- Document that attributes and properties are not dynamically converted [\#94](https://github.com/Polymer/polymer/issues/94)
+
+**Merged pull requests:**
+
+- Removes unnecessary px declarations in coordinate attributes. [\#289](https://github.com/Polymer/polymer/pull/289) ([mrmrs](https://github.com/mrmrs))
+
+- remove extra argument to unbindProperty that was ignored [\#286](https://github.com/Polymer/polymer/pull/286) ([jmesserly](https://github.com/jmesserly))
+
+- small fix to bubbles parameter of utils.fire [\#284](https://github.com/Polymer/polymer/pull/284) ([jmesserly](https://github.com/jmesserly))
+
+## [v0.0.20130912](https://github.com/Polymer/polymer/tree/v0.0.20130912) (2013-09-12)
+
+**Fixed bugs:**
+
+- Updated use of PathObservers to match new API [\#267](https://github.com/Polymer/polymer/issues/267)
+
+**Closed issues:**
+
+- Point each repo's CONTRIBUTING file to Polymer's [\#273](https://github.com/Polymer/polymer/issues/273)
+
+- Nested templates throwing exceptions with reference to observe.js [\#264](https://github.com/Polymer/polymer/issues/264)
+
+- Perf regression in polyfill - 20130808 release [\#236](https://github.com/Polymer/polymer/issues/236)
+
+- Auto-registration of polymer-elements broken? [\#221](https://github.com/Polymer/polymer/issues/221)
+
+## [v0.0.20130905](https://github.com/Polymer/polymer/tree/v0.0.20130905) (2013-09-05)
+
+**Closed issues:**
+
+- SD polyfill in latest release breaks chromestatus.com [\#263](https://github.com/Polymer/polymer/issues/263)
+
+- On latest Chrome Canary, using vulcanized version won't show the style of elements [\#262](https://github.com/Polymer/polymer/issues/262)
+
+- grunt will fail using the latest commit of polymer-all [\#261](https://github.com/Polymer/polymer/issues/261)
+
+- Need a way to get the activeElement inside a Polymer element [\#253](https://github.com/Polymer/polymer/issues/253)
+
+- When using minified version on polymer, images of the button don't show in the ui-toolbar example [\#251](https://github.com/Polymer/polymer/issues/251)
+
+- Make sure boolean properties are reflected as boolean attributes [\#240](https://github.com/Polymer/polymer/issues/240)
+
+- Attributes are not reflected at bind time [\#239](https://github.com/Polymer/polymer/issues/239)
+
+- HTML imports fail when url params contain '/' characters [\#238](https://github.com/Polymer/polymer/issues/238)
+
+- Unable to use the Sandbox on Chrome \<= 28 [\#138](https://github.com/Polymer/polymer/issues/138)
+
+## [v0.0.20130829](https://github.com/Polymer/polymer/tree/v0.0.20130829) (2013-08-28)
+
+**Closed issues:**
+
+- loading a local file \(file:///\) using polymer will fail to load properly [\#260](https://github.com/Polymer/polymer/issues/260)
+
+- uppercase signals do not work [\#256](https://github.com/Polymer/polymer/issues/256)
+
+- Chrome Packaged App: including UI elements in an application will show some errors [\#249](https://github.com/Polymer/polymer/issues/249)
+
+- Changing a DOM attribute doesn't change the model [\#246](https://github.com/Polymer/polymer/issues/246)
+
+- Latest build broken w/ jQuery \(chrome 28\) [\#243](https://github.com/Polymer/polymer/issues/243)
+
+- window.Loader name colliding with ES6 window.Loader \(modules\) [\#237](https://github.com/Polymer/polymer/issues/237)
+
+**Merged pull requests:**
+
+- Recursive build for polymer [\#250](https://github.com/Polymer/polymer/pull/250) ([azakus](https://github.com/azakus))
+
+## [v0.0.20130815](https://github.com/Polymer/polymer/tree/v0.0.20130815) (2013-08-15)
+
+## [v0.0.20130816](https://github.com/Polymer/polymer/tree/v0.0.20130816) (2013-08-15)
+
+**Fixed bugs:**
+
+- FF broken in latest release w/ dom.webcomponents.enabled: true [\#235](https://github.com/Polymer/polymer/issues/235)
+
+**Closed issues:**
+
+- HTMLImports fails silently on Chrome 28.0.1500.95 \(Debian , 64bit\) [\#234](https://github.com/Polymer/polymer/issues/234)
+
+- ss [\#233](https://github.com/Polymer/polymer/issues/233)
+
+- Internet Explorer - not working at all [\#217](https://github.com/Polymer/polymer/issues/217)
+
+**Merged pull requests:**
+
+- 8/15 master -\> stable [\#241](https://github.com/Polymer/polymer/pull/241) ([azakus](https://github.com/azakus))
+
+- Fixes for some of the workbench samples [\#232](https://github.com/Polymer/polymer/pull/232) ([chrisbu](https://github.com/chrisbu))
+
+## [v0.0.20130808](https://github.com/Polymer/polymer/tree/v0.0.20130808) (2013-08-08)
+
+**Implemented enhancements:**
+
+- Add @version string to build files [\#226](https://github.com/Polymer/polymer/issues/226)
+
+**Closed issues:**
+
+- Events on distributed nodes aren't bubbled to parent nodes in shadow DOM under polyfill [\#230](https://github.com/Polymer/polymer/issues/230)
+
+- `ReferenceError: PathObserver is not defined` when loading in node-webkit [\#228](https://github.com/Polymer/polymer/issues/228)
+
+**Merged pull requests:**
+
+- 8/8 master -\> stable [\#231](https://github.com/Polymer/polymer/pull/231) ([azakus](https://github.com/azakus))
+
+## [v0.0.20130801](https://github.com/Polymer/polymer/tree/v0.0.20130801) (2013-08-01)
+
+**Implemented enhancements:**
+
+- It's awkward to make a property with an object default value [\#215](https://github.com/Polymer/polymer/issues/215)
+
+- Throw a more useful error if Polymer.register is used [\#210](https://github.com/Polymer/polymer/issues/210)
+
+- Consider if/when/how to reflect bound property values to attributes [\#188](https://github.com/Polymer/polymer/issues/188)
+
+- Make platform and toolkit builds available as simple downloads and/or from CDN [\#87](https://github.com/Polymer/polymer/issues/87)
+
+**Closed issues:**
+
+- If `Polymer\(\)` is not called almost immediately, the element is not initialised. [\#214](https://github.com/Polymer/polymer/issues/214)
+
+- Input value is not initialised. [\#213](https://github.com/Polymer/polymer/issues/213)
+
+- Fail more gracefully on unsupported browsers [\#207](https://github.com/Polymer/polymer/issues/207)
+
+- Binding and xxxChanged function break if element is moved to a different shadow [\#203](https://github.com/Polymer/polymer/issues/203)
+
+- table element problems on firefox [\#196](https://github.com/Polymer/polymer/issues/196)
+
+- Bindings on a range input not working well in google chrome [\#182](https://github.com/Polymer/polymer/issues/182)
+
+- Add support for creating Polymer elements imperatively [\#163](https://github.com/Polymer/polymer/issues/163)
+
+- Issue with scrolling using the flot library [\#162](https://github.com/Polymer/polymer/issues/162)
+
+- \[Feature Request\] Using Bower instead of submodules [\#147](https://github.com/Polymer/polymer/issues/147)
+
+- minor documentation typo [\#139](https://github.com/Polymer/polymer/issues/139)
+
+**Merged pull requests:**
+
+- 8/1 master -\> stable [\#223](https://github.com/Polymer/polymer/pull/223) ([azakus](https://github.com/azakus))
+
+## [v0.0.20130711](https://github.com/Polymer/polymer/tree/v0.0.20130711) (2013-07-11)
+
+**Implemented enhancements:**
+
+- Support resetStyleInheritance on prototype [\#199](https://github.com/Polymer/polymer/issues/199)
+
+- Add styling polyfill support for pseudos [\#152](https://github.com/Polymer/polymer/issues/152)
+
+**Fixed bugs:**
+
+- template/element polyfill styling need !important [\#191](https://github.com/Polymer/polymer/issues/191)
+
+- Type extension elements lose styling under polyfill [\#171](https://github.com/Polymer/polymer/issues/171)
+
+- When polymer-scope="global" is used to pull a stylesheet to the document, it appears multiple times [\#155](https://github.com/Polymer/polymer/issues/155)
+
+- PathObservers in observeProperties.js must be created at insertedCallback and removed at removeCallback [\#121](https://github.com/Polymer/polymer/issues/121)
+
+- shimStyling: styles defined within shadowDOM are not prefixed with the scope name in Firefox [\#107](https://github.com/Polymer/polymer/issues/107)
+
+- Event target is incorrect after certain DOM changes in ShadowDOM Polyfill [\#102](https://github.com/Polymer/polymer/issues/102)
+
+- Bindings in icon-button fail under ShadowDOMPolyfill [\#83](https://github.com/Polymer/polymer/issues/83)
+
+- \[dev\] Uncaught ReferenceError: SideTable is not defined [\#80](https://github.com/Polymer/polymer/issues/80)
+
+- \[dev\] template iterate doesn't work inside component [\#79](https://github.com/Polymer/polymer/issues/79)
+
+- Toolkit Components fail if they have a property named "node" [\#78](https://github.com/Polymer/polymer/issues/78)
+
+- Support component upgrade using "is" style declaration [\#71](https://github.com/Polymer/polymer/issues/71)
+
+- Styles declared in a component's shadowRoot should not leak out of the component [\#70](https://github.com/Polymer/polymer/issues/70)
+
+- this.node.webkitShadowRoot needs to return ShadowRoot [\#68](https://github.com/Polymer/polymer/issues/68)
+
+- Commented @host rule style gets applied [\#67](https://github.com/Polymer/polymer/issues/67)
+
+- data: URLs are being rewritten to relative URLs in \<style\> [\#66](https://github.com/Polymer/polymer/issues/66)
+
+- Custom Element shim incorrectly handles @host rule [\#65](https://github.com/Polymer/polymer/issues/65)
+
+- path.js needs to handle absolute url paths [\#62](https://github.com/Polymer/polymer/issues/62)
+
+- imperative instantiation is broken [\#56](https://github.com/Polymer/polymer/issues/56)
+
+- nodes inside a component's shadowDOM have incorrect model when using shadowDOM shim [\#43](https://github.com/Polymer/polymer/issues/43)
+
+- g-component custom events can be handled in wrong scope [\#30](https://github.com/Polymer/polymer/issues/30)
+
+**Closed issues:**
+
+- Consider optimizing propertyForAttribute [\#181](https://github.com/Polymer/polymer/issues/181)
+
+- nameInThis\(\) in oop.js is slow [\#177](https://github.com/Polymer/polymer/issues/177)
+
+- Internationalization of Web Components [\#175](https://github.com/Polymer/polymer/issues/175)
+
+- polymer-scope="controller" should not install the same stylesheet multiple times [\#173](https://github.com/Polymer/polymer/issues/173)
+
+- Add polyfill styling support for @host :scope [\#170](https://github.com/Polymer/polymer/issues/170)
+
+- Error loading polymer if window.location.hash is not null [\#167](https://github.com/Polymer/polymer/issues/167)
+
+- Unexpected result upgraded plain DOM to custom element instance [\#166](https://github.com/Polymer/polymer/issues/166)
+
+- Alias this.webkitShadowRoot -\> this.shadowRoot [\#165](https://github.com/Polymer/polymer/issues/165)
+
+- Simplest way to "Fire up a web server" to run examples [\#161](https://github.com/Polymer/polymer/issues/161)
+
+- Custom elements seem to cache data after being deleted and re-added [\#159](https://github.com/Polymer/polymer/issues/159)
+
+- Prevent memory leaking under MDV polyfill [\#154](https://github.com/Polymer/polymer/issues/154)
+
+- Element templates are stamped into shadowRoot with unbound values [\#153](https://github.com/Polymer/polymer/issues/153)
+
+- Styles should not be shimmed asynchronously under ShadowDOMPolyfill [\#151](https://github.com/Polymer/polymer/issues/151)
+
+- Polymer.js fails to load with "ReferenceError: Can't find variable: Window" on Windows 7 Safari browser and iPad 1 iOS 5.1.1 [\#149](https://github.com/Polymer/polymer/issues/149)
+
+- Stylesheets in \<element\> elements are emitted in incorrect order [\#148](https://github.com/Polymer/polymer/issues/148)
+
+- Web animations is not loaded by Polymer [\#140](https://github.com/Polymer/polymer/issues/140)
+
+- Polymer components should be called monomers. [\#137](https://github.com/Polymer/polymer/issues/137)
+
+- Small error in "Getting Started" tutorial [\#136](https://github.com/Polymer/polymer/issues/136)
+
+- add doc-comments to 'base.js' [\#133](https://github.com/Polymer/polymer/issues/133)
+
+- Attribute-based styles not always updated [\#132](https://github.com/Polymer/polymer/issues/132)
+
+- attributeChanged event on "sub-component" not fired in Canary but works in Chrome [\#131](https://github.com/Polymer/polymer/issues/131)
+
+- Stylesheets throw exception if toolkit-scope is defined and the element definition is inline [\#127](https://github.com/Polymer/polymer/issues/127)
+
+- Consider deserializing to Array from attributes, if property is Array-valued [\#124](https://github.com/Polymer/polymer/issues/124)
+
+- Modify attrs.js to accept Date strings in custom element attribute values [\#118](https://github.com/Polymer/polymer/issues/118)
+
+- Attribute value that's a comma delineated list of numbers is converted to a property incorrectly [\#117](https://github.com/Polymer/polymer/issues/117)
+
+- Including toolkit.js on a page moves all \<style\>s to the \<head\>. [\#114](https://github.com/Polymer/polymer/issues/114)
+
+- PointerEvents registration fails in the presence of ShadowDOMPolyfill in some cases [\#111](https://github.com/Polymer/polymer/issues/111)
+
+- Distributing template content to a shadowDOM can fail under shadowDOM polyfill [\#110](https://github.com/Polymer/polymer/issues/110)
+
+- Cursor moves to end of input after typing [\#109](https://github.com/Polymer/polymer/issues/109)
+
+- toolkitchen.github.io code samples not showing up in ff [\#105](https://github.com/Polymer/polymer/issues/105)
+
+- Document Browser support and test coverage using Testing CI and Travis CI [\#104](https://github.com/Polymer/polymer/issues/104)
+
+- clean up commented code in events.js [\#100](https://github.com/Polymer/polymer/issues/100)
+
+- rename `base.send` to `base.fire` or `base.bubble` [\#98](https://github.com/Polymer/polymer/issues/98)
+
+- toolkit.min.js missing method shimStyling [\#91](https://github.com/Polymer/polymer/issues/91)
+
+- Git repo url incorrect [\#89](https://github.com/Polymer/polymer/issues/89)
+
+- Menu-button workbench file hangs chrome under ShadowDOM Polyfill [\#86](https://github.com/Polymer/polymer/issues/86)
+
+- can't make bindings to objects on elements instantiated by mdv [\#81](https://github.com/Polymer/polymer/issues/81)
+
+- Don't name things \_, \_\_ and $ [\#73](https://github.com/Polymer/polymer/issues/73)
+
+- @host styles aren't processed for base elements [\#72](https://github.com/Polymer/polymer/issues/72)
+
+- "export" flag attribute documented in platform.js is actually "exportas" [\#64](https://github.com/Polymer/polymer/issues/64)
+
+- handlers="..." declarative events listen on the host element and therefore see no event target info for events generated in shadowDom [\#41](https://github.com/Polymer/polymer/issues/41)
+
+- MutationObserver code for custom event \(on-\*\) binding is inefficient [\#24](https://github.com/Polymer/polymer/issues/24)
+
+- g-component published properties don't inherit [\#18](https://github.com/Polymer/polymer/issues/18)
+
+- g-component property automation is inefficient [\#15](https://github.com/Polymer/polymer/issues/15)
+
+- Add unit tests for g-overlay, g-selector, g-selection [\#11](https://github.com/Polymer/polymer/issues/11)
+
+- Document public api [\#10](https://github.com/Polymer/polymer/issues/10)
+
+- have some good defaults for g-overlay [\#7](https://github.com/Polymer/polymer/issues/7)
+
+**Merged pull requests:**
+
+- 7/11 master -\> stable [\#204](https://github.com/Polymer/polymer/pull/204) ([azakus](https://github.com/azakus))
+
+- Correct test to check global div [\#201](https://github.com/Polymer/polymer/pull/201) ([ebidel](https://github.com/ebidel))
+
+- Fixes issue \#199 - adds support for resetStyleInheritance on prototype [\#200](https://github.com/Polymer/polymer/pull/200) ([ebidel](https://github.com/ebidel))
+
+- Switch to \<polymer-element\> [\#192](https://github.com/Polymer/polymer/pull/192) ([azakus](https://github.com/azakus))
+
+- 6/17 master -\> stable [\#184](https://github.com/Polymer/polymer/pull/184) ([azakus](https://github.com/azakus))
+
+- Fix a typo in contributing.md [\#183](https://github.com/Polymer/polymer/pull/183) ([alexhancock](https://github.com/alexhancock))
+
+- Flatten repos [\#174](https://github.com/Polymer/polymer/pull/174) ([azakus](https://github.com/azakus))
+
+- 6/5 master -\> stable [\#172](https://github.com/Polymer/polymer/pull/172) ([azakus](https://github.com/azakus))
+
+- Merge mdv-syntax branch [\#168](https://github.com/Polymer/polymer/pull/168) ([sjmiles](https://github.com/sjmiles))
+
+- added array & obj support to attrs.js \(plus refactor\) [\#158](https://github.com/Polymer/polymer/pull/158) ([bsatrom](https://github.com/bsatrom))
+
+- Fix link in CONTRIBUTING.md [\#144](https://github.com/Polymer/polymer/pull/144) ([markhealey](https://github.com/markhealey))
+
+- 5/15 master -\> stable [\#135](https://github.com/Polymer/polymer/pull/135) ([azakus](https://github.com/azakus))
+
+- 5/14 master -\> stable [\#134](https://github.com/Polymer/polymer/pull/134) ([azakus](https://github.com/azakus))
+
+- Add custom date parsing module [\#130](https://github.com/Polymer/polymer/pull/130) ([bsatrom](https://github.com/bsatrom))
+
+- 5/9 master -\> stable [\#125](https://github.com/Polymer/polymer/pull/125) ([azakus](https://github.com/azakus))
+
+- added deserialization of Date attributes for custom elements [\#122](https://github.com/Polymer/polymer/pull/122) ([bsatrom](https://github.com/bsatrom))
+
+- merge Observer branch [\#113](https://github.com/Polymer/polymer/pull/113) ([sjmiles](https://github.com/sjmiles))
+
+- 4/17 master -\> stable [\#99](https://github.com/Polymer/polymer/pull/99) ([azakus](https://github.com/azakus))
+
+- Bring experimental test harness in from alt-test branch [\#85](https://github.com/Polymer/polymer/pull/85) ([sjmiles](https://github.com/sjmiles))
+
+- Wrap grunt test in xvfb for virtual display. [\#84](https://github.com/Polymer/polymer/pull/84) ([agable-chromium](https://github.com/agable-chromium))
+
+- Add step-generator script to toolkit [\#82](https://github.com/Polymer/polymer/pull/82) ([agable-chromium](https://github.com/agable-chromium))
+
+- Stop using \_\_{lookup,define}{G,S}etter\_\_ [\#76](https://github.com/Polymer/polymer/pull/76) ([arv](https://github.com/arv))
+
+- Use XMLHttpRequest directly [\#75](https://github.com/Polymer/polymer/pull/75) ([arv](https://github.com/arv))
+
+- Updating meta tag [\#61](https://github.com/Polymer/polymer/pull/61) ([ebidel](https://github.com/ebidel))
+
+- Adding Contributors guide [\#60](https://github.com/Polymer/polymer/pull/60) ([ebidel](https://github.com/ebidel))
+
+- Tweaks to README. [\#58](https://github.com/Polymer/polymer/pull/58) ([ebidel](https://github.com/ebidel))
+
+- latest event handling scheme [\#55](https://github.com/Polymer/polymer/pull/55) ([sjmiles](https://github.com/sjmiles))
+
+- g-panels updates [\#54](https://github.com/Polymer/polymer/pull/54) ([sorvell](https://github.com/sorvell))
+
+- g-component tweaks to improve data-binding [\#53](https://github.com/Polymer/polymer/pull/53) ([sjmiles](https://github.com/sjmiles))
+
+- updated components for the new changes in g-component [\#52](https://github.com/Polymer/polymer/pull/52) ([frankiefu](https://github.com/frankiefu))
+
+- Merge polybinding branch into master [\#51](https://github.com/Polymer/polymer/pull/51) ([sjmiles](https://github.com/sjmiles))
+
+- minor fixes to support app development [\#49](https://github.com/Polymer/polymer/pull/49) ([sorvell](https://github.com/sorvell))
+
+- added g-menu-button and g-toolbar [\#48](https://github.com/Polymer/polymer/pull/48) ([frankiefu](https://github.com/frankiefu))
+
+- g-overlay: simplify styling. [\#47](https://github.com/Polymer/polymer/pull/47) ([sorvell](https://github.com/sorvell))
+
+- g-overlay update: simplify and add basic management for focus and z-index. [\#46](https://github.com/Polymer/polymer/pull/46) ([sorvell](https://github.com/sorvell))
+
+- add unit tests to cover more components and the latest sugaring in g-components [\#45](https://github.com/Polymer/polymer/pull/45) ([frankiefu](https://github.com/frankiefu))
+
+- fixes issue \#30: allow findController to step out of lightDOM [\#44](https://github.com/Polymer/polymer/pull/44) ([sjmiles](https://github.com/sjmiles))
+
+- update g-ajax and minor g-panels and g-page fixes [\#42](https://github.com/Polymer/polymer/pull/42) ([sorvell](https://github.com/sorvell))
+
+- update to use the new g-component sugar [\#40](https://github.com/Polymer/polymer/pull/40) ([frankiefu](https://github.com/frankiefu))
+
+- g-component minor fixup; updates for g-page and g-panels [\#39](https://github.com/Polymer/polymer/pull/39) ([sorvell](https://github.com/sorvell))
+
+- implement new 'protected' syntax [\#38](https://github.com/Polymer/polymer/pull/38) ([sjmiles](https://github.com/sjmiles))
+
+- g-component and g-panels minor changes [\#37](https://github.com/Polymer/polymer/pull/37) ([sorvell](https://github.com/sorvell))
+
+- filter mustaches in takeAttributes, other minor tweaks [\#36](https://github.com/Polymer/polymer/pull/36) ([sjmiles](https://github.com/sjmiles))
+
+- g-page: use external stylesheet [\#35](https://github.com/Polymer/polymer/pull/35) ([sorvell](https://github.com/sorvell))
+
+- added g-page component [\#34](https://github.com/Polymer/polymer/pull/34) ([sorvell](https://github.com/sorvell))
+
+- g-component attribute parsing fix; g-panels & g-overlay & g-ajax minor fixes [\#33](https://github.com/Polymer/polymer/pull/33) ([sorvell](https://github.com/sorvell))
+
+- bug fixes, more indirection around 'conventions' [\#32](https://github.com/Polymer/polymer/pull/32) ([sjmiles](https://github.com/sjmiles))
+
+- minor updates/fixes to g-component, selector and menu [\#31](https://github.com/Polymer/polymer/pull/31) ([frankiefu](https://github.com/frankiefu))
+
+- g-panels minor bug fixes [\#29](https://github.com/Polymer/polymer/pull/29) ([sorvell](https://github.com/sorvell))
+
+- add g-panels [\#28](https://github.com/Polymer/polymer/pull/28) ([sorvell](https://github.com/sorvell))
+
+- g-overlay: refactor/simplify [\#27](https://github.com/Polymer/polymer/pull/27) ([sorvell](https://github.com/sorvell))
+
+- g-component: fix typo [\#26](https://github.com/Polymer/polymer/pull/26) ([sorvell](https://github.com/sorvell))
+
+- update components based on changes in g-component [\#25](https://github.com/Polymer/polymer/pull/25) ([frankiefu](https://github.com/frankiefu))
+
+- MDV sugaring [\#23](https://github.com/Polymer/polymer/pull/23) ([sjmiles](https://github.com/sjmiles))
+
+- menu component and basic component unit tests [\#22](https://github.com/Polymer/polymer/pull/22) ([frankiefu](https://github.com/frankiefu))
+
+- "DOMTokenList.enable" was renamed to "toggle" at platform, update polyfill [\#21](https://github.com/Polymer/polymer/pull/21) ([sjmiles](https://github.com/sjmiles))
+
+- use MutationObserver to maintain custom event bindings, bug fixes [\#20](https://github.com/Polymer/polymer/pull/20) ([sjmiles](https://github.com/sjmiles))
+
+- tabs component, simplify togglebutton and more unit tests [\#19](https://github.com/Polymer/polymer/pull/19) ([frankiefu](https://github.com/frankiefu))
+
+- unit test harness [\#17](https://github.com/Polymer/polymer/pull/17) ([frankiefu](https://github.com/frankiefu))
+
+- use shadow="shim" instead of shimShadow for compatibility with URL override [\#16](https://github.com/Polymer/polymer/pull/16) ([sjmiles](https://github.com/sjmiles))
+
+- change property automation to be property-first instead of attribute-first [\#14](https://github.com/Polymer/polymer/pull/14) ([sjmiles](https://github.com/sjmiles))
+
+- call shadowRootCreated in the right scope and add g-ratings component [\#13](https://github.com/Polymer/polymer/pull/13) ([frankiefu](https://github.com/frankiefu))
+
+- update for names changes in polyfill [\#12](https://github.com/Polymer/polymer/pull/12) ([frankiefu](https://github.com/frankiefu))
+
+- add g-selection and g-selector components [\#9](https://github.com/Polymer/polymer/pull/9) ([sjmiles](https://github.com/sjmiles))
+
+- add ajax and togglebutton components [\#8](https://github.com/Polymer/polymer/pull/8) ([frankiefu](https://github.com/frankiefu))
+
+- various changes to enable g-overlay [\#6](https://github.com/Polymer/polymer/pull/6) ([sjmiles](https://github.com/sjmiles))
+
+- add g-icon-button [\#4](https://github.com/Polymer/polymer/pull/4) ([sjmiles](https://github.com/sjmiles))
+
+- fix path [\#3](https://github.com/Polymer/polymer/pull/3) ([sjmiles](https://github.com/sjmiles))
+
+- make workBench live with toolkit [\#2](https://github.com/Polymer/polymer/pull/2) ([sjmiles](https://github.com/sjmiles))
+
+- Initial Components [\#1](https://github.com/Polymer/polymer/pull/1) ([sjmiles](https://github.com/sjmiles))
diff --git a/third_party/polymer3/bower_components/polymer/CONTRIBUTING.md b/third_party/polymer3/bower_components/polymer/CONTRIBUTING.md
new file mode 100644
index 0000000..8342c0d
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/CONTRIBUTING.md
@@ -0,0 +1,162 @@
+# Contributing to Polymer
+
+There are many ways to contribute to the Polymer project! We welcome and truly appreciate contribution in all forms - issues and pull requests to the [main library](https://github.com/polymer/polymer), issues and pull requests to the [elements the Polymer team maintains](https://github.com/polymerelements), issues and pull requests to one of our many [Polymer-related tools](https://github.com/polymer), and of course we love to hear about any Polymer elements that you build to share with the community!
+
+## Logistics
+
+### Communicating with the Polymer team
+
+Beyond GitHub, we try to have a variety of different lines of communication open:
+
+* [Blog](https://blog.polymer-project.org/)
+* [Twitter](https://twitter.com/polymer)
+* [Google+ Community](https://plus.sandbox.google.com/u/0/communities/115626364525706131031?cfem=1)
+* [Mailing list](https://groups.google.com/forum/#!forum/polymer-dev)
+* [Slack channel](https://bit.ly/polymerslack)
+
+### The Polymer Repositories
+
+Because of the component-based nature of the Polymer project, we tend to have lots of different repositories. Our main repository for the Polymer library itself is at [github.com/Polymer/polymer](https://github.com/polymer/polymer). File any issues or pull requests that have to do with the core library on that repository, and we'll take a look ASAP.
+
+We keep all of the element "product lines" that the Polymer team maintains and distributes in the [PolymerElements](https://github.com/polymerelements) organization. For any element-specific issues or pull requests, file directly on the element's repository, such as the `paper-button` repository at [github.com/polymerelements/paper-button](https://github.com/polymerelements/paper-button). Of course, the elements built by the Polymer team are just a tiny fraction of all the Polymer-based elements out there - catalogs of other web components include [https://www.webcomponents.org/](https://github.com/webcomponents/webcomponents.org) and [component.kitchen](https://component.kitchen).
+
+The GoogleWebComponents element product line is maintained by teams all across Google, and so is kept in a separate organization: the [GoogleWebComponents](https://github.com/googlewebcomponents) org. Feel free to file issues and PR's on those elements directly in that organization.
+
+We also track each element product line overall in "meta-repos", named as `$PRODUCTLINE-elements`. These include [paper-elements](https://github.com/polymerelements/paper-elements), [iron-elements](https://github.com/polymerelements/iron-elements), [gold-elements](https://github.com/polymerelements/gold-elements), and more. Feel free to file issues for element requests on those meta-repos, and the README in each repo tracks a roadmap for the product line.
+
+### Contributor License Agreement
+
+You might notice our friendly CLA-bot commenting on a pull request you open if you haven't yet signed our CLA. We use the same CLA for all open-source Google projects, so you only have to sign it once. Once you complete the CLA, all your pull-requests will automatically get the `cla: yes` tag.
+
+If you've already signed a CLA but are still getting bothered by the awfully insistent CLA bot, it's possible we don't have your GitHub username or you're using a different email address. Check the [information on your CLA](https://cla.developers.google.com/clas) or see this help article on [setting the email on your git commits](https://help.github.com/articles/setting-your-email-in-git/).
+
+[Complete the CLA](https://cla.developers.google.com/clas)
+
+## Contributing
+
+### Filing bugs
+
+The Polymer team heavily uses (and loves!) GitHub for all of our software management. We use GitHub issues to track all bugs and features.
+
+If you find an issue, please do file it on the repository. The [Polymer/polymer issues](https://github.com/polymer/polymer/issues) should be used only for issues on the Polymer library itself - bugs somewhere in the core codebase.
+
+For issues with elements the team maintains, please file directly on the element's repository. If you're not sure if a bug stems from the element or the library, air toward filing it on the element and we'll move the issue if necessary.
+
+Please file issues using the issue template provided, filling out as many fields as possible. We love examples for addressing issues - issues with a jsBin, Plunkr, jsFiddle, or glitch.me repro will be much easier for us to work on quickly. You can start with [this jsbin](http://jsbin.com/luhaxab/edit) which sets up the basics to demonstrate a Polymer element. If you need your repro to run in IE11, you can start from [this glitch](https://glitch.com/edit/#!/polymer-repro?path=my-element.html:2:0), which serves the source via polyserve for automatic transpilation, although you must sign up for a glitch.me account to ensure your code persists for more than 5 days (note the glitch.me _editing environment_ is not compatible with IE11, however the "live" view link of the running code should work).
+
+Occasionally we'll close issues if they appear stale or are too vague - please don't take this personally! Please feel free to re-open issues we've closed if there's something we've missed and they still need to be addressed.
+
+### Contributing Pull Requests
+
+PR's are even better than issues. We gladly accept community pull requests. In general across the core library and all of the elements, there are a few necessary steps before we can accept a pull request:
+
+- Open an issue describing the problem that you are looking to solve in your PR (if one is not already open), and your approach to solving it. This makes it easier to have a conversation around the best general approach for solving your problem, outside of the code itself.
+- Sign the [CLA](https://cla.developers.google.com/clas), as described above.
+- Fork the repo you're making the fix on to your own GitHub account.
+- Code!
+- Ideally, squash your commits into a single commit with a clear message of what the PR does. If it absolutely makes sense to keep multiple commits, that's OK - or perhaps consider making two separate PR's.
+- **Include tests that test the range of behavior that changes with your PR.** If you PR fixes a bug, make sure your tests capture that bug. If your PR adds new behavior, make sure that behavior is fully tested. Every PR *must* include associated tests. (See [Unit tests](#unit-tests) for more.)
+- Submit your PR, making sure it references the issue you created.
+- If your PR fixes a bug, make sure the issue includes clear steps to reproduce the bug so we can test your fix.
+
+If you've completed all of these steps the core team will do its best to respond to the PR as soon as possible.
+
+#### Contributing Code to Elements
+
+Though the aim of the Polymer library is to allow lots of flexibility and not get in your way, we work to standardize our elements to make them as toolable and easy to maintain as possible.
+
+All elements should follow the [Polymer element style guide](http://polymerelements.github.io/style-guide/), which defines how to specify properties, documentation, and more. It's a great guide to follow when building your own elements as well, for maximum standardization and toolability. For instance, structuring elements following the style guide will ensure that they work with the [`iron-component-page`](https://github.com/polymerelements/iron-component-page) element, an incredibly easy way to turn any raw element directly into a documentation page.
+
+#### Contributing Code to the Polymer library
+
+We follow the most common javascript and HTML style guidelines for how we structure our code - in general, look at the code and you'll know how to contribute! If you'd like a bit more structure, the [Google JavaScript Styleguide](https://google.github.io/styleguide/javascriptguide.xml) is a good place to start.
+
+Polymer also participates in Google's [Patch Rewards Program](https://www.google.com/about/appsecurity/patch-rewards/), where you can earn cold, hard cash for qualifying security patches to the Polymer library. Visit the [patch rewards page](https://www.google.com/about/appsecurity/patch-rewards/) to find out more.
+
+## Unit tests
+
+All Polymer projects use [`web-component-tester`](https://github.com/Polymer/web-component-tester) for unit tests.
+The [`polyserve`](https://github.com/PolymerLabs/polyserve) utility is helpful for running tests in the browser.
+
+For maximum flexibility, install `web-component-tester` and `polyserve` locally:
+
+ npm install -g polyserve web-component-tester
+
+### Running the Polymer library unit tests
+
+To run the Polymer library unit tests:
+
+1. Clone the [Polymer repo](https://github.com/polymer/polymer).
+
+2. Install the dependencies:
+
+ npm install && bower install
+
+3. Run the tests:
+
+ npm test
+
+ Or if you have `web-component-tester` installed locally:
+
+ wct
+
+To run individual test suites:
+
+<code>npm test <var>path/to/suite</var></code>
+
+Or:
+
+<code>wct <var>path/to/suite</var></code>
+
+For example:
+
+ npm test test/unit/template.html
+
+You can also run tests in the browser:
+
+ polyserve
+
+Navigate to:
+
+[`http://localhost:8080/components/polymer/test/runner.html`](http://localhost:8080/components/polymer/test/runner.html)
+
+### Running Polymer element unit tests
+
+To run the element unit tests, you need a global install of `web-component-tester` or `polyserve` (or both).
+
+1. Clone the element repo.
+
+1. Install the dependencies.
+
+ bower install
+
+1. Run the tests:
+
+ wct
+
+ Or run the tests in a browser:
+
+ polyserve
+
+ Navigate to:
+
+ <code>http://localhost:8080/components/<var>element-name</var>/test/runner.html</code>
+
+### Configuring `web-component-tester`
+
+By default, `web-component-tester` runs tests on all installed browsers. You can configure it
+to run tests on a subset of available browsers, or to run tests remotely using Sauce Labs.
+
+See the [`web-component-tester` README](https://github.com/Polymer/web-component-tester) for
+information on configuring the tool.
+
+### Viewing the source documentation locally
+
+You can view the updates you make to the source documentation locally with the following steps.
+Make sure to rerun step 1 after every change you make.
+
+1. Run `polymer analyze > analysis.json`
+
+1. Run `polymer serve`
+
+1. Open `http://127.0.0.1:PORT/components/polymer/` to view the documentation
diff --git a/third_party/polymer3/bower_components/polymer/LICENSE.txt b/third_party/polymer3/bower_components/polymer/LICENSE.txt
new file mode 100644
index 0000000..87c683b
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/LICENSE.txt
@@ -0,0 +1,27 @@
+// Copyright (c) 2017 The Polymer Authors. 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 Google Inc. 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.
diff --git a/third_party/polymer3/bower_components/polymer/README.md b/third_party/polymer3/bower_components/polymer/README.md
new file mode 100644
index 0000000..38d9123
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/README.md
@@ -0,0 +1,142 @@
+# Polymer
+
+[](https://travis-ci.org/Polymer/polymer)
+
+> ℹ️ Note: This is the current stable version of the Polymer library. At Google I/O 2018 we announced a new Web Component base class, [`LitElement`](https://github.com/PolymerLabs/lit-element), as a successor to the `PolymerElement` base class in this library.
+>
+> If you're starting a new project, we recommend that you consider using LitElement instead.
+>
+> If you have a project you've built with an earlier version of the Polymer library, we recommend that you [migrate](#about-polymer-30) to 3.0 for best compatibility with the JavaScript ecosystem. Thanks to the interoperability of Web Components, elements built with Polymer 3.0 and LitElement can be mixed and matched in the same app, so once you have updated your project to Polymer 3.0, you can migrate to LitElement incrementally, one element at a time. See our blog post on the [Polymer Project roadmap](https://www.polymer-project.org/blog/2018-05-02-roadmap-update.html) for more information.
+
+Polymer lets you build encapsulated, reusable [Web Components](https://www.webcomponents.org/introduction) that work just like standard HTML elements, to use in building web applications. Using a Web Commponent built with Polymer is as simple as importing its definition then using it like any other HTML element:
+
+```html
+<!-- Import a component -->
+<script src="https://unpkg.com/@polymer/paper-checkbox@next/paper-checkbox.js?module" type="module" ></script>
+
+<!-- Use it like any other HTML element -->
+<paper-checkbox>Web Components!</paper-checkbox>
+```
+
+Web Components are now implemented natively on Safari and Chrome (~70% of installed browsers), and run well on Firefox, Edge, and IE11 using [polyfills](https://github.com/webcomponents/webcomponentsjs). Read more [below](#overview).
+
+## Getting started
+
+ * The easiest way to try out Polymer is to use one of these online tools:
+
+ * Runs in all [supported](#supported-browsers) browsers: [StackBlitz](https://stackblitz.com/edit/polymer-element-example?file=index.js), [Glitch](https://glitch.com/edit/#!/polymer-element-example?path=index.html)
+
+ * Runs in browsers with [JavaScript Modules](https://caniuse.com/#search=modules): [JSBin](https://jsbin.com/wuxejiz/edit?html,output),
+ [CodePen](https://codepen.io/kevinpschaaf/pen/BxdErp?editors=1000).
+
+ * You can also save [this HTML file](https://gist.githubusercontent.com/kevinpschaaf/8a5acbea7b25d2bb5e82eeea2b105669/raw/c3a86872f07603e2d0ddae736687e52a5c8c499f/index.html) to a local file and run it in any browser that supports [JavaScript Modules]((https://caniuse.com/#search=modules)).
+
+ * When you're ready to use Polymer in a project, install it via [npm](https://www.npmjs.com/). To run the project in the browser,
+ a module-compatible toolchain is required. We recommend installing the [Polymer CLI](https://github.com/Polymer/polymer-cli) to and using its development server as follows.
+
+ 1. Add Polymer to your project:
+
+ ```npm i @polymer/polymer```
+
+ 1. Create an element by extending PolymerElement and calling `customElements.define` with your class (see the examples below).
+
+ 1. Install the Polymer CLI:
+
+ ```npm i -g polymer-cli@next```
+
+ 1. Run the development server and open a browser pointing to its URL:
+
+ ```polymer serve```
+
+ > Polymer 3.0 is published on [npm](https://www.npmjs.com/package/@polymer/polymer) using JavaScript Modules.
+ This means it can take advantage of the standard native JavaScript module loader available in all current major browsers.
+ >
+ > However, since Polymer uses npm conventions to reference dependencies by name, a light transform to rewrite specifiers to URLs is required to run in the browser. The polymer-cli's development server `polymer serve`, as well as `polymer build` (for building an optimized app for deployment) automatically handles this transform.
+
+ Tools like [webpack](https://webpack.js.org/) and [Rollup](https://rollupjs.org/) can also be used to serve and/or bundle Polymer elements.
+
+
+## Minimal Example
+
+ 1. Create a class that extends `PolymerElement`.
+ 1. Implement a static `properties` getter that describes the element's public property/attribute API
+ (these automatically become observed attributes).
+ 1. Then implement a `template` getter that returns an `HTMLTemplateElement` describing the element's rendering, including encapsulated styling and any property bindings.
+
+```html
+ <script src="node_modules/@webcomponents/webcomponents-loader.js"></script>
+ <script type="module">
+ import {PolymerElement, html} from '@polymer/polymer';
+
+ class MyElement extends PolymerElement {
+ static get properties() { return { mood: String }}
+ static get template() {
+ return html`
+ <style> .mood { color: green; } </style>
+ Web Components are <span class="mood">[[mood]]</span>!
+ `;
+ }
+ }
+
+ customElements.define('my-element', MyElement);
+ </script>
+
+ <my-element mood="happy"></my-element>
+```
+
+## Overview
+
+Web components are an incredibly powerful new set of primitives baked into the web platform, and open up a whole new world of possibility when it comes to componentizing front-end code and easily creating powerful, immersive, app-like experiences on the web.
+
+Polymer is a lightweight library built on top of the web standards-based [Web Components](http://webcomponents.org/introduction) APIs, and makes it easier to build your very own custom HTML elements. Creating reusable custom elements - and using elements built by others - can make building complex web applications easier and more efficient.
+
+By being based on the Web Components APIs built in the browser (or [polyfilled](https://github.com/webcomponents/webcomponentsjs) where needed), elements built with Polymer are:
+
+* Built from the platform up
+* Self-contained
+* Re-usable
+* Interoperable across frameworks
+
+Among many ways to leverage custom elements, they can be particularly useful for building reusable UI components. Instead of continually re-building a specific navigation bar or button in different frameworks and for different projects, you can define this element once using Polymer, and then reuse it throughout your project or in any future project.
+
+Polymer provides a declarative syntax to easily create your own custom elements, using all standard web technologies - define the structure of the element with HTML, style it with CSS, and add interactions to the element with JavaScript.
+
+Polymer also provides optional two-way data-binding, meaning:
+
+1. When properties in the model for an element get updated, the element can update itself in response.
+2. When the element is updated internally, the changes can be propagated back to the model.
+
+Polymer is designed to be flexible, lightweight, and close to the web platform - the library doesn't invent complex new abstractions and magic, but uses the best features of the web platform in straightforward ways to simply sugar the creation of custom elements.
+
+## About Polymer 3.0
+
+Polymer 3.0 is now released to stable, and introduces a major change to how Polymer is distributed: from HTML Imports on Bower, to JS modules on npm. Otherwise, the API is almost entirely backward compatible with Polymer 2.0 (the only changes are removing APIs related to HTML Imports like `importHref`, and converting Polymer's API to be module-based rather than globals-based).
+
+Migrating to Polymer 3.0 by hand is mostly mechanical:
+* Components should be defined in JS modules instead of in HTML
+* Templates should be encoded in JS modules using a `static get template()` getter on PolymerElement subclasses using the `html` tagged template literal function (which parses `HTMLTemplateElement`s out of strings in JS) rather than using `<template>` elements in a `<dom-module>`
+* All dependencies should be imported JS module imports rather than HTML Imports.
+
+However, the [`polymer-modulizer`](https://github.com/Polymer/polymer-modulizer) tool automates the vast majority of this migration work. Please see details on that repo for automated conversion of Polymer 2.0 apps and elements to Polymer 3.0.
+
+👀 **Looking for Polymer v2.x?** Please see the [the v2 branch](https://github.com/Polymer/polymer/tree/2.x).
+
+👀 **Looking for Polymer v1.x?** Please see the [the v1 branch](https://github.com/Polymer/polymer/tree/1.x).
+
+## Contributing
+
+The Polymer team loves contributions from the community! Take a look at our [contributing guide](CONTRIBUTING.md) for more information on how to contribute. Please file issues on the Polymer issue tracker following the issue template and contributing guide [issues](https://github.com/Polymer/polymer/issues/new).
+
+## Communicating with the Polymer team
+
+Beyond GitHub, we try to have a variety of different lines of communication available:
+
+* [Blog](https://blog.polymer-project.org/)
+* [Twitter](https://twitter.com/polymer)
+* [Google+ community](https://plus.google.com/communities/115626364525706131031)
+* [Mailing list](https://groups.google.com/forum/#!forum/polymer-dev)
+* [Slack channel](https://bit.ly/polymerslack)
+
+# License
+
+The Polymer library uses a BSD-like license that is available [here](./LICENSE.txt)
diff --git a/third_party/polymer3/bower_components/polymer/externs/closure-types.js b/third_party/polymer3/bower_components/polymer/externs/closure-types.js
new file mode 100644
index 0000000..8e7f3dd
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/externs/closure-types.js
@@ -0,0 +1,1415 @@
+/**
+ * @fileoverview Generated typings for Polymer mixins
+ * @externs
+ *
+ * @license
+ * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ */
+/* eslint-disable */
+/**
+* @interface
+*/
+function Polymer_PropertiesChanged(){}
+/**
+* @param {string} property Name of the property
+* @param {boolean=} readOnly When true, no setter is created; the
+ protected `_setProperty` function must be used to set the property
+* @return {void}
+*/
+Polymer_PropertiesChanged.prototype._createPropertyAccessor = function(property, readOnly){};
+/**
+* @param {string} property Name of the property
+*/
+Polymer_PropertiesChanged.prototype._addPropertyToAttributeMap = function(property){};
+/**
+* @param {string} property Name of the property
+* @param {boolean=} readOnly When true, no setter is created
+* @return {void}
+*/
+Polymer_PropertiesChanged.prototype._definePropertyAccessor = function(property, readOnly){};
+/**
+* @return {void}
+*/
+Polymer_PropertiesChanged.prototype.ready = function(){};
+/**
+* @return {void}
+*/
+Polymer_PropertiesChanged.prototype._initializeProperties = function(){};
+/**
+* @param {Object} props Bag of property values that were overwritten
+ when creating property accessors.
+* @return {void}
+*/
+Polymer_PropertiesChanged.prototype._initializeInstanceProperties = function(props){};
+/**
+* @param {string} property Name of the property
+* @param {*} value Value to set
+* @return {void}
+*/
+Polymer_PropertiesChanged.prototype._setProperty = function(property, value){};
+/**
+* @param {string} property Name of property
+* @return {*}
+*/
+Polymer_PropertiesChanged.prototype._getProperty = function(property){};
+/**
+* @param {string} property Name of the property
+* @param {*} value Value to set
+* @param {boolean=} ext Not used here; affordance for closure
+* @return {boolean}
+*/
+Polymer_PropertiesChanged.prototype._setPendingProperty = function(property, value, ext){};
+/**
+* @return {void}
+*/
+Polymer_PropertiesChanged.prototype._invalidateProperties = function(){};
+/**
+* @return {void}
+*/
+Polymer_PropertiesChanged.prototype._enableProperties = function(){};
+/**
+* @return {void}
+*/
+Polymer_PropertiesChanged.prototype._flushProperties = function(){};
+/**
+* @param {!Object} currentProps Bag of all current accessor values
+* @param {!Object} changedProps Bag of properties changed since the last
+ call to `_propertiesChanged`
+* @param {!Object} oldProps Bag of previous values for each property
+ in `changedProps`
+* @return {boolean}
+*/
+Polymer_PropertiesChanged.prototype._shouldPropertiesChange = function(currentProps, changedProps, oldProps){};
+/**
+* @param {!Object} currentProps Bag of all current accessor values
+* @param {!Object} changedProps Bag of properties changed since the last
+ call to `_propertiesChanged`
+* @param {!Object} oldProps Bag of previous values for each property
+ in `changedProps`
+* @return {void}
+*/
+Polymer_PropertiesChanged.prototype._propertiesChanged = function(currentProps, changedProps, oldProps){};
+/**
+* @param {string} property Property name
+* @param {*} value New property value
+* @param {*} old Previous property value
+* @return {boolean}
+*/
+Polymer_PropertiesChanged.prototype._shouldPropertyChange = function(property, value, old){};
+/**
+* @param {string} name Name of attribute that changed
+* @param {?string} old Old attribute value
+* @param {?string} value New attribute value
+* @param {?string} namespace Attribute namespace.
+* @return {void}
+*/
+Polymer_PropertiesChanged.prototype.attributeChangedCallback = function(name, old, value, namespace){};
+/**
+* @param {string} attribute Name of attribute to deserialize.
+* @param {?string} value of the attribute.
+* @param {*=} type type to deserialize to, defaults to the value
+returned from `typeForProperty`
+* @return {void}
+*/
+Polymer_PropertiesChanged.prototype._attributeToProperty = function(attribute, value, type){};
+/**
+* @param {string} property Property name to reflect.
+* @param {string=} attribute Attribute name to reflect to.
+* @param {*=} value Property value to refect.
+* @return {void}
+*/
+Polymer_PropertiesChanged.prototype._propertyToAttribute = function(property, attribute, value){};
+/**
+* @param {Element} node Element to set attribute to.
+* @param {*} value Value to serialize.
+* @param {string} attribute Attribute name to serialize to.
+* @return {void}
+*/
+Polymer_PropertiesChanged.prototype._valueToNodeAttribute = function(node, value, attribute){};
+/**
+* @param {*} value Property value to serialize.
+* @return {(string | undefined)}
+*/
+Polymer_PropertiesChanged.prototype._serializeValue = function(value){};
+/**
+* @param {?string} value Value to deserialize.
+* @param {*=} type Type to deserialize the string to.
+* @return {*}
+*/
+Polymer_PropertiesChanged.prototype._deserializeValue = function(value, type){};
+/**
+* @param {!Object} props Object whose keys are names of accessors.
+* @return {void}
+*/
+Polymer_PropertiesChanged.createProperties = function(props){};
+/**
+* @param {string} property Property to convert
+* @return {string}
+*/
+Polymer_PropertiesChanged.attributeNameForProperty = function(property){};
+/**
+* @param {string} name Name of property
+*/
+Polymer_PropertiesChanged.typeForProperty = function(name){};
+/**
+* @interface
+* @extends {Polymer_PropertiesChanged}
+*/
+function Polymer_PropertyAccessors(){}
+/**
+* @param {string} property Name of the property
+* @param {boolean=} readOnly When true, no setter is created
+
+When calling on a prototype, any overwritten values are saved in
+`__dataProto`, and it is up to the subclasser to decide how/when
+to set those properties back into the accessor. When calling on an
+instance, the overwritten value is set via `_setPendingProperty`,
+and the user should call `_invalidateProperties` or `_flushProperties`
+for the values to take effect.
+* @return {void}
+*/
+Polymer_PropertyAccessors.prototype._definePropertyAccessor = function(property, readOnly){};
+/**
+* @return {void}
+*/
+Polymer_PropertyAccessors.prototype._initializeProperties = function(){};
+/**
+* @param {*} value Property value to serialize.
+* @return {(string | undefined)}
+*/
+Polymer_PropertyAccessors.prototype._serializeValue = function(value){};
+/**
+* @param {?string} value Attribute value to deserialize.
+* @param {*=} type Type to deserialize the string to.
+* @return {*}
+*/
+Polymer_PropertyAccessors.prototype._deserializeValue = function(value, type){};
+/**
+* @param {Object} props Bag of property values that were overwritten
+ when creating property accessors.
+* @return {void}
+*/
+Polymer_PropertyAccessors.prototype._initializeProtoProperties = function(props){};
+/**
+* @param {string} attribute Name of attribute to ensure is set.
+* @param {string} value of the attribute.
+* @return {void}
+*/
+Polymer_PropertyAccessors.prototype._ensureAttribute = function(attribute, value){};
+/**
+* @param {string} property Property name
+* @return {boolean}
+*/
+Polymer_PropertyAccessors.prototype._hasAccessor = function(property){};
+/**
+* @param {string} prop Property name
+* @return {boolean}
+*/
+Polymer_PropertyAccessors.prototype._isPropertyPending = function(prop){};
+/**
+* @param {string} property Property to convert
+* @return {string}
+*/
+Polymer_PropertyAccessors.attributeNameForProperty = function(property){};
+/**
+* @return {void}
+*/
+Polymer_PropertyAccessors.createPropertiesForAttributes = function(){};
+/**
+* @interface
+*/
+function Polymer_TemplateStamp(){}
+/**
+* @param {!HTMLTemplateElement} template Template to stamp
+* @return {!StampedTemplate}
+*/
+Polymer_TemplateStamp.prototype._stampTemplate = function(template){};
+/**
+* @param {!Node} node Node to add listener on
+* @param {string} eventName Name of event
+* @param {string} methodName Name of method
+* @param {*=} context Context the method will be called on (defaults
+ to `node`)
+* @return {Function}
+*/
+Polymer_TemplateStamp.prototype._addMethodEventListenerToNode = function(node, eventName, methodName, context){};
+/**
+* @param {!Node} node Node to add event listener to
+* @param {string} eventName Name of event
+* @param {function (!Event): void} handler Listener function to add
+* @return {void}
+*/
+Polymer_TemplateStamp.prototype._addEventListenerToNode = function(node, eventName, handler){};
+/**
+* @param {Node} node Node to remove event listener from
+* @param {string} eventName Name of event
+* @param {function (!Event): void} handler Listener function to remove
+* @return {void}
+*/
+Polymer_TemplateStamp.prototype._removeEventListenerFromNode = function(node, eventName, handler){};
+/**
+* @param {!HTMLTemplateElement} template Template to parse
+* @param {TemplateInfo=} outerTemplateInfo Template metadata from the outer
+ template, for parsing nested templates
+* @return {!TemplateInfo}
+*/
+Polymer_TemplateStamp._parseTemplate = function(template, outerTemplateInfo){};
+/**
+* @param {*} template
+* @param {*} templateInfo
+* @param {*} nodeInfo
+*/
+Polymer_TemplateStamp._parseTemplateContent = function(template, templateInfo, nodeInfo){};
+/**
+* @param {Node} node Node to parse
+* @param {!TemplateInfo} templateInfo Template metadata for current template
+* @param {!NodeInfo} nodeInfo Node metadata for current template.
+* @return {boolean}
+*/
+Polymer_TemplateStamp._parseTemplateNode = function(node, templateInfo, nodeInfo){};
+/**
+* @param {Node} root Root node whose `childNodes` will be parsed
+* @param {!TemplateInfo} templateInfo Template metadata for current template
+* @param {!NodeInfo} nodeInfo Node metadata for current template.
+* @return {void}
+*/
+Polymer_TemplateStamp._parseTemplateChildNodes = function(root, templateInfo, nodeInfo){};
+/**
+* @param {HTMLTemplateElement} node Node to parse (a <template>)
+* @param {TemplateInfo} outerTemplateInfo Template metadata for current template
+ that includes the template `node`
+* @param {!NodeInfo} nodeInfo Node metadata for current template.
+* @return {boolean}
+*/
+Polymer_TemplateStamp._parseTemplateNestedTemplate = function(node, outerTemplateInfo, nodeInfo){};
+/**
+* @param {Element} node Node to parse
+* @param {TemplateInfo} templateInfo Template metadata for current template
+* @param {NodeInfo} nodeInfo Node metadata for current template.
+* @return {boolean}
+*/
+Polymer_TemplateStamp._parseTemplateNodeAttributes = function(node, templateInfo, nodeInfo){};
+/**
+* @param {Element} node Node to parse
+* @param {!TemplateInfo} templateInfo Template metadata for current template
+* @param {!NodeInfo} nodeInfo Node metadata for current template.
+* @param {string} name Attribute name
+* @param {string} value Attribute value
+* @return {boolean}
+*/
+Polymer_TemplateStamp._parseTemplateNodeAttribute = function(node, templateInfo, nodeInfo, name, value){};
+/**
+* @param {HTMLTemplateElement} template Template to retrieve `content` for
+* @return {DocumentFragment}
+*/
+Polymer_TemplateStamp._contentForTemplate = function(template){};
+/**
+* @interface
+* @extends {Polymer_TemplateStamp}
+* @extends {Polymer_PropertyAccessors}
+*/
+function Polymer_PropertyEffects(){}
+/** @type {boolean} */
+Polymer_PropertyEffects.prototype.__dataClientsReady;
+
+/** @type {Array} */
+Polymer_PropertyEffects.prototype.__dataPendingClients;
+
+/** @type {Object} */
+Polymer_PropertyEffects.prototype.__dataToNotify;
+
+/** @type {Object} */
+Polymer_PropertyEffects.prototype.__dataLinkedPaths;
+
+/** @type {boolean} */
+Polymer_PropertyEffects.prototype.__dataHasPaths;
+
+/** @type {Object} */
+Polymer_PropertyEffects.prototype.__dataCompoundStorage;
+
+/** @type {Polymer_PropertyEffects} */
+Polymer_PropertyEffects.prototype.__dataHost;
+
+/** @type {!Object} */
+Polymer_PropertyEffects.prototype.__dataTemp;
+
+/** @type {boolean} */
+Polymer_PropertyEffects.prototype.__dataClientsInitialized;
+
+/** @type {!Object} */
+Polymer_PropertyEffects.prototype.__data;
+
+/** @type {!Object} */
+Polymer_PropertyEffects.prototype.__dataPending;
+
+/** @type {!Object} */
+Polymer_PropertyEffects.prototype.__dataOld;
+
+/** @type {Object} */
+Polymer_PropertyEffects.prototype.__computeEffects;
+
+/** @type {Object} */
+Polymer_PropertyEffects.prototype.__reflectEffects;
+
+/** @type {Object} */
+Polymer_PropertyEffects.prototype.__notifyEffects;
+
+/** @type {Object} */
+Polymer_PropertyEffects.prototype.__propagateEffects;
+
+/** @type {Object} */
+Polymer_PropertyEffects.prototype.__observeEffects;
+
+/** @type {Object} */
+Polymer_PropertyEffects.prototype.__readOnly;
+
+/** @type {!TemplateInfo} */
+Polymer_PropertyEffects.prototype.__templateInfo;
+
+/**
+* @override
+* @param {!HTMLTemplateElement} template Template to stamp
+* @return {!StampedTemplate}
+*/
+Polymer_PropertyEffects.prototype._stampTemplate = function(template){};
+/**
+* @override
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype.ready = function(){};
+/**
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._initializeProperties = function(){};
+/**
+* @override
+* @param {Object} props Properties to initialize on the instance
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._initializeInstanceProperties = function(props){};
+/**
+* @override
+* @param {string} property Name of the property
+* @param {*} value Value to set
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._setProperty = function(property, value){};
+/**
+* @override
+* @param {string} property Name of the property
+* @param {*} value Value to set
+* @param {boolean=} shouldNotify True if property should fire notification
+ event (applies only for `notify: true` properties)
+* @return {boolean}
+*/
+Polymer_PropertyEffects.prototype._setPendingProperty = function(property, value, shouldNotify){};
+/**
+* @override
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._invalidateProperties = function(){};
+/**
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._flushProperties = function(){};
+/**
+* @param {!Object} currentProps Bag of all current accessor values
+* @param {!Object} changedProps Bag of properties changed since the last
+ call to `_propertiesChanged`
+* @param {!Object} oldProps Bag of previous values for each property
+ in `changedProps`
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._propertiesChanged = function(currentProps, changedProps, oldProps){};
+/**
+* @override
+* @param {Object} props Properties to initialize on the prototype
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._initializeProtoProperties = function(props){};
+/**
+* @param {string} property Property that should trigger the effect
+* @param {string} type Effect type, from this.PROPERTY_EFFECT_TYPES
+* @param {Object=} effect Effect metadata object
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._addPropertyEffect = function(property, type, effect){};
+/**
+* @param {string} property Property the effect was associated with
+* @param {string} type Effect type, from this.PROPERTY_EFFECT_TYPES
+* @param {Object=} effect Effect metadata object to remove
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._removePropertyEffect = function(property, type, effect){};
+/**
+* @param {string} property Property name
+* @param {string=} type Effect type, from this.PROPERTY_EFFECT_TYPES
+* @return {boolean}
+*/
+Polymer_PropertyEffects.prototype._hasPropertyEffect = function(property, type){};
+/**
+* @param {string} property Property name
+* @return {boolean}
+*/
+Polymer_PropertyEffects.prototype._hasReadOnlyEffect = function(property){};
+/**
+* @param {string} property Property name
+* @return {boolean}
+*/
+Polymer_PropertyEffects.prototype._hasNotifyEffect = function(property){};
+/**
+* @param {string} property Property name
+* @return {boolean}
+*/
+Polymer_PropertyEffects.prototype._hasReflectEffect = function(property){};
+/**
+* @param {string} property Property name
+* @return {boolean}
+*/
+Polymer_PropertyEffects.prototype._hasComputedEffect = function(property){};
+/**
+* @param {(string | !Array.<(number | string)>)} path Path to set
+* @param {*} value Value to set
+* @param {boolean=} shouldNotify Set to true if this change should
+ cause a property notification event dispatch
+* @param {boolean=} isPathNotification If the path being set is a path
+ notification of an already changed value, as opposed to a request
+ to set and notify the change. In the latter `false` case, a dirty
+ check is performed and then the value is set to the path before
+ enqueuing the pending property change.
+* @return {boolean}
+*/
+Polymer_PropertyEffects.prototype._setPendingPropertyOrPath = function(path, value, shouldNotify, isPathNotification){};
+/**
+* @param {!Node} node The node to set a property on
+* @param {string} prop The property to set
+* @param {*} value The value to set
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._setUnmanagedPropertyToNode = function(node, prop, value){};
+/**
+* @param {Object} client PropertyEffects client to enqueue
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._enqueueClient = function(client){};
+/**
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._flushClients = function(){};
+/**
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._readyClients = function(){};
+/**
+* @param {Object} props Bag of one or more key-value pairs whose key is
+ a property and value is the new value to set for that property.
+* @param {boolean=} setReadOnly When true, any private values set in
+ `props` will be set. By default, `setProperties` will not set
+ `readOnly: true` root properties.
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype.setProperties = function(props, setReadOnly){};
+/**
+* @param {Object} changedProps Bag of changed properties
+* @param {Object} oldProps Bag of previous values for changed properties
+* @param {boolean} hasPaths True with `props` contains one or more paths
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._propagatePropertyChanges = function(changedProps, oldProps, hasPaths){};
+/**
+* @param {(string | !Array.<(string | number)>)} to Target path to link.
+* @param {(string | !Array.<(string | number)>)} from Source path to link.
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype.linkPaths = function(to, from){};
+/**
+* @param {(string | !Array.<(string | number)>)} path Target path to unlink.
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype.unlinkPaths = function(path){};
+/**
+* @param {string} path Path that should be notified.
+* @param {Array} splices Array of splice records indicating ordered
+ changes that occurred to the array. Each record should have the
+ following fields:
+ * index: index at which the change occurred
+ * removed: array of items that were removed from this index
+ * addedCount: number of new items added at this index
+ * object: a reference to the array in question
+ * type: the string literal 'splice'
+
+ Note that splice records _must_ be normalized such that they are
+ reported in index order (raw results from `Object.observe` are not
+ ordered and must be normalized/merged before notifying).
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype.notifySplices = function(path, splices){};
+/**
+* @param {(string | !Array.<(string | number)>)} path Path to the value
+ to read. The path may be specified as a string (e.g. `foo.bar.baz`)
+ or an array of path parts (e.g. `['foo.bar', 'baz']`). Note that
+ bracketed expressions are not supported; string-based path parts
+ *must* be separated by dots. Note that when dereferencing array
+ indices, the index may be used as a dotted part directly
+ (e.g. `users.12.name` or `['users', 12, 'name']`).
+* @param {Object=} root Root object from which the path is evaluated.
+* @return {*}
+*/
+Polymer_PropertyEffects.prototype.get = function(path, root){};
+/**
+* @param {(string | !Array.<(string | number)>)} path Path to the value
+ to write. The path may be specified as a string (e.g. `'foo.bar.baz'`)
+ or an array of path parts (e.g. `['foo.bar', 'baz']`). Note that
+ bracketed expressions are not supported; string-based path parts
+ *must* be separated by dots. Note that when dereferencing array
+ indices, the index may be used as a dotted part directly
+ (e.g. `'users.12.name'` or `['users', 12, 'name']`).
+* @param {*} value Value to set at the specified path.
+* @param {Object=} root Root object from which the path is evaluated.
+ When specified, no notification will occur.
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype.set = function(path, value, root){};
+/**
+* @param {(string | !Array.<(string | number)>)} path Path to array.
+* @param {...*} items Items to push onto array
+* @return {number}
+*/
+Polymer_PropertyEffects.prototype.push = function(path, items){};
+/**
+* @param {(string | !Array.<(string | number)>)} path Path to array.
+* @return {*}
+*/
+Polymer_PropertyEffects.prototype.pop = function(path){};
+/**
+* @param {(string | !Array.<(string | number)>)} path Path to array.
+* @param {number} start Index from which to start removing/inserting.
+* @param {number} deleteCount Number of items to remove.
+* @param {...*} items Items to insert into array.
+* @return {Array}
+*/
+Polymer_PropertyEffects.prototype.splice = function(path, start, deleteCount, items){};
+/**
+* @param {(string | !Array.<(string | number)>)} path Path to array.
+* @return {*}
+*/
+Polymer_PropertyEffects.prototype.shift = function(path){};
+/**
+* @param {(string | !Array.<(string | number)>)} path Path to array.
+* @param {...*} items Items to insert info array
+* @return {number}
+*/
+Polymer_PropertyEffects.prototype.unshift = function(path, items){};
+/**
+* @param {string} path Path that should be notified.
+* @param {*=} value Value at the path (optional).
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype.notifyPath = function(path, value){};
+/**
+* @param {string} property Property name
+* @param {boolean=} protectedSetter Creates a custom protected setter
+ when `true`.
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._createReadOnlyProperty = function(property, protectedSetter){};
+/**
+* @param {string} property Property name
+* @param {(string | function (*, *))} method Function or name of observer method to call
+* @param {boolean=} dynamicFn Whether the method name should be included as
+ a dependency to the effect.
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._createPropertyObserver = function(property, method, dynamicFn){};
+/**
+* @param {string} expression Method expression
+* @param {(boolean | Object)=} dynamicFn Boolean or object map indicating
+ whether method names should be included as a dependency to the effect.
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._createMethodObserver = function(expression, dynamicFn){};
+/**
+* @param {string} property Property name
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._createNotifyingProperty = function(property){};
+/**
+* @param {string} property Property name
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._createReflectedProperty = function(property){};
+/**
+* @param {string} property Name of computed property to set
+* @param {string} expression Method expression
+* @param {(boolean | Object)=} dynamicFn Boolean or object map indicating
+ whether method names should be included as a dependency to the effect.
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._createComputedProperty = function(property, expression, dynamicFn){};
+/**
+* @param {!HTMLTemplateElement} template Template containing binding
+ bindings
+* @param {boolean=} instanceBinding When false (default), performs
+ "prototypical" binding of the template and overwrites any previously
+ bound template for the class. When true (as passed from
+ `_stampTemplate`), the template info is instanced and linked into
+ the list of bound templates.
+* @return {!TemplateInfo}
+*/
+Polymer_PropertyEffects.prototype._bindTemplate = function(template, instanceBinding){};
+/**
+* @param {!StampedTemplate} dom DocumentFragment previously returned
+ from `_stampTemplate` associated with the nodes to be removed
+* @return {void}
+*/
+Polymer_PropertyEffects.prototype._removeBoundDom = function(dom){};
+/**
+* @override
+* @param {Node} node Node to parse
+* @param {TemplateInfo} templateInfo Template metadata for current template
+* @param {NodeInfo} nodeInfo Node metadata for current template node
+* @return {boolean}
+*/
+Polymer_PropertyEffects._parseTemplateNode = function(node, templateInfo, nodeInfo){};
+/**
+* @override
+* @param {Node} node Node to parse
+* @param {TemplateInfo} templateInfo Template metadata for current template
+* @param {NodeInfo} nodeInfo Node metadata for current template node
+* @return {boolean}
+*/
+Polymer_PropertyEffects._parseTemplateNestedTemplate = function(node, templateInfo, nodeInfo){};
+/**
+* @override
+* @param {Element} node Node to parse
+* @param {TemplateInfo} templateInfo Template metadata for current template
+* @param {NodeInfo} nodeInfo Node metadata for current template node
+* @param {string} name Attribute name
+* @param {string} value Attribute value
+* @return {boolean}
+*/
+Polymer_PropertyEffects._parseTemplateNodeAttribute = function(node, templateInfo, nodeInfo, name, value){};
+/**
+* @param {string} property Property that should trigger the effect
+* @param {string} type Effect type, from this.PROPERTY_EFFECT_TYPES
+* @param {Object=} effect Effect metadata object
+* @return {void}
+*/
+Polymer_PropertyEffects.addPropertyEffect = function(property, type, effect){};
+/**
+* @param {string} property Property name
+* @param {(string | function (*, *))} method Function or name of observer method to call
+* @param {boolean=} dynamicFn Whether the method name should be included as
+ a dependency to the effect.
+* @return {void}
+*/
+Polymer_PropertyEffects.createPropertyObserver = function(property, method, dynamicFn){};
+/**
+* @param {string} expression Method expression
+* @param {(boolean | Object)=} dynamicFn Boolean or object map indicating
+* @return {void}
+*/
+Polymer_PropertyEffects.createMethodObserver = function(expression, dynamicFn){};
+/**
+* @param {string} property Property name
+* @return {void}
+*/
+Polymer_PropertyEffects.createNotifyingProperty = function(property){};
+/**
+* @param {string} property Property name
+* @param {boolean=} protectedSetter Creates a custom protected setter
+ when `true`.
+* @return {void}
+*/
+Polymer_PropertyEffects.createReadOnlyProperty = function(property, protectedSetter){};
+/**
+* @param {string} property Property name
+* @return {void}
+*/
+Polymer_PropertyEffects.createReflectedProperty = function(property){};
+/**
+* @param {string} property Name of computed property to set
+* @param {string} expression Method expression
+* @param {(boolean | Object)=} dynamicFn Boolean or object map indicating whether
+ method names should be included as a dependency to the effect.
+* @return {void}
+*/
+Polymer_PropertyEffects.createComputedProperty = function(property, expression, dynamicFn){};
+/**
+* @param {!HTMLTemplateElement} template Template containing binding
+ bindings
+* @return {!TemplateInfo}
+*/
+Polymer_PropertyEffects.bindTemplate = function(template){};
+/**
+* @param {Object} templateInfo Template metadata to add effect to
+* @param {string} prop Property that should trigger the effect
+* @param {Object=} effect Effect metadata object
+* @return {void}
+*/
+Polymer_PropertyEffects._addTemplatePropertyEffect = function(templateInfo, prop, effect){};
+/**
+* @param {string} text Text to parse from attribute or textContent
+* @param {Object} templateInfo Current template metadata
+* @return {Array.<!BindingPart>}
+*/
+Polymer_PropertyEffects._parseBindings = function(text, templateInfo){};
+/**
+* @param {this} inst Element that should be used as scope for
+ binding dependencies
+* @param {BindingPart} part Binding part metadata
+* @param {string} path Property/path that triggered this effect
+* @param {Object} props Bag of current property changes
+* @param {Object} oldProps Bag of previous values for changed properties
+* @param {boolean} hasPaths True with `props` contains one or more paths
+* @return {*}
+*/
+Polymer_PropertyEffects._evaluateBinding = function(inst, part, path, props, oldProps, hasPaths){};
+/**
+* @interface
+* @extends {Polymer_PropertiesChanged}
+*/
+function Polymer_PropertiesMixin(){}
+/**
+* @override
+* @return {void}
+*/
+Polymer_PropertiesMixin.prototype._initializeProperties = function(){};
+/**
+* @return {void}
+*/
+Polymer_PropertiesMixin.prototype.connectedCallback = function(){};
+/**
+* @return {void}
+*/
+Polymer_PropertiesMixin.prototype.disconnectedCallback = function(){};
+/**
+* @param {string} name Name of property
+* @return {*}
+*/
+Polymer_PropertiesMixin.typeForProperty = function(name){};
+/**
+* @return {void}
+*/
+Polymer_PropertiesMixin.finalize = function(){};
+/**
+* @return {undefined}
+*/
+Polymer_PropertiesMixin._finalizeClass = function(){};
+/**
+* @interface
+* @extends {Polymer_PropertyEffects}
+* @extends {Polymer_PropertiesMixin}
+*/
+function Polymer_ElementMixin(){}
+/** @type {HTMLTemplateElement} */
+Polymer_ElementMixin.prototype._template;
+
+/** @type {string} */
+Polymer_ElementMixin.prototype._importPath;
+
+/** @type {string} */
+Polymer_ElementMixin.prototype.rootPath;
+
+/** @type {string} */
+Polymer_ElementMixin.prototype.importPath;
+
+/** @type {(StampedTemplate | HTMLElement | ShadowRoot)} */
+Polymer_ElementMixin.prototype.root;
+
+/** @type {!Object.<string, !Element>} */
+Polymer_ElementMixin.prototype.$;
+
+/**
+* @override
+* @return {void}
+*/
+Polymer_ElementMixin.prototype.ready = function(){};
+/**
+* @override
+* @return {void}
+*/
+Polymer_ElementMixin.prototype._initializeProperties = function(){};
+/**
+* @override
+* @return {void}
+*/
+Polymer_ElementMixin.prototype._readyClients = function(){};
+/**
+* @return {void}
+*/
+Polymer_ElementMixin.prototype.connectedCallback = function(){};
+/**
+* @param {StampedTemplate} dom to attach to the element.
+* @return {ShadowRoot}
+*/
+Polymer_ElementMixin.prototype._attachDom = function(dom){};
+/**
+* @param {Object=} properties Bag of custom property key/values to
+ apply to this element.
+* @return {void}
+*/
+Polymer_ElementMixin.prototype.updateStyles = function(properties){};
+/**
+* @param {string} url URL to resolve.
+* @param {string=} base Optional base URL to resolve against, defaults
+to the element's `importPath`
+* @return {string}
+*/
+Polymer_ElementMixin.prototype.resolveUrl = function(url, base){};
+/**
+* @override
+*/
+Polymer_ElementMixin._parseTemplateContent = function(template, templateInfo, nodeInfo){};
+/**
+* @override
+* @return {void}
+*/
+Polymer_ElementMixin.createProperties = function(props){};
+/**
+* @override
+* @return {void}
+*/
+Polymer_ElementMixin._finalizeClass = function(){};
+/**
+* @param {Object} observers Array of observer descriptors for
+ this class
+* @param {Object} dynamicFns Object containing keys for any properties
+ that are functions and should trigger the effect when the function
+ reference is changed
+* @return {void}
+*/
+Polymer_ElementMixin.createObservers = function(observers, dynamicFns){};
+/**
+* @param {string} cssText Text containing styling to process
+* @param {string} baseURI Base URI to rebase CSS paths against
+* @return {string}
+*/
+Polymer_ElementMixin._processStyleText = function(cssText, baseURI){};
+/**
+* @param {string} is Tag name (or type extension name) for this element
+* @return {void}
+*/
+Polymer_ElementMixin._finalizeTemplate = function(is){};
+/**
+* @interface
+*/
+function Polymer_GestureEventListeners(){}
+/**
+* @param {!Node} node Node to add event listener to
+* @param {string} eventName Name of event
+* @param {function (!Event): void} handler Listener function to add
+* @return {void}
+*/
+Polymer_GestureEventListeners.prototype._addEventListenerToNode = function(node, eventName, handler){};
+/**
+* @param {!Node} node Node to remove event listener from
+* @param {string} eventName Name of event
+* @param {function (!Event): void} handler Listener function to remove
+* @return {void}
+*/
+Polymer_GestureEventListeners.prototype._removeEventListenerFromNode = function(node, eventName, handler){};
+/**
+* @interface
+* @extends {Polymer_PropertyAccessors}
+*/
+function Polymer_DirMixin(){}
+/** @type {boolean} */
+Polymer_DirMixin.prototype.__autoDirOptOut;
+
+/**
+* @return {void}
+*/
+Polymer_DirMixin.prototype.ready = function(){};
+/**
+* @return {void}
+*/
+Polymer_DirMixin.prototype.connectedCallback = function(){};
+/**
+* @return {void}
+*/
+Polymer_DirMixin.prototype.disconnectedCallback = function(){};
+/**
+* @override
+*/
+Polymer_DirMixin._processStyleText = function(cssText, baseURI){};
+/**
+* @param {string} text CSS text to replace DIR
+* @return {string}
+*/
+Polymer_DirMixin._replaceDirInCssText = function(text){};
+/**
+* @interface
+* @extends {Polymer_ElementMixin}
+* @extends {Polymer_GestureEventListeners}
+*/
+function Polymer_LegacyElementMixin(){}
+/** @type {boolean} */
+Polymer_LegacyElementMixin.prototype.isAttached;
+
+/** @type {WeakMap.<!Element, !Object.<string, !Function>>} */
+Polymer_LegacyElementMixin.prototype.__boundListeners;
+
+/** @type {Object.<string, Function>} */
+Polymer_LegacyElementMixin.prototype._debouncers;
+
+/**
+* @override
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.ready = function(){};
+/**
+* @override
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype._initializeProperties = function(){};
+/**
+* @override
+* @param {string} name Name of attribute.
+* @param {?string} old Old value of attribute.
+* @param {?string} value Current value of attribute.
+* @param {?string} namespace Attribute namespace.
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.attributeChangedCallback = function(name, old, value, namespace){};
+/**
+* @override
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.connectedCallback = function(){};
+/**
+* @override
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.disconnectedCallback = function(){};
+/**
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.created = function(){};
+/**
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.attached = function(){};
+/**
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.detached = function(){};
+/**
+* @param {string} name Name of attribute.
+* @param {?string} old Old value of attribute.
+* @param {?string} value Current value of attribute.
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.attributeChanged = function(name, old, value){};
+/**
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype._registered = function(){};
+/**
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype._ensureAttributes = function(){};
+/**
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype._applyListeners = function(){};
+/**
+* @param {*} value Value to deserialize
+* @return {(string | undefined)}
+*/
+Polymer_LegacyElementMixin.prototype.serialize = function(value){};
+/**
+* @param {string} value String to deserialize
+* @param {*} type Type to deserialize the string to
+* @return {*}
+*/
+Polymer_LegacyElementMixin.prototype.deserialize = function(value, type){};
+/**
+* @param {string} property Property name to reflect.
+* @param {string=} attribute Attribute name to reflect.
+* @param {*=} value Property value to reflect.
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.reflectPropertyToAttribute = function(property, attribute, value){};
+/**
+* @param {*} value Value to serialize.
+* @param {string} attribute Attribute name to serialize to.
+* @param {Element} node Element to set attribute to.
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.serializeValueToAttribute = function(value, attribute, node){};
+/**
+* @param {Object} prototype Target object to copy properties to.
+* @param {Object} api Source object to copy properties from.
+* @return {Object}
+*/
+Polymer_LegacyElementMixin.prototype.extend = function(prototype, api){};
+/**
+* @param {!Object} target Target object to copy properties to.
+* @param {!Object} source Source object to copy properties from.
+* @return {!Object}
+*/
+Polymer_LegacyElementMixin.prototype.mixin = function(target, source){};
+/**
+* @param {Object} object The object on which to set the prototype.
+* @param {Object} prototype The prototype that will be set on the given
+`object`.
+* @return {Object}
+*/
+Polymer_LegacyElementMixin.prototype.chainObject = function(object, prototype){};
+/**
+* @param {HTMLTemplateElement} template HTML template element to instance.
+* @return {!DocumentFragment}
+*/
+Polymer_LegacyElementMixin.prototype.instanceTemplate = function(template){};
+/**
+* @param {string} type Name of event type.
+* @param {*=} detail Detail value containing event-specific
+ payload.
+* @param {{bubbles: (boolean | undefined), cancelable: (boolean | undefined), composed: (boolean | undefined)}=} options Object specifying options. These may include:
+ `bubbles` (boolean, defaults to `true`),
+ `cancelable` (boolean, defaults to false), and
+ `node` on which to fire the event (HTMLElement, defaults to `this`).
+* @return {!Event}
+*/
+Polymer_LegacyElementMixin.prototype.fire = function(type, detail, options){};
+/**
+* @param {Element} node Element to add event listener to.
+* @param {string} eventName Name of event to listen for.
+* @param {string} methodName Name of handler method on `this` to call.
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.listen = function(node, eventName, methodName){};
+/**
+* @param {Element} node Element to remove event listener from.
+* @param {string} eventName Name of event to stop listening to.
+* @param {string} methodName Name of handler method on `this` to not call
+ anymore.
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.unlisten = function(node, eventName, methodName){};
+/**
+* @param {string=} direction Direction to allow scrolling
+Defaults to `all`.
+* @param {Element=} node Element to apply scroll direction setting.
+Defaults to `this`.
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.setScrollDirection = function(direction, node){};
+/**
+* @param {string} slctr Selector to run on this local DOM scope
+* @return {Element}
+*/
+Polymer_LegacyElementMixin.prototype.$$ = function(slctr){};
+/**
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.distributeContent = function(){};
+/**
+* @return {!Array.<!Node>}
+*/
+Polymer_LegacyElementMixin.prototype.getEffectiveChildNodes = function(){};
+/**
+* @param {string} selector Selector to run.
+* @return {!Array.<!Node>}
+*/
+Polymer_LegacyElementMixin.prototype.queryDistributedElements = function(selector){};
+/**
+* @return {!Array.<!Node>}
+*/
+Polymer_LegacyElementMixin.prototype.getEffectiveChildren = function(){};
+/**
+* @return {string}
+*/
+Polymer_LegacyElementMixin.prototype.getEffectiveTextContent = function(){};
+/**
+* @param {string} selector Selector to run.
+* @return {Node}
+*/
+Polymer_LegacyElementMixin.prototype.queryEffectiveChildren = function(selector){};
+/**
+* @param {string} selector Selector to run.
+* @return {!Array.<!Node>}
+*/
+Polymer_LegacyElementMixin.prototype.queryAllEffectiveChildren = function(selector){};
+/**
+* @param {string=} slctr CSS selector to choose the desired
+ `<slot>`. Defaults to `content`.
+* @return {!Array.<!Node>}
+*/
+Polymer_LegacyElementMixin.prototype.getContentChildNodes = function(slctr){};
+/**
+* @param {string=} slctr CSS selector to choose the desired
+ `<content>`. Defaults to `content`.
+* @return {!Array.<!HTMLElement>}
+*/
+Polymer_LegacyElementMixin.prototype.getContentChildren = function(slctr){};
+/**
+* @param {?Node} node The element to be checked.
+* @return {boolean}
+*/
+Polymer_LegacyElementMixin.prototype.isLightDescendant = function(node){};
+/**
+* @param {!Element} node The element to be checked.
+* @return {boolean}
+*/
+Polymer_LegacyElementMixin.prototype.isLocalDescendant = function(node){};
+/**
+* @param {*} container Unused
+* @param {*} shouldObserve Unused
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.scopeSubtree = function(container, shouldObserve){};
+/**
+* @param {string} property The css property name.
+* @return {string}
+*/
+Polymer_LegacyElementMixin.prototype.getComputedStyleValue = function(property){};
+/**
+* @param {string} jobName String to identify the debounce job.
+* @param {function (): void} callback Function that is called (with `this`
+ context) when the wait time elapses.
+* @param {number} wait Optional wait time in milliseconds (ms) after the
+ last signal that must elapse before invoking `callback`
+* @return {!Object}
+*/
+Polymer_LegacyElementMixin.prototype.debounce = function(jobName, callback, wait){};
+/**
+* @param {string} jobName The name of the debouncer started with `debounce`
+* @return {boolean}
+*/
+Polymer_LegacyElementMixin.prototype.isDebouncerActive = function(jobName){};
+/**
+* @param {string} jobName The name of the debouncer started with `debounce`
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.flushDebouncer = function(jobName){};
+/**
+* @param {string} jobName The name of the debouncer started with `debounce`
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.cancelDebouncer = function(jobName){};
+/**
+* @param {!Function} callback The callback function to run, bound to `this`.
+* @param {number=} waitTime Time to wait before calling the
+ `callback`. If unspecified or 0, the callback will be run at microtask
+ timing (before paint).
+* @return {number}
+*/
+Polymer_LegacyElementMixin.prototype.async = function(callback, waitTime){};
+/**
+* @param {number} handle Handle returned from original `async` call to
+ cancel.
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.cancelAsync = function(handle){};
+/**
+* @param {string} tag HTML element tag to create.
+* @param {Object=} props Object of properties to configure on the
+ instance.
+* @return {!Element}
+*/
+Polymer_LegacyElementMixin.prototype.create = function(tag, props){};
+/**
+* @param {string} href URL to document to load.
+* @param {?function (!Event): void=} onload Callback to notify when an import successfully
+ loaded.
+* @param {?function (!ErrorEvent): void=} onerror Callback to notify when an import
+ unsuccessfully loaded.
+* @param {boolean=} optAsync True if the import should be loaded `async`.
+ Defaults to `false`.
+* @return {!HTMLLinkElement}
+*/
+Polymer_LegacyElementMixin.prototype.importHref = function(href, onload, onerror, optAsync){};
+/**
+* @param {string} selector Selector to test.
+* @param {!Element=} node Element to test the selector against.
+* @return {boolean}
+*/
+Polymer_LegacyElementMixin.prototype.elementMatches = function(selector, node){};
+/**
+* @param {string} name HTML attribute name
+* @param {boolean=} bool Boolean to force the attribute on or off.
+ When unspecified, the state of the attribute will be reversed.
+* @param {Element=} node Node to target. Defaults to `this`.
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.toggleAttribute = function(name, bool, node){};
+/**
+* @param {string} name CSS class name
+* @param {boolean=} bool Boolean to force the class on or off.
+ When unspecified, the state of the class will be reversed.
+* @param {Element=} node Node to target. Defaults to `this`.
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.toggleClass = function(name, bool, node){};
+/**
+* @param {string} transformText Transform setting.
+* @param {Element=} node Element to apply the transform to.
+Defaults to `this`
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.transform = function(transformText, node){};
+/**
+* @param {number} x X offset.
+* @param {number} y Y offset.
+* @param {number} z Z offset.
+* @param {Element=} node Element to apply the transform to.
+Defaults to `this`.
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype.translate3d = function(x, y, z, node){};
+/**
+* @param {(string | !Array.<(number | string)>)} arrayOrPath Path to array from which to remove the item
+ (or the array itself).
+* @param {*} item Item to remove.
+* @return {Array}
+*/
+Polymer_LegacyElementMixin.prototype.arrayDelete = function(arrayOrPath, item){};
+/**
+* @param {string} level One of 'log', 'warn', 'error'
+* @param {Array} args Array of strings or objects to log
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype._logger = function(level, args){};
+/**
+* @param {...*} args Array of strings or objects to log
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype._log = function(args){};
+/**
+* @param {...*} args Array of strings or objects to log
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype._warn = function(args){};
+/**
+* @param {...*} args Array of strings or objects to log
+* @return {void}
+*/
+Polymer_LegacyElementMixin.prototype._error = function(args){};
+/**
+* @param {string} methodName Method name to associate with message
+* @param {...*} args Array of strings or objects to log
+* @return {Array}
+*/
+Polymer_LegacyElementMixin.prototype._logf = function(methodName, args){};
+/**
+* @interface
+*/
+function Polymer_MutableData(){}
+/**
+* @param {string} property Property name
+* @param {*} value New property value
+* @param {*} old Previous property value
+* @return {boolean}
+*/
+Polymer_MutableData.prototype._shouldPropertyChange = function(property, value, old){};
+/**
+* @interface
+*/
+function Polymer_OptionalMutableData(){}
+/** @type {boolean} */
+Polymer_OptionalMutableData.prototype.mutableData;
+
+/**
+* @param {string} property Property name
+* @param {*} value New property value
+* @param {*} old Previous property value
+* @return {boolean}
+*/
+Polymer_OptionalMutableData.prototype._shouldPropertyChange = function(property, value, old){};
+/**
+* @interface
+* @extends {Polymer_ElementMixin}
+*/
+function Polymer_ArraySelectorMixin(){}
+/** @type {Array} */
+Polymer_ArraySelectorMixin.prototype.items;
+
+/** @type {boolean} */
+Polymer_ArraySelectorMixin.prototype.multi;
+
+/** @type {?(Object | Array.<!Object>)} */
+Polymer_ArraySelectorMixin.prototype.selected;
+
+/** @type {?Object} */
+Polymer_ArraySelectorMixin.prototype.selectedItem;
+
+/** @type {boolean} */
+Polymer_ArraySelectorMixin.prototype.toggle;
+
+/**
+* @return {void}
+*/
+Polymer_ArraySelectorMixin.prototype.clearSelection = function(){};
+/**
+* @param {*} item Item from `items` array to test
+* @return {boolean}
+*/
+Polymer_ArraySelectorMixin.prototype.isSelected = function(item){};
+/**
+* @param {number} idx Index from `items` array to test
+* @return {boolean}
+*/
+Polymer_ArraySelectorMixin.prototype.isIndexSelected = function(idx){};
+/**
+* @param {*} item Item from `items` array to deselect
+* @return {void}
+*/
+Polymer_ArraySelectorMixin.prototype.deselect = function(item){};
+/**
+* @param {number} idx Index from `items` array to deselect
+* @return {void}
+*/
+Polymer_ArraySelectorMixin.prototype.deselectIndex = function(idx){};
+/**
+* @param {*} item Item from `items` array to select
+* @return {void}
+*/
+Polymer_ArraySelectorMixin.prototype.select = function(item){};
+/**
+* @param {number} idx Index from `items` array to select
+* @return {void}
+*/
+Polymer_ArraySelectorMixin.prototype.selectIndex = function(idx){};
+/**
+* @interface
+* @extends {Polymer_PropertyEffects}
+*/
+function Polymer_StrictBindingParser(){}
+/**
+* @param {string} text Text to parse from attribute or textContent
+* @param {Object} templateInfo Current template metadata
+* @return {Array.<!BindingPart>}
+*/
+Polymer_StrictBindingParser._parseBindings = function(text, templateInfo){};
+/**
+* @interface
+* @extends {Polymer_ElementMixin}
+*/
+function Polymer_DisableUpgradeMixin(){}
+/**
+* @override
+*/
+Polymer_DisableUpgradeMixin.prototype._initializeProperties = function(){};
+/**
+* @override
+*/
+Polymer_DisableUpgradeMixin.prototype._enableProperties = function(){};
+/**
+* @override
+*/
+Polymer_DisableUpgradeMixin.prototype.attributeChangedCallback = function(name, old, value, namespace){};
+/**
+* @override
+*/
+Polymer_DisableUpgradeMixin.prototype.connectedCallback = function(){};
+/**
+* @override
+*/
+Polymer_DisableUpgradeMixin.prototype.disconnectedCallback = function(){};
\ No newline at end of file
diff --git a/third_party/polymer3/bower_components/polymer/externs/polymer-externs.js b/third_party/polymer3/bower_components/polymer/externs/polymer-externs.js
new file mode 100644
index 0000000..0a86620
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/externs/polymer-externs.js
@@ -0,0 +1,112 @@
+/**
+ * @fileoverview Externs for Polymer Pass and external Polymer API
+ * @externs
+ *
+ * @license
+ * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ */
+
+/* eslint-disable */
+
+/**
+ * @typedef {{
+ * type: !Function,
+ * value: *,
+ * readOnly: (boolean | undefined),
+ * computed: (string | undefined),
+ * reflectToAttribute: (boolean | undefined),
+ * notify: (boolean | undefined),
+ * observer: (string | function(*,*) | undefined)
+ * }}
+ */
+let PolymerElementPropertiesMeta;
+
+/**
+ * @typedef {Object<string, !PolymerElementPropertiesMeta>}
+ */
+let PolymerElementProperties;
+
+let PolymerInit = function(){};
+/** @type {string} */
+PolymerInit.prototype.is;
+/** @type {(string | undefined)} */
+PolymerInit.prototype.extends;
+/** @type {(!PolymerElementProperties | undefined)} */
+PolymerInit.prototype.properties;
+/** @type {(!Array<string> | undefined)} */
+PolymerInit.prototype.observers;
+/** @type {(!HTMLTemplateElement | string | undefined)} */
+PolymerInit.prototype.template;
+/** @type {(!Object<string, *> | undefined)} */
+PolymerInit.prototype.hostAttributes;
+/** @type {(!Object<string, string> | undefined)} */
+PolymerInit.prototype.listeners;
+
+let PolymerElementConstructor = function (){};
+/** @type {(string | undefined)} */
+PolymerElementConstructor.is;
+/** @type {(string | undefined)} */
+PolymerElementConstructor.extends;
+/** @type {(!PolymerElementProperties | undefined)} */
+PolymerElementConstructor.properties;
+/** @type {(!Array<string> | undefined)} */
+PolymerElementConstructor.observers;
+/** @type {(!HTMLTemplateElement | string | undefined)} */
+PolymerElementConstructor.template;
+
+let PropertiesMixinConstructor = function (){};
+/** @type {(!PolymerElementProperties | undefined)} */
+PropertiesMixinConstructor.properties;
+
+/**
+ * @param {!PolymerInit} init
+ * @return {!function(new:HTMLElement)}
+ */
+function Polymer(init){}
+
+/** @type {PolymerElementProperties} */
+Polymer.ElementProperties;
+
+/**
+ * @type {(function(*,string,string,Node):*)|undefined}
+ */
+Polymer.sanitizeDOMValue;
+
+/**
+ * @param {string} string
+ * @param {Object} obj
+ * @return {string}
+ */
+function JSCompiler_renameProperty(string, obj) {}
+
+/** @record */
+function PolymerTelemetry(){}
+/** @type {number} */
+PolymerTelemetry.instanceCount;
+/** @type {Array<HTMLElement>} */
+PolymerTelemetry.registrations;
+/** @type {function(HTMLElement)} */
+PolymerTelemetry._regLog;
+/** @type {function(HTMLElement)} */
+PolymerTelemetry.register;
+/** @type {function(HTMLElement)} */
+PolymerTelemetry.dumpRegistrations;;
+
+/** @type {PolymerTelemetry} */
+Polymer.telemetry;
+
+/** @type {string} */
+Polymer.version;
+
+// nb. This is explicitly 'var', as Closure Compiler checks that this is the case.
+/**
+ * @constructor
+ * @extends {HTMLElement}
+ * @implements {Polymer_LegacyElementMixin}
+ */
+var PolymerElement = Polymer.LegacyElementMixin();
diff --git a/third_party/polymer3/bower_components/polymer/externs/polymer-internal-shared-types.js b/third_party/polymer3/bower_components/polymer/externs/polymer-internal-shared-types.js
new file mode 100644
index 0000000..274f603
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/externs/polymer-internal-shared-types.js
@@ -0,0 +1,165 @@
+/**
+ * @fileoverview Internal shared types for Polymer
+ *
+ * @license
+ * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ */
+
+/* eslint-disable no-unused-vars, strict, valid-jsdoc */
+
+/**
+ * @constructor
+ * @extends {DocumentFragment}
+ */
+function StampedTemplate() { }
+/** @type {boolean} */
+StampedTemplate.prototype.__noInsertionPoint;
+/** @type {!Array<!Node>} */
+StampedTemplate.prototype.nodeList;
+/** @type {!Object<string, !Element>} */
+StampedTemplate.prototype.$;
+/** @type {!TemplateInfo | undefined} */
+StampedTemplate.prototype.templateInfo;
+
+/** @interface */
+function NodeInfo() { }
+/** @type {string} */
+NodeInfo.prototype.id;
+/** @type {!Array<{name: string, value: string}>}*/
+NodeInfo.prototype.events;
+/** @type {boolean} */
+NodeInfo.prototype.hasInsertionPoint;
+/** @type {!TemplateInfo} */
+NodeInfo.prototype.templateInfo;
+/** @type {!NodeInfo} */
+NodeInfo.prototype.parentInfo;
+/** @type {number} */
+NodeInfo.prototype.parentIndex;
+/** @type {number} */
+NodeInfo.prototype.infoIndex;
+/** @type {!Array<!Binding>} */
+NodeInfo.prototype.bindings;
+
+/** @interface */
+function TemplateInfo() { }
+/** @type {!Array<!NodeInfo>} */
+TemplateInfo.prototype.nodeInfoList;
+/** @type {!Array<!Node>} */
+TemplateInfo.prototype.nodeList;
+/** @type {boolean} */
+TemplateInfo.prototype.stripWhitespace;
+/** @type {boolean | undefined} */
+TemplateInfo.prototype.hasInsertionPoint;
+/** @type {!Object} */
+TemplateInfo.prototype.hostProps;
+/** @type {!Object} */
+TemplateInfo.prototype.propertyEffects;
+/** @type {TemplateInfo | undefined} */
+TemplateInfo.prototype.nextTemplateInfo;
+/** @type {TemplateInfo | undefined} */
+TemplateInfo.prototype.previousTemplateInfo;
+/** @type {!Array<!Node>} */
+TemplateInfo.prototype.childNodes;
+/** @type {boolean} */
+TemplateInfo.prototype.wasPreBound;
+
+/**
+ * type for HTMLTemplateElement with `_templateInfo`
+ *
+ * @constructor
+ * @extends {HTMLTemplateElement}
+ */
+function HTMLTemplateElementWithInfo() { }
+/** @type {TemplateInfo} */
+HTMLTemplateElementWithInfo.prototype._templateInfo;
+
+/**
+ * @typedef {{
+ * literal: string,
+ * compoundIndex: (number | undefined)
+ * }}
+ */
+let LiteralBindingPart;
+
+/**
+ * @typedef {{
+ * literal: boolean,
+ * name: string,
+ * value: (string | number),
+ * rootProperty: (string | undefined),
+ * structured: (boolean | undefined),
+ * wildcard: (boolean | undefined)
+ * }}
+ */
+let MethodArg;
+
+/**
+ * @typedef {{
+ * methodName: string,
+ * static: boolean,
+ * args: !Array<!MethodArg>,
+ * dynamicFn: (boolean | undefined),
+ * }}
+ */
+let MethodSignature;
+
+/**
+ * @typedef {{
+ * mode: string,
+ * negate: boolean,
+ * source: string,
+ * dependencies: !Array<(!MethodArg|string)>,
+ * customEvent: boolean,
+ * signature: Object,
+ * event: string
+ * }}
+ */
+let ExpressionBindingPart;
+
+/**
+ * @typedef {LiteralBindingPart | ExpressionBindingPart}
+ */
+let BindingPart;
+
+/**
+ * @typedef {{
+ * kind: string,
+ * target: string,
+ * parts: Array<!BindingPart>,
+ * literal: (string | undefined),
+ * isCompound: boolean,
+ * listenerEvent: (string | undefined),
+ * listenerNegate: (boolean | undefined)
+ * }}
+ */
+let Binding;
+
+/**
+ * @typedef {{
+ * path: string
+ * }}
+ */
+let PathInfo;
+
+/**
+ * @typedef {{
+ * forwardHostProp: (function(string, *) | undefined),
+ * instanceProps: (Object | undefined),
+ * mutableData: (boolean | undefined),
+ * notifyInstanceProp: (function(*, string, *) | undefined),
+ * parentModel: (boolean | undefined)
+ * }}
+ */
+let TemplatizeOptions;
+
+/** @record */
+function AsyncInterface(){}
+/** @type {function(!Function, number=): number} */
+AsyncInterface.prototype.run;
+/** @type {function(number): void} */
+AsyncInterface.prototype.cancel;
diff --git a/third_party/polymer3/bower_components/polymer/externs/polymer-internal-types.html b/third_party/polymer3/bower_components/polymer/externs/polymer-internal-types.html
new file mode 100644
index 0000000..bc7abad
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/externs/polymer-internal-types.html
@@ -0,0 +1,11 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<!-- internal shared types for closure pass -->
+<script src="polymer-internal-shared-types.js"></script>
\ No newline at end of file
diff --git a/third_party/polymer3/bower_components/polymer/externs/webcomponents-externs.js b/third_party/polymer3/bower_components/polymer/externs/webcomponents-externs.js
new file mode 100644
index 0000000..8bcf4ce
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/externs/webcomponents-externs.js
@@ -0,0 +1,64 @@
+/**
+ * @fileoverview Externs for webcomponents polyfills
+ * @externs
+ *
+ * @license
+ * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ */
+/* eslint-disable */
+
+let HTMLImports = {
+ /**
+ * @param {function()} callback
+ */
+ whenReady(callback){},
+ /**
+ * @param {Element} element
+ * @returns {Document} document
+ */
+ importForElement(element){}
+};
+
+window.HTMLImports = HTMLImports;
+
+let ShadyDOM = {
+ inUse: false,
+ flush(){},
+ /**
+ * @param {!Node} target
+ * @param {function(Array<MutationRecord>, MutationObserver)} callback
+ * @return {MutationObserver}
+ */
+ observeChildren(target, callback){},
+ /**
+ * @param {MutationObserver} observer
+ */
+ unobserveChildren(observer){},
+ /**
+ * @param {Node} node
+ */
+ patch(node){}
+};
+
+window.ShadyDOM = ShadyDOM;
+
+let WebComponents = {};
+window.WebComponents = WebComponents;
+
+/** @type {Element} */
+HTMLElement.prototype._activeElement;
+
+/**
+ * @param {HTMLTemplateElement} template
+ */
+HTMLTemplateElement.decorate = function(template){};
+
+/**
+ * @param {function(function())} cb callback
+ */
+CustomElementRegistry.prototype.polyfillWrapFlushCallback = function(cb){};
diff --git a/third_party/polymer3/bower_components/polymer/gen-tsd.json b/third_party/polymer3/bower_components/polymer/gen-tsd.json
new file mode 100644
index 0000000..3d3a5e7
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/gen-tsd.json
@@ -0,0 +1,23 @@
+{
+ "excludeFiles": [
+ "dist/**",
+ "externs/**",
+ "gulpfile.js",
+ "test/**",
+ "util/**",
+ "index.html"
+ ],
+ "removeReferences": [
+ "../shadycss/apply-shim.d.ts",
+ "../shadycss/custom-style-interface.d.ts"
+ ],
+ "addReferences": {
+ "lib/utils/boot.d.ts": [
+ "extra-types.d.ts"
+ ]
+ },
+ "renameTypes": {
+ "Polymer_PropertyEffects": "Polymer.PropertyEffects",
+ "Element": "_Element"
+ }
+}
diff --git a/third_party/polymer3/bower_components/polymer/gulpfile.js b/third_party/polymer3/bower_components/polymer/gulpfile.js
new file mode 100644
index 0000000..dfc982e
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/gulpfile.js
@@ -0,0 +1,287 @@
+/**
+ * @license
+ * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ */
+
+/* eslint-env node */
+'use strict';
+
+const gulp = require('gulp');
+const gulpif = require('gulp-if');
+const runseq = require('run-sequence');
+const del = require('del');
+const eslint = require('gulp-eslint');
+const fs = require('fs-extra');
+const path = require('path');
+const mergeStream = require('merge-stream');
+const babel = require('gulp-babel');
+const size = require('gulp-size');
+const lazypipe = require('lazypipe');
+const closure = require('google-closure-compiler').gulp();
+const minimalDocument = require('./util/minimalDocument.js');
+const dom5 = require('dom5/lib/index-next');
+const parse5 = require('parse5');
+const replace = require('gulp-replace');
+
+const DIST_DIR = 'dist';
+const BUNDLED_DIR = path.join(DIST_DIR, 'bundled');
+const COMPILED_DIR = path.join(DIST_DIR, 'compiled');
+const POLYMER_LEGACY = 'polymer.html';
+const POLYMER_ELEMENT = 'polymer-element.html';
+
+const {PolymerProject, HtmlSplitter} = require('polymer-build');
+
+const {Transform} = require('stream');
+
+class BackfillStream extends Transform {
+ constructor(fileList) {
+ super({objectMode: true});
+ this.fileList = fileList;
+ }
+ _transform(file, enc, cb) {
+ if (this.fileList) {
+ const origFile = this.fileList.shift();
+ // console.log(`rename ${file.path} -> ${origFile.path}`)
+ file.path = origFile.path;
+ }
+ cb(null, file);
+ }
+ _flush(cb) {
+ if (this.fileList && this.fileList.length > 0) {
+ this.fileList.forEach((oldFile) => {
+ // console.log(`pumping fake file ${oldFile.path}`)
+ let newFile = oldFile.clone({deep: true, contents: false});
+ newFile.contents = new Buffer('');
+ this.push(newFile);
+ });
+ }
+ cb();
+ }
+}
+
+let CLOSURE_LINT_ONLY = false;
+
+let firstImportFinder = dom5.predicates.AND(
+ dom5.predicates.hasTagName('link'), dom5.predicates.hasAttrValue('rel', 'import')
+);
+
+const header =
+`/**
+ * @fileoverview Generated typings for Polymer mixins
+ * @externs
+ *
+ * @license
+ * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ */
+/* eslint-disable */
+`;
+
+class AddClosureTypeImport extends Transform {
+ constructor(entryFileName, typeFileName) {
+ super({objectMode: true});
+ this.target = path.resolve(entryFileName);
+ this.importPath = path.resolve(typeFileName);
+ }
+ _transform(file, enc, cb) {
+ if (file.path === this.target) {
+ let contents = file.contents.toString();
+ let html = parse5.parse(contents, {locationInfo: true});
+ let firstImport = dom5.query(html, firstImportFinder);
+ if (firstImport) {
+ let importPath = path.relative(path.dirname(this.target), this.importPath);
+ let importLink = dom5.constructors.element('link');
+ dom5.setAttribute(importLink, 'rel', 'import');
+ dom5.setAttribute(importLink, 'href', importPath);
+ dom5.insertBefore(firstImport.parentNode, firstImport, importLink);
+ dom5.removeFakeRootElements(html);
+ file.contents = Buffer(parse5.serialize(html));
+ }
+ }
+ cb(null, file);
+ }
+}
+
+gulp.task('clean', () => del([DIST_DIR, 'closure.log']));
+
+gulp.task('generate-externs', gulp.series('clean', async () => {
+ let genClosure = require('@polymer/gen-closure-declarations').generateDeclarations;
+ const declarations = await genClosure();
+ await fs.writeFile('externs/closure-types.js', `${header}${declarations}`);
+}));
+
+gulp.task('generate-typescript', async () => {
+ let genTs = require('@polymer/gen-typescript-declarations').generateDeclarations;
+ await del(['types/**/*.d.ts', '!types/extra-types.d.ts']);
+ const config = await fs.readJson('gen-tsd.json');
+ const files = await genTs('.', config);
+ for (const [filePath, contents] of files) {
+ await fs.outputFile(path.join('types', filePath), contents);
+ }
+});
+
+gulp.task('closure', gulp.series('generate-externs', () => {
+
+ let entry, splitRx, joinRx, addClosureTypes;
+
+ function config(path) {
+ entry = path;
+ joinRx = new RegExp(path.split('/').join('\\/'));
+ splitRx = new RegExp(joinRx.source + '_script_\\d+\\.js$');
+ addClosureTypes = new AddClosureTypeImport(entry, 'externs/polymer-internal-types.html');
+ }
+
+ config('polymer-legacy.js');
+
+ const project = new PolymerProject({
+ shell: `./${entry}`,
+ fragments: [
+ 'node_modules/@webcomponents/shadycss/entrypoints/apply-shim.js',
+ 'node_modules/@webcomponents/shadycss/entrypoints/custom-style-interface.js'
+ ],
+ extraDependencies: [
+ addClosureTypes.importPath,
+ 'externs/polymer-internal-shared-types.js',
+ ]
+ });
+
+ function closureLintLogger(log) {
+ let chalk = require('chalk');
+ // write out log to use with diffing tools later
+ fs.writeFileSync('closure.log', chalk.stripColor(log));
+ console.error(log);
+ process.exit(-1);
+ }
+
+ let closurePluginOptions;
+
+ if (CLOSURE_LINT_ONLY) {
+ closurePluginOptions = {
+ logger: closureLintLogger
+ };
+ }
+
+ const closureStream = closure({
+ compilation_level: 'ADVANCED',
+ language_in: 'ES6_STRICT',
+ language_out: 'ES5_STRICT',
+ warning_level: 'VERBOSE',
+ isolation_mode: 'IIFE',
+ assume_function_wrapper: true,
+ rewrite_polyfills: false,
+ new_type_inf: true,
+ checks_only: CLOSURE_LINT_ONLY,
+ polymer_version: 2,
+ externs: [
+ 'bower_components/shadycss/externs/shadycss-externs.js',
+ 'externs/webcomponents-externs.js',
+ 'externs/closure-types.js',
+ 'externs/polymer-externs.js',
+ ],
+ extra_annotation_name: [
+ 'appliesMixin',
+ 'mixinClass',
+ 'mixinFunction',
+ 'polymer',
+ 'customElement'
+ ]
+ }, closurePluginOptions);
+
+ const closurePipeline = lazypipe()
+ .pipe(() => closureStream)
+ .pipe(() => new BackfillStream(closureStream.fileList_));
+
+ // process source files in the project
+ const sources = project.sources();
+
+ // process dependencies
+ const dependencies = project.dependencies();
+
+ // merge the source and dependencies streams to we can analyze the project
+ const mergedFiles = mergeStream(sources, dependencies);
+
+ const splitter = new HtmlSplitter();
+ return mergedFiles
+ .pipe(addClosureTypes)
+ .pipe(project.bundler())
+ .pipe(splitter.split())
+ .pipe(gulpif(splitRx, closurePipeline()))
+ .pipe(splitter.rejoin())
+ .pipe(gulpif(joinRx, minimalDocument()))
+ .pipe(gulpif(joinRx, size({title: 'closure size', gzip: true, showTotal: false, showFiles: true})))
+ .pipe(gulp.dest(COMPILED_DIR));
+}));
+
+gulp.task('lint-closure', (done) => {
+ CLOSURE_LINT_ONLY = true;
+ runseq('closure', done);
+});
+
+gulp.task('estimate-size', gulp.series('clean', () => {
+
+ const babelPresets = {
+ presets: [['minify', {regexpConstructors: false, simplifyComparisons: false}]]
+ };
+
+ const project = new PolymerProject({
+ shell: POLYMER_LEGACY,
+ fragments: [
+ 'node_modules/@webcomponents/shadycss/entrypoints/apply-shim.js',
+ 'node_modules/@webcomponents/shadycss/entrypoints/custom-style-interface.js'
+ ]
+ });
+
+ // process source files in the project
+ const sources = project.sources();
+
+ // process dependencies
+ const dependencies = project.dependencies();
+
+ // merge the source and dependencies streams to we can analyze the project
+ const mergedFiles = mergeStream(sources, dependencies);
+
+ const bundledSplitter = new HtmlSplitter();
+
+ const bundlePipe = lazypipe()
+ .pipe(() => bundledSplitter.split())
+ .pipe(() => gulpif(/\.js$/, babel(babelPresets)))
+ .pipe(() => bundledSplitter.rejoin())
+ .pipe(minimalDocument);
+
+ return mergedFiles
+ .pipe(project.bundler())
+ .pipe(gulpif(/polymer\.html$/, bundlePipe()))
+ .pipe(gulpif(/polymer\.html$/, size({ title: 'bundled size', gzip: true, showTotal: false, showFiles: true })))
+ // write to the bundled folder
+ .pipe(gulp.dest(BUNDLED_DIR));
+}));
+
+gulp.task('lint-eslint', function() {
+ return gulp.src(['lib/**/*.js', 'test/unit/*.{html,js}', 'util/*.js'])
+ .pipe(eslint())
+ .pipe(eslint.format())
+ .pipe(eslint.failAfterError());
+});
+
+gulp.task('lint', (done) => {
+ runseq('lint-eslint', 'lint-closure', done);
+});
+
+gulp.task('update-types', (done) => {
+ runseq('generate-externs', 'generate-typescript', done);
+});
+
+gulp.task('update-version', () => {
+ return gulp.src('lib/utils/boot.js')
+ .pipe(replace(/(window.Polymer.version = )'\d+\.\d+\.\d+'/, `$1'${require('./package.json').version}'`))
+ .pipe(gulp.dest('lib/utils'));
+});
diff --git a/third_party/polymer3/bower_components/polymer/img/migration.png b/third_party/polymer3/bower_components/polymer/img/migration.png
new file mode 100644
index 0000000..b410b1c
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/img/migration.png
Binary files differ
diff --git a/third_party/polymer3/bower_components/polymer/index.html b/third_party/polymer3/bower_components/polymer/index.html
new file mode 100644
index 0000000..bffaf2d
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/index.html
@@ -0,0 +1,25 @@
+<!doctype html>
+<!--
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+ <script src="../../@webcomponents/webcomponentsjs/webcomponents-lite.js"></script>
+ <script type="module" src="../../@polymer/iron-component-page/iron-component-page.js"></script>
+
+</head>
+<body>
+
+ <iron-component-page></iron-component-page>
+
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/lib/elements/array-selector.js b/third_party/polymer3/bower_components/polymer/lib/elements/array-selector.js
new file mode 100644
index 0000000..c4926f5
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/lib/elements/array-selector.js
@@ -0,0 +1,429 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import { PolymerElement } from '../../polymer-element.js';
+
+import { dedupingMixin } from '../utils/mixin.js';
+import { calculateSplices } from '../utils/array-splice.js';
+import { ElementMixin } from '../mixins/element-mixin.js';
+
+/**
+ * Element mixin for recording dynamic associations between item paths in a
+ * master `items` array and a `selected` array such that path changes to the
+ * master array (at the host) element or elsewhere via data-binding) are
+ * correctly propagated to items in the selected array and vice-versa.
+ *
+ * The `items` property accepts an array of user data, and via the
+ * `select(item)` and `deselect(item)` API, updates the `selected` property
+ * which may be bound to other parts of the application, and any changes to
+ * sub-fields of `selected` item(s) will be kept in sync with items in the
+ * `items` array. When `multi` is false, `selected` is a property
+ * representing the last selected item. When `multi` is true, `selected`
+ * is an array of multiply selected items.
+ *
+ * @polymer
+ * @mixinFunction
+ * @appliesMixin ElementMixin
+ * @summary Element mixin for recording dynamic associations between item paths in a
+ * master `items` array and a `selected` array
+ */
+let ArraySelectorMixin = dedupingMixin(superClass => {
+
+ /**
+ * @constructor
+ * @extends {superClass}
+ * @implements {Polymer_ElementMixin}
+ */
+ let elementBase = ElementMixin(superClass);
+
+ /**
+ * @polymer
+ * @mixinClass
+ * @implements {Polymer_ArraySelectorMixin}
+ * @unrestricted
+ */
+ class ArraySelectorMixin extends elementBase {
+
+ static get properties() {
+
+ return {
+
+ /**
+ * An array containing items from which selection will be made.
+ */
+ items: {
+ type: Array,
+ },
+
+ /**
+ * When `true`, multiple items may be selected at once (in this case,
+ * `selected` is an array of currently selected items). When `false`,
+ * only one item may be selected at a time.
+ */
+ multi: {
+ type: Boolean,
+ value: false,
+ },
+
+ /**
+ * When `multi` is true, this is an array that contains any selected.
+ * When `multi` is false, this is the currently selected item, or `null`
+ * if no item is selected.
+ * @type {?(Object|Array<!Object>)}
+ */
+ selected: {
+ type: Object,
+ notify: true
+ },
+
+ /**
+ * When `multi` is false, this is the currently selected item, or `null`
+ * if no item is selected.
+ * @type {?Object}
+ */
+ selectedItem: {
+ type: Object,
+ notify: true
+ },
+
+ /**
+ * When `true`, calling `select` on an item that is already selected
+ * will deselect the item.
+ */
+ toggle: {
+ type: Boolean,
+ value: false
+ }
+
+ };
+ }
+
+ static get observers() {
+ return ['__updateSelection(multi, items.*)'];
+ }
+
+ constructor() {
+ super();
+ this.__lastItems = null;
+ this.__lastMulti = null;
+ this.__selectedMap = null;
+ }
+
+ __updateSelection(multi, itemsInfo) {
+ let path = itemsInfo.path;
+ if (path == 'items') {
+ // Case 1 - items array changed, so diff against previous array and
+ // deselect any removed items and adjust selected indices
+ let newItems = itemsInfo.base || [];
+ let lastItems = this.__lastItems;
+ let lastMulti = this.__lastMulti;
+ if (multi !== lastMulti) {
+ this.clearSelection();
+ }
+ if (lastItems) {
+ let splices = calculateSplices(newItems, lastItems);
+ this.__applySplices(splices);
+ }
+ this.__lastItems = newItems;
+ this.__lastMulti = multi;
+ } else if (itemsInfo.path == 'items.splices') {
+ // Case 2 - got specific splice information describing the array mutation:
+ // deselect any removed items and adjust selected indices
+ this.__applySplices(itemsInfo.value.indexSplices);
+ } else {
+ // Case 3 - an array element was changed, so deselect the previous
+ // item for that index if it was previously selected
+ let part = path.slice('items.'.length);
+ let idx = parseInt(part, 10);
+ if ((part.indexOf('.') < 0) && part == idx) {
+ this.__deselectChangedIdx(idx);
+ }
+ }
+ }
+
+ __applySplices(splices) {
+ let selected = this.__selectedMap;
+ // Adjust selected indices and mark removals
+ for (let i=0; i<splices.length; i++) {
+ let s = splices[i];
+ selected.forEach((idx, item) => {
+ if (idx < s.index) {
+ // no change
+ } else if (idx >= s.index + s.removed.length) {
+ // adjust index
+ selected.set(item, idx + s.addedCount - s.removed.length);
+ } else {
+ // remove index
+ selected.set(item, -1);
+ }
+ });
+ for (let j=0; j<s.addedCount; j++) {
+ let idx = s.index + j;
+ if (selected.has(this.items[idx])) {
+ selected.set(this.items[idx], idx);
+ }
+ }
+ }
+ // Update linked paths
+ this.__updateLinks();
+ // Remove selected items that were removed from the items array
+ let sidx = 0;
+ selected.forEach((idx, item) => {
+ if (idx < 0) {
+ if (this.multi) {
+ this.splice('selected', sidx, 1);
+ } else {
+ this.selected = this.selectedItem = null;
+ }
+ selected.delete(item);
+ } else {
+ sidx++;
+ }
+ });
+ }
+
+ __updateLinks() {
+ this.__dataLinkedPaths = {};
+ if (this.multi) {
+ let sidx = 0;
+ this.__selectedMap.forEach(idx => {
+ if (idx >= 0) {
+ this.linkPaths('items.' + idx, 'selected.' + sidx++);
+ }
+ });
+ } else {
+ this.__selectedMap.forEach(idx => {
+ this.linkPaths('selected', 'items.' + idx);
+ this.linkPaths('selectedItem', 'items.' + idx);
+ });
+ }
+ }
+
+ /**
+ * Clears the selection state.
+ * @return {void}
+ */
+ clearSelection() {
+ // Unbind previous selection
+ this.__dataLinkedPaths = {};
+ // The selected map stores 3 pieces of information:
+ // key: items array object
+ // value: items array index
+ // order: selected array index
+ this.__selectedMap = new Map();
+ // Initialize selection
+ this.selected = this.multi ? [] : null;
+ this.selectedItem = null;
+ }
+
+ /**
+ * Returns whether the item is currently selected.
+ *
+ * @param {*} item Item from `items` array to test
+ * @return {boolean} Whether the item is selected
+ */
+ isSelected(item) {
+ return this.__selectedMap.has(item);
+ }
+
+ /**
+ * Returns whether the item is currently selected.
+ *
+ * @param {number} idx Index from `items` array to test
+ * @return {boolean} Whether the item is selected
+ */
+ isIndexSelected(idx) {
+ return this.isSelected(this.items[idx]);
+ }
+
+ __deselectChangedIdx(idx) {
+ let sidx = this.__selectedIndexForItemIndex(idx);
+ if (sidx >= 0) {
+ let i = 0;
+ this.__selectedMap.forEach((idx, item) => {
+ if (sidx == i++) {
+ this.deselect(item);
+ }
+ });
+ }
+ }
+
+ __selectedIndexForItemIndex(idx) {
+ let selected = this.__dataLinkedPaths['items.' + idx];
+ if (selected) {
+ return parseInt(selected.slice('selected.'.length), 10);
+ }
+ }
+
+ /**
+ * Deselects the given item if it is already selected.
+ *
+ * @param {*} item Item from `items` array to deselect
+ * @return {void}
+ */
+ deselect(item) {
+ let idx = this.__selectedMap.get(item);
+ if (idx >= 0) {
+ this.__selectedMap.delete(item);
+ let sidx;
+ if (this.multi) {
+ sidx = this.__selectedIndexForItemIndex(idx);
+ }
+ this.__updateLinks();
+ if (this.multi) {
+ this.splice('selected', sidx, 1);
+ } else {
+ this.selected = this.selectedItem = null;
+ }
+ }
+ }
+
+ /**
+ * Deselects the given index if it is already selected.
+ *
+ * @param {number} idx Index from `items` array to deselect
+ * @return {void}
+ */
+ deselectIndex(idx) {
+ this.deselect(this.items[idx]);
+ }
+
+ /**
+ * Selects the given item. When `toggle` is true, this will automatically
+ * deselect the item if already selected.
+ *
+ * @param {*} item Item from `items` array to select
+ * @return {void}
+ */
+ select(item) {
+ this.selectIndex(this.items.indexOf(item));
+ }
+
+ /**
+ * Selects the given index. When `toggle` is true, this will automatically
+ * deselect the item if already selected.
+ *
+ * @param {number} idx Index from `items` array to select
+ * @return {void}
+ */
+ selectIndex(idx) {
+ let item = this.items[idx];
+ if (!this.isSelected(item)) {
+ if (!this.multi) {
+ this.__selectedMap.clear();
+ }
+ this.__selectedMap.set(item, idx);
+ this.__updateLinks();
+ if (this.multi) {
+ this.push('selected', item);
+ } else {
+ this.selected = this.selectedItem = item;
+ }
+ } else if (this.toggle) {
+ this.deselectIndex(idx);
+ }
+ }
+
+ }
+
+ return ArraySelectorMixin;
+
+});
+
+// export mixin
+export { ArraySelectorMixin };
+
+/**
+ * @constructor
+ * @extends {PolymerElement}
+ * @implements {Polymer_ArraySelectorMixin}
+ */
+let baseArraySelector = ArraySelectorMixin(PolymerElement);
+
+/**
+ * Element implementing the `ArraySelector` mixin, which records
+ * dynamic associations between item paths in a master `items` array and a
+ * `selected` array such that path changes to the master array (at the host)
+ * element or elsewhere via data-binding) are correctly propagated to items
+ * in the selected array and vice-versa.
+ *
+ * The `items` property accepts an array of user data, and via the
+ * `select(item)` and `deselect(item)` API, updates the `selected` property
+ * which may be bound to other parts of the application, and any changes to
+ * sub-fields of `selected` item(s) will be kept in sync with items in the
+ * `items` array. When `multi` is false, `selected` is a property
+ * representing the last selected item. When `multi` is true, `selected`
+ * is an array of multiply selected items.
+ *
+ * Example:
+ *
+ * ```js
+ * import {PolymerElement} from '@polymer/polymer';
+ * import '@polymer/polymer/lib/elements/array-selector.js';
+ *
+ * class EmployeeList extends PolymerElement {
+ * static get _template() {
+ * return html`
+ * <div> Employee list: </div>
+ * <dom-repeat id="employeeList" items="{{employees}}">
+ * <template>
+ * <div>First name: <span>{{item.first}}</span></div>
+ * <div>Last name: <span>{{item.last}}</span></div>
+ * <button on-click="toggleSelection">Select</button>
+ * </template>
+ * </dom-repeat>
+ *
+ * <array-selector id="selector"
+ * items="{{employees}}"
+ * selected="{{selected}}"
+ * multi toggle></array-selector>
+ *
+ * <div> Selected employees: </div>
+ * <dom-repeat items="{{selected}}">
+ * <template>
+ * <div>First name: <span>{{item.first}}</span></div>
+ * <div>Last name: <span>{{item.last}}</span></div>
+ * </template>
+ * </dom-repeat>`;
+ * }
+ * static get is() { return 'employee-list'; }
+ * static get properties() {
+ * return {
+ * employees: {
+ * value() {
+ * return [
+ * {first: 'Bob', last: 'Smith'},
+ * {first: 'Sally', last: 'Johnson'},
+ * ...
+ * ];
+ * }
+ * }
+ * };
+ * }
+ * toggleSelection(e) {
+ * const item = this.$.employeeList.itemForElement(e.target);
+ * this.$.selector.select(item);
+ * }
+ * }
+ * ```
+ *
+ * @polymer
+ * @customElement
+ * @extends {baseArraySelector}
+ * @appliesMixin ArraySelectorMixin
+ * @summary Custom element that links paths between an input `items` array and
+ * an output `selected` item or array based on calls to its selection API.
+ */
+class ArraySelector extends baseArraySelector {
+ // Not needed to find template; can be removed once the analyzer
+ // can find the tag name from customElements.define call
+ static get is() { return 'array-selector'; }
+}
+customElements.define(ArraySelector.is, ArraySelector);
+export { ArraySelector };
diff --git a/third_party/polymer3/bower_components/polymer/lib/elements/custom-style.js b/third_party/polymer3/bower_components/polymer/lib/elements/custom-style.js
new file mode 100644
index 0000000..c0961ee
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/lib/elements/custom-style.js
@@ -0,0 +1,108 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import '@webcomponents/shadycss/entrypoints/custom-style-interface.js';
+
+import { cssFromModules } from '../utils/style-gather.js';
+
+const attr = 'include';
+
+const CustomStyleInterface = window.ShadyCSS.CustomStyleInterface;
+
+/**
+ * Custom element for defining styles in the main document that can take
+ * advantage of [shady DOM](https://github.com/webcomponents/shadycss) shims
+ * for style encapsulation, custom properties, and custom mixins.
+ *
+ * - Document styles defined in a `<custom-style>` are shimmed to ensure they
+ * do not leak into local DOM when running on browsers without native
+ * Shadow DOM.
+ * - Custom properties can be defined in a `<custom-style>`. Use the `html` selector
+ * to define custom properties that apply to all custom elements.
+ * - Custom mixins can be defined in a `<custom-style>`, if you import the optional
+ * [apply shim](https://github.com/webcomponents/shadycss#about-applyshim)
+ * (`shadycss/apply-shim.html`).
+ *
+ * To use:
+ *
+ * - Import `custom-style.html`.
+ * - Place a `<custom-style>` element in the main document, wrapping an inline `<style>` tag that
+ * contains the CSS rules you want to shim.
+ *
+ * For example:
+ *
+ * ```html
+ * <!-- import apply shim--only required if using mixins -->
+ * <link rel="import" href="bower_components/shadycss/apply-shim.html">
+ * <!-- import custom-style element -->
+ * <link rel="import" href="bower_components/polymer/lib/elements/custom-style.html">
+ *
+ * <custom-style>
+ * <style>
+ * html {
+ * --custom-color: blue;
+ * --custom-mixin: {
+ * font-weight: bold;
+ * color: red;
+ * };
+ * }
+ * </style>
+ * </custom-style>
+ * ```
+ *
+ * @customElement
+ * @extends HTMLElement
+ * @summary Custom element for defining styles in the main document that can
+ * take advantage of Polymer's style scoping and custom properties shims.
+ */
+export class CustomStyle extends HTMLElement {
+ constructor() {
+ super();
+ this._style = null;
+ CustomStyleInterface.addCustomStyle(this);
+ }
+ /**
+ * Returns the light-DOM `<style>` child this element wraps. Upon first
+ * call any style modules referenced via the `include` attribute will be
+ * concatenated to this element's `<style>`.
+ *
+ * @return {HTMLStyleElement} This element's light-DOM `<style>`
+ */
+ getStyle() {
+ if (this._style) {
+ return this._style;
+ }
+ const style = /** @type {HTMLStyleElement} */(this.querySelector('style'));
+ if (!style) {
+ return null;
+ }
+ this._style = style;
+ const include = style.getAttribute(attr);
+ if (include) {
+ style.removeAttribute(attr);
+ style.textContent = cssFromModules(include) + style.textContent;
+ }
+ /*
+ HTML Imports styling the main document are deprecated in Chrome
+ https://crbug.com/523952
+
+ If this element is not in the main document, then it must be in an HTML Import document.
+ In that case, move the custom style to the main document.
+
+ The ordering of `<custom-style>` should stay the same as when loaded by HTML Imports, but there may be odd
+ cases of ordering w.r.t the main document styles.
+ */
+ if (this.ownerDocument !== window.document) {
+ window.document.head.appendChild(this);
+ }
+ return this._style;
+ }
+}
+
+window.customElements.define('custom-style', CustomStyle);
diff --git a/third_party/polymer3/bower_components/polymer/lib/elements/dom-bind.js b/third_party/polymer3/bower_components/polymer/lib/elements/dom-bind.js
new file mode 100644
index 0000000..512e01c
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/lib/elements/dom-bind.js
@@ -0,0 +1,127 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import '../utils/boot.js';
+
+import { PropertyEffects } from '../mixins/property-effects.js';
+import { OptionalMutableData } from '../mixins/mutable-data.js';
+import { GestureEventListeners } from '../mixins/gesture-event-listeners.js';
+
+/**
+ * @constructor
+ * @extends {HTMLElement}
+ * @implements {Polymer_PropertyEffects}
+ * @implements {Polymer_OptionalMutableData}
+ * @implements {Polymer_GestureEventListeners}
+ */
+const domBindBase =
+ GestureEventListeners(
+ OptionalMutableData(
+ PropertyEffects(HTMLElement)));
+
+/**
+ * Custom element to allow using Polymer's template features (data binding,
+ * declarative event listeners, etc.) in the main document without defining
+ * a new custom element.
+ *
+ * `<template>` tags utilizing bindings may be wrapped with the `<dom-bind>`
+ * element, which will immediately stamp the wrapped template into the main
+ * document and bind elements to the `dom-bind` element itself as the
+ * binding scope.
+ *
+ * @polymer
+ * @customElement
+ * @appliesMixin PropertyEffects
+ * @appliesMixin OptionalMutableData
+ * @appliesMixin GestureEventListeners
+ * @extends {domBindBase}
+ * @summary Custom element to allow using Polymer's template features (data
+ * binding, declarative event listeners, etc.) in the main document.
+ */
+export class DomBind extends domBindBase {
+
+ static get observedAttributes() { return ['mutable-data']; }
+
+ constructor() {
+ super();
+ this.root = null;
+ this.$ = null;
+ this.__children = null;
+ }
+
+ /** @return {void} */
+ attributeChangedCallback() {
+ // assumes only one observed attribute
+ this.mutableData = true;
+ }
+
+ /** @return {void} */
+ connectedCallback() {
+ this.style.display = 'none';
+ this.render();
+ }
+
+ /** @return {void} */
+ disconnectedCallback() {
+ this.__removeChildren();
+ }
+
+ __insertChildren() {
+ this.parentNode.insertBefore(this.root, this);
+ }
+
+ __removeChildren() {
+ if (this.__children) {
+ for (let i=0; i<this.__children.length; i++) {
+ this.root.appendChild(this.__children[i]);
+ }
+ }
+ }
+
+ /**
+ * Forces the element to render its content. This is typically only
+ * necessary to call if HTMLImports with the async attribute are used.
+ * @return {void}
+ */
+ render() {
+ let template;
+ if (!this.__children) {
+ template = /** @type {HTMLTemplateElement} */(template || this.querySelector('template'));
+ if (!template) {
+ // Wait until childList changes and template should be there by then
+ let observer = new MutationObserver(() => {
+ template = /** @type {HTMLTemplateElement} */(this.querySelector('template'));
+ if (template) {
+ observer.disconnect();
+ this.render();
+ } else {
+ throw new Error('dom-bind requires a <template> child');
+ }
+ });
+ observer.observe(this, {childList: true});
+ return;
+ }
+ this.root = this._stampTemplate(template);
+ this.$ = this.root.$;
+ this.__children = [];
+ for (let n=this.root.firstChild; n; n=n.nextSibling) {
+ this.__children[this.__children.length] = n;
+ }
+ this._enableProperties();
+ }
+ this.__insertChildren();
+ this.dispatchEvent(new CustomEvent('dom-change', {
+ bubbles: true,
+ composed: true
+ }));
+ }
+
+}
+
+customElements.define('dom-bind', DomBind);
diff --git a/third_party/polymer3/bower_components/polymer/lib/elements/dom-if.js b/third_party/polymer3/bower_components/polymer/lib/elements/dom-if.js
new file mode 100644
index 0000000..0b95ac5
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/lib/elements/dom-if.js
@@ -0,0 +1,279 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import { PolymerElement } from '../../polymer-element.js';
+
+import { templatize } from '../utils/templatize.js';
+import { Debouncer } from '../utils/debounce.js';
+import { enqueueDebouncer, flush } from '../utils/flush.js';
+import { microTask } from '../utils/async.js';
+import { root as root$0 } from '../utils/path.js';
+
+/**
+ * The `<dom-if>` element will stamp a light-dom `<template>` child when
+ * the `if` property becomes truthy, and the template can use Polymer
+ * data-binding and declarative event features when used in the context of
+ * a Polymer element's template.
+ *
+ * When `if` becomes falsy, the stamped content is hidden but not
+ * removed from dom. When `if` subsequently becomes truthy again, the content
+ * is simply re-shown. This approach is used due to its favorable performance
+ * characteristics: the expense of creating template content is paid only
+ * once and lazily.
+ *
+ * Set the `restamp` property to true to force the stamped content to be
+ * created / destroyed when the `if` condition changes.
+ *
+ * @customElement
+ * @polymer
+ * @extends PolymerElement
+ * @summary Custom element that conditionally stamps and hides or removes
+ * template content based on a boolean flag.
+ */
+export class DomIf extends PolymerElement {
+
+ // Not needed to find template; can be removed once the analyzer
+ // can find the tag name from customElements.define call
+ static get is() { return 'dom-if'; }
+
+ static get template() { return null; }
+
+ static get properties() {
+
+ return {
+
+ /**
+ * Fired whenever DOM is added or removed/hidden by this template (by
+ * default, rendering occurs lazily). To force immediate rendering, call
+ * `render`.
+ *
+ * @event dom-change
+ */
+
+ /**
+ * A boolean indicating whether this template should stamp.
+ */
+ if: {
+ type: Boolean,
+ observer: '__debounceRender'
+ },
+
+ /**
+ * When true, elements will be removed from DOM and discarded when `if`
+ * becomes false and re-created and added back to the DOM when `if`
+ * becomes true. By default, stamped elements will be hidden but left
+ * in the DOM when `if` becomes false, which is generally results
+ * in better performance.
+ */
+ restamp: {
+ type: Boolean,
+ observer: '__debounceRender'
+ }
+
+ };
+
+ }
+
+ constructor() {
+ super();
+ this.__renderDebouncer = null;
+ this.__invalidProps = null;
+ this.__instance = null;
+ this._lastIf = false;
+ this.__ctor = null;
+ }
+
+ __debounceRender() {
+ // Render is async for 2 reasons:
+ // 1. To eliminate dom creation trashing if user code thrashes `if` in the
+ // same turn. This was more common in 1.x where a compound computed
+ // property could result in the result changing multiple times, but is
+ // mitigated to a large extent by batched property processing in 2.x.
+ // 2. To avoid double object propagation when a bag including values bound
+ // to the `if` property as well as one or more hostProps could enqueue
+ // the <dom-if> to flush before the <template>'s host property
+ // forwarding. In that scenario creating an instance would result in
+ // the host props being set once, and then the enqueued changes on the
+ // template would set properties a second time, potentially causing an
+ // object to be set to an instance more than once. Creating the
+ // instance async from flushing data ensures this doesn't happen. If
+ // we wanted a sync option in the future, simply having <dom-if> flush
+ // (or clear) its template's pending host properties before creating
+ // the instance would also avoid the problem.
+ this.__renderDebouncer = Debouncer.debounce(
+ this.__renderDebouncer
+ , microTask
+ , () => this.__render());
+ enqueueDebouncer(this.__renderDebouncer);
+ }
+
+ /**
+ * @return {void}
+ */
+ disconnectedCallback() {
+ super.disconnectedCallback();
+ if (!this.parentNode ||
+ (this.parentNode.nodeType == Node.DOCUMENT_FRAGMENT_NODE &&
+ !this.parentNode.host)) {
+ this.__teardownInstance();
+ }
+ }
+
+ /**
+ * @return {void}
+ */
+ connectedCallback() {
+ super.connectedCallback();
+ this.style.display = 'none';
+ if (this.if) {
+ this.__debounceRender();
+ }
+ }
+
+ /**
+ * Forces the element to render its content. Normally rendering is
+ * asynchronous to a provoking change. This is done for efficiency so
+ * that multiple changes trigger only a single render. The render method
+ * should be called if, for example, template rendering is required to
+ * validate application state.
+ * @return {void}
+ */
+ render() {
+ flush();
+ }
+
+ __render() {
+ if (this.if) {
+ if (!this.__ensureInstance()) {
+ // No template found yet
+ return;
+ }
+ this._showHideChildren();
+ } else if (this.restamp) {
+ this.__teardownInstance();
+ }
+ if (!this.restamp && this.__instance) {
+ this._showHideChildren();
+ }
+ if (this.if != this._lastIf) {
+ this.dispatchEvent(new CustomEvent('dom-change', {
+ bubbles: true,
+ composed: true
+ }));
+ this._lastIf = this.if;
+ }
+ }
+
+ __ensureInstance() {
+ let parentNode = this.parentNode;
+ // Guard against element being detached while render was queued
+ if (parentNode) {
+ if (!this.__ctor) {
+ let template = /** @type {HTMLTemplateElement} */(this.querySelector('template'));
+ if (!template) {
+ // Wait until childList changes and template should be there by then
+ let observer = new MutationObserver(() => {
+ if (this.querySelector('template')) {
+ observer.disconnect();
+ this.__render();
+ } else {
+ throw new Error('dom-if requires a <template> child');
+ }
+ });
+ observer.observe(this, {childList: true});
+ return false;
+ }
+ this.__ctor = templatize(template, this, {
+ // dom-if templatizer instances require `mutable: true`, as
+ // `__syncHostProperties` relies on that behavior to sync objects
+ mutableData: true,
+ /**
+ * @param {string} prop Property to forward
+ * @param {*} value Value of property
+ * @this {this}
+ */
+ forwardHostProp: function(prop, value) {
+ if (this.__instance) {
+ if (this.if) {
+ this.__instance.forwardHostProp(prop, value);
+ } else {
+ // If we have an instance but are squelching host property
+ // forwarding due to if being false, note the invalidated
+ // properties so `__syncHostProperties` can sync them the next
+ // time `if` becomes true
+ this.__invalidProps = this.__invalidProps || Object.create(null);
+ this.__invalidProps[root$0(prop)] = true;
+ }
+ }
+ }
+ });
+ }
+ if (!this.__instance) {
+ this.__instance = new this.__ctor();
+ parentNode.insertBefore(this.__instance.root, this);
+ } else {
+ this.__syncHostProperties();
+ let c$ = this.__instance.children;
+ if (c$ && c$.length) {
+ // Detect case where dom-if was re-attached in new position
+ let lastChild = this.previousSibling;
+ if (lastChild !== c$[c$.length-1]) {
+ for (let i=0, n; (i<c$.length) && (n=c$[i]); i++) {
+ parentNode.insertBefore(n, this);
+ }
+ }
+ }
+ }
+ }
+ return true;
+ }
+
+ __syncHostProperties() {
+ let props = this.__invalidProps;
+ if (props) {
+ for (let prop in props) {
+ this.__instance._setPendingProperty(prop, this.__dataHost[prop]);
+ }
+ this.__invalidProps = null;
+ this.__instance._flushProperties();
+ }
+ }
+
+ __teardownInstance() {
+ if (this.__instance) {
+ let c$ = this.__instance.children;
+ if (c$ && c$.length) {
+ // use first child parent, for case when dom-if may have been detached
+ let parent = c$[0].parentNode;
+ for (let i=0, n; (i<c$.length) && (n=c$[i]); i++) {
+ parent.removeChild(n);
+ }
+ }
+ this.__instance = null;
+ this.__invalidProps = null;
+ }
+ }
+
+ /**
+ * Shows or hides the template instance top level child elements. For
+ * text nodes, `textContent` is removed while "hidden" and replaced when
+ * "shown."
+ * @return {void}
+ * @protected
+ */
+ _showHideChildren() {
+ let hidden = this.__hideTemplateChildren__ || !this.if;
+ if (this.__instance) {
+ this.__instance._showHideChildren(hidden);
+ }
+ }
+
+}
+
+customElements.define(DomIf.is, DomIf);
diff --git a/third_party/polymer3/bower_components/polymer/lib/elements/dom-module.js b/third_party/polymer3/bower_components/polymer/lib/elements/dom-module.js
new file mode 100644
index 0000000..ae35fe9
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/lib/elements/dom-module.js
@@ -0,0 +1,137 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import '../utils/boot.js';
+
+import { resolveUrl, pathFromUrl } from '../utils/resolve-url.js';
+
+let modules = {};
+let lcModules = {};
+function findModule(id) {
+ return modules[id] || lcModules[id.toLowerCase()];
+}
+
+function styleOutsideTemplateCheck(inst) {
+ if (inst.querySelector('style')) {
+ console.warn('dom-module %s has style outside template', inst.id);
+ }
+}
+
+/**
+ * The `dom-module` element registers the dom it contains to the name given
+ * by the module's id attribute. It provides a unified database of dom
+ * accessible via its static `import` API.
+ *
+ * A key use case of `dom-module` is for providing custom element `<template>`s
+ * via HTML imports that are parsed by the native HTML parser, that can be
+ * relocated during a bundling pass and still looked up by `id`.
+ *
+ * Example:
+ *
+ * <dom-module id="foo">
+ * <img src="stuff.png">
+ * </dom-module>
+ *
+ * Then in code in some other location that cannot access the dom-module above
+ *
+ * let img = customElements.get('dom-module').import('foo', 'img');
+ *
+ * @customElement
+ * @extends HTMLElement
+ * @summary Custom element that provides a registry of relocatable DOM content
+ * by `id` that is agnostic to bundling.
+ * @unrestricted
+ */
+export class DomModule extends HTMLElement {
+
+ static get observedAttributes() { return ['id']; }
+
+ /**
+ * Retrieves the element specified by the css `selector` in the module
+ * registered by `id`. For example, this.import('foo', 'img');
+ * @param {string} id The id of the dom-module in which to search.
+ * @param {string=} selector The css selector by which to find the element.
+ * @return {Element} Returns the element which matches `selector` in the
+ * module registered at the specified `id`.
+ */
+ static import(id, selector) {
+ if (id) {
+ let m = findModule(id);
+ if (m && selector) {
+ return m.querySelector(selector);
+ }
+ return m;
+ }
+ return null;
+ }
+
+ /* eslint-disable no-unused-vars */
+ /**
+ * @param {string} name Name of attribute.
+ * @param {?string} old Old value of attribute.
+ * @param {?string} value Current value of attribute.
+ * @param {?string} namespace Attribute namespace.
+ * @return {void}
+ */
+ attributeChangedCallback(name, old, value, namespace) {
+ if (old !== value) {
+ this.register();
+ }
+ }
+ /* eslint-enable no-unused-args */
+
+ /**
+ * The absolute URL of the original location of this `dom-module`.
+ *
+ * This value will differ from this element's `ownerDocument` in the
+ * following ways:
+ * - Takes into account any `assetpath` attribute added during bundling
+ * to indicate the original location relative to the bundled location
+ * - Uses the HTMLImports polyfill's `importForElement` API to ensure
+ * the path is relative to the import document's location since
+ * `ownerDocument` is not currently polyfilled
+ */
+ get assetpath() {
+ // Don't override existing assetpath.
+ if (!this.__assetpath) {
+ // note: assetpath set via an attribute must be relative to this
+ // element's location; accomodate polyfilled HTMLImports
+ const owner = window.HTMLImports && HTMLImports.importForElement ?
+ HTMLImports.importForElement(this) || document : this.ownerDocument;
+ const url = resolveUrl(
+ this.getAttribute('assetpath') || '', owner.baseURI);
+ this.__assetpath = pathFromUrl(url);
+ }
+ return this.__assetpath;
+ }
+
+ /**
+ * Registers the dom-module at a given id. This method should only be called
+ * when a dom-module is imperatively created. For
+ * example, `document.createElement('dom-module').register('foo')`.
+ * @param {string=} id The id at which to register the dom-module.
+ * @return {void}
+ */
+ register(id) {
+ id = id || this.id;
+ if (id) {
+ this.id = id;
+ // store id separate from lowercased id so that
+ // in all cases mixedCase id will stored distinctly
+ // and lowercase version is a fallback
+ modules[id] = this;
+ lcModules[id.toLowerCase()] = this;
+ styleOutsideTemplateCheck(this);
+ }
+ }
+}
+
+DomModule.prototype['modules'] = modules;
+
+customElements.define('dom-module', DomModule);
diff --git a/third_party/polymer3/bower_components/polymer/lib/elements/dom-repeat.js b/third_party/polymer3/bower_components/polymer/lib/elements/dom-repeat.js
new file mode 100644
index 0000000..1aa95cc
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/lib/elements/dom-repeat.js
@@ -0,0 +1,728 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import { PolymerElement } from '../../polymer-element.js';
+
+import { TemplateInstanceBase as TemplateInstanceBase$0, templatize, modelForElement as modelForElement$0 } from '../utils/templatize.js';
+import { Debouncer } from '../utils/debounce.js';
+import { enqueueDebouncer, flush } from '../utils/flush.js';
+import { OptionalMutableData } from '../mixins/mutable-data.js';
+import { matches, translate } from '../utils/path.js';
+import { timeOut, microTask } from '../utils/async.js';
+
+let TemplateInstanceBase = TemplateInstanceBase$0; // eslint-disable-line
+
+/**
+ * @constructor
+ * @implements {Polymer_OptionalMutableData}
+ * @extends {PolymerElement}
+ */
+const domRepeatBase = OptionalMutableData(PolymerElement);
+
+/**
+ * The `<dom-repeat>` element will automatically stamp and binds one instance
+ * of template content to each object in a user-provided array.
+ * `dom-repeat` accepts an `items` property, and one instance of the template
+ * is stamped for each item into the DOM at the location of the `dom-repeat`
+ * element. The `item` property will be set on each instance's binding
+ * scope, thus templates should bind to sub-properties of `item`.
+ *
+ * Example:
+ *
+ * ```html
+ * <dom-module id="employee-list">
+ *
+ * <template>
+ *
+ * <div> Employee list: </div>
+ * <dom-repeat items="{{employees}}">
+ * <template>
+ * <div>First name: <span>{{item.first}}</span></div>
+ * <div>Last name: <span>{{item.last}}</span></div>
+ * </template>
+ * </dom-repeat>
+ *
+ * </template>
+ *
+ * </dom-module>
+ * ```
+ *
+ * With the following custom element definition:
+ *
+ * ```js
+ * class EmployeeList extends PolymerElement {
+ * static get is() { return 'employee-list'; }
+ * static get properties() {
+ * return {
+ * employees: {
+ * value() {
+ * return [
+ * {first: 'Bob', last: 'Smith'},
+ * {first: 'Sally', last: 'Johnson'},
+ * ...
+ * ];
+ * }
+ * }
+ * };
+ * }
+ * }
+ * ```
+ *
+ * Notifications for changes to items sub-properties will be forwarded to template
+ * instances, which will update via the normal structured data notification system.
+ *
+ * Mutations to the `items` array itself should be made using the Array
+ * mutation API's on the PropertyEffects mixin (`push`, `pop`, `splice`,
+ * `shift`, `unshift`), and template instances will be kept in sync with the
+ * data in the array.
+ *
+ * Events caught by event handlers within the `dom-repeat` template will be
+ * decorated with a `model` property, which represents the binding scope for
+ * each template instance. The model should be used to manipulate data on the
+ * instance, for example `event.model.set('item.checked', true);`.
+ *
+ * Alternatively, the model for a template instance for an element stamped by
+ * a `dom-repeat` can be obtained using the `modelForElement` API on the
+ * `dom-repeat` that stamped it, for example
+ * `this.$.domRepeat.modelForElement(event.target).set('item.checked', true);`.
+ * This may be useful for manipulating instance data of event targets obtained
+ * by event handlers on parents of the `dom-repeat` (event delegation).
+ *
+ * A view-specific filter/sort may be applied to each `dom-repeat` by supplying a
+ * `filter` and/or `sort` property. This may be a string that names a function on
+ * the host, or a function may be assigned to the property directly. The functions
+ * should implemented following the standard `Array` filter/sort API.
+ *
+ * In order to re-run the filter or sort functions based on changes to sub-fields
+ * of `items`, the `observe` property may be set as a space-separated list of
+ * `item` sub-fields that should cause a re-filter/sort when modified. If
+ * the filter or sort function depends on properties not contained in `items`,
+ * the user should observe changes to those properties and call `render` to update
+ * the view based on the dependency change.
+ *
+ * For example, for an `dom-repeat` with a filter of the following:
+ *
+ * ```js
+ * isEngineer(item) {
+ * return item.type == 'engineer' || item.manager.type == 'engineer';
+ * }
+ * ```
+ *
+ * Then the `observe` property should be configured as follows:
+ *
+ * ```html
+ * <dom-repeat items="{{employees}}" filter="isEngineer" observe="type manager.type">
+ * ```
+ *
+ * @customElement
+ * @polymer
+ * @extends {domRepeatBase}
+ * @appliesMixin OptionalMutableData
+ * @summary Custom element for stamping instance of a template bound to
+ * items in an array.
+ */
+export class DomRepeat extends domRepeatBase {
+
+ // Not needed to find template; can be removed once the analyzer
+ // can find the tag name from customElements.define call
+ static get is() { return 'dom-repeat'; }
+
+ static get template() { return null; }
+
+ static get properties() {
+
+ /**
+ * Fired whenever DOM is added or removed by this template (by
+ * default, rendering occurs lazily). To force immediate rendering, call
+ * `render`.
+ *
+ * @event dom-change
+ */
+ return {
+
+ /**
+ * An array containing items determining how many instances of the template
+ * to stamp and that that each template instance should bind to.
+ */
+ items: {
+ type: Array
+ },
+
+ /**
+ * The name of the variable to add to the binding scope for the array
+ * element associated with a given template instance.
+ */
+ as: {
+ type: String,
+ value: 'item'
+ },
+
+ /**
+ * The name of the variable to add to the binding scope with the index
+ * of the instance in the sorted and filtered list of rendered items.
+ * Note, for the index in the `this.items` array, use the value of the
+ * `itemsIndexAs` property.
+ */
+ indexAs: {
+ type: String,
+ value: 'index'
+ },
+
+ /**
+ * The name of the variable to add to the binding scope with the index
+ * of the instance in the `this.items` array. Note, for the index of
+ * this instance in the sorted and filtered list of rendered items,
+ * use the value of the `indexAs` property.
+ */
+ itemsIndexAs: {
+ type: String,
+ value: 'itemsIndex'
+ },
+
+ /**
+ * A function that should determine the sort order of the items. This
+ * property should either be provided as a string, indicating a method
+ * name on the element's host, or else be an actual function. The
+ * function should match the sort function passed to `Array.sort`.
+ * Using a sort function has no effect on the underlying `items` array.
+ */
+ sort: {
+ type: Function,
+ observer: '__sortChanged'
+ },
+
+ /**
+ * A function that can be used to filter items out of the view. This
+ * property should either be provided as a string, indicating a method
+ * name on the element's host, or else be an actual function. The
+ * function should match the sort function passed to `Array.filter`.
+ * Using a filter function has no effect on the underlying `items` array.
+ */
+ filter: {
+ type: Function,
+ observer: '__filterChanged'
+ },
+
+ /**
+ * When using a `filter` or `sort` function, the `observe` property
+ * should be set to a space-separated list of the names of item
+ * sub-fields that should trigger a re-sort or re-filter when changed.
+ * These should generally be fields of `item` that the sort or filter
+ * function depends on.
+ */
+ observe: {
+ type: String,
+ observer: '__observeChanged'
+ },
+
+ /**
+ * When using a `filter` or `sort` function, the `delay` property
+ * determines a debounce time in ms after a change to observed item
+ * properties that must pass before the filter or sort is re-run.
+ * This is useful in rate-limiting shuffling of the view when
+ * item changes may be frequent.
+ */
+ delay: Number,
+
+ /**
+ * Count of currently rendered items after `filter` (if any) has been applied.
+ * If "chunking mode" is enabled, `renderedItemCount` is updated each time a
+ * set of template instances is rendered.
+ *
+ */
+ renderedItemCount: {
+ type: Number,
+ notify: true,
+ readOnly: true
+ },
+
+ /**
+ * Defines an initial count of template instances to render after setting
+ * the `items` array, before the next paint, and puts the `dom-repeat`
+ * into "chunking mode". The remaining items will be created and rendered
+ * incrementally at each animation frame therof until all instances have
+ * been rendered.
+ */
+ initialCount: {
+ type: Number,
+ observer: '__initializeChunking'
+ },
+
+ /**
+ * When `initialCount` is used, this property defines a frame rate (in
+ * fps) to target by throttling the number of instances rendered each
+ * frame to not exceed the budget for the target frame rate. The
+ * framerate is effectively the number of `requestAnimationFrame`s that
+ * it tries to allow to actually fire in a given second. It does this
+ * by measuring the time between `rAF`s and continuously adjusting the
+ * number of items created each `rAF` to maintain the target framerate.
+ * Setting this to a higher number allows lower latency and higher
+ * throughput for event handlers and other tasks, but results in a
+ * longer time for the remaining items to complete rendering.
+ */
+ targetFramerate: {
+ type: Number,
+ value: 20
+ },
+
+ _targetFrameTime: {
+ type: Number,
+ computed: '__computeFrameTime(targetFramerate)'
+ }
+
+ };
+
+ }
+
+ static get observers() {
+ return [ '__itemsChanged(items.*)' ];
+ }
+
+ constructor() {
+ super();
+ this.__instances = [];
+ this.__limit = Infinity;
+ this.__pool = [];
+ this.__renderDebouncer = null;
+ this.__itemsIdxToInstIdx = {};
+ this.__chunkCount = null;
+ this.__lastChunkTime = null;
+ this.__sortFn = null;
+ this.__filterFn = null;
+ this.__observePaths = null;
+ this.__ctor = null;
+ this.__isDetached = true;
+ this.template = null;
+ }
+
+ /**
+ * @return {void}
+ */
+ disconnectedCallback() {
+ super.disconnectedCallback();
+ this.__isDetached = true;
+ for (let i=0; i<this.__instances.length; i++) {
+ this.__detachInstance(i);
+ }
+ }
+
+ /**
+ * @return {void}
+ */
+ connectedCallback() {
+ super.connectedCallback();
+ this.style.display = 'none';
+ // only perform attachment if the element was previously detached.
+ if (this.__isDetached) {
+ this.__isDetached = false;
+ let parent = this.parentNode;
+ for (let i=0; i<this.__instances.length; i++) {
+ this.__attachInstance(i, parent);
+ }
+ }
+ }
+
+ __ensureTemplatized() {
+ // Templatizing (generating the instance constructor) needs to wait
+ // until ready, since won't have its template content handed back to
+ // it until then
+ if (!this.__ctor) {
+ let template = this.template = /** @type {HTMLTemplateElement} */(this.querySelector('template'));
+ if (!template) {
+ // // Wait until childList changes and template should be there by then
+ let observer = new MutationObserver(() => {
+ if (this.querySelector('template')) {
+ observer.disconnect();
+ this.__render();
+ } else {
+ throw new Error('dom-repeat requires a <template> child');
+ }
+ });
+ observer.observe(this, {childList: true});
+ return false;
+ }
+ // Template instance props that should be excluded from forwarding
+ let instanceProps = {};
+ instanceProps[this.as] = true;
+ instanceProps[this.indexAs] = true;
+ instanceProps[this.itemsIndexAs] = true;
+ this.__ctor = templatize(template, this, {
+ mutableData: this.mutableData,
+ parentModel: true,
+ instanceProps: instanceProps,
+ /**
+ * @this {this}
+ * @param {string} prop Property to set
+ * @param {*} value Value to set property to
+ */
+ forwardHostProp: function(prop, value) {
+ let i$ = this.__instances;
+ for (let i=0, inst; (i<i$.length) && (inst=i$[i]); i++) {
+ inst.forwardHostProp(prop, value);
+ }
+ },
+ /**
+ * @this {this}
+ * @param {Object} inst Instance to notify
+ * @param {string} prop Property to notify
+ * @param {*} value Value to notify
+ */
+ notifyInstanceProp: function(inst, prop, value) {
+ if (matches(this.as, prop)) {
+ let idx = inst[this.itemsIndexAs];
+ if (prop == this.as) {
+ this.items[idx] = value;
+ }
+ let path = translate(this.as, 'items.' + idx, prop);
+ this.notifyPath(path, value);
+ }
+ }
+ });
+ }
+ return true;
+ }
+
+ __getMethodHost() {
+ // Technically this should be the owner of the outermost template.
+ // In shadow dom, this is always getRootNode().host, but we can
+ // approximate this via cooperation with our dataHost always setting
+ // `_methodHost` as long as there were bindings (or id's) on this
+ // instance causing it to get a dataHost.
+ return this.__dataHost._methodHost || this.__dataHost;
+ }
+
+ __functionFromPropertyValue(functionOrMethodName) {
+ if (typeof functionOrMethodName === 'string') {
+ let methodName = functionOrMethodName;
+ let obj = this.__getMethodHost();
+ return function() { return obj[methodName].apply(obj, arguments); };
+ }
+
+ return functionOrMethodName;
+ }
+
+ __sortChanged(sort) {
+ this.__sortFn = this.__functionFromPropertyValue(sort);
+ if (this.items) { this.__debounceRender(this.__render); }
+ }
+
+ __filterChanged(filter) {
+ this.__filterFn = this.__functionFromPropertyValue(filter);
+ if (this.items) { this.__debounceRender(this.__render); }
+ }
+
+ __computeFrameTime(rate) {
+ return Math.ceil(1000/rate);
+ }
+
+ __initializeChunking() {
+ if (this.initialCount) {
+ this.__limit = this.initialCount;
+ this.__chunkCount = this.initialCount;
+ this.__lastChunkTime = performance.now();
+ }
+ }
+
+ __tryRenderChunk() {
+ // Debounced so that multiple calls through `_render` between animation
+ // frames only queue one new rAF (e.g. array mutation & chunked render)
+ if (this.items && this.__limit < this.items.length) {
+ this.__debounceRender(this.__requestRenderChunk);
+ }
+ }
+
+ __requestRenderChunk() {
+ requestAnimationFrame(()=>this.__renderChunk());
+ }
+
+ __renderChunk() {
+ // Simple auto chunkSize throttling algorithm based on feedback loop:
+ // measure actual time between frames and scale chunk count by ratio
+ // of target/actual frame time
+ let currChunkTime = performance.now();
+ let ratio = this._targetFrameTime / (currChunkTime - this.__lastChunkTime);
+ this.__chunkCount = Math.round(this.__chunkCount * ratio) || 1;
+ this.__limit += this.__chunkCount;
+ this.__lastChunkTime = currChunkTime;
+ this.__debounceRender(this.__render);
+ }
+
+ __observeChanged() {
+ this.__observePaths = this.observe &&
+ this.observe.replace('.*', '.').split(' ');
+ }
+
+ __itemsChanged(change) {
+ if (this.items && !Array.isArray(this.items)) {
+ console.warn('dom-repeat expected array for `items`, found', this.items);
+ }
+ // If path was to an item (e.g. 'items.3' or 'items.3.foo'), forward the
+ // path to that instance synchronously (returns false for non-item paths)
+ if (!this.__handleItemPath(change.path, change.value)) {
+ // Otherwise, the array was reset ('items') or spliced ('items.splices'),
+ // so queue a full refresh
+ this.__initializeChunking();
+ this.__debounceRender(this.__render);
+ }
+ }
+
+ __handleObservedPaths(path) {
+ // Handle cases where path changes should cause a re-sort/filter
+ if (this.__sortFn || this.__filterFn) {
+ if (!path) {
+ // Always re-render if the item itself changed
+ this.__debounceRender(this.__render, this.delay);
+ } else if (this.__observePaths) {
+ // Otherwise, re-render if the path changed matches an observed path
+ let paths = this.__observePaths;
+ for (let i=0; i<paths.length; i++) {
+ if (path.indexOf(paths[i]) === 0) {
+ this.__debounceRender(this.__render, this.delay);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * @param {function(this:DomRepeat)} fn Function to debounce.
+ * @param {number=} delay Delay in ms to debounce by.
+ */
+ __debounceRender(fn, delay = 0) {
+ this.__renderDebouncer = Debouncer.debounce(
+ this.__renderDebouncer
+ , delay > 0 ? timeOut.after(delay) : microTask
+ , fn.bind(this));
+ enqueueDebouncer(this.__renderDebouncer);
+ }
+
+ /**
+ * Forces the element to render its content. Normally rendering is
+ * asynchronous to a provoking change. This is done for efficiency so
+ * that multiple changes trigger only a single render. The render method
+ * should be called if, for example, template rendering is required to
+ * validate application state.
+ * @return {void}
+ */
+ render() {
+ // Queue this repeater, then flush all in order
+ this.__debounceRender(this.__render);
+ flush();
+ }
+
+ __render() {
+ if (!this.__ensureTemplatized()) {
+ // No template found yet
+ return;
+ }
+ this.__applyFullRefresh();
+ // Reset the pool
+ // TODO(kschaaf): Reuse pool across turns and nested templates
+ // Now that objects/arrays are re-evaluated when set, we can safely
+ // reuse pooled instances across turns, however we still need to decide
+ // semantics regarding how long to hold, how many to hold, etc.
+ this.__pool.length = 0;
+ // Set rendered item count
+ this._setRenderedItemCount(this.__instances.length);
+ // Notify users
+ this.dispatchEvent(new CustomEvent('dom-change', {
+ bubbles: true,
+ composed: true
+ }));
+ // Check to see if we need to render more items
+ this.__tryRenderChunk();
+ }
+
+ __applyFullRefresh() {
+ let items = this.items || [];
+ let isntIdxToItemsIdx = new Array(items.length);
+ for (let i=0; i<items.length; i++) {
+ isntIdxToItemsIdx[i] = i;
+ }
+ // Apply user filter
+ if (this.__filterFn) {
+ isntIdxToItemsIdx = isntIdxToItemsIdx.filter((i, idx, array) =>
+ this.__filterFn(items[i], idx, array));
+ }
+ // Apply user sort
+ if (this.__sortFn) {
+ isntIdxToItemsIdx.sort((a, b) => this.__sortFn(items[a], items[b]));
+ }
+ // items->inst map kept for item path forwarding
+ const itemsIdxToInstIdx = this.__itemsIdxToInstIdx = {};
+ let instIdx = 0;
+ // Generate instances and assign items
+ const limit = Math.min(isntIdxToItemsIdx.length, this.__limit);
+ for (; instIdx<limit; instIdx++) {
+ let inst = this.__instances[instIdx];
+ let itemIdx = isntIdxToItemsIdx[instIdx];
+ let item = items[itemIdx];
+ itemsIdxToInstIdx[itemIdx] = instIdx;
+ if (inst) {
+ inst._setPendingProperty(this.as, item);
+ inst._setPendingProperty(this.indexAs, instIdx);
+ inst._setPendingProperty(this.itemsIndexAs, itemIdx);
+ inst._flushProperties();
+ } else {
+ this.__insertInstance(item, instIdx, itemIdx);
+ }
+ }
+ // Remove any extra instances from previous state
+ for (let i=this.__instances.length-1; i>=instIdx; i--) {
+ this.__detachAndRemoveInstance(i);
+ }
+ }
+
+ __detachInstance(idx) {
+ let inst = this.__instances[idx];
+ for (let i=0; i<inst.children.length; i++) {
+ let el = inst.children[i];
+ inst.root.appendChild(el);
+ }
+ return inst;
+ }
+
+ __attachInstance(idx, parent) {
+ let inst = this.__instances[idx];
+ parent.insertBefore(inst.root, this);
+ }
+
+ __detachAndRemoveInstance(idx) {
+ let inst = this.__detachInstance(idx);
+ if (inst) {
+ this.__pool.push(inst);
+ }
+ this.__instances.splice(idx, 1);
+ }
+
+ __stampInstance(item, instIdx, itemIdx) {
+ let model = {};
+ model[this.as] = item;
+ model[this.indexAs] = instIdx;
+ model[this.itemsIndexAs] = itemIdx;
+ return new this.__ctor(model);
+ }
+
+ __insertInstance(item, instIdx, itemIdx) {
+ let inst = this.__pool.pop();
+ if (inst) {
+ // TODO(kschaaf): If the pool is shared across turns, hostProps
+ // need to be re-set to reused instances in addition to item
+ inst._setPendingProperty(this.as, item);
+ inst._setPendingProperty(this.indexAs, instIdx);
+ inst._setPendingProperty(this.itemsIndexAs, itemIdx);
+ inst._flushProperties();
+ } else {
+ inst = this.__stampInstance(item, instIdx, itemIdx);
+ }
+ let beforeRow = this.__instances[instIdx + 1];
+ let beforeNode = beforeRow ? beforeRow.children[0] : this;
+ this.parentNode.insertBefore(inst.root, beforeNode);
+ this.__instances[instIdx] = inst;
+ return inst;
+ }
+
+ // Implements extension point from Templatize mixin
+ /**
+ * Shows or hides the template instance top level child elements. For
+ * text nodes, `textContent` is removed while "hidden" and replaced when
+ * "shown."
+ * @param {boolean} hidden Set to true to hide the children;
+ * set to false to show them.
+ * @return {void}
+ * @protected
+ */
+ _showHideChildren(hidden) {
+ for (let i=0; i<this.__instances.length; i++) {
+ this.__instances[i]._showHideChildren(hidden);
+ }
+ }
+
+ // Called as a side effect of a host items.<key>.<path> path change,
+ // responsible for notifying item.<path> changes to inst for key
+ __handleItemPath(path, value) {
+ let itemsPath = path.slice(6); // 'items.'.length == 6
+ let dot = itemsPath.indexOf('.');
+ let itemsIdx = dot < 0 ? itemsPath : itemsPath.substring(0, dot);
+ // If path was index into array...
+ if (itemsIdx == parseInt(itemsIdx, 10)) {
+ let itemSubPath = dot < 0 ? '' : itemsPath.substring(dot+1);
+ // If the path is observed, it will trigger a full refresh
+ this.__handleObservedPaths(itemSubPath);
+ // Note, even if a rull refresh is triggered, always do the path
+ // notification because unless mutableData is used for dom-repeat
+ // and all elements in the instance subtree, a full refresh may
+ // not trigger the proper update.
+ let instIdx = this.__itemsIdxToInstIdx[itemsIdx];
+ let inst = this.__instances[instIdx];
+ if (inst) {
+ let itemPath = this.as + (itemSubPath ? '.' + itemSubPath : '');
+ // This is effectively `notifyPath`, but avoids some of the overhead
+ // of the public API
+ inst._setPendingPropertyOrPath(itemPath, value, false, true);
+ inst._flushProperties();
+ }
+ return true;
+ }
+ }
+
+ /**
+ * Returns the item associated with a given element stamped by
+ * this `dom-repeat`.
+ *
+ * Note, to modify sub-properties of the item,
+ * `modelForElement(el).set('item.<sub-prop>', value)`
+ * should be used.
+ *
+ * @param {!HTMLElement} el Element for which to return the item.
+ * @return {*} Item associated with the element.
+ */
+ itemForElement(el) {
+ let instance = this.modelForElement(el);
+ return instance && instance[this.as];
+ }
+
+ /**
+ * Returns the inst index for a given element stamped by this `dom-repeat`.
+ * If `sort` is provided, the index will reflect the sorted order (rather
+ * than the original array order).
+ *
+ * @param {!HTMLElement} el Element for which to return the index.
+ * @return {?number} Row index associated with the element (note this may
+ * not correspond to the array index if a user `sort` is applied).
+ */
+ indexForElement(el) {
+ let instance = this.modelForElement(el);
+ return instance && instance[this.indexAs];
+ }
+
+ /**
+ * Returns the template "model" associated with a given element, which
+ * serves as the binding scope for the template instance the element is
+ * contained in. A template model
+ * should be used to manipulate data associated with this template instance.
+ *
+ * Example:
+ *
+ * let model = modelForElement(el);
+ * if (model.index < 10) {
+ * model.set('item.checked', true);
+ * }
+ *
+ * @param {!HTMLElement} el Element for which to return a template model.
+ * @return {TemplateInstanceBase} Model representing the binding scope for
+ * the element.
+ */
+ modelForElement(el) {
+ return modelForElement$0(this.template, el);
+ }
+
+}
+
+customElements.define(DomRepeat.is, DomRepeat);
diff --git a/third_party/polymer3/bower_components/polymer/lib/legacy/class.js b/third_party/polymer3/bower_components/polymer/lib/legacy/class.js
new file mode 100644
index 0000000..e9ebc47
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/lib/legacy/class.js
@@ -0,0 +1,366 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import { LegacyElementMixin } from './legacy-element-mixin.js';
+
+import { DomModule } from '../elements/dom-module.js';
+
+let metaProps = {
+ attached: true,
+ detached: true,
+ ready: true,
+ created: true,
+ beforeRegister: true,
+ registered: true,
+ attributeChanged: true,
+ // meta objects
+ behaviors: true
+};
+
+/**
+ * Applies a "legacy" behavior or array of behaviors to the provided class.
+ *
+ * Note: this method will automatically also apply the `LegacyElementMixin`
+ * to ensure that any legacy behaviors can rely on legacy Polymer API on
+ * the underlying element.
+ *
+ * @function
+ * @template T
+ * @param {!Object|!Array<!Object>} behaviors Behavior object or array of behaviors.
+ * @param {function(new:T)} klass Element class.
+ * @return {function(new:T)} Returns a new Element class extended by the
+ * passed in `behaviors` and also by `LegacyElementMixin`.
+ * @suppress {invalidCasts, checkTypes}
+ */
+export function mixinBehaviors(behaviors, klass) {
+ if (!behaviors) {
+ klass = /** @type {HTMLElement} */(klass); // eslint-disable-line no-self-assign
+ return klass;
+ }
+ // NOTE: ensure the behavior is extending a class with
+ // legacy element api. This is necessary since behaviors expect to be able
+ // to access 1.x legacy api.
+ klass = LegacyElementMixin(klass);
+ if (!Array.isArray(behaviors)) {
+ behaviors = [behaviors];
+ }
+ let superBehaviors = klass.prototype.behaviors;
+ // get flattened, deduped list of behaviors *not* already on super class
+ behaviors = flattenBehaviors(behaviors, null, superBehaviors);
+ // mixin new behaviors
+ klass = _mixinBehaviors(behaviors, klass);
+ if (superBehaviors) {
+ behaviors = superBehaviors.concat(behaviors);
+ }
+ // Set behaviors on prototype for BC...
+ klass.prototype.behaviors = behaviors;
+ return klass;
+}
+
+// NOTE:
+// 1.x
+// Behaviors were mixed in *in reverse order* and de-duped on the fly.
+// The rule was that behavior properties were copied onto the element
+// prototype if and only if the property did not already exist.
+// Given: Polymer{ behaviors: [A, B, C, A, B]}, property copy order was:
+// (1), B, (2), A, (3) C. This means prototype properties win over
+// B properties win over A win over C. This mirrors what would happen
+// with inheritance if element extended B extended A extended C.
+//
+// Again given, Polymer{ behaviors: [A, B, C, A, B]}, the resulting
+// `behaviors` array was [C, A, B].
+// Behavior lifecycle methods were called in behavior array order
+// followed by the element, e.g. (1) C.created, (2) A.created,
+// (3) B.created, (4) element.created. There was no support for
+// super, and "super-behavior" methods were callable only by name).
+//
+// 2.x
+// Behaviors are made into proper mixins which live in the
+// element's prototype chain. Behaviors are placed in the element prototype
+// eldest to youngest and de-duped youngest to oldest:
+// So, first [A, B, C, A, B] becomes [C, A, B] then,
+// the element prototype becomes (oldest) (1) PolymerElement, (2) class(C),
+// (3) class(A), (4) class(B), (5) class(Polymer({...})).
+// Result:
+// This means element properties win over B properties win over A win
+// over C. (same as 1.x)
+// If lifecycle is called (super then me), order is
+// (1) C.created, (2) A.created, (3) B.created, (4) element.created
+// (again same as 1.x)
+function _mixinBehaviors(behaviors, klass) {
+ for (let i=0; i<behaviors.length; i++) {
+ let b = behaviors[i];
+ if (b) {
+ klass = Array.isArray(b) ? _mixinBehaviors(b, klass) :
+ GenerateClassFromInfo(b, klass);
+ }
+ }
+ return klass;
+}
+
+/**
+ * @param {Array} behaviors List of behaviors to flatten.
+ * @param {Array=} list Target list to flatten behaviors into.
+ * @param {Array=} exclude List of behaviors to exclude from the list.
+ * @return {!Array} Returns the list of flattened behaviors.
+ */
+function flattenBehaviors(behaviors, list, exclude) {
+ list = list || [];
+ for (let i=behaviors.length-1; i >= 0; i--) {
+ let b = behaviors[i];
+ if (b) {
+ if (Array.isArray(b)) {
+ flattenBehaviors(b, list);
+ } else {
+ // dedup
+ if (list.indexOf(b) < 0 && (!exclude || exclude.indexOf(b) < 0)) {
+ list.unshift(b);
+ }
+ }
+ } else {
+ console.warn('behavior is null, check for missing or 404 import');
+ }
+ }
+ return list;
+}
+
+/**
+ * @param {!PolymerInit} info Polymer info object
+ * @param {function(new:HTMLElement)} Base base class to extend with info object
+ * @return {function(new:HTMLElement)} Generated class
+ * @suppress {checkTypes}
+ * @private
+ */
+function GenerateClassFromInfo(info, Base) {
+
+ class PolymerGenerated extends Base {
+
+ static get properties() {
+ return info.properties;
+ }
+
+ static get observers() {
+ return info.observers;
+ }
+
+ /**
+ * @return {HTMLTemplateElement} template for this class
+ */
+ static get template() {
+ // get template first from any imperative set in `info._template`
+ return info._template ||
+ // next look in dom-module associated with this element's is.
+ DomModule && DomModule.import(this.is, 'template') ||
+ // next look for superclass template (note: use superclass symbol
+ // to ensure correct `this.is`)
+ Base.template ||
+ // finally fall back to `_template` in element's prototype.
+ this.prototype._template ||
+ null;
+ }
+
+ /**
+ * @return {void}
+ */
+ created() {
+ super.created();
+ if (info.created) {
+ info.created.call(this);
+ }
+ }
+
+ /**
+ * @return {void}
+ */
+ _registered() {
+ super._registered();
+ /* NOTE: `beforeRegister` is called here for bc, but the behavior
+ is different than in 1.x. In 1.0, the method was called *after*
+ mixing prototypes together but *before* processing of meta-objects.
+ However, dynamic effects can still be set here and can be done either
+ in `beforeRegister` or `registered`. It is no longer possible to set
+ `is` in `beforeRegister` as you could in 1.x.
+ */
+ if (info.beforeRegister) {
+ info.beforeRegister.call(Object.getPrototypeOf(this));
+ }
+ if (info.registered) {
+ info.registered.call(Object.getPrototypeOf(this));
+ }
+ }
+
+ /**
+ * @return {void}
+ */
+ _applyListeners() {
+ super._applyListeners();
+ if (info.listeners) {
+ for (let l in info.listeners) {
+ this._addMethodEventListenerToNode(this, l, info.listeners[l]);
+ }
+ }
+ }
+
+ // note: exception to "super then me" rule;
+ // do work before calling super so that super attributes
+ // only apply if not already set.
+ /**
+ * @return {void}
+ */
+ _ensureAttributes() {
+ if (info.hostAttributes) {
+ for (let a in info.hostAttributes) {
+ this._ensureAttribute(a, info.hostAttributes[a]);
+ }
+ }
+ super._ensureAttributes();
+ }
+
+ /**
+ * @return {void}
+ */
+ ready() {
+ super.ready();
+ if (info.ready) {
+ info.ready.call(this);
+ }
+ }
+
+ /**
+ * @return {void}
+ */
+ attached() {
+ super.attached();
+ if (info.attached) {
+ info.attached.call(this);
+ }
+ }
+
+ /**
+ * @return {void}
+ */
+ detached() {
+ super.detached();
+ if (info.detached) {
+ info.detached.call(this);
+ }
+ }
+
+ /**
+ * Implements native Custom Elements `attributeChangedCallback` to
+ * set an attribute value to a property via `_attributeToProperty`.
+ *
+ * @param {string} name Name of attribute that changed
+ * @param {?string} old Old attribute value
+ * @param {?string} value New attribute value
+ * @return {void}
+ */
+ attributeChanged(name, old, value) {
+ super.attributeChanged(name, old, value);
+ if (info.attributeChanged) {
+ info.attributeChanged.call(this, name, old, value);
+ }
+ }
+ }
+
+ PolymerGenerated.generatedFrom = info;
+
+ for (let p in info) {
+ // NOTE: cannot copy `metaProps` methods onto prototype at least because
+ // `super.ready` must be called and is not included in the user fn.
+ if (!(p in metaProps)) {
+ let pd = Object.getOwnPropertyDescriptor(info, p);
+ if (pd) {
+ Object.defineProperty(PolymerGenerated.prototype, p, pd);
+ }
+ }
+ }
+
+ return PolymerGenerated;
+}
+
+/**
+ * Generates a class that extends `LegacyElement` based on the
+ * provided info object. Metadata objects on the `info` object
+ * (`properties`, `observers`, `listeners`, `behaviors`, `is`) are used
+ * for Polymer's meta-programming systems, and any functions are copied
+ * to the generated class.
+ *
+ * Valid "metadata" values are as follows:
+ *
+ * `is`: String providing the tag name to register the element under. In
+ * addition, if a `dom-module` with the same id exists, the first template
+ * in that `dom-module` will be stamped into the shadow root of this element,
+ * with support for declarative event listeners (`on-...`), Polymer data
+ * bindings (`[[...]]` and `{{...}}`), and id-based node finding into
+ * `this.$`.
+ *
+ * `properties`: Object describing property-related metadata used by Polymer
+ * features (key: property names, value: object containing property metadata).
+ * Valid keys in per-property metadata include:
+ * - `type` (String|Number|Object|Array|...): Used by
+ * `attributeChangedCallback` to determine how string-based attributes
+ * are deserialized to JavaScript property values.
+ * - `notify` (boolean): Causes a change in the property to fire a
+ * non-bubbling event called `<property>-changed`. Elements that have
+ * enabled two-way binding to the property use this event to observe changes.
+ * - `readOnly` (boolean): Creates a getter for the property, but no setter.
+ * To set a read-only property, use the private setter method
+ * `_setProperty(property, value)`.
+ * - `observer` (string): Observer method name that will be called when
+ * the property changes. The arguments of the method are
+ * `(value, previousValue)`.
+ * - `computed` (string): String describing method and dependent properties
+ * for computing the value of this property (e.g. `'computeFoo(bar, zot)'`).
+ * Computed properties are read-only by default and can only be changed
+ * via the return value of the computing method.
+ *
+ * `observers`: Array of strings describing multi-property observer methods
+ * and their dependent properties (e.g. `'observeABC(a, b, c)'`).
+ *
+ * `listeners`: Object describing event listeners to be added to each
+ * instance of this element (key: event name, value: method name).
+ *
+ * `behaviors`: Array of additional `info` objects containing metadata
+ * and callbacks in the same format as the `info` object here which are
+ * merged into this element.
+ *
+ * `hostAttributes`: Object listing attributes to be applied to the host
+ * once created (key: attribute name, value: attribute value). Values
+ * are serialized based on the type of the value. Host attributes should
+ * generally be limited to attributes such as `tabIndex` and `aria-...`.
+ * Attributes in `hostAttributes` are only applied if a user-supplied
+ * attribute is not already present (attributes in markup override
+ * `hostAttributes`).
+ *
+ * In addition, the following Polymer-specific callbacks may be provided:
+ * - `registered`: called after first instance of this element,
+ * - `created`: called during `constructor`
+ * - `attached`: called during `connectedCallback`
+ * - `detached`: called during `disconnectedCallback`
+ * - `ready`: called before first `attached`, after all properties of
+ * this element have been propagated to its template and all observers
+ * have run
+ *
+ * @param {!PolymerInit} info Object containing Polymer metadata and functions
+ * to become class methods.
+ * @return {function(new:HTMLElement)} Generated class
+ */
+export const Class = function(info) {
+ if (!info) {
+ console.warn(`Polymer's Class function requires \`info\` argument`);
+ }
+ let klass = GenerateClassFromInfo(info, info.behaviors ?
+ // note: mixinBehaviors ensures `LegacyElementMixin`.
+ mixinBehaviors(info.behaviors, HTMLElement) :
+ LegacyElementMixin(HTMLElement));
+ // decorate klass with registration info
+ klass.is = info.is;
+ return klass;
+};
diff --git a/third_party/polymer3/bower_components/polymer/lib/legacy/legacy-element-mixin.js b/third_party/polymer3/bower_components/polymer/lib/legacy/legacy-element-mixin.js
new file mode 100644
index 0000000..1525087
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/lib/legacy/legacy-element-mixin.js
@@ -0,0 +1,987 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import '@webcomponents/shadycss/entrypoints/apply-shim.js';
+
+import { ElementMixin } from '../mixins/element-mixin.js';
+import { GestureEventListeners } from '../mixins/gesture-event-listeners.js';
+import { DirMixin } from '../mixins/dir-mixin.js';
+import { dedupingMixin } from '../utils/mixin.js';
+import '../utils/render-status.js';
+import '../utils/unresolved.js';
+import { dom as dom$0, matchesSelector } from './polymer.dom.js';
+import { setTouchAction } from '../utils/gestures.js';
+import { Debouncer } from '../utils/debounce.js';
+import { timeOut, microTask } from '../utils/async.js';
+import { get as get$0 } from '../utils/path.js';
+
+let styleInterface = window.ShadyCSS;
+
+/**
+ * Element class mixin that provides Polymer's "legacy" API intended to be
+ * backward-compatible to the greatest extent possible with the API
+ * found on the Polymer 1.x `Polymer.Base` prototype applied to all elements
+ * defined using the `Polymer({...})` function.
+ *
+ * @mixinFunction
+ * @polymer
+ * @appliesMixin Polymer.ElementMixin
+ * @appliesMixin Polymer.GestureEventListeners
+ * @property isAttached {boolean} Set to `true` in this element's
+ * `connectedCallback` and `false` in `disconnectedCallback`
+ * @summary Element class mixin that provides Polymer's "legacy" API
+ */
+export const LegacyElementMixin = dedupingMixin((base) => {
+
+ /**
+ * @constructor
+ * @extends {base}
+ * @implements {Polymer_ElementMixin}
+ * @implements {Polymer_GestureEventListeners}
+ * @implements {Polymer_DirMixin}
+ */
+ const legacyElementBase = DirMixin(GestureEventListeners(ElementMixin(base)));
+
+ /**
+ * Map of simple names to touch action names
+ * @dict
+ */
+ const DIRECTION_MAP = {
+ 'x': 'pan-x',
+ 'y': 'pan-y',
+ 'none': 'none',
+ 'all': 'auto'
+ };
+
+ /**
+ * @polymer
+ * @mixinClass
+ * @extends {legacyElementBase}
+ * @implements {Polymer_LegacyElementMixin}
+ * @unrestricted
+ */
+ class LegacyElement extends legacyElementBase {
+
+ constructor() {
+ super();
+ /** @type {boolean} */
+ this.isAttached;
+ /** @type {WeakMap<!Element, !Object<string, !Function>>} */
+ this.__boundListeners;
+ /** @type {Object<string, Function>} */
+ this._debouncers;
+ // Ensure listeners are applied immediately so that they are
+ // added before declarative event listeners. This allows an element to
+ // decorate itself via an event prior to any declarative listeners
+ // seeing the event. Note, this ensures compatibility with 1.x ordering.
+ this._applyListeners();
+ }
+
+ /**
+ * Forwards `importMeta` from the prototype (i.e. from the info object
+ * passed to `Polymer({...})`) to the static API.
+ *
+ * @return {!Object} The `import.meta` object set on the prototype
+ * @suppress {missingProperties} `this` is always in the instance in
+ * closure for some reason even in a static method, rather than the class
+ */
+ static get importMeta() {
+ return this.prototype.importMeta;
+ }
+
+ /**
+ * Legacy callback called during the `constructor`, for overriding
+ * by the user.
+ * @return {void}
+ */
+ created() {}
+
+ /**
+ * Provides an implementation of `connectedCallback`
+ * which adds Polymer legacy API's `attached` method.
+ * @return {void}
+ * @override
+ */
+ connectedCallback() {
+ super.connectedCallback();
+ this.isAttached = true;
+ this.attached();
+ }
+
+ /**
+ * Legacy callback called during `connectedCallback`, for overriding
+ * by the user.
+ * @return {void}
+ */
+ attached() {}
+
+ /**
+ * Provides an implementation of `disconnectedCallback`
+ * which adds Polymer legacy API's `detached` method.
+ * @return {void}
+ * @override
+ */
+ disconnectedCallback() {
+ super.disconnectedCallback();
+ this.isAttached = false;
+ this.detached();
+ }
+
+ /**
+ * Legacy callback called during `disconnectedCallback`, for overriding
+ * by the user.
+ * @return {void}
+ */
+ detached() {}
+
+ /**
+ * Provides an override implementation of `attributeChangedCallback`
+ * which adds the Polymer legacy API's `attributeChanged` method.
+ * @param {string} name Name of attribute.
+ * @param {?string} old Old value of attribute.
+ * @param {?string} value Current value of attribute.
+ * @param {?string} namespace Attribute namespace.
+ * @return {void}
+ * @override
+ */
+ attributeChangedCallback(name, old, value, namespace) {
+ if (old !== value) {
+ super.attributeChangedCallback(name, old, value, namespace);
+ this.attributeChanged(name, old, value);
+ }
+ }
+
+ /**
+ * Legacy callback called during `attributeChangedChallback`, for overriding
+ * by the user.
+ * @param {string} name Name of attribute.
+ * @param {?string} old Old value of attribute.
+ * @param {?string} value Current value of attribute.
+ * @return {void}
+ */
+ attributeChanged(name, old, value) {} // eslint-disable-line no-unused-vars
+
+ /**
+ * Overrides the default `Polymer.PropertyEffects` implementation to
+ * add support for class initialization via the `_registered` callback.
+ * This is called only when the first instance of the element is created.
+ *
+ * @return {void}
+ * @override
+ * @suppress {invalidCasts}
+ */
+ _initializeProperties() {
+ let proto = Object.getPrototypeOf(this);
+ if (!proto.hasOwnProperty('__hasRegisterFinished')) {
+ proto.__hasRegisterFinished = true;
+ this._registered();
+ }
+ super._initializeProperties();
+ this.root = /** @type {HTMLElement} */(this);
+ this.created();
+ }
+
+ /**
+ * Called automatically when an element is initializing.
+ * Users may override this method to perform class registration time
+ * work. The implementation should ensure the work is performed
+ * only once for the class.
+ * @protected
+ * @return {void}
+ */
+ _registered() {}
+
+ /**
+ * Overrides the default `Polymer.PropertyEffects` implementation to
+ * add support for installing `hostAttributes` and `listeners`.
+ *
+ * @return {void}
+ * @override
+ */
+ ready() {
+ this._ensureAttributes();
+ super.ready();
+ }
+
+ /**
+ * Ensures an element has required attributes. Called when the element
+ * is being readied via `ready`. Users should override to set the
+ * element's required attributes. The implementation should be sure
+ * to check and not override existing attributes added by
+ * the user of the element. Typically, setting attributes should be left
+ * to the element user and not done here; reasonable exceptions include
+ * setting aria roles and focusability.
+ * @protected
+ * @return {void}
+ */
+ _ensureAttributes() {}
+
+ /**
+ * Adds element event listeners. Called when the element
+ * is being readied via `ready`. Users should override to
+ * add any required element event listeners.
+ * In performance critical elements, the work done here should be kept
+ * to a minimum since it is done before the element is rendered. In
+ * these elements, consider adding listeners asynchronously so as not to
+ * block render.
+ * @protected
+ * @return {void}
+ */
+ _applyListeners() {}
+
+ /**
+ * Converts a typed JavaScript value to a string.
+ *
+ * Note this method is provided as backward-compatible legacy API
+ * only. It is not directly called by any Polymer features. To customize
+ * how properties are serialized to attributes for attribute bindings and
+ * `reflectToAttribute: true` properties as well as this method, override
+ * the `_serializeValue` method provided by `Polymer.PropertyAccessors`.
+ *
+ * @param {*} value Value to deserialize
+ * @return {string | undefined} Serialized value
+ */
+ serialize(value) {
+ return this._serializeValue(value);
+ }
+
+ /**
+ * Converts a string to a typed JavaScript value.
+ *
+ * Note this method is provided as backward-compatible legacy API
+ * only. It is not directly called by any Polymer features. To customize
+ * how attributes are deserialized to properties for in
+ * `attributeChangedCallback`, override `_deserializeValue` method
+ * provided by `Polymer.PropertyAccessors`.
+ *
+ * @param {string} value String to deserialize
+ * @param {*} type Type to deserialize the string to
+ * @return {*} Returns the deserialized value in the `type` given.
+ */
+ deserialize(value, type) {
+ return this._deserializeValue(value, type);
+ }
+
+ /**
+ * Serializes a property to its associated attribute.
+ *
+ * Note this method is provided as backward-compatible legacy API
+ * only. It is not directly called by any Polymer features.
+ *
+ * @param {string} property Property name to reflect.
+ * @param {string=} attribute Attribute name to reflect.
+ * @param {*=} value Property value to reflect.
+ * @return {void}
+ */
+ reflectPropertyToAttribute(property, attribute, value) {
+ this._propertyToAttribute(property, attribute, value);
+ }
+
+ /**
+ * Sets a typed value to an HTML attribute on a node.
+ *
+ * Note this method is provided as backward-compatible legacy API
+ * only. It is not directly called by any Polymer features.
+ *
+ * @param {*} value Value to serialize.
+ * @param {string} attribute Attribute name to serialize to.
+ * @param {Element} node Element to set attribute to.
+ * @return {void}
+ */
+ serializeValueToAttribute(value, attribute, node) {
+ this._valueToNodeAttribute(/** @type {Element} */ (node || this), value, attribute);
+ }
+
+ /**
+ * Copies own properties (including accessor descriptors) from a source
+ * object to a target object.
+ *
+ * @param {Object} prototype Target object to copy properties to.
+ * @param {Object} api Source object to copy properties from.
+ * @return {Object} prototype object that was passed as first argument.
+ */
+ extend(prototype, api) {
+ if (!(prototype && api)) {
+ return prototype || api;
+ }
+ let n$ = Object.getOwnPropertyNames(api);
+ for (let i=0, n; (i<n$.length) && (n=n$[i]); i++) {
+ let pd = Object.getOwnPropertyDescriptor(api, n);
+ if (pd) {
+ Object.defineProperty(prototype, n, pd);
+ }
+ }
+ return prototype;
+ }
+
+ /**
+ * Copies props from a source object to a target object.
+ *
+ * Note, this method uses a simple `for...in` strategy for enumerating
+ * properties. To ensure only `ownProperties` are copied from source
+ * to target and that accessor implementations are copied, use `extend`.
+ *
+ * @param {!Object} target Target object to copy properties to.
+ * @param {!Object} source Source object to copy properties from.
+ * @return {!Object} Target object that was passed as first argument.
+ */
+ mixin(target, source) {
+ for (let i in source) {
+ target[i] = source[i];
+ }
+ return target;
+ }
+
+ /**
+ * Sets the prototype of an object.
+ *
+ * Note this method is provided as backward-compatible legacy API
+ * only. It is not directly called by any Polymer features.
+ * @param {Object} object The object on which to set the prototype.
+ * @param {Object} prototype The prototype that will be set on the given
+ * `object`.
+ * @return {Object} Returns the given `object` with its prototype set
+ * to the given `prototype` object.
+ */
+ chainObject(object, prototype) {
+ if (object && prototype && object !== prototype) {
+ object.__proto__ = prototype;
+ }
+ return object;
+ }
+
+ /* **** Begin Template **** */
+
+ /**
+ * Calls `importNode` on the `content` of the `template` specified and
+ * returns a document fragment containing the imported content.
+ *
+ * @param {HTMLTemplateElement} template HTML template element to instance.
+ * @return {!DocumentFragment} Document fragment containing the imported
+ * template content.
+ */
+ instanceTemplate(template) {
+ let content = this.constructor._contentForTemplate(template);
+ let dom = /** @type {!DocumentFragment} */
+ (document.importNode(content, true));
+ return dom;
+ }
+
+ /* **** Begin Events **** */
+
+
+
+ /**
+ * Dispatches a custom event with an optional detail value.
+ *
+ * @param {string} type Name of event type.
+ * @param {*=} detail Detail value containing event-specific
+ * payload.
+ * @param {{ bubbles: (boolean|undefined), cancelable: (boolean|undefined), composed: (boolean|undefined) }=}
+ * options Object specifying options. These may include:
+ * `bubbles` (boolean, defaults to `true`),
+ * `cancelable` (boolean, defaults to false), and
+ * `node` on which to fire the event (HTMLElement, defaults to `this`).
+ * @return {!Event} The new event that was fired.
+ */
+ fire(type, detail, options) {
+ options = options || {};
+ detail = (detail === null || detail === undefined) ? {} : detail;
+ let event = new Event(type, {
+ bubbles: options.bubbles === undefined ? true : options.bubbles,
+ cancelable: Boolean(options.cancelable),
+ composed: options.composed === undefined ? true: options.composed
+ });
+ event.detail = detail;
+ let node = options.node || this;
+ node.dispatchEvent(event);
+ return event;
+ }
+
+ /**
+ * Convenience method to add an event listener on a given element,
+ * late bound to a named method on this element.
+ *
+ * @param {Element} node Element to add event listener to.
+ * @param {string} eventName Name of event to listen for.
+ * @param {string} methodName Name of handler method on `this` to call.
+ * @return {void}
+ */
+ listen(node, eventName, methodName) {
+ node = /** @type {!Element} */ (node || this);
+ let hbl = this.__boundListeners ||
+ (this.__boundListeners = new WeakMap());
+ let bl = hbl.get(node);
+ if (!bl) {
+ bl = {};
+ hbl.set(node, bl);
+ }
+ let key = eventName + methodName;
+ if (!bl[key]) {
+ bl[key] = this._addMethodEventListenerToNode(
+ node, eventName, methodName, this);
+ }
+ }
+
+ /**
+ * Convenience method to remove an event listener from a given element,
+ * late bound to a named method on this element.
+ *
+ * @param {Element} node Element to remove event listener from.
+ * @param {string} eventName Name of event to stop listening to.
+ * @param {string} methodName Name of handler method on `this` to not call
+ anymore.
+ * @return {void}
+ */
+ unlisten(node, eventName, methodName) {
+ node = /** @type {!Element} */ (node || this);
+ let bl = this.__boundListeners && this.__boundListeners.get(node);
+ let key = eventName + methodName;
+ let handler = bl && bl[key];
+ if (handler) {
+ this._removeEventListenerFromNode(node, eventName, handler);
+ bl[key] = null;
+ }
+ }
+
+ /**
+ * Override scrolling behavior to all direction, one direction, or none.
+ *
+ * Valid scroll directions:
+ * - 'all': scroll in any direction
+ * - 'x': scroll only in the 'x' direction
+ * - 'y': scroll only in the 'y' direction
+ * - 'none': disable scrolling for this node
+ *
+ * @param {string=} direction Direction to allow scrolling
+ * Defaults to `all`.
+ * @param {Element=} node Element to apply scroll direction setting.
+ * Defaults to `this`.
+ * @return {void}
+ */
+ setScrollDirection(direction, node) {
+ setTouchAction( (node || this), DIRECTION_MAP[direction] || 'auto');
+ }
+ /* **** End Events **** */
+
+ /**
+ * Convenience method to run `querySelector` on this local DOM scope.
+ *
+ * This function calls `Polymer.dom(this.root).querySelector(slctr)`.
+ *
+ * @param {string} slctr Selector to run on this local DOM scope
+ * @return {Element} Element found by the selector, or null if not found.
+ */
+ $$(slctr) {
+ return this.root.querySelector(slctr);
+ }
+
+ /**
+ * Return the element whose local dom within which this element
+ * is contained. This is a shorthand for
+ * `this.getRootNode().host`.
+ * @this {Element}
+ */
+ get domHost() {
+ let root = this.getRootNode();
+ return (root instanceof DocumentFragment) ? /** @type {ShadowRoot} */ (root).host : root;
+ }
+
+ /**
+ * Force this element to distribute its children to its local dom.
+ * This should not be necessary as of Polymer 2.0.2 and is provided only
+ * for backwards compatibility.
+ * @return {void}
+ */
+ distributeContent() {
+ if (window.ShadyDOM && this.shadowRoot) {
+ ShadyDOM.flush();
+ }
+ }
+
+ /**
+ * Returns a list of nodes that are the effective childNodes. The effective
+ * childNodes list is the same as the element's childNodes except that
+ * any `<content>` elements are replaced with the list of nodes distributed
+ * to the `<content>`, the result of its `getDistributedNodes` method.
+ * @return {!Array<!Node>} List of effective child nodes.
+ * @suppress {invalidCasts} LegacyElementMixin must be applied to an HTMLElement
+ */
+ getEffectiveChildNodes() {
+ const thisEl = /** @type {Element} */ (this);
+ const domApi = /** @type {Polymer.DomApi} */(dom$0(thisEl));
+ return domApi.getEffectiveChildNodes();
+ }
+
+ /**
+ * Returns a list of nodes distributed within this element that match
+ * `selector`. These can be dom children or elements distributed to
+ * children that are insertion points.
+ * @param {string} selector Selector to run.
+ * @return {!Array<!Node>} List of distributed elements that match selector.
+ * @suppress {invalidCasts} LegacyElementMixin must be applied to an HTMLElement
+ */
+ queryDistributedElements(selector) {
+ const thisEl = /** @type {Element} */ (this);
+ const domApi = /** @type {Polymer.DomApi} */(dom$0(thisEl));
+ return domApi.queryDistributedElements(selector);
+ }
+
+ /**
+ * Returns a list of elements that are the effective children. The effective
+ * children list is the same as the element's children except that
+ * any `<content>` elements are replaced with the list of elements
+ * distributed to the `<content>`.
+ *
+ * @return {!Array<!Node>} List of effective children.
+ */
+ getEffectiveChildren() {
+ let list = this.getEffectiveChildNodes();
+ return list.filter(function(/** @type {!Node} */ n) {
+ return (n.nodeType === Node.ELEMENT_NODE);
+ });
+ }
+
+ /**
+ * Returns a string of text content that is the concatenation of the
+ * text content's of the element's effective childNodes (the elements
+ * returned by <a href="#getEffectiveChildNodes>getEffectiveChildNodes</a>.
+ *
+ * @return {string} List of effective children.
+ */
+ getEffectiveTextContent() {
+ let cn = this.getEffectiveChildNodes();
+ let tc = [];
+ for (let i=0, c; (c = cn[i]); i++) {
+ if (c.nodeType !== Node.COMMENT_NODE) {
+ tc.push(c.textContent);
+ }
+ }
+ return tc.join('');
+ }
+
+ /**
+ * Returns the first effective childNode within this element that
+ * match `selector`. These can be dom child nodes or elements distributed
+ * to children that are insertion points.
+ * @param {string} selector Selector to run.
+ * @return {Node} First effective child node that matches selector.
+ */
+ queryEffectiveChildren(selector) {
+ let e$ = this.queryDistributedElements(selector);
+ return e$ && e$[0];
+ }
+
+ /**
+ * Returns a list of effective childNodes within this element that
+ * match `selector`. These can be dom child nodes or elements distributed
+ * to children that are insertion points.
+ * @param {string} selector Selector to run.
+ * @return {!Array<!Node>} List of effective child nodes that match selector.
+ */
+ queryAllEffectiveChildren(selector) {
+ return this.queryDistributedElements(selector);
+ }
+
+ /**
+ * Returns a list of nodes distributed to this element's `<slot>`.
+ *
+ * If this element contains more than one `<slot>` in its local DOM,
+ * an optional selector may be passed to choose the desired content.
+ *
+ * @param {string=} slctr CSS selector to choose the desired
+ * `<slot>`. Defaults to `content`.
+ * @return {!Array<!Node>} List of distributed nodes for the `<slot>`.
+ */
+ getContentChildNodes(slctr) {
+ let content = this.root.querySelector(slctr || 'slot');
+ return content ? /** @type {Polymer.DomApi} */(dom$0(content)).getDistributedNodes() : [];
+ }
+
+ /**
+ * Returns a list of element children distributed to this element's
+ * `<slot>`.
+ *
+ * If this element contains more than one `<slot>` in its
+ * local DOM, an optional selector may be passed to choose the desired
+ * content. This method differs from `getContentChildNodes` in that only
+ * elements are returned.
+ *
+ * @param {string=} slctr CSS selector to choose the desired
+ * `<content>`. Defaults to `content`.
+ * @return {!Array<!HTMLElement>} List of distributed nodes for the
+ * `<slot>`.
+ * @suppress {invalidCasts}
+ */
+ getContentChildren(slctr) {
+ let children = /** @type {!Array<!HTMLElement>} */(this.getContentChildNodes(slctr).filter(function(n) {
+ return (n.nodeType === Node.ELEMENT_NODE);
+ }));
+ return children;
+ }
+
+ /**
+ * Checks whether an element is in this element's light DOM tree.
+ *
+ * @param {?Node} node The element to be checked.
+ * @return {boolean} true if node is in this element's light DOM tree.
+ * @suppress {invalidCasts} LegacyElementMixin must be applied to an HTMLElement
+ */
+ isLightDescendant(node) {
+ const thisNode = /** @type {Node} */ (this);
+ return thisNode !== node && thisNode.contains(node) &&
+ thisNode.getRootNode() === node.getRootNode();
+ }
+
+ /**
+ * Checks whether an element is in this element's local DOM tree.
+ *
+ * @param {!Element} node The element to be checked.
+ * @return {boolean} true if node is in this element's local DOM tree.
+ */
+ isLocalDescendant(node) {
+ return this.root === node.getRootNode();
+ }
+
+ /**
+ * No-op for backwards compatibility. This should now be handled by
+ * ShadyCss library.
+ * @param {*} container Unused
+ * @param {*} shouldObserve Unused
+ * @return {void}
+ */
+ scopeSubtree(container, shouldObserve) { // eslint-disable-line no-unused-vars
+ }
+
+ /**
+ * Returns the computed style value for the given property.
+ * @param {string} property The css property name.
+ * @return {string} Returns the computed css property value for the given
+ * `property`.
+ * @suppress {invalidCasts} LegacyElementMixin must be applied to an HTMLElement
+ */
+ getComputedStyleValue(property) {
+ return styleInterface.getComputedStyleValue(/** @type {!Element} */(this), property);
+ }
+
+ // debounce
+
+ /**
+ * Call `debounce` to collapse multiple requests for a named task into
+ * one invocation which is made after the wait time has elapsed with
+ * no new request. If no wait time is given, the callback will be called
+ * at microtask timing (guaranteed before paint).
+ *
+ * debouncedClickAction(e) {
+ * // will not call `processClick` more than once per 100ms
+ * this.debounce('click', function() {
+ * this.processClick();
+ * } 100);
+ * }
+ *
+ * @param {string} jobName String to identify the debounce job.
+ * @param {function():void} callback Function that is called (with `this`
+ * context) when the wait time elapses.
+ * @param {number} wait Optional wait time in milliseconds (ms) after the
+ * last signal that must elapse before invoking `callback`
+ * @return {!Object} Returns a debouncer object on which exists the
+ * following methods: `isActive()` returns true if the debouncer is
+ * active; `cancel()` cancels the debouncer if it is active;
+ * `flush()` immediately invokes the debounced callback if the debouncer
+ * is active.
+ */
+ debounce(jobName, callback, wait) {
+ this._debouncers = this._debouncers || {};
+ return this._debouncers[jobName] = Debouncer.debounce(
+ this._debouncers[jobName]
+ , wait > 0 ? timeOut.after(wait) : microTask
+ , callback.bind(this));
+ }
+
+ /**
+ * Returns whether a named debouncer is active.
+ *
+ * @param {string} jobName The name of the debouncer started with `debounce`
+ * @return {boolean} Whether the debouncer is active (has not yet fired).
+ */
+ isDebouncerActive(jobName) {
+ this._debouncers = this._debouncers || {};
+ let debouncer = this._debouncers[jobName];
+ return !!(debouncer && debouncer.isActive());
+ }
+
+ /**
+ * Immediately calls the debouncer `callback` and inactivates it.
+ *
+ * @param {string} jobName The name of the debouncer started with `debounce`
+ * @return {void}
+ */
+ flushDebouncer(jobName) {
+ this._debouncers = this._debouncers || {};
+ let debouncer = this._debouncers[jobName];
+ if (debouncer) {
+ debouncer.flush();
+ }
+ }
+
+ /**
+ * Cancels an active debouncer. The `callback` will not be called.
+ *
+ * @param {string} jobName The name of the debouncer started with `debounce`
+ * @return {void}
+ */
+ cancelDebouncer(jobName) {
+ this._debouncers = this._debouncers || {};
+ let debouncer = this._debouncers[jobName];
+ if (debouncer) {
+ debouncer.cancel();
+ }
+ }
+
+ /**
+ * Runs a callback function asynchronously.
+ *
+ * By default (if no waitTime is specified), async callbacks are run at
+ * microtask timing, which will occur before paint.
+ *
+ * @param {!Function} callback The callback function to run, bound to `this`.
+ * @param {number=} waitTime Time to wait before calling the
+ * `callback`. If unspecified or 0, the callback will be run at microtask
+ * timing (before paint).
+ * @return {number} Handle that may be used to cancel the async job.
+ */
+ async(callback, waitTime) {
+ return waitTime > 0 ? timeOut.run(callback.bind(this), waitTime) :
+ ~microTask.run(callback.bind(this));
+ }
+
+ /**
+ * Cancels an async operation started with `async`.
+ *
+ * @param {number} handle Handle returned from original `async` call to
+ * cancel.
+ * @return {void}
+ */
+ cancelAsync(handle) {
+ handle < 0 ? microTask.cancel(~handle) :
+ timeOut.cancel(handle);
+ }
+
+ // other
+
+ /**
+ * Convenience method for creating an element and configuring it.
+ *
+ * @param {string} tag HTML element tag to create.
+ * @param {Object=} props Object of properties to configure on the
+ * instance.
+ * @return {!Element} Newly created and configured element.
+ */
+ create(tag, props) {
+ let elt = document.createElement(tag);
+ if (props) {
+ if (elt.setProperties) {
+ elt.setProperties(props);
+ } else {
+ for (let n in props) {
+ elt[n] = props[n];
+ }
+ }
+ }
+ return elt;
+ }
+
+ /**
+ * Polyfill for Element.prototype.matches, which is sometimes still
+ * prefixed.
+ *
+ * @param {string} selector Selector to test.
+ * @param {!Element=} node Element to test the selector against.
+ * @return {boolean} Whether the element matches the selector.
+ */
+ elementMatches(selector, node) {
+ return matchesSelector( (node || this), selector);
+ }
+
+ /**
+ * Toggles an HTML attribute on or off.
+ *
+ * @param {string} name HTML attribute name
+ * @param {boolean=} bool Boolean to force the attribute on or off.
+ * When unspecified, the state of the attribute will be reversed.
+ * @param {Element=} node Node to target. Defaults to `this`.
+ * @return {void}
+ */
+ toggleAttribute(name, bool, node) {
+ node = /** @type {Element} */ (node || this);
+ if (arguments.length == 1) {
+ bool = !node.hasAttribute(name);
+ }
+ if (bool) {
+ node.setAttribute(name, '');
+ } else {
+ node.removeAttribute(name);
+ }
+ }
+
+
+ /**
+ * Toggles a CSS class on or off.
+ *
+ * @param {string} name CSS class name
+ * @param {boolean=} bool Boolean to force the class on or off.
+ * When unspecified, the state of the class will be reversed.
+ * @param {Element=} node Node to target. Defaults to `this`.
+ * @return {void}
+ */
+ toggleClass(name, bool, node) {
+ node = /** @type {Element} */ (node || this);
+ if (arguments.length == 1) {
+ bool = !node.classList.contains(name);
+ }
+ if (bool) {
+ node.classList.add(name);
+ } else {
+ node.classList.remove(name);
+ }
+ }
+
+ /**
+ * Cross-platform helper for setting an element's CSS `transform` property.
+ *
+ * @param {string} transformText Transform setting.
+ * @param {Element=} node Element to apply the transform to.
+ * Defaults to `this`
+ * @return {void}
+ */
+ transform(transformText, node) {
+ node = /** @type {Element} */ (node || this);
+ node.style.webkitTransform = transformText;
+ node.style.transform = transformText;
+ }
+
+ /**
+ * Cross-platform helper for setting an element's CSS `translate3d`
+ * property.
+ *
+ * @param {number} x X offset.
+ * @param {number} y Y offset.
+ * @param {number} z Z offset.
+ * @param {Element=} node Element to apply the transform to.
+ * Defaults to `this`.
+ * @return {void}
+ */
+ translate3d(x, y, z, node) {
+ node = /** @type {Element} */ (node || this);
+ this.transform('translate3d(' + x + ',' + y + ',' + z + ')', node);
+ }
+
+ /**
+ * Removes an item from an array, if it exists.
+ *
+ * If the array is specified by path, a change notification is
+ * generated, so that observers, data bindings and computed
+ * properties watching that path can update.
+ *
+ * If the array is passed directly, **no change
+ * notification is generated**.
+ *
+ * @param {string | !Array<number|string>} arrayOrPath Path to array from which to remove the item
+ * (or the array itself).
+ * @param {*} item Item to remove.
+ * @return {Array} Array containing item removed.
+ */
+ arrayDelete(arrayOrPath, item) {
+ let index;
+ if (Array.isArray(arrayOrPath)) {
+ index = arrayOrPath.indexOf(item);
+ if (index >= 0) {
+ return arrayOrPath.splice(index, 1);
+ }
+ } else {
+ let arr = get$0(this, arrayOrPath);
+ index = arr.indexOf(item);
+ if (index >= 0) {
+ return this.splice(arrayOrPath, index, 1);
+ }
+ }
+ return null;
+ }
+
+ // logging
+
+ /**
+ * Facades `console.log`/`warn`/`error` as override point.
+ *
+ * @param {string} level One of 'log', 'warn', 'error'
+ * @param {Array} args Array of strings or objects to log
+ * @return {void}
+ */
+ _logger(level, args) {
+ // accept ['foo', 'bar'] and [['foo', 'bar']]
+ if (Array.isArray(args) && args.length === 1 && Array.isArray(args[0])) {
+ args = args[0];
+ }
+ switch(level) {
+ case 'log':
+ case 'warn':
+ case 'error':
+ console[level](...args);
+ }
+ }
+
+ /**
+ * Facades `console.log` as an override point.
+ *
+ * @param {...*} args Array of strings or objects to log
+ * @return {void}
+ */
+ _log(...args) {
+ this._logger('log', args);
+ }
+
+ /**
+ * Facades `console.warn` as an override point.
+ *
+ * @param {...*} args Array of strings or objects to log
+ * @return {void}
+ */
+ _warn(...args) {
+ this._logger('warn', args);
+ }
+
+ /**
+ * Facades `console.error` as an override point.
+ *
+ * @param {...*} args Array of strings or objects to log
+ * @return {void}
+ */
+ _error(...args) {
+ this._logger('error', args);
+ }
+
+ /**
+ * Formats a message using the element type an a method name.
+ *
+ * @param {string} methodName Method name to associate with message
+ * @param {...*} args Array of strings or objects to log
+ * @return {Array} Array with formatting information for `console`
+ * logging.
+ */
+ _logf(methodName, ...args) {
+ return ['[%s::%s]', this.is, methodName, ...args];
+ }
+
+ }
+
+ LegacyElement.prototype.is = '';
+
+ return LegacyElement;
+
+});
diff --git a/third_party/polymer3/bower_components/polymer/lib/legacy/mutable-data-behavior.js b/third_party/polymer3/bower_components/polymer/lib/legacy/mutable-data-behavior.js
new file mode 100644
index 0000000..ee23666
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/lib/legacy/mutable-data-behavior.js
@@ -0,0 +1,150 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import { MutableData } from '../mixins/mutable-data.js';
+
+let mutablePropertyChange;
+/** @suppress {missingProperties} */
+(() => {
+ mutablePropertyChange = MutableData._mutablePropertyChange;
+})();
+
+/**
+ * Legacy element behavior to skip strict dirty-checking for objects and arrays,
+ * (always consider them to be "dirty") for use on legacy API Polymer elements.
+ *
+ * By default, `Polymer.PropertyEffects` performs strict dirty checking on
+ * objects, which means that any deep modifications to an object or array will
+ * not be propagated unless "immutable" data patterns are used (i.e. all object
+ * references from the root to the mutation were changed).
+ *
+ * Polymer also provides a proprietary data mutation and path notification API
+ * (e.g. `notifyPath`, `set`, and array mutation API's) that allow efficient
+ * mutation and notification of deep changes in an object graph to all elements
+ * bound to the same object graph.
+ *
+ * In cases where neither immutable patterns nor the data mutation API can be
+ * used, applying this mixin will cause Polymer to skip dirty checking for
+ * objects and arrays (always consider them to be "dirty"). This allows a
+ * user to make a deep modification to a bound object graph, and then either
+ * simply re-set the object (e.g. `this.items = this.items`) or call `notifyPath`
+ * (e.g. `this.notifyPath('items')`) to update the tree. Note that all
+ * elements that wish to be updated based on deep mutations must apply this
+ * mixin or otherwise skip strict dirty checking for objects/arrays.
+ * Specifically, any elements in the binding tree between the source of a
+ * mutation and the consumption of it must apply this behavior or enable the
+ * `Polymer.OptionalMutableDataBehavior`.
+ *
+ * In order to make the dirty check strategy configurable, see
+ * `Polymer.OptionalMutableDataBehavior`.
+ *
+ * Note, the performance characteristics of propagating large object graphs
+ * will be worse as opposed to using strict dirty checking with immutable
+ * patterns or Polymer's path notification API.
+ *
+ * @polymerBehavior
+ * @summary Behavior to skip strict dirty-checking for objects and
+ * arrays
+ */
+export const MutableDataBehavior = {
+
+ /**
+ * Overrides `Polymer.PropertyEffects` to provide option for skipping
+ * strict equality checking for Objects and Arrays.
+ *
+ * This method pulls the value to dirty check against from the `__dataTemp`
+ * cache (rather than the normal `__data` cache) for Objects. Since the temp
+ * cache is cleared at the end of a turn, this implementation allows
+ * side-effects of deep object changes to be processed by re-setting the
+ * same object (using the temp cache as an in-turn backstop to prevent
+ * cycles due to 2-way notification).
+ *
+ * @param {string} property Property name
+ * @param {*} value New property value
+ * @param {*} old Previous property value
+ * @return {boolean} Whether the property should be considered a change
+ * @protected
+ */
+ _shouldPropertyChange(property, value, old) {
+ return mutablePropertyChange(this, property, value, old, true);
+ }
+};
+
+/**
+ * Legacy element behavior to add the optional ability to skip strict
+ * dirty-checking for objects and arrays (always consider them to be
+ * "dirty") by setting a `mutable-data` attribute on an element instance.
+ *
+ * By default, `Polymer.PropertyEffects` performs strict dirty checking on
+ * objects, which means that any deep modifications to an object or array will
+ * not be propagated unless "immutable" data patterns are used (i.e. all object
+ * references from the root to the mutation were changed).
+ *
+ * Polymer also provides a proprietary data mutation and path notification API
+ * (e.g. `notifyPath`, `set`, and array mutation API's) that allow efficient
+ * mutation and notification of deep changes in an object graph to all elements
+ * bound to the same object graph.
+ *
+ * In cases where neither immutable patterns nor the data mutation API can be
+ * used, applying this mixin will allow Polymer to skip dirty checking for
+ * objects and arrays (always consider them to be "dirty"). This allows a
+ * user to make a deep modification to a bound object graph, and then either
+ * simply re-set the object (e.g. `this.items = this.items`) or call `notifyPath`
+ * (e.g. `this.notifyPath('items')`) to update the tree. Note that all
+ * elements that wish to be updated based on deep mutations must apply this
+ * mixin or otherwise skip strict dirty checking for objects/arrays.
+ * Specifically, any elements in the binding tree between the source of a
+ * mutation and the consumption of it must enable this behavior or apply the
+ * `Polymer.OptionalMutableDataBehavior`.
+ *
+ * While this behavior adds the ability to forgo Object/Array dirty checking,
+ * the `mutableData` flag defaults to false and must be set on the instance.
+ *
+ * Note, the performance characteristics of propagating large object graphs
+ * will be worse by relying on `mutableData: true` as opposed to using
+ * strict dirty checking with immutable patterns or Polymer's path notification
+ * API.
+ *
+ * @polymerBehavior
+ * @summary Behavior to optionally skip strict dirty-checking for objects and
+ * arrays
+ */
+export const OptionalMutableDataBehavior = {
+
+ properties: {
+ /**
+ * Instance-level flag for configuring the dirty-checking strategy
+ * for this element. When true, Objects and Arrays will skip dirty
+ * checking, otherwise strict equality checking will be used.
+ */
+ mutableData: Boolean
+ },
+
+ /**
+ * Overrides `Polymer.PropertyEffects` to skip strict equality checking
+ * for Objects and Arrays.
+ *
+ * Pulls the value to dirty check against from the `__dataTemp` cache
+ * (rather than the normal `__data` cache) for Objects. Since the temp
+ * cache is cleared at the end of a turn, this implementation allows
+ * side-effects of deep object changes to be processed by re-setting the
+ * same object (using the temp cache as an in-turn backstop to prevent
+ * cycles due to 2-way notification).
+ *
+ * @param {string} property Property name
+ * @param {*} value New property value
+ * @param {*} old Previous property value
+ * @return {boolean} Whether the property should be considered a change
+ * @this {this}
+ * @protected
+ */
+ _shouldPropertyChange(property, value, old) {
+ return mutablePropertyChange(this, property, value, old, this.mutableData);
+ }
+};
diff --git a/third_party/polymer3/bower_components/polymer/lib/legacy/polymer-fn.js b/third_party/polymer3/bower_components/polymer/lib/legacy/polymer-fn.js
new file mode 100644
index 0000000..de019be
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/lib/legacy/polymer-fn.js
@@ -0,0 +1,48 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import { Class } from './class.js';
+
+import '../utils/boot.js';
+
+/**
+ * Legacy class factory and registration helper for defining Polymer
+ * elements.
+ *
+ * This method is equivalent to
+ *
+ * import {Class} from '@polymer/polymer/lib/legacy/class.js';
+ * customElements.define(info.is, Class(info));
+ *
+ * See `Class` for details on valid legacy metadata format for `info`.
+ *
+ * @global
+ * @override
+ * @function
+ * @param {!PolymerInit} info Object containing Polymer metadata and functions
+ * to become class methods.
+ * @return {function(new: HTMLElement)} Generated class
+ * @suppress {duplicate, invalidCasts, checkTypes}
+ */
+const Polymer = function(info) {
+ // if input is a `class` (aka a function with a prototype), use the prototype
+ // remember that the `constructor` will never be called
+ let klass;
+ if (typeof info === 'function') {
+ klass = info;
+ } else {
+ klass = Polymer.Class(info);
+ }
+ customElements.define(klass.is, /** @type {!HTMLElement} */(klass));
+ return klass;
+};
+
+Polymer.Class = Class;
+
+export { Polymer };
\ No newline at end of file
diff --git a/third_party/polymer3/bower_components/polymer/lib/legacy/polymer.dom.js b/third_party/polymer3/bower_components/polymer/lib/legacy/polymer.dom.js
new file mode 100644
index 0000000..2d817e0
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/lib/legacy/polymer.dom.js
@@ -0,0 +1,391 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import '../utils/boot.js';
+
+import '../utils/settings.js';
+import { FlattenedNodesObserver } from '../utils/flattened-nodes-observer.js';
+import { flush as flush$0, enqueueDebouncer } from '../utils/flush.js';
+
+const p = Element.prototype;
+/**
+ * @const {function(this:Node, string): boolean}
+ */
+const normalizedMatchesSelector = p.matches || p.matchesSelector ||
+ p.mozMatchesSelector || p.msMatchesSelector ||
+ p.oMatchesSelector || p.webkitMatchesSelector;
+
+/**
+ * Cross-platform `element.matches` shim.
+ *
+ * @function matchesSelector
+ * @param {!Node} node Node to check selector against
+ * @param {string} selector Selector to match
+ * @return {boolean} True if node matched selector
+ */
+export const matchesSelector = function(node, selector) {
+ return normalizedMatchesSelector.call(node, selector);
+};
+
+/**
+ * Node API wrapper class returned from `Polymer.dom.(target)` when
+ * `target` is a `Node`.
+ *
+ */
+export class DomApi {
+
+ /**
+ * @param {Node} node Node for which to create a Polymer.dom helper object.
+ */
+ constructor(node) {
+ this.node = node;
+ }
+
+ /**
+ * Returns an instance of `Polymer.FlattenedNodesObserver` that
+ * listens for node changes on this element.
+ *
+ * @param {function(!Element, { target: !Element, addedNodes: !Array<!Element>, removedNodes: !Array<!Element> }):void} callback Called when direct or distributed children
+ * of this element changes
+ * @return {!Polymer.FlattenedNodesObserver} Observer instance
+ */
+ observeNodes(callback) {
+ return new FlattenedNodesObserver(this.node, callback);
+ }
+
+ /**
+ * Disconnects an observer previously created via `observeNodes`
+ *
+ * @param {!Polymer.FlattenedNodesObserver} observerHandle Observer instance
+ * to disconnect.
+ * @return {void}
+ */
+ unobserveNodes(observerHandle) {
+ observerHandle.disconnect();
+ }
+
+ /**
+ * Provided as a backwards-compatible API only. This method does nothing.
+ * @return {void}
+ */
+ notifyObserver() {}
+
+ /**
+ * Returns true if the provided node is contained with this element's
+ * light-DOM children or shadow root, including any nested shadow roots
+ * of children therein.
+ *
+ * @param {Node} node Node to test
+ * @return {boolean} Returns true if the given `node` is contained within
+ * this element's light or shadow DOM.
+ */
+ deepContains(node) {
+ if (this.node.contains(node)) {
+ return true;
+ }
+ let n = node;
+ let doc = node.ownerDocument;
+ // walk from node to `this` or `document`
+ while (n && n !== doc && n !== this.node) {
+ // use logical parentnode, or native ShadowRoot host
+ n = n.parentNode || n.host;
+ }
+ return n === this.node;
+ }
+
+ /**
+ * Returns the root node of this node. Equivalent to `getRoodNode()`.
+ *
+ * @return {Node} Top most element in the dom tree in which the node
+ * exists. If the node is connected to a document this is either a
+ * shadowRoot or the document; otherwise, it may be the node
+ * itself or a node or document fragment containing it.
+ */
+ getOwnerRoot() {
+ return this.node.getRootNode();
+ }
+
+ /**
+ * For slot elements, returns the nodes assigned to the slot; otherwise
+ * an empty array. It is equivalent to `<slot>.addignedNodes({flatten:true})`.
+ *
+ * @return {!Array<!Node>} Array of assigned nodes
+ */
+ getDistributedNodes() {
+ return (this.node.localName === 'slot') ?
+ this.node.assignedNodes({flatten: true}) :
+ [];
+ }
+
+ /**
+ * Returns an array of all slots this element was distributed to.
+ *
+ * @return {!Array<!HTMLSlotElement>} Description
+ */
+ getDestinationInsertionPoints() {
+ let ip$ = [];
+ let n = this.node.assignedSlot;
+ while (n) {
+ ip$.push(n);
+ n = n.assignedSlot;
+ }
+ return ip$;
+ }
+
+ /**
+ * Calls `importNode` on the `ownerDocument` for this node.
+ *
+ * @param {!Node} node Node to import
+ * @param {boolean} deep True if the node should be cloned deeply during
+ * import
+ * @return {Node} Clone of given node imported to this owner document
+ */
+ importNode(node, deep) {
+ let doc = this.node instanceof Document ? this.node :
+ this.node.ownerDocument;
+ return doc.importNode(node, deep);
+ }
+
+ /**
+ * @return {!Array<!Node>} Returns a flattened list of all child nodes and
+ * nodes assigned to child slots.
+ */
+ getEffectiveChildNodes() {
+ return FlattenedNodesObserver.getFlattenedNodes(this.node);
+ }
+
+ /**
+ * Returns a filtered list of flattened child elements for this element based
+ * on the given selector.
+ *
+ * @param {string} selector Selector to filter nodes against
+ * @return {!Array<!HTMLElement>} List of flattened child elements
+ */
+ queryDistributedElements(selector) {
+ let c$ = this.getEffectiveChildNodes();
+ let list = [];
+ for (let i=0, l=c$.length, c; (i<l) && (c=c$[i]); i++) {
+ if ((c.nodeType === Node.ELEMENT_NODE) &&
+ matchesSelector(c, selector)) {
+ list.push(c);
+ }
+ }
+ return list;
+ }
+
+ /**
+ * For shadow roots, returns the currently focused element within this
+ * shadow root.
+ *
+ * @return {Node|undefined} Currently focused element
+ */
+ get activeElement() {
+ let node = this.node;
+ return node._activeElement !== undefined ? node._activeElement : node.activeElement;
+ }
+}
+
+function forwardMethods(proto, methods) {
+ for (let i=0; i < methods.length; i++) {
+ let method = methods[i];
+ /* eslint-disable valid-jsdoc */
+ proto[method] = /** @this {DomApi} */ function() {
+ return this.node[method].apply(this.node, arguments);
+ };
+ /* eslint-enable */
+ }
+}
+
+function forwardReadOnlyProperties(proto, properties) {
+ for (let i=0; i < properties.length; i++) {
+ let name = properties[i];
+ Object.defineProperty(proto, name, {
+ get: function() {
+ const domApi = /** @type {DomApi} */(this);
+ return domApi.node[name];
+ },
+ configurable: true
+ });
+ }
+}
+
+function forwardProperties(proto, properties) {
+ for (let i=0; i < properties.length; i++) {
+ let name = properties[i];
+ Object.defineProperty(proto, name, {
+ get: function() {
+ const domApi = /** @type {DomApi} */(this);
+ return domApi.node[name];
+ },
+ set: function(value) {
+ /** @type {DomApi} */ (this).node[name] = value;
+ },
+ configurable: true
+ });
+ }
+}
+
+forwardMethods(DomApi.prototype, [
+ 'cloneNode', 'appendChild', 'insertBefore', 'removeChild',
+ 'replaceChild', 'setAttribute', 'removeAttribute',
+ 'querySelector', 'querySelectorAll'
+]);
+
+forwardReadOnlyProperties(DomApi.prototype, [
+ 'parentNode', 'firstChild', 'lastChild',
+ 'nextSibling', 'previousSibling', 'firstElementChild',
+ 'lastElementChild', 'nextElementSibling', 'previousElementSibling',
+ 'childNodes', 'children', 'classList'
+]);
+
+forwardProperties(DomApi.prototype, [
+ 'textContent', 'innerHTML'
+]);
+
+
+/**
+ * Event API wrapper class returned from `Polymer.dom.(target)` when
+ * `target` is an `Event`.
+ */
+class EventApi {
+ constructor(event) {
+ this.event = event;
+ }
+
+ /**
+ * Returns the first node on the `composedPath` of this event.
+ *
+ * @return {!EventTarget} The node this event was dispatched to
+ */
+ get rootTarget() {
+ return this.event.composedPath()[0];
+ }
+
+ /**
+ * Returns the local (re-targeted) target for this event.
+ *
+ * @return {!EventTarget} The local (re-targeted) target for this event.
+ */
+ get localTarget() {
+ return this.event.target;
+ }
+
+ /**
+ * Returns the `composedPath` for this event.
+ * @return {!Array<!EventTarget>} The nodes this event propagated through
+ */
+ get path() {
+ return this.event.composedPath();
+ }
+}
+
+/**
+ * @function
+ * @param {boolean=} deep
+ * @return {!Node}
+ */
+DomApi.prototype.cloneNode;
+/**
+ * @function
+ * @param {!Node} node
+ * @return {!Node}
+ */
+DomApi.prototype.appendChild;
+/**
+ * @function
+ * @param {!Node} newChild
+ * @param {Node} refChild
+ * @return {!Node}
+ */
+DomApi.prototype.insertBefore;
+/**
+ * @function
+ * @param {!Node} node
+ * @return {!Node}
+ */
+DomApi.prototype.removeChild;
+/**
+ * @function
+ * @param {!Node} oldChild
+ * @param {!Node} newChild
+ * @return {!Node}
+ */
+DomApi.prototype.replaceChild;
+/**
+ * @function
+ * @param {string} name
+ * @param {string} value
+ * @return {void}
+ */
+DomApi.prototype.setAttribute;
+/**
+ * @function
+ * @param {string} name
+ * @return {void}
+ */
+DomApi.prototype.removeAttribute;
+/**
+ * @function
+ * @param {string} selector
+ * @return {?Element}
+ */
+DomApi.prototype.querySelector;
+/**
+ * @function
+ * @param {string} selector
+ * @return {!NodeList<!Element>}
+ */
+DomApi.prototype.querySelectorAll;
+
+/**
+ * Legacy DOM and Event manipulation API wrapper factory used to abstract
+ * differences between native Shadow DOM and "Shady DOM" when polyfilling on
+ * older browsers.
+ *
+ * Note that in Polymer 2.x use of `Polymer.dom` is no longer required and
+ * in the majority of cases simply facades directly to the standard native
+ * API.
+ *
+ * @summary Legacy DOM and Event manipulation API wrapper factory used to
+ * abstract differences between native Shadow DOM and "Shady DOM."
+ * @param {(Node|Event)=} obj Node or event to operate on
+ * @return {!DomApi|!EventApi} Wrapper providing either node API or event API
+ */
+export const dom = function(obj) {
+ obj = obj || document;
+ if (!obj.__domApi) {
+ let helper;
+ if (obj instanceof Event) {
+ helper = new EventApi(obj);
+ } else {
+ helper = new DomApi(obj);
+ }
+ obj.__domApi = helper;
+ }
+ return obj.__domApi;
+};
+
+/**
+ * Forces several classes of asynchronously queued tasks to flush:
+ * - Debouncers added via `Polymer.enqueueDebouncer`
+ * - ShadyDOM distribution
+ *
+ * This method facades to `Polymer.flush`.
+ *
+ */
+export { flush$0 as flush };
+
+/**
+ * Adds a `Polymer.Debouncer` to a list of globally flushable tasks.
+ *
+ * This method facades to `Polymer.enqueueDebouncer`.
+ *
+ * @param {!Polymer.Debouncer} debouncer Debouncer to enqueue
+ */
+export { enqueueDebouncer as addDebouncer };
diff --git a/third_party/polymer3/bower_components/polymer/lib/legacy/templatizer-behavior.js b/third_party/polymer3/bower_components/polymer/lib/legacy/templatizer-behavior.js
new file mode 100644
index 0000000..f1b8f7f
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/lib/legacy/templatizer-behavior.js
@@ -0,0 +1,144 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import { TemplateInstanceBase as TemplateInstanceBase$0, templatize as templatize$0, modelForElement as modelForElement$0 } from '../utils/templatize.js';
+
+let TemplateInstanceBase = TemplateInstanceBase$0; // eslint-disable-line
+
+/**
+ * @typedef {{
+ * _templatizerTemplate: HTMLTemplateElement,
+ * _parentModel: boolean,
+ * _instanceProps: Object,
+ * _forwardHostPropV2: Function,
+ * _notifyInstancePropV2: Function,
+ * ctor: TemplateInstanceBase
+ * }}
+ */
+let TemplatizerUser; // eslint-disable-line
+
+/**
+ * The `Templatizer` behavior adds methods to generate instances of
+ * templates that are each managed by an anonymous `PropertyEffects`
+ * instance where data-bindings in the stamped template content are bound to
+ * accessors on itself.
+ *
+ * This behavior is provided in Polymer 2.x-3.x as a hybrid-element convenience
+ * only. For non-hybrid usage, the `Templatize` library
+ * should be used instead.
+ *
+ * Example:
+ *
+ * import {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js';
+ * // Get a template from somewhere, e.g. light DOM
+ * let template = this.querySelector('template');
+ * // Prepare the template
+ * this.templatize(template);
+ * // Instance the template with an initial data model
+ * let instance = this.stamp({myProp: 'initial'});
+ * // Insert the instance's DOM somewhere, e.g. light DOM
+ * dom(this).appendChild(instance.root);
+ * // Changing a property on the instance will propagate to bindings
+ * // in the template
+ * instance.myProp = 'new value';
+ *
+ * Users of `Templatizer` may need to implement the following abstract
+ * API's to determine how properties and paths from the host should be
+ * forwarded into to instances:
+ *
+ * _forwardHostPropV2: function(prop, value)
+ *
+ * Likewise, users may implement these additional abstract API's to determine
+ * how instance-specific properties that change on the instance should be
+ * forwarded out to the host, if necessary.
+ *
+ * _notifyInstancePropV2: function(inst, prop, value)
+ *
+ * In order to determine which properties are instance-specific and require
+ * custom notification via `_notifyInstanceProp`, define an `_instanceProps`
+ * object containing keys for each instance prop, for example:
+ *
+ * _instanceProps: {
+ * item: true,
+ * index: true
+ * }
+ *
+ * Any properties used in the template that are not defined in _instanceProp
+ * will be forwarded out to the Templatize `owner` automatically.
+ *
+ * Users may also implement the following abstract function to show or
+ * hide any DOM generated using `stamp`:
+ *
+ * _showHideChildren: function(shouldHide)
+ *
+ * Note that some callbacks are suffixed with `V2` in the Polymer 2.x behavior
+ * as the implementations will need to differ from the callbacks required
+ * by the 1.x Templatizer API due to changes in the `TemplateInstance` API
+ * between versions 1.x and 2.x.
+ *
+ * @polymerBehavior
+ */
+export const Templatizer = {
+
+ /**
+ * Generates an anonymous `TemplateInstance` class (stored as `this.ctor`)
+ * for the provided template. This method should be called once per
+ * template to prepare an element for stamping the template, followed
+ * by `stamp` to create new instances of the template.
+ *
+ * @param {!HTMLTemplateElement} template Template to prepare
+ * @param {boolean=} mutableData When `true`, the generated class will skip
+ * strict dirty-checking for objects and arrays (always consider them to
+ * be "dirty"). Defaults to false.
+ * @return {void}
+ * @this {TemplatizerUser}
+ */
+ templatize(template, mutableData) {
+ this._templatizerTemplate = template;
+ this.ctor = templatize$0(template, this, {
+ mutableData: Boolean(mutableData),
+ parentModel: this._parentModel,
+ instanceProps: this._instanceProps,
+ forwardHostProp: this._forwardHostPropV2,
+ notifyInstanceProp: this._notifyInstancePropV2
+ });
+ },
+
+ /**
+ * Creates an instance of the template prepared by `templatize`. The object
+ * returned is an instance of the anonymous class generated by `templatize`
+ * whose `root` property is a document fragment containing newly cloned
+ * template content, and which has property accessors corresponding to
+ * properties referenced in template bindings.
+ *
+ * @param {Object=} model Object containing initial property values to
+ * populate into the template bindings.
+ * @return {TemplateInstanceBase} Returns the created instance of
+ * the template prepared by `templatize`.
+ * @this {TemplatizerUser}
+ */
+ stamp(model) {
+ return new this.ctor(model);
+ },
+
+ /**
+ * Returns the template "model" (`TemplateInstance`) associated with
+ * a given element, which serves as the binding scope for the template
+ * instance the element is contained in. A template model should be used
+ * to manipulate data associated with this template instance.
+ *
+ * @param {HTMLElement} el Element for which to return a template model.
+ * @return {TemplateInstanceBase} Model representing the binding scope for
+ * the element.
+ * @this {TemplatizerUser}
+ */
+ modelForElement(el) {
+ return modelForElement$0(this._templatizerTemplate, el);
+ }
+};
diff --git a/third_party/polymer3/bower_components/polymer/lib/mixins/dir-mixin.js b/third_party/polymer3/bower_components/polymer/lib/mixins/dir-mixin.js
new file mode 100644
index 0000000..0e6d31e
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/lib/mixins/dir-mixin.js
@@ -0,0 +1,179 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import { PropertyAccessors } from './property-accessors.js';
+
+import { dedupingMixin } from '../utils/mixin.js';
+
+const HOST_DIR = /:host\(:dir\((ltr|rtl)\)\)/g;
+const HOST_DIR_REPLACMENT = ':host([dir="$1"])';
+
+const EL_DIR = /([\s\w-#\.\[\]\*]*):dir\((ltr|rtl)\)/g;
+const EL_DIR_REPLACMENT = ':host([dir="$2"]) $1';
+
+/**
+ * @type {!Array<!Polymer_DirMixin>}
+ */
+const DIR_INSTANCES = [];
+
+/** @type {MutationObserver} */
+let observer = null;
+
+let DOCUMENT_DIR = '';
+
+function getRTL() {
+ DOCUMENT_DIR = document.documentElement.getAttribute('dir');
+}
+
+/**
+ * @param {!Polymer_DirMixin} instance Instance to set RTL status on
+ */
+function setRTL(instance) {
+ if (!instance.__autoDirOptOut) {
+ const el = /** @type {!HTMLElement} */(instance);
+ el.setAttribute('dir', DOCUMENT_DIR);
+ }
+}
+
+function updateDirection() {
+ getRTL();
+ DOCUMENT_DIR = document.documentElement.getAttribute('dir');
+ for (let i = 0; i < DIR_INSTANCES.length; i++) {
+ setRTL(DIR_INSTANCES[i]);
+ }
+}
+
+function takeRecords() {
+ if (observer && observer.takeRecords().length) {
+ updateDirection();
+ }
+}
+
+/**
+ * Element class mixin that allows elements to use the `:dir` CSS Selector to
+ * have text direction specific styling.
+ *
+ * With this mixin, any stylesheet provided in the template will transform
+ * `:dir` into `:host([dir])` and sync direction with the page via the
+ * element's `dir` attribute.
+ *
+ * Elements can opt out of the global page text direction by setting the `dir`
+ * attribute directly in `ready()` or in HTML.
+ *
+ * Caveats:
+ * - Applications must set `<html dir="ltr">` or `<html dir="rtl">` to sync
+ * direction
+ * - Automatic left-to-right or right-to-left styling is sync'd with the
+ * `<html>` element only.
+ * - Changing `dir` at runtime is supported.
+ * - Opting out of the global direction styling is permanent
+ *
+ * @mixinFunction
+ * @polymer
+ * @appliesMixin PropertyAccessors
+ */
+export const DirMixin = dedupingMixin((base) => {
+
+ if (!observer) {
+ getRTL();
+ observer = new MutationObserver(updateDirection);
+ observer.observe(document.documentElement, {attributes: true, attributeFilter: ['dir']});
+ }
+
+ /**
+ * @constructor
+ * @extends {base}
+ * @implements {Polymer_PropertyAccessors}
+ */
+ const elementBase = PropertyAccessors(base);
+
+ /**
+ * @polymer
+ * @mixinClass
+ * @implements {Polymer_DirMixin}
+ */
+ class Dir extends elementBase {
+
+ /**
+ * @override
+ * @suppress {missingProperties} Interfaces in closure do not inherit statics, but classes do
+ */
+ static _processStyleText(cssText, baseURI) {
+ cssText = super._processStyleText(cssText, baseURI);
+ cssText = this._replaceDirInCssText(cssText);
+ return cssText;
+ }
+
+ /**
+ * Replace `:dir` in the given CSS text
+ *
+ * @param {string} text CSS text to replace DIR
+ * @return {string} Modified CSS
+ */
+ static _replaceDirInCssText(text) {
+ let replacedText = text;
+ replacedText = replacedText.replace(HOST_DIR, HOST_DIR_REPLACMENT);
+ replacedText = replacedText.replace(EL_DIR, EL_DIR_REPLACMENT);
+ if (text !== replacedText) {
+ this.__activateDir = true;
+ }
+ return replacedText;
+ }
+
+ constructor() {
+ super();
+ /** @type {boolean} */
+ this.__autoDirOptOut = false;
+ }
+
+ /**
+ * @suppress {invalidCasts} Closure doesn't understand that `this` is an HTMLElement
+ * @return {void}
+ */
+ ready() {
+ super.ready();
+ this.__autoDirOptOut = /** @type {!HTMLElement} */(this).hasAttribute('dir');
+ }
+
+ /**
+ * @suppress {missingProperties} If it exists on elementBase, it can be super'd
+ * @return {void}
+ */
+ connectedCallback() {
+ if (elementBase.prototype.connectedCallback) {
+ super.connectedCallback();
+ }
+ if (this.constructor.__activateDir) {
+ takeRecords();
+ DIR_INSTANCES.push(this);
+ setRTL(this);
+ }
+ }
+
+ /**
+ * @suppress {missingProperties} If it exists on elementBase, it can be super'd
+ * @return {void}
+ */
+ disconnectedCallback() {
+ if (elementBase.prototype.disconnectedCallback) {
+ super.disconnectedCallback();
+ }
+ if (this.constructor.__activateDir) {
+ const idx = DIR_INSTANCES.indexOf(this);
+ if (idx > -1) {
+ DIR_INSTANCES.splice(idx, 1);
+ }
+ }
+ }
+ }
+
+ Dir.__activateDir = false;
+
+ return Dir;
+});
diff --git a/third_party/polymer3/bower_components/polymer/lib/mixins/disable-upgrade-mixin.js b/third_party/polymer3/bower_components/polymer/lib/mixins/disable-upgrade-mixin.js
new file mode 100644
index 0000000..3d008e8
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/lib/mixins/disable-upgrade-mixin.js
@@ -0,0 +1,110 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import { ElementMixin } from './element-mixin.js';
+
+import { dedupingMixin } from '../utils/mixin.js';
+
+const DISABLED_ATTR = 'disable-upgrade';
+
+/**
+ * Element class mixin that allows the element to boot up in a non-enabled
+ * state when the `disable-upgrade` attribute is present. This mixin is
+ * designed to be used with element classes like PolymerElement that perform
+ * initial startup work when they are first connected. When the
+ * `disable-upgrade` attribute is removed, if the element is connected, it
+ * boots up and "enables" as it otherwise would; if it is not connected, the
+ * element boots up when it is next connected.
+ *
+ * Using `disable-upgrade` with PolymerElement prevents any data propagation
+ * to the element, any element DOM from stamping, or any work done in
+ * connected/disconnctedCallback from occuring, but it does not prevent work
+ * done in the element constructor.
+ *
+ * Note, this mixin must be applied on top of any element class that
+ * itself implements a `connectedCallback` so that it can control the work
+ * done in `connectedCallback`. For example,
+ *
+ * MyClass = DisableUpgradeMixin(class extends BaseClass {...});
+ *
+ * @mixinFunction
+ * @polymer
+ * @appliesMixin ElementMixin
+ */
+export const DisableUpgradeMixin = dedupingMixin((base) => {
+
+ /**
+ * @constructor
+ * @extends {base}
+ * @implements {Polymer_ElementMixin}
+ */
+ const superClass = ElementMixin(base);
+ /**
+ * @polymer
+ * @mixinClass
+ * @implements {Polymer_DisableUpgradeMixin}
+ */
+ class DisableUpgradeClass extends superClass {
+
+ /** @override */
+ static get observedAttributes() {
+ return super.observedAttributes.concat(DISABLED_ATTR);
+ }
+
+ /** @override */
+ attributeChangedCallback(name, old, value, namespace) {
+ if (name == DISABLED_ATTR) {
+ if (!this.__dataEnabled && value == null && this.isConnected) {
+ super.connectedCallback();
+ }
+ } else {
+ super.attributeChangedCallback(name, old, value, namespace);
+ }
+ }
+
+ /*
+ NOTE: cannot gate on attribute because this is called before
+ attributes are delivered. Therefore, we stub this out and
+ call `super._initializeProperties()` manually.
+ */
+ /** @override */
+ _initializeProperties() {}
+
+ // prevent user code in connected from running
+ /** @override */
+ connectedCallback() {
+ if (this.__dataEnabled || !this.hasAttribute(DISABLED_ATTR)) {
+ super.connectedCallback();
+ }
+ }
+
+ // prevent element from turning on properties
+ /** @override */
+ _enableProperties() {
+ if (!this.hasAttribute(DISABLED_ATTR)) {
+ if (!this.__dataEnabled) {
+ super._initializeProperties();
+ }
+ super._enableProperties();
+ }
+ }
+
+ // only go if "enabled"
+ /** @override */
+ disconnectedCallback() {
+ if (this.__dataEnabled) {
+ super.disconnectedCallback();
+ }
+ }
+
+ }
+
+ return DisableUpgradeClass;
+
+});
diff --git a/third_party/polymer3/bower_components/polymer/lib/mixins/element-mixin.js b/third_party/polymer3/bower_components/polymer/lib/mixins/element-mixin.js
new file mode 100644
index 0000000..a445eda
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/lib/mixins/element-mixin.js
@@ -0,0 +1,747 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import '../utils/boot.js';
+
+import { rootPath as rootPath$0 } from '../utils/settings.js';
+import { dedupingMixin } from '../utils/mixin.js';
+import { stylesFromTemplate, stylesFromModuleImports } from '../utils/style-gather.js';
+import { pathFromUrl, resolveCss, resolveUrl as resolveUrl$0 } from '../utils/resolve-url.js';
+import { DomModule } from '../elements/dom-module.js';
+import { PropertyEffects } from './property-effects.js';
+import { PropertiesMixin } from './properties-mixin.js';
+
+/**
+ * Element class mixin that provides the core API for Polymer's meta-programming
+ * features including template stamping, data-binding, attribute deserialization,
+ * and property change observation.
+ *
+ * Subclassers may provide the following static getters to return metadata
+ * used to configure Polymer's features for the class:
+ *
+ * - `static get is()`: When the template is provided via a `dom-module`,
+ * users should return the `dom-module` id from a static `is` getter. If
+ * no template is needed or the template is provided directly via the
+ * `template` getter, there is no need to define `is` for the element.
+ *
+ * - `static get template()`: Users may provide the template directly (as
+ * opposed to via `dom-module`) by implementing a static `template` getter.
+ * The getter may return an `HTMLTemplateElement` or a string, which will
+ * automatically be parsed into a template.
+ *
+ * - `static get properties()`: Should return an object describing
+ * property-related metadata used by Polymer features (key: property name
+ * value: object containing property metadata). Valid keys in per-property
+ * metadata include:
+ * - `type` (String|Number|Object|Array|...): Used by
+ * `attributeChangedCallback` to determine how string-based attributes
+ * are deserialized to JavaScript property values.
+ * - `notify` (boolean): Causes a change in the property to fire a
+ * non-bubbling event called `<property>-changed`. Elements that have
+ * enabled two-way binding to the property use this event to observe changes.
+ * - `readOnly` (boolean): Creates a getter for the property, but no setter.
+ * To set a read-only property, use the private setter method
+ * `_setProperty(property, value)`.
+ * - `observer` (string): Observer method name that will be called when
+ * the property changes. The arguments of the method are
+ * `(value, previousValue)`.
+ * - `computed` (string): String describing method and dependent properties
+ * for computing the value of this property (e.g. `'computeFoo(bar, zot)'`).
+ * Computed properties are read-only by default and can only be changed
+ * via the return value of the computing method.
+ *
+ * - `static get observers()`: Array of strings describing multi-property
+ * observer methods and their dependent properties (e.g.
+ * `'observeABC(a, b, c)'`).
+ *
+ * The base class provides default implementations for the following standard
+ * custom element lifecycle callbacks; users may override these, but should
+ * call the super method to ensure
+ * - `constructor`: Run when the element is created or upgraded
+ * - `connectedCallback`: Run each time the element is connected to the
+ * document
+ * - `disconnectedCallback`: Run each time the element is disconnected from
+ * the document
+ * - `attributeChangedCallback`: Run each time an attribute in
+ * `observedAttributes` is set or removed (note: this element's default
+ * `observedAttributes` implementation will automatically return an array
+ * of dash-cased attributes based on `properties`)
+ *
+ * @mixinFunction
+ * @polymer
+ * @appliesMixin PropertyEffects
+ * @appliesMixin PropertiesMixin
+ * @property rootPath {string} Set to the value of `rootPath`,
+ * which defaults to the main document path
+ * @property importPath {string} Set to the value of the class's static
+ * `importPath` property, which defaults to the path of this element's
+ * `dom-module` (when `is` is used), but can be overridden for other
+ * import strategies.
+ * @summary Element class mixin that provides the core API for Polymer's
+ * meta-programming features.
+ */
+export const ElementMixin = dedupingMixin(base => {
+
+ /**
+ * @constructor
+ * @extends {base}
+ * @implements {Polymer_PropertyEffects}
+ * @implements {Polymer_PropertiesMixin}
+ */
+ const polymerElementBase = PropertiesMixin(PropertyEffects(base));
+
+ /**
+ * Returns a list of properties with default values.
+ * This list is created as an optimization since it is a subset of
+ * the list returned from `_properties`.
+ * This list is used in `_initializeProperties` to set property defaults.
+ *
+ * @param {PolymerElementConstructor} constructor Element class
+ * @return {PolymerElementProperties} Flattened properties for this class
+ * that have default values
+ * @private
+ */
+ function propertyDefaults(constructor) {
+ if (!constructor.hasOwnProperty(
+ JSCompiler_renameProperty('__propertyDefaults', constructor))) {
+ constructor.__propertyDefaults = null;
+ let props = constructor._properties;
+ for (let p in props) {
+ let info = props[p];
+ if ('value' in info) {
+ constructor.__propertyDefaults = constructor.__propertyDefaults || {};
+ constructor.__propertyDefaults[p] = info;
+ }
+ }
+ }
+ return constructor.__propertyDefaults;
+ }
+
+ /**
+ * Returns a memoized version of the the `observers` array.
+ * @param {PolymerElementConstructor} constructor Element class
+ * @return {Array} Array containing own observers for the given class
+ * @protected
+ */
+ function ownObservers(constructor) {
+ if (!constructor.hasOwnProperty(
+ JSCompiler_renameProperty('__ownObservers', constructor))) {
+ constructor.__ownObservers =
+ constructor.hasOwnProperty(JSCompiler_renameProperty('observers', constructor)) ?
+ /** @type {PolymerElementConstructor} */ (constructor).observers : null;
+ }
+ return constructor.__ownObservers;
+ }
+
+ /**
+ * Creates effects for a property.
+ *
+ * Note, once a property has been set to
+ * `readOnly`, `computed`, `reflectToAttribute`, or `notify`
+ * these values may not be changed. For example, a subclass cannot
+ * alter these settings. However, additional `observers` may be added
+ * by subclasses.
+ *
+ * The info object should may contain property metadata as follows:
+ *
+ * * `type`: {function} type to which an attribute matching the property
+ * is deserialized. Note the property is camel-cased from a dash-cased
+ * attribute. For example, 'foo-bar' attribute is deserialized to a
+ * property named 'fooBar'.
+ *
+ * * `readOnly`: {boolean} creates a readOnly property and
+ * makes a private setter for the private of the form '_setFoo' for a
+ * property 'foo',
+ *
+ * * `computed`: {string} creates a computed property. A computed property
+ * also automatically is set to `readOnly: true`. The value is calculated
+ * by running a method and arguments parsed from the given string. For
+ * example 'compute(foo)' will compute a given property when the
+ * 'foo' property changes by executing the 'compute' method. This method
+ * must return the computed value.
+ *
+ * * `reflectToAttribute`: {boolean} If true, the property value is reflected
+ * to an attribute of the same name. Note, the attribute is dash-cased
+ * so a property named 'fooBar' is reflected as 'foo-bar'.
+ *
+ * * `notify`: {boolean} sends a non-bubbling notification event when
+ * the property changes. For example, a property named 'foo' sends an
+ * event named 'foo-changed' with `event.detail` set to the value of
+ * the property.
+ *
+ * * observer: {string} name of a method that runs when the property
+ * changes. The arguments of the method are (value, previousValue).
+ *
+ * Note: Users may want control over modifying property
+ * effects via subclassing. For example, a user might want to make a
+ * reflectToAttribute property not do so in a subclass. We've chosen to
+ * disable this because it leads to additional complication.
+ * For example, a readOnly effect generates a special setter. If a subclass
+ * disables the effect, the setter would fail unexpectedly.
+ * Based on feedback, we may want to try to make effects more malleable
+ * and/or provide an advanced api for manipulating them.
+ * Also consider adding warnings when an effect cannot be changed.
+ *
+ * @param {!PolymerElement} proto Element class prototype to add accessors
+ * and effects to
+ * @param {string} name Name of the property.
+ * @param {Object} info Info object from which to create property effects.
+ * Supported keys:
+ * @param {Object} allProps Flattened map of all properties defined in this
+ * element (including inherited properties)
+ * @return {void}
+ * @private
+ */
+ function createPropertyFromConfig(proto, name, info, allProps) {
+ // computed forces readOnly...
+ if (info.computed) {
+ info.readOnly = true;
+ }
+ // Note, since all computed properties are readOnly, this prevents
+ // adding additional computed property effects (which leads to a confusing
+ // setup where multiple triggers for setting a property)
+ // While we do have `hasComputedEffect` this is set on the property's
+ // dependencies rather than itself.
+ if (info.computed && !proto._hasReadOnlyEffect(name)) {
+ proto._createComputedProperty(name, info.computed, allProps);
+ }
+ if (info.readOnly && !proto._hasReadOnlyEffect(name)) {
+ proto._createReadOnlyProperty(name, !info.computed);
+ }
+ if (info.reflectToAttribute && !proto._hasReflectEffect(name)) {
+ proto._createReflectedProperty(name);
+ }
+ if (info.notify && !proto._hasNotifyEffect(name)) {
+ proto._createNotifyingProperty(name);
+ }
+ // always add observer
+ if (info.observer) {
+ proto._createPropertyObserver(name, info.observer, allProps[info.observer]);
+ }
+ // always create the mapping from attribute back to property for deserialization.
+ proto._addPropertyToAttributeMap(name);
+ }
+
+ /**
+ * Process all style elements in the element template. Styles with the
+ * `include` attribute are processed such that any styles in
+ * the associated "style modules" are included in the element template.
+ * @param {PolymerElementConstructor} klass Element class
+ * @param {!HTMLTemplateElement} template Template to process
+ * @param {string} is Name of element
+ * @param {string} baseURI Base URI for element
+ * @private
+ */
+ function processElementStyles(klass, template, is, baseURI) {
+ const templateStyles = template.content.querySelectorAll('style');
+ const stylesWithImports = stylesFromTemplate(template);
+ // insert styles from <link rel="import" type="css"> at the top of the template
+ const linkedStyles = stylesFromModuleImports(is);
+ const firstTemplateChild = template.content.firstElementChild;
+ for (let idx = 0; idx < linkedStyles.length; idx++) {
+ let s = linkedStyles[idx];
+ s.textContent = klass._processStyleText(s.textContent, baseURI);
+ template.content.insertBefore(s, firstTemplateChild);
+ }
+ // keep track of the last "concrete" style in the template we have encountered
+ let templateStyleIndex = 0;
+ // ensure all gathered styles are actually in this template.
+ for (let i = 0; i < stylesWithImports.length; i++) {
+ let s = stylesWithImports[i];
+ let templateStyle = templateStyles[templateStyleIndex];
+ // if the style is not in this template, it's been "included" and
+ // we put a clone of it in the template before the style that included it
+ if (templateStyle !== s) {
+ s = s.cloneNode(true);
+ templateStyle.parentNode.insertBefore(s, templateStyle);
+ } else {
+ templateStyleIndex++;
+ }
+ s.textContent = klass._processStyleText(s.textContent, baseURI);
+ }
+ if (window.ShadyCSS) {
+ window.ShadyCSS.prepareTemplate(template, is);
+ }
+ }
+
+ /**
+ * @polymer
+ * @mixinClass
+ * @unrestricted
+ * @implements {Polymer_ElementMixin}
+ */
+ class PolymerElement extends polymerElementBase {
+
+ /**
+ * Override of PropertiesMixin _finalizeClass to create observers and
+ * find the template.
+ * @return {void}
+ * @protected
+ * @override
+ * @suppress {missingProperties} Interfaces in closure do not inherit statics, but classes do
+ */
+ static _finalizeClass() {
+ super._finalizeClass();
+ if (this.hasOwnProperty(
+ JSCompiler_renameProperty('is', this)) && this.is) {
+ register(this.prototype);
+ }
+ const observers = ownObservers(this);
+ if (observers) {
+ this.createObservers(observers, this._properties);
+ }
+ // note: create "working" template that is finalized at instance time
+ let template = /** @type {PolymerElementConstructor} */ (this).template;
+ if (template) {
+ if (typeof template === 'string') {
+ console.error('template getter must return HTMLTemplateElement');
+ template = null;
+ } else {
+ template = template.cloneNode(true);
+ }
+ }
+
+ this.prototype._template = template;
+ }
+
+ /**
+ * Override of PropertiesChanged createProperties to create accessors
+ * and property effects for all of the properties.
+ * @return {void}
+ * @protected
+ * @override
+ */
+ static createProperties(props) {
+ for (let p in props) {
+ createPropertyFromConfig(this.prototype, p, props[p], props);
+ }
+ }
+
+ /**
+ * Creates observers for the given `observers` array.
+ * Leverages `PropertyEffects` to create observers.
+ * @param {Object} observers Array of observer descriptors for
+ * this class
+ * @param {Object} dynamicFns Object containing keys for any properties
+ * that are functions and should trigger the effect when the function
+ * reference is changed
+ * @return {void}
+ * @protected
+ */
+ static createObservers(observers, dynamicFns) {
+ const proto = this.prototype;
+ for (let i=0; i < observers.length; i++) {
+ proto._createMethodObserver(observers[i], dynamicFns);
+ }
+ }
+
+ /**
+ * Returns the template that will be stamped into this element's shadow root.
+ *
+ * If a `static get is()` getter is defined, the default implementation
+ * will return the first `<template>` in a `dom-module` whose `id`
+ * matches this element's `is`.
+ *
+ * Users may override this getter to return an arbitrary template
+ * (in which case the `is` getter is unnecessary). The template returned
+ * may be either an `HTMLTemplateElement` or a string that will be
+ * automatically parsed into a template.
+ *
+ * Note that when subclassing, if the super class overrode the default
+ * implementation and the subclass would like to provide an alternate
+ * template via a `dom-module`, it should override this getter and
+ * return `DomModule.import(this.is, 'template')`.
+ *
+ * If a subclass would like to modify the super class template, it should
+ * clone it rather than modify it in place. If the getter does expensive
+ * work such as cloning/modifying a template, it should memoize the
+ * template for maximum performance:
+ *
+ * let memoizedTemplate;
+ * class MySubClass extends MySuperClass {
+ * static get template() {
+ * if (!memoizedTemplate) {
+ * memoizedTemplate = super.template.cloneNode(true);
+ * let subContent = document.createElement('div');
+ * subContent.textContent = 'This came from MySubClass';
+ * memoizedTemplate.content.appendChild(subContent);
+ * }
+ * return memoizedTemplate;
+ * }
+ * }
+ *
+ * @return {HTMLTemplateElement|string} Template to be stamped
+ */
+ static get template() {
+ if (!this.hasOwnProperty(JSCompiler_renameProperty('_template', this))) {
+ this._template = DomModule && DomModule.import(
+ /** @type {PolymerElementConstructor}*/ (this).is, 'template') ||
+ // note: implemented so a subclass can retrieve the super
+ // template; call the super impl this way so that `this` points
+ // to the superclass.
+ Object.getPrototypeOf(/** @type {PolymerElementConstructor}*/ (this).prototype).constructor.template;
+ }
+ return this._template;
+ }
+
+ /**
+ * Path matching the url from which the element was imported.
+ *
+ * This path is used to resolve url's in template style cssText.
+ * The `importPath` property is also set on element instances and can be
+ * used to create bindings relative to the import path.
+ *
+ * For elements defined in ES modules, users should implement
+ * `static get importMeta() { return import.meta; }`, and the default
+ * implementation of `importPath` will return `import.meta.url`'s path.
+ * For elements defined in HTML imports, this getter will return the path
+ * to the document containing a `dom-module` element matching this
+ * element's static `is` property.
+ *
+ * Note, this path should contain a trailing `/`.
+ *
+ * @return {string} The import path for this element class
+ * @suppress {missingProperties}
+ */
+ static get importPath() {
+ if (!this.hasOwnProperty(JSCompiler_renameProperty('_importPath', this))) {
+ const meta = this.importMeta;
+ if (meta) {
+ this._importPath = pathFromUrl(meta.url);
+ } else {
+ const module = DomModule && DomModule.import(/** @type {PolymerElementConstructor} */ (this).is);
+ this._importPath = (module && module.assetpath) ||
+ Object.getPrototypeOf(/** @type {PolymerElementConstructor}*/ (this).prototype).constructor.importPath;
+ }
+ }
+ return this._importPath;
+ }
+
+ constructor() {
+ super();
+ /** @type {HTMLTemplateElement} */
+ this._template;
+ /** @type {string} */
+ this._importPath;
+ /** @type {string} */
+ this.rootPath;
+ /** @type {string} */
+ this.importPath;
+ /** @type {StampedTemplate | HTMLElement | ShadowRoot} */
+ this.root;
+ /** @type {!Object<string, !Element>} */
+ this.$;
+ }
+
+ /**
+ * Overrides the default `PropertyAccessors` to ensure class
+ * metaprogramming related to property accessors and effects has
+ * completed (calls `finalize`).
+ *
+ * It also initializes any property defaults provided via `value` in
+ * `properties` metadata.
+ *
+ * @return {void}
+ * @override
+ * @suppress {invalidCasts}
+ */
+ _initializeProperties() {
+ instanceCount++;
+ this.constructor.finalize();
+ // note: finalize template when we have access to `localName` to
+ // avoid dependence on `is` for polyfilling styling.
+ this.constructor._finalizeTemplate(/** @type {!HTMLElement} */(this).localName);
+ super._initializeProperties();
+ // set path defaults
+ this.rootPath = rootPath$0;
+ this.importPath = this.constructor.importPath;
+ // apply property defaults...
+ let p$ = propertyDefaults(this.constructor);
+ if (!p$) {
+ return;
+ }
+ for (let p in p$) {
+ let info = p$[p];
+ // Don't set default value if there is already an own property, which
+ // happens when a `properties` property with default but no effects had
+ // a property set (e.g. bound) by its host before upgrade
+ if (!this.hasOwnProperty(p)) {
+ let value = typeof info.value == 'function' ?
+ info.value.call(this) :
+ info.value;
+ // Set via `_setProperty` if there is an accessor, to enable
+ // initializing readOnly property defaults
+ if (this._hasAccessor(p)) {
+ this._setPendingProperty(p, value, true);
+ } else {
+ this[p] = value;
+ }
+ }
+ }
+ }
+
+ /**
+ * Gather style text for a style element in the template.
+ *
+ * @param {string} cssText Text containing styling to process
+ * @param {string} baseURI Base URI to rebase CSS paths against
+ * @return {string} The processed CSS text
+ * @protected
+ */
+ static _processStyleText(cssText, baseURI) {
+ return resolveCss(cssText, baseURI);
+ }
+
+ /**
+ * Configures an element `proto` to function with a given `template`.
+ * The element name `is` and extends `ext` must be specified for ShadyCSS
+ * style scoping.
+ *
+ * @param {string} is Tag name (or type extension name) for this element
+ * @return {void}
+ * @protected
+ */
+ static _finalizeTemplate(is) {
+ /** @const {HTMLTemplateElement} */
+ const template = this.prototype._template;
+ if (template && !template.__polymerFinalized) {
+ template.__polymerFinalized = true;
+ const importPath = this.importPath;
+ const baseURI = importPath ? resolveUrl$0(importPath) : '';
+ // e.g. support `include="module-name"`, and ShadyCSS
+ processElementStyles(this, template, is, baseURI);
+ this.prototype._bindTemplate(template);
+ }
+ }
+
+ /**
+ * Provides a default implementation of the standard Custom Elements
+ * `connectedCallback`.
+ *
+ * The default implementation enables the property effects system and
+ * flushes any pending properties, and updates shimmed CSS properties
+ * when using the ShadyCSS scoping/custom properties polyfill.
+ *
+ * @suppress {missingProperties, invalidCasts} Super may or may not implement the callback
+ * @return {void}
+ */
+ connectedCallback() {
+ if (window.ShadyCSS && this._template) {
+ window.ShadyCSS.styleElement(/** @type {!HTMLElement} */(this));
+ }
+ super.connectedCallback();
+ }
+
+ /**
+ * Stamps the element template.
+ *
+ * @return {void}
+ * @override
+ */
+ ready() {
+ if (this._template) {
+ this.root = this._stampTemplate(this._template);
+ this.$ = this.root.$;
+ }
+ super.ready();
+ }
+
+ /**
+ * Implements `PropertyEffects`'s `_readyClients` call. Attaches
+ * element dom by calling `_attachDom` with the dom stamped from the
+ * element's template via `_stampTemplate`. Note that this allows
+ * client dom to be attached to the element prior to any observers
+ * running.
+ *
+ * @return {void}
+ * @override
+ */
+ _readyClients() {
+ if (this._template) {
+ this.root = this._attachDom(/** @type {StampedTemplate} */(this.root));
+ }
+ // The super._readyClients here sets the clients initialized flag.
+ // We must wait to do this until after client dom is created/attached
+ // so that this flag can be checked to prevent notifications fired
+ // during this process from being handled before clients are ready.
+ super._readyClients();
+ }
+
+
+ /**
+ * Attaches an element's stamped dom to itself. By default,
+ * this method creates a `shadowRoot` and adds the dom to it.
+ * However, this method may be overridden to allow an element
+ * to put its dom in another location.
+ *
+ * @throws {Error}
+ * @suppress {missingReturn}
+ * @param {StampedTemplate} dom to attach to the element.
+ * @return {ShadowRoot} node to which the dom has been attached.
+ */
+ _attachDom(dom) {
+ if (this.attachShadow) {
+ if (dom) {
+ if (!this.shadowRoot) {
+ this.attachShadow({mode: 'open'});
+ }
+ this.shadowRoot.appendChild(dom);
+ return this.shadowRoot;
+ }
+ return null;
+ } else {
+ throw new Error('ShadowDOM not available. ' +
+ // TODO(sorvell): move to compile-time conditional when supported
+ 'PolymerElement can create dom as children instead of in ' +
+ 'ShadowDOM by setting `this.root = this;\` before \`ready\`.');
+ }
+ }
+
+ /**
+ * When using the ShadyCSS scoping and custom property shim, causes all
+ * shimmed styles in this element (and its subtree) to be updated
+ * based on current custom property values.
+ *
+ * The optional parameter overrides inline custom property styles with an
+ * object of properties where the keys are CSS properties, and the values
+ * are strings.
+ *
+ * Example: `this.updateStyles({'--color': 'blue'})`
+ *
+ * These properties are retained unless a value of `null` is set.
+ *
+ * Note: This function does not support updating CSS mixins.
+ * You can not dynamically change the value of an `@apply`.
+ *
+ * @param {Object=} properties Bag of custom property key/values to
+ * apply to this element.
+ * @return {void}
+ * @suppress {invalidCasts}
+ */
+ updateStyles(properties) {
+ if (window.ShadyCSS) {
+ window.ShadyCSS.styleSubtree(/** @type {!HTMLElement} */(this), properties);
+ }
+ }
+
+ /**
+ * Rewrites a given URL relative to a base URL. The base URL defaults to
+ * the original location of the document containing the `dom-module` for
+ * this element. This method will return the same URL before and after
+ * bundling.
+ *
+ * Note that this function performs no resolution for URLs that start
+ * with `/` (absolute URLs) or `#` (hash identifiers). For general purpose
+ * URL resolution, use `window.URL`.
+ *
+ * @param {string} url URL to resolve.
+ * @param {string=} base Optional base URL to resolve against, defaults
+ * to the element's `importPath`
+ * @return {string} Rewritten URL relative to base
+ */
+ resolveUrl(url, base) {
+ if (!base && this.importPath) {
+ base = resolveUrl$0(this.importPath);
+ }
+ return resolveUrl$0(url, base);
+ }
+
+ /**
+ * Overrides `PropertyAccessors` to add map of dynamic functions on
+ * template info, for consumption by `PropertyEffects` template binding
+ * code. This map determines which method templates should have accessors
+ * created for them.
+ *
+ * @override
+ * @suppress {missingProperties} Interfaces in closure do not inherit statics, but classes do
+ */
+ static _parseTemplateContent(template, templateInfo, nodeInfo) {
+ templateInfo.dynamicFns = templateInfo.dynamicFns || this._properties;
+ return super._parseTemplateContent(template, templateInfo, nodeInfo);
+ }
+
+ }
+
+ return PolymerElement;
+});
+
+/**
+ * Provides basic tracking of element definitions (registrations) and
+ * instance counts.
+ *
+ * @summary Provides basic tracking of element definitions (registrations) and
+ * instance counts.
+ */
+`TODO(modulizer): A namespace named Polymer.telemetry was
+declared here. The surrounding comments should be reviewed,
+and this string can then be deleted`;
+
+/**
+ * Total number of Polymer element instances created.
+ * @type {number}
+ */
+export let instanceCount = 0;
+
+/**
+ * Array of Polymer element classes that have been finalized.
+ * @type {Array<PolymerElement>}
+ */
+export const registrations = [];
+
+/**
+ * @param {!PolymerElementConstructor} prototype Element prototype to log
+ * @this {this}
+ * @private
+ */
+function _regLog(prototype) {
+ console.log('[' + prototype.is + ']: registered');
+}
+
+/**
+ * Registers a class prototype for telemetry purposes.
+ * @param {HTMLElement} prototype Element prototype to register
+ * @this {this}
+ * @protected
+ */
+export function register(prototype) {
+ registrations.push(prototype);
+ undefined && _regLog(prototype);
+}
+
+/**
+ * Logs all elements registered with an `is` to the console.
+ * @public
+ * @this {this}
+ */
+export function dumpRegistrations() {
+ registrations.forEach(_regLog);
+}
+
+/**
+ * When using the ShadyCSS scoping and custom property shim, causes all
+ * shimmed `styles` (via `custom-style`) in the document (and its subtree)
+ * to be updated based on current custom property values.
+ *
+ * The optional parameter overrides inline custom property styles with an
+ * object of properties where the keys are CSS properties, and the values
+ * are strings.
+ *
+ * Example: `updateStyles({'--color': 'blue'})`
+ *
+ * These properties are retained unless a value of `null` is set.
+ *
+ * @param {Object=} props Bag of custom property key/values to
+ * apply to the document.
+ * @return {void}
+ */
+export const updateStyles = function(props) {
+ if (window.ShadyCSS) {
+ window.ShadyCSS.styleDocument(props);
+ }
+};
diff --git a/third_party/polymer3/bower_components/polymer/lib/mixins/gesture-event-listeners.js b/third_party/polymer3/bower_components/polymer/lib/mixins/gesture-event-listeners.js
new file mode 100644
index 0000000..af1bd0d
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/lib/mixins/gesture-event-listeners.js
@@ -0,0 +1,73 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import '../utils/boot.js';
+
+import { dedupingMixin } from '../utils/mixin.js';
+import * as gestures$0 from '../utils/gestures.js';
+
+const gestures = gestures$0;
+
+/**
+ * Element class mixin that provides API for adding Polymer's cross-platform
+ * gesture events to nodes.
+ *
+ * The API is designed to be compatible with override points implemented
+ * in `TemplateStamp` such that declarative event listeners in
+ * templates will support gesture events when this mixin is applied along with
+ * `TemplateStamp`.
+ *
+ * @mixinFunction
+ * @polymer
+ * @summary Element class mixin that provides API for adding Polymer's
+ * cross-platform
+ * gesture events to nodes
+ */
+export const GestureEventListeners = dedupingMixin(superClass => {
+
+ /**
+ * @polymer
+ * @mixinClass
+ * @implements {Polymer_GestureEventListeners}
+ */
+ class GestureEventListeners extends superClass {
+
+ /**
+ * Add the event listener to the node if it is a gestures event.
+ *
+ * @param {!Node} node Node to add event listener to
+ * @param {string} eventName Name of event
+ * @param {function(!Event):void} handler Listener function to add
+ * @return {void}
+ */
+ _addEventListenerToNode(node, eventName, handler) {
+ if (!gestures.addListener(node, eventName, handler)) {
+ super._addEventListenerToNode(node, eventName, handler);
+ }
+ }
+
+ /**
+ * Remove the event listener to the node if it is a gestures event.
+ *
+ * @param {!Node} node Node to remove event listener from
+ * @param {string} eventName Name of event
+ * @param {function(!Event):void} handler Listener function to remove
+ * @return {void}
+ */
+ _removeEventListenerFromNode(node, eventName, handler) {
+ if (!gestures.removeListener(node, eventName, handler)) {
+ super._removeEventListenerFromNode(node, eventName, handler);
+ }
+ }
+
+ }
+
+ return GestureEventListeners;
+
+});
diff --git a/third_party/polymer3/bower_components/polymer/lib/mixins/mutable-data.js b/third_party/polymer3/bower_components/polymer/lib/mixins/mutable-data.js
new file mode 100644
index 0000000..3c937b9
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/lib/mixins/mutable-data.js
@@ -0,0 +1,194 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import { dedupingMixin } from '../utils/mixin.js';
+
+// Common implementation for mixin & behavior
+function mutablePropertyChange(inst, property, value, old, mutableData) {
+ let isObject;
+ if (mutableData) {
+ isObject = (typeof value === 'object' && value !== null);
+ // Pull `old` for Objects from temp cache, but treat `null` as a primitive
+ if (isObject) {
+ old = inst.__dataTemp[property];
+ }
+ }
+ // Strict equality check, but return false for NaN===NaN
+ let shouldChange = (old !== value && (old === old || value === value));
+ // Objects are stored in temporary cache (cleared at end of
+ // turn), which is used for dirty-checking
+ if (isObject && shouldChange) {
+ inst.__dataTemp[property] = value;
+ }
+ return shouldChange;
+}
+
+/**
+ * Element class mixin to skip strict dirty-checking for objects and arrays
+ * (always consider them to be "dirty"), for use on elements utilizing
+ * `PropertyEffects`
+ *
+ * By default, `PropertyEffects` performs strict dirty checking on
+ * objects, which means that any deep modifications to an object or array will
+ * not be propagated unless "immutable" data patterns are used (i.e. all object
+ * references from the root to the mutation were changed).
+ *
+ * Polymer also provides a proprietary data mutation and path notification API
+ * (e.g. `notifyPath`, `set`, and array mutation API's) that allow efficient
+ * mutation and notification of deep changes in an object graph to all elements
+ * bound to the same object graph.
+ *
+ * In cases where neither immutable patterns nor the data mutation API can be
+ * used, applying this mixin will cause Polymer to skip dirty checking for
+ * objects and arrays (always consider them to be "dirty"). This allows a
+ * user to make a deep modification to a bound object graph, and then either
+ * simply re-set the object (e.g. `this.items = this.items`) or call `notifyPath`
+ * (e.g. `this.notifyPath('items')`) to update the tree. Note that all
+ * elements that wish to be updated based on deep mutations must apply this
+ * mixin or otherwise skip strict dirty checking for objects/arrays.
+ * Specifically, any elements in the binding tree between the source of a
+ * mutation and the consumption of it must apply this mixin or enable the
+ * `OptionalMutableData` mixin.
+ *
+ * In order to make the dirty check strategy configurable, see
+ * `OptionalMutableData`.
+ *
+ * Note, the performance characteristics of propagating large object graphs
+ * will be worse as opposed to using strict dirty checking with immutable
+ * patterns or Polymer's path notification API.
+ *
+ * @mixinFunction
+ * @polymer
+ * @summary Element class mixin to skip strict dirty-checking for objects
+ * and arrays
+ */
+export const MutableData = dedupingMixin(superClass => {
+
+ /**
+ * @polymer
+ * @mixinClass
+ * @implements {Polymer_MutableData}
+ */
+ class MutableData extends superClass {
+ /**
+ * Overrides `PropertyEffects` to provide option for skipping
+ * strict equality checking for Objects and Arrays.
+ *
+ * This method pulls the value to dirty check against from the `__dataTemp`
+ * cache (rather than the normal `__data` cache) for Objects. Since the temp
+ * cache is cleared at the end of a turn, this implementation allows
+ * side-effects of deep object changes to be processed by re-setting the
+ * same object (using the temp cache as an in-turn backstop to prevent
+ * cycles due to 2-way notification).
+ *
+ * @param {string} property Property name
+ * @param {*} value New property value
+ * @param {*} old Previous property value
+ * @return {boolean} Whether the property should be considered a change
+ * @protected
+ */
+ _shouldPropertyChange(property, value, old) {
+ return mutablePropertyChange(this, property, value, old, true);
+ }
+
+ }
+
+ return MutableData;
+
+});
+
+/**
+ * Element class mixin to add the optional ability to skip strict
+ * dirty-checking for objects and arrays (always consider them to be
+ * "dirty") by setting a `mutable-data` attribute on an element instance.
+ *
+ * By default, `PropertyEffects` performs strict dirty checking on
+ * objects, which means that any deep modifications to an object or array will
+ * not be propagated unless "immutable" data patterns are used (i.e. all object
+ * references from the root to the mutation were changed).
+ *
+ * Polymer also provides a proprietary data mutation and path notification API
+ * (e.g. `notifyPath`, `set`, and array mutation API's) that allow efficient
+ * mutation and notification of deep changes in an object graph to all elements
+ * bound to the same object graph.
+ *
+ * In cases where neither immutable patterns nor the data mutation API can be
+ * used, applying this mixin will allow Polymer to skip dirty checking for
+ * objects and arrays (always consider them to be "dirty"). This allows a
+ * user to make a deep modification to a bound object graph, and then either
+ * simply re-set the object (e.g. `this.items = this.items`) or call `notifyPath`
+ * (e.g. `this.notifyPath('items')`) to update the tree. Note that all
+ * elements that wish to be updated based on deep mutations must apply this
+ * mixin or otherwise skip strict dirty checking for objects/arrays.
+ * Specifically, any elements in the binding tree between the source of a
+ * mutation and the consumption of it must enable this mixin or apply the
+ * `MutableData` mixin.
+ *
+ * While this mixin adds the ability to forgo Object/Array dirty checking,
+ * the `mutableData` flag defaults to false and must be set on the instance.
+ *
+ * Note, the performance characteristics of propagating large object graphs
+ * will be worse by relying on `mutableData: true` as opposed to using
+ * strict dirty checking with immutable patterns or Polymer's path notification
+ * API.
+ *
+ * @mixinFunction
+ * @polymer
+ * @summary Element class mixin to optionally skip strict dirty-checking
+ * for objects and arrays
+ */
+export const OptionalMutableData = dedupingMixin(superClass => {
+
+ /**
+ * @mixinClass
+ * @polymer
+ * @implements {Polymer_OptionalMutableData}
+ */
+ class OptionalMutableData extends superClass {
+
+ static get properties() {
+ return {
+ /**
+ * Instance-level flag for configuring the dirty-checking strategy
+ * for this element. When true, Objects and Arrays will skip dirty
+ * checking, otherwise strict equality checking will be used.
+ */
+ mutableData: Boolean
+ };
+ }
+
+ /**
+ * Overrides `PropertyEffects` to provide option for skipping
+ * strict equality checking for Objects and Arrays.
+ *
+ * When `this.mutableData` is true on this instance, this method
+ * pulls the value to dirty check against from the `__dataTemp` cache
+ * (rather than the normal `__data` cache) for Objects. Since the temp
+ * cache is cleared at the end of a turn, this implementation allows
+ * side-effects of deep object changes to be processed by re-setting the
+ * same object (using the temp cache as an in-turn backstop to prevent
+ * cycles due to 2-way notification).
+ *
+ * @param {string} property Property name
+ * @param {*} value New property value
+ * @param {*} old Previous property value
+ * @return {boolean} Whether the property should be considered a change
+ * @protected
+ */
+ _shouldPropertyChange(property, value, old) {
+ return mutablePropertyChange(this, property, value, old, this.mutableData);
+ }
+ }
+
+ return OptionalMutableData;
+
+});
+
+// Export for use by legacy behavior
+MutableData._mutablePropertyChange = mutablePropertyChange;
diff --git a/third_party/polymer3/bower_components/polymer/lib/mixins/properties-changed.js b/third_party/polymer3/bower_components/polymer/lib/mixins/properties-changed.js
new file mode 100644
index 0000000..7922bcf
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/lib/mixins/properties-changed.js
@@ -0,0 +1,524 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import '../utils/boot.js';
+
+import { dedupingMixin } from '../utils/mixin.js';
+import { microTask } from '../utils/async.js';
+
+/** @const {!AsyncInterface} */
+const microtask = microTask;
+
+/**
+ * Element class mixin that provides basic meta-programming for creating one
+ * or more property accessors (getter/setter pair) that enqueue an async
+ * (batched) `_propertiesChanged` callback.
+ *
+ * For basic usage of this mixin, call `MyClass.createProperties(props)`
+ * once at class definition time to create property accessors for properties
+ * named in props, implement `_propertiesChanged` to react as desired to
+ * property changes, and implement `static get observedAttributes()` and
+ * include lowercase versions of any property names that should be set from
+ * attributes. Last, call `this._enableProperties()` in the element's
+ * `connectedCallback` to enable the accessors.
+ *
+ * @mixinFunction
+ * @polymer
+ * @summary Element class mixin for reacting to property changes from
+ * generated property accessors.
+ */
+export const PropertiesChanged = dedupingMixin(superClass => {
+
+ /**
+ * @polymer
+ * @mixinClass
+ * @extends {superClass}
+ * @implements {Polymer_PropertiesChanged}
+ * @unrestricted
+ */
+ class PropertiesChanged extends superClass {
+
+ /**
+ * Creates property accessors for the given property names.
+ * @param {!Object} props Object whose keys are names of accessors.
+ * @return {void}
+ * @protected
+ */
+ static createProperties(props) {
+ const proto = this.prototype;
+ for (let prop in props) {
+ // don't stomp an existing accessor
+ if (!(prop in proto)) {
+ proto._createPropertyAccessor(prop);
+ }
+ }
+ }
+
+ /**
+ * Returns an attribute name that corresponds to the given property.
+ * The attribute name is the lowercased property name. Override to
+ * customize this mapping.
+ * @param {string} property Property to convert
+ * @return {string} Attribute name corresponding to the given property.
+ *
+ * @protected
+ */
+ static attributeNameForProperty(property) {
+ return property.toLowerCase();
+ }
+
+ /**
+ * Override point to provide a type to which to deserialize a value to
+ * a given property.
+ * @param {string} name Name of property
+ *
+ * @protected
+ */
+ static typeForProperty(name) { } //eslint-disable-line no-unused-vars
+
+ /**
+ * Creates a setter/getter pair for the named property with its own
+ * local storage. The getter returns the value in the local storage,
+ * and the setter calls `_setProperty`, which updates the local storage
+ * for the property and enqueues a `_propertiesChanged` callback.
+ *
+ * This method may be called on a prototype or an instance. Calling
+ * this method may overwrite a property value that already exists on
+ * the prototype/instance by creating the accessor.
+ *
+ * @param {string} property Name of the property
+ * @param {boolean=} readOnly When true, no setter is created; the
+ * protected `_setProperty` function must be used to set the property
+ * @return {void}
+ * @protected
+ */
+ _createPropertyAccessor(property, readOnly) {
+ this._addPropertyToAttributeMap(property);
+ if (!this.hasOwnProperty('__dataHasAccessor')) {
+ this.__dataHasAccessor = Object.assign({}, this.__dataHasAccessor);
+ }
+ if (!this.__dataHasAccessor[property]) {
+ this.__dataHasAccessor[property] = true;
+ this._definePropertyAccessor(property, readOnly);
+ }
+ }
+
+ /**
+ * Adds the given `property` to a map matching attribute names
+ * to property names, using `attributeNameForProperty`. This map is
+ * used when deserializing attribute values to properties.
+ *
+ * @param {string} property Name of the property
+ */
+ _addPropertyToAttributeMap(property) {
+ if (!this.hasOwnProperty('__dataAttributes')) {
+ this.__dataAttributes = Object.assign({}, this.__dataAttributes);
+ }
+ if (!this.__dataAttributes[property]) {
+ const attr = this.constructor.attributeNameForProperty(property);
+ this.__dataAttributes[attr] = property;
+ }
+ }
+
+ /**
+ * Defines a property accessor for the given property.
+ * @param {string} property Name of the property
+ * @param {boolean=} readOnly When true, no setter is created
+ * @return {void}
+ */
+ _definePropertyAccessor(property, readOnly) {
+ Object.defineProperty(this, property, {
+ /* eslint-disable valid-jsdoc */
+ /** @this {PropertiesChanged} */
+ get() {
+ return this._getProperty(property);
+ },
+ /** @this {PropertiesChanged} */
+ set: readOnly ? function () {} : function (value) {
+ this._setProperty(property, value);
+ }
+ /* eslint-enable */
+ });
+ }
+
+ constructor() {
+ super();
+ this.__dataEnabled = false;
+ this.__dataReady = false;
+ this.__dataInvalid = false;
+ this.__data = {};
+ this.__dataPending = null;
+ this.__dataOld = null;
+ this.__dataInstanceProps = null;
+ this.__serializing = false;
+ this._initializeProperties();
+ }
+
+ /**
+ * Lifecycle callback called when properties are enabled via
+ * `_enableProperties`.
+ *
+ * Users may override this function to implement behavior that is
+ * dependent on the element having its property data initialized, e.g.
+ * from defaults (initialized from `constructor`, `_initializeProperties`),
+ * `attributeChangedCallback`, or values propagated from host e.g. via
+ * bindings. `super.ready()` must be called to ensure the data system
+ * becomes enabled.
+ *
+ * @return {void}
+ * @public
+ */
+ ready() {
+ this.__dataReady = true;
+ this._flushProperties();
+ }
+
+ /**
+ * Initializes the local storage for property accessors.
+ *
+ * Provided as an override point for performing any setup work prior
+ * to initializing the property accessor system.
+ *
+ * @return {void}
+ * @protected
+ */
+ _initializeProperties() {
+ // Capture instance properties; these will be set into accessors
+ // during first flush. Don't set them here, since we want
+ // these to overwrite defaults/constructor assignments
+ for (let p in this.__dataHasAccessor) {
+ if (this.hasOwnProperty(p)) {
+ this.__dataInstanceProps = this.__dataInstanceProps || {};
+ this.__dataInstanceProps[p] = this[p];
+ delete this[p];
+ }
+ }
+ }
+
+ /**
+ * Called at ready time with bag of instance properties that overwrote
+ * accessors when the element upgraded.
+ *
+ * The default implementation sets these properties back into the
+ * setter at ready time. This method is provided as an override
+ * point for customizing or providing more efficient initialization.
+ *
+ * @param {Object} props Bag of property values that were overwritten
+ * when creating property accessors.
+ * @return {void}
+ * @protected
+ */
+ _initializeInstanceProperties(props) {
+ Object.assign(this, props);
+ }
+
+ /**
+ * Updates the local storage for a property (via `_setPendingProperty`)
+ * and enqueues a `_proeprtiesChanged` callback.
+ *
+ * @param {string} property Name of the property
+ * @param {*} value Value to set
+ * @return {void}
+ * @protected
+ */
+ _setProperty(property, value) {
+ if (this._setPendingProperty(property, value)) {
+ this._invalidateProperties();
+ }
+ }
+
+ /**
+ * Returns the value for the given property.
+ * @param {string} property Name of property
+ * @return {*} Value for the given property
+ * @protected
+ */
+ _getProperty(property) {
+ return this.__data[property];
+ }
+
+ /* eslint-disable no-unused-vars */
+ /**
+ * Updates the local storage for a property, records the previous value,
+ * and adds it to the set of "pending changes" that will be passed to the
+ * `_propertiesChanged` callback. This method does not enqueue the
+ * `_propertiesChanged` callback.
+ *
+ * @param {string} property Name of the property
+ * @param {*} value Value to set
+ * @param {boolean=} ext Not used here; affordance for closure
+ * @return {boolean} Returns true if the property changed
+ * @protected
+ */
+ _setPendingProperty(property, value, ext) {
+ let old = this.__data[property];
+ let changed = this._shouldPropertyChange(property, value, old);
+ if (changed) {
+ if (!this.__dataPending) {
+ this.__dataPending = {};
+ this.__dataOld = {};
+ }
+ // Ensure old is captured from the last turn
+ if (this.__dataOld && !(property in this.__dataOld)) {
+ this.__dataOld[property] = old;
+ }
+ this.__data[property] = value;
+ this.__dataPending[property] = value;
+ }
+ return changed;
+ }
+ /* eslint-enable */
+
+ /**
+ * Marks the properties as invalid, and enqueues an async
+ * `_propertiesChanged` callback.
+ *
+ * @return {void}
+ * @protected
+ */
+ _invalidateProperties() {
+ if (!this.__dataInvalid && this.__dataReady) {
+ this.__dataInvalid = true;
+ microtask.run(() => {
+ if (this.__dataInvalid) {
+ this.__dataInvalid = false;
+ this._flushProperties();
+ }
+ });
+ }
+ }
+
+ /**
+ * Call to enable property accessor processing. Before this method is
+ * called accessor values will be set but side effects are
+ * queued. When called, any pending side effects occur immediately.
+ * For elements, generally `connectedCallback` is a normal spot to do so.
+ * It is safe to call this method multiple times as it only turns on
+ * property accessors once.
+ *
+ * @return {void}
+ * @protected
+ */
+ _enableProperties() {
+ if (!this.__dataEnabled) {
+ this.__dataEnabled = true;
+ if (this.__dataInstanceProps) {
+ this._initializeInstanceProperties(this.__dataInstanceProps);
+ this.__dataInstanceProps = null;
+ }
+ this.ready();
+ }
+ }
+
+ /**
+ * Calls the `_propertiesChanged` callback with the current set of
+ * pending changes (and old values recorded when pending changes were
+ * set), and resets the pending set of changes. Generally, this method
+ * should not be called in user code.
+ *
+ * @return {void}
+ * @protected
+ */
+ _flushProperties() {
+ const props = this.__data;
+ const changedProps = this.__dataPending;
+ const old = this.__dataOld;
+ if (this._shouldPropertiesChange(props, changedProps, old)) {
+ this.__dataPending = null;
+ this.__dataOld = null;
+ this._propertiesChanged(props, changedProps, old);
+ }
+ }
+
+ /**
+ * Called in `_flushProperties` to determine if `_propertiesChanged`
+ * should be called. The default implementation returns true if
+ * properties are pending. Override to customize when
+ * `_propertiesChanged` is called.
+ * @param {!Object} currentProps Bag of all current accessor values
+ * @param {!Object} changedProps Bag of properties changed since the last
+ * call to `_propertiesChanged`
+ * @param {!Object} oldProps Bag of previous values for each property
+ * in `changedProps`
+ * @return {boolean} true if changedProps is truthy
+ */
+ _shouldPropertiesChange(currentProps, changedProps, oldProps) { // eslint-disable-line no-unused-vars
+ return Boolean(changedProps);
+ }
+
+ /**
+ * Callback called when any properties with accessors created via
+ * `_createPropertyAccessor` have been set.
+ *
+ * @param {!Object} currentProps Bag of all current accessor values
+ * @param {!Object} changedProps Bag of properties changed since the last
+ * call to `_propertiesChanged`
+ * @param {!Object} oldProps Bag of previous values for each property
+ * in `changedProps`
+ * @return {void}
+ * @protected
+ */
+ _propertiesChanged(currentProps, changedProps, oldProps) { // eslint-disable-line no-unused-vars
+ }
+
+ /**
+ * Method called to determine whether a property value should be
+ * considered as a change and cause the `_propertiesChanged` callback
+ * to be enqueued.
+ *
+ * The default implementation returns `true` if a strict equality
+ * check fails. The method always returns false for `NaN`.
+ *
+ * Override this method to e.g. provide stricter checking for
+ * Objects/Arrays when using immutable patterns.
+ *
+ * @param {string} property Property name
+ * @param {*} value New property value
+ * @param {*} old Previous property value
+ * @return {boolean} Whether the property should be considered a change
+ * and enqueue a `_proeprtiesChanged` callback
+ * @protected
+ */
+ _shouldPropertyChange(property, value, old) {
+ return (
+ // Strict equality check
+ (old !== value &&
+ // This ensures (old==NaN, value==NaN) always returns false
+ (old === old || value === value))
+ );
+ }
+
+ /**
+ * Implements native Custom Elements `attributeChangedCallback` to
+ * set an attribute value to a property via `_attributeToProperty`.
+ *
+ * @param {string} name Name of attribute that changed
+ * @param {?string} old Old attribute value
+ * @param {?string} value New attribute value
+ * @param {?string} namespace Attribute namespace.
+ * @return {void}
+ * @suppress {missingProperties} Super may or may not implement the callback
+ */
+ attributeChangedCallback(name, old, value, namespace) {
+ if (old !== value) {
+ this._attributeToProperty(name, value);
+ }
+ if (super.attributeChangedCallback) {
+ super.attributeChangedCallback(name, old, value, namespace);
+ }
+ }
+
+ /**
+ * Deserializes an attribute to its associated property.
+ *
+ * This method calls the `_deserializeValue` method to convert the string to
+ * a typed value.
+ *
+ * @param {string} attribute Name of attribute to deserialize.
+ * @param {?string} value of the attribute.
+ * @param {*=} type type to deserialize to, defaults to the value
+ * returned from `typeForProperty`
+ * @return {void}
+ */
+ _attributeToProperty(attribute, value, type) {
+ if (!this.__serializing) {
+ const map = this.__dataAttributes;
+ const property = map && map[attribute] || attribute;
+ this[property] = this._deserializeValue(value, type ||
+ this.constructor.typeForProperty(property));
+ }
+ }
+
+ /**
+ * Serializes a property to its associated attribute.
+ *
+ * @suppress {invalidCasts} Closure can't figure out `this` is an element.
+ *
+ * @param {string} property Property name to reflect.
+ * @param {string=} attribute Attribute name to reflect to.
+ * @param {*=} value Property value to refect.
+ * @return {void}
+ */
+ _propertyToAttribute(property, attribute, value) {
+ this.__serializing = true;
+ value = (arguments.length < 3) ? this[property] : value;
+ this._valueToNodeAttribute(/** @type {!HTMLElement} */(this), value,
+ attribute || this.constructor.attributeNameForProperty(property));
+ this.__serializing = false;
+ }
+
+ /**
+ * Sets a typed value to an HTML attribute on a node.
+ *
+ * This method calls the `_serializeValue` method to convert the typed
+ * value to a string. If the `_serializeValue` method returns `undefined`,
+ * the attribute will be removed (this is the default for boolean
+ * type `false`).
+ *
+ * @param {Element} node Element to set attribute to.
+ * @param {*} value Value to serialize.
+ * @param {string} attribute Attribute name to serialize to.
+ * @return {void}
+ */
+ _valueToNodeAttribute(node, value, attribute) {
+ const str = this._serializeValue(value);
+ if (str === undefined) {
+ node.removeAttribute(attribute);
+ } else {
+ node.setAttribute(attribute, str);
+ }
+ }
+
+ /**
+ * Converts a typed JavaScript value to a string.
+ *
+ * This method is called when setting JS property values to
+ * HTML attributes. Users may override this method to provide
+ * serialization for custom types.
+ *
+ * @param {*} value Property value to serialize.
+ * @return {string | undefined} String serialized from the provided
+ * property value.
+ */
+ _serializeValue(value) {
+ switch (typeof value) {
+ case 'boolean':
+ return value ? '' : undefined;
+ default:
+ return value != null ? value.toString() : undefined;
+ }
+ }
+
+ /**
+ * Converts a string to a typed JavaScript value.
+ *
+ * This method is called when reading HTML attribute values to
+ * JS properties. Users may override this method to provide
+ * deserialization for custom `type`s. Types for `Boolean`, `String`,
+ * and `Number` convert attributes to the expected types.
+ *
+ * @param {?string} value Value to deserialize.
+ * @param {*=} type Type to deserialize the string to.
+ * @return {*} Typed value deserialized from the provided string.
+ */
+ _deserializeValue(value, type) {
+ switch (type) {
+ case Boolean:
+ return (value !== null);
+ case Number:
+ return Number(value);
+ default:
+ return value;
+ }
+ }
+
+ }
+
+ return PropertiesChanged;
+});
diff --git a/third_party/polymer3/bower_components/polymer/lib/mixins/properties-mixin.js b/third_party/polymer3/bower_components/polymer/lib/mixins/properties-mixin.js
new file mode 100644
index 0000000..8a18d0d
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/lib/mixins/properties-mixin.js
@@ -0,0 +1,221 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import '../utils/boot.js';
+
+import { dedupingMixin } from '../utils/mixin.js';
+import { PropertiesChanged } from './properties-changed.js';
+
+/**
+ * Creates a copy of `props` with each property normalized such that
+ * upgraded it is an object with at least a type property { type: Type}.
+ *
+ * @param {Object} props Properties to normalize
+ * @return {Object} Copy of input `props` with normalized properties that
+ * are in the form {type: Type}
+ * @private
+ */
+function normalizeProperties(props) {
+ const output = {};
+ for (let p in props) {
+ const o = props[p];
+ output[p] = (typeof o === 'function') ? {type: o} : o;
+ }
+ return output;
+}
+
+/**
+ * Mixin that provides a minimal starting point to using the PropertiesChanged
+ * mixin by providing a mechanism to declare properties in a static
+ * getter (e.g. static get properties() { return { foo: String } }). Changes
+ * are reported via the `_propertiesChanged` method.
+ *
+ * This mixin provides no specific support for rendering. Users are expected
+ * to create a ShadowRoot and put content into it and update it in whatever
+ * way makes sense. This can be done in reaction to properties changing by
+ * implementing `_propertiesChanged`.
+ *
+ * @mixinFunction
+ * @polymer
+ * @appliesMixin PropertiesChanged
+ * @summary Mixin that provides a minimal starting point for using
+ * the PropertiesChanged mixin by providing a declarative `properties` object.
+ */
+export const PropertiesMixin = dedupingMixin(superClass => {
+
+ /**
+ * @constructor
+ * @extends {superClass}
+ * @implements {Polymer_PropertiesChanged}
+ */
+ const base = PropertiesChanged(superClass);
+
+ /**
+ * Returns the super class constructor for the given class, if it is an
+ * instance of the PropertiesMixin.
+ *
+ * @param {!PropertiesMixinConstructor} constructor PropertiesMixin constructor
+ * @return {PropertiesMixinConstructor} Super class constructor
+ */
+ function superPropertiesClass(constructor) {
+ const superCtor = Object.getPrototypeOf(constructor);
+
+ // Note, the `PropertiesMixin` class below only refers to the class
+ // generated by this call to the mixin; the instanceof test only works
+ // because the mixin is deduped and guaranteed only to apply once, hence
+ // all constructors in a proto chain will see the same `PropertiesMixin`
+ return (superCtor.prototype instanceof PropertiesMixin) ?
+ /** @type {PropertiesMixinConstructor} */ (superCtor) : null;
+ }
+
+ /**
+ * Returns a memoized version of the `properties` object for the
+ * given class. Properties not in object format are converted to at
+ * least {type}.
+ *
+ * @param {PropertiesMixinConstructor} constructor PropertiesMixin constructor
+ * @return {Object} Memoized properties object
+ */
+ function ownProperties(constructor) {
+ if (!constructor.hasOwnProperty(JSCompiler_renameProperty('__ownProperties', constructor))) {
+ let props = null;
+
+ if (constructor.hasOwnProperty(JSCompiler_renameProperty('properties', constructor)) && constructor.properties) {
+ props = normalizeProperties(constructor.properties);
+ }
+
+ constructor.__ownProperties = props;
+ }
+ return constructor.__ownProperties;
+ }
+
+ /**
+ * @polymer
+ * @mixinClass
+ * @extends {base}
+ * @implements {Polymer_PropertiesMixin}
+ * @unrestricted
+ */
+ class PropertiesMixin extends base {
+
+ /**
+ * Implements standard custom elements getter to observes the attributes
+ * listed in `properties`.
+ * @suppress {missingProperties} Interfaces in closure do not inherit statics, but classes do
+ */
+ static get observedAttributes() {
+ const props = this._properties;
+ return props ? Object.keys(props).map(p => this.attributeNameForProperty(p)) : [];
+ }
+
+ /**
+ * Finalizes an element definition, including ensuring any super classes
+ * are also finalized. This includes ensuring property
+ * accessors exist on the element prototype. This method calls
+ * `_finalizeClass` to finalize each constructor in the prototype chain.
+ * @return {void}
+ */
+ static finalize() {
+ if (!this.hasOwnProperty(JSCompiler_renameProperty('__finalized', this))) {
+ const superCtor = superPropertiesClass(/** @type {PropertiesMixinConstructor} */(this));
+ if (superCtor) {
+ superCtor.finalize();
+ }
+ this.__finalized = true;
+ this._finalizeClass();
+ }
+ }
+
+ /**
+ * Finalize an element class. This includes ensuring property
+ * accessors exist on the element prototype. This method is called by
+ * `finalize` and finalizes the class constructor.
+ *
+ * @protected
+ */
+ static _finalizeClass() {
+ const props = ownProperties(/** @type {PropertiesMixinConstructor} */(this));
+ if (props) {
+ this.createProperties(props);
+ }
+ }
+
+ /**
+ * Returns a memoized version of all properties, including those inherited
+ * from super classes. Properties not in object format are converted to
+ * at least {type}.
+ *
+ * @return {Object} Object containing properties for this class
+ * @protected
+ */
+ static get _properties() {
+ if (!this.hasOwnProperty(
+ JSCompiler_renameProperty('__properties', this))) {
+ const superCtor = superPropertiesClass(/** @type {PropertiesMixinConstructor} */(this));
+ this.__properties = Object.assign({},
+ superCtor && superCtor._properties,
+ ownProperties(/** @type {PropertiesMixinConstructor} */(this)));
+ }
+ return this.__properties;
+ }
+
+ /**
+ * Overrides `PropertiesChanged` method to return type specified in the
+ * static `properties` object for the given property.
+ * @param {string} name Name of property
+ * @return {*} Type to which to deserialize attribute
+ *
+ * @protected
+ */
+ static typeForProperty(name) {
+ const info = this._properties[name];
+ return info && info.type;
+ }
+
+ /**
+ * Overrides `PropertiesChanged` method and adds a call to
+ * `finalize` which lazily configures the element's property accessors.
+ * @override
+ * @return {void}
+ */
+ _initializeProperties() {
+ this.constructor.finalize();
+ super._initializeProperties();
+ }
+
+ /**
+ * Called when the element is added to a document.
+ * Calls `_enableProperties` to turn on property system from
+ * `PropertiesChanged`.
+ * @suppress {missingProperties} Super may or may not implement the callback
+ * @return {void}
+ */
+ connectedCallback() {
+ if (super.connectedCallback) {
+ super.connectedCallback();
+ }
+ this._enableProperties();
+ }
+
+ /**
+ * Called when the element is removed from a document
+ * @suppress {missingProperties} Super may or may not implement the callback
+ * @return {void}
+ */
+ disconnectedCallback() {
+ if (super.disconnectedCallback) {
+ super.disconnectedCallback();
+ }
+ }
+
+ }
+
+ return PropertiesMixin;
+
+});
diff --git a/third_party/polymer3/bower_components/polymer/lib/mixins/property-accessors.js b/third_party/polymer3/bower_components/polymer/lib/mixins/property-accessors.js
new file mode 100644
index 0000000..c00e1b4
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/lib/mixins/property-accessors.js
@@ -0,0 +1,313 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import '../utils/boot.js';
+
+import { dedupingMixin } from '../utils/mixin.js';
+import * as caseMap$0 from '../utils/case-map.js';
+import { PropertiesChanged } from './properties-changed.js';
+
+let caseMap = caseMap$0;
+
+// Save map of native properties; this forms a blacklist or properties
+// that won't have their values "saved" by `saveAccessorValue`, since
+// reading from an HTMLElement accessor from the context of a prototype throws
+const nativeProperties = {};
+let proto = HTMLElement.prototype;
+while (proto) {
+ let props = Object.getOwnPropertyNames(proto);
+ for (let i=0; i<props.length; i++) {
+ nativeProperties[props[i]] = true;
+ }
+ proto = Object.getPrototypeOf(proto);
+}
+
+/**
+ * Used to save the value of a property that will be overridden with
+ * an accessor. If the `model` is a prototype, the values will be saved
+ * in `__dataProto`, and it's up to the user (or downstream mixin) to
+ * decide how/when to set these values back into the accessors.
+ * If `model` is already an instance (it has a `__data` property), then
+ * the value will be set as a pending property, meaning the user should
+ * call `_invalidateProperties` or `_flushProperties` to take effect
+ *
+ * @param {Object} model Prototype or instance
+ * @param {string} property Name of property
+ * @return {void}
+ * @private
+ */
+function saveAccessorValue(model, property) {
+ // Don't read/store value for any native properties since they could throw
+ if (!nativeProperties[property]) {
+ let value = model[property];
+ if (value !== undefined) {
+ if (model.__data) {
+ // Adding accessor to instance; update the property
+ // It is the user's responsibility to call _flushProperties
+ model._setPendingProperty(property, value);
+ } else {
+ // Adding accessor to proto; save proto's value for instance-time use
+ if (!model.__dataProto) {
+ model.__dataProto = {};
+ } else if (!model.hasOwnProperty(JSCompiler_renameProperty('__dataProto', model))) {
+ model.__dataProto = Object.create(model.__dataProto);
+ }
+ model.__dataProto[property] = value;
+ }
+ }
+ }
+}
+
+/**
+ * Element class mixin that provides basic meta-programming for creating one
+ * or more property accessors (getter/setter pair) that enqueue an async
+ * (batched) `_propertiesChanged` callback.
+ *
+ * For basic usage of this mixin:
+ *
+ * - Declare attributes to observe via the standard `static get observedAttributes()`. Use
+ * `dash-case` attribute names to represent `camelCase` property names.
+ * - Implement the `_propertiesChanged` callback on the class.
+ * - Call `MyClass.createPropertiesForAttributes()` **once** on the class to generate
+ * property accessors for each observed attribute. This must be called before the first
+ * instance is created, for example, by calling it before calling `customElements.define`.
+ * It can also be called lazily from the element's `constructor`, as long as it's guarded so
+ * that the call is only made once, when the first instance is created.
+ * - Call `this._enableProperties()` in the element's `connectedCallback` to enable
+ * the accessors.
+ *
+ * Any `observedAttributes` will automatically be
+ * deserialized via `attributeChangedCallback` and set to the associated
+ * property using `dash-case`-to-`camelCase` convention.
+ *
+ * @mixinFunction
+ * @polymer
+ * @appliesMixin PropertiesChanged
+ * @summary Element class mixin for reacting to property changes from
+ * generated property accessors.
+ */
+export const PropertyAccessors = dedupingMixin(superClass => {
+
+ /**
+ * @constructor
+ * @extends {superClass}
+ * @implements {Polymer_PropertiesChanged}
+ * @unrestricted
+ */
+ const base = PropertiesChanged(superClass);
+
+ /**
+ * @polymer
+ * @mixinClass
+ * @implements {Polymer_PropertyAccessors}
+ * @extends {base}
+ * @unrestricted
+ */
+ class PropertyAccessors extends base {
+
+ /**
+ * Generates property accessors for all attributes in the standard
+ * static `observedAttributes` array.
+ *
+ * Attribute names are mapped to property names using the `dash-case` to
+ * `camelCase` convention
+ *
+ * @return {void}
+ */
+ static createPropertiesForAttributes() {
+ let a$ = this.observedAttributes;
+ for (let i=0; i < a$.length; i++) {
+ this.prototype._createPropertyAccessor(caseMap.dashToCamelCase(a$[i]));
+ }
+ }
+
+ /**
+ * Returns an attribute name that corresponds to the given property.
+ * By default, converts camel to dash case, e.g. `fooBar` to `foo-bar`.
+ * @param {string} property Property to convert
+ * @return {string} Attribute name corresponding to the given property.
+ *
+ * @protected
+ */
+ static attributeNameForProperty(property) {
+ return caseMap.camelToDashCase(property);
+ }
+
+ /**
+ * Overrides PropertiesChanged implementation to initialize values for
+ * accessors created for values that already existed on the element
+ * prototype.
+ *
+ * @return {void}
+ * @protected
+ */
+ _initializeProperties() {
+ if (this.__dataProto) {
+ this._initializeProtoProperties(this.__dataProto);
+ this.__dataProto = null;
+ }
+ super._initializeProperties();
+ }
+
+ /**
+ * Called at instance time with bag of properties that were overwritten
+ * by accessors on the prototype when accessors were created.
+ *
+ * The default implementation sets these properties back into the
+ * setter at instance time. This method is provided as an override
+ * point for customizing or providing more efficient initialization.
+ *
+ * @param {Object} props Bag of property values that were overwritten
+ * when creating property accessors.
+ * @return {void}
+ * @protected
+ */
+ _initializeProtoProperties(props) {
+ for (let p in props) {
+ this._setProperty(p, props[p]);
+ }
+ }
+
+ /**
+ * Ensures the element has the given attribute. If it does not,
+ * assigns the given value to the attribute.
+ *
+ * @suppress {invalidCasts} Closure can't figure out `this` is infact an element
+ *
+ * @param {string} attribute Name of attribute to ensure is set.
+ * @param {string} value of the attribute.
+ * @return {void}
+ */
+ _ensureAttribute(attribute, value) {
+ const el = /** @type {!HTMLElement} */(this);
+ if (!el.hasAttribute(attribute)) {
+ this._valueToNodeAttribute(el, value, attribute);
+ }
+ }
+
+ /**
+ * Overrides PropertiesChanged implemention to serialize objects as JSON.
+ *
+ * @param {*} value Property value to serialize.
+ * @return {string | undefined} String serialized from the provided property value.
+ */
+ _serializeValue(value) {
+ /* eslint-disable no-fallthrough */
+ switch (typeof value) {
+ case 'object':
+ if (value instanceof Date) {
+ return value.toString();
+ } else if (value) {
+ try {
+ return JSON.stringify(value);
+ } catch(x) {
+ return '';
+ }
+ }
+
+ default:
+ return super._serializeValue(value);
+ }
+ }
+
+ /**
+ * Converts a string to a typed JavaScript value.
+ *
+ * This method is called by Polymer when reading HTML attribute values to
+ * JS properties. Users may override this method on Polymer element
+ * prototypes to provide deserialization for custom `type`s. Note,
+ * the `type` argument is the value of the `type` field provided in the
+ * `properties` configuration object for a given property, and is
+ * by convention the constructor for the type to deserialize.
+ *
+ *
+ * @param {?string} value Attribute value to deserialize.
+ * @param {*=} type Type to deserialize the string to.
+ * @return {*} Typed value deserialized from the provided string.
+ */
+ _deserializeValue(value, type) {
+ /**
+ * @type {*}
+ */
+ let outValue;
+ switch (type) {
+ case Object:
+ try {
+ outValue = JSON.parse(/** @type {string} */(value));
+ } catch(x) {
+ // allow non-JSON literals like Strings and Numbers
+ outValue = value;
+ }
+ break;
+ case Array:
+ try {
+ outValue = JSON.parse(/** @type {string} */(value));
+ } catch(x) {
+ outValue = null;
+ console.warn(`Polymer::Attributes: couldn't decode Array as JSON: ${value}`);
+ }
+ break;
+ case Date:
+ outValue = isNaN(value) ? String(value) : Number(value);
+ outValue = new Date(outValue);
+ break;
+ default:
+ outValue = super._deserializeValue(value, type);
+ break;
+ }
+ return outValue;
+ }
+ /* eslint-enable no-fallthrough */
+
+ /**
+ * Overrides PropertiesChanged implementation to save existing prototype
+ * property value so that it can be reset.
+ * @param {string} property Name of the property
+ * @param {boolean=} readOnly When true, no setter is created
+ *
+ * When calling on a prototype, any overwritten values are saved in
+ * `__dataProto`, and it is up to the subclasser to decide how/when
+ * to set those properties back into the accessor. When calling on an
+ * instance, the overwritten value is set via `_setPendingProperty`,
+ * and the user should call `_invalidateProperties` or `_flushProperties`
+ * for the values to take effect.
+ * @protected
+ * @return {void}
+ */
+ _definePropertyAccessor(property, readOnly) {
+ saveAccessorValue(this, property);
+ super._definePropertyAccessor(property, readOnly);
+ }
+
+ /**
+ * Returns true if this library created an accessor for the given property.
+ *
+ * @param {string} property Property name
+ * @return {boolean} True if an accessor was created
+ */
+ _hasAccessor(property) {
+ return this.__dataHasAccessor && this.__dataHasAccessor[property];
+ }
+
+ /**
+ * Returns true if the specified property has a pending change.
+ *
+ * @param {string} prop Property name
+ * @return {boolean} True if property has a pending change
+ * @protected
+ */
+ _isPropertyPending(prop) {
+ return Boolean(this.__dataPending && (prop in this.__dataPending));
+ }
+
+ }
+
+ return PropertyAccessors;
+
+});
diff --git a/third_party/polymer3/bower_components/polymer/lib/mixins/property-effects.js b/third_party/polymer3/bower_components/polymer/lib/mixins/property-effects.js
new file mode 100644
index 0000000..91b5d12
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/lib/mixins/property-effects.js
@@ -0,0 +1,2812 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+
+import '../utils/boot.js';
+
+import { dedupingMixin } from '../utils/mixin.js';
+import { root as root$0, isAncestor, isDescendant, get as get$0, translate, isPath as isPath$0, set as set$0, normalize } from '../utils/path.js';
+/* for notify, reflect */
+import * as caseMap from '../utils/case-map.js';
+import { camelToDashCase as camelToDashCase$0, dashToCamelCase } from '../utils/case-map.js';
+import { PropertyAccessors } from './property-accessors.js';
+/* for annotated effects */
+import { TemplateStamp } from './template-stamp.js';
+import { sanitizeDOMValue } from '../utils/settings.js';
+
+/** @const {Object} */
+const CaseMap = caseMap;
+
+// Monotonically increasing unique ID used for de-duping effects triggered
+// from multiple properties in the same turn
+let dedupeId = 0;
+
+/**
+ * Property effect types; effects are stored on the prototype using these keys
+ * @enum {string}
+ */
+const TYPES = {
+ COMPUTE: '__computeEffects',
+ REFLECT: '__reflectEffects',
+ NOTIFY: '__notifyEffects',
+ PROPAGATE: '__propagateEffects',
+ OBSERVE: '__observeEffects',
+ READ_ONLY: '__readOnly'
+};
+
+/** @const {RegExp} */
+const capitalAttributeRegex = /[A-Z]/;
+
+/**
+ * @typedef {{
+ * name: (string | undefined),
+ * structured: (boolean | undefined),
+ * wildcard: (boolean | undefined)
+ * }}
+ */
+let DataTrigger; //eslint-disable-line no-unused-vars
+
+/**
+ * @typedef {{
+ * info: ?,
+ * trigger: (!DataTrigger | undefined),
+ * fn: (!Function | undefined)
+ * }}
+ */
+let DataEffect; //eslint-disable-line no-unused-vars
+
+let PropertyEffectsType; //eslint-disable-line no-unused-vars
+
+/**
+ * Ensures that the model has an own-property map of effects for the given type.
+ * The model may be a prototype or an instance.
+ *
+ * Property effects are stored as arrays of effects by property in a map,
+ * by named type on the model. e.g.
+ *
+ * __computeEffects: {
+ * foo: [ ... ],
+ * bar: [ ... ]
+ * }
+ *
+ * If the model does not yet have an effect map for the type, one is created
+ * and returned. If it does, but it is not an own property (i.e. the
+ * prototype had effects), the the map is deeply cloned and the copy is
+ * set on the model and returned, ready for new effects to be added.
+ *
+ * @param {Object} model Prototype or instance
+ * @param {string} type Property effect type
+ * @return {Object} The own-property map of effects for the given type
+ * @private
+ */
+function ensureOwnEffectMap(model, type) {
+ let effects = model[type];
+ if (!effects) {
+ effects = model[type] = {};
+ } else if (!model.hasOwnProperty(type)) {
+ effects = model[type] = Object.create(model[type]);
+ for (let p in effects) {
+ let protoFx = effects[p];
+ let instFx = effects[p] = Array(protoFx.length);
+ for (let i=0; i<protoFx.length; i++) {
+ instFx[i] = protoFx[i];
+ }
+ }
+ }
+ return effects;
+}
+
+// -- effects ----------------------------------------------
+
+/**
+ * Runs all effects of a given type for the given set of property changes
+ * on an instance.
+ *
+ * @param {!PropertyEffectsType} inst The instance with effects to run
+ * @param {Object} effects Object map of property-to-Array of effects
+ * @param {Object} props Bag of current property changes
+ * @param {Object=} oldProps Bag of previous values for changed properties
+ * @param {boolean=} hasPaths True with `props` contains one or more paths
+ * @param {*=} extraArgs Additional metadata to pass to effect function
+ * @return {boolean} True if an effect ran for this property
+ * @private
+ */
+function runEffects(inst, effects, props, oldProps, hasPaths, extraArgs) {
+ if (effects) {
+ let ran = false;
+ let id = dedupeId++;
+ for (let prop in props) {
+ if (runEffectsForProperty(inst, effects, id, prop, props, oldProps, hasPaths, extraArgs)) {
+ ran = true;
+ }
+ }
+ return ran;
+ }
+ return false;
+}
+
+/**
+ * Runs a list of effects for a given property.
+ *
+ * @param {!PropertyEffectsType} inst The instance with effects to run
+ * @param {Object} effects Object map of property-to-Array of effects
+ * @param {number} dedupeId Counter used for de-duping effects
+ * @param {string} prop Name of changed property
+ * @param {*} props Changed properties
+ * @param {*} oldProps Old properties
+ * @param {boolean=} hasPaths True with `props` contains one or more paths
+ * @param {*=} extraArgs Additional metadata to pass to effect function
+ * @return {boolean} True if an effect ran for this property
+ * @private
+ */
+function runEffectsForProperty(inst, effects, dedupeId, prop, props, oldProps, hasPaths, extraArgs) {
+ let ran = false;
+ let rootProperty = hasPaths ? root$0(prop) : prop;
+ let fxs = effects[rootProperty];
+ if (fxs) {
+ for (let i=0, l=fxs.length, fx; (i<l) && (fx=fxs[i]); i++) {
+ if ((!fx.info || fx.info.lastRun !== dedupeId) &&
+ (!hasPaths || pathMatchesTrigger(prop, fx.trigger))) {
+ if (fx.info) {
+ fx.info.lastRun = dedupeId;
+ }
+ fx.fn(inst, prop, props, oldProps, fx.info, hasPaths, extraArgs);
+ ran = true;
+ }
+ }
+ }
+ return ran;
+}
+
+/**
+ * Determines whether a property/path that has changed matches the trigger
+ * criteria for an effect. A trigger is a descriptor with the following
+ * structure, which matches the descriptors returned from `parseArg`.
+ * e.g. for `foo.bar.*`:
+ * ```
+ * trigger: {
+ * name: 'a.b',
+ * structured: true,
+ * wildcard: true
+ * }
+ * ```
+ * If no trigger is given, the path is deemed to match.
+ *
+ * @param {string} path Path or property that changed
+ * @param {DataTrigger} trigger Descriptor
+ * @return {boolean} Whether the path matched the trigger
+ */
+function pathMatchesTrigger(path, trigger) {
+ if (trigger) {
+ let triggerPath = trigger.name;
+ return (triggerPath == path) ||
+ (trigger.structured && isAncestor(triggerPath, path)) ||
+ (trigger.wildcard && isDescendant(triggerPath, path));
+ } else {
+ return true;
+ }
+}
+
+/**
+ * Implements the "observer" effect.
+ *
+ * Calls the method with `info.methodName` on the instance, passing the
+ * new and old values.
+ *
+ * @param {!PropertyEffectsType} inst The instance the effect will be run on
+ * @param {string} property Name of property
+ * @param {Object} props Bag of current property changes
+ * @param {Object} oldProps Bag of previous values for changed properties
+ * @param {?} info Effect metadata
+ * @return {void}
+ * @private
+ */
+function runObserverEffect(inst, property, props, oldProps, info) {
+ let fn = typeof info.method === "string" ? inst[info.method] : info.method;
+ let changedProp = info.property;
+ if (fn) {
+ fn.call(inst, inst.__data[changedProp], oldProps[changedProp]);
+ } else if (!info.dynamicFn) {
+ console.warn('observer method `' + info.method + '` not defined');
+ }
+}
+
+/**
+ * Runs "notify" effects for a set of changed properties.
+ *
+ * This method differs from the generic `runEffects` method in that it
+ * will dispatch path notification events in the case that the property
+ * changed was a path and the root property for that path didn't have a
+ * "notify" effect. This is to maintain 1.0 behavior that did not require
+ * `notify: true` to ensure object sub-property notifications were
+ * sent.
+ *
+ * @param {!PropertyEffectsType} inst The instance with effects to run
+ * @param {Object} notifyProps Bag of properties to notify
+ * @param {Object} props Bag of current property changes
+ * @param {Object} oldProps Bag of previous values for changed properties
+ * @param {boolean} hasPaths True with `props` contains one or more paths
+ * @return {void}
+ * @private
+ */
+function runNotifyEffects(inst, notifyProps, props, oldProps, hasPaths) {
+ // Notify
+ let fxs = inst[TYPES.NOTIFY];
+ let notified;
+ let id = dedupeId++;
+ // Try normal notify effects; if none, fall back to try path notification
+ for (let prop in notifyProps) {
+ if (notifyProps[prop]) {
+ if (fxs && runEffectsForProperty(inst, fxs, id, prop, props, oldProps, hasPaths)) {
+ notified = true;
+ } else if (hasPaths && notifyPath(inst, prop, props)) {
+ notified = true;
+ }
+ }
+ }
+ // Flush host if we actually notified and host was batching
+ // And the host has already initialized clients; this prevents
+ // an issue with a host observing data changes before clients are ready.
+ let host;
+ if (notified && (host = inst.__dataHost) && host._invalidateProperties) {
+ host._invalidateProperties();
+ }
+}
+
+/**
+ * Dispatches {property}-changed events with path information in the detail
+ * object to indicate a sub-path of the property was changed.
+ *
+ * @param {!PropertyEffectsType} inst The element from which to fire the event
+ * @param {string} path The path that was changed
+ * @param {Object} props Bag of current property changes
+ * @return {boolean} Returns true if the path was notified
+ * @private
+ */
+function notifyPath(inst, path, props) {
+ let rootProperty = root$0(path);
+ if (rootProperty !== path) {
+ let eventName = camelToDashCase$0(rootProperty) + '-changed';
+ dispatchNotifyEvent(inst, eventName, props[path], path);
+ return true;
+ }
+ return false;
+}
+
+/**
+ * Dispatches {property}-changed events to indicate a property (or path)
+ * changed.
+ *
+ * @param {!PropertyEffectsType} inst The element from which to fire the event
+ * @param {string} eventName The name of the event to send ('{property}-changed')
+ * @param {*} value The value of the changed property
+ * @param {string | null | undefined} path If a sub-path of this property changed, the path
+ * that changed (optional).
+ * @return {void}
+ * @private
+ * @suppress {invalidCasts}
+ */
+function dispatchNotifyEvent(inst, eventName, value, path) {
+ let detail = {
+ value: value,
+ queueProperty: true
+ };
+ if (path) {
+ detail.path = path;
+ }
+ /** @type {!HTMLElement} */(inst).dispatchEvent(new CustomEvent(eventName, { detail }));
+}
+
+/**
+ * Implements the "notify" effect.
+ *
+ * Dispatches a non-bubbling event named `info.eventName` on the instance
+ * with a detail object containing the new `value`.
+ *
+ * @param {!PropertyEffectsType} inst The instance the effect will be run on
+ * @param {string} property Name of property
+ * @param {Object} props Bag of current property changes
+ * @param {Object} oldProps Bag of previous values for changed properties
+ * @param {?} info Effect metadata
+ * @param {boolean} hasPaths True with `props` contains one or more paths
+ * @return {void}
+ * @private
+ */
+function runNotifyEffect(inst, property, props, oldProps, info, hasPaths) {
+ let rootProperty = hasPaths ? root$0(property) : property;
+ let path = rootProperty != property ? property : null;
+ let value = path ? get$0(inst, path) : inst.__data[property];
+ if (path && value === undefined) {
+ value = props[property]; // specifically for .splices
+ }
+ dispatchNotifyEvent(inst, info.eventName, value, path);
+}
+
+/**
+ * Handler function for 2-way notification events. Receives context
+ * information captured in the `addNotifyListener` closure from the
+ * `__notifyListeners` metadata.
+ *
+ * Sets the value of the notified property to the host property or path. If
+ * the event contained path information, translate that path to the host
+ * scope's name for that path first.
+ *
+ * @param {CustomEvent} event Notification event (e.g. '<property>-changed')
+ * @param {!PropertyEffectsType} inst Host element instance handling the notification event
+ * @param {string} fromProp Child element property that was bound
+ * @param {string} toPath Host property/path that was bound
+ * @param {boolean} negate Whether the binding was negated
+ * @return {void}
+ * @private
+ */
+function handleNotification(event, inst, fromProp, toPath, negate) {
+ let value;
+ let detail = /** @type {Object} */(event.detail);
+ let fromPath = detail && detail.path;
+ if (fromPath) {
+ toPath = translate(fromProp, toPath, fromPath);
+ value = detail && detail.value;
+ } else {
+ value = event.target[fromProp];
+ }
+ value = negate ? !value : value;
+ if (!inst[TYPES.READ_ONLY] || !inst[TYPES.READ_ONLY][toPath]) {
+ if (inst._setPendingPropertyOrPath(toPath, value, true, Boolean(fromPath))
+ && (!detail || !detail.queueProperty)) {
+ inst._invalidateProperties();
+ }
+ }
+}
+
+/**
+ * Implements the "reflect" effect.
+ *
+ * Sets the attribute named `info.attrName` to the given property value.
+ *
+ * @param {!PropertyEffectsType} inst The instance the effect will be run on
+ * @param {string} property Name of property
+ * @param {Object} props Bag of current property changes
+ * @param {Object} oldProps Bag of previous values for changed properties
+ * @param {?} info Effect metadata
+ * @return {void}
+ * @private
+ */
+function runReflectEffect(inst, property, props, oldProps, info) {
+ let value = inst.__data[property];
+ if (sanitizeDOMValue) {
+ value = sanitizeDOMValue(value, info.attrName, 'attribute', /** @type {Node} */(inst));
+ }
+ inst._propertyToAttribute(property, info.attrName, value);
+}
+
+/**
+ * Runs "computed" effects for a set of changed properties.
+ *
+ * This method differs from the generic `runEffects` method in that it
+ * continues to run computed effects based on the output of each pass until
+ * there are no more newly computed properties. This ensures that all
+ * properties that will be computed by the initial set of changes are
+ * computed before other effects (binding propagation, observers, and notify)
+ * run.
+ *
+ * @param {!PropertyEffectsType} inst The instance the effect will be run on
+ * @param {!Object} changedProps Bag of changed properties
+ * @param {!Object} oldProps Bag of previous values for changed properties
+ * @param {boolean} hasPaths True with `props` contains one or more paths
+ * @return {void}
+ * @private
+ */
+function runComputedEffects(inst, changedProps, oldProps, hasPaths) {
+ let computeEffects = inst[TYPES.COMPUTE];
+ if (computeEffects) {
+ let inputProps = changedProps;
+ while (runEffects(inst, computeEffects, inputProps, oldProps, hasPaths)) {
+ Object.assign(oldProps, inst.__dataOld);
+ Object.assign(changedProps, inst.__dataPending);
+ inputProps = inst.__dataPending;
+ inst.__dataPending = null;
+ }
+ }
+}
+
+/**
+ * Implements the "computed property" effect by running the method with the
+ * values of the arguments specified in the `info` object and setting the
+ * return value to the computed property specified.
+ *
+ * @param {!PropertyEffectsType} inst The instance the effect will be run on
+ * @param {string} property Name of property
+ * @param {Object} props Bag of current property changes
+ * @param {Object} oldProps Bag of previous values for changed properties
+ * @param {?} info Effect metadata
+ * @return {void}
+ * @private
+ */
+function runComputedEffect(inst, property, props, oldProps, info) {
+ let result = runMethodEffect(inst, property, props, oldProps, info);
+ let computedProp = info.methodInfo;
+ if (inst.__dataHasAccessor && inst.__dataHasAccessor[computedProp]) {
+ inst._setPendingProperty(computedProp, result, true);
+ } else {
+ inst[computedProp] = result;
+ }
+}
+
+/**
+ * Computes path changes based on path links set up using the `linkPaths`
+ * API.
+ *
+ * @param {!PropertyEffectsType} inst The instance whose props are changing
+ * @param {string | !Array<(string|number)>} path Path that has changed
+ * @param {*} value Value of changed path
+ * @return {void}
+ * @private
+ */
+function computeLinkedPaths(inst, path, value) {
+ let links = inst.__dataLinkedPaths;
+ if (links) {
+ let link;
+ for (let a in links) {
+ let b = links[a];
+ if (isDescendant(a, path)) {
+ link = translate(a, b, path);
+ inst._setPendingPropertyOrPath(link, value, true, true);
+ } else if (isDescendant(b, path)) {
+ link = translate(b, a, path);
+ inst._setPendingPropertyOrPath(link, value, true, true);
+ }
+ }
+ }
+}
+
+// -- bindings ----------------------------------------------
+
+/**
+ * Adds binding metadata to the current `nodeInfo`, and binding effects
+ * for all part dependencies to `templateInfo`.
+ *
+ * @param {Function} constructor Class that `_parseTemplate` is currently
+ * running on
+ * @param {TemplateInfo} templateInfo Template metadata for current template
+ * @param {NodeInfo} nodeInfo Node metadata for current template node
+ * @param {string} kind Binding kind, either 'property', 'attribute', or 'text'
+ * @param {string} target Target property name
+ * @param {!Array<!BindingPart>} parts Array of binding part metadata
+ * @param {string=} literal Literal text surrounding binding parts (specified
+ * only for 'property' bindings, since these must be initialized as part
+ * of boot-up)
+ * @return {void}
+ * @private
+ */
+function addBinding(constructor, templateInfo, nodeInfo, kind, target, parts, literal) {
+ // Create binding metadata and add to nodeInfo
+ nodeInfo.bindings = nodeInfo.bindings || [];
+ let /** Binding */ binding = { kind, target, parts, literal, isCompound: (parts.length !== 1) };
+ nodeInfo.bindings.push(binding);
+ // Add listener info to binding metadata
+ if (shouldAddListener(binding)) {
+ let {event, negate} = binding.parts[0];
+ binding.listenerEvent = event || (CaseMap.camelToDashCase(target) + '-changed');
+ binding.listenerNegate = negate;
+ }
+ // Add "propagate" property effects to templateInfo
+ let index = templateInfo.nodeInfoList.length;
+ for (let i=0; i<binding.parts.length; i++) {
+ let part = binding.parts[i];
+ part.compoundIndex = i;
+ addEffectForBindingPart(constructor, templateInfo, binding, part, index);
+ }
+}
+
+/**
+ * Adds property effects to the given `templateInfo` for the given binding
+ * part.
+ *
+ * @param {Function} constructor Class that `_parseTemplate` is currently
+ * running on
+ * @param {TemplateInfo} templateInfo Template metadata for current template
+ * @param {!Binding} binding Binding metadata
+ * @param {!BindingPart} part Binding part metadata
+ * @param {number} index Index into `nodeInfoList` for this node
+ * @return {void}
+ */
+function addEffectForBindingPart(constructor, templateInfo, binding, part, index) {
+ if (!part.literal) {
+ if (binding.kind === 'attribute' && binding.target[0] === '-') {
+ console.warn('Cannot set attribute ' + binding.target +
+ ' because "-" is not a valid attribute starting character');
+ } else {
+ let dependencies = part.dependencies;
+ let info = { index, binding, part, evaluator: constructor };
+ for (let j=0; j<dependencies.length; j++) {
+ let trigger = dependencies[j];
+ if (typeof trigger == 'string') {
+ trigger = parseArg(trigger);
+ trigger.wildcard = true;
+ }
+ constructor._addTemplatePropertyEffect(templateInfo, trigger.rootProperty, {
+ fn: runBindingEffect,
+ info, trigger
+ });
+ }
+ }
+ }
+}
+
+/**
+ * Implements the "binding" (property/path binding) effect.
+ *
+ * Note that binding syntax is overridable via `_parseBindings` and
+ * `_evaluateBinding`. This method will call `_evaluateBinding` for any
+ * non-literal parts returned from `_parseBindings`. However,
+ * there is no support for _path_ bindings via custom binding parts,
+ * as this is specific to Polymer's path binding syntax.
+ *
+ * @param {!PropertyEffectsType} inst The instance the effect will be run on
+ * @param {string} path Name of property
+ * @param {Object} props Bag of current property changes
+ * @param {Object} oldProps Bag of previous values for changed properties
+ * @param {?} info Effect metadata
+ * @param {boolean} hasPaths True with `props` contains one or more paths
+ * @param {Array} nodeList List of nodes associated with `nodeInfoList` template
+ * metadata
+ * @return {void}
+ * @private
+ */
+function runBindingEffect(inst, path, props, oldProps, info, hasPaths, nodeList) {
+ let node = nodeList[info.index];
+ let binding = info.binding;
+ let part = info.part;
+ // Subpath notification: transform path and set to client
+ // e.g.: foo="{{obj.sub}}", path: 'obj.sub.prop', set 'foo.prop'=obj.sub.prop
+ if (hasPaths && part.source && (path.length > part.source.length) &&
+ (binding.kind == 'property') && !binding.isCompound &&
+ node.__isPropertyEffectsClient &&
+ node.__dataHasAccessor && node.__dataHasAccessor[binding.target]) {
+ let value = props[path];
+ path = translate(part.source, binding.target, path);
+ if (node._setPendingPropertyOrPath(path, value, false, true)) {
+ inst._enqueueClient(node);
+ }
+ } else {
+ let value = info.evaluator._evaluateBinding(inst, part, path, props, oldProps, hasPaths);
+ // Propagate value to child
+ applyBindingValue(inst, node, binding, part, value);
+ }
+}
+
+/**
+ * Sets the value for an "binding" (binding) effect to a node,
+ * either as a property or attribute.
+ *
+ * @param {!PropertyEffectsType} inst The instance owning the binding effect
+ * @param {Node} node Target node for binding
+ * @param {!Binding} binding Binding metadata
+ * @param {!BindingPart} part Binding part metadata
+ * @param {*} value Value to set
+ * @return {void}
+ * @private
+ */
+function applyBindingValue(inst, node, binding, part, value) {
+ value = computeBindingValue(node, value, binding, part);
+ if (sanitizeDOMValue) {
+ value = sanitizeDOMValue(value, binding.target, binding.kind, node);
+ }
+ if (binding.kind == 'attribute') {
+ // Attribute binding
+ inst._valueToNodeAttribute(/** @type {Element} */(node), value, binding.target);
+ } else {
+ // Property binding
+ let prop = binding.target;
+ if (node.__isPropertyEffectsClient &&
+ node.__dataHasAccessor && node.__dataHasAccessor[prop]) {
+ if (!node[TYPES.READ_ONLY] || !node[TYPES.READ_ONLY][prop]) {
+ if (node._setPendingProperty(prop, value)) {
+ inst._enqueueClient(node);
+ }
+ }
+ } else {
+ inst._setUnmanagedPropertyToNode(node, prop, value);
+ }
+ }
+}
+
+/**
+ * Transforms an "binding" effect value based on compound & negation
+ * effect metadata, as well as handling for special-case properties
+ *
+ * @param {Node} node Node the value will be set to
+ * @param {*} value Value to set
+ * @param {!Binding} binding Binding metadata
+ * @param {!BindingPart} part Binding part metadata
+ * @return {*} Transformed value to set
+ * @private
+ */
+function computeBindingValue(node, value, binding, part) {
+ if (binding.isCompound) {
+ let storage = node.__dataCompoundStorage[binding.target];
+ storage[part.compoundIndex] = value;
+ value = storage.join('');
+ }
+ if (binding.kind !== 'attribute') {
+ // Some browsers serialize `undefined` to `"undefined"`
+ if (binding.target === 'textContent' ||
+ (binding.target === 'value' &&
+ (node.localName === 'input' || node.localName === 'textarea'))) {
+ value = value == undefined ? '' : value;
+ }
+ }
+ return value;
+}
+
+/**
+ * Returns true if a binding's metadata meets all the requirements to allow
+ * 2-way binding, and therefore a `<property>-changed` event listener should be
+ * added:
+ * - used curly braces
+ * - is a property (not attribute) binding
+ * - is not a textContent binding
+ * - is not compound
+ *
+ * @param {!Binding} binding Binding metadata
+ * @return {boolean} True if 2-way listener should be added
+ * @private
+ */
+function shouldAddListener(binding) {
+ return Boolean(binding.target) &&
+ binding.kind != 'attribute' &&
+ binding.kind != 'text' &&
+ !binding.isCompound &&
+ binding.parts[0].mode === '{';
+}
+
+/**
+ * Setup compound binding storage structures, notify listeners, and dataHost
+ * references onto the bound nodeList.
+ *
+ * @param {!PropertyEffectsType} inst Instance that bas been previously bound
+ * @param {TemplateInfo} templateInfo Template metadata
+ * @return {void}
+ * @private
+ */
+function setupBindings(inst, templateInfo) {
+ // Setup compound storage, dataHost, and notify listeners
+ let {nodeList, nodeInfoList} = templateInfo;
+ if (nodeInfoList.length) {
+ for (let i=0; i < nodeInfoList.length; i++) {
+ let info = nodeInfoList[i];
+ let node = nodeList[i];
+ let bindings = info.bindings;
+ if (bindings) {
+ for (let i=0; i<bindings.length; i++) {
+ let binding = bindings[i];
+ setupCompoundStorage(node, binding);
+ addNotifyListener(node, inst, binding);
+ }
+ }
+ node.__dataHost = inst;
+ }
+ }
+}
+
+/**
+ * Initializes `__dataCompoundStorage` local storage on a bound node with
+ * initial literal data for compound bindings, and sets the joined
+ * literal parts to the bound property.
+ *
+ * When changes to compound parts occur, they are first set into the compound
+ * storage array for that property, and then the array is joined to result in
+ * the final value set to the property/attribute.
+ *
+ * @param {Node} node Bound node to initialize
+ * @param {Binding} binding Binding metadata
+ * @return {void}
+ * @private
+ */
+function setupCompoundStorage(node, binding) {
+ if (binding.isCompound) {
+ // Create compound storage map
+ let storage = node.__dataCompoundStorage ||
+ (node.__dataCompoundStorage = {});
+ let parts = binding.parts;
+ // Copy literals from parts into storage for this binding
+ let literals = new Array(parts.length);
+ for (let j=0; j<parts.length; j++) {
+ literals[j] = parts[j].literal;
+ }
+ let target = binding.target;
+ storage[target] = literals;
+ // Configure properties with their literal parts
+ if (binding.literal && binding.kind == 'property') {
+ node[target] = binding.literal;
+ }
+ }
+}
+
+/**
+ * Adds a 2-way binding notification event listener to the node specified
+ *
+ * @param {Object} node Child element to add listener to
+ * @param {!PropertyEffectsType} inst Host element instance to handle notification event
+ * @param {Binding} binding Binding metadata
+ * @return {void}
+ * @private
+ */
+function addNotifyListener(node, inst, binding) {
+ if (binding.listenerEvent) {
+ let part = binding.parts[0];
+ node.addEventListener(binding.listenerEvent, function(e) {
+ handleNotification(e, inst, binding.target, part.source, part.negate);
+ });
+ }
+}
+
+// -- for method-based effects (complexObserver & computed) --------------
+
+/**
+ * Adds property effects for each argument in the method signature (and
+ * optionally, for the method name if `dynamic` is true) that calls the
+ * provided effect function.
+ *
+ * @param {Element | Object} model Prototype or instance
+ * @param {!MethodSignature} sig Method signature metadata
+ * @param {string} type Type of property effect to add
+ * @param {Function} effectFn Function to run when arguments change
+ * @param {*=} methodInfo Effect-specific information to be included in
+ * method effect metadata
+ * @param {boolean|Object=} dynamicFn Boolean or object map indicating whether
+ * method names should be included as a dependency to the effect. Note,
+ * defaults to true if the signature is static (sig.static is true).
+ * @return {void}
+ * @private
+ */
+function createMethodEffect(model, sig, type, effectFn, methodInfo, dynamicFn) {
+ dynamicFn = sig.static || (dynamicFn &&
+ (typeof dynamicFn !== 'object' || dynamicFn[sig.methodName]));
+ let info = {
+ methodName: sig.methodName,
+ args: sig.args,
+ methodInfo,
+ dynamicFn
+ };
+ for (let i=0, arg; (i<sig.args.length) && (arg=sig.args[i]); i++) {
+ if (!arg.literal) {
+ model._addPropertyEffect(arg.rootProperty, type, {
+ fn: effectFn, info: info, trigger: arg
+ });
+ }
+ }
+ if (dynamicFn) {
+ model._addPropertyEffect(sig.methodName, type, {
+ fn: effectFn, info: info
+ });
+ }
+}
+
+/**
+ * Calls a method with arguments marshaled from properties on the instance
+ * based on the method signature contained in the effect metadata.
+ *
+ * Multi-property observers, computed properties, and inline computing
+ * functions call this function to invoke the method, then use the return
+ * value accordingly.
+ *
+ * @param {!PropertyEffectsType} inst The instance the effect will be run on
+ * @param {string} property Name of property
+ * @param {Object} props Bag of current property changes
+ * @param {Object} oldProps Bag of previous values for changed properties
+ * @param {?} info Effect metadata
+ * @return {*} Returns the return value from the method invocation
+ * @private
+ */
+function runMethodEffect(inst, property, props, oldProps, info) {
+ // Instances can optionally have a _methodHost which allows redirecting where
+ // to find methods. Currently used by `templatize`.
+ let context = inst._methodHost || inst;
+ let fn = context[info.methodName];
+ if (fn) {
+ let args = marshalArgs(inst.__data, info.args, property, props);
+ return fn.apply(context, args);
+ } else if (!info.dynamicFn) {
+ console.warn('method `' + info.methodName + '` not defined');
+ }
+}
+
+const emptyArray = [];
+
+// Regular expressions used for binding
+const IDENT = '(?:' + '[a-zA-Z_$][\\w.:$\\-*]*' + ')';
+const NUMBER = '(?:' + '[-+]?[0-9]*\\.?[0-9]+(?:[eE][-+]?[0-9]+)?' + ')';
+const SQUOTE_STRING = '(?:' + '\'(?:[^\'\\\\]|\\\\.)*\'' + ')';
+const DQUOTE_STRING = '(?:' + '"(?:[^"\\\\]|\\\\.)*"' + ')';
+const STRING = '(?:' + SQUOTE_STRING + '|' + DQUOTE_STRING + ')';
+const ARGUMENT = '(?:(' + IDENT + '|' + NUMBER + '|' + STRING + ')\\s*' + ')';
+const ARGUMENTS = '(?:' + ARGUMENT + '(?:,\\s*' + ARGUMENT + ')*' + ')';
+const ARGUMENT_LIST = '(?:' + '\\(\\s*' +
+ '(?:' + ARGUMENTS + '?' + ')' +
+ '\\)\\s*' + ')';
+const BINDING = '(' + IDENT + '\\s*' + ARGUMENT_LIST + '?' + ')'; // Group 3
+const OPEN_BRACKET = '(\\[\\[|{{)' + '\\s*';
+const CLOSE_BRACKET = '(?:]]|}})';
+const NEGATE = '(?:(!)\\s*)?'; // Group 2
+const EXPRESSION = OPEN_BRACKET + NEGATE + BINDING + CLOSE_BRACKET;
+const bindingRegex = new RegExp(EXPRESSION, "g");
+
+/**
+ * Create a string from binding parts of all the literal parts
+ *
+ * @param {!Array<BindingPart>} parts All parts to stringify
+ * @return {string} String made from the literal parts
+ */
+function literalFromParts(parts) {
+ let s = '';
+ for (let i=0; i<parts.length; i++) {
+ let literal = parts[i].literal;
+ s += literal || '';
+ }
+ return s;
+}
+
+/**
+ * Parses an expression string for a method signature, and returns a metadata
+ * describing the method in terms of `methodName`, `static` (whether all the
+ * arguments are literals), and an array of `args`
+ *
+ * @param {string} expression The expression to parse
+ * @return {?MethodSignature} The method metadata object if a method expression was
+ * found, otherwise `undefined`
+ * @private
+ */
+function parseMethod(expression) {
+ // tries to match valid javascript property names
+ let m = expression.match(/([^\s]+?)\(([\s\S]*)\)/);
+ if (m) {
+ let methodName = m[1];
+ let sig = { methodName, static: true, args: emptyArray };
+ if (m[2].trim()) {
+ // replace escaped commas with comma entity, split on un-escaped commas
+ let args = m[2].replace(/\\,/g, ',').split(',');
+ return parseArgs(args, sig);
+ } else {
+ return sig;
+ }
+ }
+ return null;
+}
+
+/**
+ * Parses an array of arguments and sets the `args` property of the supplied
+ * signature metadata object. Sets the `static` property to false if any
+ * argument is a non-literal.
+ *
+ * @param {!Array<string>} argList Array of argument names
+ * @param {!MethodSignature} sig Method signature metadata object
+ * @return {!MethodSignature} The updated signature metadata object
+ * @private
+ */
+function parseArgs(argList, sig) {
+ sig.args = argList.map(function(rawArg) {
+ let arg = parseArg(rawArg);
+ if (!arg.literal) {
+ sig.static = false;
+ }
+ return arg;
+ }, this);
+ return sig;
+}
+
+/**
+ * Parses an individual argument, and returns an argument metadata object
+ * with the following fields:
+ *
+ * {
+ * value: 'prop', // property/path or literal value
+ * literal: false, // whether argument is a literal
+ * structured: false, // whether the property is a path
+ * rootProperty: 'prop', // the root property of the path
+ * wildcard: false // whether the argument was a wildcard '.*' path
+ * }
+ *
+ * @param {string} rawArg The string value of the argument
+ * @return {!MethodArg} Argument metadata object
+ * @private
+ */
+function parseArg(rawArg) {
+ // clean up whitespace
+ let arg = rawArg.trim()
+ // replace comma entity with comma
+ .replace(/,/g, ',')
+ // repair extra escape sequences; note only commas strictly need
+ // escaping, but we allow any other char to be escaped since its
+ // likely users will do this
+ .replace(/\\(.)/g, '\$1')
+ ;
+ // basic argument descriptor
+ let a = {
+ name: arg,
+ value: '',
+ literal: false
+ };
+ // detect literal value (must be String or Number)
+ let fc = arg[0];
+ if (fc === '-') {
+ fc = arg[1];
+ }
+ if (fc >= '0' && fc <= '9') {
+ fc = '#';
+ }
+ switch(fc) {
+ case "'":
+ case '"':
+ a.value = arg.slice(1, -1);
+ a.literal = true;
+ break;
+ case '#':
+ a.value = Number(arg);
+ a.literal = true;
+ break;
+ }
+ // if not literal, look for structured path
+ if (!a.literal) {
+ a.rootProperty = root$0(arg);
+ // detect structured path (has dots)
+ a.structured = isPath$0(arg);
+ if (a.structured) {
+ a.wildcard = (arg.slice(-2) == '.*');
+ if (a.wildcard) {
+ a.name = arg.slice(0, -2);
+ }
+ }
+ }
+ return a;
+}
+
+/**
+ * Gather the argument values for a method specified in the provided array
+ * of argument metadata.
+ *
+ * The `path` and `value` arguments are used to fill in wildcard descriptor
+ * when the method is being called as a result of a path notification.
+ *
+ * @param {Object} data Instance data storage object to read properties from
+ * @param {!Array<!MethodArg>} args Array of argument metadata
+ * @param {string} path Property/path name that triggered the method effect
+ * @param {Object} props Bag of current property changes
+ * @return {Array<*>} Array of argument values
+ * @private
+ */
+function marshalArgs(data, args, path, props) {
+ let values = [];
+ for (let i=0, l=args.length; i<l; i++) {
+ let arg = args[i];
+ let name = arg.name;
+ let v;
+ if (arg.literal) {
+ v = arg.value;
+ } else {
+ if (arg.structured) {
+ v = get$0(data, name);
+ // when data is not stored e.g. `splices`
+ if (v === undefined) {
+ v = props[name];
+ }
+ } else {
+ v = data[name];
+ }
+ }
+ if (arg.wildcard) {
+ // Only send the actual path changed info if the change that
+ // caused the observer to run matched the wildcard
+ let baseChanged = (name.indexOf(path + '.') === 0);
+ let matches = (path.indexOf(name) === 0 && !baseChanged);
+ values[i] = {
+ path: matches ? path : name,
+ value: matches ? props[path] : v,
+ base: v
+ };
+ } else {
+ values[i] = v;
+ }
+ }
+ return values;
+}
+
+// data api
+
+/**
+ * Sends array splice notifications (`.splices` and `.length`)
+ *
+ * Note: this implementation only accepts normalized paths
+ *
+ * @param {!PropertyEffectsType} inst Instance to send notifications to
+ * @param {Array} array The array the mutations occurred on
+ * @param {string} path The path to the array that was mutated
+ * @param {Array} splices Array of splice records
+ * @return {void}
+ * @private
+ */
+function notifySplices(inst, array, path, splices) {
+ let splicesPath = path + '.splices';
+ inst.notifyPath(splicesPath, { indexSplices: splices });
+ inst.notifyPath(path + '.length', array.length);
+ // Null here to allow potentially large splice records to be GC'ed.
+ inst.__data[splicesPath] = {indexSplices: null};
+}
+
+/**
+ * Creates a splice record and sends an array splice notification for
+ * the described mutation
+ *
+ * Note: this implementation only accepts normalized paths
+ *
+ * @param {!PropertyEffectsType} inst Instance to send notifications to
+ * @param {Array} array The array the mutations occurred on
+ * @param {string} path The path to the array that was mutated
+ * @param {number} index Index at which the array mutation occurred
+ * @param {number} addedCount Number of added items
+ * @param {Array} removed Array of removed items
+ * @return {void}
+ * @private
+ */
+function notifySplice(inst, array, path, index, addedCount, removed) {
+ notifySplices(inst, array, path, [{
+ index: index,
+ addedCount: addedCount,
+ removed: removed,
+ object: array,
+ type: 'splice'
+ }]);
+}
+
+/**
+ * Returns an upper-cased version of the string.
+ *
+ * @param {string} name String to uppercase
+ * @return {string} Uppercased string
+ * @private
+ */
+function upper(name) {
+ return name[0].toUpperCase() + name.substring(1);
+}
+
+/**
+ * Element class mixin that provides meta-programming for Polymer's template
+ * binding and data observation (collectively, "property effects") system.
+ *
+ * This mixin uses provides the following key static methods for adding
+ * property effects to an element class:
+ * - `addPropertyEffect`
+ * - `createPropertyObserver`
+ * - `createMethodObserver`
+ * - `createNotifyingProperty`
+ * - `createReadOnlyProperty`
+ * - `createReflectedProperty`
+ * - `createComputedProperty`
+ * - `bindTemplate`
+ *
+ * Each method creates one or more property accessors, along with metadata
+ * used by this mixin's implementation of `_propertiesChanged` to perform
+ * the property effects.
+ *
+ * Underscored versions of the above methods also exist on the element
+ * prototype for adding property effects on instances at runtime.
+ *
+ * Note that this mixin overrides several `PropertyAccessors` methods, in
+ * many cases to maintain guarantees provided by the Polymer 1.x features;
+ * notably it changes property accessors to be synchronous by default
+ * whereas the default when using `PropertyAccessors` standalone is to be
+ * async by default.
+ *
+ * @mixinFunction
+ * @polymer
+ * @appliesMixin TemplateStamp
+ * @appliesMixin PropertyAccessors
+ * @summary Element class mixin that provides meta-programming for Polymer's
+ * template binding and data observation system.
+ */
+export const PropertyEffects = dedupingMixin(superClass => {
+
+ /**
+ * @constructor
+ * @extends {superClass}
+ * @implements {Polymer_PropertyAccessors}
+ * @implements {Polymer_TemplateStamp}
+ * @unrestricted
+ */
+ const propertyEffectsBase = TemplateStamp(PropertyAccessors(superClass));
+
+ /**
+ * @polymer
+ * @mixinClass
+ * @implements {Polymer_PropertyEffects}
+ * @extends {propertyEffectsBase}
+ * @unrestricted
+ */
+ class PropertyEffects extends propertyEffectsBase {
+
+ constructor() {
+ super();
+ /** @type {boolean} */
+ // Used to identify users of this mixin, ala instanceof
+ this.__isPropertyEffectsClient = true;
+ /** @type {number} */
+ // NOTE: used to track re-entrant calls to `_flushProperties`
+ // path changes dirty check against `__dataTemp` only during one "turn"
+ // and are cleared when `__dataCounter` returns to 0.
+ this.__dataCounter = 0;
+ /** @type {boolean} */
+ this.__dataClientsReady;
+ /** @type {Array} */
+ this.__dataPendingClients;
+ /** @type {Object} */
+ this.__dataToNotify;
+ /** @type {Object} */
+ this.__dataLinkedPaths;
+ /** @type {boolean} */
+ this.__dataHasPaths;
+ /** @type {Object} */
+ this.__dataCompoundStorage;
+ /** @type {Polymer_PropertyEffects} */
+ this.__dataHost;
+ /** @type {!Object} */
+ this.__dataTemp;
+ /** @type {boolean} */
+ this.__dataClientsInitialized;
+ /** @type {!Object} */
+ this.__data;
+ /** @type {!Object} */
+ this.__dataPending;
+ /** @type {!Object} */
+ this.__dataOld;
+ /** @type {Object} */
+ this.__computeEffects;
+ /** @type {Object} */
+ this.__reflectEffects;
+ /** @type {Object} */
+ this.__notifyEffects;
+ /** @type {Object} */
+ this.__propagateEffects;
+ /** @type {Object} */
+ this.__observeEffects;
+ /** @type {Object} */
+ this.__readOnly;
+ /** @type {!TemplateInfo} */
+ this.__templateInfo;
+ }
+
+ get PROPERTY_EFFECT_TYPES() {
+ return TYPES;
+ }
+
+ /**
+ * @return {void}
+ */
+ _initializeProperties() {
+ super._initializeProperties();
+ hostStack.registerHost(this);
+ this.__dataClientsReady = false;
+ this.__dataPendingClients = null;
+ this.__dataToNotify = null;
+ this.__dataLinkedPaths = null;
+ this.__dataHasPaths = false;
+ // May be set on instance prior to upgrade
+ this.__dataCompoundStorage = this.__dataCompoundStorage || null;
+ this.__dataHost = this.__dataHost || null;
+ this.__dataTemp = {};
+ this.__dataClientsInitialized = false;
+ }
+
+ /**
+ * Overrides `PropertyAccessors` implementation to provide a
+ * more efficient implementation of initializing properties from
+ * the prototype on the instance.
+ *
+ * @override
+ * @param {Object} props Properties to initialize on the prototype
+ * @return {void}
+ */
+ _initializeProtoProperties(props) {
+ this.__data = Object.create(props);
+ this.__dataPending = Object.create(props);
+ this.__dataOld = {};
+ }
+
+ /**
+ * Overrides `PropertyAccessors` implementation to avoid setting
+ * `_setProperty`'s `shouldNotify: true`.
+ *
+ * @override
+ * @param {Object} props Properties to initialize on the instance
+ * @return {void}
+ */
+ _initializeInstanceProperties(props) {
+ let readOnly = this[TYPES.READ_ONLY];
+ for (let prop in props) {
+ if (!readOnly || !readOnly[prop]) {
+ this.__dataPending = this.__dataPending || {};
+ this.__dataOld = this.__dataOld || {};
+ this.__data[prop] = this.__dataPending[prop] = props[prop];
+ }
+ }
+ }
+
+ // Prototype setup ----------------------------------------
+
+ /**
+ * Equivalent to static `addPropertyEffect` API but can be called on
+ * an instance to add effects at runtime. See that method for
+ * full API docs.
+ *
+ * @param {string} property Property that should trigger the effect
+ * @param {string} type Effect type, from this.PROPERTY_EFFECT_TYPES
+ * @param {Object=} effect Effect metadata object
+ * @return {void}
+ * @protected
+ */
+ _addPropertyEffect(property, type, effect) {
+ this._createPropertyAccessor(property, type == TYPES.READ_ONLY);
+ // effects are accumulated into arrays per property based on type
+ let effects = ensureOwnEffectMap(this, type)[property];
+ if (!effects) {
+ effects = this[type][property] = [];
+ }
+ effects.push(effect);
+ }
+
+ /**
+ * Removes the given property effect.
+ *
+ * @param {string} property Property the effect was associated with
+ * @param {string} type Effect type, from this.PROPERTY_EFFECT_TYPES
+ * @param {Object=} effect Effect metadata object to remove
+ * @return {void}
+ */
+ _removePropertyEffect(property, type, effect) {
+ let effects = ensureOwnEffectMap(this, type)[property];
+ let idx = effects.indexOf(effect);
+ if (idx >= 0) {
+ effects.splice(idx, 1);
+ }
+ }
+
+ /**
+ * Returns whether the current prototype/instance has a property effect
+ * of a certain type.
+ *
+ * @param {string} property Property name
+ * @param {string=} type Effect type, from this.PROPERTY_EFFECT_TYPES
+ * @return {boolean} True if the prototype/instance has an effect of this type
+ * @protected
+ */
+ _hasPropertyEffect(property, type) {
+ let effects = this[type];
+ return Boolean(effects && effects[property]);
+ }
+
+ /**
+ * Returns whether the current prototype/instance has a "read only"
+ * accessor for the given property.
+ *
+ * @param {string} property Property name
+ * @return {boolean} True if the prototype/instance has an effect of this type
+ * @protected
+ */
+ _hasReadOnlyEffect(property) {
+ return this._hasPropertyEffect(property, TYPES.READ_ONLY);
+ }
+
+ /**
+ * Returns whether the current prototype/instance has a "notify"
+ * property effect for the given property.
+ *
+ * @param {string} property Property name
+ * @return {boolean} True if the prototype/instance has an effect of this type
+ * @protected
+ */
+ _hasNotifyEffect(property) {
+ return this._hasPropertyEffect(property, TYPES.NOTIFY);
+ }
+
+ /**
+ * Returns whether the current prototype/instance has a "reflect to attribute"
+ * property effect for the given property.
+ *
+ * @param {string} property Property name
+ * @return {boolean} True if the prototype/instance has an effect of this type
+ * @protected
+ */
+ _hasReflectEffect(property) {
+ return this._hasPropertyEffect(property, TYPES.REFLECT);
+ }
+
+ /**
+ * Returns whether the current prototype/instance has a "computed"
+ * property effect for the given property.
+ *
+ * @param {string} property Property name
+ * @return {boolean} True if the prototype/instance has an effect of this type
+ * @protected
+ */
+ _hasComputedEffect(property) {
+ return this._hasPropertyEffect(property, TYPES.COMPUTE);
+ }
+
+ // Runtime ----------------------------------------
+
+ /**
+ * Sets a pending property or path. If the root property of the path in
+ * question had no accessor, the path is set, otherwise it is enqueued
+ * via `_setPendingProperty`.
+ *
+ * This function isolates relatively expensive functionality necessary
+ * for the public API (`set`, `setProperties`, `notifyPath`, and property
+ * change listeners via {{...}} bindings), such that it is only done
+ * when paths enter the system, and not at every propagation step. It
+ * also sets a `__dataHasPaths` flag on the instance which is used to
+ * fast-path slower path-matching code in the property effects host paths.
+ *
+ * `path` can be a path string or array of path parts as accepted by the
+ * public API.
+ *
+ * @param {string | !Array<number|string>} path Path to set
+ * @param {*} value Value to set
+ * @param {boolean=} shouldNotify Set to true if this change should
+ * cause a property notification event dispatch
+ * @param {boolean=} isPathNotification If the path being set is a path
+ * notification of an already changed value, as opposed to a request
+ * to set and notify the change. In the latter `false` case, a dirty
+ * check is performed and then the value is set to the path before
+ * enqueuing the pending property change.
+ * @return {boolean} Returns true if the property/path was enqueued in
+ * the pending changes bag.
+ * @protected
+ */
+ _setPendingPropertyOrPath(path, value, shouldNotify, isPathNotification) {
+ if (isPathNotification ||
+ root$0(Array.isArray(path) ? path[0] : path) !== path) {
+ // Dirty check changes being set to a path against the actual object,
+ // since this is the entry point for paths into the system; from here
+ // the only dirty checks are against the `__dataTemp` cache to prevent
+ // duplicate work in the same turn only. Note, if this was a notification
+ // of a change already set to a path (isPathNotification: true),
+ // we always let the change through and skip the `set` since it was
+ // already dirty checked at the point of entry and the underlying
+ // object has already been updated
+ if (!isPathNotification) {
+ let old = get$0(this, path);
+ path = /** @type {string} */ (set$0(this, path, value));
+ // Use property-accessor's simpler dirty check
+ if (!path || !super._shouldPropertyChange(path, value, old)) {
+ return false;
+ }
+ }
+ this.__dataHasPaths = true;
+ if (this._setPendingProperty(/**@type{string}*/(path), value, shouldNotify)) {
+ computeLinkedPaths(this, path, value);
+ return true;
+ }
+ } else {
+ if (this.__dataHasAccessor && this.__dataHasAccessor[path]) {
+ return this._setPendingProperty(/**@type{string}*/(path), value, shouldNotify);
+ } else {
+ this[path] = value;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Applies a value to a non-Polymer element/node's property.
+ *
+ * The implementation makes a best-effort at binding interop:
+ * Some native element properties have side-effects when
+ * re-setting the same value (e.g. setting `<input>.value` resets the
+ * cursor position), so we do a dirty-check before setting the value.
+ * However, for better interop with non-Polymer custom elements that
+ * accept objects, we explicitly re-set object changes coming from the
+ * Polymer world (which may include deep object changes without the
+ * top reference changing), erring on the side of providing more
+ * information.
+ *
+ * Users may override this method to provide alternate approaches.
+ *
+ * @param {!Node} node The node to set a property on
+ * @param {string} prop The property to set
+ * @param {*} value The value to set
+ * @return {void}
+ * @protected
+ */
+ _setUnmanagedPropertyToNode(node, prop, value) {
+ // It is a judgment call that resetting primitives is
+ // "bad" and resettings objects is also "good"; alternatively we could
+ // implement a whitelist of tag & property values that should never
+ // be reset (e.g. <input>.value && <select>.value)
+ if (value !== node[prop] || typeof value == 'object') {
+ node[prop] = value;
+ }
+ }
+
+ /**
+ * Overrides the `PropertiesChanged` implementation to introduce special
+ * dirty check logic depending on the property & value being set:
+ *
+ * 1. Any value set to a path (e.g. 'obj.prop': 42 or 'obj.prop': {...})
+ * Stored in `__dataTemp`, dirty checked against `__dataTemp`
+ * 2. Object set to simple property (e.g. 'prop': {...})
+ * Stored in `__dataTemp` and `__data`, dirty checked against
+ * `__dataTemp` by default implementation of `_shouldPropertyChange`
+ * 3. Primitive value set to simple property (e.g. 'prop': 42)
+ * Stored in `__data`, dirty checked against `__data`
+ *
+ * The dirty-check is important to prevent cycles due to two-way
+ * notification, but paths and objects are only dirty checked against any
+ * previous value set during this turn via a "temporary cache" that is
+ * cleared when the last `_propertiesChanged` exits. This is so:
+ * a. any cached array paths (e.g. 'array.3.prop') may be invalidated
+ * due to array mutations like shift/unshift/splice; this is fine
+ * since path changes are dirty-checked at user entry points like `set`
+ * b. dirty-checking for objects only lasts one turn to allow the user
+ * to mutate the object in-place and re-set it with the same identity
+ * and have all sub-properties re-propagated in a subsequent turn.
+ *
+ * The temp cache is not necessarily sufficient to prevent invalid array
+ * paths, since a splice can happen during the same turn (with pathological
+ * user code); we could introduce a "fixup" for temporarily cached array
+ * paths if needed: https://github.com/Polymer/polymer/issues/4227
+ *
+ * @override
+ * @param {string} property Name of the property
+ * @param {*} value Value to set
+ * @param {boolean=} shouldNotify True if property should fire notification
+ * event (applies only for `notify: true` properties)
+ * @return {boolean} Returns true if the property changed
+ */
+ _setPendingProperty(property, value, shouldNotify) {
+ let isPath = this.__dataHasPaths && isPath$0(property);
+ let prevProps = isPath ? this.__dataTemp : this.__data;
+ if (this._shouldPropertyChange(property, value, prevProps[property])) {
+ if (!this.__dataPending) {
+ this.__dataPending = {};
+ this.__dataOld = {};
+ }
+ // Ensure old is captured from the last turn
+ if (!(property in this.__dataOld)) {
+ this.__dataOld[property] = this.__data[property];
+ }
+ // Paths are stored in temporary cache (cleared at end of turn),
+ // which is used for dirty-checking, all others stored in __data
+ if (isPath) {
+ this.__dataTemp[property] = value;
+ } else {
+ this.__data[property] = value;
+ }
+ // All changes go into pending property bag, passed to _propertiesChanged
+ this.__dataPending[property] = value;
+ // Track properties that should notify separately
+ if (isPath || (this[TYPES.NOTIFY] && this[TYPES.NOTIFY][property])) {
+ this.__dataToNotify = this.__dataToNotify || {};
+ this.__dataToNotify[property] = shouldNotify;
+ }
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Overrides base implementation to ensure all accessors set `shouldNotify`
+ * to true, for per-property notification tracking.
+ *
+ * @override
+ * @param {string} property Name of the property
+ * @param {*} value Value to set
+ * @return {void}
+ */
+ _setProperty(property, value) {
+ if (this._setPendingProperty(property, value, true)) {
+ this._invalidateProperties();
+ }
+ }
+
+ /**
+ * Overrides `PropertyAccessor`'s default async queuing of
+ * `_propertiesChanged`: if `__dataReady` is false (has not yet been
+ * manually flushed), the function no-ops; otherwise flushes
+ * `_propertiesChanged` synchronously.
+ *
+ * @override
+ * @return {void}
+ */
+ _invalidateProperties() {
+ if (this.__dataReady) {
+ this._flushProperties();
+ }
+ }
+
+ /**
+ * Enqueues the given client on a list of pending clients, whose
+ * pending property changes can later be flushed via a call to
+ * `_flushClients`.
+ *
+ * @param {Object} client PropertyEffects client to enqueue
+ * @return {void}
+ * @protected
+ */
+ _enqueueClient(client) {
+ this.__dataPendingClients = this.__dataPendingClients || [];
+ if (client !== this) {
+ this.__dataPendingClients.push(client);
+ }
+ }
+
+ /**
+ * Overrides superclass implementation.
+ *
+ * @return {void}
+ * @protected
+ */
+ _flushProperties() {
+ this.__dataCounter++;
+ super._flushProperties();
+ this.__dataCounter--;
+ }
+
+ /**
+ * Flushes any clients previously enqueued via `_enqueueClient`, causing
+ * their `_flushProperties` method to run.
+ *
+ * @return {void}
+ * @protected
+ */
+ _flushClients() {
+ if (!this.__dataClientsReady) {
+ this.__dataClientsReady = true;
+ this._readyClients();
+ // Override point where accessors are turned on; importantly,
+ // this is after clients have fully readied, providing a guarantee
+ // that any property effects occur only after all clients are ready.
+ this.__dataReady = true;
+ } else {
+ this.__enableOrFlushClients();
+ }
+ }
+
+ // NOTE: We ensure clients either enable or flush as appropriate. This
+ // handles two corner cases:
+ // (1) clients flush properly when connected/enabled before the host
+ // enables; e.g.
+ // (a) Templatize stamps with no properties and does not flush and
+ // (b) the instance is inserted into dom and
+ // (c) then the instance flushes.
+ // (2) clients enable properly when not connected/enabled when the host
+ // flushes; e.g.
+ // (a) a template is runtime stamped and not yet connected/enabled
+ // (b) a host sets a property, causing stamped dom to flush
+ // (c) the stamped dom enables.
+ __enableOrFlushClients() {
+ let clients = this.__dataPendingClients;
+ if (clients) {
+ this.__dataPendingClients = null;
+ for (let i=0; i < clients.length; i++) {
+ let client = clients[i];
+ if (!client.__dataEnabled) {
+ client._enableProperties();
+ } else if (client.__dataPending) {
+ client._flushProperties();
+ }
+ }
+ }
+ }
+
+ /**
+ * Perform any initial setup on client dom. Called before the first
+ * `_flushProperties` call on client dom and before any element
+ * observers are called.
+ *
+ * @return {void}
+ * @protected
+ */
+ _readyClients() {
+ this.__enableOrFlushClients();
+ }
+
+ /**
+ * Sets a bag of property changes to this instance, and
+ * synchronously processes all effects of the properties as a batch.
+ *
+ * Property names must be simple properties, not paths. Batched
+ * path propagation is not supported.
+ *
+ * @param {Object} props Bag of one or more key-value pairs whose key is
+ * a property and value is the new value to set for that property.
+ * @param {boolean=} setReadOnly When true, any private values set in
+ * `props` will be set. By default, `setProperties` will not set
+ * `readOnly: true` root properties.
+ * @return {void}
+ * @public
+ */
+ setProperties(props, setReadOnly) {
+ for (let path in props) {
+ if (setReadOnly || !this[TYPES.READ_ONLY] || !this[TYPES.READ_ONLY][path]) {
+ //TODO(kschaaf): explicitly disallow paths in setProperty?
+ // wildcard observers currently only pass the first changed path
+ // in the `info` object, and you could do some odd things batching
+ // paths, e.g. {'foo.bar': {...}, 'foo': null}
+ this._setPendingPropertyOrPath(path, props[path], true);
+ }
+ }
+ this._invalidateProperties();
+ }
+
+ /**
+ * Overrides `PropertyAccessors` so that property accessor
+ * side effects are not enabled until after client dom is fully ready.
+ * Also calls `_flushClients` callback to ensure client dom is enabled
+ * that was not enabled as a result of flushing properties.
+ *
+ * @override
+ * @return {void}
+ */
+ ready() {
+ // It is important that `super.ready()` is not called here as it
+ // immediately turns on accessors. Instead, we wait until `readyClients`
+ // to enable accessors to provide a guarantee that clients are ready
+ // before processing any accessors side effects.
+ this._flushProperties();
+ // If no data was pending, `_flushProperties` will not `flushClients`
+ // so ensure this is done.
+ if (!this.__dataClientsReady) {
+ this._flushClients();
+ }
+ // Before ready, client notifications do not trigger _flushProperties.
+ // Therefore a flush is necessary here if data has been set.
+ if (this.__dataPending) {
+ this._flushProperties();
+ }
+ }
+
+ /**
+ * Implements `PropertyAccessors`'s properties changed callback.
+ *
+ * Runs each class of effects for the batch of changed properties in
+ * a specific order (compute, propagate, reflect, observe, notify).
+ *
+ * @param {!Object} currentProps Bag of all current accessor values
+ * @param {!Object} changedProps Bag of properties changed since the last
+ * call to `_propertiesChanged`
+ * @param {!Object} oldProps Bag of previous values for each property
+ * in `changedProps`
+ * @return {void}
+ */
+ _propertiesChanged(currentProps, changedProps, oldProps) {
+ // ----------------------------
+ // let c = Object.getOwnPropertyNames(changedProps || {});
+ // window.debug && console.group(this.localName + '#' + this.id + ': ' + c);
+ // if (window.debug) { debugger; }
+ // ----------------------------
+ let hasPaths = this.__dataHasPaths;
+ this.__dataHasPaths = false;
+ // Compute properties
+ runComputedEffects(this, changedProps, oldProps, hasPaths);
+ // Clear notify properties prior to possible reentry (propagate, observe),
+ // but after computing effects have a chance to add to them
+ let notifyProps = this.__dataToNotify;
+ this.__dataToNotify = null;
+ // Propagate properties to clients
+ this._propagatePropertyChanges(changedProps, oldProps, hasPaths);
+ // Flush clients
+ this._flushClients();
+ // Reflect properties
+ runEffects(this, this[TYPES.REFLECT], changedProps, oldProps, hasPaths);
+ // Observe properties
+ runEffects(this, this[TYPES.OBSERVE], changedProps, oldProps, hasPaths);
+ // Notify properties to host
+ if (notifyProps) {
+ runNotifyEffects(this, notifyProps, changedProps, oldProps, hasPaths);
+ }
+ // Clear temporary cache at end of turn
+ if (this.__dataCounter == 1) {
+ this.__dataTemp = {};
+ }
+ // ----------------------------
+ // window.debug && console.groupEnd(this.localName + '#' + this.id + ': ' + c);
+ // ----------------------------
+ }
+
+ /**
+ * Called to propagate any property changes to stamped template nodes
+ * managed by this element.
+ *
+ * @param {Object} changedProps Bag of changed properties
+ * @param {Object} oldProps Bag of previous values for changed properties
+ * @param {boolean} hasPaths True with `props` contains one or more paths
+ * @return {void}
+ * @protected
+ */
+ _propagatePropertyChanges(changedProps, oldProps, hasPaths) {
+ if (this[TYPES.PROPAGATE]) {
+ runEffects(this, this[TYPES.PROPAGATE], changedProps, oldProps, hasPaths);
+ }
+ let templateInfo = this.__templateInfo;
+ while (templateInfo) {
+ runEffects(this, templateInfo.propertyEffects, changedProps, oldProps,
+ hasPaths, templateInfo.nodeList);
+ templateInfo = templateInfo.nextTemplateInfo;
+ }
+ }
+
+ /**
+ * Aliases one data path as another, such that path notifications from one
+ * are routed to the other.
+ *
+ * @param {string | !Array<string|number>} to Target path to link.
+ * @param {string | !Array<string|number>} from Source path to link.
+ * @return {void}
+ * @public
+ */
+ linkPaths(to, from) {
+ to = normalize(to);
+ from = normalize(from);
+ this.__dataLinkedPaths = this.__dataLinkedPaths || {};
+ this.__dataLinkedPaths[to] = from;
+ }
+
+ /**
+ * Removes a data path alias previously established with `_linkPaths`.
+ *
+ * Note, the path to unlink should be the target (`to`) used when
+ * linking the paths.
+ *
+ * @param {string | !Array<string|number>} path Target path to unlink.
+ * @return {void}
+ * @public
+ */
+ unlinkPaths(path) {
+ path = normalize(path);
+ if (this.__dataLinkedPaths) {
+ delete this.__dataLinkedPaths[path];
+ }
+ }
+
+ /**
+ * Notify that an array has changed.
+ *
+ * Example:
+ *
+ * this.items = [ {name: 'Jim'}, {name: 'Todd'}, {name: 'Bill'} ];
+ * ...
+ * this.items.splice(1, 1, {name: 'Sam'});
+ * this.items.push({name: 'Bob'});
+ * this.notifySplices('items', [
+ * { index: 1, removed: [{name: 'Todd'}], addedCount: 1, object: this.items, type: 'splice' },
+ * { index: 3, removed: [], addedCount: 1, object: this.items, type: 'splice'}
+ * ]);
+ *
+ * @param {string} path Path that should be notified.
+ * @param {Array} splices Array of splice records indicating ordered
+ * changes that occurred to the array. Each record should have the
+ * following fields:
+ * * index: index at which the change occurred
+ * * removed: array of items that were removed from this index
+ * * addedCount: number of new items added at this index
+ * * object: a reference to the array in question
+ * * type: the string literal 'splice'
+ *
+ * Note that splice records _must_ be normalized such that they are
+ * reported in index order (raw results from `Object.observe` are not
+ * ordered and must be normalized/merged before notifying).
+ * @return {void}
+ * @public
+ */
+ notifySplices(path, splices) {
+ let info = {path: ''};
+ let array = /** @type {Array} */(get$0(this, path, info));
+ notifySplices(this, array, info.path, splices);
+ }
+
+ /**
+ * Convenience method for reading a value from a path.
+ *
+ * Note, if any part in the path is undefined, this method returns
+ * `undefined` (this method does not throw when dereferencing undefined
+ * paths).
+ *
+ * @param {(string|!Array<(string|number)>)} path Path to the value
+ * to read. The path may be specified as a string (e.g. `foo.bar.baz`)
+ * or an array of path parts (e.g. `['foo.bar', 'baz']`). Note that
+ * bracketed expressions are not supported; string-based path parts
+ * *must* be separated by dots. Note that when dereferencing array
+ * indices, the index may be used as a dotted part directly
+ * (e.g. `users.12.name` or `['users', 12, 'name']`).
+ * @param {Object=} root Root object from which the path is evaluated.
+ * @return {*} Value at the path, or `undefined` if any part of the path
+ * is undefined.
+ * @public
+ */
+ get(path, root) {
+ return get$0(root || this, path);
+ }
+
+ /**
+ * Convenience method for setting a value to a path and notifying any
+ * elements bound to the same path.
+ *
+ * Note, if any part in the path except for the last is undefined,
+ * this method does nothing (this method does not throw when
+ * dereferencing undefined paths).
+ *
+ * @param {(string|!Array<(string|number)>)} path Path to the value
+ * to write. The path may be specified as a string (e.g. `'foo.bar.baz'`)
+ * or an array of path parts (e.g. `['foo.bar', 'baz']`). Note that
+ * bracketed expressions are not supported; string-based path parts
+ * *must* be separated by dots. Note that when dereferencing array
+ * indices, the index may be used as a dotted part directly
+ * (e.g. `'users.12.name'` or `['users', 12, 'name']`).
+ * @param {*} value Value to set at the specified path.
+ * @param {Object=} root Root object from which the path is evaluated.
+ * When specified, no notification will occur.
+ * @return {void}
+ * @public
+ */
+ set(path, value, root) {
+ if (root) {
+ set$0(root, path, value);
+ } else {
+ if (!this[TYPES.READ_ONLY] || !this[TYPES.READ_ONLY][/** @type {string} */(path)]) {
+ if (this._setPendingPropertyOrPath(path, value, true)) {
+ this._invalidateProperties();
+ }
+ }
+ }
+ }
+
+ /**
+ * Adds items onto the end of the array at the path specified.
+ *
+ * The arguments after `path` and return value match that of
+ * `Array.prototype.push`.
+ *
+ * This method notifies other paths to the same array that a
+ * splice occurred to the array.
+ *
+ * @param {string | !Array<string|number>} path Path to array.
+ * @param {...*} items Items to push onto array
+ * @return {number} New length of the array.
+ * @public
+ */
+ push(path, ...items) {
+ let info = {path: ''};
+ let array = /** @type {Array}*/(get$0(this, path, info));
+ let len = array.length;
+ let ret = array.push(...items);
+ if (items.length) {
+ notifySplice(this, array, info.path, len, items.length, []);
+ }
+ return ret;
+ }
+
+ /**
+ * Removes an item from the end of array at the path specified.
+ *
+ * The arguments after `path` and return value match that of
+ * `Array.prototype.pop`.
+ *
+ * This method notifies other paths to the same array that a
+ * splice occurred to the array.
+ *
+ * @param {string | !Array<string|number>} path Path to array.
+ * @return {*} Item that was removed.
+ * @public
+ */
+ pop(path) {
+ let info = {path: ''};
+ let array = /** @type {Array} */(get$0(this, path, info));
+ let hadLength = Boolean(array.length);
+ let ret = array.pop();
+ if (hadLength) {
+ notifySplice(this, array, info.path, array.length, 0, [ret]);
+ }
+ return ret;
+ }
+
+ /**
+ * Starting from the start index specified, removes 0 or more items
+ * from the array and inserts 0 or more new items in their place.
+ *
+ * The arguments after `path` and return value match that of
+ * `Array.prototype.splice`.
+ *
+ * This method notifies other paths to the same array that a
+ * splice occurred to the array.
+ *
+ * @param {string | !Array<string|number>} path Path to array.
+ * @param {number} start Index from which to start removing/inserting.
+ * @param {number} deleteCount Number of items to remove.
+ * @param {...*} items Items to insert into array.
+ * @return {Array} Array of removed items.
+ * @public
+ */
+ splice(path, start, deleteCount, ...items) {
+ let info = {path : ''};
+ let array = /** @type {Array} */(get$0(this, path, info));
+ // Normalize fancy native splice handling of crazy start values
+ if (start < 0) {
+ start = array.length - Math.floor(-start);
+ } else if (start) {
+ start = Math.floor(start);
+ }
+ // array.splice does different things based on the number of arguments
+ // you pass in. Therefore, array.splice(0) and array.splice(0, undefined)
+ // do different things. In the former, the whole array is cleared. In the
+ // latter, no items are removed.
+ // This means that we need to detect whether 1. one of the arguments
+ // is actually passed in and then 2. determine how many arguments
+ // we should pass on to the native array.splice
+ //
+ let ret;
+ // Omit any additional arguments if they were not passed in
+ if (arguments.length === 2) {
+ ret = array.splice(start);
+ // Either start was undefined and the others were defined, but in this
+ // case we can safely pass on all arguments
+ //
+ // Note: this includes the case where none of the arguments were passed in,
+ // e.g. this.splice('array'). However, if both start and deleteCount
+ // are undefined, array.splice will not modify the array (as expected)
+ } else {
+ ret = array.splice(start, deleteCount, ...items);
+ }
+ // At the end, check whether any items were passed in (e.g. insertions)
+ // or if the return array contains items (e.g. deletions).
+ // Only notify if items were added or deleted.
+ if (items.length || ret.length) {
+ notifySplice(this, array, info.path, start, items.length, ret);
+ }
+ return ret;
+ }
+
+ /**
+ * Removes an item from the beginning of array at the path specified.
+ *
+ * The arguments after `path` and return value match that of
+ * `Array.prototype.pop`.
+ *
+ * This method notifies other paths to the same array that a
+ * splice occurred to the array.
+ *
+ * @param {string | !Array<string|number>} path Path to array.
+ * @return {*} Item that was removed.
+ * @public
+ */
+ shift(path) {
+ let info = {path: ''};
+ let array = /** @type {Array} */(get$0(this, path, info));
+ let hadLength = Boolean(array.length);
+ let ret = array.shift();
+ if (hadLength) {
+ notifySplice(this, array, info.path, 0, 0, [ret]);
+ }
+ return ret;
+ }
+
+ /**
+ * Adds items onto the beginning of the array at the path specified.
+ *
+ * The arguments after `path` and return value match that of
+ * `Array.prototype.push`.
+ *
+ * This method notifies other paths to the same array that a
+ * splice occurred to the array.
+ *
+ * @param {string | !Array<string|number>} path Path to array.
+ * @param {...*} items Items to insert info array
+ * @return {number} New length of the array.
+ * @public
+ */
+ unshift(path, ...items) {
+ let info = {path: ''};
+ let array = /** @type {Array} */(get$0(this, path, info));
+ let ret = array.unshift(...items);
+ if (items.length) {
+ notifySplice(this, array, info.path, 0, items.length, []);
+ }
+ return ret;
+ }
+
+ /**
+ * Notify that a path has changed.
+ *
+ * Example:
+ *
+ * this.item.user.name = 'Bob';
+ * this.notifyPath('item.user.name');
+ *
+ * @param {string} path Path that should be notified.
+ * @param {*=} value Value at the path (optional).
+ * @return {void}
+ * @public
+ */
+ notifyPath(path, value) {
+ /** @type {string} */
+ let propPath;
+ if (arguments.length == 1) {
+ // Get value if not supplied
+ let info = {path: ''};
+ value = get$0(this, path, info);
+ propPath = info.path;
+ } else if (Array.isArray(path)) {
+ // Normalize path if needed
+ propPath = normalize(path);
+ } else {
+ propPath = /** @type{string} */(path);
+ }
+ if (this._setPendingPropertyOrPath(propPath, value, true, true)) {
+ this._invalidateProperties();
+ }
+ }
+
+ /**
+ * Equivalent to static `createReadOnlyProperty` API but can be called on
+ * an instance to add effects at runtime. See that method for
+ * full API docs.
+ *
+ * @param {string} property Property name
+ * @param {boolean=} protectedSetter Creates a custom protected setter
+ * when `true`.
+ * @return {void}
+ * @protected
+ */
+ _createReadOnlyProperty(property, protectedSetter) {
+ this._addPropertyEffect(property, TYPES.READ_ONLY);
+ if (protectedSetter) {
+ this['_set' + upper(property)] = /** @this {PropertyEffects} */function(value) {
+ this._setProperty(property, value);
+ };
+ }
+ }
+
+ /**
+ * Equivalent to static `createPropertyObserver` API but can be called on
+ * an instance to add effects at runtime. See that method for
+ * full API docs.
+ *
+ * @param {string} property Property name
+ * @param {string|function(*,*)} method Function or name of observer method to call
+ * @param {boolean=} dynamicFn Whether the method name should be included as
+ * a dependency to the effect.
+ * @return {void}
+ * @protected
+ */
+ _createPropertyObserver(property, method, dynamicFn) {
+ let info = { property, method, dynamicFn: Boolean(dynamicFn) };
+ this._addPropertyEffect(property, TYPES.OBSERVE, {
+ fn: runObserverEffect, info, trigger: {name: property}
+ });
+ if (dynamicFn) {
+ this._addPropertyEffect(/** @type {string} */(method), TYPES.OBSERVE, {
+ fn: runObserverEffect, info, trigger: {name: method}
+ });
+ }
+ }
+
+ /**
+ * Equivalent to static `createMethodObserver` API but can be called on
+ * an instance to add effects at runtime. See that method for
+ * full API docs.
+ *
+ * @param {string} expression Method expression
+ * @param {boolean|Object=} dynamicFn Boolean or object map indicating
+ * whether method names should be included as a dependency to the effect.
+ * @return {void}
+ * @protected
+ */
+ _createMethodObserver(expression, dynamicFn) {
+ let sig = parseMethod(expression);
+ if (!sig) {
+ throw new Error("Malformed observer expression '" + expression + "'");
+ }
+ createMethodEffect(this, sig, TYPES.OBSERVE, runMethodEffect, null, dynamicFn);
+ }
+
+ /**
+ * Equivalent to static `createNotifyingProperty` API but can be called on
+ * an instance to add effects at runtime. See that method for
+ * full API docs.
+ *
+ * @param {string} property Property name
+ * @return {void}
+ * @protected
+ */
+ _createNotifyingProperty(property) {
+ this._addPropertyEffect(property, TYPES.NOTIFY, {
+ fn: runNotifyEffect,
+ info: {
+ eventName: CaseMap.camelToDashCase(property) + '-changed',
+ property: property
+ }
+ });
+ }
+
+ /**
+ * Equivalent to static `createReflectedProperty` API but can be called on
+ * an instance to add effects at runtime. See that method for
+ * full API docs.
+ *
+ * @param {string} property Property name
+ * @return {void}
+ * @protected
+ */
+ _createReflectedProperty(property) {
+ let attr = this.constructor.attributeNameForProperty(property);
+ if (attr[0] === '-') {
+ console.warn('Property ' + property + ' cannot be reflected to attribute ' +
+ attr + ' because "-" is not a valid starting attribute name. Use a lowercase first letter for the property instead.');
+ } else {
+ this._addPropertyEffect(property, TYPES.REFLECT, {
+ fn: runReflectEffect,
+ info: {
+ attrName: attr
+ }
+ });
+ }
+ }
+
+ /**
+ * Equivalent to static `createComputedProperty` API but can be called on
+ * an instance to add effects at runtime. See that method for
+ * full API docs.
+ *
+ * @param {string} property Name of computed property to set
+ * @param {string} expression Method expression
+ * @param {boolean|Object=} dynamicFn Boolean or object map indicating
+ * whether method names should be included as a dependency to the effect.
+ * @return {void}
+ * @protected
+ */
+ _createComputedProperty(property, expression, dynamicFn) {
+ let sig = parseMethod(expression);
+ if (!sig) {
+ throw new Error("Malformed computed expression '" + expression + "'");
+ }
+ createMethodEffect(this, sig, TYPES.COMPUTE, runComputedEffect, property, dynamicFn);
+ }
+
+ // -- static class methods ------------
+
+ /**
+ * Ensures an accessor exists for the specified property, and adds
+ * to a list of "property effects" that will run when the accessor for
+ * the specified property is set. Effects are grouped by "type", which
+ * roughly corresponds to a phase in effect processing. The effect
+ * metadata should be in the following form:
+ *
+ * {
+ * fn: effectFunction, // Reference to function to call to perform effect
+ * info: { ... } // Effect metadata passed to function
+ * trigger: { // Optional triggering metadata; if not provided
+ * name: string // the property is treated as a wildcard
+ * structured: boolean
+ * wildcard: boolean
+ * }
+ * }
+ *
+ * Effects are called from `_propertiesChanged` in the following order by
+ * type:
+ *
+ * 1. COMPUTE
+ * 2. PROPAGATE
+ * 3. REFLECT
+ * 4. OBSERVE
+ * 5. NOTIFY
+ *
+ * Effect functions are called with the following signature:
+ *
+ * effectFunction(inst, path, props, oldProps, info, hasPaths)
+ *
+ * @param {string} property Property that should trigger the effect
+ * @param {string} type Effect type, from this.PROPERTY_EFFECT_TYPES
+ * @param {Object=} effect Effect metadata object
+ * @return {void}
+ * @protected
+ */
+ static addPropertyEffect(property, type, effect) {
+ this.prototype._addPropertyEffect(property, type, effect);
+ }
+
+ /**
+ * Creates a single-property observer for the given property.
+ *
+ * @param {string} property Property name
+ * @param {string|function(*,*)} method Function or name of observer method to call
+ * @param {boolean=} dynamicFn Whether the method name should be included as
+ * a dependency to the effect.
+ * @return {void}
+ * @protected
+ */
+ static createPropertyObserver(property, method, dynamicFn) {
+ this.prototype._createPropertyObserver(property, method, dynamicFn);
+ }
+
+ /**
+ * Creates a multi-property "method observer" based on the provided
+ * expression, which should be a string in the form of a normal JavaScript
+ * function signature: `'methodName(arg1, [..., argn])'`. Each argument
+ * should correspond to a property or path in the context of this
+ * prototype (or instance), or may be a literal string or number.
+ *
+ * @param {string} expression Method expression
+ * @param {boolean|Object=} dynamicFn Boolean or object map indicating
+ * @return {void}
+ * whether method names should be included as a dependency to the effect.
+ * @protected
+ */
+ static createMethodObserver(expression, dynamicFn) {
+ this.prototype._createMethodObserver(expression, dynamicFn);
+ }
+
+ /**
+ * Causes the setter for the given property to dispatch `<property>-changed`
+ * events to notify of changes to the property.
+ *
+ * @param {string} property Property name
+ * @return {void}
+ * @protected
+ */
+ static createNotifyingProperty(property) {
+ this.prototype._createNotifyingProperty(property);
+ }
+
+ /**
+ * Creates a read-only accessor for the given property.
+ *
+ * To set the property, use the protected `_setProperty` API.
+ * To create a custom protected setter (e.g. `_setMyProp()` for
+ * property `myProp`), pass `true` for `protectedSetter`.
+ *
+ * Note, if the property will have other property effects, this method
+ * should be called first, before adding other effects.
+ *
+ * @param {string} property Property name
+ * @param {boolean=} protectedSetter Creates a custom protected setter
+ * when `true`.
+ * @return {void}
+ * @protected
+ */
+ static createReadOnlyProperty(property, protectedSetter) {
+ this.prototype._createReadOnlyProperty(property, protectedSetter);
+ }
+
+ /**
+ * Causes the setter for the given property to reflect the property value
+ * to a (dash-cased) attribute of the same name.
+ *
+ * @param {string} property Property name
+ * @return {void}
+ * @protected
+ */
+ static createReflectedProperty(property) {
+ this.prototype._createReflectedProperty(property);
+ }
+
+ /**
+ * Creates a computed property whose value is set to the result of the
+ * method described by the given `expression` each time one or more
+ * arguments to the method changes. The expression should be a string
+ * in the form of a normal JavaScript function signature:
+ * `'methodName(arg1, [..., argn])'`
+ *
+ * @param {string} property Name of computed property to set
+ * @param {string} expression Method expression
+ * @param {boolean|Object=} dynamicFn Boolean or object map indicating whether
+ * method names should be included as a dependency to the effect.
+ * @return {void}
+ * @protected
+ */
+ static createComputedProperty(property, expression, dynamicFn) {
+ this.prototype._createComputedProperty(property, expression, dynamicFn);
+ }
+
+ /**
+ * Parses the provided template to ensure binding effects are created
+ * for them, and then ensures property accessors are created for any
+ * dependent properties in the template. Binding effects for bound
+ * templates are stored in a linked list on the instance so that
+ * templates can be efficiently stamped and unstamped.
+ *
+ * @param {!HTMLTemplateElement} template Template containing binding
+ * bindings
+ * @return {!TemplateInfo} Template metadata object
+ * @protected
+ */
+ static bindTemplate(template) {
+ return this.prototype._bindTemplate(template);
+ }
+
+ // -- binding ----------------------------------------------
+
+ /**
+ * Equivalent to static `bindTemplate` API but can be called on
+ * an instance to add effects at runtime. See that method for
+ * full API docs.
+ *
+ * This method may be called on the prototype (for prototypical template
+ * binding, to avoid creating accessors every instance) once per prototype,
+ * and will be called with `runtimeBinding: true` by `_stampTemplate` to
+ * create and link an instance of the template metadata associated with a
+ * particular stamping.
+ *
+ * @param {!HTMLTemplateElement} template Template containing binding
+ * bindings
+ * @param {boolean=} instanceBinding When false (default), performs
+ * "prototypical" binding of the template and overwrites any previously
+ * bound template for the class. When true (as passed from
+ * `_stampTemplate`), the template info is instanced and linked into
+ * the list of bound templates.
+ * @return {!TemplateInfo} Template metadata object; for `runtimeBinding`,
+ * this is an instance of the prototypical template info
+ * @protected
+ */
+ _bindTemplate(template, instanceBinding) {
+ let templateInfo = this.constructor._parseTemplate(template);
+ let wasPreBound = this.__templateInfo == templateInfo;
+ // Optimization: since this is called twice for proto-bound templates,
+ // don't attempt to recreate accessors if this template was pre-bound
+ if (!wasPreBound) {
+ for (let prop in templateInfo.propertyEffects) {
+ this._createPropertyAccessor(prop);
+ }
+ }
+ if (instanceBinding) {
+ // For instance-time binding, create instance of template metadata
+ // and link into list of templates if necessary
+ templateInfo = /** @type {!TemplateInfo} */(Object.create(templateInfo));
+ templateInfo.wasPreBound = wasPreBound;
+ if (!wasPreBound && this.__templateInfo) {
+ let last = this.__templateInfoLast || this.__templateInfo;
+ this.__templateInfoLast = last.nextTemplateInfo = templateInfo;
+ templateInfo.previousTemplateInfo = last;
+ return templateInfo;
+ }
+ }
+ return this.__templateInfo = templateInfo;
+ }
+
+ /**
+ * Adds a property effect to the given template metadata, which is run
+ * at the "propagate" stage of `_propertiesChanged` when the template
+ * has been bound to the element via `_bindTemplate`.
+ *
+ * The `effect` object should match the format in `_addPropertyEffect`.
+ *
+ * @param {Object} templateInfo Template metadata to add effect to
+ * @param {string} prop Property that should trigger the effect
+ * @param {Object=} effect Effect metadata object
+ * @return {void}
+ * @protected
+ */
+ static _addTemplatePropertyEffect(templateInfo, prop, effect) {
+ let hostProps = templateInfo.hostProps = templateInfo.hostProps || {};
+ hostProps[prop] = true;
+ let effects = templateInfo.propertyEffects = templateInfo.propertyEffects || {};
+ let propEffects = effects[prop] = effects[prop] || [];
+ propEffects.push(effect);
+ }
+
+ /**
+ * Stamps the provided template and performs instance-time setup for
+ * Polymer template features, including data bindings, declarative event
+ * listeners, and the `this.$` map of `id`'s to nodes. A document fragment
+ * is returned containing the stamped DOM, ready for insertion into the
+ * DOM.
+ *
+ * This method may be called more than once; however note that due to
+ * `shadycss` polyfill limitations, only styles from templates prepared
+ * using `ShadyCSS.prepareTemplate` will be correctly polyfilled (scoped
+ * to the shadow root and support CSS custom properties), and note that
+ * `ShadyCSS.prepareTemplate` may only be called once per element. As such,
+ * any styles required by in runtime-stamped templates must be included
+ * in the main element template.
+ *
+ * @param {!HTMLTemplateElement} template Template to stamp
+ * @return {!StampedTemplate} Cloned template content
+ * @override
+ * @protected
+ */
+ _stampTemplate(template) {
+ // Ensures that created dom is `_enqueueClient`'d to this element so
+ // that it can be flushed on next call to `_flushProperties`
+ hostStack.beginHosting(this);
+ let dom = super._stampTemplate(template);
+ hostStack.endHosting(this);
+ let templateInfo = /** @type {!TemplateInfo} */(this._bindTemplate(template, true));
+ // Add template-instance-specific data to instanced templateInfo
+ templateInfo.nodeList = dom.nodeList;
+ // Capture child nodes to allow unstamping of non-prototypical templates
+ if (!templateInfo.wasPreBound) {
+ let nodes = templateInfo.childNodes = [];
+ for (let n=dom.firstChild; n; n=n.nextSibling) {
+ nodes.push(n);
+ }
+ }
+ dom.templateInfo = templateInfo;
+ // Setup compound storage, 2-way listeners, and dataHost for bindings
+ setupBindings(this, templateInfo);
+ // Flush properties into template nodes if already booted
+ if (this.__dataReady) {
+ runEffects(this, templateInfo.propertyEffects, this.__data, null,
+ false, templateInfo.nodeList);
+ }
+ return dom;
+ }
+
+ /**
+ * Removes and unbinds the nodes previously contained in the provided
+ * DocumentFragment returned from `_stampTemplate`.
+ *
+ * @param {!StampedTemplate} dom DocumentFragment previously returned
+ * from `_stampTemplate` associated with the nodes to be removed
+ * @return {void}
+ * @protected
+ */
+ _removeBoundDom(dom) {
+ // Unlink template info
+ let templateInfo = dom.templateInfo;
+ if (templateInfo.previousTemplateInfo) {
+ templateInfo.previousTemplateInfo.nextTemplateInfo =
+ templateInfo.nextTemplateInfo;
+ }
+ if (templateInfo.nextTemplateInfo) {
+ templateInfo.nextTemplateInfo.previousTemplateInfo =
+ templateInfo.previousTemplateInfo;
+ }
+ if (this.__templateInfoLast == templateInfo) {
+ this.__templateInfoLast = templateInfo.previousTemplateInfo;
+ }
+ templateInfo.previousTemplateInfo = templateInfo.nextTemplateInfo = null;
+ // Remove stamped nodes
+ let nodes = templateInfo.childNodes;
+ for (let i=0; i<nodes.length; i++) {
+ let node = nodes[i];
+ node.parentNode.removeChild(node);
+ }
+ }
+
+ /**
+ * Overrides default `TemplateStamp` implementation to add support for
+ * parsing bindings from `TextNode`'s' `textContent`. A `bindings`
+ * array is added to `nodeInfo` and populated with binding metadata
+ * with information capturing the binding target, and a `parts` array
+ * with one or more metadata objects capturing the source(s) of the
+ * binding.
+ *
+ * @override
+ * @param {Node} node Node to parse
+ * @param {TemplateInfo} templateInfo Template metadata for current template
+ * @param {NodeInfo} nodeInfo Node metadata for current template node
+ * @return {boolean} `true` if the visited node added node-specific
+ * metadata to `nodeInfo`
+ * @protected
+ * @suppress {missingProperties} Interfaces in closure do not inherit statics, but classes do
+ */
+ static _parseTemplateNode(node, templateInfo, nodeInfo) {
+ let noted = super._parseTemplateNode(node, templateInfo, nodeInfo);
+ if (node.nodeType === Node.TEXT_NODE) {
+ let parts = this._parseBindings(node.textContent, templateInfo);
+ if (parts) {
+ // Initialize the textContent with any literal parts
+ // NOTE: default to a space here so the textNode remains; some browsers
+ // (IE) omit an empty textNode following cloneNode/importNode.
+ node.textContent = literalFromParts(parts) || ' ';
+ addBinding(this, templateInfo, nodeInfo, 'text', 'textContent', parts);
+ noted = true;
+ }
+ }
+ return noted;
+ }
+
+ /**
+ * Overrides default `TemplateStamp` implementation to add support for
+ * parsing bindings from attributes. A `bindings`
+ * array is added to `nodeInfo` and populated with binding metadata
+ * with information capturing the binding target, and a `parts` array
+ * with one or more metadata objects capturing the source(s) of the
+ * binding.
+ *
+ * @override
+ * @param {Element} node Node to parse
+ * @param {TemplateInfo} templateInfo Template metadata for current template
+ * @param {NodeInfo} nodeInfo Node metadata for current template node
+ * @param {string} name Attribute name
+ * @param {string} value Attribute value
+ * @return {boolean} `true` if the visited node added node-specific
+ * metadata to `nodeInfo`
+ * @protected
+ * @suppress {missingProperties} Interfaces in closure do not inherit statics, but classes do
+ */
+ static _parseTemplateNodeAttribute(node, templateInfo, nodeInfo, name, value) {
+ let parts = this._parseBindings(value, templateInfo);
+ if (parts) {
+ // Attribute or property
+ let origName = name;
+ let kind = 'property';
+ // The only way we see a capital letter here is if the attr has
+ // a capital letter in it per spec. In this case, to make sure
+ // this binding works, we go ahead and make the binding to the attribute.
+ if (capitalAttributeRegex.test(name)) {
+ kind = 'attribute';
+ } else if (name[name.length-1] == '$') {
+ name = name.slice(0, -1);
+ kind = 'attribute';
+ }
+ // Initialize attribute bindings with any literal parts
+ let literal = literalFromParts(parts);
+ if (literal && kind == 'attribute') {
+ node.setAttribute(name, literal);
+ }
+ // Clear attribute before removing, since IE won't allow removing
+ // `value` attribute if it previously had a value (can't
+ // unconditionally set '' before removing since attributes with `$`
+ // can't be set using setAttribute)
+ if (node.localName === 'input' && origName === 'value') {
+ node.setAttribute(origName, '');
+ }
+ // Remove annotation
+ node.removeAttribute(origName);
+ // Case hackery: attributes are lower-case, but bind targets
+ // (properties) are case sensitive. Gambit is to map dash-case to
+ // camel-case: `foo-bar` becomes `fooBar`.
+ // Attribute bindings are excepted.
+ if (kind === 'property') {
+ name = dashToCamelCase(name);
+ }
+ addBinding(this, templateInfo, nodeInfo, kind, name, parts, literal);
+ return true;
+ } else {
+ return super._parseTemplateNodeAttribute(node, templateInfo, nodeInfo, name, value);
+ }
+ }
+
+ /**
+ * Overrides default `TemplateStamp` implementation to add support for
+ * binding the properties that a nested template depends on to the template
+ * as `_host_<property>`.
+ *
+ * @override
+ * @param {Node} node Node to parse
+ * @param {TemplateInfo} templateInfo Template metadata for current template
+ * @param {NodeInfo} nodeInfo Node metadata for current template node
+ * @return {boolean} `true` if the visited node added node-specific
+ * metadata to `nodeInfo`
+ * @protected
+ * @suppress {missingProperties} Interfaces in closure do not inherit statics, but classes do
+ */
+ static _parseTemplateNestedTemplate(node, templateInfo, nodeInfo) {
+ let noted = super._parseTemplateNestedTemplate(node, templateInfo, nodeInfo);
+ // Merge host props into outer template and add bindings
+ let hostProps = nodeInfo.templateInfo.hostProps;
+ let mode = '{';
+ for (let source in hostProps) {
+ let parts = [{ mode, source, dependencies: [source] }];
+ addBinding(this, templateInfo, nodeInfo, 'property', '_host_' + source, parts);
+ }
+ return noted;
+ }
+
+ /**
+ * Called to parse text in a template (either attribute values or
+ * textContent) into binding metadata.
+ *
+ * Any overrides of this method should return an array of binding part
+ * metadata representing one or more bindings found in the provided text
+ * and any "literal" text in between. Any non-literal parts will be passed
+ * to `_evaluateBinding` when any dependencies change. The only required
+ * fields of each "part" in the returned array are as follows:
+ *
+ * - `dependencies` - Array containing trigger metadata for each property
+ * that should trigger the binding to update
+ * - `literal` - String containing text if the part represents a literal;
+ * in this case no `dependencies` are needed
+ *
+ * Additional metadata for use by `_evaluateBinding` may be provided in
+ * each part object as needed.
+ *
+ * The default implementation handles the following types of bindings
+ * (one or more may be intermixed with literal strings):
+ * - Property binding: `[[prop]]`
+ * - Path binding: `[[object.prop]]`
+ * - Negated property or path bindings: `[[!prop]]` or `[[!object.prop]]`
+ * - Two-way property or path bindings (supports negation):
+ * `{{prop}}`, `{{object.prop}}`, `{{!prop}}` or `{{!object.prop}}`
+ * - Inline computed method (supports negation):
+ * `[[compute(a, 'literal', b)]]`, `[[!compute(a, 'literal', b)]]`
+ *
+ * The default implementation uses a regular expression for best
+ * performance. However, the regular expression uses a white-list of
+ * allowed characters in a data-binding, which causes problems for
+ * data-bindings that do use characters not in this white-list.
+ *
+ * Instead of updating the white-list with all allowed characters,
+ * there is a StrictBindingParser (see lib/mixins/strict-binding-parser)
+ * that uses a state machine instead. This state machine is able to handle
+ * all characters. However, it is slightly less performant, therefore we
+ * extracted it into a separate optional mixin.
+ *
+ * @param {string} text Text to parse from attribute or textContent
+ * @param {Object} templateInfo Current template metadata
+ * @return {Array<!BindingPart>} Array of binding part metadata
+ * @protected
+ */
+ static _parseBindings(text, templateInfo) {
+ let parts = [];
+ let lastIndex = 0;
+ let m;
+ // Example: "literal1{{prop}}literal2[[!compute(foo,bar)]]final"
+ // Regex matches:
+ // Iteration 1: Iteration 2:
+ // m[1]: '{{' '[['
+ // m[2]: '' '!'
+ // m[3]: 'prop' 'compute(foo,bar)'
+ while ((m = bindingRegex.exec(text)) !== null) {
+ // Add literal part
+ if (m.index > lastIndex) {
+ parts.push({literal: text.slice(lastIndex, m.index)});
+ }
+ // Add binding part
+ let mode = m[1][0];
+ let negate = Boolean(m[2]);
+ let source = m[3].trim();
+ let customEvent = false, notifyEvent = '', colon = -1;
+ if (mode == '{' && (colon = source.indexOf('::')) > 0) {
+ notifyEvent = source.substring(colon + 2);
+ source = source.substring(0, colon);
+ customEvent = true;
+ }
+ let signature = parseMethod(source);
+ let dependencies = [];
+ if (signature) {
+ // Inline computed function
+ let {args, methodName} = signature;
+ for (let i=0; i<args.length; i++) {
+ let arg = args[i];
+ if (!arg.literal) {
+ dependencies.push(arg);
+ }
+ }
+ let dynamicFns = templateInfo.dynamicFns;
+ if (dynamicFns && dynamicFns[methodName] || signature.static) {
+ dependencies.push(methodName);
+ signature.dynamicFn = true;
+ }
+ } else {
+ // Property or path
+ dependencies.push(source);
+ }
+ parts.push({
+ source, mode, negate, customEvent, signature, dependencies,
+ event: notifyEvent
+ });
+ lastIndex = bindingRegex.lastIndex;
+ }
+ // Add a final literal part
+ if (lastIndex && lastIndex < text.length) {
+ let literal = text.substring(lastIndex);
+ if (literal) {
+ parts.push({
+ literal: literal
+ });
+ }
+ }
+ if (parts.length) {
+ return parts;
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Called to evaluate a previously parsed binding part based on a set of
+ * one or more changed dependencies.
+ *
+ * @param {this} inst Element that should be used as scope for
+ * binding dependencies
+ * @param {BindingPart} part Binding part metadata
+ * @param {string} path Property/path that triggered this effect
+ * @param {Object} props Bag of current property changes
+ * @param {Object} oldProps Bag of previous values for changed properties
+ * @param {boolean} hasPaths True with `props` contains one or more paths
+ * @return {*} Value the binding part evaluated to
+ * @protected
+ */
+ static _evaluateBinding(inst, part, path, props, oldProps, hasPaths) {
+ let value;
+ if (part.signature) {
+ value = runMethodEffect(inst, path, props, oldProps, part.signature);
+ } else if (path != part.source) {
+ value = get$0(inst, part.source);
+ } else {
+ if (hasPaths && isPath$0(path)) {
+ value = get$0(inst, path);
+ } else {
+ value = inst.__data[path];
+ }
+ }
+ if (part.negate) {
+ value = !value;
+ }
+ return value;
+ }
+
+ }
+
+ // make a typing for closure :P
+ PropertyEffectsType = PropertyEffects;
+
+ return PropertyEffects;
+});
+
+/**
+ * Helper api for enqueuing client dom created by a host element.
+ *
+ * By default elements are flushed via `_flushProperties` when
+ * `connectedCallback` is called. Elements attach their client dom to
+ * themselves at `ready` time which results from this first flush.
+ * This provides an ordering guarantee that the client dom an element
+ * creates is flushed before the element itself (i.e. client `ready`
+ * fires before host `ready`).
+ *
+ * However, if `_flushProperties` is called *before* an element is connected,
+ * as for example `Templatize` does, this ordering guarantee cannot be
+ * satisfied because no elements are connected. (Note: Bound elements that
+ * receive data do become enqueued clients and are properly ordered but
+ * unbound elements are not.)
+ *
+ * To maintain the desired "client before host" ordering guarantee for this
+ * case we rely on the "host stack. Client nodes registers themselves with
+ * the creating host element when created. This ensures that all client dom
+ * is readied in the proper order, maintaining the desired guarantee.
+ *
+ * @private
+ */
+let hostStack = {
+
+ stack: [],
+
+ /**
+ * @param {*} inst Instance to add to hostStack
+ * @return {void}
+ * @this {hostStack}
+ */
+ registerHost(inst) {
+ if (this.stack.length) {
+ let host = this.stack[this.stack.length-1];
+ host._enqueueClient(inst);
+ }
+ },
+
+ /**
+ * @param {*} inst Instance to begin hosting
+ * @return {void}
+ * @this {hostStack}
+ */
+ beginHosting(inst) {
+ this.stack.push(inst);
+ },
+
+ /**
+ * @param {*} inst Instance to end hosting
+ * @return {void}
+ * @this {hostStack}
+ */
+ endHosting(inst) {
+ let stackLen = this.stack.length;
+ if (stackLen && this.stack[stackLen-1] == inst) {
+ this.stack.pop();
+ }
+ }
+
+};
diff --git a/third_party/polymer3/bower_components/polymer/lib/mixins/strict-binding-parser.js b/third_party/polymer3/bower_components/polymer/lib/mixins/strict-binding-parser.js
new file mode 100644
index 0000000..6af6612
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/lib/mixins/strict-binding-parser.js
@@ -0,0 +1,413 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import '../utils/boot.js';
+
+import { isPath } from '../utils/path.js';
+import { dedupingMixin } from '../utils/mixin.js';
+import { PropertyEffects } from './property-effects.js';
+
+/**
+ * The open and corresponding closing brackets for surrounding bindings.
+ * @enum {string}
+ */
+const BINDINGS = {
+ '{': '}',
+ '[': ']'
+};
+
+/**
+ * All states that the parser can be in. The states represent the state-machine as a whole.
+ * @enum {number}
+ */
+const STATE = {
+ INITIAL: 1,
+ FIRSTOPENINGBINDING: 2,
+ FIRSTCHARACTERBINDING: 3,
+ BINDING: 4,
+ FIRSTCOLON: 5,
+ COLONNOTIFYEVENT: 6,
+ COLONNOTIFYEVENTFIRSTCLOSINGBINDING: 7,
+ FIRSTCLOSINGBINDING: 8,
+ STRING: 9,
+ METHOD: 10,
+ STRINGARG: 11,
+ NUMBERARG: 12,
+ VARIABLEARG: 13,
+ METHODCLOSED: 14,
+ METHODCLOSEDBINDING: 15
+};
+
+function pushLiteral(text, i, parts, startChar) {
+ const literal = text.substring(startChar || 0, i);
+ if (literal) {
+ parts.push({
+ literal
+ });
+ }
+}
+
+function storeMethod(bindingData, templateInfo) {
+ const methodName = bindingData.signature.methodName;
+ const dynamicFns = templateInfo.dynamicFns;
+ if (dynamicFns && dynamicFns[methodName] || bindingData.signature.static) {
+ bindingData.dependencies.push(methodName);
+ bindingData.signature.dynamicFn = true;
+ }
+}
+
+function storeVariableBinding(parts, bindingData, prop, i) {
+ bindingData.source = prop;
+ bindingData.dependencies.push(prop);
+ bindingData.startChar = i + 1;
+ parts.push(bindingData);
+}
+
+function storeMethodVariable(bindingData, text, i) {
+ const name = text.substring(bindingData.startChar, i).trim();
+ if (name) {
+ if (name === 'true' || name === 'false') {
+ bindingData.signature.args.push({
+ name,
+ value: name == 'true',
+ literal: true
+ });
+ } else {
+ const arg = {
+ name
+ };
+ arg.structured = isPath(name);
+ if (arg.structured) {
+ arg.wildcard = (name.slice(-2) == '.*');
+ if (arg.wildcard) {
+ arg.name = name.slice(0, -2);
+ }
+ }
+ bindingData.signature.args.push(arg);
+ bindingData.dependencies.push(name);
+ bindingData.signature.static = false;
+ }
+ }
+}
+
+function storeMethodNumber(bindingData, text, i) {
+ const value = text.substring(bindingData.startChar, i).trim();
+ bindingData.signature.args.push({
+ name: value,
+ value: Number(value),
+ literal: true
+ });
+}
+
+/**
+ * Mixin that parses binding expressions and generates corresponding metadata.
+ * The implementation is different than in `property-effects`, as it uses a
+ * state machine instead of a regex. As such, this implementation is able to
+ * handle more cases, with the potential performance hit.
+ *
+ * @mixinFunction
+ * @appliesMixin PropertyEffects
+ * @polymer
+ * @summary Mixin that parses binding expressions and generates corresponding metadata.
+ */
+const StrictBindingParser = dedupingMixin((base) => {
+
+ /**
+ * @constructor
+ * @extends {base}
+ * @implements {Polymer_PropertyEffects}
+ */
+ const elementBase = PropertyEffects(base);
+
+ /**
+ * @polymer
+ * @mixinClass
+ * @implements {Polymer_PropertyEffects}
+ */
+ return class extends elementBase {
+
+ /**
+ * Called to parse text in a template (either attribute values or
+ * textContent) into binding metadata.
+ *
+ * Any overrides of this method should return an array of binding part
+ * metadata representing one or more bindings found in the provided text
+ * and any "literal" text in between. Any non-literal parts will be passed
+ * to `_evaluateBinding` when any dependencies change. The only required
+ * fields of each "part" in the returned array are as follows:
+ *
+ * - `dependencies` - Array containing trigger metadata for each property
+ * that should trigger the binding to update
+ * - `literal` - String containing text if the part represents a literal;
+ * in this case no `dependencies` are needed
+ *
+ * Additional metadata for use by `_evaluateBinding` may be provided in
+ * each part object as needed.
+ *
+ * The default implementation handles the following types of bindings
+ * (one or more may be intermixed with literal strings):
+ * - Property binding: `[[prop]]`
+ * - Path binding: `[[object.prop]]`
+ * - Negated property or path bindings: `[[!prop]]` or `[[!object.prop]]`
+ * - Two-way property or path bindings (supports negation):
+ * `{{prop}}`, `{{object.prop}}`, `{{!prop}}` or `{{!object.prop}}`
+ * - Inline computed method (supports negation):
+ * `[[compute(a, 'literal', b)]]`, `[[!compute(a, 'literal', b)]]`
+ *
+ * @param {string} text Text to parse from attribute or textContent
+ * @param {Object} templateInfo Current template metadata
+ * @return {Array<!BindingPart>} Array of binding part metadata
+ * @protected
+ */
+ static _parseBindings(text, templateInfo) {
+ const parts = [];
+ let bindingData = {};
+ let escaped = false;
+ /** @type {string} */
+ let quote;
+ /** @type {number} */
+ let state = STATE.INITIAL;
+ let i,l;
+
+ for (i=0,l=text.length; i<l; i++) {
+ const char = text.charAt(i);
+ switch (state) {
+ case STATE.INITIAL: {
+ if ((char === '{' || char === '[')) {
+ bindingData = {
+ mode: char,
+ dependencies: [],
+ startChar: bindingData.startChar
+ };
+ state = STATE.FIRSTOPENINGBINDING;
+ }
+ break;
+ }
+ case STATE.FIRSTOPENINGBINDING: {
+ if (char === bindingData.mode) {
+ pushLiteral(text, i - 1, parts, bindingData.startChar);
+ bindingData.startChar = i + 1;
+ state = STATE.FIRSTCHARACTERBINDING;
+ } else {
+ bindingData = {};
+ state = STATE.INITIAL;
+ }
+ break;
+ }
+ case STATE.FIRSTCHARACTERBINDING: {
+ if (char !== ' ' && char !== '\t' && char !== '\n') {
+ if (char === '!') {
+ bindingData.negate = true;
+ bindingData.startChar = i + 1;
+ }
+ state = STATE.BINDING;
+ }
+ break;
+ }
+ case STATE.BINDING: {
+ switch (char) {
+ case BINDINGS[bindingData.mode]: {
+ state = STATE.FIRSTCLOSINGBINDING;
+ break;
+ }
+ case '\'':
+ case '"': {
+ quote = char;
+ state = STATE.STRING;
+ break;
+ }
+ case '(': {
+ bindingData.signature = {
+ methodName: text.substring(bindingData.startChar, i).trim(),
+ args: [],
+ static: true
+ };
+ bindingData.startChar = i + 1;
+ state = STATE.METHOD;
+ break;
+ }
+ case ':': {
+ state = STATE.FIRSTCOLON;
+ }
+ }
+ break;
+ }
+ case STATE.FIRSTCOLON: {
+ if (char === ':') {
+ bindingData.customEvent = true;
+ bindingData.startCharAfterColon = i + 1;
+ state = STATE.COLONNOTIFYEVENT;
+ } else {
+ state = STATE.BINDING;
+ }
+ break;
+ }
+ case STATE.COLONNOTIFYEVENT: {
+ if (char === BINDINGS[bindingData.mode]) {
+ state = STATE.COLONNOTIFYEVENTFIRSTCLOSINGBINDING;
+ }
+ break;
+ }
+ case STATE.COLONNOTIFYEVENTFIRSTCLOSINGBINDING: {
+ if (char === BINDINGS[bindingData.mode]) {
+ bindingData.event = text.substring(bindingData.startCharAfterColon, i - 1).trim();
+ const prop = text.substring(bindingData.startChar, bindingData.startCharAfterColon - 2).trim();
+ storeVariableBinding(parts, bindingData, prop, i);
+ state = STATE.INITIAL;
+ } else {
+ state = STATE.BINDING;
+ }
+ break;
+ }
+ case STATE.FIRSTCLOSINGBINDING: {
+ if (char === BINDINGS[bindingData.mode]) {
+ const prop = text.substring(bindingData.startChar, i - 1).trim();
+ storeVariableBinding(parts, bindingData, prop, i);
+ state = STATE.INITIAL;
+ } else {
+ state = STATE.BINDING;
+ }
+ break;
+ }
+ case STATE.STRING: {
+ if (char === '\\') {
+ escaped = true;
+ } else if (char === quote && !escaped) {
+ state = STATE.BINDING;
+ } else {
+ escaped = false;
+ }
+ break;
+ }
+ case STATE.METHOD: {
+ switch (char) {
+ case ')': {
+ storeMethodVariable(bindingData, text, i);
+ storeMethod(bindingData, templateInfo);
+ bindingData.startChar = i + 1;
+ state = STATE.METHODCLOSED;
+ break;
+ }
+ case ',': {
+ storeMethodVariable(bindingData, text, i);
+ bindingData.startChar = i + 1;
+ break;
+ }
+ case '\'':
+ case '"': {
+ quote = char;
+ state = STATE.STRINGARG;
+ break;
+ }
+ default: {
+ if (char >= '0' && char <= '9' || char === '-') {
+ state = STATE.NUMBERARG;
+ } else if (char != ' ' && char != '\n') {
+ state = STATE.VARIABLEARG;
+ }
+ }
+ }
+ break;
+ }
+ case STATE.STRINGARG: {
+ if (char === '\\') {
+ escaped = true;
+ } else if (char === quote && !escaped) {
+ const value = text.substring(bindingData.startChar, i)
+ .replace(/^\s+/, '')
+ .substring(1)
+ // replace comma entity with comma
+ .replace(/,/g, ',')
+ // repair extra escape sequences; note only commas strictly need
+ // escaping, but we allow any other char to be escaped since its
+ // likely users will do this
+ .replace(/\\(.)/g, '\$1');
+ bindingData.signature.args.push({
+ value,
+ name: value,
+ literal: true
+ });
+ bindingData.startChar = i + 1;
+ state = STATE.METHOD;
+ } else {
+ escaped = false;
+ }
+ break;
+ }
+ case STATE.NUMBERARG: {
+ switch (char) {
+ case ',': {
+ storeMethodNumber(bindingData, text, i);
+ bindingData.startChar = i + 1;
+ state = STATE.METHOD;
+ break;
+ }
+ case ')': {
+ storeMethodNumber(bindingData, text, i);
+ storeMethod(bindingData, templateInfo);
+ state = STATE.METHODCLOSED;
+ break;
+ }
+ default: {
+ if (char < '0' || char > '9') {
+ state = STATE.VARIABLEARG;
+ }
+ }
+ }
+ break;
+ }
+ case STATE.VARIABLEARG: {
+ switch (char) {
+ case ',': {
+ storeMethodVariable(bindingData, text, i);
+ bindingData.startChar = i + 1;
+ state = STATE.METHOD;
+ break;
+ }
+ case ')': {
+ storeMethodVariable(bindingData, text, i);
+ storeMethod(bindingData, templateInfo);
+ state = STATE.METHODCLOSED;
+ break;
+ }
+ }
+ break;
+ }
+ case STATE.METHODCLOSED: {
+ if (char === BINDINGS[bindingData.mode]) {
+ state = STATE.METHODCLOSEDBINDING;
+ } else if (char !== ' ' && char !== '\t' && char !== '\n') {
+ console.warn(`Expected two closing "${BINDINGS[bindingData.mode]}" for binding "${text}"`);
+ }
+ break;
+ }
+ case STATE.METHODCLOSEDBINDING: {
+ if (char === BINDINGS[bindingData.mode]) {
+ bindingData.startChar = i + 1;
+ parts.push(bindingData);
+ state = STATE.INITIAL;
+ } else if (char !== ' ' && char !== '\t' && char !== '\n') {
+ console.warn(`Expected one closing "${BINDINGS[bindingData.mode]}" for binding "${text}"`);
+ }
+ break;
+ }
+ }
+ }
+
+ if (parts.length) {
+ pushLiteral(text, i, parts, parts[parts.length - 1].startChar);
+ return parts;
+ }
+
+ return null;
+ }
+ };
+});
+
+export { StrictBindingParser };
diff --git a/third_party/polymer3/bower_components/polymer/lib/mixins/template-stamp.js b/third_party/polymer3/bower_components/polymer/lib/mixins/template-stamp.js
new file mode 100644
index 0000000..0355fd8
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/lib/mixins/template-stamp.js
@@ -0,0 +1,482 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import '../utils/boot.js';
+
+import { dedupingMixin } from '../utils/mixin.js';
+
+// 1.x backwards-compatible auto-wrapper for template type extensions
+// This is a clear layering violation and gives favored-nation status to
+// dom-if and dom-repeat templates. This is a conceit we're choosing to keep
+// a.) to ease 1.x backwards-compatibility due to loss of `is`, and
+// b.) to maintain if/repeat capability in parser-constrained elements
+// (e.g. table, select) in lieu of native CE type extensions without
+// massive new invention in this space (e.g. directive system)
+const templateExtensions = {
+ 'dom-if': true,
+ 'dom-repeat': true
+};
+function wrapTemplateExtension(node) {
+ let is = node.getAttribute('is');
+ if (is && templateExtensions[is]) {
+ let t = node;
+ t.removeAttribute('is');
+ node = t.ownerDocument.createElement(is);
+ t.parentNode.replaceChild(node, t);
+ node.appendChild(t);
+ while(t.attributes.length) {
+ node.setAttribute(t.attributes[0].name, t.attributes[0].value);
+ t.removeAttribute(t.attributes[0].name);
+ }
+ }
+ return node;
+}
+
+function findTemplateNode(root, nodeInfo) {
+ // recursively ascend tree until we hit root
+ let parent = nodeInfo.parentInfo && findTemplateNode(root, nodeInfo.parentInfo);
+ // unwind the stack, returning the indexed node at each level
+ if (parent) {
+ // note: marginally faster than indexing via childNodes
+ // (http://jsperf.com/childnodes-lookup)
+ for (let n=parent.firstChild, i=0; n; n=n.nextSibling) {
+ if (nodeInfo.parentIndex === i++) {
+ return n;
+ }
+ }
+ } else {
+ return root;
+ }
+}
+
+// construct `$` map (from id annotations)
+function applyIdToMap(inst, map, node, nodeInfo) {
+ if (nodeInfo.id) {
+ map[nodeInfo.id] = node;
+ }
+}
+
+// install event listeners (from event annotations)
+function applyEventListener(inst, node, nodeInfo) {
+ if (nodeInfo.events && nodeInfo.events.length) {
+ for (let j=0, e$=nodeInfo.events, e; (j<e$.length) && (e=e$[j]); j++) {
+ inst._addMethodEventListenerToNode(node, e.name, e.value, inst);
+ }
+ }
+}
+
+// push configuration references at configure time
+function applyTemplateContent(inst, node, nodeInfo) {
+ if (nodeInfo.templateInfo) {
+ node._templateInfo = nodeInfo.templateInfo;
+ }
+}
+
+function createNodeEventHandler(context, eventName, methodName) {
+ // Instances can optionally have a _methodHost which allows redirecting where
+ // to find methods. Currently used by `templatize`.
+ context = context._methodHost || context;
+ let handler = function(e) {
+ if (context[methodName]) {
+ context[methodName](e, e.detail);
+ } else {
+ console.warn('listener method `' + methodName + '` not defined');
+ }
+ };
+ return handler;
+}
+
+/**
+ * Element mixin that provides basic template parsing and stamping, including
+ * the following template-related features for stamped templates:
+ *
+ * - Declarative event listeners (`on-eventname="listener"`)
+ * - Map of node id's to stamped node instances (`this.$.id`)
+ * - Nested template content caching/removal and re-installation (performance
+ * optimization)
+ *
+ * @mixinFunction
+ * @polymer
+ * @summary Element class mixin that provides basic template parsing and stamping
+ */
+export const TemplateStamp = dedupingMixin(superClass => {
+
+ /**
+ * @polymer
+ * @mixinClass
+ * @implements {Polymer_TemplateStamp}
+ */
+ class TemplateStamp extends superClass {
+
+ /**
+ * Scans a template to produce template metadata.
+ *
+ * Template-specific metadata are stored in the object returned, and node-
+ * specific metadata are stored in objects in its flattened `nodeInfoList`
+ * array. Only nodes in the template that were parsed as nodes of
+ * interest contain an object in `nodeInfoList`. Each `nodeInfo` object
+ * contains an `index` (`childNodes` index in parent) and optionally
+ * `parent`, which points to node info of its parent (including its index).
+ *
+ * The template metadata object returned from this method has the following
+ * structure (many fields optional):
+ *
+ * ```js
+ * {
+ * // Flattened list of node metadata (for nodes that generated metadata)
+ * nodeInfoList: [
+ * {
+ * // `id` attribute for any nodes with id's for generating `$` map
+ * id: {string},
+ * // `on-event="handler"` metadata
+ * events: [
+ * {
+ * name: {string}, // event name
+ * value: {string}, // handler method name
+ * }, ...
+ * ],
+ * // Notes when the template contained a `<slot>` for shady DOM
+ * // optimization purposes
+ * hasInsertionPoint: {boolean},
+ * // For nested `<template>`` nodes, nested template metadata
+ * templateInfo: {object}, // nested template metadata
+ * // Metadata to allow efficient retrieval of instanced node
+ * // corresponding to this metadata
+ * parentInfo: {number}, // reference to parent nodeInfo>
+ * parentIndex: {number}, // index in parent's `childNodes` collection
+ * infoIndex: {number}, // index of this `nodeInfo` in `templateInfo.nodeInfoList`
+ * },
+ * ...
+ * ],
+ * // When true, the template had the `strip-whitespace` attribute
+ * // or was nested in a template with that setting
+ * stripWhitespace: {boolean},
+ * // For nested templates, nested template content is moved into
+ * // a document fragment stored here; this is an optimization to
+ * // avoid the cost of nested template cloning
+ * content: {DocumentFragment}
+ * }
+ * ```
+ *
+ * This method kicks off a recursive treewalk as follows:
+ *
+ * ```
+ * _parseTemplate <---------------------+
+ * _parseTemplateContent |
+ * _parseTemplateNode <------------|--+
+ * _parseTemplateNestedTemplate --+ |
+ * _parseTemplateChildNodes ---------+
+ * _parseTemplateNodeAttributes
+ * _parseTemplateNodeAttribute
+ *
+ * ```
+ *
+ * These methods may be overridden to add custom metadata about templates
+ * to either `templateInfo` or `nodeInfo`.
+ *
+ * Note that this method may be destructive to the template, in that
+ * e.g. event annotations may be removed after being noted in the
+ * template metadata.
+ *
+ * @param {!HTMLTemplateElement} template Template to parse
+ * @param {TemplateInfo=} outerTemplateInfo Template metadata from the outer
+ * template, for parsing nested templates
+ * @return {!TemplateInfo} Parsed template metadata
+ */
+ static _parseTemplate(template, outerTemplateInfo) {
+ // since a template may be re-used, memo-ize metadata
+ if (!template._templateInfo) {
+ let templateInfo = template._templateInfo = {};
+ templateInfo.nodeInfoList = [];
+ templateInfo.stripWhiteSpace =
+ (outerTemplateInfo && outerTemplateInfo.stripWhiteSpace) ||
+ template.hasAttribute('strip-whitespace');
+ this._parseTemplateContent(template, templateInfo, {parent: null});
+ }
+ return template._templateInfo;
+ }
+
+ static _parseTemplateContent(template, templateInfo, nodeInfo) {
+ return this._parseTemplateNode(template.content, templateInfo, nodeInfo);
+ }
+
+ /**
+ * Parses template node and adds template and node metadata based on
+ * the current node, and its `childNodes` and `attributes`.
+ *
+ * This method may be overridden to add custom node or template specific
+ * metadata based on this node.
+ *
+ * @param {Node} node Node to parse
+ * @param {!TemplateInfo} templateInfo Template metadata for current template
+ * @param {!NodeInfo} nodeInfo Node metadata for current template.
+ * @return {boolean} `true` if the visited node added node-specific
+ * metadata to `nodeInfo`
+ */
+ static _parseTemplateNode(node, templateInfo, nodeInfo) {
+ let noted;
+ let element = /** @type {Element} */(node);
+ if (element.localName == 'template' && !element.hasAttribute('preserve-content')) {
+ noted = this._parseTemplateNestedTemplate(element, templateInfo, nodeInfo) || noted;
+ } else if (element.localName === 'slot') {
+ // For ShadyDom optimization, indicating there is an insertion point
+ templateInfo.hasInsertionPoint = true;
+ }
+ if (element.firstChild) {
+ noted = this._parseTemplateChildNodes(element, templateInfo, nodeInfo) || noted;
+ }
+ if (element.hasAttributes && element.hasAttributes()) {
+ noted = this._parseTemplateNodeAttributes(element, templateInfo, nodeInfo) || noted;
+ }
+ return noted;
+ }
+
+ /**
+ * Parses template child nodes for the given root node.
+ *
+ * This method also wraps whitelisted legacy template extensions
+ * (`is="dom-if"` and `is="dom-repeat"`) with their equivalent element
+ * wrappers, collapses text nodes, and strips whitespace from the template
+ * if the `templateInfo.stripWhitespace` setting was provided.
+ *
+ * @param {Node} root Root node whose `childNodes` will be parsed
+ * @param {!TemplateInfo} templateInfo Template metadata for current template
+ * @param {!NodeInfo} nodeInfo Node metadata for current template.
+ * @return {void}
+ */
+ static _parseTemplateChildNodes(root, templateInfo, nodeInfo) {
+ if (root.localName === 'script' || root.localName === 'style') {
+ return;
+ }
+ for (let node=root.firstChild, parentIndex=0, next; node; node=next) {
+ // Wrap templates
+ if (node.localName == 'template') {
+ node = wrapTemplateExtension(node);
+ }
+ // collapse adjacent textNodes: fixes an IE issue that can cause
+ // text nodes to be inexplicably split =(
+ // note that root.normalize() should work but does not so we do this
+ // manually.
+ next = node.nextSibling;
+ if (node.nodeType === Node.TEXT_NODE) {
+ let /** Node */ n = next;
+ while (n && (n.nodeType === Node.TEXT_NODE)) {
+ node.textContent += n.textContent;
+ next = n.nextSibling;
+ root.removeChild(n);
+ n = next;
+ }
+ // optionally strip whitespace
+ if (templateInfo.stripWhiteSpace && !node.textContent.trim()) {
+ root.removeChild(node);
+ continue;
+ }
+ }
+ let childInfo = { parentIndex, parentInfo: nodeInfo };
+ if (this._parseTemplateNode(node, templateInfo, childInfo)) {
+ childInfo.infoIndex = templateInfo.nodeInfoList.push(/** @type {!NodeInfo} */(childInfo)) - 1;
+ }
+ // Increment if not removed
+ if (node.parentNode) {
+ parentIndex++;
+ }
+ }
+ }
+
+ /**
+ * Parses template content for the given nested `<template>`.
+ *
+ * Nested template info is stored as `templateInfo` in the current node's
+ * `nodeInfo`. `template.content` is removed and stored in `templateInfo`.
+ * It will then be the responsibility of the host to set it back to the
+ * template and for users stamping nested templates to use the
+ * `_contentForTemplate` method to retrieve the content for this template
+ * (an optimization to avoid the cost of cloning nested template content).
+ *
+ * @param {HTMLTemplateElement} node Node to parse (a <template>)
+ * @param {TemplateInfo} outerTemplateInfo Template metadata for current template
+ * that includes the template `node`
+ * @param {!NodeInfo} nodeInfo Node metadata for current template.
+ * @return {boolean} `true` if the visited node added node-specific
+ * metadata to `nodeInfo`
+ */
+ static _parseTemplateNestedTemplate(node, outerTemplateInfo, nodeInfo) {
+ let templateInfo = this._parseTemplate(node, outerTemplateInfo);
+ let content = templateInfo.content =
+ node.content.ownerDocument.createDocumentFragment();
+ content.appendChild(node.content);
+ nodeInfo.templateInfo = templateInfo;
+ return true;
+ }
+
+ /**
+ * Parses template node attributes and adds node metadata to `nodeInfo`
+ * for nodes of interest.
+ *
+ * @param {Element} node Node to parse
+ * @param {TemplateInfo} templateInfo Template metadata for current template
+ * @param {NodeInfo} nodeInfo Node metadata for current template.
+ * @return {boolean} `true` if the visited node added node-specific
+ * metadata to `nodeInfo`
+ */
+ static _parseTemplateNodeAttributes(node, templateInfo, nodeInfo) {
+ // Make copy of original attribute list, since the order may change
+ // as attributes are added and removed
+ let noted = false;
+ let attrs = Array.from(node.attributes);
+ for (let i=attrs.length-1, a; (a=attrs[i]); i--) {
+ noted = this._parseTemplateNodeAttribute(node, templateInfo, nodeInfo, a.name, a.value) || noted;
+ }
+ return noted;
+ }
+
+ /**
+ * Parses a single template node attribute and adds node metadata to
+ * `nodeInfo` for attributes of interest.
+ *
+ * This implementation adds metadata for `on-event="handler"` attributes
+ * and `id` attributes.
+ *
+ * @param {Element} node Node to parse
+ * @param {!TemplateInfo} templateInfo Template metadata for current template
+ * @param {!NodeInfo} nodeInfo Node metadata for current template.
+ * @param {string} name Attribute name
+ * @param {string} value Attribute value
+ * @return {boolean} `true` if the visited node added node-specific
+ * metadata to `nodeInfo`
+ */
+ static _parseTemplateNodeAttribute(node, templateInfo, nodeInfo, name, value) {
+ // events (on-*)
+ if (name.slice(0, 3) === 'on-') {
+ node.removeAttribute(name);
+ nodeInfo.events = nodeInfo.events || [];
+ nodeInfo.events.push({
+ name: name.slice(3),
+ value
+ });
+ return true;
+ }
+ // static id
+ else if (name === 'id') {
+ nodeInfo.id = value;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Returns the `content` document fragment for a given template.
+ *
+ * For nested templates, Polymer performs an optimization to cache nested
+ * template content to avoid the cost of cloning deeply nested templates.
+ * This method retrieves the cached content for a given template.
+ *
+ * @param {HTMLTemplateElement} template Template to retrieve `content` for
+ * @return {DocumentFragment} Content fragment
+ */
+ static _contentForTemplate(template) {
+ let templateInfo = /** @type {HTMLTemplateElementWithInfo} */ (template)._templateInfo;
+ return (templateInfo && templateInfo.content) || template.content;
+ }
+
+ /**
+ * Clones the provided template content and returns a document fragment
+ * containing the cloned dom.
+ *
+ * The template is parsed (once and memoized) using this library's
+ * template parsing features, and provides the following value-added
+ * features:
+ * * Adds declarative event listeners for `on-event="handler"` attributes
+ * * Generates an "id map" for all nodes with id's under `$` on returned
+ * document fragment
+ * * Passes template info including `content` back to templates as
+ * `_templateInfo` (a performance optimization to avoid deep template
+ * cloning)
+ *
+ * Note that the memoized template parsing process is destructive to the
+ * template: attributes for bindings and declarative event listeners are
+ * removed after being noted in notes, and any nested `<template>.content`
+ * is removed and stored in notes as well.
+ *
+ * @param {!HTMLTemplateElement} template Template to stamp
+ * @return {!StampedTemplate} Cloned template content
+ */
+ _stampTemplate(template) {
+ // Polyfill support: bootstrap the template if it has not already been
+ if (template && !template.content &&
+ window.HTMLTemplateElement && HTMLTemplateElement.decorate) {
+ HTMLTemplateElement.decorate(template);
+ }
+ let templateInfo = this.constructor._parseTemplate(template);
+ let nodeInfo = templateInfo.nodeInfoList;
+ let content = templateInfo.content || template.content;
+ let dom = /** @type {DocumentFragment} */ (document.importNode(content, true));
+ // NOTE: ShadyDom optimization indicating there is an insertion point
+ dom.__noInsertionPoint = !templateInfo.hasInsertionPoint;
+ let nodes = dom.nodeList = new Array(nodeInfo.length);
+ dom.$ = {};
+ for (let i=0, l=nodeInfo.length, info; (i<l) && (info=nodeInfo[i]); i++) {
+ let node = nodes[i] = findTemplateNode(dom, info);
+ applyIdToMap(this, dom.$, node, info);
+ applyTemplateContent(this, node, info);
+ applyEventListener(this, node, info);
+ }
+ dom = /** @type {!StampedTemplate} */(dom); // eslint-disable-line no-self-assign
+ return dom;
+ }
+
+ /**
+ * Adds an event listener by method name for the event provided.
+ *
+ * This method generates a handler function that looks up the method
+ * name at handling time.
+ *
+ * @param {!Node} node Node to add listener on
+ * @param {string} eventName Name of event
+ * @param {string} methodName Name of method
+ * @param {*=} context Context the method will be called on (defaults
+ * to `node`)
+ * @return {Function} Generated handler function
+ */
+ _addMethodEventListenerToNode(node, eventName, methodName, context) {
+ context = context || node;
+ let handler = createNodeEventHandler(context, eventName, methodName);
+ this._addEventListenerToNode(node, eventName, handler);
+ return handler;
+ }
+
+ /**
+ * Override point for adding custom or simulated event handling.
+ *
+ * @param {!Node} node Node to add event listener to
+ * @param {string} eventName Name of event
+ * @param {function(!Event):void} handler Listener function to add
+ * @return {void}
+ */
+ _addEventListenerToNode(node, eventName, handler) {
+ node.addEventListener(eventName, handler);
+ }
+
+ /**
+ * Override point for adding custom or simulated event handling.
+ *
+ * @param {Node} node Node to remove event listener from
+ * @param {string} eventName Name of event
+ * @param {function(!Event):void} handler Listener function to remove
+ * @return {void}
+ */
+ _removeEventListenerFromNode(node, eventName, handler) {
+ node.removeEventListener(eventName, handler);
+ }
+
+ }
+
+ return TemplateStamp;
+
+});
diff --git a/third_party/polymer3/bower_components/polymer/lib/utils/array-splice.js b/third_party/polymer3/bower_components/polymer/lib/utils/array-splice.js
new file mode 100644
index 0000000..77ccb1a
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/lib/utils/array-splice.js
@@ -0,0 +1,299 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import './boot.js';
+
+function newSplice(index, removed, addedCount) {
+ return {
+ index: index,
+ removed: removed,
+ addedCount: addedCount
+ };
+}
+
+const EDIT_LEAVE = 0;
+const EDIT_UPDATE = 1;
+const EDIT_ADD = 2;
+const EDIT_DELETE = 3;
+
+// Note: This function is *based* on the computation of the Levenshtein
+// "edit" distance. The one change is that "updates" are treated as two
+// edits - not one. With Array splices, an update is really a delete
+// followed by an add. By retaining this, we optimize for "keeping" the
+// maximum array items in the original array. For example:
+//
+// 'xxxx123' -> '123yyyy'
+//
+// With 1-edit updates, the shortest path would be just to update all seven
+// characters. With 2-edit updates, we delete 4, leave 3, and add 4. This
+// leaves the substring '123' intact.
+function calcEditDistances(current, currentStart, currentEnd,
+ old, oldStart, oldEnd) {
+ // "Deletion" columns
+ let rowCount = oldEnd - oldStart + 1;
+ let columnCount = currentEnd - currentStart + 1;
+ let distances = new Array(rowCount);
+
+ // "Addition" rows. Initialize null column.
+ for (let i = 0; i < rowCount; i++) {
+ distances[i] = new Array(columnCount);
+ distances[i][0] = i;
+ }
+
+ // Initialize null row
+ for (let j = 0; j < columnCount; j++)
+ distances[0][j] = j;
+
+ for (let i = 1; i < rowCount; i++) {
+ for (let j = 1; j < columnCount; j++) {
+ if (equals(current[currentStart + j - 1], old[oldStart + i - 1]))
+ distances[i][j] = distances[i - 1][j - 1];
+ else {
+ let north = distances[i - 1][j] + 1;
+ let west = distances[i][j - 1] + 1;
+ distances[i][j] = north < west ? north : west;
+ }
+ }
+ }
+
+ return distances;
+}
+
+// This starts at the final weight, and walks "backward" by finding
+// the minimum previous weight recursively until the origin of the weight
+// matrix.
+function spliceOperationsFromEditDistances(distances) {
+ let i = distances.length - 1;
+ let j = distances[0].length - 1;
+ let current = distances[i][j];
+ let edits = [];
+ while (i > 0 || j > 0) {
+ if (i == 0) {
+ edits.push(EDIT_ADD);
+ j--;
+ continue;
+ }
+ if (j == 0) {
+ edits.push(EDIT_DELETE);
+ i--;
+ continue;
+ }
+ let northWest = distances[i - 1][j - 1];
+ let west = distances[i - 1][j];
+ let north = distances[i][j - 1];
+
+ let min;
+ if (west < north)
+ min = west < northWest ? west : northWest;
+ else
+ min = north < northWest ? north : northWest;
+
+ if (min == northWest) {
+ if (northWest == current) {
+ edits.push(EDIT_LEAVE);
+ } else {
+ edits.push(EDIT_UPDATE);
+ current = northWest;
+ }
+ i--;
+ j--;
+ } else if (min == west) {
+ edits.push(EDIT_DELETE);
+ i--;
+ current = west;
+ } else {
+ edits.push(EDIT_ADD);
+ j--;
+ current = north;
+ }
+ }
+
+ edits.reverse();
+ return edits;
+}
+
+/**
+ * Splice Projection functions:
+ *
+ * A splice map is a representation of how a previous array of items
+ * was transformed into a new array of items. Conceptually it is a list of
+ * tuples of
+ *
+ * <index, removed, addedCount>
+ *
+ * which are kept in ascending index order of. The tuple represents that at
+ * the |index|, |removed| sequence of items were removed, and counting forward
+ * from |index|, |addedCount| items were added.
+ */
+
+/**
+ * Lacking individual splice mutation information, the minimal set of
+ * splices can be synthesized given the previous state and final state of an
+ * array. The basic approach is to calculate the edit distance matrix and
+ * choose the shortest path through it.
+ *
+ * Complexity: O(l * p)
+ * l: The length of the current array
+ * p: The length of the old array
+ *
+ * @param {!Array} current The current "changed" array for which to
+ * calculate splices.
+ * @param {number} currentStart Starting index in the `current` array for
+ * which splices are calculated.
+ * @param {number} currentEnd Ending index in the `current` array for
+ * which splices are calculated.
+ * @param {!Array} old The original "unchanged" array to compare `current`
+ * against to determine splices.
+ * @param {number} oldStart Starting index in the `old` array for
+ * which splices are calculated.
+ * @param {number} oldEnd Ending index in the `old` array for
+ * which splices are calculated.
+ * @return {!Array} Returns an array of splice record objects. Each of these
+ * contains: `index` the location where the splice occurred; `removed`
+ * the array of removed items from this location; `addedCount` the number
+ * of items added at this location.
+ */
+function calcSplices(current, currentStart, currentEnd,
+ old, oldStart, oldEnd) {
+ let prefixCount = 0;
+ let suffixCount = 0;
+ let splice;
+
+ let minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);
+ if (currentStart == 0 && oldStart == 0)
+ prefixCount = sharedPrefix(current, old, minLength);
+
+ if (currentEnd == current.length && oldEnd == old.length)
+ suffixCount = sharedSuffix(current, old, minLength - prefixCount);
+
+ currentStart += prefixCount;
+ oldStart += prefixCount;
+ currentEnd -= suffixCount;
+ oldEnd -= suffixCount;
+
+ if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)
+ return [];
+
+ if (currentStart == currentEnd) {
+ splice = newSplice(currentStart, [], 0);
+ while (oldStart < oldEnd)
+ splice.removed.push(old[oldStart++]);
+
+ return [ splice ];
+ } else if (oldStart == oldEnd)
+ return [ newSplice(currentStart, [], currentEnd - currentStart) ];
+
+ let ops = spliceOperationsFromEditDistances(
+ calcEditDistances(current, currentStart, currentEnd,
+ old, oldStart, oldEnd));
+
+ splice = undefined;
+ let splices = [];
+ let index = currentStart;
+ let oldIndex = oldStart;
+ for (let i = 0; i < ops.length; i++) {
+ switch(ops[i]) {
+ case EDIT_LEAVE:
+ if (splice) {
+ splices.push(splice);
+ splice = undefined;
+ }
+
+ index++;
+ oldIndex++;
+ break;
+ case EDIT_UPDATE:
+ if (!splice)
+ splice = newSplice(index, [], 0);
+
+ splice.addedCount++;
+ index++;
+
+ splice.removed.push(old[oldIndex]);
+ oldIndex++;
+ break;
+ case EDIT_ADD:
+ if (!splice)
+ splice = newSplice(index, [], 0);
+
+ splice.addedCount++;
+ index++;
+ break;
+ case EDIT_DELETE:
+ if (!splice)
+ splice = newSplice(index, [], 0);
+
+ splice.removed.push(old[oldIndex]);
+ oldIndex++;
+ break;
+ }
+ }
+
+ if (splice) {
+ splices.push(splice);
+ }
+ return splices;
+}
+
+function sharedPrefix(current, old, searchLength) {
+ for (let i = 0; i < searchLength; i++)
+ if (!equals(current[i], old[i]))
+ return i;
+ return searchLength;
+}
+
+function sharedSuffix(current, old, searchLength) {
+ let index1 = current.length;
+ let index2 = old.length;
+ let count = 0;
+ while (count < searchLength && equals(current[--index1], old[--index2]))
+ count++;
+
+ return count;
+}
+
+/**
+ * Returns an array of splice records indicating the minimum edits required
+ * to transform the `previous` array into the `current` array.
+ *
+ * Splice records are ordered by index and contain the following fields:
+ * - `index`: index where edit started
+ * - `removed`: array of removed items from this index
+ * - `addedCount`: number of items added at this index
+ *
+ * This function is based on the Levenshtein "minimum edit distance"
+ * algorithm. Note that updates are treated as removal followed by addition.
+ *
+ * The worst-case time complexity of this algorithm is `O(l * p)`
+ * l: The length of the current array
+ * p: The length of the previous array
+ *
+ * However, the worst-case complexity is reduced by an `O(n)` optimization
+ * to detect any shared prefix & suffix between the two arrays and only
+ * perform the more expensive minimum edit distance calculation over the
+ * non-shared portions of the arrays.
+ *
+ * @function
+ * @param {!Array} current The "changed" array for which splices will be
+ * calculated.
+ * @param {!Array} previous The "unchanged" original array to compare
+ * `current` against to determine the splices.
+ * @return {!Array} Returns an array of splice record objects. Each of these
+ * contains: `index` the location where the splice occurred; `removed`
+ * the array of removed items from this location; `addedCount` the number
+ * of items added at this location.
+ */
+export function calculateSplices(current, previous) {
+ return calcSplices(current, 0, current.length, previous, 0,
+ previous.length);
+}
+
+function equals(currentValue, previousValue) {
+ return currentValue === previousValue;
+}
diff --git a/third_party/polymer3/bower_components/polymer/lib/utils/async.js b/third_party/polymer3/bower_components/polymer/lib/utils/async.js
new file mode 100644
index 0000000..e332f95
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/lib/utils/async.js
@@ -0,0 +1,207 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+
+/**
+ * @fileoverview
+ *
+ * This module provides a number of strategies for enqueuing asynchronous
+ * tasks. Each sub-module provides a standard `run(fn)` interface that returns a
+ * handle, and a `cancel(handle)` interface for canceling async tasks before
+ * they run.
+ *
+ * @summary Module that provides a number of strategies for enqueuing
+ * asynchronous tasks.
+ */
+
+import './boot.js';
+
+// Microtask implemented using Mutation Observer
+let microtaskCurrHandle = 0;
+let microtaskLastHandle = 0;
+let microtaskCallbacks = [];
+let microtaskNodeContent = 0;
+let microtaskNode = document.createTextNode('');
+new window.MutationObserver(microtaskFlush).observe(microtaskNode, {characterData: true});
+
+function microtaskFlush() {
+ const len = microtaskCallbacks.length;
+ for (let i = 0; i < len; i++) {
+ let cb = microtaskCallbacks[i];
+ if (cb) {
+ try {
+ cb();
+ } catch (e) {
+ setTimeout(() => { throw e; });
+ }
+ }
+ }
+ microtaskCallbacks.splice(0, len);
+ microtaskLastHandle += len;
+}
+
+/**
+ * Async interface wrapper around `setTimeout`.
+ *
+ * @namespace
+ * @summary Async interface wrapper around `setTimeout`.
+ */
+const timeOut = {
+ /**
+ * Returns a sub-module with the async interface providing the provided
+ * delay.
+ *
+ * @memberof timeOut
+ * @param {number=} delay Time to wait before calling callbacks in ms
+ * @return {!AsyncInterface} An async timeout interface
+ */
+ after(delay) {
+ return {
+ run(fn) { return window.setTimeout(fn, delay); },
+ cancel(handle) {
+ window.clearTimeout(handle);
+ }
+ };
+ },
+ /**
+ * Enqueues a function called in the next task.
+ *
+ * @memberof timeOut
+ * @param {!Function} fn Callback to run
+ * @param {number=} delay Delay in milliseconds
+ * @return {number} Handle used for canceling task
+ */
+ run(fn, delay) {
+ return window.setTimeout(fn, delay);
+ },
+ /**
+ * Cancels a previously enqueued `timeOut` callback.
+ *
+ * @memberof timeOut
+ * @param {number} handle Handle returned from `run` of callback to cancel
+ * @return {void}
+ */
+ cancel(handle) {
+ window.clearTimeout(handle);
+ }
+};
+export {timeOut};
+
+/**
+ * Async interface wrapper around `requestAnimationFrame`.
+ *
+ * @namespace
+ * @summary Async interface wrapper around `requestAnimationFrame`.
+ */
+const animationFrame = {
+ /**
+ * Enqueues a function called at `requestAnimationFrame` timing.
+ *
+ * @memberof animationFrame
+ * @param {function(number):void} fn Callback to run
+ * @return {number} Handle used for canceling task
+ */
+ run(fn) {
+ return window.requestAnimationFrame(fn);
+ },
+ /**
+ * Cancels a previously enqueued `animationFrame` callback.
+ *
+ * @memberof animationFrame
+ * @param {number} handle Handle returned from `run` of callback to cancel
+ * @return {void}
+ */
+ cancel(handle) {
+ window.cancelAnimationFrame(handle);
+ }
+};
+export {animationFrame};
+
+/**
+ * Async interface wrapper around `requestIdleCallback`. Falls back to
+ * `setTimeout` on browsers that do not support `requestIdleCallback`.
+ *
+ * @namespace
+ * @summary Async interface wrapper around `requestIdleCallback`.
+ */
+const idlePeriod = {
+ /**
+ * Enqueues a function called at `requestIdleCallback` timing.
+ *
+ * @memberof idlePeriod
+ * @param {function(!IdleDeadline):void} fn Callback to run
+ * @return {number} Handle used for canceling task
+ */
+ run(fn) {
+ return window.requestIdleCallback ?
+ window.requestIdleCallback(fn) :
+ window.setTimeout(fn, 16);
+ },
+ /**
+ * Cancels a previously enqueued `idlePeriod` callback.
+ *
+ * @memberof idlePeriod
+ * @param {number} handle Handle returned from `run` of callback to cancel
+ * @return {void}
+ */
+ cancel(handle) {
+ window.cancelIdleCallback ?
+ window.cancelIdleCallback(handle) :
+ window.clearTimeout(handle);
+ }
+};
+export {idlePeriod};
+
+/**
+ * Async interface for enqueuing callbacks that run at microtask timing.
+ *
+ * Note that microtask timing is achieved via a single `MutationObserver`,
+ * and thus callbacks enqueued with this API will all run in a single
+ * batch, and not interleaved with other microtasks such as promises.
+ * Promises are avoided as an implementation choice for the time being
+ * due to Safari bugs that cause Promises to lack microtask guarantees.
+ *
+ * @namespace
+ * @summary Async interface for enqueuing callbacks that run at microtask
+ * timing.
+ */
+const microTask = {
+
+ /**
+ * Enqueues a function called at microtask timing.
+ *
+ * @memberof microTask
+ * @param {!Function=} callback Callback to run
+ * @return {number} Handle used for canceling task
+ */
+ run(callback) {
+ microtaskNode.textContent = microtaskNodeContent++;
+ microtaskCallbacks.push(callback);
+ return microtaskCurrHandle++;
+ },
+
+ /**
+ * Cancels a previously enqueued `microTask` callback.
+ *
+ * @memberof microTask
+ * @param {number} handle Handle returned from `run` of callback to cancel
+ * @return {void}
+ */
+ cancel(handle) {
+ const idx = handle - microtaskLastHandle;
+ if (idx >= 0) {
+ if (!microtaskCallbacks[idx]) {
+ throw new Error('invalid async handle: ' + handle);
+ }
+ microtaskCallbacks[idx] = null;
+ }
+ }
+
+};
+export {microTask};
diff --git a/third_party/polymer3/bower_components/polymer/lib/utils/boot.js b/third_party/polymer3/bower_components/polymer/lib/utils/boot.js
new file mode 100644
index 0000000..511b3c5
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/lib/utils/boot.js
@@ -0,0 +1,11 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+
+window.JSCompiler_renameProperty = function(prop) { return prop; };
diff --git a/third_party/polymer3/bower_components/polymer/lib/utils/case-map.js b/third_party/polymer3/bower_components/polymer/lib/utils/case-map.js
new file mode 100644
index 0000000..0f87213
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/lib/utils/case-map.js
@@ -0,0 +1,53 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import './boot.js';
+
+const caseMap = {};
+const DASH_TO_CAMEL = /-[a-z]/g;
+const CAMEL_TO_DASH = /([A-Z])/g;
+
+/**
+ * Module with utilities for converting between "dash-case" and "camelCase"
+ * identifiers.
+ *
+ * @summary Module that provides utilities for converting between "dash-case"
+ * and "camelCase".
+ */
+`TODO(modulizer): A namespace named Polymer.CaseMap was
+declared here. The surrounding comments should be reviewed,
+and this string can then be deleted`;
+
+/**
+ * Converts "dash-case" identifier (e.g. `foo-bar-baz`) to "camelCase"
+ * (e.g. `fooBarBaz`).
+ *
+ * @param {string} dash Dash-case identifier
+ * @return {string} Camel-case representation of the identifier
+ */
+export function dashToCamelCase(dash) {
+ return caseMap[dash] || (
+ caseMap[dash] = dash.indexOf('-') < 0 ? dash : dash.replace(DASH_TO_CAMEL,
+ (m) => m[1].toUpperCase()
+ )
+ );
+}
+
+/**
+ * Converts "camelCase" identifier (e.g. `fooBarBaz`) to "dash-case"
+ * (e.g. `foo-bar-baz`).
+ *
+ * @param {string} camel Camel-case identifier
+ * @return {string} Dash-case representation of the identifier
+ */
+export function camelToDashCase(camel) {
+ return caseMap[camel] || (
+ caseMap[camel] = camel.replace(CAMEL_TO_DASH, '-$1').toLowerCase()
+ );
+}
diff --git a/third_party/polymer3/bower_components/polymer/lib/utils/debounce.js b/third_party/polymer3/bower_components/polymer/lib/utils/debounce.js
new file mode 100644
index 0000000..9262d00
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/lib/utils/debounce.js
@@ -0,0 +1,114 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import './boot.js';
+
+import './mixin.js';
+import './async.js';
+
+/**
+ * @summary Collapse multiple callbacks into one invocation after a timer.
+ */
+export const Debouncer = class Debouncer {
+ constructor() {
+ this._asyncModule = null;
+ this._callback = null;
+ this._timer = null;
+ }
+ /**
+ * Sets the scheduler; that is, a module with the Async interface,
+ * a callback and optional arguments to be passed to the run function
+ * from the async module.
+ *
+ * @param {!AsyncInterface} asyncModule Object with Async interface.
+ * @param {function()} callback Callback to run.
+ * @return {void}
+ */
+ setConfig(asyncModule, callback) {
+ this._asyncModule = asyncModule;
+ this._callback = callback;
+ this._timer = this._asyncModule.run(() => {
+ this._timer = null;
+ this._callback();
+ });
+ }
+ /**
+ * Cancels an active debouncer and returns a reference to itself.
+ *
+ * @return {void}
+ */
+ cancel() {
+ if (this.isActive()) {
+ this._asyncModule.cancel(this._timer);
+ this._timer = null;
+ }
+ }
+ /**
+ * Flushes an active debouncer and returns a reference to itself.
+ *
+ * @return {void}
+ */
+ flush() {
+ if (this.isActive()) {
+ this.cancel();
+ this._callback();
+ }
+ }
+ /**
+ * Returns true if the debouncer is active.
+ *
+ * @return {boolean} True if active.
+ */
+ isActive() {
+ return this._timer != null;
+ }
+ /**
+ * Creates a debouncer if no debouncer is passed as a parameter
+ * or it cancels an active debouncer otherwise. The following
+ * example shows how a debouncer can be called multiple times within a
+ * microtask and "debounced" such that the provided callback function is
+ * called once. Add this method to a custom element:
+ *
+ * ```js
+ * import {microtask} from '@polymer/polymer/lib/utils/async.js';
+ * import {Debouncer} from '@polymer/polymer/lib/utils/debounce.js';
+ * // ...
+ *
+ * _debounceWork() {
+ * this._debounceJob = Debouncer.debounce(this._debounceJob,
+ * microTask, () => this._doWork());
+ * }
+ * ```
+ *
+ * If the `_debounceWork` method is called multiple times within the same
+ * microtask, the `_doWork` function will be called only once at the next
+ * microtask checkpoint.
+ *
+ * Note: In testing it is often convenient to avoid asynchrony. To accomplish
+ * this with a debouncer, you can use `enqueueDebouncer` and
+ * `flush`. For example, extend the above example by adding
+ * `enqueueDebouncer(this._debounceJob)` at the end of the
+ * `_debounceWork` method. Then in a test, call `flush` to ensure
+ * the debouncer has completed.
+ *
+ * @param {Debouncer?} debouncer Debouncer object.
+ * @param {!AsyncInterface} asyncModule Object with Async interface
+ * @param {function()} callback Callback to run.
+ * @return {!Debouncer} Returns a debouncer object.
+ */
+ static debounce(debouncer, asyncModule, callback) {
+ if (debouncer instanceof Debouncer) {
+ debouncer.cancel();
+ } else {
+ debouncer = new Debouncer();
+ }
+ debouncer.setConfig(asyncModule, callback);
+ return debouncer;
+ }
+};
diff --git a/third_party/polymer3/bower_components/polymer/lib/utils/flattened-nodes-observer.js b/third_party/polymer3/bower_components/polymer/lib/utils/flattened-nodes-observer.js
new file mode 100644
index 0000000..7d522dc
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/lib/utils/flattened-nodes-observer.js
@@ -0,0 +1,304 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import './boot.js';
+
+import { calculateSplices } from './array-splice.js';
+import { microTask } from './async.js';
+
+/**
+ * Returns true if `node` is a slot element
+ * @param {Node} node Node to test.
+ * @return {boolean} Returns true if the given `node` is a slot
+ * @private
+ */
+function isSlot(node) {
+ return (node.localName === 'slot');
+}
+
+/**
+ * Class that listens for changes (additions or removals) to
+ * "flattened nodes" on a given `node`. The list of flattened nodes consists
+ * of a node's children and, for any children that are `<slot>` elements,
+ * the expanded flattened list of `assignedNodes`.
+ * For example, if the observed node has children `<a></a><slot></slot><b></b>`
+ * and the `<slot>` has one `<div>` assigned to it, then the flattened
+ * nodes list is `<a></a><div></div><b></b>`. If the `<slot>` has other
+ * `<slot>` elements assigned to it, these are flattened as well.
+ *
+ * The provided `callback` is called whenever any change to this list
+ * of flattened nodes occurs, where an addition or removal of a node is
+ * considered a change. The `callback` is called with one argument, an object
+ * containing an array of any `addedNodes` and `removedNodes`.
+ *
+ * Note: the callback is called asynchronous to any changes
+ * at a microtask checkpoint. This is because observation is performed using
+ * `MutationObserver` and the `<slot>` element's `slotchange` event which
+ * are asynchronous.
+ *
+ * An example:
+ * ```js
+ * class TestSelfObserve extends PolymerElement {
+ * static get is() { return 'test-self-observe';}
+ * connectedCallback() {
+ * super.connectedCallback();
+ * this._observer = new FlattenedNodesObserver(this, (info) => {
+ * this.info = info;
+ * });
+ * }
+ * disconnectedCallback() {
+ * super.disconnectedCallback();
+ * this._observer.disconnect();
+ * }
+ * }
+ * customElements.define(TestSelfObserve.is, TestSelfObserve);
+ * ```
+ *
+ * @summary Class that listens for changes (additions or removals) to
+ * "flattened nodes" on a given `node`.
+ */
+export class FlattenedNodesObserver {
+
+ /**
+ * Returns the list of flattened nodes for the given `node`.
+ * This list consists of a node's children and, for any children
+ * that are `<slot>` elements, the expanded flattened list of `assignedNodes`.
+ * For example, if the observed node has children `<a></a><slot></slot><b></b>`
+ * and the `<slot>` has one `<div>` assigned to it, then the flattened
+ * nodes list is `<a></a><div></div><b></b>`. If the `<slot>` has other
+ * `<slot>` elements assigned to it, these are flattened as well.
+ *
+ * @param {HTMLElement|HTMLSlotElement} node The node for which to return the list of flattened nodes.
+ * @return {Array} The list of flattened nodes for the given `node`.
+ */
+ static getFlattenedNodes(node) {
+ if (isSlot(node)) {
+ node = /** @type {HTMLSlotElement} */(node); // eslint-disable-line no-self-assign
+ return node.assignedNodes({flatten: true});
+ } else {
+ return Array.from(node.childNodes).map((node) => {
+ if (isSlot(node)) {
+ node = /** @type {HTMLSlotElement} */(node); // eslint-disable-line no-self-assign
+ return node.assignedNodes({flatten: true});
+ } else {
+ return [node];
+ }
+ }).reduce((a, b) => a.concat(b), []);
+ }
+ }
+
+ /**
+ * @param {Element} target Node on which to listen for changes.
+ * @param {?function(!Element, { target: !Element, addedNodes: !Array<!Element>, removedNodes: !Array<!Element> }):void} callback Function called when there are additions
+ * or removals from the target's list of flattened nodes.
+ */
+ constructor(target, callback) {
+ /**
+ * @type {MutationObserver}
+ * @private
+ */
+ this._shadyChildrenObserver = null;
+ /**
+ * @type {MutationObserver}
+ * @private
+ */
+ this._nativeChildrenObserver = null;
+ this._connected = false;
+ /**
+ * @type {Element}
+ * @private
+ */
+ this._target = target;
+ this.callback = callback;
+ this._effectiveNodes = [];
+ this._observer = null;
+ this._scheduled = false;
+ /**
+ * @type {function()}
+ * @private
+ */
+ this._boundSchedule = () => {
+ this._schedule();
+ };
+ this.connect();
+ this._schedule();
+ }
+
+ /**
+ * Activates an observer. This method is automatically called when
+ * a `FlattenedNodesObserver` is created. It should only be called to
+ * re-activate an observer that has been deactivated via the `disconnect` method.
+ *
+ * @return {void}
+ */
+ connect() {
+ if (isSlot(this._target)) {
+ this._listenSlots([this._target]);
+ } else if (this._target.children) {
+ this._listenSlots(this._target.children);
+ if (window.ShadyDOM) {
+ this._shadyChildrenObserver =
+ ShadyDOM.observeChildren(this._target, (mutations) => {
+ this._processMutations(mutations);
+ });
+ } else {
+ this._nativeChildrenObserver =
+ new MutationObserver((mutations) => {
+ this._processMutations(mutations);
+ });
+ this._nativeChildrenObserver.observe(this._target, {childList: true});
+ }
+ }
+ this._connected = true;
+ }
+
+ /**
+ * Deactivates the flattened nodes observer. After calling this method
+ * the observer callback will not be called when changes to flattened nodes
+ * occur. The `connect` method may be subsequently called to reactivate
+ * the observer.
+ *
+ * @return {void}
+ */
+ disconnect() {
+ if (isSlot(this._target)) {
+ this._unlistenSlots([this._target]);
+ } else if (this._target.children) {
+ this._unlistenSlots(this._target.children);
+ if (window.ShadyDOM && this._shadyChildrenObserver) {
+ ShadyDOM.unobserveChildren(this._shadyChildrenObserver);
+ this._shadyChildrenObserver = null;
+ } else if (this._nativeChildrenObserver) {
+ this._nativeChildrenObserver.disconnect();
+ this._nativeChildrenObserver = null;
+ }
+ }
+ this._connected = false;
+ }
+
+ /**
+ * @return {void}
+ * @private
+ */
+ _schedule() {
+ if (!this._scheduled) {
+ this._scheduled = true;
+ microTask.run(() => this.flush());
+ }
+ }
+
+ /**
+ * @param {Array<MutationRecord>} mutations Mutations signaled by the mutation observer
+ * @return {void}
+ * @private
+ */
+ _processMutations(mutations) {
+ this._processSlotMutations(mutations);
+ this.flush();
+ }
+
+ /**
+ * @param {Array<MutationRecord>} mutations Mutations signaled by the mutation observer
+ * @return {void}
+ * @private
+ */
+ _processSlotMutations(mutations) {
+ if (mutations) {
+ for (let i=0; i < mutations.length; i++) {
+ let mutation = mutations[i];
+ if (mutation.addedNodes) {
+ this._listenSlots(mutation.addedNodes);
+ }
+ if (mutation.removedNodes) {
+ this._unlistenSlots(mutation.removedNodes);
+ }
+ }
+ }
+ }
+
+ /**
+ * Flushes the observer causing any pending changes to be immediately
+ * delivered the observer callback. By default these changes are delivered
+ * asynchronously at the next microtask checkpoint.
+ *
+ * @return {boolean} Returns true if any pending changes caused the observer
+ * callback to run.
+ */
+ flush() {
+ if (!this._connected) {
+ return false;
+ }
+ if (window.ShadyDOM) {
+ ShadyDOM.flush();
+ }
+ if (this._nativeChildrenObserver) {
+ this._processSlotMutations(this._nativeChildrenObserver.takeRecords());
+ } else if (this._shadyChildrenObserver) {
+ this._processSlotMutations(this._shadyChildrenObserver.takeRecords());
+ }
+ this._scheduled = false;
+ let info = {
+ target: this._target,
+ addedNodes: [],
+ removedNodes: []
+ };
+ let newNodes = this.constructor.getFlattenedNodes(this._target);
+ let splices = calculateSplices(newNodes,
+ this._effectiveNodes);
+ // process removals
+ for (let i=0, s; (i<splices.length) && (s=splices[i]); i++) {
+ for (let j=0, n; (j < s.removed.length) && (n=s.removed[j]); j++) {
+ info.removedNodes.push(n);
+ }
+ }
+ // process adds
+ for (let i=0, s; (i<splices.length) && (s=splices[i]); i++) {
+ for (let j=s.index; j < s.index + s.addedCount; j++) {
+ info.addedNodes.push(newNodes[j]);
+ }
+ }
+ // update cache
+ this._effectiveNodes = newNodes;
+ let didFlush = false;
+ if (info.addedNodes.length || info.removedNodes.length) {
+ didFlush = true;
+ this.callback.call(this._target, info);
+ }
+ return didFlush;
+ }
+
+ /**
+ * @param {!Array<Element|Node>|!NodeList<Node>} nodeList Nodes that could change
+ * @return {void}
+ * @private
+ */
+ _listenSlots(nodeList) {
+ for (let i=0; i < nodeList.length; i++) {
+ let n = nodeList[i];
+ if (isSlot(n)) {
+ n.addEventListener('slotchange', this._boundSchedule);
+ }
+ }
+ }
+
+ /**
+ * @param {!Array<Element|Node>|!NodeList<Node>} nodeList Nodes that could change
+ * @return {void}
+ * @private
+ */
+ _unlistenSlots(nodeList) {
+ for (let i=0; i < nodeList.length; i++) {
+ let n = nodeList[i];
+ if (isSlot(n)) {
+ n.removeEventListener('slotchange', this._boundSchedule);
+ }
+ }
+ }
+
+}
diff --git a/third_party/polymer3/bower_components/polymer/lib/utils/flush.js b/third_party/polymer3/bower_components/polymer/lib/utils/flush.js
new file mode 100644
index 0000000..874eb0e
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/lib/utils/flush.js
@@ -0,0 +1,54 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import './boot.js';
+
+let debouncerQueue = [];
+
+/**
+ * Adds a `Debouncer` to a list of globally flushable tasks.
+ *
+ * @param {!Debouncer} debouncer Debouncer to enqueue
+ * @return {void}
+ */
+export const enqueueDebouncer = function(debouncer) {
+ debouncerQueue.push(debouncer);
+};
+
+function flushDebouncers() {
+ const didFlush = Boolean(debouncerQueue.length);
+ while (debouncerQueue.length) {
+ try {
+ debouncerQueue.shift().flush();
+ } catch(e) {
+ setTimeout(() => {
+ throw e;
+ });
+ }
+ }
+ return didFlush;
+}
+
+/**
+ * Forces several classes of asynchronously queued tasks to flush:
+ * - Debouncers added via `enqueueDebouncer`
+ * - ShadyDOM distribution
+ *
+ * @return {void}
+ */
+export const flush = function() {
+ let shadyDOM, debouncers;
+ do {
+ shadyDOM = window.ShadyDOM && ShadyDOM.flush();
+ if (window.ShadyCSS && window.ShadyCSS.ScopingShim) {
+ window.ShadyCSS.ScopingShim.flush();
+ }
+ debouncers = flushDebouncers();
+ } while (shadyDOM || debouncers);
+};
diff --git a/third_party/polymer3/bower_components/polymer/lib/utils/gestures.js b/third_party/polymer3/bower_components/polymer/lib/utils/gestures.js
new file mode 100644
index 0000000..c195032
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/lib/utils/gestures.js
@@ -0,0 +1,1081 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import './boot.js';
+
+import { timeOut, microTask } from './async.js';
+import { Debouncer } from './debounce.js';
+import { passiveTouchGestures } from './settings.js';
+
+// detect native touch action support
+let HAS_NATIVE_TA = typeof document.head.style.touchAction === 'string';
+let GESTURE_KEY = '__polymerGestures';
+let HANDLED_OBJ = '__polymerGesturesHandled';
+let TOUCH_ACTION = '__polymerGesturesTouchAction';
+// radius for tap and track
+let TAP_DISTANCE = 25;
+let TRACK_DISTANCE = 5;
+// number of last N track positions to keep
+let TRACK_LENGTH = 2;
+
+// Disabling "mouse" handlers for 2500ms is enough
+let MOUSE_TIMEOUT = 2500;
+let MOUSE_EVENTS = ['mousedown', 'mousemove', 'mouseup', 'click'];
+// an array of bitmask values for mapping MouseEvent.which to MouseEvent.buttons
+let MOUSE_WHICH_TO_BUTTONS = [0, 1, 4, 2];
+let MOUSE_HAS_BUTTONS = (function() {
+ try {
+ return new MouseEvent('test', {buttons: 1}).buttons === 1;
+ } catch (e) {
+ return false;
+ }
+})();
+
+/**
+ * @param {string} name Possible mouse event name
+ * @return {boolean} true if mouse event, false if not
+ */
+function isMouseEvent(name) {
+ return MOUSE_EVENTS.indexOf(name) > -1;
+}
+
+/* eslint no-empty: ["error", { "allowEmptyCatch": true }] */
+// check for passive event listeners
+let SUPPORTS_PASSIVE = false;
+(function() {
+ try {
+ let opts = Object.defineProperty({}, 'passive', {get() {SUPPORTS_PASSIVE = true;}});
+ window.addEventListener('test', null, opts);
+ window.removeEventListener('test', null, opts);
+ } catch(e) {}
+})();
+
+/**
+ * Generate settings for event listeners, dependant on `passiveTouchGestures`
+ *
+ * @param {string} eventName Event name to determine if `{passive}` option is
+ * needed
+ * @return {{passive: boolean} | undefined} Options to use for addEventListener
+ * and removeEventListener
+ */
+function PASSIVE_TOUCH(eventName) {
+ if (isMouseEvent(eventName) || eventName === 'touchend') {
+ return;
+ }
+ if (HAS_NATIVE_TA && SUPPORTS_PASSIVE && passiveTouchGestures) {
+ return {passive: true};
+ } else {
+ return;
+ }
+}
+
+// Check for touch-only devices
+let IS_TOUCH_ONLY = navigator.userAgent.match(/iP(?:[oa]d|hone)|Android/);
+
+let GestureRecognizer = function(){}; // eslint-disable-line no-unused-vars
+/** @type {function(): void} */
+GestureRecognizer.prototype.reset;
+/** @type {function(MouseEvent): void | undefined} */
+GestureRecognizer.prototype.mousedown;
+/** @type {(function(MouseEvent): void | undefined)} */
+GestureRecognizer.prototype.mousemove;
+/** @type {(function(MouseEvent): void | undefined)} */
+GestureRecognizer.prototype.mouseup;
+/** @type {(function(TouchEvent): void | undefined)} */
+GestureRecognizer.prototype.touchstart;
+/** @type {(function(TouchEvent): void | undefined)} */
+GestureRecognizer.prototype.touchmove;
+/** @type {(function(TouchEvent): void | undefined)} */
+GestureRecognizer.prototype.touchend;
+/** @type {(function(MouseEvent): void | undefined)} */
+GestureRecognizer.prototype.click;
+
+// keep track of any labels hit by the mouseCanceller
+/** @type {!Array<!HTMLLabelElement>} */
+const clickedLabels = [];
+
+/** @type {!Object<boolean>} */
+const labellable = {
+ 'button': true,
+ 'input': true,
+ 'keygen': true,
+ 'meter': true,
+ 'output': true,
+ 'textarea': true,
+ 'progress': true,
+ 'select': true
+};
+
+/**
+ * @param {HTMLElement} el Element to check labelling status
+ * @return {boolean} element can have labels
+ */
+function canBeLabelled(el) {
+ return labellable[el.localName] || false;
+}
+
+/**
+ * @param {HTMLElement} el Element that may be labelled.
+ * @return {!Array<!HTMLLabelElement>} Relevant label for `el`
+ */
+function matchingLabels(el) {
+ let labels = Array.prototype.slice.call(/** @type {HTMLInputElement} */(el).labels || []);
+ // IE doesn't have `labels` and Safari doesn't populate `labels`
+ // if element is in a shadowroot.
+ // In this instance, finding the non-ancestor labels is enough,
+ // as the mouseCancellor code will handle ancstor labels
+ if (!labels.length) {
+ labels = [];
+ let root = el.getRootNode();
+ // if there is an id on `el`, check for all labels with a matching `for` attribute
+ if (el.id) {
+ let matching = root.querySelectorAll(`label[for = ${el.id}]`);
+ for (let i = 0; i < matching.length; i++) {
+ labels.push(/** @type {!HTMLLabelElement} */(matching[i]));
+ }
+ }
+ }
+ return labels;
+}
+
+// touch will make synthetic mouse events
+// `preventDefault` on touchend will cancel them,
+// but this breaks `<input>` focus and link clicks
+// disable mouse handlers for MOUSE_TIMEOUT ms after
+// a touchend to ignore synthetic mouse events
+let mouseCanceller = function(mouseEvent) {
+ // Check for sourceCapabilities, used to distinguish synthetic events
+ // if mouseEvent did not come from a device that fires touch events,
+ // it was made by a real mouse and should be counted
+ // http://wicg.github.io/InputDeviceCapabilities/#dom-inputdevicecapabilities-firestouchevents
+ let sc = mouseEvent.sourceCapabilities;
+ if (sc && !sc.firesTouchEvents) {
+ return;
+ }
+ // skip synthetic mouse events
+ mouseEvent[HANDLED_OBJ] = {skip: true};
+ // disable "ghost clicks"
+ if (mouseEvent.type === 'click') {
+ let clickFromLabel = false;
+ let path = mouseEvent.composedPath && mouseEvent.composedPath();
+ if (path) {
+ for (let i = 0; i < path.length; i++) {
+ if (path[i].nodeType === Node.ELEMENT_NODE) {
+ if (path[i].localName === 'label') {
+ clickedLabels.push(path[i]);
+ } else if (canBeLabelled(path[i])) {
+ let ownerLabels = matchingLabels(path[i]);
+ // check if one of the clicked labels is labelling this element
+ for (let j = 0; j < ownerLabels.length; j++) {
+ clickFromLabel = clickFromLabel || clickedLabels.indexOf(ownerLabels[j]) > -1;
+ }
+ }
+ }
+ if (path[i] === POINTERSTATE.mouse.target) {
+ return;
+ }
+ }
+ }
+ // if one of the clicked labels was labelling the target element,
+ // this is not a ghost click
+ if (clickFromLabel) {
+ return;
+ }
+ mouseEvent.preventDefault();
+ mouseEvent.stopPropagation();
+ }
+};
+
+/**
+ * @param {boolean=} setup True to add, false to remove.
+ * @return {void}
+ */
+function setupTeardownMouseCanceller(setup) {
+ let events = IS_TOUCH_ONLY ? ['click'] : MOUSE_EVENTS;
+ for (let i = 0, en; i < events.length; i++) {
+ en = events[i];
+ if (setup) {
+ // reset clickLabels array
+ clickedLabels.length = 0;
+ document.addEventListener(en, mouseCanceller, true);
+ } else {
+ document.removeEventListener(en, mouseCanceller, true);
+ }
+ }
+}
+
+function ignoreMouse(e) {
+ if (!POINTERSTATE.mouse.mouseIgnoreJob) {
+ setupTeardownMouseCanceller(true);
+ }
+ let unset = function() {
+ setupTeardownMouseCanceller();
+ POINTERSTATE.mouse.target = null;
+ POINTERSTATE.mouse.mouseIgnoreJob = null;
+ };
+ POINTERSTATE.mouse.target = e.composedPath()[0];
+ POINTERSTATE.mouse.mouseIgnoreJob = Debouncer.debounce(
+ POINTERSTATE.mouse.mouseIgnoreJob
+ , timeOut.after(MOUSE_TIMEOUT)
+ , unset);
+}
+
+/**
+ * @param {MouseEvent} ev event to test for left mouse button down
+ * @return {boolean} has left mouse button down
+ */
+function hasLeftMouseButton(ev) {
+ let type = ev.type;
+ // exit early if the event is not a mouse event
+ if (!isMouseEvent(type)) {
+ return false;
+ }
+ // ev.button is not reliable for mousemove (0 is overloaded as both left button and no buttons)
+ // instead we use ev.buttons (bitmask of buttons) or fall back to ev.which (deprecated, 0 for no buttons, 1 for left button)
+ if (type === 'mousemove') {
+ // allow undefined for testing events
+ let buttons = ev.buttons === undefined ? 1 : ev.buttons;
+ if ((ev instanceof window.MouseEvent) && !MOUSE_HAS_BUTTONS) {
+ buttons = MOUSE_WHICH_TO_BUTTONS[ev.which] || 0;
+ }
+ // buttons is a bitmask, check that the left button bit is set (1)
+ return Boolean(buttons & 1);
+ } else {
+ // allow undefined for testing events
+ let button = ev.button === undefined ? 0 : ev.button;
+ // ev.button is 0 in mousedown/mouseup/click for left button activation
+ return button === 0;
+ }
+}
+
+function isSyntheticClick(ev) {
+ if (ev.type === 'click') {
+ // ev.detail is 0 for HTMLElement.click in most browsers
+ if (ev.detail === 0) {
+ return true;
+ }
+ // in the worst case, check that the x/y position of the click is within
+ // the bounding box of the target of the event
+ // Thanks IE 10 >:(
+ let t = _findOriginalTarget(ev);
+ // make sure the target of the event is an element so we can use getBoundingClientRect,
+ // if not, just assume it is a synthetic click
+ if (!t.nodeType || /** @type {Element} */(t).nodeType !== Node.ELEMENT_NODE) {
+ return true;
+ }
+ let bcr = /** @type {Element} */(t).getBoundingClientRect();
+ // use page x/y to account for scrolling
+ let x = ev.pageX, y = ev.pageY;
+ // ev is a synthetic click if the position is outside the bounding box of the target
+ return !((x >= bcr.left && x <= bcr.right) && (y >= bcr.top && y <= bcr.bottom));
+ }
+ return false;
+}
+
+let POINTERSTATE = {
+ mouse: {
+ target: null,
+ mouseIgnoreJob: null
+ },
+ touch: {
+ x: 0,
+ y: 0,
+ id: -1,
+ scrollDecided: false
+ }
+};
+
+function firstTouchAction(ev) {
+ let ta = 'auto';
+ let path = ev.composedPath && ev.composedPath();
+ if (path) {
+ for (let i = 0, n; i < path.length; i++) {
+ n = path[i];
+ if (n[TOUCH_ACTION]) {
+ ta = n[TOUCH_ACTION];
+ break;
+ }
+ }
+ }
+ return ta;
+}
+
+function trackDocument(stateObj, movefn, upfn) {
+ stateObj.movefn = movefn;
+ stateObj.upfn = upfn;
+ document.addEventListener('mousemove', movefn);
+ document.addEventListener('mouseup', upfn);
+}
+
+function untrackDocument(stateObj) {
+ document.removeEventListener('mousemove', stateObj.movefn);
+ document.removeEventListener('mouseup', stateObj.upfn);
+ stateObj.movefn = null;
+ stateObj.upfn = null;
+}
+
+// use a document-wide touchend listener to start the ghost-click prevention mechanism
+// Use passive event listeners, if supported, to not affect scrolling performance
+document.addEventListener('touchend', ignoreMouse, SUPPORTS_PASSIVE ? {passive: true} : false);
+
+/**
+ * Module for adding listeners to a node for the following normalized
+ * cross-platform "gesture" events:
+ * - `down` - mouse or touch went down
+ * - `up` - mouse or touch went up
+ * - `tap` - mouse click or finger tap
+ * - `track` - mouse drag or touch move
+ *
+ * @summary Module for adding cross-platform gesture event listeners.
+ */
+`TODO(modulizer): A namespace named Polymer.Gestures was
+declared here. The surrounding comments should be reviewed,
+and this string can then be deleted`;
+
+export const gestures = {};
+export const recognizers = [];
+
+/**
+ * Finds the element rendered on the screen at the provided coordinates.
+ *
+ * Similar to `document.elementFromPoint`, but pierces through
+ * shadow roots.
+ *
+ * @param {number} x Horizontal pixel coordinate
+ * @param {number} y Vertical pixel coordinate
+ * @return {Element} Returns the deepest shadowRoot inclusive element
+ * found at the screen position given.
+ */
+export function deepTargetFind(x, y) {
+ let node = document.elementFromPoint(x, y);
+ let next = node;
+ // this code path is only taken when native ShadowDOM is used
+ // if there is a shadowroot, it may have a node at x/y
+ // if there is not a shadowroot, exit the loop
+ while (next && next.shadowRoot && !window.ShadyDOM) {
+ // if there is a node at x/y in the shadowroot, look deeper
+ let oldNext = next;
+ next = next.shadowRoot.elementFromPoint(x, y);
+ // on Safari, elementFromPoint may return the shadowRoot host
+ if (oldNext === next) {
+ break;
+ }
+ if (next) {
+ node = next;
+ }
+ }
+ return node;
+}
+
+/**
+ * a cheaper check than ev.composedPath()[0];
+ *
+ * @private
+ * @param {Event} ev Event.
+ * @return {EventTarget} Returns the event target.
+ */
+function _findOriginalTarget(ev) {
+ // shadowdom
+ if (ev.composedPath) {
+ const targets = /** @type {!Array<!EventTarget>} */(ev.composedPath());
+ // It shouldn't be, but sometimes targets is empty (window on Safari).
+ return targets.length > 0 ? targets[0] : ev.target;
+ }
+ // shadydom
+ return ev.target;
+}
+
+/**
+ * @private
+ * @param {Event} ev Event.
+ * @return {void}
+ */
+function _handleNative(ev) {
+ let handled;
+ let type = ev.type;
+ let node = ev.currentTarget;
+ let gobj = node[GESTURE_KEY];
+ if (!gobj) {
+ return;
+ }
+ let gs = gobj[type];
+ if (!gs) {
+ return;
+ }
+ if (!ev[HANDLED_OBJ]) {
+ ev[HANDLED_OBJ] = {};
+ if (type.slice(0, 5) === 'touch') {
+ ev = /** @type {TouchEvent} */(ev); // eslint-disable-line no-self-assign
+ let t = ev.changedTouches[0];
+ if (type === 'touchstart') {
+ // only handle the first finger
+ if (ev.touches.length === 1) {
+ POINTERSTATE.touch.id = t.identifier;
+ }
+ }
+ if (POINTERSTATE.touch.id !== t.identifier) {
+ return;
+ }
+ if (!HAS_NATIVE_TA) {
+ if (type === 'touchstart' || type === 'touchmove') {
+ _handleTouchAction(ev);
+ }
+ }
+ }
+ }
+ handled = ev[HANDLED_OBJ];
+ // used to ignore synthetic mouse events
+ if (handled.skip) {
+ return;
+ }
+ // reset recognizer state
+ for (let i = 0, r; i < recognizers.length; i++) {
+ r = recognizers[i];
+ if (gs[r.name] && !handled[r.name]) {
+ if (r.flow && r.flow.start.indexOf(ev.type) > -1 && r.reset) {
+ r.reset();
+ }
+ }
+ }
+ // enforce gesture recognizer order
+ for (let i = 0, r; i < recognizers.length; i++) {
+ r = recognizers[i];
+ if (gs[r.name] && !handled[r.name]) {
+ handled[r.name] = true;
+ r[type](ev);
+ }
+ }
+}
+
+/**
+ * @private
+ * @param {TouchEvent} ev Event.
+ * @return {void}
+ */
+function _handleTouchAction(ev) {
+ let t = ev.changedTouches[0];
+ let type = ev.type;
+ if (type === 'touchstart') {
+ POINTERSTATE.touch.x = t.clientX;
+ POINTERSTATE.touch.y = t.clientY;
+ POINTERSTATE.touch.scrollDecided = false;
+ } else if (type === 'touchmove') {
+ if (POINTERSTATE.touch.scrollDecided) {
+ return;
+ }
+ POINTERSTATE.touch.scrollDecided = true;
+ let ta = firstTouchAction(ev);
+ let prevent = false;
+ let dx = Math.abs(POINTERSTATE.touch.x - t.clientX);
+ let dy = Math.abs(POINTERSTATE.touch.y - t.clientY);
+ if (!ev.cancelable) {
+ // scrolling is happening
+ } else if (ta === 'none') {
+ prevent = true;
+ } else if (ta === 'pan-x') {
+ prevent = dy > dx;
+ } else if (ta === 'pan-y') {
+ prevent = dx > dy;
+ }
+ if (prevent) {
+ ev.preventDefault();
+ } else {
+ prevent('track');
+ }
+ }
+}
+
+/**
+ * Adds an event listener to a node for the given gesture type.
+ *
+ * @param {!Node} node Node to add listener on
+ * @param {string} evType Gesture type: `down`, `up`, `track`, or `tap`
+ * @param {!function(!Event):void} handler Event listener function to call
+ * @return {boolean} Returns true if a gesture event listener was added.
+ * @this {Gestures}
+ */
+export function addListener(node, evType, handler) {
+ if (gestures[evType]) {
+ _add(node, evType, handler);
+ return true;
+ }
+ return false;
+}
+
+/**
+ * Removes an event listener from a node for the given gesture type.
+ *
+ * @param {!Node} node Node to remove listener from
+ * @param {string} evType Gesture type: `down`, `up`, `track`, or `tap`
+ * @param {!function(!Event):void} handler Event listener function previously passed to
+ * `addListener`.
+ * @return {boolean} Returns true if a gesture event listener was removed.
+ * @this {Gestures}
+ */
+export function removeListener(node, evType, handler) {
+ if (gestures[evType]) {
+ _remove(node, evType, handler);
+ return true;
+ }
+ return false;
+}
+
+/**
+ * automate the event listeners for the native events
+ *
+ * @private
+ * @param {!HTMLElement} node Node on which to add the event.
+ * @param {string} evType Event type to add.
+ * @param {function(!Event)} handler Event handler function.
+ * @return {void}
+ * @this {Gestures}
+ */
+function _add(node, evType, handler) {
+ let recognizer = gestures[evType];
+ let deps = recognizer.deps;
+ let name = recognizer.name;
+ let gobj = node[GESTURE_KEY];
+ if (!gobj) {
+ node[GESTURE_KEY] = gobj = {};
+ }
+ for (let i = 0, dep, gd; i < deps.length; i++) {
+ dep = deps[i];
+ // don't add mouse handlers on iOS because they cause gray selection overlays
+ if (IS_TOUCH_ONLY && isMouseEvent(dep) && dep !== 'click') {
+ continue;
+ }
+ gd = gobj[dep];
+ if (!gd) {
+ gobj[dep] = gd = {_count: 0};
+ }
+ if (gd._count === 0) {
+ node.addEventListener(dep, _handleNative, PASSIVE_TOUCH(dep));
+ }
+ gd[name] = (gd[name] || 0) + 1;
+ gd._count = (gd._count || 0) + 1;
+ }
+ node.addEventListener(evType, handler);
+ if (recognizer.touchAction) {
+ setTouchAction(node, recognizer.touchAction);
+ }
+}
+
+/**
+ * automate event listener removal for native events
+ *
+ * @private
+ * @param {!HTMLElement} node Node on which to remove the event.
+ * @param {string} evType Event type to remove.
+ * @param {function(Event?)} handler Event handler function.
+ * @return {void}
+ * @this {Gestures}
+ */
+function _remove(node, evType, handler) {
+ let recognizer = gestures[evType];
+ let deps = recognizer.deps;
+ let name = recognizer.name;
+ let gobj = node[GESTURE_KEY];
+ if (gobj) {
+ for (let i = 0, dep, gd; i < deps.length; i++) {
+ dep = deps[i];
+ gd = gobj[dep];
+ if (gd && gd[name]) {
+ gd[name] = (gd[name] || 1) - 1;
+ gd._count = (gd._count || 1) - 1;
+ if (gd._count === 0) {
+ node.removeEventListener(dep, _handleNative, PASSIVE_TOUCH(dep));
+ }
+ }
+ }
+ }
+ node.removeEventListener(evType, handler);
+}
+
+/**
+ * Registers a new gesture event recognizer for adding new custom
+ * gesture event types.
+ *
+ * @param {!GestureRecognizer} recog Gesture recognizer descriptor
+ * @return {void}
+ * @this {Gestures}
+ */
+export function register(recog) {
+ recognizers.push(recog);
+ for (let i = 0; i < recog.emits.length; i++) {
+ gestures[recog.emits[i]] = recog;
+ }
+}
+
+/**
+ * @private
+ * @param {string} evName Event name.
+ * @return {Object} Returns the gesture for the given event name.
+ * @this {Gestures}
+ */
+function _findRecognizerByEvent(evName) {
+ for (let i = 0, r; i < recognizers.length; i++) {
+ r = recognizers[i];
+ for (let j = 0, n; j < r.emits.length; j++) {
+ n = r.emits[j];
+ if (n === evName) {
+ return r;
+ }
+ }
+ }
+ return null;
+}
+
+/**
+ * Sets scrolling direction on node.
+ *
+ * This value is checked on first move, thus it should be called prior to
+ * adding event listeners.
+ *
+ * @param {!Element} node Node to set touch action setting on
+ * @param {string} value Touch action value
+ * @return {void}
+ */
+export function setTouchAction(node, value) {
+ if (HAS_NATIVE_TA) {
+ // NOTE: add touchAction async so that events can be added in
+ // custom element constructors. Otherwise we run afoul of custom
+ // elements restriction against settings attributes (style) in the
+ // constructor.
+ microTask.run(() => {
+ node.style.touchAction = value;
+ });
+ }
+ node[TOUCH_ACTION] = value;
+}
+
+/**
+ * Dispatches an event on the `target` element of `type` with the given
+ * `detail`.
+ * @private
+ * @param {!EventTarget} target The element on which to fire an event.
+ * @param {string} type The type of event to fire.
+ * @param {!Object=} detail The detail object to populate on the event.
+ * @return {void}
+ */
+function _fire(target, type, detail) {
+ let ev = new Event(type, { bubbles: true, cancelable: true, composed: true });
+ ev.detail = detail;
+ target.dispatchEvent(ev);
+ // forward `preventDefault` in a clean way
+ if (ev.defaultPrevented) {
+ let preventer = detail.preventer || detail.sourceEvent;
+ if (preventer && preventer.preventDefault) {
+ preventer.preventDefault();
+ }
+ }
+}
+
+/**
+ * Prevents the dispatch and default action of the given event name.
+ *
+ * @param {string} evName Event name.
+ * @return {void}
+ * @this {Gestures}
+ */
+export function prevent(evName) {
+ let recognizer = _findRecognizerByEvent(evName);
+ if (recognizer.info) {
+ recognizer.info.prevent = true;
+ }
+}
+
+/**
+ * Reset the 2500ms timeout on processing mouse input after detecting touch input.
+ *
+ * Touch inputs create synthesized mouse inputs anywhere from 0 to 2000ms after the touch.
+ * This method should only be called during testing with simulated touch inputs.
+ * Calling this method in production may cause duplicate taps or other Gestures.
+ *
+ * @return {void}
+ */
+export function resetMouseCanceller() {
+ if (POINTERSTATE.mouse.mouseIgnoreJob) {
+ POINTERSTATE.mouse.mouseIgnoreJob.flush();
+ }
+}
+
+/* eslint-disable valid-jsdoc */
+
+register({
+ name: 'downup',
+ deps: ['mousedown', 'touchstart', 'touchend'],
+ flow: {
+ start: ['mousedown', 'touchstart'],
+ end: ['mouseup', 'touchend']
+ },
+ emits: ['down', 'up'],
+
+ info: {
+ movefn: null,
+ upfn: null
+ },
+
+ /**
+ * @this {GestureRecognizer}
+ * @return {void}
+ */
+ reset: function() {
+ untrackDocument(this.info);
+ },
+
+ /**
+ * @this {GestureRecognizer}
+ * @param {MouseEvent} e
+ * @return {void}
+ */
+ mousedown: function(e) {
+ if (!hasLeftMouseButton(e)) {
+ return;
+ }
+ let t = _findOriginalTarget(e);
+ let self = this;
+ let movefn = function movefn(e) {
+ if (!hasLeftMouseButton(e)) {
+ self._fire('up', t, e);
+ untrackDocument(self.info);
+ }
+ };
+ let upfn = function upfn(e) {
+ if (hasLeftMouseButton(e)) {
+ self._fire('up', t, e);
+ }
+ untrackDocument(self.info);
+ };
+ trackDocument(this.info, movefn, upfn);
+ this._fire('down', t, e);
+ },
+ /**
+ * @this {GestureRecognizer}
+ * @param {TouchEvent} e
+ * @return {void}
+ */
+ touchstart: function(e) {
+ this._fire('down', _findOriginalTarget(e), e.changedTouches[0], e);
+ },
+ /**
+ * @this {GestureRecognizer}
+ * @param {TouchEvent} e
+ * @return {void}
+ */
+ touchend: function(e) {
+ this._fire('up', _findOriginalTarget(e), e.changedTouches[0], e);
+ },
+ /**
+ * @param {string} type
+ * @param {!EventTarget} target
+ * @param {Event} event
+ * @param {Function} preventer
+ * @return {void}
+ */
+ _fire: function(type, target, event, preventer) {
+ _fire(target, type, {
+ x: event.clientX,
+ y: event.clientY,
+ sourceEvent: event,
+ preventer: preventer,
+ prevent: function(e) {
+ return prevent(e);
+ }
+ });
+ }
+});
+
+register({
+ name: 'track',
+ touchAction: 'none',
+ deps: ['mousedown', 'touchstart', 'touchmove', 'touchend'],
+ flow: {
+ start: ['mousedown', 'touchstart'],
+ end: ['mouseup', 'touchend']
+ },
+ emits: ['track'],
+
+ info: {
+ x: 0,
+ y: 0,
+ state: 'start',
+ started: false,
+ moves: [],
+ /** @this {GestureRecognizer} */
+ addMove: function(move) {
+ if (this.moves.length > TRACK_LENGTH) {
+ this.moves.shift();
+ }
+ this.moves.push(move);
+ },
+ movefn: null,
+ upfn: null,
+ prevent: false
+ },
+
+ /**
+ * @this {GestureRecognizer}
+ * @return {void}
+ */
+ reset: function() {
+ this.info.state = 'start';
+ this.info.started = false;
+ this.info.moves = [];
+ this.info.x = 0;
+ this.info.y = 0;
+ this.info.prevent = false;
+ untrackDocument(this.info);
+ },
+
+ /**
+ * @this {GestureRecognizer}
+ * @param {number} x
+ * @param {number} y
+ * @return {boolean}
+ */
+ hasMovedEnough: function(x, y) {
+ if (this.info.prevent) {
+ return false;
+ }
+ if (this.info.started) {
+ return true;
+ }
+ let dx = Math.abs(this.info.x - x);
+ let dy = Math.abs(this.info.y - y);
+ return (dx >= TRACK_DISTANCE || dy >= TRACK_DISTANCE);
+ },
+ /**
+ * @this {GestureRecognizer}
+ * @param {MouseEvent} e
+ * @return {void}
+ */
+ mousedown: function(e) {
+ if (!hasLeftMouseButton(e)) {
+ return;
+ }
+ let t = _findOriginalTarget(e);
+ let self = this;
+ let movefn = function movefn(e) {
+ let x = e.clientX, y = e.clientY;
+ if (self.hasMovedEnough(x, y)) {
+ // first move is 'start', subsequent moves are 'move', mouseup is 'end'
+ self.info.state = self.info.started ? (e.type === 'mouseup' ? 'end' : 'track') : 'start';
+ if (self.info.state === 'start') {
+ // if and only if tracking, always prevent tap
+ prevent('tap');
+ }
+ self.info.addMove({x: x, y: y});
+ if (!hasLeftMouseButton(e)) {
+ // always _fire "end"
+ self.info.state = 'end';
+ untrackDocument(self.info);
+ }
+ self._fire(t, e);
+ self.info.started = true;
+ }
+ };
+ let upfn = function upfn(e) {
+ if (self.info.started) {
+ movefn(e);
+ }
+
+ // remove the temporary listeners
+ untrackDocument(self.info);
+ };
+ // add temporary document listeners as mouse retargets
+ trackDocument(this.info, movefn, upfn);
+ this.info.x = e.clientX;
+ this.info.y = e.clientY;
+ },
+ /**
+ * @this {GestureRecognizer}
+ * @param {TouchEvent} e
+ * @return {void}
+ */
+ touchstart: function(e) {
+ let ct = e.changedTouches[0];
+ this.info.x = ct.clientX;
+ this.info.y = ct.clientY;
+ },
+ /**
+ * @this {GestureRecognizer}
+ * @param {TouchEvent} e
+ * @return {void}
+ */
+ touchmove: function(e) {
+ let t = _findOriginalTarget(e);
+ let ct = e.changedTouches[0];
+ let x = ct.clientX, y = ct.clientY;
+ if (this.hasMovedEnough(x, y)) {
+ if (this.info.state === 'start') {
+ // if and only if tracking, always prevent tap
+ prevent('tap');
+ }
+ this.info.addMove({x: x, y: y});
+ this._fire(t, ct);
+ this.info.state = 'track';
+ this.info.started = true;
+ }
+ },
+ /**
+ * @this {GestureRecognizer}
+ * @param {TouchEvent} e
+ * @return {void}
+ */
+ touchend: function(e) {
+ let t = _findOriginalTarget(e);
+ let ct = e.changedTouches[0];
+ // only trackend if track was started and not aborted
+ if (this.info.started) {
+ // reset started state on up
+ this.info.state = 'end';
+ this.info.addMove({x: ct.clientX, y: ct.clientY});
+ this._fire(t, ct, e);
+ }
+ },
+
+ /**
+ * @this {GestureRecognizer}
+ * @param {!EventTarget} target
+ * @param {Touch} touch
+ * @return {void}
+ */
+ _fire: function(target, touch) {
+ let secondlast = this.info.moves[this.info.moves.length - 2];
+ let lastmove = this.info.moves[this.info.moves.length - 1];
+ let dx = lastmove.x - this.info.x;
+ let dy = lastmove.y - this.info.y;
+ let ddx, ddy = 0;
+ if (secondlast) {
+ ddx = lastmove.x - secondlast.x;
+ ddy = lastmove.y - secondlast.y;
+ }
+ _fire(target, 'track', {
+ state: this.info.state,
+ x: touch.clientX,
+ y: touch.clientY,
+ dx: dx,
+ dy: dy,
+ ddx: ddx,
+ ddy: ddy,
+ sourceEvent: touch,
+ hover: function() {
+ return deepTargetFind(touch.clientX, touch.clientY);
+ }
+ });
+ }
+
+});
+
+register({
+ name: 'tap',
+ deps: ['mousedown', 'click', 'touchstart', 'touchend'],
+ flow: {
+ start: ['mousedown', 'touchstart'],
+ end: ['click', 'touchend']
+ },
+ emits: ['tap'],
+ info: {
+ x: NaN,
+ y: NaN,
+ prevent: false
+ },
+ /**
+ * @this {GestureRecognizer}
+ * @return {void}
+ */
+ reset: function() {
+ this.info.x = NaN;
+ this.info.y = NaN;
+ this.info.prevent = false;
+ },
+ /**
+ * @this {GestureRecognizer}
+ * @param {MouseEvent} e
+ * @return {void}
+ */
+ save: function(e) {
+ this.info.x = e.clientX;
+ this.info.y = e.clientY;
+ },
+ /**
+ * @this {GestureRecognizer}
+ * @param {MouseEvent} e
+ * @return {void}
+ */
+ mousedown: function(e) {
+ if (hasLeftMouseButton(e)) {
+ this.save(e);
+ }
+ },
+ /**
+ * @this {GestureRecognizer}
+ * @param {MouseEvent} e
+ * @return {void}
+ */
+ click: function(e) {
+ if (hasLeftMouseButton(e)) {
+ this.forward(e);
+ }
+ },
+ /**
+ * @this {GestureRecognizer}
+ * @param {TouchEvent} e
+ * @return {void}
+ */
+ touchstart: function(e) {
+ this.save(e.changedTouches[0], e);
+ },
+ /**
+ * @this {GestureRecognizer}
+ * @param {TouchEvent} e
+ * @return {void}
+ */
+ touchend: function(e) {
+ this.forward(e.changedTouches[0], e);
+ },
+ /**
+ * @this {GestureRecognizer}
+ * @param {Event | Touch} e
+ * @param {Event=} preventer
+ * @return {void}
+ */
+ forward: function(e, preventer) {
+ let dx = Math.abs(e.clientX - this.info.x);
+ let dy = Math.abs(e.clientY - this.info.y);
+ // find original target from `preventer` for TouchEvents, or `e` for MouseEvents
+ let t = _findOriginalTarget((preventer || e));
+ if (!t || t.disabled) {
+ return;
+ }
+ // dx,dy can be NaN if `click` has been simulated and there was no `down` for `start`
+ if (isNaN(dx) || isNaN(dy) || (dx <= TAP_DISTANCE && dy <= TAP_DISTANCE) || isSyntheticClick(e)) {
+ // prevent taps from being generated if an event has canceled them
+ if (!this.info.prevent) {
+ _fire(t, 'tap', {
+ x: e.clientX,
+ y: e.clientY,
+ sourceEvent: e,
+ preventer: preventer
+ });
+ }
+ }
+ }
+});
+
+/* eslint-enable valid-jsdoc */
+
+/** @deprecated */
+export const findOriginalTarget = _findOriginalTarget;
+
+/** @deprecated */
+export const add = addListener;
+
+/** @deprecated */
+export const remove = removeListener;
diff --git a/third_party/polymer3/bower_components/polymer/lib/utils/html-tag.js b/third_party/polymer3/bower_components/polymer/lib/utils/html-tag.js
new file mode 100644
index 0000000..d564062
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/lib/utils/html-tag.js
@@ -0,0 +1,127 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import './boot.js';
+
+/**
+ * Class representing a static string value which can be used to filter
+ * strings by asseting that they have been created via this class. The
+ * `value` property returns the string passed to the constructor.
+ */
+class LiteralString {
+ constructor(string) {
+ /** @type {string} */
+ this.value = string.toString();
+ }
+ /**
+ * @return {string} LiteralString string value
+ */
+ toString() {
+ return this.value;
+ }
+}
+
+/**
+ * @param {*} value Object to stringify into HTML
+ * @return {string} HTML stringified form of `obj`
+ */
+function literalValue(value) {
+ if (value instanceof LiteralString) {
+ return /** @type {!LiteralString} */(value).value;
+ } else {
+ throw new Error(
+ `non-literal value passed to Polymer's htmlLiteral function: ${value}`
+ );
+ }
+}
+
+/**
+ * @param {*} value Object to stringify into HTML
+ * @return {string} HTML stringified form of `obj`
+ */
+function htmlValue(value) {
+ if (value instanceof HTMLTemplateElement) {
+ return /** @type {!HTMLTemplateElement } */(value).innerHTML;
+ } else if (value instanceof LiteralString) {
+ return literalValue(value);
+ } else {
+ throw new Error(
+ `non-template value passed to Polymer's html function: ${value}`);
+ }
+}
+
+/**
+ * A template literal tag that creates an HTML <template> element from the
+ * contents of the string.
+ *
+ * This allows you to write a Polymer Template in JavaScript.
+ *
+ * Templates can be composed by interpolating `HTMLTemplateElement`s in
+ * expressions in the JavaScript template literal. The nested template's
+ * `innerHTML` is included in the containing template. The only other
+ * values allowed in expressions are those returned from `htmlLiteral`
+ * which ensures only literal values from JS source ever reach the HTML, to
+ * guard against XSS risks.
+ *
+ * All other values are disallowed in expressions to help prevent XSS
+ * attacks; however, `htmlLiteral` can be used to compose static
+ * string values into templates. This is useful to compose strings into
+ * places that do not accept html, like the css text of a `style`
+ * element.
+ *
+ * Example:
+ *
+ * static get template() {
+ * return html`
+ * <style>:host{ content:"..." }</style>
+ * <div class="shadowed">${this.partialTemplate}</div>
+ * ${super.template}
+ * `;
+ * }
+ * static get partialTemplate() { return html`<span>Partial!</span>`; }
+ *
+ * @param {!ITemplateArray} strings Constant parts of tagged template literal
+ * @param {...*} values Variable parts of tagged template literal
+ * @return {!HTMLTemplateElement} Constructed HTMLTemplateElement
+ */
+export const html = function html(strings, ...values) {
+ const template = /** @type {!HTMLTemplateElement} */(document.createElement('template'));
+ template.innerHTML = values.reduce((acc, v, idx) =>
+ acc + htmlValue(v) + strings[idx + 1], strings[0]);
+ return template;
+};
+
+/**
+ * An html literal tag that can be used with `html` to compose.
+ * a literal string.
+ *
+ * Example:
+ *
+ * static get template() {
+ * return html`
+ * <style>
+ * :host { display: block; }
+ * ${this.styleTemplate()}
+ * </style>
+ * <div class="shadowed">${staticValue}</div>
+ * ${super.template}
+ * `;
+ * }
+ * static get styleTemplate() {
+ * return htmlLiteral`.shadowed { background: gray; }`;
+ * }
+ *
+ * @param {!ITemplateArray} strings Constant parts of tagged template literal
+ * @param {...*} values Variable parts of tagged template literal
+ * @return {!LiteralString} Constructed literal string
+ */
+export const htmlLiteral = function(strings, ...values) {
+ return new LiteralString(values.reduce((acc, v, idx) =>
+ acc + literalValue(v) + strings[idx + 1], strings[0]));
+};
diff --git a/third_party/polymer3/bower_components/polymer/lib/utils/mixin.js b/third_party/polymer3/bower_components/polymer/lib/utils/mixin.js
new file mode 100644
index 0000000..45bf64f
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/lib/utils/mixin.js
@@ -0,0 +1,66 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import './boot.js';
+
+// unique global id for deduping mixins.
+let dedupeId = 0;
+
+/**
+ * @constructor
+ * @extends {Function}
+ */
+function MixinFunction(){}
+/** @type {(WeakMap | undefined)} */
+MixinFunction.prototype.__mixinApplications;
+/** @type {(Object | undefined)} */
+MixinFunction.prototype.__mixinSet;
+
+/* eslint-disable valid-jsdoc */
+/**
+ * Wraps an ES6 class expression mixin such that the mixin is only applied
+ * if it has not already been applied its base argument. Also memoizes mixin
+ * applications.
+ *
+ * @template T
+ * @param {T} mixin ES6 class expression mixin to wrap
+ * @return {T}
+ * @suppress {invalidCasts}
+ */
+export const dedupingMixin = function(mixin) {
+ let mixinApplications = /** @type {!MixinFunction} */(mixin).__mixinApplications;
+ if (!mixinApplications) {
+ mixinApplications = new WeakMap();
+ /** @type {!MixinFunction} */(mixin).__mixinApplications = mixinApplications;
+ }
+ // maintain a unique id for each mixin
+ let mixinDedupeId = dedupeId++;
+ function dedupingMixin(base) {
+ let baseSet = /** @type {!MixinFunction} */(base).__mixinSet;
+ if (baseSet && baseSet[mixinDedupeId]) {
+ return base;
+ }
+ let map = mixinApplications;
+ let extended = map.get(base);
+ if (!extended) {
+ extended = /** @type {!Function} */(mixin)(base);
+ map.set(base, extended);
+ }
+ // copy inherited mixin set from the extended class, or the base class
+ // NOTE: we avoid use of Set here because some browser (IE11)
+ // cannot extend a base Set via the constructor.
+ let mixinSet = Object.create(/** @type {!MixinFunction} */(extended).__mixinSet || baseSet || null);
+ mixinSet[mixinDedupeId] = true;
+ /** @type {!MixinFunction} */(extended).__mixinSet = mixinSet;
+ return extended;
+ }
+
+ return /** @type {T} */ (dedupingMixin);
+};
+/* eslint-enable valid-jsdoc */
diff --git a/third_party/polymer3/bower_components/polymer/lib/utils/path.js b/third_party/polymer3/bower_components/polymer/lib/utils/path.js
new file mode 100644
index 0000000..7929269
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/lib/utils/path.js
@@ -0,0 +1,262 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import './boot.js';
+
+/**
+ * Module with utilities for manipulating structured data path strings.
+ *
+ * @summary Module with utilities for manipulating structured data path strings.
+ */
+`TODO(modulizer): A namespace named Polymer.Path was
+declared here. The surrounding comments should be reviewed,
+and this string can then be deleted`;
+
+/**
+ * Returns true if the given string is a structured data path (has dots).
+ *
+ * Example:
+ *
+ * ```
+ * isPath('foo.bar.baz') // true
+ * isPath('foo') // false
+ * ```
+ *
+ * @param {string} path Path string
+ * @return {boolean} True if the string contained one or more dots
+ */
+export function isPath(path) {
+ return path.indexOf('.') >= 0;
+}
+
+/**
+ * Returns the root property name for the given path.
+ *
+ * Example:
+ *
+ * ```
+ * root('foo.bar.baz') // 'foo'
+ * root('foo') // 'foo'
+ * ```
+ *
+ * @param {string} path Path string
+ * @return {string} Root property name
+ */
+export function root(path) {
+ let dotIndex = path.indexOf('.');
+ if (dotIndex === -1) {
+ return path;
+ }
+ return path.slice(0, dotIndex);
+}
+
+/**
+ * Given `base` is `foo.bar`, `foo` is an ancestor, `foo.bar` is not
+ * Returns true if the given path is an ancestor of the base path.
+ *
+ * Example:
+ *
+ * ```
+ * isAncestor('foo.bar', 'foo') // true
+ * isAncestor('foo.bar', 'foo.bar') // false
+ * isAncestor('foo.bar', 'foo.bar.baz') // false
+ * ```
+ *
+ * @param {string} base Path string to test against.
+ * @param {string} path Path string to test.
+ * @return {boolean} True if `path` is an ancestor of `base`.
+ */
+export function isAncestor(base, path) {
+ // base.startsWith(path + '.');
+ return base.indexOf(path + '.') === 0;
+}
+
+/**
+ * Given `base` is `foo.bar`, `foo.bar.baz` is an descendant
+ *
+ * Example:
+ *
+ * ```
+ * isDescendant('foo.bar', 'foo.bar.baz') // true
+ * isDescendant('foo.bar', 'foo.bar') // false
+ * isDescendant('foo.bar', 'foo') // false
+ * ```
+ *
+ * @param {string} base Path string to test against.
+ * @param {string} path Path string to test.
+ * @return {boolean} True if `path` is a descendant of `base`.
+ */
+export function isDescendant(base, path) {
+ // path.startsWith(base + '.');
+ return path.indexOf(base + '.') === 0;
+}
+
+/**
+ * Replaces a previous base path with a new base path, preserving the
+ * remainder of the path.
+ *
+ * User must ensure `path` has a prefix of `base`.
+ *
+ * Example:
+ *
+ * ```
+ * translate('foo.bar', 'zot', 'foo.bar.baz') // 'zot.baz'
+ * ```
+ *
+ * @param {string} base Current base string to remove
+ * @param {string} newBase New base string to replace with
+ * @param {string} path Path to translate
+ * @return {string} Translated string
+ */
+export function translate(base, newBase, path) {
+ return newBase + path.slice(base.length);
+}
+
+/**
+ * @param {string} base Path string to test against
+ * @param {string} path Path string to test
+ * @return {boolean} True if `path` is equal to `base`
+ * @this {Path}
+ */
+export function matches(base, path) {
+ return (base === path) ||
+ isAncestor(base, path) ||
+ isDescendant(base, path);
+}
+
+/**
+ * Converts array-based paths to flattened path. String-based paths
+ * are returned as-is.
+ *
+ * Example:
+ *
+ * ```
+ * normalize(['foo.bar', 0, 'baz']) // 'foo.bar.0.baz'
+ * normalize('foo.bar.0.baz') // 'foo.bar.0.baz'
+ * ```
+ *
+ * @param {string | !Array<string|number>} path Input path
+ * @return {string} Flattened path
+ */
+export function normalize(path) {
+ if (Array.isArray(path)) {
+ let parts = [];
+ for (let i=0; i<path.length; i++) {
+ let args = path[i].toString().split('.');
+ for (let j=0; j<args.length; j++) {
+ parts.push(args[j]);
+ }
+ }
+ return parts.join('.');
+ } else {
+ return path;
+ }
+}
+
+/**
+ * Splits a path into an array of property names. Accepts either arrays
+ * of path parts or strings.
+ *
+ * Example:
+ *
+ * ```
+ * split(['foo.bar', 0, 'baz']) // ['foo', 'bar', '0', 'baz']
+ * split('foo.bar.0.baz') // ['foo', 'bar', '0', 'baz']
+ * ```
+ *
+ * @param {string | !Array<string|number>} path Input path
+ * @return {!Array<string>} Array of path parts
+ * @this {Path}
+ * @suppress {checkTypes}
+ */
+export function split(path) {
+ if (Array.isArray(path)) {
+ return normalize(path).split('.');
+ }
+ return path.toString().split('.');
+}
+
+/**
+ * Reads a value from a path. If any sub-property in the path is `undefined`,
+ * this method returns `undefined` (will never throw.
+ *
+ * @param {Object} root Object from which to dereference path from
+ * @param {string | !Array<string|number>} path Path to read
+ * @param {Object=} info If an object is provided to `info`, the normalized
+ * (flattened) path will be set to `info.path`.
+ * @return {*} Value at path, or `undefined` if the path could not be
+ * fully dereferenced.
+ * @this {Path}
+ */
+export function get(root, path, info) {
+ let prop = root;
+ let parts = split(path);
+ // Loop over path parts[0..n-1] and dereference
+ for (let i=0; i<parts.length; i++) {
+ if (!prop) {
+ return;
+ }
+ let part = parts[i];
+ prop = prop[part];
+ }
+ if (info) {
+ info.path = parts.join('.');
+ }
+ return prop;
+}
+
+/**
+ * Sets a value to a path. If any sub-property in the path is `undefined`,
+ * this method will no-op.
+ *
+ * @param {Object} root Object from which to dereference path from
+ * @param {string | !Array<string|number>} path Path to set
+ * @param {*} value Value to set to path
+ * @return {string | undefined} The normalized version of the input path
+ * @this {Path}
+ */
+export function set(root, path, value) {
+ let prop = root;
+ let parts = split(path);
+ let last = parts[parts.length-1];
+ if (parts.length > 1) {
+ // Loop over path parts[0..n-2] and dereference
+ for (let i=0; i<parts.length-1; i++) {
+ let part = parts[i];
+ prop = prop[part];
+ if (!prop) {
+ return;
+ }
+ }
+ // Set value to object at end of path
+ prop[last] = value;
+ } else {
+ // Simple property set
+ prop[path] = value;
+ }
+ return parts.join('.');
+}
+
+/**
+ * Returns true if the given string is a structured data path (has dots).
+ *
+ * This function is deprecated. Use `isPath` instead.
+ *
+ * Example:
+ *
+ * ```
+ * isDeep('foo.bar.baz') // true
+ * isDeep('foo') // false
+ * ```
+ *
+ * @deprecated
+ * @param {string} path Path string
+ * @return {boolean} True if the string contained one or more dots
+ */
+export const isDeep = isPath;
diff --git a/third_party/polymer3/bower_components/polymer/lib/utils/render-status.js b/third_party/polymer3/bower_components/polymer/lib/utils/render-status.js
new file mode 100644
index 0000000..1db3dd9
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/lib/utils/render-status.js
@@ -0,0 +1,120 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import './boot.js';
+
+let scheduled = false;
+let beforeRenderQueue = [];
+let afterRenderQueue = [];
+
+function schedule() {
+ scheduled = true;
+ // before next render
+ requestAnimationFrame(function() {
+ scheduled = false;
+ flushQueue(beforeRenderQueue);
+ // after the render
+ setTimeout(function() {
+ runQueue(afterRenderQueue);
+ });
+ });
+}
+
+function flushQueue(queue) {
+ while (queue.length) {
+ callMethod(queue.shift());
+ }
+}
+
+function runQueue(queue) {
+ for (let i=0, l=queue.length; i < l; i++) {
+ callMethod(queue.shift());
+ }
+}
+
+function callMethod(info) {
+ const context = info[0];
+ const callback = info[1];
+ const args = info[2];
+ try {
+ callback.apply(context, args);
+ } catch(e) {
+ setTimeout(() => {
+ throw e;
+ });
+ }
+}
+
+function flush() {
+ while (beforeRenderQueue.length || afterRenderQueue.length) {
+ flushQueue(beforeRenderQueue);
+ flushQueue(afterRenderQueue);
+ }
+ scheduled = false;
+}
+
+/**
+ * Module for scheduling flushable pre-render and post-render tasks.
+ *
+ * @summary Module for scheduling flushable pre-render and post-render tasks.
+ */
+`TODO(modulizer): A namespace named Polymer.RenderStatus was
+declared here. The surrounding comments should be reviewed,
+and this string can then be deleted`;
+
+/**
+ * Enqueues a callback which will be run before the next render, at
+ * `requestAnimationFrame` timing.
+ *
+ * This method is useful for enqueuing work that requires DOM measurement,
+ * since measurement may not be reliable in custom element callbacks before
+ * the first render, as well as for batching measurement tasks in general.
+ *
+ * Tasks in this queue may be flushed by calling `flush()`.
+ *
+ * @param {*} context Context object the callback function will be bound to
+ * @param {function(...*):void} callback Callback function
+ * @param {!Array=} args An array of arguments to call the callback function with
+ * @return {void}
+ */
+export function beforeNextRender(context, callback, args) {
+ if (!scheduled) {
+ schedule();
+ }
+ beforeRenderQueue.push([context, callback, args]);
+}
+
+/**
+ * Enqueues a callback which will be run after the next render, equivalent
+ * to one task (`setTimeout`) after the next `requestAnimationFrame`.
+ *
+ * This method is useful for tuning the first-render performance of an
+ * element or application by deferring non-critical work until after the
+ * first paint. Typical non-render-critical work may include adding UI
+ * event listeners and aria attributes.
+ *
+ * @param {*} context Context object the callback function will be bound to
+ * @param {function(...*):void} callback Callback function
+ * @param {!Array=} args An array of arguments to call the callback function with
+ * @return {void}
+ */
+export function afterNextRender(context, callback, args) {
+ if (!scheduled) {
+ schedule();
+ }
+ afterRenderQueue.push([context, callback, args]);
+}
+
+/**
+ * Flushes all `beforeNextRender` tasks, followed by all `afterNextRender`
+ * tasks.
+ *
+ * @return {void}
+ */
+export { flush };
diff --git a/third_party/polymer3/bower_components/polymer/lib/utils/resolve-url.js b/third_party/polymer3/bower_components/polymer/lib/utils/resolve-url.js
new file mode 100644
index 0000000..06b2292
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/lib/utils/resolve-url.js
@@ -0,0 +1,87 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import './boot.js';
+
+let CSS_URL_RX = /(url\()([^)]*)(\))/g;
+let ABS_URL = /(^\/)|(^#)|(^[\w-\d]*:)/;
+let workingURL;
+let resolveDoc;
+/**
+ * Resolves the given URL against the provided `baseUri'.
+ *
+ * Note that this function performs no resolution for URLs that start
+ * with `/` (absolute URLs) or `#` (hash identifiers). For general purpose
+ * URL resolution, use `window.URL`.
+ *
+ * @param {string} url Input URL to resolve
+ * @param {?string=} baseURI Base URI to resolve the URL against
+ * @return {string} resolved URL
+ */
+export function resolveUrl(url, baseURI) {
+ if (url && ABS_URL.test(url)) {
+ return url;
+ }
+ // Lazy feature detection.
+ if (workingURL === undefined) {
+ workingURL = false;
+ try {
+ const u = new URL('b', 'http://a');
+ u.pathname = 'c%20d';
+ workingURL = (u.href === 'http://a/c%20d');
+ } catch (e) {
+ // silently fail
+ }
+ }
+ if (!baseURI) {
+ baseURI = document.baseURI || window.location.href;
+ }
+ if (workingURL) {
+ return (new URL(url, baseURI)).href;
+ }
+ // Fallback to creating an anchor into a disconnected document.
+ if (!resolveDoc) {
+ resolveDoc = document.implementation.createHTMLDocument('temp');
+ resolveDoc.base = resolveDoc.createElement('base');
+ resolveDoc.head.appendChild(resolveDoc.base);
+ resolveDoc.anchor = resolveDoc.createElement('a');
+ resolveDoc.body.appendChild(resolveDoc.anchor);
+ }
+ resolveDoc.base.href = baseURI;
+ resolveDoc.anchor.href = url;
+ return resolveDoc.anchor.href || url;
+
+}
+
+/**
+ * Resolves any relative URL's in the given CSS text against the provided
+ * `ownerDocument`'s `baseURI`.
+ *
+ * @param {string} cssText CSS text to process
+ * @param {string} baseURI Base URI to resolve the URL against
+ * @return {string} Processed CSS text with resolved URL's
+ */
+export function resolveCss(cssText, baseURI) {
+ return cssText.replace(CSS_URL_RX, function(m, pre, url, post) {
+ return pre + '\'' +
+ resolveUrl(url.replace(/["']/g, ''), baseURI) +
+ '\'' + post;
+ });
+}
+
+/**
+ * Returns a path from a given `url`. The path includes the trailing
+ * `/` from the url.
+ *
+ * @param {string} url Input URL to transform
+ * @return {string} resolved path
+ */
+export function pathFromUrl(url) {
+ return url.substring(0, url.lastIndexOf('/') + 1);
+}
diff --git a/third_party/polymer3/bower_components/polymer/lib/utils/settings.js b/third_party/polymer3/bower_components/polymer/lib/utils/settings.js
new file mode 100644
index 0000000..461bd33
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/lib/utils/settings.js
@@ -0,0 +1,85 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import './boot.js';
+
+import { pathFromUrl } from './resolve-url.js';
+export const useShadow = !(window.ShadyDOM);
+export const useNativeCSSProperties = Boolean(!window.ShadyCSS || window.ShadyCSS.nativeCss);
+export const useNativeCustomElements = !(window.customElements.polyfillWrapFlushCallback);
+
+
+/**
+ * Globally settable property that is automatically assigned to
+ * `ElementMixin` instances, useful for binding in templates to
+ * make URL's relative to an application's root. Defaults to the main
+ * document URL, but can be overridden by users. It may be useful to set
+ * `rootPath` to provide a stable application mount path when
+ * using client side routing.
+ */
+export let rootPath = undefined ||
+ pathFromUrl(document.baseURI || window.location.href);
+
+/**
+ * Sets the global rootPath property used by `ElementMixin` and
+ * available via `rootPath`.
+ *
+ * @param {string} path The new root path
+ * @return {void}
+ */
+export const setRootPath = function(path) {
+ rootPath = path;
+};
+
+/**
+ * A global callback used to sanitize any value before inserting it into the DOM. The callback signature is:
+ *
+ * Polymer = {
+ * sanitizeDOMValue: function(value, name, type, node) { ... }
+ * }
+ *
+ * Where:
+ *
+ * `value` is the value to sanitize.
+ * `name` is the name of an attribute or property (for example, href).
+ * `type` indicates where the value is being inserted: one of property, attribute, or text.
+ * `node` is the node where the value is being inserted.
+ *
+ * @type {(function(*,string,string,Node):*)|undefined}
+ */
+export let sanitizeDOMValue = undefined;
+
+/**
+ * Sets the global sanitizeDOMValue available via this module's exported
+ * `sanitizeDOMValue` variable.
+ *
+ * @param {(function(*,string,string,Node):*)|undefined} newSanitizeDOMValue the global sanitizeDOMValue callback
+ * @return {void}
+ */
+export const setSanitizeDOMValue = function(newSanitizeDOMValue) {
+ sanitizeDOMValue = newSanitizeDOMValue;
+};
+
+/**
+ * Globally settable property to make Polymer Gestures use passive TouchEvent listeners when recognizing gestures.
+ * When set to `true`, gestures made from touch will not be able to prevent scrolling, allowing for smoother
+ * scrolling performance.
+ * Defaults to `false` for backwards compatibility.
+ */
+export let passiveTouchGestures = false;
+
+/**
+ * Sets `passiveTouchGestures` globally for all elements using Polymer Gestures.
+ *
+ * @param {boolean} usePassive enable or disable passive touch gestures globally
+ * @return {void}
+ */
+export const setPassiveTouchGestures = function(usePassive) {
+ passiveTouchGestures = usePassive;
+};
diff --git a/third_party/polymer3/bower_components/polymer/lib/utils/style-gather.js b/third_party/polymer3/bower_components/polymer/lib/utils/style-gather.js
new file mode 100644
index 0000000..5daadb1
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/lib/utils/style-gather.js
@@ -0,0 +1,282 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import { resolveCss } from './resolve-url.js';
+
+const MODULE_STYLE_LINK_SELECTOR = 'link[rel=import][type~=css]';
+const INCLUDE_ATTR = 'include';
+const SHADY_UNSCOPED_ATTR = 'shady-unscoped';
+
+function importModule(moduleId) {
+ const /** DomModule */ PolymerDomModule = customElements.get('dom-module');
+ if (!PolymerDomModule) {
+ return null;
+ }
+ return PolymerDomModule.import(moduleId);
+}
+
+function styleForImport(importDoc) {
+ // NOTE: polyfill affordance.
+ // under the HTMLImports polyfill, there will be no 'body',
+ // but the import pseudo-doc can be used directly.
+ let container = importDoc.body ? importDoc.body : importDoc;
+ const importCss = resolveCss(container.textContent,
+ importDoc.baseURI);
+ const style = document.createElement('style');
+ style.textContent = importCss;
+ return style;
+}
+
+/** @typedef {{assetpath: string}} */
+let templateWithAssetPath; // eslint-disable-line no-unused-vars
+
+/**
+ * Module with utilities for collection CSS text from `<templates>`, external
+ * stylesheets, and `dom-module`s.
+ *
+ * @summary Module with utilities for collection CSS text from various sources.
+ */
+`TODO(modulizer): A namespace named Polymer.StyleGather was
+declared here. The surrounding comments should be reviewed,
+and this string can then be deleted`;
+
+/**
+ * Returns a list of <style> elements in a space-separated list of `dom-module`s.
+ *
+ * @function
+ * @param {string} moduleIds List of dom-module id's within which to
+ * search for css.
+ * @return {!Array<!HTMLStyleElement>} Array of contained <style> elements
+ * @this {StyleGather}
+ */
+export function stylesFromModules(moduleIds) {
+ const modules = moduleIds.trim().split(/\s+/);
+ const styles = [];
+ for (let i=0; i < modules.length; i++) {
+ styles.push(...stylesFromModule(modules[i]));
+ }
+ return styles;
+}
+
+/**
+ * Returns a list of <style> elements in a given `dom-module`.
+ * Styles in a `dom-module` can come either from `<style>`s within the
+ * first `<template>`, or else from one or more
+ * `<link rel="import" type="css">` links outside the template.
+ *
+ * @param {string} moduleId dom-module id to gather styles from
+ * @return {!Array<!HTMLStyleElement>} Array of contained styles.
+ * @this {StyleGather}
+ */
+export function stylesFromModule(moduleId) {
+ const m = importModule(moduleId);
+
+ if (!m) {
+ console.warn('Could not find style data in module named', moduleId);
+ return [];
+ }
+
+ if (m._styles === undefined) {
+ const styles = [];
+ // module imports: <link rel="import" type="css">
+ styles.push(..._stylesFromModuleImports(m));
+ // include css from the first template in the module
+ const template = m.querySelector('template');
+ if (template) {
+ styles.push(...stylesFromTemplate(template,
+ /** @type {templateWithAssetPath} */(m).assetpath));
+ }
+
+ m._styles = styles;
+ }
+
+ return m._styles;
+}
+
+/**
+ * Returns the `<style>` elements within a given template.
+ *
+ * @param {!HTMLTemplateElement} template Template to gather styles from
+ * @param {string} baseURI baseURI for style content
+ * @return {!Array<!HTMLStyleElement>} Array of styles
+ * @this {StyleGather}
+ */
+export function stylesFromTemplate(template, baseURI) {
+ if (!template._styles) {
+ const styles = [];
+ // if element is a template, get content from its .content
+ const e$ = template.content.querySelectorAll('style');
+ for (let i=0; i < e$.length; i++) {
+ let e = e$[i];
+ // support style sharing by allowing styles to "include"
+ // other dom-modules that contain styling
+ let include = e.getAttribute(INCLUDE_ATTR);
+ if (include) {
+ styles.push(...stylesFromModules(include).filter(function(item, index, self) {
+ return self.indexOf(item) === index;
+ }));
+ }
+ if (baseURI) {
+ e.textContent = resolveCss(e.textContent, baseURI);
+ }
+ styles.push(e);
+ }
+ template._styles = styles;
+ }
+ return template._styles;
+}
+
+/**
+ * Returns a list of <style> elements from stylesheets loaded via `<link rel="import" type="css">` links within the specified `dom-module`.
+ *
+ * @param {string} moduleId Id of `dom-module` to gather CSS from
+ * @return {!Array<!HTMLStyleElement>} Array of contained styles.
+ * @this {StyleGather}
+ */
+export function stylesFromModuleImports(moduleId) {
+ let m = importModule(moduleId);
+ return m ? _stylesFromModuleImports(m) : [];
+}
+
+/**
+ * @this {StyleGather}
+ * @param {!HTMLElement} module dom-module element that could contain `<link rel="import" type="css">` styles
+ * @return {!Array<!HTMLStyleElement>} Array of contained styles
+ */
+function _stylesFromModuleImports(module) {
+ const styles = [];
+ const p$ = module.querySelectorAll(MODULE_STYLE_LINK_SELECTOR);
+ for (let i=0; i < p$.length; i++) {
+ let p = p$[i];
+ if (p.import) {
+ const importDoc = p.import;
+ const unscoped = p.hasAttribute(SHADY_UNSCOPED_ATTR);
+ if (unscoped && !importDoc._unscopedStyle) {
+ const style = styleForImport(importDoc);
+ style.setAttribute(SHADY_UNSCOPED_ATTR, '');
+ importDoc._unscopedStyle = style;
+ } else if (!importDoc._style) {
+ importDoc._style = styleForImport(importDoc);
+ }
+ styles.push(unscoped ? importDoc._unscopedStyle : importDoc._style);
+ }
+ }
+ return styles;
+}
+
+/**
+ *
+ * Returns CSS text of styles in a space-separated list of `dom-module`s.
+ * Note: This method is deprecated, use `stylesFromModules` instead.
+ *
+ * @deprecated
+ * @param {string} moduleIds List of dom-module id's within which to
+ * search for css.
+ * @return {string} Concatenated CSS content from specified `dom-module`s
+ * @this {StyleGather}
+ */
+export function cssFromModules(moduleIds) {
+ let modules = moduleIds.trim().split(/\s+/);
+ let cssText = '';
+ for (let i=0; i < modules.length; i++) {
+ cssText += cssFromModule(modules[i]);
+ }
+ return cssText;
+}
+
+/**
+ * Returns CSS text of styles in a given `dom-module`. CSS in a `dom-module`
+ * can come either from `<style>`s within the first `<template>`, or else
+ * from one or more `<link rel="import" type="css">` links outside the
+ * template.
+ *
+ * Any `<styles>` processed are removed from their original location.
+ * Note: This method is deprecated, use `styleFromModule` instead.
+ *
+ * @deprecated
+ * @param {string} moduleId dom-module id to gather styles from
+ * @return {string} Concatenated CSS content from specified `dom-module`
+ * @this {StyleGather}
+ */
+export function cssFromModule(moduleId) {
+ let m = importModule(moduleId);
+ if (m && m._cssText === undefined) {
+ // module imports: <link rel="import" type="css">
+ let cssText = _cssFromModuleImports(m);
+ // include css from the first template in the module
+ let t = m.querySelector('template');
+ if (t) {
+ cssText += cssFromTemplate(t,
+ /** @type {templateWithAssetPath} */(m).assetpath);
+ }
+ m._cssText = cssText || null;
+ }
+ if (!m) {
+ console.warn('Could not find style data in module named', moduleId);
+ }
+ return m && m._cssText || '';
+}
+
+/**
+ * Returns CSS text of `<styles>` within a given template.
+ *
+ * Any `<styles>` processed are removed from their original location.
+ * Note: This method is deprecated, use `styleFromTemplate` instead.
+ *
+ * @deprecated
+ * @param {!HTMLTemplateElement} template Template to gather styles from
+ * @param {string} baseURI Base URI to resolve the URL against
+ * @return {string} Concatenated CSS content from specified template
+ * @this {StyleGather}
+ */
+export function cssFromTemplate(template, baseURI) {
+ let cssText = '';
+ const e$ = stylesFromTemplate(template, baseURI);
+ // if element is a template, get content from its .content
+ for (let i=0; i < e$.length; i++) {
+ let e = e$[i];
+ if (e.parentNode) {
+ e.parentNode.removeChild(e);
+ }
+ cssText += e.textContent;
+ }
+ return cssText;
+}
+
+/**
+ * Returns CSS text from stylesheets loaded via `<link rel="import" type="css">`
+ * links within the specified `dom-module`.
+ *
+ * Note: This method is deprecated, use `stylesFromModuleImports` instead.
+ *
+ * @deprecated
+ *
+ * @param {string} moduleId Id of `dom-module` to gather CSS from
+ * @return {string} Concatenated CSS content from links in specified `dom-module`
+ * @this {StyleGather}
+ */
+export function cssFromModuleImports(moduleId) {
+ let m = importModule(moduleId);
+ return m ? _cssFromModuleImports(m) : '';
+}
+
+/**
+ * @deprecated
+ * @this {StyleGather}
+ * @param {!HTMLElement} module dom-module element that could contain `<link rel="import" type="css">` styles
+ * @return {string} Concatenated CSS content from links in the dom-module
+ */
+function _cssFromModuleImports(module) {
+ let cssText = '';
+ let styles = _stylesFromModuleImports(module);
+ for (let i=0; i < styles.length; i++) {
+ cssText += styles[i].textContent;
+ }
+ return cssText;
+}
diff --git a/third_party/polymer3/bower_components/polymer/lib/utils/templatize.js b/third_party/polymer3/bower_components/polymer/lib/utils/templatize.js
new file mode 100644
index 0000000..986a223
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/lib/utils/templatize.js
@@ -0,0 +1,568 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import './boot.js';
+
+import { PropertyEffects } from '../mixins/property-effects.js';
+import { MutableData } from '../mixins/mutable-data.js';
+
+// Base class for HTMLTemplateElement extension that has property effects
+// machinery for propagating host properties to children. This is an ES5
+// class only because Babel (incorrectly) requires super() in the class
+// constructor even though no `this` is used and it returns an instance.
+let newInstance = null;
+/**
+ * @constructor
+ * @extends {HTMLTemplateElement}
+ */
+function HTMLTemplateElementExtension() { return newInstance; }
+HTMLTemplateElementExtension.prototype = Object.create(HTMLTemplateElement.prototype, {
+ constructor: {
+ value: HTMLTemplateElementExtension,
+ writable: true
+ }
+});
+/**
+ * @constructor
+ * @implements {Polymer_PropertyEffects}
+ * @extends {HTMLTemplateElementExtension}
+ */
+const DataTemplate = PropertyEffects(HTMLTemplateElementExtension);
+/**
+ * @constructor
+ * @implements {Polymer_MutableData}
+ * @extends {DataTemplate}
+ */
+const MutableDataTemplate = MutableData(DataTemplate);
+
+// Applies a DataTemplate subclass to a <template> instance
+function upgradeTemplate(template, constructor) {
+ newInstance = template;
+ Object.setPrototypeOf(template, constructor.prototype);
+ new constructor();
+ newInstance = null;
+}
+
+// Base class for TemplateInstance's
+/**
+ * @constructor
+ * @implements {Polymer_PropertyEffects}
+ */
+const base = PropertyEffects(class {});
+
+/**
+ * @polymer
+ * @customElement
+ * @appliesMixin PropertyEffects
+ * @unrestricted
+ */
+class TemplateInstanceBase extends base {
+ constructor(props) {
+ super();
+ this._configureProperties(props);
+ this.root = this._stampTemplate(this.__dataHost);
+ // Save list of stamped children
+ let children = this.children = [];
+ for (let n = this.root.firstChild; n; n=n.nextSibling) {
+ children.push(n);
+ n.__templatizeInstance = this;
+ }
+ if (this.__templatizeOwner &&
+ this.__templatizeOwner.__hideTemplateChildren__) {
+ this._showHideChildren(true);
+ }
+ // Flush props only when props are passed if instance props exist
+ // or when there isn't instance props.
+ let options = this.__templatizeOptions;
+ if ((props && options.instanceProps) || !options.instanceProps) {
+ this._enableProperties();
+ }
+ }
+ /**
+ * Configure the given `props` by calling `_setPendingProperty`. Also
+ * sets any properties stored in `__hostProps`.
+ * @private
+ * @param {Object} props Object of property name-value pairs to set.
+ * @return {void}
+ */
+ _configureProperties(props) {
+ let options = this.__templatizeOptions;
+ if (options.forwardHostProp) {
+ for (let hprop in this.__hostProps) {
+ this._setPendingProperty(hprop, this.__dataHost['_host_' + hprop]);
+ }
+ }
+ // Any instance props passed in the constructor will overwrite host props;
+ // normally this would be a user error but we don't specifically filter them
+ for (let iprop in props) {
+ this._setPendingProperty(iprop, props[iprop]);
+ }
+ }
+ /**
+ * Forwards a host property to this instance. This method should be
+ * called on instances from the `options.forwardHostProp` callback
+ * to propagate changes of host properties to each instance.
+ *
+ * Note this method enqueues the change, which are flushed as a batch.
+ *
+ * @param {string} prop Property or path name
+ * @param {*} value Value of the property to forward
+ * @return {void}
+ */
+ forwardHostProp(prop, value) {
+ if (this._setPendingPropertyOrPath(prop, value, false, true)) {
+ this.__dataHost._enqueueClient(this);
+ }
+ }
+
+ /**
+ * Override point for adding custom or simulated event handling.
+ *
+ * @param {!Node} node Node to add event listener to
+ * @param {string} eventName Name of event
+ * @param {function(!Event):void} handler Listener function to add
+ * @return {void}
+ */
+ _addEventListenerToNode(node, eventName, handler) {
+ if (this._methodHost && this.__templatizeOptions.parentModel) {
+ // If this instance should be considered a parent model, decorate
+ // events this template instance as `model`
+ this._methodHost._addEventListenerToNode(node, eventName, (e) => {
+ e.model = this;
+ handler(e);
+ });
+ } else {
+ // Otherwise delegate to the template's host (which could be)
+ // another template instance
+ let templateHost = this.__dataHost.__dataHost;
+ if (templateHost) {
+ templateHost._addEventListenerToNode(node, eventName, handler);
+ }
+ }
+ }
+ /**
+ * Shows or hides the template instance top level child elements. For
+ * text nodes, `textContent` is removed while "hidden" and replaced when
+ * "shown."
+ * @param {boolean} hide Set to true to hide the children;
+ * set to false to show them.
+ * @return {void}
+ * @protected
+ */
+ _showHideChildren(hide) {
+ let c = this.children;
+ for (let i=0; i<c.length; i++) {
+ let n = c[i];
+ // Ignore non-changes
+ if (Boolean(hide) != Boolean(n.__hideTemplateChildren__)) {
+ if (n.nodeType === Node.TEXT_NODE) {
+ if (hide) {
+ n.__polymerTextContent__ = n.textContent;
+ n.textContent = '';
+ } else {
+ n.textContent = n.__polymerTextContent__;
+ }
+ // remove and replace slot
+ } else if (n.localName === 'slot') {
+ if (hide) {
+ n.__polymerReplaced__ = document.createComment('hidden-slot');
+ n.parentNode.replaceChild(n.__polymerReplaced__, n);
+ } else {
+ const replace = n.__polymerReplaced__;
+ if (replace) {
+ replace.parentNode.replaceChild(n, replace);
+ }
+ }
+ }
+
+ else if (n.style) {
+ if (hide) {
+ n.__polymerDisplay__ = n.style.display;
+ n.style.display = 'none';
+ } else {
+ n.style.display = n.__polymerDisplay__;
+ }
+ }
+ }
+ n.__hideTemplateChildren__ = hide;
+ if (n._showHideChildren) {
+ n._showHideChildren(hide);
+ }
+ }
+ }
+ /**
+ * Overrides default property-effects implementation to intercept
+ * textContent bindings while children are "hidden" and cache in
+ * private storage for later retrieval.
+ *
+ * @param {!Node} node The node to set a property on
+ * @param {string} prop The property to set
+ * @param {*} value The value to set
+ * @return {void}
+ * @protected
+ */
+ _setUnmanagedPropertyToNode(node, prop, value) {
+ if (node.__hideTemplateChildren__ &&
+ node.nodeType == Node.TEXT_NODE && prop == 'textContent') {
+ node.__polymerTextContent__ = value;
+ } else {
+ super._setUnmanagedPropertyToNode(node, prop, value);
+ }
+ }
+ /**
+ * Find the parent model of this template instance. The parent model
+ * is either another templatize instance that had option `parentModel: true`,
+ * or else the host element.
+ *
+ * @return {!Polymer_PropertyEffects} The parent model of this instance
+ */
+ get parentModel() {
+ let model = this.__parentModel;
+ if (!model) {
+ let options;
+ model = this;
+ do {
+ // A template instance's `__dataHost` is a <template>
+ // `model.__dataHost.__dataHost` is the template's host
+ model = model.__dataHost.__dataHost;
+ } while ((options = model.__templatizeOptions) && !options.parentModel);
+ this.__parentModel = model;
+ }
+ return model;
+ }
+
+ /**
+ * Stub of HTMLElement's `dispatchEvent`, so that effects that may
+ * dispatch events safely no-op.
+ *
+ * @param {Event} event Event to dispatch
+ * @return {boolean} Always true.
+ */
+ dispatchEvent(event) { // eslint-disable-line no-unused-vars
+ return true;
+ }
+}
+
+/** @type {!DataTemplate} */
+TemplateInstanceBase.prototype.__dataHost;
+/** @type {!TemplatizeOptions} */
+TemplateInstanceBase.prototype.__templatizeOptions;
+/** @type {!Polymer_PropertyEffects} */
+TemplateInstanceBase.prototype._methodHost;
+/** @type {!Object} */
+TemplateInstanceBase.prototype.__templatizeOwner;
+/** @type {!Object} */
+TemplateInstanceBase.prototype.__hostProps;
+
+/**
+ * @constructor
+ * @extends {TemplateInstanceBase}
+ * @implements {Polymer_MutableData}
+ */
+const MutableTemplateInstanceBase = MutableData(TemplateInstanceBase);
+
+function findMethodHost(template) {
+ // Technically this should be the owner of the outermost template.
+ // In shadow dom, this is always getRootNode().host, but we can
+ // approximate this via cooperation with our dataHost always setting
+ // `_methodHost` as long as there were bindings (or id's) on this
+ // instance causing it to get a dataHost.
+ let templateHost = template.__dataHost;
+ return templateHost && templateHost._methodHost || templateHost;
+}
+
+/* eslint-disable valid-jsdoc */
+/**
+ * @suppress {missingProperties} class.prototype is not defined for some reason
+ */
+function createTemplatizerClass(template, templateInfo, options) {
+ // Anonymous class created by the templatize
+ let base = options.mutableData ?
+ MutableTemplateInstanceBase : TemplateInstanceBase;
+ /**
+ * @constructor
+ * @extends {base}
+ * @private
+ */
+ let klass = class extends base { };
+ klass.prototype.__templatizeOptions = options;
+ klass.prototype._bindTemplate(template);
+ addNotifyEffects(klass, template, templateInfo, options);
+ return klass;
+}
+
+/**
+ * @suppress {missingProperties} class.prototype is not defined for some reason
+ */
+function addPropagateEffects(template, templateInfo, options) {
+ let userForwardHostProp = options.forwardHostProp;
+ if (userForwardHostProp) {
+ // Provide data API and property effects on memoized template class
+ let klass = templateInfo.templatizeTemplateClass;
+ if (!klass) {
+ let base = options.mutableData ? MutableDataTemplate : DataTemplate;
+ klass = templateInfo.templatizeTemplateClass =
+ class TemplatizedTemplate extends base {};
+ // Add template - >instances effects
+ // and host <- template effects
+ let hostProps = templateInfo.hostProps;
+ for (let prop in hostProps) {
+ klass.prototype._addPropertyEffect('_host_' + prop,
+ klass.prototype.PROPERTY_EFFECT_TYPES.PROPAGATE,
+ {fn: createForwardHostPropEffect(prop, userForwardHostProp)});
+ klass.prototype._createNotifyingProperty('_host_' + prop);
+ }
+ }
+ upgradeTemplate(template, klass);
+ // Mix any pre-bound data into __data; no need to flush this to
+ // instances since they pull from the template at instance-time
+ if (template.__dataProto) {
+ // Note, generally `__dataProto` could be chained, but it's guaranteed
+ // to not be since this is a vanilla template we just added effects to
+ Object.assign(template.__data, template.__dataProto);
+ }
+ // Clear any pending data for performance
+ template.__dataTemp = {};
+ template.__dataPending = null;
+ template.__dataOld = null;
+ template._enableProperties();
+ }
+}
+/* eslint-enable valid-jsdoc */
+
+function createForwardHostPropEffect(hostProp, userForwardHostProp) {
+ return function forwardHostProp(template, prop, props) {
+ userForwardHostProp.call(template.__templatizeOwner,
+ prop.substring('_host_'.length), props[prop]);
+ };
+}
+
+function addNotifyEffects(klass, template, templateInfo, options) {
+ let hostProps = templateInfo.hostProps || {};
+ for (let iprop in options.instanceProps) {
+ delete hostProps[iprop];
+ let userNotifyInstanceProp = options.notifyInstanceProp;
+ if (userNotifyInstanceProp) {
+ klass.prototype._addPropertyEffect(iprop,
+ klass.prototype.PROPERTY_EFFECT_TYPES.NOTIFY,
+ {fn: createNotifyInstancePropEffect(iprop, userNotifyInstanceProp)});
+ }
+ }
+ if (options.forwardHostProp && template.__dataHost) {
+ for (let hprop in hostProps) {
+ klass.prototype._addPropertyEffect(hprop,
+ klass.prototype.PROPERTY_EFFECT_TYPES.NOTIFY,
+ {fn: createNotifyHostPropEffect()});
+ }
+ }
+}
+
+function createNotifyInstancePropEffect(instProp, userNotifyInstanceProp) {
+ return function notifyInstanceProp(inst, prop, props) {
+ userNotifyInstanceProp.call(inst.__templatizeOwner,
+ inst, prop, props[prop]);
+ };
+}
+
+function createNotifyHostPropEffect() {
+ return function notifyHostProp(inst, prop, props) {
+ inst.__dataHost._setPendingPropertyOrPath('_host_' + prop, props[prop], true, true);
+ };
+}
+
+/**
+ * Module for preparing and stamping instances of templates that utilize
+ * Polymer's data-binding and declarative event listener features.
+ *
+ * Example:
+ *
+ * // Get a template from somewhere, e.g. light DOM
+ * let template = this.querySelector('template');
+ * // Prepare the template
+ * let TemplateClass = Templatize.templatize(template);
+ * // Instance the template with an initial data model
+ * let instance = new TemplateClass({myProp: 'initial'});
+ * // Insert the instance's DOM somewhere, e.g. element's shadow DOM
+ * this.shadowRoot.appendChild(instance.root);
+ * // Changing a property on the instance will propagate to bindings
+ * // in the template
+ * instance.myProp = 'new value';
+ *
+ * The `options` dictionary passed to `templatize` allows for customizing
+ * features of the generated template class, including how outer-scope host
+ * properties should be forwarded into template instances, how any instance
+ * properties added into the template's scope should be notified out to
+ * the host, and whether the instance should be decorated as a "parent model"
+ * of any event handlers.
+ *
+ * // Customize property forwarding and event model decoration
+ * let TemplateClass = Templatize.templatize(template, this, {
+ * parentModel: true,
+ * forwardHostProp(property, value) {...},
+ * instanceProps: {...},
+ * notifyInstanceProp(instance, property, value) {...},
+ * });
+ *
+ * @summary Module for preparing and stamping instances of templates
+ * utilizing Polymer templating features.
+ */
+`TODO(modulizer): A namespace named Polymer.Templatize was
+declared here. The surrounding comments should be reviewed,
+and this string can then be deleted`;
+
+/**
+ * Returns an anonymous `PropertyEffects` class bound to the
+ * `<template>` provided. Instancing the class will result in the
+ * template being stamped into a document fragment stored as the instance's
+ * `root` property, after which it can be appended to the DOM.
+ *
+ * Templates may utilize all Polymer data-binding features as well as
+ * declarative event listeners. Event listeners and inline computing
+ * functions in the template will be called on the host of the template.
+ *
+ * The constructor returned takes a single argument dictionary of initial
+ * property values to propagate into template bindings. Additionally
+ * host properties can be forwarded in, and instance properties can be
+ * notified out by providing optional callbacks in the `options` dictionary.
+ *
+ * Valid configuration in `options` are as follows:
+ *
+ * - `forwardHostProp(property, value)`: Called when a property referenced
+ * in the template changed on the template's host. As this library does
+ * not retain references to templates instanced by the user, it is the
+ * templatize owner's responsibility to forward host property changes into
+ * user-stamped instances. The `instance.forwardHostProp(property, value)`
+ * method on the generated class should be called to forward host
+ * properties into the template to prevent unnecessary property-changed
+ * notifications. Any properties referenced in the template that are not
+ * defined in `instanceProps` will be notified up to the template's host
+ * automatically.
+ * - `instanceProps`: Dictionary of property names that will be added
+ * to the instance by the templatize owner. These properties shadow any
+ * host properties, and changes within the template to these properties
+ * will result in `notifyInstanceProp` being called.
+ * - `mutableData`: When `true`, the generated class will skip strict
+ * dirty-checking for objects and arrays (always consider them to be
+ * "dirty").
+ * - `notifyInstanceProp(instance, property, value)`: Called when
+ * an instance property changes. Users may choose to call `notifyPath`
+ * on e.g. the owner to notify the change.
+ * - `parentModel`: When `true`, events handled by declarative event listeners
+ * (`on-event="handler"`) will be decorated with a `model` property pointing
+ * to the template instance that stamped it. It will also be returned
+ * from `instance.parentModel` in cases where template instance nesting
+ * causes an inner model to shadow an outer model.
+ *
+ * All callbacks are called bound to the `owner`. Any context
+ * needed for the callbacks (such as references to `instances` stamped)
+ * should be stored on the `owner` such that they can be retrieved via
+ * `this`.
+ *
+ * When `options.forwardHostProp` is declared as an option, any properties
+ * referenced in the template will be automatically forwarded from the host of
+ * the `<template>` to instances, with the exception of any properties listed in
+ * the `options.instanceProps` object. `instanceProps` are assumed to be
+ * managed by the owner of the instances, either passed into the constructor
+ * or set after the fact. Note, any properties passed into the constructor will
+ * always be set to the instance (regardless of whether they would normally
+ * be forwarded from the host).
+ *
+ * Note that `templatize()` can be run only once for a given `<template>`.
+ * Further calls will result in an error. Also, there is a special
+ * behavior if the template was duplicated through a mechanism such as
+ * `<dom-repeat>` or `<test-fixture>`. In this case, all calls to
+ * `templatize()` return the same class for all duplicates of a template.
+ * The class returned from `templatize()` is generated only once using
+ * the `options` from the first call. This means that any `options`
+ * provided to subsequent calls will be ignored. Therefore, it is very
+ * important not to close over any variables inside the callbacks. Also,
+ * arrow functions must be avoided because they bind the outer `this`.
+ * Inside the callbacks, any contextual information can be accessed
+ * through `this`, which points to the `owner`.
+ *
+ * @param {!HTMLTemplateElement} template Template to templatize
+ * @param {Polymer_PropertyEffects=} owner Owner of the template instances;
+ * any optional callbacks will be bound to this owner.
+ * @param {Object=} options Options dictionary (see summary for details)
+ * @return {function(new:TemplateInstanceBase)} Generated class bound to the template
+ * provided
+ * @suppress {invalidCasts}
+ */
+export function templatize(template, owner, options) {
+ options = /** @type {!TemplatizeOptions} */(options || {});
+ if (template.__templatizeOwner) {
+ throw new Error('A <template> can only be templatized once');
+ }
+ template.__templatizeOwner = owner;
+ const ctor = owner ? owner.constructor : TemplateInstanceBase;
+ let templateInfo = ctor._parseTemplate(template);
+ // Get memoized base class for the prototypical template, which
+ // includes property effects for binding template & forwarding
+ let baseClass = templateInfo.templatizeInstanceClass;
+ if (!baseClass) {
+ baseClass = createTemplatizerClass(template, templateInfo, options);
+ templateInfo.templatizeInstanceClass = baseClass;
+ }
+ // Host property forwarding must be installed onto template instance
+ addPropagateEffects(template, templateInfo, options);
+ // Subclass base class and add reference for this specific template
+ /** @private */
+ let klass = class TemplateInstance extends baseClass {};
+ klass.prototype._methodHost = findMethodHost(template);
+ klass.prototype.__dataHost = template;
+ klass.prototype.__templatizeOwner = owner;
+ klass.prototype.__hostProps = templateInfo.hostProps;
+ klass = /** @type {function(new:TemplateInstanceBase)} */(klass); //eslint-disable-line no-self-assign
+ return klass;
+}
+
+/**
+ * Returns the template "model" associated with a given element, which
+ * serves as the binding scope for the template instance the element is
+ * contained in. A template model is an instance of
+ * `TemplateInstanceBase`, and should be used to manipulate data
+ * associated with this template instance.
+ *
+ * Example:
+ *
+ * let model = modelForElement(el);
+ * if (model.index < 10) {
+ * model.set('item.checked', true);
+ * }
+ *
+ * @param {HTMLTemplateElement} template The model will be returned for
+ * elements stamped from this template
+ * @param {Node=} node Node for which to return a template model.
+ * @return {TemplateInstanceBase} Template instance representing the
+ * binding scope for the element
+ */
+export function modelForElement(template, node) {
+ let model;
+ while (node) {
+ // An element with a __templatizeInstance marks the top boundary
+ // of a scope; walk up until we find one, and then ensure that
+ // its __dataHost matches `this`, meaning this dom-repeat stamped it
+ if ((model = node.__templatizeInstance)) {
+ // Found an element stamped by another template; keep walking up
+ // from its __dataHost
+ if (model.__dataHost != template) {
+ node = model.__dataHost;
+ } else {
+ return model;
+ }
+ } else {
+ // Still in a template scope, keep going up until
+ // a __templatizeInstance is found
+ node = node.parentNode;
+ }
+ }
+ return null;
+}
+
+export { TemplateInstanceBase };
diff --git a/third_party/polymer3/bower_components/polymer/lib/utils/unresolved.js b/third_party/polymer3/bower_components/polymer/lib/utils/unresolved.js
new file mode 100644
index 0000000..20ed6f8
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/lib/utils/unresolved.js
@@ -0,0 +1,19 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+
+function resolve() {
+ document.body.removeAttribute('unresolved');
+}
+
+if (document.readyState === 'interactive' || document.readyState === 'complete') {
+ resolve();
+} else {
+ window.addEventListener('DOMContentLoaded', resolve);
+}
diff --git a/third_party/polymer3/bower_components/polymer/manifest.json b/third_party/polymer3/bower_components/polymer/manifest.json
new file mode 100644
index 0000000..9aa1e1d
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/manifest.json
@@ -0,0 +1,765 @@
+{
+ "files": {
+ "polymer.html": {
+ "convertedUrl": "polymer-legacy.js",
+ "exports": {
+ "Polymer.Base": "Base",
+ "Polymer.html": "html"
+ }
+ },
+ "lib/legacy/legacy-element-mixin.html": {
+ "convertedUrl": "lib/legacy/legacy-element-mixin.js",
+ "exports": {
+ "Polymer.LegacyElementMixin": "LegacyElementMixin"
+ }
+ },
+ "lib/mixins/element-mixin.html": {
+ "convertedUrl": "lib/mixins/element-mixin.js",
+ "exports": {
+ "Polymer.ElementMixin": "ElementMixin",
+ "Polymer.telemetry.instanceCount": "instanceCount",
+ "Polymer.telemetry.registrations": "registrations",
+ "Polymer.telemetry._regLog": "_regLog",
+ "Polymer.telemetry.register": "register",
+ "Polymer.telemetry.dumpRegistrations": "dumpRegistrations",
+ "Polymer.telemetry": "*",
+ "Polymer.updateStyles": "updateStyles"
+ }
+ },
+ "lib/utils/boot.html": {
+ "convertedUrl": "lib/utils/boot.js",
+ "exports": {}
+ },
+ "lib/utils/settings.html": {
+ "convertedUrl": "lib/utils/settings.js",
+ "exports": {
+ "Polymer.Settings.useShadow": "useShadow",
+ "Polymer.Settings.useNativeCSSProperties": "useNativeCSSProperties",
+ "Polymer.Settings.useNativeCustomElements": "useNativeCustomElements",
+ "Polymer.rootPath": "rootPath",
+ "Polymer.setRootPath": "setRootPath",
+ "Polymer.sanitizeDOMValue": "sanitizeDOMValue",
+ "Polymer.setSanitizeDOMValue": "setSanitizeDOMValue",
+ "Polymer.passiveTouchGestures": "passiveTouchGestures",
+ "Polymer.setPassiveTouchGestures": "setPassiveTouchGestures"
+ }
+ },
+ "lib/utils/resolve-url.html": {
+ "convertedUrl": "lib/utils/resolve-url.js",
+ "exports": {
+ "Polymer.ResolveUrl.resolveCss": "resolveCss",
+ "Polymer.ResolveUrl.resolveUrl": "resolveUrl",
+ "Polymer.ResolveUrl.pathFromUrl": "pathFromUrl",
+ "Polymer.ResolveUrl": "*"
+ }
+ },
+ "lib/utils/mixin.html": {
+ "convertedUrl": "lib/utils/mixin.js",
+ "exports": {
+ "Polymer.dedupingMixin": "dedupingMixin"
+ }
+ },
+ "lib/utils/style-gather.html": {
+ "convertedUrl": "lib/utils/style-gather.js",
+ "exports": {
+ "Polymer.StyleGather.stylesFromModules": "stylesFromModules",
+ "Polymer.StyleGather.stylesFromModule": "stylesFromModule",
+ "Polymer.StyleGather.stylesFromTemplate": "stylesFromTemplate",
+ "Polymer.StyleGather.stylesFromModuleImports": "stylesFromModuleImports",
+ "Polymer.StyleGather._stylesFromModuleImports": "_stylesFromModuleImports",
+ "Polymer.StyleGather.cssFromModules": "cssFromModules",
+ "Polymer.StyleGather.cssFromModule": "cssFromModule",
+ "Polymer.StyleGather.cssFromTemplate": "cssFromTemplate",
+ "Polymer.StyleGather.cssFromModuleImports": "cssFromModuleImports",
+ "Polymer.StyleGather._cssFromModuleImports": "_cssFromModuleImports",
+ "Polymer.StyleGather": "*"
+ }
+ },
+ "lib/elements/dom-module.html": {
+ "convertedUrl": "lib/elements/dom-module.js",
+ "exports": {
+ "Polymer.DomModule": "DomModule"
+ }
+ },
+ "lib/mixins/property-effects.html": {
+ "convertedUrl": "lib/mixins/property-effects.js",
+ "exports": {
+ "Polymer.PropertyEffects": "PropertyEffects"
+ }
+ },
+ "lib/utils/path.html": {
+ "convertedUrl": "lib/utils/path.js",
+ "exports": {
+ "Path.isDeep": "isDeep",
+ "Polymer.Path.isPath": "isPath",
+ "Polymer.Path.root": "root",
+ "Polymer.Path.isAncestor": "isAncestor",
+ "Polymer.Path.isDescendant": "isDescendant",
+ "Polymer.Path.translate": "translate",
+ "Polymer.Path.matches": "matches",
+ "Polymer.Path.normalize": "normalize",
+ "Polymer.Path.split": "split",
+ "Polymer.Path.get": "get",
+ "Polymer.Path.set": "set",
+ "Polymer.Path": "*"
+ }
+ },
+ "lib/utils/case-map.html": {
+ "convertedUrl": "lib/utils/case-map.js",
+ "exports": {
+ "Polymer.CaseMap.dashToCamelCase": "dashToCamelCase",
+ "Polymer.CaseMap.camelToDashCase": "camelToDashCase",
+ "Polymer.CaseMap": "*"
+ }
+ },
+ "lib/mixins/property-accessors.html": {
+ "convertedUrl": "lib/mixins/property-accessors.js",
+ "exports": {
+ "Polymer.PropertyAccessors": "PropertyAccessors"
+ }
+ },
+ "lib/mixins/properties-changed.html": {
+ "convertedUrl": "lib/mixins/properties-changed.js",
+ "exports": {
+ "Polymer.PropertiesChanged": "PropertiesChanged"
+ }
+ },
+ "lib/utils/async.html": {
+ "convertedUrl": "lib/utils/async.js",
+ "exports": {
+ "Polymer.Async.timeOut": "timeOut",
+ "Polymer.Async.animationFrame": "animationFrame",
+ "Polymer.Async.idlePeriod": "idlePeriod",
+ "Polymer.Async.microTask": "microTask",
+ "Polymer.Async": "*"
+ }
+ },
+ "lib/mixins/template-stamp.html": {
+ "convertedUrl": "lib/mixins/template-stamp.js",
+ "exports": {
+ "Polymer.TemplateStamp": "TemplateStamp"
+ }
+ },
+ "lib/mixins/properties-mixin.html": {
+ "convertedUrl": "lib/mixins/properties-mixin.js",
+ "exports": {
+ "Polymer.PropertiesMixin": "PropertiesMixin"
+ }
+ },
+ "lib/mixins/gesture-event-listeners.html": {
+ "convertedUrl": "lib/mixins/gesture-event-listeners.js",
+ "exports": {
+ "Polymer.GestureEventListeners": "GestureEventListeners"
+ }
+ },
+ "lib/utils/gestures.html": {
+ "convertedUrl": "lib/utils/gestures.js",
+ "exports": {
+ "Gestures.findOriginalTarget": "findOriginalTarget",
+ "Gestures.add": "add",
+ "Gestures.remove": "remove",
+ "Polymer.Gestures.gestures": "gestures",
+ "Polymer.Gestures.recognizers": "recognizers",
+ "Polymer.Gestures.deepTargetFind": "deepTargetFind",
+ "Polymer.Gestures._findOriginalTarget": "_findOriginalTarget",
+ "Polymer.Gestures._handleNative": "_handleNative",
+ "Polymer.Gestures._handleTouchAction": "_handleTouchAction",
+ "Polymer.Gestures.addListener": "addListener",
+ "Polymer.Gestures.removeListener": "removeListener",
+ "Polymer.Gestures._add": "_add",
+ "Polymer.Gestures._remove": "_remove",
+ "Polymer.Gestures.register": "register",
+ "Polymer.Gestures._findRecognizerByEvent": "_findRecognizerByEvent",
+ "Polymer.Gestures.setTouchAction": "setTouchAction",
+ "Polymer.Gestures._fire": "_fire",
+ "Polymer.Gestures.prevent": "prevent",
+ "Polymer.Gestures.resetMouseCanceller": "resetMouseCanceller",
+ "Polymer.Gestures": "*"
+ }
+ },
+ "lib/utils/debounce.html": {
+ "convertedUrl": "lib/utils/debounce.js",
+ "exports": {
+ "Polymer.Debouncer": "Debouncer"
+ }
+ },
+ "lib/mixins/dir-mixin.html": {
+ "convertedUrl": "lib/mixins/dir-mixin.js",
+ "exports": {
+ "Polymer.DirMixin": "DirMixin"
+ }
+ },
+ "lib/utils/render-status.html": {
+ "convertedUrl": "lib/utils/render-status.js",
+ "exports": {
+ "Polymer.RenderStatus.beforeNextRender": "beforeNextRender",
+ "Polymer.RenderStatus.afterNextRender": "afterNextRender",
+ "Polymer.RenderStatus.flush": "flush",
+ "Polymer.RenderStatus": "*"
+ }
+ },
+ "lib/utils/unresolved.html": {
+ "convertedUrl": "lib/utils/unresolved.js",
+ "exports": {}
+ },
+ "lib/legacy/polymer.dom.html": {
+ "convertedUrl": "lib/legacy/polymer.dom.js",
+ "exports": {
+ "Polymer.DomApi": "DomApi",
+ "Polymer.dom": "dom",
+ "Polymer.dom.matchesSelector": "matchesSelector",
+ "Polymer.dom.flush": "flush",
+ "Polymer.dom.addDebouncer": "addDebouncer"
+ }
+ },
+ "lib/utils/flattened-nodes-observer.html": {
+ "convertedUrl": "lib/utils/flattened-nodes-observer.js",
+ "exports": {
+ "Polymer.FlattenedNodesObserver": "FlattenedNodesObserver"
+ }
+ },
+ "lib/utils/array-splice.html": {
+ "convertedUrl": "lib/utils/array-splice.js",
+ "exports": {
+ "Polymer.ArraySplice.calculateSplices": "calculateSplices",
+ "Polymer.ArraySplice": "*"
+ }
+ },
+ "lib/utils/flush.html": {
+ "convertedUrl": "lib/utils/flush.js",
+ "exports": {
+ "Polymer.enqueueDebouncer": "enqueueDebouncer",
+ "Polymer.flush": "flush"
+ }
+ },
+ "lib/legacy/polymer-fn.html": {
+ "convertedUrl": "lib/legacy/polymer-fn.js",
+ "exports": {
+ "Polymer": "Polymer"
+ }
+ },
+ "lib/legacy/class.html": {
+ "convertedUrl": "lib/legacy/class.js",
+ "exports": {
+ "Polymer.Class": "Class",
+ "Polymer.mixinBehaviors": "mixinBehaviors"
+ }
+ },
+ "lib/legacy/templatizer-behavior.html": {
+ "convertedUrl": "lib/legacy/templatizer-behavior.js",
+ "exports": {
+ "Polymer.Templatizer": "Templatizer"
+ }
+ },
+ "lib/utils/templatize.html": {
+ "convertedUrl": "lib/utils/templatize.js",
+ "exports": {
+ "Polymer.Templatize.templatize": "templatize",
+ "Polymer.Templatize.modelForElement": "modelForElement",
+ "Polymer.Templatize": "*",
+ "Polymer.TemplateInstanceBase": "TemplateInstanceBase"
+ }
+ },
+ "lib/mixins/mutable-data.html": {
+ "convertedUrl": "lib/mixins/mutable-data.js",
+ "exports": {
+ "Polymer.MutableData": "MutableData",
+ "Polymer.OptionalMutableData": "OptionalMutableData"
+ }
+ },
+ "lib/elements/dom-bind.html": {
+ "convertedUrl": "lib/elements/dom-bind.js",
+ "exports": {
+ "Polymer.DomBind": "DomBind"
+ }
+ },
+ "lib/elements/dom-repeat.html": {
+ "convertedUrl": "lib/elements/dom-repeat.js",
+ "exports": {
+ "Polymer.DomRepeat": "DomRepeat"
+ }
+ },
+ "polymer-element.html": {
+ "convertedUrl": "polymer-element.js",
+ "exports": {
+ "Polymer.Element": "PolymerElement",
+ "Polymer.html": "html"
+ }
+ },
+ "lib/utils/html-tag.html": {
+ "convertedUrl": "lib/utils/html-tag.js",
+ "exports": {
+ "Polymer.html": "html",
+ "Polymer.htmlLiteral": "htmlLiteral"
+ }
+ },
+ "lib/elements/dom-if.html": {
+ "convertedUrl": "lib/elements/dom-if.js",
+ "exports": {
+ "Polymer.DomIf": "DomIf"
+ }
+ },
+ "lib/elements/array-selector.html": {
+ "convertedUrl": "lib/elements/array-selector.js",
+ "exports": {
+ "Polymer.ArraySelectorMixin": "ArraySelectorMixin",
+ "Polymer.ArraySelector": "ArraySelector"
+ }
+ },
+ "lib/elements/custom-style.html": {
+ "convertedUrl": "lib/elements/custom-style.js",
+ "exports": {
+ "Polymer.CustomStyle": "CustomStyle"
+ }
+ },
+ "lib/legacy/mutable-data-behavior.html": {
+ "convertedUrl": "lib/legacy/mutable-data-behavior.js",
+ "exports": {
+ "Polymer.MutableDataBehavior": "MutableDataBehavior",
+ "Polymer.OptionalMutableDataBehavior": "OptionalMutableDataBehavior"
+ }
+ },
+ "index.html": {
+ "convertedUrl": "index.html",
+ "exports": {}
+ },
+ "externs/polymer-internal-types.html": {
+ "convertedUrl": "externs/polymer-internal-types.html",
+ "exports": {}
+ },
+ "test/runner.html": {
+ "convertedUrl": "test/runner.html",
+ "exports": {}
+ },
+ "test/smoke/alacarte-property-accessors.html": {
+ "convertedUrl": "test/smoke/alacarte-property-accessors.html",
+ "exports": {}
+ },
+ "test/smoke/alacarte-property-effects-ordering.html": {
+ "convertedUrl": "test/smoke/alacarte-property-effects-ordering.html",
+ "exports": {}
+ },
+ "test/smoke/alacarte-property-effects.html": {
+ "convertedUrl": "test/smoke/alacarte-property-effects.html",
+ "exports": {}
+ },
+ "test/smoke/alacarte-template-stamp.html": {
+ "convertedUrl": "test/smoke/alacarte-template-stamp.html",
+ "exports": {}
+ },
+ "test/smoke/behavior-mixin.html": {
+ "convertedUrl": "test/smoke/behavior-mixin.html",
+ "exports": {}
+ },
+ "test/smoke/data-table.html": {
+ "convertedUrl": "test/smoke/data-table.html",
+ "exports": {}
+ },
+ "test/smoke/dirty-check.html": {
+ "convertedUrl": "test/smoke/dirty-check.html",
+ "exports": {}
+ },
+ "test/smoke/disable-upgrade.html": {
+ "convertedUrl": "test/smoke/disable-upgrade.html",
+ "exports": {}
+ },
+ "lib/mixins/disable-upgrade-mixin.html": {
+ "convertedUrl": "lib/mixins/disable-upgrade-mixin.js",
+ "exports": {
+ "Polymer.DisableUpgradeMixin": "DisableUpgradeMixin"
+ }
+ },
+ "test/smoke/disabled-attr-gestures.html": {
+ "convertedUrl": "test/smoke/disabled-attr-gestures.html",
+ "exports": {}
+ },
+ "test/smoke/dom-if.html": {
+ "convertedUrl": "test/smoke/dom-if.html",
+ "exports": {}
+ },
+ "test/smoke/gestures.html": {
+ "convertedUrl": "test/smoke/gestures.html",
+ "exports": {}
+ },
+ "test/smoke/html-tag.html": {
+ "convertedUrl": "test/smoke/html-tag.html",
+ "exports": {}
+ },
+ "test/smoke/label-click.html": {
+ "convertedUrl": "test/smoke/label-click.html",
+ "exports": {}
+ },
+ "test/smoke/ordering-test.html": {
+ "convertedUrl": "test/smoke/ordering-test.html",
+ "exports": {}
+ },
+ "test/smoke/passive-gestures.html": {
+ "convertedUrl": "test/smoke/passive-gestures.html",
+ "exports": {}
+ },
+ "test/smoke/style-props/test.html": {
+ "convertedUrl": "test/smoke/style-props/test.html",
+ "exports": {}
+ },
+ "test/smoke/style-props/src/scopes.html": {
+ "convertedUrl": "test/smoke/style-props/src/scopes.js",
+ "exports": {}
+ },
+ "test/smoke/style-props/src/settings.html": {
+ "convertedUrl": "test/smoke/style-props/src/settings.js",
+ "exports": {}
+ },
+ "test/smoke/style-props/src/elements.html": {
+ "convertedUrl": "test/smoke/style-props/src/elements.js",
+ "exports": {}
+ },
+ "test/smoke/style-props/src/elements-defaults.html": {
+ "convertedUrl": "test/smoke/style-props/src/elements-defaults.js",
+ "exports": {}
+ },
+ "test/unit/array-selector.html": {
+ "convertedUrl": "test/unit/array-selector.html",
+ "exports": {}
+ },
+ "test/unit/array-selector-elements.html": {
+ "convertedUrl": "test/unit/array-selector-elements.js",
+ "exports": {}
+ },
+ "test/unit/async.html": {
+ "convertedUrl": "test/unit/async.html",
+ "exports": {}
+ },
+ "test/unit/attributes.html": {
+ "convertedUrl": "test/unit/attributes.html",
+ "exports": {}
+ },
+ "test/unit/attributes-elements.html": {
+ "convertedUrl": "test/unit/attributes-elements.js",
+ "exports": {}
+ },
+ "test/unit/behaviors.html": {
+ "convertedUrl": "test/unit/behaviors.html",
+ "exports": {}
+ },
+ "test/unit/case-map.html": {
+ "convertedUrl": "test/unit/case-map.html",
+ "exports": {}
+ },
+ "test/unit/configure.html": {
+ "convertedUrl": "test/unit/configure.html",
+ "exports": {}
+ },
+ "test/unit/css-parse.html": {
+ "convertedUrl": "test/unit/css-parse.html",
+ "exports": {}
+ },
+ "test/unit/custom-style-async-import.html": {
+ "convertedUrl": "test/unit/custom-style-async-import.html",
+ "exports": {}
+ },
+ "test/unit/custom-style-async.html": {
+ "convertedUrl": "test/unit/custom-style-async.html",
+ "exports": {}
+ },
+ "test/unit/custom-style-late.html": {
+ "convertedUrl": "test/unit/custom-style-late.html",
+ "exports": {}
+ },
+ "test/unit/custom-style-scope-cache.html": {
+ "convertedUrl": "test/unit/custom-style-scope-cache.html",
+ "exports": {}
+ },
+ "test/unit/custom-style.html": {
+ "convertedUrl": "test/unit/custom-style.html",
+ "exports": {}
+ },
+ "test/unit/custom-style-import.html": {
+ "convertedUrl": "test/unit/custom-style-import.js",
+ "exports": {}
+ },
+ "test/unit/sub/style-import.html": {
+ "convertedUrl": "test/unit/sub/style-import.js",
+ "exports": {}
+ },
+ "test/unit/debounce.html": {
+ "convertedUrl": "test/unit/debounce.html",
+ "exports": {}
+ },
+ "test/unit/dir.html": {
+ "convertedUrl": "test/unit/dir.html",
+ "exports": {}
+ },
+ "test/unit/disable-upgrade.html": {
+ "convertedUrl": "test/unit/disable-upgrade.html",
+ "exports": {}
+ },
+ "test/unit/dom-bind.html": {
+ "convertedUrl": "test/unit/dom-bind.html",
+ "exports": {}
+ },
+ "test/unit/dom-bind-elements1.html": {
+ "convertedUrl": "test/unit/dom-bind-elements1.js",
+ "exports": {}
+ },
+ "test/unit/dom-bind-elements2.html": {
+ "convertedUrl": "test/unit/dom-bind-elements2.js",
+ "exports": {}
+ },
+ "test/unit/dom-if.html": {
+ "convertedUrl": "test/unit/dom-if.html",
+ "exports": {}
+ },
+ "test/unit/dom-if-elements.html": {
+ "convertedUrl": "test/unit/dom-if-elements.js",
+ "exports": {}
+ },
+ "test/unit/dom-repeat.html": {
+ "convertedUrl": "test/unit/dom-repeat.html",
+ "exports": {}
+ },
+ "test/unit/dom-repeat-elements.html": {
+ "convertedUrl": "test/unit/dom-repeat-elements.js",
+ "exports": {}
+ },
+ "test/unit/dynamic-import.html": {
+ "convertedUrl": "test/unit/dynamic-import.html",
+ "exports": {}
+ },
+ "test/unit/dynamic-imports/dynamic-element.html": {
+ "convertedUrl": "test/unit/dynamic-imports/dynamic-element.js",
+ "exports": {}
+ },
+ "test/unit/events.html": {
+ "convertedUrl": "test/unit/events.html",
+ "exports": {}
+ },
+ "test/unit/events-elements.html": {
+ "convertedUrl": "test/unit/events-elements.js",
+ "exports": {}
+ },
+ "test/unit/flattened-nodes-observer.html": {
+ "convertedUrl": "test/unit/flattened-nodes-observer.html",
+ "exports": {}
+ },
+ "test/unit/gestures.html": {
+ "convertedUrl": "test/unit/gestures.html",
+ "exports": {}
+ },
+ "test/unit/gestures-elements.html": {
+ "convertedUrl": "test/unit/gestures-elements.js",
+ "exports": {}
+ },
+ "test/unit/globals.html": {
+ "convertedUrl": "test/unit/globals.html",
+ "exports": {}
+ },
+ "test/unit/html-tag.html": {
+ "convertedUrl": "test/unit/html-tag.html",
+ "exports": {}
+ },
+ "test/unit/importHref.html": {
+ "convertedUrl": "test/unit/importHref.html",
+ "exports": {}
+ },
+ "test/unit/inheritance.html": {
+ "convertedUrl": "test/unit/inheritance.html",
+ "exports": {}
+ },
+ "test/unit/logging.html": {
+ "convertedUrl": "test/unit/logging.html",
+ "exports": {}
+ },
+ "test/unit/mixin-behaviors.html": {
+ "convertedUrl": "test/unit/mixin-behaviors.html",
+ "exports": {}
+ },
+ "test/unit/mixin-utils.html": {
+ "convertedUrl": "test/unit/mixin-utils.html",
+ "exports": {}
+ },
+ "test/unit/multi-style.html": {
+ "convertedUrl": "test/unit/multi-style.html",
+ "exports": {}
+ },
+ "test/unit/path-effects.html": {
+ "convertedUrl": "test/unit/path-effects.html",
+ "exports": {}
+ },
+ "test/unit/path-effects-elements.html": {
+ "convertedUrl": "test/unit/path-effects-elements.js",
+ "exports": {}
+ },
+ "test/unit/path.html": {
+ "convertedUrl": "test/unit/path.html",
+ "exports": {}
+ },
+ "test/unit/polymer-dom-observeNodes.html": {
+ "convertedUrl": "test/unit/polymer-dom-observeNodes.html",
+ "exports": {}
+ },
+ "test/unit/polymer-dom.html": {
+ "convertedUrl": "test/unit/polymer-dom.html",
+ "exports": {}
+ },
+ "test/unit/polymer-element-with-apply.html": {
+ "convertedUrl": "test/unit/polymer-element-with-apply.html",
+ "exports": {}
+ },
+ "test/unit/polymer-element-with-apply-import.html": {
+ "convertedUrl": "test/unit/polymer-element-with-apply-import.js",
+ "exports": {}
+ },
+ "test/unit/polymer.element.html": {
+ "convertedUrl": "test/unit/polymer.element.html",
+ "exports": {}
+ },
+ "test/unit/polymer.legacyelement.html": {
+ "convertedUrl": "test/unit/polymer.legacyelement.html",
+ "exports": {}
+ },
+ "test/unit/polymer.properties-mixin-with-property-accessors.html": {
+ "convertedUrl": "test/unit/polymer.properties-mixin-with-property-accessors.html",
+ "exports": {}
+ },
+ "test/unit/polymer.properties-mixin.html": {
+ "convertedUrl": "test/unit/polymer.properties-mixin.html",
+ "exports": {}
+ },
+ "test/unit/properties-changed.html": {
+ "convertedUrl": "test/unit/properties-changed.html",
+ "exports": {}
+ },
+ "test/unit/property-accessors.html": {
+ "convertedUrl": "test/unit/property-accessors.html",
+ "exports": {}
+ },
+ "test/unit/property-effects-template.html": {
+ "convertedUrl": "test/unit/property-effects-template.html",
+ "exports": {}
+ },
+ "test/unit/property-effects.html": {
+ "convertedUrl": "test/unit/property-effects.html",
+ "exports": {}
+ },
+ "test/unit/property-effects-elements.html": {
+ "convertedUrl": "test/unit/property-effects-elements.js",
+ "exports": {}
+ },
+ "test/unit/ready-attached-order-class.html": {
+ "convertedUrl": "test/unit/ready-attached-order-class.html",
+ "exports": {}
+ },
+ "test/unit/ready-attached-order.html": {
+ "convertedUrl": "test/unit/ready-attached-order.html",
+ "exports": {}
+ },
+ "test/unit/render-status.html": {
+ "convertedUrl": "test/unit/render-status.html",
+ "exports": {}
+ },
+ "test/unit/resolveurl.html": {
+ "convertedUrl": "test/unit/resolveurl.html",
+ "exports": {}
+ },
+ "test/unit/sub/resolveurl-elements.html": {
+ "convertedUrl": "test/unit/sub/resolveurl-elements.js",
+ "exports": {}
+ },
+ "test/unit/shady-content.html": {
+ "convertedUrl": "test/unit/shady-content.html",
+ "exports": {}
+ },
+ "test/unit/shady-dynamic.html": {
+ "convertedUrl": "test/unit/shady-dynamic.html",
+ "exports": {}
+ },
+ "test/unit/shady-events.html": {
+ "convertedUrl": "test/unit/shady-events.html",
+ "exports": {}
+ },
+ "test/unit/shady-unscoped-style.html": {
+ "convertedUrl": "test/unit/shady-unscoped-style.html",
+ "exports": {}
+ },
+ "test/unit/shady-unscoped-style-import.html": {
+ "convertedUrl": "test/unit/shady-unscoped-style-import.js",
+ "exports": {}
+ },
+ "test/unit/shady-unscoped-style-import-css.html": {
+ "convertedUrl": "test/unit/shady-unscoped-style-import-css.js",
+ "exports": {}
+ },
+ "test/unit/shady.html": {
+ "convertedUrl": "test/unit/shady.html",
+ "exports": {}
+ },
+ "test/unit/styling-cross-scope-apply.html": {
+ "convertedUrl": "test/unit/styling-cross-scope-apply.html",
+ "exports": {}
+ },
+ "test/unit/styling-cross-scope-unknown-host.html": {
+ "convertedUrl": "test/unit/styling-cross-scope-unknown-host.html",
+ "exports": {}
+ },
+ "test/unit/styling-cross-scope-var.html": {
+ "convertedUrl": "test/unit/styling-cross-scope-var.html",
+ "exports": {}
+ },
+ "test/unit/styling-import.html": {
+ "convertedUrl": "test/unit/styling-import.html",
+ "exports": {}
+ },
+ "test/unit/styling-import-shared-styles.html": {
+ "convertedUrl": "test/unit/styling-import-shared-styles.js",
+ "exports": {}
+ },
+ "test/unit/styling-only-with-template.html": {
+ "convertedUrl": "test/unit/styling-only-with-template.html",
+ "exports": {}
+ },
+ "test/unit/styling-scoped.html": {
+ "convertedUrl": "test/unit/styling-scoped.html",
+ "exports": {}
+ },
+ "test/unit/template-stamp.html": {
+ "convertedUrl": "test/unit/template-stamp.html",
+ "exports": {}
+ },
+ "test/unit/template-whitespace.html": {
+ "convertedUrl": "test/unit/template-whitespace.html",
+ "exports": {}
+ },
+ "test/unit/templatize.html": {
+ "convertedUrl": "test/unit/templatize.html",
+ "exports": {}
+ },
+ "test/unit/templatize-elements.html": {
+ "convertedUrl": "test/unit/templatize-elements.js",
+ "exports": {}
+ },
+ "test/unit/dynamic-imports/async-import.html": {
+ "convertedUrl": "test/unit/dynamic-imports/async-import.html",
+ "exports": {}
+ },
+ "test/unit/dynamic-imports/async.html": {
+ "convertedUrl": "test/unit/dynamic-imports/async.html",
+ "exports": {}
+ },
+ "test/unit/dynamic-imports/outer-element.html": {
+ "convertedUrl": "test/unit/dynamic-imports/outer-element.html",
+ "exports": {}
+ },
+ "test/unit/dynamic-imports/inner-element.html": {
+ "convertedUrl": "test/unit/dynamic-imports/inner-element.js",
+ "exports": {}
+ },
+ "test/unit/sub/x-sub.html": {
+ "convertedUrl": "test/unit/sub/x-sub.html",
+ "exports": {}
+ },
+ "test/unit/sub/x-test.html": {
+ "convertedUrl": "test/unit/sub/x-test.html",
+ "exports": {}
+ }
+ }
+}
diff --git a/third_party/polymer3/bower_components/polymer/package-lock.json b/third_party/polymer3/bower_components/polymer/package-lock.json
new file mode 100644
index 0000000..3a4c3b7
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/package-lock.json
@@ -0,0 +1,28382 @@
+{
+ "name": "@polymer/polymer",
+ "version": "3.0.2",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@polymer/app-layout": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/app-layout/-/app-layout-3.0.0-pre.12.tgz",
+ "integrity": "sha512-7CIwcse7gXp33WKchW8tqjxhqBL2hZmE/kfQhafA4d7P6iRfDmXAV0JLrh4QFriKQMQnxZp7NG4ZsFE0JQqPJg==",
+ "dev": true,
+ "requires": {
+ "@polymer/iron-flex-layout": "3.0.0-pre.12",
+ "@polymer/iron-media-query": "3.0.0-pre.12",
+ "@polymer/iron-resizable-behavior": "3.0.0-pre.12",
+ "@polymer/iron-scroll-target-behavior": "3.0.0-pre.12",
+ "@polymer/polymer": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/font-roboto": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/font-roboto/-/font-roboto-3.0.0-pre.12.tgz",
+ "integrity": "sha512-D4inM9qe6YgtWLcB3yd7K4yuUjXfc1HqkoTUaLoatMYNFhVfZu60bOvvDEa0jdPFXEq1QmqKjzEJZ6qaX6vHqA==",
+ "dev": true
+ },
+ "@polymer/gen-closure-declarations": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-closure-declarations/-/gen-closure-declarations-0.4.0.tgz",
+ "integrity": "sha512-gRDYxL/2nko1dJDIS+l+nc7BBzIz4x5LF+X+fskXcoiH+2A4PdCBeQXbCSpq9Dne5iig6MIr7GaK+Z3Y+5STCA==",
+ "dev": true,
+ "requires": {
+ "escodegen": "1.9.1",
+ "polymer-analyzer": "2.7.0"
+ }
+ },
+ "@polymer/gen-typescript-declarations": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@polymer/gen-typescript-declarations/-/gen-typescript-declarations-1.2.2.tgz",
+ "integrity": "sha512-9P946+nIkSm+761v3oxH/QVgJozhsInldKY3h8AVstdXkA8W0Fij84pqsFv1nrRuPGj4Pv71crzoZpFnLkNmKQ==",
+ "dev": true,
+ "requires": {
+ "@types/doctrine": "0.0.3",
+ "@types/fs-extra": "5.0.2",
+ "@types/glob": "5.0.35",
+ "command-line-args": "5.0.2",
+ "command-line-usage": "5.0.4",
+ "doctrine": "2.1.0",
+ "escodegen": "1.9.1",
+ "fs-extra": "5.0.0",
+ "glob": "7.1.2",
+ "minimatch": "3.0.4",
+ "polymer-analyzer": "3.0.0-pre.14",
+ "vscode-uri": "1.0.3"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
+ "integrity": "sha1-6JLSk8ksnB0/mvcsFaVU+8fgiVo=",
+ "dev": true
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0-pre.14",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0-pre.14.tgz",
+ "integrity": "sha512-1Zh/smUWMrjBB7NFUk8i7EAnjO81PqhI0/RzMMy9VgAbPQ6jOROwFX71T02CgpkZYa0O66Ybl7G3+4+0S1aF1Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/is-windows": "0.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.107",
+ "@types/parse5": "2.2.34",
+ "@types/resolve": "0.0.6",
+ "babel-generator": "6.26.1",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.46",
+ "cancel-token": "0.1.1",
+ "chalk": "1.1.3",
+ "clone": "2.1.1",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "3.0.0",
+ "indent": "0.0.2",
+ "is-windows": "1.0.2",
+ "jsonschema": "1.2.4",
+ "minimatch": "3.0.4",
+ "parse5": "4.0.0",
+ "path-is-inside": "1.0.2",
+ "polymer-project-config": "3.13.0",
+ "resolve": "1.7.1",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.8",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.3",
+ "whatwg-url": "6.4.1"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ }
+ }
+ }
+ }
+ },
+ "@polymer/iron-a11y-announcer": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/iron-a11y-announcer/-/iron-a11y-announcer-3.0.0-pre.12.tgz",
+ "integrity": "sha512-s/ZU02aYqkvNhZ8vCN2GJvk6KZYYLB38pFaoP3y005FddOiLb+TlXUDGpGhfO6iDo9D8zO5jn+o92jJtJ9Gg6g==",
+ "dev": true,
+ "requires": {
+ "@polymer/polymer": "3.0.0-pre.12"
+ },
+ "dependencies": {
+ "jsesc": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz",
+ "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4="
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+ }
+ }
+ },
+ "@polymer/iron-a11y-keys-behavior": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/iron-a11y-keys-behavior/-/iron-a11y-keys-behavior-3.0.0-pre.12.tgz",
+ "integrity": "sha512-QLnvWTDYlObHeWvflWFDlSaEljZopYT8/D3XCaWtN6cSgsdnHe6uoV+W95YgAP+w9KM13vZZEpa4zJjmlAYrFA==",
+ "dev": true,
+ "requires": {
+ "@polymer/polymer": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/iron-ajax": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/iron-ajax/-/iron-ajax-3.0.0-pre.12.tgz",
+ "integrity": "sha512-lUZrNm2pJthanU2DifTfeve27n2DoioVu+sR07j2TVEyhOB2n9Wom2HaXSNd/7gvWjDqZi54OJFEjxaH/mmraA==",
+ "dev": true,
+ "requires": {
+ "@polymer/polymer": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/iron-behaviors": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/iron-behaviors/-/iron-behaviors-3.0.0-pre.12.tgz",
+ "integrity": "sha512-ros9dbO52jmV+henJxEXvoOx1tzX6i70aIOTgI92ebInPmyvtx5WeX1QXzUUMnUi4hKYLFZWqubgVQ4Hyu+pGw==",
+ "dev": true,
+ "requires": {
+ "@polymer/iron-a11y-keys-behavior": "3.0.0-pre.12",
+ "@polymer/polymer": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/iron-checked-element-behavior": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/iron-checked-element-behavior/-/iron-checked-element-behavior-3.0.0-pre.12.tgz",
+ "integrity": "sha512-pCzvDOxEBybdMbtKIaAxcE/jBU+BISsVc552i9EOMqtBBPap5CFgtg1s9IC4jhEN+1Hw8xY3rQcHu1b7BFV9ow==",
+ "dev": true,
+ "requires": {
+ "@polymer/iron-form-element-behavior": "3.0.0-pre.12",
+ "@polymer/iron-validatable-behavior": "3.0.0-pre.12",
+ "@polymer/polymer": "3.0.0-pre.12"
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.35.tgz",
+ "integrity": "sha512-l0SE8cl9DUIY4hYAFAKTLX3F2Yr14Qri7uTsuI7iegB5E4KyQy4XY72L3VOxmj6kwR/RDQURoKYr2NzyETGo7A==",
+ "requires": {
+ "chalk": "2.4.1",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "@babel/helper-function-name": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.35.tgz",
+ "integrity": "sha512-+216NxQ7/Lvj+iehFBKEhYU/BQ1aqHTWz1bxCDiQWms0qi23iqHA4r+WdRKW/o5dAV5mlTUL4nCBFaNx8LNnRQ==",
+ "requires": {
+ "@babel/helper-get-function-arity": "7.0.0-beta.35",
+ "@babel/template": "7.0.0-beta.35",
+ "@babel/types": "7.0.0-beta.35"
+ }
+ },
+ "@babel/helper-get-function-arity": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.35.tgz",
+ "integrity": "sha512-8co9nT1MgbNoGl6too2/jwldu5F7O1rMi+/QsM9bmFuCu76rU5okFWi4cb4Uv0WXZ4BWk6x+Lpdzzu7EgvkAwA==",
+ "requires": {
+ "@babel/types": "7.0.0-beta.35"
+ }
+ },
+ "@babel/template": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.35.tgz",
+ "integrity": "sha512-NLd3Dfs8hmkxPvaD8ohNtEp9WXp48lxpW//6fXcT9bJWIO3isrH3OTYL9kjX7xFPPasJ1E9bUNSaPFUUgvPZSQ==",
+ "requires": {
+ "@babel/code-frame": "7.0.0-beta.35",
+ "@babel/types": "7.0.0-beta.35",
+ "babylon": "7.0.0-beta.35",
+ "lodash": "4.17.10"
+ }
+ },
+ "@babel/types": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.35.tgz",
+ "integrity": "sha512-y9XT11CozHDgjWcTdxmhSj13rJVXpa5ZXwjjOiTedjaM0ba5ItqdS02t31EhPl7HtOWxsZkYCCUNrSfrOisA6w==",
+ "requires": {
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "2.0.0"
+ }
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "babylon": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.35.tgz",
+ "integrity": "sha512-Y2o5scalPPlI6eOYMat6iqoM8akjqkAv9cXUN/7YNe3FANAsAGcF5L2u6XiUtBECvhyf7LeZYyzNYnjk43Vffg=="
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ },
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
+ }
+ }
+ },
+ "@polymer/iron-component-page": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/iron-component-page/-/iron-component-page-3.0.0-pre.12.tgz",
+ "integrity": "sha512-Or8NsZ1o1aCgT6Ae6g9eyeSiWrRanjeJOPJYFJFgZRXnfbfDT55+6Dn+q0i8i1kGo8+Nd6488bxQQkVZFDwNsw==",
+ "dev": true,
+ "requires": {
+ "@polymer/app-layout": "3.0.0-pre.12",
+ "@polymer/iron-ajax": "3.0.0-pre.12",
+ "@polymer/iron-doc-viewer": "3.0.0-pre.12",
+ "@polymer/iron-icons": "3.0.0-pre.12",
+ "@polymer/paper-icon-button": "3.0.0-pre.12",
+ "@polymer/paper-styles": "3.0.0-pre.12",
+ "@polymer/paper-toast": "3.0.0-pre.12",
+ "@polymer/polymer": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/iron-doc-viewer": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/iron-doc-viewer/-/iron-doc-viewer-3.0.0-pre.12.tgz",
+ "integrity": "sha512-fivsKXRG6qD7KlSSzZ533eoLgMNmzS9oa//HxmIMVptBp7p4+iqW7A1kUDQw/QeKhwkkvRxQNupxRi8O3TIA7w==",
+ "dev": true,
+ "requires": {
+ "@polymer/iron-location": "3.0.0-pre.12",
+ "@polymer/marked-element": "3.0.0-pre.12",
+ "@polymer/paper-styles": "3.0.0-pre.12",
+ "@polymer/polymer": "3.0.0-pre.12",
+ "@polymer/prism-element": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/iron-fit-behavior": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/iron-fit-behavior/-/iron-fit-behavior-3.0.0-pre.12.tgz",
+ "integrity": "sha512-b0ln6rPpC7/bRjHp1aPIaCGuJr4Q4b67AxYV6FaoSMCR9RrlQTvJfvMkrcygrDCpm0DH0e7nL6IJHRmHBTrK9w==",
+ "dev": true,
+ "requires": {
+ "@polymer/polymer": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/iron-flex-layout": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/iron-flex-layout/-/iron-flex-layout-3.0.0-pre.12.tgz",
+ "integrity": "sha512-JvctZ1K5TeRsoGMxVB1yBZYEWONQvyCdcmaoCB6gOJ9R5eq5ebAg2JPNSITAp9CTL2i08Af4tQER3AXzaKyi3A==",
+ "dev": true,
+ "requires": {
+ "@polymer/polymer": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/iron-form-element-behavior": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/iron-form-element-behavior/-/iron-form-element-behavior-3.0.0-pre.12.tgz",
+ "integrity": "sha512-i3gAVSq4TbQyGqhHo7HLbzkZ3E1+ua1+U3vUSdVTs3R+qgAXqlIgUDuEintB42X49IvumEy/qWxxxvqL9oZhYw==",
+ "dev": true,
+ "requires": {
+ "@polymer/polymer": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/iron-icon": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/iron-icon/-/iron-icon-3.0.0-pre.12.tgz",
+ "integrity": "sha512-S5I324FBMh8/MPBDVtfHS8FVKszhqhhdDjB0QsJ9dBooB5aZKwGyHMXgHW9dcnu+PjM7nP5532u4tpFdBw9TWg==",
+ "dev": true,
+ "requires": {
+ "@polymer/iron-flex-layout": "3.0.0-pre.12",
+ "@polymer/iron-meta": "3.0.0-pre.12",
+ "@polymer/polymer": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/iron-icons": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/iron-icons/-/iron-icons-3.0.0-pre.12.tgz",
+ "integrity": "sha512-NaB1C8bNcll2yMZRuWf+xdLnUTbcUgUP2zjEaRHRHmB3vHxt95Cknbe2xy0s08Mb+1CNeadDEkEgdurf3YnMnA==",
+ "dev": true,
+ "requires": {
+ "@polymer/iron-icon": "3.0.0-pre.12",
+ "@polymer/iron-iconset-svg": "3.0.0-pre.12",
+ "@polymer/polymer": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/iron-iconset-svg": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/iron-iconset-svg/-/iron-iconset-svg-3.0.0-pre.12.tgz",
+ "integrity": "sha512-FAUZjNZrMo6hsRoDoZeAj/kjygUDdv3XbgzoG93yKWxkIhkER2GxmIuYt+5fxx1ZSkB+BCqKnlqk+raGpJ9n6w==",
+ "dev": true,
+ "requires": {
+ "@polymer/iron-meta": "3.0.0-pre.12",
+ "@polymer/polymer": "3.0.0-pre.12"
+ },
+ "dependencies": {
+ "@babel/types": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.35.tgz",
+ "integrity": "sha512-y9XT11CozHDgjWcTdxmhSj13rJVXpa5ZXwjjOiTedjaM0ba5ItqdS02t31EhPl7HtOWxsZkYCCUNrSfrOisA6w==",
+ "requires": {
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "2.0.0"
+ }
+ },
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
+ }
+ }
+ },
+ "@polymer/iron-location": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/iron-location/-/iron-location-3.0.0-pre.12.tgz",
+ "integrity": "sha512-DovMCY4bF8YayceGS8fQ2lXC2RXG7KD9F3SUhL7llCiwL3Q4m1G2wCfm/m/q0SLYajZfR/zAAYVvvYJRrsKcKg==",
+ "dev": true,
+ "requires": {
+ "@polymer/polymer": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/iron-media-query": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/iron-media-query/-/iron-media-query-3.0.0-pre.12.tgz",
+ "integrity": "sha512-6Ei0NXrKI01wObWez0fTwBvMcC5nqD0uNKQKOOug9ufPKyCwUNIHM0OUrjShfkbMwoJXPL2jU3KHokuHZXLrMg==",
+ "dev": true,
+ "requires": {
+ "@polymer/polymer": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/iron-meta": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/iron-meta/-/iron-meta-3.0.0-pre.12.tgz",
+ "integrity": "sha512-Yi+Xiu0OlxTiAxWx+X9DuI35dTRm2/lHQqWplubZSGHW+ANuItOTxOLlTm175kq5HY7V8JQtiugko0xaJ60V4A==",
+ "dev": true,
+ "requires": {
+ "@polymer/polymer": "3.0.0-pre.12"
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.35.tgz",
+ "integrity": "sha512-l0SE8cl9DUIY4hYAFAKTLX3F2Yr14Qri7uTsuI7iegB5E4KyQy4XY72L3VOxmj6kwR/RDQURoKYr2NzyETGo7A==",
+ "requires": {
+ "chalk": "2.4.1",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "@babel/helper-function-name": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.35.tgz",
+ "integrity": "sha512-+216NxQ7/Lvj+iehFBKEhYU/BQ1aqHTWz1bxCDiQWms0qi23iqHA4r+WdRKW/o5dAV5mlTUL4nCBFaNx8LNnRQ==",
+ "requires": {
+ "@babel/helper-get-function-arity": "7.0.0-beta.35",
+ "@babel/template": "7.0.0-beta.35",
+ "@babel/types": "7.0.0-beta.35"
+ }
+ },
+ "@babel/helper-get-function-arity": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.35.tgz",
+ "integrity": "sha512-8co9nT1MgbNoGl6too2/jwldu5F7O1rMi+/QsM9bmFuCu76rU5okFWi4cb4Uv0WXZ4BWk6x+Lpdzzu7EgvkAwA==",
+ "requires": {
+ "@babel/types": "7.0.0-beta.35"
+ }
+ },
+ "@babel/template": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.35.tgz",
+ "integrity": "sha512-NLd3Dfs8hmkxPvaD8ohNtEp9WXp48lxpW//6fXcT9bJWIO3isrH3OTYL9kjX7xFPPasJ1E9bUNSaPFUUgvPZSQ==",
+ "requires": {
+ "@babel/code-frame": "7.0.0-beta.35",
+ "@babel/types": "7.0.0-beta.35",
+ "babylon": "7.0.0-beta.35",
+ "lodash": "4.17.10"
+ }
+ },
+ "@babel/traverse": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.35.tgz",
+ "integrity": "sha512-oj2mjz/20iiDt+X0mlzE2IEkzLyM0nmT1zSUy/6i6vyzitVeoyRaHoM7O81gmAHSfBSqyjWRU0OuD9VIUgj8Vg==",
+ "requires": {
+ "@babel/code-frame": "7.0.0-beta.35",
+ "@babel/helper-function-name": "7.0.0-beta.35",
+ "@babel/types": "7.0.0-beta.35",
+ "babylon": "7.0.0-beta.35",
+ "debug": "3.1.0",
+ "globals": "10.4.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "@babel/types": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.35.tgz",
+ "integrity": "sha512-y9XT11CozHDgjWcTdxmhSj13rJVXpa5ZXwjjOiTedjaM0ba5ItqdS02t31EhPl7HtOWxsZkYCCUNrSfrOisA6w==",
+ "requires": {
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "2.0.0"
+ }
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "babylon": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.35.tgz",
+ "integrity": "sha512-Y2o5scalPPlI6eOYMat6iqoM8akjqkAv9cXUN/7YNe3FANAsAGcF5L2u6XiUtBECvhyf7LeZYyzNYnjk43Vffg=="
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ },
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
+ }
+ }
+ },
+ "@polymer/iron-overlay-behavior": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/iron-overlay-behavior/-/iron-overlay-behavior-3.0.0-pre.12.tgz",
+ "integrity": "sha512-qvpCckvzjYszSI9i235Ft+kLIxpRTWLsrhdBtnEycvwk6qtYhQDH+314409n40xoyT6zp8dmUXpuwMetNgr+sA==",
+ "dev": true,
+ "requires": {
+ "@polymer/iron-a11y-keys-behavior": "3.0.0-pre.12",
+ "@polymer/iron-fit-behavior": "3.0.0-pre.12",
+ "@polymer/iron-resizable-behavior": "3.0.0-pre.12",
+ "@polymer/polymer": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/iron-resizable-behavior": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/iron-resizable-behavior/-/iron-resizable-behavior-3.0.0-pre.12.tgz",
+ "integrity": "sha512-ppZGXh//MVkWedjQtgOzBHiuoyTcKggnnMjVHxFsGdIu5kz9LVqB8uqYbN91yhjtLLUAkSIAo1DLhXpoK2x27w==",
+ "dev": true,
+ "requires": {
+ "@polymer/polymer": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/iron-scroll-target-behavior": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/iron-scroll-target-behavior/-/iron-scroll-target-behavior-3.0.0-pre.12.tgz",
+ "integrity": "sha512-M+m/myMkARPxvCVj8CcLYIDaTBUEuZr5+3mTTRFY1N2pf8bt7mjEJ6lUpPAfe89+abSHXJMEXf1VjsVSXwDFSg==",
+ "dev": true,
+ "requires": {
+ "@polymer/polymer": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/iron-validatable-behavior": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/iron-validatable-behavior/-/iron-validatable-behavior-3.0.0-pre.12.tgz",
+ "integrity": "sha512-80Zblp9n+2nepymuOMJcdmf0F5uxYrbRQdbt2eDStmXjlqcbxgTrdmHY93Pb2n1mwcvjHXU3ex3W4TtVaeX6Rg==",
+ "dev": true,
+ "requires": {
+ "@polymer/iron-meta": "3.0.0-pre.12",
+ "@polymer/polymer": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/marked-element": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/marked-element/-/marked-element-3.0.0-pre.12.tgz",
+ "integrity": "sha512-S+jXTkTchuHGAFnzkhLhOq8MPDu3VSAMdVssFslnQkjwnKwewuxux8Y2fJqzGFQJt03JpkGk6fcNET/byDqqfQ==",
+ "dev": true,
+ "requires": {
+ "@polymer/polymer": "3.0.0-pre.12",
+ "marked": "0.3.19"
+ }
+ },
+ "@polymer/paper-behaviors": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/paper-behaviors/-/paper-behaviors-3.0.0-pre.12.tgz",
+ "integrity": "sha512-S1YRAwg7B+8P/ju4w8Fk1CMU9DMI/Hv5/MceN/10IX5znGnYqXZrOEHfUiYAM+P5RivsOn4UJdG7wyxAnrCzkg==",
+ "dev": true,
+ "requires": {
+ "@polymer/iron-behaviors": "3.0.0-pre.12",
+ "@polymer/iron-checked-element-behavior": "3.0.0-pre.12",
+ "@polymer/paper-ripple": "3.0.0-pre.12",
+ "@polymer/polymer": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/paper-icon-button": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/paper-icon-button/-/paper-icon-button-3.0.0-pre.12.tgz",
+ "integrity": "sha512-+s0CO5Ctkb9SOZ+t8m4WeCUImtjHvvz58howHgxqW2nfKTBbDXz3pT1zOA7ngFxTvWOpfPUjRGE4uaapG1e0Xw==",
+ "dev": true,
+ "requires": {
+ "@polymer/iron-icon": "3.0.0-pre.12",
+ "@polymer/paper-behaviors": "3.0.0-pre.12",
+ "@polymer/paper-styles": "3.0.0-pre.12",
+ "@polymer/polymer": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/paper-ripple": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/paper-ripple/-/paper-ripple-3.0.0-pre.12.tgz",
+ "integrity": "sha512-BNyqzLK7eqy6gzXJOr3PGc/5RcSNBouYXIgwiwmiFHWgTc1C8JJnPwE7EuiCfV6WyDY8byFyD10E4jBKHAUwOg==",
+ "dev": true,
+ "requires": {
+ "@polymer/iron-a11y-keys-behavior": "3.0.0-pre.12",
+ "@polymer/polymer": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/paper-styles": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/paper-styles/-/paper-styles-3.0.0-pre.12.tgz",
+ "integrity": "sha512-mZEu5Rgel1vz3m1wz2XEgNN7pHx0yXvrmSspkD8JlPooy3ewNY0VyVHV/kcIcfQxaKQ8I8b59unOQPV48OqCLA==",
+ "dev": true,
+ "requires": {
+ "@polymer/font-roboto": "3.0.0-pre.12",
+ "@polymer/iron-flex-layout": "3.0.0-pre.12",
+ "@polymer/polymer": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/paper-toast": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/paper-toast/-/paper-toast-3.0.0-pre.12.tgz",
+ "integrity": "sha512-F/vKj8VVisA3D7t2D0DZ8SqnzZeNHTrgw+hWFc2hvjxjH2T6Jf9DDgauaF6JN8cbZoTHtbKCNSu3MTgI2Qa78g==",
+ "dev": true,
+ "requires": {
+ "@polymer/iron-a11y-announcer": "3.0.0-pre.12",
+ "@polymer/iron-fit-behavior": "3.0.0-pre.12",
+ "@polymer/iron-overlay-behavior": "3.0.0-pre.12",
+ "@polymer/polymer": "3.0.0-pre.12"
+ }
+ },
+ "@polymer/polymer": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/polymer/-/polymer-3.0.0-pre.12.tgz",
+ "integrity": "sha512-j3ie9DOtENLMR5pG8iyyrFF62lTnKrQCrMVlvgQF2q4qpUXFck0QUlE6gJJN/Zfi3br69mG5+F3mtwQb61OjOQ==",
+ "dev": true,
+ "requires": {
+ "@webcomponents/shadycss": "1.1.3",
+ "@webcomponents/webcomponentsjs": "1.2.0"
+ },
+ "dependencies": {
+ "@webcomponents/shadycss": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@webcomponents/shadycss/-/shadycss-1.1.3.tgz",
+ "integrity": "sha512-tGap6j8LVgy8ORM7pL5Yf6u8tTUH0jJaMmA5St/Ijy9WCNttDnrmZTiEF7fl7QQNerzMnCVQHtO0vuX8kybxfQ==",
+ "dev": true
+ },
+ "@webcomponents/webcomponentsjs": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-1.2.0.tgz",
+ "integrity": "sha512-P9JWydfpBR+CK12UwtBaoD/lYF3PR9XBArAWk5J9nfPaJwA3OUox4StZmyFSVDLsvpFq5HsEtxU/OdHAlAWPnw==",
+ "dev": true
+ }
+ }
+ },
+ "@polymer/prism-element": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/prism-element/-/prism-element-3.0.0-pre.12.tgz",
+ "integrity": "sha512-+a3rQ94KXY2Qe2MM9JKghCsKM27jX8oy33jvjRFsbpxNjqESvHWdba0TtMANGF3ftJU8h2W/t9xebiycsqJg1g==",
+ "dev": true,
+ "requires": {
+ "@polymer/polymer": "3.0.0-pre.12",
+ "prismjs": "1.14.0"
+ }
+ },
+ "@polymer/sinonjs": {
+ "version": "1.17.1",
+ "resolved": "https://registry.npmjs.org/@polymer/sinonjs/-/sinonjs-1.17.1.tgz",
+ "integrity": "sha512-/U8F/cOTrbF2iVVYgINYmvKbtbexs+89Q3v8AaHADRYabTg7aOZGOb0RyWpOI+sUJt04kj63U4FwMhzW5r4wZA==",
+ "dev": true
+ },
+ "@polymer/test-fixture": {
+ "version": "3.0.0-pre.12",
+ "resolved": "https://registry.npmjs.org/@polymer/test-fixture/-/test-fixture-3.0.0-pre.12.tgz",
+ "integrity": "sha512-6OsAdv6VUrVmkSCsDXo2KF/cuyyl5EETzQQpLysHioOYa3vGiYHiMATrw9G6CvuCc3gNevu41ln/XJ2n6Khurg==",
+ "dev": true
+ },
+ "@types/babel-core": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-core/-/babel-core-6.25.3.tgz",
+ "integrity": "sha512-OlUjfM+Qv+XwcaucEiekBIhfAYe4q4ruvQZZcCkOtQZ27Hykxm1LLY2s0mE6LtP9XQt6x+TUvS70KW2e8Mz0ZA==",
+ "dev": true,
+ "requires": {
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-template": "6.25.0",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-template": {
+ "version": "6.25.0",
+ "resolved": "https://registry.npmjs.org/@types/babel-template/-/babel-template-6.25.0.tgz",
+ "integrity": "sha512-TtyfVlrprX92xSuKa8D//7vFz5kBJODBw5IQ1hQXehqO+me26vt1fyNxOZyXhUq2a7jRyT72V8p68IyH4NEZNA==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.3.tgz",
+ "integrity": "sha512-f5dXGzOJycyzSMdaXVhiBhauL4dYydXwVpavfQ1mVCaGjR56a9QfklXObUxlIY9bGTmCPHEEZ04I16BZ/8w5ww==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.3"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/clean-css": {
+ "version": "3.4.30",
+ "resolved": "https://registry.npmjs.org/@types/clean-css/-/clean-css-3.4.30.tgz",
+ "integrity": "sha1-AFLBNvUkgAJCjjY4s33ko5gYZB0=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ="
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/escodegen": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/@types/escodegen/-/escodegen-0.0.2.tgz",
+ "integrity": "sha1-fOpBqyQukQ6xD2WuGK66RZ1ms18=",
+ "dev": true
+ },
+ "@types/estraverse": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/@types/estraverse/-/estraverse-0.0.6.tgz",
+ "integrity": "sha1-Zp9833KreX5hJfjQD+0z1M8wwiE=",
+ "dev": true,
+ "requires": {
+ "@types/estree": "0.0.37"
+ }
+ },
+ "@types/estree": {
+ "version": "0.0.37",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.37.tgz",
+ "integrity": "sha512-1IT6vNpmU9w18P3v6mN9idv18z5KPVTi4t7+rU9VLnkxo0LCam8IXy/eSVzOaQ1Wpabra2cN3A8K/SliPK/Suw==",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz",
+ "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.2.tgz",
+ "integrity": "sha512-Q3FWsbdmkQd1ib11A4XNWQvRD//5KpPoGawA8aB2DR7pWKoW9XQv3+dGxD/Z1eVFze23Okdo27ZQytVFlweKvQ==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.107"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "6.0.107"
+ }
+ },
+ "@types/glob-stream": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@types/glob-stream/-/glob-stream-6.1.0.tgz",
+ "integrity": "sha512-RHv6ZQjcTncXo3thYZrsbAVwoy4vSKosSWhuhuQxLOTv74OJuFQxXkmUuZCr3q9uNBEVCvIzmZL/FeRNbHZGUg==",
+ "dev": true,
+ "requires": {
+ "@types/glob": "5.0.35",
+ "@types/node": "6.0.107"
+ }
+ },
+ "@types/gulp-if": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/@types/gulp-if/-/gulp-if-0.0.33.tgz",
+ "integrity": "sha512-J5lzff21X7r1x/4hSzn02GgIUEyjCqYIXZ9GgGBLhbsD3RiBdqwnkFWgF16/0jO5rcVZ52Zp+6MQMQdvIsWuKg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.107",
+ "@types/vinyl": "2.0.2"
+ }
+ },
+ "@types/html-minifier": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/@types/html-minifier/-/html-minifier-3.5.2.tgz",
+ "integrity": "sha512-yikK28/KlVyf8g9i/k+TDFlteLuZ6QQTUdVqvKtzEB+8DSLCTjxfh6IK45KnW4rYFI3Y8T4LWpYJMTmfJleWaQ==",
+ "dev": true,
+ "requires": {
+ "@types/clean-css": "3.4.30",
+ "@types/relateurl": "0.2.28",
+ "@types/uglify-js": "3.0.2"
+ }
+ },
+ "@types/is-windows": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@types/is-windows/-/is-windows-0.2.0.tgz",
+ "integrity": "sha1-byTuSHMdMRaOpRBhDW3RXl/Jxv8=",
+ "dev": true
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/mz": {
+ "version": "0.0.31",
+ "resolved": "https://registry.npmjs.org/@types/mz/-/mz-0.0.31.tgz",
+ "integrity": "sha1-pNgMCC/v5x5Ap8DwfR5lVbu8e1I=",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.107"
+ }
+ },
+ "@types/node": {
+ "version": "6.0.107",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.107.tgz",
+ "integrity": "sha512-iuJWRFHqU0tFLCYH6cfBZzMxThAAsNK31FZxoq+fKIDOSZk1p+3IhNWfEdvPJfsQXcTq8z+57s8xjQlrDAB0Gw=="
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "requires": {
+ "@types/node": "6.0.107"
+ }
+ },
+ "@types/relateurl": {
+ "version": "0.2.28",
+ "resolved": "https://registry.npmjs.org/@types/relateurl/-/relateurl-0.2.28.tgz",
+ "integrity": "sha1-a9p9uGU/piZD9e5p6facEaOS46Y=",
+ "dev": true
+ },
+ "@types/resolve": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.6.tgz",
+ "integrity": "sha512-g+Rg8uMWY76oYTyaL+m7ZcblqF/oj7pE6uEUyACluJx4zcop1Lk14qQiocdEkEVMDFm6DmKpxJhsER+ZuTwG3g==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.107"
+ },
+ "dependencies": {
+ "regenerator-transform": {
+ "version": "0.12.3",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.12.3.tgz",
+ "integrity": "sha512-y2uxO/6u+tVmtEDIKo+tLCtI0GcbQr0OreosKgCd7HP4VypGjtTrw79DezuwT+W5QX0YWuvpeBOgumrepwM1kA==",
+ "requires": {
+ "private": "0.1.8"
+ }
+ }
+ }
+ },
+ "@types/ua-parser-js": {
+ "version": "0.7.32",
+ "resolved": "https://registry.npmjs.org/@types/ua-parser-js/-/ua-parser-js-0.7.32.tgz",
+ "integrity": "sha512-+z7Q72Mlnq6SFkQYHzLg2Z70pIsgRVzgx1b5PV8eUv5uaZ/zoqIs45XnhtToW4gTeX4FbjIP49nhIjyvPF4rPg=="
+ },
+ "@types/uglify-js": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.0.2.tgz",
+ "integrity": "sha512-o8hU2+4xsyGC27Vujoklvxl88Ew5zmJuTBYMX1Uro2rYUt4HEFJKL6fuq8aGykvS+ssIsIzerWWP2DRxonownQ==",
+ "dev": true,
+ "requires": {
+ "source-map": "0.6.1"
+ }
+ },
+ "@types/uuid": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.3.tgz",
+ "integrity": "sha512-5fRLCYhLtDb3hMWqQyH10qtF+Ud2JnNCXTCZ+9ktNdCcgslcuXkDTkFcJNk++MT29yDntDnlF1+jD+uVGumsbw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.107"
+ }
+ },
+ "@types/vinyl": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.2.tgz",
+ "integrity": "sha512-2iYpNuOl98SrLPBZfEN9Mh2JCJ2EI9HU35SfgBEb51DcmaHkhp8cKMblYeBqMQiwXMgAD3W60DbQ4i/UdLiXhw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.107"
+ }
+ },
+ "@types/vinyl-fs": {
+ "version": "0.0.28",
+ "resolved": "https://registry.npmjs.org/@types/vinyl-fs/-/vinyl-fs-0.0.28.tgz",
+ "integrity": "sha1-RmMBe8gCxlcOrk80Cf1cq/l8v94=",
+ "dev": true,
+ "requires": {
+ "@types/glob-stream": "6.1.0",
+ "@types/node": "6.0.107",
+ "@types/vinyl": "2.0.2"
+ }
+ },
+ "@types/winston": {
+ "version": "2.3.9",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.9.tgz",
+ "integrity": "sha512-zzruYOEtNgfS3SBjcij1F6HlH6My5n8WrBNhP3fzaRM22ba70QBC2ATs18jGr88Fy43c0z8vFJv5wJankfxv2A==",
+ "requires": {
+ "@types/node": "6.0.107"
+ }
+ },
+ "@webcomponents/shadycss": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@webcomponents/shadycss/-/shadycss-1.2.0.tgz",
+ "integrity": "sha512-ZkqUkqZAn+vQlxB4bgZ0aOfAgxpISsD9kUcPgKmeXze5PRVCRVwVje33GqA2OYYWSrwcq1JwWx+JscW3kLl4SQ=="
+ },
+ "@webcomponents/webcomponentsjs": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-2.0.0.tgz",
+ "integrity": "sha512-f6izmesHd8E+rL32tftlXZmz1EAL+lLn8AUex0mJFLe39z53iTFNCqxAYsMmCA/QSGP+8X6D1it/JbuVl1jOHA==",
+ "dev": true
+ },
+ "abbrev": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
+ },
+ "accessibility-developer-tools": {
+ "version": "2.12.0",
+ "resolved": "https://registry.npmjs.org/accessibility-developer-tools/-/accessibility-developer-tools-2.12.0.tgz",
+ "integrity": "sha1-PaDM6dbsY3OWS4TzXbfPw996tRQ=",
+ "dev": true
+ },
+ "acorn": {
+ "version": "5.5.3",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz",
+ "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==",
+ "dev": true
+ },
+ "acorn-jsx": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz",
+ "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=",
+ "dev": true,
+ "requires": {
+ "acorn": "3.3.0"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
+ "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=",
+ "dev": true
+ }
+ }
+ },
+ "ajv": {
+ "version": "5.5.2",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+ "requires": {
+ "co": "4.6.0",
+ "fast-deep-equal": "1.1.0",
+ "fast-json-stable-stringify": "2.0.0",
+ "json-schema-traverse": "0.3.1"
+ }
+ },
+ "ajv-keywords": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz",
+ "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=",
+ "dev": true
+ },
+ "ansi-align": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz",
+ "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=",
+ "dev": true,
+ "requires": {
+ "string-width": "2.1.1"
+ },
+ "dependencies": {
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
+ }
+ }
+ },
+ "ansi-colors": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
+ "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-cyan": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz",
+ "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=",
+ "dev": true,
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-escape-sequences": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-3.0.0.tgz",
+ "integrity": "sha1-HBg5S2r5t2/5pjUJ+kl2af0s5T4=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4"
+ },
+ "dependencies": {
+ "array-back": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
+ "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ },
+ "dependencies": {
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0="
+ }
+ }
+ }
+ }
+ },
+ "ansi-escapes": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz",
+ "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==",
+ "dev": true
+ },
+ "ansi-gray": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz",
+ "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=",
+ "dev": true,
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-red": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz",
+ "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=",
+ "dev": true,
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+ },
+ "ansi-wrap": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
+ "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768="
+ },
+ "any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8="
+ },
+ "anymatch": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
+ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+ "dev": true,
+ "requires": {
+ "micromatch": "3.1.10",
+ "normalize-path": "2.1.1"
+ }
+ },
+ "append-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz",
+ "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=",
+ "dev": true,
+ "requires": {
+ "buffer-equal": "1.0.0"
+ }
+ },
+ "archy": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
+ "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=",
+ "dev": true
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "1.0.3"
+ }
+ },
+ "argv-tools": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
+ "integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1"
+ }
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "arr-filter": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz",
+ "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=",
+ "dev": true,
+ "requires": {
+ "make-iterator": "1.0.1"
+ }
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+ "dev": true
+ },
+ "arr-map": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz",
+ "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=",
+ "dev": true,
+ "requires": {
+ "make-iterator": "1.0.1"
+ }
+ },
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
+ },
+ "array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "array-each": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz",
+ "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8="
+ },
+ "array-find-index": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
+ "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
+ "dev": true
+ },
+ "array-initial": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz",
+ "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=",
+ "dev": true,
+ "requires": {
+ "array-slice": "1.1.0",
+ "is-number": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+ "dev": true
+ }
+ }
+ },
+ "array-last": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz",
+ "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==",
+ "dev": true,
+ "requires": {
+ "is-number": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+ "dev": true
+ }
+ }
+ },
+ "array-slice": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz",
+ "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w=="
+ },
+ "array-sort": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz",
+ "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==",
+ "dev": true,
+ "requires": {
+ "default-compare": "1.0.0",
+ "get-value": "2.0.6",
+ "kind-of": "5.1.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "array-union": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+ "requires": {
+ "array-uniq": "1.0.3"
+ }
+ },
+ "array-uniq": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+ "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY="
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "arrify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0="
+ },
+ "assertion-error": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
+ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw=="
+ },
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c="
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k="
+ },
+ "async-done": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.2.4.tgz",
+ "integrity": "sha512-mxc+yISkb0vjsuvG3dJCIZXzRWjKndQ9Zo9zNDJ1K2wh9eP0E0oGmOWm+4cFOvW4dA0tGFImTW5tQJHCtn1kIQ==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "1.4.1",
+ "once": "1.4.0",
+ "process-nextick-args": "1.0.7",
+ "stream-exhaust": "1.0.2"
+ },
+ "dependencies": {
+ "process-nextick-args": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
+ "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
+ "dev": true
+ }
+ }
+ },
+ "async-each": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
+ "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
+ "dev": true
+ },
+ "async-settle": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz",
+ "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=",
+ "dev": true,
+ "requires": {
+ "async-done": "1.2.4"
+ }
+ },
+ "atob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz",
+ "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio="
+ },
+ "babel-code-frame": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-7.0.0-beta.3.tgz",
+ "integrity": "sha512-flMsJ9eSpShupt2Gwpka84DoMePvE4HlDObzdEc+1iNkacv3+NHlsJ7dMKmbnVA/AT22UhcGEBHwbJLoXWBO6Q==",
+ "dev": true,
+ "requires": {
+ "chalk": "2.4.1",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "babel-helper-function-name": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
+ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ }
+ }
+ },
+ "babel-core": {
+ "version": "6.26.3",
+ "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz",
+ "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-generator": "6.26.1",
+ "babel-helpers": "6.24.1",
+ "babel-messages": "6.23.0",
+ "babel-register": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "convert-source-map": "1.5.1",
+ "debug": "2.6.9",
+ "json5": "0.5.1",
+ "lodash": "4.17.10",
+ "minimatch": "3.0.4",
+ "path-is-absolute": "1.0.1",
+ "private": "0.1.8",
+ "slash": "1.0.0",
+ "source-map": "0.5.7"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "babel-eslint": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-7.2.3.tgz",
+ "integrity": "sha1-sv4tgBJkcPXBlELcdXJTqJdxCCc=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ }
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.10",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "babel-helper-builder-binary-assignment-operator-visitor": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz",
+ "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=",
+ "dev": true,
+ "requires": {
+ "babel-helper-explode-assignable-expression": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ }
+ }
+ },
+ "babel-helper-call-delegate": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz",
+ "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=",
+ "dev": true,
+ "requires": {
+ "babel-helper-hoist-variables": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ }
+ }
+ },
+ "babel-helper-define-map": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz",
+ "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=",
+ "dev": true,
+ "requires": {
+ "babel-helper-function-name": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "lodash": "4.17.10"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-helper-function-name": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
+ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
+ "dev": true,
+ "requires": {
+ "babel-helper-get-function-arity": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz",
+ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ }
+ }
+ },
+ "babel-helper-evaluate-path": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.2.0.tgz",
+ "integrity": "sha512-0EK9TUKMxHL549hWDPkQoS7R0Ozg1CDLheVBHYds2B2qoAvmr9ejY3zOXFsrICK73TN7bPhU14PBeKc8jcBTwg==",
+ "dev": true
+ },
+ "babel-helper-explode-assignable-expression": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz",
+ "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ }
+ }
+ },
+ "babel-helper-flip-expressions": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.2.0.tgz",
+ "integrity": "sha512-rAsPA1pWBc7e2E6HepkP2e1sXugT+Oq/VCqhyuHJ8aJ2d/ifwnJfd4Qxjm21qlW43AN8tqaeByagKK6wECFMSw==",
+ "dev": true
+ },
+ "babel-helper-function-name": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-7.0.0-beta.3.tgz",
+ "integrity": "sha512-iMWYqwDarQOVlEGcK1MfbtK9vrFGs5Z4UQsdASJUHdhBp918EM5kndwriiIbhUX8gr2B/CEV/udJkFTrHsjdMQ==",
+ "dev": true,
+ "requires": {
+ "babel-helper-get-function-arity": "7.0.0-beta.3",
+ "babel-template": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-7.0.0-beta.3.tgz",
+ "integrity": "sha512-ZkYFRMWKx1c9fUW72YNM3eieBG701CMbLjmLLWmJTTPc0F0kddS9Fwok26EAmndUAgD6kFdh7ms3PH94MdGuGQ==",
+ "dev": true,
+ "requires": {
+ "babel-types": "7.0.0-beta.3"
+ }
+ },
+ "babel-helper-hoist-variables": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz",
+ "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ }
+ }
+ },
+ "babel-helper-is-nodes-equiv": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz",
+ "integrity": "sha1-NOmzALFHnd2Y7HfqC76TQt/jloQ=",
+ "dev": true
+ },
+ "babel-helper-is-void-0": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-is-void-0/-/babel-helper-is-void-0-0.2.0.tgz",
+ "integrity": "sha512-Axj1AYuD0E3Dl7nT3KxROP7VekEofz3XtEljzURf3fABalLpr8PamtgLFt+zuxtaCxRf9iuZmbAMMYWri5Bazw==",
+ "dev": true
+ },
+ "babel-helper-mark-eval-scopes": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.2.0.tgz",
+ "integrity": "sha512-KJuwrOUcHbvbh6he4xRXZFLaivK9DF9o3CrvpWnK1Wp0B+1ANYABXBMgwrnNFIDK/AvicxQ9CNr8wsgivlp4Aw==",
+ "dev": true
+ },
+ "babel-helper-optimise-call-expression": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz",
+ "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ }
+ }
+ },
+ "babel-helper-regex": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz",
+ "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "lodash": "4.17.10"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ }
+ }
+ },
+ "babel-helper-remap-async-to-generator": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz",
+ "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=",
+ "dev": true,
+ "requires": {
+ "babel-helper-hoist-variables": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-helper-function-name": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
+ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
+ "requires": {
+ "babel-helper-get-function-arity": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz",
+ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ=="
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ=="
+ }
+ }
+ },
+ "babel-helper-remove-or-void": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.2.0.tgz",
+ "integrity": "sha512-1Z41upf/XR+PwY7Nd+F15Jo5BiQi5205ZXUuKed3yoyQgDkMyoM7vAdjEJS/T+M6jy32sXjskMUgms4zeiVtRA==",
+ "dev": true
+ },
+ "babel-helper-replace-supers": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz",
+ "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=",
+ "dev": true,
+ "requires": {
+ "babel-helper-optimise-call-expression": "6.24.1",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ }
+ }
+ },
+ "babel-helper-to-multiple-sequence-expressions": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.2.0.tgz",
+ "integrity": "sha512-ij9lpfdP3+Zc/7kNwa+NXbTrUlsYEWPwt/ugmQO0qflzLrveTIkbfOqQztvitk81aG5NblYDQXDlRohzu3oa8Q==",
+ "dev": true
+ },
+ "babel-helpers": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz",
+ "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ }
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-check-es2015-constants": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz",
+ "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-external-helpers": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-external-helpers/-/babel-plugin-external-helpers-6.22.0.tgz",
+ "integrity": "sha1-IoX0iwK9Xe3oUXXK+MYuhq3M76E=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-minify-builtins": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.2.0.tgz",
+ "integrity": "sha512-4i+8ntaS8gwVUcOz5y+zE+55OVOl2nTbmHV51D4wAIiKcRI8U5K//ip1GHfhsgk/NJrrHK7h97Oy5jpqt0Iixg==",
+ "dev": true,
+ "requires": {
+ "babel-helper-evaluate-path": "0.2.0"
+ }
+ },
+ "babel-plugin-minify-constant-folding": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.2.0.tgz",
+ "integrity": "sha512-B3ffQBEUQ8ydlIkYv2MkZtTCbV7FAkWAV7NkyhcXlGpD10PaCxNGQ/B9oguXGowR1m16Q5nGhvNn8Pkn1MO6Hw==",
+ "dev": true,
+ "requires": {
+ "babel-helper-evaluate-path": "0.2.0"
+ }
+ },
+ "babel-plugin-minify-dead-code-elimination": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.2.0.tgz",
+ "integrity": "sha512-zE7y3pRyzA4zK5nBou0kTcwUTSQ/AiFrynt1cIEYN7vcO2gS9ZFZoI0aO9JYLUdct5fsC1vfB35408yrzTyVfg==",
+ "dev": true,
+ "requires": {
+ "babel-helper-evaluate-path": "0.2.0",
+ "babel-helper-mark-eval-scopes": "0.2.0",
+ "babel-helper-remove-or-void": "0.2.0",
+ "lodash.some": "4.6.0"
+ }
+ },
+ "babel-plugin-minify-flip-comparisons": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.2.0.tgz",
+ "integrity": "sha512-QOqXSEmD/LhT3LpM1WCyzAGcQZYYKJF7oOHvS6QbpomHenydrV53DMdPX2mK01icBExKZcJAHF209wvDBa+CSg==",
+ "dev": true,
+ "requires": {
+ "babel-helper-is-void-0": "0.2.0"
+ }
+ },
+ "babel-plugin-minify-guarded-expressions": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.2.0.tgz",
+ "integrity": "sha512-5+NSPdRQ9mnrHaA+zFj+D5OzmSiv90EX5zGH6cWQgR/OUqmCHSDqgTRPFvOctgpo8MJyO7Rt7ajs2UfLnlAwYg==",
+ "dev": true,
+ "requires": {
+ "babel-helper-flip-expressions": "0.2.0"
+ }
+ },
+ "babel-plugin-minify-infinity": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.2.0.tgz",
+ "integrity": "sha512-U694vrla1lN6vDHWGrR832t3a/A2eh+kyl019LxEE2+sS4VTydyOPRsAOIYAdJegWRA4cMX1lm9azAN0cLIr8g==",
+ "dev": true
+ },
+ "babel-plugin-minify-mangle-names": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.2.0.tgz",
+ "integrity": "sha512-Gixuak1/CO7VCdjn15/8Bxe/QsAtDG4zPbnsNoe1mIJGCIH/kcmSjFhMlGJtXDQZd6EKzeMfA5WmX9+jvGRefw==",
+ "dev": true,
+ "requires": {
+ "babel-helper-mark-eval-scopes": "0.2.0"
+ }
+ },
+ "babel-plugin-minify-numeric-literals": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.2.0.tgz",
+ "integrity": "sha512-VcLpb+r1YS7+RIOXdRsFVLLqoh22177USpHf+JM/g1nZbzdqENmfd5v534MLAbRErhbz6SyK+NQViVzVtBxu8g==",
+ "dev": true
+ },
+ "babel-plugin-minify-replace": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.2.0.tgz",
+ "integrity": "sha512-SEW6zoSVxh3OH6E1LCgyhhTWMnCv+JIRu5h5IlJDA11tU4ZeSF7uPQcO4vN/o52+FssRB26dmzJ/8D+z0QPg5Q==",
+ "dev": true
+ },
+ "babel-plugin-minify-simplify": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.2.0.tgz",
+ "integrity": "sha512-Mj3Mwy2zVosMfXDWXZrQH5/uMAyfJdmDQ1NVqit+ArbHC3LlXVzptuyC1JxTyai/wgFvjLaichm/7vSUshkWqw==",
+ "dev": true,
+ "requires": {
+ "babel-helper-flip-expressions": "0.2.0",
+ "babel-helper-is-nodes-equiv": "0.0.1",
+ "babel-helper-to-multiple-sequence-expressions": "0.2.0"
+ }
+ },
+ "babel-plugin-minify-type-constructors": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.2.0.tgz",
+ "integrity": "sha512-NiOvvA9Pq6bki6nP4BayXwT5GZadw7DJFDDzHmkpnOQpENWe8RtHtKZM44MG1R6EQ5XxgbLdsdhswIzTkFlO5g==",
+ "dev": true,
+ "requires": {
+ "babel-helper-is-void-0": "0.2.0"
+ }
+ },
+ "babel-plugin-syntax-async-functions": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz",
+ "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=",
+ "dev": true
+ },
+ "babel-plugin-syntax-async-generators": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz",
+ "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=",
+ "dev": true
+ },
+ "babel-plugin-syntax-dynamic-import": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz",
+ "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=",
+ "dev": true
+ },
+ "babel-plugin-syntax-exponentiation-operator": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz",
+ "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=",
+ "dev": true
+ },
+ "babel-plugin-syntax-export-extensions": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz",
+ "integrity": "sha1-cKFITw+QiaToStRLrDU8lbmxJyE=",
+ "dev": true
+ },
+ "babel-plugin-syntax-object-rest-spread": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz",
+ "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=",
+ "dev": true
+ },
+ "babel-plugin-transform-async-generator-functions": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz",
+ "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=",
+ "dev": true,
+ "requires": {
+ "babel-helper-remap-async-to-generator": "6.24.1",
+ "babel-plugin-syntax-async-generators": "6.13.0",
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-async-to-generator": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz",
+ "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=",
+ "dev": true,
+ "requires": {
+ "babel-helper-remap-async-to-generator": "6.24.1",
+ "babel-plugin-syntax-async-functions": "6.13.0",
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-arrow-functions": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz",
+ "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-block-scoped-functions": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz",
+ "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-block-scoping": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz",
+ "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "lodash": "4.17.10"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ }
+ }
+ },
+ "babel-plugin-transform-es2015-classes": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz",
+ "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=",
+ "dev": true,
+ "requires": {
+ "babel-helper-define-map": "6.26.0",
+ "babel-helper-function-name": "6.24.1",
+ "babel-helper-optimise-call-expression": "6.24.1",
+ "babel-helper-replace-supers": "6.24.1",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-helper-function-name": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
+ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
+ "dev": true,
+ "requires": {
+ "babel-helper-get-function-arity": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz",
+ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ }
+ }
+ },
+ "babel-plugin-transform-es2015-computed-properties": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz",
+ "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ }
+ }
+ },
+ "babel-plugin-transform-es2015-destructuring": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz",
+ "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+ }
+ }
+ },
+ "babel-plugin-transform-es2015-duplicate-keys": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz",
+ "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ }
+ }
+ },
+ "babel-plugin-transform-es2015-for-of": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz",
+ "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-function-name": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz",
+ "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=",
+ "dev": true,
+ "requires": {
+ "babel-helper-function-name": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-helper-function-name": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
+ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
+ "dev": true,
+ "requires": {
+ "babel-helper-get-function-arity": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz",
+ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ }
+ }
+ },
+ "babel-plugin-transform-es2015-literals": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz",
+ "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-modules-amd": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz",
+ "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=",
+ "dev": true,
+ "requires": {
+ "babel-plugin-transform-es2015-modules-commonjs": "6.26.2",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-helper-function-name": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
+ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
+ "requires": {
+ "babel-helper-get-function-arity": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz",
+ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ=="
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ=="
+ }
+ }
+ },
+ "babel-plugin-transform-es2015-modules-commonjs": {
+ "version": "6.26.2",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz",
+ "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==",
+ "dev": true,
+ "requires": {
+ "babel-plugin-transform-strict-mode": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-types": "6.26.0"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ }
+ }
+ },
+ "babel-plugin-transform-es2015-modules-systemjs": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz",
+ "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=",
+ "dev": true,
+ "requires": {
+ "babel-helper-hoist-variables": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ }
+ }
+ },
+ "babel-plugin-transform-es2015-modules-umd": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz",
+ "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=",
+ "dev": true,
+ "requires": {
+ "babel-plugin-transform-es2015-modules-amd": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ }
+ }
+ },
+ "babel-plugin-transform-es2015-object-super": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz",
+ "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=",
+ "dev": true,
+ "requires": {
+ "babel-helper-replace-supers": "6.24.1",
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-parameters": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz",
+ "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=",
+ "dev": true,
+ "requires": {
+ "babel-helper-call-delegate": "6.24.1",
+ "babel-helper-get-function-arity": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz",
+ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ }
+ }
+ },
+ "babel-plugin-transform-es2015-shorthand-properties": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz",
+ "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ }
+ }
+ },
+ "babel-plugin-transform-es2015-spread": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz",
+ "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-sticky-regex": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz",
+ "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=",
+ "dev": true,
+ "requires": {
+ "babel-helper-regex": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ }
+ }
+ },
+ "babel-plugin-transform-es2015-template-literals": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz",
+ "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-typeof-symbol": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz",
+ "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-unicode-regex": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz",
+ "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=",
+ "dev": true,
+ "requires": {
+ "babel-helper-regex": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "regexpu-core": "2.0.0"
+ }
+ },
+ "babel-plugin-transform-exponentiation-operator": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz",
+ "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=",
+ "dev": true,
+ "requires": {
+ "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1",
+ "babel-plugin-syntax-exponentiation-operator": "6.13.0",
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-inline-consecutive-adds": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.2.0.tgz",
+ "integrity": "sha512-GlhOuLOQ28ua9prg0hT33HslCrEmz9xWXy9ZNZSACppCyRxxRW+haYtRgm7uYXCcd0q8ggCWD2pfWEJp5iiZfQ==",
+ "dev": true
+ },
+ "babel-plugin-transform-member-expression-literals": {
+ "version": "6.9.2",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.9.2.tgz",
+ "integrity": "sha1-Hzl6uWGlw6QB8qdHrwbnIASvy3Y=",
+ "dev": true
+ },
+ "babel-plugin-transform-merge-sibling-variables": {
+ "version": "6.9.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.9.1.tgz",
+ "integrity": "sha1-kHHkQ7IUWM5rCo04QbpaF09dwoI=",
+ "dev": true
+ },
+ "babel-plugin-transform-minify-booleans": {
+ "version": "6.9.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.9.1.tgz",
+ "integrity": "sha1-UsunnAD6UJc3BkBV76siFm4UDE0=",
+ "dev": true
+ },
+ "babel-plugin-transform-object-rest-spread": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz",
+ "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=",
+ "dev": true,
+ "requires": {
+ "babel-plugin-syntax-object-rest-spread": "6.13.0",
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-property-literals": {
+ "version": "6.9.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.9.1.tgz",
+ "integrity": "sha1-aXD5Oxd5OrzenPJdLozRPgCI5ck=",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "babel-plugin-transform-regenerator": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz",
+ "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=",
+ "dev": true,
+ "requires": {
+ "regenerator-transform": "0.10.1"
+ }
+ },
+ "babel-plugin-transform-regexp-constructors": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.2.0.tgz",
+ "integrity": "sha512-7IsQ6aQx6LAaOqy97/PthTf+5Nx9grZww3r6E62IdWe76Yr8KsuwVjxzqSPQvESJqTE3EMADQ9S0RtwWDGNG9Q==",
+ "dev": true
+ },
+ "babel-plugin-transform-remove-console": {
+ "version": "6.9.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.9.1.tgz",
+ "integrity": "sha1-QP6V2YyuWBHYoOGImBLXixKFllE=",
+ "dev": true
+ },
+ "babel-plugin-transform-remove-debugger": {
+ "version": "6.9.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.9.1.tgz",
+ "integrity": "sha1-dlUtLp1sQ9nGdrv8CPPCoswUvhQ=",
+ "dev": true
+ },
+ "babel-plugin-transform-remove-undefined": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.2.0.tgz",
+ "integrity": "sha512-O8v57tPMHkp89kA4ZfQEYds/pzgvz/QYerBJjIuL5/Jc7RnvMVRA5gJY9zFKP7WayW8WOSBV4vh8Y8FJRio+ow==",
+ "dev": true,
+ "requires": {
+ "babel-helper-evaluate-path": "0.2.0"
+ }
+ },
+ "babel-plugin-transform-simplify-comparison-operators": {
+ "version": "6.9.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.9.1.tgz",
+ "integrity": "sha1-Ww0GmAoXp4D1MYsnTAC+L7HHxP4=",
+ "dev": true
+ },
+ "babel-plugin-transform-strict-mode": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz",
+ "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ }
+ }
+ },
+ "babel-plugin-transform-undefined-to-void": {
+ "version": "6.9.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.9.1.tgz",
+ "integrity": "sha1-19+cHdDsEuD/6JXtFEX2Hxv14iE=",
+ "dev": true
+ },
+ "babel-polyfill": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz",
+ "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "core-js": "2.5.5",
+ "regenerator-runtime": "0.10.5"
+ },
+ "dependencies": {
+ "regenerator-runtime": {
+ "version": "0.10.5",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz",
+ "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=",
+ "dev": true
+ }
+ }
+ },
+ "babel-preset-es2015": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz",
+ "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=",
+ "dev": true,
+ "requires": {
+ "babel-plugin-check-es2015-constants": "6.22.0",
+ "babel-plugin-transform-es2015-arrow-functions": "6.22.0",
+ "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0",
+ "babel-plugin-transform-es2015-block-scoping": "6.26.0",
+ "babel-plugin-transform-es2015-classes": "6.24.1",
+ "babel-plugin-transform-es2015-computed-properties": "6.24.1",
+ "babel-plugin-transform-es2015-destructuring": "6.23.0",
+ "babel-plugin-transform-es2015-duplicate-keys": "6.24.1",
+ "babel-plugin-transform-es2015-for-of": "6.23.0",
+ "babel-plugin-transform-es2015-function-name": "6.24.1",
+ "babel-plugin-transform-es2015-literals": "6.22.0",
+ "babel-plugin-transform-es2015-modules-amd": "6.24.1",
+ "babel-plugin-transform-es2015-modules-commonjs": "6.26.2",
+ "babel-plugin-transform-es2015-modules-systemjs": "6.24.1",
+ "babel-plugin-transform-es2015-modules-umd": "6.24.1",
+ "babel-plugin-transform-es2015-object-super": "6.24.1",
+ "babel-plugin-transform-es2015-parameters": "6.24.1",
+ "babel-plugin-transform-es2015-shorthand-properties": "6.24.1",
+ "babel-plugin-transform-es2015-spread": "6.22.0",
+ "babel-plugin-transform-es2015-sticky-regex": "6.24.1",
+ "babel-plugin-transform-es2015-template-literals": "6.22.0",
+ "babel-plugin-transform-es2015-typeof-symbol": "6.23.0",
+ "babel-plugin-transform-es2015-unicode-regex": "6.24.1",
+ "babel-plugin-transform-regenerator": "6.26.0"
+ }
+ },
+ "babel-preset-minify": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/babel-preset-minify/-/babel-preset-minify-0.2.0.tgz",
+ "integrity": "sha512-mR8Q44RmMzm18bM2Lqd9uiPopzk5GDCtVuquNbLFmX6lOKnqWoenaNBxnWW0UhBFC75lEHTIgNGCbnsRI0pJVw==",
+ "dev": true,
+ "requires": {
+ "babel-plugin-minify-builtins": "0.2.0",
+ "babel-plugin-minify-constant-folding": "0.2.0",
+ "babel-plugin-minify-dead-code-elimination": "0.2.0",
+ "babel-plugin-minify-flip-comparisons": "0.2.0",
+ "babel-plugin-minify-guarded-expressions": "0.2.0",
+ "babel-plugin-minify-infinity": "0.2.0",
+ "babel-plugin-minify-mangle-names": "0.2.0",
+ "babel-plugin-minify-numeric-literals": "0.2.0",
+ "babel-plugin-minify-replace": "0.2.0",
+ "babel-plugin-minify-simplify": "0.2.0",
+ "babel-plugin-minify-type-constructors": "0.2.0",
+ "babel-plugin-transform-inline-consecutive-adds": "0.2.0",
+ "babel-plugin-transform-member-expression-literals": "6.9.2",
+ "babel-plugin-transform-merge-sibling-variables": "6.9.1",
+ "babel-plugin-transform-minify-booleans": "6.9.1",
+ "babel-plugin-transform-property-literals": "6.9.1",
+ "babel-plugin-transform-regexp-constructors": "0.2.0",
+ "babel-plugin-transform-remove-console": "6.9.1",
+ "babel-plugin-transform-remove-debugger": "6.9.1",
+ "babel-plugin-transform-remove-undefined": "0.2.0",
+ "babel-plugin-transform-simplify-comparison-operators": "6.9.1",
+ "babel-plugin-transform-undefined-to-void": "6.9.1",
+ "lodash.isplainobject": "4.0.6"
+ }
+ },
+ "babel-register": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz",
+ "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=",
+ "dev": true,
+ "requires": {
+ "babel-core": "6.26.3",
+ "babel-runtime": "6.26.0",
+ "core-js": "2.5.5",
+ "home-or-tmp": "2.0.0",
+ "lodash": "4.17.10",
+ "mkdirp": "0.5.1",
+ "source-map-support": "0.4.18"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "requires": {
+ "core-js": "2.5.5",
+ "regenerator-runtime": "0.11.1"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg=="
+ }
+ }
+ },
+ "babel-template": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-7.0.0-beta.3.tgz",
+ "integrity": "sha512-urJduLja89kSDGqY8ryw8iIwQnMl30IvhMtMNmDD7vBX0l0oylaLgK+7df/9ODX9vR/PhXuif6HYl5HlzAKXMg==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-traverse": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "lodash": "4.17.10"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-traverse": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-7.0.0-beta.3.tgz",
+ "integrity": "sha512-xyh/aPYuedMAfQlSj2kjHjsEmY5/Dpxs576L05DySAVMrV+ADX6l4mTOLysAEGwJfkePJlDLhFuS6SKaxv1V7w==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babel-helper-function-name": "7.0.0-beta.3",
+ "babel-types": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.27",
+ "debug": "3.1.0",
+ "globals": "10.4.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg==",
+ "dev": true
+ }
+ }
+ },
+ "babel-types": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-7.0.0-beta.3.tgz",
+ "integrity": "sha512-36k8J+byAe181OmCMawGhw+DtKO7AwexPVtsPXoMfAkjtZgoCX3bEuHWfdE5sYxRM8dojvtG/+O08M0Z/YDC6w==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "2.0.0"
+ },
+ "dependencies": {
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ }
+ }
+ },
+ "babylon": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.46.tgz",
+ "integrity": "sha512-WFJlg2WatdkXRFMpk7BN/Uzzkjkcjk+WaqnrSCpay+RYl4ypW9ZetZyT9kNt22IH/BQNst3M6PaaBn9IXsUNrg==",
+ "dev": true
+ },
+ "bach": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz",
+ "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=",
+ "dev": true,
+ "requires": {
+ "arr-filter": "1.1.2",
+ "arr-flatten": "1.1.0",
+ "arr-map": "2.0.2",
+ "array-each": "1.0.1",
+ "array-initial": "1.1.0",
+ "array-last": "1.3.0",
+ "async-done": "1.2.4",
+ "async-settle": "1.0.0",
+ "now-and-later": "2.0.0"
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "requires": {
+ "cache-base": "1.0.1",
+ "class-utils": "0.3.6",
+ "component-emitter": "1.2.1",
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "mixin-deep": "1.3.1",
+ "pascalcase": "0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "binary-extensions": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz",
+ "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=",
+ "dev": true
+ },
+ "binaryextensions": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-1.0.1.tgz",
+ "integrity": "sha1-HmN0iLNbWL2l9HdL+WpSEqjJB1U=",
+ "dev": true
+ },
+ "boxen": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz",
+ "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==",
+ "dev": true,
+ "requires": {
+ "ansi-align": "2.0.0",
+ "camelcase": "4.1.0",
+ "chalk": "2.4.1",
+ "cli-boxes": "1.0.0",
+ "string-width": "2.1.1",
+ "term-size": "1.2.0",
+ "widest-line": "2.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "camelcase": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ },
+ "globals": {
+ "version": "11.5.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.5.0.tgz",
+ "integrity": "sha512-hYyf+kI8dm3nORsiiXUQigOU62hDLfJ9G01uyGMxhc6BKsircrUhC4uJPQPUSuq2GrTmiiEt7ewxlMdBewfmKQ=="
+ },
+ "semver": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
+ "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA=="
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8="
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ }
+ }
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-unique": "0.3.2",
+ "extend-shallow": "2.0.1",
+ "fill-range": "4.0.0",
+ "isobject": "3.0.1",
+ "repeat-element": "1.1.2",
+ "snapdragon": "0.8.2",
+ "snapdragon-node": "2.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "browser-capabilities": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/browser-capabilities/-/browser-capabilities-1.1.0.tgz",
+ "integrity": "sha512-D0AhTybfR0KbVxy1DShQut4eCeluMyJhbTgVTIxvItJKzEGG9pNvOBFZfpeCASo2z0XdfczuvSfNZe/vmNlqwQ==",
+ "requires": {
+ "@types/ua-parser-js": "0.7.32",
+ "ua-parser-js": "0.7.18"
+ }
+ },
+ "browser-stdout": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz",
+ "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=",
+ "dev": true
+ },
+ "buffer-equal": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz",
+ "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=",
+ "dev": true
+ },
+ "buffer-from": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz",
+ "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA=="
+ },
+ "builtin-modules": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8="
+ },
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "requires": {
+ "collection-visit": "1.0.0",
+ "component-emitter": "1.2.1",
+ "get-value": "2.0.6",
+ "has-value": "1.0.0",
+ "isobject": "3.0.1",
+ "set-value": "2.0.0",
+ "to-object-path": "0.3.0",
+ "union-value": "1.0.0",
+ "unset-value": "1.0.0"
+ }
+ },
+ "caller-path": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
+ "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
+ "dev": true,
+ "requires": {
+ "callsites": "0.2.0"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ }
+ }
+ },
+ "callsites": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
+ "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=",
+ "dev": true
+ },
+ "camel-case": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz",
+ "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=",
+ "dev": true,
+ "requires": {
+ "no-case": "2.3.2",
+ "upper-case": "1.1.3"
+ }
+ },
+ "camelcase": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+ "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+ "dev": true
+ },
+ "camelcase-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+ "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+ "dev": true,
+ "requires": {
+ "camelcase": "2.1.1",
+ "map-obj": "1.0.1"
+ }
+ },
+ "cancel-token": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/cancel-token/-/cancel-token-0.1.1.tgz",
+ "integrity": "sha1-wYGXZ0uxyEwdaTPr8V2NWlznm08=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-helper-function-name": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
+ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
+ "requires": {
+ "babel-helper-get-function-arity": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz",
+ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ=="
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ=="
+ }
+ }
+ },
+ "capture-stack-trace": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz",
+ "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=",
+ "dev": true
+ },
+ "chai": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz",
+ "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=",
+ "dev": true,
+ "requires": {
+ "assertion-error": "1.1.0",
+ "deep-eql": "0.1.3",
+ "type-detect": "1.0.0"
+ }
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "chardet": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz",
+ "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=",
+ "dev": true
+ },
+ "chokidar": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz",
+ "integrity": "sha512-zW8iXYZtXMx4kux/nuZVXjkLP+CyIK5Al5FHnj1OgTKGZfp4Oy6/ymtMSKFv3GD8DviEmUPmJg9eFdJ/JzudMg==",
+ "dev": true,
+ "requires": {
+ "anymatch": "2.0.0",
+ "async-each": "1.0.1",
+ "braces": "2.3.2",
+ "fsevents": "1.2.3",
+ "glob-parent": "3.1.0",
+ "inherits": "2.0.3",
+ "is-binary-path": "1.0.1",
+ "is-glob": "4.0.0",
+ "normalize-path": "2.1.1",
+ "path-is-absolute": "1.0.1",
+ "readdirp": "2.1.0",
+ "upath": "1.0.5"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ }
+ }
+ },
+ "ci-info": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz",
+ "integrity": "sha512-SK/846h/Rcy8q9Z9CAwGBLfCJ6EkjJWdpelWDufQpqVDYq2Wnnv8zlSO6AMQap02jvhVruKKpEtQOufo3pFhLg==",
+ "dev": true
+ },
+ "circular-json": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
+ "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==",
+ "dev": true
+ },
+ "class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "requires": {
+ "arr-union": "3.1.0",
+ "define-property": "0.2.5",
+ "isobject": "3.0.1",
+ "static-extend": "0.1.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "clean-css": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz",
+ "integrity": "sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo=",
+ "dev": true,
+ "requires": {
+ "source-map": "0.5.7"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ=="
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ=="
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "cli-boxes": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz",
+ "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=",
+ "dev": true
+ },
+ "cli-cursor": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
+ "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
+ "dev": true,
+ "requires": {
+ "restore-cursor": "2.0.0"
+ }
+ },
+ "cli-width": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
+ "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
+ "dev": true
+ },
+ "clipboard": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.1.tgz",
+ "integrity": "sha512-7yhQBmtN+uYZmfRjjVjKa0dZdWuabzpSKGtyQZN+9C8xlC788SSJjOHWh7tzurfwTqTD5UDYAhIv5fRJg3sHjQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "good-listener": "1.2.2",
+ "select": "1.1.2",
+ "tiny-emitter": "2.0.2"
+ }
+ },
+ "cliui": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+ "dev": true,
+ "requires": {
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1",
+ "wrap-ansi": "2.1.0"
+ },
+ "dependencies": {
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dev": true,
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ }
+ }
+ },
+ "clone": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+ "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
+ "dev": true
+ },
+ "clone-buffer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
+ "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=",
+ "dev": true
+ },
+ "clone-stats": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
+ "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=",
+ "dev": true
+ },
+ "cloneable-readable": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz",
+ "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "process-nextick-args": "2.0.0",
+ "readable-stream": "2.3.6"
+ }
+ },
+ "co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
+ },
+ "code-point-at": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
+ "dev": true
+ },
+ "collection-map": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz",
+ "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=",
+ "dev": true,
+ "requires": {
+ "arr-map": "2.0.2",
+ "for-own": "1.0.0",
+ "make-iterator": "1.0.1"
+ }
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "requires": {
+ "map-visit": "1.0.0",
+ "object-visit": "1.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
+ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+ },
+ "color-support": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
+ "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs="
+ },
+ "command-line-args": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz",
+ "integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==",
+ "dev": true,
+ "requires": {
+ "argv-tools": "0.1.1",
+ "array-back": "2.0.0",
+ "find-replace": "2.0.1",
+ "lodash.camelcase": "4.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-5.0.4.tgz",
+ "integrity": "sha512-h17lBwC5bl5RdukPbXji75+cg2/Qbny6kGsmLoy34s9DNH90RwRvJKb+VU5j4YY9HzYl7twLaOWDJQ4b9U+p/Q==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "chalk": "2.4.1",
+ "table-layout": "0.4.3",
+ "typical": "2.6.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "requires": {
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "lodash": "4.17.10"
+ }
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ }
+ }
+ },
+ "commander": {
+ "version": "2.15.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
+ "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==",
+ "dev": true
+ },
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+ },
+ "concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "dev": true,
+ "requires": {
+ "buffer-from": "1.0.0",
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.6",
+ "typedarray": "0.0.6"
+ }
+ },
+ "configstore": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz",
+ "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==",
+ "dev": true,
+ "requires": {
+ "dot-prop": "4.2.0",
+ "graceful-fs": "4.1.11",
+ "make-dir": "1.2.0",
+ "unique-string": "1.0.0",
+ "write-file-atomic": "2.3.0",
+ "xdg-basedir": "3.0.0"
+ }
+ },
+ "convert-source-map": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz",
+ "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=",
+ "dev": true
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40="
+ },
+ "copy-props": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.3.tgz",
+ "integrity": "sha512-Q5jXiqCOvlQc1Nvy2txrVg9ZexZ0UAw9NBQ7/s3cZ7SCAm0WD7NNsLwwcy+xvNwuVBbfkF2+4SBcz1L1AWbtmw==",
+ "dev": true,
+ "requires": {
+ "each-props": "1.3.1",
+ "is-plain-object": "2.0.4"
+ }
+ },
+ "core-js": {
+ "version": "2.5.5",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz",
+ "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs="
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
+ },
+ "create-error-class": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz",
+ "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=",
+ "dev": true,
+ "requires": {
+ "capture-stack-trace": "1.0.0"
+ }
+ },
+ "cross-spawn": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+ "requires": {
+ "lru-cache": "4.1.2",
+ "shebang-command": "1.2.0",
+ "which": "1.3.0"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ=="
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "lru-cache": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz",
+ "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==",
+ "requires": {
+ "pseudomap": "1.0.2",
+ "yallist": "2.1.2"
+ }
+ }
+ }
+ },
+ "crypto-random-string": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz",
+ "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=",
+ "dev": true
+ },
+ "css-slam": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/css-slam/-/css-slam-2.1.0.tgz",
+ "integrity": "sha512-WY1C869GTC5zNMFsQUkiW+JB4TkCQ6XJC5LaCqFfVd0KiZu563/KnacaMYpCj6mSooTMGij5g809e4Lp4x+WvQ==",
+ "dev": true,
+ "requires": {
+ "command-line-args": "3.0.5",
+ "command-line-usage": "3.0.8",
+ "dom5": "3.0.0",
+ "parse5": "4.0.0",
+ "shady-css-parser": "0.1.0"
+ },
+ "dependencies": {
+ "array-back": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
+ "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-args": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-3.0.5.tgz",
+ "integrity": "sha1-W9StReeYPlwTRJGOQCgO4mk8WsA=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "feature-detect-es6": "1.4.0",
+ "find-replace": "1.0.3",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-3.0.8.tgz",
+ "integrity": "sha1-tqIJeMGzg0d/XBGlKUKLiAv+D00=",
+ "dev": true,
+ "requires": {
+ "ansi-escape-sequences": "3.0.0",
+ "array-back": "1.0.4",
+ "feature-detect-es6": "1.4.0",
+ "table-layout": "0.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "deep-extend": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz",
+ "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=",
+ "dev": true
+ },
+ "find-replace": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz",
+ "integrity": "sha1-uI5zZNLZyVlVnziMZmcNYTBEH6A=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "test-value": "2.1.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ=="
+ },
+ "table-layout": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.3.0.tgz",
+ "integrity": "sha1-buINxIPbNxs+XIf3BO0vfHmdLJo=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "core-js": "2.5.5",
+ "deep-extend": "0.4.2",
+ "feature-detect-es6": "1.4.0",
+ "typical": "2.6.1",
+ "wordwrapjs": "2.0.0"
+ }
+ },
+ "test-value": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz",
+ "integrity": "sha1-Edpv9nDzRxpztiXKTz/c97t0gpE=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "typical": "2.6.1"
+ }
+ },
+ "wordwrapjs": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-2.0.0.tgz",
+ "integrity": "sha1-q1X2leYRjak4WP3XDAU9HF4BrCA=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "feature-detect-es6": "1.4.0",
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ }
+ }
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "currently-unhandled": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
+ "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
+ "dev": true,
+ "requires": {
+ "array-find-index": "1.0.2"
+ }
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI="
+ },
+ "d": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
+ "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=",
+ "dev": true,
+ "requires": {
+ "es5-ext": "0.10.42"
+ }
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "dev": true
+ },
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU="
+ },
+ "deep-eql": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz",
+ "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=",
+ "dev": true,
+ "requires": {
+ "type-detect": "0.1.1"
+ },
+ "dependencies": {
+ "type-detect": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz",
+ "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=",
+ "dev": true
+ }
+ }
+ },
+ "deep-extend": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz",
+ "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w=="
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
+ },
+ "default-compare": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz",
+ "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "5.1.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "default-resolution": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz",
+ "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=",
+ "dev": true
+ },
+ "define-properties": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz",
+ "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=",
+ "dev": true,
+ "requires": {
+ "foreach": "2.0.5",
+ "object-keys": "1.0.11"
+ }
+ },
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "requires": {
+ "is-descriptor": "1.0.2",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "del": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz",
+ "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=",
+ "dev": true,
+ "requires": {
+ "globby": "6.1.0",
+ "is-path-cwd": "1.0.0",
+ "is-path-in-cwd": "1.0.1",
+ "p-map": "1.2.0",
+ "pify": "3.0.0",
+ "rimraf": "2.6.2"
+ }
+ },
+ "delegate": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz",
+ "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==",
+ "dev": true,
+ "optional": true
+ },
+ "detect-file": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
+ "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
+ "dev": true
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "diff": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz",
+ "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=",
+ "dev": true
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ }
+ }
+ },
+ "dom-serializer": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz",
+ "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=",
+ "dev": true,
+ "requires": {
+ "domelementtype": "1.1.3",
+ "entities": "1.1.1"
+ },
+ "dependencies": {
+ "domelementtype": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
+ "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=",
+ "dev": true
+ }
+ }
+ },
+ "dom-urls": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/dom-urls/-/dom-urls-1.1.0.tgz",
+ "integrity": "sha1-AB3fgWKM0ecGElxxdvU8zsVdkY4=",
+ "dev": true,
+ "requires": {
+ "urijs": "1.19.1"
+ }
+ },
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.1",
+ "parse5": "4.0.0"
+ }
+ },
+ "domelementtype": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz",
+ "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=",
+ "dev": true
+ },
+ "domhandler": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz",
+ "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=",
+ "dev": true,
+ "requires": {
+ "domelementtype": "1.3.0"
+ }
+ },
+ "domutils": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
+ "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
+ "dev": true,
+ "requires": {
+ "dom-serializer": "0.1.0",
+ "domelementtype": "1.3.0"
+ }
+ },
+ "dot-prop": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz",
+ "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==",
+ "dev": true,
+ "requires": {
+ "is-obj": "1.0.1"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.27.tgz",
+ "integrity": "sha512-ksRx+r8eFIfdt63MCgLc9VxGL7W3jcyveQvMpNMVHgW+eb9mq3Xbm45FLCNkw8h92RvoNp4uuiwzcCEwxjDBZg=="
+ }
+ }
+ },
+ "duplexer": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
+ "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=",
+ "dev": true
+ },
+ "duplexer3": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
+ "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
+ "dev": true
+ },
+ "duplexify": {
+ "version": "3.5.4",
+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.4.tgz",
+ "integrity": "sha512-JzYSLYMhoVVBe8+mbHQ4KgpvHpm0DZpJuL8PY93Vyv1fW7jYJ90LoXa1di/CVbJM+TgMs91rbDapE/RNIfnJsA==",
+ "requires": {
+ "end-of-stream": "1.4.1",
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.6",
+ "stream-shift": "1.0.0"
+ },
+ "dependencies": {
+ "end-of-stream": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
+ "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
+ "requires": {
+ "once": "1.4.0"
+ }
+ }
+ }
+ },
+ "each-props": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.1.tgz",
+ "integrity": "sha1-/BOPUeOid0KG1IWOAtbn3kYt4Vg=",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4",
+ "object.defaults": "1.1.0"
+ }
+ },
+ "emitter-component": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/emitter-component/-/emitter-component-1.1.1.tgz",
+ "integrity": "sha1-Bl4tvtaVm/RwZ57avq95gdEAOrY=",
+ "dev": true
+ },
+ "end-of-stream": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
+ "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
+ "requires": {
+ "once": "1.4.0"
+ }
+ },
+ "entities": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz",
+ "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=",
+ "dev": true
+ },
+ "error-ex": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
+ "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
+ "requires": {
+ "is-arrayish": "0.2.1"
+ }
+ },
+ "es5-ext": {
+ "version": "0.10.42",
+ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.42.tgz",
+ "integrity": "sha512-AJxO1rmPe1bDEfSR6TJ/FgMFYuTBhR5R57KW58iCkYACMyFbrkqVyzXSurYoScDGvgyMpk7uRF/lPUPPTmsRSA==",
+ "dev": true,
+ "requires": {
+ "es6-iterator": "2.0.3",
+ "es6-symbol": "3.1.1",
+ "next-tick": "1.0.0"
+ }
+ },
+ "es6-iterator": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
+ "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
+ "dev": true,
+ "requires": {
+ "d": "1.0.0",
+ "es5-ext": "0.10.42",
+ "es6-symbol": "3.1.1"
+ }
+ },
+ "es6-promise": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-2.3.0.tgz",
+ "integrity": "sha1-lu258v2wGZWCKyY92KratnSBgbw=",
+ "dev": true
+ },
+ "es6-symbol": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz",
+ "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=",
+ "dev": true,
+ "requires": {
+ "d": "1.0.0",
+ "es5-ext": "0.10.42"
+ }
+ },
+ "es6-weak-map": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz",
+ "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=",
+ "dev": true,
+ "requires": {
+ "d": "1.0.0",
+ "es5-ext": "0.10.42",
+ "es6-iterator": "2.0.3",
+ "es6-symbol": "3.1.1"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+ },
+ "escodegen": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
+ "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.6.1"
+ }
+ },
+ "eslint": {
+ "version": "4.19.1",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz",
+ "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==",
+ "dev": true,
+ "requires": {
+ "ajv": "5.5.2",
+ "babel-code-frame": "6.26.0",
+ "chalk": "2.4.1",
+ "concat-stream": "1.6.2",
+ "cross-spawn": "5.1.0",
+ "debug": "3.1.0",
+ "doctrine": "2.1.0",
+ "eslint-scope": "3.7.1",
+ "eslint-visitor-keys": "1.0.0",
+ "espree": "3.5.4",
+ "esquery": "1.0.1",
+ "esutils": "2.0.2",
+ "file-entry-cache": "2.0.0",
+ "functional-red-black-tree": "1.0.1",
+ "glob": "7.1.2",
+ "globals": "11.5.0",
+ "ignore": "3.3.8",
+ "imurmurhash": "0.1.4",
+ "inquirer": "3.3.0",
+ "is-resolvable": "1.1.0",
+ "js-yaml": "3.11.0",
+ "json-stable-stringify-without-jsonify": "1.0.1",
+ "levn": "0.3.0",
+ "lodash": "4.17.10",
+ "minimatch": "3.0.4",
+ "mkdirp": "0.5.1",
+ "natural-compare": "1.4.0",
+ "optionator": "0.8.2",
+ "path-is-inside": "1.0.2",
+ "pluralize": "7.0.0",
+ "progress": "2.0.0",
+ "regexpp": "1.1.0",
+ "require-uncached": "1.0.3",
+ "semver": "5.5.0",
+ "strip-ansi": "4.0.0",
+ "strip-json-comments": "2.0.1",
+ "table": "4.0.2",
+ "text-table": "0.2.0"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ }
+ }
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ }
+ }
+ },
+ "globals": {
+ "version": "11.5.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.5.0.tgz",
+ "integrity": "sha512-hYyf+kI8dm3nORsiiXUQigOU62hDLfJ9G01uyGMxhc6BKsircrUhC4uJPQPUSuq2GrTmiiEt7ewxlMdBewfmKQ==",
+ "dev": true
+ },
+ "semver": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
+ "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "3.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ }
+ }
+ }
+ }
+ },
+ "eslint-plugin-html": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-4.0.3.tgz",
+ "integrity": "sha512-ArFnlfQxwYSz/CP0zvk8Cy3MUhcDpT3o6jgO8eKD/b8ezcLVBrgkYzmMv+7S/ya+Yl9pN+Cz2tsgYp/zElkQzA==",
+ "dev": true,
+ "requires": {
+ "htmlparser2": "3.9.2"
+ }
+ },
+ "eslint-scope": {
+ "version": "3.7.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz",
+ "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=",
+ "dev": true,
+ "requires": {
+ "esrecurse": "4.2.1",
+ "estraverse": "4.2.0"
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
+ "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==",
+ "dev": true
+ },
+ "espree": {
+ "version": "3.5.4",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz",
+ "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==",
+ "dev": true,
+ "requires": {
+ "acorn": "5.5.3",
+ "acorn-jsx": "3.0.1"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "esquery": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz",
+ "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==",
+ "dev": true,
+ "requires": {
+ "estraverse": "4.2.0"
+ }
+ },
+ "esrecurse": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
+ "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
+ "dev": true,
+ "requires": {
+ "estraverse": "4.2.0"
+ }
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
+ },
+ "execa": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
+ "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
+ "requires": {
+ "cross-spawn": "5.1.0",
+ "get-stream": "3.0.0",
+ "is-stream": "1.1.0",
+ "npm-run-path": "2.0.2",
+ "p-finally": "1.0.0",
+ "signal-exit": "3.0.2",
+ "strip-eof": "1.0.0"
+ }
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "posix-character-classes": "0.1.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "expand-range": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
+ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
+ "dev": true,
+ "requires": {
+ "fill-range": "2.2.3"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5"
+ }
+ },
+ "fill-range": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz",
+ "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=",
+ "dev": true,
+ "requires": {
+ "is-number": "2.1.0",
+ "isobject": "2.1.0",
+ "randomatic": "1.1.7",
+ "repeat-element": "1.1.2",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "is-number": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
+ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ },
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "expand-tilde": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
+ "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
+ "dev": true,
+ "requires": {
+ "homedir-polyfill": "1.0.1"
+ }
+ },
+ "extend": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
+ "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ="
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "requires": {
+ "assign-symbols": "1.0.0",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "external-editor": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz",
+ "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==",
+ "dev": true,
+ "requires": {
+ "chardet": "0.4.2",
+ "iconv-lite": "0.4.21",
+ "tmp": "0.0.33"
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "expand-brackets": "2.1.4",
+ "extend-shallow": "2.0.1",
+ "fragment-cache": "0.2.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A="
+ },
+ "fancy-log": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz",
+ "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=",
+ "dev": true,
+ "requires": {
+ "ansi-gray": "0.1.1",
+ "color-support": "1.1.3",
+ "time-stamp": "1.1.0"
+ }
+ },
+ "fast-deep-equal": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
+ "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ="
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
+ "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
+ },
+ "feature-detect-es6": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/feature-detect-es6/-/feature-detect-es6-1.4.0.tgz",
+ "integrity": "sha512-7OnRV38WLydGuGcdm/fGk2SG9uo5ljslBSbPhCfEW5Gl0lX/IliaAVXYiYUBcI0UHTbepqO4T1SkJ74K8gtcDg==",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4"
+ },
+ "dependencies": {
+ "array-back": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
+ "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ }
+ }
+ },
+ "figures": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
+ "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
+ "dev": true,
+ "requires": {
+ "escape-string-regexp": "1.0.5"
+ }
+ },
+ "file-entry-cache": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
+ "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
+ "dev": true,
+ "requires": {
+ "flat-cache": "1.3.0",
+ "object-assign": "4.1.1"
+ }
+ },
+ "filename-regex": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
+ "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1",
+ "to-regex-range": "2.1.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "find-replace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
+ "integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "test-value": "3.0.0"
+ }
+ },
+ "find-up": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+ "dev": true,
+ "requires": {
+ "path-exists": "2.1.0",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "findup-sync": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz",
+ "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=",
+ "dev": true,
+ "requires": {
+ "detect-file": "1.0.0",
+ "is-glob": "3.1.0",
+ "micromatch": "3.1.10",
+ "resolve-dir": "1.0.1"
+ }
+ },
+ "fined": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz",
+ "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=",
+ "dev": true,
+ "requires": {
+ "expand-tilde": "2.0.2",
+ "is-plain-object": "2.0.4",
+ "object.defaults": "1.1.0",
+ "object.pick": "1.3.0",
+ "parse-filepath": "1.0.2"
+ }
+ },
+ "first-chunk-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz",
+ "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=",
+ "dev": true
+ },
+ "flagged-respawn": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.0.tgz",
+ "integrity": "sha1-Tnmumy6zi/hrO7Vr8+ClaqX8q9c=",
+ "dev": true
+ },
+ "flat-cache": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz",
+ "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=",
+ "dev": true,
+ "requires": {
+ "circular-json": "0.3.3",
+ "del": "2.2.2",
+ "graceful-fs": "4.1.11",
+ "write": "0.2.1"
+ },
+ "dependencies": {
+ "del": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
+ "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
+ "dev": true,
+ "requires": {
+ "globby": "5.0.0",
+ "is-path-cwd": "1.0.0",
+ "is-path-in-cwd": "1.0.1",
+ "object-assign": "4.1.1",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1",
+ "rimraf": "2.6.2"
+ }
+ },
+ "globby": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
+ "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
+ "dev": true,
+ "requires": {
+ "array-union": "1.0.2",
+ "arrify": "1.0.1",
+ "glob": "7.1.2",
+ "object-assign": "4.1.1",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ }
+ }
+ },
+ "flush-write-stream": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz",
+ "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.6"
+ }
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
+ },
+ "for-own": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
+ "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2"
+ }
+ },
+ "foreach": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
+ "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=",
+ "dev": true
+ },
+ "fork-stream": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/fork-stream/-/fork-stream-0.0.4.tgz",
+ "integrity": "sha1-24Sfznf2cIpfjzhq5TOgkHtUrnA=",
+ "dev": true
+ },
+ "formatio": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz",
+ "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=",
+ "dev": true,
+ "requires": {
+ "samsam": "1.1.2"
+ }
+ },
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "requires": {
+ "map-cache": "0.2.2"
+ }
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs-mkdirp-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz",
+ "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "through2": "2.0.3"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+ },
+ "fsevents": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.3.tgz",
+ "integrity": "sha512-X+57O5YkDTiEQGiw8i7wYc2nQgweIekqkepI8Q3y4wVlurgBt2SuwxTeYUYMZIGpLZH3r/TsMjczCMXE5ZOt7Q==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "nan": "2.10.0",
+ "node-pre-gyp": "0.9.1"
+ },
+ "dependencies": {
+ "abbrev": {
+ "version": "1.1.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "bundled": true,
+ "dev": true
+ },
+ "aproba": {
+ "version": "1.2.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "are-we-there-yet": {
+ "version": "1.1.4",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "delegates": "1.0.0",
+ "readable-stream": "2.3.6"
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "chownr": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "code-point-at": {
+ "version": "1.1.0",
+ "bundled": true,
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "bundled": true,
+ "dev": true
+ },
+ "console-control-strings": {
+ "version": "1.1.0",
+ "bundled": true,
+ "dev": true
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "deep-extend": {
+ "version": "0.4.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "delegates": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "detect-libc": {
+ "version": "1.0.3",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "fs-minipass": {
+ "version": "1.2.5",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "minipass": "2.2.4"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "gauge": {
+ "version": "2.7.4",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "aproba": "1.2.0",
+ "console-control-strings": "1.1.0",
+ "has-unicode": "2.0.1",
+ "object-assign": "4.1.1",
+ "signal-exit": "3.0.2",
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1",
+ "wide-align": "1.1.2"
+ }
+ },
+ "glob": {
+ "version": "7.1.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "has-unicode": {
+ "version": "2.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "iconv-lite": {
+ "version": "0.4.21",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "safer-buffer": "2.1.2"
+ }
+ },
+ "ignore-walk": {
+ "version": "3.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "bundled": true,
+ "dev": true
+ },
+ "ini": {
+ "version": "1.3.5",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "bundled": true,
+ "dev": true
+ },
+ "minipass": {
+ "version": "2.2.4",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.1",
+ "yallist": "3.0.2"
+ }
+ },
+ "minizlib": {
+ "version": "1.1.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "minipass": "2.2.4"
+ }
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "needle": {
+ "version": "2.2.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "debug": "2.6.9",
+ "iconv-lite": "0.4.21",
+ "sax": "1.2.4"
+ }
+ },
+ "node-pre-gyp": {
+ "version": "0.9.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "detect-libc": "1.0.3",
+ "mkdirp": "0.5.1",
+ "needle": "2.2.0",
+ "nopt": "4.0.1",
+ "npm-packlist": "1.1.10",
+ "npmlog": "4.1.2",
+ "rc": "1.2.6",
+ "rimraf": "2.6.2",
+ "semver": "5.5.0",
+ "tar": "4.4.1"
+ }
+ },
+ "nopt": {
+ "version": "4.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "abbrev": "1.1.1",
+ "osenv": "0.1.5"
+ }
+ },
+ "npm-bundled": {
+ "version": "1.0.3",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "npm-packlist": {
+ "version": "1.1.10",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ignore-walk": "3.0.1",
+ "npm-bundled": "1.0.3"
+ }
+ },
+ "npmlog": {
+ "version": "4.1.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "are-we-there-yet": "1.1.4",
+ "console-control-strings": "1.1.0",
+ "gauge": "2.7.4",
+ "set-blocking": "2.0.0"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "osenv": {
+ "version": "0.1.5",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "os-homedir": "1.0.2",
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "process-nextick-args": {
+ "version": "2.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "rc": {
+ "version": "1.2.6",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "deep-extend": "0.4.2",
+ "ini": "1.3.5",
+ "minimist": "1.2.0",
+ "strip-json-comments": "2.0.1"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.0",
+ "safe-buffer": "5.1.1",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "rimraf": {
+ "version": "2.6.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "glob": "7.1.2"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.1",
+ "bundled": true,
+ "dev": true
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "sax": {
+ "version": "1.2.4",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "semver": {
+ "version": "5.5.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "safe-buffer": "5.1.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-json-comments": {
+ "version": "2.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "tar": {
+ "version": "4.4.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "chownr": "1.0.1",
+ "fs-minipass": "1.2.5",
+ "minipass": "2.2.4",
+ "minizlib": "1.1.0",
+ "mkdirp": "0.5.1",
+ "safe-buffer": "5.1.1",
+ "yallist": "3.0.2"
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "wide-align": {
+ "version": "1.1.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "string-width": "1.0.2"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true
+ },
+ "yallist": {
+ "version": "3.0.2",
+ "bundled": true,
+ "dev": true
+ }
+ }
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
+ "functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+ "dev": true
+ },
+ "get-caller-file": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz",
+ "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=",
+ "dev": true
+ },
+ "get-stdin": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
+ "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+ "dev": true
+ },
+ "get-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+ "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg="
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-base": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
+ "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
+ "dev": true,
+ "requires": {
+ "glob-parent": "2.0.0",
+ "is-glob": "2.0.1"
+ },
+ "dependencies": {
+ "glob-parent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
+ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
+ "dev": true,
+ "requires": {
+ "is-glob": "2.0.1"
+ }
+ },
+ "is-extglob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+ "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ }
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "requires": {
+ "is-glob": "3.1.0",
+ "path-dirname": "1.0.2"
+ }
+ },
+ "glob-stream": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz",
+ "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=",
+ "dev": true,
+ "requires": {
+ "extend": "3.0.1",
+ "glob": "7.1.2",
+ "glob-parent": "3.1.0",
+ "is-negated-glob": "1.0.0",
+ "ordered-read-streams": "1.0.1",
+ "pumpify": "1.5.0",
+ "readable-stream": "2.3.6",
+ "remove-trailing-separator": "1.1.0",
+ "to-absolute-glob": "2.0.2",
+ "unique-stream": "2.2.1"
+ },
+ "dependencies": {
+ "to-absolute-glob": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz",
+ "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=",
+ "dev": true,
+ "requires": {
+ "is-absolute": "1.0.0",
+ "is-negated-glob": "1.0.0"
+ }
+ }
+ }
+ },
+ "glob-watcher": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.1.tgz",
+ "integrity": "sha512-fK92r2COMC199WCyGUblrZKhjra3cyVMDiypDdqg1vsSDmexnbYivK1kNR4QItiNXLKmGlqan469ks67RtNa2g==",
+ "dev": true,
+ "requires": {
+ "async-done": "1.2.4",
+ "chokidar": "2.0.3",
+ "just-debounce": "1.0.0",
+ "object.defaults": "1.1.0"
+ }
+ },
+ "global-dirs": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz",
+ "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=",
+ "dev": true,
+ "requires": {
+ "ini": "1.3.5"
+ }
+ },
+ "global-modules": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
+ "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
+ "dev": true,
+ "requires": {
+ "global-prefix": "1.0.2",
+ "is-windows": "1.0.2",
+ "resolve-dir": "1.0.1"
+ }
+ },
+ "global-prefix": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
+ "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
+ "dev": true,
+ "requires": {
+ "expand-tilde": "2.0.2",
+ "homedir-polyfill": "1.0.1",
+ "ini": "1.3.5",
+ "is-windows": "1.0.2",
+ "which": "1.3.0"
+ }
+ },
+ "globals": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-10.4.0.tgz",
+ "integrity": "sha512-uNUtxIZpGyuaq+5BqGGQHsL4wUlJAXRqOm6g3Y48/CWNGTLONgBibI0lh6lGxjR2HljFYUfszb+mk4WkgMntsA=="
+ },
+ "globby": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
+ "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
+ "dev": true,
+ "requires": {
+ "array-union": "1.0.2",
+ "glob": "7.1.2",
+ "object-assign": "4.1.1",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ }
+ }
+ },
+ "glogg": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.1.tgz",
+ "integrity": "sha512-ynYqXLoluBKf9XGR1gA59yEJisIL7YHEH4xr3ZziHB5/yl4qWfaK8Js9jGe6gBGCSCKVqiyO30WnRZADvemUNw==",
+ "dev": true,
+ "requires": {
+ "sparkles": "1.0.0"
+ }
+ },
+ "good-listener": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz",
+ "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "delegate": "3.2.0"
+ }
+ },
+ "google-closure-compiler": {
+ "version": "20180204.0.0",
+ "resolved": "https://registry.npmjs.org/google-closure-compiler/-/google-closure-compiler-20180204.0.0.tgz",
+ "integrity": "sha1-sJf/t1DGXKB6LaRp12xVHTuOIaM=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "vinyl": "2.1.0",
+ "vinyl-sourcemaps-apply": "0.2.1"
+ }
+ },
+ "got": {
+ "version": "6.7.1",
+ "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz",
+ "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=",
+ "dev": true,
+ "requires": {
+ "create-error-class": "3.0.2",
+ "duplexer3": "0.1.4",
+ "get-stream": "3.0.0",
+ "is-redirect": "1.0.0",
+ "is-retry-allowed": "1.1.0",
+ "is-stream": "1.1.0",
+ "lowercase-keys": "1.0.1",
+ "safe-buffer": "5.1.2",
+ "timed-out": "4.0.1",
+ "unzip-response": "2.0.1",
+ "url-parse-lax": "1.0.0"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
+ },
+ "graceful-readlink": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
+ "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=",
+ "dev": true
+ },
+ "growl": {
+ "version": "1.9.2",
+ "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz",
+ "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=",
+ "dev": true
+ },
+ "gulp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.0.tgz",
+ "integrity": "sha1-lXZsYB2t5Kd+0+eyttwDiBtZY2Y=",
+ "dev": true,
+ "requires": {
+ "glob-watcher": "5.0.1",
+ "gulp-cli": "2.0.1",
+ "undertaker": "1.2.0",
+ "vinyl-fs": "3.0.2"
+ },
+ "dependencies": {
+ "gulp-cli": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.0.1.tgz",
+ "integrity": "sha512-RxujJJdN8/O6IW2nPugl7YazhmrIEjmiVfPKrWt68r71UCaLKS71Hp0gpKT+F6qOUFtr7KqtifDKaAJPRVvMYQ==",
+ "dev": true,
+ "requires": {
+ "ansi-colors": "1.1.0",
+ "archy": "1.0.0",
+ "array-sort": "1.0.0",
+ "color-support": "1.1.3",
+ "concat-stream": "1.6.2",
+ "copy-props": "2.0.3",
+ "fancy-log": "1.3.2",
+ "gulplog": "1.0.0",
+ "interpret": "1.1.0",
+ "isobject": "3.0.1",
+ "liftoff": "2.5.0",
+ "matchdep": "2.0.0",
+ "mute-stdout": "1.0.0",
+ "pretty-hrtime": "1.0.3",
+ "replace-homedir": "1.0.0",
+ "semver-greatest-satisfied-range": "1.1.0",
+ "v8flags": "3.0.2",
+ "yargs": "7.1.0"
+ }
+ }
+ }
+ },
+ "gulp-babel": {
+ "version": "6.1.3",
+ "resolved": "https://registry.npmjs.org/gulp-babel/-/gulp-babel-6.1.3.tgz",
+ "integrity": "sha512-tm15R3rt4gO59WXCuqrwf4QXJM9VIJC+0J2NPYSC6xZn+cZRD5y5RPGAiHaDxCJq7Rz5BDljlrk3cEjWADF+wQ==",
+ "dev": true,
+ "requires": {
+ "babel-core": "6.26.3",
+ "object-assign": "4.1.1",
+ "plugin-error": "1.0.1",
+ "replace-ext": "0.0.1",
+ "through2": "2.0.3",
+ "vinyl-sourcemaps-apply": "0.2.1"
+ },
+ "dependencies": {
+ "replace-ext": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
+ "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
+ "dev": true
+ }
+ }
+ },
+ "gulp-eslint": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/gulp-eslint/-/gulp-eslint-4.0.2.tgz",
+ "integrity": "sha512-fcFUQzFsN6dJ6KZlG+qPOEkqfcevRUXgztkYCvhNvJeSvOicC8ucutN4qR/ID8LmNZx9YPIkBzazTNnVvbh8wg==",
+ "dev": true,
+ "requires": {
+ "eslint": "4.19.1",
+ "fancy-log": "1.3.2",
+ "plugin-error": "1.0.1"
+ }
+ },
+ "gulp-if": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/gulp-if/-/gulp-if-2.0.2.tgz",
+ "integrity": "sha1-pJe351cwBQQcqivIt92jyARE1ik=",
+ "dev": true,
+ "requires": {
+ "gulp-match": "1.0.3",
+ "ternary-stream": "2.0.1",
+ "through2": "2.0.3"
+ }
+ },
+ "gulp-match": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/gulp-match/-/gulp-match-1.0.3.tgz",
+ "integrity": "sha1-kcfA1/Kb7NZgbVfYCn+Hdqh6uo4=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "gulp-replace": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/gulp-replace/-/gulp-replace-0.6.1.tgz",
+ "integrity": "sha1-Eb+Mj85TPjPi9qjy9DC5VboL4GY=",
+ "dev": true,
+ "requires": {
+ "istextorbinary": "1.0.2",
+ "readable-stream": "2.3.6",
+ "replacestream": "4.0.3"
+ }
+ },
+ "gulp-size": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/gulp-size/-/gulp-size-3.0.0.tgz",
+ "integrity": "sha1-yxrI5rqD3t5SQwxH/QOTJPAD/4I=",
+ "dev": true,
+ "requires": {
+ "chalk": "2.4.1",
+ "fancy-log": "1.3.2",
+ "gzip-size": "4.1.0",
+ "plugin-error": "0.1.2",
+ "pretty-bytes": "4.0.2",
+ "stream-counter": "1.0.0",
+ "through2": "2.0.3"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "arr-diff": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz",
+ "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-slice": "0.2.3"
+ }
+ },
+ "arr-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz",
+ "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=",
+ "dev": true
+ },
+ "array-slice": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz",
+ "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz",
+ "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=",
+ "dev": true,
+ "requires": {
+ "kind-of": "1.1.0"
+ }
+ },
+ "kind-of": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz",
+ "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=",
+ "dev": true
+ },
+ "plugin-error": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz",
+ "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=",
+ "dev": true,
+ "requires": {
+ "ansi-cyan": "0.1.1",
+ "ansi-red": "0.1.1",
+ "arr-diff": "1.1.0",
+ "arr-union": "2.1.0",
+ "extend-shallow": "1.1.4"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ }
+ }
+ },
+ "gulp-sourcemaps": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz",
+ "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=",
+ "dev": true,
+ "requires": {
+ "convert-source-map": "1.5.1",
+ "graceful-fs": "4.1.11",
+ "strip-bom": "2.0.0",
+ "through2": "2.0.3",
+ "vinyl": "1.2.0"
+ },
+ "dependencies": {
+ "clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
+ "dev": true
+ },
+ "clone-stats": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
+ "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
+ "dev": true
+ },
+ "replace-ext": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
+ "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
+ "dev": true
+ },
+ "strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "dev": true,
+ "requires": {
+ "is-utf8": "0.2.1"
+ }
+ },
+ "vinyl": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz",
+ "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=",
+ "dev": true,
+ "requires": {
+ "clone": "1.0.4",
+ "clone-stats": "0.0.1",
+ "replace-ext": "0.0.1"
+ }
+ }
+ }
+ },
+ "gulp-vulcanize": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/gulp-vulcanize/-/gulp-vulcanize-7.0.0.tgz",
+ "integrity": "sha512-SnyChu0+DbCK7QWN0UStPKEG8igkv0feLfx25jLAbrEULTHmvUPhx1BF3vYz6SsA32Azxp5UoU6jNI4Q8PzBPQ==",
+ "dev": true,
+ "requires": {
+ "plugin-error": "0.1.2",
+ "safe-buffer": "5.1.2",
+ "through2": "2.0.3",
+ "vulcanize": "1.16.0"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz",
+ "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-slice": "0.2.3"
+ }
+ },
+ "arr-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz",
+ "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=",
+ "dev": true
+ },
+ "array-slice": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz",
+ "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=",
+ "dev": true
+ },
+ "extend-shallow": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz",
+ "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=",
+ "dev": true,
+ "requires": {
+ "kind-of": "1.1.0"
+ }
+ },
+ "kind-of": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz",
+ "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=",
+ "dev": true
+ },
+ "plugin-error": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz",
+ "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=",
+ "dev": true,
+ "requires": {
+ "ansi-cyan": "0.1.1",
+ "ansi-red": "0.1.1",
+ "arr-diff": "1.1.0",
+ "arr-union": "2.1.0",
+ "extend-shallow": "1.1.4"
+ }
+ }
+ }
+ },
+ "gulplog": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz",
+ "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=",
+ "dev": true,
+ "requires": {
+ "glogg": "1.0.1"
+ }
+ },
+ "gzip-size": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-4.1.0.tgz",
+ "integrity": "sha1-iuCWJX6r59acRb4rZ8RIEk/7UXw=",
+ "dev": true,
+ "requires": {
+ "duplexer": "0.1.1",
+ "pify": "3.0.0"
+ }
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+ },
+ "has-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz",
+ "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=",
+ "dev": true
+ },
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "1.0.0",
+ "isobject": "3.0.1"
+ }
+ },
+ "has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "requires": {
+ "is-number": "3.0.0",
+ "kind-of": "4.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "he": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
+ "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
+ "dev": true
+ },
+ "home-or-tmp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
+ "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
+ "dev": true,
+ "requires": {
+ "os-homedir": "1.0.2",
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "homedir-polyfill": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz",
+ "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=",
+ "dev": true,
+ "requires": {
+ "parse-passwd": "1.0.0"
+ }
+ },
+ "hosted-git-info": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz",
+ "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw=="
+ },
+ "html-minifier": {
+ "version": "3.5.15",
+ "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.15.tgz",
+ "integrity": "sha512-OZa4rfb6tZOZ3Z8Xf0jKxXkiDcFWldQePGYFDcgKqES2sXeWaEv9y6QQvWUtX3ySI3feApQi5uCsHLINQ6NoAw==",
+ "dev": true,
+ "requires": {
+ "camel-case": "3.0.0",
+ "clean-css": "4.1.11",
+ "commander": "2.15.1",
+ "he": "1.1.1",
+ "param-case": "2.1.1",
+ "relateurl": "0.2.7",
+ "uglify-js": "3.3.23"
+ }
+ },
+ "htmlparser2": {
+ "version": "3.9.2",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz",
+ "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=",
+ "dev": true,
+ "requires": {
+ "domelementtype": "1.3.0",
+ "domhandler": "2.4.1",
+ "domutils": "1.7.0",
+ "entities": "1.1.1",
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.6"
+ }
+ },
+ "hydrolysis": {
+ "version": "1.25.0",
+ "resolved": "https://registry.npmjs.org/hydrolysis/-/hydrolysis-1.25.0.tgz",
+ "integrity": "sha1-pPsUo3oeA7DbUtiqpXxoInKhTYQ=",
+ "dev": true,
+ "requires": {
+ "acorn": "3.3.0",
+ "babel-polyfill": "6.26.0",
+ "doctrine": "0.7.2",
+ "dom5": "1.1.0",
+ "escodegen": "1.9.1",
+ "espree": "3.5.4",
+ "estraverse": "3.1.0",
+ "path-is-absolute": "1.0.1"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
+ "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=",
+ "dev": true
+ },
+ "doctrine": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz",
+ "integrity": "sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM=",
+ "dev": true,
+ "requires": {
+ "esutils": "1.1.6",
+ "isarray": "0.0.1"
+ }
+ },
+ "dom5": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-1.1.0.tgz",
+ "integrity": "sha1-Ogx3AMCDq0xNJpOKeLDwxtzDd5Q=",
+ "dev": true,
+ "requires": {
+ "parse5": "1.5.1"
+ }
+ },
+ "estraverse": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-3.1.0.tgz",
+ "integrity": "sha1-FeKKRGuLgrxwDMyLlseK9NoNbLo=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.1.6.tgz",
+ "integrity": "sha1-wBzKqa5LiXxtDD4hCuUvPHqEQ3U=",
+ "dev": true
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "parse5": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz",
+ "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=",
+ "dev": true
+ }
+ }
+ },
+ "iconv-lite": {
+ "version": "0.4.21",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz",
+ "integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==",
+ "dev": true,
+ "requires": {
+ "safer-buffer": "2.1.2"
+ }
+ },
+ "ignore": {
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz",
+ "integrity": "sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg==",
+ "dev": true
+ },
+ "import-lazy": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
+ "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
+ "dev": true
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "indent-string": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
+ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+ },
+ "ini": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
+ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
+ },
+ "inquirer": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz",
+ "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==",
+ "dev": true,
+ "requires": {
+ "ansi-escapes": "3.1.0",
+ "chalk": "2.4.1",
+ "cli-cursor": "2.1.0",
+ "cli-width": "2.2.0",
+ "external-editor": "2.2.0",
+ "figures": "2.0.0",
+ "lodash": "4.17.10",
+ "mute-stream": "0.0.7",
+ "run-async": "2.3.0",
+ "rx-lite": "4.0.8",
+ "rx-lite-aggregates": "4.0.8",
+ "string-width": "2.1.1",
+ "strip-ansi": "4.0.0",
+ "through": "2.3.8"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "3.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ }
+ }
+ },
+ "interpret": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
+ "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "requires": {
+ "loose-envify": "1.3.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "invert-kv": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
+ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY="
+ },
+ "is-absolute": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz",
+ "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==",
+ "requires": {
+ "is-relative": "1.0.0",
+ "is-windows": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
+ },
+ "is-binary-path": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
+ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+ "dev": true,
+ "requires": {
+ "binary-extensions": "1.11.0"
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+ },
+ "is-builtin-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
+ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
+ "requires": {
+ "builtin-modules": "1.1.1"
+ }
+ },
+ "is-ci": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz",
+ "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==",
+ "dev": true,
+ "requires": {
+ "ci-info": "1.1.3"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
+ }
+ }
+ },
+ "is-dotfile": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
+ "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=",
+ "dev": true
+ },
+ "is-equal-shallow": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
+ "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
+ "requires": {
+ "is-primitive": "2.0.0"
+ },
+ "dependencies": {
+ "async": {
+ "version": "0.2.10",
+ "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz",
+ "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E="
+ }
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ },
+ "is-installed-globally": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz",
+ "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=",
+ "dev": true,
+ "requires": {
+ "global-dirs": "0.1.1",
+ "is-path-inside": "1.0.1"
+ }
+ },
+ "is-negated-glob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz",
+ "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=",
+ "dev": true
+ },
+ "is-npm": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz",
+ "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=",
+ "dev": true
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "del": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
+ "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
+ "requires": {
+ "globby": "5.0.0",
+ "is-path-cwd": "1.0.0",
+ "is-path-in-cwd": "1.0.1",
+ "object-assign": "4.1.1",
+ "pinkie-promise": "2.0.1",
+ "rimraf": "2.6.2"
+ }
+ },
+ "globby": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
+ "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
+ "requires": {
+ "array-union": "1.0.2",
+ "arrify": "1.0.1",
+ "glob": "7.1.2",
+ "object-assign": "4.1.1",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
+ "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
+ "dev": true
+ },
+ "is-odd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz",
+ "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==",
+ "requires": {
+ "is-number": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ=="
+ }
+ }
+ },
+ "is-path-cwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
+ "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0="
+ },
+ "is-path-in-cwd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz",
+ "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==",
+ "requires": {
+ "is-path-inside": "1.0.1"
+ }
+ },
+ "is-path-inside": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
+ "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
+ "requires": {
+ "path-is-inside": "1.0.2"
+ }
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "is-posix-bracket": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
+ "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
+ "dev": true
+ },
+ "is-primitive": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
+ "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU="
+ },
+ "is-promise": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
+ "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
+ "dev": true
+ },
+ "is-redirect": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz",
+ "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=",
+ "dev": true
+ },
+ "is-relative": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
+ "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==",
+ "requires": {
+ "is-unc-path": "1.0.0"
+ }
+ },
+ "is-resolvable": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
+ "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==",
+ "dev": true
+ },
+ "is-retry-allowed": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz",
+ "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=",
+ "dev": true
+ },
+ "is-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
+ },
+ "is-unc-path": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
+ "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==",
+ "requires": {
+ "unc-path-regex": "0.1.2"
+ }
+ },
+ "is-utf8": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI="
+ },
+ "is-valid-glob": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz",
+ "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=",
+ "dev": true
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
+ },
+ "istextorbinary": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-1.0.2.tgz",
+ "integrity": "sha1-rOGTVNGpoBc+/rEITOD4ewrX3s8=",
+ "dev": true,
+ "requires": {
+ "binaryextensions": "1.0.1",
+ "textextensions": "1.0.2"
+ }
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls="
+ },
+ "js-yaml": {
+ "version": "3.11.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz",
+ "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==",
+ "dev": true,
+ "requires": {
+ "argparse": "1.0.10",
+ "esprima": "4.0.0"
+ },
+ "dependencies": {
+ "esprima": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
+ "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==",
+ "dev": true
+ }
+ }
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "json-schema-traverse": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
+ "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A="
+ },
+ "json-stable-stringify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
+ "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
+ "dev": true,
+ "requires": {
+ "jsonify": "0.0.0"
+ }
+ },
+ "json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+ "dev": true
+ },
+ "json3": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz",
+ "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=",
+ "dev": true
+ },
+ "json5": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
+ "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonify": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
+ "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
+ "dev": true
+ },
+ "jsonschema": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.4.tgz",
+ "integrity": "sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw=="
+ },
+ "just-debounce": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz",
+ "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+ },
+ "last-run": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz",
+ "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=",
+ "dev": true,
+ "requires": {
+ "default-resolution": "2.0.0",
+ "es6-weak-map": "2.0.2"
+ }
+ },
+ "latest-version": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz",
+ "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=",
+ "dev": true,
+ "requires": {
+ "package-json": "4.0.1"
+ }
+ },
+ "lazypipe": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/lazypipe/-/lazypipe-1.0.1.tgz",
+ "integrity": "sha1-FHGu9rN6NA1Rw030Rpnc7wZMGUA=",
+ "dev": true,
+ "requires": {
+ "stream-combiner": "0.2.2"
+ }
+ },
+ "lazystream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz",
+ "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.6"
+ }
+ },
+ "lcid": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
+ "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
+ "requires": {
+ "invert-kv": "1.0.0"
+ }
+ },
+ "lead": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz",
+ "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=",
+ "dev": true,
+ "requires": {
+ "flush-write-stream": "1.0.3"
+ }
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "liftoff": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz",
+ "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=",
+ "dev": true,
+ "requires": {
+ "extend": "3.0.1",
+ "findup-sync": "2.0.0",
+ "fined": "1.1.0",
+ "flagged-respawn": "1.0.0",
+ "is-plain-object": "2.0.4",
+ "object.map": "1.0.1",
+ "rechoir": "0.6.2",
+ "resolve": "1.7.1"
+ }
+ },
+ "load-json-file": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "parse-json": "2.2.0",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1",
+ "strip-bom": "2.0.0"
+ },
+ "dependencies": {
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
+ },
+ "strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "requires": {
+ "is-utf8": "0.2.1"
+ }
+ }
+ }
+ },
+ "lodash": {
+ "version": "4.17.10",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
+ "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg=="
+ },
+ "lodash._baseassign": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz",
+ "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=",
+ "dev": true,
+ "requires": {
+ "lodash._basecopy": "3.0.1",
+ "lodash.keys": "3.1.2"
+ }
+ },
+ "lodash._basecopy": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz",
+ "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=",
+ "dev": true
+ },
+ "lodash._basecreate": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz",
+ "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=",
+ "dev": true
+ },
+ "lodash._getnative": {
+ "version": "3.9.1",
+ "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz",
+ "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=",
+ "dev": true
+ },
+ "lodash._isiterateecall": {
+ "version": "3.0.9",
+ "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz",
+ "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=",
+ "dev": true
+ },
+ "lodash._reinterpolate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
+ "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0="
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.create": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz",
+ "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=",
+ "dev": true,
+ "requires": {
+ "lodash._baseassign": "3.2.0",
+ "lodash._basecreate": "3.0.3",
+ "lodash._isiterateecall": "3.0.9"
+ }
+ },
+ "lodash.defaults": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
+ "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=",
+ "dev": true
+ },
+ "lodash.isarguments": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
+ "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=",
+ "dev": true
+ },
+ "lodash.isarray": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz",
+ "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=",
+ "dev": true
+ },
+ "lodash.isequal": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+ "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=",
+ "dev": true
+ },
+ "lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=",
+ "dev": true
+ },
+ "lodash.keys": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz",
+ "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=",
+ "dev": true,
+ "requires": {
+ "lodash._getnative": "3.9.1",
+ "lodash.isarguments": "3.1.0",
+ "lodash.isarray": "3.0.4"
+ }
+ },
+ "lodash.padend": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
+ "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "dev": true
+ },
+ "lodash.some": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz",
+ "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=",
+ "dev": true
+ },
+ "lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
+ "dev": true
+ },
+ "lolex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz",
+ "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "loud-rejection": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
+ "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
+ "dev": true,
+ "requires": {
+ "currently-unhandled": "0.4.1",
+ "signal-exit": "3.0.2"
+ }
+ },
+ "lower-case": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz",
+ "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw="
+ },
+ "lowercase-keys": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
+ "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
+ "dev": true
+ },
+ "make-dir": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz",
+ "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==",
+ "dev": true,
+ "requires": {
+ "pify": "3.0.0"
+ }
+ },
+ "make-iterator": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz",
+ "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==",
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8="
+ },
+ "map-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+ "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+ "dev": true
+ },
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "requires": {
+ "object-visit": "1.0.1"
+ }
+ },
+ "marked": {
+ "version": "0.3.19",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz",
+ "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==",
+ "dev": true
+ },
+ "matchdep": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz",
+ "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=",
+ "dev": true,
+ "requires": {
+ "findup-sync": "2.0.0",
+ "micromatch": "3.1.10",
+ "resolve": "1.7.1",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "matcher": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/matcher/-/matcher-1.1.0.tgz",
+ "integrity": "sha512-aZGv6JBTHqfqAd09jmAlbKnAICTfIvb5Z8gXVxPB5WZtFfHMaAMdACL7tQflD2V+6/8KNcY8s6DYtWLgpJP5lA==",
+ "dev": true,
+ "requires": {
+ "escape-string-regexp": "1.0.5"
+ }
+ },
+ "meow": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
+ "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
+ "dev": true,
+ "requires": {
+ "camelcase-keys": "2.1.0",
+ "decamelize": "1.2.0",
+ "loud-rejection": "1.6.0",
+ "map-obj": "1.0.1",
+ "minimist": "1.2.0",
+ "normalize-package-data": "2.4.0",
+ "object-assign": "4.1.1",
+ "read-pkg-up": "1.0.1",
+ "redent": "1.0.0",
+ "trim-newlines": "1.0.0"
+ }
+ },
+ "merge-stream": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz",
+ "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.6"
+ }
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "braces": "2.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "extglob": "2.0.4",
+ "fragment-cache": "0.2.1",
+ "kind-of": "6.0.2",
+ "nanomatch": "1.2.9",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "mimic-fn": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
+ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
+ },
+ "mixin-deep": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
+ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
+ "requires": {
+ "for-in": "1.0.2",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "dev": true
+ }
+ }
+ },
+ "mocha": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz",
+ "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==",
+ "dev": true,
+ "requires": {
+ "browser-stdout": "1.3.0",
+ "commander": "2.9.0",
+ "debug": "2.6.8",
+ "diff": "3.2.0",
+ "escape-string-regexp": "1.0.5",
+ "glob": "7.1.1",
+ "growl": "1.9.2",
+ "he": "1.1.1",
+ "json3": "3.3.2",
+ "lodash.create": "3.1.1",
+ "mkdirp": "0.5.1",
+ "supports-color": "3.1.2"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz",
+ "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=",
+ "dev": true,
+ "requires": {
+ "graceful-readlink": "1.0.1"
+ }
+ },
+ "debug": {
+ "version": "2.6.8",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz",
+ "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "glob": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz",
+ "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz",
+ "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=",
+ "dev": true,
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ }
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ },
+ "mute-stdout": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.0.tgz",
+ "integrity": "sha1-WzLqB+tDyd7WEwQ0z5JvRrKn/U0=",
+ "dev": true
+ },
+ "mute-stream": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
+ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
+ "dev": true
+ },
+ "mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "requires": {
+ "any-promise": "1.3.0",
+ "object-assign": "4.1.1",
+ "thenify-all": "1.6.0"
+ }
+ },
+ "nan": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz",
+ "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==",
+ "dev": true,
+ "optional": true
+ },
+ "nanomatch": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz",
+ "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "fragment-cache": "0.2.1",
+ "is-odd": "2.0.0",
+ "is-windows": "1.0.2",
+ "kind-of": "6.0.2",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "dev": true
+ },
+ "next-tick": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
+ "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=",
+ "dev": true
+ },
+ "no-case": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
+ "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==",
+ "dev": true,
+ "requires": {
+ "lower-case": "1.1.4"
+ }
+ },
+ "nopt": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
+ "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
+ "dev": true,
+ "requires": {
+ "abbrev": "1.1.1"
+ }
+ },
+ "normalize-package-data": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
+ "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
+ "dev": true,
+ "requires": {
+ "hosted-git-info": "2.6.0",
+ "is-builtin-module": "1.0.0",
+ "semver": "4.3.6",
+ "validate-npm-package-license": "3.0.3"
+ }
+ },
+ "normalize-path": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+ "dev": true,
+ "requires": {
+ "remove-trailing-separator": "1.1.0"
+ }
+ },
+ "now-and-later": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.0.tgz",
+ "integrity": "sha1-vGHLtFbXnLMiB85HygUTb/Ln1u4=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0"
+ }
+ },
+ "npm-run-path": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+ "requires": {
+ "path-key": "2.0.1"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "requires": {
+ "copy-descriptor": "0.1.1",
+ "define-property": "0.2.5",
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "object-keys": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz",
+ "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=",
+ "dev": true
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "object.assign": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
+ "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
+ "dev": true,
+ "requires": {
+ "define-properties": "1.1.2",
+ "function-bind": "1.1.1",
+ "has-symbols": "1.0.0",
+ "object-keys": "1.0.11"
+ }
+ },
+ "object.defaults": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
+ "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=",
+ "dev": true,
+ "requires": {
+ "array-each": "1.0.1",
+ "array-slice": "1.1.0",
+ "for-own": "1.0.0",
+ "isobject": "3.0.1"
+ }
+ },
+ "object.map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz",
+ "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=",
+ "dev": true,
+ "requires": {
+ "for-own": "1.0.0",
+ "make-iterator": "1.0.1"
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "object.reduce": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz",
+ "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=",
+ "dev": true,
+ "requires": {
+ "for-own": "1.0.0",
+ "make-iterator": "1.0.1"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "onetime": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
+ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "1.2.0"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "ordered-read-streams": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz",
+ "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.6"
+ }
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
+ "dev": true
+ },
+ "os-locale": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
+ "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
+ "dev": true,
+ "requires": {
+ "lcid": "1.0.0"
+ }
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
+ "dev": true
+ },
+ "p-finally": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
+ },
+ "p-map": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz",
+ "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==",
+ "dev": true
+ },
+ "package-json": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz",
+ "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=",
+ "dev": true,
+ "requires": {
+ "got": "6.7.1",
+ "registry-auth-token": "3.3.2",
+ "registry-url": "3.1.0",
+ "semver": "5.5.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
+ "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
+ "dev": true
+ }
+ }
+ },
+ "param-case": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz",
+ "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=",
+ "dev": true,
+ "requires": {
+ "no-case": "2.3.2"
+ }
+ },
+ "parse-filepath": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz",
+ "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=",
+ "dev": true,
+ "requires": {
+ "is-absolute": "1.0.0",
+ "map-cache": "0.2.2",
+ "path-root": "0.1.1"
+ }
+ },
+ "parse-json": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+ "requires": {
+ "error-ex": "1.3.1"
+ }
+ },
+ "parse-passwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
+ "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
+ "dev": true
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ="
+ },
+ "path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+ "dev": true
+ },
+ "path-exists": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+ "dev": true,
+ "requires": {
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM="
+ },
+ "path-key": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME="
+ },
+ "path-posix": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/path-posix/-/path-posix-1.0.0.tgz",
+ "integrity": "sha1-BrJhE/Vr6rBCVFojv6iAA8ysJg8=",
+ "dev": true
+ },
+ "path-root": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz",
+ "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=",
+ "dev": true,
+ "requires": {
+ "path-root-regex": "0.1.2"
+ }
+ },
+ "path-root-regex": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz",
+ "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=",
+ "dev": true
+ },
+ "path-to-regexp": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz",
+ "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=",
+ "dev": true,
+ "requires": {
+ "isarray": "0.0.1"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ }
+ }
+ },
+ "path-type": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ }
+ }
+ },
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "dev": true
+ },
+ "pinkie": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+ "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
+ },
+ "pinkie-promise": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+ "requires": {
+ "pinkie": "2.0.4"
+ }
+ },
+ "plugin-error": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz",
+ "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==",
+ "dev": true,
+ "requires": {
+ "ansi-colors": "1.1.0",
+ "arr-diff": "4.0.0",
+ "arr-union": "3.1.0",
+ "extend-shallow": "3.0.2"
+ }
+ },
+ "pluralize": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
+ "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==",
+ "dev": true
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.9",
+ "winston": "2.4.2"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-2.7.0.tgz",
+ "integrity": "sha512-yD5FYQ8thX/2vHTaEgTtCs/NSG3ko4VlEb0IjM/PFsu03lHNHnpadC1NGwKyvI9vOjcFhnw4mDEVW0lbxLo8Eg==",
+ "dev": true,
+ "requires": {
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/escodegen": "0.0.2",
+ "@types/estraverse": "0.0.6",
+ "@types/estree": "0.0.37",
+ "@types/node": "6.0.107",
+ "@types/parse5": "2.2.34",
+ "chalk": "1.1.3",
+ "clone": "2.1.1",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "2.3.0",
+ "escodegen": "1.9.1",
+ "espree": "3.5.4",
+ "estraverse": "4.2.0",
+ "jsonschema": "1.2.4",
+ "parse5": "2.2.3",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.8",
+ "strip-indent": "2.0.0"
+ },
+ "dependencies": {
+ "dom5": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-2.3.0.tgz",
+ "integrity": "sha1-+CBJdb0NrLvltYqKk//B/tD/zSo=",
+ "dev": true,
+ "requires": {
+ "@types/clone": "0.1.30",
+ "@types/node": "6.0.107",
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.1",
+ "parse5": "2.2.3"
+ }
+ },
+ "parse5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-2.2.3.tgz",
+ "integrity": "sha1-DE/EHBAAxea5PUiwP4CDg3g06fY=",
+ "dev": true
+ }
+ }
+ },
+ "polymer-build": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/polymer-build/-/polymer-build-2.5.0.tgz",
+ "integrity": "sha512-HM15aQKAWze9XW57F/5m5ByZWSG5PdxyBGPMjBEDu/c4aoA9ZIx9/aFDWlPxnXMC7AUNQuAD2EMgQ6Abp06m8g==",
+ "dev": true,
+ "requires": {
+ "@types/babel-core": "6.25.3",
+ "@types/babel-traverse": "6.25.3",
+ "@types/gulp-if": "0.0.33",
+ "@types/html-minifier": "3.5.2",
+ "@types/is-windows": "0.2.0",
+ "@types/mz": "0.0.31",
+ "@types/node": "6.0.107",
+ "@types/parse5": "2.2.34",
+ "@types/resolve": "0.0.7",
+ "@types/uuid": "3.4.3",
+ "@types/vinyl": "2.0.2",
+ "@types/vinyl-fs": "0.0.28",
+ "babel-core": "6.26.3",
+ "babel-plugin-external-helpers": "6.22.0",
+ "babel-plugin-syntax-async-functions": "6.13.0",
+ "babel-plugin-syntax-async-generators": "6.13.0",
+ "babel-plugin-syntax-dynamic-import": "6.18.0",
+ "babel-plugin-syntax-exponentiation-operator": "6.13.0",
+ "babel-plugin-syntax-export-extensions": "6.13.0",
+ "babel-plugin-syntax-object-rest-spread": "6.13.0",
+ "babel-plugin-transform-async-generator-functions": "6.24.1",
+ "babel-plugin-transform-async-to-generator": "6.24.1",
+ "babel-plugin-transform-es2015-modules-amd": "6.24.1",
+ "babel-plugin-transform-exponentiation-operator": "6.24.1",
+ "babel-plugin-transform-object-rest-spread": "6.26.0",
+ "babel-preset-es2015": "6.24.1",
+ "babel-preset-minify": "0.3.0",
+ "babel-traverse": "6.26.0",
+ "css-slam": "2.1.0",
+ "dom5": "2.3.0",
+ "gulp-if": "2.0.2",
+ "html-minifier": "3.5.15",
+ "is-windows": "1.0.2",
+ "matcher": "1.1.0",
+ "multipipe": "1.0.2",
+ "mz": "2.7.0",
+ "parse5": "2.2.3",
+ "path-is-inside": "1.0.2",
+ "plylog": "0.5.0",
+ "polymer-analyzer": "2.7.0",
+ "polymer-bundler": "3.1.1",
+ "polymer-project-config": "3.14.0",
+ "resolve": "1.7.1",
+ "stream": "0.0.2",
+ "sw-precache": "5.2.1",
+ "uuid": "3.2.1",
+ "vinyl": "1.2.0",
+ "vinyl-fs": "2.4.4",
+ "whatwg-url": "6.4.1"
+ },
+ "dependencies": {
+ "@types/resolve": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.7.tgz",
+ "integrity": "sha512-GPewdjkb0Q76o459qgp6pBLzJj/bD3oveS2kfLhIkZ9U3t3AFKtl5DlFB6lGTw0iZmcmxoGC8lpLW3NNJKrN9A==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.107"
+ }
+ },
+ "arr-diff": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
+ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0"
+ }
+ },
+ "array-unique": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
+ "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-helper-evaluate-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.3.0.tgz",
+ "integrity": "sha512-dRFlMTqUJRGzx5a2smKxmptDdNCXKSkPcXWzKLwAV72hvIZumrd/0z9RcewHkr7PmAEq+ETtpD1GK6wZ6ZUXzw==",
+ "dev": true
+ },
+ "babel-helper-flip-expressions": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.3.0.tgz",
+ "integrity": "sha512-kNGohWmtAG3b7tN1xocRQ5rsKkH/hpvZsMiGOJ1VwGJKhnwzR5KlB3rvKBaBPl5/IGHcopB2JN+r1SUEX1iMAw==",
+ "dev": true
+ },
+ "babel-helper-is-void-0": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-is-void-0/-/babel-helper-is-void-0-0.3.0.tgz",
+ "integrity": "sha512-JVqdX8y7Rf/x4NwbqtUI7mdQjL9HWoDnoAEQ8Gv8oxzjvbJv+n75f7l36m9Y8C7sCUltX3V5edndrp7Hp1oSXQ==",
+ "dev": true
+ },
+ "babel-helper-mark-eval-scopes": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.3.0.tgz",
+ "integrity": "sha512-nrho5Dg4vl0VUgURVpGpEGiwbst5JX7efIyDHFxmkCx/ocQFnrPt8ze9Kxl6TKjR29bJ7D/XKY1NMlSxOQJRbQ==",
+ "dev": true
+ },
+ "babel-helper-remove-or-void": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.3.0.tgz",
+ "integrity": "sha512-D68W1M3ibCcbg0ysh3ww4/O0g10X1CXK720oOuR8kpfY7w0yP4tVcpK7zDmI1JecynycTQYAZ1rhLJo9aVtIKQ==",
+ "dev": true
+ },
+ "babel-helper-to-multiple-sequence-expressions": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.3.0.tgz",
+ "integrity": "sha512-1uCrBD+EAaMnAYh7hc944n8Ga19y3daEnoXWPYDvFVsxMCc1l8aDjksApaCEaNSSuewq8BEcff47Cy1PbLg2Gw==",
+ "dev": true
+ },
+ "babel-plugin-minify-builtins": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.3.0.tgz",
+ "integrity": "sha512-MqhSHlxkmgURqj3144qPksbZ/qof1JWdumcbucc4tysFcf3P3V3z3munTevQgKEFNMd8F5/ECGnwb63xogLjAg==",
+ "dev": true,
+ "requires": {
+ "babel-helper-evaluate-path": "0.3.0"
+ }
+ },
+ "babel-plugin-minify-constant-folding": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.3.0.tgz",
+ "integrity": "sha512-1XeRpx+aY1BuNY6QU/cm6P+FtEi3ar3XceYbmC+4q4W+2Ewq5pL7V68oHg1hKXkBIE0Z4/FjSoHz6vosZLOe/A==",
+ "dev": true,
+ "requires": {
+ "babel-helper-evaluate-path": "0.3.0"
+ }
+ },
+ "babel-plugin-minify-dead-code-elimination": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.3.0.tgz",
+ "integrity": "sha512-SjM2Fzg85YZz+q/PNJ/HU4O3W98FKFOiP9K5z3sfonlamGOzvZw3Eup2OTiEBsbbqTeY8yzNCAv3qpJRYCgGmw==",
+ "dev": true,
+ "requires": {
+ "babel-helper-evaluate-path": "0.3.0",
+ "babel-helper-mark-eval-scopes": "0.3.0",
+ "babel-helper-remove-or-void": "0.3.0",
+ "lodash.some": "4.6.0"
+ }
+ },
+ "babel-plugin-minify-flip-comparisons": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.3.0.tgz",
+ "integrity": "sha512-B8lK+ekcpSNVH7PZpWDe5nC5zxjRiiT4nTsa6h3QkF3Kk6y9qooIFLemdGlqBq6j0zALEnebvCpw8v7gAdpgnw==",
+ "dev": true,
+ "requires": {
+ "babel-helper-is-void-0": "0.3.0"
+ }
+ },
+ "babel-plugin-minify-guarded-expressions": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.3.0.tgz",
+ "integrity": "sha512-O+6CvF5/Ttsth3LMg4/BhyvVZ82GImeKMXGdVRQGK/8jFiP15EjRpdgFlxv3cnqRjqdYxLCS6r28VfLpb9C/kA==",
+ "dev": true,
+ "requires": {
+ "babel-helper-flip-expressions": "0.3.0"
+ }
+ },
+ "babel-plugin-minify-infinity": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.3.0.tgz",
+ "integrity": "sha512-Sj8ia3/w9158DWieUxU6/VvnYVy59geeFEkVgLZYBE8EBP+sN48tHtBM/jSgz0ejEdBlcfqJ6TnvPmVXTzR2BQ==",
+ "dev": true
+ },
+ "babel-plugin-minify-mangle-names": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.3.0.tgz",
+ "integrity": "sha512-PYTonhFWURsfAN8achDwvR5Xgy6EeTClLz+fSgGRqjAIXb0OyFm3/xfccbQviVi1qDXmlSnt6oJhBg8KE4Fn7Q==",
+ "dev": true,
+ "requires": {
+ "babel-helper-mark-eval-scopes": "0.3.0"
+ }
+ },
+ "babel-plugin-minify-numeric-literals": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.3.0.tgz",
+ "integrity": "sha512-TgZj6ay8zDw74AS3yiIfoQ8vRSNJisYO/Du60S8nPV7EW7JM6fDMx5Sar6yVHlVuuwNgvDUBh191K33bVrAhpg==",
+ "dev": true
+ },
+ "babel-plugin-minify-replace": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.3.0.tgz",
+ "integrity": "sha512-VR6tTg2Lt0TicHIOw04fsUtpPw7RaRP8PC8YzSFwEixnzvguZjZJoL7TgG7ZyEWQD1cJ96UezswECmFNa815bg==",
+ "dev": true
+ },
+ "babel-plugin-minify-simplify": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.3.0.tgz",
+ "integrity": "sha512-2M16ytQOCqBi7bYMu4DCWn8e6KyFCA108F6+tVrBJxOmm5u2sOmTFEa8s94tR9RHRRNYmcUf+rgidfnzL3ik9Q==",
+ "dev": true,
+ "requires": {
+ "babel-helper-flip-expressions": "0.3.0",
+ "babel-helper-is-nodes-equiv": "0.0.1",
+ "babel-helper-to-multiple-sequence-expressions": "0.3.0"
+ }
+ },
+ "babel-plugin-minify-type-constructors": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.3.0.tgz",
+ "integrity": "sha512-XRXpvsUCPeVw9YEUw+9vSiugcSZfow81oIJT0yR9s8H4W7yJ6FHbImi5DJHoL8KcDUjYnL9wYASXk/fOkbyR6Q==",
+ "dev": true,
+ "requires": {
+ "babel-helper-is-void-0": "0.3.0"
+ }
+ },
+ "babel-plugin-transform-inline-consecutive-adds": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.3.0.tgz",
+ "integrity": "sha512-iZsYAIjYLLfLK0yN5WVT7Xf7Y3wQ9Z75j9A8q/0IglQSpUt2ppTdHlwl/GeaXnxdaSmsxBu861klbTBbv2n+RA==",
+ "dev": true
+ },
+ "babel-plugin-transform-regexp-constructors": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.3.0.tgz",
+ "integrity": "sha512-h92YHzyl042rb0naKO8frTHntpRFwRgKkfWD8602kFHoQingjJNtbvZzvxqHncJ6XmKVyYvfrBpDOSkCTDIIxw==",
+ "dev": true
+ },
+ "babel-plugin-transform-remove-undefined": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.3.0.tgz",
+ "integrity": "sha512-TYGQucc8iP3LJwN3kDZLEz5aa/2KuFrqpT+s8f8NnHsBU1sAgR3y8Opns0xhC+smyDYWscqFCKM1gbkWQOhhnw==",
+ "dev": true,
+ "requires": {
+ "babel-helper-evaluate-path": "0.3.0"
+ }
+ },
+ "babel-preset-minify": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/babel-preset-minify/-/babel-preset-minify-0.3.0.tgz",
+ "integrity": "sha512-+VV2GWEyak3eDOmzT1DDMuqHrw3VbE9nBNkx2LLVs4pH/Me32ND8DRpVDd8IRvk1xX5p75nygyRPtkMh6GIAbQ==",
+ "dev": true,
+ "requires": {
+ "babel-plugin-minify-builtins": "0.3.0",
+ "babel-plugin-minify-constant-folding": "0.3.0",
+ "babel-plugin-minify-dead-code-elimination": "0.3.0",
+ "babel-plugin-minify-flip-comparisons": "0.3.0",
+ "babel-plugin-minify-guarded-expressions": "0.3.0",
+ "babel-plugin-minify-infinity": "0.3.0",
+ "babel-plugin-minify-mangle-names": "0.3.0",
+ "babel-plugin-minify-numeric-literals": "0.3.0",
+ "babel-plugin-minify-replace": "0.3.0",
+ "babel-plugin-minify-simplify": "0.3.0",
+ "babel-plugin-minify-type-constructors": "0.3.0",
+ "babel-plugin-transform-inline-consecutive-adds": "0.3.0",
+ "babel-plugin-transform-member-expression-literals": "6.9.2",
+ "babel-plugin-transform-merge-sibling-variables": "6.9.1",
+ "babel-plugin-transform-minify-booleans": "6.9.1",
+ "babel-plugin-transform-property-literals": "6.9.1",
+ "babel-plugin-transform-regexp-constructors": "0.3.0",
+ "babel-plugin-transform-remove-console": "6.9.1",
+ "babel-plugin-transform-remove-debugger": "6.9.1",
+ "babel-plugin-transform-remove-undefined": "0.3.0",
+ "babel-plugin-transform-simplify-comparison-operators": "6.9.1",
+ "babel-plugin-transform-undefined-to-void": "6.9.1",
+ "lodash.isplainobject": "4.0.6"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "braces": {
+ "version": "1.8.5",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
+ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
+ "dev": true,
+ "requires": {
+ "expand-range": "1.8.2",
+ "preserve": "0.2.0",
+ "repeat-element": "1.1.2"
+ }
+ },
+ "clone-stats": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
+ "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "dom5": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-2.3.0.tgz",
+ "integrity": "sha1-+CBJdb0NrLvltYqKk//B/tD/zSo=",
+ "dev": true,
+ "requires": {
+ "@types/clone": "0.1.30",
+ "@types/node": "6.0.107",
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.1",
+ "parse5": "2.2.3"
+ }
+ },
+ "duplexer2": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
+ "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.6"
+ }
+ },
+ "expand-brackets": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
+ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
+ "dev": true,
+ "requires": {
+ "is-posix-bracket": "0.1.1"
+ }
+ },
+ "extglob": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
+ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ },
+ "for-own": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
+ "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2"
+ }
+ },
+ "glob": {
+ "version": "5.0.15",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
+ "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
+ "dev": true,
+ "requires": {
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-stream": {
+ "version": "5.3.5",
+ "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz",
+ "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=",
+ "dev": true,
+ "requires": {
+ "extend": "3.0.1",
+ "glob": "5.0.15",
+ "glob-parent": "3.1.0",
+ "micromatch": "2.3.11",
+ "ordered-read-streams": "0.3.0",
+ "through2": "0.6.5",
+ "to-absolute-glob": "0.1.1",
+ "unique-stream": "2.2.1"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "1.0.34",
+ "xtend": "4.0.1"
+ }
+ }
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+ "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ },
+ "micromatch": {
+ "version": "2.3.11",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
+ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
+ "dev": true,
+ "requires": {
+ "arr-diff": "2.0.0",
+ "array-unique": "0.2.1",
+ "braces": "1.8.5",
+ "expand-brackets": "0.1.5",
+ "extglob": "0.3.2",
+ "filename-regex": "2.0.1",
+ "is-extglob": "1.0.0",
+ "is-glob": "2.0.1",
+ "kind-of": "3.2.2",
+ "normalize-path": "2.1.1",
+ "object.omit": "2.0.1",
+ "parse-glob": "3.0.4",
+ "regex-cache": "0.4.4"
+ }
+ },
+ "multipipe": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-1.0.2.tgz",
+ "integrity": "sha1-zBPv2DPJzamfIk+GhGG44aP9k50=",
+ "dev": true,
+ "requires": {
+ "duplexer2": "0.1.4",
+ "object-assign": "4.1.1"
+ }
+ },
+ "nan": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz",
+ "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA=="
+ },
+ "nanomatch": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz",
+ "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==",
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "fragment-cache": "0.2.1",
+ "is-odd": "2.0.0",
+ "is-windows": "1.0.2",
+ "kind-of": "6.0.2",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+ }
+ }
+ },
+ "native-promise-only": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz",
+ "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE="
+ },
+ "natives": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.3.tgz",
+ "integrity": "sha512-BZGSYV4YOLxzoTK73l0/s/0sH9l8SHs2ocReMH1f8JYSh5FUWu4ZrKCpJdRkWXV6HFR/pZDz7bwWOVAY07q77g=="
+ },
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc="
+ },
+ "negotiator": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
+ "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk="
+ },
+ "netrc": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/netrc/-/netrc-0.1.4.tgz",
+ "integrity": "sha1-a+lPysqNd63gqWcNxGCRTJRHJEQ="
+ },
+ "nice-try": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz",
+ "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA=="
+ },
+ "no-case": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
+ "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==",
+ "requires": {
+ "lower-case": "1.1.4"
+ }
+ },
+ "node-status-codes": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz",
+ "integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8="
+ },
+ "nodegit-promise": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/nodegit-promise/-/nodegit-promise-4.0.0.tgz",
+ "integrity": "sha1-VyKxhPLfcycWEGSnkdLoQskWezQ="
+ },
+ "nomnom": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz",
+ "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=",
+ "requires": {
+ "chalk": "0.4.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz",
+ "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg="
+ },
+ "chalk": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz",
+ "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=",
+ "requires": {
+ "ansi-styles": "1.0.0",
+ "strip-ansi": "0.1.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz",
+ "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE="
+ }
+ }
+ },
+ "nopt": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
+ "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
+ "requires": {
+ "abbrev": "1.1.1"
+ }
+ },
+ "normalize-package-data": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
+ "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
+ "requires": {
+ "hosted-git-info": "2.6.0",
+ "is-builtin-module": "1.0.0",
+ "semver": "4.3.6",
+ "validate-npm-package-license": "3.0.3"
+ }
+ },
+ "normalize-path": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+ "dev": true,
+ "requires": {
+ "remove-trailing-separator": "1.1.0"
+ }
+ },
+ "npm-run-path": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+ "requires": {
+ "path-key": "2.0.1"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
+ },
+ "oauth-sign": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
+ "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM="
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+ },
+ "object-component": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz",
+ "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE="
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "requires": {
+ "copy-descriptor": "0.1.1",
+ "define-property": "0.2.5",
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "requires": {
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ }
+ }
+ },
+ "object.defaults": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
+ "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=",
+ "requires": {
+ "array-each": "1.0.1",
+ "array-slice": "1.1.0",
+ "for-own": "1.0.0",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "for-own": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
+ "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
+ "requires": {
+ "for-in": "1.0.2"
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ }
+ }
+ },
+ "object.map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz",
+ "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=",
+ "requires": {
+ "for-own": "1.0.0",
+ "make-iterator": "1.0.1"
+ },
+ "dependencies": {
+ "for-own": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
+ "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
+ "requires": {
+ "for-in": "1.0.2"
+ }
+ }
+ }
+ },
+ "object.omit": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
+ "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
+ "dev": true,
+ "requires": {
+ "for-own": "0.1.5",
+ "is-extendable": "0.1.1"
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "requires": {
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ }
+ }
+ },
+ "obuf": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
+ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg=="
+ },
+ "on-finished": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+ "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc="
+ },
+ "on-headers": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz",
+ "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c="
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "onetime": {
+ "version": "1.1.0",
+ "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
+ "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k="
+ },
+ "opn": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/opn/-/opn-3.0.3.tgz",
+ "integrity": "sha1-ttmec5n3jWXDuq/+8fsojpuFJDo=",
+ "requires": {
+ "object-assign": "4.1.1"
+ }
+ },
+ "optimist": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
+ "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
+ "requires": {
+ "minimist": "0.0.10",
+ "wordwrap": "0.0.3"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
+ "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8="
+ },
+ "wordwrap": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
+ "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc="
+ }
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "orchestrator": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz",
+ "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=",
+ "requires": {
+ "end-of-stream": "0.1.5"
+ },
+ "dependencies": {
+ "end-of-stream": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz",
+ "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=",
+ "requires": {
+ "once": "1.3.3"
+ }
+ },
+ "once": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz",
+ "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=",
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ }
+ }
+ },
+ "ordered-read-streams": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz",
+ "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=",
+ "dev": true,
+ "requires": {
+ "is-stream": "1.1.0",
+ "readable-stream": "2.3.6"
+ }
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
+ },
+ "os-locale": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
+ "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==",
+ "requires": {
+ "execa": "0.7.0",
+ "lcid": "1.0.0"
+ }
+ },
+ "os-shim": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz",
+ "integrity": "sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc="
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
+ },
+ "osenv": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
+ "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
+ "requires": {
+ "os-homedir": "1.0.2",
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "p-finally": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
+ },
+ "p-limit": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz",
+ "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==",
+ "requires": {
+ "p-try": "1.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+ "requires": {
+ "p-limit": "1.2.0"
+ }
+ },
+ "p-map": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz",
+ "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA=="
+ },
+ "p-try": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
+ },
+ "package-json": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/package-json/-/package-json-2.4.0.tgz",
+ "integrity": "sha1-DRW9Z9HLvduyyiIv8u24a8sxqLs=",
+ "requires": {
+ "registry-auth-token": "3.3.2",
+ "registry-url": "3.1.0"
+ }
+ },
+ "pako": {
+ "version": "0.2.9",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
+ "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU="
+ },
+ "param-case": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz",
+ "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=",
+ "requires": {
+ "no-case": "2.3.2"
+ }
+ },
+ "parse-filepath": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz",
+ "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=",
+ "requires": {
+ "is-absolute": "1.0.0",
+ "map-cache": "0.2.2",
+ "path-root": "0.1.1"
+ }
+ },
+ "parse-glob": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
+ "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
+ "dev": true,
+ "requires": {
+ "glob-base": "0.3.0",
+ "is-dotfile": "1.0.3",
+ "is-extglob": "1.0.0",
+ "is-glob": "2.0.1"
+ }
+ },
+ "parse-json": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+ "requires": {
+ "error-ex": "1.3.1"
+ }
+ },
+ "parse-passwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
+ "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY="
+ },
+ "parse5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-2.2.3.tgz",
+ "integrity": "sha1-DE/EHBAAxea5PUiwP4CDg3g06fY=",
+ "dev": true
+ },
+ "parseqs": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz",
+ "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0="
+ },
+ "parseuri": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz",
+ "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo="
+ },
+ "parseurl": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
+ "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M="
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ="
+ },
+ "path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA="
+ },
+ "path-exists": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+ "requires": {
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+ "dev": true
+ },
+ "path-key": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME="
+ },
+ "path-root": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz",
+ "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=",
+ "requires": {
+ "path-root-regex": "0.1.2"
+ }
+ },
+ "path-root-regex": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz",
+ "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0="
+ },
+ "path-to-regexp": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz",
+ "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=",
+ "requires": {
+ "isarray": "0.0.1"
+ }
+ },
+ "path-type": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "pathval": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz",
+ "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA="
+ },
+ "peek-stream": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/peek-stream/-/peek-stream-1.1.3.tgz",
+ "integrity": "sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==",
+ "requires": {
+ "buffer-from": "1.0.0",
+ "duplexify": "3.5.4",
+ "through2": "2.0.3"
+ }
+ },
+ "pem": {
+ "version": "1.12.5",
+ "resolved": "https://registry.npmjs.org/pem/-/pem-1.12.5.tgz",
+ "integrity": "sha512-mm8gLf4ZCaY6Qdm8J4bBdHs6SO4px71FspxgC2jJ0vXf3PYNZnGhU9zITCxpzFHpLPHsHU3xRBbuXNxEWuWziQ==",
+ "requires": {
+ "os-tmpdir": "1.0.2",
+ "safe-buffer": "5.1.2",
+ "which": "1.3.0"
+ }
+ },
+ "pend": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+ "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA="
+ },
+ "performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
+ },
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
+ },
+ "pinkie": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+ "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
+ },
+ "pinkie-promise": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+ "requires": {
+ "pinkie": "2.0.4"
+ }
+ },
+ "plist": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/plist/-/plist-2.1.0.tgz",
+ "integrity": "sha1-V8zbeggh3yGDEhejytVOPhRqECU="
+ },
+ "plugin-error": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz",
+ "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==",
+ "requires": {
+ "ansi-colors": "1.1.0",
+ "arr-diff": "4.0.0",
+ "arr-union": "3.1.0",
+ "extend-shallow": "3.0.2"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
+ }
+ }
+ },
+ "pluralize": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
+ "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow=="
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.9",
+ "winston": "2.4.2"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w=="
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.14.0",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.14.0.tgz",
+ "integrity": "sha512-rHKxCbb0eMrD0U9nn3PiBGXG8PcNUz9+3azl8i0FpY6SAxQdwKff0z2jbaDdpx9kJenYdfhHDGc20mFx4V8/6A==",
+ "requires": {
+ "@types/node": "9.6.12",
+ "browser-capabilities": "1.1.0",
+ "jsonschema": "1.2.4",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "9.6.12",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.12.tgz",
+ "integrity": "sha512-2Z8ziWjJbvV8hHL5YcqCG9ng+/qwUlO1gB4frBD7QI5Wm1Y1iM+AEkGVEv0S5P+aDMwTtAhPJFR4rp1uqagSig=="
+ }
+ }
+ },
+ "polyserve": {
+ "version": "0.27.10",
+ "resolved": "https://registry.npmjs.org/polyserve/-/polyserve-0.27.10.tgz",
+ "integrity": "sha512-T4oguVGyz4p21UTWQ88VUB3zgyIUrPMycTpMcZwboYEvosdZqLnbULswKh/qJCaKbDReIVj6nBdt0fX6Seqjpw==",
+ "requires": {
+ "@types/mz": "0.0.29",
+ "@types/node": "9.6.11",
+ "@types/parse5": "2.2.34",
+ "@types/resolve": "0.0.6",
+ "browser-capabilities": "1.1.0",
+ "mz": "2.7.0",
+ "opn": "3.0.3",
+ "pem": "1.12.5",
+ "polymer-project-config": "3.14.0",
+ "resolve": "1.7.1"
+ },
+ "dependencies": {
+ "@types/mz": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/mz/-/mz-0.0.29.tgz",
+ "integrity": "sha1-vCRyjGSZc/HHhR6QM/nOUlZowns=",
+ "requires": {
+ "@types/node": "9.6.11"
+ }
+ },
+ "@types/node": {
+ "version": "9.6.11",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.11.tgz",
+ "integrity": "sha512-Zm2W8b3ouIP/rB4ZgIDBMsdi1a/5NuKG3IguCM6aUwXtT+h6g1/Lh59Td7S1QtHMRXU7AbrGRDJ7lbxW4MEDmg=="
+ },
+ "@types/resolve": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.6.tgz",
+ "integrity": "sha512-g+Rg8uMWY76oYTyaL+m7ZcblqF/oj7pE6uEUyACluJx4zcop1Lk14qQiocdEkEVMDFm6DmKpxJhsER+ZuTwG3g==",
+ "requires": {
+ "@types/node": "9.6.11"
+ }
+ }
+ }
+ },
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs="
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
+ },
+ "preserve": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
+ "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
+ "dev": true
+ },
+ "pretty-bytes": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz",
+ "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk="
+ },
+ "pretty-hrtime": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
+ "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE="
+ },
+ "private": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
+ "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg=="
+ },
+ "process-nextick-args": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
+ "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
+ },
+ "promisify-node": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/promisify-node/-/promisify-node-0.4.0.tgz",
+ "integrity": "sha1-MoA4dOxBF4TkeGwzmQKoeheaRpw=",
+ "requires": {
+ "nodegit-promise": "4.0.0",
+ "object-assign": "4.1.1"
+ }
+ },
+ "proxy-addr": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz",
+ "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ=="
+ },
+ "pseudomap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
+ },
+ "pump": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
+ "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
+ "requires": {
+ "end-of-stream": "1.4.1",
+ "once": "1.4.0"
+ }
+ },
+ "pumpify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.4.0.tgz",
+ "integrity": "sha512-2kmNR9ry+Pf45opRVirpNuIFotsxUGLaYqxIwuR77AYrYRMuFCz9eryHBS52L360O+NcR383CL4QYlMKPq4zYA==",
+ "requires": {
+ "duplexify": "3.5.4",
+ "inherits": "2.0.3",
+ "pump": "2.0.1"
+ }
+ },
+ "punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
+ },
+ "q": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
+ "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc="
+ },
+ "qs": {
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
+ "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A=="
+ },
+ "randomatic": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz",
+ "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==",
+ "requires": {
+ "is-number": "3.0.0",
+ "kind-of": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "range-parser": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
+ "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4="
+ },
+ "raw-body": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz",
+ "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k="
+ },
+ "rc": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.7.tgz",
+ "integrity": "sha512-LdLD8xD4zzLsAT5xyushXDNscEjB7+2ulnl8+r1pnESlYtlJtVSoCMBGr30eDRJ3+2Gq89jK9P9e4tCEH1+ywA==",
+ "requires": {
+ "deep-extend": "0.5.1",
+ "ini": "1.3.5",
+ "minimist": "1.2.0",
+ "strip-json-comments": "2.0.1"
+ },
+ "dependencies": {
+ "deep-extend": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz",
+ "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w=="
+ }
+ }
+ },
+ "read-all-stream": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz",
+ "integrity": "sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po=",
+ "requires": {
+ "pinkie-promise": "2.0.1",
+ "readable-stream": "2.3.6"
+ }
+ },
+ "read-chunk": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-2.1.0.tgz",
+ "integrity": "sha1-agTAkoAF7Z1C4aasVgDhnLx/9lU=",
+ "requires": {
+ "pify": "3.0.0",
+ "safe-buffer": "5.1.2"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
+ }
+ }
+ },
+ "read-pkg": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+ "requires": {
+ "load-json-file": "1.1.0",
+ "normalize-package-data": "2.4.0",
+ "path-type": "1.1.0"
+ }
+ },
+ "replace-ext": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
+ "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
+ "dev": true
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ },
+ "strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "dev": true,
+ "requires": {
+ "is-utf8": "0.2.1"
+ }
+ },
+ "unique-stream": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz",
+ "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=",
+ "dev": true,
+ "requires": {
+ "json-stable-stringify": "1.0.1",
+ "through2-filter": "2.0.0"
+ }
+ },
+ "vinyl": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz",
+ "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=",
+ "dev": true,
+ "requires": {
+ "clone": "1.0.4",
+ "clone-stats": "0.0.1",
+ "replace-ext": "0.0.1"
+ },
+ "dependencies": {
+ "clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
+ "dev": true
+ }
+ }
+ },
+ "vinyl-fs": {
+ "version": "2.4.4",
+ "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz",
+ "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=",
+ "dev": true,
+ "requires": {
+ "duplexify": "3.5.4",
+ "glob-stream": "5.3.5",
+ "graceful-fs": "4.1.11",
+ "gulp-sourcemaps": "1.6.0",
+ "is-valid-glob": "0.3.0",
+ "lazystream": "1.0.0",
+ "lodash.isequal": "4.5.0",
+ "merge-stream": "1.0.1",
+ "mkdirp": "0.5.1",
+ "object-assign": "4.1.1",
+ "readable-stream": "2.3.6",
+ "strip-bom": "2.0.0",
+ "strip-bom-stream": "1.0.0",
+ "through2": "2.0.3",
+ "through2-filter": "2.0.0",
+ "vali-date": "1.0.0",
+ "vinyl": "1.2.0"
+ }
+ }
+ }
+ },
+ "polymer-bundler": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/polymer-bundler/-/polymer-bundler-3.1.1.tgz",
+ "integrity": "sha512-a/MItYr/rTRZ8Ymj5npmoAAm89RC5hRh4yz8bs22GyMn+NlE7HqJ4EzLrPkyRWlOyBhbhYFPx2Zot8PlaWXvmQ==",
+ "dev": true,
+ "requires": {
+ "clone": "2.1.1",
+ "command-line-args": "3.0.5",
+ "command-line-usage": "3.0.8",
+ "dom5": "2.3.0",
+ "espree": "3.5.4",
+ "mkdirp": "0.5.1",
+ "parse5": "2.2.3",
+ "polymer-analyzer": "2.7.0",
+ "source-map": "0.5.7"
+ },
+ "dependencies": {
+ "array-back": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
+ "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-args": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-3.0.5.tgz",
+ "integrity": "sha1-W9StReeYPlwTRJGOQCgO4mk8WsA=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "feature-detect-es6": "1.4.0",
+ "find-replace": "1.0.3",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-usage": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-3.0.8.tgz",
+ "integrity": "sha1-tqIJeMGzg0d/XBGlKUKLiAv+D00=",
+ "dev": true,
+ "requires": {
+ "ansi-escape-sequences": "3.0.0",
+ "array-back": "1.0.4",
+ "feature-detect-es6": "1.4.0",
+ "table-layout": "0.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "deep-extend": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz",
+ "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=",
+ "dev": true
+ },
+ "dom5": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-2.3.0.tgz",
+ "integrity": "sha1-+CBJdb0NrLvltYqKk//B/tD/zSo=",
+ "dev": true,
+ "requires": {
+ "@types/clone": "0.1.30",
+ "@types/node": "6.0.107",
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.1",
+ "parse5": "2.2.3"
+ }
+ },
+ "find-replace": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz",
+ "integrity": "sha1-uI5zZNLZyVlVnziMZmcNYTBEH6A=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "test-value": "2.1.0"
+ }
+ },
+ "parse5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-2.2.3.tgz",
+ "integrity": "sha1-DE/EHBAAxea5PUiwP4CDg3g06fY=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.0",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "readdirp": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz",
+ "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "minimatch": "3.0.4",
+ "readable-stream": "2.3.6",
+ "set-immediate-shim": "1.0.1"
+ }
+ },
+ "rechoir": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
+ "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
+ "requires": {
+ "resolve": "1.7.1"
+ }
+ },
+ "redent": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
+ "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+ "requires": {
+ "indent-string": "2.1.0"
+ }
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerate": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz",
+ "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg=="
+ },
+ "regenerate-unicode-properties": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-5.1.3.tgz",
+ "integrity": "sha512-Yjy6t7jFQczDhYE+WVm7pg6gWYE258q4sUkk9qDErwXJIqx7jU9jGrMFHutJK/SRfcg7MEkXjGaYiVlOZyev/A==",
+ "requires": {
+ "regenerate": "1.3.3"
+ }
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
+ },
+ "regenerator-transform": {
+ "version": "0.12.3",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.12.3.tgz",
+ "integrity": "sha512-y2uxO/6u+tVmtEDIKo+tLCtI0GcbQr0OreosKgCd7HP4VypGjtTrw79DezuwT+W5QX0YWuvpeBOgumrepwM1kA==",
+ "requires": {
+ "private": "0.1.8"
+ }
+ },
+ "regex-cache": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
+ "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
+ "requires": {
+ "is-equal-shallow": "0.1.3"
+ }
+ },
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "requires": {
+ "extend-shallow": "3.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "regexpp": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz",
+ "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw=="
+ },
+ "regexpu-core": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.1.3.tgz",
+ "integrity": "sha512-mB+njEzO7oezA57IbQxxd6fVPOeWKDmnGvJ485CwmfNchjHe5jWwqKepapmzUEj41yxIAqOg+C4LbXuJlkiO8A==",
+ "requires": {
+ "regenerate": "1.3.3",
+ "regenerate-unicode-properties": "5.1.3"
+ }
+ },
+ "registry-auth-token": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz",
+ "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==",
+ "requires": {
+ "rc": "1.2.7",
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "registry-url": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz",
+ "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=",
+ "requires": {
+ "rc": "1.2.7"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "table-layout": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.3.0.tgz",
+ "integrity": "sha1-buINxIPbNxs+XIf3BO0vfHmdLJo=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "core-js": "2.5.5",
+ "deep-extend": "0.4.2",
+ "feature-detect-es6": "1.4.0",
+ "typical": "2.6.1",
+ "wordwrapjs": "2.0.0"
+ }
+ },
+ "test-value": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz",
+ "integrity": "sha1-Edpv9nDzRxpztiXKTz/c97t0gpE=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "typical": "2.6.1"
+ }
+ },
+ "wordwrapjs": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-2.0.0.tgz",
+ "integrity": "sha1-q1X2leYRjak4WP3XDAU9HF4BrCA=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "feature-detect-es6": "1.4.0",
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ }
+ }
+ },
+ "polymer-cli": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/polymer-cli/-/polymer-cli-1.7.0.tgz",
+ "integrity": "sha512-/Lm3D+h3BK9cHrBe3+k+37Rf3WvEHG3mo59mKcb8Gc4JunYSUkYEBy2YsX0nP/Zfj2Bw/NY0jdPV4omIWZGRMQ==",
+ "dev": true,
+ "requires": {
+ "@types/chalk": "0.4.31",
+ "@types/del": "3.0.1",
+ "@types/findup-sync": "0.3.29",
+ "@types/globby": "6.1.0",
+ "@types/inquirer": "0.0.32",
+ "@types/merge-stream": "1.1.0",
+ "@types/mz": "0.0.31",
+ "@types/request": "2.0.3",
+ "@types/resolve": "0.0.4",
+ "@types/rimraf": "0.0.28",
+ "@types/semver": "5.5.0",
+ "@types/temp": "0.8.32",
+ "@types/update-notifier": "1.0.3",
+ "@types/vinyl": "2.0.2",
+ "@types/vinyl-fs": "0.0.28",
+ "@types/yeoman-generator": "1.0.4",
+ "bower": "1.8.2",
+ "bower-json": "0.8.1",
+ "bower-logger": "0.2.2",
+ "chalk": "1.1.3",
+ "chokidar": "1.7.0",
+ "command-line-args": "3.0.5",
+ "command-line-commands": "1.0.4",
+ "command-line-usage": "3.0.8",
+ "del": "3.0.0",
+ "findup-sync": "0.4.3",
+ "github": "7.3.2",
+ "globby": "8.0.1",
+ "gunzip-maybe": "1.4.1",
+ "inquirer": "1.2.3",
+ "merge-stream": "1.0.1",
+ "mz": "2.7.0",
+ "plylog": "0.5.0",
+ "polymer-analyzer": "3.0.0",
+ "polymer-build": "3.0.0",
+ "polymer-bundler": "4.0.0",
+ "polymer-linter": "3.0.0",
+ "polymer-project-config": "4.0.0",
+ "polyserve": "0.27.11",
+ "request": "2.85.0",
+ "rimraf": "2.6.2",
+ "semver": "5.5.0",
+ "tar-fs": "1.16.2",
+ "temp": "0.8.3",
+ "update-notifier": "1.0.3",
+ "validate-element-name": "2.1.1",
+ "vinyl": "1.2.0",
+ "vinyl-fs": "2.4.4",
+ "web-component-tester": "6.6.0",
+ "yeoman-environment": "1.6.6",
+ "yeoman-generator": "1.1.1"
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.46.tgz",
+ "integrity": "sha512-7BKRkmYaPZm3Yff5HGZJKCz7RqZ5jUjknsXT6Gz5YKG23J3uq9hAj0epncCB0rlqmnZ8Q+UUpQB2tCR5mT37vw==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "7.0.0-beta.46"
+ }
+ },
+ "@babel/core": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.0.0-beta.46.tgz",
+ "integrity": "sha512-lCDbBSAhNAt+nL98xbgWmuhgrIxKvbvFHf73zlNCuXCHJkdlo7qzTofYK0ZWb+OVce8fQ17fC7DwTIhAwowzMw==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "7.0.0-beta.46",
+ "@babel/generator": "7.0.0-beta.46",
+ "@babel/helpers": "7.0.0-beta.46",
+ "@babel/template": "7.0.0-beta.46",
+ "@babel/traverse": "7.0.0-beta.46",
+ "@babel/types": "7.0.0-beta.46",
+ "babylon": "7.0.0-beta.46",
+ "convert-source-map": "1.5.1",
+ "debug": "3.1.0",
+ "json5": "0.5.1",
+ "lodash": "4.17.10",
+ "micromatch": "2.3.11",
+ "resolve": "1.7.1",
+ "semver": "5.5.0",
+ "source-map": "0.5.7"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.46.tgz",
+ "integrity": "sha512-WFJlg2WatdkXRFMpk7BN/Uzzkjkcjk+WaqnrSCpay+RYl4ypW9ZetZyT9kNt22IH/BQNst3M6PaaBn9IXsUNrg==",
+ "dev": true
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "@babel/generator": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.46.tgz",
+ "integrity": "sha512-5VfaEVkPG0gpNSTcf70jvV+MjbMoNn4g2iluwM7MhciedkolEtmG7PcdoUj5W1EmMfngz5cF65V7UMZXJO6y8Q==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "7.0.0-beta.46",
+ "jsesc": "2.5.1",
+ "lodash": "4.17.10",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ }
+ },
+ "@babel/helper-annotate-as-pure": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0-beta.46.tgz",
+ "integrity": "sha512-ej5W347ghJF1p2TM3VcEyds1+o1uy1apaQcHrYFJPus2xCgn5KkHPkBGf+6euLfFaQDtB+eWPVKjiZx/hpYXvA==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "7.0.0-beta.46"
+ }
+ },
+ "@babel/helper-builder-binary-assignment-operator-visitor": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.0.0-beta.46.tgz",
+ "integrity": "sha512-ZCQ62KqFC5R3NPe5ug9pVqIHYJNup8UdEbE4IXw+s7zr4D/7AsKSt3pXA+FbML5AnQXeCSOuUWioggGmKuDV5g==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-explode-assignable-expression": "7.0.0-beta.46",
+ "@babel/types": "7.0.0-beta.46"
+ }
+ },
+ "@babel/helper-call-delegate": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.0.0-beta.46.tgz",
+ "integrity": "sha512-7nhBu/MBlpvZLQsmw/C7VxN14wph+yp+1yxzPEd2oTsHg3oA73tHyguQ6wbtkw+9f1AZtP7ZJCLQ+nGLprF4Fw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-hoist-variables": "7.0.0-beta.46",
+ "@babel/traverse": "7.0.0-beta.46",
+ "@babel/types": "7.0.0-beta.46"
+ }
+ },
+ "@babel/helper-define-map": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.0.0-beta.35.tgz",
+ "integrity": "sha512-bS+6/gvj/iq4TtGZuL2//X7RunihWjS+Hp2o/3cPopvU3CK9IPFPpPZc7NiqjPcvlUc47lzHRO+uk77GBONojQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-function-name": "7.0.0-beta.35",
+ "@babel/types": "7.0.0-beta.35",
+ "lodash": "4.17.10"
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.35.tgz",
+ "integrity": "sha512-l0SE8cl9DUIY4hYAFAKTLX3F2Yr14Qri7uTsuI7iegB5E4KyQy4XY72L3VOxmj6kwR/RDQURoKYr2NzyETGo7A==",
+ "dev": true,
+ "requires": {
+ "chalk": "2.4.1",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "@babel/helper-function-name": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.35.tgz",
+ "integrity": "sha512-+216NxQ7/Lvj+iehFBKEhYU/BQ1aqHTWz1bxCDiQWms0qi23iqHA4r+WdRKW/o5dAV5mlTUL4nCBFaNx8LNnRQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-get-function-arity": "7.0.0-beta.35",
+ "@babel/template": "7.0.0-beta.35",
+ "@babel/types": "7.0.0-beta.35"
+ }
+ },
+ "@babel/helper-get-function-arity": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.35.tgz",
+ "integrity": "sha512-8co9nT1MgbNoGl6too2/jwldu5F7O1rMi+/QsM9bmFuCu76rU5okFWi4cb4Uv0WXZ4BWk6x+Lpdzzu7EgvkAwA==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "7.0.0-beta.35"
+ }
+ },
+ "@babel/template": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.35.tgz",
+ "integrity": "sha512-NLd3Dfs8hmkxPvaD8ohNtEp9WXp48lxpW//6fXcT9bJWIO3isrH3OTYL9kjX7xFPPasJ1E9bUNSaPFUUgvPZSQ==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "7.0.0-beta.35",
+ "@babel/types": "7.0.0-beta.35",
+ "babylon": "7.0.0-beta.35",
+ "lodash": "4.17.10"
+ }
+ },
+ "@babel/types": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.35.tgz",
+ "integrity": "sha512-y9XT11CozHDgjWcTdxmhSj13rJVXpa5ZXwjjOiTedjaM0ba5ItqdS02t31EhPl7HtOWxsZkYCCUNrSfrOisA6w==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "2.0.0"
+ }
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "babylon": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.35.tgz",
+ "integrity": "sha512-Y2o5scalPPlI6eOYMat6iqoM8akjqkAv9cXUN/7YNe3FANAsAGcF5L2u6XiUtBECvhyf7LeZYyzNYnjk43Vffg==",
+ "dev": true
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ },
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ }
+ }
+ },
+ "@babel/helper-explode-assignable-expression": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.0.0-beta.46.tgz",
+ "integrity": "sha512-SW1OUmx2fC2SqL7+vF1N72FITbPuEWGdr/Gm7I3Vqs8p8T1dfGwB9YFsD+tTpfagKXVMiCCuQ06+G0FB8uxg6Q==",
+ "dev": true,
+ "requires": {
+ "@babel/traverse": "7.0.0-beta.46",
+ "@babel/types": "7.0.0-beta.46"
+ }
+ },
+ "@babel/helper-function-name": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.46.tgz",
+ "integrity": "sha512-zm4Kc5XB2njGs8PkmjV1zE/g1hBuphbh+VcDyFLaQsxkxSFSUtCbKwFL8AQpL/qPIcGbvX1MBt50a/3ZZH2CQA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-get-function-arity": "7.0.0-beta.46",
+ "@babel/template": "7.0.0-beta.46",
+ "@babel/types": "7.0.0-beta.46"
+ }
+ },
+ "@babel/helper-get-function-arity": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.46.tgz",
+ "integrity": "sha512-dPrTb7QHVx44xJLjUl3LGAc13iS7hdXdO0fiOxdRN1suIS91yGGgeuwiQBlrw5SxbFchYtwenhlKbqHdVfGyVA==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "7.0.0-beta.46"
+ }
+ },
+ "@babel/helper-hoist-variables": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0-beta.46.tgz",
+ "integrity": "sha512-9xDHLfaVA445mcHU2OEPwEddiyS0Zxao2WObFR2L/SK5MNOPj2VqVCvivYrO2OpzhnLLCTbOfXRmrwrc9WYN6Q==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "7.0.0-beta.46"
+ }
+ },
+ "@babel/helper-member-expression-to-functions": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0-beta.46.tgz",
+ "integrity": "sha512-Xb5iVUHXY8yz4pgGBvtuS1kxZH1oUYcxTcbIW8NFRvgpeH3Zcv4me02bbixsk7nhn8ttE79Lr1g4vrem4k5Z3Q==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "7.0.0-beta.46"
+ }
+ },
+ "@babel/helper-module-imports": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0-beta.46.tgz",
+ "integrity": "sha512-xjgpwrqHiKCZgAcqsNIpZ9kOCC5Ty/VYN1H07v21HbAf/dl0/HeUA0taz3EFv6/7lRgS3qThawTSG0POJQX9vQ==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "7.0.0-beta.46",
+ "lodash": "4.17.10"
+ }
+ },
+ "@babel/helper-module-transforms": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.0.0-beta.46.tgz",
+ "integrity": "sha512-IckoWSub3PHNvkWcUEWfKBe8pFUdMhsZMFDcaovcLb+gfxL/zZhQYwedKKKwbzVGIk9k44yjeMQ/OJd4yt4FGQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-module-imports": "7.0.0-beta.46",
+ "@babel/helper-simple-access": "7.0.0-beta.46",
+ "@babel/helper-split-export-declaration": "7.0.0-beta.46",
+ "@babel/template": "7.0.0-beta.46",
+ "@babel/types": "7.0.0-beta.46",
+ "lodash": "4.17.10"
+ }
+ },
+ "@babel/helper-optimise-call-expression": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0-beta.35.tgz",
+ "integrity": "sha512-hr/P3XTAtN5wppGLP4yrOUbvIyOQPmEG6EVsCSE5z0yUueNQzuCxXp0v7sx7/V+c0eP3XLy/lVsuM96cS3VUKQ==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "7.0.0-beta.35"
+ },
+ "dependencies": {
+ "@babel/types": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.35.tgz",
+ "integrity": "sha512-y9XT11CozHDgjWcTdxmhSj13rJVXpa5ZXwjjOiTedjaM0ba5ItqdS02t31EhPl7HtOWxsZkYCCUNrSfrOisA6w==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "2.0.0"
+ }
+ },
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ }
+ }
+ },
+ "@babel/helper-plugin-utils": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0-beta.46.tgz",
+ "integrity": "sha512-eRTFH+/1rqDfzx+Z//CYk4TNwhfPQpM/TCs4CmHu2DwCPrqFnKUZLI1KgStfLf//c8FdOqx/U9EPec7s8CbUIA==",
+ "dev": true
+ },
+ "@babel/helper-regex": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.0.0-beta.46.tgz",
+ "integrity": "sha512-sPDHBt8Y4i6y9rwtxWMvcprlVHAZOOQK5xpS2Nw2q9QEDHRHwVbEpE6EejoUStSclnfJpPK/7ijFgypwc6rXlA==",
+ "dev": true,
+ "requires": {
+ "lodash": "4.17.10"
+ }
+ },
+ "@babel/helper-remap-async-to-generator": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.0.0-beta.46.tgz",
+ "integrity": "sha512-YrqQ98z8AMZx8f2PGJ4YV1MkXtj+qbwbFV7MOLTiavGSFY7UrN4uQfhKEJ/4GUf4QZdTr5NEmRt0AJrWno8y8w==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-annotate-as-pure": "7.0.0-beta.46",
+ "@babel/helper-wrap-function": "7.0.0-beta.46",
+ "@babel/template": "7.0.0-beta.46",
+ "@babel/traverse": "7.0.0-beta.46",
+ "@babel/types": "7.0.0-beta.46"
+ }
+ },
+ "@babel/helper-replace-supers": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.0.0-beta.35.tgz",
+ "integrity": "sha512-ez6sOMdXeFzGlg2Qbyi//2nbBrftC7RzMpN671Hd87ITP2af3feEWYEKC5O0EXLCcgaNBzNntkScRGV9ez03wg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-optimise-call-expression": "7.0.0-beta.35",
+ "@babel/template": "7.0.0-beta.35",
+ "@babel/traverse": "7.0.0-beta.35",
+ "@babel/types": "7.0.0-beta.35"
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.35.tgz",
+ "integrity": "sha512-l0SE8cl9DUIY4hYAFAKTLX3F2Yr14Qri7uTsuI7iegB5E4KyQy4XY72L3VOxmj6kwR/RDQURoKYr2NzyETGo7A==",
+ "dev": true,
+ "requires": {
+ "chalk": "2.4.1",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "@babel/helper-function-name": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.35.tgz",
+ "integrity": "sha512-+216NxQ7/Lvj+iehFBKEhYU/BQ1aqHTWz1bxCDiQWms0qi23iqHA4r+WdRKW/o5dAV5mlTUL4nCBFaNx8LNnRQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-get-function-arity": "7.0.0-beta.35",
+ "@babel/template": "7.0.0-beta.35",
+ "@babel/types": "7.0.0-beta.35"
+ }
+ },
+ "@babel/helper-get-function-arity": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.35.tgz",
+ "integrity": "sha512-8co9nT1MgbNoGl6too2/jwldu5F7O1rMi+/QsM9bmFuCu76rU5okFWi4cb4Uv0WXZ4BWk6x+Lpdzzu7EgvkAwA==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "7.0.0-beta.35"
+ }
+ },
+ "@babel/template": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.35.tgz",
+ "integrity": "sha512-NLd3Dfs8hmkxPvaD8ohNtEp9WXp48lxpW//6fXcT9bJWIO3isrH3OTYL9kjX7xFPPasJ1E9bUNSaPFUUgvPZSQ==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "7.0.0-beta.35",
+ "@babel/types": "7.0.0-beta.35",
+ "babylon": "7.0.0-beta.35",
+ "lodash": "4.17.10"
+ }
+ },
+ "@babel/traverse": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.35.tgz",
+ "integrity": "sha512-oj2mjz/20iiDt+X0mlzE2IEkzLyM0nmT1zSUy/6i6vyzitVeoyRaHoM7O81gmAHSfBSqyjWRU0OuD9VIUgj8Vg==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "7.0.0-beta.35",
+ "@babel/helper-function-name": "7.0.0-beta.35",
+ "@babel/types": "7.0.0-beta.35",
+ "babylon": "7.0.0-beta.35",
+ "debug": "3.1.0",
+ "globals": "10.4.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "@babel/types": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.35.tgz",
+ "integrity": "sha512-y9XT11CozHDgjWcTdxmhSj13rJVXpa5ZXwjjOiTedjaM0ba5ItqdS02t31EhPl7HtOWxsZkYCCUNrSfrOisA6w==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "2.0.0"
+ }
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "babylon": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.35.tgz",
+ "integrity": "sha512-Y2o5scalPPlI6eOYMat6iqoM8akjqkAv9cXUN/7YNe3FANAsAGcF5L2u6XiUtBECvhyf7LeZYyzNYnjk43Vffg==",
+ "dev": true
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-10.4.0.tgz",
+ "integrity": "sha512-uNUtxIZpGyuaq+5BqGGQHsL4wUlJAXRqOm6g3Y48/CWNGTLONgBibI0lh6lGxjR2HljFYUfszb+mk4WkgMntsA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ },
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ }
+ }
+ },
+ "@babel/helper-simple-access": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.0.0-beta.46.tgz",
+ "integrity": "sha512-1OEjV/Qnl4u8Dg+jQIYf1TgnfdrYIrdrF7yZwp9mSgsVX2PCyLe7JNTqZ/5v/5RzlF6S+GTe9agkj+EFFTcZUw==",
+ "dev": true,
+ "requires": {
+ "@babel/template": "7.0.0-beta.46",
+ "@babel/types": "7.0.0-beta.46",
+ "lodash": "4.17.10"
+ }
+ },
+ "@babel/helper-split-export-declaration": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.46.tgz",
+ "integrity": "sha512-UT7acgV7wsnBPwnqslqcnUFvsPBP4TtVaYM82xPGA7+evAa8q8HXOmFk08qsMK/pX/yy4+51gJJwyw2zofnacA==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "7.0.0-beta.46"
+ }
+ },
+ "@babel/helper-wrap-function": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.0.0-beta.46.tgz",
+ "integrity": "sha512-W87M4bP6veTKK66OjzV/rU47tjsWmKj9J0J5BDmxq5BIJB1M13ouQ2FAURa4jGHwjPFWN3D5njBrsrifSOHzbQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-function-name": "7.0.0-beta.46",
+ "@babel/template": "7.0.0-beta.46",
+ "@babel/traverse": "7.0.0-beta.46",
+ "@babel/types": "7.0.0-beta.46"
+ }
+ },
+ "@babel/helpers": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.0.0-beta.46.tgz",
+ "integrity": "sha512-mbpH9pM3pJzo/tBr75U+zva3pqpyivogt1aofgEoD7bWFAYSuqOudRuz+m4XP6VPxxLoxcA4SFPGkuLRt9+7nQ==",
+ "dev": true,
+ "requires": {
+ "@babel/template": "7.0.0-beta.46",
+ "@babel/traverse": "7.0.0-beta.46",
+ "@babel/types": "7.0.0-beta.46"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.46.tgz",
+ "integrity": "sha512-r4snW6Q8ICL3Y8hGzYJRvyG/+sc+kvkewXNedG9tQjoHmUFMwMSv/o45GWQUQswevGnWghiGkpRPivFfOuMsOA==",
+ "dev": true,
+ "requires": {
+ "chalk": "2.4.1",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ }
+ }
+ },
+ "@babel/plugin-external-helpers": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-external-helpers/-/plugin-external-helpers-7.0.0-beta.46.tgz",
+ "integrity": "sha512-ajlMWy4VZ/aOUl7Z5UPy8AKtm1AHu6oEw6WiZCspjSYU6PlwiwuU3ofqcPXOaSjK+3SBFT6zViq1iF8ZxzYYxg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-proposal-async-generator-functions": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.0.0-beta.46.tgz",
+ "integrity": "sha512-htHMsLBYkM89CplqHTbbemVvzTXXyXkpihetJZUTPpSayfxEd6oIH5uSM91efcf5Rog+1SC0Oq32q9yF/4W3ig==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46",
+ "@babel/helper-remap-async-to-generator": "7.0.0-beta.46",
+ "@babel/plugin-syntax-async-generators": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-proposal-object-rest-spread": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.0.0-beta.46.tgz",
+ "integrity": "sha512-viGuWOgFT/Tbnn3sYi3g9iJcC3ql7bSjxDs+d+GFgyf3eV2qNIKO/6I+PJAD35fGqDGGBrQhlA6HvW0FzQVtoA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46",
+ "@babel/plugin-syntax-object-rest-spread": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-syntax-async-generators": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.0.0-beta.46.tgz",
+ "integrity": "sha512-igLQzZYcSrY/W3eACq6Nrf9u9mfw7m5G6+JeTZlyI7w0z+upGvWvrpTaAP1Gni6MckQkx5q+pspgpV+/5ioPXg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-syntax-dynamic-import": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.0.0-beta.46.tgz",
+ "integrity": "sha512-D4ek6tZa80NgaTSprPOVxj8vxjChh6UCWgCT/ZvCwAa6CBe3iqUCuOwZQLjU41aDdeuR7C02wxl3rcb25wCRLA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-syntax-import-meta": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.0.0-beta.46.tgz",
+ "integrity": "sha512-/vOa4lDBN8CpJr9MwdavcZKwqX7ueul5KwSWrxhY6rwkpq0z50vlNoWWShzDMOmQ0VWV8B6T/mV3GEOofUzh/g==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-syntax-object-rest-spread": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.0.0-beta.46.tgz",
+ "integrity": "sha512-MMv6WG69jmcSLXdUeHvoev5RkuP/QuJZwCB4jXp2gtss//avs4Sns+t0VpGKTf9umhvRq44HFO6PVjVG85F+/Q==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-transform-arrow-functions": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.0.0-beta.46.tgz",
+ "integrity": "sha512-GgeFCCMHXWRkPDXWKin76qiZh+DAYdQShmk8SmzDj6IAgPHyNqkxHN/8gsmNe5/7IWFFOKUuM9TNU7fgY7z7Gg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-transform-async-to-generator": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.0.0-beta.46.tgz",
+ "integrity": "sha512-obykYLqAd3tujTjHYE+dln5+nDhm+R5FmUcxXFr/Mx6LK1NgrTQ9TdPPOcMCD08r8SDljFpMopuz9upN/xJlbw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-module-imports": "7.0.0-beta.46",
+ "@babel/helper-plugin-utils": "7.0.0-beta.46",
+ "@babel/helper-remap-async-to-generator": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-transform-block-scoped-functions": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.0.0-beta.46.tgz",
+ "integrity": "sha512-0paq0AtTp3TXbXdzWwsL8ddacmo/g/14IgIZgs5BzUTrfROKQThYVccEBPqRnprTgvM0JXyDVfNSgLB4akCTjg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-transform-block-scoping": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.0.0-beta.46.tgz",
+ "integrity": "sha512-7OwS0ObI6nLacEKP1HCdnoIQnHBqOV6IgtKGiPO+Nj03OnZ1Yo2aeK9sfOtwL43aNztnKqFVt2L5PfZg4VGidA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46",
+ "lodash": "4.17.10"
+ }
+ },
+ "@babel/plugin-transform-classes": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.0.0-beta.35.tgz",
+ "integrity": "sha512-D71nw+Brh7IWSHiW4/JDux5EhT4gyMYG1WJVjaXl6D6DQhOFlZf5otUVrVX6IxEQaco3B2dlEBDEt/UXvf9E2Q==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-annotate-as-pure": "7.0.0-beta.35",
+ "@babel/helper-define-map": "7.0.0-beta.35",
+ "@babel/helper-function-name": "7.0.0-beta.35",
+ "@babel/helper-optimise-call-expression": "7.0.0-beta.35",
+ "@babel/helper-replace-supers": "7.0.0-beta.35"
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.35.tgz",
+ "integrity": "sha512-l0SE8cl9DUIY4hYAFAKTLX3F2Yr14Qri7uTsuI7iegB5E4KyQy4XY72L3VOxmj6kwR/RDQURoKYr2NzyETGo7A==",
+ "dev": true,
+ "requires": {
+ "chalk": "2.4.1",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "@babel/helper-annotate-as-pure": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0-beta.35.tgz",
+ "integrity": "sha512-bc2idaE5XgHlyZX7TT+9ij2hhUFa21KVffQY6FTwDRT8BgqgFhIzLMFLRfk7Bd9jj+YwuydHCbdp5jXbeGFfRg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "7.0.0-beta.35"
+ }
+ },
+ "@babel/helper-function-name": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.35.tgz",
+ "integrity": "sha512-+216NxQ7/Lvj+iehFBKEhYU/BQ1aqHTWz1bxCDiQWms0qi23iqHA4r+WdRKW/o5dAV5mlTUL4nCBFaNx8LNnRQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-get-function-arity": "7.0.0-beta.35",
+ "@babel/template": "7.0.0-beta.35",
+ "@babel/types": "7.0.0-beta.35"
+ }
+ },
+ "@babel/helper-get-function-arity": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.35.tgz",
+ "integrity": "sha512-8co9nT1MgbNoGl6too2/jwldu5F7O1rMi+/QsM9bmFuCu76rU5okFWi4cb4Uv0WXZ4BWk6x+Lpdzzu7EgvkAwA==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "7.0.0-beta.35"
+ }
+ },
+ "@babel/template": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.35.tgz",
+ "integrity": "sha512-NLd3Dfs8hmkxPvaD8ohNtEp9WXp48lxpW//6fXcT9bJWIO3isrH3OTYL9kjX7xFPPasJ1E9bUNSaPFUUgvPZSQ==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "7.0.0-beta.35",
+ "@babel/types": "7.0.0-beta.35",
+ "babylon": "7.0.0-beta.35",
+ "lodash": "4.17.10"
+ }
+ },
+ "@babel/types": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.35.tgz",
+ "integrity": "sha512-y9XT11CozHDgjWcTdxmhSj13rJVXpa5ZXwjjOiTedjaM0ba5ItqdS02t31EhPl7HtOWxsZkYCCUNrSfrOisA6w==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "2.0.0"
+ }
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "babylon": {
+ "version": "7.0.0-beta.35",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.35.tgz",
+ "integrity": "sha512-Y2o5scalPPlI6eOYMat6iqoM8akjqkAv9cXUN/7YNe3FANAsAGcF5L2u6XiUtBECvhyf7LeZYyzNYnjk43Vffg==",
+ "dev": true
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ },
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ }
+ }
+ },
+ "@babel/plugin-transform-computed-properties": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.0.0-beta.46.tgz",
+ "integrity": "sha512-0ne9TL53fXH+cBI591R1JSpPhu0d2Wd9dbD8jLCJFV4tlMfqQ+Rcm65RhWWqjEBZfGv2+FuOnwB4HJRHakdW+Q==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-transform-destructuring": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.0.0-beta.46.tgz",
+ "integrity": "sha512-l9x0+T29Njwp6smLbTIU2HG2s4ROd9DAIQcfciEfpjAqscXEst0M4X9+UvjQsuaOgPFmQTdAn9xOwNFXnRP7Tg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-transform-duplicate-keys": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.0.0-beta.46.tgz",
+ "integrity": "sha512-mP2+3QQ+ArIMX98zVYSC9XBzV7A/Pxbz+2hPcEAGVeakFYm5AeTkcVHRQzzA21v4ecl0L5LE1XWX9yeK643CWw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-transform-exponentiation-operator": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.0.0-beta.46.tgz",
+ "integrity": "sha512-acomgoNW/fwWSmBlhH22C9Eyl1Y/vADBSqzyIRWJGpm4frLhd49QQgKXbRGRHUDxyifXuZDF9+3pRhEmi7/HXA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-builder-binary-assignment-operator-visitor": "7.0.0-beta.46",
+ "@babel/helper-plugin-utils": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-transform-for-of": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.0.0-beta.46.tgz",
+ "integrity": "sha512-a1gpwuO26szyz5K2FrRrI5nUDgvkaJfZ7GeDtFAH8XyrK/pNdtpW/7DFCf1PdQc6SbEMM/1QXsH7Y2YRkWoTeA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-transform-function-name": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.0.0-beta.46.tgz",
+ "integrity": "sha512-XyxSW1jm7WKOoPYHUJA0mbOkDFdlHzGR4DzlWAEwXrzEI5ep0ZP1AttAbVkxsF63XG8p2t9VtKlgbyBq4Tyr7A==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-function-name": "7.0.0-beta.46",
+ "@babel/helper-plugin-utils": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-transform-instanceof": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-instanceof/-/plugin-transform-instanceof-7.0.0-beta.46.tgz",
+ "integrity": "sha512-yMde/XDsS8ONNoI+QsT3RR/0Lrq5yKYEVZxMxsm+naKN/n1+CiG6sN9USAzF6qy+XC4uRTJ5gpDZu0CtDnh0qA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-transform-literals": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.0.0-beta.46.tgz",
+ "integrity": "sha512-Uuo7pRsBkrLrDg6XpOAMfwhKw56SB5qVBniUVM04uf8wf92S2Z5tSPNNfn1iTgphuckAO9vg86l2XJ0Y/QD4YQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-transform-modules-amd": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.0.0-beta.46.tgz",
+ "integrity": "sha512-GNp7F3EqJlQIMY9sfoDS03P7EHa/+Bdy6PUugTIo1TjZQUnCy3JbeL2YGI4tU8XOHJGHiBKRjFMpeOsjOSmMtw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-module-transforms": "7.0.0-beta.46",
+ "@babel/helper-plugin-utils": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-transform-object-super": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.0.0-beta.46.tgz",
+ "integrity": "sha512-T+TV4rRuTubvjqEwBF5xib3vnfJgjQ62qJqHprTaJDBtF0ofpbv/A6x86EEr51iPymHc84eM+F1zyFEtJvKYwQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46",
+ "@babel/helper-replace-supers": "7.0.0-beta.46"
+ },
+ "dependencies": {
+ "@babel/helper-optimise-call-expression": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0-beta.46.tgz",
+ "integrity": "sha512-PVd7/PGxi82pEKyuDcEpMmlenMLhJCII3lIK4MhXGWrT/6cNMpY6ob5rWOarpXgZjy+JNI5uLPOce28bqq0Wtw==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "7.0.0-beta.46"
+ }
+ },
+ "@babel/helper-replace-supers": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.0.0-beta.46.tgz",
+ "integrity": "sha512-FSpK3QKzb58oMEccanHzg1djsYHhGARl08i8BQGBoOyHS6Df+4/8bsQiTnc59Dz5sJoZdb67nKKFjgMsMYi6Kg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-member-expression-to-functions": "7.0.0-beta.46",
+ "@babel/helper-optimise-call-expression": "7.0.0-beta.46",
+ "@babel/traverse": "7.0.0-beta.46",
+ "@babel/types": "7.0.0-beta.46"
+ }
+ }
+ }
+ },
+ "@babel/plugin-transform-parameters": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.0.0-beta.46.tgz",
+ "integrity": "sha512-RnkdYrayTlQ0VFoyIjvY/cCp/1lJJkYE2lFcRNg6+Skd3g41PnocsHhQ5NUQjMNogL+RnNan3S/2S/i7S4zm+Q==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-call-delegate": "7.0.0-beta.46",
+ "@babel/helper-get-function-arity": "7.0.0-beta.46",
+ "@babel/helper-plugin-utils": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-transform-regenerator": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0-beta.46.tgz",
+ "integrity": "sha512-P6d8ckSjKlbr/1SL1NBO6ieFxSebTiRWd2R8/styUIizJWQlEB0ITQ7l8vv3jXGjJ0mh7lxBTegXejRkTGKKgw==",
+ "dev": true,
+ "requires": {
+ "regenerator-transform": "0.12.3"
+ }
+ },
+ "@babel/plugin-transform-shorthand-properties": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.0.0-beta.46.tgz",
+ "integrity": "sha512-1QkKFWPsjrvMppycLwjPBXF+usSnGvbTxGe0Q+eIzcZyhabwGCsCgkmDIKMisPSAi6F7bM5H1S8VbE85IW3oRg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-transform-spread": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.0.0-beta.46.tgz",
+ "integrity": "sha512-R0GvFdJnFrgTlmZfFtCXk81uvq5S3FuY38FnRsxDt6Yx/sE8jCmmrRe7XHZOnXXGP3ZWY9icILUmzWHOf91jbA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-transform-sticky-regex": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.0.0-beta.46.tgz",
+ "integrity": "sha512-goMgOLODjG1cgFHlKACh/NT/wrnmuRi2CpXsjOan10eZce0fk9kahYz/04cqhppmwtV/vQWwH2ikAHODSD8r5w==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46",
+ "@babel/helper-regex": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-transform-template-literals": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.0.0-beta.46.tgz",
+ "integrity": "sha512-2iGMsHWVAQq9X6p3VNjktJCH6ZXHQHi3NTPLKh5d4bEW8+M3H7LXLNqk1yUm/Uwt0tzh1FUfb/EU2sEPbrBrVA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-annotate-as-pure": "7.0.0-beta.46",
+ "@babel/helper-plugin-utils": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-transform-typeof-symbol": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.0.0-beta.46.tgz",
+ "integrity": "sha512-l+CfLR2c5KzZ/uZlkflNe7nK2hiEahc/FeiUCTd5Krj4aCKDdLLSdb4Lowf5hdZbqIPQc9TdL9SZt80YhUlmFw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46"
+ }
+ },
+ "@babel/plugin-transform-unicode-regex": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.0.0-beta.46.tgz",
+ "integrity": "sha512-XWQ7uJ0HL/xdMesKzt1uq5CmZPBqDiEno+FBeYuOJu1IWjpr3yXfEzH/nW17KESXGRv68mLTr+fIeSwcC+qVFg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "7.0.0-beta.46",
+ "@babel/helper-regex": "7.0.0-beta.46",
+ "regexpu-core": "4.1.3"
+ }
+ },
+ "@babel/template": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.46.tgz",
+ "integrity": "sha512-3/qi4m0l6G/vZbEwtqfzJk73mYtuE7nvAO1zT3/ZrTAHy4sHf2vaF9Eh1w+Tau263Yrkh0bjVQPb9zw6G+GeMQ==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "7.0.0-beta.46",
+ "@babel/types": "7.0.0-beta.46",
+ "babylon": "7.0.0-beta.46",
+ "lodash": "4.17.10"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.46.tgz",
+ "integrity": "sha512-WFJlg2WatdkXRFMpk7BN/Uzzkjkcjk+WaqnrSCpay+RYl4ypW9ZetZyT9kNt22IH/BQNst3M6PaaBn9IXsUNrg==",
+ "dev": true
+ }
+ }
+ },
+ "@babel/traverse": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.46.tgz",
+ "integrity": "sha512-IU7MTGbcjpfhf5tyCu3sDB7sWYainZQcT+CqOBdVZXZfq5MMr130R7aiZBI2g5dJYUaW1PS81DVNpd0/Sq/Gzg==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "7.0.0-beta.46",
+ "@babel/generator": "7.0.0-beta.46",
+ "@babel/helper-function-name": "7.0.0-beta.46",
+ "@babel/helper-split-export-declaration": "7.0.0-beta.46",
+ "@babel/types": "7.0.0-beta.46",
+ "babylon": "7.0.0-beta.46",
+ "debug": "3.1.0",
+ "globals": "11.5.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.46.tgz",
+ "integrity": "sha512-WFJlg2WatdkXRFMpk7BN/Uzzkjkcjk+WaqnrSCpay+RYl4ypW9ZetZyT9kNt22IH/BQNst3M6PaaBn9IXsUNrg==",
+ "dev": true
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "11.5.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.5.0.tgz",
+ "integrity": "sha512-hYyf+kI8dm3nORsiiXUQigOU62hDLfJ9G01uyGMxhc6BKsircrUhC4uJPQPUSuq2GrTmiiEt7ewxlMdBewfmKQ==",
+ "dev": true
+ }
+ }
+ },
+ "@babel/types": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.46.tgz",
+ "integrity": "sha512-uA5aruF2KKsJxToWdDpftsrPOIQtoGrGno2hiaeO9JRvfT9xZdK11nPoC+/RF9emNzmNbWn4HCRdCY+McT5Nbw==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "2.0.0"
+ },
+ "dependencies": {
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ }
+ }
+ },
+ "@mrmlnc/readdir-enhanced": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
+ "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
+ "dev": true,
+ "requires": {
+ "call-me-maybe": "1.0.1",
+ "glob-to-regexp": "0.3.0"
+ }
+ },
+ "@polymer/esm-amd-loader": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@polymer/esm-amd-loader/-/esm-amd-loader-1.0.0.tgz",
+ "integrity": "sha512-8ZDZzuu2jkg2A6hC7NeH2GqAwxpS9ADI2PYOGi/n06h6ouyoQK2cWTarUPiCAwmHLvVVQ1ySJsags37H33caZQ==",
+ "dev": true
+ },
+ "@polymer/sinonjs": {
+ "version": "1.17.1",
+ "resolved": "https://registry.npmjs.org/@polymer/sinonjs/-/sinonjs-1.17.1.tgz",
+ "integrity": "sha512-/U8F/cOTrbF2iVVYgINYmvKbtbexs+89Q3v8AaHADRYabTg7aOZGOb0RyWpOI+sUJt04kj63U4FwMhzW5r4wZA==",
+ "dev": true
+ },
+ "@polymer/test-fixture": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@polymer/test-fixture/-/test-fixture-0.0.3.tgz",
+ "integrity": "sha1-REN1JpfU2Sk7vEEuoLXk00HxSdk=",
+ "dev": true
+ },
+ "@polymer/tools-common": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@polymer/tools-common/-/tools-common-2.0.0.tgz",
+ "integrity": "sha512-tuU61CtwLQBqN64DnxGUchD3619engj6KOmsNOHkU/KfW5ipaKruugQtdnEZjPXozcGc8WLzHORW4lQfPejC0w==",
+ "requires": {
+ "depcheck": "0.6.9",
+ "fs-extra": "3.0.1",
+ "gulp-eslint": "4.0.2",
+ "gulp-mocha": "4.3.1",
+ "gulp-tslint": "8.1.3",
+ "gulp-typescript": "3.2.4",
+ "merge-stream": "1.0.1",
+ "run-sequence": "1.2.2",
+ "tslint": "5.10.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz",
+ "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==",
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ },
+ "fs-extra": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz",
+ "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=",
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "3.0.1",
+ "universalify": "0.1.1"
+ }
+ },
+ "gulp-tslint": {
+ "version": "8.1.3",
+ "resolved": "https://registry.npmjs.org/gulp-tslint/-/gulp-tslint-8.1.3.tgz",
+ "integrity": "sha512-KEP350N5B9Jg6o6jnyCyKVBPemJePYpMsGfIQq0G0ErvY7tw4Lrfb/y3L4WRf7ek0OsaE8nnj86w+lcLXW8ovw==",
+ "requires": {
+ "@types/fancy-log": "1.3.0",
+ "chalk": "2.3.1",
+ "fancy-log": "1.3.2",
+ "map-stream": "0.0.7",
+ "plugin-error": "1.0.1",
+ "through": "2.3.8"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+ },
+ "jsonfile": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz",
+ "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=",
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "map-stream": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz",
+ "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg="
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ }
+ }
+ },
+ "@types/acorn": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.3.tgz",
+ "integrity": "sha512-gou/kWQkGPMZjdCKNZGDpqxLm9+ErG/pFZKPX4tvCjr0Xf4FCYYX3nAsu7aDVKJV3KUe27+mvqqyWT/9VZoM/A==",
+ "dev": true,
+ "requires": {
+ "@types/estree": "0.0.39"
+ }
+ },
+ "@types/babel-generator": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/@types/babel-generator/-/babel-generator-6.25.1.tgz",
+ "integrity": "sha512-nKNz9Ch4WP2TFZjQROhxqqS2SCk0OoDzGazJI6S+2sGgW9P7N4o3vluZAXFuPEnRqtz2A0vrrkK3tjQktxIlRw==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-traverse": {
+ "version": "6.25.3",
+ "resolved": "https://registry.npmjs.org/@types/babel-traverse/-/babel-traverse-6.25.3.tgz",
+ "integrity": "sha512-4FaulWyA7nrXPkzoukL2VmSpxCnBZwc+MgwZqO30gtHCrtaUXnoxymdYfxzf3CZN80zjtrVzKfLlZ7FPYvrhQQ==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/babel-types": {
+ "version": "6.25.2",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-6.25.2.tgz",
+ "integrity": "sha512-+3bMuktcY4a70a0KZc8aPJlEOArPuAKQYHU5ErjkOqGJdx8xuEEVK6nWogqigBOJ8nKPxRpyCUDTCPmZ3bUxGA==",
+ "dev": true
+ },
+ "@types/babylon": {
+ "version": "6.16.2",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz",
+ "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==",
+ "dev": true,
+ "requires": {
+ "@types/babel-types": "6.25.2"
+ }
+ },
+ "@types/bluebird": {
+ "version": "3.5.20",
+ "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.20.tgz",
+ "integrity": "sha512-Wk41MVdF+cHBfVXj/ufUHJeO3BlIQr1McbHZANErMykaCWeDSZbH5erGjNBw2/3UlRdSxZbLfSuQTzFmPOYFsA==",
+ "dev": true
+ },
+ "@types/body-parser": {
+ "version": "1.17.0",
+ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.17.0.tgz",
+ "integrity": "sha512-a2+YeUjPkztKJu5aIF2yArYFQQp8d51wZ7DavSHjFuY1mqVgidGyzEQ41JIVNy82fXj8yPgy2vJmfIywgESW6w==",
+ "dev": true,
+ "requires": {
+ "@types/connect": "3.4.32",
+ "@types/node": "8.10.13"
+ }
+ },
+ "@types/chai": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.3.tgz",
+ "integrity": "sha512-f5dXGzOJycyzSMdaXVhiBhauL4dYydXwVpavfQ1mVCaGjR56a9QfklXObUxlIY9bGTmCPHEEZ04I16BZ/8w5ww==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.1.tgz",
+ "integrity": "sha512-Aof+FLfWzBPzDgJ2uuBuPNOBHVx9Siyw4vmOcsMgsuxX1nfUWSlzpq4pdvQiaBgGjGS7vP/Oft5dpJbX4krT1A==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "4.1.3"
+ }
+ },
+ "@types/chalk": {
+ "version": "0.4.31",
+ "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz",
+ "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=",
+ "dev": true
+ },
+ "@types/chokidar": {
+ "version": "1.7.5",
+ "resolved": "https://registry.npmjs.org/@types/chokidar/-/chokidar-1.7.5.tgz",
+ "integrity": "sha512-PDkSRY7KltW3M60hSBlerxI8SFPXsO3AL/aRVsO4Kh9IHRW74Ih75gUuTd/aE4LSSFqypb10UIX3QzOJwBQMGQ==",
+ "requires": {
+ "@types/events": "1.2.0",
+ "@types/node": "8.10.13"
+ }
+ },
+ "@types/clean-css": {
+ "version": "3.4.30",
+ "resolved": "https://registry.npmjs.org/@types/clean-css/-/clean-css-3.4.30.tgz",
+ "integrity": "sha1-AFLBNvUkgAJCjjY4s33ko5gYZB0=",
+ "dev": true
+ },
+ "@types/clone": {
+ "version": "0.1.30",
+ "resolved": "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz",
+ "integrity": "sha1-5zZWSMG0ITalnH1QQGN7O1yDthQ=",
+ "dev": true
+ },
+ "@types/compression": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/@types/compression/-/compression-0.0.33.tgz",
+ "integrity": "sha1-ldxzOiM5qoRjgdfxN3eS0lU9wn0=",
+ "dev": true,
+ "requires": {
+ "@types/express": "4.11.1"
+ }
+ },
+ "@types/connect": {
+ "version": "3.4.32",
+ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.32.tgz",
+ "integrity": "sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.10.13"
+ }
+ },
+ "@types/content-type": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@types/content-type/-/content-type-1.1.2.tgz",
+ "integrity": "sha512-w2d7fBCYbCBUBTGtkC4JfX1FicTtgEmq7wTTjc7rC5RA/JdB1Bi7o88nKzUqAnIIBXJVmq0n4tTmF3PJN8QqCg==",
+ "dev": true
+ },
+ "@types/cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@types/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-jgvuj33suVIlDaDK6+BeMFkcF+8=",
+ "dev": true
+ },
+ "@types/del": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@types/del/-/del-3.0.1.tgz",
+ "integrity": "sha512-y6qRq6raBuu965clKgx6FHuiPu3oHdtmzMPXi8Uahsjdq1L6DL5fS/aY5/s71YwM7k6K1QIWvem5vNwlnNGIkQ==",
+ "dev": true,
+ "requires": {
+ "@types/glob": "5.0.35"
+ }
+ },
+ "@types/doctrine": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.1.tgz",
+ "integrity": "sha1-uZny2fe0PKvgoaLzm8IDvH3K2p0=",
+ "dev": true
+ },
+ "@types/escape-html": {
+ "version": "0.0.20",
+ "resolved": "https://registry.npmjs.org/@types/escape-html/-/escape-html-0.0.20.tgz",
+ "integrity": "sha512-6dhZJLbA7aOwkYB2GDGdIqJ20wmHnkDzaxV9PJXe7O02I2dSFTERzRB6JrX6cWKaS+VqhhY7cQUMCbO5kloFUw==",
+ "dev": true
+ },
+ "@types/estree": {
+ "version": "0.0.39",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
+ "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
+ "dev": true
+ },
+ "@types/events": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz",
+ "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA=="
+ },
+ "@types/express": {
+ "version": "4.11.1",
+ "resolved": "https://registry.npmjs.org/@types/express/-/express-4.11.1.tgz",
+ "integrity": "sha512-ttWle8cnPA5rAelauSWeWJimtY2RsUf2aspYZs7xPHiWgOlPn6nnUfBMtrkcnjFJuIHJF4gNOdVvpLK2Zmvh6g==",
+ "dev": true,
+ "requires": {
+ "@types/body-parser": "1.17.0",
+ "@types/express-serve-static-core": "4.11.1",
+ "@types/serve-static": "1.13.2"
+ }
+ },
+ "@types/express-serve-static-core": {
+ "version": "4.11.1",
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.11.1.tgz",
+ "integrity": "sha512-EehCl3tpuqiM8RUb+0255M8PhhSwTtLfmO7zBBdv0ay/VTd/zmrqDfQdZFsa5z/PVMbH2yCMZPXsnrImpATyIw==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.2.0",
+ "@types/node": "8.10.13"
+ }
+ },
+ "@types/fancy-log": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@types/fancy-log/-/fancy-log-1.3.0.tgz",
+ "integrity": "sha512-mQjDxyOM1Cpocd+vm1kZBP7smwKZ4TNokFeds9LV7OZibmPJFEzY3+xZMrKfUdNT71lv8GoCPD6upKwHxubClw=="
+ },
+ "@types/fast-levenshtein": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@types/fast-levenshtein/-/fast-levenshtein-0.0.1.tgz",
+ "integrity": "sha1-OjYVzxc2Rcj8pY0FHk4ygk5L0oY=",
+ "dev": true
+ },
+ "@types/findup-sync": {
+ "version": "0.3.29",
+ "resolved": "https://registry.npmjs.org/@types/findup-sync/-/findup-sync-0.3.29.tgz",
+ "integrity": "sha1-7AyAWX5e0VcoIgfnYspyVMrVdjI=",
+ "dev": true,
+ "requires": {
+ "@types/minimatch": "3.0.3"
+ }
+ },
+ "@types/form-data": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-2.2.1.tgz",
+ "integrity": "sha512-JAMFhOaHIciYVh8fb5/83nmuO/AHwmto+Hq7a9y8FzLDcC1KCU344XDOMEmahnrTFlHjgh4L0WJFczNIX2GxnQ==",
+ "dev": true,
+ "requires": {
+ "@types/node": "10.0.5"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "10.0.5",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.0.5.tgz",
+ "integrity": "sha512-he3QlF+xnGlmsnL1H8/CiM6r25kk0STky6U5yIqNh4Nnp9KlJBSdMMIiCzDYtAFLw2rWnJ4XKc1xB2/u/anYow==",
+ "dev": true
+ }
+ }
+ },
+ "@types/freeport": {
+ "version": "1.0.21",
+ "resolved": "https://registry.npmjs.org/@types/freeport/-/freeport-1.0.21.tgz",
+ "integrity": "sha1-c/ZUPtZ9PKP/+XuYVZFZi3CSBm8=",
+ "dev": true,
+ "optional": true
+ },
+ "@types/fs-extra": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.2.tgz",
+ "integrity": "sha512-Q3FWsbdmkQd1ib11A4XNWQvRD//5KpPoGawA8aB2DR7pWKoW9XQv3+dGxD/Z1eVFze23Okdo27ZQytVFlweKvQ==",
+ "requires": {
+ "@types/node": "8.10.13"
+ }
+ },
+ "@types/glob": {
+ "version": "5.0.35",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz",
+ "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "10.0.5"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "10.0.5",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.0.5.tgz",
+ "integrity": "sha512-he3QlF+xnGlmsnL1H8/CiM6r25kk0STky6U5yIqNh4Nnp9KlJBSdMMIiCzDYtAFLw2rWnJ4XKc1xB2/u/anYow==",
+ "dev": true
+ }
+ }
+ },
+ "@types/glob-stream": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@types/glob-stream/-/glob-stream-6.1.0.tgz",
+ "integrity": "sha512-RHv6ZQjcTncXo3thYZrsbAVwoy4vSKosSWhuhuQxLOTv74OJuFQxXkmUuZCr3q9uNBEVCvIzmZL/FeRNbHZGUg==",
+ "dev": true,
+ "requires": {
+ "@types/glob": "5.0.35",
+ "@types/node": "10.0.5"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "10.0.5",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.0.5.tgz",
+ "integrity": "sha512-he3QlF+xnGlmsnL1H8/CiM6r25kk0STky6U5yIqNh4Nnp9KlJBSdMMIiCzDYtAFLw2rWnJ4XKc1xB2/u/anYow==",
+ "dev": true
+ }
+ }
+ },
+ "@types/globby": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@types/globby/-/globby-6.1.0.tgz",
+ "integrity": "sha512-j3XSDNoK4LO5T+ZviQD6PqfEjm07QFEacOTbJR3hnLWuWX0ZMLJl9oRPgj1PyrfGbXhfHFkksC9QZ9HFltJyrw==",
+ "dev": true,
+ "requires": {
+ "@types/glob": "5.0.35"
+ }
+ },
+ "@types/gulp-if": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/@types/gulp-if/-/gulp-if-0.0.33.tgz",
+ "integrity": "sha512-J5lzff21X7r1x/4hSzn02GgIUEyjCqYIXZ9GgGBLhbsD3RiBdqwnkFWgF16/0jO5rcVZ52Zp+6MQMQdvIsWuKg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.10.13",
+ "@types/vinyl": "2.0.2"
+ }
+ },
+ "@types/html-minifier": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/@types/html-minifier/-/html-minifier-3.5.2.tgz",
+ "integrity": "sha512-yikK28/KlVyf8g9i/k+TDFlteLuZ6QQTUdVqvKtzEB+8DSLCTjxfh6IK45KnW4rYFI3Y8T4LWpYJMTmfJleWaQ==",
+ "dev": true,
+ "requires": {
+ "@types/clean-css": "3.4.30",
+ "@types/relateurl": "0.2.28",
+ "@types/uglify-js": "3.0.2"
+ }
+ },
+ "@types/inquirer": {
+ "version": "0.0.32",
+ "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-0.0.32.tgz",
+ "integrity": "sha1-pKCOg3QcUAp8PI53dgFPf4plhw0=",
+ "requires": {
+ "@types/rx": "4.1.1",
+ "@types/through": "0.0.29"
+ }
+ },
+ "@types/is-windows": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@types/is-windows/-/is-windows-0.2.0.tgz",
+ "integrity": "sha1-byTuSHMdMRaOpRBhDW3RXl/Jxv8=",
+ "dev": true
+ },
+ "@types/launchpad": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@types/launchpad/-/launchpad-0.6.0.tgz",
+ "integrity": "sha1-NylhCbfyd/bmxf1+DAcGvJGPu1E=",
+ "dev": true,
+ "optional": true
+ },
+ "@types/merge-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@types/merge-stream/-/merge-stream-1.1.0.tgz",
+ "integrity": "sha512-mdbxuhPC4+kx37R3mO4nTTMFVJn5IRLdRqa7WL3Kf9haMh0DNnaU9Pt/naTZdBIWIg8jQb/EWoPyCGh0Hj+6tg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "10.0.5"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "10.0.5",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.0.5.tgz",
+ "integrity": "sha512-he3QlF+xnGlmsnL1H8/CiM6r25kk0STky6U5yIqNh4Nnp9KlJBSdMMIiCzDYtAFLw2rWnJ4XKc1xB2/u/anYow==",
+ "dev": true
+ }
+ }
+ },
+ "@types/mime": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-0.0.29.tgz",
+ "integrity": "sha1-+8/TMFc7kS71nu7hRgK/rOYwdUs=",
+ "dev": true
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/mocha": {
+ "version": "2.2.48",
+ "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz",
+ "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw=="
+ },
+ "@types/mz": {
+ "version": "0.0.31",
+ "resolved": "https://registry.npmjs.org/@types/mz/-/mz-0.0.31.tgz",
+ "integrity": "sha1-pNgMCC/v5x5Ap8DwfR5lVbu8e1I=",
+ "dev": true,
+ "requires": {
+ "@types/node": "10.0.5"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "10.0.5",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.0.5.tgz",
+ "integrity": "sha512-he3QlF+xnGlmsnL1H8/CiM6r25kk0STky6U5yIqNh4Nnp9KlJBSdMMIiCzDYtAFLw2rWnJ4XKc1xB2/u/anYow==",
+ "dev": true
+ }
+ }
+ },
+ "@types/node": {
+ "version": "8.10.13",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.13.tgz",
+ "integrity": "sha512-AorNXRHoPVxIUIVmr6uJXRnvlPOSNKAJF5jZ1JOj1/IxYMocZzvQooNeLU02Db6kpy1IVIySTOvuIxmUF1HrOg=="
+ },
+ "@types/opn": {
+ "version": "3.0.28",
+ "resolved": "https://registry.npmjs.org/@types/opn/-/opn-3.0.28.tgz",
+ "integrity": "sha1-CX0NHJtXSVc6XZbfEyOHu20CEYo=",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.10.13"
+ }
+ },
+ "@types/parse5": {
+ "version": "2.2.34",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz",
+ "integrity": "sha1-44cKEOgnNacg9i1x3NGDunjvOp0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.10.13"
+ }
+ },
+ "@types/path-is-inside": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@types/path-is-inside/-/path-is-inside-1.0.0.tgz",
+ "integrity": "sha512-hfnXRGugz+McgX2jxyy5qz9sB21LRzlGn24zlwN2KEgoPtEvjzNRrLtUkOOebPDPZl3Rq7ywKxYvylVcEZDnEw==",
+ "dev": true
+ },
+ "@types/pem": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/@types/pem/-/pem-1.9.3.tgz",
+ "integrity": "sha512-+hHbGi9PAyHVeRdMJN6yNuMWoshJ+7oTqYuhBB1/vHq0Tfu46ucbvgxmhwBfe0GCiJZvCa20VHhHsA0mY5W6hQ==",
+ "dev": true
+ },
+ "@types/puppeteer": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/puppeteer/-/puppeteer-1.3.1.tgz",
+ "integrity": "sha512-+mJKsb2XM/F4JuLCress3oPDH5UPcj7TMted0HBByhNGhIe0M5yzkGLsedZmuvRcyaBPU0ifPpFR8/GTxmILeg==",
+ "requires": {
+ "@types/events": "1.2.0",
+ "@types/node": "8.10.13"
+ }
+ },
+ "@types/relateurl": {
+ "version": "0.2.28",
+ "resolved": "https://registry.npmjs.org/@types/relateurl/-/relateurl-0.2.28.tgz",
+ "integrity": "sha1-a9p9uGU/piZD9e5p6facEaOS46Y=",
+ "dev": true
+ },
+ "@types/request": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@types/request/-/request-2.0.3.tgz",
+ "integrity": "sha512-cIvnyFRARxwE4OHpCyYue7H+SxaKFPpeleRCHJicft8QhyTNbVYsMwjvEzEPqG06D2LGHZ+sN5lXc8+bTu6D8A==",
+ "dev": true,
+ "requires": {
+ "@types/form-data": "2.2.1",
+ "@types/node": "10.0.5"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "10.0.5",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.0.5.tgz",
+ "integrity": "sha512-he3QlF+xnGlmsnL1H8/CiM6r25kk0STky6U5yIqNh4Nnp9KlJBSdMMIiCzDYtAFLw2rWnJ4XKc1xB2/u/anYow==",
+ "dev": true
+ }
+ }
+ },
+ "@types/resolve": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.4.tgz",
+ "integrity": "sha1-m1htZalH3qiMS8JNoLkF/pUgoNU=",
+ "dev": true,
+ "requires": {
+ "@types/node": "10.0.5"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "10.0.5",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.0.5.tgz",
+ "integrity": "sha512-he3QlF+xnGlmsnL1H8/CiM6r25kk0STky6U5yIqNh4Nnp9KlJBSdMMIiCzDYtAFLw2rWnJ4XKc1xB2/u/anYow==",
+ "dev": true
+ }
+ }
+ },
+ "@types/rimraf": {
+ "version": "0.0.28",
+ "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-0.0.28.tgz",
+ "integrity": "sha1-VWJRm8eWPKyoq/fxKMrjtZTUHQY=",
+ "dev": true
+ },
+ "@types/rx": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/@types/rx/-/rx-4.1.1.tgz",
+ "integrity": "sha1-WY/JSla67ZdfGUV04PVy/Y5iekg=",
+ "requires": {
+ "@types/rx-core": "4.0.3",
+ "@types/rx-core-binding": "4.0.4",
+ "@types/rx-lite": "4.0.5",
+ "@types/rx-lite-aggregates": "4.0.3",
+ "@types/rx-lite-async": "4.0.2",
+ "@types/rx-lite-backpressure": "4.0.3",
+ "@types/rx-lite-coincidence": "4.0.3",
+ "@types/rx-lite-experimental": "4.0.1",
+ "@types/rx-lite-joinpatterns": "4.0.1",
+ "@types/rx-lite-testing": "4.0.1",
+ "@types/rx-lite-time": "4.0.3",
+ "@types/rx-lite-virtualtime": "4.0.3"
+ }
+ },
+ "@types/rx-core": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@types/rx-core/-/rx-core-4.0.3.tgz",
+ "integrity": "sha1-CzNUsSOM7b4rdPYybxOdvHpZHWA="
+ },
+ "@types/rx-core-binding": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/rx-core-binding/-/rx-core-binding-4.0.4.tgz",
+ "integrity": "sha512-5pkfxnC4w810LqBPUwP5bg7SFR/USwhMSaAeZQQbEHeBp57pjKXRlXmqpMrLJB4y1oglR/c2502853uN0I+DAQ==",
+ "requires": {
+ "@types/rx-core": "4.0.3"
+ }
+ },
+ "@types/rx-lite": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/@types/rx-lite/-/rx-lite-4.0.5.tgz",
+ "integrity": "sha512-KZk5XTR1dm/kNgBx8iVpjno6fRYtAUQWBOmj+O8j724+nk097sz4fOoHJNpCkOJUtHUurZlJC7QvSFCZHbkC+w==",
+ "requires": {
+ "@types/rx-core": "4.0.3",
+ "@types/rx-core-binding": "4.0.4"
+ }
+ },
+ "@types/rx-lite-aggregates": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@types/rx-lite-aggregates/-/rx-lite-aggregates-4.0.3.tgz",
+ "integrity": "sha512-MAGDAHy8cRatm94FDduhJF+iNS5//jrZ/PIfm+QYw9OCeDgbymFHChM8YVIvN2zArwsRftKgE33QfRWvQk4DPg==",
+ "requires": {
+ "@types/rx-lite": "4.0.5"
+ }
+ },
+ "@types/rx-lite-async": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@types/rx-lite-async/-/rx-lite-async-4.0.2.tgz",
+ "integrity": "sha512-vTEv5o8l6702ZwfAM5aOeVDfUwBSDOs+ARoGmWAKQ6LOInQ8J4/zjM7ov12fuTpktUKdMQjkeCp07Vd73mPkxw==",
+ "requires": {
+ "@types/rx-lite": "4.0.5"
+ }
+ },
+ "@types/rx-lite-backpressure": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@types/rx-lite-backpressure/-/rx-lite-backpressure-4.0.3.tgz",
+ "integrity": "sha512-Y6aIeQCtNban5XSAF4B8dffhIKu6aAy/TXFlScHzSxh6ivfQBQw6UjxyEJxIOt3IT49YkS+siuayM2H/Q0cmgA==",
+ "requires": {
+ "@types/rx-lite": "4.0.5"
+ }
+ },
+ "@types/rx-lite-coincidence": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@types/rx-lite-coincidence/-/rx-lite-coincidence-4.0.3.tgz",
+ "integrity": "sha512-1VNJqzE9gALUyMGypDXZZXzR0Tt7LC9DdAZQ3Ou/Q0MubNU35agVUNXKGHKpNTba+fr8GdIdkC26bRDqtCQBeQ==",
+ "requires": {
+ "@types/rx-lite": "4.0.5"
+ }
+ },
+ "@types/rx-lite-experimental": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@types/rx-lite-experimental/-/rx-lite-experimental-4.0.1.tgz",
+ "integrity": "sha1-xTL1y98/LBXaFt7Ykw0bKYQCPL0=",
+ "requires": {
+ "@types/rx-lite": "4.0.5"
+ }
+ },
+ "@types/rx-lite-joinpatterns": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@types/rx-lite-joinpatterns/-/rx-lite-joinpatterns-4.0.1.tgz",
+ "integrity": "sha1-9w/jcFGKhDLykVjMkv+1a05K/D4=",
+ "requires": {
+ "@types/rx-lite": "4.0.5"
+ }
+ },
+ "@types/rx-lite-testing": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@types/rx-lite-testing/-/rx-lite-testing-4.0.1.tgz",
+ "integrity": "sha1-IbGdEfTf1v/vWp0WSOnIh5v+Iek=",
+ "requires": {
+ "@types/rx-lite-virtualtime": "4.0.3"
+ }
+ },
+ "@types/rx-lite-time": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@types/rx-lite-time/-/rx-lite-time-4.0.3.tgz",
+ "integrity": "sha512-ukO5sPKDRwCGWRZRqPlaAU0SKVxmWwSjiOrLhoQDoWxZWg6vyB9XLEZViKOzIO6LnTIQBlk4UylYV0rnhJLxQw==",
+ "requires": {
+ "@types/rx-lite": "4.0.5"
+ }
+ },
+ "@types/rx-lite-virtualtime": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@types/rx-lite-virtualtime/-/rx-lite-virtualtime-4.0.3.tgz",
+ "integrity": "sha512-3uC6sGmjpOKatZSVHI2xB1+dedgml669ZRvqxy+WqmGJDVusOdyxcKfyzjW0P3/GrCiN4nmRkLVMhPwHCc5QLg==",
+ "requires": {
+ "@types/rx-lite": "4.0.5"
+ }
+ },
+ "@types/semver": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz",
+ "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==",
+ "dev": true
+ },
+ "@types/serve-static": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.2.tgz",
+ "integrity": "sha512-/BZ4QRLpH/bNYgZgwhKEh+5AsboDBcUdlBYgzoLX0fpj3Y2gp6EApyOlM3bK53wQS/OE1SrdSYBAbux2D1528Q==",
+ "dev": true,
+ "requires": {
+ "@types/express-serve-static-core": "4.11.1",
+ "@types/mime": "0.0.29"
+ }
+ },
+ "@types/sinon": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-4.3.1.tgz",
+ "integrity": "sha512-DK4YtH30I67k4klURIBS4VAe1aBISfS9lgNlHFkibSmKem2tLQc5VkKoJreT3dCJAd+xRyCS8bx1o97iq3yUVg=="
+ },
+ "@types/spdy": {
+ "version": "3.4.4",
+ "resolved": "https://registry.npmjs.org/@types/spdy/-/spdy-3.4.4.tgz",
+ "integrity": "sha512-N9LBlbVRRYq6HgYpPkqQc3a9HJ/iEtVZToW6xlTtJiMhmRJ7jJdV7TaZQJw/Ve/1ePUsQiCTDc4JMuzzag94GA==",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.10.13"
+ }
+ },
+ "@types/temp": {
+ "version": "0.8.32",
+ "resolved": "https://registry.npmjs.org/@types/temp/-/temp-0.8.32.tgz",
+ "integrity": "sha512-gyIhOlWPqI8vtYTlRb61HKV7x+3wjpJIQi8mTaweVtEMvhIV6Xajo8FVcNJWeJOBuedRCzK2Uy+uhj/rJmR9oQ==",
+ "dev": true,
+ "requires": {
+ "@types/node": "10.0.5"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "10.0.5",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.0.5.tgz",
+ "integrity": "sha512-he3QlF+xnGlmsnL1H8/CiM6r25kk0STky6U5yIqNh4Nnp9KlJBSdMMIiCzDYtAFLw2rWnJ4XKc1xB2/u/anYow==",
+ "dev": true
+ }
+ }
+ },
+ "@types/through": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.29.tgz",
+ "integrity": "sha512-9a7C5VHh+1BKblaYiq+7Tfc+EOmjMdZaD1MYtkQjSoxgB69tBjW98ry6SKsi4zEIWztLOMRuL87A3bdT/Fc/4w==",
+ "requires": {
+ "@types/node": "10.0.5"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "10.0.5",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.0.5.tgz",
+ "integrity": "sha512-he3QlF+xnGlmsnL1H8/CiM6r25kk0STky6U5yIqNh4Nnp9KlJBSdMMIiCzDYtAFLw2rWnJ4XKc1xB2/u/anYow=="
+ }
+ }
+ },
+ "@types/tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.0.33.tgz",
+ "integrity": "sha1-EHPEvIJHVK49EM+riKsCN7qWTk0="
+ },
+ "@types/ua-parser-js": {
+ "version": "0.7.32",
+ "resolved": "https://registry.npmjs.org/@types/ua-parser-js/-/ua-parser-js-0.7.32.tgz",
+ "integrity": "sha512-+z7Q72Mlnq6SFkQYHzLg2Z70pIsgRVzgx1b5PV8eUv5uaZ/zoqIs45XnhtToW4gTeX4FbjIP49nhIjyvPF4rPg==",
+ "dev": true
+ },
+ "@types/uglify-js": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.0.2.tgz",
+ "integrity": "sha512-o8hU2+4xsyGC27Vujoklvxl88Ew5zmJuTBYMX1Uro2rYUt4HEFJKL6fuq8aGykvS+ssIsIzerWWP2DRxonownQ==",
+ "dev": true,
+ "requires": {
+ "source-map": "0.6.1"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "@types/update-notifier": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@types/update-notifier/-/update-notifier-1.0.3.tgz",
+ "integrity": "sha512-BLStNhP2DFF7funARwTcoD6tetRte8NK3Sc59mn7GNALCN975jOlKX3dGvsFxXr/HwQMxxCuRn9IWB3WQ7odHQ==",
+ "dev": true
+ },
+ "@types/uuid": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.3.tgz",
+ "integrity": "sha512-5fRLCYhLtDb3hMWqQyH10qtF+Ud2JnNCXTCZ+9ktNdCcgslcuXkDTkFcJNk++MT29yDntDnlF1+jD+uVGumsbw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.10.13"
+ }
+ },
+ "@types/vinyl": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.2.tgz",
+ "integrity": "sha512-2iYpNuOl98SrLPBZfEN9Mh2JCJ2EI9HU35SfgBEb51DcmaHkhp8cKMblYeBqMQiwXMgAD3W60DbQ4i/UdLiXhw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "10.0.5"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "10.0.5",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.0.5.tgz",
+ "integrity": "sha512-he3QlF+xnGlmsnL1H8/CiM6r25kk0STky6U5yIqNh4Nnp9KlJBSdMMIiCzDYtAFLw2rWnJ4XKc1xB2/u/anYow==",
+ "dev": true
+ }
+ }
+ },
+ "@types/vinyl-fs": {
+ "version": "0.0.28",
+ "resolved": "https://registry.npmjs.org/@types/vinyl-fs/-/vinyl-fs-0.0.28.tgz",
+ "integrity": "sha1-RmMBe8gCxlcOrk80Cf1cq/l8v94=",
+ "dev": true,
+ "requires": {
+ "@types/glob-stream": "6.1.0",
+ "@types/node": "10.0.5",
+ "@types/vinyl": "2.0.2"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "10.0.5",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.0.5.tgz",
+ "integrity": "sha512-he3QlF+xnGlmsnL1H8/CiM6r25kk0STky6U5yIqNh4Nnp9KlJBSdMMIiCzDYtAFLw2rWnJ4XKc1xB2/u/anYow==",
+ "dev": true
+ }
+ }
+ },
+ "@types/whatwg-url": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-6.4.0.tgz",
+ "integrity": "sha512-tonhlcbQ2eho09am6RHnHOgvtDfDYINd5rgxD+2YSkKENooVCFsWizJz139MQW/PV8FfClyKrNe9ZbdHrSCxGg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.10.13"
+ }
+ },
+ "@types/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@types/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-ZrJDWpvg75LTGX4XwuneY9s6bF3OeZcGTpoGh3zDV9ytzcHMFsRrMIaLBRJZQMBoGyKs6unBQfVdrLZiYfb1zQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@types/winston": {
+ "version": "2.3.9",
+ "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.3.9.tgz",
+ "integrity": "sha512-zzruYOEtNgfS3SBjcij1F6HlH6My5n8WrBNhP3fzaRM22ba70QBC2ATs18jGr88Fy43c0z8vFJv5wJankfxv2A==",
+ "dev": true,
+ "requires": {
+ "@types/node": "10.0.5"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "10.0.5",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.0.5.tgz",
+ "integrity": "sha512-he3QlF+xnGlmsnL1H8/CiM6r25kk0STky6U5yIqNh4Nnp9KlJBSdMMIiCzDYtAFLw2rWnJ4XKc1xB2/u/anYow==",
+ "dev": true
+ }
+ }
+ },
+ "@types/yeoman-generator": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@types/yeoman-generator/-/yeoman-generator-1.0.4.tgz",
+ "integrity": "sha512-iMm6ZU90vgupfqIDMQSSKh7VfM3susAoXx8Zv79FGnpiExtUTq8HeAg0AlrwqeP00VpPO/x/ytNejmmyuNoT/A==",
+ "requires": {
+ "@types/inquirer": "0.0.32"
+ }
+ },
+ "@types/yeoman-test": {
+ "version": "1.7.4",
+ "resolved": "https://registry.npmjs.org/@types/yeoman-test/-/yeoman-test-1.7.4.tgz",
+ "integrity": "sha512-nppkWxmwWX2yuvuHqWjYZOxMuhjeKJ0CK6IONDBzYiLEC7l5dQR9RMTyBqtIXKrzX7PDMQmZDsKHfWds7anI7Q==",
+ "requires": {
+ "@types/events": "1.2.0",
+ "@types/yeoman-generator": "1.0.4"
+ }
+ },
+ "@webcomponents/webcomponentsjs": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-1.2.0.tgz",
+ "integrity": "sha512-P9JWydfpBR+CK12UwtBaoD/lYF3PR9XBArAWk5J9nfPaJwA3OUox4StZmyFSVDLsvpFq5HsEtxU/OdHAlAWPnw==",
+ "dev": true
+ },
+ "abbrev": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz",
+ "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU="
+ },
+ "accepts": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
+ "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
+ "dev": true,
+ "requires": {
+ "mime-types": "2.1.18",
+ "negotiator": "0.6.1"
+ }
+ },
+ "accessibility-developer-tools": {
+ "version": "2.12.0",
+ "resolved": "https://registry.npmjs.org/accessibility-developer-tools/-/accessibility-developer-tools-2.12.0.tgz",
+ "integrity": "sha1-PaDM6dbsY3OWS4TzXbfPw996tRQ=",
+ "dev": true
+ },
+ "acorn": {
+ "version": "5.5.3",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz",
+ "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ=="
+ },
+ "acorn-import-meta": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/acorn-import-meta/-/acorn-import-meta-0.2.1.tgz",
+ "integrity": "sha512-+KB5Q0P0Q/XpsPHgnLx4XbCGqMogw4yiJJjYsbzPCNrE/IoX+c6J4C+BFcwdWh3CD1zLzMxPITN1jzHd+NiS3w==",
+ "dev": true,
+ "requires": {
+ "acorn": "5.5.3"
+ }
+ },
+ "acorn-jsx": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz",
+ "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=",
+ "requires": {
+ "acorn": "3.3.0"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
+ "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo="
+ }
+ }
+ },
+ "adm-zip": {
+ "version": "0.4.9",
+ "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.9.tgz",
+ "integrity": "sha512-eknaJ3Io/JasGGinVeqY5TsPlQgHbiNlHnK5zdFPRNs9XRggDykKz8zPesneOMEZJxWji7G3CfsUW0Ds9Dw0Bw==",
+ "dev": true,
+ "optional": true
+ },
+ "after": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz",
+ "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=",
+ "dev": true
+ },
+ "agent-base": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz",
+ "integrity": "sha1-1t4Q1a9hMtW9aSQn1G/FOFOQlMc=",
+ "dev": true,
+ "requires": {
+ "extend": "3.0.1",
+ "semver": "5.0.3"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz",
+ "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=",
+ "dev": true
+ }
+ }
+ },
+ "ajv": {
+ "version": "5.5.2",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+ "requires": {
+ "co": "4.6.0",
+ "fast-deep-equal": "1.1.0",
+ "fast-json-stable-stringify": "2.0.0",
+ "json-schema-traverse": "0.3.1"
+ }
+ },
+ "ajv-keywords": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz",
+ "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I="
+ },
+ "align-text": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
+ "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
+ "requires": {
+ "kind-of": "3.2.2",
+ "longest": "1.0.1",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "amdefine": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU="
+ },
+ "ansi-align": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-1.1.0.tgz",
+ "integrity": "sha1-LwwWWIKXOa3V67FeawxuNCPwFro=",
+ "dev": true,
+ "requires": {
+ "string-width": "1.0.2"
+ }
+ },
+ "ansi-colors": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
+ "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-escape-sequences": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-3.0.0.tgz",
+ "integrity": "sha1-HBg5S2r5t2/5pjUJ+kl2af0s5T4=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4"
+ }
+ },
+ "ansi-escapes": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz",
+ "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4="
+ },
+ "ansi-gray": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz",
+ "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+ },
+ "ansi-wrap": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
+ "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768="
+ },
+ "any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=",
+ "dev": true
+ },
+ "anymatch": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz",
+ "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==",
+ "dev": true,
+ "requires": {
+ "micromatch": "2.3.11",
+ "normalize-path": "2.1.1"
+ }
+ },
+ "append-field": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/append-field/-/append-field-0.1.0.tgz",
+ "integrity": "sha1-bdxY+gg8e8VF08WZWygwzCNm1Eo=",
+ "dev": true
+ },
+ "archiver": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/archiver/-/archiver-1.3.0.tgz",
+ "integrity": "sha1-TyGU1tj5nfP1MeaIHxTxXVX6ryI=",
+ "dev": true,
+ "requires": {
+ "archiver-utils": "1.3.0",
+ "async": "2.6.0",
+ "buffer-crc32": "0.2.13",
+ "glob": "7.1.2",
+ "lodash": "4.17.10",
+ "readable-stream": "2.3.6",
+ "tar-stream": "1.6.0",
+ "walkdir": "0.0.11",
+ "zip-stream": "1.2.0"
+ },
+ "dependencies": {
+ "async": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz",
+ "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==",
+ "dev": true,
+ "requires": {
+ "lodash": "4.17.10"
+ }
+ }
+ }
+ },
+ "archiver-utils": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz",
+ "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=",
+ "dev": true,
+ "requires": {
+ "glob": "7.1.2",
+ "graceful-fs": "4.1.11",
+ "lazystream": "1.0.0",
+ "lodash": "4.17.10",
+ "normalize-path": "2.1.1",
+ "readable-stream": "2.3.6"
+ }
+ },
+ "archy": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
+ "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA="
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "requires": {
+ "sprintf-js": "1.0.3"
+ }
+ },
+ "arr-diff": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
+ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
+ "requires": {
+ "arr-flatten": "1.1.0"
+ }
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg=="
+ },
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
+ },
+ "array-back": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
+ "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=",
+ "dev": true,
+ "requires": {
+ "typical": "2.6.1"
+ }
+ },
+ "array-differ": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz",
+ "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE="
+ },
+ "array-each": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz",
+ "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8="
+ },
+ "array-find-index": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
+ "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
+ "dev": true
+ },
+ "array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
+ "dev": true
+ },
+ "array-slice": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz",
+ "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w=="
+ },
+ "array-union": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+ "requires": {
+ "array-uniq": "1.0.3"
+ }
+ },
+ "array-uniq": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+ "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY="
+ },
+ "array-unique": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
+ "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM="
+ },
+ "arraybuffer.slice": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz",
+ "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==",
+ "dev": true
+ },
+ "arrify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0="
+ },
+ "asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=",
+ "dev": true
+ },
+ "asn1": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
+ "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=",
+ "dev": true
+ },
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true
+ },
+ "assertion-error": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
+ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw=="
+ },
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c="
+ },
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k="
+ },
+ "async-each": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
+ "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
+ "dev": true
+ },
+ "async-limiter": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
+ "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg=="
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+ "dev": true
+ },
+ "atob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz",
+ "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio="
+ },
+ "aws-sign2": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+ "dev": true
+ },
+ "aws4": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz",
+ "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "detect-indent": "4.0.0",
+ "jsesc": "1.3.0",
+ "lodash": "4.17.10",
+ "source-map": "0.5.7",
+ "trim-right": "1.0.1"
+ },
+ "dependencies": {
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ }
+ }
+ },
+ "babel-helper-evaluate-path": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.4.1.tgz",
+ "integrity": "sha1-a3XB4OMPFmKfKoZFyjBeGo01iaY=",
+ "dev": true
+ },
+ "babel-helper-flip-expressions": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.4.1.tgz",
+ "integrity": "sha1-zAPYBFjBA7n1BcHGpn++D1nKwyA=",
+ "dev": true
+ },
+ "babel-helper-is-nodes-equiv": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz",
+ "integrity": "sha1-NOmzALFHnd2Y7HfqC76TQt/jloQ=",
+ "dev": true
+ },
+ "babel-helper-is-void-0": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-is-void-0/-/babel-helper-is-void-0-0.4.1.tgz",
+ "integrity": "sha1-ogu127ocMMSq/nPrMn0tGLKE7Ro=",
+ "dev": true
+ },
+ "babel-helper-mark-eval-scopes": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.4.1.tgz",
+ "integrity": "sha1-A/nMmN76R0fnQS5wD069D+1ktXE=",
+ "dev": true
+ },
+ "babel-helper-remove-or-void": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.4.1.tgz",
+ "integrity": "sha1-rdWwiBeFOVESpw8PHCWRebFSQmo=",
+ "dev": true
+ },
+ "babel-helper-to-multiple-sequence-expressions": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.4.1.tgz",
+ "integrity": "sha1-FU7MOBGPXBybDp/CNd21OSFJvI8=",
+ "dev": true
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-minify-builtins": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.4.1.tgz",
+ "integrity": "sha1-d6iMt2EO2SWxsCVKmQJAKR4LC+A=",
+ "dev": true,
+ "requires": {
+ "babel-helper-evaluate-path": "0.4.1"
+ }
+ },
+ "babel-plugin-minify-constant-folding": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.4.1.tgz",
+ "integrity": "sha1-LtT4Ow/yj01VU9CcXvyFtdti0RI=",
+ "dev": true,
+ "requires": {
+ "babel-helper-evaluate-path": "0.4.1"
+ }
+ },
+ "babel-plugin-minify-dead-code-elimination": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.4.1.tgz",
+ "integrity": "sha1-81/PNIk06wqslEUCrTA3KRgu6yE=",
+ "dev": true,
+ "requires": {
+ "babel-helper-evaluate-path": "0.4.1",
+ "babel-helper-mark-eval-scopes": "0.4.1",
+ "babel-helper-remove-or-void": "0.4.1",
+ "lodash.some": "4.6.0"
+ }
+ },
+ "babel-plugin-minify-flip-comparisons": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.4.1.tgz",
+ "integrity": "sha1-5wfl2rxpXJnNKSP+lw7ZrHjE5ws=",
+ "dev": true,
+ "requires": {
+ "babel-helper-is-void-0": "0.4.1"
+ }
+ },
+ "babel-plugin-minify-guarded-expressions": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.4.1.tgz",
+ "integrity": "sha1-ylpZoGvBwi3Vz9mWpnUWOm9hm30=",
+ "dev": true,
+ "requires": {
+ "babel-helper-flip-expressions": "0.4.1"
+ }
+ },
+ "babel-plugin-minify-infinity": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.4.1.tgz",
+ "integrity": "sha1-zJw33MFmbcB/HrR4wrchoRz7lJE=",
+ "dev": true
+ },
+ "babel-plugin-minify-mangle-names": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.4.1.tgz",
+ "integrity": "sha1-d76P7TUOkxo6qaCfl/KCYWgIMTM=",
+ "dev": true,
+ "requires": {
+ "babel-helper-mark-eval-scopes": "0.4.1"
+ }
+ },
+ "babel-plugin-minify-numeric-literals": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.4.1.tgz",
+ "integrity": "sha1-lktObMdIfG1KMalRl8P0IbYMmkc=",
+ "dev": true
+ },
+ "babel-plugin-minify-replace": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.4.1.tgz",
+ "integrity": "sha1-xRnYhYxiKySWo2SmE1rSd1V42UM=",
+ "dev": true
+ },
+ "babel-plugin-minify-simplify": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.4.1.tgz",
+ "integrity": "sha1-XlX0ibLV8CyQjCswm/CBTxXHV74=",
+ "dev": true,
+ "requires": {
+ "babel-helper-flip-expressions": "0.4.1",
+ "babel-helper-is-nodes-equiv": "0.0.1",
+ "babel-helper-to-multiple-sequence-expressions": "0.4.1"
+ }
+ },
+ "babel-plugin-minify-type-constructors": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.4.1.tgz",
+ "integrity": "sha1-eSJNE0bDPk+kQnVqI0JkkVjvlEg=",
+ "dev": true,
+ "requires": {
+ "babel-helper-is-void-0": "0.4.1"
+ }
+ },
+ "babel-plugin-transform-inline-consecutive-adds": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.4.1.tgz",
+ "integrity": "sha1-F13t/odsL/enjHUe1NncBZfRFx0=",
+ "dev": true
+ },
+ "babel-plugin-transform-member-expression-literals": {
+ "version": "6.10.0-alpha.f95869d4",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.10.0-alpha.f95869d4.tgz",
+ "integrity": "sha1-Jy69Ki1DQbhsJNzYQ3SuWqNwKHQ=",
+ "dev": true
+ },
+ "babel-plugin-transform-merge-sibling-variables": {
+ "version": "6.10.0-alpha.f95869d4",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.10.0-alpha.f95869d4.tgz",
+ "integrity": "sha1-SKMw0oKT4xjQcXXCYMdIWec5i0M=",
+ "dev": true
+ },
+ "babel-plugin-transform-minify-booleans": {
+ "version": "6.10.0-alpha.f95869d4",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.10.0-alpha.f95869d4.tgz",
+ "integrity": "sha1-He72nCITUDipHeH10T11njRkxDw=",
+ "dev": true
+ },
+ "babel-plugin-transform-property-literals": {
+ "version": "6.10.0-alpha.f95869d4",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.10.0-alpha.f95869d4.tgz",
+ "integrity": "sha1-NxJ6qgQSXD0Iv5XNtajx0uRMpFM=",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "babel-plugin-transform-regexp-constructors": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.4.1.tgz",
+ "integrity": "sha1-T/fx2g4MMZENDhRhq+0MZ5yzHu4=",
+ "dev": true
+ },
+ "babel-plugin-transform-remove-console": {
+ "version": "6.10.0-alpha.f95869d4",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.10.0-alpha.f95869d4.tgz",
+ "integrity": "sha1-xXF6+fdpGLKCHPrvRNgkXU6pQiw=",
+ "dev": true
+ },
+ "babel-plugin-transform-remove-debugger": {
+ "version": "6.10.0-alpha.f95869d4",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.10.0-alpha.f95869d4.tgz",
+ "integrity": "sha1-H8NcKcfAh4zzDlWKczZRkG6IjkQ=",
+ "dev": true
+ },
+ "babel-plugin-transform-remove-undefined": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.4.1.tgz",
+ "integrity": "sha1-Y2x/KM66/Fpm+jT5TGCAR+r3508=",
+ "dev": true,
+ "requires": {
+ "babel-helper-evaluate-path": "0.4.1"
+ }
+ },
+ "babel-plugin-transform-simplify-comparison-operators": {
+ "version": "6.10.0-alpha.f95869d4",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.10.0-alpha.f95869d4.tgz",
+ "integrity": "sha1-9UmabcPtaGvaUzY4ZrZ92ndMW+0=",
+ "dev": true
+ },
+ "babel-plugin-transform-undefined-to-void": {
+ "version": "6.10.0-alpha.f95869d4",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.10.0-alpha.f95869d4.tgz",
+ "integrity": "sha1-F1oaMJDmFkA/jIGc3Ooa7LZlI7I=",
+ "dev": true
+ },
+ "babel-preset-minify": {
+ "version": "0.4.0-alpha.caaefb4c",
+ "resolved": "https://registry.npmjs.org/babel-preset-minify/-/babel-preset-minify-0.4.0-alpha.caaefb4c.tgz",
+ "integrity": "sha1-pQUsWVXdl9JGmbKB/amjAuqMGHE=",
+ "dev": true,
+ "requires": {
+ "babel-plugin-minify-builtins": "0.4.1",
+ "babel-plugin-minify-constant-folding": "0.4.1",
+ "babel-plugin-minify-dead-code-elimination": "0.4.1",
+ "babel-plugin-minify-flip-comparisons": "0.4.1",
+ "babel-plugin-minify-guarded-expressions": "0.4.1",
+ "babel-plugin-minify-infinity": "0.4.1",
+ "babel-plugin-minify-mangle-names": "0.4.1",
+ "babel-plugin-minify-numeric-literals": "0.4.1",
+ "babel-plugin-minify-replace": "0.4.1",
+ "babel-plugin-minify-simplify": "0.4.1",
+ "babel-plugin-minify-type-constructors": "0.4.1",
+ "babel-plugin-transform-inline-consecutive-adds": "0.4.1",
+ "babel-plugin-transform-member-expression-literals": "6.10.0-alpha.f95869d4",
+ "babel-plugin-transform-merge-sibling-variables": "6.10.0-alpha.f95869d4",
+ "babel-plugin-transform-minify-booleans": "6.10.0-alpha.f95869d4",
+ "babel-plugin-transform-property-literals": "6.10.0-alpha.f95869d4",
+ "babel-plugin-transform-regexp-constructors": "0.4.1",
+ "babel-plugin-transform-remove-console": "6.10.0-alpha.f95869d4",
+ "babel-plugin-transform-remove-debugger": "6.10.0-alpha.f95869d4",
+ "babel-plugin-transform-remove-undefined": "0.4.1",
+ "babel-plugin-transform-simplify-comparison-operators": "6.10.0-alpha.f95869d4",
+ "babel-plugin-transform-undefined-to-void": "6.10.0-alpha.f95869d4",
+ "lodash.isplainobject": "4.0.6"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "requires": {
+ "core-js": "2.5.6",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "babylon": "6.18.0",
+ "debug": "2.6.9",
+ "globals": "9.18.0",
+ "invariant": "2.2.4",
+ "lodash": "4.17.10"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ=="
+ },
+ "backo2": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
+ "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "requires": {
+ "cache-base": "1.0.1",
+ "class-utils": "0.3.6",
+ "component-emitter": "1.2.1",
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "mixin-deep": "1.3.1",
+ "pascalcase": "0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+ }
+ }
+ },
+ "base64-arraybuffer": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz",
+ "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=",
+ "dev": true
+ },
+ "base64-js": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.0.tgz",
+ "integrity": "sha1-o5mS1yNYSBGYK+XikLtqU9hnAPE=",
+ "dev": true,
+ "optional": true
+ },
+ "base64id": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz",
+ "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=",
+ "dev": true
+ },
+ "bcrypt-pbkdf": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz",
+ "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "tweetnacl": "0.14.5"
+ }
+ },
+ "beeper": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz",
+ "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak="
+ },
+ "better-assert": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz",
+ "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=",
+ "dev": true,
+ "requires": {
+ "callsite": "1.0.0"
+ }
+ },
+ "binary-extensions": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz",
+ "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=",
+ "dev": true
+ },
+ "binaryextensions": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.1.1.tgz",
+ "integrity": "sha512-XBaoWE9RW8pPdPQNibZsW2zh8TW6gcarXp1FZPwT8Uop8ScSNldJEWf2k9l3HeTqdrEwsOsFcq74RiJECW34yA=="
+ },
+ "bl": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz",
+ "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.6",
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "blob": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz",
+ "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=",
+ "dev": true
+ },
+ "body-parser": {
+ "version": "1.18.2",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz",
+ "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=",
+ "dev": true,
+ "requires": {
+ "bytes": "3.0.0",
+ "content-type": "1.0.4",
+ "debug": "2.6.9",
+ "depd": "1.1.2",
+ "http-errors": "1.6.3",
+ "iconv-lite": "0.4.19",
+ "on-finished": "2.3.0",
+ "qs": "6.5.1",
+ "raw-body": "2.3.2",
+ "type-is": "1.6.16"
+ },
+ "dependencies": {
+ "iconv-lite": {
+ "version": "0.4.19",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
+ "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==",
+ "dev": true
+ },
+ "qs": {
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
+ "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==",
+ "dev": true
+ }
+ }
+ },
+ "boom": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz",
+ "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=",
+ "dev": true,
+ "requires": {
+ "hoek": "4.2.1"
+ }
+ },
+ "bower": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.2.tgz",
+ "integrity": "sha1-rfU1KcjUrwLvJPuNU0HBQZ0z4vc=",
+ "dev": true
+ },
+ "bower-config": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/bower-config/-/bower-config-1.4.1.tgz",
+ "integrity": "sha1-hf2d82fCuNu9DKpMXyutQM2Ewsw=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "mout": "1.1.0",
+ "optimist": "0.6.1",
+ "osenv": "0.1.5",
+ "untildify": "2.1.0"
+ }
+ },
+ "bower-json": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/bower-json/-/bower-json-0.8.1.tgz",
+ "integrity": "sha1-lsFHIyQa5kZqnFLhbKoyYjqIOEM=",
+ "dev": true,
+ "requires": {
+ "deep-extend": "0.4.2",
+ "ext-name": "3.0.0",
+ "graceful-fs": "4.1.11",
+ "intersect": "1.0.1"
+ }
+ },
+ "bower-logger": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/bower-logger/-/bower-logger-0.2.2.tgz",
+ "integrity": "sha1-Ob4H6Xmy/I4DqUY0IF7ZQiNz04E=",
+ "dev": true
+ },
+ "boxen": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/boxen/-/boxen-0.6.0.tgz",
+ "integrity": "sha1-g2TUJIrDT/DvGy8r9JpsYM4NgbY=",
+ "dev": true,
+ "requires": {
+ "ansi-align": "1.1.0",
+ "camelcase": "2.1.1",
+ "chalk": "1.1.3",
+ "cli-boxes": "1.0.0",
+ "filled-array": "1.1.0",
+ "object-assign": "4.1.1",
+ "repeating": "2.0.1",
+ "string-width": "1.0.2",
+ "widest-line": "1.0.0"
+ }
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "1.8.5",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
+ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
+ "requires": {
+ "expand-range": "1.8.2",
+ "preserve": "0.2.0",
+ "repeat-element": "1.1.2"
+ }
+ },
+ "browser-capabilities": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/browser-capabilities/-/browser-capabilities-1.1.0.tgz",
+ "integrity": "sha512-D0AhTybfR0KbVxy1DShQut4eCeluMyJhbTgVTIxvItJKzEGG9pNvOBFZfpeCASo2z0XdfczuvSfNZe/vmNlqwQ==",
+ "dev": true,
+ "requires": {
+ "@types/ua-parser-js": "0.7.32",
+ "ua-parser-js": "0.7.18"
+ }
+ },
+ "browser-stdout": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz",
+ "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8="
+ },
+ "browserify-zlib": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz",
+ "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=",
+ "dev": true,
+ "requires": {
+ "pako": "0.2.9"
+ }
+ },
+ "browserstack": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.5.0.tgz",
+ "integrity": "sha1-tWVCWtYu1ywQgqHrl51TE8fUdU8=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "https-proxy-agent": "1.0.0"
+ }
+ },
+ "buffer-alloc": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.1.0.tgz",
+ "integrity": "sha1-BVFNM78WVtNUDGhPZbEgLpDsowM=",
+ "dev": true,
+ "requires": {
+ "buffer-alloc-unsafe": "0.1.1",
+ "buffer-fill": "0.1.1"
+ }
+ },
+ "buffer-alloc-unsafe": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-0.1.1.tgz",
+ "integrity": "sha1-/+H2dVHdBVc33iUzN7/oU9+rGmo=",
+ "dev": true
+ },
+ "buffer-crc32": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+ "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
+ "dev": true
+ },
+ "buffer-fill": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-0.1.1.tgz",
+ "integrity": "sha512-YgBMBzdRLEfgxJIGu2wrvI2E03tMCFU1p7d1KhB4BOoMN0VxmTFjSyN5JtKt9z8Z9JajMHruI6SE25W96wNv7Q==",
+ "dev": true
+ },
+ "buffer-from": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz",
+ "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA=="
+ },
+ "builtin-modules": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8="
+ },
+ "busboy": {
+ "version": "0.2.14",
+ "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz",
+ "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=",
+ "dev": true,
+ "requires": {
+ "dicer": "0.2.5",
+ "readable-stream": "1.1.14"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ }
+ }
+ },
+ "bytes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
+ "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
+ "dev": true
+ },
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "requires": {
+ "collection-visit": "1.0.0",
+ "component-emitter": "1.2.1",
+ "get-value": "2.0.6",
+ "has-value": "1.0.0",
+ "isobject": "3.0.1",
+ "set-value": "2.0.0",
+ "to-object-path": "0.3.0",
+ "union-value": "1.0.0",
+ "unset-value": "1.0.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ }
+ }
+ },
+ "call-me-maybe": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
+ "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=",
+ "dev": true
+ },
+ "caller-path": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
+ "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
+ "requires": {
+ "callsites": "0.2.0"
+ }
+ },
+ "callsite": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
+ "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=",
+ "dev": true
+ },
+ "callsites": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
+ "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo="
+ },
+ "camel-case": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz",
+ "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=",
+ "dev": true,
+ "requires": {
+ "no-case": "2.3.2",
+ "upper-case": "1.1.3"
+ }
+ },
+ "camelcase": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+ "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+ "dev": true
+ },
+ "camelcase-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+ "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+ "dev": true,
+ "requires": {
+ "camelcase": "2.1.1",
+ "map-obj": "1.0.1"
+ }
+ },
+ "cancel-token": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/cancel-token/-/cancel-token-0.1.1.tgz",
+ "integrity": "sha1-wYGXZ0uxyEwdaTPr8V2NWlznm08=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "capture-stack-trace": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz",
+ "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0="
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+ "dev": true
+ },
+ "center-align": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
+ "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
+ "optional": true,
+ "requires": {
+ "align-text": "0.1.4",
+ "lazy-cache": "1.0.4"
+ }
+ },
+ "chai": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz",
+ "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=",
+ "requires": {
+ "assertion-error": "1.1.0",
+ "deep-eql": "0.1.3",
+ "type-detect": "1.0.0"
+ }
+ },
+ "chai-subset": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/chai-subset/-/chai-subset-1.6.0.tgz",
+ "integrity": "sha1-pdDKFOMpp5WW7XAFi2ZGvWmIz+k="
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "chardet": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz",
+ "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I="
+ },
+ "charenc": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
+ "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=",
+ "dev": true
+ },
+ "check-error": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
+ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
+ "dev": true
+ },
+ "chokidar": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
+ "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
+ "dev": true,
+ "requires": {
+ "anymatch": "1.3.2",
+ "async-each": "1.0.1",
+ "fsevents": "1.2.3",
+ "glob-parent": "2.0.0",
+ "inherits": "2.0.3",
+ "is-binary-path": "1.0.1",
+ "is-glob": "2.0.1",
+ "path-is-absolute": "1.0.1",
+ "readdirp": "2.1.0"
+ }
+ },
+ "chownr": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz",
+ "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=",
+ "dev": true
+ },
+ "ci-info": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz",
+ "integrity": "sha512-SK/846h/Rcy8q9Z9CAwGBLfCJ6EkjJWdpelWDufQpqVDYq2Wnnv8zlSO6AMQap02jvhVruKKpEtQOufo3pFhLg==",
+ "dev": true
+ },
+ "circular-json": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
+ "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A=="
+ },
+ "clang-format": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.1.0.tgz",
+ "integrity": "sha512-0Aru49uTLoROl4sPTyO3fvF/NZ+fnGEy5i7bsRwA/bAYT+eWaAxK3sDxRvm/AW7Nwq83BvARH/npeF8OIAaGVQ==",
+ "requires": {
+ "async": "1.5.2",
+ "glob": "7.1.2",
+ "resolve": "1.7.1"
+ },
+ "dependencies": {
+ "async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo="
+ }
+ }
+ },
+ "class-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/class-extend/-/class-extend-0.1.2.tgz",
+ "integrity": "sha1-gFeoKwD1P4Kl1ixQ74z/3sb6vDQ=",
+ "requires": {
+ "object-assign": "2.1.1"
+ },
+ "dependencies": {
+ "object-assign": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz",
+ "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo="
+ }
+ }
+ },
+ "class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "requires": {
+ "arr-union": "3.1.0",
+ "define-property": "0.2.5",
+ "isobject": "3.0.1",
+ "static-extend": "0.1.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ }
+ }
+ },
+ "clean-css": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz",
+ "integrity": "sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo=",
+ "dev": true,
+ "requires": {
+ "source-map": "0.5.7"
+ }
+ },
+ "cleankill": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/cleankill/-/cleankill-2.0.0.tgz",
+ "integrity": "sha1-WYMN/ItBHVPccq0J1Fp46jMWGpE=",
+ "dev": true
+ },
+ "cli-boxes": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz",
+ "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=",
+ "dev": true
+ },
+ "cli-cursor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz",
+ "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=",
+ "requires": {
+ "restore-cursor": "1.0.1"
+ }
+ },
+ "cli-table": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz",
+ "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=",
+ "requires": {
+ "colors": "1.0.3"
+ }
+ },
+ "cli-width": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
+ "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk="
+ },
+ "cliui": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+ "requires": {
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1",
+ "wrap-ansi": "2.1.0"
+ }
+ },
+ "clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4="
+ },
+ "clone-buffer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
+ "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg="
+ },
+ "clone-stats": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
+ "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE="
+ },
+ "cloneable-readable": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz",
+ "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==",
+ "requires": {
+ "inherits": "2.0.3",
+ "process-nextick-args": "2.0.0",
+ "readable-stream": "2.3.6"
+ }
+ },
+ "co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
+ },
+ "code-point-at": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "requires": {
+ "map-visit": "1.0.0",
+ "object-visit": "1.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
+ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+ },
+ "color-support": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
+ "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg=="
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs="
+ },
+ "combined-stream": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
+ "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
+ "dev": true,
+ "requires": {
+ "delayed-stream": "1.0.0"
+ }
+ },
+ "command-line-args": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-3.0.5.tgz",
+ "integrity": "sha1-W9StReeYPlwTRJGOQCgO4mk8WsA=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "feature-detect-es6": "1.4.0",
+ "find-replace": "1.0.3",
+ "typical": "2.6.1"
+ }
+ },
+ "command-line-commands": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/command-line-commands/-/command-line-commands-1.0.4.tgz",
+ "integrity": "sha1-A0+bFntRiK+9z2su+7FQ/IRCwys=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "feature-detect-es6": "1.4.0"
+ }
+ },
+ "command-line-usage": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-3.0.8.tgz",
+ "integrity": "sha1-tqIJeMGzg0d/XBGlKUKLiAv+D00=",
+ "dev": true,
+ "requires": {
+ "ansi-escape-sequences": "3.0.0",
+ "array-back": "1.0.4",
+ "feature-detect-es6": "1.4.0",
+ "table-layout": "0.3.0",
+ "typical": "2.6.1"
+ }
+ },
+ "commander": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz",
+ "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=",
+ "requires": {
+ "graceful-readlink": "1.0.1"
+ }
+ },
+ "commondir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs="
+ },
+ "component-bind": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
+ "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=",
+ "dev": true
+ },
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
+ },
+ "component-inherit": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
+ "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=",
+ "dev": true
+ },
+ "compress-commons": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz",
+ "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=",
+ "dev": true,
+ "requires": {
+ "buffer-crc32": "0.2.13",
+ "crc32-stream": "2.0.0",
+ "normalize-path": "2.1.1",
+ "readable-stream": "2.3.6"
+ }
+ },
+ "compressible": {
+ "version": "2.0.13",
+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.13.tgz",
+ "integrity": "sha1-DRAgq5JLL9tNYnmHXH1tq6a6p6k=",
+ "dev": true,
+ "requires": {
+ "mime-db": "1.33.0"
+ }
+ },
+ "compression": {
+ "version": "1.7.2",
+ "resolved": "http://registry.npmjs.org/compression/-/compression-1.7.2.tgz",
+ "integrity": "sha1-qv+81qr4VLROuygDU9WtFlH1mmk=",
+ "dev": true,
+ "requires": {
+ "accepts": "1.3.5",
+ "bytes": "3.0.0",
+ "compressible": "2.0.13",
+ "debug": "2.6.9",
+ "on-headers": "1.0.1",
+ "safe-buffer": "5.1.1",
+ "vary": "1.1.2"
+ },
+ "dependencies": {
+ "safe-buffer": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
+ "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
+ "dev": true
+ }
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+ },
+ "concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "requires": {
+ "buffer-from": "1.0.0",
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.6",
+ "typedarray": "0.0.6"
+ }
+ },
+ "configstore": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/configstore/-/configstore-2.1.0.tgz",
+ "integrity": "sha1-c3o6cDbpiGECqmCZ5HuzOrGroaE=",
+ "dev": true,
+ "requires": {
+ "dot-prop": "3.0.0",
+ "graceful-fs": "4.1.11",
+ "mkdirp": "0.5.1",
+ "object-assign": "4.1.1",
+ "os-tmpdir": "1.0.2",
+ "osenv": "0.1.5",
+ "uuid": "2.0.3",
+ "write-file-atomic": "1.3.4",
+ "xdg-basedir": "2.0.0"
+ },
+ "dependencies": {
+ "uuid": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz",
+ "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=",
+ "dev": true
+ }
+ }
+ },
+ "content-disposition": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
+ "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=",
+ "dev": true
+ },
+ "content-type": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
+ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
+ "dev": true
+ },
+ "convert-source-map": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz",
+ "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU="
+ },
+ "cookie": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
+ "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=",
+ "dev": true
+ },
+ "cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
+ "dev": true
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40="
+ },
+ "core-js": {
+ "version": "2.5.6",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.6.tgz",
+ "integrity": "sha512-lQUVfQi0aLix2xpyjrrJEvfuYCqPc/HwmTKsC/VNf8q0zsjX7SQZtp4+oRONN5Tsur9GDETPjj+Ub2iDiGZfSQ=="
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
+ },
+ "crc": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/crc/-/crc-3.2.1.tgz",
+ "integrity": "sha1-XZyPt3okXNXsopHl0tAFM0urAII=",
+ "dev": true
+ },
+ "crc32-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz",
+ "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=",
+ "dev": true,
+ "requires": {
+ "crc": "3.5.0",
+ "readable-stream": "2.3.6"
+ },
+ "dependencies": {
+ "crc": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/crc/-/crc-3.5.0.tgz",
+ "integrity": "sha1-mLi6fUiWZbo5efWbITgTdBAaGWQ=",
+ "dev": true
+ }
+ }
+ },
+ "create-error-class": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz",
+ "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=",
+ "requires": {
+ "capture-stack-trace": "1.0.0"
+ }
+ },
+ "cross-spawn": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+ "requires": {
+ "lru-cache": "4.1.3",
+ "shebang-command": "1.2.0",
+ "which": "1.3.0"
+ }
+ },
+ "crypt": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
+ "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=",
+ "dev": true
+ },
+ "cryptiles": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz",
+ "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=",
+ "dev": true,
+ "requires": {
+ "boom": "5.2.0"
+ },
+ "dependencies": {
+ "boom": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz",
+ "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==",
+ "dev": true,
+ "requires": {
+ "hoek": "4.2.1"
+ }
+ }
+ }
+ },
+ "crypto-random-string": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz",
+ "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=",
+ "dev": true
+ },
+ "css-slam": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/css-slam/-/css-slam-2.1.1.tgz",
+ "integrity": "sha512-CyPOtUEykoRkp+1dLJyfsl0CPRzuHfwFVwuZ8DCuVjunoG1LUUwEFlOg3XfKKpz6t3O/tgiSMRxoiYdEEXIQVA==",
+ "dev": true,
+ "requires": {
+ "command-line-args": "3.0.5",
+ "command-line-usage": "3.0.8",
+ "dom5": "3.0.0",
+ "parse5": "4.0.0",
+ "shady-css-parser": "0.1.0"
+ }
+ },
+ "css-what": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz",
+ "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=",
+ "dev": true
+ },
+ "cssbeautify": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz",
+ "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=",
+ "dev": true
+ },
+ "currently-unhandled": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
+ "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
+ "dev": true,
+ "requires": {
+ "array-find-index": "1.0.2"
+ }
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "dargs": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/dargs/-/dargs-5.1.0.tgz",
+ "integrity": "sha1-7H6lDHhWTNNsnV7Bj2Yyn63ieCk="
+ },
+ "dashdash": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0"
+ }
+ },
+ "dateformat": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz",
+ "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI="
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
+ },
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU="
+ },
+ "deep-eql": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz",
+ "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=",
+ "requires": {
+ "type-detect": "0.1.1"
+ },
+ "dependencies": {
+ "type-detect": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz",
+ "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI="
+ }
+ }
+ },
+ "deep-extend": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz",
+ "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8="
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
+ },
+ "defaults": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
+ "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
+ "requires": {
+ "clone": "1.0.4"
+ }
+ },
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "requires": {
+ "is-descriptor": "1.0.2",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+ }
+ }
+ },
+ "del": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz",
+ "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=",
+ "dev": true,
+ "requires": {
+ "globby": "6.1.0",
+ "is-path-cwd": "1.0.0",
+ "is-path-in-cwd": "1.0.1",
+ "p-map": "1.2.0",
+ "pify": "3.0.0",
+ "rimraf": "2.6.2"
+ },
+ "dependencies": {
+ "globby": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
+ "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
+ "dev": true,
+ "requires": {
+ "array-union": "1.0.2",
+ "glob": "7.1.2",
+ "object-assign": "4.1.1",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ }
+ }
+ },
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "dev": true
+ }
+ }
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+ "dev": true
+ },
+ "depcheck": {
+ "version": "0.6.9",
+ "resolved": "https://registry.npmjs.org/depcheck/-/depcheck-0.6.9.tgz",
+ "integrity": "sha1-7+b99c8AwhcoEbwqJAPVnlNB5Rk=",
+ "requires": {
+ "babel-traverse": "6.26.0",
+ "babylon": "6.18.0",
+ "builtin-modules": "1.1.1",
+ "deprecate": "1.0.0",
+ "deps-regex": "0.1.4",
+ "js-yaml": "3.11.0",
+ "lodash": "4.17.10",
+ "minimatch": "3.0.4",
+ "require-package-name": "2.0.1",
+ "walkdir": "0.0.11",
+ "yargs": "8.0.2"
+ }
+ },
+ "depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
+ "dev": true
+ },
+ "deprecate": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/deprecate/-/deprecate-1.0.0.tgz",
+ "integrity": "sha1-ZhSQ7SQokWpsiIPYg05WRvTkpKg="
+ },
+ "deprecated": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz",
+ "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk="
+ },
+ "deps-regex": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deps-regex/-/deps-regex-0.1.4.tgz",
+ "integrity": "sha1-UYZnt2kUYKXn4KNBvnbrfOgJAYQ="
+ },
+ "destroy": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
+ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
+ "dev": true
+ },
+ "detect-conflict": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/detect-conflict/-/detect-conflict-1.0.1.tgz",
+ "integrity": "sha1-CIZXpmqWHAUBnbfEIwiDsca0F24="
+ },
+ "detect-file": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-0.1.0.tgz",
+ "integrity": "sha1-STXe39lIhkjgBrASlWbpOGcR6mM=",
+ "dev": true,
+ "requires": {
+ "fs-exists-sync": "0.1.0"
+ }
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "detect-node": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz",
+ "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=",
+ "dev": true
+ },
+ "dicer": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz",
+ "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "1.1.14",
+ "streamsearch": "0.1.2"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ }
+ }
+ },
+ "diff": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-2.2.3.tgz",
+ "integrity": "sha1-YOr9DSjukG5Oj/ClLBIpUhAzv5k="
+ },
+ "dir-glob": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz",
+ "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==",
+ "dev": true,
+ "requires": {
+ "arrify": "1.0.1",
+ "path-type": "3.0.0"
+ },
+ "dependencies": {
+ "path-type": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
+ "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
+ "dev": true,
+ "requires": {
+ "pify": "3.0.0"
+ }
+ },
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "dev": true
+ }
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "dom-urls": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/dom-urls/-/dom-urls-1.1.0.tgz",
+ "integrity": "sha1-AB3fgWKM0ecGElxxdvU8zsVdkY4=",
+ "dev": true,
+ "requires": {
+ "urijs": "1.19.1"
+ }
+ },
+ "dom5": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.0.tgz",
+ "integrity": "sha512-PbE+7C4Sh1dHDTLNuSDaMUGD1ivDiSZw0L+a9xVUzUKeQ8w3vdzfKHRA07CxcrFZZOa1SGl2nIJ9T49j63q+bg==",
+ "dev": true,
+ "requires": {
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.1",
+ "parse5": "4.0.0"
+ },
+ "dependencies": {
+ "clone": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+ "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
+ "dev": true
+ }
+ }
+ },
+ "dot-prop": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz",
+ "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=",
+ "dev": true,
+ "requires": {
+ "is-obj": "1.0.1"
+ }
+ },
+ "duplexer2": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
+ "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.6"
+ }
+ },
+ "duplexer3": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
+ "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI="
+ },
+ "duplexify": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz",
+ "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==",
+ "requires": {
+ "end-of-stream": "1.4.1",
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.6",
+ "stream-shift": "1.0.0"
+ }
+ },
+ "ecc-jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
+ "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "jsbn": "0.1.1"
+ }
+ },
+ "editions": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/editions/-/editions-1.3.4.tgz",
+ "integrity": "sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg=="
+ },
+ "ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
+ "dev": true
+ },
+ "ejs": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz",
+ "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ=="
+ },
+ "emitter-component": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/emitter-component/-/emitter-component-1.1.1.tgz",
+ "integrity": "sha1-Bl4tvtaVm/RwZ57avq95gdEAOrY=",
+ "dev": true
+ },
+ "encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
+ "dev": true
+ },
+ "end-of-stream": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
+ "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
+ "requires": {
+ "once": "1.4.0"
+ }
+ },
+ "ends-with": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/ends-with/-/ends-with-0.2.0.tgz",
+ "integrity": "sha1-L52pjVelDP2kVxzkM5AAUA9Oa4o=",
+ "dev": true
+ },
+ "engine.io": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.0.tgz",
+ "integrity": "sha512-mRbgmAtQ4GAlKwuPnnAvXXwdPhEx+jkc0OBCLrXuD/CRvwNK3AxRSnqK4FSqmAMRRHryVJP8TopOvmEaA64fKw==",
+ "dev": true,
+ "requires": {
+ "accepts": "1.3.5",
+ "base64id": "1.0.0",
+ "cookie": "0.3.1",
+ "debug": "3.1.0",
+ "engine.io-parser": "2.1.2",
+ "ws": "3.3.3"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "engine.io-client": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz",
+ "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==",
+ "dev": true,
+ "requires": {
+ "component-emitter": "1.2.1",
+ "component-inherit": "0.0.3",
+ "debug": "3.1.0",
+ "engine.io-parser": "2.1.2",
+ "has-cors": "1.1.0",
+ "indexof": "0.0.1",
+ "parseqs": "0.0.5",
+ "parseuri": "0.0.5",
+ "ws": "3.3.3",
+ "xmlhttprequest-ssl": "1.5.5",
+ "yeast": "0.1.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "engine.io-parser": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz",
+ "integrity": "sha512-dInLFzr80RijZ1rGpx1+56/uFoH7/7InhH3kZt+Ms6hT8tNx3NGW/WNSA/f8As1WkOfkuyb3tnRyuXGxusclMw==",
+ "dev": true,
+ "requires": {
+ "after": "0.8.2",
+ "arraybuffer.slice": "0.0.7",
+ "base64-arraybuffer": "0.1.5",
+ "blob": "0.0.4",
+ "has-binary2": "1.0.2"
+ }
+ },
+ "error": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/error/-/error-7.0.2.tgz",
+ "integrity": "sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI=",
+ "requires": {
+ "string-template": "0.2.1",
+ "xtend": "4.0.1"
+ }
+ },
+ "error-ex": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
+ "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
+ "requires": {
+ "is-arrayish": "0.2.1"
+ }
+ },
+ "es6-promise": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz",
+ "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ=="
+ },
+ "es6-promisify": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
+ "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
+ "requires": {
+ "es6-promise": "4.2.4"
+ }
+ },
+ "escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+ },
+ "escodegen": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz",
+ "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=",
+ "requires": {
+ "esprima": "2.7.3",
+ "estraverse": "1.9.3",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.2.0"
+ },
+ "dependencies": {
+ "esprima": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
+ "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE="
+ },
+ "source-map": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz",
+ "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=",
+ "optional": true,
+ "requires": {
+ "amdefine": "1.0.1"
+ }
+ }
+ }
+ },
+ "eslint": {
+ "version": "4.19.1",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz",
+ "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==",
+ "requires": {
+ "ajv": "5.5.2",
+ "babel-code-frame": "6.26.0",
+ "chalk": "2.4.1",
+ "concat-stream": "1.6.2",
+ "cross-spawn": "5.1.0",
+ "debug": "3.1.0",
+ "doctrine": "2.1.0",
+ "eslint-scope": "3.7.1",
+ "eslint-visitor-keys": "1.0.0",
+ "espree": "3.5.4",
+ "esquery": "1.0.1",
+ "esutils": "2.0.2",
+ "file-entry-cache": "2.0.0",
+ "functional-red-black-tree": "1.0.1",
+ "glob": "7.1.2",
+ "globals": "11.5.0",
+ "ignore": "3.3.8",
+ "imurmurhash": "0.1.4",
+ "inquirer": "3.3.0",
+ "is-resolvable": "1.1.0",
+ "js-yaml": "3.11.0",
+ "json-stable-stringify-without-jsonify": "1.0.1",
+ "levn": "0.3.0",
+ "lodash": "4.17.10",
+ "minimatch": "3.0.4",
+ "mkdirp": "0.5.1",
+ "natural-compare": "1.4.0",
+ "optionator": "0.8.2",
+ "path-is-inside": "1.0.2",
+ "pluralize": "7.0.0",
+ "progress": "2.0.0",
+ "regexpp": "1.1.0",
+ "require-uncached": "1.0.3",
+ "semver": "5.5.0",
+ "strip-ansi": "4.0.0",
+ "strip-json-comments": "2.0.1",
+ "table": "4.0.2",
+ "text-table": "0.2.0"
+ },
+ "dependencies": {
+ "ansi-escapes": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz",
+ "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw=="
+ },
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ },
+ "cli-cursor": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
+ "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
+ "requires": {
+ "restore-cursor": "2.0.0"
+ }
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "external-editor": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz",
+ "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==",
+ "requires": {
+ "chardet": "0.4.2",
+ "iconv-lite": "0.4.23",
+ "tmp": "0.0.33"
+ }
+ },
+ "figures": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
+ "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
+ "requires": {
+ "escape-string-regexp": "1.0.5"
+ }
+ },
+ "globals": {
+ "version": "11.5.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.5.0.tgz",
+ "integrity": "sha512-hYyf+kI8dm3nORsiiXUQigOU62hDLfJ9G01uyGMxhc6BKsircrUhC4uJPQPUSuq2GrTmiiEt7ewxlMdBewfmKQ=="
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+ },
+ "inquirer": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz",
+ "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==",
+ "requires": {
+ "ansi-escapes": "3.1.0",
+ "chalk": "2.4.1",
+ "cli-cursor": "2.1.0",
+ "cli-width": "2.2.0",
+ "external-editor": "2.2.0",
+ "figures": "2.0.0",
+ "lodash": "4.17.10",
+ "mute-stream": "0.0.7",
+ "run-async": "2.3.0",
+ "rx-lite": "4.0.8",
+ "rx-lite-aggregates": "4.0.8",
+ "string-width": "2.1.1",
+ "strip-ansi": "4.0.0",
+ "through": "2.3.8"
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
+ },
+ "mute-stream": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
+ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s="
+ },
+ "onetime": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
+ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
+ "requires": {
+ "mimic-fn": "1.2.0"
+ }
+ },
+ "restore-cursor": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
+ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
+ "requires": {
+ "onetime": "2.0.1",
+ "signal-exit": "3.0.2"
+ }
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "requires": {
+ "is-fullwidth-code-point": "2.0.0",
+ "strip-ansi": "4.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "requires": {
+ "ansi-regex": "3.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ },
+ "tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "requires": {
+ "os-tmpdir": "1.0.2"
+ }
+ }
+ }
+ },
+ "eslint-scope": {
+ "version": "3.7.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz",
+ "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=",
+ "requires": {
+ "esrecurse": "4.2.1",
+ "estraverse": "4.2.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM="
+ }
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
+ "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ=="
+ },
+ "espree": {
+ "version": "3.5.4",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz",
+ "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==",
+ "requires": {
+ "acorn": "5.5.3",
+ "acorn-jsx": "3.0.1"
+ }
+ },
+ "esprima": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
+ "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw=="
+ },
+ "esquery": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz",
+ "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==",
+ "requires": {
+ "estraverse": "4.2.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM="
+ }
+ }
+ },
+ "esrecurse": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
+ "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
+ "requires": {
+ "estraverse": "4.2.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM="
+ }
+ }
+ },
+ "estraverse": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz",
+ "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q="
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
+ },
+ "etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
+ "dev": true
+ },
+ "eventemitter3": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz",
+ "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==",
+ "dev": true
+ },
+ "execa": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
+ "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
+ "requires": {
+ "cross-spawn": "5.1.0",
+ "get-stream": "3.0.0",
+ "is-stream": "1.1.0",
+ "npm-run-path": "2.0.2",
+ "p-finally": "1.0.0",
+ "signal-exit": "3.0.2",
+ "strip-eof": "1.0.0"
+ }
+ },
+ "exit-hook": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz",
+ "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g="
+ },
+ "expand-brackets": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
+ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
+ "requires": {
+ "is-posix-bracket": "0.1.1"
+ }
+ },
+ "expand-range": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
+ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
+ "requires": {
+ "fill-range": "2.2.4"
+ }
+ },
+ "expand-tilde": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz",
+ "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=",
+ "dev": true,
+ "requires": {
+ "os-homedir": "1.0.2"
+ }
+ },
+ "express": {
+ "version": "4.16.3",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz",
+ "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=",
+ "dev": true,
+ "requires": {
+ "accepts": "1.3.5",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.18.2",
+ "content-disposition": "0.5.2",
+ "content-type": "1.0.4",
+ "cookie": "0.3.1",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "1.1.2",
+ "encodeurl": "1.0.2",
+ "escape-html": "1.0.3",
+ "etag": "1.8.1",
+ "finalhandler": "1.1.1",
+ "fresh": "0.5.2",
+ "merge-descriptors": "1.0.1",
+ "methods": "1.1.2",
+ "on-finished": "2.3.0",
+ "parseurl": "1.3.2",
+ "path-to-regexp": "0.1.7",
+ "proxy-addr": "2.0.3",
+ "qs": "6.5.1",
+ "range-parser": "1.2.0",
+ "safe-buffer": "5.1.1",
+ "send": "0.16.2",
+ "serve-static": "1.13.2",
+ "setprototypeof": "1.1.0",
+ "statuses": "1.4.0",
+ "type-is": "1.6.16",
+ "utils-merge": "1.0.1",
+ "vary": "1.1.2"
+ },
+ "dependencies": {
+ "mime": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
+ "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==",
+ "dev": true
+ },
+ "path-to-regexp": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+ "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
+ "dev": true
+ },
+ "qs": {
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
+ "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==",
+ "dev": true
+ },
+ "safe-buffer": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
+ "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
+ "dev": true
+ },
+ "send": {
+ "version": "0.16.2",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
+ "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "depd": "1.1.2",
+ "destroy": "1.0.4",
+ "encodeurl": "1.0.2",
+ "escape-html": "1.0.3",
+ "etag": "1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "1.6.3",
+ "mime": "1.4.1",
+ "ms": "2.0.0",
+ "on-finished": "2.3.0",
+ "range-parser": "1.2.0",
+ "statuses": "1.4.0"
+ }
+ }
+ }
+ },
+ "ext-list": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz",
+ "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==",
+ "dev": true,
+ "requires": {
+ "mime-db": "1.33.0"
+ }
+ },
+ "ext-name": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-3.0.0.tgz",
+ "integrity": "sha1-B+RBhzfLH1E8MsbqSNi4yOBHGrs=",
+ "dev": true,
+ "requires": {
+ "ends-with": "0.2.0",
+ "ext-list": "2.2.2",
+ "meow": "3.7.0",
+ "sort-keys-length": "1.0.1"
+ }
+ },
+ "extend": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
+ "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ="
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "requires": {
+ "assign-symbols": "1.0.0",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "external-editor": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-1.1.1.tgz",
+ "integrity": "sha1-Etew24UPf/fnCBuvQAVwAGDEYAs=",
+ "requires": {
+ "extend": "3.0.1",
+ "spawn-sync": "1.0.15",
+ "tmp": "0.0.29"
+ },
+ "dependencies": {
+ "tmp": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.29.tgz",
+ "integrity": "sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA=",
+ "requires": {
+ "os-tmpdir": "1.0.2"
+ }
+ }
+ }
+ },
+ "extglob": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
+ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ },
+ "extract-zip": {
+ "version": "1.6.6",
+ "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.6.tgz",
+ "integrity": "sha1-EpDt6NINCHK0Kf0/NRyhKOxe+Fw=",
+ "requires": {
+ "concat-stream": "1.6.0",
+ "debug": "2.6.9",
+ "mkdirp": "0.5.0",
+ "yauzl": "2.4.1"
+ },
+ "dependencies": {
+ "concat-stream": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz",
+ "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=",
+ "requires": {
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.6",
+ "typedarray": "0.0.6"
+ }
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
+ },
+ "mkdirp": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz",
+ "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=",
+ "requires": {
+ "minimist": "0.0.8"
+ }
+ }
+ }
+ },
+ "extsprintf": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
+ "dev": true
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fancy-log": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz",
+ "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=",
+ "requires": {
+ "ansi-gray": "0.1.1",
+ "color-support": "1.1.3",
+ "time-stamp": "1.1.0"
+ }
+ },
+ "fast-deep-equal": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
+ "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ="
+ },
+ "fast-glob": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.1.tgz",
+ "integrity": "sha512-wSyW1TBK3ia5V+te0rGPXudeMHoUQW6O5Y9oATiaGhpENmEifPDlOdhpsnlj5HoG6ttIvGiY1DdCmI9X2xGMhg==",
+ "dev": true,
+ "requires": {
+ "@mrmlnc/readdir-enhanced": "2.2.1",
+ "glob-parent": "3.1.0",
+ "is-glob": "4.0.0",
+ "merge2": "1.2.2",
+ "micromatch": "3.1.10"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-unique": "0.3.2",
+ "extend-shallow": "2.0.1",
+ "fill-range": "4.0.0",
+ "isobject": "3.0.1",
+ "repeat-element": "1.1.2",
+ "snapdragon": "0.8.2",
+ "snapdragon-node": "2.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "posix-character-classes": "0.1.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ }
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "expand-brackets": "2.1.4",
+ "extend-shallow": "2.0.1",
+ "fragment-cache": "0.2.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1",
+ "to-regex-range": "2.1.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "requires": {
+ "is-glob": "3.1.0",
+ "path-dirname": "1.0.2"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ }
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "braces": "2.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "extglob": "2.0.4",
+ "fragment-cache": "0.2.1",
+ "kind-of": "6.0.2",
+ "nanomatch": "1.2.9",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ }
+ }
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
+ "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
+ },
+ "fd-slicer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz",
+ "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=",
+ "requires": {
+ "pend": "1.2.0"
+ }
+ },
+ "feature-detect-es6": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/feature-detect-es6/-/feature-detect-es6-1.4.0.tgz",
+ "integrity": "sha512-7OnRV38WLydGuGcdm/fGk2SG9uo5ljslBSbPhCfEW5Gl0lX/IliaAVXYiYUBcI0UHTbepqO4T1SkJ74K8gtcDg==",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4"
+ }
+ },
+ "figures": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
+ "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
+ "requires": {
+ "escape-string-regexp": "1.0.5",
+ "object-assign": "4.1.1"
+ }
+ },
+ "file-entry-cache": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
+ "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
+ "requires": {
+ "flat-cache": "1.3.0",
+ "object-assign": "4.1.1"
+ }
+ },
+ "filename-regex": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
+ "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY="
+ },
+ "fill-range": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz",
+ "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==",
+ "requires": {
+ "is-number": "2.1.0",
+ "isobject": "2.1.0",
+ "randomatic": "3.0.0",
+ "repeat-element": "1.1.2",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "filled-array": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/filled-array/-/filled-array-1.1.0.tgz",
+ "integrity": "sha1-w8T2xmO5I0WamqKZEtLQMfFQf4Q=",
+ "dev": true
+ },
+ "finalhandler": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
+ "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "encodeurl": "1.0.2",
+ "escape-html": "1.0.3",
+ "on-finished": "2.3.0",
+ "parseurl": "1.3.2",
+ "statuses": "1.4.0",
+ "unpipe": "1.0.0"
+ }
+ },
+ "find-index": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz",
+ "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ="
+ },
+ "find-port": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/find-port/-/find-port-1.0.1.tgz",
+ "integrity": "sha1-2whKbL+ZVk2Zhprnn73s9m6KGFw=",
+ "dev": true,
+ "requires": {
+ "async": "0.2.10"
+ },
+ "dependencies": {
+ "async": {
+ "version": "0.2.10",
+ "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz",
+ "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=",
+ "dev": true
+ }
+ }
+ },
+ "find-replace": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz",
+ "integrity": "sha1-uI5zZNLZyVlVnziMZmcNYTBEH6A=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "test-value": "2.1.0"
+ }
+ },
+ "find-up": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+ "dev": true,
+ "requires": {
+ "path-exists": "2.1.0",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "findup-sync": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.4.3.tgz",
+ "integrity": "sha1-QAQ5Kee8YK3wt/SCfExudaDeyhI=",
+ "dev": true,
+ "requires": {
+ "detect-file": "0.1.0",
+ "is-glob": "2.0.1",
+ "micromatch": "2.3.11",
+ "resolve-dir": "0.1.1"
+ }
+ },
+ "fined": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz",
+ "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=",
+ "requires": {
+ "expand-tilde": "2.0.2",
+ "is-plain-object": "2.0.4",
+ "object.defaults": "1.1.0",
+ "object.pick": "1.3.0",
+ "parse-filepath": "1.0.2"
+ },
+ "dependencies": {
+ "expand-tilde": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
+ "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
+ "requires": {
+ "homedir-polyfill": "1.0.1"
+ }
+ }
+ }
+ },
+ "first-chunk-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz",
+ "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04="
+ },
+ "flagged-respawn": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.0.tgz",
+ "integrity": "sha1-Tnmumy6zi/hrO7Vr8+ClaqX8q9c="
+ },
+ "flat-cache": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz",
+ "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=",
+ "requires": {
+ "circular-json": "0.3.3",
+ "del": "2.2.2",
+ "graceful-fs": "4.1.11",
+ "write": "0.2.1"
+ },
+ "dependencies": {
+ "del": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
+ "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
+ "requires": {
+ "globby": "5.0.0",
+ "is-path-cwd": "1.0.0",
+ "is-path-in-cwd": "1.0.1",
+ "object-assign": "4.1.1",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1",
+ "rimraf": "2.6.2"
+ }
+ },
+ "globby": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
+ "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
+ "requires": {
+ "array-union": "1.0.2",
+ "arrify": "1.0.1",
+ "glob": "7.1.2",
+ "object-assign": "4.1.1",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1"
+ }
+ }
+ }
+ },
+ "follow-redirects": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-0.0.7.tgz",
+ "integrity": "sha1-NLkLqyqRGqNHVx2pDyK9NuzYqRk=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "stream-consume": "0.1.1"
+ }
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
+ },
+ "for-own": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
+ "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
+ "requires": {
+ "for-in": "1.0.2"
+ }
+ },
+ "forever-agent": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
+ "dev": true
+ },
+ "fork-stream": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/fork-stream/-/fork-stream-0.0.4.tgz",
+ "integrity": "sha1-24Sfznf2cIpfjzhq5TOgkHtUrnA=",
+ "dev": true
+ },
+ "form-data": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz",
+ "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=",
+ "dev": true,
+ "requires": {
+ "asynckit": "0.4.0",
+ "combined-stream": "1.0.6",
+ "mime-types": "2.1.18"
+ }
+ },
+ "formatio": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz",
+ "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=",
+ "requires": {
+ "samsam": "1.1.2"
+ }
+ },
+ "forwarded": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
+ "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
+ "dev": true
+ },
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "requires": {
+ "map-cache": "0.2.2"
+ }
+ },
+ "freeport": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/freeport/-/freeport-1.0.5.tgz",
+ "integrity": "sha1-JV6KuEFwwzuoXZkOghrl9KGpvF0=",
+ "dev": true,
+ "optional": true
+ },
+ "fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
+ "dev": true
+ },
+ "fs-constants": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
+ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
+ "dev": true
+ },
+ "fs-exists-sync": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz",
+ "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=",
+ "dev": true
+ },
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "4.0.0",
+ "universalify": "0.1.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+ },
+ "fsevents": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.3.tgz",
+ "integrity": "sha512-X+57O5YkDTiEQGiw8i7wYc2nQgweIekqkepI8Q3y4wVlurgBt2SuwxTeYUYMZIGpLZH3r/TsMjczCMXE5ZOt7Q==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "nan": "2.10.0",
+ "node-pre-gyp": "0.9.1"
+ },
+ "dependencies": {
+ "abbrev": {
+ "version": "1.1.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "bundled": true,
+ "dev": true
+ },
+ "aproba": {
+ "version": "1.2.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "are-we-there-yet": {
+ "version": "1.1.4",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "delegates": "1.0.0",
+ "readable-stream": "2.3.6"
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "chownr": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "code-point-at": {
+ "version": "1.1.0",
+ "bundled": true,
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "bundled": true,
+ "dev": true
+ },
+ "console-control-strings": {
+ "version": "1.1.0",
+ "bundled": true,
+ "dev": true
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "deep-extend": {
+ "version": "0.4.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "delegates": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "detect-libc": {
+ "version": "1.0.3",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "fs-minipass": {
+ "version": "1.2.5",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "minipass": "2.2.4"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "gauge": {
+ "version": "2.7.4",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "aproba": "1.2.0",
+ "console-control-strings": "1.1.0",
+ "has-unicode": "2.0.1",
+ "object-assign": "4.1.1",
+ "signal-exit": "3.0.2",
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1",
+ "wide-align": "1.1.2"
+ }
+ },
+ "glob": {
+ "version": "7.1.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "has-unicode": {
+ "version": "2.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "iconv-lite": {
+ "version": "0.4.21",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "safer-buffer": "2.1.2"
+ }
+ },
+ "ignore-walk": {
+ "version": "3.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "bundled": true,
+ "dev": true
+ },
+ "ini": {
+ "version": "1.3.5",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "bundled": true,
+ "dev": true
+ },
+ "minipass": {
+ "version": "2.2.4",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.1",
+ "yallist": "3.0.2"
+ }
+ },
+ "minizlib": {
+ "version": "1.1.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "minipass": "2.2.4"
+ }
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "needle": {
+ "version": "2.2.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "debug": "2.6.9",
+ "iconv-lite": "0.4.21",
+ "sax": "1.2.4"
+ }
+ },
+ "node-pre-gyp": {
+ "version": "0.9.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "detect-libc": "1.0.3",
+ "mkdirp": "0.5.1",
+ "needle": "2.2.0",
+ "nopt": "4.0.1",
+ "npm-packlist": "1.1.10",
+ "npmlog": "4.1.2",
+ "rc": "1.2.6",
+ "rimraf": "2.6.2",
+ "semver": "5.5.0",
+ "tar": "4.4.1"
+ }
+ },
+ "nopt": {
+ "version": "4.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "abbrev": "1.1.1",
+ "osenv": "0.1.5"
+ }
+ },
+ "npm-bundled": {
+ "version": "1.0.3",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "npm-packlist": {
+ "version": "1.1.10",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ignore-walk": "3.0.1",
+ "npm-bundled": "1.0.3"
+ }
+ },
+ "npmlog": {
+ "version": "4.1.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "are-we-there-yet": "1.1.4",
+ "console-control-strings": "1.1.0",
+ "gauge": "2.7.4",
+ "set-blocking": "2.0.0"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "osenv": {
+ "version": "0.1.5",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "os-homedir": "1.0.2",
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "process-nextick-args": {
+ "version": "2.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "rc": {
+ "version": "1.2.6",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "deep-extend": "0.4.2",
+ "ini": "1.3.5",
+ "minimist": "1.2.0",
+ "strip-json-comments": "2.0.1"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.0",
+ "safe-buffer": "5.1.1",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "rimraf": {
+ "version": "2.6.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "glob": "7.1.2"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.1",
+ "bundled": true,
+ "dev": true
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "sax": {
+ "version": "1.2.4",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "semver": {
+ "version": "5.5.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "safe-buffer": "5.1.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-json-comments": {
+ "version": "2.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "tar": {
+ "version": "4.4.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "chownr": "1.0.1",
+ "fs-minipass": "1.2.5",
+ "minipass": "2.2.4",
+ "minizlib": "1.1.0",
+ "mkdirp": "0.5.1",
+ "safe-buffer": "5.1.1",
+ "yallist": "3.0.2"
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "wide-align": {
+ "version": "1.1.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "string-width": "1.0.2"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true
+ },
+ "yallist": {
+ "version": "3.0.2",
+ "bundled": true,
+ "dev": true
+ }
+ }
+ },
+ "functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc="
+ },
+ "gaze": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz",
+ "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=",
+ "requires": {
+ "globule": "0.1.0"
+ }
+ },
+ "generate-function": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz",
+ "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=",
+ "dev": true,
+ "optional": true
+ },
+ "generate-object-property": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz",
+ "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-property": "1.0.2"
+ }
+ },
+ "get-caller-file": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz",
+ "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U="
+ },
+ "get-func-name": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
+ "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
+ "dev": true
+ },
+ "get-stdin": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
+ "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+ "dev": true
+ },
+ "get-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+ "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg="
+ },
+ "getpass": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0"
+ }
+ },
+ "gh-got": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/gh-got/-/gh-got-5.0.0.tgz",
+ "integrity": "sha1-7pW+NxBv2HSKlvjR20uuqJ4b+oo=",
+ "requires": {
+ "got": "6.7.1",
+ "is-plain-obj": "1.1.0"
+ },
+ "dependencies": {
+ "got": {
+ "version": "6.7.1",
+ "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz",
+ "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=",
+ "requires": {
+ "create-error-class": "3.0.2",
+ "duplexer3": "0.1.4",
+ "get-stream": "3.0.0",
+ "is-redirect": "1.0.0",
+ "is-retry-allowed": "1.1.0",
+ "is-stream": "1.1.0",
+ "lowercase-keys": "1.0.1",
+ "safe-buffer": "5.1.2",
+ "timed-out": "4.0.1",
+ "unzip-response": "2.0.1",
+ "url-parse-lax": "1.0.0"
+ }
+ },
+ "timed-out": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
+ "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8="
+ },
+ "unzip-response": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz",
+ "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c="
+ }
+ }
+ },
+ "github": {
+ "version": "7.3.2",
+ "resolved": "https://registry.npmjs.org/github/-/github-7.3.2.tgz",
+ "integrity": "sha1-/hDN5pZDUsXZHhGnYW0m1f+2+Hs=",
+ "dev": true,
+ "requires": {
+ "follow-redirects": "0.0.7",
+ "https-proxy-agent": "1.0.0",
+ "mime": "1.6.0",
+ "netrc": "0.1.4"
+ }
+ },
+ "github-username": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/github-username/-/github-username-3.0.0.tgz",
+ "integrity": "sha1-CnciGbMTB0NCnyRW0L3T21Xc57E=",
+ "requires": {
+ "gh-got": "5.0.0"
+ }
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-base": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
+ "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
+ "requires": {
+ "glob-parent": "2.0.0",
+ "is-glob": "2.0.1"
+ }
+ },
+ "glob-parent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
+ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
+ "requires": {
+ "is-glob": "2.0.1"
+ }
+ },
+ "glob-stream": {
+ "version": "5.3.5",
+ "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz",
+ "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=",
+ "requires": {
+ "extend": "3.0.1",
+ "glob": "5.0.15",
+ "glob-parent": "3.1.0",
+ "micromatch": "2.3.11",
+ "ordered-read-streams": "0.3.0",
+ "through2": "0.6.5",
+ "to-absolute-glob": "0.1.1",
+ "unique-stream": "2.2.1"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "5.0.15",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
+ "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
+ "requires": {
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "requires": {
+ "is-glob": "3.1.0",
+ "path-dirname": "1.0.2"
+ }
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
+ },
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "requires": {
+ "readable-stream": "1.0.34",
+ "xtend": "4.0.1"
+ }
+ }
+ }
+ },
+ "glob-to-regexp": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
+ "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
+ "dev": true
+ },
+ "glob-watcher": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz",
+ "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=",
+ "requires": {
+ "gaze": "0.5.2"
+ }
+ },
+ "glob2base": {
+ "version": "0.0.12",
+ "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz",
+ "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=",
+ "requires": {
+ "find-index": "0.1.1"
+ }
+ },
+ "global-dirs": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz",
+ "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=",
+ "dev": true,
+ "requires": {
+ "ini": "1.3.5"
+ }
+ },
+ "global-modules": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz",
+ "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=",
+ "dev": true,
+ "requires": {
+ "global-prefix": "0.1.5",
+ "is-windows": "0.2.0"
+ }
+ },
+ "global-prefix": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz",
+ "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=",
+ "dev": true,
+ "requires": {
+ "homedir-polyfill": "1.0.1",
+ "ini": "1.3.5",
+ "is-windows": "0.2.0",
+ "which": "1.3.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ=="
+ },
+ "globby": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.1.tgz",
+ "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==",
+ "dev": true,
+ "requires": {
+ "array-union": "1.0.2",
+ "dir-glob": "2.0.0",
+ "fast-glob": "2.2.1",
+ "glob": "7.1.2",
+ "ignore": "3.3.8",
+ "pify": "3.0.0",
+ "slash": "1.0.0"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "dev": true
+ }
+ }
+ },
+ "globule": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz",
+ "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=",
+ "requires": {
+ "glob": "3.1.21",
+ "lodash": "1.0.2",
+ "minimatch": "0.2.14"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "3.1.21",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz",
+ "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=",
+ "requires": {
+ "graceful-fs": "1.2.3",
+ "inherits": "1.0.2",
+ "minimatch": "0.2.14"
+ }
+ },
+ "graceful-fs": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz",
+ "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q="
+ },
+ "inherits": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz",
+ "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js="
+ },
+ "lodash": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz",
+ "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE="
+ },
+ "lru-cache": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz",
+ "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI="
+ },
+ "minimatch": {
+ "version": "0.2.14",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz",
+ "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=",
+ "requires": {
+ "lru-cache": "2.7.3",
+ "sigmund": "1.0.1"
+ }
+ }
+ }
+ },
+ "glogg": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.1.tgz",
+ "integrity": "sha512-ynYqXLoluBKf9XGR1gA59yEJisIL7YHEH4xr3ZziHB5/yl4qWfaK8Js9jGe6gBGCSCKVqiyO30WnRZADvemUNw==",
+ "requires": {
+ "sparkles": "1.0.0"
+ }
+ },
+ "got": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/got/-/got-5.7.1.tgz",
+ "integrity": "sha1-X4FjWmHkplifGAVp6k44FoClHzU=",
+ "dev": true,
+ "requires": {
+ "create-error-class": "3.0.2",
+ "duplexer2": "0.1.4",
+ "is-redirect": "1.0.0",
+ "is-retry-allowed": "1.1.0",
+ "is-stream": "1.1.0",
+ "lowercase-keys": "1.0.1",
+ "node-status-codes": "1.0.0",
+ "object-assign": "4.1.1",
+ "parse-json": "2.2.0",
+ "pinkie-promise": "2.0.1",
+ "read-all-stream": "3.1.0",
+ "readable-stream": "2.3.6",
+ "timed-out": "3.1.3",
+ "unzip-response": "1.0.2",
+ "url-parse-lax": "1.0.0"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
+ },
+ "graceful-readlink": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
+ "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU="
+ },
+ "grouped-queue": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/grouped-queue/-/grouped-queue-0.3.3.tgz",
+ "integrity": "sha1-wWfSpTGcWg4JZO9qJbfC34mWyFw=",
+ "requires": {
+ "lodash": "4.17.10"
+ }
+ },
+ "growl": {
+ "version": "1.9.2",
+ "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz",
+ "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8="
+ },
+ "gulp": {
+ "version": "3.9.1",
+ "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz",
+ "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=",
+ "requires": {
+ "archy": "1.0.0",
+ "chalk": "1.1.3",
+ "deprecated": "0.0.1",
+ "gulp-util": "3.0.8",
+ "interpret": "1.1.0",
+ "liftoff": "2.5.0",
+ "minimist": "1.2.0",
+ "orchestrator": "0.3.8",
+ "pretty-hrtime": "1.0.3",
+ "semver": "4.3.6",
+ "tildify": "1.2.0",
+ "v8flags": "2.1.1",
+ "vinyl-fs": "0.3.14"
+ },
+ "dependencies": {
+ "clone": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz",
+ "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8="
+ },
+ "glob": {
+ "version": "4.5.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz",
+ "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=",
+ "requires": {
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "2.0.10",
+ "once": "1.4.0"
+ }
+ },
+ "glob-stream": {
+ "version": "3.1.18",
+ "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz",
+ "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=",
+ "requires": {
+ "glob": "4.5.3",
+ "glob2base": "0.0.12",
+ "minimatch": "2.0.10",
+ "ordered-read-streams": "0.1.0",
+ "through2": "0.6.5",
+ "unique-stream": "1.0.0"
+ }
+ },
+ "graceful-fs": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz",
+ "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=",
+ "requires": {
+ "natives": "1.1.3"
+ }
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+ },
+ "minimatch": {
+ "version": "2.0.10",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz",
+ "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=",
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "ordered-read-streams": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz",
+ "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY="
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "semver": {
+ "version": "4.3.6",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz",
+ "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto="
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+ },
+ "strip-bom": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz",
+ "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=",
+ "requires": {
+ "first-chunk-stream": "1.0.0",
+ "is-utf8": "0.2.1"
+ }
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "requires": {
+ "readable-stream": "1.0.34",
+ "xtend": "4.0.1"
+ }
+ },
+ "unique-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz",
+ "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs="
+ },
+ "vinyl": {
+ "version": "0.4.6",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz",
+ "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=",
+ "requires": {
+ "clone": "0.2.0",
+ "clone-stats": "0.0.1"
+ }
+ },
+ "vinyl-fs": {
+ "version": "0.3.14",
+ "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz",
+ "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=",
+ "requires": {
+ "defaults": "1.0.3",
+ "glob-stream": "3.1.18",
+ "glob-watcher": "0.0.6",
+ "graceful-fs": "3.0.11",
+ "mkdirp": "0.5.1",
+ "strip-bom": "1.0.0",
+ "through2": "0.6.5",
+ "vinyl": "0.4.6"
+ }
+ }
+ }
+ },
+ "gulp-eslint": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/gulp-eslint/-/gulp-eslint-4.0.2.tgz",
+ "integrity": "sha512-fcFUQzFsN6dJ6KZlG+qPOEkqfcevRUXgztkYCvhNvJeSvOicC8ucutN4qR/ID8LmNZx9YPIkBzazTNnVvbh8wg==",
+ "requires": {
+ "eslint": "4.19.1",
+ "fancy-log": "1.3.2",
+ "plugin-error": "1.0.1"
+ }
+ },
+ "gulp-if": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/gulp-if/-/gulp-if-2.0.2.tgz",
+ "integrity": "sha1-pJe351cwBQQcqivIt92jyARE1ik=",
+ "dev": true,
+ "requires": {
+ "gulp-match": "1.0.3",
+ "ternary-stream": "2.0.1",
+ "through2": "2.0.3"
+ }
+ },
+ "gulp-match": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/gulp-match/-/gulp-match-1.0.3.tgz",
+ "integrity": "sha1-kcfA1/Kb7NZgbVfYCn+Hdqh6uo4=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "gulp-mocha": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/gulp-mocha/-/gulp-mocha-4.3.1.tgz",
+ "integrity": "sha1-d5ULQ7z/gWWVdnwHNOD9p9Fz3Nk=",
+ "requires": {
+ "dargs": "5.1.0",
+ "execa": "0.6.3",
+ "gulp-util": "3.0.8",
+ "mocha": "3.5.3",
+ "npm-run-path": "2.0.2",
+ "through2": "2.0.3"
+ },
+ "dependencies": {
+ "execa": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-0.6.3.tgz",
+ "integrity": "sha1-V7aaWU8IF1nGnlNw8NF7nLEWWP4=",
+ "requires": {
+ "cross-spawn": "5.1.0",
+ "get-stream": "3.0.0",
+ "is-stream": "1.1.0",
+ "npm-run-path": "2.0.2",
+ "p-finally": "1.0.0",
+ "signal-exit": "3.0.2",
+ "strip-eof": "1.0.0"
+ }
+ }
+ }
+ },
+ "gulp-sourcemaps": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz",
+ "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=",
+ "requires": {
+ "convert-source-map": "1.5.1",
+ "graceful-fs": "4.1.11",
+ "strip-bom": "2.0.0",
+ "through2": "2.0.3",
+ "vinyl": "1.2.0"
+ }
+ },
+ "gulp-spawn-mocha": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/gulp-spawn-mocha/-/gulp-spawn-mocha-3.3.1.tgz",
+ "integrity": "sha512-0DoyYQ4+MmARhs6N0Yr5+Sm8K8aN0SwJoxpRl6YfWPP2nZhMLHtDx7grm7Bw5cr0VR2urkG/p36rRAbCqzaP2A==",
+ "requires": {
+ "gulp-util": "3.0.8",
+ "lodash": "4.17.10",
+ "through": "2.3.8"
+ }
+ },
+ "gulp-tslint": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/gulp-tslint/-/gulp-tslint-7.1.0.tgz",
+ "integrity": "sha1-m9P/T7wW1MvZq7CP94bbibVj6T0=",
+ "requires": {
+ "gulp-util": "3.0.8",
+ "map-stream": "0.1.0",
+ "through": "2.3.8"
+ }
+ },
+ "gulp-typescript": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/gulp-typescript/-/gulp-typescript-3.2.4.tgz",
+ "integrity": "sha512-bZosNvbUGzFA4bjjWoUPyjU5vfgJSzlYKkU0Jutbsrj+td8yvtqxethhqfzB9MwyamaUODIuidj5gIytZ523Bw==",
+ "requires": {
+ "gulp-util": "3.0.8",
+ "source-map": "0.5.7",
+ "through2": "2.0.3",
+ "vinyl-fs": "2.4.4"
+ }
+ },
+ "gulp-util": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz",
+ "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=",
+ "requires": {
+ "array-differ": "1.0.0",
+ "array-uniq": "1.0.3",
+ "beeper": "1.1.1",
+ "chalk": "1.1.3",
+ "dateformat": "2.2.0",
+ "fancy-log": "1.3.2",
+ "gulplog": "1.0.0",
+ "has-gulplog": "0.1.0",
+ "lodash._reescape": "3.0.0",
+ "lodash._reevaluate": "3.0.0",
+ "lodash._reinterpolate": "3.0.0",
+ "lodash.template": "3.6.2",
+ "minimist": "1.2.0",
+ "multipipe": "0.1.2",
+ "object-assign": "3.0.0",
+ "replace-ext": "0.0.1",
+ "through2": "2.0.3",
+ "vinyl": "0.5.3"
+ },
+ "dependencies": {
+ "object-assign": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz",
+ "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I="
+ },
+ "vinyl": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz",
+ "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=",
+ "requires": {
+ "clone": "1.0.4",
+ "clone-stats": "0.0.1",
+ "replace-ext": "0.0.1"
+ }
+ }
+ }
+ },
+ "gulplog": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz",
+ "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=",
+ "requires": {
+ "glogg": "1.0.1"
+ }
+ },
+ "gunzip-maybe": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/gunzip-maybe/-/gunzip-maybe-1.4.1.tgz",
+ "integrity": "sha512-qtutIKMthNJJgeHQS7kZ9FqDq59/Wn0G2HYCRNjpup7yKfVI6/eqwpmroyZGFoCYaG+sW6psNVb4zoLADHpp2g==",
+ "dev": true,
+ "requires": {
+ "browserify-zlib": "0.1.4",
+ "is-deflate": "1.0.0",
+ "is-gzip": "1.0.0",
+ "peek-stream": "1.1.3",
+ "pumpify": "1.5.0",
+ "through2": "2.0.3"
+ }
+ },
+ "handle-thing": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz",
+ "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=",
+ "dev": true
+ },
+ "handlebars": {
+ "version": "4.0.11",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz",
+ "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=",
+ "requires": {
+ "async": "1.5.2",
+ "optimist": "0.6.1",
+ "source-map": "0.4.4",
+ "uglify-js": "2.8.29"
+ },
+ "dependencies": {
+ "async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo="
+ },
+ "source-map": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
+ "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
+ "requires": {
+ "amdefine": "1.0.1"
+ }
+ }
+ }
+ },
+ "har-schema": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
+ "dev": true
+ },
+ "har-validator": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz",
+ "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=",
+ "dev": true,
+ "requires": {
+ "ajv": "5.5.2",
+ "har-schema": "2.0.0"
+ }
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "has-binary2": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.2.tgz",
+ "integrity": "sha1-6D26SfC5vk0CbSc2U1DZ8D9Uvpg=",
+ "dev": true,
+ "requires": {
+ "isarray": "2.0.1"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
+ "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=",
+ "dev": true
+ }
+ }
+ },
+ "has-color": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz",
+ "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=",
+ "dev": true
+ },
+ "has-cors": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
+ "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
+ },
+ "has-gulplog": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz",
+ "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=",
+ "requires": {
+ "sparkles": "1.0.0"
+ }
+ },
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "1.0.0",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ }
+ }
+ },
+ "has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "requires": {
+ "is-number": "3.0.0",
+ "kind-of": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "hawk": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz",
+ "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==",
+ "dev": true,
+ "requires": {
+ "boom": "4.3.1",
+ "cryptiles": "3.1.2",
+ "hoek": "4.2.1",
+ "sntp": "2.1.0"
+ }
+ },
+ "he": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
+ "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0="
+ },
+ "hoek": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz",
+ "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==",
+ "dev": true
+ },
+ "homedir-polyfill": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz",
+ "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=",
+ "requires": {
+ "parse-passwd": "1.0.0"
+ }
+ },
+ "hosted-git-info": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz",
+ "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw=="
+ },
+ "hpack.js": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
+ "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "obuf": "1.1.2",
+ "readable-stream": "2.3.6",
+ "wbuf": "1.7.3"
+ }
+ },
+ "html-minifier": {
+ "version": "3.5.15",
+ "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.15.tgz",
+ "integrity": "sha512-OZa4rfb6tZOZ3Z8Xf0jKxXkiDcFWldQePGYFDcgKqES2sXeWaEv9y6QQvWUtX3ySI3feApQi5uCsHLINQ6NoAw==",
+ "dev": true,
+ "requires": {
+ "camel-case": "3.0.0",
+ "clean-css": "4.1.11",
+ "commander": "2.15.1",
+ "he": "1.1.1",
+ "param-case": "2.1.1",
+ "relateurl": "0.2.7",
+ "uglify-js": "3.3.24"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "2.15.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
+ "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ },
+ "uglify-js": {
+ "version": "3.3.24",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.24.tgz",
+ "integrity": "sha512-hS7+TDiqIqvWScCcKRybCQzmMnEzJ4ryl9ErRmW4GFyG48p0/dKZiy/5mVLbsFzU8CCnCgQdxMiJzZythvLzCg==",
+ "dev": true,
+ "requires": {
+ "commander": "2.15.1",
+ "source-map": "0.6.1"
+ }
+ }
+ }
+ },
+ "http-deceiver": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
+ "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=",
+ "dev": true
+ },
+ "http-errors": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
+ "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
+ "dev": true,
+ "requires": {
+ "depd": "1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.0",
+ "statuses": "1.4.0"
+ }
+ },
+ "http-proxy": {
+ "version": "1.17.0",
+ "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz",
+ "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==",
+ "dev": true,
+ "requires": {
+ "eventemitter3": "3.1.0",
+ "follow-redirects": "1.4.1",
+ "requires-port": "1.0.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "follow-redirects": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.4.1.tgz",
+ "integrity": "sha512-uxYePVPogtya1ktGnAAXOacnbIuRMB4dkvqeNz2qTtTQsuzSfbDolV+wMMKxAmCx0bLgAKLbBOkjItMbbkR1vg==",
+ "dev": true,
+ "requires": {
+ "debug": "3.1.0"
+ }
+ }
+ }
+ },
+ "http-proxy-middleware": {
+ "version": "0.17.4",
+ "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz",
+ "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=",
+ "dev": true,
+ "requires": {
+ "http-proxy": "1.17.0",
+ "is-glob": "3.1.0",
+ "lodash": "4.17.10",
+ "micromatch": "2.3.11"
+ },
+ "dependencies": {
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ }
+ }
+ },
+ "http-signature": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "jsprim": "1.4.1",
+ "sshpk": "1.14.1"
+ }
+ },
+ "https-proxy-agent": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz",
+ "integrity": "sha1-NffabEjOTdv6JkiRrFk+5f+GceY=",
+ "dev": true,
+ "requires": {
+ "agent-base": "2.1.1",
+ "debug": "2.6.9",
+ "extend": "3.0.1"
+ }
+ },
+ "iconv-lite": {
+ "version": "0.4.23",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
+ "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
+ "requires": {
+ "safer-buffer": "2.1.2"
+ }
+ },
+ "ignore": {
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz",
+ "integrity": "sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg=="
+ },
+ "import-lazy": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
+ "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
+ "dev": true
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
+ },
+ "indent": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/indent/-/indent-0.0.2.tgz",
+ "integrity": "sha1-jHnwgBkFWbaHA0uEx676l9WpEdk=",
+ "dev": true
+ },
+ "indent-string": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
+ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "indexof": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
+ "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+ },
+ "ini": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
+ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
+ },
+ "inquirer": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-1.2.3.tgz",
+ "integrity": "sha1-TexvMvN+97sLLtPx0aXD9UUHSRg=",
+ "requires": {
+ "ansi-escapes": "1.4.0",
+ "chalk": "1.1.3",
+ "cli-cursor": "1.0.2",
+ "cli-width": "2.2.0",
+ "external-editor": "1.1.1",
+ "figures": "1.7.0",
+ "lodash": "4.17.10",
+ "mute-stream": "0.0.6",
+ "pinkie-promise": "2.0.1",
+ "run-async": "2.3.0",
+ "rx": "4.1.0",
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1",
+ "through": "2.3.8"
+ }
+ },
+ "interpret": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
+ "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ="
+ },
+ "intersect": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/intersect/-/intersect-1.0.1.tgz",
+ "integrity": "sha1-MyZQ4QhU2MCsWMGSvcJ6i/fnoww=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "invert-kv": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
+ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY="
+ },
+ "ipaddr.js": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz",
+ "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=",
+ "dev": true
+ },
+ "is-absolute": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz",
+ "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==",
+ "requires": {
+ "is-relative": "1.0.0",
+ "is-windows": "1.0.2"
+ },
+ "dependencies": {
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="
+ }
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ },
+ "is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
+ },
+ "is-binary-path": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
+ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+ "dev": true,
+ "requires": {
+ "binary-extensions": "1.11.0"
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+ },
+ "is-builtin-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
+ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
+ "requires": {
+ "builtin-modules": "1.1.1"
+ }
+ },
+ "is-ci": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz",
+ "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==",
+ "dev": true,
+ "requires": {
+ "ci-info": "1.1.3"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ },
+ "is-deflate": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-deflate/-/is-deflate-1.0.0.tgz",
+ "integrity": "sha1-yGKQHDwWH7CdrHzcfnhPgOmPLxQ=",
+ "dev": true
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
+ }
+ }
+ },
+ "is-dotfile": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
+ "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE="
+ },
+ "is-equal-shallow": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
+ "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
+ "requires": {
+ "is-primitive": "2.0.0"
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
+ },
+ "is-extglob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+ "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA="
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-glob": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ },
+ "is-gzip": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz",
+ "integrity": "sha1-bKiwe5nHeZgCWQDlVc7Y7YCHmoM=",
+ "dev": true
+ },
+ "is-installed-globally": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz",
+ "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=",
+ "dev": true,
+ "requires": {
+ "global-dirs": "0.1.1",
+ "is-path-inside": "1.0.1"
+ }
+ },
+ "is-my-ip-valid": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz",
+ "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==",
+ "dev": true,
+ "optional": true
+ },
+ "is-my-json-valid": {
+ "version": "2.17.2",
+ "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz",
+ "integrity": "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "generate-function": "2.0.0",
+ "generate-object-property": "1.2.0",
+ "is-my-ip-valid": "1.0.0",
+ "jsonpointer": "4.0.1",
+ "xtend": "4.0.1"
+ }
+ },
+ "is-npm": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz",
+ "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=",
+ "dev": true
+ },
+ "is-number": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
+ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ },
+ "is-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
+ "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
+ "dev": true
+ },
+ "is-odd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz",
+ "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==",
+ "requires": {
+ "is-number": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ=="
+ }
+ }
+ },
+ "is-path-cwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
+ "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0="
+ },
+ "is-path-in-cwd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz",
+ "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==",
+ "requires": {
+ "is-path-inside": "1.0.1"
+ }
+ },
+ "is-path-inside": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
+ "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
+ "requires": {
+ "path-is-inside": "1.0.2"
+ }
+ },
+ "is-plain-obj": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
+ "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4="
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "requires": {
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ }
+ }
+ },
+ "is-posix-bracket": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
+ "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q="
+ },
+ "is-potential-custom-element-name": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz",
+ "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=",
+ "dev": true
+ },
+ "is-primitive": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
+ "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU="
+ },
+ "is-promise": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
+ "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o="
+ },
+ "is-property": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
+ "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=",
+ "dev": true,
+ "optional": true
+ },
+ "is-redirect": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz",
+ "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ="
+ },
+ "is-relative": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
+ "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==",
+ "requires": {
+ "is-unc-path": "1.0.0"
+ }
+ },
+ "is-resolvable": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
+ "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg=="
+ },
+ "is-retry-allowed": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz",
+ "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ="
+ },
+ "is-scoped": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-scoped/-/is-scoped-1.0.0.tgz",
+ "integrity": "sha1-RJypgpnnEwOCViieyytUDcQ3yzA=",
+ "requires": {
+ "scoped-regex": "1.0.0"
+ }
+ },
+ "is-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+ "dev": true
+ },
+ "is-unc-path": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
+ "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==",
+ "requires": {
+ "unc-path-regex": "0.1.2"
+ }
+ },
+ "is-utf8": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI="
+ },
+ "is-valid-glob": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz",
+ "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4="
+ },
+ "is-windows": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz",
+ "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
+ },
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "istanbul": {
+ "version": "0.4.5",
+ "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz",
+ "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=",
+ "requires": {
+ "abbrev": "1.0.9",
+ "async": "1.0.0",
+ "escodegen": "1.8.1",
+ "esprima": "2.7.3",
+ "glob": "5.0.15",
+ "handlebars": "4.0.11",
+ "js-yaml": "3.11.0",
+ "mkdirp": "0.5.1",
+ "nopt": "3.0.6",
+ "once": "1.4.0",
+ "resolve": "1.1.7",
+ "supports-color": "3.2.3",
+ "which": "1.3.0",
+ "wordwrap": "1.0.0"
+ },
+ "dependencies": {
+ "esprima": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
+ "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE="
+ },
+ "glob": {
+ "version": "5.0.15",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
+ "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
+ "requires": {
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "resolve": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
+ "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs="
+ },
+ "supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ }
+ }
+ },
+ "istextorbinary": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-2.2.1.tgz",
+ "integrity": "sha512-TS+hoFl8Z5FAFMK38nhBkdLt44CclNRgDHWeMgsV8ko3nDlr/9UI2Sf839sW7enijf8oKsZYXRvM8g0it9Zmcw==",
+ "requires": {
+ "binaryextensions": "2.1.1",
+ "editions": "1.3.4",
+ "textextensions": "2.2.0"
+ }
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls="
+ },
+ "js-yaml": {
+ "version": "3.11.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz",
+ "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==",
+ "requires": {
+ "argparse": "1.0.10",
+ "esprima": "4.0.0"
+ }
+ },
+ "jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
+ "dev": true,
+ "optional": true
+ },
+ "jsesc": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz",
+ "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=",
+ "dev": true
+ },
+ "json-schema": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+ "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
+ "dev": true
+ },
+ "json-schema-traverse": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
+ "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A="
+ },
+ "json-stable-stringify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
+ "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
+ "requires": {
+ "jsonify": "0.0.0"
+ }
+ },
+ "json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE="
+ },
+ "json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
+ "dev": true
+ },
+ "json3": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz",
+ "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE="
+ },
+ "json5": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
+ "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsonify": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
+ "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM="
+ },
+ "jsonpointer": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz",
+ "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=",
+ "dev": true,
+ "optional": true
+ },
+ "jsonschema": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.4.tgz",
+ "integrity": "sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw==",
+ "dev": true
+ },
+ "jsprim": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+ "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.3.0",
+ "json-schema": "0.2.3",
+ "verror": "1.10.0"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ },
+ "latest-version": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-2.0.0.tgz",
+ "integrity": "sha1-VvjWE5YghHuAF/jx9NeOIRMkFos=",
+ "dev": true,
+ "requires": {
+ "package-json": "2.4.0"
+ }
+ },
+ "launchpad": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/launchpad/-/launchpad-0.7.0.tgz",
+ "integrity": "sha1-9CfTwOFehp7hVROCi6/vwW+ce8M=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "async": "2.6.0",
+ "browserstack": "1.5.0",
+ "debug": "2.6.9",
+ "plist": "2.1.0",
+ "q": "1.5.1",
+ "underscore": "1.9.0"
+ },
+ "dependencies": {
+ "async": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz",
+ "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "lodash": "4.17.10"
+ }
+ },
+ "underscore": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.0.tgz",
+ "integrity": "sha512-4IV1DSSxC1QK48j9ONFK1MoIAKKkbE8i7u55w2R6IqBqbT7A/iG7aZBCR2Bi8piF0Uz+i/MG1aeqLwl/5vqF+A==",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "lazy-cache": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
+ "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
+ "optional": true
+ },
+ "lazy-req": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/lazy-req/-/lazy-req-1.1.0.tgz",
+ "integrity": "sha1-va6+rTD42CQDnODOFJ1Nqge6H6w=",
+ "dev": true
+ },
+ "lazystream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz",
+ "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=",
+ "requires": {
+ "readable-stream": "2.3.6"
+ }
+ },
+ "lcid": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
+ "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
+ "requires": {
+ "invert-kv": "1.0.0"
+ }
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "liftoff": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz",
+ "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=",
+ "requires": {
+ "extend": "3.0.1",
+ "findup-sync": "2.0.0",
+ "fined": "1.1.0",
+ "flagged-respawn": "1.0.0",
+ "is-plain-object": "2.0.4",
+ "object.map": "1.0.1",
+ "rechoir": "0.6.2",
+ "resolve": "1.7.1"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-unique": "0.3.2",
+ "extend-shallow": "2.0.1",
+ "fill-range": "4.0.0",
+ "isobject": "3.0.1",
+ "repeat-element": "1.1.2",
+ "snapdragon": "0.8.2",
+ "snapdragon-node": "2.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "detect-file": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
+ "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc="
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "requires": {
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "posix-character-classes": "0.1.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ }
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
+ }
+ }
+ },
+ "expand-tilde": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
+ "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
+ "requires": {
+ "homedir-polyfill": "1.0.1"
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "requires": {
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "expand-brackets": "2.1.4",
+ "extend-shallow": "2.0.1",
+ "fragment-cache": "0.2.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1",
+ "to-regex-range": "2.1.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "findup-sync": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz",
+ "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=",
+ "requires": {
+ "detect-file": "1.0.0",
+ "is-glob": "3.1.0",
+ "micromatch": "3.1.10",
+ "resolve-dir": "1.0.1"
+ }
+ },
+ "global-modules": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
+ "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
+ "requires": {
+ "global-prefix": "1.0.2",
+ "is-windows": "1.0.2",
+ "resolve-dir": "1.0.1"
+ }
+ },
+ "global-prefix": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
+ "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
+ "requires": {
+ "expand-tilde": "2.0.2",
+ "homedir-polyfill": "1.0.1",
+ "ini": "1.3.5",
+ "is-windows": "1.0.2",
+ "which": "1.3.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
+ },
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "braces": "2.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "extglob": "2.0.4",
+ "fragment-cache": "0.2.1",
+ "kind-of": "6.0.2",
+ "nanomatch": "1.2.9",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "resolve-dir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
+ "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
+ "requires": {
+ "expand-tilde": "2.0.2",
+ "global-modules": "1.0.0"
+ }
+ }
+ }
+ },
+ "load-json-file": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "parse-json": "2.2.0",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1",
+ "strip-bom": "2.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+ "requires": {
+ "p-locate": "2.0.0",
+ "path-exists": "3.0.0"
+ },
+ "dependencies": {
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
+ }
+ }
+ },
+ "lodash": {
+ "version": "4.17.10",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
+ "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg=="
+ },
+ "lodash._baseassign": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz",
+ "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=",
+ "requires": {
+ "lodash._basecopy": "3.0.1",
+ "lodash.keys": "3.1.2"
+ }
+ },
+ "lodash._basecopy": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz",
+ "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY="
+ },
+ "lodash._basecreate": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz",
+ "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE="
+ },
+ "lodash._basetostring": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz",
+ "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U="
+ },
+ "lodash._basevalues": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz",
+ "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc="
+ },
+ "lodash._getnative": {
+ "version": "3.9.1",
+ "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz",
+ "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U="
+ },
+ "lodash._isiterateecall": {
+ "version": "3.0.9",
+ "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz",
+ "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw="
+ },
+ "lodash._reescape": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz",
+ "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo="
+ },
+ "lodash._reevaluate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz",
+ "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0="
+ },
+ "lodash._reinterpolate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
+ "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0="
+ },
+ "lodash._root": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz",
+ "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI="
+ },
+ "lodash.create": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz",
+ "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=",
+ "requires": {
+ "lodash._baseassign": "3.2.0",
+ "lodash._basecreate": "3.0.3",
+ "lodash._isiterateecall": "3.0.9"
+ }
+ },
+ "lodash.defaults": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
+ "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=",
+ "dev": true
+ },
+ "lodash.escape": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz",
+ "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=",
+ "requires": {
+ "lodash._root": "3.0.1"
+ }
+ },
+ "lodash.isarguments": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
+ "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo="
+ },
+ "lodash.isarray": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz",
+ "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U="
+ },
+ "lodash.isequal": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+ "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA="
+ },
+ "lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=",
+ "dev": true
+ },
+ "lodash.keys": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz",
+ "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=",
+ "requires": {
+ "lodash._getnative": "3.9.1",
+ "lodash.isarguments": "3.1.0",
+ "lodash.isarray": "3.0.4"
+ }
+ },
+ "lodash.restparam": {
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz",
+ "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU="
+ },
+ "lodash.some": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz",
+ "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=",
+ "dev": true
+ },
+ "lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
+ "dev": true
+ },
+ "lodash.template": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz",
+ "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=",
+ "requires": {
+ "lodash._basecopy": "3.0.1",
+ "lodash._basetostring": "3.0.1",
+ "lodash._basevalues": "3.0.0",
+ "lodash._isiterateecall": "3.0.9",
+ "lodash._reinterpolate": "3.0.0",
+ "lodash.escape": "3.2.0",
+ "lodash.keys": "3.1.2",
+ "lodash.restparam": "3.6.1",
+ "lodash.templatesettings": "3.1.1"
+ }
+ },
+ "lodash.templatesettings": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz",
+ "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=",
+ "requires": {
+ "lodash._reinterpolate": "3.0.0",
+ "lodash.escape": "3.2.0"
+ }
+ },
+ "log-symbols": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz",
+ "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=",
+ "requires": {
+ "chalk": "1.1.3"
+ }
+ },
+ "lolex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz",
+ "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE="
+ },
+ "longest": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
+ "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc="
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "loud-rejection": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
+ "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
+ "dev": true,
+ "requires": {
+ "currently-unhandled": "0.4.1",
+ "signal-exit": "3.0.2"
+ }
+ },
+ "lower-case": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz",
+ "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=",
+ "dev": true
+ },
+ "lowercase-keys": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
+ "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA=="
+ },
+ "lru-cache": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz",
+ "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==",
+ "requires": {
+ "pseudomap": "1.0.2",
+ "yallist": "2.1.2"
+ }
+ },
+ "magic-string": {
+ "version": "0.22.5",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz",
+ "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==",
+ "dev": true,
+ "requires": {
+ "vlq": "0.2.3"
+ }
+ },
+ "make-dir": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz",
+ "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==",
+ "dev": true,
+ "requires": {
+ "pify": "3.0.0"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "dev": true
+ }
+ }
+ },
+ "make-iterator": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz",
+ "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==",
+ "requires": {
+ "kind-of": "6.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+ }
+ }
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8="
+ },
+ "map-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+ "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+ "dev": true
+ },
+ "map-stream": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz",
+ "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ="
+ },
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "requires": {
+ "object-visit": "1.0.1"
+ }
+ },
+ "matcher": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/matcher/-/matcher-1.1.0.tgz",
+ "integrity": "sha512-aZGv6JBTHqfqAd09jmAlbKnAICTfIvb5Z8gXVxPB5WZtFfHMaAMdACL7tQflD2V+6/8KNcY8s6DYtWLgpJP5lA==",
+ "dev": true,
+ "requires": {
+ "escape-string-regexp": "1.0.5"
+ }
+ },
+ "math-random": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz",
+ "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w="
+ },
+ "md5": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz",
+ "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=",
+ "dev": true,
+ "requires": {
+ "charenc": "0.0.2",
+ "crypt": "0.0.2",
+ "is-buffer": "1.1.6"
+ }
+ },
+ "media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
+ "dev": true
+ },
+ "mem": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz",
+ "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
+ "requires": {
+ "mimic-fn": "1.2.0"
+ }
+ },
+ "mem-fs": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/mem-fs/-/mem-fs-1.1.3.tgz",
+ "integrity": "sha1-uK6NLj/Lb10/kWXBLUVRoGXZicw=",
+ "requires": {
+ "through2": "2.0.3",
+ "vinyl": "1.2.0",
+ "vinyl-file": "2.0.0"
+ }
+ },
+ "mem-fs-editor": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/mem-fs-editor/-/mem-fs-editor-3.0.2.tgz",
+ "integrity": "sha1-3Qpuryu4prN3QAZ6pUnrUwEFr58=",
+ "requires": {
+ "commondir": "1.0.1",
+ "deep-extend": "0.4.2",
+ "ejs": "2.6.1",
+ "glob": "7.1.2",
+ "globby": "6.1.0",
+ "mkdirp": "0.5.1",
+ "multimatch": "2.1.0",
+ "rimraf": "2.6.2",
+ "through2": "2.0.3",
+ "vinyl": "2.1.0"
+ },
+ "dependencies": {
+ "clone": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+ "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs="
+ },
+ "clone-stats": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
+ "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA="
+ },
+ "globby": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
+ "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
+ "requires": {
+ "array-union": "1.0.2",
+ "glob": "7.1.2",
+ "object-assign": "4.1.1",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "replace-ext": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
+ "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs="
+ },
+ "vinyl": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz",
+ "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=",
+ "requires": {
+ "clone": "2.1.1",
+ "clone-buffer": "1.0.0",
+ "clone-stats": "1.0.0",
+ "cloneable-readable": "1.1.2",
+ "remove-trailing-separator": "1.1.0",
+ "replace-ext": "1.0.0"
+ }
+ }
+ }
+ },
+ "memory-streams": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/memory-streams/-/memory-streams-0.1.3.tgz",
+ "integrity": "sha512-qVQ/CjkMyMInPaaRMrwWNDvf6boRZXaT/DbQeMYcCWuXPEBf1v8qChOc9OlEVQp2uOvRXa1Qu30fLmKhY6NipA==",
+ "requires": {
+ "readable-stream": "1.0.34"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+ }
+ }
+ },
+ "meow": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
+ "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
+ "dev": true,
+ "requires": {
+ "camelcase-keys": "2.1.0",
+ "decamelize": "1.2.0",
+ "loud-rejection": "1.6.0",
+ "map-obj": "1.0.1",
+ "minimist": "1.2.0",
+ "normalize-package-data": "2.4.0",
+ "object-assign": "4.1.1",
+ "read-pkg-up": "1.0.1",
+ "redent": "1.0.0",
+ "trim-newlines": "1.0.0"
+ }
+ },
+ "merge-descriptors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+ "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
+ "dev": true
+ },
+ "merge-stream": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz",
+ "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=",
+ "requires": {
+ "readable-stream": "2.3.6"
+ }
+ },
+ "merge2": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.2.tgz",
+ "integrity": "sha512-bgM8twH86rWni21thii6WCMQMRMmwqqdW3sGWi9IipnVAszdLXRjwDwAnyrVXo6DuP3AjRMMttZKUB48QWIFGg==",
+ "dev": true
+ },
+ "methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "2.3.11",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
+ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
+ "requires": {
+ "arr-diff": "2.0.0",
+ "array-unique": "0.2.1",
+ "braces": "1.8.5",
+ "expand-brackets": "0.1.5",
+ "extglob": "0.3.2",
+ "filename-regex": "2.0.1",
+ "is-extglob": "1.0.0",
+ "is-glob": "2.0.1",
+ "kind-of": "3.2.2",
+ "normalize-path": "2.1.1",
+ "object.omit": "2.0.1",
+ "parse-glob": "3.0.4",
+ "regex-cache": "0.4.4"
+ }
+ },
+ "mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
+ },
+ "mime-db": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz",
+ "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==",
+ "dev": true
+ },
+ "mime-types": {
+ "version": "2.1.18",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz",
+ "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
+ "dev": true,
+ "requires": {
+ "mime-db": "1.33.0"
+ }
+ },
+ "mimic-fn": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
+ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="
+ },
+ "minimalistic-assert": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimatch-all": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/minimatch-all/-/minimatch-all-1.1.0.tgz",
+ "integrity": "sha1-QMSWonouEo0Zv3WOdrsBoMcUV4c=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
+ },
+ "mixin-deep": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
+ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
+ "requires": {
+ "for-in": "1.0.2",
+ "is-extendable": "1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "requires": {
+ "minimist": "0.0.8"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
+ }
+ }
+ },
+ "mocha": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz",
+ "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==",
+ "requires": {
+ "browser-stdout": "1.3.0",
+ "commander": "2.9.0",
+ "debug": "2.6.8",
+ "diff": "3.2.0",
+ "escape-string-regexp": "1.0.5",
+ "glob": "7.1.1",
+ "growl": "1.9.2",
+ "he": "1.1.1",
+ "json3": "3.3.2",
+ "lodash.create": "3.1.1",
+ "mkdirp": "0.5.1",
+ "supports-color": "3.1.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.8",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz",
+ "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "diff": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz",
+ "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k="
+ },
+ "glob": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz",
+ "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=",
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "supports-color": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz",
+ "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=",
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ }
+ }
+ },
+ "mout": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/mout/-/mout-1.1.0.tgz",
+ "integrity": "sha512-XsP0vf4As6BfqglxZqbqQ8SR6KQot2AgxvR0gG+WtUkf90vUXchMOZQtPf/Hml1rEffJupqL/tIrU6EYhsUQjw==",
+ "dev": true
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ },
+ "multer": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/multer/-/multer-1.3.0.tgz",
+ "integrity": "sha1-CSsmcPaEb6SRSWXvyM+Uwg/sbNI=",
+ "dev": true,
+ "requires": {
+ "append-field": "0.1.0",
+ "busboy": "0.2.14",
+ "concat-stream": "1.6.2",
+ "mkdirp": "0.5.1",
+ "object-assign": "3.0.0",
+ "on-finished": "2.3.0",
+ "type-is": "1.6.16",
+ "xtend": "4.0.1"
+ },
+ "dependencies": {
+ "object-assign": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz",
+ "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=",
+ "dev": true
+ }
+ }
+ },
+ "multimatch": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz",
+ "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=",
+ "requires": {
+ "array-differ": "1.0.0",
+ "array-union": "1.0.2",
+ "arrify": "1.0.1",
+ "minimatch": "3.0.4"
+ }
+ },
+ "multipipe": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz",
+ "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=",
+ "requires": {
+ "duplexer2": "0.0.2"
+ },
+ "dependencies": {
+ "duplexer2": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz",
+ "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=",
+ "requires": {
+ "readable-stream": "1.1.14"
+ }
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+ }
+ }
+ },
+ "mute-stream": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.6.tgz",
+ "integrity": "sha1-SJYrGeFp/R38JAs/HnMXYnu8R9s="
+ },
+ "mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "dev": true,
+ "requires": {
+ "any-promise": "1.3.0",
+ "object-assign": "4.1.1",
+ "thenify-all": "1.6.0"
+ }
+ },
+ "nan": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz",
+ "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==",
+ "dev": true,
+ "optional": true
+ },
+ "nanomatch": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz",
+ "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==",
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "fragment-cache": "0.2.1",
+ "is-odd": "2.0.0",
+ "is-windows": "1.0.2",
+ "kind-of": "6.0.2",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+ }
+ }
+ },
+ "native-promise-only": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz",
+ "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE="
+ },
+ "natives": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.3.tgz",
+ "integrity": "sha512-BZGSYV4YOLxzoTK73l0/s/0sH9l8SHs2ocReMH1f8JYSh5FUWu4ZrKCpJdRkWXV6HFR/pZDz7bwWOVAY07q77g=="
+ },
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc="
+ },
+ "negotiator": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
+ "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=",
+ "dev": true
+ },
+ "netrc": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/netrc/-/netrc-0.1.4.tgz",
+ "integrity": "sha1-a+lPysqNd63gqWcNxGCRTJRHJEQ=",
+ "dev": true
+ },
+ "nice-try": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz",
+ "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==",
+ "dev": true,
+ "optional": true
+ },
+ "no-case": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
+ "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==",
+ "dev": true,
+ "requires": {
+ "lower-case": "1.1.4"
+ }
+ },
+ "node-status-codes": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz",
+ "integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8=",
+ "dev": true
+ },
+ "nodegit-promise": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/nodegit-promise/-/nodegit-promise-4.0.0.tgz",
+ "integrity": "sha1-VyKxhPLfcycWEGSnkdLoQskWezQ=",
+ "dev": true,
+ "requires": {
+ "asap": "2.0.6"
+ }
+ },
+ "nomnom": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz",
+ "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=",
+ "dev": true,
+ "requires": {
+ "chalk": "0.4.0",
+ "underscore": "1.6.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz",
+ "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz",
+ "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "1.0.0",
+ "has-color": "0.1.7",
+ "strip-ansi": "0.1.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz",
+ "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=",
+ "dev": true
+ }
+ }
+ },
+ "nopt": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
+ "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
+ "requires": {
+ "abbrev": "1.0.9"
+ }
+ },
+ "normalize-package-data": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
+ "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
+ "requires": {
+ "hosted-git-info": "2.6.0",
+ "is-builtin-module": "1.0.0",
+ "semver": "5.5.0",
+ "validate-npm-package-license": "3.0.3"
+ }
+ },
+ "normalize-path": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+ "requires": {
+ "remove-trailing-separator": "1.1.0"
+ }
+ },
+ "npm-run-path": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+ "requires": {
+ "path-key": "2.0.1"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
+ },
+ "oauth-sign": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
+ "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=",
+ "dev": true
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+ },
+ "object-component": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz",
+ "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=",
+ "dev": true
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "requires": {
+ "copy-descriptor": "0.1.1",
+ "define-property": "0.2.5",
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "requires": {
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ }
+ }
+ },
+ "object.defaults": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
+ "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=",
+ "requires": {
+ "array-each": "1.0.1",
+ "array-slice": "1.1.0",
+ "for-own": "1.0.0",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "for-own": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
+ "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
+ "requires": {
+ "for-in": "1.0.2"
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ }
+ }
+ },
+ "object.map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz",
+ "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=",
+ "requires": {
+ "for-own": "1.0.0",
+ "make-iterator": "1.0.1"
+ },
+ "dependencies": {
+ "for-own": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
+ "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
+ "requires": {
+ "for-in": "1.0.2"
+ }
+ }
+ }
+ },
+ "object.omit": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
+ "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
+ "requires": {
+ "for-own": "0.1.5",
+ "is-extendable": "0.1.1"
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "requires": {
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ }
+ }
+ },
+ "obuf": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
+ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
+ "dev": true
+ },
+ "on-finished": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+ "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+ "dev": true,
+ "requires": {
+ "ee-first": "1.1.1"
+ }
+ },
+ "on-headers": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz",
+ "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=",
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "onetime": {
+ "version": "1.1.0",
+ "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
+ "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k="
+ },
+ "opn": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/opn/-/opn-3.0.3.tgz",
+ "integrity": "sha1-ttmec5n3jWXDuq/+8fsojpuFJDo=",
+ "dev": true,
+ "requires": {
+ "object-assign": "4.1.1"
+ }
+ },
+ "optimist": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
+ "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
+ "requires": {
+ "minimist": "0.0.10",
+ "wordwrap": "0.0.3"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
+ "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8="
+ },
+ "wordwrap": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
+ "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc="
+ }
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "orchestrator": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz",
+ "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=",
+ "requires": {
+ "end-of-stream": "0.1.5",
+ "sequencify": "0.0.7",
+ "stream-consume": "0.1.1"
+ },
+ "dependencies": {
+ "end-of-stream": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz",
+ "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=",
+ "requires": {
+ "once": "1.3.3"
+ }
+ },
+ "once": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz",
+ "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=",
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ }
+ }
+ },
+ "ordered-read-streams": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz",
+ "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=",
+ "requires": {
+ "is-stream": "1.1.0",
+ "readable-stream": "2.3.6"
+ }
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
+ },
+ "os-locale": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
+ "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==",
+ "requires": {
+ "execa": "0.7.0",
+ "lcid": "1.0.0",
+ "mem": "1.1.0"
+ }
+ },
+ "os-shim": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz",
+ "integrity": "sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc="
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
+ },
+ "osenv": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
+ "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
+ "dev": true,
+ "requires": {
+ "os-homedir": "1.0.2",
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "p-finally": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
+ },
+ "p-limit": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz",
+ "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==",
+ "requires": {
+ "p-try": "1.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+ "requires": {
+ "p-limit": "1.2.0"
+ }
+ },
+ "p-map": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz",
+ "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==",
+ "dev": true
+ },
+ "p-try": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
+ },
+ "package-json": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/package-json/-/package-json-2.4.0.tgz",
+ "integrity": "sha1-DRW9Z9HLvduyyiIv8u24a8sxqLs=",
+ "dev": true,
+ "requires": {
+ "got": "5.7.1",
+ "registry-auth-token": "3.3.2",
+ "registry-url": "3.1.0",
+ "semver": "5.5.0"
+ }
+ },
+ "pako": {
+ "version": "0.2.9",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
+ "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=",
+ "dev": true
+ },
+ "param-case": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz",
+ "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=",
+ "dev": true,
+ "requires": {
+ "no-case": "2.3.2"
+ }
+ },
+ "parse-filepath": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz",
+ "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=",
+ "requires": {
+ "is-absolute": "1.0.0",
+ "map-cache": "0.2.2",
+ "path-root": "0.1.1"
+ }
+ },
+ "parse-glob": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
+ "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
+ "requires": {
+ "glob-base": "0.3.0",
+ "is-dotfile": "1.0.3",
+ "is-extglob": "1.0.0",
+ "is-glob": "2.0.1"
+ }
+ },
+ "parse-json": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+ "requires": {
+ "error-ex": "1.3.1"
+ }
+ },
+ "parse-passwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
+ "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY="
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "parseqs": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz",
+ "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=",
+ "dev": true,
+ "requires": {
+ "better-assert": "1.0.2"
+ }
+ },
+ "parseuri": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz",
+ "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=",
+ "dev": true,
+ "requires": {
+ "better-assert": "1.0.2"
+ }
+ },
+ "parseurl": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
+ "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=",
+ "dev": true
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ="
+ },
+ "path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA="
+ },
+ "path-exists": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+ "dev": true,
+ "requires": {
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM="
+ },
+ "path-key": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME="
+ },
+ "path-root": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz",
+ "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=",
+ "requires": {
+ "path-root-regex": "0.1.2"
+ }
+ },
+ "path-root-regex": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz",
+ "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0="
+ },
+ "path-to-regexp": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz",
+ "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=",
+ "requires": {
+ "isarray": "0.0.1"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+ }
+ }
+ },
+ "path-type": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "pathval": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz",
+ "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=",
+ "dev": true
+ },
+ "peek-stream": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/peek-stream/-/peek-stream-1.1.3.tgz",
+ "integrity": "sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==",
+ "dev": true,
+ "requires": {
+ "buffer-from": "1.0.0",
+ "duplexify": "3.6.0",
+ "through2": "2.0.3"
+ }
+ },
+ "pem": {
+ "version": "1.12.5",
+ "resolved": "https://registry.npmjs.org/pem/-/pem-1.12.5.tgz",
+ "integrity": "sha512-mm8gLf4ZCaY6Qdm8J4bBdHs6SO4px71FspxgC2jJ0vXf3PYNZnGhU9zITCxpzFHpLPHsHU3xRBbuXNxEWuWziQ==",
+ "dev": true,
+ "requires": {
+ "md5": "2.2.1",
+ "os-tmpdir": "1.0.2",
+ "safe-buffer": "5.1.2",
+ "which": "1.3.0"
+ }
+ },
+ "pend": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+ "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA="
+ },
+ "performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
+ "dev": true
+ },
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
+ },
+ "pinkie": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+ "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
+ },
+ "pinkie-promise": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+ "requires": {
+ "pinkie": "2.0.4"
+ }
+ },
+ "plist": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/plist/-/plist-2.1.0.tgz",
+ "integrity": "sha1-V8zbeggh3yGDEhejytVOPhRqECU=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "base64-js": "1.2.0",
+ "xmlbuilder": "8.2.2",
+ "xmldom": "0.1.27"
+ }
+ },
+ "plugin-error": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz",
+ "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==",
+ "requires": {
+ "ansi-colors": "1.1.0",
+ "arr-diff": "4.0.0",
+ "arr-union": "3.1.0",
+ "extend-shallow": "3.0.2"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
+ }
+ }
+ },
+ "pluralize": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
+ "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow=="
+ },
+ "plylog": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/plylog/-/plylog-0.5.0.tgz",
+ "integrity": "sha1-yXbrodgNLdmRAF18EQ2vh0FUeI8=",
+ "dev": true,
+ "requires": {
+ "@types/node": "4.2.23",
+ "@types/winston": "2.3.9",
+ "winston": "2.4.2"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ }
+ }
+ },
+ "polymer-analyzer": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/polymer-analyzer/-/polymer-analyzer-3.0.0.tgz",
+ "integrity": "sha512-TW10EIiVFcE/gjyIFlt9CjtWa2czncsJ+r2EjKKh+gk4cWmJYeO2UUZmnPxyVjk7skFAN5hsyE1eVrfAd+rmJg==",
+ "dev": true,
+ "requires": {
+ "@babel/generator": "7.0.0-beta.46",
+ "@babel/traverse": "7.0.0-beta.46",
+ "@babel/types": "7.0.0-beta.46",
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/chai-subset": "1.3.1",
+ "@types/chalk": "0.4.31",
+ "@types/clone": "0.1.30",
+ "@types/cssbeautify": "0.3.1",
+ "@types/doctrine": "0.0.1",
+ "@types/is-windows": "0.2.0",
+ "@types/minimatch": "3.0.3",
+ "@types/node": "9.6.13",
+ "@types/parse5": "2.2.34",
+ "@types/path-is-inside": "1.0.0",
+ "@types/resolve": "0.0.6",
+ "@types/whatwg-url": "6.4.0",
+ "babylon": "7.0.0-beta.46",
+ "cancel-token": "0.1.1",
+ "chalk": "1.1.3",
+ "clone": "2.1.1",
+ "cssbeautify": "0.3.1",
+ "doctrine": "2.1.0",
+ "dom5": "3.0.0",
+ "indent": "0.0.2",
+ "is-windows": "1.0.2",
+ "jsonschema": "1.2.4",
+ "minimatch": "3.0.4",
+ "parse5": "4.0.0",
+ "path-is-inside": "1.0.2",
+ "resolve": "1.7.1",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.8",
+ "strip-indent": "2.0.0",
+ "vscode-uri": "1.0.3",
+ "whatwg-url": "6.4.1"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "9.6.13",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.13.tgz",
+ "integrity": "sha512-rAlzcc9b66uY+pwvBCjhl9/Nm/mr3rt1/pfHVHDMd0Bfg4olE0UlvaEZh+TM/uwzEFYVnLbDZHG9mVjZrHdv8g==",
+ "dev": true
+ },
+ "@types/resolve": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.6.tgz",
+ "integrity": "sha512-g+Rg8uMWY76oYTyaL+m7ZcblqF/oj7pE6uEUyACluJx4zcop1Lk14qQiocdEkEVMDFm6DmKpxJhsER+ZuTwG3g==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.13"
+ }
+ },
+ "babylon": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.46.tgz",
+ "integrity": "sha512-WFJlg2WatdkXRFMpk7BN/Uzzkjkcjk+WaqnrSCpay+RYl4ypW9ZetZyT9kNt22IH/BQNst3M6PaaBn9IXsUNrg==",
+ "dev": true
+ },
+ "clone": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+ "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
+ "dev": true
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ }
+ }
+ },
+ "polymer-build": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/polymer-build/-/polymer-build-3.0.0.tgz",
+ "integrity": "sha512-O4HBw1X1RmwbLc1xbp0KYQZDG2VUJVHZg5ANVpDpAWvRZgJ65qe4kwFisdm3dtNNV3LHXRAU2TGKSaTledGIsA==",
+ "dev": true,
+ "requires": {
+ "@babel/core": "7.0.0-beta.46",
+ "@babel/plugin-external-helpers": "7.0.0-beta.46",
+ "@babel/plugin-proposal-async-generator-functions": "7.0.0-beta.46",
+ "@babel/plugin-proposal-object-rest-spread": "7.0.0-beta.46",
+ "@babel/plugin-syntax-async-generators": "7.0.0-beta.46",
+ "@babel/plugin-syntax-dynamic-import": "7.0.0-beta.46",
+ "@babel/plugin-syntax-import-meta": "7.0.0-beta.46",
+ "@babel/plugin-syntax-object-rest-spread": "7.0.0-beta.46",
+ "@babel/plugin-transform-arrow-functions": "7.0.0-beta.46",
+ "@babel/plugin-transform-async-to-generator": "7.0.0-beta.46",
+ "@babel/plugin-transform-block-scoped-functions": "7.0.0-beta.46",
+ "@babel/plugin-transform-block-scoping": "7.0.0-beta.46",
+ "@babel/plugin-transform-classes": "7.0.0-beta.35",
+ "@babel/plugin-transform-computed-properties": "7.0.0-beta.46",
+ "@babel/plugin-transform-destructuring": "7.0.0-beta.46",
+ "@babel/plugin-transform-duplicate-keys": "7.0.0-beta.46",
+ "@babel/plugin-transform-exponentiation-operator": "7.0.0-beta.46",
+ "@babel/plugin-transform-for-of": "7.0.0-beta.46",
+ "@babel/plugin-transform-function-name": "7.0.0-beta.46",
+ "@babel/plugin-transform-instanceof": "7.0.0-beta.46",
+ "@babel/plugin-transform-literals": "7.0.0-beta.46",
+ "@babel/plugin-transform-modules-amd": "7.0.0-beta.46",
+ "@babel/plugin-transform-object-super": "7.0.0-beta.46",
+ "@babel/plugin-transform-parameters": "7.0.0-beta.46",
+ "@babel/plugin-transform-regenerator": "7.0.0-beta.46",
+ "@babel/plugin-transform-shorthand-properties": "7.0.0-beta.46",
+ "@babel/plugin-transform-spread": "7.0.0-beta.46",
+ "@babel/plugin-transform-sticky-regex": "7.0.0-beta.46",
+ "@babel/plugin-transform-template-literals": "7.0.0-beta.46",
+ "@babel/plugin-transform-typeof-symbol": "7.0.0-beta.46",
+ "@babel/plugin-transform-unicode-regex": "7.0.0-beta.46",
+ "@babel/traverse": "7.0.0-beta.46",
+ "@polymer/esm-amd-loader": "1.0.0",
+ "@types/babel-types": "6.25.2",
+ "@types/babylon": "6.16.2",
+ "@types/gulp-if": "0.0.33",
+ "@types/html-minifier": "3.5.2",
+ "@types/is-windows": "0.2.0",
+ "@types/mz": "0.0.31",
+ "@types/node": "9.6.13",
+ "@types/parse5": "2.2.34",
+ "@types/resolve": "0.0.7",
+ "@types/uuid": "3.4.3",
+ "@types/vinyl": "2.0.2",
+ "@types/vinyl-fs": "2.4.8",
+ "babel-preset-minify": "0.4.0-alpha.caaefb4c",
+ "babylon": "7.0.0-beta.46",
+ "css-slam": "2.1.1",
+ "dom5": "3.0.0",
+ "gulp-if": "2.0.2",
+ "html-minifier": "3.5.15",
+ "matcher": "1.1.0",
+ "multipipe": "1.0.2",
+ "mz": "2.7.0",
+ "parse5": "4.0.0",
+ "plylog": "0.5.0",
+ "polymer-analyzer": "3.0.0",
+ "polymer-bundler": "4.0.0",
+ "polymer-project-config": "4.0.0",
+ "regenerator-runtime": "0.11.1",
+ "stream": "0.0.2",
+ "sw-precache": "5.2.1",
+ "uuid": "3.2.1",
+ "vinyl": "1.2.0",
+ "vinyl-fs": "2.4.4"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "9.6.13",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.13.tgz",
+ "integrity": "sha512-rAlzcc9b66uY+pwvBCjhl9/Nm/mr3rt1/pfHVHDMd0Bfg4olE0UlvaEZh+TM/uwzEFYVnLbDZHG9mVjZrHdv8g==",
+ "dev": true
+ },
+ "@types/resolve": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.7.tgz",
+ "integrity": "sha512-GPewdjkb0Q76o459qgp6pBLzJj/bD3oveS2kfLhIkZ9U3t3AFKtl5DlFB6lGTw0iZmcmxoGC8lpLW3NNJKrN9A==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.13"
+ }
+ },
+ "@types/vinyl-fs": {
+ "version": "2.4.8",
+ "resolved": "https://registry.npmjs.org/@types/vinyl-fs/-/vinyl-fs-2.4.8.tgz",
+ "integrity": "sha512-yE2pN9OOrxJVeO7IZLHAHrh5R4Q0osbn5WQRuQU6GdXoK7dNFrMK3K7YhATkzf3z0yQBkol3+gafs7Rp0s7dDg==",
+ "dev": true,
+ "requires": {
+ "@types/glob-stream": "6.1.0",
+ "@types/node": "9.6.13",
+ "@types/vinyl": "2.0.2"
+ }
+ },
+ "babylon": {
+ "version": "7.0.0-beta.46",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.46.tgz",
+ "integrity": "sha512-WFJlg2WatdkXRFMpk7BN/Uzzkjkcjk+WaqnrSCpay+RYl4ypW9ZetZyT9kNt22IH/BQNst3M6PaaBn9IXsUNrg==",
+ "dev": true
+ },
+ "multipipe": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-1.0.2.tgz",
+ "integrity": "sha1-zBPv2DPJzamfIk+GhGG44aP9k50=",
+ "dev": true,
+ "requires": {
+ "duplexer2": "0.1.4",
+ "object-assign": "4.1.1"
+ }
+ }
+ }
+ },
+ "polymer-bundler": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/polymer-bundler/-/polymer-bundler-4.0.0.tgz",
+ "integrity": "sha512-Bp3lOw3ADJq/Zo6uPibA0kdbJAetcFVVnp1hljoyx7k7Q4klZBlno7M4ILsfPJhGp48KM1aApqHEWmpW3OSHTw==",
+ "dev": true,
+ "requires": {
+ "@types/acorn": "4.0.3",
+ "@types/babel-generator": "6.25.1",
+ "@types/babel-traverse": "6.25.3",
+ "acorn-import-meta": "0.2.1",
+ "babel-generator": "6.26.1",
+ "babel-traverse": "6.26.0",
+ "clone": "2.1.1",
+ "command-line-args": "3.0.5",
+ "command-line-usage": "3.0.8",
+ "dom5": "2.3.0",
+ "espree": "3.5.4",
+ "magic-string": "0.22.5",
+ "mkdirp": "0.5.1",
+ "parse5": "2.2.3",
+ "polymer-analyzer": "3.0.0",
+ "rollup": "0.58.2",
+ "source-map": "0.5.7",
+ "vscode-uri": "1.0.3"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.109",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.109.tgz",
+ "integrity": "sha512-z8zzzMkjsMI4TgrjjRIvC5kcpqKE8euFbGvImGiujpdKsxbxiy6KguRJ93SFoEOKqeOsKBpaaHjobthVq6EOCg==",
+ "dev": true
+ },
+ "clone": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+ "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
+ "dev": true
+ },
+ "dom5": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-2.3.0.tgz",
+ "integrity": "sha1-+CBJdb0NrLvltYqKk//B/tD/zSo=",
+ "dev": true,
+ "requires": {
+ "@types/clone": "0.1.30",
+ "@types/node": "6.0.109",
+ "@types/parse5": "2.2.34",
+ "clone": "2.1.1",
+ "parse5": "2.2.3"
+ }
+ },
+ "parse5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-2.2.3.tgz",
+ "integrity": "sha1-DE/EHBAAxea5PUiwP4CDg3g06fY=",
+ "dev": true
+ }
+ }
+ },
+ "polymer-linter": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/polymer-linter/-/polymer-linter-3.0.0.tgz",
+ "integrity": "sha512-YM6+kE3DmTvVlyXJYDVfgvyi4ZUJIZYF3zl8BHx65SKtyjdRmweUQolB/dQuFiVAY29APyjAWSh/V7fVwgVF4g==",
+ "dev": true,
+ "requires": {
+ "@types/fast-levenshtein": "0.0.1",
+ "@types/parse5": "2.2.34",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0",
+ "cancel-token": "0.1.1",
+ "css-what": "2.1.0",
+ "dom5": "3.0.0",
+ "fast-levenshtein": "2.0.6",
+ "parse5": "4.0.0",
+ "polymer-analyzer": "3.0.0",
+ "shady-css-parser": "0.1.0",
+ "stable": "0.1.8",
+ "strip-indent": "2.0.0",
+ "validate-element-name": "2.1.1"
+ },
+ "dependencies": {
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-4.0.0.tgz",
+ "integrity": "sha512-OP0iEEOrWl09EQETtyEr409ZHdNrQ3PNp5uDWmTIuBthOKkoenFxnptVikY3tp6e8g/JjQE5mxVKpLPIzBg7xg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.13",
+ "browser-capabilities": "1.1.0",
+ "jsonschema": "1.2.4",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "9.6.13",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.13.tgz",
+ "integrity": "sha512-rAlzcc9b66uY+pwvBCjhl9/Nm/mr3rt1/pfHVHDMd0Bfg4olE0UlvaEZh+TM/uwzEFYVnLbDZHG9mVjZrHdv8g==",
+ "dev": true
+ }
+ }
+ },
+ "polyserve": {
+ "version": "0.27.11",
+ "resolved": "https://registry.npmjs.org/polyserve/-/polyserve-0.27.11.tgz",
+ "integrity": "sha512-C6laEBzDawtKzJEojv2wjUbuu66fNFEOfHsbHztrw0jn0CZsaV1okWEuFczgMNgW5ZL+Eg+QC4hzsHNA1dZZaw==",
+ "dev": true,
+ "requires": {
+ "@types/compression": "0.0.33",
+ "@types/content-type": "1.1.2",
+ "@types/escape-html": "0.0.20",
+ "@types/express": "4.11.1",
+ "@types/mime": "0.0.29",
+ "@types/mz": "0.0.29",
+ "@types/node": "9.6.13",
+ "@types/opn": "3.0.28",
+ "@types/parse5": "2.2.34",
+ "@types/pem": "1.9.3",
+ "@types/resolve": "0.0.6",
+ "@types/serve-static": "1.13.2",
+ "@types/spdy": "3.4.4",
+ "bower-config": "1.4.1",
+ "browser-capabilities": "1.1.0",
+ "command-line-args": "3.0.5",
+ "command-line-usage": "3.0.8",
+ "compression": "1.7.2",
+ "content-type": "1.0.4",
+ "escape-html": "1.0.3",
+ "express": "4.16.3",
+ "find-port": "1.0.1",
+ "http-proxy-middleware": "0.17.4",
+ "lru-cache": "4.1.3",
+ "mime": "1.6.0",
+ "mz": "2.7.0",
+ "opn": "3.0.3",
+ "pem": "1.12.5",
+ "polymer-build": "3.0.0",
+ "polymer-project-config": "4.0.0",
+ "requirejs": "2.3.5",
+ "resolve": "1.7.1",
+ "send": "0.14.2",
+ "spdy": "3.4.7"
+ },
+ "dependencies": {
+ "@types/mz": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/mz/-/mz-0.0.29.tgz",
+ "integrity": "sha1-vCRyjGSZc/HHhR6QM/nOUlZowns=",
+ "dev": true,
+ "requires": {
+ "@types/bluebird": "3.5.20",
+ "@types/node": "9.6.13"
+ }
+ },
+ "@types/node": {
+ "version": "9.6.13",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.13.tgz",
+ "integrity": "sha512-rAlzcc9b66uY+pwvBCjhl9/Nm/mr3rt1/pfHVHDMd0Bfg4olE0UlvaEZh+TM/uwzEFYVnLbDZHG9mVjZrHdv8g==",
+ "dev": true
+ },
+ "@types/resolve": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.6.tgz",
+ "integrity": "sha512-g+Rg8uMWY76oYTyaL+m7ZcblqF/oj7pE6uEUyACluJx4zcop1Lk14qQiocdEkEVMDFm6DmKpxJhsER+ZuTwG3g==",
+ "dev": true,
+ "requires": {
+ "@types/node": "9.6.13"
+ }
+ }
+ }
+ },
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs="
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
+ },
+ "prepend-http": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
+ "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw="
+ },
+ "preserve": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
+ "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks="
+ },
+ "pretty-bytes": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz",
+ "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk="
+ },
+ "pretty-hrtime": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
+ "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE="
+ },
+ "private": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
+ "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
+ "dev": true
+ },
+ "process-nextick-args": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
+ "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
+ },
+ "progress": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz",
+ "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8="
+ },
+ "promisify-node": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/promisify-node/-/promisify-node-0.4.0.tgz",
+ "integrity": "sha1-MoA4dOxBF4TkeGwzmQKoeheaRpw=",
+ "dev": true,
+ "requires": {
+ "nodegit-promise": "4.0.0",
+ "object-assign": "4.1.1"
+ }
+ },
+ "proxy-addr": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz",
+ "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==",
+ "dev": true,
+ "requires": {
+ "forwarded": "0.1.2",
+ "ipaddr.js": "1.6.0"
+ }
+ },
+ "proxy-from-env": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
+ "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4="
+ },
+ "pseudomap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
+ },
+ "pump": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
+ "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "1.4.1",
+ "once": "1.4.0"
+ }
+ },
+ "pumpify": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.0.tgz",
+ "integrity": "sha512-UWi0klDoq8xtVzlMRgENV9F7iCTZExaJQSQL187UXsxpk9NnrKGqTqqUNYAKGOzucSOxs2+jUnRNI+rLviPhJg==",
+ "dev": true,
+ "requires": {
+ "duplexify": "3.6.0",
+ "inherits": "2.0.3",
+ "pump": "2.0.1"
+ }
+ },
+ "punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+ "dev": true
+ },
+ "puppeteer": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.3.0.tgz",
+ "integrity": "sha512-wx10aPQPpGJVxdB6yoDSLm9p4rCwARUSLMVV0bx++owuqkvviXKyiFM3EWsywaFmjOKNPXacIjplF7xhHiFP3w==",
+ "requires": {
+ "debug": "2.6.9",
+ "extract-zip": "1.6.6",
+ "https-proxy-agent": "2.2.1",
+ "mime": "1.6.0",
+ "progress": "2.0.0",
+ "proxy-from-env": "1.0.0",
+ "rimraf": "2.6.2",
+ "ws": "3.3.3"
+ },
+ "dependencies": {
+ "agent-base": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.0.tgz",
+ "integrity": "sha512-c+R/U5X+2zz2+UCrCFv6odQzJdoqI+YecuhnAJLa1zYaMc13zPfwMwZrr91Pd1DYNo/yPRbiM4WVf9whgwFsIg==",
+ "requires": {
+ "es6-promisify": "5.0.0"
+ }
+ },
+ "https-proxy-agent": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz",
+ "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==",
+ "requires": {
+ "agent-base": "4.2.0",
+ "debug": "3.1.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ }
+ }
+ },
+ "q": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
+ "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
+ "dev": true,
+ "optional": true
+ },
+ "qs": {
+ "version": "6.5.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+ "dev": true
+ },
+ "randomatic": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz",
+ "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==",
+ "requires": {
+ "is-number": "4.0.0",
+ "kind-of": "6.0.2",
+ "math-random": "1.0.1"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ=="
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+ }
+ }
+ },
+ "range-parser": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
+ "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=",
+ "dev": true
+ },
+ "raw-body": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz",
+ "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=",
+ "dev": true,
+ "requires": {
+ "bytes": "3.0.0",
+ "http-errors": "1.6.2",
+ "iconv-lite": "0.4.19",
+ "unpipe": "1.0.0"
+ },
+ "dependencies": {
+ "depd": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz",
+ "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=",
+ "dev": true
+ },
+ "http-errors": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz",
+ "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=",
+ "dev": true,
+ "requires": {
+ "depd": "1.1.1",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.0.3",
+ "statuses": "1.4.0"
+ }
+ },
+ "iconv-lite": {
+ "version": "0.4.19",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
+ "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==",
+ "dev": true
+ },
+ "setprototypeof": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz",
+ "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=",
+ "dev": true
+ }
+ }
+ },
+ "rc": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.7.tgz",
+ "integrity": "sha512-LdLD8xD4zzLsAT5xyushXDNscEjB7+2ulnl8+r1pnESlYtlJtVSoCMBGr30eDRJ3+2Gq89jK9P9e4tCEH1+ywA==",
+ "dev": true,
+ "requires": {
+ "deep-extend": "0.5.1",
+ "ini": "1.3.5",
+ "minimist": "1.2.0",
+ "strip-json-comments": "2.0.1"
+ },
+ "dependencies": {
+ "deep-extend": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz",
+ "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==",
+ "dev": true
+ }
+ }
+ },
+ "read-all-stream": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz",
+ "integrity": "sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po=",
+ "dev": true,
+ "requires": {
+ "pinkie-promise": "2.0.1",
+ "readable-stream": "2.3.6"
+ }
+ },
+ "read-chunk": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-2.1.0.tgz",
+ "integrity": "sha1-agTAkoAF7Z1C4aasVgDhnLx/9lU=",
+ "requires": {
+ "pify": "3.0.0",
+ "safe-buffer": "5.1.2"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
+ }
+ }
+ },
+ "read-pkg": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+ "dev": true,
+ "requires": {
+ "load-json-file": "1.1.0",
+ "normalize-package-data": "2.4.0",
+ "path-type": "1.1.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+ "dev": true,
+ "requires": {
+ "find-up": "1.1.2",
+ "read-pkg": "1.1.0"
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.0",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "readdirp": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz",
+ "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "minimatch": "3.0.4",
+ "readable-stream": "2.3.6",
+ "set-immediate-shim": "1.0.1"
+ }
+ },
+ "rechoir": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
+ "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
+ "requires": {
+ "resolve": "1.7.1"
+ }
+ },
+ "redent": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
+ "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+ "dev": true,
+ "requires": {
+ "indent-string": "2.1.0",
+ "strip-indent": "1.0.1"
+ }
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerate": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz",
+ "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==",
+ "dev": true
+ },
+ "regenerate-unicode-properties": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-5.1.3.tgz",
+ "integrity": "sha512-Yjy6t7jFQczDhYE+WVm7pg6gWYE258q4sUkk9qDErwXJIqx7jU9jGrMFHutJK/SRfcg7MEkXjGaYiVlOZyev/A==",
+ "dev": true,
+ "requires": {
+ "regenerate": "1.3.3"
+ }
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
+ },
+ "regenerator-transform": {
+ "version": "0.12.3",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.12.3.tgz",
+ "integrity": "sha512-y2uxO/6u+tVmtEDIKo+tLCtI0GcbQr0OreosKgCd7HP4VypGjtTrw79DezuwT+W5QX0YWuvpeBOgumrepwM1kA==",
+ "dev": true,
+ "requires": {
+ "private": "0.1.8"
+ }
+ },
+ "regex-cache": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
+ "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
+ "requires": {
+ "is-equal-shallow": "0.1.3"
+ }
+ },
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "requires": {
+ "extend-shallow": "3.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "regexpp": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz",
+ "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw=="
+ },
+ "regexpu-core": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.1.3.tgz",
+ "integrity": "sha512-mB+njEzO7oezA57IbQxxd6fVPOeWKDmnGvJ485CwmfNchjHe5jWwqKepapmzUEj41yxIAqOg+C4LbXuJlkiO8A==",
+ "dev": true,
+ "requires": {
+ "regenerate": "1.3.3",
+ "regenerate-unicode-properties": "5.1.3",
+ "regjsgen": "0.3.0",
+ "regjsparser": "0.2.1",
+ "unicode-match-property-ecmascript": "1.0.3",
+ "unicode-match-property-value-ecmascript": "1.0.1"
+ }
+ },
+ "registry-auth-token": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz",
+ "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==",
+ "dev": true,
+ "requires": {
+ "rc": "1.2.7",
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "registry-url": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz",
+ "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=",
+ "dev": true,
+ "requires": {
+ "rc": "1.2.7"
+ }
+ },
+ "regjsgen": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.3.0.tgz",
+ "integrity": "sha1-DuSj6SdkMM2iXx54nqbBW4ewy0M=",
+ "dev": true
+ },
+ "regjsparser": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.2.1.tgz",
+ "integrity": "sha1-w3h1U/rwTndcMCEC7zRtmVAA7Bw=",
+ "dev": true,
+ "requires": {
+ "jsesc": "0.5.0"
+ },
+ "dependencies": {
+ "jsesc": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+ "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+ "dev": true
+ }
+ }
+ },
+ "relateurl": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
+ "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=",
+ "dev": true
+ },
+ "remove-trailing-separator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8="
+ },
+ "repeat-element": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
+ "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo="
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "replace-ext": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
+ "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ="
+ },
+ "request": {
+ "version": "2.85.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz",
+ "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==",
+ "dev": true,
+ "requires": {
+ "aws-sign2": "0.7.0",
+ "aws4": "1.7.0",
+ "caseless": "0.12.0",
+ "combined-stream": "1.0.6",
+ "extend": "3.0.1",
+ "forever-agent": "0.6.1",
+ "form-data": "2.3.2",
+ "har-validator": "5.0.3",
+ "hawk": "6.0.2",
+ "http-signature": "1.2.0",
+ "is-typedarray": "1.0.0",
+ "isstream": "0.1.2",
+ "json-stringify-safe": "5.0.1",
+ "mime-types": "2.1.18",
+ "oauth-sign": "0.8.2",
+ "performance-now": "2.1.0",
+ "qs": "6.5.2",
+ "safe-buffer": "5.1.2",
+ "stringstream": "0.0.5",
+ "tough-cookie": "2.3.4",
+ "tunnel-agent": "0.6.0",
+ "uuid": "3.2.1"
+ }
+ },
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
+ },
+ "require-main-filename": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
+ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE="
+ },
+ "require-package-name": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/require-package-name/-/require-package-name-2.0.1.tgz",
+ "integrity": "sha1-wR6XJ2tluOKSP3Xav1+y7ww4Qbk="
+ },
+ "require-uncached": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
+ "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
+ "requires": {
+ "caller-path": "0.1.0",
+ "resolve-from": "1.0.1"
+ }
+ },
+ "requirejs": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.5.tgz",
+ "integrity": "sha512-svnO+aNcR/an9Dpi44C7KSAy5fFGLtmPbaaCeQaklUz8BQhS64tWWIIlvEA5jrWICzlO/X9KSzSeXFnZdBu8nw==",
+ "dev": true
+ },
+ "requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
+ "dev": true
+ },
+ "resolve": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz",
+ "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==",
+ "requires": {
+ "path-parse": "1.0.5"
+ }
+ },
+ "resolve-dir": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz",
+ "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=",
+ "dev": true,
+ "requires": {
+ "expand-tilde": "1.2.2",
+ "global-modules": "0.2.3"
+ }
+ },
+ "resolve-from": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz",
+ "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY="
+ },
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo="
+ },
+ "restore-cursor": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz",
+ "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=",
+ "requires": {
+ "exit-hook": "1.1.1",
+ "onetime": "1.1.0"
+ }
+ },
+ "ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg=="
+ },
+ "right-align": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
+ "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
+ "optional": true,
+ "requires": {
+ "align-text": "0.1.4"
+ }
+ },
+ "rimraf": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
+ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
+ "requires": {
+ "glob": "7.1.2"
+ }
+ },
+ "rollup": {
+ "version": "0.58.2",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.58.2.tgz",
+ "integrity": "sha512-RZVvCWm9BHOYloaE6LLiE/ibpjv1CmI8F8k0B0Cp+q1eezo3cswszJH1DN0djgzSlo0hjuuCmyeI+1XOYLl4wg==",
+ "dev": true,
+ "requires": {
+ "@types/estree": "0.0.38",
+ "@types/node": "8.10.13"
+ },
+ "dependencies": {
+ "@types/estree": {
+ "version": "0.0.38",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.38.tgz",
+ "integrity": "sha512-F/v7t1LwS4vnXuPooJQGBRKRGIoxWUTmA4VHfqjOccFsNDThD5bfUNpITive6s352O7o384wcpEaDV8rHCehDA==",
+ "dev": true
+ }
+ }
+ },
+ "run-async": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
+ "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
+ "requires": {
+ "is-promise": "2.1.0"
+ }
+ },
+ "run-sequence": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/run-sequence/-/run-sequence-1.2.2.tgz",
+ "integrity": "sha1-UJWgvr6YczsBQL0I3YDsAw3azes=",
+ "requires": {
+ "chalk": "1.1.3",
+ "gulp-util": "3.0.8"
+ }
+ },
+ "rx": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz",
+ "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I="
+ },
+ "rx-lite": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz",
+ "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ="
+ },
+ "rx-lite-aggregates": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz",
+ "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=",
+ "requires": {
+ "rx-lite": "4.0.8"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ },
+ "safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "requires": {
+ "ret": "0.1.15"
+ }
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+ },
+ "samsam": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz",
+ "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc="
+ },
+ "sauce-connect-launcher": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/sauce-connect-launcher/-/sauce-connect-launcher-1.2.4.tgz",
+ "integrity": "sha512-X2vfwulR6brUGiicXKxPm1GJ7dBEeP1II450Uv4bHGrcGOapZNgzJvn9aioea5IC5BPp/7qjKdE3xbbTBIVXMA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "adm-zip": "0.4.9",
+ "async": "2.6.0",
+ "https-proxy-agent": "2.2.1",
+ "lodash": "4.17.10",
+ "rimraf": "2.6.2"
+ },
+ "dependencies": {
+ "agent-base": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.0.tgz",
+ "integrity": "sha512-c+R/U5X+2zz2+UCrCFv6odQzJdoqI+YecuhnAJLa1zYaMc13zPfwMwZrr91Pd1DYNo/yPRbiM4WVf9whgwFsIg==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "es6-promisify": "5.0.0"
+ }
+ },
+ "async": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz",
+ "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "lodash": "4.17.10"
+ }
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "https-proxy-agent": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz",
+ "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "agent-base": "4.2.0",
+ "debug": "3.1.0"
+ }
+ }
+ }
+ },
+ "scoped-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/scoped-regex/-/scoped-regex-1.0.0.tgz",
+ "integrity": "sha1-o0a7Gs1CB65wvXwMfKnlZra63bg="
+ },
+ "select-hose": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
+ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=",
+ "dev": true
+ },
+ "selenium-standalone": {
+ "version": "6.14.0",
+ "resolved": "https://registry.npmjs.org/selenium-standalone/-/selenium-standalone-6.14.0.tgz",
+ "integrity": "sha512-NTpcPZq8OkMuuhcPRXoI3Gx2qELMDFvs970h7jzoayLkmRd8DxqjNXy8L7Ainxnmo0er0uF2GsUda07Eu0k5EA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "async": "2.6.0",
+ "commander": "2.9.0",
+ "cross-spawn": "6.0.5",
+ "debug": "3.1.0",
+ "lodash": "4.17.10",
+ "minimist": "1.2.0",
+ "mkdirp": "0.5.1",
+ "progress": "2.0.0",
+ "request": "2.79.0",
+ "tar-stream": "1.5.2",
+ "urijs": "1.19.1",
+ "which": "1.3.0",
+ "yauzl": "2.9.1"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz",
+ "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=",
+ "dev": true,
+ "optional": true
+ },
+ "async": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz",
+ "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "lodash": "4.17.10"
+ }
+ },
+ "aws-sign2": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz",
+ "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=",
+ "dev": true,
+ "optional": true
+ },
+ "boom": {
+ "version": "2.10.1",
+ "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz",
+ "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=",
+ "dev": true,
+ "requires": {
+ "hoek": "2.16.3"
+ }
+ },
+ "caseless": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz",
+ "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=",
+ "dev": true,
+ "optional": true
+ },
+ "cross-spawn": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "nice-try": "1.0.4",
+ "path-key": "2.0.1",
+ "semver": "5.5.0",
+ "shebang-command": "1.2.0",
+ "which": "1.3.0"
+ }
+ },
+ "cryptiles": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz",
+ "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "boom": "2.10.1"
+ }
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "form-data": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz",
+ "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "asynckit": "0.4.0",
+ "combined-stream": "1.0.6",
+ "mime-types": "2.1.18"
+ }
+ },
+ "har-validator": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz",
+ "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "commander": "2.9.0",
+ "is-my-json-valid": "2.17.2",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "hawk": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz",
+ "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "boom": "2.10.1",
+ "cryptiles": "2.0.5",
+ "hoek": "2.16.3",
+ "sntp": "1.0.9"
+ }
+ },
+ "hoek": {
+ "version": "2.16.3",
+ "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
+ "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=",
+ "dev": true
+ },
+ "http-signature": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz",
+ "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "assert-plus": "0.2.0",
+ "jsprim": "1.4.1",
+ "sshpk": "1.14.1"
+ }
+ },
+ "qs": {
+ "version": "6.3.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz",
+ "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=",
+ "dev": true,
+ "optional": true
+ },
+ "request": {
+ "version": "2.79.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz",
+ "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "aws-sign2": "0.6.0",
+ "aws4": "1.7.0",
+ "caseless": "0.11.0",
+ "combined-stream": "1.0.6",
+ "extend": "3.0.1",
+ "forever-agent": "0.6.1",
+ "form-data": "2.1.4",
+ "har-validator": "2.0.6",
+ "hawk": "3.1.3",
+ "http-signature": "1.1.1",
+ "is-typedarray": "1.0.0",
+ "isstream": "0.1.2",
+ "json-stringify-safe": "5.0.1",
+ "mime-types": "2.1.18",
+ "oauth-sign": "0.8.2",
+ "qs": "6.3.2",
+ "stringstream": "0.0.5",
+ "tough-cookie": "2.3.4",
+ "tunnel-agent": "0.4.3",
+ "uuid": "3.2.1"
+ }
+ },
+ "sntp": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz",
+ "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "hoek": "2.16.3"
+ }
+ },
+ "tar-stream": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.2.tgz",
+ "integrity": "sha1-+8bG6DwaGdTLSMfZYXH8JI7/x78=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "bl": "1.2.2",
+ "end-of-stream": "1.4.1",
+ "readable-stream": "2.3.6",
+ "xtend": "4.0.1"
+ }
+ },
+ "tunnel-agent": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz",
+ "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=",
+ "dev": true,
+ "optional": true
+ },
+ "yauzl": {
+ "version": "2.9.1",
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.9.1.tgz",
+ "integrity": "sha1-qBmB6nCleUYTOIPwKcWCGok1mn8=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "buffer-crc32": "0.2.13",
+ "fd-slicer": "1.0.1"
+ }
+ }
+ }
+ },
+ "semver": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
+ "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA=="
+ },
+ "semver-diff": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz",
+ "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=",
+ "dev": true,
+ "requires": {
+ "semver": "5.5.0"
+ }
+ },
+ "send": {
+ "version": "0.14.2",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.14.2.tgz",
+ "integrity": "sha1-ObBDiz9RC+Xcb2Z6EfcWiTaM3u8=",
+ "dev": true,
+ "requires": {
+ "debug": "2.2.0",
+ "depd": "1.1.2",
+ "destroy": "1.0.4",
+ "encodeurl": "1.0.2",
+ "escape-html": "1.0.3",
+ "etag": "1.7.0",
+ "fresh": "0.3.0",
+ "http-errors": "1.5.1",
+ "mime": "1.3.4",
+ "ms": "0.7.2",
+ "on-finished": "2.3.0",
+ "range-parser": "1.2.0",
+ "statuses": "1.3.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
+ "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=",
+ "dev": true,
+ "requires": {
+ "ms": "0.7.1"
+ },
+ "dependencies": {
+ "ms": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz",
+ "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=",
+ "dev": true
+ }
+ }
+ },
+ "etag": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz",
+ "integrity": "sha1-A9MLX2fdbmMtKUXTDWZScxo01dg=",
+ "dev": true
+ },
+ "fresh": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz",
+ "integrity": "sha1-ZR+DjiJCTnVm3hYdg1jKoZn4PU8=",
+ "dev": true
+ },
+ "http-errors": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.5.1.tgz",
+ "integrity": "sha1-eIwNLB3iyBuebowBhDtrl+uSB1A=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "setprototypeof": "1.0.2",
+ "statuses": "1.3.1"
+ }
+ },
+ "mime": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz",
+ "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=",
+ "dev": true
+ },
+ "ms": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz",
+ "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=",
+ "dev": true
+ },
+ "setprototypeof": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.2.tgz",
+ "integrity": "sha1-gaVSFB7BBLiOic44MQOtXGZWTQg=",
+ "dev": true
+ },
+ "statuses": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
+ "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=",
+ "dev": true
+ }
+ }
+ },
+ "sequencify": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz",
+ "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw="
+ },
+ "serve-static": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
+ "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==",
+ "dev": true,
+ "requires": {
+ "encodeurl": "1.0.2",
+ "escape-html": "1.0.3",
+ "parseurl": "1.3.2",
+ "send": "0.16.2"
+ },
+ "dependencies": {
+ "mime": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
+ "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==",
+ "dev": true
+ },
+ "send": {
+ "version": "0.16.2",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
+ "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "depd": "1.1.2",
+ "destroy": "1.0.4",
+ "encodeurl": "1.0.2",
+ "escape-html": "1.0.3",
+ "etag": "1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "1.6.3",
+ "mime": "1.4.1",
+ "ms": "2.0.0",
+ "on-finished": "2.3.0",
+ "range-parser": "1.2.0",
+ "statuses": "1.4.0"
+ }
+ }
+ }
+ },
+ "server-destroy": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz",
+ "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=",
+ "dev": true
+ },
+ "serviceworker-cache-polyfill": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/serviceworker-cache-polyfill/-/serviceworker-cache-polyfill-4.0.0.tgz",
+ "integrity": "sha1-3hnuc77yGrPAdAo3sz22JGS6ves=",
+ "dev": true
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
+ },
+ "set-immediate-shim": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
+ "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=",
+ "dev": true
+ },
+ "set-value": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
+ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "split-string": "3.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "setprototypeof": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
+ "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
+ "dev": true
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+ "requires": {
+ "shebang-regex": "1.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
+ },
+ "shelljs": {
+ "version": "0.7.8",
+ "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz",
+ "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=",
+ "requires": {
+ "glob": "7.1.2",
+ "interpret": "1.1.0",
+ "rechoir": "0.6.2"
+ }
+ },
+ "sigmund": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz",
+ "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA="
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
+ },
+ "sinon": {
+ "version": "1.17.7",
+ "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz",
+ "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=",
+ "requires": {
+ "formatio": "1.1.1",
+ "lolex": "1.3.2",
+ "samsam": "1.1.2",
+ "util": "0.10.3"
+ }
+ },
+ "sinon-chai": {
+ "version": "2.14.0",
+ "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-2.14.0.tgz",
+ "integrity": "sha512-9stIF1utB0ywNHNT7RgiXbdmen8QDCRsrTjw+G9TgKt1Yexjiv8TOWZ6WHsTPz57Yky3DIswZvEqX8fpuHNDtQ==",
+ "dev": true
+ },
+ "slash": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
+ "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
+ "dev": true
+ },
+ "slice-ansi": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz",
+ "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==",
+ "requires": {
+ "is-fullwidth-code-point": "2.0.0"
+ },
+ "dependencies": {
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
+ }
+ }
+ },
+ "slide": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz",
+ "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=",
+ "dev": true
+ },
+ "snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "requires": {
+ "base": "0.11.2",
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "map-cache": "0.2.2",
+ "source-map": "0.5.7",
+ "source-map-resolve": "0.5.1",
+ "use": "3.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "requires": {
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "snapdragon-util": "3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+ }
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ },
+ "sntp": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz",
+ "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==",
+ "dev": true,
+ "requires": {
+ "hoek": "4.2.1"
+ }
+ },
+ "socket.io": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.0.tgz",
+ "integrity": "sha512-KS+3CNWWNtLbVN5j0/B+1hjxRzey+oTK6ejpAOoxMZis6aXeB8cUtfuvjHl97tuZx+t/qD/VyqFMjuzu2Js6uQ==",
+ "dev": true,
+ "requires": {
+ "debug": "3.1.0",
+ "engine.io": "3.2.0",
+ "has-binary2": "1.0.2",
+ "socket.io-adapter": "1.1.1",
+ "socket.io-client": "2.1.0",
+ "socket.io-parser": "3.2.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "socket.io-adapter": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz",
+ "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=",
+ "dev": true
+ },
+ "socket.io-client": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.0.tgz",
+ "integrity": "sha512-TvKPpL0cBON5LduQfR8Rxrr+ktj70bLXGvqHCL3er5avBXruB3gpnbaud5ikFYVfANH1gCABAvo0qN8Axpg2ew==",
+ "dev": true,
+ "requires": {
+ "backo2": "1.0.2",
+ "base64-arraybuffer": "0.1.5",
+ "component-bind": "1.0.0",
+ "component-emitter": "1.2.1",
+ "debug": "3.1.0",
+ "engine.io-client": "3.2.1",
+ "has-binary2": "1.0.2",
+ "has-cors": "1.1.0",
+ "indexof": "0.0.1",
+ "object-component": "0.0.3",
+ "parseqs": "0.0.5",
+ "parseuri": "0.0.5",
+ "socket.io-parser": "3.2.0",
+ "to-array": "0.1.4"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "socket.io-parser": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz",
+ "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==",
+ "dev": true,
+ "requires": {
+ "component-emitter": "1.2.1",
+ "debug": "3.1.0",
+ "isarray": "2.0.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "isarray": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
+ "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=",
+ "dev": true
+ }
+ }
+ },
+ "sort-keys": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz",
+ "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=",
+ "dev": true,
+ "requires": {
+ "is-plain-obj": "1.1.0"
+ }
+ },
+ "sort-keys-length": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz",
+ "integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=",
+ "dev": true,
+ "requires": {
+ "sort-keys": "1.1.2"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+ },
+ "source-map-resolve": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz",
+ "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==",
+ "requires": {
+ "atob": "2.1.1",
+ "decode-uri-component": "0.2.0",
+ "resolve-url": "0.2.1",
+ "source-map-url": "0.4.0",
+ "urix": "0.1.0"
+ }
+ },
+ "source-map-support": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.5.tgz",
+ "integrity": "sha512-mR7/Nd5l1z6g99010shcXJiNEaf3fEtmLhRB/sBcQVJGodcHCULPp2y4Sfa43Kv2zq7T+Izmfp/WHCR6dYkQCA==",
+ "requires": {
+ "buffer-from": "1.0.0",
+ "source-map": "0.6.1"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ }
+ }
+ },
+ "source-map-url": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM="
+ },
+ "sparkles": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz",
+ "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM="
+ },
+ "spawn-sync": {
+ "version": "1.0.15",
+ "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz",
+ "integrity": "sha1-sAeZVX63+wyDdsKdROih6mfldHY=",
+ "requires": {
+ "concat-stream": "1.6.2",
+ "os-shim": "0.1.3"
+ }
+ },
+ "spdx-correct": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz",
+ "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==",
+ "requires": {
+ "spdx-expression-parse": "3.0.0",
+ "spdx-license-ids": "3.0.0"
+ }
+ },
+ "spdx-exceptions": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz",
+ "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg=="
+ },
+ "spdx-expression-parse": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
+ "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
+ "requires": {
+ "spdx-exceptions": "2.1.0",
+ "spdx-license-ids": "3.0.0"
+ }
+ },
+ "spdx-license-ids": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz",
+ "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA=="
+ },
+ "spdy": {
+ "version": "3.4.7",
+ "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz",
+ "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "handle-thing": "1.2.5",
+ "http-deceiver": "1.2.7",
+ "safe-buffer": "5.1.2",
+ "select-hose": "2.0.0",
+ "spdy-transport": "2.1.0"
+ }
+ },
+ "spdy-transport": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.0.tgz",
+ "integrity": "sha512-bpUeGpZcmZ692rrTiqf9/2EUakI6/kXX1Rpe0ib/DyOzbiexVfXkw6GnvI9hVGvIwVaUhkaBojjCZwLNRGQg1g==",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "detect-node": "2.0.3",
+ "hpack.js": "2.1.6",
+ "obuf": "1.1.2",
+ "readable-stream": "2.3.6",
+ "safe-buffer": "5.1.2",
+ "wbuf": "1.7.3"
+ }
+ },
+ "split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "requires": {
+ "extend-shallow": "3.0.2"
+ }
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
+ },
+ "sshpk": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz",
+ "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=",
+ "dev": true,
+ "requires": {
+ "asn1": "0.2.3",
+ "assert-plus": "1.0.0",
+ "bcrypt-pbkdf": "1.0.1",
+ "dashdash": "1.14.1",
+ "ecc-jsbn": "0.1.1",
+ "getpass": "0.1.7",
+ "jsbn": "0.1.1",
+ "tweetnacl": "0.14.5"
+ }
+ },
+ "stable": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
+ "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "stacky": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/stacky/-/stacky-1.3.1.tgz",
+ "integrity": "sha1-PxF+UYe5pz0j+HbWnwXIWxGAShI=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "lodash": "3.10.1"
+ },
+ "dependencies": {
+ "lodash": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
+ "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
+ "dev": true
+ }
+ }
+ },
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "requires": {
+ "define-property": "0.2.5",
+ "object-copy": "0.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "statuses": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
+ "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==",
+ "dev": true
+ },
+ "stream": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/stream/-/stream-0.0.2.tgz",
+ "integrity": "sha1-f1Nj8Ff2WSxVlfALyAon9c7B8O8=",
+ "dev": true,
+ "requires": {
+ "emitter-component": "1.1.1"
+ }
+ },
+ "stream-consume": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.1.tgz",
+ "integrity": "sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg=="
+ },
+ "stream-shift": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
+ "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI="
+ },
+ "streamsearch": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz",
+ "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=",
+ "dev": true
+ },
+ "string-template": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz",
+ "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0="
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "stringstream": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
+ "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "requires": {
+ "is-utf8": "0.2.1"
+ }
+ },
+ "strip-bom-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz",
+ "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=",
+ "requires": {
+ "first-chunk-stream": "1.0.0",
+ "strip-bom": "2.0.0"
+ }
+ },
+ "strip-eof": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
+ },
+ "strip-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
+ "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+ "dev": true,
+ "requires": {
+ "get-stdin": "4.0.1"
+ }
+ },
+ "strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+ },
+ "sw-precache": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/sw-precache/-/sw-precache-5.2.1.tgz",
+ "integrity": "sha512-8FAy+BP/FXE+ILfiVTt+GQJ6UEf4CVHD9OfhzH0JX+3zoy2uFk7Vn9EfXASOtVmmIVbL3jE/W8Z66VgPSZcMhw==",
+ "dev": true,
+ "requires": {
+ "dom-urls": "1.1.0",
+ "es6-promise": "4.2.4",
+ "glob": "7.1.2",
+ "lodash.defaults": "4.2.0",
+ "lodash.template": "4.4.0",
+ "meow": "3.7.0",
+ "mkdirp": "0.5.1",
+ "pretty-bytes": "4.0.2",
+ "sw-toolbox": "3.6.0",
+ "update-notifier": "2.5.0"
+ },
+ "dependencies": {
+ "ansi-align": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz",
+ "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=",
+ "dev": true,
+ "requires": {
+ "string-width": "2.1.1"
+ }
+ },
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "boxen": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz",
+ "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==",
+ "dev": true,
+ "requires": {
+ "ansi-align": "2.0.0",
+ "camelcase": "4.1.0",
+ "chalk": "2.4.1",
+ "cli-boxes": "1.0.0",
+ "string-width": "2.1.1",
+ "term-size": "1.2.0",
+ "widest-line": "2.0.0"
+ }
+ },
+ "camelcase": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ },
+ "configstore": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz",
+ "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==",
+ "dev": true,
+ "requires": {
+ "dot-prop": "4.2.0",
+ "graceful-fs": "4.1.11",
+ "make-dir": "1.2.0",
+ "unique-string": "1.0.0",
+ "write-file-atomic": "2.3.0",
+ "xdg-basedir": "3.0.0"
+ }
+ },
+ "dot-prop": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz",
+ "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==",
+ "dev": true,
+ "requires": {
+ "is-obj": "1.0.1"
+ }
+ },
+ "got": {
+ "version": "6.7.1",
+ "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz",
+ "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=",
+ "dev": true,
+ "requires": {
+ "create-error-class": "3.0.2",
+ "duplexer3": "0.1.4",
+ "get-stream": "3.0.0",
+ "is-redirect": "1.0.0",
+ "is-retry-allowed": "1.1.0",
+ "is-stream": "1.1.0",
+ "lowercase-keys": "1.0.1",
+ "safe-buffer": "5.1.2",
+ "timed-out": "4.0.1",
+ "unzip-response": "2.0.1",
+ "url-parse-lax": "1.0.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ },
+ "latest-version": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz",
+ "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=",
+ "dev": true,
+ "requires": {
+ "package-json": "4.0.1"
+ }
+ },
+ "lodash.template": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz",
+ "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=",
+ "dev": true,
+ "requires": {
+ "lodash._reinterpolate": "3.0.0",
+ "lodash.templatesettings": "4.1.0"
+ }
+ },
+ "lodash.templatesettings": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz",
+ "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=",
+ "dev": true,
+ "requires": {
+ "lodash._reinterpolate": "3.0.0"
+ }
+ },
+ "package-json": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz",
+ "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=",
+ "dev": true,
+ "requires": {
+ "got": "6.7.1",
+ "registry-auth-token": "3.3.2",
+ "registry-url": "3.1.0",
+ "semver": "5.5.0"
+ }
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "2.0.0",
+ "strip-ansi": "4.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "3.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ },
+ "timed-out": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
+ "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=",
+ "dev": true
+ },
+ "unzip-response": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz",
+ "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=",
+ "dev": true
+ },
+ "update-notifier": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz",
+ "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==",
+ "dev": true,
+ "requires": {
+ "boxen": "1.3.0",
+ "chalk": "2.4.1",
+ "configstore": "3.1.2",
+ "import-lazy": "2.1.0",
+ "is-ci": "1.1.0",
+ "is-installed-globally": "0.1.0",
+ "is-npm": "1.0.0",
+ "latest-version": "3.1.0",
+ "semver-diff": "2.1.0",
+ "xdg-basedir": "3.0.0"
+ }
+ },
+ "widest-line": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz",
+ "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=",
+ "dev": true,
+ "requires": {
+ "string-width": "2.1.1"
+ }
+ },
+ "write-file-atomic": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz",
+ "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "imurmurhash": "0.1.4",
+ "signal-exit": "3.0.2"
+ }
+ },
+ "xdg-basedir": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz",
+ "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=",
+ "dev": true
+ }
+ }
+ },
+ "sw-toolbox": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/sw-toolbox/-/sw-toolbox-3.6.0.tgz",
+ "integrity": "sha1-Jt8dHHA0hljk3qKIQxkUm3sxg7U=",
+ "dev": true,
+ "requires": {
+ "path-to-regexp": "1.7.0",
+ "serviceworker-cache-polyfill": "4.0.0"
+ }
+ },
+ "table": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz",
+ "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==",
+ "requires": {
+ "ajv": "5.5.2",
+ "ajv-keywords": "2.1.1",
+ "chalk": "2.4.1",
+ "lodash": "4.17.10",
+ "slice-ansi": "1.0.0",
+ "string-width": "2.1.1"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "requires": {
+ "is-fullwidth-code-point": "2.0.0",
+ "strip-ansi": "4.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "requires": {
+ "ansi-regex": "3.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ }
+ }
+ },
+ "table-layout": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.3.0.tgz",
+ "integrity": "sha1-buINxIPbNxs+XIf3BO0vfHmdLJo=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "core-js": "2.5.6",
+ "deep-extend": "0.4.2",
+ "feature-detect-es6": "1.4.0",
+ "typical": "2.6.1",
+ "wordwrapjs": "2.0.0"
+ }
+ },
+ "tar-fs": {
+ "version": "1.16.2",
+ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.2.tgz",
+ "integrity": "sha512-LdknWjPEiZC1nOBwhv0JBzfJBGPJar08dZg2rwZe0ZTLQoRGEzgrl7vF3qUEkCHpI/wN9e7RyCuDhMsJUCLPPQ==",
+ "dev": true,
+ "requires": {
+ "chownr": "1.0.1",
+ "mkdirp": "0.5.1",
+ "pump": "1.0.3",
+ "tar-stream": "1.6.0"
+ },
+ "dependencies": {
+ "pump": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz",
+ "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "1.4.1",
+ "once": "1.4.0"
+ }
+ }
+ }
+ },
+ "tar-stream": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.0.tgz",
+ "integrity": "sha512-lh2iAPG/BHNmN6WB9Ybdynk9rEJ5GD/dy4zscHmVlwa1dq2tpE+BH78i5vjYwYVWEaOXGBjzxr89aVACF17Cpw==",
+ "dev": true,
+ "requires": {
+ "bl": "1.2.2",
+ "buffer-alloc": "1.1.0",
+ "end-of-stream": "1.4.1",
+ "fs-constants": "1.0.0",
+ "readable-stream": "2.3.6",
+ "to-buffer": "1.1.1",
+ "xtend": "4.0.1"
+ }
+ },
+ "temp": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz",
+ "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=",
+ "dev": true,
+ "requires": {
+ "os-tmpdir": "1.0.2",
+ "rimraf": "2.2.8"
+ },
+ "dependencies": {
+ "rimraf": {
+ "version": "2.2.8",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz",
+ "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=",
+ "dev": true
+ }
+ }
+ },
+ "term-size": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz",
+ "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=",
+ "dev": true,
+ "requires": {
+ "execa": "0.7.0"
+ }
+ },
+ "ternary-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/ternary-stream/-/ternary-stream-2.0.1.tgz",
+ "integrity": "sha1-Bk5Im0tb9gumpre8fy9cJ07Pgmk=",
+ "dev": true,
+ "requires": {
+ "duplexify": "3.6.0",
+ "fork-stream": "0.0.4",
+ "merge-stream": "1.0.1",
+ "through2": "2.0.3"
+ }
+ },
+ "test-value": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz",
+ "integrity": "sha1-Edpv9nDzRxpztiXKTz/c97t0gpE=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "typical": "2.6.1"
+ }
+ },
+ "text-encoding": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz",
+ "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk="
+ },
+ "text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
+ },
+ "textextensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-2.2.0.tgz",
+ "integrity": "sha512-j5EMxnryTvKxwH2Cq+Pb43tsf6sdEgw6Pdwxk83mPaq0ToeFJt6WE4J3s5BqY7vmjlLgkgXvhtXUxo80FyBhCA=="
+ },
+ "thenify": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz",
+ "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=",
+ "dev": true,
+ "requires": {
+ "any-promise": "1.3.0"
+ }
+ },
+ "thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=",
+ "dev": true,
+ "requires": {
+ "thenify": "3.3.0"
+ }
+ },
+ "through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
+ },
+ "through2": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
+ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
+ "requires": {
+ "readable-stream": "2.3.6",
+ "xtend": "4.0.1"
+ }
+ },
+ "through2-filter": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz",
+ "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=",
+ "requires": {
+ "through2": "2.0.3",
+ "xtend": "4.0.1"
+ }
+ },
+ "tildify": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz",
+ "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=",
+ "requires": {
+ "os-homedir": "1.0.2"
+ }
+ },
+ "time-stamp": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz",
+ "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM="
+ },
+ "timed-out": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz",
+ "integrity": "sha1-lYYL/MXHbCd/j4Mm/Q9bLiDrohc=",
+ "dev": true
+ },
+ "tmp": {
+ "version": "0.0.31",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz",
+ "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=",
+ "requires": {
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "to-absolute-glob": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz",
+ "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=",
+ "requires": {
+ "extend-shallow": "2.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "to-array": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz",
+ "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=",
+ "dev": true
+ },
+ "to-buffer": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz",
+ "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==",
+ "dev": true
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc="
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ },
+ "to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "requires": {
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "regex-not": "1.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "requires": {
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ }
+ }
+ },
+ "tough-cookie": {
+ "version": "2.3.4",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
+ "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==",
+ "dev": true,
+ "requires": {
+ "punycode": "1.4.1"
+ }
+ },
+ "tr46": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+ "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
+ "dev": true,
+ "requires": {
+ "punycode": "2.1.0"
+ },
+ "dependencies": {
+ "punycode": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz",
+ "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=",
+ "dev": true
+ }
+ }
+ },
+ "trim-newlines": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
+ "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
+ "dev": true
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "tsc-then": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/tsc-then/-/tsc-then-1.1.0.tgz",
+ "integrity": "sha512-830G8SK8tewOxfKVBC5YWqZ2C7wS1D4dh9267ebLxR7Gvh3UuI6aKU5Hxo+L3Kkcy6CuxZp4PMGl066DZ3Hlmw==",
+ "requires": {
+ "@types/node": "8.10.13",
+ "semver": "5.5.0"
+ }
+ },
+ "tslib": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz",
+ "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ=="
+ },
+ "tslint": {
+ "version": "5.10.0",
+ "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.10.0.tgz",
+ "integrity": "sha1-EeJrzLiK+gLdDZlWyuPUVAtfVMM=",
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "builtin-modules": "1.1.1",
+ "chalk": "2.4.1",
+ "commander": "2.15.1",
+ "diff": "3.5.0",
+ "glob": "7.1.2",
+ "js-yaml": "3.11.0",
+ "minimatch": "3.0.4",
+ "resolve": "1.7.1",
+ "semver": "5.5.0",
+ "tslib": "1.9.0",
+ "tsutils": "2.26.2"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ },
+ "commander": {
+ "version": "2.15.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
+ "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag=="
+ },
+ "diff": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA=="
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ }
+ }
+ },
+ "tsutils": {
+ "version": "2.26.2",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.26.2.tgz",
+ "integrity": "sha512-uzwnhmrSbyinPCiwfzGsOY3IulBTwoky7r83HmZdz9QNCjhSCzavkh47KLWuU0zF2F2WbpmmzoJUIEiYyd+jEQ==",
+ "requires": {
+ "tslib": "1.9.0"
+ }
+ },
+ "tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
+ "dev": true,
+ "optional": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "type-detect": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz",
+ "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI="
+ },
+ "type-is": {
+ "version": "1.6.16",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",
+ "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==",
+ "dev": true,
+ "requires": {
+ "media-typer": "0.3.0",
+ "mime-types": "2.1.18"
+ }
+ },
+ "typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
+ },
+ "typescript": {
+ "version": "2.8.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.8.3.tgz",
+ "integrity": "sha512-K7g15Bb6Ra4lKf7Iq2l/I5/En+hLIHmxWZGq3D4DIRNFxMNV6j2SHSvDOqs2tGd4UvD/fJvrwopzQXjLrT7Itw=="
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "ua-parser-js": {
+ "version": "0.7.18",
+ "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.18.tgz",
+ "integrity": "sha512-LtzwHlVHwFGTptfNSgezHp7WUlwiqb0gA9AALRbKaERfxwJoiX0A73QbTToxteIAuIaFshhgIZfqK8s7clqgnA==",
+ "dev": true
+ },
+ "uglify-js": {
+ "version": "2.8.29",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
+ "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
+ "optional": true,
+ "requires": {
+ "source-map": "0.5.7",
+ "uglify-to-browserify": "1.0.2",
+ "yargs": "3.10.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
+ "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
+ "optional": true
+ },
+ "cliui": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
+ "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
+ "optional": true,
+ "requires": {
+ "center-align": "0.1.3",
+ "right-align": "0.1.3",
+ "wordwrap": "0.0.2"
+ }
+ },
+ "wordwrap": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
+ "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
+ "optional": true
+ },
+ "yargs": {
+ "version": "3.10.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
+ "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
+ "optional": true,
+ "requires": {
+ "camelcase": "1.2.1",
+ "cliui": "2.1.0",
+ "decamelize": "1.2.0",
+ "window-size": "0.1.0"
+ }
+ }
+ }
+ },
+ "uglify-to-browserify": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
+ "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
+ "optional": true
+ },
+ "ultron": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz",
+ "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og=="
+ },
+ "unc-path-regex": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
+ "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo="
+ },
+ "underscore": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz",
+ "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=",
+ "dev": true
+ },
+ "underscore.string": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.4.tgz",
+ "integrity": "sha1-LCo/n4PmR2L9xF5s6sZRQoZCE9s=",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "1.0.3",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "unicode-canonical-property-names-ecmascript": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.3.tgz",
+ "integrity": "sha512-iG/2t0F2LAU8aZYPkX5gi7ebukHnr3sWFESpb+zPQeeaQwOkfoO6ZW17YX7MdRPNG9pCy+tjzGill+Ah0Em0HA==",
+ "dev": true
+ },
+ "unicode-match-property-ecmascript": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.3.tgz",
+ "integrity": "sha512-nFcaBFcr08UQNF15ZgI5ISh3yUnQm7SJRRxwYrL5VYX46pS+6Q7TCTv4zbK+j6/l7rQt0mMiTL2zpmeygny6rA==",
+ "dev": true,
+ "requires": {
+ "unicode-canonical-property-names-ecmascript": "1.0.3",
+ "unicode-property-aliases-ecmascript": "1.0.3"
+ }
+ },
+ "unicode-match-property-value-ecmascript": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.1.tgz",
+ "integrity": "sha512-lM8B0FDZQh9yYGgiabRQcyWicB27VLOolSBRIxsO7FeQPtg+79Oe7sC8Mzr8BObDs+G9CeYmC/shHo6OggNEog==",
+ "dev": true
+ },
+ "unicode-property-aliases-ecmascript": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.3.tgz",
+ "integrity": "sha512-TdDmDOTxEf2ad1g3ZBpM6cqKIb2nJpVlz1Q++casDryKz18tpeMBhSng9hjC1CTQCkOV9Rw2knlSB6iRo7ad1w==",
+ "dev": true
+ },
+ "union-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
+ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+ "requires": {
+ "arr-union": "3.1.0",
+ "get-value": "2.0.6",
+ "is-extendable": "0.1.1",
+ "set-value": "0.4.3"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "set-value": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
+ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "to-object-path": "0.3.0"
+ }
+ }
+ }
+ },
+ "unique-stream": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz",
+ "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=",
+ "requires": {
+ "json-stable-stringify": "1.0.1",
+ "through2-filter": "2.0.0"
+ }
+ },
+ "unique-string": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz",
+ "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=",
+ "dev": true,
+ "requires": {
+ "crypto-random-string": "1.0.0"
+ }
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc="
+ },
+ "unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
+ "dev": true
+ },
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "requires": {
+ "has-value": "0.3.1",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "0.1.4",
+ "isobject": "2.1.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E="
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ }
+ }
+ },
+ "untildify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/untildify/-/untildify-2.1.0.tgz",
+ "integrity": "sha1-F+soB5h/dpUunASF/DEdBqgmouA=",
+ "requires": {
+ "os-homedir": "1.0.2"
+ }
+ },
+ "unzip-response": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz",
+ "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=",
+ "dev": true
+ },
+ "update-notifier": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-1.0.3.tgz",
+ "integrity": "sha1-j5LFFUgr1oMbfJMBPnD4dVLHz1o=",
+ "dev": true,
+ "requires": {
+ "boxen": "0.6.0",
+ "chalk": "1.1.3",
+ "configstore": "2.1.0",
+ "is-npm": "1.0.0",
+ "latest-version": "2.0.0",
+ "lazy-req": "1.1.0",
+ "semver-diff": "2.1.0",
+ "xdg-basedir": "2.0.0"
+ }
+ },
+ "upper-case": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
+ "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=",
+ "dev": true
+ },
+ "urijs": {
+ "version": "1.19.1",
+ "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.1.tgz",
+ "integrity": "sha512-xVrGVi94ueCJNrBSTjWqjvtgvl3cyOTThp2zaMaFNGp3F542TR6sM3f2o8RqZl+AwteClSVmoCyt0ka4RjQOQg==",
+ "dev": true
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI="
+ },
+ "url-parse-lax": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
+ "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
+ "requires": {
+ "prepend-http": "1.0.4"
+ }
+ },
+ "use": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz",
+ "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==",
+ "requires": {
+ "kind-of": "6.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+ }
+ }
+ },
+ "user-home": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz",
+ "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=",
+ "requires": {
+ "os-homedir": "1.0.2"
+ }
+ },
+ "util": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
+ "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
+ "requires": {
+ "inherits": "2.0.1"
+ },
+ "dependencies": {
+ "inherits": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
+ "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE="
+ }
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+ },
+ "utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
+ "dev": true
+ },
+ "uuid": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz",
+ "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==",
+ "dev": true
+ },
+ "v8flags": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz",
+ "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=",
+ "requires": {
+ "user-home": "1.1.1"
+ },
+ "dependencies": {
+ "user-home": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz",
+ "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA="
+ }
+ }
+ },
+ "vali-date": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz",
+ "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY="
+ },
+ "validate-element-name": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/validate-element-name/-/validate-element-name-2.1.1.tgz",
+ "integrity": "sha1-j/dffaafc+fFEFiDYhMFCLesZE4=",
+ "dev": true,
+ "requires": {
+ "is-potential-custom-element-name": "1.0.0",
+ "log-symbols": "1.0.2",
+ "meow": "3.7.0"
+ }
+ },
+ "validate-npm-package-license": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz",
+ "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==",
+ "requires": {
+ "spdx-correct": "3.0.0",
+ "spdx-expression-parse": "3.0.0"
+ }
+ },
+ "vargs": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/vargs/-/vargs-0.1.0.tgz",
+ "integrity": "sha1-a2GE2mUgzDIEzhtAfKwm2SYJ6/8=",
+ "dev": true
+ },
+ "vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
+ "dev": true
+ },
+ "verror": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "1.3.0"
+ }
+ },
+ "vinyl": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz",
+ "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=",
+ "requires": {
+ "clone": "1.0.4",
+ "clone-stats": "0.0.1",
+ "replace-ext": "0.0.1"
+ }
+ },
+ "vinyl-file": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-2.0.0.tgz",
+ "integrity": "sha1-p+v1/779obfRjRQPyweyI++2dRo=",
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1",
+ "strip-bom": "2.0.0",
+ "strip-bom-stream": "2.0.0",
+ "vinyl": "1.2.0"
+ },
+ "dependencies": {
+ "first-chunk-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz",
+ "integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=",
+ "requires": {
+ "readable-stream": "2.3.6"
+ }
+ },
+ "strip-bom-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz",
+ "integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=",
+ "requires": {
+ "first-chunk-stream": "2.0.0",
+ "strip-bom": "2.0.0"
+ }
+ }
+ }
+ },
+ "vinyl-fs": {
+ "version": "2.4.4",
+ "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz",
+ "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=",
+ "requires": {
+ "duplexify": "3.6.0",
+ "glob-stream": "5.3.5",
+ "graceful-fs": "4.1.11",
+ "gulp-sourcemaps": "1.6.0",
+ "is-valid-glob": "0.3.0",
+ "lazystream": "1.0.0",
+ "lodash.isequal": "4.5.0",
+ "merge-stream": "1.0.1",
+ "mkdirp": "0.5.1",
+ "object-assign": "4.1.1",
+ "readable-stream": "2.3.6",
+ "strip-bom": "2.0.0",
+ "strip-bom-stream": "1.0.0",
+ "through2": "2.0.3",
+ "through2-filter": "2.0.0",
+ "vali-date": "1.0.0",
+ "vinyl": "1.2.0"
+ }
+ },
+ "vinyl-fs-fake": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/vinyl-fs-fake/-/vinyl-fs-fake-1.1.0.tgz",
+ "integrity": "sha1-BfGxQrrKoUXDH6E4zi+gv9aLXwI=",
+ "requires": {
+ "through2": "0.6.5",
+ "vinyl": "0.4.6",
+ "vinyl-fs": "0.3.14"
+ },
+ "dependencies": {
+ "clone": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz",
+ "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8="
+ },
+ "glob": {
+ "version": "4.5.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz",
+ "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=",
+ "requires": {
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "2.0.10",
+ "once": "1.4.0"
+ }
+ },
+ "glob-stream": {
+ "version": "3.1.18",
+ "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz",
+ "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=",
+ "requires": {
+ "glob": "4.5.3",
+ "glob2base": "0.0.12",
+ "minimatch": "2.0.10",
+ "ordered-read-streams": "0.1.0",
+ "through2": "0.6.5",
+ "unique-stream": "1.0.0"
+ }
+ },
+ "graceful-fs": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz",
+ "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=",
+ "requires": {
+ "natives": "1.1.3"
+ }
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+ },
+ "minimatch": {
+ "version": "2.0.10",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz",
+ "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=",
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "ordered-read-streams": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz",
+ "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY="
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+ },
+ "strip-bom": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz",
+ "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=",
+ "requires": {
+ "first-chunk-stream": "1.0.0",
+ "is-utf8": "0.2.1"
+ }
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "requires": {
+ "readable-stream": "1.0.34",
+ "xtend": "4.0.1"
+ }
+ },
+ "unique-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz",
+ "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs="
+ },
+ "vinyl": {
+ "version": "0.4.6",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz",
+ "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=",
+ "requires": {
+ "clone": "0.2.0",
+ "clone-stats": "0.0.1"
+ }
+ },
+ "vinyl-fs": {
+ "version": "0.3.14",
+ "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz",
+ "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=",
+ "requires": {
+ "defaults": "1.0.3",
+ "glob-stream": "3.1.18",
+ "glob-watcher": "0.0.6",
+ "graceful-fs": "3.0.11",
+ "mkdirp": "0.5.1",
+ "strip-bom": "1.0.0",
+ "through2": "0.6.5",
+ "vinyl": "0.4.6"
+ }
+ }
+ }
+ },
+ "vlq": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz",
+ "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==",
+ "dev": true
+ },
+ "vscode-uri": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.3.tgz",
+ "integrity": "sha1-Yxvb9xbcyrDmUpGo3CXCMjIIWlI=",
+ "dev": true
+ },
+ "walkdir": {
+ "version": "0.0.11",
+ "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.11.tgz",
+ "integrity": "sha1-oW0CXrkxvQO1LzCMrtD0D86+lTI="
+ },
+ "wbuf": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
+ "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
+ "dev": true,
+ "requires": {
+ "minimalistic-assert": "1.0.1"
+ }
+ },
+ "wct-local": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/wct-local/-/wct-local-2.1.0.tgz",
+ "integrity": "sha512-OiMSbxp6e5tyvTbUA4VAQbw4we53EXEmekx9BbIgS/HryoQISzap5DSAE/kvpRpJ2Axt0z12d8ChxqwNflApfA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "@types/express": "4.11.1",
+ "@types/freeport": "1.0.21",
+ "@types/launchpad": "0.6.0",
+ "@types/node": "9.6.13",
+ "@types/which": "1.3.1",
+ "chalk": "2.4.1",
+ "cleankill": "2.0.0",
+ "freeport": "1.0.5",
+ "launchpad": "0.7.0",
+ "promisify-node": "0.4.0",
+ "selenium-standalone": "6.14.0",
+ "which": "1.3.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "9.6.13",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.13.tgz",
+ "integrity": "sha512-rAlzcc9b66uY+pwvBCjhl9/Nm/mr3rt1/pfHVHDMd0Bfg4olE0UlvaEZh+TM/uwzEFYVnLbDZHG9mVjZrHdv8g==",
+ "dev": true,
+ "optional": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true,
+ "optional": true
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ }
+ }
+ },
+ "wct-sauce": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/wct-sauce/-/wct-sauce-2.0.1.tgz",
+ "integrity": "sha512-nk6cPKdACVt3R+n9XyCTQTeRKOhhajyh0WaF5U1BsxPlVS8tNOUGleXQDUUjB+q1DPS7+j1F3UJqhnmrUMDVJA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "cleankill": "2.0.0",
+ "lodash": "3.10.1",
+ "request": "2.85.0",
+ "sauce-connect-launcher": "1.2.4",
+ "temp": "0.8.3",
+ "uuid": "2.0.3"
+ },
+ "dependencies": {
+ "lodash": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
+ "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
+ "dev": true,
+ "optional": true
+ },
+ "uuid": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz",
+ "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "wd": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/wd/-/wd-1.6.2.tgz",
+ "integrity": "sha512-QWfLPcChqM4yu0b+thRP4QIsvqqlu/HWRQXBNY/+j60yJ/D4Kk+g9i6JOo5JMuWPVGGARIVhzbr4j9dIMAr7wg==",
+ "dev": true,
+ "requires": {
+ "archiver": "1.3.0",
+ "async": "2.0.1",
+ "lodash": "4.16.2",
+ "mkdirp": "0.5.1",
+ "q": "1.4.1",
+ "request": "2.85.0",
+ "underscore.string": "3.3.4",
+ "vargs": "0.1.0"
+ },
+ "dependencies": {
+ "async": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.0.1.tgz",
+ "integrity": "sha1-twnMAoCpw28J9FNr6CPIOKkEniU=",
+ "dev": true,
+ "requires": {
+ "lodash": "4.16.2"
+ }
+ },
+ "lodash": {
+ "version": "4.16.2",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.16.2.tgz",
+ "integrity": "sha1-PmJtuCcEimmSgaihJSJjJs/A5lI=",
+ "dev": true
+ },
+ "q": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz",
+ "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=",
+ "dev": true
+ }
+ }
+ },
+ "web-component-tester": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/web-component-tester/-/web-component-tester-6.6.0.tgz",
+ "integrity": "sha512-f+LqR4rHUtVIg6T79uo6BYuyrIOzInPWzOJo69sGxX3tRTDeTwQzJSrfX4/MKA4qa3ldGPODJHizRYgZbjYjbQ==",
+ "dev": true,
+ "requires": {
+ "@polymer/sinonjs": "1.17.1",
+ "@polymer/test-fixture": "0.0.3",
+ "@webcomponents/webcomponentsjs": "1.2.0",
+ "accessibility-developer-tools": "2.12.0",
+ "async": "2.6.0",
+ "body-parser": "1.18.2",
+ "bower-config": "1.4.1",
+ "chai": "4.1.2",
+ "chalk": "1.1.3",
+ "cleankill": "2.0.0",
+ "express": "4.16.3",
+ "findup-sync": "2.0.0",
+ "glob": "7.1.2",
+ "lodash": "3.10.1",
+ "mocha": "3.5.3",
+ "multer": "1.3.0",
+ "nomnom": "1.8.1",
+ "polyserve": "0.27.11",
+ "promisify-node": "0.4.0",
+ "resolve": "1.7.1",
+ "semver": "5.5.0",
+ "send": "0.11.1",
+ "server-destroy": "1.0.1",
+ "sinon": "2.4.1",
+ "sinon-chai": "2.14.0",
+ "socket.io": "2.1.0",
+ "stacky": "1.3.1",
+ "update-notifier": "2.5.0",
+ "wct-local": "2.1.0",
+ "wct-sauce": "2.0.1",
+ "wd": "1.6.2"
+ },
+ "dependencies": {
+ "ansi-align": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz",
+ "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "string-width": "2.1.1"
+ }
+ },
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "async": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz",
+ "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==",
+ "dev": true,
+ "requires": {
+ "lodash": "4.17.10"
+ },
+ "dependencies": {
+ "lodash": {
+ "version": "4.17.10",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
+ "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==",
+ "dev": true
+ }
+ }
+ },
+ "boxen": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz",
+ "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ansi-align": "2.0.0",
+ "camelcase": "4.1.0",
+ "chalk": "2.4.1",
+ "cli-boxes": "1.0.0",
+ "string-width": "2.1.1",
+ "term-size": "1.2.0",
+ "widest-line": "2.0.0"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ }
+ }
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-unique": "0.3.2",
+ "extend-shallow": "2.0.1",
+ "fill-range": "4.0.0",
+ "isobject": "3.0.1",
+ "repeat-element": "1.1.2",
+ "snapdragon": "0.8.2",
+ "snapdragon-node": "2.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "camelcase": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+ "dev": true,
+ "optional": true
+ },
+ "chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=",
+ "dev": true,
+ "requires": {
+ "assertion-error": "1.1.0",
+ "check-error": "1.0.2",
+ "deep-eql": "3.0.1",
+ "get-func-name": "2.0.0",
+ "pathval": "1.1.0",
+ "type-detect": "4.0.8"
+ }
+ },
+ "configstore": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz",
+ "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "dot-prop": "4.2.0",
+ "graceful-fs": "4.1.11",
+ "make-dir": "1.2.0",
+ "unique-string": "1.0.0",
+ "write-file-atomic": "2.3.0",
+ "xdg-basedir": "3.0.0"
+ }
+ },
+ "deep-eql": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
+ "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
+ "dev": true,
+ "requires": {
+ "type-detect": "4.0.8"
+ }
+ },
+ "depd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz",
+ "integrity": "sha1-gK7GTJ1tl+ZcwqnKqTwKpqv3Oqo=",
+ "dev": true
+ },
+ "destroy": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.3.tgz",
+ "integrity": "sha1-tDO0ck5x/YVR2YhRdIUcX8N34sk=",
+ "dev": true
+ },
+ "detect-file": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
+ "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
+ "dev": true
+ },
+ "diff": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
+ "dev": true
+ },
+ "dot-prop": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz",
+ "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-obj": "1.0.1"
+ }
+ },
+ "ee-first": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.0.tgz",
+ "integrity": "sha1-ag18YiHkkP7v2S7D9EHJzozQl/Q=",
+ "dev": true
+ },
+ "escape-html": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.1.tgz",
+ "integrity": "sha1-GBoobq05ejmpKFfPsdQwUuNWv/A=",
+ "dev": true
+ },
+ "etag": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.5.1.tgz",
+ "integrity": "sha1-VMUN4E7kJpVWKSWsVmWIKRvn6eo=",
+ "dev": true,
+ "requires": {
+ "crc": "3.2.1"
+ }
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "posix-character-classes": "0.1.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ }
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "expand-tilde": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
+ "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
+ "dev": true,
+ "requires": {
+ "homedir-polyfill": "1.0.1"
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "expand-brackets": "2.1.4",
+ "extend-shallow": "2.0.1",
+ "fragment-cache": "0.2.1",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1",
+ "to-regex-range": "2.1.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "findup-sync": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz",
+ "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=",
+ "dev": true,
+ "requires": {
+ "detect-file": "1.0.0",
+ "is-glob": "3.1.0",
+ "micromatch": "3.1.10",
+ "resolve-dir": "1.0.1"
+ }
+ },
+ "formatio": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz",
+ "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=",
+ "dev": true,
+ "requires": {
+ "samsam": "1.3.0"
+ }
+ },
+ "fresh": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.2.4.tgz",
+ "integrity": "sha1-NYJJkgbJcjcUGQ7ddLRgT+tKYUw=",
+ "dev": true
+ },
+ "global-modules": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
+ "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
+ "dev": true,
+ "requires": {
+ "global-prefix": "1.0.2",
+ "is-windows": "1.0.2",
+ "resolve-dir": "1.0.1"
+ }
+ },
+ "global-prefix": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
+ "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
+ "dev": true,
+ "requires": {
+ "expand-tilde": "2.0.2",
+ "homedir-polyfill": "1.0.1",
+ "ini": "1.3.5",
+ "is-windows": "1.0.2",
+ "which": "1.3.0"
+ }
+ },
+ "got": {
+ "version": "6.7.1",
+ "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz",
+ "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "create-error-class": "3.0.2",
+ "duplexer3": "0.1.4",
+ "get-stream": "3.0.0",
+ "is-redirect": "1.0.0",
+ "is-retry-allowed": "1.1.0",
+ "is-stream": "1.1.0",
+ "lowercase-keys": "1.0.1",
+ "safe-buffer": "5.1.2",
+ "timed-out": "4.0.1",
+ "unzip-response": "2.0.1",
+ "url-parse-lax": "1.0.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ },
+ "latest-version": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz",
+ "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "package-json": "4.0.1"
+ }
+ },
+ "lodash": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
+ "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
+ "dev": true
+ },
+ "lolex": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz",
+ "integrity": "sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY=",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "braces": "2.3.2",
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "extglob": "2.0.4",
+ "fragment-cache": "0.2.1",
+ "kind-of": "6.0.2",
+ "nanomatch": "1.2.9",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.2",
+ "snapdragon": "0.8.2",
+ "to-regex": "3.0.2"
+ }
+ },
+ "mime": {
+ "version": "1.2.11",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz",
+ "integrity": "sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA=",
+ "dev": true
+ },
+ "ms": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.0.tgz",
+ "integrity": "sha1-hlvpTC5zl62KV9pqYzpuLzB5i4M=",
+ "dev": true
+ },
+ "on-finished": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.2.1.tgz",
+ "integrity": "sha1-XIXBzDYpn3gCllP2Z/J7a5nrwCk=",
+ "dev": true,
+ "requires": {
+ "ee-first": "1.1.0"
+ }
+ },
+ "package-json": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz",
+ "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "got": "6.7.1",
+ "registry-auth-token": "3.3.2",
+ "registry-url": "3.1.0",
+ "semver": "5.5.0"
+ }
+ },
+ "range-parser": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz",
+ "integrity": "sha1-aHKCNTXGkuLCoBA4Jq/YLC4P8XU=",
+ "dev": true
+ },
+ "resolve-dir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
+ "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
+ "dev": true,
+ "requires": {
+ "expand-tilde": "2.0.2",
+ "global-modules": "1.0.0"
+ }
+ },
+ "samsam": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz",
+ "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==",
+ "dev": true
+ },
+ "send": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.11.1.tgz",
+ "integrity": "sha1-G+q/1C+eJwn5kCivMHisErRwktU=",
+ "dev": true,
+ "requires": {
+ "debug": "2.1.3",
+ "depd": "1.0.1",
+ "destroy": "1.0.3",
+ "escape-html": "1.0.1",
+ "etag": "1.5.1",
+ "fresh": "0.2.4",
+ "mime": "1.2.11",
+ "ms": "0.7.0",
+ "on-finished": "2.2.1",
+ "range-parser": "1.0.3"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.1.3.tgz",
+ "integrity": "sha1-zoqxte6PvuK/o7Yzyrk9NmtjQY4=",
+ "dev": true,
+ "requires": {
+ "ms": "0.7.0"
+ }
+ }
+ }
+ },
+ "sinon": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/sinon/-/sinon-2.4.1.tgz",
+ "integrity": "sha512-vFTrO9Wt0ECffDYIPSP/E5bBugt0UjcBQOfQUMh66xzkyPEnhl/vM2LRZi2ajuTdkH07sA6DzrM6KvdvGIH8xw==",
+ "dev": true,
+ "requires": {
+ "diff": "3.5.0",
+ "formatio": "1.2.0",
+ "lolex": "1.6.0",
+ "native-promise-only": "0.8.1",
+ "path-to-regexp": "1.7.0",
+ "samsam": "1.3.0",
+ "text-encoding": "0.6.4",
+ "type-detect": "4.0.8"
+ }
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "2.0.0",
+ "strip-ansi": "4.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "3.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ },
+ "timed-out": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
+ "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=",
+ "dev": true,
+ "optional": true
+ },
+ "type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "dev": true
+ },
+ "unzip-response": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz",
+ "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=",
+ "dev": true,
+ "optional": true
+ },
+ "update-notifier": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz",
+ "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "boxen": "1.3.0",
+ "chalk": "2.4.1",
+ "configstore": "3.1.2",
+ "import-lazy": "2.1.0",
+ "is-ci": "1.1.0",
+ "is-installed-globally": "0.1.0",
+ "is-npm": "1.0.0",
+ "latest-version": "3.1.0",
+ "semver-diff": "2.1.0",
+ "xdg-basedir": "3.0.0"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ }
+ }
+ },
+ "widest-line": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz",
+ "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "string-width": "2.1.1"
+ }
+ },
+ "write-file-atomic": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz",
+ "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "imurmurhash": "0.1.4",
+ "signal-exit": "3.0.2"
+ }
+ },
+ "xdg-basedir": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz",
+ "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=",
+ "dev": true
+ }
+ }
+ },
+ "webidl-conversions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+ "dev": true
+ },
+ "whatwg-url": {
+ "version": "6.4.1",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.1.tgz",
+ "integrity": "sha512-FwygsxsXx27x6XXuExA/ox3Ktwcbf+OAvrKmLulotDAiO1Q6ixchPFaHYsis2zZBZSJTR0+dR+JVtf7MlbqZjw==",
+ "dev": true,
+ "requires": {
+ "lodash.sortby": "4.7.0",
+ "tr46": "1.0.1",
+ "webidl-conversions": "4.0.2"
+ }
+ },
+ "which": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
+ "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
+ "requires": {
+ "isexe": "2.0.0"
+ }
+ },
+ "which-module": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
+ },
+ "widest-line": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz",
+ "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=",
+ "dev": true,
+ "requires": {
+ "string-width": "1.0.2"
+ }
+ },
+ "window-size": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
+ "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
+ "optional": true
+ },
+ "winston": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.2.tgz",
+ "integrity": "sha512-4S/Ad4ZfSNl8OccCLxnJmNISWcm2joa6Q0YGDxlxMzH0fgSwWsjMt+SmlNwCqdpaPg3ev1HKkMBsIiXeSUwpbA==",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus="
+ },
+ "wordwrapjs": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-2.0.0.tgz",
+ "integrity": "sha1-q1X2leYRjak4WP3XDAU9HF4BrCA=",
+ "dev": true,
+ "requires": {
+ "array-back": "1.0.4",
+ "feature-detect-es6": "1.4.0",
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrap-ansi": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
+ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
+ "requires": {
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+ },
+ "write": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz",
+ "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
+ "requires": {
+ "mkdirp": "0.5.1"
+ }
+ },
+ "write-file-atomic": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz",
+ "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "imurmurhash": "0.1.4",
+ "slide": "1.1.6"
+ }
+ },
+ "ws": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz",
+ "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==",
+ "requires": {
+ "async-limiter": "1.0.0",
+ "safe-buffer": "5.1.2",
+ "ultron": "1.1.1"
+ }
+ },
+ "xdg-basedir": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-2.0.0.tgz",
+ "integrity": "sha1-7byQPMOF/ARSPZZqM1UEtVBNG9I=",
+ "dev": true,
+ "requires": {
+ "os-homedir": "1.0.2"
+ }
+ },
+ "xmlbuilder": {
+ "version": "8.2.2",
+ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz",
+ "integrity": "sha1-aSSGc0ELS6QuGmE2VR0pIjNap3M=",
+ "dev": true,
+ "optional": true
+ },
+ "xmldom": {
+ "version": "0.1.27",
+ "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz",
+ "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=",
+ "dev": true,
+ "optional": true
+ },
+ "xmlhttprequest-ssl": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz",
+ "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=",
+ "dev": true
+ },
+ "xtend": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
+ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
+ },
+ "y18n": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+ "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE="
+ },
+ "yallist": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
+ },
+ "yargs": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz",
+ "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=",
+ "requires": {
+ "camelcase": "4.1.0",
+ "cliui": "3.2.0",
+ "decamelize": "1.2.0",
+ "get-caller-file": "1.0.2",
+ "os-locale": "2.1.0",
+ "read-pkg-up": "2.0.0",
+ "require-directory": "2.1.1",
+ "require-main-filename": "1.0.1",
+ "set-blocking": "2.0.0",
+ "string-width": "2.1.1",
+ "which-module": "2.0.0",
+ "y18n": "3.2.1",
+ "yargs-parser": "7.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
+ },
+ "camelcase": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0="
+ },
+ "find-up": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+ "requires": {
+ "locate-path": "2.0.0"
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
+ },
+ "load-json-file": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
+ "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "parse-json": "2.2.0",
+ "pify": "2.3.0",
+ "strip-bom": "3.0.0"
+ }
+ },
+ "path-type": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
+ "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+ "requires": {
+ "pify": "2.3.0"
+ }
+ },
+ "read-pkg": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
+ "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
+ "requires": {
+ "load-json-file": "2.0.0",
+ "normalize-package-data": "2.4.0",
+ "path-type": "2.0.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
+ "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
+ "requires": {
+ "find-up": "2.1.0",
+ "read-pkg": "2.0.0"
+ }
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "requires": {
+ "is-fullwidth-code-point": "2.0.0",
+ "strip-ansi": "4.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "requires": {
+ "ansi-regex": "3.0.0"
+ }
+ },
+ "strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM="
+ }
+ }
+ },
+ "yargs-parser": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz",
+ "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=",
+ "requires": {
+ "camelcase": "4.1.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0="
+ }
+ }
+ },
+ "yauzl": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz",
+ "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=",
+ "requires": {
+ "fd-slicer": "1.0.1"
+ }
+ },
+ "yeast": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
+ "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=",
+ "dev": true
+ },
+ "yeoman-assert": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/yeoman-assert/-/yeoman-assert-2.2.3.tgz",
+ "integrity": "sha1-pWgqg2MsUKwO6EFzpaEP1vMgZHQ="
+ },
+ "yeoman-environment": {
+ "version": "1.6.6",
+ "resolved": "https://registry.npmjs.org/yeoman-environment/-/yeoman-environment-1.6.6.tgz",
+ "integrity": "sha1-zYX6Z9FWBg5EDXgH1+988NLR1nE=",
+ "requires": {
+ "chalk": "1.1.3",
+ "debug": "2.6.9",
+ "diff": "2.2.3",
+ "escape-string-regexp": "1.0.5",
+ "globby": "4.1.0",
+ "grouped-queue": "0.3.3",
+ "inquirer": "1.2.3",
+ "lodash": "4.17.10",
+ "log-symbols": "1.0.2",
+ "mem-fs": "1.1.3",
+ "text-table": "0.2.0",
+ "untildify": "2.1.0"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz",
+ "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=",
+ "requires": {
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "globby": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-4.1.0.tgz",
+ "integrity": "sha1-CA9UVJ7BuCpsYOYx/ILhIR2+lfg=",
+ "requires": {
+ "array-union": "1.0.2",
+ "arrify": "1.0.1",
+ "glob": "6.0.4",
+ "object-assign": "4.1.1",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1"
+ }
+ }
+ }
+ },
+ "yeoman-generator": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/yeoman-generator/-/yeoman-generator-1.1.1.tgz",
+ "integrity": "sha1-QMK09s374F4ZUv3XKTPw2JJdvfU=",
+ "requires": {
+ "async": "2.6.0",
+ "chalk": "1.1.3",
+ "class-extend": "0.1.2",
+ "cli-table": "0.3.1",
+ "cross-spawn": "5.1.0",
+ "dargs": "5.1.0",
+ "dateformat": "2.2.0",
+ "debug": "2.6.9",
+ "detect-conflict": "1.0.1",
+ "error": "7.0.2",
+ "find-up": "2.1.0",
+ "github-username": "3.0.0",
+ "glob": "7.1.2",
+ "istextorbinary": "2.2.1",
+ "lodash": "4.17.10",
+ "mem-fs-editor": "3.0.2",
+ "minimist": "1.2.0",
+ "mkdirp": "0.5.1",
+ "path-exists": "3.0.0",
+ "path-is-absolute": "1.0.1",
+ "pretty-bytes": "4.0.2",
+ "read-chunk": "2.1.0",
+ "read-pkg-up": "2.0.0",
+ "rimraf": "2.6.2",
+ "run-async": "2.3.0",
+ "shelljs": "0.7.8",
+ "text-table": "0.2.0",
+ "through2": "2.0.3",
+ "user-home": "2.0.0",
+ "yeoman-environment": "1.6.6"
+ },
+ "dependencies": {
+ "async": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz",
+ "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==",
+ "requires": {
+ "lodash": "4.17.10"
+ }
+ },
+ "find-up": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+ "requires": {
+ "locate-path": "2.0.0"
+ }
+ },
+ "load-json-file": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
+ "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "parse-json": "2.2.0",
+ "pify": "2.3.0",
+ "strip-bom": "3.0.0"
+ }
+ },
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
+ },
+ "path-type": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
+ "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+ "requires": {
+ "pify": "2.3.0"
+ }
+ },
+ "read-pkg": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
+ "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
+ "requires": {
+ "load-json-file": "2.0.0",
+ "normalize-package-data": "2.4.0",
+ "path-type": "2.0.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
+ "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
+ "requires": {
+ "find-up": "2.1.0",
+ "read-pkg": "2.0.0"
+ }
+ },
+ "strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM="
+ }
+ }
+ },
+ "yeoman-test": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/yeoman-test/-/yeoman-test-1.7.0.tgz",
+ "integrity": "sha512-vJeg2gpWfhbq0HvQ7/yqmsQpYmADBfo9kaW+J6uJASkI7ChLBXNLIBQqaXCA65kWtHXOco+nBm0Km/O9YWk25Q==",
+ "requires": {
+ "inquirer": "3.3.0",
+ "lodash": "4.17.10",
+ "mkdirp": "0.5.1",
+ "pinkie-promise": "2.0.1",
+ "rimraf": "2.6.2",
+ "sinon": "2.4.1",
+ "yeoman-environment": "2.0.6",
+ "yeoman-generator": "1.1.1"
+ },
+ "dependencies": {
+ "ansi-escapes": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz",
+ "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw=="
+ },
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ },
+ "cli-cursor": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
+ "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
+ "requires": {
+ "restore-cursor": "2.0.0"
+ }
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "diff": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA=="
+ },
+ "external-editor": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz",
+ "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==",
+ "requires": {
+ "chardet": "0.4.2",
+ "iconv-lite": "0.4.23",
+ "tmp": "0.0.33"
+ }
+ },
+ "figures": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
+ "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
+ "requires": {
+ "escape-string-regexp": "1.0.5"
+ }
+ },
+ "formatio": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz",
+ "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=",
+ "requires": {
+ "samsam": "1.3.0"
+ }
+ },
+ "globby": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
+ "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
+ "requires": {
+ "array-union": "1.0.2",
+ "glob": "7.1.2",
+ "object-assign": "4.1.1",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+ },
+ "inquirer": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz",
+ "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==",
+ "requires": {
+ "ansi-escapes": "3.1.0",
+ "chalk": "2.4.1",
+ "cli-cursor": "2.1.0",
+ "cli-width": "2.2.0",
+ "external-editor": "2.2.0",
+ "figures": "2.0.0",
+ "lodash": "4.17.10",
+ "mute-stream": "0.0.7",
+ "run-async": "2.3.0",
+ "rx-lite": "4.0.8",
+ "rx-lite-aggregates": "4.0.8",
+ "string-width": "2.1.1",
+ "strip-ansi": "4.0.0",
+ "through": "2.3.8"
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
+ },
+ "log-symbols": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
+ "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
+ "requires": {
+ "chalk": "2.4.1"
+ }
+ },
+ "lolex": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz",
+ "integrity": "sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY="
+ },
+ "mute-stream": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
+ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s="
+ },
+ "onetime": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
+ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
+ "requires": {
+ "mimic-fn": "1.2.0"
+ }
+ },
+ "restore-cursor": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
+ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
+ "requires": {
+ "onetime": "2.0.1",
+ "signal-exit": "3.0.2"
+ }
+ },
+ "samsam": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz",
+ "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg=="
+ },
+ "sinon": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/sinon/-/sinon-2.4.1.tgz",
+ "integrity": "sha512-vFTrO9Wt0ECffDYIPSP/E5bBugt0UjcBQOfQUMh66xzkyPEnhl/vM2LRZi2ajuTdkH07sA6DzrM6KvdvGIH8xw==",
+ "requires": {
+ "diff": "3.5.0",
+ "formatio": "1.2.0",
+ "lolex": "1.6.0",
+ "native-promise-only": "0.8.1",
+ "path-to-regexp": "1.7.0",
+ "samsam": "1.3.0",
+ "text-encoding": "0.6.4",
+ "type-detect": "4.0.8"
+ }
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "requires": {
+ "is-fullwidth-code-point": "2.0.0",
+ "strip-ansi": "4.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "requires": {
+ "ansi-regex": "3.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ },
+ "tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "requires": {
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g=="
+ },
+ "untildify": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.2.tgz",
+ "integrity": "sha1-fx8wIFWz/qDz6B3HjrNnZstl4/E="
+ },
+ "yeoman-environment": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/yeoman-environment/-/yeoman-environment-2.0.6.tgz",
+ "integrity": "sha512-jzHBTTy8EPI4ImV8dpUMt+Q5zELkSU5xvGpndHcHudQ4tqN6YgIWaCGmRFl+HDchwRUkcgyjQ+n6/w5zlJBCPg==",
+ "requires": {
+ "chalk": "2.4.1",
+ "debug": "3.1.0",
+ "diff": "3.5.0",
+ "escape-string-regexp": "1.0.5",
+ "globby": "6.1.0",
+ "grouped-queue": "0.3.3",
+ "inquirer": "3.3.0",
+ "is-scoped": "1.0.0",
+ "lodash": "4.17.10",
+ "log-symbols": "2.2.0",
+ "mem-fs": "1.1.3",
+ "text-table": "0.2.0",
+ "untildify": "3.0.2"
+ }
+ }
+ }
+ },
+ "zip-stream": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz",
+ "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=",
+ "dev": true,
+ "requires": {
+ "archiver-utils": "1.3.0",
+ "compress-commons": "1.2.2",
+ "lodash": "4.17.10",
+ "readable-stream": "2.3.6"
+ }
+ }
+ }
+ },
+ "polymer-project-config": {
+ "version": "3.13.0",
+ "resolved": "https://registry.npmjs.org/polymer-project-config/-/polymer-project-config-3.13.0.tgz",
+ "integrity": "sha512-0E1iSOpo2xFMvMomSDFl48J8IOUWmM+sfHGJSQSVfIu8GXDgz2TVraad+rEMZDbj8uxiRFvQZyouHhikxhVFpQ==",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.107",
+ "jsonschema": "1.2.4",
+ "minimatch-all": "1.1.0",
+ "plylog": "0.5.0"
+ }
+ },
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+ "dev": true
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
+ },
+ "prepend-http": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
+ "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
+ "dev": true
+ },
+ "pretty-bytes": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz",
+ "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=",
+ "dev": true
+ },
+ "pretty-hrtime": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
+ "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=",
+ "dev": true
+ },
+ "prismjs": {
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.14.0.tgz",
+ "integrity": "sha512-sa2s4m60bXs+kU3jcuUwx3ZCrUH7o0kuqnOOINbODqlRrDB7KY8SRx+xR/D7nHLlgfDdG7zXbRO8wJ+su5Ls0A==",
+ "dev": true,
+ "requires": {
+ "clipboard": "2.0.1"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+ }
+ }
+ },
+ "private": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
+ "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg=="
+ },
+ "process-nextick-args": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
+ "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
+ },
+ "progress": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz",
+ "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=",
+ "dev": true
+ },
+ "pseudomap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
+ },
+ "pump": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
+ "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "1.4.1",
+ "once": "1.4.0"
+ }
+ },
+ "pumpify": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.0.tgz",
+ "integrity": "sha512-UWi0klDoq8xtVzlMRgENV9F7iCTZExaJQSQL187UXsxpk9NnrKGqTqqUNYAKGOzucSOxs2+jUnRNI+rLviPhJg==",
+ "dev": true,
+ "requires": {
+ "duplexify": "3.6.0",
+ "inherits": "2.0.3",
+ "pump": "2.0.1"
+ },
+ "dependencies": {
+ "duplexify": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz",
+ "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "1.4.1",
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.6",
+ "stream-shift": "1.0.0"
+ }
+ }
+ }
+ },
+ "punycode": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz",
+ "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=",
+ "dev": true
+ },
+ "randomatic": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz",
+ "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "kind-of": "4.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "rc": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.7.tgz",
+ "integrity": "sha512-LdLD8xD4zzLsAT5xyushXDNscEjB7+2ulnl8+r1pnESlYtlJtVSoCMBGr30eDRJ3+2Gq89jK9P9e4tCEH1+ywA==",
+ "requires": {
+ "deep-extend": "0.5.1",
+ "ini": "1.3.5",
+ "minimist": "1.2.0",
+ "strip-json-comments": "2.0.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "read-pkg": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+ "dev": true,
+ "requires": {
+ "load-json-file": "1.1.0",
+ "normalize-package-data": "2.4.0",
+ "path-type": "1.1.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+ "dev": true,
+ "requires": {
+ "find-up": "1.1.2",
+ "read-pkg": "1.1.0"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
+ }
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.0",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "readdirp": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz",
+ "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "minimatch": "3.0.4",
+ "readable-stream": "2.3.6",
+ "set-immediate-shim": "1.0.1"
+ }
+ },
+ "rechoir": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
+ "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
+ "dev": true,
+ "requires": {
+ "resolve": "1.7.1"
+ }
+ },
+ "redent": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
+ "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+ "dev": true,
+ "requires": {
+ "indent-string": "2.1.0",
+ "strip-indent": "1.0.1"
+ },
+ "dependencies": {
+ "strip-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
+ "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+ "dev": true,
+ "requires": {
+ "get-stdin": "4.0.1"
+ }
+ }
+ }
+ },
+ "reduce-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+ "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "dev": true
+ },
+ "regenerate": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz",
+ "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
+ },
+ "regenerator-transform": {
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz",
+ "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "private": "0.1.8"
+ },
+ "dependencies": {
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "esutils": "2.0.2",
+ "lodash": "4.17.10",
+ "to-fast-properties": "1.0.3"
+ }
+ }
+ }
+ },
+ "regex-cache": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
+ "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
+ "dev": true,
+ "requires": {
+ "is-equal-shallow": "0.1.3"
+ }
+ },
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "requires": {
+ "extend-shallow": "3.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "regexpp": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz",
+ "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==",
+ "dev": true
+ },
+ "regexpu-core": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz",
+ "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=",
+ "dev": true,
+ "requires": {
+ "regenerate": "1.3.3",
+ "regjsgen": "0.2.0",
+ "regjsparser": "0.1.5"
+ }
+ },
+ "registry-auth-token": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz",
+ "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==",
+ "requires": {
+ "rc": "1.2.7",
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "registry-url": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz",
+ "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=",
+ "requires": {
+ "rc": "1.2.7"
+ }
+ },
+ "regjsgen": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
+ "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=",
+ "dev": true
+ },
+ "regjsparser": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
+ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
+ "dev": true,
+ "requires": {
+ "jsesc": "0.5.0"
+ },
+ "dependencies": {
+ "jsesc": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+ "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8="
+ }
+ }
+ },
+ "relateurl": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
+ "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=",
+ "dev": true
+ },
+ "remove-bom-buffer": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz",
+ "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6",
+ "is-utf8": "0.2.1"
+ }
+ },
+ "remove-bom-stream": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz",
+ "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=",
+ "dev": true,
+ "requires": {
+ "remove-bom-buffer": "3.0.0",
+ "safe-buffer": "5.1.2",
+ "through2": "2.0.3"
+ }
+ },
+ "remove-trailing-separator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
+ "dev": true
+ },
+ "repeat-element": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
+ "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "replace-ext": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
+ "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
+ "dev": true
+ },
+ "replace-homedir": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz",
+ "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=",
+ "dev": true,
+ "requires": {
+ "homedir-polyfill": "1.0.1",
+ "is-absolute": "1.0.0",
+ "remove-trailing-separator": "1.1.0"
+ }
+ },
+ "replacestream": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/replacestream/-/replacestream-4.0.3.tgz",
+ "integrity": "sha512-AC0FiLS352pBBiZhd4VXB1Ab/lh0lEgpP+GGvZqbQh8a5cmXVoTe5EX/YeTFArnp4SRGTHh1qCHu9lGs1qG8sA==",
+ "dev": true,
+ "requires": {
+ "escape-string-regexp": "1.0.5",
+ "object-assign": "4.1.1",
+ "readable-stream": "2.3.6"
+ }
+ },
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+ "dev": true
+ },
+ "require-main-filename": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
+ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
+ "dev": true
+ },
+ "require-uncached": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
+ "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
+ "dev": true,
+ "requires": {
+ "caller-path": "0.1.0",
+ "resolve-from": "1.0.1"
+ }
+ },
+ "resolve": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz",
+ "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==",
+ "requires": {
+ "path-parse": "1.0.5"
+ },
+ "dependencies": {
+ "strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "requires": {
+ "is-utf8": "0.2.1"
+ }
+ }
+ }
+ },
+ "resolve-dir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
+ "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
+ "dev": true,
+ "requires": {
+ "expand-tilde": "2.0.2",
+ "global-modules": "1.0.0"
+ }
+ },
+ "resolve-from": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz",
+ "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=",
+ "dev": true
+ },
+ "resolve-options": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz",
+ "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=",
+ "dev": true,
+ "requires": {
+ "value-or-function": "3.0.0"
+ }
+ },
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo="
+ },
+ "restore-cursor": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
+ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
+ "dev": true,
+ "requires": {
+ "onetime": "2.0.1",
+ "signal-exit": "3.0.2"
+ },
+ "dependencies": {
+ "es6-promise": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz",
+ "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ=="
+ },
+ "lodash.template": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz",
+ "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=",
+ "requires": {
+ "lodash._reinterpolate": "3.0.0",
+ "lodash.templatesettings": "4.1.0"
+ }
+ },
+ "lodash.templatesettings": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz",
+ "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=",
+ "requires": {
+ "lodash._reinterpolate": "3.0.0"
+ }
+ }
+ }
+ },
+ "ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg=="
+ },
+ "rimraf": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
+ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
+ "requires": {
+ "glob": "7.1.2"
+ }
+ },
+ "run-async": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
+ "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
+ "dev": true,
+ "requires": {
+ "is-promise": "2.1.0"
+ }
+ },
+ "run-sequence": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/run-sequence/-/run-sequence-2.2.1.tgz",
+ "integrity": "sha512-qkzZnQWMZjcKbh3CNly2srtrkaO/2H/SI5f2eliMCapdRD3UhMrwjfOAZJAnZ2H8Ju4aBzFZkBGXUqFs9V0yxw==",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "fancy-log": "1.3.2",
+ "plugin-error": "0.1.2"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz",
+ "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-slice": "0.2.3"
+ }
+ },
+ "arr-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz",
+ "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=",
+ "dev": true
+ },
+ "array-slice": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz",
+ "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=",
+ "dev": true
+ },
+ "extend-shallow": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz",
+ "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=",
+ "dev": true,
+ "requires": {
+ "kind-of": "1.1.0"
+ }
+ },
+ "kind-of": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz",
+ "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=",
+ "dev": true
+ },
+ "plugin-error": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz",
+ "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=",
+ "dev": true,
+ "requires": {
+ "ansi-cyan": "0.1.1",
+ "ansi-red": "0.1.1",
+ "arr-diff": "1.1.0",
+ "arr-union": "2.1.0",
+ "extend-shallow": "1.1.4"
+ }
+ }
+ }
+ },
+ "rx-lite": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz",
+ "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=",
+ "dev": true
+ },
+ "rx-lite-aggregates": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz",
+ "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=",
+ "dev": true,
+ "requires": {
+ "rx-lite": "4.0.8"
+ },
+ "dependencies": {
+ "end-of-stream": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
+ "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
+ "requires": {
+ "once": "1.4.0"
+ }
+ }
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ },
+ "safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "requires": {
+ "ret": "0.1.15"
+ }
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true
+ },
+ "samsam": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz",
+ "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=",
+ "dev": true
+ },
+ "select": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz",
+ "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=",
+ "dev": true,
+ "optional": true
+ },
+ "semver": {
+ "version": "4.3.6",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz",
+ "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto="
+ },
+ "semver-diff": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz",
+ "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=",
+ "dev": true,
+ "requires": {
+ "semver": "5.5.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
+ "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
+ "dev": true
+ }
+ }
+ },
+ "semver-greatest-satisfied-range": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz",
+ "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=",
+ "dev": true,
+ "requires": {
+ "sver-compat": "1.5.0"
+ }
+ },
+ "serviceworker-cache-polyfill": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/serviceworker-cache-polyfill/-/serviceworker-cache-polyfill-4.0.0.tgz",
+ "integrity": "sha1-3hnuc77yGrPAdAo3sz22JGS6ves=",
+ "dev": true
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+ "dev": true
+ },
+ "set-immediate-shim": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
+ "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E="
+ },
+ "set-value": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
+ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "split-string": "3.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "shady-css-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/shady-css-parser/-/shady-css-parser-0.1.0.tgz",
+ "integrity": "sha512-irfJUUkEuDlNHKZNAp2r7zOyMlmbfVJ+kWSfjlCYYUx/7dJnANLCyTzQZsuxy5NJkvtNwSxY5Gj8MOlqXUQPyA==",
+ "dev": true
+ },
+ "shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+ "requires": {
+ "shebang-regex": "1.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
+ },
+ "sinon": {
+ "version": "1.17.7",
+ "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz",
+ "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=",
+ "dev": true,
+ "requires": {
+ "formatio": "1.1.1",
+ "lolex": "1.3.2",
+ "samsam": "1.1.2",
+ "util": "0.10.3"
+ }
+ },
+ "sinon-chai": {
+ "version": "2.14.0",
+ "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-2.14.0.tgz",
+ "integrity": "sha512-9stIF1utB0ywNHNT7RgiXbdmen8QDCRsrTjw+G9TgKt1Yexjiv8TOWZ6WHsTPz57Yky3DIswZvEqX8fpuHNDtQ==",
+ "dev": true
+ },
+ "slash": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
+ "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
+ "dev": true
+ },
+ "slice-ansi": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz",
+ "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "2.0.0"
+ }
+ },
+ "snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "requires": {
+ "base": "0.11.2",
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "map-cache": "0.2.2",
+ "source-map": "0.5.7",
+ "source-map-resolve": "0.5.1",
+ "use": "3.1.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+ }
+ }
+ },
+ "snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "dev": true,
+ "requires": {
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "snapdragon-util": "3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.0.2"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ }
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ },
+ "source-map-resolve": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz",
+ "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==",
+ "requires": {
+ "atob": "2.1.1",
+ "decode-uri-component": "0.2.0",
+ "resolve-url": "0.2.1",
+ "source-map-url": "0.4.0",
+ "urix": "0.1.0"
+ }
+ },
+ "source-map-support": {
+ "version": "0.4.18",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
+ "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
+ "dev": true,
+ "requires": {
+ "source-map": "0.5.7"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "source-map-url": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM="
+ },
+ "sparkles": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz",
+ "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=",
+ "dev": true
+ },
+ "spdx-correct": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz",
+ "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==",
+ "requires": {
+ "spdx-expression-parse": "3.0.0",
+ "spdx-license-ids": "3.0.0"
+ }
+ },
+ "spdx-exceptions": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz",
+ "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg=="
+ },
+ "spdx-expression-parse": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
+ "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
+ "requires": {
+ "spdx-exceptions": "2.1.0",
+ "spdx-license-ids": "3.0.0"
+ }
+ },
+ "spdx-license-ids": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz",
+ "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA=="
+ },
+ "split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "requires": {
+ "extend-shallow": "3.0.2"
+ }
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "stable": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
+ "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
+ "dev": true
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA="
+ },
+ "stacky": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/stacky/-/stacky-1.3.1.tgz",
+ "integrity": "sha1-PxF+UYe5pz0j+HbWnwXIWxGAShI=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "lodash": "3.10.1"
+ },
+ "dependencies": {
+ "lodash": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
+ "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
+ "dev": true
+ }
+ }
+ },
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "requires": {
+ "define-property": "0.2.5",
+ "object-copy": "0.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ }
+ }
+ },
+ "stream": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/stream/-/stream-0.0.2.tgz",
+ "integrity": "sha1-f1Nj8Ff2WSxVlfALyAon9c7B8O8=",
+ "dev": true,
+ "requires": {
+ "emitter-component": "1.1.1"
+ }
+ },
+ "stream-combiner": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz",
+ "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=",
+ "dev": true,
+ "requires": {
+ "duplexer": "0.1.1",
+ "through": "2.3.8"
+ }
+ },
+ "stream-counter": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/stream-counter/-/stream-counter-1.0.0.tgz",
+ "integrity": "sha1-kc8lac5NxQYf6816yyY5SloRR1E=",
+ "dev": true
+ },
+ "stream-exhaust": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz",
+ "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==",
+ "dev": true
+ },
+ "stream-shift": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
+ "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI="
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "2.0.0",
+ "strip-ansi": "4.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "3.0.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ }
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "requires": {
+ "ansi-regex": "2.1.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ }
+ }
+ },
+ "strip-bom-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz",
+ "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=",
+ "dev": true,
+ "requires": {
+ "first-chunk-stream": "1.0.0",
+ "strip-bom": "2.0.0"
+ },
+ "dependencies": {
+ "strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "dev": true,
+ "requires": {
+ "is-utf8": "0.2.1"
+ }
+ }
+ }
+ },
+ "strip-eof": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
+ },
+ "strip-indent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+ "dev": true
+ },
+ "strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+ },
+ "sver-compat": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz",
+ "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=",
+ "dev": true,
+ "requires": {
+ "es6-iterator": "2.0.3",
+ "es6-symbol": "3.1.1"
+ }
+ },
+ "sw-precache": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/sw-precache/-/sw-precache-5.2.1.tgz",
+ "integrity": "sha512-8FAy+BP/FXE+ILfiVTt+GQJ6UEf4CVHD9OfhzH0JX+3zoy2uFk7Vn9EfXASOtVmmIVbL3jE/W8Z66VgPSZcMhw==",
+ "dev": true,
+ "requires": {
+ "dom-urls": "1.1.0",
+ "es6-promise": "4.2.4",
+ "glob": "7.1.2",
+ "lodash.defaults": "4.2.0",
+ "lodash.template": "4.4.0",
+ "meow": "3.7.0",
+ "mkdirp": "0.5.1",
+ "pretty-bytes": "4.0.2",
+ "sw-toolbox": "3.6.0",
+ "update-notifier": "2.5.0"
+ },
+ "dependencies": {
+ "es6-promise": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz",
+ "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==",
+ "dev": true
+ },
+ "lodash.template": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz",
+ "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=",
+ "dev": true,
+ "requires": {
+ "lodash._reinterpolate": "3.0.0",
+ "lodash.templatesettings": "4.1.0"
+ }
+ },
+ "lodash.templatesettings": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz",
+ "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=",
+ "dev": true,
+ "requires": {
+ "lodash._reinterpolate": "3.0.0"
+ }
+ }
+ }
+ },
+ "sw-toolbox": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/sw-toolbox/-/sw-toolbox-3.6.0.tgz",
+ "integrity": "sha1-Jt8dHHA0hljk3qKIQxkUm3sxg7U=",
+ "dev": true,
+ "requires": {
+ "path-to-regexp": "1.7.0",
+ "serviceworker-cache-polyfill": "4.0.0"
+ }
+ },
+ "table": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz",
+ "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==",
+ "dev": true,
+ "requires": {
+ "ajv": "5.5.2",
+ "ajv-keywords": "2.1.1",
+ "chalk": "2.4.1",
+ "lodash": "4.17.10",
+ "slice-ansi": "1.0.0",
+ "string-width": "2.1.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ },
+ "clone": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz",
+ "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8="
+ },
+ "clone-stats": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
+ "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE="
+ },
+ "graceful-fs": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz",
+ "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg="
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1"
+ }
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ }
+ }
+ },
+ "table-layout": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.3.tgz",
+ "integrity": "sha512-MIhflPM38ejKrFwWwC3P9x3eHvMo5G5AmNo29Qtz2HpBl5KD2GCcmOErjgNtUQLv/qaqVDagfJY3rJLPDvEgLg==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "deep-extend": "0.5.1",
+ "lodash.padend": "4.6.1",
+ "typical": "2.6.1",
+ "wordwrapjs": "3.0.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+ }
+ }
+ },
+ "term-size": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz",
+ "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=",
+ "dev": true,
+ "requires": {
+ "execa": "0.7.0"
+ }
+ },
+ "ternary-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/ternary-stream/-/ternary-stream-2.0.1.tgz",
+ "integrity": "sha1-Bk5Im0tb9gumpre8fy9cJ07Pgmk=",
+ "dev": true,
+ "requires": {
+ "duplexify": "3.5.4",
+ "fork-stream": "0.0.4",
+ "merge-stream": "1.0.1",
+ "through2": "2.0.3"
+ }
+ },
+ "test-value": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
+ "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
+ "dev": true,
+ "requires": {
+ "array-back": "2.0.0",
+ "typical": "2.6.1"
+ }
+ },
+ "text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+ "dev": true
+ },
+ "textextensions": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-1.0.2.tgz",
+ "integrity": "sha1-ZUhjk+4fK7A5pgy7oFsLaL2VAdI=",
+ "dev": true
+ },
+ "thenify": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz",
+ "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=",
+ "requires": {
+ "any-promise": "1.3.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w=="
+ },
+ "@types/parse5": {
+ "version": "0.0.31",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-0.0.31.tgz",
+ "integrity": "sha1-6Cekk6RDsVbhtYKi5MO9wAQPLuc=",
+ "requires": {
+ "@types/node": "6.0.107"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.107",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.107.tgz",
+ "integrity": "sha512-iuJWRFHqU0tFLCYH6cfBZzMxThAAsNK31FZxoq+fKIDOSZk1p+3IhNWfEdvPJfsQXcTq8z+57s8xjQlrDAB0Gw=="
+ }
+ }
+ },
+ "clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4="
+ },
+ "dom5": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-1.3.6.tgz",
+ "integrity": "sha1-pwiKn8XzsI3J9u2kx6uuskGUXg0=",
+ "requires": {
+ "@types/clone": "0.1.30",
+ "@types/node": "4.2.23",
+ "@types/parse5": "0.0.31",
+ "clone": "1.0.4",
+ "parse5": "1.5.1"
+ }
+ },
+ "parse5": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz",
+ "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ="
+ }
+ }
+ },
+ "thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=",
+ "requires": {
+ "thenify": "3.3.0"
+ }
+ },
+ "through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
+ "dev": true
+ },
+ "through2": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
+ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
+ "requires": {
+ "readable-stream": "2.3.6",
+ "xtend": "4.0.1"
+ }
+ },
+ "through2-filter": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz",
+ "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=",
+ "dev": true,
+ "requires": {
+ "through2": "2.0.3",
+ "xtend": "4.0.1"
+ }
+ },
+ "time-stamp": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz",
+ "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=",
+ "dev": true
+ },
+ "timed-out": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
+ "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=",
+ "dev": true
+ },
+ "tiny-emitter": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.0.2.tgz",
+ "integrity": "sha512-2NM0auVBGft5tee/OxP4PI3d8WItkDM+fPnaRAVo6xTDI2knbz9eC5ArWGqtGlYqiH3RU5yMpdyTTO7MguC4ow==",
+ "dev": true,
+ "optional": true
+ },
+ "tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "dev": true,
+ "requires": {
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "to-absolute-glob": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz",
+ "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc="
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "requires": {
+ "define-property": "2.0.2",
+ "extend-shallow": "3.0.2",
+ "regex-not": "1.0.2",
+ "safe-regex": "1.1.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "to-through": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz",
+ "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=",
+ "dev": true,
+ "requires": {
+ "through2": "2.0.3"
+ }
+ },
+ "tr46": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+ "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
+ "dev": true,
+ "requires": {
+ "punycode": "2.1.0"
+ }
+ },
+ "trim-newlines": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
+ "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
+ "dev": true
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "type-detect": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz",
+ "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=",
+ "dev": true
+ },
+ "typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+ "dev": true
+ },
+ "typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "dev": true
+ },
+ "ua-parser-js": {
+ "version": "0.7.18",
+ "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.18.tgz",
+ "integrity": "sha512-LtzwHlVHwFGTptfNSgezHp7WUlwiqb0gA9AALRbKaERfxwJoiX0A73QbTToxteIAuIaFshhgIZfqK8s7clqgnA=="
+ },
+ "uglify-js": {
+ "version": "3.3.23",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.23.tgz",
+ "integrity": "sha512-Ks+KqLGDsYn4z+pU7JsKCzC0T3mPYl+rU+VcPZiQOazjE4Uqi4UCRY3qPMDbJi7ze37n1lDXj3biz1ik93vqvw==",
+ "dev": true,
+ "requires": {
+ "commander": "2.15.1",
+ "source-map": "0.6.1"
+ }
+ },
+ "unc-path-regex": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
+ "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo="
+ },
+ "undertaker": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.0.tgz",
+ "integrity": "sha1-M52kZGJS0ILcN45wgGcpl1DhG0k=",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "arr-map": "2.0.2",
+ "bach": "1.2.0",
+ "collection-map": "1.0.0",
+ "es6-weak-map": "2.0.2",
+ "last-run": "1.1.1",
+ "object.defaults": "1.1.0",
+ "object.reduce": "1.0.1",
+ "undertaker-registry": "1.0.1"
+ }
+ },
+ "undertaker-registry": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz",
+ "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=",
+ "dev": true
+ },
+ "union-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
+ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+ "requires": {
+ "arr-union": "3.1.0",
+ "get-value": "2.0.6",
+ "is-extendable": "0.1.1",
+ "set-value": "0.4.3"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "set-value": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
+ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "to-object-path": "0.3.0"
+ }
+ }
+ }
+ },
+ "unique-stream": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz",
+ "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=",
+ "dev": true,
+ "requires": {
+ "json-stable-stringify": "1.0.1",
+ "through2-filter": "2.0.0"
+ }
+ },
+ "unique-string": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz",
+ "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=",
+ "dev": true,
+ "requires": {
+ "crypto-random-string": "1.0.0"
+ }
+ },
+ "universalify": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
+ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "dev": true
+ },
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "requires": {
+ "has-value": "0.3.1",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "0.1.4",
+ "isobject": "2.1.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E="
+ }
+ }
+ },
+ "unzip-response": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz",
+ "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=",
+ "dev": true
+ },
+ "upath": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/upath/-/upath-1.0.5.tgz",
+ "integrity": "sha512-qbKn90aDQ0YEwvXoLqj0oiuUYroLX2lVHZ+b+xwjozFasAOC4GneDq5+OaIG5Zj+jFmbz/uO+f7a9qxjktJQww==",
+ "dev": true
+ },
+ "update-notifier": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz",
+ "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==",
+ "dev": true,
+ "requires": {
+ "boxen": "1.3.0",
+ "chalk": "2.4.1",
+ "configstore": "3.1.2",
+ "import-lazy": "2.1.0",
+ "is-ci": "1.1.0",
+ "is-installed-globally": "0.1.0",
+ "is-npm": "1.0.0",
+ "latest-version": "3.1.0",
+ "semver-diff": "2.1.0",
+ "xdg-basedir": "3.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.1",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "5.4.0"
+ }
+ },
+ "supports-color": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "dev": true,
+ "requires": {
+ "has-flag": "3.0.0"
+ }
+ }
+ }
+ },
+ "upper-case": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
+ "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=",
+ "dev": true
+ },
+ "urijs": {
+ "version": "1.19.1",
+ "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.1.tgz",
+ "integrity": "sha512-xVrGVi94ueCJNrBSTjWqjvtgvl3cyOTThp2zaMaFNGp3F542TR6sM3f2o8RqZl+AwteClSVmoCyt0ka4RjQOQg==",
+ "dev": true
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI="
+ },
+ "url-parse-lax": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
+ "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
+ "dev": true,
+ "requires": {
+ "prepend-http": "1.0.4"
+ },
+ "dependencies": {
+ "aws-sign2": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
+ },
+ "boom": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz",
+ "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE="
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
+ },
+ "cryptiles": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz",
+ "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=",
+ "requires": {
+ "boom": "5.2.0"
+ },
+ "dependencies": {
+ "boom": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz",
+ "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw=="
+ }
+ }
+ },
+ "form-data": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz",
+ "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk="
+ },
+ "graceful-fs": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz",
+ "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg="
+ },
+ "har-validator": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz",
+ "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=",
+ "requires": {
+ "ajv": "5.5.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.0.1.tgz",
+ "integrity": "sha1-twnMAoCpw28J9FNr6CPIOKkEniU=",
+ "requires": {
+ "lodash": "4.17.10"
+ }
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "request": {
+ "version": "2.85.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz",
+ "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==",
+ "requires": {
+ "aws-sign2": "0.7.0",
+ "caseless": "0.12.0",
+ "extend": "3.0.1",
+ "form-data": "2.3.2",
+ "har-validator": "5.0.3",
+ "isstream": "0.1.2",
+ "safe-buffer": "5.1.2",
+ "uuid": "3.2.1"
+ }
+ },
+ "sntp": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz",
+ "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg=="
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+ },
+ "vinyl": {
+ "version": "0.4.6",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz",
+ "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc="
+ }
+ }
+ },
+ "use": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz",
+ "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==",
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "util": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
+ "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.1"
+ },
+ "dependencies": {
+ "inherits": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
+ "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
+ "dev": true
+ }
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+ },
+ "uuid": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz",
+ "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA=="
+ },
+ "v8flags": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.0.2.tgz",
+ "integrity": "sha512-6sgSKoFw1UpUPd3cFdF7QGnrH6tDeBgW1F3v9gy8gLY0mlbiBXq8soy8aQpY6xeeCjH5K+JvC62Acp7gtl7wWA==",
+ "dev": true,
+ "requires": {
+ "homedir-polyfill": "1.0.1"
+ }
+ },
+ "vali-date": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
+ "dev": true
+ },
+ "validate-npm-package-license": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz",
+ "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==",
+ "requires": {
+ "spdx-correct": "3.0.0",
+ "spdx-expression-parse": "3.0.0"
+ }
+ },
+ "value-or-function": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz",
+ "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=",
+ "dev": true
+ },
+ "vinyl": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz",
+ "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=",
+ "dev": true,
+ "requires": {
+ "clone": "2.1.1",
+ "clone-buffer": "1.0.0",
+ "clone-stats": "1.0.0",
+ "cloneable-readable": "1.1.2",
+ "remove-trailing-separator": "1.1.0",
+ "replace-ext": "1.0.0"
+ }
+ },
+ "vinyl-fs": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.2.tgz",
+ "integrity": "sha512-AUSFda1OukBwuLPBTbyuO4IRWgfXmqC4UTW0f8xrCa8Hkv9oyIU+NSqBlgfOLZRoUt7cHdo75hKQghCywpIyIw==",
+ "dev": true,
+ "requires": {
+ "fs-mkdirp-stream": "1.0.0",
+ "glob-stream": "6.1.0",
+ "graceful-fs": "4.1.11",
+ "is-valid-glob": "1.0.0",
+ "lazystream": "1.0.0",
+ "lead": "1.0.0",
+ "object.assign": "4.1.0",
+ "pumpify": "1.5.0",
+ "readable-stream": "2.3.6",
+ "remove-bom-buffer": "3.0.0",
+ "remove-bom-stream": "1.2.0",
+ "resolve-options": "1.1.0",
+ "through2": "2.0.3",
+ "to-through": "2.0.0",
+ "value-or-function": "3.0.0",
+ "vinyl": "2.1.0",
+ "vinyl-sourcemap": "1.1.0"
+ },
+ "dependencies": {
+ "is-valid-glob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz",
+ "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=",
+ "dev": true
+ }
+ }
+ },
+ "vinyl-sourcemap": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz",
+ "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=",
+ "dev": true,
+ "requires": {
+ "append-buffer": "1.0.2",
+ "convert-source-map": "1.5.1",
+ "graceful-fs": "4.1.11",
+ "normalize-path": "2.1.1",
+ "now-and-later": "2.0.0",
+ "remove-bom-buffer": "3.0.0",
+ "vinyl": "2.1.0"
+ }
+ },
+ "vinyl-sourcemaps-apply": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz",
+ "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=",
+ "dev": true,
+ "requires": {
+ "source-map": "0.5.7"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "vscode-uri": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.3.tgz",
+ "integrity": "sha1-Yxvb9xbcyrDmUpGo3CXCMjIIWlI=",
+ "dev": true
+ },
+ "vulcanize": {
+ "version": "1.16.0",
+ "resolved": "https://registry.npmjs.org/vulcanize/-/vulcanize-1.16.0.tgz",
+ "integrity": "sha512-TYlFljSc896b5+0FmMiw0JAMrHNBiHx0IAFC/dQR3Dxdb9Nx43ohm6wMWTlPXQn4sk/0WkqfgoAA6SLxyvPCLQ==",
+ "dev": true,
+ "requires": {
+ "dom5": "1.3.6",
+ "es6-promise": "2.3.0",
+ "hydrolysis": "1.25.0",
+ "nopt": "3.0.6",
+ "path-posix": "1.0.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "4.2.23",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz",
+ "integrity": "sha512-U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==",
+ "dev": true
+ },
+ "@types/parse5": {
+ "version": "0.0.31",
+ "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-0.0.31.tgz",
+ "integrity": "sha1-6Cekk6RDsVbhtYKi5MO9wAQPLuc=",
+ "dev": true,
+ "requires": {
+ "@types/node": "6.0.107"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "6.0.107",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.107.tgz",
+ "integrity": "sha512-iuJWRFHqU0tFLCYH6cfBZzMxThAAsNK31FZxoq+fKIDOSZk1p+3IhNWfEdvPJfsQXcTq8z+57s8xjQlrDAB0Gw==",
+ "dev": true
+ }
+ }
+ },
+ "chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=",
+ "requires": {
+ "assertion-error": "1.1.0"
+ }
+ },
+ "clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
+ "dev": true
+ },
+ "dom5": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/dom5/-/dom5-1.3.6.tgz",
+ "integrity": "sha1-pwiKn8XzsI3J9u2kx6uuskGUXg0=",
+ "dev": true,
+ "requires": {
+ "@types/clone": "0.1.30",
+ "@types/node": "4.2.23",
+ "@types/parse5": "0.0.31",
+ "clone": "1.0.4",
+ "parse5": "1.5.1"
+ }
+ },
+ "parse5": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz",
+ "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=",
+ "dev": true
+ }
+ }
+ },
+ "wct-browser-legacy": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wct-browser-legacy/-/wct-browser-legacy-1.0.0.tgz",
+ "integrity": "sha512-eWbVuY0OdLOPZMXAQMEjhbs1xn7WR6IgKfueMWE8CKdTAoXAfquQ+7rQRuXVSBN2l21YG8MP+U36XqLaTvkRHg==",
+ "dev": true,
+ "requires": {
+ "@polymer/polymer": "3.0.0-pre.12",
+ "@polymer/sinonjs": "1.17.1",
+ "@polymer/test-fixture": "3.0.0-pre.12",
+ "@webcomponents/webcomponentsjs": "1.2.0",
+ "accessibility-developer-tools": "2.12.0",
+ "async": "1.5.2",
+ "chai": "3.5.0",
+ "lodash": "3.10.1",
+ "mocha": "3.5.3",
+ "sinon": "1.17.7",
+ "sinon-chai": "2.14.0",
+ "stacky": "1.3.1"
+ },
+ "dependencies": {
+ "@webcomponents/webcomponentsjs": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-1.2.0.tgz",
+ "integrity": "sha512-P9JWydfpBR+CK12UwtBaoD/lYF3PR9XBArAWk5J9nfPaJwA3OUox4StZmyFSVDLsvpFq5HsEtxU/OdHAlAWPnw==",
+ "dev": true
+ },
+ "async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+ "dev": true
+ },
+ "lodash": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
+ "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
+ "dev": true
+ }
+ }
+ },
+ "webidl-conversions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+ "dev": true
+ },
+ "whatwg-url": {
+ "version": "6.4.1",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.1.tgz",
+ "integrity": "sha512-FwygsxsXx27x6XXuExA/ox3Ktwcbf+OAvrKmLulotDAiO1Q6ixchPFaHYsis2zZBZSJTR0+dR+JVtf7MlbqZjw==",
+ "dev": true,
+ "requires": {
+ "lodash.sortby": "4.7.0",
+ "tr46": "1.0.1",
+ "webidl-conversions": "4.0.2"
+ }
+ },
+ "which": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
+ "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
+ "requires": {
+ "isexe": "2.0.0"
+ }
+ },
+ "which-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
+ "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=",
+ "dev": true
+ },
+ "widest-line": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz",
+ "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=",
+ "dev": true,
+ "requires": {
+ "string-width": "2.1.1"
+ }
+ },
+ "winston": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.2.tgz",
+ "integrity": "sha512-4S/Ad4ZfSNl8OccCLxnJmNISWcm2joa6Q0YGDxlxMzH0fgSwWsjMt+SmlNwCqdpaPg3ev1HKkMBsIiXeSUwpbA==",
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus="
+ },
+ "wordwrapjs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
+ "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "1.0.1",
+ "typical": "2.6.1"
+ }
+ },
+ "wrap-ansi": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
+ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
+ "dev": true,
+ "requires": {
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1"
+ },
+ "dependencies": {
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dev": true,
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ }
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+ },
+ "write": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz",
+ "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
+ "dev": true,
+ "requires": {
+ "mkdirp": "0.5.1"
+ }
+ },
+ "write-file-atomic": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz",
+ "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "imurmurhash": "0.1.4",
+ "signal-exit": "3.0.2"
+ }
+ },
+ "xdg-basedir": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz",
+ "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=",
+ "dev": true
+ },
+ "xtend": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
+ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
+ },
+ "y18n": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+ "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+ "dev": true
+ },
+ "yallist": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
+ },
+ "yargs": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz",
+ "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=",
+ "dev": true,
+ "requires": {
+ "camelcase": "3.0.0",
+ "cliui": "3.2.0",
+ "decamelize": "1.2.0",
+ "get-caller-file": "1.0.2",
+ "os-locale": "1.4.0",
+ "read-pkg-up": "1.0.1",
+ "require-directory": "2.1.1",
+ "require-main-filename": "1.0.1",
+ "set-blocking": "2.0.0",
+ "string-width": "1.0.2",
+ "which-module": "1.0.0",
+ "y18n": "3.2.1",
+ "yargs-parser": "5.0.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+ "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dev": true,
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ }
+ }
+ },
+ "yargs-parser": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz",
+ "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=",
+ "dev": true,
+ "requires": {
+ "camelcase": "3.0.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+ "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
+ "dev": true
+ }
+ }
+ }
+ }
+}
diff --git a/third_party/polymer3/bower_components/polymer/package.json b/third_party/polymer3/bower_components/polymer/package.json
new file mode 100644
index 0000000..8c52e47
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/package.json
@@ -0,0 +1,68 @@
+{
+ "name": "@polymer/polymer",
+ "version": "3.0.2",
+ "description": "The Polymer library makes it easy to create your own web components. Give your element some markup and properties, and then use it on a site. Polymer provides features like dynamic templates and data binding to reduce the amount of boilerplate you need to write",
+ "main": "polymer-element.js",
+ "directories": {
+ "doc": "docs",
+ "test": "test"
+ },
+ "devDependencies": {
+ "@polymer/gen-closure-declarations": "^0.4.0",
+ "@polymer/gen-typescript-declarations": "^1.2.0",
+ "@polymer/iron-component-page": "^3.0.0-pre.12",
+ "@polymer/test-fixture": "^3.0.0-pre.12",
+ "@webcomponents/webcomponentsjs": "^2.0.0",
+ "babel-eslint": "^7.2.3",
+ "babel-preset-minify": "^0.2.0",
+ "del": "^3.0.0",
+ "dom5": "^3.0.0",
+ "eslint-plugin-html": "^4.0.1",
+ "fs-extra": "^5.0.0",
+ "google-closure-compiler": "^20180204.0.0",
+ "gulp": "^4.0.0",
+ "gulp-babel": "^6.1.2",
+ "gulp-eslint": "^4.0.0",
+ "gulp-if": "^2.0.1",
+ "gulp-replace": "^0.6.1",
+ "gulp-size": "^3.0.0",
+ "gulp-vulcanize": "^7.0.0",
+ "lazypipe": "^1.0.1",
+ "merge-stream": "^1.0.1",
+ "parse5": "^4.0.0",
+ "polymer-build": "^2.1.1",
+ "polymer-cli": "^1.7.0",
+ "run-sequence": "^2.2.0",
+ "through2": "^2.0.0",
+ "wct-browser-legacy": "^1.0.0"
+ },
+ "scripts": {
+ "build": "gulp",
+ "test": "npm run lint && polymer test --npm --module-resolution=node",
+ "serve": "polymer serve --npm --module-resolution=node",
+ "lint": "gulp lint",
+ "update-types": "gulp update-types"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/Polymer/polymer.git"
+ },
+ "author": "The Polymer Project Authors",
+ "license": "BSD-3-Clause",
+ "bugs": {
+ "url": "https://github.com/Polymer/polymer/issues"
+ },
+ "homepage": "https://github.com/Polymer/polymer",
+ "publishConfig": {
+ "access": "public"
+ },
+ "resolutions": {
+ "inherits": "2.0.3",
+ "samsam": "1.1.3",
+ "supports-color": "3.1.2",
+ "type-detect": "1.0.0"
+ },
+ "dependencies": {
+ "@webcomponents/shadycss": "^1.2.0"
+ }
+}
diff --git a/third_party/polymer3/bower_components/polymer/polymer-element.js b/third_party/polymer3/bower_components/polymer/polymer-element.js
new file mode 100644
index 0000000..7188e01
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/polymer-element.js
@@ -0,0 +1,30 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+
+import { ElementMixin } from './lib/mixins/element-mixin.js';
+export { html } from './lib/utils/html-tag.js';
+
+/**
+ * Base class that provides the core API for Polymer's meta-programming
+ * features including template stamping, data-binding, attribute deserialization,
+ * and property change observation.
+ *
+ * @customElement
+ * @polymer
+ * @constructor
+ * @implements {Polymer_ElementMixin}
+ * @extends HTMLElement
+ * @appliesMixin ElementMixin
+ * @summary Custom element base class that provides the core API for Polymer's
+ * key meta-programming features including template stamping, data-binding,
+ * attribute deserialization, and property change observation
+ */
+export const PolymerElement = ElementMixin(HTMLElement);
+
diff --git a/third_party/polymer3/bower_components/polymer/polymer-legacy.js b/third_party/polymer3/bower_components/polymer/polymer-legacy.js
new file mode 100644
index 0000000..ffdd35e
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/polymer-legacy.js
@@ -0,0 +1,27 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+
+import { LegacyElementMixin } from './lib/legacy/legacy-element-mixin.js';
+export { Polymer } from './lib/legacy/polymer-fn.js';
+/* template elements */
+import './lib/legacy/templatizer-behavior.js';
+import './lib/elements/dom-bind.js';
+import './lib/elements/dom-repeat.js';
+import './lib/elements/dom-if.js';
+import './lib/elements/array-selector.js';
+/* custom-style */
+import './lib/elements/custom-style.js';
+/* bc behaviors */
+import './lib/legacy/mutable-data-behavior.js';
+/* import html-tag to export html */
+export { html } from './lib/utils/html-tag.js';
+
+// bc
+export const Base = LegacyElementMixin(HTMLElement).prototype;
diff --git a/third_party/polymer3/bower_components/polymer/test/.eslintignore b/third_party/polymer3/bower_components/polymer/test/.eslintignore
new file mode 100644
index 0000000..1b153da
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/.eslintignore
@@ -0,0 +1,3 @@
+assets/*
+compat/*
+smoke/*
diff --git a/third_party/polymer3/bower_components/polymer/test/.eslintrc.json b/third_party/polymer3/bower_components/polymer/test/.eslintrc.json
new file mode 100644
index 0000000..f98a450
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/.eslintrc.json
@@ -0,0 +1,15 @@
+{
+ "env": {
+ "mocha": true
+ },
+ "rules": {
+ "no-var": "off",
+ "strict": "off"
+ },
+ "globals": {
+ "assert": true,
+ "sinon": true,
+ "WCT": true,
+ "fixture": true
+ }
+}
diff --git a/third_party/polymer3/bower_components/polymer/test/perf/binding-expressions.html b/third_party/polymer3/bower_components/polymer/test/perf/binding-expressions.html
new file mode 100644
index 0000000..8a6d903
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/perf/binding-expressions.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+ <script src="../../../../perf-tester/perf.js"></script>
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-lite.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+ <script type="module" src="../../lib/mixins/strict-binding-parser.js"></script>
+</head>
+
+<body>
+
+<!-- <template>
+ {{compute(alaksjflkasjflkasjflkasjlfkajslkfjaslkfjaaaaaaaaaaaaaaaaaaaaaaaa)]}
+ </template>
+ --> <!-- {{compute(tricky, 'literal\,\'zot\'', this.has.long.log.lo)]} -->
+
+ <template>
+ <span>{{foo}}</span> <span>{{foo.bar}}</span> <span>{{foo.bar.zot}}</span>
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
+ tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+ quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
+ consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
+ cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
+ proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ <span>{{compute(tricky, 'literal\,\'zot\'')}}</span>
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
+ tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+ quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
+ consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
+ cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
+ proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ <span>{{compute(tricky, 'literal\,\'zot\'', this.has.a.bogus.ending.bracket)]}</span>
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
+ tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+ quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
+ consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
+ cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
+ proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ <div class$="{{compute(a, b, c,d,e,f,g,h,i)}}">
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
+ tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+ quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
+ consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
+ cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
+ proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ <span>{{bindings.and.stuff}}</span>
+ <div id="zot"><span>[[computeFn(a, 'b', c, "d", 999)]]</span> literal <span>{{a.b}}</span> literally</div>
+ <div id="zot"><span>[[computeFn(a, 'b', c, "d", 999)]]</span> literal <span>{{a.b}}</span> literally</div>
+ <div id="zot"><span>[[computeFn(a, 'b', c, "d", 999)]]</span> literal <span>{{a.b}}</span> literally</div>
+ <div id="zot"><span>[[computeFn(a, 'b', c, "d", 999)]]</span> literal <span>{{a.b}}</span> literally</div>
+ <div id="zot"><span>[[computeFn(a, 'b', c, "d", 999)]]</span> literal <span>{{a.b}}</span> literally</div>
+ <div id="zot"><span>[[computeFn(a, 'b', c, "d", 999)]]</span> literal <span>{{a.b}}</span> literally</div>
+ <div id="zot"><span>[[computeFn(a, 'b', c, "d", 999)]]</span> literal <span>{{a.b}}</span> literally</div>
+ </div>
+ </template>
+
+ <script type="module">
+import { StrictBindingParser } from '../../lib/mixins/strict-binding-parser.js';
+import { PolymerElement } from '../../polymer-element.js';
+var COUNT = 1000;
+var templates = [];
+var template = document.querySelector('template');
+for (var i=0; i<COUNT; i++) {
+ templates[i] = template.cloneNode(true);
+}
+console.perf();
+for (var i=0; i<COUNT; i++) {
+ const klass = class Foo extends StrictBindingParser(PolymerElement) {
+ static get _template() { return templates[i]; }
+ };
+ customElements.define('foo-' + i, klass);
+ new klass();
+}
+console.perfEnd();
+</script>
+
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/perf/perf-tests.html b/third_party/polymer3/bower_components/polymer/test/perf/perf-tests.html
new file mode 100644
index 0000000..ddeef00
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/perf/perf-tests.html
@@ -0,0 +1,27 @@
+<!doctype html>
+<html lang="en">
+<head>
+
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-lite.js"></script>
+ <script src="../../../../perf-tester/perf-tester.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+ <style>
+ summary {
+ font-family: sans-serif;
+ font-size: 1.5em;
+ }
+ </style>
+
+</head>
+<body>
+ <summary>Perf is go.</summary>
+ <perf-tester runs="25"></perf-tester>
+
+ <script type="module">
+document.querySelector('perf-tester').tests = [
+ 'binding-expressions.html'
+];
+</script>
+
+</body>
diff --git a/third_party/polymer3/bower_components/polymer/test/runner.html b/third_party/polymer3/bower_components/polymer/test/runner.html
new file mode 100644
index 0000000..d715e0d
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/runner.html
@@ -0,0 +1,128 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script>
+ WCT = {
+ mochaOptions: {
+ timeout: 60000
+ }
+ }
+ </script>
+ <script src="unit/wct-browser-config.js"></script>
+ <script src="../node_modules/wct-browser-legacy/browser.js"></script>
+</head>
+<body>
+ <script>
+ 'use strict';
+
+ let suites = [
+ 'unit/globals.html',
+ 'unit/property-accessors.html',
+ 'unit/template-stamp.html',
+ 'unit/property-effects.html',
+ 'unit/property-effects-template.html',
+ 'unit/path-effects.html',
+ 'unit/shady.html',
+ 'unit/shady-events.html',
+ 'unit/shady-content.html',
+ 'unit/shady-dynamic.html',
+ 'unit/styling-scoped.html',
+ 'unit/styling-cross-scope-var.html',
+ 'unit/styling-cross-scope-apply.html',
+ 'unit/styling-cross-scope-unknown-host.html',
+ 'unit/styling-only-with-template.html',
+ 'unit/custom-style.html',
+ 'unit/custom-style-late.html',
+ 'unit/custom-style-async.html',
+ 'unit/custom-style-scope-cache.html',
+ 'unit/events.html',
+ 'unit/template-whitespace.html',
+ 'unit/resolveurl.html',
+ 'unit/case-map.html',
+ 'unit/configure.html',
+ 'unit/ready-attached-order.html',
+ 'unit/ready-attached-order-class.html',
+ 'unit/attributes.html',
+ 'unit/async.html',
+ 'unit/behaviors.html',
+ 'unit/polymer.element.html',
+ 'unit/polymer.properties-mixin.html',
+ 'unit/polymer.properties-mixin-with-property-accessors.html',
+ 'unit/polymer.legacyelement.html',
+ 'unit/debounce.html',
+ 'unit/inheritance.html',
+ 'unit/path.html',
+ 'unit/templatize.html',
+ 'unit/dom-repeat.html',
+ 'unit/dom-if.html',
+ 'unit/dom-bind.html',
+ 'unit/array-selector.html',
+ 'unit/polymer-dom.html',
+ 'unit/polymer-dom-observeNodes.html',
+ 'unit/flattened-nodes-observer.html',
+ // TODO: substitute for equivalent es6 import tests
+ // 'unit/importHref.html',
+ // 'unit/dynamic-import.html',
+ 'unit/gestures.html',
+ 'unit/logging.html',
+ 'unit/mixin-utils.html',
+ 'unit/mixin-behaviors.html',
+ 'unit/render-status.html',
+ 'unit/dir.html',
+ 'unit/disable-upgrade.html',
+ 'unit/shady-unscoped-style.html',
+ 'unit/html-tag.html'
+ // 'unit/multi-style.html'
+ ];
+
+ function combinations(suites, flags) {
+ return flags.map((f) => {
+ return f ? suites.map(s => `${s}?${f}`) : suites;
+ }).reduce((arr, s) => arr.concat(s), []);
+ }
+
+ function addUrlOption(previous = '', next = '') {
+ return previous + (previous ? '&' : '') + next;
+ }
+
+ // test shadowdom/custom elements polyfills together
+ // preferring both if possible.
+ let flags = [''];
+ if (window.customElements) {
+ // NOTE: disabled because Native ShadowDOM and Polyfilled CustomElements is not an expected use-case.
+ // flags.push('wc-ce=true');
+ }
+ // if native is available, make sure to test polyfill
+ if (Element.prototype.attachShadow && Node.prototype.getRootNode) {
+ flags.push('wc-shadydom=true');
+ }
+ // Both sd and ce are supported, force both polyfills
+ if (flags.length === 2) {
+ // ce + sd becomes a single test iteration.
+ flags.push('wc-ce=true&wc-shadydom=true');
+ }
+
+ // economize testing by testing css shimming
+ // only against 1 environment (native or polyfill).
+ if (window.CSS && CSS.supports && CSS.supports('box-shadow', '0 0 0 var(--foo)')) {
+ // Note: Disabled to speed up testing, may be reenabled at a later date when the test timing is less of an issue.
+ // let last = flags.length === 1 ? '' : flags[flags.length - 1];
+ // flags.push(addUrlOption(last, 'wc-shimcssproperties=true'));
+ }
+ suites = combinations(suites, flags);
+ console.log('Testing suites:\n\t' + suites.join('\n\t'));
+
+ WCT.loadSuites(suites);
+ </script>
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/smoke/alacarte-property-accessors.html b/third_party/polymer3/bower_components/polymer/test/smoke/alacarte-property-accessors.html
new file mode 100644
index 0000000..e81c9fd
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/smoke/alacarte-property-accessors.html
@@ -0,0 +1,58 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-lite.js"></script>
+ <script type="module" src="../../lib/mixins/property-accessors.js"></script>
+</head>
+<body>
+
+<script type="module">
+import { PropertyAccessors } from '../../lib/mixins/property-accessors.js';
+
+// Apply mixins to base class
+class MyElement extends PropertyAccessors(HTMLElement) {
+
+ // Declare observed attributes
+ static get observedAttributes() { return ['foo', 'bar']; }
+
+ // Enable accessors and flush any queued property changes
+ connectedCallback() {
+ this._enableProperties();
+ }
+
+ // React to changes
+ _propertiesChanged(currentProps, changedProps, oldProps) {
+ for (let p in changedProps) {
+ this.innerHTML += `${p}: ${changedProps[p]}<br>`;
+ }
+ }
+
+}
+
+// Generate property accessors for all observed attributes
+MyElement.createPropertiesForAttributes();
+
+// Register element
+customElements.define('my-element', MyElement);
+</script>
+
+<my-element foo="5" bar="10"></my-element>
+
+<script type="module">
+import '../../lib/mixins/property-accessors.js';
+document.querySelector('my-element').foo = 20;
+</script>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/polymer3/bower_components/polymer/test/smoke/alacarte-property-effects-ordering.html b/third_party/polymer3/bower_components/polymer/test/smoke/alacarte-property-effects-ordering.html
new file mode 100644
index 0000000..cc97b08
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/smoke/alacarte-property-effects-ordering.html
@@ -0,0 +1,130 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-lite.js"></script>
+ <script type="module" src="../../polymer-element.js"></script>
+</head>
+<body>
+
+<template id="my-element-template">
+ <style>
+ :host {
+ display: block;
+ }
+ #counter {
+ padding: 10px;
+ background: lightblue;
+ }
+ </style>
+ <!-- can use declarative event listeners -->
+ <button on-click="handleIncrement">Increment!</button>
+ <span id="counter">[[limited]]</span>
+ <x-a prop="[[limited]]"></x-a>
+ <x-b></x-b>
+</template>
+
+<script type="module">
+import { PolymerElement } from '../../polymer-element.js';
+import { PropertyEffects } from '../../lib/mixins/property-effects.js';
+
+customElements.define('x-a', class extends PolymerElement {
+ static get observers() { return ['propChanged(prop)']; }
+ constructor() {
+ super();
+ this.prop = 99;
+ }
+ propChanged(prop) {
+ console.log(this.localName, 'propChanged', prop);
+ this.textContent = prop;
+ }
+ ready() {
+ super.ready();
+ console.log(this.localName, 'ready');
+ }
+});
+
+customElements.define('x-b', class extends PolymerElement {
+ static get observers() { return ['propChanged(prop)']; }
+ constructor() {
+ super();
+ this.prop = 77;
+ }
+ propChanged(prop) {
+ console.log(this.localName, 'propChanged', prop);
+ this.textContent = prop;
+ }
+ ready() {
+ super.ready();
+ console.log(this.localName, 'ready');
+ }
+});
+
+let template = document.getElementById('my-element-template');
+
+// Apply mixins to base class
+let MyBaseClass = PropertyEffects(HTMLElement);
+
+class MyElement extends MyBaseClass {
+
+ // Declare observed attributes
+ static get observedAttributes() { return ['counter', 'limit']; }
+
+ constructor() {
+ super();
+ this.counter = 0;
+ this.limit = Infinity;
+ }
+
+ // Enable accessors and flush any queued property changes
+ connectedCallback() {
+ this._enableProperties();
+ }
+
+ // Called once by PropertyAccessors during first property flush
+ // Do one-time work like setting up Shadow DOM
+ ready() {
+ console.log(this.localName, 'before ready');
+ this.dom = this._stampTemplate(template);
+ super.ready();
+ console.log(this.localName, 'after ready');
+ }
+
+ _readyClients() {
+ this.attachShadow({mode: 'open'}).appendChild(this.dom);
+ super._readyClients();
+ }
+
+ computeLimited(counter, limit) {
+ return Math.min(counter, limit);
+ }
+
+ handleIncrement() {
+ this.counter++;
+ }
+
+}
+
+// Generate property accessors for all observed attributes
+MyElement.createComputedProperty('limited', 'computeLimited(counter, limit)');
+MyElement.bindTemplate(template);
+
+// Register element
+customElements.define('my-element', MyElement);
+</script>
+
+
+<my-element counter="10" limit="20"></my-element>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/polymer3/bower_components/polymer/test/smoke/alacarte-property-effects.html b/third_party/polymer3/bower_components/polymer/test/smoke/alacarte-property-effects.html
new file mode 100644
index 0000000..e0c0d65
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/smoke/alacarte-property-effects.html
@@ -0,0 +1,86 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-lite.js"></script>
+ <script type="module" src="../../lib/mixins/property-effects.js"></script>
+</head>
+<body>
+
+<template id="my-element-template">
+ <style>
+ :host {
+ display: block;
+ }
+ #counter {
+ padding: 10px;
+ background: lightblue;
+ }
+ </style>
+ <!-- can use declarative event listeners -->
+ <button on-click="handleIncrement">Increment!</button>
+ <span id="counter">[[limited]]</span>
+</template>
+
+<script type="module">
+import { PropertyEffects } from '../../lib/mixins/property-effects.js';
+
+let template = document.getElementById('my-element-template');
+
+class MyElement extends PropertyEffects(HTMLElement) {
+
+ // Declare observed attributes
+ static get observedAttributes() { return ['counter', 'limit']; }
+
+ constructor() {
+ super();
+ this.counter = 0;
+ this.limit = Infinity;
+ }
+
+ // Enable accessors and flush any queued property changes
+ connectedCallback() {
+ this._enableProperties();
+ }
+
+ // Called once by PropertyAccessors during first property flush
+ // Do one-time work like setting up Shadow DOM
+ ready() {
+ this.dom = this._stampTemplate(template);
+ this.attachShadow({mode: 'open'}).appendChild(this.dom);
+ super.ready();
+ }
+
+ computeLimited(counter, limit) {
+ return Math.min(counter, limit);
+ }
+
+ handleIncrement() {
+ this.counter++;
+ }
+
+}
+
+// Generate property accessors for all observed attributes
+MyElement.createComputedProperty('limited', 'computeLimited(counter, limit)');
+MyElement.bindTemplate(template);
+
+// Register element
+customElements.define('my-element', MyElement);
+</script>
+
+
+<my-element counter="10" limit="20"></my-element>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/polymer3/bower_components/polymer/test/smoke/alacarte-template-stamp.html b/third_party/polymer3/bower_components/polymer/test/smoke/alacarte-template-stamp.html
new file mode 100644
index 0000000..67d36e6
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/smoke/alacarte-template-stamp.html
@@ -0,0 +1,95 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-lite.js"></script>
+ <script type="module" src="../../lib/mixins/property-accessors.js"></script>
+ <script type="module" src="../../lib/mixins/template-stamp.js"></script>
+</head>
+<body>
+
+<template id="my-element-template">
+ <style>
+ :host {
+ display: block;
+ }
+ #counter {
+ padding: 10px;
+ background: lightblue;
+ }
+ </style>
+ <!-- can use declarative event listeners -->
+ <button on-click="handleIncrement">Increment!</button>
+ <span id="counter"></span>
+</template>
+
+<script type="module">
+import { PropertyAccessors } from '../../lib/mixins/property-accessors.js';
+import { TemplateStamp } from '../../lib/mixins/template-stamp.js';
+
+// Apply mixins to base class
+let MyBaseClass =
+ TemplateStamp(
+ PropertyAccessors(
+ HTMLElement));
+
+class MyElement extends MyBaseClass {
+
+ // Declare observed attributes
+ static get observedAttributes() { return ['counter', 'limit']; }
+
+ constructor() {
+ super();
+ this.counter = 0;
+ this.limit = Infinity;
+ }
+
+ // Enable accessors and flush any queued property changes
+ connectedCallback() {
+ this._enableProperties();
+ }
+
+ // Called once by PropertyAccessors during first property flush
+ // Do one-time work like setting up Shadow DOM
+ ready() {
+ let template = document.getElementById('my-element-template');
+ this.dom = this._stampTemplate(template);
+ this.attachShadow({mode: 'open'}).appendChild(this.dom);
+ super.ready();
+ }
+
+ // React to changes
+ _propertiesChanged(currentProps, changedProps, oldProps) {
+ // Can use this.$ to access id'ed nodes in template
+ this.dom.$.counter.textContent =
+ Math.min(currentProps.counter, currentProps.limit);
+ }
+
+ handleIncrement() {
+ this.counter++;
+ }
+
+}
+
+// Generate property accessors for all observed attributes
+MyElement.createPropertiesForAttributes();
+
+// Register element
+customElements.define('my-element', MyElement);
+</script>
+
+
+<my-element counter="10" limit="20"></my-element>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/polymer3/bower_components/polymer/test/smoke/behavior-mixin.html b/third_party/polymer3/bower_components/polymer/test/smoke/behavior-mixin.html
new file mode 100644
index 0000000..2f6dc18
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/smoke/behavior-mixin.html
@@ -0,0 +1,96 @@
+ <!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->|
+<!DOCTYPE html>
+<html>
+<head>
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-lite.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+</head>
+<body>
+
+<dom-module id="x-test">
+ <template>
+ <div>behavior says: {{behaviorProp}}</div>
+ <div>element says: {{prop}}</div>
+ </template>
+</dom-module>
+<script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+import { DomModule } from '../../lib/elements/dom-module.js';
+import { mixinBehaviors } from '../../lib/legacy/class.js';
+/** @polymerBehavior */
+var MyBehavior = {
+ properties: {
+ behaviorProp: {
+ value: 'prop from behavior!',
+ observer: '_propChanged'
+ }
+ },
+ _propChanged: function(value) {
+ console.log(this.localName, '_propChanged', value);
+ },
+ ready: function() {
+ console.log(this.localName, 'MyBehavior.ready');
+ }
+}
+
+/** @polymerBehavior */
+var MyBehavior2 = {
+ ready: function() {
+ console.log(this.localName, 'MyBehavior2.ready');
+ }
+}
+
+Polymer({
+ is: 'x-test',
+ behaviors: [MyBehavior],
+ properties: {
+ prop: {
+ value: 'prop from x-test'
+ }
+ },
+ ready: function() {
+ console.log(this.localName, 'x-test.ready');
+ }
+});
+
+// ***********
+
+var XTest = customElements.get('x-test');
+
+class XClass extends mixinBehaviors([MyBehavior, MyBehavior2], XTest) {
+ static get is() { return 'x-class'}
+
+ static get template() {
+ return DomModule.import('x-test', 'template');
+ }
+
+ static get config() {
+ return {
+ properties: {
+ prop: {
+ value: 'prop from x-class'
+ }
+ }
+ }
+ }
+ ready() {
+ super.ready();
+ console.log('x-class ready');
+ }
+}
+
+customElements.define(XClass.is, XClass);
+</script>
+
+<x-class></x-class>
+
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/smoke/data-table.html b/third_party/polymer3/bower_components/polymer/test/smoke/data-table.html
new file mode 100644
index 0000000..ebc2b55
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/smoke/data-table.html
@@ -0,0 +1,374 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <title>data-table</title>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-lite.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+</head>
+<body>
+
+ <script type="module">
+window.emojiByType = {
+ a: '😎',
+ b: '💰',
+ c: '🚔',
+ d: '💕',
+ e: '👍',
+ f: '🍌'
+};
+</script>
+
+ <dom-module id="data-popup">
+ <template strip-whitespace>
+ <style>
+ :host {
+ display: inline-block;
+ background: lightblue;
+ border-radius: 10px;
+ border-bottom-left-radius: 0;
+ border: 1px solid #aaa;
+ box-shadow: 3px 3px 5px #535353;
+ padding: 5px;
+ z-index: 1;
+ }
+ </style>
+ <slot></slot>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'data-popup'
+});
+</script>
+ </dom-module>
+
+ <dom-module id="data-cell">
+ <template strip-whitespace>
+ <style>
+ :host {
+ flex: 1;
+ border: 2px solid #aaa;
+ padding: 5px;
+ position: relative;
+ background: #eee;
+ }
+ data-popup {
+ display: none;
+ position: absolute;
+ bottom: calc(100% - 15px);
+ left: calc(100% - 15px);
+ }
+ :host(:hover) data-popup {
+ display: inline-block;
+ }
+ :host([change=up]) {
+ background: #afa;
+ }
+ :host([change=down]) {
+ background: #faa;
+ }
+ .type {
+ display: inline-block;
+ border-radius: 100%;
+ box-sizing: border-box;
+ padding: 3px 0;
+ background: #aaa;
+ margin-right: 5px;
+ height: 30px;
+ width: 30px;
+ text-align: center;
+ }
+ </style>
+ <div class="type">{{computeTypeIcon(type)}}</div>
+ {{toFixed(value)}}
+ <data-popup>{{value}}</data-popup>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'data-cell',
+ properties: {
+ type: {
+ type: String,
+ notify: true
+ },
+ value: {
+ type: Number,
+ notify: true
+ },
+ change: {
+ reflectToAttribute: true,
+ computed: 'computeChange(value)'
+ }
+ },
+ attached: function() {
+ this.fire('register-cell');
+ },
+ computeChange: function(value) {
+ var prev = this._prev;
+ this._prev = value;
+ return value > prev ? 'up' : (value < prev ? 'down' : 'none');
+ },
+ computeTypeIcon: function(type) {
+ return emojiByType[type];
+ },
+ toFixed: function(value) {
+ return Number(value).toFixed(2);
+ }
+});
+</script>
+ </dom-module>
+
+ <dom-module id="data-row">
+ <template strip-whitespace>
+ <style>
+ :host {
+ display: flex;
+ flex-direction: row;
+ }
+ .title-cell {
+ flex: 1;
+ }
+ .title {
+ font-weight: bold;
+ }
+ .dominant {
+ font-size: 0.7em;
+ }
+ </style>
+ <div class="title-cell">
+ <div class="title">{{title}}</div>
+ <div class="dominant">Dominant: {{computeDominant(cells.*)}}</div>
+ </div>
+ <template is="dom-repeat" items="{{cells}}" as="cell">
+ <data-cell type="{{cell.type}}" value="{{cell.value}}"></data-cell>
+ </template>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'data-row',
+ properties: {
+ title: {
+ type: String,
+ notify: true
+ },
+ cells: {
+ type: Array,
+ notify: true
+ }
+ },
+ computeDominant: function(info) {
+ var types = this.types = info.base.reduce(function(map, i) {
+ return map[i.type] = (map[i.type] || 0) + 1, map;
+ }, {})
+ return emojiByType[Object.keys(types).sort(function(a, b) {
+ return types[b] - types[a];
+ })[0]];
+ }
+});
+</script>
+ </dom-module>
+
+ <dom-module id="data-table">
+ <template strip-whitespace>
+ <style>
+ :host {
+ display: block;
+ }
+ </style>
+ Polymer: {{version}}<br>
+ <button on-tap="toggleRunning">{{computeRunning(running)}}</button>
+ <input value-as-number="{{tables::input}}" type="number" style="width:35px;" placeholder="tables">
+ <input value-as-number="{{rows::input}}" type="number" style="width:35px;" placeholder="rows">
+ <input value-as-number="{{columns::input}}" type="number" style="width:35px;" placeholder="columns">
+ <br><br>
+ <select value="{{strategy::change}}">
+ <option value="reset">(Mutate in place x n), reset</option>
+ <option value="reset-each">(Mutate in place, reset) x n</option>
+ <option value="path">(Set path from top) x n</option>
+ <option value="path-leaf">(Set path from leaf) x n</option>
+ </select>
+ n = <input value-as-number="{{mutations::input}}" type="number" style="width:35px;">
+ <br><br>
+ <h3>FPS: {{fps}}</h3>
+ <h3>Op time: {{toFixed(optime, 2)}}</h3>
+ <div xhidden>
+ <template is="dom-repeat" items="{{tableData}}">
+ <h3>Table {{index}}:</h3>
+ <template is="dom-repeat" items="{{data}}" as="row">
+ <data-row title="{{row.title}}" cells="{{row.cells}}"></data-row>
+ </template>
+ </template>
+ </div>
+ </template>
+ <script type="module">
+import { Polymer, version as version$0 } from '../../lib/utils/boot.js';
+var params = document.location.search.substring(1).split('&').map(p=>p.split('='))
+ .reduce((m, p)=>{return m[p[0]] = p[1], m;}, {});
+Polymer({
+ is: 'data-table',
+ properties: {
+ rows: {
+ type: Number,
+ value: Number(params.rows) || 6
+ },
+ columns: {
+ type: Number,
+ value: Number(params.columns) || 10
+ },
+ tables: {
+ type: Number,
+ value: Number(params.tables) || 2
+ },
+ mutations: {
+ type: Number,
+ value: Number(params.mutations) || 30
+ },
+ strategy: {
+ type: String,
+ value: params.strategy || 'reset'
+ },
+ running: {
+ type: Number,
+ value: params.running === 'false' ? false : true
+ },
+ tableData: {
+ computed: 'computeTableData(tables)'
+ },
+ optime: {
+ value: 0
+ }
+ },
+ observers: ['computeData(rows, columns)'],
+ created: function() {
+ this._fps = 0;
+ this.end = performance.now() + 1000;
+ var cells = this.cells = [];
+ this.addEventListener('register-cell', function(e) {
+ var cell = e.composedPath()[0];
+ cell.id = 'cell-' + cells.length;
+ cells.push(cell);
+ });
+ },
+ toggleRunning: function() {
+ this.running = !this.running;
+ if (this.running) {
+ this.go();
+ }
+ },
+ computeRunning: function(running) {
+ return running ? 'Pause' : 'Run';
+ },
+ computeData: function(rows, columns) {
+ var r = [];
+ for (var i=0; i<rows; i++) {
+ var c = [];
+ for (var j=0; j<columns; j++) {
+ c.push({
+ value: Math.random() * 10,
+ type: ['a','b','c','d','e','f'][Math.floor(Math.random()*6)]
+ });
+ }
+ r.push({
+ cells: c,
+ title: 'Row ' + i
+ })
+ }
+ this.data = r;
+ },
+ computeTableData: function(tables) {
+ return new Array(Number(tables));
+ },
+ toFixed: function(value, decimals) {
+ return value.toFixed(decimals);
+ },
+ ready: function() {
+ this.version = version$0 || 'alacarte';
+ if (!this.setProperties) {
+ this.setProperties = function(props) {
+ for (var p in props) {
+ this.set(p, props[p]);
+ }
+ }
+ }
+ this.go();
+ },
+ go: function() {
+ var optime = 0;
+ for (var i=0; i<this.mutations; i++) {
+ var type = ['a','b','c','d','e','f'][Math.floor(Math.random()*6)];
+ var delta = (Math.random() > 0.5 ? -1 : 1) * (Math.random() * 5);
+ var row = Math.floor(Math.random() * this.rows);
+ var column = Math.floor(Math.random() * this.columns);
+ var d = this.data[row].cells[column];
+ if (this.strategy == 'reset' || this.strategy == 'reset-each') {
+ d.type = type;
+ d.value += delta;
+ if (this.strategy == 'reset-each') {
+ var start = performance.now();
+ this.set('data', this.data);
+ optime += (performance.now() - start);
+ }
+ } else if (this.strategy == 'path') {
+ var path = ['data', row, 'cells', column].join('.');
+ var props = {};
+ props[path + '.type'] = type;
+ props[path + '.value'] = d.value + delta;
+ var start = performance.now();
+ this.setProperties(props);
+ optime += (performance.now() - start);
+ } else if (this.strategy == 'path-leaf') {
+ var c = this.cells[Math.floor(this.cells.length * Math.random())];
+ var props = {
+ type: type,
+ value: c.value + delta
+ };
+ var start = performance.now();
+ c.setProperties(props);
+ optime += (performance.now() - start);
+ }
+ }
+ if (optime) {
+ this.optime = (this.optime * 9 + (optime / this.mutations)) / 10;
+ // this.optime = optime / this.mutations;
+ }
+ if (this.strategy == 'reset') {
+ var start = performance.now();
+ this.set('data', this.data);
+ this.optime = (this.optime * 9 + (performance.now() - start)) / 10;
+ // this.optime = performance.now() - start;
+ }
+ this._fps++;
+ if (performance.now() > this.end) {
+ this.fps = this._fps;
+ this._fps = 0;
+ this.end = performance.now() + 1000;
+ }
+ var self = this;
+ if (this.running) {
+ requestAnimationFrame(function() {
+ self.go();
+ });
+ }
+ }
+});
+</script>
+ </dom-module>
+
+ <data-table id="table"></data-table>
+
+
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/smoke/dirty-check.html b/third_party/polymer3/bower_components/polymer/test/smoke/dirty-check.html
new file mode 100644
index 0000000..379c7d1
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/smoke/dirty-check.html
@@ -0,0 +1,70 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<!DOCTYPE html>
+<html>
+<head>
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-lite.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+</head>
+<body>
+
+<dom-module id="x-host">
+ <template>
+ <h1>1 + [[foo]] = [[bar]]</h1>
+ <x-child id="child" foo="[[foo]]" bar="{{bar}}"></x-child>
+ </template>
+
+ <script type="module">
+import { PolymerElement } from '../../polymer-element.js';
+class XHost extends PolymerElement {
+ static get config() {
+ return {
+ properties: {
+ obj: {
+ observer: 'objChanged'
+ }
+ }
+ }
+ }
+ objChanged(val, old) {
+ console.log('new', val, 'old', old);
+ }
+ _shouldPropertyChange(prop, val, old) {
+ if (this.strict) {
+ return val !== old;
+ } else if (val instanceof Date) {
+ return !(old instanceof Date) || val.getTime() !== old.getTime();
+ } else {
+ return super._shouldPropertyChange(prop, val, old);
+ }
+ }
+}
+customElements.define('x-host', XHost);
+</script>
+</dom-module>
+
+<x-host id="host"></x-host>
+
+<script type="module">
+var obj = {foo: true};
+host.obj = obj;
+host.obj = obj;
+console.log('strict on')
+host.strict = true;
+host.obj = obj;
+console.log('strict off')
+host.strict = false;
+host.obj = obj;
+host.obj = new Date();
+host.obj = new Date(host.obj.getTime());
+</script>
+
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/smoke/disable-upgrade.html b/third_party/polymer3/bower_components/polymer/test/smoke/disable-upgrade.html
new file mode 100644
index 0000000..a39c446
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/smoke/disable-upgrade.html
@@ -0,0 +1,101 @@
+<!doctype html>
+<html>
+<head>
+ <script type="module" src="../../polymer-legacy.js"></script>
+ <script type="module" src="../../lib/mixins/disable-upgrade-mixin.js"></script>
+</head>
+<body>
+ <script type="module">
+import { DisableUpgradeMixin } from '../../lib/mixins/disable-upgrade-mixin.js';
+const ogDefine = window.customElements.ogDefine = window.customElements.define;
+window.customElements.defineWithDisabled = function(name, constructor) {
+ return ogDefine.call(customElements, name,
+ DisableUpgradeMixin(constructor));
+}
+window.customElements.define = window.customElements.defineWithDisabled;
+</script>
+
+ <dom-module id="x-disabled">
+
+ <template>
+ <style>
+ :host {
+ display: block;
+ }
+
+ h2 {
+ letter-spacing: 1em;
+ }
+ </style>
+ <h2>[[prop]]</h2>
+ </template>
+
+ <script type="module">
+import '../../lib/mixins/disable-upgrade-mixin.js';
+import { PolymerElement } from '../../polymer-element.js';
+class Disabled extends PolymerElement {
+ static get is() { return 'x-disabled'; }
+ static get properties() {
+ return {
+ prop: {
+ type: String
+ }
+ }
+ }
+ constructor() {
+ super();
+ this.prop = 'enabled!';
+ }
+}
+customElements.define(Disabled.is, Disabled);
+</script>
+
+ </dom-module>
+
+ <dom-module id="my-element">
+
+ <template>
+ <style>
+ :host {
+ display: block;
+ }
+
+ button {
+ display: block;
+ }
+ </style>
+ <h3>x-disabled without disable-upgrade</h3>
+ <x-disabled>Disabled</x-disabled>
+ <h3>x-disabled with disable-upgrade</h3>
+ <x-disabled id="disabled" disable-upgrade>Disabled</x-disabled>
+ <h3>x-disabled with disable-upgrade</h3>
+ <x-disabled disable-upgrade$="[[upgradeDisabled]]">Disabled</x-disabled>
+ <button on-click="_enable">Enable</button>
+ </template>
+
+ <script type="module">
+import '../../lib/mixins/disable-upgrade-mixin.js';
+import { PolymerElement } from '../../polymer-element.js';
+
+
+class MyElement extends PolymerElement {
+ static get is() { return 'my-element'; }
+ static get properties() {
+ return {
+ upgradeDisabled: {value: true}
+ }
+ }
+ _enable() {
+ this.$.disabled.removeAttribute('disable-upgrade');
+ this.upgradeDisabled = false;
+ }
+}
+customElements.define(MyElement.is, MyElement);
+</script>
+
+ </dom-module>
+
+ <my-element></my-element>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/polymer3/bower_components/polymer/test/smoke/disabled-attr-gestures.html b/third_party/polymer3/bower_components/polymer/test/smoke/disabled-attr-gestures.html
new file mode 100644
index 0000000..822ecc5
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/smoke/disabled-attr-gestures.html
@@ -0,0 +1,39 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2018 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-loader.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+</head>
+<body>
+ <dom-module id="x-disabled">
+ <template>
+ <button id="disabledbutton" on-tap="tap" disabled>Disabled Button</button>
+ <div disabled>
+ <button id="nestedbutton" on-tap="tap">Nested Button</button>
+ </div>
+ </template>
+ <script type="module">
+import { GestureEventListeners } from '../../lib/mixins/gesture-event-listeners.js';
+import { PolymerElement } from '../../polymer-element.js';
+class XDisabled extends GestureEventListeners(PolymerElement) {
+ static get is() {return 'x-disabled';}
+ tap(e) {
+ console.log(`${e.composedPath()[0].id} tapped`);
+ }
+}
+customElements.define(XDisabled.is, XDisabled);
+</script>
+ </dom-module>
+ <x-disabled></x-disabled>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/polymer3/bower_components/polymer/test/smoke/dom-if.html b/third_party/polymer3/bower_components/polymer/test/smoke/dom-if.html
new file mode 100644
index 0000000..96c751f
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/smoke/dom-if.html
@@ -0,0 +1,61 @@
+<!doctype html>
+<html>
+<head>
+ <script type="module" src="../../polymer-legacy.js"></script>
+</head>
+<body>
+
+
+ <dom-module id="my-element">
+
+ <template>
+ <style>
+ :host {
+ display: block;
+ }
+ .parent {
+ border: 1px solid red;
+ justify-content: space-between;
+ width: 300px;
+ display: flex;
+ }
+ .child {
+ border: 1px solid green;
+ width: 100px;
+ }
+ </style>
+ <div class='parent'>
+ <div class='child'>Child1</div>
+ <template is='dom-if' if='1'>
+ <div class='child'>Child2</div>
+ </template>
+ </div>
+ </template>
+
+
+ <!-- Uncomment for class syntax -->
+ <script type="module">
+import { PolymerElement } from '../../polymer-element.js';
+class MyElement extends PolymerElement {
+ static get is() { return 'my-element'; }
+ static get properties() {
+ return {
+ prop: {
+ type: String
+ }
+ }
+ }
+ constructor() {
+ super();
+ this.prop = 'my-element'
+ }
+}
+customElements.define(MyElement.is, MyElement);
+</script>
+
+ </dom-module>
+
+ <my-element></my-element>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/polymer3/bower_components/polymer/test/smoke/gestures.html b/third_party/polymer3/bower_components/polymer/test/smoke/gestures.html
new file mode 100644
index 0000000..4330755
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/smoke/gestures.html
@@ -0,0 +1,49 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<!--
+ Port of https://github.com/Polymer/polymer/issues/4211
+ Credit @MartinsThiago
+-->
+<html>
+<head>
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-lite.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+ <link rel="import" href="https://cdn.rawgit.com/PolymerElements/iron-selector/2.0-preview/iron-selector.html">
+</head>
+<body>
+
+ <style>
+ html {font-family: sans}
+ div {padding: 5px}
+ .iron-selected {background: deepskyblue}
+ </style>
+
+ <button onclick="console.log('works!')">First click me</button>
+
+ <br>
+
+ <iron-selector>
+ <div>Click on me \o/ 1</div>
+ <div>Click on me \o/ 2</div>
+ <div>Click on me \o/ 3</div>
+ <div>Click on me \o/ 4</div>
+ <div>Click on me \o/ 5</div>
+ </iron-selector>
+
+ <button onclick="console.log('This is working after a few clicks')">Click last</button>
+
+ <script type="module">
+import { version } from '../../lib/utils/boot.js';
+console.log("Using: " + version);
+console.log("Ready to start bug demo");
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/polymer3/bower_components/polymer/test/smoke/html-tag.html b/third_party/polymer3/bower_components/polymer/test/smoke/html-tag.html
new file mode 100644
index 0000000..b416eb3
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/smoke/html-tag.html
@@ -0,0 +1,67 @@
+<!DOCTYPE html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-lite.js"></script>
+ <script type="module" src="../../polymer-element.js"></script>
+</head>
+<body>
+ <script type="module">
+import { PolymerElement } from '../../polymer-element.js';
+import { html as html$0 } from '../../lib/utils/html-tag.js';
+const html = html$0;
+class SuperClass extends PolymerElement {
+ static get is() {return 'super-class';}
+ static get template() {
+ return html`
+ <style>#name {color: red}</style>
+ <h3 id="name">${this.is}</h3>
+ <div>${this.headerTemplate}</div>
+ [[myProp.stuffThatGoesHere]]
+ <div>${this.footerTemplate}</div>
+ `;
+ }
+ static get headerTemplate() { return html`<h1>Header</h1>`; }
+ static get footerTemplate() { return html`<h1>Footer</h1>`; }
+}
+customElements.define(SuperClass.is, SuperClass);
+class SubClass extends SuperClass {
+ static get is() {return 'sub-class';}
+ static get template() {
+ return html`
+ <style>.frame {font-style: italic}</style>
+ <div class="frame">${super.template}</div>
+ <div>\</div>
+ `;
+ }
+ constructor() {
+ super();
+ this.myProp = {stuffThatGoesHere: '!stuff that goes here!'};
+ }
+ static get headerTemplate() { return html`<h2>Sub-header</h2>`; }
+ static get footerTemplate() { return html`<h2>Sub-footer</h2>`; }
+}
+customElements.define(SubClass.is, SubClass);
+</script>
+ <script type="module">
+import { PolymerElement } from '../../polymer-element.js';
+class XString extends PolymerElement {
+ static get is() {return 'x-string'};
+ static get template() {
+ return 'string template!';
+ }
+}
+customElements.define(XString.is, XString);
+</script>
+ <super-class></super-class>
+ <sub-class></sub-class>
+ <x-string></x-string>
+</body>
\ No newline at end of file
diff --git a/third_party/polymer3/bower_components/polymer/test/smoke/label-click.html b/third_party/polymer3/bower_components/polymer/test/smoke/label-click.html
new file mode 100644
index 0000000..4e60b0c
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/smoke/label-click.html
@@ -0,0 +1,25 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<!DOCTYPE html>
+<html>
+
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-lite.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+</head>
+
+<body>
+ <label id="label" for="checkme">Native checkbox</label>
+ <input type="checkbox" id="checkme">
+</body>
+
+</html>
\ No newline at end of file
diff --git a/third_party/polymer3/bower_components/polymer/test/smoke/ordering-test.html b/third_party/polymer3/bower_components/polymer/test/smoke/ordering-test.html
new file mode 100644
index 0000000..7e8a3c1
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/smoke/ordering-test.html
@@ -0,0 +1,139 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-lite.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+</head>
+<body>
+
+<script type="module">
+import { PolymerElement, html } from '../../polymer-element.js';
+class XA extends PolymerElement {
+ static get template() {
+ return html`<x-b prop="[[prop]]"></x-b>`;
+ }
+ static get observers() { return ['propChanged(prop)']}
+ propChanged() {
+ console.log(this.localName, 'propChanged', this.shadowRoot);
+ }
+ constructor() {
+ console.log('x-a', 'constructed');
+ super();
+ this.childList = [];
+ this.addEventListener('child-is-here', e => {
+ let target = e.composedPath()[0];
+ if (target !== this) {
+ this.childList.push(target);
+ }
+ });
+ this.prop = 'prop';
+ }
+ connectedCallback() {
+ console.group(this.localName, 'connected');
+ console.warn(this.localName, 'connected (user)', this.shadowRoot);
+ super.connectedCallback();
+ console.groupEnd(this.localName, 'connected');
+ }
+ _flushProperties() {
+ console.log(this.localName, 'flush');
+ super._flushProperties();
+ }
+ ready() {
+ console.group(this.localName, 'ready');
+ super.ready();
+ console.warn(this.localName, 'ready (user)', this.shadowRoot);
+ console.log(this.localName, 'childList', this.childList);
+ console.groupEnd(this.localName, 'ready');
+ }
+}
+customElements.define('x-a', XA);
+
+class XB extends PolymerElement {
+ static get template() {
+ return `<x-c prop="[[prop]]"></x-c>`;
+ }
+ static get observers() { return ['propChanged(prop)']}
+ propChanged() {
+ console.log(this.localName, 'propChanged', this.shadowRoot);
+ }
+ constructor() {
+ console.log('x-b', 'constructed');
+ super();
+ this.childList = [];
+ this.addEventListener('child-is-here', e => {
+ let target = e.composedPath()[0];
+ if (target !== this) {
+ this.childList.push(target);
+ }
+ });
+ }
+ connectedCallback() {
+ console.group(this.localName, 'connected');
+ console.warn(this.localName, 'connected (user)', this.shadowRoot);
+ super.connectedCallback();
+ console.groupEnd(this.localName, 'connected');
+ }
+ _flushProperties() {
+ console.log(this.localName, 'flush');
+ super._flushProperties();
+ }
+ ready() {
+ console.group(this.localName, 'ready');
+ this.dispatchEvent(new CustomEvent('child-is-here', {bubbles: true, composed: true}));
+ super.ready();
+ console.warn(this.localName, 'ready (user)', this.shadowRoot);
+ console.log(this.localName, 'childList', this.childList);
+ console.groupEnd(this.localName, 'ready');
+ }
+}
+customElements.define('x-b', XB);
+
+class XC extends PolymerElement {
+ static get template() {
+ return html`<div></div>`;
+ }
+ static get observers() { return ['propChanged(prop)']}
+ propChanged() {
+ console.log(this.localName, 'propChanged', this.shadowRoot);
+ }
+ constructor() {
+ console.log('x-c', 'constructed');
+ super();
+ this.childList = [];
+ }
+ connectedCallback() {
+ console.group(this.localName, 'connected');
+ console.warn(this.localName, 'connected (user)', this.shadowRoot);
+ super.connectedCallback();
+ console.groupEnd(this.localName, 'connected');
+ }
+ _flushProperties() {
+ console.log(this.localName, 'flush');
+ super._flushProperties();
+ }
+ ready() {
+ console.group(this.localName, 'ready');
+ this.dispatchEvent(new CustomEvent('child-is-here', {bubbles: true, composed: true}));
+ super.ready();
+ console.warn(this.localName, 'ready (user)', this.shadowRoot);
+ console.groupEnd(this.localName, 'ready');
+ }
+}
+customElements.define('x-c', XC);
+</script>
+
+<x-a></x-a>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/polymer3/bower_components/polymer/test/smoke/passive-gestures.html b/third_party/polymer3/bower_components/polymer/test/smoke/passive-gestures.html
new file mode 100644
index 0000000..a27c2ee
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/smoke/passive-gestures.html
@@ -0,0 +1,63 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-loader.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+ <script type="module">
+import { setPassiveTouchGestures } from '../../lib/utils/settings.js';
+setPassiveTouchGestures(true);
+</script>
+ <style>
+ html, body {
+ margin: 0;
+ padding: 0;
+ }
+ </style>
+</head>
+<body>
+ <dom-module id="x-passive">
+ <template>
+ <style>
+ :host {
+ display: block;
+ height: 2000px;
+ background-color: -webkit-gradient(linear, left top, left bottom, from(blue), to(red));
+ background-image: -webkit-linear-gradient(top, blue, red);
+ background-image: -moz-linear-gradient(top, blue, red);
+ background-image: linear-gradient(to bottom, blue, red);
+ }
+ </style>
+ </template>
+ </dom-module>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-passive',
+ listeners: {
+ 'down': 'prevent',
+ 'move': 'prevent',
+ 'up': 'prevent',
+ 'tap': 'allowed',
+ 'click': 'allowed'
+ },
+ prevent(e) {
+ e.preventDefault();
+ console.log('prevented?: ' + e.type + ' ' + e.defaultPrevented);
+ },
+ allowed(e) {
+ console.log(e.type + ' allowed');
+ }
+});
+</script>
+ <x-passive></x-passive>
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/smoke/style-props/src/elements-defaults.js b/third_party/polymer3/bower_components/polymer/test/smoke/style-props/src/elements-defaults.js
new file mode 100644
index 0000000..c40f8c5
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/smoke/style-props/src/elements-defaults.js
@@ -0,0 +1,15 @@
+const $_documentContainer = document.createElement('div');
+$_documentContainer.setAttribute('style', 'display: none;');
+
+$_documentContainer.innerHTML = `<style is="custom-style">
+ html {
+ --x-s: {
+ display: inline-block;
+ margin: 16px;
+ border-radius: 4px;
+ padding: 2px;
+ };
+ }
+</style>`;
+
+document.head.appendChild($_documentContainer);
diff --git a/third_party/polymer3/bower_components/polymer/test/smoke/style-props/src/elements.js b/third_party/polymer3/bower_components/polymer/test/smoke/style-props/src/elements.js
new file mode 100644
index 0000000..a0663a9
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/smoke/style-props/src/elements.js
@@ -0,0 +1,104 @@
+import './elements-defaults.js';
+import { Polymer } from '../../../../lib/legacy/polymer-fn.js';
+import { html } from '../../../../lib/utils/html-tag.js';
+Polymer({
+ _template: html`
+ <style include="simple-layout-styles">
+ :host {
+ transform: rotate(-45deg);
+ -webkit-transform: rotate(-45deg);
+ background-color: lightblue;
+ @apply(--x-s);
+ }
+
+ .container {
+ height: 100px;
+ width: 100px;
+ }
+
+ section {
+ box-sizing: border-box;
+ margin: 1px;
+ width: 48px;
+ height: 48px;
+ border: 1px solid black;
+ border-radius: 4px;
+ }
+
+ .header {
+ @apply(--s-header);
+ }
+
+ .a {
+ background-color: var(--a, #eee);
+ }
+
+ .b {
+ background-color: var(--b, #eee);
+ }
+
+ .c {
+ background-color: var(--c, #eee);
+ }
+
+ .d {
+ background: -webkit-linear-gradient(top right, #777, white);
+ }
+ </style>
+ <div class="header">x-s</div>
+ <div class="container horizontal wrap layout">
+ <section class="center-center horizontal layout a">--a</section>
+ <section class="center-center horizontal layout b">--b</section>
+ <section class="center-center horizontal layout c">--c</section>
+ <section class="d"></section>
+ </div>
+`,
+
+ is: 'x-s'
+});
+Polymer({
+ _template: html`
+ <style include="simple-layout-styles">
+ :host {
+ background-color: goldenrod;
+ transform: var(--ss-transform);
+ -webkit-transform: var(--ss-transform);
+ @apply(--x-s);
+ }
+
+ .container {
+ height: 100px;
+ width: 50px;
+ }
+
+ section {
+ box-sizing: border-box;
+ width: 48px;
+ height: 48px;
+ margin: 1px;
+ border: 1px solid black;
+ border-radius: 4px;
+ }
+
+ .header {
+ @apply(--s-header);
+ }
+
+ .a {
+ background-color: var(--a, #eee);
+ }
+
+ .b {
+ background: -webkit-linear-gradient(top right, #777, white);
+ }
+
+ </style>
+ <div class="header">x-ss</div>
+ <div class="container horizontal wrap layout">
+ <section class="center-center horizontal layout a">--a</section>
+ <section class="center-center horizontal layout b"></section>
+ </div>
+`,
+
+ is: 'x-ss'
+});
diff --git a/third_party/polymer3/bower_components/polymer/test/smoke/style-props/src/scopes.js b/third_party/polymer3/bower_components/polymer/test/smoke/style-props/src/scopes.js
new file mode 100644
index 0000000..60d2a2c
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/smoke/style-props/src/scopes.js
@@ -0,0 +1,213 @@
+import './settings.js';
+import './elements.js';
+import { Polymer } from '../../../../lib/legacy/polymer-fn.js';
+import { html } from '../../../../lib/utils/html-tag.js';
+import { dom } from '../../../../lib/legacy/polymer.dom.js';
+
+Polymer({
+ _template: html`
+ <style>
+
+ :host {
+ border: 2px solid #ddd;
+ background-color: #e5e5e5;
+ border-radius: 8px;
+ margin: 16px;
+ padding: 16px;
+ position: relative;
+ min-height: 240px;
+ --c: var(--cc);
+ }
+
+ .header {
+ @apply(--header);
+ }
+
+ x-setting.c {
+ @apply(--left-setting);
+ }
+
+ x-setting.cc {
+ position: absolute;
+ left: 56px;
+ top: 14px;
+ }
+
+ </style>
+ <div class="header">x-view2</div>
+ <x-setting class="c">--c</x-setting>
+ <x-setting class="cc">--cc</x-setting>
+ <x-s></x-s>
+`,
+
+ is: 'x-view2'
+});
+
+Polymer({
+ _template: html`
+ <style include="simple-layout-styles">
+
+ :host {
+ border: 2px solid #ddd;
+ background-color: #f1f1f1;
+ border-radius: 8px;
+ margin: 16px;
+ padding: 16px;
+ position: relative;
+ --b: steelblue;
+ --c: purple;
+ }
+
+ .header {
+ @apply(--header);
+ }
+
+ x-setting.b {
+ @apply(--left-setting);
+ }
+
+ x-setting.c {
+ position: absolute;
+ left: 64px;
+ top: 14px;
+ }
+
+ </style>
+ <div class="header">x-view1</div>
+ <x-setting class="b">--b</x-setting>
+ <x-setting class="c">--c</x-setting>
+ <div class="horizontal layout center-center flex">
+ <x-s></x-s>
+ </div>
+ <x-view2 class="horizontal layout center-center flex"></x-view2>
+`,
+
+ is: 'x-view1'
+});
+
+Polymer({
+ _template: html`
+ <style include="simple-layout-styles">
+
+ :host {
+ font-family: sans-serif;
+ display: block;
+ border: 2px solid #ddd;
+ background-color: #fafafa;
+ border-radius: 8px;
+ margin: 16px;
+ padding: 16px;
+ position: relative;
+ --a: red;
+ --cc: yellow;
+
+ --header: {
+ position: absolute;
+ top: 2px;
+ left: 2px;
+ };
+ --left-setting: {
+ position: absolute;
+ left: 4px;
+ top: 14px;
+ };
+ --s-header: {
+ font-size: 10px;
+ font-weight: bold;
+ };
+ }
+
+ .header {
+ @apply(--header);
+ }
+
+ x-setting.a {
+ @apply(--left-setting);
+ }
+
+ x-setting.cc {
+ position: absolute;
+ left: 64px;
+ top: 14px;
+ }
+
+ .container {
+ margin: 16px;
+ padding: 16px;
+ }
+
+ .ss-c {
+ margin: 12px;
+ --ss-transform: rotate(30deg);
+ }
+
+ @media(min-width: 800px) {
+ .ss-c {
+ --ss-transform: rotate(-30deg);
+ }
+ }
+
+ </style>
+ <div class="header">x-app</div>
+ <x-setting class="a">--a</x-setting>
+ <x-setting class="cc">--cc</x-setting>
+
+ <div class="horizontal layout">
+ <div class="container flex horizontal center-center layout">
+ <x-s></x-s>
+ </div>
+
+ <x-view1 class="flex-2 horizontal center-center layout"></x-view1>
+
+ </div>
+
+ <div class="container horizontal layout wrap">
+ <template is="dom-repeat" items="{{items}}">
+ <div class="horizontal layout">
+ <span>{{item.index}}</span>
+ <x-ss class="ss-c"></x-ss>
+ </div>
+ </template>
+ </div>
+`,
+
+ is: 'x-app',
+
+ listeners: {
+ 'setting-change': 'settingChange'
+ },
+
+ properties: {
+ items: {
+ value: function() {
+ var items = [];
+ for (var i = 0; i < 250; i++) {
+ items.push({index: i});
+ }
+ return items;
+ }
+ }
+ },
+
+ clickHandler: function() {
+ d = document.createElement('div');
+ d.innerHTML = 'Added!';
+ var children = dom(this.root).childNodes;
+ var ref = children[Math.floor(children.length * Math.random(children.length))];
+ var ref = children[0];
+ },
+
+ settingChange: function(e) {
+ var target = e.composedPath()[0];
+ var host = target.getRootNode().host;
+ const obj = {};
+ obj[target.setting] = 'rgb(' +
+ Math.round(Math.random() * 255) + ',' +
+ Math.round(Math.random() * 255) + ',' +
+ Math.round(Math.random() * 255) + ')';
+ console.time('updateStyles');
+ host.updateStyles(obj);
+ document.body.offsetWidth;
+ console.timeEnd('updateStyles');
+ }
+});
diff --git a/third_party/polymer3/bower_components/polymer/test/smoke/style-props/src/settings.js b/third_party/polymer3/bower_components/polymer/test/smoke/style-props/src/settings.js
new file mode 100644
index 0000000..40bda96
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/smoke/style-props/src/settings.js
@@ -0,0 +1,80 @@
+import { Polymer } from '../../../../lib/legacy/polymer-fn.js';
+import { html } from '../../../../lib/utils/html-tag.js';
+const $_documentContainer = document.createElement('div');
+$_documentContainer.setAttribute('style', 'display: none;');
+
+$_documentContainer.innerHTML = `<dom-module id="simple-layout-styles">
+ <template>
+ <style>
+ .horizontal.layout {
+ display: flex;
+ }
+
+ .flex {
+ flex: 1;
+ }
+
+ .flex-2 {
+ flex: 2;
+ }
+
+ .center-center {
+ justify-content: center;
+ align-items: center;
+ }
+
+ .wrap {
+ flex-wrap: wrap;
+ }
+ </style>
+ </template>
+</dom-module>`;
+
+document.head.appendChild($_documentContainer);
+Polymer({
+ _template: html`
+ <style include="simple-layout-styles">
+ :host {
+ margin: 4px;
+ display: block;
+ -webkit-user-select: none;
+ user-select: none;
+ cursor: pointer;
+ transform: skewX(160deg);
+ -webkit-transform: skewX(160deg);
+ }
+
+ section {
+ box-sizing: border-box;
+ margin: 1px;
+ padding: 4px 16px;
+ border: 1px solid black;
+ border-radius: 4px;
+ }
+
+ .setting {
+ background-color: var(--setting-color, #eee);
+ }
+
+ </style>
+ <section class="center-center horizontal layout setting"><slot></slot></section>
+`,
+
+ is: 'x-setting',
+
+ listeners: {
+ click: 'clickHandler'
+ },
+
+ ready: function() {
+ this.setting = this.textContent;
+ const obj = {
+ '--setting-color': 'var(' + this.setting + ')'
+ }
+ this.updateStyles(obj);
+ },
+
+ clickHandler: function() {
+ this.fire('setting-change', this.setting);
+ }
+});
diff --git a/third_party/polymer3/bower_components/polymer/test/smoke/style-props/test.html b/third_party/polymer3/bower_components/polymer/test/smoke/style-props/test.html
new file mode 100644
index 0000000..0ce2ba2
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/smoke/style-props/test.html
@@ -0,0 +1,27 @@
+<!doctype html>
+<html>
+<head>
+ <title>style properties</title>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <script src="../../../node_modules/@webcomponents/webcomponentsjs/webcomponents-lite.js"></script>
+ <script type="module" src="../../../polymer-legacy.js"></script>
+ <script type="module" src="./src/scopes.js"></script>
+</head>
+<body>
+ <script type="module">
+import '../../../polymer-legacy.js';
+import './src/scopes.js';
+console.time('rendered');
+</script>
+ <x-app></x-app>
+ <script type="module">
+import '../../../polymer-legacy.js';
+import './src/scopes.js';
+import { flush } from '../../../lib/utils/flush.js';
+flush();
+document.body.offsetWidth;
+console.timeEnd('rendered');
+</script>
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/array-selector-elements.js b/third_party/polymer3/bower_components/polymer/test/unit/array-selector-elements.js
new file mode 100644
index 0000000..85c774f
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/array-selector-elements.js
@@ -0,0 +1,20 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import { Polymer } from '../../lib/legacy/polymer-fn.js';
+
+Polymer({
+ is: 'observe-el',
+ observers: [
+ 'singleChanged(singleSelected.*)',
+ 'multiChanged(multiSelected.*)'
+ ],
+ singleChanged: function() {},
+ multiChanged: function() {}
+});
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/array-selector.html b/third_party/polymer3/bower_components/polymer/test/unit/array-selector.html
new file mode 100644
index 0000000..21c2de0
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/array-selector.html
@@ -0,0 +1,594 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+ <script type="module" src="./array-selector-elements.js"></script>
+<body>
+
+<test-fixture id="singleConfigured">
+ <template>
+ <array-selector
+ items='[{"name": "one"},{"name": "two"},{"name": "three"}]'>
+ </array-selector>
+ </template>
+</test-fixture>
+
+<test-fixture id="multiConfigured">
+ <template>
+ <array-selector multi
+ items='[{"name": "one"},{"name": "two"},{"name": "three"}]'>
+ </array-selector>
+ </template>
+</test-fixture>
+
+<test-fixture id="bind">
+ <template>
+ <dom-bind>
+ <template>
+ <observe-el id="observer" single-selected="{{singleSelected}}" multi-selected="{{multiSelected}}"></observe-el>
+ <array-selector id="singleBound" items="{{items}}" selected="{{singleSelected}}"></array-selector>
+ <array-selector id="multiBound" items="{{items}}" selected="{{multiSelected}}" multi></array-selector>
+ </template>
+ </dom-bind>
+ </template>
+</test-fixture>
+
+<script type="module">
+import './array-selector-elements.js';
+suite('single selection', function() {
+
+ test('single selection', function() {
+ var el = fixture('singleConfigured');
+ // Nothing selected
+ assert.strictEqual(el.selected, null);
+ assert.strictEqual(el.selectedItem, null);
+ assert.isFalse(el.isSelected(el.items[0]));
+ assert.isFalse(el.isSelected(el.items[1]));
+ assert.isFalse(el.isSelected(el.items[2]));
+ // Select 0
+ el.select(el.items[0]);
+ assert.strictEqual(el.selected, el.items[0]);
+ assert.strictEqual(el.selectedItem, el.items[0]);
+ assert.isTrue(el.isSelected(el.items[0]));
+ assert.isFalse(el.isSelected(el.items[1]));
+ assert.isFalse(el.isSelected(el.items[2]));
+ // Re-select 0
+ el.select(el.items[0]);
+ assert.strictEqual(el.selected, el.items[0]);
+ assert.strictEqual(el.selectedItem, el.items[0]);
+ assert.isTrue(el.isSelected(el.items[0]));
+ assert.isFalse(el.isSelected(el.items[1]));
+ assert.isFalse(el.isSelected(el.items[2]));
+ // Select 2 (using index-based API)
+ el.selectIndex(2);
+ assert.strictEqual(el.selected, el.items[2]);
+ assert.strictEqual(el.selectedItem, el.items[2]);
+ assert.isFalse(el.isIndexSelected(0));
+ assert.isFalse(el.isIndexSelected(1));
+ assert.isTrue(el.isIndexSelected(2));
+ // Toggle 2
+ el.toggle = true;
+ el.select(el.items[2]);
+ assert.strictEqual(el.selected, null);
+ assert.strictEqual(el.selectedItem, null);
+ assert.isFalse(el.isSelected(el.items[0]));
+ assert.isFalse(el.isSelected(el.items[1]));
+ assert.isFalse(el.isSelected(el.items[2]));
+ // Toggle 2
+ el.toggle = true;
+ el.select(el.items[2]);
+ assert.strictEqual(el.selected, el.items[2]);
+ assert.strictEqual(el.selectedItem, el.items[2]);
+ assert.isFalse(el.isSelected(el.items[0]));
+ assert.isFalse(el.isSelected(el.items[1]));
+ assert.isTrue(el.isSelected(el.items[2]));
+ // clearSelection
+ el.clearSelection();
+ assert.equal(el.selectedItem, null);
+ });
+
+ test('bound defaults', function() {
+ let bind = fixture('bind');
+ assert.equal(bind.$.observer.singleSelected, null);
+ assert.sameMembers(bind.$.observer.multiSelected, []);
+ bind.items = [
+ {name: 'one'},
+ {name: 'two'},
+ {name: 'three'}
+ ];
+ assert.equal(bind.$.observer.singleSelected, null);
+ assert.sameMembers(bind.$.observer.multiSelected, []);
+ });
+
+ test('single selection notification', function() {
+ let bind = fixture('bind');
+ bind.items = [
+ {name: 'one'},
+ {name: 'two'},
+ {name: 'three'}
+ ];
+ bind.$.observer.singleChanged = sinon.spy();
+ bind.$.singleBound.select(bind.items[2]);
+ assert.isTrue(bind.$.observer.singleChanged.calledOnce);
+ assert.equal(bind.$.observer.singleChanged.firstCall.args[0].path, 'singleSelected');
+ assert.equal(bind.$.observer.singleChanged.firstCall.args[0].value, bind.items[2]);
+ assert.equal(bind.$.observer.singleSelected, bind.items[2]);
+ // clear selection
+ bind.$.observer.singleChanged = sinon.spy();
+ bind.$.singleBound.clearSelection();
+ assert.equal(bind.$.observer.singleSelected, null);
+ assert.isTrue(bind.$.observer.singleChanged.calledOnce);
+ assert.equal(bind.$.observer.singleChanged.firstCall.args[0].path, 'singleSelected');
+ assert.equal(bind.$.observer.singleChanged.firstCall.args[0].value, null);
+ });
+
+ test('single selection sub-property change', function() {
+ let bind = fixture('bind');
+ bind.items = [
+ {name: 'one'},
+ {name: 'two'},
+ {name: 'three'}
+ ];
+ bind.$.singleBound.select(bind.items[2]);
+ bind.$.observer.singleChanged = sinon.spy();
+ bind.set(['items', 2, 'name'], 'test');
+ assert.isTrue(bind.$.observer.singleChanged.calledOnce);
+ assert.equal(bind.$.observer.singleChanged.firstCall.args[0].path, 'singleSelected.name');
+ assert.equal(bind.$.observer.singleChanged.firstCall.args[0].value, 'test');
+ assert.equal(bind.$.observer.singleSelected.name, 'test');
+
+ bind.$.singleBound.select(bind.items[1]);
+ bind.$.observer.singleChanged = sinon.spy();
+ bind.set(['items', 1, 'name'], 'test2');
+ assert.isTrue(bind.$.observer.singleChanged.calledOnce);
+ assert.equal(bind.$.observer.singleChanged.firstCall.args[0].path, 'singleSelected.name');
+ assert.equal(bind.$.observer.singleChanged.firstCall.args[0].value, 'test2');
+ assert.equal(bind.$.observer.singleSelected.name, 'test2');
+ });
+
+ test('single selection sub-property change after unshift', function() {
+ let bind = fixture('bind');
+ bind.items = [
+ {name: 'one'},
+ {name: 'two'},
+ {name: 'three'}
+ ];
+ bind.$.singleBound.select(bind.items[2]);
+ bind.unshift('items', {name: 'zero'});
+ bind.$.observer.singleChanged = sinon.spy();
+ bind.set(['items', 3, 'name'], 'test2');
+ assert.isTrue(bind.$.observer.singleChanged.calledOnce);
+ assert.equal(bind.$.observer.singleChanged.firstCall.args[0].path, 'singleSelected.name');
+ assert.equal(bind.$.observer.singleChanged.firstCall.args[0].value, 'test2');
+ assert.equal(bind.$.observer.singleSelected.name, 'test2');
+ });
+
+ test('single selection removal via splice', function() {
+ let bind = fixture('bind');
+ bind.items = [
+ {name: 'one'},
+ {name: 'two'},
+ {name: 'three'}
+ ];
+ bind.$.singleBound.select(bind.items[1]);
+ bind.$.observer.singleChanged = sinon.spy();
+ bind.splice('items', 1, 2);
+ assert.isTrue(bind.$.observer.singleChanged.calledOnce);
+ assert.equal(bind.$.observer.singleChanged.firstCall.args[0].path, 'singleSelected');
+ assert.equal(bind.$.observer.singleChanged.firstCall.args[0].value, null);
+ assert.equal(bind.$.observer.singleSelected, null);
+ });
+
+ test('copy array, selection should remain', function() {
+ let bind = fixture('bind');
+ bind.items = [
+ {name: 'one'},
+ {name: 'two'},
+ {name: 'three'}
+ ];
+ bind.$.singleBound.select(bind.items[2]);
+ assert.equal(bind.$.singleBound.selected, bind.items[2]);
+ // set items to copy; all should still be selected
+ bind.items = bind.items.slice();
+ assert.equal(bind.$.singleBound.selected, bind.items[2]);
+ });
+
+ test('change array, selection should go away', function() {
+ let bind = fixture('bind');
+ bind.items = [
+ {name: 'one'},
+ {name: 'two'},
+ {name: 'three'}
+ ];
+ bind.$.singleBound.select(bind.items[2]);
+ assert.equal(bind.$.singleBound.selected, bind.items[2]);
+ // set items to new objects; all should be removed (selection based on identity)
+ bind.items = [
+ {name: 'one'},
+ {name: 'two'},
+ {name: 'three'}
+ ];
+ assert.equal(bind.$.singleBound.selected, null);
+ });
+
+ test('null array, selection should go away', function() {
+ let bind = fixture('bind');
+ bind.items = [
+ {name: 'one'},
+ {name: 'two'},
+ {name: 'three'}
+ ];
+ bind.$.singleBound.select(bind.items[2]);
+ assert.equal(bind.$.singleBound.selected, bind.items[2]);
+ // set items to new objects; all should be removed (selection based on identity)
+ bind.items = null;
+ assert.equal(bind.$.singleBound.selected, null);
+ });
+
+});
+
+suite('multi selection', function() {
+
+ test('multi selection', function() {
+ var el = fixture('multiConfigured');
+ // Nothing selected
+ assert.sameMembers(el.selected, []);
+ assert.isFalse(el.isSelected(el.items[0]));
+ assert.isFalse(el.isSelected(el.items[1]));
+ assert.isFalse(el.isSelected(el.items[2]));
+ // Select 0
+ el.select(el.items[0]);
+ assert.sameMembers(el.selected, [el.items[0]]);
+ assert.isTrue(el.isSelected(el.items[0]));
+ assert.isFalse(el.isSelected(el.items[1]));
+ assert.isFalse(el.isSelected(el.items[2]));
+ // Re-select 0
+ el.select(el.items[0]);
+ assert.sameMembers(el.selected, [el.items[0]]);
+ assert.isTrue(el.isSelected(el.items[0]));
+ assert.isFalse(el.isSelected(el.items[1]));
+ assert.isFalse(el.isSelected(el.items[2]));
+ // Select 2 (using index-based API)
+ el.selectIndex(2);
+ assert.sameMembers(el.selected, [el.items[0], el.items[2]]);
+ assert.isTrue(el.isIndexSelected(0));
+ assert.isFalse(el.isIndexSelected(1));
+ assert.isTrue(el.isIndexSelected(2));
+ // Toggle 2
+ el.toggle = true;
+ el.select(el.items[2]);
+ assert.sameMembers(el.selected, [el.items[0]]);
+ assert.isTrue(el.isSelected(el.items[0]));
+ assert.isFalse(el.isSelected(el.items[1]));
+ assert.isFalse(el.isSelected(el.items[2]));
+ // Toggle 2
+ el.toggle = true;
+ el.select(el.items[2]);
+ assert.sameMembers(el.selected, [el.items[0], el.items[2]]);
+ assert.isTrue(el.isSelected(el.items[0]));
+ assert.isFalse(el.isSelected(el.items[1]));
+ assert.isTrue(el.isSelected(el.items[2]));
+ // clear selection
+ el.clearSelection();
+ assert.sameMembers(el.selected, []);
+ });
+ test('multi selection notification', function() {
+ let bind = fixture('bind');
+ bind.items = [
+ {name: 'one'},
+ {name: 'two'},
+ {name: 'three'}
+ ];
+ // select first
+ bind.$.observer.multiChanged = sinon.spy();
+ bind.$.multiBound.select(bind.items[2]);
+ assert.isTrue(bind.$.observer.multiChanged.calledTwice);
+ assert.equal(bind.$.observer.multiChanged.firstCall.args[0].path, 'multiSelected.splices');
+ assert.equal(bind.$.observer.multiChanged.firstCall.args[0].value.indexSplices.length, 1);
+ assert.equal(bind.$.observer.multiChanged.firstCall.args[0].value.indexSplices[0].addedCount, 1);
+ assert.equal(bind.$.observer.multiChanged.firstCall.args[0].value.indexSplices[0].removed.length, 0);
+ assert.sameMembers(bind.$.observer.multiSelected, [bind.items[2]]);
+ assert.equal(bind.$.observer.multiChanged.secondCall.args[0].path, 'multiSelected.length');
+ assert.equal(bind.$.observer.multiChanged.secondCall.args[0].value, 1);
+ // select second
+ bind.$.observer.multiChanged = sinon.spy();
+ bind.$.multiBound.select(bind.items[0]);
+ assert.isTrue(bind.$.observer.multiChanged.calledTwice);
+ assert.equal(bind.$.observer.multiChanged.firstCall.args[0].path, 'multiSelected.splices');
+ assert.equal(bind.$.observer.multiChanged.firstCall.args[0].value.indexSplices.length, 1);
+ assert.equal(bind.$.observer.multiChanged.firstCall.args[0].value.indexSplices[0].addedCount, 1);
+ assert.equal(bind.$.observer.multiChanged.firstCall.args[0].value.indexSplices[0].removed.length, 0);
+ assert.sameMembers(bind.$.observer.multiSelected, [bind.items[2], bind.items[0]]);
+ assert.equal(bind.$.observer.multiChanged.secondCall.args[0].path, 'multiSelected.length');
+ assert.equal(bind.$.observer.multiChanged.secondCall.args[0].value, 2);
+ // clear selection
+ bind.$.observer.multiChanged = sinon.spy();
+ bind.$.multiBound.clearSelection();
+ assert.sameMembers(bind.$.observer.multiSelected, []);
+ assert.isTrue(bind.$.observer.multiChanged.calledOnce);
+ assert.equal(bind.$.observer.multiChanged.firstCall.args[0].path, 'multiSelected');
+ assert.sameMembers(bind.$.observer.multiChanged.firstCall.args[0].value, []);
+ });
+
+ test('multi selection sub-property change', function() {
+ let bind = fixture('bind');
+ bind.items = [
+ {name: 'one'},
+ {name: 'two'},
+ {name: 'three'}
+ ];
+ bind.$.multiBound.select(bind.items[2]);
+ bind.$.multiBound.select(bind.items[0]);
+ bind.$.observer.multiChanged = sinon.spy();
+ bind.set(['items', 2, 'name'], 'test');
+ assert.isTrue(bind.$.observer.multiChanged.calledOnce);
+ assert.equal(bind.$.observer.multiChanged.firstCall.args[0].path, 'multiSelected.0.name');
+ assert.equal(bind.$.observer.multiChanged.firstCall.args[0].value, 'test');
+ assert.equal(bind.$.observer.multiSelected[0].name, 'test');
+ bind.$.observer.multiChanged = sinon.spy();
+ bind.set(['items', 0, 'name'], 'test2');
+ assert.isTrue(bind.$.observer.multiChanged.calledOnce);
+ assert.equal(bind.$.observer.multiChanged.firstCall.args[0].path, 'multiSelected.1.name');
+ assert.equal(bind.$.observer.multiChanged.firstCall.args[0].value, 'test2');
+ assert.equal(bind.$.observer.multiSelected[1].name, 'test2');
+ });
+
+
+ test('multi selection sub-property change after unshift', function() {
+ let bind = fixture('bind');
+ bind.items = [
+ {name: 'one'},
+ {name: 'two'},
+ {name: 'three'}
+ ];
+ bind.$.multiBound.select(bind.items[2]);
+ bind.$.multiBound.select(bind.items[0]);
+ bind.unshift('items', {name: 'zero'});
+ bind.$.observer.multiChanged = sinon.spy();
+ bind.set(['items', 1, 'name'], 'test');
+ assert.isTrue(bind.$.observer.multiChanged.calledOnce);
+ assert.equal(bind.$.observer.multiChanged.firstCall.args[0].path, 'multiSelected.1.name');
+ assert.equal(bind.$.observer.multiChanged.firstCall.args[0].value, 'test');
+ assert.equal(bind.$.observer.multiSelected[1].name, 'test');
+ });
+
+ test('multi selection sub-property change after splice (removal)', function() {
+ let bind = fixture('bind');
+ bind.items = [
+ {name: 'one'},
+ {name: 'two'},
+ {name: 'three'}
+ ];
+ bind.$.multiBound.select(bind.items[0]);
+ bind.$.multiBound.select(bind.items[2]);
+
+ bind.$.observer.multiChanged = sinon.spy();
+ bind.splice('items', 0, 1);
+ // assert.equal(bind.$.observer.multiChanged.firstCall.args[0].path, 'multiSelected');
+ // assert.sameMembers(bind.$.observer.multiChanged.firstCall.args[0].value, [bind.items[1]]);
+ assert.equal(bind.$.observer.multiChanged.firstCall.args[0].path, 'multiSelected.splices');
+ assert.equal(bind.$.observer.multiChanged.firstCall.args[0].value.indexSplices.length, 1);
+ assert.equal(bind.$.observer.multiChanged.firstCall.args[0].value.indexSplices[0].index, 0);
+ assert.equal(bind.$.observer.multiChanged.firstCall.args[0].value.indexSplices[0].addedCount, 0);
+ assert.equal(bind.$.observer.multiChanged.firstCall.args[0].value.indexSplices[0].removed.length, 1);
+
+ bind.$.observer.multiChanged = sinon.spy();
+ bind.set(['items', 1, 'name'], 'test');
+ assert.isTrue(bind.$.observer.multiChanged.calledOnce);
+ assert.equal(bind.$.observer.multiChanged.firstCall.args[0].path, 'multiSelected.0.name');
+ assert.equal(bind.$.observer.multiChanged.firstCall.args[0].value, 'test');
+ assert.equal(bind.$.observer.multiSelected[0].name, 'test');
+ });
+
+ test('multi selection sub-property change after deselect', function() {
+ let bind = fixture('bind');
+ bind.items = [
+ {name: 'one'},
+ {name: 'two'},
+ {name: 'three'}
+ ];
+ bind.$.multiBound.select(bind.items[2]);
+ bind.$.multiBound.select(bind.items[0]);
+ bind.$.observer.multiChanged = sinon.spy();
+ bind.set(['items', 0, 'name'], 'test');
+ assert.isTrue(bind.$.observer.multiChanged.calledOnce);
+ assert.equal(bind.$.observer.multiChanged.firstCall.args[0].path, 'multiSelected.1.name');
+ assert.equal(bind.$.observer.multiChanged.firstCall.args[0].value, 'test');
+ assert.equal(bind.$.observer.multiSelected[1].name, 'test');
+
+ bind.$.multiBound.deselect(bind.items[2]);
+ bind.$.observer.multiChanged = sinon.spy();
+ bind.set(['items', 0, 'name'], 'test4');
+ assert.isTrue(bind.$.observer.multiChanged.calledOnce);
+ assert.equal(bind.$.observer.multiChanged.firstCall.args[0].path, 'multiSelected.0.name');
+ assert.equal(bind.$.observer.multiChanged.firstCall.args[0].value, 'test4');
+ assert.equal(bind.$.observer.multiSelected[0].name, 'test4');
+ });
+
+ test('copy array, selection should remain', function() {
+ let bind = fixture('bind');
+ bind.items = [
+ {name: 'one'},
+ {name: 'two'},
+ {name: 'three'}
+ ];
+ bind.$.multiBound.select(bind.items[2]);
+ bind.$.multiBound.select(bind.items[0]);
+ assert.sameMembers(bind.$.multiBound.selected, [bind.items[2], bind.items[0]]);
+ // set items to copy; all should still be selected
+ bind.items = bind.items.slice();
+ assert.sameMembers(bind.$.multiBound.selected, [bind.items[2], bind.items[0]]);
+ });
+
+ test('change array, selection should go away', function() {
+ let bind = fixture('bind');
+ bind.items = [
+ {name: 'one'},
+ {name: 'two'},
+ {name: 'three'}
+ ];
+ bind.$.multiBound.select(bind.items[2]);
+ bind.$.multiBound.select(bind.items[0]);
+ assert.sameMembers(bind.$.multiBound.selected, [bind.items[2], bind.items[0]]);
+ // set items to new objects; all should be removed (selection based on identity)
+ bind.items = [
+ {name: 'one'},
+ {name: 'two'},
+ {name: 'three'}
+ ];
+ assert.sameMembers(bind.$.multiBound.selected, []);
+ });
+
+ test('null array, selection should go away', function() {
+ let bind = fixture('bind');
+ bind.items = [
+ {name: 'one'},
+ {name: 'two'},
+ {name: 'three'}
+ ];
+ bind.$.multiBound.select(bind.items[2]);
+ bind.$.multiBound.select(bind.items[0]);
+ assert.sameMembers(bind.$.multiBound.selected, [bind.items[2], bind.items[0]]);
+ // set items to new objects; all should be removed (selection based on identity)
+ bind.items = null;
+ assert.sameMembers(bind.$.multiBound.selected, []);
+ });
+
+ test('reset item in array, selection should go away', function() {
+ let bind = fixture('bind');
+ bind.items = [
+ {name: 'one'},
+ {name: 'two'},
+ {name: 'three'}
+ ];
+ bind.$.multiBound.select(bind.items[2]);
+ bind.$.multiBound.select(bind.items[0]);
+ assert.sameMembers(bind.$.multiBound.selected, [bind.items[2], bind.items[0]]);
+ // set items to new objects; all should be removed (selection based on identity)
+ bind.set('items.0', {name: 'new'});
+ assert.sameMembers(bind.$.multiBound.selected, [bind.items[2]]);
+ });
+
+});
+
+suite('corner cases', function() {
+
+ test('switch from single to multi', function() {
+ var el = fixture('singleConfigured');
+ // Nothing selected
+ assert.strictEqual(el.selected, null);
+ assert.strictEqual(el.selectedItem, null);
+ assert.isFalse(el.isSelected(el.items[0]));
+ assert.isFalse(el.isSelected(el.items[1]));
+ assert.isFalse(el.isSelected(el.items[2]));
+ // Select 0
+ el.select(el.items[0]);
+ assert.strictEqual(el.selected, el.items[0]);
+ assert.strictEqual(el.selectedItem, el.items[0]);
+ assert.isTrue(el.isSelected(el.items[0]));
+ assert.isFalse(el.isSelected(el.items[1]));
+ assert.isFalse(el.isSelected(el.items[2]));
+ // switch to multi
+ el.multi = true;
+ assert.sameMembers(el.selected, []);
+ assert.equal(el.selectedItem, null);
+ });
+
+ test('switch from multi to single', function() {
+ var el = fixture('multiConfigured');
+ // Nothing selected
+ assert.sameMembers(el.selected, []);
+ assert.isFalse(el.isSelected(el.items[0]));
+ assert.isFalse(el.isSelected(el.items[1]));
+ assert.isFalse(el.isSelected(el.items[2]));
+ // Select 0
+ el.select(el.items[0]);
+ assert.sameMembers(el.selected, [el.items[0]]);
+ assert.isTrue(el.isSelected(el.items[0]));
+ assert.isFalse(el.isSelected(el.items[1]));
+ assert.isFalse(el.isSelected(el.items[2]));
+ // switch to single
+ el.multi = false;
+ assert.equal(el.selected, null);
+ assert.equal(el.selectedItem, null);
+ });
+
+ test('reset mutated array with gaps resulting in multiple splices', function() {
+ var bind = fixture('bind');
+ let i = bind.items = [
+ {name: '0'}, {name: '1'}, {name: '2'}, {name: '3'},
+ {name: '4'}, {name: '5'}, {name: '6'}, {name: '7'}
+ ];
+ bind.$.multiBound.selectIndex(2);
+ bind.$.multiBound.selectIndex(6);
+ bind.$.multiBound.selectIndex(1);
+ bind.$.multiBound.selectIndex(5);
+ bind.$.multiBound.selectIndex(0);
+ bind.$.multiBound.selectIndex(4);
+ assert.sameMembers(bind.$.multiBound.selected, [i[2], i[6], i[1], i[5], i[0], i[4]]);
+ bind.$.observer.multiChanged = sinon.spy();
+ bind.set('items.4.name', 'changed1');
+ assert.isTrue(bind.$.observer.multiChanged.calledOnce);
+ assert.equal(bind.$.observer.multiChanged.firstCall.args[0].path, 'multiSelected.5.name');
+ assert.equal(bind.$.observer.multiChanged.firstCall.args[0].value, 'changed1');
+
+ bind.items = [
+ i[0], i[3], i[4], i[7]
+ ];
+ assert.sameMembers(bind.$.multiBound.selected, [i[0], i[4]]);
+ bind.$.observer.multiChanged = sinon.spy();
+ bind.set('items.2.name', 'changed2');
+ assert.isTrue(bind.$.observer.multiChanged.calledOnce);
+ assert.equal(bind.$.observer.multiChanged.firstCall.args[0].path, 'multiSelected.1.name');
+ assert.equal(bind.$.observer.multiChanged.firstCall.args[0].value, 'changed2');
+ });
+
+ // Current algorithm does not handle reordering array while maintaining selection state
+ test('reset mutated array reordered resulting in multiple splices', function() {
+ var bind = fixture('bind');
+ let i = bind.items = [
+ {name: '0'}, {name: '1'}, {name: '2'}, {name: '3'},
+ {name: '4'}, {name: '5'}, {name: '6'}, {name: '7'}
+ ];
+ bind.$.multiBound.selectIndex(2);
+ bind.$.multiBound.selectIndex(6);
+ bind.$.multiBound.selectIndex(1);
+ bind.$.multiBound.selectIndex(5);
+ bind.$.multiBound.selectIndex(0);
+ bind.$.multiBound.selectIndex(4);
+ assert.sameMembers(bind.$.multiBound.selected, [i[2], i[6], i[1], i[5], i[0], i[4]]);
+ bind.$.observer.multiChanged = sinon.spy();
+ bind.set('items.4.name', 'changed1');
+ assert.isTrue(bind.$.observer.multiChanged.calledOnce);
+ assert.equal(bind.$.observer.multiChanged.firstCall.args[0].path, 'multiSelected.5.name');
+ assert.equal(bind.$.observer.multiChanged.firstCall.args[0].value, 'changed1');
+
+ bind.items = [
+ i[4], i[5], i[6], i[7], i[0], i[1], i[2], i[3]
+ ];
+ assert.sameMembers(bind.$.multiBound.selected, [i[2], i[6], i[1], i[5], i[0], i[4]]);
+ bind.$.observer.multiChanged = sinon.spy();
+ bind.set('items.0.name', 'changed2');
+ assert.isTrue(bind.$.observer.multiChanged.calledOnce);
+ assert.equal(bind.$.observer.multiChanged.firstCall.args[0].path, 'multiSelected.5.name');
+ assert.equal(bind.$.observer.multiChanged.firstCall.args[0].value, 'changed2');
+ });
+
+});
+</script>
+
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/async.html b/third_party/polymer3/bower_components/polymer/test/unit/async.html
new file mode 100644
index 0000000..0cfec01
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/async.html
@@ -0,0 +1,479 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../lib/utils/async.js"></script>
+</head>
+<body>
+
+<script type="module">
+import { microTask, timeOut, animationFrame, idlePeriod } from '../../lib/utils/async.js';
+var capturedErrors = [];
+var captureEnabled = false;
+window.addEventListener('error', function(e) {
+ if (captureEnabled) {
+ capturedErrors.push(e);
+ e.stopImmediatePropagation();
+ e.preventDefault();
+ return true;
+ }
+});
+
+suite('Queueing micro tasks', function() {
+
+ test('The queued function runs.', function(done) {
+ var callCount = 0;
+ var callback = function() {
+ callCount++;
+ };
+
+ microTask.run(callback);
+ setTimeout(function() {
+ assert.equal(callCount, 1);
+ done();
+ });
+ });
+
+ test('Functions queued multiple times are run multiple times.',
+ function(done) {
+ var callCount = 0;
+ var callback = function() {
+ callCount++;
+ };
+ microTask.run(callback);
+ microTask.run(callback);
+ microTask.run(callback);
+ setTimeout(function() {
+ assert.equal(callCount, 3);
+ done();
+ });
+ });
+
+ test('All queued functions are run.', function(done) {
+ var callCount1 = 0;
+ var callCount2 = 0;
+ var callCount3 = 0;
+ var callback1 = function() {
+ callCount1++;
+ };
+ var callback2 = function() {
+ callCount2++;
+ };
+ var callback3 = function() {
+ callCount3++;
+ };
+ microTask.run(callback1);
+ microTask.run(callback2);
+ microTask.run(callback3);
+ setTimeout(function() {
+ assert.equal(callCount1, 1);
+ assert.equal(callCount2, 1);
+ assert.equal(callCount3, 1);
+ done();
+ });
+ });
+
+ test('Errors are thrown but the queue is continued', function(done) {
+ captureEnabled = true;
+ var callCount1 = 0;
+ var callCount2 = 0;
+ var callCount3 = 0;
+ var callCount4 = 0;
+ var callCount5 = 0;
+ var callback1 = function() {
+ callCount1++;
+ };
+ var callback2 = function() {
+ callCount2++;
+ throw new Error('intentional error 1');
+ };
+ var callback3 = function() {
+ callCount3++;
+ microTask.run(callback5);
+ throw new Error('intentional error 2');
+ };
+ var callback4 = function() {
+ callCount4++;
+ };
+ var callback5 = function() {
+ callCount5++;
+ };
+ microTask.run(callback1);
+ microTask.run(callback2);
+ microTask.run(callback3);
+ microTask.run(callback4);
+ // All callbacks have been called by the next task.
+ setTimeout(function() {
+ captureEnabled = false;
+ assert.equal(callCount1, 1);
+ assert.equal(callCount2, 1);
+ assert.equal(callCount3, 1);
+ assert.equal(callCount4, 1);
+ assert.equal(callCount5, 1);
+ assert.equal(capturedErrors.length, 2);
+ capturedErrors.length = 0;
+ done();
+ }, 100);
+ });
+});
+
+suite('Cancelling micro tasks', function() {
+
+ test('Queued functions are cancelable.', function(done) {
+ var callCount = 0;
+ var callback = function() {
+ callCount++;
+ };
+ var asyncRef = microTask.run(callback);
+ microTask.cancel(asyncRef);
+ setTimeout(function() {
+ assert.equal(callCount, 0);
+ done();
+ });
+ });
+
+ test('Multiple instances of the same queued function are cancelable.', function(done) {
+ var callCount = 0;
+ var callback = function() {
+ callCount++;
+ };
+ var asyncRefs = [];
+ asyncRefs.push(microTask.run(callback));
+ asyncRefs.push(microTask.run(callback));
+ asyncRefs.push(microTask.run(callback));
+ microTask.cancel(asyncRefs.pop());
+ microTask.cancel(asyncRefs.pop());
+ microTask.cancel(asyncRefs.pop());
+ setTimeout(function() {
+ assert.equal(callCount, 0);
+ done();
+ });
+ });
+
+ test('Multiple queued functions are individually cancelable.', function(done) {
+ var callCount1 = 0;
+ var callCount2 = 0;
+ var callCount3 = 0;
+ var callback1 = function() {
+ callCount1++;
+ };
+ var callback2 = function() {
+ callCount2++;
+ };
+ var callback3 = function() {
+ callCount3++;
+ };
+ var asyncRef1 = microTask.run(callback1);
+ microTask.run(callback2);
+ var asyncRef3 = microTask.run(callback3);
+ microTask.cancel(asyncRef1);
+ microTask.cancel(asyncRef3);
+ setTimeout(function() {
+ assert.equal(callCount1, 0);
+ assert.equal(callCount2, 1);
+ assert.equal(callCount3, 0);
+ done();
+ });
+ });
+
+});
+
+suite('Queueing timeouts with a wait time', function() {
+
+ test('The queued function runs.', function(done) {
+ var callCount = 0;
+ var callback = function() {
+ callCount++;
+ };
+ timeOut.run(callback, 50);
+ timeOut.after(50).run(callback);
+ setTimeout(function() {
+ assert.equal(callCount, 2);
+ done();
+ }, 100);
+ });
+
+ test('Functions queued multiple times are run multiple times.', function(done) {
+ var callCount = 0;
+ var callback = function() {
+ callCount++;
+ };
+ timeOut.run(callback, 50);
+ timeOut.after(50).run(callback);
+ timeOut.run(callback, 50);
+ timeOut.after(50).run(callback);
+ timeOut.run(callback, 200);
+ timeOut.after(200).run(callback);
+ setTimeout(function() {
+ assert.equal(callCount, 4);
+ done();
+ }, 100); // Only wait until the first two callbacks are called.
+ });
+
+ test('All queued functions are run.', function(done) {
+ var callCount1 = 0;
+ var callCount2 = 0;
+ var callCount3 = 0;
+ var callback1 = function() {
+ callCount1++;
+ };
+ var callback2 = function() {
+ callCount2++;
+ };
+ var callback3 = function() {
+ callCount3++;
+ };
+ timeOut.run(callback1, 50);
+ timeOut.run(callback2, 50);
+ timeOut.run(callback3, 200);
+ setTimeout(function() {
+ assert.equal(callCount1, 1);
+ assert.equal(callCount2, 1);
+ assert.equal(callCount3, 0);
+ done();
+ }, 100); // Only wait until the first two callbacks are called.
+ });
+
+});
+
+suite('Cancelling timers queued with a wait time', function() {
+
+ test('Queued functions are cancelable.', function(done) {
+ var callCount = 0;
+ var callback = function() {
+ callCount++;
+ };
+ var asyncRef = timeOut.run(callback, 50);
+ timeOut.cancel(asyncRef);
+ setTimeout(function() {
+ assert.equal(callCount, 0);
+ done();
+ }, 100);
+ });
+
+ test('Multiple instances of the same queued function are cancelable.', function(done) {
+ var callCount = 0;
+ var callback = function() {
+ callCount++;
+ };
+ var queue = [];
+ queue.push(timeOut.run(callback, 50));
+ queue.push(timeOut.run(callback, 50));
+ queue.push(timeOut.after(50).run(callback));
+ queue.push(timeOut.run(callback, 200));
+ while (queue.length > 0) {
+ timeOut.cancel(queue.pop());
+ }
+ setTimeout(function() {
+ assert.equal(callCount, 0);
+ done();
+ }, 250);
+ });
+
+ test('Multiple queued functions are individually cancelable.', function(done) {
+ var callCount1 = 0;
+ var callCount2 = 0;
+ var callCount3 = 0;
+ var callback1 = function() {
+ callCount1++;
+ };
+ var callback2 = function() {
+ callCount2++;
+ };
+ var callback3 = function() {
+ callCount3++;
+ };
+ var asyncRef1 = timeOut.run(callback1, 50);
+ microTask.run(callback2, 50);
+ var asyncRef3 = timeOut.run(callback3, 200);
+ timeOut.cancel(asyncRef1);
+ timeOut.cancel(asyncRef3);
+ setTimeout(function() {
+ assert.equal(callCount1, 0);
+ assert.equal(callCount2, 1);
+ assert.equal(callCount3, 0);
+ done();
+ }, 250);
+ });
+
+});
+
+suite('Queueing functions to run before the next paint', function() {
+
+ test('The queued function runs.', function(done) {
+ var callback = sinon.spy();
+ animationFrame.run(callback);
+ requestAnimationFrame(function() {
+ assert.isTrue(callback.calledOnce);
+ done();
+ });
+ });
+
+ test('Functions queued multiple times are run multiple times.', function(done) {
+ var callback = sinon.spy();
+ animationFrame.run(callback);
+ animationFrame.run(callback);
+ requestAnimationFrame(function() {
+ assert.isTrue(callback.calledTwice);
+ done();
+ });
+ });
+
+ test('All queued functions are run.', function(done) {
+ var callback1 = sinon.spy();
+ var callback2 = sinon.spy();
+ animationFrame.run(callback1);
+ animationFrame.run(callback2);
+ requestAnimationFrame(function() {
+ assert.isTrue(callback1.calledOnce);
+ assert.isTrue(callback2.calledOnce);
+ done();
+ });
+ });
+
+});
+
+suite('Cancelling functions queued to run before the next paint', function() {
+
+ test('Queued functions are cancelable.', function(done) {
+ var callback = sinon.spy();
+ var asyncRef = animationFrame.run(callback);
+ animationFrame.cancel(asyncRef);
+ requestAnimationFrame(function() {
+ assert.isFalse(callback.called);
+ done();
+ });
+ });
+
+ test('Multiple instances of the same queued function are cancelable.', function(done) {
+ var callback = sinon.spy();
+ var asyncRefs = [];
+ asyncRefs.push(animationFrame.run(callback));
+ asyncRefs.push(animationFrame.run(callback));
+ asyncRefs.push(animationFrame.run(callback));
+ animationFrame.cancel(asyncRefs.pop());
+ animationFrame.cancel(asyncRefs.pop());
+ animationFrame.cancel(asyncRefs.pop());
+ requestAnimationFrame(function() {
+ assert.isFalse(callback.called);
+ done();
+ });
+ });
+
+ test('Multiple queued functions are individually cancelable.', function(done) {
+ var callback1 = sinon.spy();
+ var callback2 = sinon.spy();
+ var callback3 = sinon.spy();
+ var asyncRef1 = animationFrame.run(callback1, 50);
+ animationFrame.run(callback2, 50);
+ var asyncRef3 = animationFrame.run(callback3, 200);
+ animationFrame.cancel(asyncRef1);
+ animationFrame.cancel(asyncRef3);
+ requestAnimationFrame(function() {
+ assert.isFalse(callback1.called);
+ assert.isTrue(callback2.calledOnce);
+ assert.isFalse(callback3.called);
+ done();
+ });
+ });
+
+});
+
+suite('Queueing functions to run during idle period', function() {
+ var whenIdle = window.requestIdleCallback ? window.requestIdleCallback : function(fn) { setTimeout(fn, 16); };
+
+ test('The queued function runs.', function(done) {
+ var callback = sinon.spy();
+ idlePeriod.run(callback);
+ whenIdle(function() {
+ assert.isTrue(callback.calledOnce);
+ done();
+ });
+ });
+
+ test('Functions queued multiple times are run multiple times.', function(done) {
+ var callback = sinon.spy();
+ idlePeriod.run(callback);
+ idlePeriod.run(callback);
+ whenIdle(function() {
+ assert.isTrue(callback.calledTwice);
+ done();
+ });
+ });
+
+ test('All queued functions are run.', function(done) {
+ var callback1 = sinon.spy();
+ var callback2 = sinon.spy();
+ idlePeriod.run(callback1);
+ idlePeriod.run(callback2);
+ whenIdle(function() {
+ assert.isTrue(callback1.calledOnce);
+ assert.isTrue(callback2.calledOnce);
+ done();
+ });
+ });
+
+});
+
+
+suite('Cancelling functions queued to run during idle period', function() {
+ var whenIdle = window.requestIdleCallback ? window.requestIdleCallback : function(fn) { setTimeout(fn, 16); };
+
+ test('Queued functions are cancelable.', function(done) {
+ var callback = sinon.spy();
+ var asyncRef = idlePeriod.run(callback);
+ idlePeriod.cancel(asyncRef);
+ whenIdle(function() {
+ assert.isFalse(callback.called);
+ done();
+ });
+ });
+
+ test('Multiple instances of the same queued function are cancelable.', function(done) {
+ var callback = sinon.spy();
+ var asyncRefs = [];
+ asyncRefs.push(idlePeriod.run(callback));
+ asyncRefs.push(idlePeriod.run(callback));
+ asyncRefs.push(idlePeriod.run(callback));
+ idlePeriod.cancel(asyncRefs.pop());
+ idlePeriod.cancel(asyncRefs.pop());
+ idlePeriod.cancel(asyncRefs.pop());
+ whenIdle(function() {
+ assert.isFalse(callback.called);
+ done();
+ });
+ });
+
+ test('Multiple queued functions are individually cancelable.', function(done) {
+ var callback1 = sinon.spy();
+ var callback2 = sinon.spy();
+ var callback3 = sinon.spy();
+ var asyncRef1 = idlePeriod.run(callback1, 50);
+ idlePeriod.run(callback2, 50);
+ var asyncRef3 = idlePeriod.run(callback3, 200);
+ idlePeriod.cancel(asyncRef1);
+ idlePeriod.cancel(asyncRef3);
+ whenIdle(function() {
+ assert.isFalse(callback1.called);
+ assert.isTrue(callback2.calledOnce);
+ assert.isFalse(callback3.called);
+ done();
+ });
+ });
+
+});
+</script>
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/attributes-elements.js b/third_party/polymer3/bower_components/polymer/test/unit/attributes-elements.js
new file mode 100644
index 0000000..13070ad
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/attributes-elements.js
@@ -0,0 +1,204 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import { Polymer } from '../../lib/legacy/polymer-fn.js';
+
+import { html } from '../../lib/utils/html-tag.js';
+let PropertyTypeBehavior = {
+ properties: {
+ behaviorShorthandNumber: Number,
+ behaviorShorthandBool: Boolean,
+ behaviorNumber: {
+ value: 11,
+ type: Number
+ },
+ behaviorBool: {
+ value: false,
+ type: Boolean
+ }
+ }
+};
+
+Polymer({
+ is: 'x-basic',
+ hostAttributes: {
+ attr1: 'this is attr 1',
+ attr2: 42,
+ attr3: 'host',
+ 'aria-role': 'button',
+ title: 'awesome',
+ 'attr-object': {foo: 'bar', nested: {'meaning': 42}, arr: [0, 'foo', true]},
+ 'attr-stupid': false,
+ class: 'foo bar baz'
+ },
+ behaviors: [ PropertyTypeBehavior ],
+ properties: {
+ object: {
+ type: Object,
+ value: function() { return {}; }
+ },
+ array: {
+ type: Array,
+ value: function() { return []; }
+ },
+ number: {
+ type: Number,
+ value: 0
+ },
+ string: {
+ type: String,
+ value: 'none'
+ },
+ bool: {
+ type: Boolean,
+ value: true
+ },
+ negBool: {
+ type: Boolean,
+ value: false
+ },
+ date: {
+ type: Date,
+ value: function() { return new Date(0); }
+ },
+ dashCase: {
+ type: String,
+ value: 'none'
+ },
+ UPCASE: {
+ type: String,
+ value: 'none'
+ },
+ noType: {
+ value: 'none'
+ },
+ readOnly: {
+ type: String,
+ value: 'default',
+ readOnly: true
+ },
+ prop: {
+ value: 'prop',
+ observer: 'propChanged'
+ },
+ attr1: {
+ observer: 'attr1Changed'
+ },
+ shorthandNumber: Number,
+ shorthandBool: Boolean,
+ foreignTypeObjectProp: {
+ type: Object,
+ value: 'none'
+ }
+ },
+
+ propChangedCount: 0,
+ attr1ChangedCount: 0,
+
+ propChanged: function() {
+ this.propChangedCount++;
+ },
+
+ attr1Changed: function() {
+ this.attr1ChangedCount++;
+ }
+
+});
+Polymer({
+ is: 'x-reflect',
+ behaviors: [ PropertyTypeBehavior ],
+ properties: {
+ object: {
+ type: Object,
+ reflectToAttribute: true,
+ value: function() { return {}; }
+ },
+ array: {
+ type: Array,
+ reflectToAttribute: true,
+ value: function() { return []; }
+ },
+ number: {
+ type: Number,
+ reflectToAttribute: true,
+ value: 0
+ },
+ string: {
+ type: String,
+ reflectToAttribute: true,
+ value: 'none'
+ },
+ bool: {
+ type: Boolean,
+ reflectToAttribute: true,
+ value: true
+ },
+ negBool: {
+ type: Boolean,
+ reflectToAttribute: true,
+ value: false
+ },
+ date: {
+ type: Date,
+ reflectToAttribute: true,
+ value: function() { return new Date(0); }
+ },
+ dashCase: {
+ type: String,
+ reflectToAttribute: true,
+ value: 'none'
+ },
+ UPCASE: {
+ type: String,
+ reflectToAttribute: true,
+ value: 'none'
+ },
+ noType: {
+ value: 'none'
+ },
+ readOnly: {
+ type: String,
+ value: 'default',
+ readOnly: true
+ },
+ shorthandNumber: Number,
+ shorthandBool: Boolean,
+ foreignTypeObjectProp: {
+ type: Object,
+ reflectToAttribute: true,
+ value: 'none'
+ }
+ },
+ _warn: function() {
+ var search = Array.prototype.join.call(arguments, '');
+ if (search.indexOf('UPCASE') > -1) {
+ this.__warnedAboutUPCASE = true;
+ }
+ }
+});
+Polymer({
+ _template: html`
+ <x-basic id="basic" prop="{{attr1}}" attr1\$="{{attr1}}" class="should-not-override"></x-basic>
+`,
+
+ is: 'x-compose',
+
+ hostAttributes: {
+ attr1: 'compose'
+ },
+
+ properties: {
+ attr1: String,
+ prop2: String
+ },
+
+ ready: function() {
+ this.setAttribute('prop2', 'hi');
+ }
+});
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/attributes.html b/third_party/polymer3/bower_components/polymer/test/unit/attributes.html
new file mode 100644
index 0000000..4630509
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/attributes.html
@@ -0,0 +1,358 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+ <script type="module" src="./attributes-elements.js"></script>
+<body>
+
+ <test-fixture id="basic">
+ <template>
+ <x-basic attr3="instance"></x-basic>
+ </template>
+ </test-fixture>
+
+ <test-fixture id="compose">
+ <template>
+ <x-compose></x-compose>
+ </template>
+ </test-fixture>
+
+ <test-fixture id="basic-with-attributes">
+ <template>
+ <x-basic
+ object='{"foo": "bar", "nested": {"meaning": 42}, "arr": [0, "foo", true]}'
+ array='[0, "foo", true, {"foo": "bar"}]'
+ number="42"
+ string="The quick brown fox"
+ bool
+ date="Wed Mar 04 2015 10:46:05 GMT-0800 (PST)"
+ -u-p-c-a-s-e="The quick brown fox"
+ dash-case="The quick brown fox"
+ no-type="Should be String"
+ read-only="Should not change"
+ class="Should not deserialize"
+ nard="Should not deserialize"
+ behavior-bool
+ behavior-number="77"
+ shorthand-bool
+ shorthand-number="88"
+ behavior-shorthand-bool
+ behavior-shorthand-number="99"
+ foreign-type-object-prop="The quick brown fox">
+ </x-basic>
+ </template>
+ </test-fixture>
+
+ <test-fixture id="reflect-to-attribute">
+ <template>
+ <x-reflect></x-reflect>
+ </template>
+ </test-fixture>
+
+ <test-fixture id="reflect-to-attribute-and-attributes">
+ <template>
+ <x-reflect
+ object='{"foo": "bar", "nested": {"meaning": 42}, "arr": [0, "foo", true]}'
+ array='[0, "foo", true, {"foo": "bar"}]'
+ number="42"
+ string="The quick brown fox"
+ bool
+ date="Wed Mar 04 2015 10:46:05 GMT-0800 (PST)"
+ dash-case="The quick brown fox"
+ -u-p-c-a-s-e="The quick brown fox"
+ no-type="Should be String"
+ read-only="Should not change"
+ class="Should not deserialize"
+ nard="Should not deserialize"
+ behavior-bool
+ behavior-number="77"
+ shorthand-bool
+ shorthand-number="88"
+ behavior-shorthand-bool
+ behavior-shorthand-number="99"
+ foreign-type-object-prop="The quick brown fox">
+ </x-reflect>
+ </template>
+ </test-fixture>
+
+ <script type="module">
+import './attributes-elements.js';
+suite('create-time deserialization', function() {
+ function testAttributesMatchDefaults(element) {
+ assert.deepEqual(element.object, {});
+ assert.deepEqual(element.array, []);
+ assert.strictEqual(element.number, 0);
+ assert.strictEqual(element.string, 'none');
+ assert.strictEqual(element.bool, true);
+ assert.strictEqual(element.negBool, false);
+ assert.strictEqual(element.date.getTime(), 0);
+ assert.strictEqual(element.dashCase, 'none');
+ assert.strictEqual(element.UPCASE, 'none');
+ assert.strictEqual(element.noType, 'none');
+ assert.strictEqual(element.readOnly, 'default');
+ assert.strictEqual(element.behaviorNumber, 11);
+ assert.strictEqual(element.behaviorBool, false);
+ assert.strictEqual(element.shorthandNumber, undefined);
+ assert.strictEqual(element.shorthandBool, undefined);
+ assert.strictEqual(element.behaviorShorthandNumber, undefined);
+ assert.strictEqual(element.behaviorShorthandBool, undefined);
+ assert.strictEqual(element.foreignTypeObjectProp, 'none');
+ }
+
+ function testAttributesMatchCustomConfiguration(element) {
+ var configuredObject = {foo: 'bar', nested: {'meaning': 42}, arr: [0, 'foo', true]};
+ var configuredArray = [0, 'foo', true, {foo: 'bar'}];
+ var configuredString = "The quick brown fox";
+ var configuredTime = 1425494765000;
+
+ assert.deepEqual(element.object, configuredObject);
+ assert.deepEqual(element.array, configuredArray);
+ assert.strictEqual(element.number, 42);
+ assert.strictEqual(element.string, 'The quick brown fox');
+ assert.strictEqual(element.bool, true);
+ assert.strictEqual(element.negBool, false);
+ assert.strictEqual(element.date.getTime(), configuredTime);
+ assert.strictEqual(element.dashCase, configuredString);
+ assert.strictEqual(element.UPCASE, configuredString);
+ assert.strictEqual(element.noType, 'Should be String');
+ assert.strictEqual(element.readOnly, 'default');
+ assert.strictEqual(element.class, undefined);
+ assert.strictEqual(element.nard, undefined);
+ assert.strictEqual(element.behaviorNumber, 77);
+ assert.strictEqual(element.behaviorBool, true);
+ assert.strictEqual(element.shorthandNumber, 88);
+ assert.strictEqual(element.shorthandBool, true);
+ assert.strictEqual(element.behaviorShorthandNumber, 99);
+ assert.strictEqual(element.behaviorShorthandBool, true);
+ assert.strictEqual(element.foreignTypeObjectProp, configuredString);
+ }
+
+ test('basic default values', function() {
+ var element = fixture('basic');
+ testAttributesMatchDefaults(element);
+ });
+
+ test('basic deserialize attributes', function() {
+ var element = fixture('basic-with-attributes');
+ testAttributesMatchCustomConfiguration(element);
+ });
+
+ test('reflected default values', function() {
+ var element = fixture('reflect-to-attribute');
+ testAttributesMatchDefaults(element);
+ });
+
+ test('reflected deserialize attributes', function() {
+ var element = fixture('reflect-to-attribute-and-attributes');
+ testAttributesMatchCustomConfiguration(element);
+ });
+
+ test('reflected warned about reflection for UPCASE', function() {
+ var element = fixture('reflect-to-attribute');
+ assert.isTrue(element.__warnedAboutUPCASE = true);
+ });
+});
+
+suite('imperative attribute change (no-reflect)', function() {
+ var element, configuredObject, configuredArray;
+
+ setup(function() {
+ element = fixture('basic');
+ configuredObject = {foo: 'bar', nested: {'meaning': 42}, arr: [0, 'foo', true]};
+ configuredArray = [0, 'foo', true, {foo: 'bar'}];
+ });
+
+ test('change object attribute', function() {
+ element.setAttribute('object', '{"foo": "bar", "nested": {"meaning": 42}, "arr": [0, "foo", true]}');
+ assert.deepEqual(element.object, configuredObject);
+ });
+
+ test('change object attribute to foreign type', function() {
+ element.setAttribute('object', 'The quick brown fox');
+ assert.strictEqual(element.object, 'The quick brown fox');
+ });
+
+ test('change array attribute', function() {
+ element.setAttribute('array', '[0, "foo", true, {"foo": "bar"}]');
+ assert.deepEqual(element.array, configuredArray);
+ });
+
+ test('change number attribute', function() {
+ element.setAttribute('number', 42);
+ assert.strictEqual(element.number, 42);
+ });
+
+ test('change string attribute', function() {
+ element.setAttribute('string', 'howdy');
+ assert.strictEqual(element.string, 'howdy');
+ });
+
+ test('change boolean attribute true', function() {
+ element.setAttribute('bool', '');
+ assert.strictEqual(element.bool, true);
+ });
+
+ test('change boolean attribute truthy', function() {
+ element.setAttribute('bool', 'sure!');
+ assert.strictEqual(element.bool, true);
+ });
+
+ test('change boolean attribute false', function() {
+ element.setAttribute('bool', '');
+ assert.strictEqual(element.bool, true);
+ element.removeAttribute('bool');
+ assert.strictEqual(element.bool, false);
+ });
+
+ test('change dashCase attribute', function() {
+ element.setAttribute('dash-case', 'Changed');
+ assert.strictEqual(element.dashCase, 'Changed');
+ });
+
+ test('value that cannot deserialize from JSON warns', function() {
+ sinon.spy(console, 'warn');
+ var badAttr = '[foo, bar]';
+ element.setAttribute('array', badAttr);
+ assert.isTrue(console.warn.calledOnce);
+ assert.include(console.warn.firstCall.args[0], badAttr);
+ console.warn.restore();
+ });
+
+});
+
+suite('imperative attribute change (reflect)', function() {
+ var element, configuredObject, configuredArray;
+
+ setup(function() {
+ element = fixture('reflect-to-attribute');
+ configuredObject = {foo: 'bar', nested: {'meaning': 42}, arr: [0, 'foo', true]};
+ configuredArray = [0, 'foo', true, {foo: 'bar'}];
+ });
+
+ test('change object attribute', function() {
+ element.setAttribute('object', '{"foo": "bar", "nested": {"meaning": 42}, "arr": [0, "foo", true]}');
+ assert.deepEqual(element.object, configuredObject);
+ });
+
+ test('change object attribute to foreign type', function() {
+ element.setAttribute('object', 'The quick brown fox');
+ assert.strictEqual(element.object, 'The quick brown fox');
+ });
+
+ test('change array attribute', function() {
+ element.setAttribute('array', '[0, "foo", true, {"foo": "bar"}]');
+ assert.deepEqual(element.array, configuredArray);
+ });
+
+ test('change number attribute', function() {
+ element.setAttribute('number', 42);
+ assert.strictEqual(element.number, 42);
+ });
+
+ test('change string attribute', function() {
+ element.setAttribute('string', 'howdy');
+ assert.strictEqual(element.string, 'howdy');
+ });
+
+ test('change boolean attribute true', function() {
+ element.setAttribute('bool', '');
+ assert.strictEqual(element.bool, true);
+ });
+
+ test('change boolean attribute truthy', function() {
+ element.setAttribute('bool', 'sure!');
+ assert.strictEqual(element.bool, true);
+ });
+
+ test('change boolean attribute false', function() {
+ element.setAttribute('bool', '');
+ assert.strictEqual(element.bool, true);
+ element.removeAttribute('bool');
+ assert.strictEqual(element.bool, false);
+ });
+
+ test('change dashCase attribute', function() {
+ element.setAttribute('dash-case', 'Changed');
+ assert.strictEqual(element.dashCase, 'Changed');
+ });
+
+ test('change non-`properties` property that natively reflects', function() {
+ element.title = 'awesome';
+ assert.strictEqual(element.title, 'awesome');
+ element.title = '';
+ assert.strictEqual(element.title, '');
+ element.setAttribute('title', 'super');
+ assert.strictEqual(element.title, 'super');
+ element.removeAttribute('title');
+ assert.strictEqual(element.title, '');
+ });
+
+});
+
+suite('hostAttributes', function() {
+ var configuredObject;
+
+ setup(function() {
+ configuredObject = {foo: 'bar', nested: {'meaning': 42}, arr: [0, 'foo', true]};
+ });
+
+ test('hostAttributes set correctly', function() {
+ var element = fixture('basic');
+ assert.strictEqual(element.getAttribute('attr1'), 'this is attr 1');
+ assert.strictEqual(element.getAttribute('attr2'), '42');
+ assert.strictEqual(element.getAttribute('attr3'), 'instance', 'host attribute overrode instance attribute and should not');
+ assert.strictEqual(element.getAttribute('aria-role'), 'button');
+ assert.strictEqual(element.getAttribute('title'), 'awesome');
+ assert.strictEqual(element.title, 'awesome');
+ assert.equal(element.getAttribute('attr-object'), JSON.stringify(configuredObject));
+ assert.equal(element.hasAttribute('attr-stupid'), false);
+ // class *is* serialized
+ // BREAKME(sorvell): document breaking change.
+ assert.ok(element.classList.contains('foo'));
+ assert.ok(element.classList.contains('bar'));
+ assert.ok(element.classList.contains('baz'));
+
+ });
+
+ test('hostAttributes set correctly in composed element', function() {
+ var element = fixture('compose');
+ assert.strictEqual(element.$.basic.getAttribute('attr1'), 'compose');
+ assert.strictEqual(element.$.basic.getAttribute('attr2'), '42');
+ assert.strictEqual(element.$.basic.getAttribute('aria-role'), 'button');
+ assert.strictEqual(element.$.basic.getAttribute('title'), 'awesome');
+ assert.strictEqual(element.$.basic.title, 'awesome');
+
+ assert.equal(element.$.basic.getAttribute('attr-object'), JSON.stringify(configuredObject));
+ assert.equal(element.$.basic.hasAttribute('attr-stupid'), false);
+
+ // class does not overwrite user setting
+ assert.notOk(element.$.basic.classList.contains('foo'));
+ assert.notOk(element.$.basic.classList.contains('bar'));
+ assert.notOk(element.$.basic.classList.contains('baz'));
+
+ assert(element.$.basic.classList.contains('should-not-override'));
+
+ // applied to property with effect
+ assert.strictEqual(element.$.basic.prop, 'compose');
+ assert.equal(element.$.basic.propChangedCount, 1);
+ assert.equal(element.$.basic.attr1ChangedCount, 1);
+ assert.equal(element.prop2, 'hi');
+ });
+
+});
+</script>
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/behaviors.html b/third_party/polymer3/bower_components/polymer/test/unit/behaviors.html
new file mode 100644
index 0000000..a96f4f0
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/behaviors.html
@@ -0,0 +1,511 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+<body>
+
+ <dom-module id="behavior-registered">
+ <template>
+ <div id="content"></div>
+ </template>
+ </dom-module>
+
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+window.BehaviorA = {
+ properties: {
+
+ label: {
+ type: String,
+ observer: '_labelChanged'
+ },
+
+ hasOptionsA: {
+ readOnly: true,
+ notify: true
+ },
+
+ overridableProperty: {
+ value: false
+ },
+
+ overridablePropertyB: {
+ value: false
+ },
+
+ hasBehaviorA: {
+ value: true
+ },
+
+ computeADependency: {
+ value: true
+ },
+
+ computeA: {
+ computed: '_computeProp(computeADependency)'
+ }
+ },
+
+ _simpleProperty: 'A',
+
+ hostAttributes: {
+ behavior: 'A',
+ element: 'A',
+ user: 'A'
+ },
+
+ listeners: {
+ change: '_changeHandler'
+ },
+
+ ready: function() {
+ this.__readyA = true;
+ },
+
+ _labelChanged: function(label) {
+ this.__label = label;
+ },
+
+ _changeHandler: function(e) {
+ this.__change = e.detail.value;
+ },
+
+ _computeProp: function(a) {
+ return a;
+ }
+};
+
+window.BehaviorB = {
+ properties: {
+
+ disabled: {
+ type: Boolean,
+ value: false,
+ observer: '_disabledChanged'
+ },
+
+ hasOptionsB: {
+ readOnly: true,
+ notify: true
+ },
+
+ hasBehaviorB: {
+ value: true
+ },
+
+ overridablePropertyB: {
+ value: true
+ },
+
+ computeADependencyDependency: {
+ value: 'hi'
+ },
+
+ computeADependency: {
+ computed: '_computeProp(computeADependencyDependency)'
+ }
+
+ },
+
+ hostAttributes: {
+ behavior: 'B',
+ element: 'B',
+ user: 'B'
+ },
+
+ _simpleProperty: 'B',
+
+ _disabledChanged: function(disabled) {
+ this.__disabled = disabled;
+ },
+
+ ready: function() {
+ this.__readyB = true;
+ },
+};
+
+window.BehaviorC = {
+
+ properties: {
+
+ hasBehaviorC: {
+ value: true
+ }
+
+ },
+
+ _simpleProperty: 'C'
+};
+
+window.BehaviorD = {
+
+ properties: {
+
+ hasBehaviorD: {
+ value: true
+ }
+
+ },
+ _simpleProperty: 'D'
+
+};
+
+Polymer({
+ is: 'single-behavior',
+
+ behaviors: [
+ window.BehaviorA
+ ],
+
+ properties: {},
+ observers: [],
+ hostAttributes: {},
+ listeners: {}
+});
+
+Polymer({
+ is: 'multi-behaviors',
+
+ behaviors: [
+ window.BehaviorA,
+ window.BehaviorB
+ ],
+
+ hostAttributes: {
+ element: 'element'
+ },
+
+ properties: {
+
+ foo: {
+ type: String,
+ reflectToAttribute: true,
+ readOnly: true,
+ observer: '_fooChanged'
+ },
+
+ overridableProperty: {
+ value: true
+ }
+
+ },
+
+ _fooChanged: function(foo) {
+ this.__foo = foo;
+ },
+});
+
+Polymer({
+ is: 'nested-behaviors',
+
+ behaviors: [
+ [window.BehaviorB, [window.BehaviorC, window.BehaviorB], window.BehaviorA],
+ [window.BehaviorD]
+ ]
+});
+
+window.registerBehavior1 ={
+ beforeRegister: function() {
+ this._createPropertyObserver('beforeProp', 'beforePropChanged1');
+ this.beforeRegisterCount++;
+ this.beforeRegisterBehaviors = this.behaviors;
+ },
+ registered: function() {
+ this._createPropertyObserver('prop', 'propChanged1');
+ this._createMethodObserver('propChanged2(prop)');
+ this.registeredCount++;
+ this.registeredProps = [this.prop1, this.prop2, this.prop3, this.prop4];
+ this.registeredBehaviors = this.behaviors;
+ },
+ prop1: true,
+ ready: function() {
+ this._ensureAttribute('attr', true);
+ },
+ beforePropChanged1: function() {
+ this.beforePropChangedCalled = true;
+ },
+ propChanged1: function() {
+ this.propChanged1Called = true;
+ },
+ propChanged2: function() {
+ this.propChanged2Called = true;
+ }
+};
+
+window.registerBehavior2 ={
+ prop2: true,
+ beforeRegister: function() {
+ this.beforeRegisterCount++;
+ },
+ registered: function() {
+ this.registeredCount++;
+ }
+};
+
+window.registerBehavior3 ={
+ prop3: true,
+ beforeRegister: function() {
+ this.beforeRegisterCount++;
+ },
+ registered: function() {
+ this.registeredCount++;
+ }
+};
+
+Polymer({
+ behaviors: [
+ window.registerBehavior1,
+ window.registerBehavior2,
+ window.registerBehavior3
+ ],
+ prop4: true,
+ beforeRegister: function() {
+ this.beforeRegisterCount++;
+ },
+ registered: function() {
+ this.registeredCount++;
+ },
+
+ beforeRegisterCount: 0,
+ registeredCount: 0,
+
+ is: 'behavior-registered'
+});
+</script>
+
+ <test-fixture id="single">
+ <template>
+ <single-behavior></single-behavior>
+ </template>
+ </test-fixture>
+
+ <test-fixture id="multi">
+ <template>
+ <multi-behaviors user="user"></multi-behaviors>
+ </template>
+ </test-fixture>
+
+ <test-fixture id="nested">
+ <template>
+ <nested-behaviors></nested-behaviors>
+ </template>
+ </test-fixture>
+
+ <test-fixture id="registered">
+ <template>
+ <behavior-registered></behavior-registered>
+ </template>
+ </test-fixture>
+<script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+
+suite('single behavior element', function() {
+ var el;
+
+ setup(function() {
+ el = fixture('single');
+ });
+
+ test('is on prototype', function() {
+ assert.equal(el.is, 'single-behavior');
+ });
+
+ test('instance behaviors, properties, observers, hostAttributes, listeners', function() {
+ assert.isOk(el.behaviors);
+ assert.isOk(el.properties);
+ assert.isOk(el.observers);
+ assert.isOk(el.hostAttributes);
+ assert.isOk(el.listeners);
+ });
+
+ test('ready from behavior', function() {
+ assert.equal(el.__readyA, true);
+ });
+
+ test('properties from behavior', function() {
+ el.label = 'foo';
+ assert.equal(el.__label, 'foo');
+ });
+
+ test('listener from behavior', function() {
+ el.fire('change', {value: 'bar'});
+ assert.equal(el.__change, 'bar');
+ });
+
+ test('property info from behavior', function() {
+ assert.equal(el._hasNotifyEffect('hasOptionsA'), true);
+ assert.equal(el._hasReadOnlyEffect('hasOptionsA'), true);
+ assert.equal(typeof el._setHasOptionsA, 'function');
+ });
+
+ test('compute property from behavior', function() {
+ assert.equal(el.computeA, true);
+ });
+
+});
+
+suite('behavior.registered', function() {
+ test('can install dynamic properties', function() {
+ var el = fixture('registered');
+ assert.ok(el.$.content);
+ el.prop = 42;
+ assert.isTrue(el.propChanged1Called);
+ assert.isTrue(el.propChanged2Called);
+ assert.isTrue(el.hasAttribute('attr'));
+ });
+
+ test('called once for each behavior with access to element prototype', function() {
+ var el = fixture('registered');
+ assert.equal(el.registeredCount, 4);
+ assert.equal(el.registeredBehaviors.length, 3);
+ assert.equal(el.registeredBehaviors, el.behaviors);
+ assert.deepEqual(el.registeredProps, [true, true, true, true]);
+ });
+
+});
+
+suite('behavior.beforeRegister', function() {
+ test('can install dynamic properties', function() {
+ var el = fixture('registered');
+ assert.ok(el.$.content);
+ el.beforeProp = 43;
+ assert.isTrue(el.beforePropChangedCalled);
+ });
+
+ test('called once for each behavior with access to element prototype', function() {
+ var el = fixture('registered');
+ assert.equal(el.beforeRegisterCount, 4);
+ assert.equal(el.beforeRegisterBehaviors.length, 3);
+ assert.equal(el.beforeRegisterBehaviors, el.behaviors);
+ });
+
+});
+
+
+suite('multi-behaviors element', function() {
+ var el;
+
+ setup(function() {
+ el = fixture('multi');
+ });
+
+ test('ready from behaviors', function() {
+ assert.equal(el.__readyA, true);
+ assert.equal(el.__readyB, true);
+ });
+
+ test('properties from behaviors', function() {
+ el.label = 'foo';
+ assert.equal(el.__label, 'foo');
+ el.disabled = true;
+ assert.equal(el.__disabled, true);
+ });
+
+ test('properties from itself', function() {
+ assert.isDefined(el._setFoo, 'readOnly setter not available');
+ el._setFoo('bar');
+ assert.equal(el.__foo, 'bar', 'observer not getting called');
+ assert.equal(el.getAttribute('foo'), 'bar', 'not getting reflected');
+ });
+
+ test('listener from behaviors', function() {
+ el.fire('change', {value: 'bar'});
+ assert.equal(el.__change, 'bar');
+ });
+
+ test('property info from behavior A', function() {
+ assert.equal(el._hasNotifyEffect('hasOptionsA'), true);
+ assert.equal(el._hasReadOnlyEffect('hasOptionsA'), true);
+ assert.equal(typeof el._setHasOptionsA, 'function');
+ });
+
+ test('property info from behavior B', function() {
+ assert.equal(el._hasReadOnlyEffect('hasOptionsB'), true);
+ assert.equal(el._hasNotifyEffect('hasOptionsB'), true);
+ assert.equal(typeof el._setHasOptionsB, 'function');
+ });
+
+ test('computed property dependency can become a computed property', function() {
+ assert.equal(el.computeA, 'hi');
+ });
+
+ test('multi-behavior overrides ordering', function() {
+ assert(el.overridableProperty, 'Behavior property was not overridden by prototype');
+ assert(el.overridablePropertyB, 'Behavior config-property was not overridden by sub-behavior');
+ });
+
+ test('hostAttributes ordering', function() {
+ assert.equal(el.attributes.behavior.value, 'B', 'Behavior hostAttribute not overridden by younger behavior');
+ assert.equal(el.attributes.element.value, 'element', 'Behavior hostAttribute overridden by behavior');
+ assert.equal(el.attributes.user.value, 'user', 'Behavior hostAttribute overrode user attribute');
+ });
+
+ test('behavior is null generates warning', function() {
+ sinon.spy(console, 'warn');
+ Polymer({
+ is: 'behavior-null',
+ behaviors: [
+ null
+ ]
+ });
+ document.createElement('behavior-null');
+ assert.equal(console.warn.callCount, 1, 'Null behaviour should generate warning');
+ console.warn.restore();
+ });
+
+ test('behavior array is unique', function() {
+ Polymer({
+ is: 'behavior-unique',
+ behaviors: [window.BehaviorA, window.BehaviorA]
+ });
+ assert.equal(document.createElement('behavior-unique').behaviors.length, 1);
+ });
+
+ test('duplicate behaviors keep first behavior', function() {
+ Polymer({
+ is: 'behavior-unique-last-behavior',
+ behaviors: [window.BehaviorA, window.BehaviorB, window.BehaviorC, window.BehaviorA, window.BehaviorB]
+ });
+ var behaviors = document.createElement('behavior-unique-last-behavior').behaviors;
+ assert.deepEqual(behaviors, [window.BehaviorC, window.BehaviorA, window.BehaviorB]);
+ });
+
+});
+
+suite('nested-behaviors element', function() {
+ var el;
+
+ setup(function() {
+ el = fixture('nested');
+ });
+
+ test('nested-behavior dedups', function() {
+ assert.equal(el.behaviors.length, 4);
+ });
+
+ test('nested-behavior overrides ordering', function() {
+ assert.ok(el.hasBehaviorA, "missing BehaviorA");
+ assert.ok(el.hasBehaviorB, "missing BehaviorB");
+ assert.ok(el.hasBehaviorC, "missing BehaviorC");
+ assert.ok(el.hasBehaviorD, "missing BehaviorD");
+ assert.equal(el._simpleProperty, 'D', 'Behavior simple property was not overridden by sub-behavior');
+ });
+
+});
+</script>
+
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/case-map.html b/third_party/polymer3/bower_components/polymer/test/unit/case-map.html
new file mode 100644
index 0000000..46f02ba
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/case-map.html
@@ -0,0 +1,45 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../lib/utils/case-map.js"></script>
+</head>
+<body>
+
+<script type="module">
+import * as caseMap$0 from '../../lib/utils/case-map.js';
+suite('case-map', function() {
+ var caseMap;
+
+ setup(function() {
+ caseMap = caseMap$0;
+ });
+
+ test('camelToDashCase converts to dashes', function() {
+ assert.equal(caseMap.camelToDashCase('camelCase'), 'camel-case');
+ assert.equal(caseMap.camelToDashCase('camelCCase'), 'camel-c-case');
+ });
+
+ test('dashToCamelCase converts to camelCase', function() {
+ assert.equal(caseMap.dashToCamelCase('camel-case'), 'camelCase');
+ assert.equal(caseMap.dashToCamelCase('camel-c-case'), 'camelCCase');
+ });
+
+ test('camelToDashCase and dashToCamelCase reverse the other function', function() {
+ var camelCase = caseMap.dashToCamelCase('camel-c-case');
+ assert.equal(caseMap.camelToDashCase(camelCase), 'camel-c-case');
+ });
+});
+</script>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/configure.html b/third_party/polymer3/bower_components/polymer/test/unit/configure.html
new file mode 100644
index 0000000..ba33c9c
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/configure.html
@@ -0,0 +1,528 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+</head>
+<body>
+ <script type="module">
+window.configureBehavior = {
+
+ changeHandlerCount: 0,
+ objectChangeHandlerCount: 0,
+
+ contentChanged: function() {
+ this.changeHandlerCount++;
+ this.stomp = 10;
+ },
+ objectChanged: function() {
+ this.objectChangeHandlerCount++;
+ }
+};
+</script>
+
+ <dom-module id="x-configure-value">
+ <template>
+ <span id="content">{{content}}</span>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+
+ is: 'x-configure-value',
+
+ behaviors: [window.configureBehavior],
+
+ properties: {
+ content: {
+ type: String,
+ notify: true,
+ observer: 'contentChanged',
+ value: 'default'
+ },
+ object: {
+ type: Object,
+ notify: true,
+ value: function() { return {foo: 'obj-default'}; },
+ observer: 'objectChanged'
+ },
+ readOnly: {
+ readOnly: true,
+ value: 'default'
+ },
+ stomp: {
+ value: 5
+ }
+ }
+
+});
+</script>
+ </dom-module>
+
+ <dom-module id="x-configure-gchild">
+ <template>
+ <span id="content">{{content}}</span>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+
+ is: 'x-configure-gchild',
+
+ behaviors: [window.configureBehavior],
+
+ properties: {
+ content: {
+ type: String,
+ notify: true,
+ observer: 'contentChanged',
+ value: 'gchild'
+ },
+ object: {
+ type: Object,
+ notify: true,
+ value: function() { return {foo: 'obj-default'}; },
+ observer: 'objectChanged'
+ },
+ readOnly: {
+ readOnly: true,
+ value: 'default'
+ },
+ stomp: {
+ value: 5
+ }
+ }
+
+});
+</script>
+ </dom-module>
+
+ <dom-module id="x-configure-child">
+ <template>
+ <x-configure-gchild id="gchild" content="{{content}}" object="{{object}}"></x-configure-gchild>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+
+ is: 'x-configure-child',
+
+ behaviors: [window.configureBehavior],
+
+ properties: {
+ content: {
+ type: String,
+ notify: true,
+ observer: 'contentChanged',
+ value: 'child'
+ },
+ negatedContent: {
+ type: Boolean,
+ observer: 'negatedContentChanged',
+ value: true
+ },
+ compoundInput: {
+ type: String,
+ observer: 'compoundInputChanged',
+ value: 'default'
+ },
+ object: {
+ type: Object,
+ notify: true,
+ value: function() { return {foo: 'obj-default'}; },
+ observer: 'objectChanged'
+ },
+ readOnly: {
+ readOnly: true,
+ value: 'default'
+ },
+ stomp: {
+ value: 5
+ },
+ attrDash: {
+ observer: 'attrDashChanged',
+ value: 'default'
+ },
+ attrNumber: {
+ type: Number,
+ observer: 'attrNumberChanged',
+ value: 0
+ },
+ attrBoolean: {
+ type: Boolean,
+ observer: 'attrBooleanChanged',
+ value: false
+ }
+ },
+
+ created: function() {
+ this.attrDashChanged = sinon.spy();
+ this.attrNumberChanged = sinon.spy();
+ this.attrBooleanChanged = sinon.spy();
+ this.negatedContentChanged = sinon.spy();
+ this.compoundInputChanged = sinon.spy();
+ }
+
+});
+</script>
+ </dom-module>
+
+ <dom-module id="x-configure-simple-child">
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+
+ is: 'x-configure-simple-child',
+
+ properties: {
+ noeffect: String
+ },
+
+ ready: function() {
+ this.hasPropertyAtReadyTime = (this.noeffect !== undefined);
+ }
+
+});
+</script>
+ </dom-module>
+
+ <dom-module id="x-configure-host">
+ <template>
+ <x-configure-child id="child"
+ content="{{content}}"
+ negated-content="[[!content]]"
+ compound-input="a [[simple]] [[content]]"
+ object="{{object.goo}}"
+ attr$="{{attrValue}}"
+ attr-dash$="{{attrValue}}"
+ attr-number$="{{attrNumber}}"
+ attr-boolean$="{{attrBoolean}}"
+ ></x-configure-child>
+ <x-configure-simple-child id="simple" noeffect="{{simple}}"></x-configure-simple-child>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+
+ is: 'x-configure-host',
+
+ behaviors: [window.configureBehavior],
+
+ properties: {
+ content: {
+ type: String,
+ notify: true,
+ observer: 'contentChanged',
+ value: 'host'
+ },
+ object: {
+ type: Object,
+ notify: true,
+ value: function() { return {goo: {foo: 'obj-host'}}; },
+ observer: 'objectChanged'
+ },
+ readOnly: {
+ readOnly: true,
+ value: 'default'
+ },
+ stomp: {
+ value: 5
+ },
+ attrValue: {
+ value: 'attrValue'
+ },
+ attrNumber: {
+ value: 42
+ },
+ attrBoolean: {
+ value: false
+ },
+ simple: {
+ value: 'simple'
+ }
+ }
+});
+</script>
+ </dom-module>
+
+ <script type="module">
+window.XConfigLazy = {
+ is: 'x-config-lazy',
+ properties: {
+ noEffectProp: Number,
+ defaultUsesNoEffectProp: {
+ type: Number
+ },
+ boundNoEffectProp: {
+ type: Number,
+ value: 5
+ },
+ prop: {
+ value: 'lazy',
+ observer: 'propChanged'
+ },
+ readOnlyProp: {
+ readOnly: true,
+ value: 'readOnly'
+ },
+ hadAttrProp: {
+ value: 'hadAttrProp',
+ observer: 'hadAttrPropChanged'
+ }
+ },
+ created: function() {
+ this.noEffectProp = 1;
+ this.defaultUsesNoEffectProp = this.noEffectProp * 2;
+ this.propChanged = sinon.spy();
+ this.hadAttrPropChanged = sinon.spy();
+ }
+};
+</script>
+
+ <dom-module id="x-config-lazy-nodefaults">
+ <template>
+ <div>x-config-lazy-nodefaults</div>
+ </template>
+ <script type="module">
+window.XConfigLazyNoDefaults = {
+ is: 'x-config-lazy-nodefaults',
+ properties: {
+ prop: {
+ observer: 'propChanged'
+ }
+ },
+ created: function() {
+ this.propChanged = sinon.spy();
+ }
+};
+</script>
+ </dom-module>
+
+ <dom-module id="x-config-lazy-host">
+ <template>
+ <x-config-lazy id="lazy" prop="{{foo}}" read-only-prop="{{foo}}" had-attr-prop="attrValue" bound-no-effect-prop="{{foo}}"></x-config-lazy>
+ <x-config-lazy-nodefaults prop="[[foo]]"></x-config-lazy-nodefaults>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-config-lazy-host',
+ properties: {
+ foo: {
+ value: 'foo',
+ observer: 'fooChanged'
+ }
+ },
+ fooChanged: function(foo) {
+ this.$.lazy.hadAttrProp = foo;
+ }
+});
+</script>
+ </dom-module>
+
+ <x-configure-value></x-configure-value>
+
+ <x-configure-value content="attr" object='{"foo": "obj-attr"}'></x-configure-value>
+
+ <x-configure-host></x-configure-host>
+
+ <x-configure-host content="attr"></x-configure-host>
+
+<script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+
+function testValueAndChangeHandler(e, value) {
+ assert.equal(e.content, value, 'Property does not equal configured value');
+ assert.equal(e.changeHandlerCount, 1, 'property `change` Change handler not run when default value set');
+ assert.equal(e.objectChangeHandlerCount, 1, 'property `object` Change handler not run when default value set');
+}
+
+function testConfigure(e, value, objectValue) {
+ testValueAndChangeHandler(e, value);
+ assert.equal(e.object.foo, objectValue);
+ assert.equal(e.$.content.textContent, value, 'Bound value not propagated to dom');
+}
+
+function testConfigureHost(e, value) {
+ testValueAndChangeHandler(e, value);
+ e = e.$.child;
+ testValueAndChangeHandler(e, value);
+ e = e.$.gchild;
+ testValueAndChangeHandler(e, value);
+ assert.equal(e.$.content.textContent, value, 'Bound value not propagated to dom');
+}
+
+suite('configure', function() {
+
+ test('value set in properties initializes correctly', function() {
+ var e = document.querySelector('x-configure-value');
+ testConfigure(e, 'default', 'obj-default');
+ });
+
+ test('attribute overrides value set in properties', function() {
+ var e = document.querySelector('x-configure-value[content]');
+ testConfigure(e, 'attr', 'obj-attr');
+ });
+
+ test('configured values initialize and propagates', function() {
+ var e = document.querySelector('x-configure-host');
+ testConfigureHost(e, 'host');
+ });
+
+ test('negated value configured correctly', function() {
+ var e = document.querySelector('x-configure-host');
+ assert.equal(e.$.child.negatedContent, false);
+ assert.isTrue(e.$.child.negatedContentChanged.calledOnce, 'negated content not changed exactly once');
+ });
+
+ test('compound effect resulting value set once', function() {
+ var e = document.querySelector('x-configure-host');
+
+ assert.equal(e.$.child.compoundInput, 'a simple host');
+ assert.isTrue(e.$.child.compoundInputChanged.calledOnce, 'compound content not changed exactly once');
+ });
+
+ test('attribute overrides configured values and propagates', function() {
+ var e = document.querySelector('x-configure-host[content]');
+ testConfigureHost(e, 'attr');
+ });
+
+ test('property changed in change handler of another not stomped by default', function() {
+ var e = document.querySelector('x-configure-value');
+ assert.equal(e.stomp, 10);
+ });
+
+ test('read-only property initialized to default value', function() {
+ var e = document.querySelector('x-configure-value');
+ assert.equal(e.readOnly, 'default');
+ });
+
+ test('attribute bindings to properties without effects not configured', function() {
+ var e = document.querySelector('x-configure-host');
+ assert.equal(e.$.child.getAttribute('attr'), 'attrValue');
+ assert.equal(e.$.child.attr, undefined);
+ });
+
+ test('attribute bindings to properties with effects configured', function() {
+ var e = document.createElement('x-configure-host');
+ document.body.appendChild(e);
+
+ assert.equal(e.$.child.getAttribute('attr-dash'), 'attrValue');
+ assert.notProperty(e.$.child, 'attr-dash');
+ assert.equal(e.$.child.attrDash, 'attrValue');
+ assert.isTrue(e.$.child.attrDashChanged.calledOnce);
+ assert.equal(e.$.child.attrDashChanged.getCall(0).args[0], 'attrValue');
+
+ assert.equal(e.$.child.getAttribute('attr-number'), '42');
+ assert.notProperty(e.$.child, 'attr-number');
+ assert.strictEqual(e.$.child.attrNumber, 42);
+ assert.isTrue(e.$.child.attrNumberChanged.calledOnce);
+ assert.strictEqual(e.$.child.attrNumberChanged.getCall(0).args[0], 42);
+
+ assert.equal(e.$.child.hasAttribute('attr-boolean'), false);
+ assert.notProperty(e.$.child, 'attr-boolean');
+ // Attribute bindings are no longer specially
+ // configured to properties as they were with 1.0. This should
+ // only affect bindings that set false (removing a non-existing attribute)
+ // to override a default of true (which is an odd default for a boolean attr).
+ assert.strictEqual(e.$.child.attrBoolean, false);
+ assert.isTrue(e.$.child.attrBooleanChanged.calledOnce);
+ assert.strictEqual(e.$.child.attrBooleanChanged.getCall(0).args[0], false);
+ });
+
+ test('bindings to properties without effects configured', function() {
+ var e = document.createElement('x-configure-host');
+ document.body.appendChild(e);
+ assert.isTrue(e.$.simple.hasPropertyAtReadyTime, 'property value not configured and therefore not set at ready time');
+ });
+
+ test('pre-register property assignment does not break getters and setters', function() {
+ var x = document.createElement('x-late-register');
+ document.body.appendChild(x);
+ // set property
+ x.shouldChange = '1';
+ // now register element
+ Polymer({
+ is: 'x-late-register',
+ properties: {
+ shouldChange : {
+ observer: 'shouldChangeCallback',
+ type: String
+ }
+ },
+ shouldChangeCallback: function() {
+ this.textContent = this.shouldChange;
+ }
+ });
+ assert.equal(x.shouldChange, '1');
+ assert.equal(x.shouldChange, x.textContent);
+ x.shouldChange = '2';
+ assert.equal(x.shouldChange, '2');
+ assert.equal(x.shouldChange, x.textContent);
+ document.body.removeChild(x);
+ });
+
+ // Created is no longer called before
+ // default properties are set. This means values set in created cannot
+ // be used to calculate defaults. However, defaults can now be set for
+ // any property (including those with effects) in created.
+ test('setting properties in created works with configuration', function() {
+ var x = document.createElement('x-late-register2');
+ document.body.appendChild(x);
+ // now register element
+ Polymer({
+ is: 'x-late-register2',
+ properties: {
+ a: {
+ type: Number,
+ value: 0
+ },
+ b: {
+ type: Number
+ }
+ },
+ created: function() {
+ this.a = 1;
+ this.b = this.a * 2;
+ }
+ });
+ assert.equal(x.b, 2);
+ document.body.removeChild(x);
+ });
+
+ test('lazy upgrade binding use cases', function() {
+ var el = document.createElement('x-config-lazy-host');
+ document.body.appendChild(el);
+ Polymer(window.XConfigLazy);
+ // The purpose of this test is to test lazy upgrading an element that
+ // has a property pre-bound to it (that has an accessor) but that has
+ // no defaults for it (stresses a prior bug in ready() code that called
+ // _attachDom twice, which throws in Safari's native SD
+ Polymer(window.XConfigLazyNoDefaults);
+ assert.equal(el.$.lazy.noEffectProp, 1);
+ assert.equal(el.$.lazy.defaultUsesNoEffectProp, 2);
+ assert.equal(el.$.lazy.boundNoEffectProp, 'foo');
+ assert.equal(el.$.lazy.prop, 'foo');
+ assert.isTrue(el.$.lazy.propChanged.calledOnce);
+ assert.equal(el.$.lazy.readOnlyProp, 'readOnly');
+ assert.equal(el.$.lazy.hadAttrProp, 'foo');
+ assert.isTrue(el.$.lazy.hadAttrPropChanged.calledOnce);
+ document.body.removeChild(el);
+ });
+
+});
+</script>
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/css-parse.html b/third_party/polymer3/bower_components/polymer/test/unit/css-parse.html
new file mode 100644
index 0000000..d276d9f
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/css-parse.html
@@ -0,0 +1,184 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+
+ <meta charset="utf-8">
+
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+
+ <title>css-parse</title>
+
+ <script type="module" src="../../polymer-legacy.js"></script>
+
+</head>
+<body>
+
+ <style id="test">
+ :host {
+ background: red;
+ }
+
+ .foo .bar .baz, zonk[happy]:focus {
+ font-family: sans-serif;
+ font-size: 15px;
+ }
+
+ @-webkit-keyframes fill-unfill-rotate {
+ 12.5% { transform: rotate(135deg); }
+ 25% { transform: rotate(270deg); }
+ 37.5% { transform: rotate(405deg); }
+ 50% { transform: rotate(540deg); }
+ 62.5% { transform: rotate(675deg); }
+ 75% { transform: rotate(810deg); }
+ 87.5% { transform: rotate(945deg); }
+ to { transform: rotate(1080deg); }
+ }
+
+ @media (max-width: 400px) {
+ div {
+ margin-left: 0 !important;
+ }
+ }
+ </style>
+
+ <style id="test-ignore">
+ @import '';
+
+ /* comment */
+ .stuff {
+ background: red;
+ }
+ /* comment */
+
+ /*
+ This is a multi-line comment
+ */
+
+ /*.aclassThatShouldBeIgnored {
+ someProperty: thatMustNotShowUp
+ }*/
+ </style>
+
+ <style id="short-escape-sequence">
+ .\33 d-model {
+ border-top: 3px solid red;
+ }
+ .\a33 d-model {
+ border-top: 3px solid red;
+ }
+ .\b333 d-model {
+ border-top: 3px solid red;
+ }
+ .\c3333 d-model {
+ border-top: 3px solid red;
+ }
+ .\d33333 d-model {
+ border-top: 3px solid red;
+ }
+ .\e33333d-model {
+ border-top: 3px solid red;
+ }
+ </style>
+
+ <style id="multiple-spaces">
+ .foo .bar {}
+ .foo .bar {}
+ .foo
+
+
+ .bar {}
+ </style>
+<script type="module">
+
+function sanitizeCss(text) {
+ return text.replace(/[\s]+/g, ' ').trim();
+}
+
+suite('css-parse', function() {
+ var css, s, tree;
+
+ setup(function() {
+ css = Polymer.CssParse;
+ s = document.querySelector('style#test');
+ tree = css.parse(s.textContent);
+ });
+
+ test('css rules parse', function() {
+ assert.equal(tree.rules.length, 4, 'unexpected number of rules');
+ assert.equal(tree.rules[2].rules.length, 8, 'unexpected number of rules in keyframes');
+ assert.equal(tree.rules[3].rules.length, 1, 'unexpected number of rules in @media');
+ });
+
+ test('rule selectors parse', function() {
+ assert.equal(tree.rules[0].selector, ':host', 'unexpected selector');
+ assert.equal(tree.rules[2].selector, '@-webkit-keyframes fill-unfill-rotate', 'unexpected selector in keyframes');
+ assert.equal(tree.rules[3].selector, '@media (max-width: 400px)', 'unexpected selector in @media');
+ });
+
+ test('rule cssText parse', function() {
+ assert.equal(tree.rules[0].cssText, 'background: red;', 'unexpected cssText');
+ assert.match(tree.rules[2].cssText, /^12.5%/, 'unexpected cssText in keyframes');
+ assert.equal(tree.rules[2].rules[2].cssText, 'transform: rotate(405deg);', 'unexpected cssText in keyframes');
+ assert.match(tree.rules[3].cssText, /^div/, 'unexpected cssText in @media');
+ assert.equal(tree.rules[3].rules[0].cssText, 'margin-left: 0 !important;', 'unexpected cssText in @media');
+ });
+
+ test('rule types', function() {
+ assert.equal(tree.rules[0].type, css.types.STYLE_RULE);
+ assert.equal(tree.rules[1].type, css.types.STYLE_RULE);
+ assert.equal(tree.rules[2].type, css.types.KEYFRAMES_RULE);
+ assert.equal(tree.rules[3].type, css.types.MEDIA_RULE);
+ assert.equal(tree.rules[3].rules[0].type, css.types.STYLE_RULE);
+
+ });
+
+ test('rules stringify', function() {
+ var orig = sanitizeCss(s.textContent);
+ var result = sanitizeCss(css.stringify(tree));
+ assert.equal(result, orig, 'unexpected stringified output');
+ });
+
+ test('parse correctly ignores @import and comments', function() {
+ var s2 = document.querySelector('#test-ignore');
+ var t = css.parse(s2.textContent);
+ assert.equal(t.rules[0].selector, '.stuff', 'unexpected rule selector');
+ assert.equal(t.rules[0].cssText, 'background: red;', 'unexpected rule cssText');
+ var result = sanitizeCss(css.stringify(t));
+ assert.equal(result, '.stuff { background: red; }', 'unexpected stringified output');
+ });
+
+ test('short escape sequences', function() {
+ var s3 = document.querySelector('#short-escape-sequence');
+ var t = css.parse(s3.textContent);
+ assert.equal(t.rules[0].selector, '.\\000033d-model');
+ assert.equal(t.rules[1].selector, '.\\000a33d-model');
+ assert.equal(t.rules[2].selector, '.\\00b333d-model');
+ assert.equal(t.rules[3].selector, '.\\0c3333d-model');
+ assert.equal(t.rules[4].selector, '.\\d33333d-model');
+ assert.equal(t.rules[5].selector, '.\\e33333d-model');
+ });
+
+ test('multiple consequent spaces in CSS selector', function() {
+ var s4 = document.querySelector('#multiple-spaces');
+ var t = css.parse(s4.textContent);
+ assert.equal(t.rules[0].selector, '.foo .bar');
+ assert.equal(t.rules[1].selector, '.foo .bar');
+ assert.equal(t.rules[2].selector, '.foo .bar');
+ });
+
+});
+</script>
+
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/custom-style-async-import.html b/third_party/polymer3/bower_components/polymer/test/unit/custom-style-async-import.html
new file mode 100644
index 0000000..94f5ec3
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/custom-style-async-import.html
@@ -0,0 +1,36 @@
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<custom-style>
+ <style is="custom-style">
+ html {
+ --cs-blue: {
+ border : 8px solid blue;
+ };
+ }
+ </style>
+</custom-style>
+<dom-module id="x-client">
+ <template>
+ <style>
+ :host {
+ display: inline-block;
+ border : 4px solid red;
+ @apply (--cs-blue);
+ }
+ </style>
+ x-client
+ </template>
+ <script type="module">
+import { Polymer } from '../../lib/legacy/polymer-fn.js';
+Polymer({
+ is: 'x-client'
+});
+</script>
+</dom-module>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/custom-style-async-import.js b/third_party/polymer3/bower_components/polymer/test/unit/custom-style-async-import.js
new file mode 100644
index 0000000..a1d21a7
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/custom-style-async-import.js
@@ -0,0 +1,31 @@
+import { Polymer } from '../../lib/legacy/polymer-fn.js';
+
+const $_documentContainer = document.createElement('template');
+
+$_documentContainer.innerHTML = `<custom-style>
+<style is="custom-style">
+ html {
+ --cs-blue: {
+ border : 8px solid blue;
+ };
+ }
+</style>
+</custom-style>
+<dom-module id="x-client">
+<template>
+ <style>
+ :host {
+ display: inline-block;
+ border : 4px solid red;
+ @apply (--cs-blue);
+ }
+ </style>
+ x-client
+</template>
+</dom-module>`;
+
+document.body.appendChild($_documentContainer.content);
+
+Polymer({
+ is: 'x-client'
+});
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/custom-style-async.html b/third_party/polymer3/bower_components/polymer/test/unit/custom-style-async.html
new file mode 100644
index 0000000..c01ba41
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/custom-style-async.html
@@ -0,0 +1,69 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+
+</head>
+<body>
+
+ <dom-module id="x-host">
+ <template>
+ <style>
+ :host {
+ display: inline-block;
+ border: 4px solid orange;
+ padding: 4px;
+ }
+ .whatever { color: var(--whatever); }
+ </style>
+ <x-client id="client"></x-client>
+ </template>
+ </dom-module>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-host'
+});
+</script>
+
+ <x-host id="host"></x-host>
+
+ <script type="module">
+import { afterNextRender } from '../../lib/utils/render-status.js';
+/* global host */
+
+suite('async global custom-style', function() {
+
+ test('async loaded custom-style applies', function(done) {
+ import('./custom-style-async-import.js').then(() => {
+ afterNextRender(null, function() {
+ assertComputed(host.$.client, '8px');
+ done();
+ });
+ });
+ });
+
+});
+
+function assertComputed(element, value, property, pseudo) {
+ var computed = getComputedStyle(element, pseudo);
+ property = property || 'border-top-width';
+ assert.equal(computed[property], value, 'computed style incorrect for ' + property);
+}
+</script>
+
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/custom-style-import.js b/third_party/polymer3/bower_components/polymer/test/unit/custom-style-import.js
new file mode 100644
index 0000000..f6722cc
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/custom-style-import.js
@@ -0,0 +1,45 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+
+import './sub/style-import.js';
+const $_documentContainer = document.createElement('template');
+$_documentContainer.setAttribute('style', 'display: none;');
+
+$_documentContainer.innerHTML = `<dom-module id="shared-style">
+ <template>
+ <style>
+ html {
+ --import-var: 3px solid orange;
+ }
+ </style>
+ </template>
+</dom-module><dom-module id="shared-style2">
+ <template>
+ <style>
+ .zazz {
+ border: 16px solid orange;
+ }
+ </style>
+ </template>
+</dom-module><custom-style>
+<style is="custom-style" include="shared-style style-import
+ style-import2">
+ html {
+
+ --import-mixin: {
+ border: 4px solid blue;
+ };
+
+ padding: 10px;
+ }
+</style>
+</custom-style>`;
+
+document.head.appendChild($_documentContainer.content);
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/custom-style-late.html b/third_party/polymer3/bower_components/polymer/test/unit/custom-style-late.html
new file mode 100644
index 0000000..53b5513
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/custom-style-late.html
@@ -0,0 +1,76 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+</head>
+<body>
+
+ <custom-style>
+ <style is="custom-style">
+ x-input {
+ border: 4px solid red;
+ @apply --cs-blue;
+ }
+ </style>
+ </custom-style>
+
+ <template id="late">
+ <custom-style>
+ <style is="custom-style">
+ html {
+ --cs-blue: {
+ border: 8px solid blue;
+ };
+ }
+ </style>
+ </custom-style>
+ </template>
+
+ <x-input id="input"></x-input>
+
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+import { afterNextRender } from '../../lib/utils/render-status.js';
+/* global input */
+
+suite('custom-style late property definition', function() {
+
+ test('late defined properties applied to custom-style', function(done) {
+ Polymer({
+ is: 'x-input'
+ });
+ var template = document.querySelector('template#late');
+ document.body.appendChild(document.importNode(template.content, true));
+ // wait 2 rounds of `afterNextRender` as `<custom-style>` boots asynchronously
+ afterNextRender(null, function() {
+ afterNextRender(null, function() {
+ assertComputed(input, '8px');
+ done();
+ });
+ });
+ });
+
+});
+
+function assertComputed(element, value, property, pseudo) {
+ var computed = getComputedStyle(element, pseudo);
+ property = property || 'border-top-width';
+ assert.equal(computed[property], value, 'computed style incorrect for ' + property);
+}
+</script>
+
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/custom-style-scope-cache.html b/third_party/polymer3/bower_components/polymer/test/unit/custom-style-scope-cache.html
new file mode 100644
index 0000000..2107207
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/custom-style-scope-cache.html
@@ -0,0 +1,82 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+
+</head>
+<body>
+ <custom-style>
+ <style is="custom-style">
+ .c {
+ --cache-element-border: 8px solid blue;
+ }
+ </style>
+ </custom-style>
+ <dom-module id="cache-element">
+ <template>
+ <style>
+ :host {
+ display: block;
+ border: var(--cache-element-border, 4px solid orange);
+ }
+ </style>
+ cache-element
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'cache-element'
+});
+</script>
+ </dom-module>
+
+ <cache-element id="cache1" class="c"></cache-element>
+ <cache-element id="cache2"></cache-element>
+
+ <script type="module">
+
+suite('custom-style scope cache', function() {
+
+ test('elements created declaratively conditionally styled via custom style receive correct properties', function() {
+ var t1 = document.querySelector('#cache1');
+ var t2 = document.querySelector('#cache2');
+ assertComputed(t1, '8px');
+ assertComputed(t2, '4px');
+ });
+
+
+ test('elements created imperatively conditionally styled via custom style receive correct properties', function() {
+ var t1 = document.createElement('cache-element');
+ t1.classList.add('c');
+ var t2 = document.createElement('cache-element');
+ document.body.appendChild(t1);
+ document.body.appendChild(t2);
+ assertComputed(t1, '8px');
+ assertComputed(t2, '4px');
+ });
+
+});
+
+
+function assertComputed(element, value, property, pseudo) {
+ var computed = getComputedStyle(element, pseudo);
+ property = property || 'border-top-width';
+ assert.equal(computed[property], value, 'computed style incorrect for ' + property);
+}
+</script>
+
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/custom-style.html b/third_party/polymer3/bower_components/polymer/test/unit/custom-style.html
new file mode 100644
index 0000000..8f4353e
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/custom-style.html
@@ -0,0 +1,659 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+ <script type="module" src="./custom-style-import.js"></script>
+</head>
+<body>
+ <!-- FIXME(polymer-modulizer):
+ These imperative modules that innerHTML your HTML are
+ a hacky way to be sure that any mixins in included style
+ modules are ready before any elements that reference them are
+ instantiated, otherwise the CSS @apply mixin polyfill won't be
+ able to expand the underlying CSS custom properties.
+ See: https://github.com/Polymer/polymer-modulizer/issues/154
+ -->
+ <script type="module">
+const $_documentContainer = document.createElement('template');
+
+$_documentContainer.innerHTML = `<custom-style>
+ <style is="custom-style">
+ x-bar {
+ border: 1px solid red;
+ display: block;
+ }
+
+ html {
+ --bag2: {
+ border: 12px solid beige;
+ };
+ }
+
+ html {
+ --red-text : {
+ color : red;
+ };
+ }
+
+ html{--blue-text:{color:#0000ff};--dummy-mixin:{};--bold-text:{font-weight:700}}
+
+
+ html {
+
+ --italic: italic;
+
+ --bag: {
+ margin: 1px;
+ border: 1px solid black;
+ };
+
+ /* mocha.css in the testing environment is hosing this test;
+ use !important as a workaround */
+ margin: 10px !important;
+ width: auto;
+
+ --special: var(--primary);
+
+ --after: 11px solid orange;
+ @apply --bag2;
+ }
+
+ x-foo {
+
+ --primary: 10px;
+ --x-foo-more: 6px solid orange;
+ }
+ </style>
+</custom-style>`;
+
+document.body.appendChild($_documentContainer.content);
+</script>
+ <script type="module">
+const $_documentContainer = document.createElement('template');
+
+$_documentContainer.innerHTML = `<custom-style>
+ <style is="custom-style">
+ .bag {
+ ;@apply --bag;
+ }
+
+ .italic {
+ font-style: var(--italic);
+ }
+
+ .import-mixin {
+ @apply --import-mixin;
+ }
+
+ .import-var {
+ border: var(--import-var);
+ }
+
+ .dynamic {
+ border: var(--dynamic);
+ }
+
+ #after::after {
+ content: 'after';
+ border: var(--after);
+ }
+ </style>
+</custom-style>`;
+
+document.body.appendChild($_documentContainer.content);
+</script>
+
+<script type="module">
+const $_documentContainer = document.createElement('template');
+
+$_documentContainer.innerHTML = `<custom-style>
+ <style is="custom-style" include="shared-style2">
+ .zazz {
+ border: 20px solid blue;
+ }
+ </style>
+ <style>
+ .foo--bar {
+ border-top : 3px solid red;
+ }
+ </style>
+</custom-style>`;
+
+document.body.appendChild($_documentContainer.content);
+</script>
+<script type="module">
+const $_documentContainer = document.createElement('template');
+
+$_documentContainer.innerHTML = `<custom-style>
+ <style is="custom-style">
+ @media (min-width: 1px) {
+ .foo--bar {
+ border-top : 20px solid blue;
+ }
+ }
+ </style>
+</custom-style>`;
+
+document.body.appendChild($_documentContainer.content);
+</script>
+ <script type="module">
+const $_documentContainer = document.createElement('template');
+$_documentContainer.innerHTML = `<div class="italic">italic</div>`;
+document.body.appendChild($_documentContainer.content);
+</script>
+ <script type="module">
+const $_documentContainer = document.createElement('template');
+$_documentContainer.innerHTML = `<div class="bag">bag</div>`;
+document.body.appendChild($_documentContainer.content);
+</script>
+ <script type="module">
+const $_documentContainer = document.createElement('template');
+$_documentContainer.innerHTML = `<div class="mix">mix</div>`;
+document.body.appendChild($_documentContainer.content);
+</script>
+
+ <script type="module">
+const $_documentContainer = document.createElement('template');
+$_documentContainer.innerHTML = `<div class="dynamic">dynamic</div>`;
+document.body.appendChild($_documentContainer.content);
+</script>
+
+ <script type="module">
+const $_documentContainer = document.createElement('template');
+$_documentContainer.innerHTML = `<div class="import-mixin">import-mixin</div>`;
+document.body.appendChild($_documentContainer.content);
+</script>
+ <script type="module">
+const $_documentContainer = document.createElement('template');
+$_documentContainer.innerHTML = `<div class="import-var">import-var</div>`;
+document.body.appendChild($_documentContainer.content);
+</script>
+
+ <script type="module">
+const $_documentContainer = document.createElement('template');
+$_documentContainer.innerHTML = `<x-bar></x-bar>`;
+document.body.appendChild($_documentContainer.content);
+</script>
+
+ <script type="module">
+const $_documentContainer = document.createElement('template');
+$_documentContainer.innerHTML = `<x-foo></x-foo>`;
+document.body.appendChild($_documentContainer.content);
+</script>
+
+ <script type="module">
+const $_documentContainer = document.createElement('template');
+$_documentContainer.innerHTML = `<x-red-text></x-red-text>`;
+document.body.appendChild($_documentContainer.content);
+</script>
+
+ <script type="module">
+const $_documentContainer = document.createElement('template');
+$_documentContainer.innerHTML = `<x-blue-bold-text></x-blue-bold-text>`;
+document.body.appendChild($_documentContainer.content);
+</script>
+
+ <script type="module">
+const $_documentContainer = document.createElement('template');
+$_documentContainer.innerHTML = `<parent-variable-with-var></parent-variable-with-var>`;
+document.body.appendChild($_documentContainer.content);
+</script>
+
+ <script type="module">
+const $_documentContainer = document.createElement('template');
+$_documentContainer.innerHTML = `<br>`;
+document.body.appendChild($_documentContainer.content);
+</script><script type="module">
+const $_documentContainer = document.createElement('template');
+$_documentContainer.innerHTML = `<br>`;
+document.body.appendChild($_documentContainer.content);
+</script>
+ <script type="module">
+const $_documentContainer = document.createElement('template');
+$_documentContainer.innerHTML = `<div id="after"></div>`;
+document.body.appendChild($_documentContainer.content);
+</script>
+
+ <script type="module">
+const $_documentContainer = document.createElement('template');
+$_documentContainer.innerHTML = `<div class="foo"></div>`;
+document.body.appendChild($_documentContainer.content);
+</script>
+
+ <script type="module">
+const $_documentContainer = document.createElement('template');
+$_documentContainer.innerHTML = `<div class="foo--bar"></div>`;
+document.body.appendChild($_documentContainer.content);
+</script>
+
+ <script type="module">
+const $_documentContainer = document.createElement('template');
+
+$_documentContainer.innerHTML = `<dom-module id="x-baz">
+ <template>
+ <style>
+ :host {
+ display: block;
+ }
+ </style>
+ <div id="me">x-baz</div>
+ </template>
+ </dom-module>`;
+
+document.body.appendChild($_documentContainer.content);
+</script>
+
+ <script type="module">
+const $_documentContainer = document.createElement('template');
+
+$_documentContainer.innerHTML = `<dom-module id="x-bar">
+ <template>
+ <style>
+ :host {
+ display: block;
+ }
+ </style>
+ <div>x-bar</div>
+ <x-baz id="baz"></x-baz>
+ </template>
+ </dom-module>`;
+
+document.body.appendChild($_documentContainer.content);
+</script>
+
+ <script type="module">
+const $_documentContainer = document.createElement('template');
+
+$_documentContainer.innerHTML = `<dom-module id="x-foo">
+ <template>
+ <style>
+ :host {
+ display: block;
+ border: solid tomato;
+ border-width: var(--special);
+ }
+
+ div {
+ @apply --bag;
+ }
+
+ #more {
+ border: var(--x-foo-more);
+ }
+ </style>
+ <div id="me">x-foo</div>
+ <x-bar id="bar1"></x-bar>
+ <x-bar id="bar2"></x-bar>
+ <x-bar id="bar3"></x-bar>
+ <div id="more">deep</div>
+ </template>
+ </dom-module>`;
+
+document.body.appendChild($_documentContainer.content);
+</script>
+
+ <script type="module">
+const $_documentContainer = document.createElement('template');
+
+$_documentContainer.innerHTML = `<dom-module id="x-red-text">
+ <template>
+ <style>
+ :host {
+ @apply --red-text;
+ }
+ </style>
+ x-red-text
+ </template>
+ </dom-module>`;
+
+document.body.appendChild($_documentContainer.content);
+</script>
+
+ <script type="module">
+const $_documentContainer = document.createElement('template');
+
+$_documentContainer.innerHTML = `<dom-module id="x-blue-bold-text">
+ <template>
+ <style>
+ :host {@apply --blue-text;@apply --bold-text;}
+ </style>
+ x-blue-bold-text
+ </template>
+ </dom-module>`;
+
+document.body.appendChild($_documentContainer.content);
+</script>
+
+ <script type="module">
+const $_documentContainer = document.createElement('template');
+
+$_documentContainer.innerHTML = `<dom-module id="parent-variable-with-var">
+ <template>
+ <style>
+ child-variable-with-var {
+ --variable-property-own-line: 1px;
+ --variable-property-preceded-property: 2px;
+ --variable-property-before-property: yellow;
+ --variable-property-after-property: 3px;
+ --variable-property-after-assignment: 4px;
+ --variable-property-before-assignment: 5px;
+ --variable-into-first-variable: 9px;
+ --variable-into-second-variable: 10px;
+ --variable-into-third-variable: 11px;
+ }
+ </style>
+ <child-variable-with-var id="child"></child-variable-with-var>
+ </template>
+ </dom-module>`;
+
+document.body.appendChild($_documentContainer.content);
+</script>
+
+ <script type="module">
+const $_documentContainer = document.createElement('template');
+
+$_documentContainer.innerHTML = `<dom-module id="child-variable-with-var">
+ <template>
+ <style>
+ child-of-child-with-var {
+ /* in certain browsers (e.g. Safari) \`top\`, \`bottom\`, \`left\`, \`right\` don't compute
+ when no explicit position is defined (\`relative\` / \`absolute\` / \`fixed\`) */
+ position: relative;
+ --variable-own-line: "Varela font";
+ margin-top: var(--variable-property-own-line);
+ margin-bottom: var(--variable-property-preceded-property);
+ --variable-between-properties: 6px;
+ background-color: var(--variable-property-before-property); padding-top: var(--variable-property-after-property);
+ --variable-assignment-before-property: 7px; padding-bottom: var(--variable-property-after-assignment);
+ padding-left: var(--variable-property-before-assignment);--variable-assignment-after-property: 8px;
+ top: 12px;--variable-from-other-variable: var(--variable-into-first-variable);--variable-from-another-variable: var(--variable-into-second-variable); --variable-from-last-variable: var(--variable-into-third-variable);
+ height: 20px;
+ }
+ </style>
+ <child-of-child-with-var id="child"></child-of-child-with-var>
+ </template>
+ </dom-module>`;
+
+document.body.appendChild($_documentContainer.content);
+</script>
+
+ <script type="module">
+const $_documentContainer = document.createElement('template');
+
+$_documentContainer.innerHTML = `<dom-module id="child-of-child-with-var">
+ <template>
+ <style>
+ :host {
+ font-family: var(--variable-own-line);
+ padding-right: var(--variable-between-properties);
+ margin-left: var(--variable-assignment-before-property);
+ margin-right: var(--variable-assignment-after-property);
+ bottom: var(--variable-from-other-variable);
+ left: var(--variable-from-another-variable);
+ right: var(--variable-from-last-variable);
+ }
+ </style>
+ Text
+ </template>
+ </dom-module>`;
+
+document.body.appendChild($_documentContainer.content);
+</script>
+
+ <script type="module">
+import './custom-style-import.js';
+import { Polymer } from '../../lib/legacy/polymer-fn.js';
+Polymer({
+ is: 'x-baz'
+});
+
+Polymer({
+ is: 'x-bar'
+});
+
+Polymer({
+ is: 'x-foo'
+});
+
+Polymer({
+ is: 'x-red-text'
+});
+
+Polymer({
+ is: 'x-blue-bold-text'
+});
+</script>
+
+ <script type="module">
+import './custom-style-import.js';
+import { updateStyles } from '../../lib/mixins/element-mixin.js';
+import { Polymer } from '../../lib/legacy/polymer-fn.js';
+
+suite('custom-style', function() {
+
+ var xBar, xFoo, stylesBuilt;
+
+ suiteSetup(function() {
+ xBar = document.querySelector('x-bar');
+ xFoo = document.querySelector('x-foo');
+ });
+
+ test('root styles applied', function() {
+ assertComputed(xBar, '1px');
+ });
+
+ test('root styles have lower bound encapsulation', function() {
+ assertComputed(xFoo.$.bar1, '0px');
+ });
+
+ test('custom properties registered as defaults', function() {
+ var propsToCheck = ['--italic'];
+ if (!window.ShadyCSS || ShadyCSS.nativeCss || stylesBuilt) {
+ var sep = window.ShadyCSS.ApplyShim._separator;
+ propsToCheck.push('--bag' + sep + 'margin', '--bag' + sep + 'border');
+ } else {
+ propsToCheck.push('--bag');
+ }
+ if (!window.ShadyCSS || ShadyCSS.nativeCss) {
+ var cs = getComputedStyle(document.documentElement);
+ propsToCheck.forEach(function(p) {
+ assert.ok(cs.getPropertyValue(p));
+ });
+ } else {
+ propsToCheck.forEach(function(p) {
+ assert.ok(ShadyCSS.ScopingShim.getComputedStyleValue(document.documentElement, p));
+ });
+ }
+ });
+
+ test('custom properties with space before semicolon', function() {
+ var red = document.querySelector('x-red-text');
+ assertComputed(red, 'rgb(255, 0, 0)', 'color');
+ });
+
+ test('custom properties in minified css', function() {
+ var blue = document.querySelector('x-blue-bold-text');
+ assertComputed(blue, 'rgb(0, 0, 255)', 'color');
+
+ var computed = getComputedStyle(blue);
+ // Firefox returns `700`, while Chrome returns original `bold`
+ assert.ok(computed.fontWeight == '700' || computed.fontWeight == 'bold', 'computed style incorrect for fontWeight');
+ });
+
+ test('custom-styles apply normal and property values to main document', function() {
+ var bag = document.querySelector('.bag');
+ var italic = document.querySelector('.italic');
+ assertComputed(bag, '1px');
+ assertComputed(italic, 'italic', 'font-style');
+ });
+
+ test('imported custom-styles apply', function() {
+ if (stylesBuilt && window.ShadyCSS && !ShadyCSS.nativeCss) {
+ // css build will test this by using vulcanize.
+ // this inlines the custom-style after the consumption point, and changes the timing for custom property shim
+ // Force an update style for this weird corner case in the tests
+ updateStyles();
+ }
+ var v = document.querySelector('.import-var');
+ var m = document.querySelector('.import-mixin');
+ assertComputed(v, '3px');
+ assertComputed(m, '4px');
+ });
+
+ test('dynamic custom-styles apply', function() {
+ var dynamic = document.querySelector('.dynamic');
+ assertComputed(dynamic, '0px');
+ var cs = document.createElement('custom-style');
+ var s = document.createElement('style');
+ s.textContent = ':root { --dynamic: 11px solid orange; }';
+ cs.appendChild(s);
+ document.body.appendChild(cs);
+ updateStyles();
+ assertComputed(dynamic, '11px');
+ });
+
+ test('custom-styles apply normal and property values to elements and cannot be late bound via inheritance', function() {
+ var e = document.querySelector('x-foo').$.me;
+ assertComputed(e, '1px');
+ });
+
+ test('custom-styles apply to pseudo elements', function() {
+ var e = document.querySelector('#after');
+ assertComputed(e, '11px', null, '::after');
+ });
+
+ test('style paths in included dom-modules loaded in import', function() {
+ var foo = document.querySelector('.foo');
+ var url = getComputedStyle(foo).backgroundImage;
+ assert.include(url, 'sub/google.png');
+ });
+
+ test('style paths can have arbitrary whitespace', function() {
+ var foo = document.querySelector('.foo');
+ assertComputed(foo, '4px', 'width');
+ });
+
+ test('imperative custom style', function() {
+ var cs = document.createElement('custom-style');
+ var style = document.createElement('style');
+ style.textContent = '.zonk { border: 13px solid tomato;}';
+ cs.appendChild(style);
+ var d = document.createElement('div');
+ d.classList.add('zonk');
+ document.body.appendChild(d);
+ document.body.appendChild(cs);
+ updateStyles();
+ if (window.ShadyDOM) {
+ assert.ok(style.textContent.match(':not'));
+ }
+ assertComputed(d, '13px');
+ document.body.removeChild(d);
+ document.body.removeChild(cs);
+
+ });
+
+ test('imperative custom style with include', function() {
+ var cs = document.createElement('custom-style');
+ var style = document.createElement('style');
+ style.setAttribute('include', 'shared-style2');
+ cs.appendChild(style);
+ var d = document.createElement('div');
+ d.classList.add('zazz');
+ document.body.appendChild(d);
+ document.body.appendChild(cs);
+ updateStyles();
+ assertComputed(d, '16px');
+ document.body.removeChild(d);
+ document.body.removeChild(cs);
+ });
+
+ test('imperative custom style with non-existent include', function() {
+ var s1 = document.createElement('custom-style');
+ var style = document.createElement('style');
+ s1.appendChild(style);
+ style.setAttribute('include', 'does-not-exist');
+ style.textContent = '.ziz { border: 14px solid tomato;}';
+ var d = document.createElement('div');
+ d.classList.add('ziz');
+ document.body.appendChild(d);
+ document.body.appendChild(s1);
+ updateStyles();
+ assertComputed(d, '14px');
+ document.body.removeChild(d);
+ document.body.removeChild(s1);
+ });
+
+ test('include style data applied before textContent', function() {
+ var d = document.createElement('div');
+ d.classList.add('zazz');
+ document.body.appendChild(d);
+ assertComputed(d, '20px');
+ document.body.removeChild(d);
+ });
+
+ test('variable name with assignment including var correctly applied', function() {
+ Polymer({
+ is: 'parent-variable-with-var'
+ });
+ Polymer({
+ is: 'child-variable-with-var'
+ });
+ Polymer({
+ is: 'child-of-child-with-var'
+ });
+
+ var d = document.querySelector('parent-variable-with-var');
+ var el = d.$.child.$.child;
+ assertComputed(el, '1px', 'margin-top');
+ assertComputed(el, '2px', 'margin-bottom');
+ assertComputed(el, '3px', 'padding-top');
+ assertComputed(el, '4px', 'padding-bottom');
+ assertComputed(el, '5px', 'padding-left');
+ assertComputed(el, '6px', 'padding-right');
+ assertComputed(el, '7px', 'margin-left');
+ assertComputed(el, '8px', 'margin-right');
+ assertComputed(el, 'rgb(255, 255, 0)', 'background-color');
+ assertComputed(el, '9px', 'bottom');
+ assertComputed(el, '10px', 'left');
+ assertComputed(el, '11px', 'right');
+ assertComputed(el, '12px', 'top');
+
+ // Avoid Edge bug with CSS Custom Properties and Fonts.
+ if (navigator.userAgent.match('Edge') && (!window.ShadyCSS || window.ShadyCSS.nativeCss)) {
+ return;
+ }
+
+ // Because FireFox and Chrome parse font-family differently...
+ var computed = getComputedStyle(el);
+ assert.equal(computed['font-family'].replace(/['"]+/g, ''), 'Varela font');
+ });
+
+ test('BEM-like CSS selectors under media queries', function() {
+ assertComputed(document.querySelector('.foo--bar'), '20px');
+ });
+
+});
+
+
+function assertComputed(element, value, property, pseudo) {
+ var computed = getComputedStyle(element, pseudo);
+ property = property || 'border-top-width';
+ assert.equal(computed[property], value, 'computed style incorrect for ' + property);
+}
+</script>
+
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/debounce.html b/third_party/polymer3/bower_components/polymer/test/unit/debounce.html
new file mode 100644
index 0000000..ece33b9
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/debounce.html
@@ -0,0 +1,215 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+</head>
+<body>
+ <test-fixture id="basic">
+ <template>
+ <x-basic></x-basic>
+ </template>
+ </test-fixture>
+
+ <test-fixture id="another">
+ <template>
+ <x-basic></x-basic>
+ </template>
+ </test-fixture>
+
+<script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+import { Debouncer } from '../../lib/utils/debounce.js';
+import { microTask, timeOut, animationFrame, idlePeriod } from '../../lib/utils/async.js';
+Polymer({is: 'x-basic'});
+
+suite('debounce', function() {
+ var element;
+
+ setup(function() {
+ element = fixture('basic');
+ });
+
+ test('debounce (no-wait)', function(done) {
+ var called = 0;
+ var callback = function() {
+ called++;
+ };
+
+ element.debounce('job', callback);
+ element.debounce('job', callback);
+ element.debounce('job', callback);
+
+ setTimeout(function() {
+ assert.equal(called, 1, 'debounce should be called exactly once');
+ done();
+ }, 50);
+ });
+
+ test('debounce (wait)', function(done) {
+ var called = 0;
+ var now = Date.now();
+ var callback = function() {
+ called++;
+ };
+
+ element.debounce('job', callback);
+ element.debounce('job', callback, 100);
+ element.debounce('job', callback, 100);
+
+ setTimeout(function() {
+ assert.equal(called, 1, 'debounce should be called exactly once');
+ assert(Date.now() - now > 100, 'debounce should be called after at least 100ms');
+ done();
+ }, 200);
+ });
+
+ suite('debounce does not carry across multiple elements', function() {
+ var element1, element2;
+
+ setup(function() {
+ element1 = fixture('basic');
+ element2 = fixture('another');
+ });
+
+ test('debounce (no-wait)', function(done) {
+ var called = 0;
+ var callback = function() {
+ called++;
+ };
+
+ element1.debounce('job', callback);
+ element2.debounce('job', callback);
+ element1.debounce('job', callback);
+ element2.debounce('job', callback);
+
+ setTimeout(function() {
+ assert.equal(called, 2, 'debounce should be called exactly twice');
+ done();
+ }, 50);
+ });
+ });
+
+ suite('Polymer.Debouncer.debounce', function() {
+ test('same debouncer and multiple micro tasks', function(done) {
+ var callback = sinon.spy();
+ var job = Debouncer.debounce(null, microTask, callback);
+ Debouncer.debounce(job, microTask, callback);
+
+ setTimeout(function() {
+ assert.isTrue(callback.calledOnce, 'callback should be called once');
+ done();
+ });
+ });
+
+ test('flush debouncer', function(done) {
+ var callback = sinon.spy();
+ var job = Debouncer.debounce(null, microTask, callback);
+
+ setTimeout(function() {
+ job.flush();
+ assert.isTrue(callback.calledOnce, 'callback should be called once');
+ done();
+ });
+ });
+
+ test('different debouncers and multiple micro tasks', function(done) {
+ var callback = sinon.spy();
+ var job1 = Debouncer.debounce(null, microTask, callback);
+ Debouncer.debounce(job1, microTask, callback);
+ var job2 = Debouncer.debounce(null, microTask, callback);
+ Debouncer.debounce(job2, microTask, callback);
+
+ setTimeout(function() {
+ assert.isTrue(callback.calledTwice, 'callback should be called twice');
+ done();
+ });
+ });
+
+ test('same debouncer and multiple timers', function(done) {
+ var callback = sinon.spy();
+ var job = Debouncer.debounce(null, timeOut.after(10), callback);
+ Debouncer.debounce(job, timeOut.after(10), callback);
+
+ setTimeout(function() {
+ assert.isTrue(callback.calledOnce, 'callback should be called once');
+ done();
+ }, 20);
+ });
+
+ test('different debouncers and multiple timers', function(done) {
+ var callback = sinon.spy();
+ var job1 = Debouncer.debounce(null, timeOut.after(10), callback);
+ Debouncer.debounce(job1, timeOut.after(10), callback);
+ var job2 = Debouncer.debounce(null, timeOut.after(10), callback);
+ Debouncer.debounce(job2, timeOut.after(10), callback);
+
+ setTimeout(function() {
+ assert.isTrue(callback.calledTwice, 'callback should be called twice');
+ done();
+ }, 20);
+ });
+
+ test('same debouncer and multiple animation frames', function(done) {
+ var callback = sinon.spy();
+ var job = Debouncer.debounce(null, animationFrame, callback);
+ Debouncer.debounce(job, animationFrame, callback);
+
+ requestAnimationFrame(function() {
+ assert.isTrue(callback.calledOnce, 'callback should be called once');
+ done();
+ });
+ });
+
+ test('different debouncer and multiple animation frames', function(done) {
+ var callback = sinon.spy();
+ var job1 = Debouncer.debounce(null, animationFrame, callback);
+ Debouncer.debounce(job1, animationFrame, callback);
+ var job2 = Debouncer.debounce(null, animationFrame, callback);
+ Debouncer.debounce(job2, animationFrame, callback);
+
+ requestAnimationFrame(function() {
+ assert.isTrue(callback.calledTwice, 'callback should be called twice');
+ done();
+ });
+ });
+
+ test('same debouncer and multiple idle callbacks', function(done) {
+ var callback = sinon.spy();
+ var job = Debouncer.debounce(null, idlePeriod, callback);
+ Debouncer.debounce(job, idlePeriod, callback);
+ idlePeriod.run(function() {
+ assert.isTrue(callback.calledOnce, 'callback should be called once');
+ done();
+ });
+ });
+
+ test('different debouncer and multiple idle callbacks', function(done) {
+ var callback = sinon.spy();
+ var job1 = Debouncer.debounce(null, idlePeriod, callback);
+ Debouncer.debounce(job1, idlePeriod, callback);
+ var job2 = Debouncer.debounce(null, idlePeriod, callback);
+ Debouncer.debounce(job2, idlePeriod, callback);
+ idlePeriod.run(function() {
+ assert.isTrue(callback.calledTwice, 'callback should be called twice');
+ done();
+ });
+ });
+
+ });
+});
+</script>
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/dir.html b/third_party/polymer3/bower_components/polymer/test/unit/dir.html
new file mode 100644
index 0000000..4d65101
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/dir.html
@@ -0,0 +1,259 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html dir="rtl">
+<head>
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+ <script type="module" src="../../lib/mixins/dir-mixin.js"></script>
+</head>
+<body>
+ <!--
+ Issues
+ 1. regex will process entire string, including comments and properties, not just selectors...
+ 2. complex selectors. not ok... e.g.
+ bad: .special > *:dir(rtl)
+ but ok: .special:dir(rtl) > *
+ 3. multiple selectors per line? ok.
+ -->
+ <dom-module id="x-inner-dir">
+ <template>
+ <style>
+ :host {
+ display: block;
+ height: 20px;
+ color: white;
+ }
+ input, section {
+ border-top-width: 0px;
+ }
+
+ section:dir(rtl), input:dir(rtl) {
+ border: 10px solid rgb(123, 123, 123);
+ }
+
+ .special:dir(rtl) > * {
+ color: rgb(0, 128, 0);
+ }
+ </style>
+ <div>no rtl styling</div>
+ <section>rtl styling</section>
+ <input value="rtl styling">
+ <div class="special">
+ <div>at the right.</div>
+ </div>
+ </template>
+ <script type="module">
+import { DirMixin } from '../../lib/mixins/dir-mixin.js';
+import { PolymerElement } from '../../polymer-element.js';
+class XInnerDir extends DirMixin(PolymerElement) {
+ static get is() {return 'x-inner-dir';}
+}
+customElements.define(XInnerDir.is, XInnerDir);
+</script>
+ </dom-module>
+
+ <dom-module id="x-dir">
+ <template>
+ <style>
+ :host {
+ display: block;
+ background-color: rgb(0, 0, 255);
+ min-height: 100px;
+ width: 100px;
+ }
+ :host(:dir(rtl)) {
+ background-color: rgb(0, 128, 0);
+ }
+ #foo:dir(rtl) {
+ border: 10px solid rgb(255, 0, 0);
+ }
+ .thing:dir(rtl) {
+ border: 10px solid rgb(0, 0, 255);
+ }
+ </style>
+ <div id="foo"></div>
+ <div class="thing"></div>
+ <x-inner-dir></x-inner-dir>
+ </template>
+ <script type="module">
+import { DirMixin } from '../../lib/mixins/dir-mixin.js';
+import { PolymerElement } from '../../polymer-element.js';
+class XDir extends DirMixin(PolymerElement) {
+ static get is() {return 'x-dir';}
+}
+customElements.define(XDir.is, XDir);
+</script>
+ </dom-module>
+
+ <dom-module id="x-dir-legacy">
+ <template>
+ <style>
+ :host {
+ display: block;
+ border: 10px solid black;
+ }
+ :host(:dir(rtl)) {
+ border: 2px dotted blue;
+ }
+ </style>
+ </template>
+ <script type="module">
+import '../../lib/mixins/dir-mixin.js';
+import { Polymer } from '../../lib/legacy/polymer-fn.js';
+Polymer({is: 'x-dir-legacy'});
+</script>
+ </dom-module>
+
+ <test-fixture id="dir">
+ <template>
+ <x-dir></x-dir>
+ </template>
+ </test-fixture>
+
+ <test-fixture id="preset">
+ <template>
+ <x-inner-dir dir="ltr"></x-inner-dir>
+ </template>
+ </test-fixture>
+
+ <test-fixture id="legacy">
+ <template>
+ <x-dir-legacy></x-dir-legacy>
+ </template>
+ </test-fixture>
+
+ <script type="module">
+import '../../lib/mixins/dir-mixin.js';
+import { PolymerElement } from '../../polymer-element.js';
+class OtherElement extends PolymerElement {}
+customElements.define('other-element', OtherElement);
+</script>
+
+ <dom-module id="x-complicated">
+ <template>
+ <style>
+ #direct:dir(rtl) {
+ border: 10px solid black;
+ }
+ :dir(rtl) #indirect {
+ border: 9px solid black;
+ }
+ other-element:dir(rtl) {
+ border: 8px solid black;
+ }
+ #container:dir(rtl) ::slotted(*) {
+ border: 7px solid black;
+ }
+ </style>
+ <div id="direct"></div>
+ <div id="indirect"></div>
+ <other-element id="other"></other-element>
+ <div id="container">
+ <slot></slot>
+ </div>
+ </template>
+ <script type="module">
+import { DirMixin } from '../../lib/mixins/dir-mixin.js';
+import { PolymerElement } from '../../polymer-element.js';
+class XComplicated extends DirMixin(PolymerElement) {
+ static get is() {return 'x-complicated';}
+}
+customElements.define(XComplicated.is, XComplicated);
+</script>
+ </dom-module>
+
+ <test-fixture id="complicated">
+ <template>
+ <x-complicated>
+ <div></div>
+ </x-complicated>
+ </template>
+ </test-fixture>
+
+ <script type="module">
+import '../../lib/mixins/dir-mixin.js';
+function assertComputed(node, expected, property = 'border-top-width') {
+ let actual = getComputedStyle(node).getPropertyValue(property).trim();
+ assert.equal(expected, actual);
+}
+
+suite(':dir', function() {
+ teardown(function() {
+ document.documentElement.setAttribute('dir', 'rtl');
+ });
+
+ test(':dir(rtl) functions when html element dir attr set to rtl', function() {
+ let el = fixture('dir');
+ assertComputed(el, 'rgb(0, 128, 0)', 'background-color');
+ assertComputed(el.shadowRoot.querySelector('#foo'), '10px');
+ assertComputed(el.shadowRoot.querySelector('.thing'), '10px');
+ let inner = el.shadowRoot.querySelector('x-inner-dir');
+ assertComputed(inner.shadowRoot.querySelector('.special > div'), 'rgb(0, 128, 0)', 'color');
+ assertComputed(inner.shadowRoot.querySelector('section'), '10px');
+ assertComputed(inner.shadowRoot.querySelector('input'), '10px');
+ });
+
+ test(':dir reacts to html attribute changing', function(done) {
+ let el = fixture('dir');
+ document.documentElement.setAttribute('dir', 'ltr');
+ requestAnimationFrame(() => {
+ assertComputed(el, 'rgb(0, 0, 255)', 'background-color');
+ assertComputed(el.shadowRoot.querySelector('#foo'), '0px');
+ assertComputed(el.shadowRoot.querySelector('.thing'), '0px');
+ let inner = el.shadowRoot.querySelector('x-inner-dir');
+ assertComputed(inner.shadowRoot.querySelector('.special > div'), 'rgb(255, 255, 255)', 'color');
+ assertComputed(inner.shadowRoot.querySelector('section'), '0px');
+ assertComputed(inner.shadowRoot.querySelector('input'), '0px');
+ done();
+ });
+ });
+
+ test('elements with dir attribute explicitly set will not change', function() {
+ let inner = fixture('preset');
+ assert.equal(document.documentElement.getAttribute('dir'), 'rtl');
+ assertComputed(inner.shadowRoot.querySelector('.special > div'), 'rgb(255, 255, 255)', 'color');
+ assertComputed(inner.shadowRoot.querySelector('section'), '0px');
+ assertComputed(inner.shadowRoot.querySelector('input'), '0px');
+ });
+
+ test('elements will adopt dir status when reconnected', function(done) {
+ let el = fixture('dir');
+ assertComputed(el, 'rgb(0, 128, 0)', 'background-color');
+ let parent = el.parentNode;
+ parent.removeChild(el);
+ document.documentElement.setAttribute('dir', 'ltr');
+ requestAnimationFrame(() => {
+ parent.appendChild(el);
+ requestAnimationFrame(() => {
+ assertComputed(el, 'rgb(0, 0, 255)', 'background-color');
+ done();
+ });
+ });
+ });
+
+ test('legacy elements worth with DirMixin', function() {
+ let el = fixture('legacy');
+ assertComputed(el, '2px');
+ });
+
+ test('complicated setup', function() {
+ let el = fixture('complicated');
+ assertComputed(el.$.direct, '10px');
+ assertComputed(el.$.indirect, '9px');
+ assertComputed(el.$.other, '8px');
+ assertComputed(el.firstElementChild, '7px');
+ });
+});
+</script>
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/disable-upgrade.html b/third_party/polymer3/bower_components/polymer/test/unit/disable-upgrade.html
new file mode 100644
index 0000000..14dae2b
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/disable-upgrade.html
@@ -0,0 +1,274 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html dir="rtl">
+<head>
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+ <script type="module" src="../../lib/mixins/disable-upgrade-mixin.js"></script>
+</head>
+<body>
+
+ <dom-module id="x-disabled">
+ <template>
+ <style>
+ :host {
+ display: block;
+ }
+
+ h2 {
+ letter-spacing: 1em;
+ }
+ </style>
+ <h2 id="element">[[prop]]</h2>
+ </template>
+
+ <script type="module">
+import { DisableUpgradeMixin } from '../../lib/mixins/disable-upgrade-mixin.js';
+import { PolymerElement } from '../../polymer-element.js';
+const Disabled = DisableUpgradeMixin(class extends PolymerElement {
+ static get is() { return 'x-disabled'; }
+ static get properties() {
+ return {
+ prop: {
+ type: String
+ }
+ };
+ }
+ constructor() {
+ super();
+ this.prop = 'enabled!';
+ }
+
+ ready() {
+ super.ready();
+ this.enabled = true;
+ }
+});
+customElements.define(Disabled.is, Disabled);
+</script>
+
+ </dom-module>
+
+ <dom-module id="x-disabled-legacy">
+ <template>
+ <style>
+ :host {
+ display: block;
+ }
+
+ h2 {
+ letter-spacing: 1em;
+ }
+ </style>
+ <h2 id="element">[[prop]]</h2>
+ </template>
+
+ <script type="module">
+import { DisableUpgradeMixin } from '../../lib/mixins/disable-upgrade-mixin.js';
+import { Class as PolymerClass } from '../../lib/legacy/class.js';
+import { Polymer } from '../../lib/legacy/polymer-fn.js';
+
+// enable disable upgrade!
+const origPolymerClass = PolymerClass;
+
+Polymer.Class = function(info) {
+ const ctor = origPolymerClass(info);
+ return DisableUpgradeMixin(ctor);
+};
+
+Polymer({
+ is: 'x-disabled-legacy',
+ properties: {
+ prop: {
+ type: String
+ }
+ },
+ created() {
+ this.hasCreated = true;
+ this.prop = 'enabled!';
+ },
+ ready() {
+ this.enabled = true;
+ }
+});
+
+Polymer({
+ is: 'x-disabled-legacy-reg1',
+ registered() {
+ this.hasRegistered = true;
+ }
+});
+
+Polymer({
+ is: 'x-disabled-legacy-reg2',
+ registered() {
+ this.hasRegistered = true;
+ }
+});
+</script>
+
+ </dom-module>
+
+ <dom-module id="my-element">
+
+ <template>
+ <x-disabled id="enabledEl">Disabled</x-disabled>
+ <x-disabled id="disabledEl" disable-upgrade>Disabled</x-disabled>
+ <x-disabled id="disabledBoundEl" disable-upgrade$="[[upgradeDisabled]]">Disabled</x-disabled>
+ </template>
+
+ <script type="module">
+import '../../lib/mixins/disable-upgrade-mixin.js';
+import { PolymerElement } from '../../polymer-element.js';
+class MyElement extends PolymerElement {
+ static get is() { return 'my-element'; }
+ static get properties() {
+ return {
+ upgradeDisabled: {value: true}
+ };
+ }
+ enable() {
+ this.$.disabledEl.removeAttribute('disable-upgrade');
+ this.upgradeDisabled = false;
+ }
+}
+customElements.define(MyElement.is, MyElement);
+</script>
+
+ </dom-module>
+
+ <dom-module id="my-element-legacy">
+
+ <template>
+ <x-disabled-legacy id="enabledEl">Disabled</x-disabled-legacy>
+ <x-disabled-legacy id="disabledEl" disable-upgrade>Disabled</x-disabled-legacy>
+ <x-disabled-legacy id="disabledBoundEl" disable-upgrade$="[[upgradeDisabled]]">Disabled</x-disabled-legacy>
+ <x-disabled-legacy-reg1 id="disabledRegEl" disable-upgrade>Disabled</x-disabled-legacy-reg1>
+ <x-disabled-legacy-reg2 id="disabledRegBoundEl" disable-upgrade$="[[upgradeDisabled]]">Disabled</x-disabled-legacy-reg2>
+
+ </template>
+
+ <script type="module">
+import '../../lib/mixins/disable-upgrade-mixin.js';
+import { Polymer } from '../../lib/legacy/polymer-fn.js';
+Polymer({
+ is: 'my-element-legacy',
+ properties: {
+ upgradeDisabled: { type: String, value: true }
+ },
+ enable() {
+ this.$.disabledEl.removeAttribute('disable-upgrade');
+ this.$.disabledRegEl.removeAttribute('disable-upgrade');
+ this.upgradeDisabled = false;
+ }
+});
+</script>
+
+ </dom-module>
+
+ <script type="module">
+import '../../lib/mixins/disable-upgrade-mixin.js';
+suite('disable-upgrade', function() {
+ let el;
+
+ setup(() => {
+ el = document.createElement('my-element');
+ document.body.appendChild(el);
+ });
+ teardown(function() {
+ document.body.removeChild(el);
+ });
+
+ test('elements upgrade as expected with and without `disable-upgrade`', function() {
+ assert.ok(el.$.enabledEl.enabled);
+ assert.ok(el.$.enabledEl.$.element);
+ assert.equal(el.$.enabledEl.$.element.textContent, 'enabled!');
+ assert.notOk(el.$.disabledEl.enabled);
+ assert.notOk(el.$.disabledEl.$);
+ assert.notOk(el.$.disabledBoundEl.enabled);
+ assert.notOk(el.$.disabledBoundEl.$);
+ });
+
+ test('elements upgrade when `disable-upgrade` removed', function() {
+ assert.notOk(el.$.disabledEl.enabled);
+ assert.notOk(el.$.disabledEl.$);
+ assert.notOk(el.$.disabledBoundEl.enabled);
+ assert.notOk(el.$.disabledBoundEl.$);
+ el.enable();
+ assert.ok(el.$.disabledEl.enabled);
+ assert.ok(el.$.disabledEl.$.element);
+ assert.equal(el.$.disabledEl.$.element.textContent, 'enabled!');
+ assert.ok(el.$.disabledBoundEl.enabled);
+ assert.ok(el.$.disabledBoundEl.$.element);
+ assert.equal(el.$.disabledBoundEl.$.element.textContent, 'enabled!');
+ });
+
+
+});
+
+suite('disable-upgrade-legacy', function() {
+ let el;
+
+ setup(() => {
+ el = document.createElement('my-element-legacy');
+ document.body.appendChild(el);
+ });
+ teardown(function() {
+ document.body.removeChild(el);
+ });
+
+ test('elements call `registered` as expected with `disable-upgrade`', function() {
+ assert.notOk(el.$.disabledRegEl.hasRegistered);
+ assert.notOk(el.$.disabledRegBoundEl.hasRegistered);
+ el.enable();
+ assert.ok(el.$.disabledRegEl.hasRegistered);
+ assert.ok(el.$.disabledRegBoundEl.hasRegistered);
+ });
+
+
+ test('elements upgrade as expected with and without `disable-upgrade`', function() {
+ assert.ok(el.$.enabledEl.hasCreated);
+ assert.ok(el.$.enabledEl.enabled);
+ assert.ok(el.$.enabledEl.$.element);
+ assert.equal(el.$.enabledEl.$.element.textContent, 'enabled!');
+ assert.notOk(el.$.disabledEl.hasCreated);
+ assert.notOk(el.$.disabledEl.enabled);
+ assert.notOk(el.$.disabledEl.$);
+ assert.notOk(el.$.disabledBoundEl.hasCreated);
+ assert.notOk(el.$.disabledBoundEl.enabled);
+ assert.notOk(el.$.disabledBoundEl.$);
+ });
+
+ test('elements upgrade when `disable-upgrade` removed', function() {
+ assert.notOk(el.$.disabledEl.hasCreated);
+ assert.notOk(el.$.disabledEl.enabled);
+ assert.notOk(el.$.disabledEl.$);
+ assert.notOk(el.$.disabledBoundEl.hasCreated);
+ assert.notOk(el.$.disabledBoundEl.enabled);
+ assert.notOk(el.$.disabledBoundEl.$);
+ el.enable();
+ assert.ok(el.$.disabledEl.hasCreated);
+ assert.ok(el.$.disabledEl.enabled);
+ assert.ok(el.$.disabledEl.$.element);
+ assert.equal(el.$.disabledEl.$.element.textContent, 'enabled!');
+ assert.ok(el.$.disabledBoundEl.hasCreated);
+ assert.ok(el.$.disabledBoundEl.enabled);
+ assert.ok(el.$.disabledBoundEl.$.element);
+ assert.equal(el.$.disabledBoundEl.$.element.textContent, 'enabled!');
+ });
+
+
+});
+</script>
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/dom-bind-elements1.js b/third_party/polymer3/bower_components/polymer/test/unit/dom-bind-elements1.js
new file mode 100644
index 0000000..bbb908b
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/dom-bind-elements1.js
@@ -0,0 +1,65 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import { Polymer } from '../../lib/legacy/polymer-fn.js';
+
+import { html } from '../../lib/utils/html-tag.js';
+Polymer({
+ is: 'x-basic',
+ properties: {
+ notifyingvalue: {
+ notify: true
+ }
+ }
+});
+Polymer({
+ _template: html`
+<div id="container"><slot id="slot"></slot></div>
+`,
+
+ is: 'x-content'
+});
+Polymer({
+ _template: html`
+<x-content id="local"></x-content>
+`,
+
+ is: 'x-attach-dom-bind',
+
+ attached: function() {
+ var domBind = document.createElement('dom-bind');
+ var template = document.createElement('template');
+
+ domBind.appendChild(template);
+
+ var span = document.createElement('span');
+ span.innerHTML = '{{hello}}';
+
+ template.content.appendChild(span);
+ domBind.hello = 'hey';
+
+ this.$.local.appendChild(domBind);
+ }
+});
+Polymer({
+ _template: html`
+<x-content id="local"></x-content>
+`,
+
+ is: 'x-compose'
+});
+Polymer({
+ is: 'x-produce-a',
+ properties: {
+ bindToText: {
+ notify: true,
+ value: 'this text is bound'
+ }
+ }
+});
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/dom-bind-elements2.js b/third_party/polymer3/bower_components/polymer/test/unit/dom-bind-elements2.js
new file mode 100644
index 0000000..4993e8c
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/dom-bind-elements2.js
@@ -0,0 +1,20 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import { Polymer } from '../../lib/legacy/polymer-fn.js';
+
+Polymer({
+ is: 'x-needs-host',
+ attached: function() {
+ if (!this.__dataHost) {
+ throw "No dataHost at ready time";
+ }
+ this.config = this.__dataHost.getAttribute('config');
+ }
+});
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/dom-bind.html b/third_party/polymer3/bower_components/polymer/test/unit/dom-bind.html
new file mode 100644
index 0000000..3b4a438
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/dom-bind.html
@@ -0,0 +1,283 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+</head>
+<body>
+
+ <dom-bind id="earlyDomBind">
+ <template>
+ <div id="earlyBoundChild">{{value}}</div>
+ </template>
+ </dom-bind>
+
+ <script type="module">
+import './dom-bind-elements1.js';
+import './dom-bind-elements2.js';
+/* global earlyDomBind */
+earlyDomBind.value = 'hi!';
+</script>
+
+ <script type="module" src="../../polymer-legacy.js"></script>
+ <script type="module" src="./dom-bind-elements1.js"></script>
+
+ <dom-bind id="declarativeDomBind">
+ <template>
+ <x-basic id="declaredXBasic1" value="{{value}}" notifyingvalue="{{nvalue}}" on-custom="handleEvent" on-tap="handleTap" computed="{{compute(dep)}}"></x-basic>
+ <x-basic id="declaredXBasic2" value="{{value}}" notifyingvalue="{{nvalue}}"></x-basic>
+ <x-produce-a bind-to-text={{boundText}}></x-produce-a>
+ <div id="boundTextDiv">{{boundText}}</div>
+ </template>
+ </dom-bind>
+
+ <div id="container">
+ </div>
+
+ <dom-bind id="timingDomBind" config="config">
+ <template>
+ <x-needs-host id="needsHost"></x-needs-host>
+ </template>
+ </dom-bind>
+
+ <script type="module">
+import './dom-bind-elements1.js';
+import './dom-bind-elements2.js';
+</script>
+
+ <div id="nonUpgrade">
+ <dom-bind>
+ <template>stamped</template>
+ </dom-bind>
+ </div>
+
+ <script type="module">
+import './dom-bind-elements1.js';
+import './dom-bind-elements2.js';
+import { DomBind } from '../../lib/elements/dom-bind.js';
+import { flush } from '../../lib/utils/flush.js';
+
+suite('Polymer.DomBind class', function() {
+ test('is available', function() {
+ assert.isDefined(DomBind);
+ assert.equal(typeof DomBind, 'function');
+ });
+});
+
+suite('dom-bind touched before upgrade', function() {
+ test('value binds top-down', function() {
+ /* global earlyBoundChild*/
+ assert.equal(earlyBoundChild.textContent, 'hi!');
+ });
+});
+
+suite('declarative dom-bind', function() {
+
+ var domBind;
+ var el1;
+ var el2;
+
+ setup(function() {
+ /* global declarativeDomBind declaredXBasic1 declaredXBasic2 */
+ domBind = declarativeDomBind;
+ el1 = declaredXBasic1;
+ el2 = declaredXBasic2;
+ });
+
+ test('value binds top-down', function() {
+ domBind.value = 'foo';
+ assert.equal(el1.value, 'foo');
+ assert.equal(el2.value, 'foo');
+ });
+
+ test('notifyingvalue binds from child to child', function() {
+ el1.notifyingvalue = 'bar';
+ assert.equal(domBind.nvalue, 'bar');
+ assert.equal(el2.notifyingvalue, 'bar');
+ });
+
+ test('event listener fires', function() {
+ domBind.handleEvent = sinon.spy();
+ el1.fire('custom');
+ assert.equal(domBind.handleEvent.callCount, 1);
+ });
+
+ test('gesture event listener fires', function() {
+ domBind.handleTap = sinon.spy();
+ el1.click();
+ assert.equal(domBind.handleTap.callCount, 1);
+ });
+
+ test('inline function runs', function() {
+ domBind.compute = function(val) {
+ return val * 10;
+ };
+ domBind.dep = 5;
+ assert.equal(el1.computed, 50);
+ });
+
+ test('initial value notifies to dom-bind', function() {
+ assert.equal(domBind.boundText, 'this text is bound');
+ /* global boundTextDiv */
+ assert.equal(boundTextDiv.textContent, 'this text is bound');
+ });
+
+});
+
+suite('imperative dom-bind', function() {
+ var domBind;
+ var el1;
+ var el2;
+
+ setup(function() {
+ domBind = document.createElement('dom-bind');
+ var template = document.createElement('template');
+
+ domBind.appendChild(template);
+
+ var doc = template.content.ownerDocument;
+ el1 = doc.createElement('x-basic');
+
+ el1.setAttribute('id', 'impEl1');
+ el1.setAttribute('value', '{{value}}');
+ el1.setAttribute('notifyingvalue', '{{nvalue}}');
+ el1.setAttribute('on-custom', 'handleEvent');
+ el1.setAttribute('on-tap', 'handleTap');
+ el1.setAttribute('computed', '{{compute(dep)}}');
+
+ el2 = doc.createElement('x-basic');
+ el2.setAttribute('id', 'impEl2');
+ el2.setAttribute('value', '{{value}}');
+ el2.setAttribute('notifyingvalue', '{{nvalue}}');
+
+ template.content.appendChild(el1);
+ template.content.appendChild(el2);
+ document.body.appendChild(domBind);
+
+
+ el1 = domBind.$.impEl1;
+ el2 = domBind.$.impEl2;
+ });
+
+ teardown(function() {
+ if (domBind.parentElement) {
+ domBind.parentElement.removeChild(domBind);
+ }
+ });
+
+ test('value binds top-down', function() {
+ domBind.value = 'foo';
+ assert.equal(el1.value, 'foo');
+ assert.equal(el2.value, 'foo');
+ });
+
+ test('notifyingvalue binds from child to child', function() {
+ el1.notifyingvalue = 'bar';
+ assert.equal(domBind.nvalue, 'bar');
+ assert.equal(el2.notifyingvalue, 'bar');
+ });
+
+ test('event listener fires', function() {
+ domBind.handleEvent = sinon.spy();
+ el1.fire('custom');
+ assert.equal(domBind.handleEvent.callCount, 1);
+ });
+
+ test('gesture event listener fires', function() {
+ domBind.handleTap = sinon.spy();
+ el1.click();
+ assert.equal(domBind.handleTap.callCount, 1);
+ });
+
+ test('inline function runs', function() {
+ domBind.compute = function(val) {
+ return val * 10;
+ };
+ domBind.dep = 5;
+ assert.equal(el1.computed, 50);
+ });
+
+ test('move dom-bind', function( ) {
+ /* global container */
+ container.appendChild(domBind);
+
+ assert.equal(container.firstElementChild, el1);
+ assert.equal(container.firstElementChild.nextElementSibling, el2);
+ });
+
+ test('remove dom-bind', function() {
+ assert(document.body.contains(el1));
+ assert(document.body.contains(el2));
+
+ domBind.parentElement.removeChild(domBind);
+
+ assert(!document.body.contains(el1));
+ assert(!document.body.contains(el2));
+ });
+
+ test('dom-bind distributed when inserted in element attached',
+ function() {
+ var el = document.createElement('x-attach-dom-bind');
+ document.body.appendChild(el);
+
+ // Flush CE & distribution
+ flush();
+
+ assert.equal(el.$.local.$.slot.assignedNodes()[0].textContent, 'hey',
+ 'dom-bind did not distribute');
+ document.body.removeChild(el);
+ });
+
+ test('dom-bind distributed when inserted dynamically', function() {
+ var composeEl = document.createElement('x-compose');
+ document.body.appendChild(composeEl);
+
+ var dynamicDomBind = document.createElement('dom-bind');
+ var dynamicTemplate = document.createElement('template');
+
+ dynamicDomBind.appendChild(dynamicTemplate);
+
+ var span = document.createElement('span');
+ span.innerHTML = '{{hello}}';
+
+ dynamicTemplate.content.appendChild(span);
+ dynamicDomBind.hello = 'hey';
+ composeEl.$.local.appendChild(dynamicDomBind);
+
+ // Flush CE & distribution
+ flush();
+
+ assert.equal(composeEl.$.local.$.slot.assignedNodes()[0].textContent, 'hey',
+ 'dom-bind did not distribute');
+ document.body.removeChild(composeEl);
+ });
+
+});
+/* global needsHost nonUpgrade */
+suite('timing', function() {
+
+ test('late-loaded import should block stamping', function() {
+ assert.equal(needsHost.config, 'config');
+ });
+
+ test('non-upgrade case finds template', function() {
+ assert.equal(nonUpgrade.textContent.trim(), 'stamped');
+ });
+
+});
+</script>
+
+ <script type="module" src="./dom-bind-elements2.js"></script>
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/dom-if-elements.js b/third_party/polymer3/bower_components/polymer/test/unit/dom-if-elements.js
new file mode 100644
index 0000000..5f85154
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/dom-if-elements.js
@@ -0,0 +1,329 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import { Polymer } from '../../lib/legacy/polymer-fn.js';
+
+import { html } from '../../lib/utils/html-tag.js';
+Polymer({
+ _template: html`
+ <x-bar id="bar" prop="{{prop}}" item-prop="{{item.prop}}">
+ </x-bar>
+`,
+
+ is: 'x-foo',
+
+ properties: {
+ prop: {
+ notify: true
+ },
+ itemProp: {
+ notify: true
+ }
+ }
+});
+Polymer({
+ is: 'x-bar',
+ properties: {
+ prop: {
+ notify: true
+ },
+ itemProp: {
+ notify: true
+ }
+ }
+});
+Polymer({
+ _template: html`
+ <template is="dom-if" id="if-1" if="{{shouldStamp}}" on-dom-change="domUpdateHandler">
+ <!-- Comments should be good -->
+ <x-foo on-test1="testHandler1" prop="{{prop}}" item-prop="{{item.prop}}">
+ </x-foo>
+ <template is="dom-if" id="if-2" if="{{shouldStamp}}">
+ <!-- Comments should be good -->
+ <x-foo on-test2="testHandler2" prop="{{prop}}" item-prop="{{item.prop}}">
+ </x-foo>
+ <template is="dom-if" id="if-3" if="{{shouldStamp}}">
+ <!-- Comments should be good -->
+ <x-foo on-test3="testHandler3" prop="{{prop}}" item-prop="{{item.prop}}">
+ </x-foo>
+ </template>
+ </template>
+ </template>
+`,
+
+ is: 'x-nested-if',
+ testHandler1Count: 0,
+ testHandler2Count: 0,
+ testHandler3Count: 0,
+ domUpdateHandlerCount: 0,
+
+ testHandler1: function() {
+ this.testHandler1Count++;
+ },
+
+ testHandler2: function() {
+ this.testHandler2Count++;
+ },
+
+ testHandler3: function() {
+ this.testHandler3Count++;
+ },
+
+ render: function() {
+ this.$['if-1'].render();
+ },
+
+ domUpdateHandler: function() {
+ this.domUpdateHandlerCount++;
+ }
+});
+Polymer({
+ _template: html`
+ <template is="dom-if" id="if-1" if="{{shouldStamp}}">
+ <!-- Comments should be good -->
+ <x-foo prop="{{prop}}" item-prop="{{item.prop}}">
+ </x-foo>
+ <template is="dom-if" id="if-2" if="{{shouldStamp}}">
+ <!-- Comments should be good -->
+ <x-foo prop="{{prop}}" item-prop="{{item.prop}}">
+ </x-foo>
+ <template is="dom-if" id="if-3" if="{{shouldStamp}}">
+ <!-- Comments should be good -->
+ <x-foo prop="{{prop}}" item-prop="{{item.prop}}">
+ </x-foo>
+ </template>
+ </template>
+ </template>
+`,
+
+ is: 'x-nested-if-configured',
+
+ properties: {
+ shouldStamp: {
+ value: true
+ },
+ prop: {
+ value: 'outer'
+ },
+ item: {
+ value: function() { return {prop: 'outerItem'}; }
+ }
+ },
+
+ render: function() {
+ this.$['if-1'].render();
+ }
+});
+Polymer({
+ _template: html`
+ <template is="dom-if" id="if-1" if="{{shouldStamp1}}">
+ <x-foo prop="{{prop1}}"></x-foo>
+ <template is="dom-if" id="if-2" if="{{shouldStamp2}}">
+ <x-foo prop="{{prop2}}"></x-foo>
+ <template is="dom-if" id="if-3" if="{{shouldStamp3}}">
+ <x-foo prop="{{prop3}}"></x-foo>
+ </template>
+ </template>
+ </template>
+`,
+
+ is: 'x-nested-if-individual',
+
+ properties: {
+ prop1: {
+ value: 'prop1'
+ },
+ prop2: {
+ value: 'prop2'
+ },
+ prop3: {
+ value: 'prop3'
+ },
+ item: {
+ value: function() { return {prop: 'outerItem'}; }
+ }
+ },
+
+ render: function() {
+ this.$['if-1'].render();
+ }
+});
+Polymer({
+ _template: html`
+ <template id="domIf" is="dom-if" if="">
+ <div>1</div>
+ <div>2</div>
+ <div>3</div>
+ {{text}}
+ <div>4</div>
+ </template>
+`,
+
+ is: 'x-textcontent',
+
+ properties: {
+ text: {
+ value: 'Stuff'
+ }
+ }
+});
+Polymer({
+ _template: html`
+ <template id="domIf" is="dom-if" if="">
+ <div class="stuff">stuff</div>
+ <slot id="one" name="one"></slot><template id="innerIf" is="dom-if" if="" restamp="">hi</template>
+ <slot id="two" name="two"></slot>
+ {{text}}
+ <slot id="three" name="three"></slot>
+ </template>
+`,
+
+ is: 'x-slot',
+
+ properties: {
+ text: {
+ value: 'Stuff'
+ }
+ }
+});
+Polymer({
+ _template: html`
+ <template id="domif" is="dom-if" if="">
+ <x-client></x-client>
+ <x-client></x-client>
+ <x-client></x-client>
+ </template>
+`,
+
+ is: 'x-host'
+});
+Polymer({
+ is: 'x-client',
+ statics: {
+ uid: 0
+ },
+ ready: function() {
+ this.uid = this.statics.uid++;
+ }
+});
+Polymer({
+ _template: html`
+ <template is="dom-if" if="{{bool}}" restamp="{{restamp}}">{{guarded(bool)}}</template>
+`,
+
+ is: 'x-guard-prop',
+
+ created: function() {
+ this.guarded = sinon.spy(function(val) {
+ return val;
+ });
+ }
+});
+Polymer({
+ _template: html`
+ <template is="dom-if" if="{{isTrue(bool)}}" restamp="{{restamp}}">{{guarded(bool)}}</template>
+`,
+
+ is: 'x-guard-inline',
+
+ created: function() {
+ this.guarded = sinon.spy(function(val) {
+ return val;
+ });
+ },
+
+ isTrue: function(val) {
+ return val;
+ }
+});
+Polymer({
+ _template: html`
+ <template is="dom-if" if="{{switch}}" restamp="{{restamp}}">{{guarded(bool)}}</template>
+`,
+
+ is: 'x-guard-computed',
+
+ properties: {
+ switch: {
+ computed: 'computeSwitch(bool)'
+ }
+ },
+
+ created: function() {
+ this.guarded = sinon.spy(function(val) {
+ return val;
+ });
+ },
+
+ computeSwitch: function(val) {
+ return val;
+ }
+});
+Polymer({
+ _template: html`
+ <template is="dom-if" if="{{obj.bool}}" restamp="{{restamp}}">{{guarded(obj.bool)}}</template>
+`,
+
+ is: 'x-guard-object',
+
+ created: function() {
+ this.guarded = sinon.spy(function(val) {
+ return val;
+ });
+ }
+});
+Polymer({
+ _template: html`
+ <template is="dom-if" if="{{switch}}" restamp="{{restamp}}">{{guarded(obj.bool)}}</template>
+`,
+
+ is: 'x-guard-object-computed',
+
+ properties: {
+ switch: {
+ computed: 'computeSwitch(obj.bool)'
+ }
+ },
+
+ created: function() {
+ this.guarded = sinon.spy(function(val) {
+ return val;
+ });
+ },
+
+ computeSwitch: function(val) {
+ return val;
+ }
+});
+Polymer({
+ _template: html`
+ <template is="dom-if" if="{{b}}" restamp="{{restamp}}">{{guarded(a)}}</template>
+`,
+
+ is: 'x-guard-separate-props',
+
+ created: function() {
+ this.guarded = sinon.spy(function(val) {
+ return val;
+ });
+ }
+});
+Polymer({
+ _template: html`
+ <template is="dom-if" if="{{obj.b}}" restamp="{{restamp}}">{{guarded(obj.a)}}</template>
+`,
+
+ is: 'x-guard-separate-paths',
+
+ created: function() {
+ this.guarded = sinon.spy(function(val) {
+ return val;
+ });
+ }
+});
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/dom-if.html b/third_party/polymer3/bower_components/polymer/test/unit/dom-if.html
new file mode 100644
index 0000000..bdb1935
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/dom-if.html
@@ -0,0 +1,909 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+ <script type="module" src="./dom-if-elements.js"></script>
+</head>
+<body>
+
+ <x-nested-if-configured id="configured"></x-nested-if-configured>
+
+ <x-nested-if-individual id="individual"></x-nested-if-individual>
+
+ <dom-bind id="unconfigured">
+ <template>
+ <x-nested-if id="unconfigured1"></x-nested-if>
+ <x-nested-if id="unconfigured2"></x-nested-if>
+ </template>
+ </dom-bind>
+
+ <div id="inDocumentContainer">
+ <dom-if id="inDocumentIf">
+ <template>
+ <x-foo
+ prop="{{prop}}"
+ item-prop="{{item.prop}}">
+ </x-foo>
+ <template is="dom-if">
+ <x-foo
+ prop="{{prop}}"
+ item-prop="{{item.prop}}">
+ </x-foo>
+ <template is="dom-if">
+ <x-foo
+ prop="{{prop}}"
+ item-prop="{{item.prop}}">
+ </x-foo>
+ </template>
+ </template>
+ </template>
+ </dom-if>
+ </div>
+
+ <div id="structuredContainer">
+ <dom-bind id="structuredDomBind">
+ <template>
+ <template is="dom-if" id="structuredDomIf" if="{{item.show}}">
+ <div class="showing"></div>
+ </template>
+ </template>
+ </dom-bind>
+ </div>
+
+ <div id="outerContainer">
+ <dom-if id="simple">
+ <template>
+ <x-client></x-client>
+ <x-client></x-client>
+ <x-client></x-client>
+ </template>
+ </dom-if>
+
+ <div id="innerContainer">
+ </div>
+ </div>
+
+ <div id="removalContainer">
+ <dom-if if id="toBeRemoved">
+ <template><div id="shouldBeRemoved"></div></template>
+ </dom-if>
+ </div>
+
+ <script type="module">
+import './dom-if-elements.js';
+</script>
+
+ <div id="nonUpgrade">
+ <dom-if if>
+ <template>stamped</template>
+ </dom-if>
+ </div>
+
+
+ <script type="module">
+import './dom-if-elements.js';
+import { flush } from '../../lib/utils/flush.js';
+/* global configured individual unconfigured1 unconfigured2 inDocumentContainer inDocumentIf structuredContainer structuredDomIf structuredDomBind outerContainer innerContainer shouldBeRemoved toBeRemoved removalContainer nonUpgrade*/
+suite('nested pre-configured dom-if', function() {
+
+ test('parent scope binding', function() {
+ let stamped = configured.shadowRoot.querySelectorAll('*:not(template):not(dom-if):not(span)');
+ assert.equal(stamped.length, 3, 'total stamped count incorrect');
+ assert.equal(stamped[0].prop, 'outer');
+ assert.equal(stamped[0].itemProp, 'outerItem');
+ assert.equal(stamped[1].prop, 'outer');
+ assert.equal(stamped[1].itemProp, 'outerItem');
+ assert.equal(stamped[2].prop, 'outer');
+ assert.equal(stamped[2].itemProp, 'outerItem');
+ });
+
+ test('parent scope downward notification', function() {
+ let stamped = configured.shadowRoot.querySelectorAll('*:not(template):not(dom-if):not(span)');
+ configured.prop = 'yes';
+ assert.equal(stamped[0].prop, 'yes');
+ assert.equal(stamped[1].prop, 'yes');
+ assert.equal(stamped[2].prop, 'yes');
+ configured.set('item.prop', 'yay');
+ assert.equal(stamped[0].itemProp, 'yay');
+ assert.equal(stamped[1].itemProp, 'yay');
+ assert.equal(stamped[2].itemProp, 'yay');
+ });
+
+ test('parent upward upward notification', function() {
+ let stamped = configured.shadowRoot.querySelectorAll('*:not(template):not(dom-if):not(span)');
+ stamped[2].prop = 'nice';
+ assert.equal(configured.prop, 'nice');
+ assert.equal(stamped[0].prop, 'nice');
+ assert.equal(stamped[1].prop, 'nice');
+ assert.equal(stamped[2].prop, 'nice');
+ });
+
+ test('dom-change event composed, bubbles outside dom-if scope', function() {
+ let domChangeFired = 0;
+ let domIf = configured.$['if-1'];
+ configured.addEventListener('dom-change', function() {
+ domChangeFired++;
+ });
+ domIf.if = !domIf.if;
+ domIf.render();
+ domIf.if = !domIf.if;
+ domIf.render();
+ assert.equal(domChangeFired, 2);
+ });
+
+});
+
+suite('nested individually-controlled dom-if', function() {
+
+ test('nothing stamped', function() {
+ let stamped = individual.shadowRoot.querySelectorAll('*:not(template):not(dom-if):not(span)');
+ assert.equal(stamped.length, 0, 'total stamped count incorrect');
+ });
+
+ test('show 1', function() {
+ individual.shouldStamp1 = true;
+ individual.render();
+ let stamped = individual.shadowRoot.querySelectorAll('*:not(template):not(dom-if):not(span)');
+ assert.equal(stamped.length, 1, 'total stamped count incorrect');
+ assert.equal(stamped[0].prop, 'prop1');
+ assert.equal(getComputedStyle(stamped[0]).display, 'inline', 'stamped 1 display wrong');
+ });
+
+ test('show 2', function() {
+ individual.shouldStamp2 = true;
+ individual.render();
+ let stamped = individual.shadowRoot.querySelectorAll('*:not(template):not(dom-if):not(span)');
+ assert.equal(stamped.length, 2, 'total stamped count incorrect');
+ assert.equal(stamped[0].prop, 'prop1');
+ assert.equal(stamped[1].prop, 'prop2');
+ assert.equal(getComputedStyle(stamped[0]).display, 'inline', 'stamped 1 display wrong');
+ assert.equal(getComputedStyle(stamped[1]).display, 'inline', 'stamped 2 display wrong');
+ });
+
+ test('show 3', function() {
+ individual.shouldStamp3 = true;
+ individual.render();
+ let stamped = individual.shadowRoot.querySelectorAll('*:not(template):not(dom-if):not(span)');
+ assert.equal(stamped.length, 3, 'total stamped count incorrect');
+ assert.equal(stamped[0].prop, 'prop1');
+ assert.equal(stamped[1].prop, 'prop2');
+ assert.equal(stamped[2].prop, 'prop3');
+ assert.equal(getComputedStyle(stamped[0]).display, 'inline', 'stamped 1 display wrong');
+ assert.equal(getComputedStyle(stamped[1]).display, 'inline', 'stamped 2 display wrong');
+ assert.equal(getComputedStyle(stamped[2]).display, 'inline', 'stamped 3 display wrong');
+ });
+
+ test('hide 3', function() {
+ individual.shouldStamp3 = false;
+ individual.render();
+ let stamped = individual.shadowRoot.querySelectorAll('*:not(template):not(dom-if):not(span)');
+ assert.equal(stamped.length, 3, 'total stamped count incorrect');
+ assert.equal(getComputedStyle(stamped[0]).display, 'inline', 'stamped 1 display wrong');
+ assert.equal(getComputedStyle(stamped[1]).display, 'inline', 'stamped 2 display wrong');
+ assert.equal(getComputedStyle(stamped[2]).display, 'none', 'stamped 3 display wrong');
+ });
+
+ test('hide 2', function() {
+ individual.shouldStamp2 = false;
+ individual.render();
+ let stamped = individual.shadowRoot.querySelectorAll('*:not(template):not(dom-if):not(span)');
+ assert.equal(stamped.length, 3, 'total stamped count incorrect');
+ assert.equal(getComputedStyle(stamped[0]).display, 'inline', 'stamped 1 display wrong');
+ assert.equal(getComputedStyle(stamped[1]).display, 'none', 'stamped 2 display wrong');
+ assert.equal(getComputedStyle(stamped[2]).display, 'none', 'stamped 3 display wrong');
+ });
+
+ test('hide 1', function() {
+ individual.shouldStamp1 = false;
+ individual.render();
+ let stamped = individual.shadowRoot.querySelectorAll('*:not(template):not(dom-if):not(span)');
+ assert.equal(stamped.length, 3, 'total stamped count incorrect');
+ assert.equal(getComputedStyle(stamped[0]).display, 'none', 'stamped 1 display wrong');
+ assert.equal(getComputedStyle(stamped[1]).display, 'none', 'stamped 2 display wrong');
+ assert.equal(getComputedStyle(stamped[2]).display, 'none', 'stamped 3 display wrong');
+ });
+
+ test('show 1', function() {
+ individual.shouldStamp1 = true;
+ individual.render();
+ let stamped = individual.shadowRoot.querySelectorAll('*:not(template):not(dom-if):not(span)');
+ assert.equal(stamped.length, 3, 'total stamped count incorrect');
+ assert.equal(getComputedStyle(stamped[0]).display, 'inline', 'stamped 1 display wrong');
+ assert.equal(getComputedStyle(stamped[1]).display, 'none', 'stamped 2 display wrong');
+ assert.equal(getComputedStyle(stamped[2]).display, 'none', 'stamped 3 display wrong');
+ });
+
+ test('show 2', function() {
+ individual.shouldStamp2 = true;
+ individual.render();
+ let stamped = individual.shadowRoot.querySelectorAll('*:not(template):not(dom-if):not(span)');
+ assert.equal(stamped.length, 3, 'total stamped count incorrect');
+ assert.equal(getComputedStyle(stamped[0]).display, 'inline', 'stamped 1 display wrong');
+ assert.equal(getComputedStyle(stamped[1]).display, 'inline', 'stamped 2 display wrong');
+ assert.equal(getComputedStyle(stamped[2]).display, 'none', 'stamped 3 display wrong');
+ });
+
+ test('show 3', function() {
+ individual.shouldStamp3 = true;
+ individual.render();
+ let stamped = individual.shadowRoot.querySelectorAll('*:not(template):not(dom-if):not(span)');
+ assert.equal(stamped.length, 3, 'total stamped count incorrect');
+ assert.equal(getComputedStyle(stamped[0]).display, 'inline', 'stamped 1 display wrong');
+ assert.equal(getComputedStyle(stamped[1]).display, 'inline', 'stamped 2 display wrong');
+ assert.equal(getComputedStyle(stamped[2]).display, 'inline', 'stamped 3 display wrong');
+ });
+
+});
+
+suite('nested un-configured dom-if in document', function() {
+
+ test('if=false: nothing rendered', function() {
+ let stamped = inDocumentContainer.querySelectorAll('*:not(template):not(dom-if)');
+ assert.equal(stamped.length, 0, 'total stamped count incorrect');
+ });
+
+ test('if=true: everything rendered and visible', function() {
+ // first dom-if
+ inDocumentIf.if = true;
+ inDocumentIf.render();
+ let stamped = inDocumentContainer.querySelectorAll('*:not(template):not(dom-if):not(span)');
+ assert.equal(stamped.length, 1, 'total stamped count incorrect');
+
+ // second dom-if
+ let xif = inDocumentContainer.querySelector('dom-if');
+ xif.if = true;
+ xif.render();
+ stamped = inDocumentContainer.querySelectorAll('*:not(template):not(dom-if):not(span)');
+ assert.equal(stamped.length, 2, 'total stamped count incorrect');
+
+ // third dom-if
+ xif = inDocumentContainer.querySelector('dom-if');
+ xif.if = true;
+ xif.render();
+ stamped = inDocumentContainer.querySelectorAll('*:not(template):not(dom-if):not(span)');
+ assert.equal(stamped.length, 3, 'total stamped count incorrect');
+
+ stamped = inDocumentContainer.querySelectorAll('*:not(template):not(dom-if)');
+ stamped.forEach(function(n) {
+ assert.equal(getComputedStyle(n).display, 'inline', 'node was hidden but should not have been');
+ });
+ });
+
+ test('if=false, restamp=false: everything hidden', function() {
+ inDocumentIf.if = false;
+ inDocumentIf.render();
+ let stamped = inDocumentContainer.querySelectorAll('*:not(template):not(dom-if):not(span)');
+ assert.equal(stamped.length, 3, 'total stamped count incorrect');
+ stamped = inDocumentContainer.querySelectorAll('*:not(template):not(dom-if)');
+ stamped.forEach(function(n) {
+ assert.equal(getComputedStyle(n).display, 'none', 'node was not hidden but should have been');
+ });
+ });
+
+ test('if=true, restamp=true, everything rendered and visible', function() {
+ inDocumentIf.restamp = true;
+ inDocumentIf.if = true;
+ inDocumentIf.render();
+ let stamped = inDocumentContainer.querySelectorAll('*:not(template):not(dom-if):not(span)');
+ assert.equal(stamped.length, 3, 'total stamped count incorrect');
+ stamped = inDocumentContainer.querySelectorAll('*:not(template):not(dom-if)');
+ stamped.forEach(function(n) {
+ assert.equal(getComputedStyle(n).display, 'inline', 'node was hidden but should not have been');
+ });
+ });
+
+ test('if=false, restamp=true, everything gone', function() {
+ inDocumentIf.restamp = true;
+ inDocumentIf.if = false;
+ inDocumentIf.render();
+ // 2nd one needed to force nested if to detach
+ let stamped = inDocumentContainer.querySelectorAll('*:not(template):not(dom-if)');
+ assert.equal(stamped.length, 0, 'total stamped count incorrect');
+ });
+
+ // repeat, just to get everything rendered again...
+ test('if=true: everything rendered and visible', function() {
+ // first dom-if
+ inDocumentIf.if = true;
+ inDocumentIf.render();
+ let stamped = inDocumentContainer.querySelectorAll('*:not(template):not(dom-if):not(span)');
+ assert.equal(stamped.length, 1, 'total stamped count incorrect');
+
+ // second dom-if
+ let xif = inDocumentContainer.querySelector('dom-if');
+ xif.if = true;
+ xif.render();
+ stamped = inDocumentContainer.querySelectorAll('*:not(template):not(dom-if):not(span)');
+ assert.equal(stamped.length, 2, 'total stamped count incorrect');
+
+ // third dom-if
+ xif = inDocumentContainer.querySelector('dom-if');
+ xif.if = true;
+ xif.render();
+ stamped = inDocumentContainer.querySelectorAll('*:not(template):not(dom-if):not(span)');
+ assert.equal(stamped.length, 3, 'total stamped count incorrect');
+
+ stamped = inDocumentContainer.querySelectorAll('*:not(template):not(dom-if)');
+ stamped.forEach(function(n) {
+ assert.equal(getComputedStyle(n).display, 'inline', 'node was hidden but should not have been');
+ });
+ });
+
+ test('parent scope binding', function() {
+ let stamped = inDocumentContainer.querySelectorAll('*:not(template):not(dom-if):not(span)');
+ stamped[0].prop = 'outer';
+ assert.equal(stamped[1].prop, 'outer');
+ assert.equal(stamped[2].prop, 'outer');
+ });
+
+});
+
+suite('nested un-configured dom-if', function() {
+
+ test('if=false: nothing rendered', function() {
+ let stamped = unconfigured1.shadowRoot.querySelectorAll('*:not(template):not(dom-if)');
+ assert.equal(stamped.length, 0, 'total stamped count incorrect');
+ });
+
+ test('if=true: everything rendered and visible', function() {
+ unconfigured1.domUpdateHandlerCount = 0;
+ unconfigured1.shouldStamp = true;
+ unconfigured2.shouldStamp = true;
+ unconfigured1.render();
+ let stamped = unconfigured1.shadowRoot.querySelectorAll('*:not(template):not(dom-if):not(span)');
+ assert.equal(stamped.length, 3, 'total stamped count incorrect');
+ stamped[0].prop = 'outer';
+ assert.equal(unconfigured1.domUpdateHandlerCount, 1);
+ });
+
+ test('if=false, restamp=false: everything hidden', function() {
+ unconfigured1.domUpdateHandlerCount = 0;
+ unconfigured1.shouldStamp = false;
+ unconfigured1.render();
+ let stamped = unconfigured1.shadowRoot.querySelectorAll('*:not(template):not(dom-if):not(span)');
+ assert.equal(stamped.length, 3, 'total stamped count incorrect');
+ stamped = unconfigured1.shadowRoot.querySelectorAll('*:not(template):not(dom-if)');
+ stamped.forEach(function(n) {
+ assert.equal(getComputedStyle(n).display, 'none', 'node was not hidden but should have been');
+ });
+ assert.equal(unconfigured1.domUpdateHandlerCount, 1);
+ });
+
+ test('if=true, restamp=true, everything rendered and visible', function() {
+ unconfigured1.domUpdateHandlerCount = 0;
+ unconfigured1.$['if-1'].restamp = true;
+ unconfigured1.shouldStamp = true;
+ unconfigured1.$['if-1'].render();
+ let stamped = unconfigured1.shadowRoot.querySelectorAll('*:not(template):not(dom-if):not(span)');
+ assert.equal(stamped.length, 3, 'total stamped count incorrect');
+ stamped = unconfigured1.shadowRoot.querySelectorAll('*:not(template):not(dom-if)');
+ stamped.forEach(function(n) {
+ assert.equal(getComputedStyle(n).display, 'inline', 'node was hidden but should not have been');
+ });
+ assert.equal(unconfigured1.domUpdateHandlerCount, 1);
+ });
+
+ test('if=false, restamp=true, everything gone', function() {
+ unconfigured1.domUpdateHandlerCount = 0;
+ unconfigured1.$['if-1'].restamp = true;
+ unconfigured1.shouldStamp = false;
+ unconfigured1.$['if-1'].render();
+ let stamped = unconfigured1.shadowRoot.querySelectorAll('*:not(template):not(dom-if)');
+ assert.equal(unconfigured1.domUpdateHandlerCount, 1);
+ assert.equal(stamped.length, 0, 'total stamped count incorrect');
+ assert.equal(unconfigured1.domUpdateHandlerCount, 1);
+ });
+
+ // repeat, just to get everything rendered again...
+ test('if=true: everything rendered and visible', function() {
+ unconfigured1.domUpdateHandlerCount = 0;
+ unconfigured1.shouldStamp = true;
+ unconfigured2.shouldStamp = true;
+ unconfigured1.render();
+ unconfigured2.render();
+ let stamped = unconfigured1.shadowRoot.querySelectorAll('*:not(template):not(dom-if):not(span)');
+ assert.equal(stamped.length, 3, 'total stamped count incorrect');
+ stamped[0].prop = 'outer';
+ assert.equal(unconfigured1.domUpdateHandlerCount, 1);
+ });
+
+ test('parent scope binding', function() {
+ let stamped = unconfigured1.shadowRoot.querySelectorAll('*:not(template):not(dom-if):not(span)');
+ assert.equal(stamped[1].prop, 'outer');
+ assert.equal(stamped[2].prop, 'outer');
+ });
+
+ test('parent upward upward notification', function() {
+ let stamped = unconfigured1.shadowRoot.querySelectorAll('*:not(template):not(dom-if):not(span)');
+ stamped[2].prop = 'nice';
+ assert.equal(stamped[0].prop, 'nice');
+ assert.equal(stamped[1].prop, 'nice');
+ });
+
+ test('event handlers', function() {
+ let stamped = unconfigured1.shadowRoot.querySelectorAll('*:not(template):not(dom-if):not(span)');
+ stamped[0].fire('test1');
+ assert.equal(unconfigured1.testHandler1Count, 1);
+ stamped[1].fire('test2');
+ assert.equal(unconfigured1.testHandler2Count, 1);
+ stamped[2].fire('test3');
+ assert.equal(unconfigured1.testHandler3Count, 1);
+ });
+
+});
+
+suite('notification between two dom-ifs', function() {
+
+ test('change to one scope doesn\'t affect other dom-if', function() {
+ let stamped1 = unconfigured1.shadowRoot.querySelectorAll('*:not(template):not(dom-if):not(span)');
+ let stamped2 = unconfigured2.shadowRoot.querySelectorAll('*:not(template):not(dom-if):not(span)');
+
+ unconfigured1.prop = 'foo';
+ unconfigured2.prop = 'bar';
+ assert.equal(stamped1[0].prop, 'foo');
+ assert.equal(stamped1[1].prop, 'foo');
+ assert.equal(stamped1[2].prop, 'foo');
+ assert.equal(stamped2[0].prop, 'bar');
+ assert.equal(stamped2[1].prop, 'bar');
+ assert.equal(stamped2[2].prop, 'bar');
+ });
+});
+
+suite('structured data controlling if', function() {
+
+ test('item changed with no if field', function() {
+ let showing;
+ showing = structuredContainer.querySelector('.showing');
+ assert.notOk(showing);
+ structuredDomBind.item = {show: true};
+ structuredDomIf.render();
+ showing = structuredContainer.querySelector('.showing');
+ assert.ok(showing);
+ assert.equal(getComputedStyle(showing).display, 'block');
+ structuredDomBind.item = {};
+ structuredDomIf.render();
+ showing = structuredContainer.querySelector('.showing');
+ assert.ok(showing);
+ assert.equal(getComputedStyle(showing).display, 'none');
+ structuredDomBind.item = {show: true};
+ structuredDomIf.render();
+ showing = structuredContainer.querySelector('.showing');
+ assert.ok(showing);
+ assert.equal(getComputedStyle(showing).display, 'block');
+ });
+
+ test('item changed with no if field (restamp)', function() {
+ let showing;
+ structuredDomIf.restamp = true;
+ structuredDomIf.if = false;
+ structuredDomIf.render();
+ showing = structuredContainer.querySelector('.showing');
+ assert.notOk(showing);
+ structuredDomBind.item = {show: true};
+ structuredDomIf.render();
+ showing = structuredContainer.querySelector('.showing');
+ assert.ok(showing);
+ structuredDomBind.item = {};
+ structuredDomIf.render();
+ showing = structuredContainer.querySelector('.showing');
+ assert.notOk(showing);
+ structuredDomBind.item = {show: true};
+ structuredDomIf.render();
+ showing = structuredContainer.querySelector('.showing');
+ assert.ok(showing);
+ });
+
+});
+
+suite('text node handling', function() {
+
+ test('text nodes cleared on if=false', function() {
+ let x = document.createElement('x-textcontent');
+ document.body.appendChild(x);
+ x.$.domIf.render();
+ let stamped = x.shadowRoot.childNodes;
+ assert.equal(stamped.length, 12);
+ assert.equal(stamped[7].textContent.trim(), 'Stuff');
+ x.$.domIf.if = false;
+ x.$.domIf.render();
+ stamped = x.shadowRoot.childNodes;
+ assert.equal(stamped.length, 12);
+ assert.equal(stamped[7].textContent.trim(), '');
+ x.$.domIf.if = true;
+ x.$.domIf.render();
+ stamped = x.shadowRoot.childNodes;
+ assert.equal(stamped.length, 12);
+ assert.equal(stamped[7].textContent.trim(), 'Stuff');
+ document.body.removeChild(x);
+ });
+
+ test('binding to text nodes changed while if=false', function() {
+ let x = document.createElement('x-textcontent');
+ document.body.appendChild(x);
+ x.$.domIf.render();
+ let stamped = x.shadowRoot.childNodes;
+ assert.equal(stamped.length, 12);
+ assert.equal(stamped[7].textContent.trim(), 'Stuff');
+ x.$.domIf.if = false;
+ x.$.domIf.render();
+ x.text = 'Hollaaaaa!';
+ stamped = x.shadowRoot.childNodes;
+ assert.equal(stamped.length, 12);
+ assert.equal(stamped[7].textContent.trim(), '');
+ x.$.domIf.if = true;
+ x.$.domIf.render();
+ stamped = x.shadowRoot.childNodes;
+ assert.equal(stamped.length, 12);
+ assert.equal(stamped[7].textContent.trim(), 'Hollaaaaa!');
+ document.body.removeChild(x);
+ });
+
+});
+
+suite('slot handling', function() {
+
+ test('slots added/removed on if=true/false', function() {
+ let x = document.createElement('x-slot');
+ let one = document.createElement('div');
+ one.slot = 'one';
+ x.appendChild(one);
+ let two = document.createElement('div');
+ two.slot = 'two';
+ x.appendChild(two);
+ let three = document.createElement('div');
+ three.slot = 'three';
+ x.appendChild(three);
+ document.body.appendChild(x);
+ x.$.domIf.render();
+ let stamped = x.shadowRoot.childNodes;
+ assert.equal(stamped.length, 14);
+ assert.equal(stamped[4].assignedNodes()[0], one);
+ assert.equal(stamped[8].assignedNodes()[0], two);
+ assert.equal(stamped[10].assignedNodes()[0], three);
+ x.$.domIf.if = false;
+ x.$.domIf.render();
+ stamped = x.shadowRoot.childNodes;
+ assert.equal(stamped.length, 14);
+ x.$.domIf.if = true;
+ x.$.domIf.render();
+ stamped = x.shadowRoot.childNodes;
+ assert.equal(stamped.length, 14);
+ assert.equal(stamped[4].assignedNodes()[0], one);
+ assert.equal(stamped[8].assignedNodes()[0], two);
+ assert.equal(stamped[10].assignedNodes()[0], three);
+ x.$.domIf.if = false;
+ x.$.domIf.render();
+ const innerIf = x.shadowRoot.querySelector('#innerIf');
+ innerIf.if = false;
+ innerIf.render();
+ x.$.domIf.if = true;
+ x.$.domIf.render();
+ stamped = x.shadowRoot.childNodes;
+ assert.equal(stamped[4].assignedNodes()[0], one);
+ assert.equal(stamped[7].assignedNodes()[0], two);
+ assert.equal(stamped[9].assignedNodes()[0], three);
+ document.body.removeChild(x);
+ });
+
+});
+
+suite('attach/detach tests', function() {
+
+ test('move domif (clients persist)', function(done) {
+ let domif = document.querySelector('#simple');
+ domif.if = true;
+ innerContainer.appendChild(domif);
+ setTimeout(function() {
+ let clients = innerContainer.querySelectorAll('x-client');
+ // Same clients as before since move happened in one turn
+ assert.equal(clients[0].uid, 0);
+ assert.equal(clients[1].uid, 1);
+ assert.equal(clients[2].uid, 2);
+ assert.equal(clients[1].previousElementSibling, clients[0]);
+ assert.equal(clients[2].previousElementSibling, clients[1]);
+ assert.equal(domif.previousElementSibling, clients[2]);
+ done();
+ });
+ });
+
+ test('remove, wait, append domif (clients recreated)', function(done) {
+ let domif = document.querySelector('#simple');
+ domif.if = true;
+ innerContainer.removeChild(domif);
+ setTimeout(function() {
+ let clients = innerContainer.querySelectorAll('x-client');
+ assert.equal(clients.length, 0);
+ innerContainer.appendChild(domif);
+ setTimeout(function() {
+ let clients = outerContainer.querySelectorAll('x-client');
+ // New clients since removed for a turn
+ assert.equal(clients[0].uid, 3);
+ assert.equal(clients[1].uid, 4);
+ assert.equal(clients[2].uid, 5);
+ assert.equal(clients[1].previousElementSibling, clients[0]);
+ assert.equal(clients[2].previousElementSibling, clients[1]);
+ assert.equal(domif.previousElementSibling, clients[2]);
+ done();
+ });
+ });
+ });
+
+ test('move host with domif (clients persist)', function(done) {
+ let host = document.createElement('x-host');
+ outerContainer.appendChild(host);
+ setTimeout(function() {
+ let clients = host.shadowRoot.querySelectorAll('x-client');
+ // New clients created in host instance
+ assert.equal(clients[0].uid, 6);
+ assert.equal(clients[1].uid, 7);
+ assert.equal(clients[2].uid, 8);
+ assert.equal(clients[1].previousElementSibling, clients[0]);
+ assert.equal(clients[2].previousElementSibling, clients[1]);
+ assert.equal(host.$.domif.previousElementSibling, clients[2]);
+ innerContainer.appendChild(host);
+ setTimeout(function() {
+ let clients = host.shadowRoot.querySelectorAll('x-client');
+ // Clients in removed host persist
+ assert.equal(clients[0].uid, 6);
+ assert.equal(clients[1].uid, 7);
+ assert.equal(clients[2].uid, 8);
+ assert.equal(clients[1].previousElementSibling, clients[0]);
+ assert.equal(clients[2].previousElementSibling, clients[1]);
+ assert.equal(host.$.domif.previousElementSibling, clients[2]);
+ done();
+ });
+ });
+ });
+
+ test('remove, wait, append host with domif (clients persist)', function(done) {
+ let host = document.createElement('x-host');
+ outerContainer.appendChild(host);
+ setTimeout(function() {
+ let clients = host.shadowRoot.querySelectorAll('x-client');
+ // New clients created in host instance
+ assert.equal(clients[0].uid, 9);
+ assert.equal(clients[1].uid, 10);
+ assert.equal(clients[2].uid, 11);
+ assert.equal(clients[1].previousElementSibling, clients[0]);
+ assert.equal(clients[2].previousElementSibling, clients[1]);
+ assert.equal(host.$.domif.previousElementSibling, clients[2]);
+ outerContainer.removeChild(host);
+ setTimeout(function() {
+ // Clients in removed host persist
+ assert.equal(clients[0].uid, 9);
+ assert.equal(clients[1].uid, 10);
+ assert.equal(clients[2].uid, 11);
+ assert.equal(clients[1].previousElementSibling, clients[0]);
+ assert.equal(clients[2].previousElementSibling, clients[1]);
+ assert.equal(host.$.domif.previousElementSibling, clients[2]);
+ innerContainer.appendChild(host);
+ setTimeout(function() {
+ // Clients in removed host persist
+ let clients = host.shadowRoot.querySelectorAll('x-client');
+ assert.equal(clients[0].uid, 9);
+ assert.equal(clients[1].uid, 10);
+ assert.equal(clients[2].uid, 11);
+ assert.equal(clients[1].previousElementSibling, clients[0]);
+ assert.equal(clients[2].previousElementSibling, clients[1]);
+ assert.equal(host.$.domif.previousElementSibling, clients[2]);
+ done();
+ });
+ });
+ });
+ });
+
+ test('remove, append domif', function(done) {
+ let domif = document.querySelector('#simple');
+ let parent = domif.parentNode;
+ domif.if = true;
+ parent.removeChild(domif);
+ setTimeout(function() {
+ let clients = parent.querySelectorAll('x-client');
+ assert.equal(clients.length, 0);
+ parent.appendChild(domif);
+ setTimeout(function() {
+ let clients = parent.querySelectorAll('x-client');
+ assert.equal(clients[0].uid, 12);
+ assert.equal(clients[1].uid, 13);
+ assert.equal(clients[2].uid, 14);
+ assert.equal(clients[1].previousElementSibling, clients[0]);
+ assert.equal(clients[2].previousElementSibling, clients[1]);
+ assert.equal(domif.previousElementSibling, clients[2]);
+ done();
+ });
+ });
+ });
+
+ test('move into doc fragment', function(done) {
+ let el = shouldBeRemoved;
+ assert.equal(el.parentNode, removalContainer);
+ let frag = document.createDocumentFragment();
+ frag.appendChild(toBeRemoved);
+ setTimeout(function() {
+ assert.equal(el.parentNode, null);
+ removalContainer.appendChild(frag);
+ setTimeout(function() {
+ assert.equal(shouldBeRemoved.parentNode, removalContainer);
+ done();
+ });
+ });
+ });
+
+ test('move into shadow root', function(done) {
+ if (window.ShadyCSS && window.ShadyCSS.nativeShadow) {
+ let el = shouldBeRemoved;
+ assert.equal(el.parentNode, removalContainer);
+ let div = document.createElement('div');
+ document.body.appendChild(div);
+ let frag = div.attachShadow({mode: 'open'});
+ frag.appendChild(toBeRemoved);
+ setTimeout(function() {
+ assert.equal(el.parentNode, frag);
+ done();
+ });
+ } else {
+ done();
+ }
+ });
+
+});
+
+suite('timing', function() {
+
+ test('non-upgrade case finds template', function() {
+ assert.equal(nonUpgrade.textContent.trim(), 'stamped');
+ });
+
+});
+
+[true, false].forEach(function(restamp) {
+
+ suite('ordering, restamp: ' + restamp, function() {
+
+ test('effects in if not run when `if` goes false via property', function() {
+ let el = document.createElement('x-guard-prop');
+ el.restamp = restamp;
+ document.body.appendChild(el);
+ el.bool = true;
+ flush();
+ assert.equal(el.guarded.callCount, 1);
+ assert.equal(el.shadowRoot.textContent.trim(), 'true');
+ el.bool = false;
+ flush();
+ assert.equal(el.guarded.callCount, 1);
+ assert.equal(el.shadowRoot.textContent.trim(), '');
+ document.body.removeChild(el);
+ });
+
+ test('effects in if not run when `if` goes false via inline function', function() {
+ let el = document.createElement('x-guard-inline');
+ el.restamp = restamp;
+ document.body.appendChild(el);
+ el.bool = true;
+ flush();
+ assert.equal(el.guarded.callCount, 1);
+ assert.equal(el.shadowRoot.textContent.trim(), 'true');
+ el.bool = false;
+ flush();
+ assert.equal(el.guarded.callCount, 1);
+ assert.equal(el.shadowRoot.textContent.trim(), '');
+ document.body.removeChild(el);
+ });
+
+ test('effects in if not run when `if` goes false via computed property', function() {
+ let el = document.createElement('x-guard-computed');
+ el.restamp = restamp;
+ document.body.appendChild(el);
+ el.bool = true;
+ flush();
+ assert.equal(el.guarded.callCount, 1);
+ assert.equal(el.shadowRoot.textContent.trim(), 'true');
+ el.bool = false;
+ flush();
+ assert.equal(el.guarded.callCount, 1);
+ assert.equal(el.shadowRoot.textContent.trim(), '');
+ document.body.removeChild(el);
+ });
+
+ test('effects in if not run when `if` goes false via object sub-property', function() {
+ let el = document.createElement('x-guard-object');
+ el.restamp = restamp;
+ document.body.appendChild(el);
+ el.obj = {bool: true};
+ flush();
+ assert.equal(el.guarded.callCount, 1);
+ assert.equal(el.shadowRoot.textContent.trim(), 'true');
+ el.obj = {bool: false};
+ flush();
+ assert.equal(el.guarded.callCount, 1);
+ assert.equal(el.shadowRoot.textContent.trim(), '');
+ document.body.removeChild(el);
+ });
+
+ test('effects in if not run when `if` goes false via computed from object sub-property', function() {
+ let el = document.createElement('x-guard-object-computed');
+ el.restamp = restamp;
+ document.body.appendChild(el);
+ el.obj = {bool: true};
+ flush();
+ assert.equal(el.guarded.callCount, 1);
+ assert.equal(el.shadowRoot.textContent.trim(), 'true');
+ el.obj = {bool: false};
+ flush();
+ assert.equal(el.guarded.callCount, 1);
+ assert.equal(el.shadowRoot.textContent.trim(), '');
+ document.body.removeChild(el);
+ });
+
+ test('effects in if not run when `if` goes false via setProperties batch', function() {
+ let el = document.createElement('x-guard-separate-props');
+ el.restamp = restamp;
+ document.body.appendChild(el);
+ el.setProperties({a: 'ok', b: true});
+ flush();
+ assert.equal(el.guarded.callCount, 1);
+ assert.equal(el.shadowRoot.textContent.trim(), 'ok');
+ el.setProperties({a: 'notok', b: false});
+ flush();
+ assert.equal(el.guarded.callCount, 1);
+ assert.equal(el.shadowRoot.textContent.trim(), '');
+ document.body.removeChild(el);
+ });
+
+ test('host properties in sync when changed while false', function() {
+ let el = document.createElement('x-guard-separate-props');
+ el.restamp = restamp;
+ document.body.appendChild(el);
+ el.a = 'ok';
+ el.b = true;
+ flush();
+ assert.equal(el.shadowRoot.textContent.trim(), 'ok');
+ el.b = false;
+ el.a = 'notok';
+ flush();
+ assert.equal(el.shadowRoot.textContent.trim(), '');
+ el.a = 'changed';
+ el.b = true;
+ flush();
+ assert.equal(el.shadowRoot.textContent.trim(), 'changed');
+ document.body.removeChild(el);
+ });
+
+ test('host paths in sync when changed while false', function() {
+ let el = document.createElement('x-guard-separate-paths');
+ el.restamp = restamp;
+ document.body.appendChild(el);
+ el.obj = {a: 'ok', b: true};
+ flush();
+ assert.equal(el.shadowRoot.textContent.trim(), 'ok');
+ el.set('obj.b', false);
+ el.set('obj.a', 'notok');
+ flush();
+ assert.equal(el.shadowRoot.textContent.trim(), '');
+ el.set('obj.a', 'changed');
+ el.set('obj.b', true);
+ flush();
+ assert.equal(el.shadowRoot.textContent.trim(), 'changed');
+ document.body.removeChild(el);
+ });
+
+ });
+
+});
+</script>
+
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/dom-repeat-elements.js b/third_party/polymer3/bower_components/polymer/test/unit/dom-repeat-elements.js
new file mode 100644
index 0000000..8b836da
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/dom-repeat-elements.js
@@ -0,0 +1,492 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import { Polymer } from '../../lib/legacy/polymer-fn.js';
+
+import { html } from '../../lib/utils/html-tag.js';
+import { MutableData } from '../../lib/mixins/mutable-data.js';
+window.getData = () => [
+ {
+ prop: 'prop-1',
+ items: [
+ {
+ prop: 'prop-1-1',
+ items: [
+ { prop: 'prop-1-1-1' },
+ { prop: 'prop-1-1-2' },
+ { prop: 'prop-1-1-3' }
+ ]
+ },
+ {
+ prop: 'prop-1-2',
+ items: [
+ { prop: 'prop-1-2-1' },
+ { prop: 'prop-1-2-2' },
+ { prop: 'prop-1-2-3' }
+ ]
+ },
+ {
+ prop: 'prop-1-3',
+ items: [
+ { prop: 'prop-1-3-1' },
+ { prop: 'prop-1-3-2' },
+ { prop: 'prop-1-3-3' }
+ ]
+ }
+ ]
+ },
+ {
+ prop: 'prop-2',
+ items: [
+ {
+ prop: 'prop-2-1',
+ items: [
+ { prop: 'prop-2-1-1' },
+ { prop: 'prop-2-1-2' },
+ { prop: 'prop-2-1-3' }
+ ]
+ },
+ {
+ prop: 'prop-2-2',
+ items: [
+ { prop: 'prop-2-2-1' },
+ { prop: 'prop-2-2-2' },
+ { prop: 'prop-2-2-3' }
+ ]
+ },
+ {
+ prop: 'prop-2-3',
+ items: [
+ { prop: 'prop-2-3-1' },
+ { prop: 'prop-2-3-2' },
+ { prop: 'prop-2-3-3' }
+ ]
+ }
+ ]
+ },
+ {
+ prop: 'prop-3',
+ items: [
+ {
+ prop: 'prop-3-1',
+ items: [
+ { prop: 'prop-3-1-1' },
+ { prop: 'prop-3-1-2' },
+ { prop: 'prop-3-1-3' }
+ ]
+ },
+ {
+ prop: 'prop-3-2',
+ items: [
+ { prop: 'prop-3-2-1' },
+ { prop: 'prop-3-2-2' },
+ { prop: 'prop-3-2-3' }
+ ]
+ },
+ {
+ prop: 'prop-3-3',
+ items: [
+ { prop: 'prop-3-3-1' },
+ { prop: 'prop-3-3-2' },
+ { prop: 'prop-3-3-3' }
+ ]
+ }
+ ]
+ }
+];
+
+Polymer({
+ _template: html`
+ <style>
+ :host {
+ display: block;
+ border: 1px solid black;
+ padding: 3px;
+ margin: 3px;
+ }
+ </style>
+ <span>{{itemaProp}}</span>
+ <span>{{itembProp}}</span>
+ <span>{{itemcProp}}</span>
+ <x-bar id="bar" outer-prop="{{outerProp}}" outer-item-prop="{{outerItemProp}}" innera-prop="{{inneraProp}}" itema-prop="{{itemaProp}}" innerb-prop="{{innerbProp}}" itemb-prop="{{itembProp}}" innerc-prop="{{innercProp}}" itemc-prop="{{itemcProp}}" computed1="{{computed1}}" computed2="{{computed2}}" computed3="{{computed3}}">
+ </x-bar>
+`,
+
+ is: 'x-foo',
+
+ properties: {
+ outerProp: {
+ notify: true
+ },
+ outerItemProp: {
+ notify: true
+ },
+ inneraProp: {
+ notify: true
+ },
+ itemaProp: {
+ notify: true
+ },
+ innerbProp: {
+ notify: true
+ },
+ itembProp: {
+ notify: true
+ },
+ innercProp: {
+ notify: true
+ },
+ itemcProp: {
+ notify: true
+ },
+ indexa: {
+ notify: true
+ },
+ indexb: {
+ notify: true
+ },
+ indexc: {
+ notify: true
+ }
+ }
+});
+Polymer({
+ is: 'x-bar',
+ properties: {
+ outerProp: {
+ notify: true
+ },
+ outerItemProp: {
+ notify: true
+ },
+ inneraProp: {
+ notify: true
+ },
+ itemaProp: {
+ notify: true
+ },
+ innerbProp: {
+ notify: true
+ },
+ itembProp: {
+ notify: true
+ },
+ innercProp: {
+ notify: true
+ },
+ itemcProp: {
+ notify: true
+ },
+ indexa: {
+ notify: true
+ },
+ indexb: {
+ notify: true
+ },
+ indexc: {
+ notify: true
+ }
+ }
+});
+let XNestedRepeat = Polymer({
+ _template: html`
+ <template id="repeater" is="dom-repeat" items="{{items}}" as="itema" index-as="indexa" on-dom-change="domUpdateHandler">
+ <x-foo on-test1="testHandler1"
+ innera-prop="{{innera.prop}}"
+ itema-prop="{{itema.prop}}"
+ outer-prop="{{prop}}"
+ outer-item-prop="{{item.prop}}"
+ indexa="{{indexa}}">
+ </x-foo>
+ <template is="dom-repeat" items="{{itema.items}}" as="itemb" index-as="indexb">
+ <x-foo on-test2="testHandler2"
+ innerb-prop="{{innerb.prop}}"
+ itemb-prop="{{itemb.prop}}"
+ innera-prop="{{innera.prop}}"
+ itema-prop="{{itema.prop}}"
+ outer-prop="{{prop}}"
+ outer-item-prop="{{item.prop}}"
+ indexa="{{indexa}}"
+ indexb="{{indexb}}">
+ </x-foo>
+ <template is="dom-repeat" items="{{itemb.items}}" as="itemc" index-as="indexc">
+ <x-foo on-test3="testHandler3"
+ innerc-prop="{{innerc.prop}}"
+ itemc-prop="{{itemc.prop}}"
+ innerb-prop="{{innerb.prop}}"
+ itemb-prop="{{itemb.prop}}"
+ innera-prop="{{innera.prop}}"
+ itema-prop="{{itema.prop}}"
+ outer-prop="{{prop}}"
+ outer-item-prop="{{item.prop}}"
+ indexa="{{indexa}}"
+ indexb="{{indexb}}"
+ indexc="{{indexc}}">
+ </x-foo>
+ </template>
+ </template>
+ </template>
+`,
+ is: 'x-nested-repeat',
+ testHandler1Count: 0,
+ testHandler2Count: 0,
+ testHandler3Count: 0,
+ domUpdateHandlerCount: 0,
+ testHandler1: function() {
+ this.testHandler1Count++;
+ },
+ testHandler2: function() {
+ this.testHandler2Count++;
+ },
+ testHandler3: function() {
+ this.testHandler3Count++;
+ },
+ domUpdateHandler: function() {
+ this.domUpdateHandlerCount++;
+ }
+});
+class XNestedRepeatMutable extends MutableData(XNestedRepeat) {
+ static get template() {
+ if (!this._templateEl) {
+ this._templateEl = XNestedRepeat.template.cloneNode(true);
+ }
+ return this.makeRepeatsMutable(this._templateEl.cloneNode(true));
+ }
+ static makeRepeatsMutable(template) {
+ Array.from(template.content.querySelectorAll('[is=dom-repeat]')).forEach(e => {
+ e.setAttribute('mutable-data', '');
+ this.makeRepeatsMutable(e);
+ });
+ return template;
+ }
+}
+customElements.define('x-nested-repeat-mutable', XNestedRepeatMutable);
+Polymer({
+ _template: html`
+ <template id="repeater" is="dom-repeat" items="{{items}}" as="itema" index-as="indexa" observe="prop">
+ <x-foo innera-prop="{{innera.prop}}" itema-prop="{{itema.prop}}" outer-prop="{{prop}}" outer-item-prop="{{item.prop}}" indexa="{{indexa}}" computeda="{{concat(itema.prop, itemForComputedA.prop)}}">
+ </x-foo>
+ <template is="dom-repeat" items="{{itema.items}}" as="itemb" index-as="indexb">
+ <x-foo innerb-prop="{{innerb.prop}}" itemb-prop="{{itemb.prop}}" innera-prop="{{innera.prop}}" itema-prop="{{itema.prop}}" outer-prop="{{prop}}" outer-item-prop="{{item.prop}}" indexa="{{indexa}}" indexb="{{indexb}}" computedb="{{concat(itemb.prop, itemForComputedB.prop)}}">
+ </x-foo>
+ <template is="dom-repeat" items="{{itemb.items}}" as="itemc" index-as="indexc">
+ <x-foo innerc-prop="{{innerc.prop}}" itemc-prop="{{itemc.prop}}" innerb-prop="{{innerb.prop}}" itemb-prop="{{itemb.prop}}" innera-prop="{{innera.prop}}" itema-prop="{{itema.prop}}" outer-prop="{{prop}}" outer-item-prop="{{item.prop}}" indexa="{{indexa}}" indexb="{{indexb}}" indexc="{{indexc}}" computedc="{{concat(itemc.prop, itemForComputedC.prop)}}">
+ </x-foo>
+ </template>
+ </template>
+ </template>
+`,
+
+ is: 'x-nested-repeat-configured',
+
+ properties: {
+ items: {
+ value: window.getData()
+ },
+ prop: {
+ value: 'outer'
+ },
+ item: {
+ value: function() { return {prop: 'outerItem'}; }
+ },
+ itemForComputedA: {
+ value: function() { return {prop: 'itemForComputedA'}; }
+ },
+ itemForComputedB: {
+ value: function() { return {prop: 'itemForComputedB'}; }
+ },
+ itemForComputedC: {
+ value: function() { return {prop: 'itemForComputedC'}; }
+ },
+ _testHost: {
+ value: function() { return this; }
+ }
+ },
+
+ sortDesc: function(a, b) {
+ assert.equal(this, this._testHost);
+ return b.prop.localeCompare(a.prop);
+ },
+
+ filter2nd: function(o) {
+ assert.equal(this, this._testHost);
+ return o.prop.indexOf('2') < 0;
+ },
+
+ concat: function(a, b) {
+ return a + '+' + b;
+ }
+});
+Polymer({
+ _template: html`
+ <template id="repeater" is="dom-repeat" items="{{items}}">
+ <x-foo itema-prop="{{item.prop.nestedProp}}"></x-foo>
+ </template>
+`,
+
+ is: 'x-repeat-filter-and-sort-by-nested-property',
+
+ properties: {
+ items: {
+ value () {
+ return [
+ { prop: { nestedProp: 0 } },
+ { prop: { nestedProp: 1 } },
+ { prop: { nestedProp: 2 } },
+ { prop: { nestedProp: 3 } },
+ { prop: { nestedProp: 4 } },
+ ];
+ }
+ }
+ }
+});
+Polymer({
+ _template: html`
+ <template id="repeat" is="dom-repeat" items="{{items}}">
+ <x-foo itema-prop="{{item.prop}}"></x-foo>
+ </template>
+`,
+
+ is: 'x-simple-repeat',
+
+ properties: {
+ items: {
+ value: window.getData()
+ }
+ }
+});
+Polymer({
+ _template: html`
+ <div id="container1">
+ <template is="dom-repeat" items="{{items}}" id="repeater1">
+ <x-foo itema-prop="{{item}}"></x-foo>
+ </template>
+ </div>
+ <div id="container2">
+ <template is="dom-repeat" items="{{items}}" id="repeater2">
+ <x-foo itema-prop="{{item}}"></x-foo>
+ </template>
+ </div>
+`,
+
+ is: 'x-primitive-repeat',
+
+ properties: {
+ items: {
+ value: function() {
+ return ['a', 'b', 'c', 'd', 'e'];
+ }
+ }
+ }
+});
+Polymer({
+ _template: html`
+ <template id="repeater" is="dom-repeat" items="{{items}}">
+ <div>{{item}}</div>
+ </template>
+`,
+
+ is: 'x-primitive-large',
+
+ properties: {
+ items: {
+ value: function() {
+ var ar = [];
+ for (var i = 0; i < 11; i++) {
+ ar.push(i);
+ }
+ return ar;
+ }
+ }
+ }
+});
+Polymer({
+ _template: html`
+ <template id="repeater" is="dom-repeat" items="{{items}}">
+ <div prop="{{outerProp.prop}}">{{item.prop}}</div>
+ </template>
+`,
+
+ is: 'x-repeat-limit',
+
+ properties: {
+ preppedItems: {
+ value: function() {
+ var ar = [];
+ for (var i = 0; i < 20; i++) {
+ ar.push({prop: i});
+ }
+ return ar;
+ }
+ },
+ outerProp: {
+ value: function() {
+ return {prop: 'outer'};
+ }
+ }
+ }
+});
+Polymer({
+ _template: html`
+ <template id="repeater" is="dom-repeat" items="{{items}}" initial-count="10">
+ <x-wait>{{item.prop}}</x-wait>
+ </template>
+`,
+
+ is: 'x-repeat-chunked',
+
+ properties: {
+ preppedItems: {
+ value: function() {
+ var ar = [];
+ for (var i = 0; i < 100; i++) {
+ ar.push({prop: i});
+ }
+ return ar;
+ }
+ }
+ }
+});
+Polymer({
+ is: 'x-wait',
+ created: function() {
+ var time = performance.now();
+ time += 4;
+ while (performance.now() < time) {} //eslint-disable-line no-empty
+ }
+});
+Polymer({
+ _template: html`
+ <template is="dom-repeat" items="{{items}}" id="outer">
+ <template is="dom-if" if="">
+ <template is="dom-repeat" items="{{item.items}}" id="inner">
+ <template is="dom-if" if="">
+ <button on-click="handleClick">{{item.prop}}</button>
+ </template>
+ </template>
+ </template>
+ </template>
+`,
+
+ is: 'x-repeat-with-if',
+
+ properties: {
+ items: {
+ value: () => [
+ {items: [{prop:'a'}, {prop: 'b'}]},
+ {items: [{prop:'c'}, {prop: 'd'}]}
+ ]
+ }
+ },
+
+ created() {
+ // cache target so it's available in spy after event stack returns
+ this.handleClick = sinon.spy((event) => event._target = event.target);
+ }
+});
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/dom-repeat.html b/third_party/polymer3/bower_components/polymer/test/unit/dom-repeat.html
new file mode 100644
index 0000000..1a8d10f
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/dom-repeat.html
@@ -0,0 +1,4244 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+ <script type="module" src="./dom-repeat-elements.js"></script>
+ <style>
+ /* makes painting faster when testing on IOS simulator */
+ x-repeat-chunked {
+ display: none;
+ }
+ </style>
+</head>
+<body>
+
+ <test-fixture id="simple">
+ <template>
+ <x-simple-repeat></x-simple-repeat>
+ </template>
+ </test-fixture>
+
+ <test-fixture id="primitive">
+ <template>
+ <x-primitive-repeat></x-primitive-repeat>
+ </template>
+ </test-fixture>
+
+
+ <test-fixture id="configured">
+ <template>
+ <x-nested-repeat-configured></x-nested-repeat-configured>
+ </template>
+ </test-fixture>
+
+ <test-fixture id="filter-and-sort-by-nested-property">
+ <template>
+ <x-repeat-filter-and-sort-by-nested-property></x-repeat-filter-and-sort-by-nested-property>
+ </template>
+ </test-fixture>
+
+ <test-fixture id="unconfigured">
+ <template>
+ <dom-bind>
+ <template>
+ <x-nested-repeat id="el1" items="{{items}}"></x-nested-repeat>
+ <x-nested-repeat id="el2" items="{{items}}"></x-nested-repeat>
+ </template>
+ </dom-bind>
+ </template>
+ </test-fixture>
+
+ <test-fixture id="unconfigured-mutable">
+ <template>
+ <dom-bind mutable-data>
+ <template>
+ <x-nested-repeat-mutable id="el1" items="{{items}}"></x-nested-repeat-mutable>
+ <x-nested-repeat-mutable id="el2" items="{{items}}"></x-nested-repeat-mutable>
+ </template>
+ </dom-bind>
+ </template>
+ </test-fixture>
+
+ <h4>inDocumentRepeater</h4>
+ <div id="inDocumentContainerOrig">
+ <dom-repeat id="inDocumentRepeater" as="itema" index-as="indexa">
+ <template>
+ <x-foo
+ innera-prop="{{innera.prop}}"
+ itema-prop="{{itema.prop}}"
+ indexa="{{indexa}}">
+ </x-foo>
+ <template is="dom-repeat" items="{{itema.items}}" as="itemb" index-as="indexb">
+ <x-foo
+ innerb-prop="{{innerb.prop}}"
+ itemb-prop="{{itemb.prop}}"
+ innera-prop="{{innera.prop}}"
+ itema-prop="{{itema.prop}}"
+ indexa="{{indexa}}"
+ indexb="{{indexb}}">
+ </x-foo>
+ <template is="dom-repeat" items="{{itemb.items}}" as="itemc" index-as="indexc">
+ <x-foo
+ innerc-prop="{{innerc.prop}}"
+ itemc-prop="{{itemc.prop}}"
+ innerb-prop="{{innerb.prop}}"
+ itemb-prop="{{itemb.prop}}"
+ innera-prop="{{innera.prop}}"
+ itema-prop="{{itema.prop}}"
+ indexa="{{indexa}}"
+ indexb="{{indexb}}"
+ indexc="{{indexc}}">
+ </x-foo>
+ </template>
+ </template>
+ </template>
+ </dom-repeat>
+ </div>
+
+
+ <test-fixture id="primitiveLarge">
+ <template>
+ <x-primitive-large></x-primitive-large>
+ </template>
+ </test-fixture>
+
+ <h4>x-repeat-limit</h4>
+ <x-repeat-limit id="limited"></x-repeat-limit>
+
+ <h4>x-repeat-chunked</h4>
+ <x-repeat-chunked id="chunked"></x-repeat-chunked>
+
+ <div id="inDocumentContainer">
+ </div>
+
+ <script type="module">
+import './dom-repeat-elements.js';
+</script>
+
+ <div id="nonUpgrade">
+ <dom-repeat items='[{"prop": "stamped"}]'>
+ <template>{{item.prop}}</template>
+ </dom-repeat>
+ </div>
+
+ <script type="module">
+import './dom-repeat-elements.js';
+import { flush } from '../../lib/utils/flush.js';
+import { calculateSplices } from '../../lib/utils/array-splice.js';
+/* global limited inDocumentRepeater inDocumentContainer inDocumentContainerOrig chunked nonUpgrade*/
+
+/*
+ Expected:
+
+ stamped[0] ... 1
+ stamped[1] ... 1-1
+ stamped[2] ... 1-1-1
+ stamped[3] ... 1-1-2
+ stamped[4] ... 1-1-3
+ stamped[5] ... 1-2
+ ...
+ stamped[13] .. 2
+ ...
+ stamped[36] .. 3-3-1
+ stamped[37] .. 3-3-2
+ stamped[38] .. 3-3-3
+*/
+
+function arrayDelete(el, path, item) {
+ var array = el.get(path);
+ var idx = array.indexOf(item);
+ el.splice(path, idx, 1);
+}
+
+suite('errors', function() {
+
+ test('items must be array', function() {
+ sinon.spy(console, 'warn');
+ inDocumentRepeater.items = {};
+ assert.isTrue(console.warn.calledOnce, 'should warn when items is not array');
+ assert.match(console.warn.firstCall.args[0], /expected array/);
+ console.warn.restore();
+ });
+
+});
+
+suite('nested pre-configured dom-repeat', function() {
+
+ let configured;
+
+ setup(function() {
+ configured = fixture('configured');
+ flush();
+ });
+
+ test('basic rendering, downward item binding', function() {
+ var stamped = configured.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 3 + 3*3 + 3*3*3, 'total stamped count incorrect');
+ assert.equal(configured.$.repeater.renderedItemCount, 3, 'rendered item count incorrect');
+ assert.equal(stamped[0].itemaProp, 'prop-1');
+ assert.equal(stamped[0].computeda, 'prop-1+itemForComputedA');
+ assert.equal(stamped[0].indexa, 0);
+ assert.equal(stamped[0].$.bar.itemaProp, 'prop-1');
+ assert.equal(stamped[1].itembProp, 'prop-1-1');
+ assert.equal(stamped[1].computedb, 'prop-1-1+itemForComputedB');
+ assert.equal(stamped[1].indexa, 0);
+ assert.equal(stamped[1].indexb, 0);
+ assert.equal(stamped[1].$.bar.itembProp, 'prop-1-1');
+ assert.equal(stamped[2].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped[2].computedc, 'prop-1-1-1+itemForComputedC');
+ assert.equal(stamped[2].indexa, 0);
+ assert.equal(stamped[2].indexb, 0);
+ assert.equal(stamped[2].indexc, 0);
+ assert.equal(stamped[2].$.bar.itemcProp, 'prop-1-1-1');
+ assert.equal(stamped[3].itemcProp, 'prop-1-1-2');
+ assert.equal(stamped[3].indexa, 0);
+ assert.equal(stamped[3].indexb, 0);
+ assert.equal(stamped[3].indexc, 1);
+ assert.equal(stamped[3].$.bar.itemcProp, 'prop-1-1-2');
+ assert.equal(stamped[4].itemcProp, 'prop-1-1-3');
+ assert.equal(stamped[4].indexa, 0);
+ assert.equal(stamped[4].indexb, 0);
+ assert.equal(stamped[4].indexc, 2);
+ assert.equal(stamped[4].$.bar.itemcProp, 'prop-1-1-3');
+ assert.equal(stamped[13].itemaProp, 'prop-2');
+ assert.equal(stamped[13].indexa, 1);
+ assert.equal(stamped[13].$.bar.itemaProp, 'prop-2');
+ assert.equal(stamped[36].itemcProp, 'prop-3-3-1');
+ assert.equal(stamped[36].indexa, 2);
+ assert.equal(stamped[36].indexb, 2);
+ assert.equal(stamped[36].indexc, 0);
+ assert.equal(stamped[36].$.bar.itemcProp, 'prop-3-3-1');
+ assert.equal(stamped[37].itemcProp, 'prop-3-3-2');
+ assert.equal(stamped[37].indexa, 2);
+ assert.equal(stamped[37].indexb, 2);
+ assert.equal(stamped[37].indexc, 1);
+ assert.equal(stamped[37].$.bar.itemcProp, 'prop-3-3-2');
+ assert.equal(stamped[38].itemcProp, 'prop-3-3-3');
+ assert.equal(stamped[38].indexa, 2);
+ assert.equal(stamped[38].indexb, 2);
+ assert.equal(stamped[38].indexc, 2);
+ assert.equal(stamped[38].$.bar.itemcProp, 'prop-3-3-3');
+ });
+
+ test('parent scope binding', function() {
+ var stamped = configured.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped[0].outerProp, 'outer');
+ assert.equal(stamped[0].outerItemProp, 'outerItem');
+ assert.equal(stamped[1].itemaProp, 'prop-1');
+ assert.equal(stamped[1].indexa, 0);
+ assert.equal(stamped[1].outerProp, 'outer');
+ assert.equal(stamped[1].outerItemProp, 'outerItem');
+ assert.equal(stamped[2].itembProp, 'prop-1-1');
+ assert.equal(stamped[2].indexa, 0);
+ assert.equal(stamped[2].indexb, 0);
+ assert.equal(stamped[2].itemaProp, 'prop-1');
+ assert.equal(stamped[2].indexa, 0);
+ assert.equal(stamped[2].outerProp, 'outer');
+ assert.equal(stamped[2].outerItemProp, 'outerItem');
+ assert.equal(stamped[38].itembProp, 'prop-3-3');
+ assert.equal(stamped[38].indexa, 2);
+ assert.equal(stamped[38].indexb, 2);
+ assert.equal(stamped[38].itemaProp, 'prop-3');
+ assert.equal(stamped[38].indexa, 2);
+ assert.equal(stamped[38].outerProp, 'outer');
+ assert.equal(stamped[38].outerItemProp, 'outerItem');
+ });
+
+ test('parent scope downward notification', function() {
+ var stamped = configured.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ configured.prop = 'yes';
+ assert.equal(stamped[0].outerProp, 'yes');
+ assert.equal(stamped[1].outerProp, 'yes');
+ assert.equal(stamped[2].outerProp, 'yes');
+ assert.equal(stamped[38].outerProp, 'yes');
+ configured.set('item.prop', 'yay');
+ assert.equal(stamped[0].outerItemProp, 'yay');
+ assert.equal(stamped[1].outerItemProp, 'yay');
+ assert.equal(stamped[2].outerItemProp, 'yay');
+ assert.equal(stamped[38].outerItemProp, 'yay');
+ });
+
+ test('parent scope upward notification', function() {
+ var stamped = configured.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ stamped[38].outerProp = 'nice';
+ assert.equal(configured.prop, 'nice');
+ assert.equal(stamped[0].outerProp, 'nice');
+ assert.equal(stamped[1].outerProp, 'nice');
+ assert.equal(stamped[2].outerProp, 'nice');
+ assert.equal(stamped[37].outerProp, 'nice');
+ stamped[38].outerItemProp = 'cool';
+ assert.equal(configured.item.prop, 'cool');
+ assert.equal(stamped[0].outerItemProp, 'cool');
+ assert.equal(stamped[1].outerItemProp, 'cool');
+ assert.equal(stamped[2].outerItemProp, 'cool');
+ assert.equal(stamped[37].outerItemProp, 'cool');
+ });
+
+ // Anonymous inner scope feature removed for time being
+ // test('anonymous scope binding', function() {
+ // var stamped = configured.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ // stamped[1].$.bar.inneraProp = 'changed';
+ // assert.equal(stamped[1].inneraProp, 'changed');
+ // assert.equal(stamped[2].inneraProp, 'changed');
+ // assert.equal(stamped[3].inneraProp, 'changed');
+ // assert.equal(stamped[4].inneraProp, 'changed');
+ // });
+
+ test('sort function by name on host', function() {
+ // set sort fn
+ configured.$.repeater.sort = 'sortDesc';
+ configured.$.repeater.render();
+ var stamped = configured.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 3 + 3*3 + 3*3*3, 'total stamped count incorrect');
+ assert.equal(stamped[0].itemaProp, 'prop-3');
+ assert.equal(stamped[0].indexa, 0);
+ assert.equal(stamped[13].itemaProp, 'prop-2');
+ assert.equal(stamped[13].indexa, 1);
+ assert.equal(stamped[26].itemaProp, 'prop-1');
+ assert.equal(stamped[26].indexa, 2);
+ // reset sort fn
+ configured.$.repeater.sort = null;
+ configured.$.repeater.render();
+ assert.equal(stamped.length, 3 + 3*3 + 3*3*3, 'total stamped count incorrect');
+ assert.equal(stamped[0].itemaProp, 'prop-1');
+ assert.equal(stamped[0].indexa, 0);
+ assert.equal(stamped[13].itemaProp, 'prop-2');
+ assert.equal(stamped[13].indexa, 1);
+ assert.equal(stamped[26].itemaProp, 'prop-3');
+ assert.equal(stamped[26].indexa, 2);
+ });
+
+ test('sort function imperative', function() {
+ // set sort fn
+ configured.$.repeater.sort = function(a, b) {
+ return b.prop.localeCompare(a.prop);
+ };
+ configured.$.repeater.render();
+ var stamped = configured.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 3 + 3*3 + 3*3*3, 'total stamped count incorrect');
+ assert.equal(stamped[0].itemaProp, 'prop-3');
+ assert.equal(stamped[0].indexa, 0);
+ assert.equal(stamped[13].itemaProp, 'prop-2');
+ assert.equal(stamped[13].indexa, 1);
+ assert.equal(stamped[26].itemaProp, 'prop-1');
+ assert.equal(stamped[26].indexa, 2);
+ // reset sort fn
+ configured.$.repeater.sort = null;
+ configured.$.repeater.render();
+ assert.equal(stamped.length, 3 + 3*3 + 3*3*3, 'total stamped count incorrect');
+ assert.equal(stamped[0].itemaProp, 'prop-1');
+ assert.equal(stamped[0].indexa, 0);
+ assert.equal(stamped[13].itemaProp, 'prop-2');
+ assert.equal(stamped[13].indexa, 1);
+ assert.equal(stamped[26].itemaProp, 'prop-3');
+ assert.equal(stamped[26].indexa, 2);
+ });
+
+ test('filter function by name on host', function() {
+ // set filter fn
+ configured.$.repeater.filter = 'filter2nd';
+ configured.$.repeater.render();
+ var stamped = configured.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 2 + 2*3 + 2*3*3, 'total stamped count incorrect');
+ assert.equal(configured.$.repeater.renderedItemCount, 2, 'rendered item count incorrect');
+ assert.equal(stamped[0].itemaProp, 'prop-1');
+ assert.equal(stamped[0].indexa, 0);
+ assert.equal(stamped[13].itemaProp, 'prop-3');
+ assert.equal(stamped[13].indexa, 1);
+ // reset filter fn
+ configured.$.repeater.filter = null;
+ configured.$.repeater.render();
+ stamped = configured.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 3 + 3*3 + 3*3*3, 'total stamped count incorrect');
+ assert.equal(stamped[0].itemaProp, 'prop-1');
+ assert.equal(stamped[0].indexa, 0);
+ assert.equal(stamped[13].itemaProp, 'prop-2');
+ assert.equal(stamped[13].indexa, 1);
+ assert.equal(stamped[26].itemaProp, 'prop-3');
+ assert.equal(stamped[26].indexa, 2);
+ });
+
+ test('filter function imperative', function() {
+ // set filter fn
+ configured.$.repeater.filter = function(o) {
+ return o.prop.indexOf('2') < 0;
+ };
+ configured.$.repeater.render();
+ var stamped = configured.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 2 + 2*3 + 2*3*3, 'total stamped count incorrect');
+ assert.equal(stamped[0].itemaProp, 'prop-1');
+ assert.equal(stamped[0].indexa, 0);
+ assert.equal(stamped[13].itemaProp, 'prop-3');
+ assert.equal(stamped[13].indexa, 1);
+ // reset filter fn
+ configured.$.repeater.filter = null;
+ configured.$.repeater.render();
+ stamped = configured.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 3 + 3*3 + 3*3*3, 'total stamped count incorrect');
+ assert.equal(stamped[0].itemaProp, 'prop-1');
+ assert.equal(stamped[0].indexa, 0);
+ assert.equal(stamped[13].itemaProp, 'prop-2');
+ assert.equal(stamped[13].indexa, 1);
+ assert.equal(stamped[26].itemaProp, 'prop-3');
+ assert.equal(stamped[26].indexa, 2);
+ });
+
+ test('sort and filter function by name on host', function() {
+ // set filter fn
+ configured.$.repeater.sort = 'sortDesc';
+ configured.$.repeater.filter = 'filter2nd';
+ configured.$.repeater.render();
+ var stamped = configured.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 2 + 2*3 + 2*3*3, 'total stamped count incorrect');
+ assert.equal(stamped[0].itemaProp, 'prop-3');
+ assert.equal(stamped[0].indexa, 0);
+ assert.equal(stamped[13].itemaProp, 'prop-1');
+ assert.equal(stamped[13].indexa, 1);
+ // reset filter fn
+ configured.$.repeater.sort = null;
+ configured.$.repeater.filter = null;
+ configured.$.repeater.render();
+ stamped = configured.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 3 + 3*3 + 3*3*3, 'total stamped count incorrect');
+ assert.equal(stamped[0].itemaProp, 'prop-1');
+ assert.equal(stamped[0].indexa, 0);
+ assert.equal(stamped[13].itemaProp, 'prop-2');
+ assert.equal(stamped[13].indexa, 1);
+ assert.equal(stamped[26].itemaProp, 'prop-3');
+ assert.equal(stamped[26].indexa, 2);
+ });
+
+ test('observe refreshes sort and filter', function(done) {
+ // set filter fn
+ configured.$.repeater.sort = 'sortDesc';
+ configured.$.repeater.filter = 'filter2nd';
+ configured.$.repeater.render();
+ var stamped = configured.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 2 + 2*3 + 2*3*3, 'total stamped count incorrect');
+ assert.equal(stamped[0].itemaProp, 'prop-3');
+ assert.equal(stamped[0].indexa, 0);
+ assert.equal(stamped[13].itemaProp, 'prop-1');
+ assert.equal(stamped[13].indexa, 1);
+
+ // Update observed prop to be in filter
+ configured.set(['items', 1, 'prop'], 'prop-0');
+ // avoid imperative/synchronous refresh() since that forces a full refresh
+ setTimeout(function() {
+ stamped = configured.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 3 + 3*3 + 3*3*3, 'total stamped count incorrect');
+ assert.equal(stamped[0].itemaProp, 'prop-3');
+ assert.equal(stamped[0].indexa, 0);
+ assert.equal(stamped[13].itemaProp, 'prop-1');
+ assert.equal(stamped[13].indexa, 1);
+ assert.equal(stamped[26].itemaProp, 'prop-0');
+ assert.equal(stamped[26].indexa, 2);
+
+ // Update observed prop back to be out of the filter
+ configured.set(['items', 1, 'prop'], 'prop-2');
+ setTimeout(function() {
+ var stamped = configured.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 2 + 2*3 + 2*3*3, 'total stamped count incorrect');
+ assert.equal(stamped[0].itemaProp, 'prop-3');
+ assert.equal(stamped[0].indexa, 0);
+ assert.equal(stamped[13].itemaProp, 'prop-1');
+ assert.equal(stamped[13].indexa, 1);
+
+ // reset filter fn
+ configured.$.repeater.sort = null;
+ configured.$.repeater.filter = null;
+ configured.$.repeater.render();
+ stamped = configured.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 3 + 3*3 + 3*3*3, 'total stamped count incorrect');
+ assert.equal(stamped[0].itemaProp, 'prop-1');
+ assert.equal(stamped[0].indexa, 0);
+ assert.equal(stamped[13].itemaProp, 'prop-2');
+ assert.equal(stamped[13].indexa, 1);
+ assert.equal(stamped[26].itemaProp, 'prop-3');
+ assert.equal(stamped[26].indexa, 2);
+
+ done();
+ });
+ });
+ });
+
+ test('item change refreshes sort and filter', function(done) {
+ // set filter fn
+ configured.$.repeater.sort = 'sortDesc';
+ configured.$.repeater.filter = 'filter2nd';
+ configured.$.repeater.render();
+ var stamped = configured.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 2 + 2*3 + 2*3*3, 'total stamped count incorrect');
+ assert.equal(stamped[0].itemaProp, 'prop-3');
+ assert.equal(stamped[0].indexa, 0);
+ assert.equal(stamped[13].itemaProp, 'prop-1');
+ assert.equal(stamped[13].indexa, 1);
+
+ // Update observed prop to be in filter (set new object)
+ configured.set(['items', 1], Object.assign({}, configured.items[1], {prop: 'prop-0'}));
+ // avoid imperative/synchronous refresh() since that forces a full refresh
+ setTimeout(function() {
+ stamped = configured.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 3 + 3*3 + 3*3*3, 'total stamped count incorrect');
+ assert.equal(stamped[0].itemaProp, 'prop-3');
+ assert.equal(stamped[0].indexa, 0);
+ assert.equal(stamped[13].itemaProp, 'prop-1');
+ assert.equal(stamped[13].indexa, 1);
+ assert.equal(stamped[26].itemaProp, 'prop-0');
+ assert.equal(stamped[26].indexa, 2);
+
+ // Update observed prop back to be out of the filter (set new object)
+ configured.set(['items', 1], Object.assign({}, configured.items[1], {prop: 'prop-2'}));
+ setTimeout(function() {
+ var stamped = configured.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 2 + 2*3 + 2*3*3, 'total stamped count incorrect');
+ assert.equal(stamped[0].itemaProp, 'prop-3');
+ assert.equal(stamped[0].indexa, 0);
+ assert.equal(stamped[13].itemaProp, 'prop-1');
+ assert.equal(stamped[13].indexa, 1);
+
+ // reset filter fn
+ configured.$.repeater.sort = null;
+ configured.$.repeater.filter = null;
+ configured.$.repeater.render();
+ stamped = configured.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 3 + 3*3 + 3*3*3, 'total stamped count incorrect');
+ assert.equal(stamped[0].itemaProp, 'prop-1');
+ assert.equal(stamped[0].indexa, 0);
+ assert.equal(stamped[13].itemaProp, 'prop-2');
+ assert.equal(stamped[13].indexa, 1);
+ assert.equal(stamped[26].itemaProp, 'prop-3');
+ assert.equal(stamped[26].indexa, 2);
+
+ done();
+ });
+ });
+ });
+});
+
+suite('filter and sort by nested property', function () {
+ let fixtureInstance;
+
+ setup(function() {
+ fixtureInstance = fixture('filter-and-sort-by-nested-property');
+ flush();
+ });
+
+ test('change of item nested-property refreshes sort and filter', function(done) {
+ // Original values for `item.prop.nestedProp` are numbers 0 through 4
+ const repeater = fixtureInstance.$.repeater;
+ repeater.sort = (a, b) => b.prop.nestedProp - a.prop.nestedProp; // Desc order
+ repeater.filter = (a) => a.prop.nestedProp >= 1; // => Just 1 through 4
+ repeater.observe = 'prop.nestedProp';
+ repeater.render();
+
+ const stamped = fixtureInstance.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 4, 'total stamped count incorrect');
+ assert.equal(stamped[0].itemaProp, 4);
+ assert.equal(stamped[1].itemaProp, 3);
+ assert.equal(stamped[2].itemaProp, 2);
+ assert.equal(stamped[3].itemaProp, 1);
+
+ // Update observed nested prop
+ for (let i = 0; i < 5; i++) {
+ const x = fixtureInstance.get(['items', i, 'prop', 'nestedProp']);
+ fixtureInstance.set(['items', i, 'prop', 'nestedProp'], (x + 10) * 2);
+ }
+
+ // Wait for changes to be reflected to the DOM
+ setTimeout(function() {
+ const stamped = fixtureInstance.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 5, 'total stamped count incorrect');
+ assert.equal(stamped[0].itemaProp, 28);
+ assert.equal(stamped[1].itemaProp, 26);
+ assert.equal(stamped[2].itemaProp, 24);
+ assert.equal(stamped[3].itemaProp, 22);
+ assert.equal(stamped[4].itemaProp, 20);
+
+ done();
+ });
+ });
+});
+
+suite('nested un-configured dom-repeat in document', function() {
+
+ test('basic rendering, downward item binding', function() {
+ inDocumentRepeater.items = window.getData();
+ inDocumentRepeater.render();
+ var stamped = inDocumentContainerOrig.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 3 + 3*3 + 3*3*3, 'total stamped count incorrect');
+ assert.equal(stamped[0].itemaProp, 'prop-1');
+ assert.equal(stamped[0].indexa, 0);
+ assert.equal(stamped[0].$.bar.itemaProp, 'prop-1');
+ assert.equal(stamped[1].itembProp, 'prop-1-1');
+ assert.equal(stamped[1].indexa, 0);
+ assert.equal(stamped[1].indexb, 0);
+ assert.equal(stamped[1].$.bar.itembProp, 'prop-1-1');
+ assert.equal(stamped[2].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped[2].indexa, 0);
+ assert.equal(stamped[2].indexb, 0);
+ assert.equal(stamped[2].indexc, 0);
+ assert.equal(stamped[2].$.bar.itemcProp, 'prop-1-1-1');
+ assert.equal(stamped[3].itemcProp, 'prop-1-1-2');
+ assert.equal(stamped[3].indexa, 0);
+ assert.equal(stamped[3].indexb, 0);
+ assert.equal(stamped[3].indexc, 1);
+ assert.equal(stamped[3].$.bar.itemcProp, 'prop-1-1-2');
+ assert.equal(stamped[4].itemcProp, 'prop-1-1-3');
+ assert.equal(stamped[4].indexa, 0);
+ assert.equal(stamped[4].indexb, 0);
+ assert.equal(stamped[4].indexc, 2);
+ assert.equal(stamped[4].$.bar.itemcProp, 'prop-1-1-3');
+ assert.equal(stamped[13].itemaProp, 'prop-2');
+ assert.equal(stamped[13].indexa, 1);
+ assert.equal(stamped[13].$.bar.itemaProp, 'prop-2');
+ assert.equal(stamped[36].itemcProp, 'prop-3-3-1');
+ assert.equal(stamped[36].indexa, 2);
+ assert.equal(stamped[36].indexb, 2);
+ assert.equal(stamped[36].indexc, 0);
+ assert.equal(stamped[36].$.bar.itemcProp, 'prop-3-3-1');
+ assert.equal(stamped[37].itemcProp, 'prop-3-3-2');
+ assert.equal(stamped[37].indexa, 2);
+ assert.equal(stamped[37].indexb, 2);
+ assert.equal(stamped[37].indexc, 1);
+ assert.equal(stamped[37].$.bar.itemcProp, 'prop-3-3-2');
+ assert.equal(stamped[38].itemcProp, 'prop-3-3-3');
+ assert.equal(stamped[38].indexa, 2);
+ assert.equal(stamped[38].indexb, 2);
+ assert.equal(stamped[38].indexc, 2);
+ assert.equal(stamped[38].$.bar.itemcProp, 'prop-3-3-3');
+ });
+
+ test('move to different container', function() {
+ var repeater = inDocumentRepeater;
+ inDocumentContainer.appendChild(repeater);
+ var stamped = inDocumentContainer.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 3 + 3*3 + 3*3*3, 'total stamped count incorrect');
+ assert.equal(stamped[0].itemaProp, 'prop-1');
+ assert.equal(stamped[0].indexa, 0);
+ assert.equal(stamped[0].$.bar.itemaProp, 'prop-1');
+ assert.equal(stamped[1].itembProp, 'prop-1-1');
+ assert.equal(stamped[1].indexa, 0);
+ assert.equal(stamped[1].indexb, 0);
+ assert.equal(stamped[1].$.bar.itembProp, 'prop-1-1');
+ assert.equal(stamped[2].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped[2].indexa, 0);
+ assert.equal(stamped[2].indexb, 0);
+ assert.equal(stamped[2].indexc, 0);
+ assert.equal(stamped[2].$.bar.itemcProp, 'prop-1-1-1');
+ assert.equal(stamped[3].itemcProp, 'prop-1-1-2');
+ assert.equal(stamped[3].indexa, 0);
+ assert.equal(stamped[3].indexb, 0);
+ assert.equal(stamped[3].indexc, 1);
+ assert.equal(stamped[3].$.bar.itemcProp, 'prop-1-1-2');
+ assert.equal(stamped[4].itemcProp, 'prop-1-1-3');
+ assert.equal(stamped[4].indexa, 0);
+ assert.equal(stamped[4].indexb, 0);
+ assert.equal(stamped[4].indexc, 2);
+ assert.equal(stamped[4].$.bar.itemcProp, 'prop-1-1-3');
+ assert.equal(stamped[13].itemaProp, 'prop-2');
+ assert.equal(stamped[13].indexa, 1);
+ assert.equal(stamped[13].$.bar.itemaProp, 'prop-2');
+ assert.equal(stamped[36].itemcProp, 'prop-3-3-1');
+ assert.equal(stamped[36].indexa, 2);
+ assert.equal(stamped[36].indexb, 2);
+ assert.equal(stamped[36].indexc, 0);
+ assert.equal(stamped[36].$.bar.itemcProp, 'prop-3-3-1');
+ assert.equal(stamped[37].itemcProp, 'prop-3-3-2');
+ assert.equal(stamped[37].indexa, 2);
+ assert.equal(stamped[37].indexb, 2);
+ assert.equal(stamped[37].indexc, 1);
+ assert.equal(stamped[37].$.bar.itemcProp, 'prop-3-3-2');
+ assert.equal(stamped[38].itemcProp, 'prop-3-3-3');
+ assert.equal(stamped[38].indexa, 2);
+ assert.equal(stamped[38].indexb, 2);
+ assert.equal(stamped[38].indexc, 2);
+ assert.equal(stamped[38].$.bar.itemcProp, 'prop-3-3-3');
+ });
+
+ test('basic rendering, downward item binding', function() {
+ var r = inDocumentRepeater;
+ r.parentElement.removeChild(r);
+ inDocumentContainer.appendChild(r);
+
+ var stamped = inDocumentContainer.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 3 + 3*3 + 3*3*3, 'total stamped count incorrect');
+ assert.equal(stamped[0].itemaProp, 'prop-1');
+ assert.equal(stamped[0].indexa, 0);
+ assert.equal(stamped[0].$.bar.itemaProp, 'prop-1');
+ assert.equal(stamped[1].itembProp, 'prop-1-1');
+ assert.equal(stamped[1].indexa, 0);
+ assert.equal(stamped[1].indexb, 0);
+ assert.equal(stamped[1].$.bar.itembProp, 'prop-1-1');
+ assert.equal(stamped[2].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped[2].indexa, 0);
+ assert.equal(stamped[2].indexb, 0);
+ assert.equal(stamped[2].indexc, 0);
+ assert.equal(stamped[2].$.bar.itemcProp, 'prop-1-1-1');
+ assert.equal(stamped[3].itemcProp, 'prop-1-1-2');
+ assert.equal(stamped[3].indexa, 0);
+ assert.equal(stamped[3].indexb, 0);
+ assert.equal(stamped[3].indexc, 1);
+ assert.equal(stamped[3].$.bar.itemcProp, 'prop-1-1-2');
+ assert.equal(stamped[4].itemcProp, 'prop-1-1-3');
+ assert.equal(stamped[4].indexa, 0);
+ assert.equal(stamped[4].indexb, 0);
+ assert.equal(stamped[4].indexc, 2);
+ assert.equal(stamped[4].$.bar.itemcProp, 'prop-1-1-3');
+ assert.equal(stamped[13].itemaProp, 'prop-2');
+ assert.equal(stamped[13].indexa, 1);
+ assert.equal(stamped[13].$.bar.itemaProp, 'prop-2');
+ assert.equal(stamped[36].itemcProp, 'prop-3-3-1');
+ assert.equal(stamped[36].indexa, 2);
+ assert.equal(stamped[36].indexb, 2);
+ assert.equal(stamped[36].indexc, 0);
+ assert.equal(stamped[36].$.bar.itemcProp, 'prop-3-3-1');
+ assert.equal(stamped[37].itemcProp, 'prop-3-3-2');
+ assert.equal(stamped[37].indexa, 2);
+ assert.equal(stamped[37].indexb, 2);
+ assert.equal(stamped[37].indexc, 1);
+ assert.equal(stamped[37].$.bar.itemcProp, 'prop-3-3-2');
+ assert.equal(stamped[38].itemcProp, 'prop-3-3-3');
+ assert.equal(stamped[38].indexa, 2);
+ assert.equal(stamped[38].indexb, 2);
+ assert.equal(stamped[38].indexc, 2);
+ assert.equal(stamped[38].$.bar.itemcProp, 'prop-3-3-3');
+ });
+
+ test('parent scope binding', function() {
+ var stamped = inDocumentContainer.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped[1].itemaProp, 'prop-1');
+ assert.equal(stamped[1].indexa, 0);
+ assert.equal(stamped[2].itembProp, 'prop-1-1');
+ assert.equal(stamped[2].indexa, 0);
+ assert.equal(stamped[2].indexb, 0);
+ assert.equal(stamped[2].itemaProp, 'prop-1');
+ assert.equal(stamped[2].indexa, 0);
+ assert.equal(stamped[38].itembProp, 'prop-3-3');
+ assert.equal(stamped[38].indexa, 2);
+ assert.equal(stamped[38].indexb, 2);
+ assert.equal(stamped[38].itemaProp, 'prop-3');
+ assert.equal(stamped[38].indexa, 2);
+ });
+
+ // Anonymous inner scope feature removed for time being
+ // test('anonymous scope binding', function() {
+ // var stamped = inDocumentContainer.querySelectorAll('*:not(template):not(dom-repeat)');
+ // stamped[1].$.bar.inneraProp = 'changed';
+ // assert.equal(stamped[1].inneraProp, 'changed');
+ // assert.equal(stamped[2].inneraProp, 'changed');
+ // assert.equal(stamped[3].inneraProp, 'changed');
+ // assert.equal(stamped[4].inneraProp, 'changed');
+ // });
+
+});
+
+suite('nested un-configured dom-repeat', function() {
+
+ let unconfigured;
+
+ setup(function() {
+ unconfigured = fixture('unconfigured');
+ unconfigured.items = window.getData();
+ unconfigured.$.el1.prop = 'outer';
+ unconfigured.$.el1.item = {prop: 'outerItem'};
+ flush();
+ });
+
+ test('basic rendering, downward item binding', function() {
+ var stamped = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 3 + 3*3 + 3*3*3, 'total stamped count incorrect');
+ assert.equal(stamped[0].itemaProp, 'prop-1');
+ assert.equal(stamped[0].indexa, 0);
+ assert.equal(stamped[0].$.bar.itemaProp, 'prop-1');
+ assert.equal(stamped[1].itembProp, 'prop-1-1');
+ assert.equal(stamped[1].indexa, 0);
+ assert.equal(stamped[1].indexb, 0);
+ assert.equal(stamped[1].$.bar.itembProp, 'prop-1-1');
+ assert.equal(stamped[2].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped[2].indexa, 0);
+ assert.equal(stamped[2].indexb, 0);
+ assert.equal(stamped[2].indexc, 0);
+ assert.equal(stamped[2].$.bar.itemcProp, 'prop-1-1-1');
+ assert.equal(stamped[3].itemcProp, 'prop-1-1-2');
+ assert.equal(stamped[3].indexa, 0);
+ assert.equal(stamped[3].indexb, 0);
+ assert.equal(stamped[3].indexc, 1);
+ assert.equal(stamped[3].$.bar.itemcProp, 'prop-1-1-2');
+ assert.equal(stamped[4].itemcProp, 'prop-1-1-3');
+ assert.equal(stamped[4].indexa, 0);
+ assert.equal(stamped[4].indexb, 0);
+ assert.equal(stamped[4].indexc, 2);
+ assert.equal(stamped[4].$.bar.itemcProp, 'prop-1-1-3');
+ assert.equal(stamped[13].itemaProp, 'prop-2');
+ assert.equal(stamped[13].indexa, 1);
+ assert.equal(stamped[13].$.bar.itemaProp, 'prop-2');
+ assert.equal(stamped[36].itemcProp, 'prop-3-3-1');
+ assert.equal(stamped[36].indexa, 2);
+ assert.equal(stamped[36].indexb, 2);
+ assert.equal(stamped[36].indexc, 0);
+ assert.equal(stamped[36].$.bar.itemcProp, 'prop-3-3-1');
+ assert.equal(stamped[37].itemcProp, 'prop-3-3-2');
+ assert.equal(stamped[37].indexa, 2);
+ assert.equal(stamped[37].indexb, 2);
+ assert.equal(stamped[37].indexc, 1);
+ assert.equal(stamped[37].$.bar.itemcProp, 'prop-3-3-2');
+ assert.equal(stamped[38].itemcProp, 'prop-3-3-3');
+ assert.equal(stamped[38].indexa, 2);
+ assert.equal(stamped[38].indexb, 2);
+ assert.equal(stamped[38].indexc, 2);
+ assert.equal(stamped[38].$.bar.itemcProp, 'prop-3-3-3');
+ });
+
+ test('parent scope binding', function() {
+ var stamped = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped[0].outerProp, 'outer');
+ assert.equal(stamped[0].outerItemProp, 'outerItem');
+ assert.equal(stamped[1].itemaProp, 'prop-1');
+ assert.equal(stamped[1].indexa, 0);
+ assert.equal(stamped[1].outerProp, 'outer');
+ assert.equal(stamped[1].outerItemProp, 'outerItem');
+ assert.equal(stamped[2].itembProp, 'prop-1-1');
+ assert.equal(stamped[2].indexa, 0);
+ assert.equal(stamped[2].indexb, 0);
+ assert.equal(stamped[2].itemaProp, 'prop-1');
+ assert.equal(stamped[2].indexa, 0);
+ assert.equal(stamped[2].outerProp, 'outer');
+ assert.equal(stamped[2].outerItemProp, 'outerItem');
+ assert.equal(stamped[38].itembProp, 'prop-3-3');
+ assert.equal(stamped[38].indexa, 2);
+ assert.equal(stamped[38].indexb, 2);
+ assert.equal(stamped[38].itemaProp, 'prop-3');
+ assert.equal(stamped[38].indexa, 2);
+ assert.equal(stamped[38].outerProp, 'outer');
+ assert.equal(stamped[38].outerItemProp, 'outerItem');
+ });
+
+ test('parent scope downward notification', function() {
+ var stamped = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ unconfigured.$.el1.prop = 'yes';
+ assert.equal(stamped[0].outerProp, 'yes');
+ assert.equal(stamped[1].outerProp, 'yes');
+ assert.equal(stamped[2].outerProp, 'yes');
+ assert.equal(stamped[38].outerProp, 'yes');
+ unconfigured.$.el1.set('item.prop', 'yay');
+ assert.equal(stamped[0].outerItemProp, 'yay');
+ assert.equal(stamped[1].outerItemProp, 'yay');
+ assert.equal(stamped[2].outerItemProp, 'yay');
+ assert.equal(stamped[38].outerItemProp, 'yay');
+ });
+
+ test('parent scope upward notification', function() {
+ var stamped = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ stamped[38].outerProp = 'nice';
+ assert.equal(unconfigured.$.el1.prop, 'nice');
+ assert.equal(stamped[0].outerProp, 'nice');
+ assert.equal(stamped[1].outerProp, 'nice');
+ assert.equal(stamped[2].outerProp, 'nice');
+ assert.equal(stamped[37].outerProp, 'nice');
+ stamped[38].outerItemProp = 'cool';
+ assert.equal(unconfigured.$.el1.item.prop, 'cool');
+ assert.equal(stamped[0].outerItemProp, 'cool');
+ assert.equal(stamped[1].outerItemProp, 'cool');
+ assert.equal(stamped[2].outerItemProp, 'cool');
+ assert.equal(stamped[37].outerItemProp, 'cool');
+ });
+
+ // Anonymous inner scope feature removed for time being
+ // test('anonymous scope binding', function() {
+ // var stamped = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ // stamped[1].$.bar.inneraProp = 'changed';
+ // assert.equal(stamped[1].inneraProp, 'changed');
+ // assert.equal(stamped[2].inneraProp, 'changed');
+ // assert.equal(stamped[3].inneraProp, 'changed');
+ // assert.equal(stamped[4].inneraProp, 'changed');
+ // });
+
+ test('event handlers', function() {
+ var stamped = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ stamped[0].fire('test1');
+ assert.equal(unconfigured.$.el1.testHandler1Count, 1);
+ stamped[1].fire('test2');
+ assert.equal(unconfigured.$.el1.testHandler2Count, 1);
+ stamped[2].fire('test3');
+ assert.equal(unconfigured.$.el1.testHandler3Count, 1);
+ });
+
+});
+
+suite('array notification between two dom-repeats', function() {
+
+ let unconfigured;
+
+ setup(function() {
+ unconfigured = fixture('unconfigured');
+ unconfigured.items = window.getData();
+ flush();
+ });
+
+ test('change to item from one dom-repeat to other', function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ var stamped2 = unconfigured.$.el2.root.querySelectorAll('*:not(template):not(dom-repeat)');
+
+ assert.equal(stamped1[0].itemaProp, 'prop-1');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped2[0].itemaProp, 'prop-1');
+ assert.equal(stamped2[0].indexa, 0);
+ stamped1[0].$.bar.itemaProp = 'changed';
+ assert.equal(stamped2[0].itemaProp, 'changed');
+ stamped2[0].$.bar.itemaProp = 'prop-1';
+ assert.equal(stamped1[0].itemaProp, 'prop-1');
+ assert.equal(stamped1[0].indexa, 0);
+
+ assert.equal(stamped1[1].itembProp, 'prop-1-1');
+ assert.equal(stamped1[1].indexa, 0);
+ assert.equal(stamped1[1].indexb, 0);
+ assert.equal(stamped2[1].itembProp, 'prop-1-1');
+ assert.equal(stamped2[1].indexa, 0);
+ assert.equal(stamped2[1].indexb, 0);
+ stamped1[1].$.bar.itembProp = 'changed';
+ assert.equal(stamped2[1].itembProp, 'changed');
+ stamped2[1].$.bar.itembProp = 'prop-1-1';
+ assert.equal(stamped1[1].itembProp, 'prop-1-1');
+ assert.equal(stamped1[1].indexa, 0);
+ assert.equal(stamped1[1].indexb, 0);
+
+ assert.equal(stamped1[2].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped1[2].indexa, 0);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[2].indexc, 0);
+ assert.equal(stamped2[2].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped2[2].indexa, 0);
+ assert.equal(stamped2[2].indexb, 0);
+ assert.equal(stamped2[2].indexc, 0);
+ stamped1[2].$.bar.itemcProp = 'changed';
+ assert.equal(stamped2[2].itemcProp, 'changed');
+ stamped2[2].$.bar.itemcProp = 'prop-1-1-1';
+ assert.equal(stamped1[2].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped1[2].indexa, 0);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[2].indexc, 0);
+
+ assert.equal(stamped1[38].itemcProp, 'prop-3-3-3');
+ assert.equal(stamped1[38].indexa, 2);
+ assert.equal(stamped1[38].indexb, 2);
+ assert.equal(stamped1[38].indexc, 2);
+ assert.equal(stamped2[38].itemcProp, 'prop-3-3-3');
+ assert.equal(stamped2[38].indexa, 2);
+ assert.equal(stamped2[38].indexb, 2);
+ assert.equal(stamped2[38].indexc, 2);
+ stamped1[38].$.bar.itemcProp = 'changed';
+ assert.equal(stamped2[38].itemcProp, 'changed');
+ stamped2[38].$.bar.itemcProp = 'prop-3-3-3';
+ assert.equal(stamped1[38].itemcProp, 'prop-3-3-3');
+ assert.equal(stamped1[38].indexa, 2);
+ assert.equal(stamped1[38].indexb, 2);
+ assert.equal(stamped1[38].indexc, 2);
+ });
+
+ test('change to non-item scope doesn\'t affect other dom-repeat', function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ var stamped2 = unconfigured.$.el2.root.querySelectorAll('*:not(template):not(dom-repeat)');
+
+ unconfigured.$.el1.prop = 'foo';
+ unconfigured.$.el2.prop = 'bar';
+ assert.equal(stamped1[0].outerProp, 'foo');
+ assert.equal(stamped1[1].outerProp, 'foo');
+ assert.equal(stamped1[2].outerProp, 'foo');
+ assert.equal(stamped2[0].outerProp, 'bar');
+ assert.equal(stamped2[1].outerProp, 'bar');
+ assert.equal(stamped2[2].outerProp, 'bar');
+
+ stamped1[1].$.bar.inneraProp = 'bar';
+ });
+
+});
+
+suite('reacting to changes, array sort', function() {
+
+ let unconfigured;
+
+ setup(function() {
+ unconfigured = fixture('unconfigured');
+ unconfigured.items = window.getData();
+ flush();
+ unconfigured.$.el1.domUpdateHandlerCount = 0;
+ });
+
+ test('push', function(done) {
+ unconfigured.push('items', {prop: 'new-1'}, {prop: 'new-2'});
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ var stamped2 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 2 + 3 + 3*3 + 3*3*3, 'total stamped count incorrect');
+ assert.equal(stamped2.length, 2 + 3 + 3*3 + 3*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[38].itemcProp, 'prop-3-3-3');
+ assert.equal(stamped1[38].indexa, 2);
+ assert.equal(stamped1[38].indexb, 2);
+ assert.equal(stamped1[38].indexc, 2);
+ assert.equal(stamped1[39].itemaProp, 'new-1');
+ assert.equal(stamped1[40].itemaProp, 'new-2');
+ assert.equal(stamped1[41], undefined);
+ assert.equal(stamped2[38].itemcProp, 'prop-3-3-3');
+ assert.equal(stamped2[38].indexa, 2);
+ assert.equal(stamped2[38].indexb, 2);
+ assert.equal(stamped2[38].indexc, 2);
+ assert.equal(stamped2[39].itemaProp, 'new-1');
+ assert.equal(stamped2[40].itemaProp, 'new-2');
+ assert.equal(stamped2[41], undefined);
+ assert.equal(unconfigured.$.el1.domUpdateHandlerCount, 1);
+ done();
+ });
+ });
+
+ test('pop', function(done) {
+ unconfigured.pop('items');
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ var stamped2 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 2 + 2*3 + 2*3*3, 'total stamped count incorrect');
+ assert.equal(stamped2.length, 2 + 2*3 + 2*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[25].itemcProp, 'prop-2-3-3');
+ assert.equal(stamped1[25].indexa, 1);
+ assert.equal(stamped1[25].indexb, 2);
+ assert.equal(stamped1[25].indexc, 2);
+ assert.equal(stamped1[26], undefined);
+ assert.equal(stamped2[25].itemcProp, 'prop-2-3-3');
+ assert.equal(stamped2[25].indexa, 1);
+ assert.equal(stamped2[25].indexb, 2);
+ assert.equal(stamped2[25].indexc, 2);
+ assert.equal(stamped2[26], undefined);
+ done();
+ });
+ });
+
+ test('unshift', function(done) {
+ unconfigured.unshift('items', {prop: 'new-1'}, {prop: 'new-2'});
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ var stamped2 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 2 + 3 + 3*3 + 3*3*3, 'total stamped count incorrect');
+ assert.equal(stamped2.length, 2 + 3 + 3*3 + 3*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'new-1');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itemaProp, 'new-2');
+ assert.equal(stamped1[1].indexa, 1);
+ assert.equal(stamped1[2].itemaProp, 'prop-1');
+ assert.equal(stamped1[2].indexa, 2);
+ assert.equal(stamped2[0].itemaProp, 'new-1');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped2[1].itemaProp, 'new-2');
+ assert.equal(stamped1[1].indexa, 1);
+ assert.equal(stamped2[2].itemaProp, 'prop-1');
+ assert.equal(stamped2[2].indexa, 2);
+ done();
+ });
+ });
+
+ test('shift', function(done) {
+ unconfigured.shift('items');
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ var stamped2 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 2 + 2*3 + 2*3*3, 'total stamped count incorrect');
+ assert.equal(stamped2.length, 2 + 2*3 + 2*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'prop-2');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itembProp, 'prop-2-1');
+ assert.equal(stamped1[1].indexa, 0);
+ assert.equal(stamped1[1].indexb, 0);
+ assert.equal(stamped1[2].itemcProp, 'prop-2-1-1');
+ assert.equal(stamped1[2].indexa, 0);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[2].indexc, 0);
+ assert.equal(stamped2[0].itemaProp, 'prop-2');
+ assert.equal(stamped2[0].indexa, 0);
+ assert.equal(stamped2[1].itembProp, 'prop-2-1');
+ assert.equal(stamped2[1].indexa, 0);
+ assert.equal(stamped2[1].indexb, 0);
+ assert.equal(stamped2[2].itemcProp, 'prop-2-1-1');
+ assert.equal(stamped2[2].indexa, 0);
+ assert.equal(stamped2[2].indexb, 0);
+ assert.equal(stamped2[2].indexc, 0);
+ done();
+ });
+ });
+
+ test('splice - remove from middle', function(done) {
+ unconfigured.splice('items', 1, 1)[0];
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ var stamped2 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 2 + 2*3 + 2*3*3, 'total stamped count incorrect');
+ assert.equal(stamped2.length, 2 + 2*3 + 2*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'prop-1');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itembProp, 'prop-1-1');
+ assert.equal(stamped1[1].indexa, 0);
+ assert.equal(stamped1[1].indexb, 0);
+ assert.equal(stamped1[2].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped1[2].indexa, 0);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[2].indexc, 0);
+ assert.equal(stamped1[13].itemaProp, 'prop-3');
+ assert.equal(stamped1[13].indexa, 1);
+ assert.equal(stamped1[14].itembProp, 'prop-3-1');
+ assert.equal(stamped1[14].indexa, 1);
+ assert.equal(stamped1[14].indexb, 0);
+ assert.equal(stamped1[15].itemcProp, 'prop-3-1-1');
+ assert.equal(stamped1[15].indexa, 1);
+ assert.equal(stamped1[15].indexb, 0);
+ assert.equal(stamped1[15].indexc, 0);
+ assert.equal(stamped2[0].itemaProp, 'prop-1');
+ assert.equal(stamped2[0].indexa, 0);
+ assert.equal(stamped2[1].itembProp, 'prop-1-1');
+ assert.equal(stamped2[1].indexa, 0);
+ assert.equal(stamped2[1].indexb, 0);
+ assert.equal(stamped2[2].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped2[2].indexa, 0);
+ assert.equal(stamped2[2].indexb, 0);
+ assert.equal(stamped2[2].indexc, 0);
+ assert.equal(stamped2[13].itemaProp, 'prop-3');
+ assert.equal(stamped2[13].indexa, 1);
+ assert.equal(stamped2[14].itembProp, 'prop-3-1');
+ assert.equal(stamped2[14].indexa, 1);
+ assert.equal(stamped2[14].indexb, 0);
+ assert.equal(stamped2[15].itemcProp, 'prop-3-1-1');
+ assert.equal(stamped2[15].indexa, 1);
+ assert.equal(stamped2[15].indexb, 0);
+ assert.equal(stamped2[15].indexc, 0);
+ done();
+ });
+ });
+
+ test('splice - add to middle', function(done) {
+ unconfigured.splice('items', 1, 0, {prop: 'new-1'}, {prop: 'new-2'});
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ var stamped2 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 2 + 3 + 3*3 + 3*3*3, 'total stamped count incorrect');
+ assert.equal(stamped2.length, 2 + 3 + 3*3 + 3*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'prop-1');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itembProp, 'prop-1-1');
+ assert.equal(stamped1[1].indexa, 0);
+ assert.equal(stamped1[1].indexb, 0);
+ assert.equal(stamped1[2].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped1[2].indexa, 0);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[2].indexc, 0);
+ assert.equal(stamped1[13].itemaProp, 'new-1');
+ assert.equal(stamped1[13].indexa, 1);
+ assert.equal(stamped1[14].itemaProp, 'new-2');
+ assert.equal(stamped1[14].indexa, 2);
+ assert.equal(stamped1[15].itemaProp, 'prop-2');
+ assert.equal(stamped1[15].indexa, 3);
+ assert.equal(stamped1[16].itembProp, 'prop-2-1');
+ assert.equal(stamped1[16].indexa, 3);
+ assert.equal(stamped1[16].indexb, 0);
+ assert.equal(stamped1[17].itemcProp, 'prop-2-1-1');
+ assert.equal(stamped1[17].indexa, 3);
+ assert.equal(stamped1[17].indexb, 0);
+ assert.equal(stamped1[17].indexc, 0);
+ assert.equal(stamped2[0].itemaProp, 'prop-1');
+ assert.equal(stamped2[0].indexa, 0);
+ assert.equal(stamped2[1].itembProp, 'prop-1-1');
+ assert.equal(stamped2[1].indexa, 0);
+ assert.equal(stamped2[1].indexb, 0);
+ assert.equal(stamped2[2].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped2[2].indexa, 0);
+ assert.equal(stamped2[2].indexb, 0);
+ assert.equal(stamped2[2].indexc, 0);
+ assert.equal(stamped2[13].itemaProp, 'new-1');
+ assert.equal(stamped2[13].indexa, 1);
+ assert.equal(stamped2[14].itemaProp, 'new-2');
+ assert.equal(stamped2[14].indexa, 2);
+ assert.equal(stamped2[15].itemaProp, 'prop-2');
+ assert.equal(stamped2[15].indexa, 3);
+ assert.equal(stamped2[16].itembProp, 'prop-2-1');
+ assert.equal(stamped2[16].indexa, 3);
+ assert.equal(stamped2[16].indexb, 0);
+ assert.equal(stamped2[17].itemcProp, 'prop-2-1-1');
+ assert.equal(stamped2[17].indexa, 3);
+ assert.equal(stamped2[17].indexb, 0);
+ assert.equal(stamped2[17].indexc, 0);
+ done();
+ });
+ });
+
+ test('splice - replace in middle', function(done) {
+ unconfigured.splice('items', 1, 2, {prop: 'new-1'}, {prop: 'new-2'});
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ var stamped2 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 2 + 1 + 1*3 + 1*3*3, 'total stamped count incorrect');
+ assert.equal(stamped2.length, 2 + 1 + 1*3 + 1*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'prop-1');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itembProp, 'prop-1-1');
+ assert.equal(stamped1[1].indexa, 0);
+ assert.equal(stamped1[1].indexb, 0);
+ assert.equal(stamped1[2].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped1[2].indexa, 0);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[2].indexc, 0);
+ assert.equal(stamped1[13].itemaProp, 'new-1');
+ assert.equal(stamped1[13].indexa, 1);
+ assert.equal(stamped1[14].itemaProp, 'new-2');
+ assert.equal(stamped1[14].indexa, 2);
+ assert.equal(stamped1[15], undefined);
+ assert.equal(stamped2[0].itemaProp, 'prop-1');
+ assert.equal(stamped2[0].indexa, 0);
+ assert.equal(stamped2[1].itembProp, 'prop-1-1');
+ assert.equal(stamped2[1].indexa, 0);
+ assert.equal(stamped2[1].indexb, 0);
+ assert.equal(stamped2[2].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped2[2].indexa, 0);
+ assert.equal(stamped2[2].indexb, 0);
+ assert.equal(stamped2[2].indexc, 0);
+ assert.equal(stamped2[13].itemaProp, 'new-1');
+ assert.equal(stamped2[13].indexa, 1);
+ assert.equal(stamped2[14].itemaProp, 'new-2');
+ assert.equal(stamped2[14].indexa, 2);
+ assert.equal(stamped2[15], undefined);
+ done();
+ });
+ });
+
+});
+
+suite('reacting to changes, array sort with filter', function() {
+
+ let unconfigured;
+
+ setup(function() {
+ unconfigured = fixture('unconfigured');
+ unconfigured.items = window.getData();
+ unconfigured.$.el1.$.repeater.filter = function(o) {
+ return o.prop.indexOf('2') < 0;
+ };
+ flush();
+ });
+
+ test('push', function(done) {
+ unconfigured.push('items', {prop: 'new-1'}, {prop: 'new-2'});
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 1 + 2 + 2*3 + 2*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'prop-1');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itembProp, 'prop-1-1');
+ assert.equal(stamped1[1].indexa, 0);
+ assert.equal(stamped1[1].indexb, 0);
+ assert.equal(stamped1[2].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped1[2].indexa, 0);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[2].indexc, 0);
+ assert.equal(stamped1[23].itemcProp, 'prop-3-3-1');
+ assert.equal(stamped1[23].indexa, 1);
+ assert.equal(stamped1[23].indexb, 2);
+ assert.equal(stamped1[23].indexc, 0);
+ assert.equal(stamped1[24].itemcProp, 'prop-3-3-2');
+ assert.equal(stamped1[24].indexa, 1);
+ assert.equal(stamped1[24].indexb, 2);
+ assert.equal(stamped1[24].indexc, 1);
+ assert.equal(stamped1[25].itemcProp, 'prop-3-3-3');
+ assert.equal(stamped1[25].indexa, 1);
+ assert.equal(stamped1[25].indexb, 2);
+ assert.equal(stamped1[25].indexc, 2);
+ assert.equal(stamped1[26].itemaProp, 'new-1');
+ assert.equal(stamped1[26].indexa, 2);
+ assert.equal(stamped1[27], undefined);
+ done();
+ });
+ });
+
+ test('pop', function(done) {
+ unconfigured.pop('items');
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 1 + 1*3 + 1*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'prop-1');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itembProp, 'prop-1-1');
+ assert.equal(stamped1[1].indexa, 0);
+ assert.equal(stamped1[1].indexb, 0);
+ assert.equal(stamped1[2].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped1[2].indexa, 0);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[2].indexc, 0);
+ assert.equal(stamped1[10].itemcProp, 'prop-1-3-1');
+ assert.equal(stamped1[10].indexa, 0);
+ assert.equal(stamped1[10].indexb, 2);
+ assert.equal(stamped1[10].indexc, 0);
+ assert.equal(stamped1[11].itemcProp, 'prop-1-3-2');
+ assert.equal(stamped1[11].indexa, 0);
+ assert.equal(stamped1[11].indexb, 2);
+ assert.equal(stamped1[11].indexc, 1);
+ assert.equal(stamped1[12].itemcProp, 'prop-1-3-3');
+ assert.equal(stamped1[12].indexa, 0);
+ assert.equal(stamped1[12].indexb, 2);
+ assert.equal(stamped1[12].indexc, 2);
+ assert.equal(stamped1[13], undefined);
+ done();
+ });
+ });
+
+ test('unshift', function(done) {
+ unconfigured.unshift('items', {prop: 'new-1'}, {prop: 'new-2'});
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 1 + 2 + 2*3 + 2*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'new-1');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itemaProp, 'prop-1');
+ assert.equal(stamped1[1].indexa, 1);
+ assert.equal(stamped1[2].itembProp, 'prop-1-1');
+ assert.equal(stamped1[2].indexa, 1);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[3].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped1[3].indexa, 1);
+ assert.equal(stamped1[3].indexb, 0);
+ assert.equal(stamped1[3].indexc, 0);
+ done();
+ });
+ });
+
+ test('shift', function(done) {
+ unconfigured.shift('items');
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 1 + 1*3 + 1*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'prop-3');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itembProp, 'prop-3-1');
+ assert.equal(stamped1[1].indexa, 0);
+ assert.equal(stamped1[1].indexb, 0);
+ assert.equal(stamped1[2].itemcProp, 'prop-3-1-1');
+ assert.equal(stamped1[2].indexa, 0);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[2].indexc, 0);
+ assert.equal(stamped1[10].itemcProp, 'prop-3-3-1');
+ assert.equal(stamped1[10].indexa, 0);
+ assert.equal(stamped1[10].indexb, 2);
+ assert.equal(stamped1[10].indexc, 0);
+ assert.equal(stamped1[11].itemcProp, 'prop-3-3-2');
+ assert.equal(stamped1[11].indexa, 0);
+ assert.equal(stamped1[11].indexb, 2);
+ assert.equal(stamped1[11].indexc, 1);
+ assert.equal(stamped1[12].itemcProp, 'prop-3-3-3');
+ assert.equal(stamped1[12].indexa, 0);
+ assert.equal(stamped1[12].indexb, 2);
+ assert.equal(stamped1[12].indexc, 2);
+ assert.equal(stamped1[13], undefined);
+ done();
+ });
+ });
+
+ test('splice - remove from middle', function(done) {
+ unconfigured.splice('items', 1, 1)[0];
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 2 + 2*3 + 2*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'prop-1');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itembProp, 'prop-1-1');
+ assert.equal(stamped1[1].indexa, 0);
+ assert.equal(stamped1[1].indexb, 0);
+ assert.equal(stamped1[2].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped1[2].indexa, 0);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[2].indexc, 0);
+ assert.equal(stamped1[23].itemcProp, 'prop-3-3-1');
+ assert.equal(stamped1[23].indexa, 1);
+ assert.equal(stamped1[23].indexb, 2);
+ assert.equal(stamped1[23].indexc, 0);
+ assert.equal(stamped1[24].itemcProp, 'prop-3-3-2');
+ assert.equal(stamped1[24].indexa, 1);
+ assert.equal(stamped1[24].indexb, 2);
+ assert.equal(stamped1[24].indexc, 1);
+ assert.equal(stamped1[25].itemcProp, 'prop-3-3-3');
+ assert.equal(stamped1[25].indexa, 1);
+ assert.equal(stamped1[25].indexb, 2);
+ assert.equal(stamped1[25].indexc, 2);
+ assert.equal(stamped1[26], undefined);
+ done();
+ });
+ });
+
+ test('splice - add to middle', function(done) {
+ unconfigured.splice('items', 1, 0, {prop: 'new-1'}, {prop: 'new-2'});
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 1 + 2 + 2*3 + 2*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'prop-1');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itembProp, 'prop-1-1');
+ assert.equal(stamped1[1].indexa, 0);
+ assert.equal(stamped1[1].indexb, 0);
+ assert.equal(stamped1[2].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped1[2].indexa, 0);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[2].indexc, 0);
+ assert.equal(stamped1[13].itemaProp, 'new-1');
+ assert.equal(stamped1[13].indexa, 1);
+ assert.equal(stamped1[14].itemaProp, 'prop-3');
+ assert.equal(stamped1[14].indexa, 2);
+ assert.equal(stamped1[15].itembProp, 'prop-3-1');
+ assert.equal(stamped1[15].indexa, 2);
+ assert.equal(stamped1[15].indexb, 0);
+ assert.equal(stamped1[16].itemcProp, 'prop-3-1-1');
+ assert.equal(stamped1[16].indexa, 2);
+ assert.equal(stamped1[16].indexb, 0);
+ assert.equal(stamped1[16].indexc, 0);
+ done();
+ });
+ });
+
+ test('splice - replace in middle', function(done) {
+ unconfigured.splice('items', 1, 2, {prop: 'new-1'}, {prop: 'new-2'});
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 1 + 1 + 1*3 + 1*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'prop-1');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itembProp, 'prop-1-1');
+ assert.equal(stamped1[1].indexa, 0);
+ assert.equal(stamped1[1].indexb, 0);
+ assert.equal(stamped1[2].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped1[2].indexa, 0);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[2].indexc, 0);
+ assert.equal(stamped1[13].itemaProp, 'new-1');
+ assert.equal(stamped1[14], undefined);
+ done();
+ });
+ });
+
+});
+
+suite('reacting to changes, view sort', function() {
+
+ let unconfigured;
+
+ setup(function() {
+ unconfigured = fixture('unconfigured');
+ unconfigured.items = window.getData();
+ unconfigured.$.el1.$.repeater.sort = function(a, b) {
+ return b.prop == a.prop ? 0 : b.prop < a.prop ? -1 : 1;
+ };
+ flush();
+ });
+
+ test('push', function(done) {
+ unconfigured.push('items', {prop: 'a'}, {prop: 'prop-1*'}, {prop: 'z'});
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 3 + 3 + 3*3 + 3*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'z');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itemaProp, 'prop-3');
+ assert.equal(stamped1[1].indexa, 1);
+ assert.equal(stamped1[2].itembProp, 'prop-3-1');
+ assert.equal(stamped1[2].indexa, 1);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[3].itemcProp, 'prop-3-1-1');
+ assert.equal(stamped1[3].indexa, 1);
+ assert.equal(stamped1[3].indexb, 0);
+ assert.equal(stamped1[3].indexc, 0);
+ assert.equal(stamped1[27].itemaProp, 'prop-1*');
+ assert.equal(stamped1[27].indexa, 3);
+ assert.equal(stamped1[40].itemcProp, 'prop-1-3-3');
+ assert.equal(stamped1[40].indexa, 4);
+ assert.equal(stamped1[40].indexb, 2);
+ assert.equal(stamped1[40].indexc, 2);
+ assert.equal(stamped1[41].itemaProp, 'a');
+ assert.equal(stamped1[41].indexa, 5);
+ done();
+ });
+ });
+
+ test('pop', function(done) {
+ unconfigured.pop('items');
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 2 + 2*3 + 2*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[25].itemcProp, 'prop-1-3-3');
+ assert.equal(stamped1[25].indexa, 1);
+ assert.equal(stamped1[25].indexb, 2);
+ assert.equal(stamped1[25].indexc, 2);
+ assert.equal(stamped1[26], undefined);
+ done();
+ });
+ });
+
+ test('unshift', function(done) {
+ unconfigured.unshift('items', {prop: 'a'}, {prop: 'prop-1*'}, {prop: 'z'});
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 3 + 3 + 3*3 + 3*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'z');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itemaProp, 'prop-3');
+ assert.equal(stamped1[1].indexa, 1);
+ assert.equal(stamped1[2].itembProp, 'prop-3-1');
+ assert.equal(stamped1[2].indexa, 1);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[3].itemcProp, 'prop-3-1-1');
+ assert.equal(stamped1[3].indexa, 1);
+ assert.equal(stamped1[3].indexb, 0);
+ assert.equal(stamped1[3].indexc, 0);
+ assert.equal(stamped1[27].itemaProp, 'prop-1*');
+ assert.equal(stamped1[27].indexa, 3);
+ assert.equal(stamped1[40].itemcProp, 'prop-1-3-3');
+ assert.equal(stamped1[40].indexa, 4);
+ assert.equal(stamped1[40].indexb, 2);
+ assert.equal(stamped1[40].indexc, 2);
+ assert.equal(stamped1[41].itemaProp, 'a');
+ assert.equal(stamped1[41].indexa, 5);
+ done();
+ });
+ });
+
+ test('shift', function(done) {
+ unconfigured.shift('items');
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 2 + 2*3 + 2*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'prop-3');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itembProp, 'prop-3-1');
+ assert.equal(stamped1[1].indexa, 0);
+ assert.equal(stamped1[1].indexb, 0);
+ assert.equal(stamped1[2].itemcProp, 'prop-3-1-1');
+ assert.equal(stamped1[2].indexa, 0);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[2].indexc, 0);
+ assert.equal(stamped1[23].itemcProp, 'prop-2-3-1');
+ assert.equal(stamped1[23].indexa, 1);
+ assert.equal(stamped1[23].indexb, 2);
+ assert.equal(stamped1[23].indexc, 0);
+ assert.equal(stamped1[24].itemcProp, 'prop-2-3-2');
+ assert.equal(stamped1[24].indexa, 1);
+ assert.equal(stamped1[24].indexb, 2);
+ assert.equal(stamped1[24].indexc, 1);
+ assert.equal(stamped1[25].itemcProp, 'prop-2-3-3');
+ assert.equal(stamped1[25].indexa, 1);
+ assert.equal(stamped1[25].indexb, 2);
+ assert.equal(stamped1[25].indexc, 2);
+ assert.equal(stamped1[26], undefined);
+ done();
+ });
+ });
+
+ test('splice - remove from middle', function(done) {
+ unconfigured.splice('items', 1, 1)[0];
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 2 + 2*3 + 2*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'prop-3');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itembProp, 'prop-3-1');
+ assert.equal(stamped1[1].indexa, 0);
+ assert.equal(stamped1[1].indexb, 0);
+ assert.equal(stamped1[2].itemcProp, 'prop-3-1-1');
+ assert.equal(stamped1[2].indexa, 0);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[2].indexc, 0);
+ assert.equal(stamped1[13].itemaProp, 'prop-1');
+ assert.equal(stamped1[13].indexa, 1);
+ assert.equal(stamped1[14].itembProp, 'prop-1-1');
+ assert.equal(stamped1[14].indexa, 1);
+ assert.equal(stamped1[14].indexb, 0);
+ assert.equal(stamped1[15].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped1[15].indexa, 1);
+ assert.equal(stamped1[15].indexb, 0);
+ assert.equal(stamped1[15].indexc, 0);
+ assert.equal(stamped1[23].itemcProp, 'prop-1-3-1');
+ assert.equal(stamped1[23].indexa, 1);
+ assert.equal(stamped1[23].indexb, 2);
+ assert.equal(stamped1[23].indexc, 0);
+ assert.equal(stamped1[24].itemcProp, 'prop-1-3-2');
+ assert.equal(stamped1[24].indexa, 1);
+ assert.equal(stamped1[24].indexb, 2);
+ assert.equal(stamped1[24].indexc, 1);
+ assert.equal(stamped1[25].itemcProp, 'prop-1-3-3');
+ assert.equal(stamped1[25].indexa, 1);
+ assert.equal(stamped1[25].indexb, 2);
+ assert.equal(stamped1[25].indexc, 2);
+ assert.equal(stamped1[26], undefined);
+ done();
+ });
+ });
+
+ test('splice - add to middle', function(done) {
+ unconfigured.splice('items', 1, 0, {prop: 'a'}, {prop: 'prop-1*'}, {prop: 'z'});
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 3 + 3 + 3*3 + 3*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'z');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itemaProp, 'prop-3');
+ assert.equal(stamped1[1].indexa, 1);
+ assert.equal(stamped1[2].itembProp, 'prop-3-1');
+ assert.equal(stamped1[2].indexa, 1);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[3].itemcProp, 'prop-3-1-1');
+ assert.equal(stamped1[3].indexa, 1);
+ assert.equal(stamped1[3].indexb, 0);
+ assert.equal(stamped1[3].indexc, 0);
+ assert.equal(stamped1[27].itemaProp, 'prop-1*');
+ assert.equal(stamped1[27].indexa, 3);
+ assert.equal(stamped1[40].itemcProp, 'prop-1-3-3');
+ assert.equal(stamped1[40].indexa, 4);
+ assert.equal(stamped1[40].indexb, 2);
+ assert.equal(stamped1[40].indexc, 2);
+ assert.equal(stamped1[41].itemaProp, 'a');
+ assert.equal(stamped1[41].indexa, 5);
+ done();
+ });
+ });
+
+ test('splice - replace in middle', function(done) {
+ unconfigured.splice('items', 1, 2, {prop: 'a'}, {prop: 'prop-1*'}, {prop: 'z'});
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 3 + 1 + 1*3 + 1*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'z');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itemaProp, 'prop-1*');
+ assert.equal(stamped1[1].indexa, 1);
+ assert.equal(stamped1[2].itemaProp, 'prop-1');
+ assert.equal(stamped1[2].indexa, 2);
+ assert.equal(stamped1[3].itembProp, 'prop-1-1');
+ assert.equal(stamped1[3].indexa, 2);
+ assert.equal(stamped1[3].indexb, 0);
+ assert.equal(stamped1[4].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped1[4].indexa, 2);
+ assert.equal(stamped1[4].indexb, 0);
+ assert.equal(stamped1[4].indexc, 0);
+ assert.equal(stamped1[15].itemaProp, 'a');
+ assert.equal(stamped1[15].indexa, 3);
+ assert.equal(stamped1[16], undefined);
+ done();
+ });
+ });
+
+});
+
+suite('reacting to changes, view sort with filter', function() {
+
+ var unconfigured;
+
+ setup(function() {
+ unconfigured = fixture('unconfigured');
+ unconfigured.items = window.getData();
+ unconfigured.$.el1.$.repeater.sort = function(a, b) {
+ return b.prop == a.prop ? 0 : b.prop < a.prop ? -1 : 1;
+ };
+ unconfigured.$.el1.$.repeater.filter = function(o) {
+ return o.prop.indexOf('2') < 0;
+ };
+ flush();
+ });
+
+ test('push', function(done) {
+ unconfigured.push('items', {prop: 'a'}, {prop: 'item*2'}, {prop: 'z'});
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 2 + 2 + 2*3 + 2*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'z');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itemaProp, 'prop-3');
+ assert.equal(stamped1[1].indexa, 1);
+ assert.equal(stamped1[2].itembProp, 'prop-3-1');
+ assert.equal(stamped1[2].indexa, 1);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[3].itemcProp, 'prop-3-1-1');
+ assert.equal(stamped1[3].indexa, 1);
+ assert.equal(stamped1[3].indexb, 0);
+ assert.equal(stamped1[3].indexc, 0);
+ assert.equal(stamped1[26].itemcProp, 'prop-1-3-3');
+ assert.equal(stamped1[26].indexa, 2);
+ assert.equal(stamped1[26].indexb, 2);
+ assert.equal(stamped1[26].indexc, 2);
+ assert.equal(stamped1[27].itemaProp, 'a');
+ assert.equal(stamped1[27].indexa, 3);
+ assert.equal(stamped1[28], undefined);
+ done();
+ });
+ });
+
+ test('pop', function(done) {
+ unconfigured.pop('items');
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 1 + 1*3 + 1*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'prop-1');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itembProp, 'prop-1-1');
+ assert.equal(stamped1[1].indexa, 0);
+ assert.equal(stamped1[1].indexb, 0);
+ assert.equal(stamped1[2].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped1[2].indexa, 0);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[2].indexc, 0);
+ assert.equal(stamped1[12].itemcProp, 'prop-1-3-3');
+ assert.equal(stamped1[12].indexa, 0);
+ assert.equal(stamped1[12].indexb, 2);
+ assert.equal(stamped1[12].indexc, 2);
+ assert.equal(stamped1[13], undefined);
+ done();
+ });
+ });
+
+ test('unshift', function(done) {
+ unconfigured.unshift('items', {prop: 'a'}, {prop: 'item*2'}, {prop: 'z'});
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 2 + 2 + 2*3 + 2*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'z');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itemaProp, 'prop-3');
+ assert.equal(stamped1[1].indexa, 1);
+ assert.equal(stamped1[2].itembProp, 'prop-3-1');
+ assert.equal(stamped1[2].indexa, 1);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[3].itemcProp, 'prop-3-1-1');
+ assert.equal(stamped1[3].indexa, 1);
+ assert.equal(stamped1[3].indexb, 0);
+ assert.equal(stamped1[3].indexc, 0);
+ assert.equal(stamped1[26].itemcProp, 'prop-1-3-3');
+ assert.equal(stamped1[26].indexa, 2);
+ assert.equal(stamped1[26].indexb, 2);
+ assert.equal(stamped1[26].indexc, 2);
+ assert.equal(stamped1[27].itemaProp, 'a');
+ assert.equal(stamped1[27].indexa, 3);
+ assert.equal(stamped1[28], undefined);
+ done();
+ });
+ });
+
+ test('shift', function(done) {
+ unconfigured.shift('items');
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 1 + 1*3 + 1*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'prop-3');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itembProp, 'prop-3-1');
+ assert.equal(stamped1[1].indexa, 0);
+ assert.equal(stamped1[1].indexb, 0);
+ assert.equal(stamped1[2].itemcProp, 'prop-3-1-1');
+ assert.equal(stamped1[2].indexa, 0);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[2].indexc, 0);
+ assert.equal(stamped1[12].itemcProp, 'prop-3-3-3');
+ assert.equal(stamped1[12].indexa, 0);
+ assert.equal(stamped1[12].indexb, 2);
+ assert.equal(stamped1[12].indexc, 2);
+ assert.equal(stamped1[13], undefined);
+ done();
+ });
+ });
+
+ test('splice - remove from middle', function(done) {
+ unconfigured.splice('items', 1, 1)[0];
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 2 + 2*3 + 2*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'prop-3');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itembProp, 'prop-3-1');
+ assert.equal(stamped1[1].indexa, 0);
+ assert.equal(stamped1[1].indexb, 0);
+ assert.equal(stamped1[2].itemcProp, 'prop-3-1-1');
+ assert.equal(stamped1[2].indexa, 0);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[2].indexc, 0);
+ assert.equal(stamped1[13].itemaProp, 'prop-1');
+ assert.equal(stamped1[13].indexa, 1);
+ assert.equal(stamped1[14].itembProp, 'prop-1-1');
+ assert.equal(stamped1[14].indexa, 1);
+ assert.equal(stamped1[14].indexb, 0);
+ assert.equal(stamped1[15].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped1[15].indexa, 1);
+ assert.equal(stamped1[15].indexb, 0);
+ assert.equal(stamped1[15].indexc, 0);
+ done();
+ });
+ });
+
+ test('splice - add to middle', function(done) {
+ unconfigured.splice('items', 1, 0, {prop: 'a'}, {prop: 'item*2'}, {prop: 'z'});
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 2 + 2 + 2*3 + 2*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'z');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itemaProp, 'prop-3');
+ assert.equal(stamped1[1].indexa, 1);
+ assert.equal(stamped1[2].itembProp, 'prop-3-1');
+ assert.equal(stamped1[2].indexa, 1);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[3].itemcProp, 'prop-3-1-1');
+ assert.equal(stamped1[3].indexa, 1);
+ assert.equal(stamped1[3].indexb, 0);
+ assert.equal(stamped1[3].indexc, 0);
+ assert.equal(stamped1[26].itemcProp, 'prop-1-3-3');
+ assert.equal(stamped1[26].indexa, 2);
+ assert.equal(stamped1[26].indexb, 2);
+ assert.equal(stamped1[26].indexc, 2);
+ assert.equal(stamped1[27].itemaProp, 'a');
+ assert.equal(stamped1[27].indexa, 3);
+ assert.equal(stamped1[28], undefined);
+ done();
+ });
+ });
+
+ test('splice - replace in middle', function(done) {
+ unconfigured.splice('items', 1, 2, {prop: 'a'}, {prop: 'item*2'}, {prop: 'z'});
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 2 + 1 + 1*3 + 1*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'z');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itemaProp, 'prop-1');
+ assert.equal(stamped1[1].indexa, 1);
+ assert.equal(stamped1[2].itembProp, 'prop-1-1');
+ assert.equal(stamped1[2].indexa, 1);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[3].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped1[3].indexa, 1);
+ assert.equal(stamped1[3].indexb, 0);
+ assert.equal(stamped1[3].indexc, 0);
+ assert.equal(stamped1[13].itemcProp, 'prop-1-3-3');
+ assert.equal(stamped1[13].indexa, 1);
+ assert.equal(stamped1[13].indexb, 2);
+ assert.equal(stamped1[13].indexc, 2);
+ assert.equal(stamped1[14].itemaProp, 'a');
+ assert.equal(stamped1[14].indexa, 2);
+ assert.equal(stamped1[15], undefined);
+ done();
+ });
+ });
+
+});
+
+suite('reacting to changes, array sort (direct mutation)', function() {
+
+ let unconfigured;
+
+ setup(function() {
+ unconfigured = fixture('unconfigured-mutable');
+ unconfigured.items = window.getData();
+ flush();
+ });
+
+ test('push', function(done) {
+ unconfigured.$.el1.domUpdateHandlerCount = 0;
+ unconfigured.items.push({prop: 'new-1'}, {prop: 'new-2'});
+ unconfigured.items = unconfigured.items;
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ var stamped2 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 2 + 3 + 3*3 + 3*3*3, 'total stamped count incorrect');
+ assert.equal(stamped2.length, 2 + 3 + 3*3 + 3*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[38].itemcProp, 'prop-3-3-3');
+ assert.equal(stamped1[38].indexa, 2);
+ assert.equal(stamped1[38].indexb, 2);
+ assert.equal(stamped1[38].indexc, 2);
+ assert.equal(stamped1[39].itemaProp, 'new-1');
+ assert.equal(stamped1[40].itemaProp, 'new-2');
+ assert.equal(stamped1[41], undefined);
+ assert.equal(stamped2[38].itemcProp, 'prop-3-3-3');
+ assert.equal(stamped2[38].indexa, 2);
+ assert.equal(stamped2[38].indexb, 2);
+ assert.equal(stamped2[38].indexc, 2);
+ assert.equal(stamped2[39].itemaProp, 'new-1');
+ assert.equal(stamped2[40].itemaProp, 'new-2');
+ assert.equal(stamped2[41], undefined);
+ assert.equal(unconfigured.$.el1.domUpdateHandlerCount, 1);
+ done();
+ });
+ });
+
+ test('pop', function(done) {
+ unconfigured.items.pop();
+ unconfigured.items = unconfigured.items;
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ var stamped2 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 2 + 2*3 + 2*3*3, 'total stamped count incorrect');
+ assert.equal(stamped2.length, 2 + 2*3 + 2*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[25].itemcProp, 'prop-2-3-3');
+ assert.equal(stamped1[25].indexa, 1);
+ assert.equal(stamped1[25].indexb, 2);
+ assert.equal(stamped1[25].indexc, 2);
+ assert.equal(stamped1[26], undefined);
+ assert.equal(stamped2[25].itemcProp, 'prop-2-3-3');
+ assert.equal(stamped2[25].indexa, 1);
+ assert.equal(stamped2[25].indexb, 2);
+ assert.equal(stamped2[25].indexc, 2);
+ assert.equal(stamped2[26], undefined);
+ done();
+ });
+ });
+
+ test('unshift', function(done) {
+ unconfigured.items.unshift({prop: 'new-1'}, {prop: 'new-2'});
+ unconfigured.items = unconfigured.items;
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ var stamped2 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 2 + 3 + 3*3 + 3*3*3, 'total stamped count incorrect');
+ assert.equal(stamped2.length, 2 + 3 + 3*3 + 3*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'new-1');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itemaProp, 'new-2');
+ assert.equal(stamped1[1].indexa, 1);
+ assert.equal(stamped1[2].itemaProp, 'prop-1');
+ assert.equal(stamped1[2].indexa, 2);
+ assert.equal(stamped2[0].itemaProp, 'new-1');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped2[1].itemaProp, 'new-2');
+ assert.equal(stamped1[1].indexa, 1);
+ assert.equal(stamped2[2].itemaProp, 'prop-1');
+ assert.equal(stamped2[2].indexa, 2);
+ done();
+ });
+ });
+
+ test('shift', function(done) {
+ unconfigured.items.shift();
+ unconfigured.items = unconfigured.items;
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ var stamped2 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 2 + 2*3 + 2*3*3, 'total stamped count incorrect');
+ assert.equal(stamped2.length, 2 + 2*3 + 2*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'prop-2');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itembProp, 'prop-2-1');
+ assert.equal(stamped1[1].indexa, 0);
+ assert.equal(stamped1[1].indexb, 0);
+ assert.equal(stamped1[2].itemcProp, 'prop-2-1-1');
+ assert.equal(stamped1[2].indexa, 0);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[2].indexc, 0);
+ assert.equal(stamped2[0].itemaProp, 'prop-2');
+ assert.equal(stamped2[0].indexa, 0);
+ assert.equal(stamped2[1].itembProp, 'prop-2-1');
+ assert.equal(stamped2[1].indexa, 0);
+ assert.equal(stamped2[1].indexb, 0);
+ assert.equal(stamped2[2].itemcProp, 'prop-2-1-1');
+ assert.equal(stamped2[2].indexa, 0);
+ assert.equal(stamped2[2].indexb, 0);
+ assert.equal(stamped2[2].indexc, 0);
+ done();
+ });
+ });
+
+ test('splice - remove from middle', function(done) {
+ unconfigured.items.splice(1, 1)[0];
+ unconfigured.items = unconfigured.items;
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ var stamped2 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 2 + 2*3 + 2*3*3, 'total stamped count incorrect');
+ assert.equal(stamped2.length, 2 + 2*3 + 2*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'prop-1');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itembProp, 'prop-1-1');
+ assert.equal(stamped1[1].indexa, 0);
+ assert.equal(stamped1[1].indexb, 0);
+ assert.equal(stamped1[2].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped1[2].indexa, 0);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[2].indexc, 0);
+ assert.equal(stamped1[13].itemaProp, 'prop-3');
+ assert.equal(stamped1[13].indexa, 1);
+ assert.equal(stamped1[14].itembProp, 'prop-3-1');
+ assert.equal(stamped1[14].indexa, 1);
+ assert.equal(stamped1[14].indexb, 0);
+ assert.equal(stamped1[15].itemcProp, 'prop-3-1-1');
+ assert.equal(stamped1[15].indexa, 1);
+ assert.equal(stamped1[15].indexb, 0);
+ assert.equal(stamped1[15].indexc, 0);
+ assert.equal(stamped2[0].itemaProp, 'prop-1');
+ assert.equal(stamped2[0].indexa, 0);
+ assert.equal(stamped2[1].itembProp, 'prop-1-1');
+ assert.equal(stamped2[1].indexa, 0);
+ assert.equal(stamped2[1].indexb, 0);
+ assert.equal(stamped2[2].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped2[2].indexa, 0);
+ assert.equal(stamped2[2].indexb, 0);
+ assert.equal(stamped2[2].indexc, 0);
+ assert.equal(stamped2[13].itemaProp, 'prop-3');
+ assert.equal(stamped2[13].indexa, 1);
+ assert.equal(stamped2[14].itembProp, 'prop-3-1');
+ assert.equal(stamped2[14].indexa, 1);
+ assert.equal(stamped2[14].indexb, 0);
+ assert.equal(stamped2[15].itemcProp, 'prop-3-1-1');
+ assert.equal(stamped2[15].indexa, 1);
+ assert.equal(stamped2[15].indexb, 0);
+ assert.equal(stamped2[15].indexc, 0);
+ done();
+ });
+ });
+
+ test('splice - add to middle', function(done) {
+ unconfigured.items.splice(1, 0, {prop: 'new-1'}, {prop: 'new-2'});
+ unconfigured.items = unconfigured.items;
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ var stamped2 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 2 + 3 + 3*3 + 3*3*3, 'total stamped count incorrect');
+ assert.equal(stamped2.length, 2 + 3 + 3*3 + 3*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'prop-1');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itembProp, 'prop-1-1');
+ assert.equal(stamped1[1].indexa, 0);
+ assert.equal(stamped1[1].indexb, 0);
+ assert.equal(stamped1[2].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped1[2].indexa, 0);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[2].indexc, 0);
+ assert.equal(stamped1[13].itemaProp, 'new-1');
+ assert.equal(stamped1[13].indexa, 1);
+ assert.equal(stamped1[14].itemaProp, 'new-2');
+ assert.equal(stamped1[14].indexa, 2);
+ assert.equal(stamped1[15].itemaProp, 'prop-2');
+ assert.equal(stamped1[15].indexa, 3);
+ assert.equal(stamped1[16].itembProp, 'prop-2-1');
+ assert.equal(stamped1[16].indexa, 3);
+ assert.equal(stamped1[16].indexb, 0);
+ assert.equal(stamped1[17].itemcProp, 'prop-2-1-1');
+ assert.equal(stamped1[17].indexa, 3);
+ assert.equal(stamped1[17].indexb, 0);
+ assert.equal(stamped1[17].indexc, 0);
+ assert.equal(stamped2[0].itemaProp, 'prop-1');
+ assert.equal(stamped2[0].indexa, 0);
+ assert.equal(stamped2[1].itembProp, 'prop-1-1');
+ assert.equal(stamped2[1].indexa, 0);
+ assert.equal(stamped2[1].indexb, 0);
+ assert.equal(stamped2[2].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped2[2].indexa, 0);
+ assert.equal(stamped2[2].indexb, 0);
+ assert.equal(stamped2[2].indexc, 0);
+ assert.equal(stamped2[13].itemaProp, 'new-1');
+ assert.equal(stamped2[13].indexa, 1);
+ assert.equal(stamped2[14].itemaProp, 'new-2');
+ assert.equal(stamped2[14].indexa, 2);
+ assert.equal(stamped2[15].itemaProp, 'prop-2');
+ assert.equal(stamped2[15].indexa, 3);
+ assert.equal(stamped2[16].itembProp, 'prop-2-1');
+ assert.equal(stamped2[16].indexa, 3);
+ assert.equal(stamped2[16].indexb, 0);
+ assert.equal(stamped2[17].itemcProp, 'prop-2-1-1');
+ assert.equal(stamped2[17].indexa, 3);
+ assert.equal(stamped2[17].indexb, 0);
+ assert.equal(stamped2[17].indexc, 0);
+ done();
+ });
+ });
+
+ test('splice - replace in middle', function(done) {
+ unconfigured.items.splice(1, 2, {prop: 'new-1'}, {prop: 'new-2'});
+ unconfigured.items = unconfigured.items;
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ var stamped2 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 2 + 1 + 1*3 + 1*3*3, 'total stamped count incorrect');
+ assert.equal(stamped2.length, 2 + 1 + 1*3 + 1*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'prop-1');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itembProp, 'prop-1-1');
+ assert.equal(stamped1[1].indexa, 0);
+ assert.equal(stamped1[1].indexb, 0);
+ assert.equal(stamped1[2].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped1[2].indexa, 0);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[2].indexc, 0);
+ assert.equal(stamped1[13].itemaProp, 'new-1');
+ assert.equal(stamped1[13].indexa, 1);
+ assert.equal(stamped1[14].itemaProp, 'new-2');
+ assert.equal(stamped1[14].indexa, 2);
+ assert.equal(stamped1[15], undefined);
+ assert.equal(stamped2[0].itemaProp, 'prop-1');
+ assert.equal(stamped2[0].indexa, 0);
+ assert.equal(stamped2[1].itembProp, 'prop-1-1');
+ assert.equal(stamped2[1].indexa, 0);
+ assert.equal(stamped2[1].indexb, 0);
+ assert.equal(stamped2[2].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped2[2].indexa, 0);
+ assert.equal(stamped2[2].indexb, 0);
+ assert.equal(stamped2[2].indexc, 0);
+ assert.equal(stamped2[13].itemaProp, 'new-1');
+ assert.equal(stamped2[13].indexa, 1);
+ assert.equal(stamped2[14].itemaProp, 'new-2');
+ assert.equal(stamped2[14].indexa, 2);
+ assert.equal(stamped2[15], undefined);
+ done();
+ });
+ });
+
+ test('change graph', function(done) {
+ unconfigured.items[2].items[2].items[2].prop = 'changed!';
+ unconfigured.items = unconfigured.items;
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ var stamped2 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 3 + 3*3 + 3*3*3, 'total stamped count incorrect');
+ assert.equal(stamped2.length, 3 + 3*3 + 3*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'prop-1');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itembProp, 'prop-1-1');
+ assert.equal(stamped1[1].indexa, 0);
+ assert.equal(stamped1[1].indexb, 0);
+ assert.equal(stamped1[2].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped1[2].indexa, 0);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[2].indexc, 0);
+ assert.equal(stamped2[0].itemaProp, 'prop-1');
+ assert.equal(stamped2[0].indexa, 0);
+ assert.equal(stamped2[1].itembProp, 'prop-1-1');
+ assert.equal(stamped2[1].indexa, 0);
+ assert.equal(stamped2[1].indexb, 0);
+ assert.equal(stamped2[2].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped2[2].indexa, 0);
+ assert.equal(stamped2[2].indexb, 0);
+ assert.equal(stamped2[2].indexc, 0);
+ assert.equal(stamped1[38].itemcProp, 'changed!');
+ assert.equal(stamped1[38].indexa, 2);
+ assert.equal(stamped1[38].indexb, 2);
+ assert.equal(stamped1[38].indexc, 2);
+ assert.equal(stamped1[39], undefined);
+ assert.equal(stamped2[38].itemcProp, 'changed!');
+ assert.equal(stamped2[38].indexa, 2);
+ assert.equal(stamped2[38].indexb, 2);
+ assert.equal(stamped2[38].indexc, 2);
+ assert.equal(stamped2[39], undefined);
+ done();
+ });
+ });
+
+});
+
+suite('reacting to changes, array sort with filter (direct mutation)', function() {
+
+ let unconfigured;
+
+ setup(function() {
+ unconfigured = fixture('unconfigured-mutable');
+ unconfigured.items = window.getData();
+ unconfigured.$.el1.$.repeater.filter = function(o) {
+ return o.prop.indexOf('2') < 0;
+ };
+ flush();
+ });
+
+ test('push', function(done) {
+ unconfigured.items.push({prop: 'new-1'}, {prop: 'new-2'});
+ unconfigured.items = unconfigured.items;
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 1 + 2 + 2*3 + 2*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'prop-1');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itembProp, 'prop-1-1');
+ assert.equal(stamped1[1].indexa, 0);
+ assert.equal(stamped1[1].indexb, 0);
+ assert.equal(stamped1[2].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped1[2].indexa, 0);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[2].indexc, 0);
+ assert.equal(stamped1[23].itemcProp, 'prop-3-3-1');
+ assert.equal(stamped1[23].indexa, 1);
+ assert.equal(stamped1[23].indexb, 2);
+ assert.equal(stamped1[23].indexc, 0);
+ assert.equal(stamped1[24].itemcProp, 'prop-3-3-2');
+ assert.equal(stamped1[24].indexa, 1);
+ assert.equal(stamped1[24].indexb, 2);
+ assert.equal(stamped1[24].indexc, 1);
+ assert.equal(stamped1[25].itemcProp, 'prop-3-3-3');
+ assert.equal(stamped1[25].indexa, 1);
+ assert.equal(stamped1[25].indexb, 2);
+ assert.equal(stamped1[25].indexc, 2);
+ assert.equal(stamped1[26].itemaProp, 'new-1');
+ assert.equal(stamped1[26].indexa, 2);
+ assert.equal(stamped1[27], undefined);
+ done();
+ });
+ });
+
+ test('pop', function(done) {
+ unconfigured.items.pop();
+ unconfigured.items = unconfigured.items;
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 1 + 1*3 + 1*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'prop-1');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itembProp, 'prop-1-1');
+ assert.equal(stamped1[1].indexa, 0);
+ assert.equal(stamped1[1].indexb, 0);
+ assert.equal(stamped1[2].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped1[2].indexa, 0);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[2].indexc, 0);
+ assert.equal(stamped1[10].itemcProp, 'prop-1-3-1');
+ assert.equal(stamped1[10].indexa, 0);
+ assert.equal(stamped1[10].indexb, 2);
+ assert.equal(stamped1[10].indexc, 0);
+ assert.equal(stamped1[11].itemcProp, 'prop-1-3-2');
+ assert.equal(stamped1[11].indexa, 0);
+ assert.equal(stamped1[11].indexb, 2);
+ assert.equal(stamped1[11].indexc, 1);
+ assert.equal(stamped1[12].itemcProp, 'prop-1-3-3');
+ assert.equal(stamped1[12].indexa, 0);
+ assert.equal(stamped1[12].indexb, 2);
+ assert.equal(stamped1[12].indexc, 2);
+ assert.equal(stamped1[13], undefined);
+ done();
+ });
+ });
+
+ test('unshift', function(done) {
+ unconfigured.items.unshift({prop: 'new-1'}, {prop: 'new-2'});
+ unconfigured.items = unconfigured.items;
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 1 + 2 + 2*3 + 2*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'new-1');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itemaProp, 'prop-1');
+ assert.equal(stamped1[1].indexa, 1);
+ assert.equal(stamped1[2].itembProp, 'prop-1-1');
+ assert.equal(stamped1[2].indexa, 1);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[3].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped1[3].indexa, 1);
+ assert.equal(stamped1[3].indexb, 0);
+ assert.equal(stamped1[3].indexc, 0);
+ done();
+ });
+ });
+
+ test('shift', function(done) {
+ unconfigured.items.shift();
+ unconfigured.items = unconfigured.items;
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 1 + 1*3 + 1*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'prop-3');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itembProp, 'prop-3-1');
+ assert.equal(stamped1[1].indexa, 0);
+ assert.equal(stamped1[1].indexb, 0);
+ assert.equal(stamped1[2].itemcProp, 'prop-3-1-1');
+ assert.equal(stamped1[2].indexa, 0);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[2].indexc, 0);
+ assert.equal(stamped1[10].itemcProp, 'prop-3-3-1');
+ assert.equal(stamped1[10].indexa, 0);
+ assert.equal(stamped1[10].indexb, 2);
+ assert.equal(stamped1[10].indexc, 0);
+ assert.equal(stamped1[11].itemcProp, 'prop-3-3-2');
+ assert.equal(stamped1[11].indexa, 0);
+ assert.equal(stamped1[11].indexb, 2);
+ assert.equal(stamped1[11].indexc, 1);
+ assert.equal(stamped1[12].itemcProp, 'prop-3-3-3');
+ assert.equal(stamped1[12].indexa, 0);
+ assert.equal(stamped1[12].indexb, 2);
+ assert.equal(stamped1[12].indexc, 2);
+ assert.equal(stamped1[13], undefined);
+ done();
+ });
+ });
+
+ test('splice - remove from middle', function(done) {
+ unconfigured.items.splice(1, 1);
+ unconfigured.items = unconfigured.items;
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 2 + 2*3 + 2*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'prop-1');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itembProp, 'prop-1-1');
+ assert.equal(stamped1[1].indexa, 0);
+ assert.equal(stamped1[1].indexb, 0);
+ assert.equal(stamped1[2].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped1[2].indexa, 0);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[2].indexc, 0);
+ assert.equal(stamped1[23].itemcProp, 'prop-3-3-1');
+ assert.equal(stamped1[23].indexa, 1);
+ assert.equal(stamped1[23].indexb, 2);
+ assert.equal(stamped1[23].indexc, 0);
+ assert.equal(stamped1[24].itemcProp, 'prop-3-3-2');
+ assert.equal(stamped1[24].indexa, 1);
+ assert.equal(stamped1[24].indexb, 2);
+ assert.equal(stamped1[24].indexc, 1);
+ assert.equal(stamped1[25].itemcProp, 'prop-3-3-3');
+ assert.equal(stamped1[25].indexa, 1);
+ assert.equal(stamped1[25].indexb, 2);
+ assert.equal(stamped1[25].indexc, 2);
+ assert.equal(stamped1[26], undefined);
+ done();
+ });
+ });
+
+ test('splice - add to middle', function(done) {
+ unconfigured.items.splice(1, 0, {prop: 'new-1'}, {prop: 'new-2'});
+ unconfigured.items = unconfigured.items;
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 1 + 2 + 2*3 + 2*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'prop-1');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itembProp, 'prop-1-1');
+ assert.equal(stamped1[1].indexa, 0);
+ assert.equal(stamped1[1].indexb, 0);
+ assert.equal(stamped1[2].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped1[2].indexa, 0);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[2].indexc, 0);
+ assert.equal(stamped1[13].itemaProp, 'new-1');
+ assert.equal(stamped1[13].indexa, 1);
+ assert.equal(stamped1[14].itemaProp, 'prop-3');
+ assert.equal(stamped1[14].indexa, 2);
+ assert.equal(stamped1[15].itembProp, 'prop-3-1');
+ assert.equal(stamped1[15].indexa, 2);
+ assert.equal(stamped1[15].indexb, 0);
+ assert.equal(stamped1[16].itemcProp, 'prop-3-1-1');
+ assert.equal(stamped1[16].indexa, 2);
+ assert.equal(stamped1[16].indexb, 0);
+ assert.equal(stamped1[16].indexc, 0);
+ done();
+ });
+ });
+
+ test('splice - replace in middle', function(done) {
+ unconfigured.items.splice(1, 2, {prop: 'new-1'}, {prop: 'new-2'});
+ unconfigured.items = unconfigured.items;
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 1 + 1 + 1*3 + 1*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'prop-1');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itembProp, 'prop-1-1');
+ assert.equal(stamped1[1].indexa, 0);
+ assert.equal(stamped1[1].indexb, 0);
+ assert.equal(stamped1[2].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped1[2].indexa, 0);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[2].indexc, 0);
+ assert.equal(stamped1[13].itemaProp, 'new-1');
+ assert.equal(stamped1[14], undefined);
+ done();
+ });
+ });
+
+});
+
+suite('reacting to changes, view sort (direct mutation)', function() {
+
+ let unconfigured;
+
+ setup(function() {
+ unconfigured = fixture('unconfigured-mutable');
+ unconfigured.items = window.getData();
+ unconfigured.$.el1.$.repeater.sort = function(a, b) {
+ return b.prop == a.prop ? 0 : b.prop < a.prop ? -1 : 1;
+ };
+ flush();
+ });
+
+ test('push', function(done) {
+ unconfigured.items.push({prop: 'a'}, {prop: 'prop-1*'}, {prop: 'z'});
+ unconfigured.items = unconfigured.items;
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 3 + 3 + 3*3 + 3*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'z');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itemaProp, 'prop-3');
+ assert.equal(stamped1[1].indexa, 1);
+ assert.equal(stamped1[2].itembProp, 'prop-3-1');
+ assert.equal(stamped1[2].indexa, 1);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[3].itemcProp, 'prop-3-1-1');
+ assert.equal(stamped1[3].indexa, 1);
+ assert.equal(stamped1[3].indexb, 0);
+ assert.equal(stamped1[3].indexc, 0);
+ assert.equal(stamped1[27].itemaProp, 'prop-1*');
+ assert.equal(stamped1[27].indexa, 3);
+ assert.equal(stamped1[40].itemcProp, 'prop-1-3-3');
+ assert.equal(stamped1[40].indexa, 4);
+ assert.equal(stamped1[40].indexb, 2);
+ assert.equal(stamped1[40].indexc, 2);
+ assert.equal(stamped1[41].itemaProp, 'a');
+ assert.equal(stamped1[41].indexa, 5);
+ done();
+ });
+ });
+
+ test('pop', function(done) {
+ unconfigured.items.pop();
+ unconfigured.items = unconfigured.items;
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 2 + 2*3 + 2*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[25].itemcProp, 'prop-1-3-3');
+ assert.equal(stamped1[25].indexa, 1);
+ assert.equal(stamped1[25].indexb, 2);
+ assert.equal(stamped1[25].indexc, 2);
+ assert.equal(stamped1[26], undefined);
+ done();
+ });
+ });
+
+ test('unshift', function(done) {
+ unconfigured.items.unshift({prop: 'a'}, {prop: 'prop-1*'}, {prop: 'z'});
+ unconfigured.items = unconfigured.items;
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 3 + 3 + 3*3 + 3*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'z');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itemaProp, 'prop-3');
+ assert.equal(stamped1[1].indexa, 1);
+ assert.equal(stamped1[2].itembProp, 'prop-3-1');
+ assert.equal(stamped1[2].indexa, 1);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[3].itemcProp, 'prop-3-1-1');
+ assert.equal(stamped1[3].indexa, 1);
+ assert.equal(stamped1[3].indexb, 0);
+ assert.equal(stamped1[3].indexc, 0);
+ assert.equal(stamped1[27].itemaProp, 'prop-1*');
+ assert.equal(stamped1[27].indexa, 3);
+ assert.equal(stamped1[40].itemcProp, 'prop-1-3-3');
+ assert.equal(stamped1[40].indexa, 4);
+ assert.equal(stamped1[40].indexb, 2);
+ assert.equal(stamped1[40].indexc, 2);
+ assert.equal(stamped1[41].itemaProp, 'a');
+ assert.equal(stamped1[41].indexa, 5);
+ done();
+ });
+ });
+
+ test('shift', function(done) {
+ unconfigured.items.shift();
+ unconfigured.items = unconfigured.items;
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 2 + 2*3 + 2*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'prop-3');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itembProp, 'prop-3-1');
+ assert.equal(stamped1[1].indexa, 0);
+ assert.equal(stamped1[1].indexb, 0);
+ assert.equal(stamped1[2].itemcProp, 'prop-3-1-1');
+ assert.equal(stamped1[2].indexa, 0);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[2].indexc, 0);
+ assert.equal(stamped1[23].itemcProp, 'prop-2-3-1');
+ assert.equal(stamped1[23].indexa, 1);
+ assert.equal(stamped1[23].indexb, 2);
+ assert.equal(stamped1[23].indexc, 0);
+ assert.equal(stamped1[24].itemcProp, 'prop-2-3-2');
+ assert.equal(stamped1[24].indexa, 1);
+ assert.equal(stamped1[24].indexb, 2);
+ assert.equal(stamped1[24].indexc, 1);
+ assert.equal(stamped1[25].itemcProp, 'prop-2-3-3');
+ assert.equal(stamped1[25].indexa, 1);
+ assert.equal(stamped1[25].indexb, 2);
+ assert.equal(stamped1[25].indexc, 2);
+ assert.equal(stamped1[26], undefined);
+ done();
+ });
+ });
+
+ test('splice - remove from middle', function(done) {
+ unconfigured.items.splice(1, 1)[0];
+ unconfigured.items = unconfigured.items;
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 2 + 2*3 + 2*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'prop-3');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itembProp, 'prop-3-1');
+ assert.equal(stamped1[1].indexa, 0);
+ assert.equal(stamped1[1].indexb, 0);
+ assert.equal(stamped1[2].itemcProp, 'prop-3-1-1');
+ assert.equal(stamped1[2].indexa, 0);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[2].indexc, 0);
+ assert.equal(stamped1[13].itemaProp, 'prop-1');
+ assert.equal(stamped1[13].indexa, 1);
+ assert.equal(stamped1[14].itembProp, 'prop-1-1');
+ assert.equal(stamped1[14].indexa, 1);
+ assert.equal(stamped1[14].indexb, 0);
+ assert.equal(stamped1[15].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped1[15].indexa, 1);
+ assert.equal(stamped1[15].indexb, 0);
+ assert.equal(stamped1[15].indexc, 0);
+ assert.equal(stamped1[23].itemcProp, 'prop-1-3-1');
+ assert.equal(stamped1[23].indexa, 1);
+ assert.equal(stamped1[23].indexb, 2);
+ assert.equal(stamped1[23].indexc, 0);
+ assert.equal(stamped1[24].itemcProp, 'prop-1-3-2');
+ assert.equal(stamped1[24].indexa, 1);
+ assert.equal(stamped1[24].indexb, 2);
+ assert.equal(stamped1[24].indexc, 1);
+ assert.equal(stamped1[25].itemcProp, 'prop-1-3-3');
+ assert.equal(stamped1[25].indexa, 1);
+ assert.equal(stamped1[25].indexb, 2);
+ assert.equal(stamped1[25].indexc, 2);
+ assert.equal(stamped1[26], undefined);
+ done();
+ });
+ });
+
+ test('splice - add to middle', function(done) {
+ unconfigured.items.splice(1, 0, {prop: 'a'}, {prop: 'prop-1*'}, {prop: 'z'});
+ unconfigured.items = unconfigured.items;
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 3 + 3 + 3*3 + 3*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'z');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itemaProp, 'prop-3');
+ assert.equal(stamped1[1].indexa, 1);
+ assert.equal(stamped1[2].itembProp, 'prop-3-1');
+ assert.equal(stamped1[2].indexa, 1);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[3].itemcProp, 'prop-3-1-1');
+ assert.equal(stamped1[3].indexa, 1);
+ assert.equal(stamped1[3].indexb, 0);
+ assert.equal(stamped1[3].indexc, 0);
+ assert.equal(stamped1[27].itemaProp, 'prop-1*');
+ assert.equal(stamped1[27].indexa, 3);
+ assert.equal(stamped1[40].itemcProp, 'prop-1-3-3');
+ assert.equal(stamped1[40].indexa, 4);
+ assert.equal(stamped1[40].indexb, 2);
+ assert.equal(stamped1[40].indexc, 2);
+ assert.equal(stamped1[41].itemaProp, 'a');
+ assert.equal(stamped1[41].indexa, 5);
+ done();
+ });
+ });
+
+ test('splice - replace in middle', function(done) {
+ unconfigured.items.splice(1, 2, {prop: 'a'}, {prop: 'prop-1*'}, {prop: 'z'});
+ unconfigured.items = unconfigured.items;
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 3 + 1 + 1*3 + 1*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'z');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itemaProp, 'prop-1*');
+ assert.equal(stamped1[1].indexa, 1);
+ assert.equal(stamped1[2].itemaProp, 'prop-1');
+ assert.equal(stamped1[2].indexa, 2);
+ assert.equal(stamped1[3].itembProp, 'prop-1-1');
+ assert.equal(stamped1[3].indexa, 2);
+ assert.equal(stamped1[3].indexb, 0);
+ assert.equal(stamped1[4].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped1[4].indexa, 2);
+ assert.equal(stamped1[4].indexb, 0);
+ assert.equal(stamped1[4].indexc, 0);
+ assert.equal(stamped1[15].itemaProp, 'a');
+ assert.equal(stamped1[15].indexa, 3);
+ assert.equal(stamped1[16], undefined);
+ done();
+ });
+ });
+
+});
+
+suite('reacting to changes, view sort with filter (direct mutation)', function() {
+
+ let unconfigured;
+
+ setup(function() {
+ unconfigured = fixture('unconfigured-mutable');
+ unconfigured.items = window.getData();
+ unconfigured.$.el1.$.repeater.sort = function(a, b) {
+ return b.prop == a.prop ? 0 : b.prop < a.prop ? -1 : 1;
+ };
+ unconfigured.$.el1.$.repeater.filter = function(o) {
+ return o.prop.indexOf('2') < 0;
+ };
+ flush();
+ });
+
+ test('push', function(done) {
+ unconfigured.items.push({prop: 'a'}, {prop: 'item*2'}, {prop: 'z'});
+ unconfigured.items = unconfigured.items;
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 2 + 2 + 2*3 + 2*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'z');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itemaProp, 'prop-3');
+ assert.equal(stamped1[1].indexa, 1);
+ assert.equal(stamped1[2].itembProp, 'prop-3-1');
+ assert.equal(stamped1[2].indexa, 1);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[3].itemcProp, 'prop-3-1-1');
+ assert.equal(stamped1[3].indexa, 1);
+ assert.equal(stamped1[3].indexb, 0);
+ assert.equal(stamped1[3].indexc, 0);
+ assert.equal(stamped1[26].itemcProp, 'prop-1-3-3');
+ assert.equal(stamped1[26].indexa, 2);
+ assert.equal(stamped1[26].indexb, 2);
+ assert.equal(stamped1[26].indexc, 2);
+ assert.equal(stamped1[27].itemaProp, 'a');
+ assert.equal(stamped1[27].indexa, 3);
+ assert.equal(stamped1[28], undefined);
+ done();
+ });
+ });
+
+ test('pop', function(done) {
+ unconfigured.items.pop();
+ unconfigured.items = unconfigured.items;
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 1 + 1*3 + 1*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'prop-1');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itembProp, 'prop-1-1');
+ assert.equal(stamped1[1].indexa, 0);
+ assert.equal(stamped1[1].indexb, 0);
+ assert.equal(stamped1[2].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped1[2].indexa, 0);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[2].indexc, 0);
+ assert.equal(stamped1[12].itemcProp, 'prop-1-3-3');
+ assert.equal(stamped1[12].indexa, 0);
+ assert.equal(stamped1[12].indexb, 2);
+ assert.equal(stamped1[12].indexc, 2);
+ assert.equal(stamped1[13], undefined);
+ done();
+ });
+ });
+
+ test('unshift', function(done) {
+ unconfigured.items.unshift({prop: 'a'}, {prop: 'item*2'}, {prop: 'z'});
+ unconfigured.items = unconfigured.items;
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 2 + 2 + 2*3 + 2*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'z');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itemaProp, 'prop-3');
+ assert.equal(stamped1[1].indexa, 1);
+ assert.equal(stamped1[2].itembProp, 'prop-3-1');
+ assert.equal(stamped1[2].indexa, 1);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[3].itemcProp, 'prop-3-1-1');
+ assert.equal(stamped1[3].indexa, 1);
+ assert.equal(stamped1[3].indexb, 0);
+ assert.equal(stamped1[3].indexc, 0);
+ assert.equal(stamped1[26].itemcProp, 'prop-1-3-3');
+ assert.equal(stamped1[26].indexa, 2);
+ assert.equal(stamped1[26].indexb, 2);
+ assert.equal(stamped1[26].indexc, 2);
+ assert.equal(stamped1[27].itemaProp, 'a');
+ assert.equal(stamped1[27].indexa, 3);
+ assert.equal(stamped1[28], undefined);
+ done();
+ });
+ });
+
+ test('shift', function(done) {
+ unconfigured.items.shift();
+ unconfigured.items = unconfigured.items;
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 1 + 1*3 + 1*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'prop-3');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itembProp, 'prop-3-1');
+ assert.equal(stamped1[1].indexa, 0);
+ assert.equal(stamped1[1].indexb, 0);
+ assert.equal(stamped1[2].itemcProp, 'prop-3-1-1');
+ assert.equal(stamped1[2].indexa, 0);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[2].indexc, 0);
+ assert.equal(stamped1[12].itemcProp, 'prop-3-3-3');
+ assert.equal(stamped1[12].indexa, 0);
+ assert.equal(stamped1[12].indexb, 2);
+ assert.equal(stamped1[12].indexc, 2);
+ assert.equal(stamped1[13], undefined);
+ done();
+ });
+ });
+
+ test('splice - remove from middle', function(done) {
+ unconfigured.items.splice(1, 1)[0];
+ unconfigured.items = unconfigured.items;
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 2 + 2*3 + 2*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'prop-3');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itembProp, 'prop-3-1');
+ assert.equal(stamped1[1].indexa, 0);
+ assert.equal(stamped1[1].indexb, 0);
+ assert.equal(stamped1[2].itemcProp, 'prop-3-1-1');
+ assert.equal(stamped1[2].indexa, 0);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[2].indexc, 0);
+ assert.equal(stamped1[13].itemaProp, 'prop-1');
+ assert.equal(stamped1[13].indexa, 1);
+ assert.equal(stamped1[14].itembProp, 'prop-1-1');
+ assert.equal(stamped1[14].indexa, 1);
+ assert.equal(stamped1[14].indexb, 0);
+ assert.equal(stamped1[15].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped1[15].indexa, 1);
+ assert.equal(stamped1[15].indexb, 0);
+ assert.equal(stamped1[15].indexc, 0);
+ done();
+ });
+ });
+
+ test('splice - add to middle', function(done) {
+ unconfigured.items.splice(1, 0, {prop: 'a'}, {prop: 'item*2'}, {prop: 'z'});
+ unconfigured.items = unconfigured.items;
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 2 + 2 + 2*3 + 2*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'z');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itemaProp, 'prop-3');
+ assert.equal(stamped1[1].indexa, 1);
+ assert.equal(stamped1[2].itembProp, 'prop-3-1');
+ assert.equal(stamped1[2].indexa, 1);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[3].itemcProp, 'prop-3-1-1');
+ assert.equal(stamped1[3].indexa, 1);
+ assert.equal(stamped1[3].indexb, 0);
+ assert.equal(stamped1[3].indexc, 0);
+ assert.equal(stamped1[26].itemcProp, 'prop-1-3-3');
+ assert.equal(stamped1[26].indexa, 2);
+ assert.equal(stamped1[26].indexb, 2);
+ assert.equal(stamped1[26].indexc, 2);
+ assert.equal(stamped1[27].itemaProp, 'a');
+ assert.equal(stamped1[27].indexa, 3);
+ assert.equal(stamped1[28], undefined);
+ done();
+ });
+ });
+
+ test('splice - replace in middle', function(done) {
+ unconfigured.items.splice(1, 2, {prop: 'a'}, {prop: 'item*2'}, {prop: 'z'});
+ unconfigured.items = unconfigured.items;
+ setTimeout(function() {
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1.length, 2 + 1 + 1*3 + 1*3*3, 'total stamped count incorrect');
+ assert.equal(stamped1[0].itemaProp, 'z');
+ assert.equal(stamped1[0].indexa, 0);
+ assert.equal(stamped1[1].itemaProp, 'prop-1');
+ assert.equal(stamped1[1].indexa, 1);
+ assert.equal(stamped1[2].itembProp, 'prop-1-1');
+ assert.equal(stamped1[2].indexa, 1);
+ assert.equal(stamped1[2].indexb, 0);
+ assert.equal(stamped1[3].itemcProp, 'prop-1-1-1');
+ assert.equal(stamped1[3].indexa, 1);
+ assert.equal(stamped1[3].indexb, 0);
+ assert.equal(stamped1[3].indexc, 0);
+ assert.equal(stamped1[13].itemcProp, 'prop-1-3-3');
+ assert.equal(stamped1[13].indexa, 1);
+ assert.equal(stamped1[13].indexb, 2);
+ assert.equal(stamped1[13].indexc, 2);
+ assert.equal(stamped1[14].itemaProp, 'a');
+ assert.equal(stamped1[14].indexa, 2);
+ assert.equal(stamped1[15], undefined);
+ done();
+ });
+ });
+
+});
+
+suite('multiple mutations in same turn', function() {
+
+ let primitive;
+
+ setup(function() {
+ primitive = fixture('primitive');
+ flush();
+ });
+
+ test('array sort, no filter: unshift+pop', function(done) {
+ // repeater 1
+ var stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'a');
+ assert.equal(stamped1[1].itemaProp, 'b');
+ assert.equal(stamped1[2].itemaProp, 'c');
+ assert.equal(stamped1[3].itemaProp, 'd');
+ assert.equal(stamped1[4].itemaProp, 'e');
+ primitive.unshift('items', 'new1');
+ primitive.pop('items');
+ setTimeout(function() {
+ stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'new1');
+ assert.equal(stamped1[1].itemaProp, 'a');
+ assert.equal(stamped1[2].itemaProp, 'b');
+ assert.equal(stamped1[3].itemaProp, 'c');
+ assert.equal(stamped1[4].itemaProp, 'd');
+ primitive.unshift('items', 'new2');
+ primitive.pop('items');
+ primitive.unshift('items', 'new3');
+ primitive.pop('items');
+ setTimeout(function() {
+ stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'new3');
+ assert.equal(stamped1[1].itemaProp, 'new2');
+ assert.equal(stamped1[2].itemaProp, 'new1');
+ assert.equal(stamped1[3].itemaProp, 'a');
+ assert.equal(stamped1[4].itemaProp, 'b');
+ primitive.shift('items');
+ primitive.push('items', 'c');
+ setTimeout(function() {
+ stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'new2');
+ assert.equal(stamped1[1].itemaProp, 'new1');
+ assert.equal(stamped1[2].itemaProp, 'a');
+ assert.equal(stamped1[3].itemaProp, 'b');
+ assert.equal(stamped1[4].itemaProp, 'c');
+ primitive.shift('items');
+ primitive.push('items', 'd');
+ primitive.shift('items');
+ primitive.push('items', 'e');
+ setTimeout(function() {
+ stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'a');
+ assert.equal(stamped1[1].itemaProp, 'b');
+ assert.equal(stamped1[2].itemaProp, 'c');
+ assert.equal(stamped1[3].itemaProp, 'd');
+ assert.equal(stamped1[4].itemaProp, 'e');
+ done();
+ });
+ });
+ });
+ });
+ });
+
+ test('array sort, no filter: insertions', function(done) {
+ // repeater 1
+ var stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'a');
+ assert.equal(stamped1[1].itemaProp, 'b');
+ assert.equal(stamped1[2].itemaProp, 'c');
+ assert.equal(stamped1[3].itemaProp, 'd');
+ assert.equal(stamped1[4].itemaProp, 'e');
+ primitive.splice('items', 1, 0, 'new2', 'new3');
+ primitive.splice('items', 0, 0, 'new1');
+ primitive.splice('items', 8, 0, 'new5');
+ primitive.splice('items', 5, 0, 'new4');
+ setTimeout(function() {
+ stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'new1');
+ assert.equal(stamped1[1].itemaProp, 'a');
+ assert.equal(stamped1[2].itemaProp, 'new2');
+ assert.equal(stamped1[3].itemaProp, 'new3');
+ assert.equal(stamped1[4].itemaProp, 'b');
+ assert.equal(stamped1[5].itemaProp, 'new4');
+ assert.equal(stamped1[6].itemaProp, 'c');
+ assert.equal(stamped1[7].itemaProp, 'd');
+ assert.equal(stamped1[8].itemaProp, 'e');
+ assert.equal(stamped1[9].itemaProp, 'new5');
+ arrayDelete(primitive, 'items', 'new5');
+ arrayDelete(primitive, 'items', 'new3');
+ arrayDelete(primitive, 'items', 'new1');
+ arrayDelete(primitive, 'items', 'new2');
+ arrayDelete(primitive, 'items', 'new4');
+ setTimeout(function() {
+ stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'a');
+ assert.equal(stamped1[1].itemaProp, 'b');
+ assert.equal(stamped1[2].itemaProp, 'c');
+ assert.equal(stamped1[3].itemaProp, 'd');
+ assert.equal(stamped1[4].itemaProp, 'e');
+ done();
+ });
+ });
+ });
+
+ test('array sort, no filter: insert & remove', function(done) {
+ // repeater 1
+ var stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'a');
+ assert.equal(stamped1[1].itemaProp, 'b');
+ assert.equal(stamped1[2].itemaProp, 'c');
+ assert.equal(stamped1[3].itemaProp, 'd');
+ assert.equal(stamped1[4].itemaProp, 'e');
+ primitive.splice('items', 1, 0, 'new1', 'new2', 'new3');
+ primitive.splice('items', 3, 1);
+ primitive.splice('items', 4, 0, 'new4', 'new5', 'new6');
+ primitive.splice('items', 4, 2);
+ primitive.splice('items', 4, 1);
+ primitive.splice('items', 1, 2);
+ setTimeout(function() {
+ stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'a');
+ assert.equal(stamped1[1].itemaProp, 'b');
+ assert.equal(stamped1[2].itemaProp, 'c');
+ assert.equal(stamped1[3].itemaProp, 'd');
+ assert.equal(stamped1[4].itemaProp, 'e');
+ done();
+ });
+ });
+
+ test('array sort, filtered: unshift+pop', function(done) {
+ primitive.$.repeater1.filter = function(s) {
+ return s.indexOf('new2') < 0;
+ };
+ flush();
+ // repeater 1
+ var stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'a');
+ assert.equal(stamped1[1].itemaProp, 'b');
+ assert.equal(stamped1[2].itemaProp, 'c');
+ assert.equal(stamped1[3].itemaProp, 'd');
+ assert.equal(stamped1[4].itemaProp, 'e');
+ primitive.unshift('items', 'new1');
+ primitive.pop('items');
+ setTimeout(function() {
+ stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'new1');
+ assert.equal(stamped1[1].itemaProp, 'a');
+ assert.equal(stamped1[2].itemaProp, 'b');
+ assert.equal(stamped1[3].itemaProp, 'c');
+ assert.equal(stamped1[4].itemaProp, 'd');
+ primitive.unshift('items', 'new2');
+ primitive.pop('items');
+ primitive.unshift('items', 'new3');
+ primitive.pop('items');
+ setTimeout(function() {
+ stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'new3');
+ assert.equal(stamped1[1].itemaProp, 'new1');
+ assert.equal(stamped1[2].itemaProp, 'a');
+ assert.equal(stamped1[3].itemaProp, 'b');
+ primitive.shift('items');
+ primitive.push('items', 'c');
+ setTimeout(function() {
+ stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'new1');
+ assert.equal(stamped1[1].itemaProp, 'a');
+ assert.equal(stamped1[2].itemaProp, 'b');
+ assert.equal(stamped1[3].itemaProp, 'c');
+ primitive.shift('items');
+ primitive.push('items', 'd');
+ primitive.shift('items');
+ primitive.push('items', 'e');
+ setTimeout(function() {
+ stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'a');
+ assert.equal(stamped1[1].itemaProp, 'b');
+ assert.equal(stamped1[2].itemaProp, 'c');
+ assert.equal(stamped1[3].itemaProp, 'd');
+ assert.equal(stamped1[4].itemaProp, 'e');
+ done();
+ });
+ });
+ });
+ });
+ });
+
+ test('array sort, filtered: insertions', function(done) {
+ // repeater 1
+ primitive.$.repeater1.filter = function(s) {
+ return s.indexOf('new2') < 0;
+ };
+ flush();
+ var stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'a');
+ assert.equal(stamped1[1].itemaProp, 'b');
+ assert.equal(stamped1[2].itemaProp, 'c');
+ assert.equal(stamped1[3].itemaProp, 'd');
+ assert.equal(stamped1[4].itemaProp, 'e');
+ primitive.splice('items', 1, 0, 'new2', 'new3');
+ primitive.splice('items', 0, 0, 'new1');
+ primitive.splice('items', 8, 0, 'new5');
+ primitive.splice('items', 5, 0, 'new4');
+ setTimeout(function() {
+ stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'new1');
+ assert.equal(stamped1[1].itemaProp, 'a');
+ assert.equal(stamped1[2].itemaProp, 'new3');
+ assert.equal(stamped1[3].itemaProp, 'b');
+ assert.equal(stamped1[4].itemaProp, 'new4');
+ assert.equal(stamped1[5].itemaProp, 'c');
+ assert.equal(stamped1[6].itemaProp, 'd');
+ assert.equal(stamped1[7].itemaProp, 'e');
+ assert.equal(stamped1[8].itemaProp, 'new5');
+ arrayDelete(primitive, 'items', 'new5');
+ arrayDelete(primitive, 'items', 'new3');
+ arrayDelete(primitive, 'items', 'new1');
+ arrayDelete(primitive, 'items', 'new2');
+ arrayDelete(primitive, 'items', 'new4');
+ setTimeout(function() {
+ stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'a');
+ assert.equal(stamped1[1].itemaProp, 'b');
+ assert.equal(stamped1[2].itemaProp, 'c');
+ assert.equal(stamped1[3].itemaProp, 'd');
+ assert.equal(stamped1[4].itemaProp, 'e');
+ done();
+ });
+ });
+ });
+
+ test('array sort, filtered: insert & remove', function(done) {
+ // repeater 1
+ primitive.$.repeater1.filter = function(s) {
+ return s.indexOf('new2') < 0;
+ };
+ flush();
+ var stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'a');
+ assert.equal(stamped1[1].itemaProp, 'b');
+ assert.equal(stamped1[2].itemaProp, 'c');
+ assert.equal(stamped1[3].itemaProp, 'd');
+ assert.equal(stamped1[4].itemaProp, 'e');
+ primitive.splice('items', 1, 0, 'new1', 'new2', 'new3');
+ primitive.splice('items', 3, 1);
+ primitive.splice('items', 4, 0, 'new4', 'new5', 'new6');
+ primitive.splice('items', 4, 2);
+ primitive.splice('items', 4, 1);
+ primitive.splice('items', 1, 2);
+ primitive.$.repeater1.filter = null;
+ setTimeout(function() {
+ stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'a');
+ assert.equal(stamped1[1].itemaProp, 'b');
+ assert.equal(stamped1[2].itemaProp, 'c');
+ assert.equal(stamped1[3].itemaProp, 'd');
+ assert.equal(stamped1[4].itemaProp, 'e');
+ done();
+ });
+ });
+
+ test('view sort, no filter: unshift+pop', function(done) {
+ primitive.$.repeater1.sort = function(a, b) {
+ return b.localeCompare(a);
+ };
+ flush();
+ setTimeout(function() {
+ // repeater 1
+ var stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'e');
+ assert.equal(stamped1[1].itemaProp, 'd');
+ assert.equal(stamped1[2].itemaProp, 'c');
+ assert.equal(stamped1[3].itemaProp, 'b');
+ assert.equal(stamped1[4].itemaProp, 'a');
+ primitive.unshift('items', 'new1');
+ primitive.pop('items');
+ setTimeout(function() {
+ stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'new1');
+ assert.equal(stamped1[1].itemaProp, 'd');
+ assert.equal(stamped1[2].itemaProp, 'c');
+ assert.equal(stamped1[3].itemaProp, 'b');
+ assert.equal(stamped1[4].itemaProp, 'a');
+ primitive.unshift('items', 'new2');
+ primitive.pop('items');
+ primitive.unshift('items', 'new3');
+ primitive.pop('items');
+ setTimeout(function() {
+ stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'new3');
+ assert.equal(stamped1[1].itemaProp, 'new2');
+ assert.equal(stamped1[2].itemaProp, 'new1');
+ assert.equal(stamped1[3].itemaProp, 'b');
+ assert.equal(stamped1[4].itemaProp, 'a');
+ primitive.shift('items');
+ primitive.push('items', 'c');
+ setTimeout(function() {
+ stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'new2');
+ assert.equal(stamped1[1].itemaProp, 'new1');
+ assert.equal(stamped1[2].itemaProp, 'c');
+ assert.equal(stamped1[3].itemaProp, 'b');
+ assert.equal(stamped1[4].itemaProp, 'a');
+ primitive.shift('items');
+ primitive.push('items', 'd');
+ primitive.shift('items');
+ primitive.push('items', 'e');
+ setTimeout(function() {
+ stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'e');
+ assert.equal(stamped1[1].itemaProp, 'd');
+ assert.equal(stamped1[2].itemaProp, 'c');
+ assert.equal(stamped1[3].itemaProp, 'b');
+ assert.equal(stamped1[4].itemaProp, 'a');
+ done();
+ });
+ });
+ });
+ });
+ });
+ });
+
+ test('view sort, no filter: insertions', function(done) {
+ // repeater 1
+ primitive.$.repeater1.sort = function(a, b) {
+ return b.localeCompare(a);
+ };
+ flush();
+ var stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'e');
+ assert.equal(stamped1[1].itemaProp, 'd');
+ assert.equal(stamped1[2].itemaProp, 'c');
+ assert.equal(stamped1[3].itemaProp, 'b');
+ assert.equal(stamped1[4].itemaProp, 'a');
+ primitive.splice('items', 1, 0, 'new2', 'new3');
+ primitive.splice('items', 0, 0, 'new1');
+ primitive.splice('items', 8, 0, 'new5');
+ primitive.splice('items', 5, 0, 'new4');
+ setTimeout(function() {
+ stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'new5');
+ assert.equal(stamped1[1].itemaProp, 'new4');
+ assert.equal(stamped1[2].itemaProp, 'new3');
+ assert.equal(stamped1[3].itemaProp, 'new2');
+ assert.equal(stamped1[4].itemaProp, 'new1');
+ assert.equal(stamped1[5].itemaProp, 'e');
+ assert.equal(stamped1[6].itemaProp, 'd');
+ assert.equal(stamped1[7].itemaProp, 'c');
+ assert.equal(stamped1[8].itemaProp, 'b');
+ assert.equal(stamped1[9].itemaProp, 'a');
+ arrayDelete(primitive, 'items', 'new5');
+ arrayDelete(primitive, 'items', 'new3');
+ arrayDelete(primitive, 'items', 'new1');
+ arrayDelete(primitive, 'items', 'new2');
+ arrayDelete(primitive, 'items', 'new4');
+ setTimeout(function() {
+ stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'e');
+ assert.equal(stamped1[1].itemaProp, 'd');
+ assert.equal(stamped1[2].itemaProp, 'c');
+ assert.equal(stamped1[3].itemaProp, 'b');
+ assert.equal(stamped1[4].itemaProp, 'a');
+ done();
+ });
+ });
+ });
+
+ test('view sort, no filter: insert & remove', function(done) {
+ // repeater 1
+ primitive.$.repeater1.sort = function(a, b) {
+ return b.localeCompare(a);
+ };
+ flush();
+ var stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'e');
+ assert.equal(stamped1[1].itemaProp, 'd');
+ assert.equal(stamped1[2].itemaProp, 'c');
+ assert.equal(stamped1[3].itemaProp, 'b');
+ assert.equal(stamped1[4].itemaProp, 'a');
+ primitive.splice('items', 1, 0, 'new1', 'new2', 'new3');
+ primitive.splice('items', 3, 1);
+ primitive.splice('items', 4, 0, 'new4', 'new5', 'new6');
+ primitive.splice('items', 4, 2);
+ primitive.splice('items', 4, 1);
+ primitive.splice('items', 1, 2);
+ setTimeout(function() {
+ stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'e');
+ assert.equal(stamped1[1].itemaProp, 'd');
+ assert.equal(stamped1[2].itemaProp, 'c');
+ assert.equal(stamped1[3].itemaProp, 'b');
+ assert.equal(stamped1[4].itemaProp, 'a');
+ done();
+ });
+ });
+
+ test('view sort, filtered: unshift+pop', function(done) {
+ primitive.$.repeater1.sort = function(a, b) {
+ return b.localeCompare(a);
+ };
+ primitive.$.repeater1.filter = function(s) {
+ return s.indexOf('new2') < 0;
+ };
+ flush();
+ setTimeout(function() {
+ // repeater 1
+ var stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'e');
+ assert.equal(stamped1[1].itemaProp, 'd');
+ assert.equal(stamped1[2].itemaProp, 'c');
+ assert.equal(stamped1[3].itemaProp, 'b');
+ assert.equal(stamped1[4].itemaProp, 'a');
+ primitive.unshift('items', 'new1');
+ primitive.pop('items');
+ setTimeout(function() {
+ stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'new1');
+ assert.equal(stamped1[1].itemaProp, 'd');
+ assert.equal(stamped1[2].itemaProp, 'c');
+ assert.equal(stamped1[3].itemaProp, 'b');
+ assert.equal(stamped1[4].itemaProp, 'a');
+ primitive.unshift('items', 'new2');
+ primitive.pop('items');
+ primitive.unshift('items', 'new3');
+ primitive.pop('items');
+ setTimeout(function() {
+ stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'new3');
+ assert.equal(stamped1[1].itemaProp, 'new1');
+ assert.equal(stamped1[2].itemaProp, 'b');
+ assert.equal(stamped1[3].itemaProp, 'a');
+ primitive.shift('items');
+ primitive.push('items', 'c');
+ setTimeout(function() {
+ stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'new1');
+ assert.equal(stamped1[1].itemaProp, 'c');
+ assert.equal(stamped1[2].itemaProp, 'b');
+ assert.equal(stamped1[3].itemaProp, 'a');
+ primitive.shift('items');
+ primitive.push('items', 'd');
+ primitive.shift('items');
+ primitive.push('items', 'e');
+ setTimeout(function() {
+ stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'e');
+ assert.equal(stamped1[1].itemaProp, 'd');
+ assert.equal(stamped1[2].itemaProp, 'c');
+ assert.equal(stamped1[3].itemaProp, 'b');
+ assert.equal(stamped1[4].itemaProp, 'a');
+ done();
+ });
+ });
+ });
+ });
+ });
+ });
+
+ test('view sort, filtered: insertions', function(done) {
+ // repeater 1
+ primitive.$.repeater1.sort = function(a, b) {
+ return b.localeCompare(a);
+ };
+ primitive.$.repeater1.filter = function(s) {
+ return s.indexOf('new2') < 0;
+ };
+ flush();
+ var stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'e');
+ assert.equal(stamped1[1].itemaProp, 'd');
+ assert.equal(stamped1[2].itemaProp, 'c');
+ assert.equal(stamped1[3].itemaProp, 'b');
+ assert.equal(stamped1[4].itemaProp, 'a');
+ primitive.splice('items', 1, 0, 'new2', 'new3');
+ primitive.splice('items', 0, 0, 'new1');
+ primitive.splice('items', 8, 0, 'new5');
+ primitive.splice('items', 5, 0, 'new4');
+ setTimeout(function() {
+ stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'new5');
+ assert.equal(stamped1[1].itemaProp, 'new4');
+ assert.equal(stamped1[2].itemaProp, 'new3');
+ assert.equal(stamped1[3].itemaProp, 'new1');
+ assert.equal(stamped1[4].itemaProp, 'e');
+ assert.equal(stamped1[5].itemaProp, 'd');
+ assert.equal(stamped1[6].itemaProp, 'c');
+ assert.equal(stamped1[7].itemaProp, 'b');
+ assert.equal(stamped1[8].itemaProp, 'a');
+ arrayDelete(primitive, 'items', 'new5');
+ arrayDelete(primitive, 'items', 'new3');
+ arrayDelete(primitive, 'items', 'new1');
+ arrayDelete(primitive, 'items', 'new2');
+ arrayDelete(primitive, 'items', 'new4');
+ setTimeout(function() {
+ stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'e');
+ assert.equal(stamped1[1].itemaProp, 'd');
+ assert.equal(stamped1[2].itemaProp, 'c');
+ assert.equal(stamped1[3].itemaProp, 'b');
+ assert.equal(stamped1[4].itemaProp, 'a');
+ done();
+ });
+ });
+ });
+
+ test('view sort, no filter: insert & remove', function(done) {
+ // repeater 1
+ primitive.$.repeater1.sort = function(a, b) {
+ return b.localeCompare(a);
+ };
+ flush();
+ var stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'e');
+ assert.equal(stamped1[1].itemaProp, 'd');
+ assert.equal(stamped1[2].itemaProp, 'c');
+ assert.equal(stamped1[3].itemaProp, 'b');
+ assert.equal(stamped1[4].itemaProp, 'a');
+ primitive.splice('items', 1, 0, 'new1', 'new2', 'new3');
+ primitive.splice('items', 3, 1);
+ primitive.splice('items', 4, 0, 'new4', 'new5', 'new6');
+ primitive.splice('items', 4, 2);
+ primitive.splice('items', 4, 1);
+ primitive.splice('items', 1, 2);
+ setTimeout(function() {
+ stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'e');
+ assert.equal(stamped1[1].itemaProp, 'd');
+ assert.equal(stamped1[2].itemaProp, 'c');
+ assert.equal(stamped1[3].itemaProp, 'b');
+ assert.equal(stamped1[4].itemaProp, 'a');
+ primitive.$.repeater1.filter = null;
+ primitive.$.repeater1.sort = null;
+ setTimeout(function() {
+ stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'a');
+ assert.equal(stamped1[1].itemaProp, 'b');
+ assert.equal(stamped1[2].itemaProp, 'c');
+ assert.equal(stamped1[3].itemaProp, 'd');
+ assert.equal(stamped1[4].itemaProp, 'e');
+ done();
+ });
+ });
+ });
+
+});
+
+suite('item changing on instance', function() {
+
+ let primitive;
+
+ setup(function() {
+ primitive = fixture('primitive');
+ flush();
+ });
+
+ test('primitive values - initial stamping', function() {
+ // repeater 1
+ var stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'a');
+ assert.equal(stamped1[1].itemaProp, 'b');
+ assert.equal(stamped1[2].itemaProp, 'c');
+ assert.equal(stamped1[3].itemaProp, 'd');
+ assert.equal(stamped1[4].itemaProp, 'e');
+ // repeater 2
+ var stamped2 = primitive.$.container2.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped2[0].itemaProp, 'a');
+ assert.equal(stamped2[1].itemaProp, 'b');
+ assert.equal(stamped2[2].itemaProp, 'c');
+ assert.equal(stamped2[3].itemaProp, 'd');
+ assert.equal(stamped2[4].itemaProp, 'e');
+ });
+
+ test('primitive values - change from inside', function() {
+ var stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ var stamped2 = primitive.$.container2.querySelectorAll('*:not(template):not(dom-repeat)');
+ var old = stamped1[2].itemaProp;
+ // Change middle item
+ stamped1[2].itemaProp = 'change!';
+ assert.equal(primitive.items[2], 'change!');
+ assert.equal(stamped2[2].itemaProp, 'change!');
+ // Revert
+ stamped2[2].itemaProp = old;
+ assert.equal(primitive.items[2], 'c');
+ assert.equal(stamped1[2].itemaProp, 'c');
+ });
+
+ test('primitive values - sorted', function() {
+ // Apply sort
+ primitive.$.repeater1.sort = function(a, b) {
+ return b.localeCompare(a);
+ };
+ primitive.$.repeater1.render();
+ var stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ var stamped2 = primitive.$.container2.querySelectorAll('*:not(template):not(dom-repeat)');
+ var old = stamped1[0].itemaProp;
+ // Change last item (first rendered in #1, last rendered in #2)
+ stamped1[0].itemaProp = 'change!';
+ assert.equal(primitive.items[4], 'change!');
+ assert.equal(stamped2[4].itemaProp, 'change!');
+ // Revert
+ stamped2[4].itemaProp = old;
+ assert.equal(primitive.items[4], 'e');
+ assert.equal(stamped1[0].itemaProp, 'e');
+ primitive.$.repeater1.sort = null;
+ primitive.$.repeater1.render();
+ });
+
+ test('structured values - initial stamping', function() {
+ let unconfigured = fixture('unconfigured');
+ unconfigured.items = window.getData();
+ flush();
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ var stamped2 = unconfigured.$.el2.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[0].itemaProp, 'prop-1');
+ assert.equal(stamped2[0].itemaProp, 'prop-1');
+ });
+
+ test('structured values - change from inside', function() {
+ let unconfigured = fixture('unconfigured');
+ unconfigured.items = window.getData();
+ flush();
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ var stamped2 = unconfigured.$.el2.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ var old = unconfigured.items[0];
+ // Change first item
+ unconfigured.$.el1.$.repeater.__instances[0].itema = {prop: 'change!'};
+ assert.equal(stamped1[0].itemaProp, 'change!');
+ assert.equal(stamped2[0].itemaProp, 'change!');
+ // Revert
+ unconfigured.$.el2.$.repeater.__instances[0].itema = old;
+ assert.equal(stamped1[0].itemaProp, 'prop-1');
+ assert.equal(stamped2[0].itemaProp, 'prop-1');
+ });
+
+ test('structured values - sorted', function() {
+ let unconfigured = fixture('unconfigured');
+ unconfigured.items = window.getData();
+ flush();
+ unconfigured.$.el1.$.repeater.sort = function(a, b) {
+ return b.prop == a.prop ? 0 : b.prop < a.prop ? -1 : 1;
+ };
+ unconfigured.$.el1.$.repeater.render();
+ var stamped1 = unconfigured.$.el1.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ var stamped2 = unconfigured.$.el2.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped1[26].itemaProp, 'prop-1');
+ assert.equal(stamped2[26].itemaProp, 'prop-3');
+ var old = unconfigured.items[2];
+ // Change last item (first rendered in #1, last rendered in #2)
+ // (but only because `observe` doesn't catch this and cause the list to
+ // re-sort; if it was, stamped1[26] should change)
+ unconfigured.$.el1.$.repeater.__instances[0].itema = {prop: 'change!'};
+ assert.equal(stamped1[0].itemaProp, 'change!');
+ assert.equal(stamped2[26].itemaProp, 'change!');
+ // Revert
+ unconfigured.$.el2.$.repeater.__instances[2].itema = old;
+ assert.equal(stamped1[0].itemaProp, 'prop-3');
+ assert.equal(stamped2[26].itemaProp, 'prop-3');
+ unconfigured.$.el1.$.repeater.sort = null;
+ unconfigured.$.el1.$.repeater.render();
+ });
+
+});
+
+suite('external change & notification', function() {
+
+ test('in-place sort', function(done) {
+ var items = [
+ 173, 166, 145, 755, 907,
+ 836, 564, 721, 540, 372,
+ 244, 145, 525, 958, 595,
+ 207, 103, 602, 769, 190];
+ let primitive = fixture('primitive');
+ primitive.items = items;
+ setTimeout(function() {
+ var stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ for (var i=0; i<items.length; i++) {
+ assert.equal(stamped1[i].itemaProp, items[i]);
+ }
+ var prev = items.slice();
+ items.sort();
+ var splices = calculateSplices(items, prev);
+ var change = {
+ indexSplices: splices
+ };
+ primitive.set('items.splices', change);
+ setTimeout(function() {
+ var stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ for (var i=0; i<items.length; i++) {
+ assert.equal(stamped1[i].itemaProp, items[i]);
+ }
+ done();
+ });
+ });
+ });
+});
+
+suite('repeater API', function() {
+
+ let unconfigured;
+
+ setup(function() {
+ unconfigured = fixture('unconfigured');
+ unconfigured.items = window.getData();
+ flush();
+ });
+
+ test('modelForElement', function() {
+ var dom = unconfigured.$.el1.root;
+ var stamped1 = dom.querySelectorAll('*:not(template):not(dom-repeat)');
+ var repeater1 = dom.querySelector('dom-repeat[as=itema]');
+ var repeater2 = dom.querySelector('dom-repeat[as=itemb]');
+ var repeater3 = dom.querySelector('dom-repeat[as=itemc]');
+
+ let model = repeater1.modelForElement(stamped1[4]);
+ assert.equal(model.itema.prop, 'prop-1');
+
+ model = repeater2.modelForElement(stamped1[4]);
+ assert.equal(model.itema.prop, 'prop-1');
+ assert.equal(model.itemb.prop, 'prop-1-1');
+
+ model = repeater3.modelForElement(stamped1[4]);
+ assert.equal(model.itema.prop, 'prop-1');
+ assert.equal(model.itemb.prop, 'prop-1-1');
+ assert.equal(model.itemc.prop, 'prop-1-1-3');
+ });
+
+ test('event.model && parentModel', function() {
+ let el = document.createElement('x-repeat-with-if');
+ document.body.appendChild(el);
+ flush();
+ let buttons = el.shadowRoot.querySelectorAll('button');
+ let outer = el.shadowRoot.querySelector('#outer');
+ let event;
+
+ // First
+ assert.equal(buttons[0].textContent, 'a');
+ buttons[0].dispatchEvent(new CustomEvent('click', {bubbles: true}));
+ assert.equal(el.handleClick.callCount, 1);
+ event = el.handleClick.getCalls()[0].args[0];
+ assert.equal(event._target, buttons[0]);
+ assert.equal(event.model.item, el.items[0].items[0]);
+ assert.equal(event.model.item.prop, 'a');
+ assert.equal(event.model.parentModel.item, el.items[0]);
+ assert.equal(event.model.parentModel.parentModel, el);
+ assert.equal(outer.modelForElement(event._target).item, el.items[0]);
+
+ // Second
+ assert.equal(buttons[1].textContent, 'b');
+ buttons[1].dispatchEvent(new CustomEvent('click', {bubbles: true}));
+ assert.equal(el.handleClick.callCount, 2);
+ event = el.handleClick.getCalls()[1].args[0];
+ assert.equal(event._target, buttons[1]);
+ assert.equal(event.model.item, el.items[0].items[1]);
+ assert.equal(event.model.item.prop, 'b');
+ assert.equal(event.model.parentModel.item, el.items[0]);
+ assert.equal(event.model.parentModel.parentModel, el);
+ assert.equal(outer.modelForElement(event._target).item, el.items[0]);
+
+ // Third
+ assert.equal(buttons[2].textContent, 'c');
+ buttons[2].dispatchEvent(new CustomEvent('click', {bubbles: true}));
+ assert.equal(el.handleClick.callCount, 3);
+ event = el.handleClick.getCalls()[2].args[0];
+ assert.equal(event._target, buttons[2]);
+ assert.equal(event.model.item, el.items[1].items[0]);
+ assert.equal(event.model.item.prop, 'c');
+ assert.equal(event.model.parentModel.item, el.items[1]);
+ assert.equal(event.model.parentModel.parentModel, el);
+ assert.equal(outer.modelForElement(event._target).item, el.items[1]);
+
+ // Fourth
+ assert.equal(buttons[3].textContent, 'd');
+ buttons[3].dispatchEvent(new CustomEvent('click', {bubbles: true}));
+ assert.equal(el.handleClick.callCount, 4);
+ event = el.handleClick.getCalls()[3].args[0];
+ assert.equal(event._target, buttons[3]);
+ assert.equal(event.model.item, el.items[1].items[1]);
+ assert.equal(event.model.item.prop, 'd');
+ assert.equal(event.model.parentModel.item, el.items[1]);
+ assert.equal(event.model.parentModel.parentModel, el);
+ assert.equal(outer.modelForElement(event._target).item, el.items[1]);
+
+ document.body.removeChild(el);
+ });
+
+ test('indexForElement', function() {
+ var dom = unconfigured.$.el1.root;
+ var stamped1 = dom.querySelectorAll('*:not(template):not(dom-repeat)');
+ var repeater1 = dom.querySelector('dom-repeat[as=itema]');
+ var repeater2 = dom.querySelector('dom-repeat[as=itemb]');
+ var repeater3 = dom.querySelector('dom-repeat[as=itemc]');
+
+ assert.equal(repeater1.indexForElement(stamped1[4]), 0);
+ assert.equal(repeater2.indexForElement(stamped1[4]), 0);
+ assert.equal(repeater3.indexForElement(stamped1[4]), 2);
+ });
+
+ test('indexForElement', function() {
+ var dom = unconfigured.$.el1.root;
+ var stamped1 = dom.querySelectorAll('*:not(template):not(dom-repeat)');
+ var repeater1 = dom.querySelector('dom-repeat[as=itema]');
+ var repeater2 = dom.querySelector('dom-repeat[as=itemb]');
+ var repeater3 = dom.querySelector('dom-repeat[as=itemc]');
+
+ assert.equal(repeater1.itemForElement(stamped1[4]).prop, 'prop-1');
+ assert.equal(repeater2.itemForElement(stamped1[4]).prop, 'prop-1-1');
+ assert.equal(repeater3.itemForElement(stamped1[4]).prop, 'prop-1-1-3');
+ });
+
+ test('renderedItemCount', function() {
+ let primitive = fixture('primitive');
+ flush();
+ var repeater1 = primitive.$.repeater1;
+ primitive.items = [ 'a', 'b', 'c', 'd', 'e' ];
+ repeater1.render();
+ assert.equal(repeater1.renderedItemCount, 5, 'renderedItemCount is incorrect');
+ repeater1.renderedItemCount = 0;
+ assert.equal(repeater1.renderedItemCount, 5, 'renderedItemCount is writable');
+ repeater1.filter = function(item) {
+ return (item != 'a' && item != 'e');
+ };
+ repeater1.render();
+ assert.equal(repeater1.renderedItemCount, 3, 'renderedItemCount incorrect after filter');
+ // reset repeater
+ repeater1.filter = undefined;
+ repeater1.render();
+ });
+
+ test('_showHideChildren', function() {
+ // Initially all showing
+ let primitive = fixture('primitive');
+ flush();
+ var stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(getComputedStyle(stamped1[0]).display, 'block');
+ assert.equal(getComputedStyle(stamped1[1]).display, 'block');
+ assert.equal(getComputedStyle(stamped1[2]).display, 'block');
+ assert.equal(getComputedStyle(stamped1[3]).display, 'block');
+ assert.equal(getComputedStyle(stamped1[4]).display, 'block');
+
+ // Hide all
+ primitive.$.repeater1.__hideTemplateChildren__ = true;
+ primitive.$.repeater1._showHideChildren(true);
+ assert.equal(getComputedStyle(stamped1[0]).display, 'none');
+ assert.equal(getComputedStyle(stamped1[1]).display, 'none');
+ assert.equal(getComputedStyle(stamped1[2]).display, 'none');
+ assert.equal(getComputedStyle(stamped1[3]).display, 'none');
+ assert.equal(getComputedStyle(stamped1[4]).display, 'none');
+
+ // Add one while hidden
+ primitive.push('items', 'new 1');
+ primitive.$.repeater1.render();
+ stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(getComputedStyle(stamped1[0]).display, 'none');
+ assert.equal(getComputedStyle(stamped1[1]).display, 'none');
+ assert.equal(getComputedStyle(stamped1[2]).display, 'none');
+ assert.equal(getComputedStyle(stamped1[3]).display, 'none');
+ assert.equal(getComputedStyle(stamped1[4]).display, 'none');
+ assert.equal(getComputedStyle(stamped1[5]).display, 'none');
+
+ // Add one then unhide
+ primitive.push('items', 'new 2');
+ primitive.$.repeater1.__hideTemplateChildren__ = false;
+ primitive.$.repeater1._showHideChildren(false);
+ primitive.$.repeater1.render();
+ stamped1 = primitive.$.container1.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(getComputedStyle(stamped1[0]).display, 'block');
+ assert.equal(getComputedStyle(stamped1[1]).display, 'block');
+ assert.equal(getComputedStyle(stamped1[2]).display, 'block');
+ assert.equal(getComputedStyle(stamped1[3]).display, 'block');
+ assert.equal(getComputedStyle(stamped1[4]).display, 'block');
+ assert.equal(getComputedStyle(stamped1[5]).display, 'block');
+ assert.equal(getComputedStyle(stamped1[6]).display, 'block');
+
+ // Revert
+ primitive.splice('items', 5, 2);
+ primitive.$.repeater1.render();
+ });
+
+});
+
+
+suite('limit', function() {
+
+ var checkItemOrder = function(stamped) {
+ for (var i=0; i<stamped.length; i++) {
+ assert.equal(parseInt(stamped[i].textContent), i);
+ }
+ };
+
+ test('initial limit', function() {
+ limited.items = limited.preppedItems;
+ limited.$.repeater.__limit = 2;
+ limited.$.repeater.render();
+ var stamped = limited.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 2);
+ checkItemOrder(stamped);
+ });
+
+ test('change item paths in & out of limit', function() {
+ var stamped = limited.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ limited.outerProp = {prop: 'changed'};
+ assert.equal(stamped[0].prop, 'changed');
+ limited.set('items.0.prop', '0-changed');
+ limited.set('items.3.prop', '3-changed');
+ assert.equal(stamped[0].textContent, '0-changed');
+ limited.set('outerProp.prop', 'changed again');
+ assert.equal(stamped[0].prop, 'changed again');
+ });
+
+ test('increase limit', function() {
+ // Increase limit
+ limited.$.repeater.__limit = 10;
+ limited.$.repeater.render();
+ var stamped = limited.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 10);
+ checkItemOrder(stamped);
+ assert.equal(stamped[3].prop, 'changed again');
+ assert.equal(stamped[3].textContent, '3-changed');
+ limited.set('items.0.prop', 0);
+ limited.set('items.3.prop', 3);
+ // Increase limit
+ limited.$.repeater.__limit = 20;
+ limited.$.repeater.render();
+ stamped = limited.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 20);
+ checkItemOrder(stamped);
+ });
+
+ test('increase limit above items.length', function() {
+ limited.$.repeater.__limit = 30;
+ limited.$.repeater.render();
+ var stamped = limited.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 20);
+ checkItemOrder(stamped);
+ });
+
+ test('decrease limit', function() {
+ // Decrease limit
+ limited.$.repeater.__limit = 15;
+ limited.$.repeater.render();
+ var stamped = limited.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 15);
+ checkItemOrder(stamped);
+ // Decrease limit
+ limited.$.repeater.__limit = 0;
+ limited.$.repeater.render();
+ stamped = limited.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 0);
+ });
+
+ test('negative limit', function() {
+ limited.$.repeater.__limit = -10;
+ limited.$.repeater.render();
+ var stamped = limited.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 0);
+ });
+
+});
+
+suite('limit with sort', function() {
+
+ var checkItemOrder = function(stamped) {
+ for (var i=0; i<stamped.length; i++) {
+ assert.equal(stamped[i].textContent, 19 - i);
+ }
+ };
+
+ test('initial limit', function() {
+ limited.$.repeater.__limit = 2;
+ limited.$.repeater.sort = function(a, b) {
+ return b.prop - a.prop;
+ };
+ limited.items = null;
+ limited.$.repeater.render();
+ limited.items = limited.preppedItems;
+ limited.$.repeater.render();
+ var stamped = limited.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 2);
+ checkItemOrder(stamped);
+ });
+
+ test('increase limit', function() {
+ // Increase limit
+ limited.$.repeater.__limit = 10;
+ limited.$.repeater.render();
+ var stamped = limited.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 10);
+ checkItemOrder(stamped);
+ // Increase limit
+ limited.$.repeater.__limit = 20;
+ limited.$.repeater.render();
+ stamped = limited.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 20);
+ checkItemOrder(stamped);
+ });
+
+ test('increase limit above items.length', function() {
+ limited.$.repeater.__limit = 30;
+ limited.$.repeater.render();
+ var stamped = limited.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 20);
+ checkItemOrder(stamped);
+ });
+
+ test('decrease limit', function() {
+ // Decrease limit
+ limited.$.repeater.__limit = 15;
+ limited.$.repeater.render();
+ var stamped = limited.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 15);
+ checkItemOrder(stamped);
+ // Decrease limit
+ limited.$.repeater.__limit = 0;
+ limited.$.repeater.render();
+ stamped = limited.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 0);
+ });
+
+ test('negative limit', function() {
+ limited.$.repeater.__limit = -10;
+ limited.$.repeater.render();
+ var stamped = limited.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 0);
+ });
+
+});
+
+suite('limit with filter', function() {
+
+ var checkItemOrder = function(stamped) {
+ for (var i=0; i<stamped.length; i++) {
+ assert.equal(stamped[i].textContent, i * 2);
+ }
+ };
+
+ test('initial limit', function() {
+ var items = limited.items;
+ limited.$.repeater.__limit = 2;
+ limited.$.repeater.sort = null;
+ limited.$.repeater.filter = function(a) {
+ return (a.prop % 2) === 0;
+ };
+ limited.items = null;
+ limited.$.repeater.render();
+ limited.items = items;
+ limited.$.repeater.render();
+ var stamped = limited.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 2);
+ checkItemOrder(stamped);
+ });
+
+ test('increase limit', function() {
+ // Increase limit
+ limited.$.repeater.__limit = 5;
+ limited.$.repeater.render();
+ var stamped = limited.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 5);
+ checkItemOrder(stamped);
+ // Increase limit
+ limited.$.repeater.__limit = 10;
+ limited.$.repeater.render();
+ stamped = limited.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 10);
+ checkItemOrder(stamped);
+ });
+
+ test('increase limit above items.length', function() {
+ limited.$.repeater.__limit = 30;
+ limited.$.repeater.render();
+ var stamped = limited.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 10);
+ checkItemOrder(stamped);
+ });
+
+ test('decrease limit', function() {
+ // Decrease limit
+ limited.$.repeater.__limit = 5;
+ limited.$.repeater.render();
+ var stamped = limited.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 5);
+ checkItemOrder(stamped);
+ // Decrease limit
+ limited.$.repeater.__limit = 0;
+ limited.$.repeater.render();
+ stamped = limited.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 0);
+ });
+
+ test('negative limit', function() {
+ limited.$.repeater.__limit = -10;
+ limited.$.repeater.render();
+ var stamped = limited.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 0);
+ });
+
+});
+
+suite('limit with sort & filter', function() {
+
+ var checkItemOrder = function(stamped) {
+ for (var i=0; i<stamped.length; i++) {
+ assert.equal(stamped[i].textContent, (9 - i) * 2);
+ }
+ };
+
+ test('initial limit', function() {
+ var items = limited.items;
+ limited.$.repeater.__limit = 2;
+ limited.$.repeater.sort = function(a, b) {
+ return b.prop - a.prop;
+ };
+ limited.$.repeater.filter = function(a) {
+ return (a.prop % 2) === 0;
+ };
+ limited.items = null;
+ limited.$.repeater.render();
+ limited.items = items;
+ limited.$.repeater.render();
+ var stamped = limited.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 2);
+ checkItemOrder(stamped);
+ });
+
+ test('increase limit', function() {
+ // Increase limit
+ limited.$.repeater.__limit = 5;
+ limited.$.repeater.render();
+ var stamped = limited.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 5);
+ checkItemOrder(stamped);
+ // Increase limit
+ limited.$.repeater.__limit = 10;
+ limited.$.repeater.render();
+ stamped = limited.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 10);
+ checkItemOrder(stamped);
+ });
+
+ test('increase limit above items.length', function() {
+ limited.$.repeater.__limit = 30;
+ limited.$.repeater.render();
+ var stamped = limited.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 10);
+ checkItemOrder(stamped);
+ });
+
+ test('decrease limit', function() {
+ // Decrease limit
+ limited.$.repeater.__limit = 5;
+ limited.$.repeater.render();
+ var stamped = limited.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 5);
+ checkItemOrder(stamped);
+ // Decrease limit
+ limited.$.repeater.__limit = 0;
+ limited.$.repeater.render();
+ stamped = limited.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 0);
+ });
+
+ test('negative limit', function() {
+ limited.$.repeater.__limit = -10;
+ limited.$.repeater.render();
+ var stamped = limited.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 0);
+ });
+
+});
+
+// TODO(kschaaf): This test suite has proven to be flaky only on IE, only
+// on CI (Sauce) presumably because of rAF handling in the CI environment
+// disabling for IE for now to avoid Polymer tests being flaky
+if (!/Trident/.test(navigator.userAgent)) {
+
+ // TODO(kschaaf): We're experiencing more flakiness on Safari on CI,
+ // for now, skip these tests and revisit
+ suite.skip('chunked rendering', function() {
+
+ test('basic chunked rendering', function(done) {
+
+ var checkItemOrder = function(stamped) {
+ for (var i=0; i<stamped.length; i++) {
+ assert.equal(stamped[i].textContent, i);
+ }
+ };
+
+ var lastLength = 0;
+ var checkCount = function() {
+ var stamped = chunked.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ checkItemOrder(stamped);
+ if (stamped.length && lastLength === 0) {
+ // Initial rendering of initial count
+ assert.equal(stamped.length, 10);
+ } else {
+ // Remaining rendering increments
+ assert.isTrue(stamped.length > lastLength);
+ }
+ if (stamped.length < 100) {
+ lastLength = stamped.length;
+ checkUntilComplete();
+ } else {
+ // Final rendering at exact item count
+ assert.equal(stamped.length, 100);
+ done();
+ }
+ };
+ var checkUntilComplete = function() {
+ // On polyfilled MO, need to wait one setTimeout before rAF
+ if (MutationObserver._isPolyfilled) {
+ setTimeout(function() {
+ requestAnimationFrame(checkCount);
+ });
+ } else {
+ requestAnimationFrame(checkCount);
+ }
+ };
+
+ chunked.items = chunked.preppedItems.slice();
+ checkUntilComplete();
+
+ });
+
+ test('mutations during chunked rendering', function(done) {
+
+ var checkItemOrder = function(stamped) {
+ var last = -1;
+ for (var i=0; i<stamped.length; i++) {
+ var curr = parseFloat(stamped[i].textContent);
+ assert.isTrue(curr > last);
+ last = curr;
+ }
+ };
+
+ var mutateArray = function(repeater, renderedCount) {
+ // The goal here is to remove & add some, and do it over
+ // the threshold of where we have currently rendered items, and
+ // ensure that the prop values of the newly inserted items are in
+ // ascending order so we can do a simple check in checkItemOrder
+ var overlap = 2;
+ var remove = 4;
+ var add = 6;
+ var start = renderedCount.length - overlap;
+ if (start + add < repeater.items.length) {
+ var end = start + remove;
+ var args = ['items', start, remove];
+ var startVal = repeater.items[start].prop;
+ var endVal = repeater.items[end].prop;
+ var delta = (endVal - startVal) / add;
+ for (var i=0; i<add; i++) {
+ args.push({prop: startVal + i*delta});
+ }
+ repeater.splice.apply(repeater, args);
+ }
+ };
+
+ var lastLength = 0;
+ var mutateCount = 5;
+ var checkCount = function() {
+ var stamped = chunked.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ checkItemOrder(stamped);
+ if (stamped.length && lastLength === 0) {
+ // Initial rendering of initial count
+ assert.equal(stamped.length, 10);
+ } else {
+ // Remaining rendering increments
+ assert.isTrue(stamped.length > lastLength);
+ }
+ if (stamped.length < chunked.items.length) {
+ if (mutateCount-- > 0) {
+ mutateArray(chunked, stamped);
+ }
+ lastLength = stamped.length;
+ checkUntilComplete();
+ } else {
+ // Final rendering at exact item count
+ assert.equal(stamped.length, chunked.items.length);
+ done();
+ }
+ };
+ var checkUntilComplete = function() {
+ // On polyfilled MO, need to wait one setTimeout before rAF
+ if (MutationObserver._isPolyfilled) {
+ setTimeout(function() {
+ requestAnimationFrame(checkCount);
+ });
+ } else {
+ requestAnimationFrame(checkCount);
+ }
+ };
+
+ chunked.items = chunked.preppedItems.slice();
+ checkUntilComplete();
+
+ });
+
+
+ test('mutations during chunked rendering, sort & filtered', function(done) {
+
+ var checkItemOrder = function(stamped) {
+ var last = Infinity;
+ for (var i=0; i<stamped.length; i++) {
+ var curr = parseFloat(stamped[i].textContent);
+ assert.isTrue(curr <= last);
+ assert.strictEqual(curr % 2, 0);
+ last = curr;
+ }
+ };
+
+ var mutateArray = function(repeater, stamped) {
+ var start = parseInt(stamped[0].textContent);
+ var end = parseInt(stamped[stamped.length-1].textContent);
+ var mid = (end-start)/2;
+ for (var i=0; i<5; i++) {
+ chunked.push('items', {prop: mid + 1});
+ }
+ chunked.splice('items', Math.round(stamped.length/2), 3);
+ };
+
+ var lastLength = 0;
+ var mutateCount = 5;
+ var checkCount = function() {
+ var stamped = chunked.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ checkItemOrder(stamped);
+ var filteredLength = chunked.items.filter(chunked.$.repeater.filter).length;
+ if (stamped.length && lastLength === 0) {
+ // Initial rendering of initial count
+ assert.equal(stamped.length, 10);
+ } else {
+ // Remaining rendering increments
+ if (stamped.length < filteredLength) {
+ assert.isTrue(stamped.length > lastLength);
+ }
+ }
+ if (stamped.length < filteredLength) {
+ if (mutateCount-- > 0) {
+ mutateArray(chunked, stamped);
+ }
+ lastLength = stamped.length;
+ checkUntilComplete();
+ } else {
+ assert.equal(stamped.length, filteredLength);
+ done();
+ }
+ };
+ var checkUntilComplete = function() {
+ // On polyfilled MO, need to wait one setTimeout before rAF
+ if (MutationObserver._isPolyfilled) {
+ setTimeout(function() {
+ requestAnimationFrame(checkCount);
+ });
+ } else {
+ requestAnimationFrame(checkCount);
+ }
+ };
+
+ chunked.$.repeater.sort = function(a, b) {
+ return b.prop - a.prop;
+ };
+ chunked.$.repeater.filter = function(a) {
+ return (a.prop % 2) === 0;
+ };
+ chunked.items = chunked.preppedItems.slice();
+ checkUntilComplete();
+
+ });
+
+ });
+
+}
+
+suite('misc', function() {
+
+ test('large splice', function(done) {
+ let primitiveLarge = fixture('primitiveLarge');
+ flush();
+ primitiveLarge.splice('items', 0, 10);
+ setTimeout(function() {
+ var stamped =
+ primitiveLarge.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 1, 'total stamped count incorrect');
+ assert.equal(stamped[0].textContent, '10');
+ done();
+ });
+ });
+
+ test('css scoping retained when re-ordering', function() {
+ if (!window.ShadyDOM) {
+ this.skip();
+ }
+ let simple = fixture('simple');
+ flush();
+ var removed;
+ // Confirm initial scoping
+ var stamped = simple.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped[0].itemaProp, 'prop-1');
+ assert(stamped[0].classList.contains('x-simple-repeat'), 'expected scoping');
+ assert.equal(stamped.length, 3, 'total stamped count incorrect');
+ // Move
+ removed = simple.splice('items', 0, 1);
+ simple.splice('items', 1, 0, removed[0]);
+ flush();
+ stamped = simple.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 3, 'total stamped count incorrect');
+ let movedItem = simple.$.repeat.modelForElement(stamped[1]).item;
+ assert.equal(removed[0], movedItem);
+ assert.equal(stamped[1].itemaProp, 'prop-1');
+ assert(stamped[1].classList.contains('x-simple-repeat'), 'expected scoping');
+ // Revert
+ removed = simple.splice('items', 1, 1);
+ simple.splice('items', 0, 0, removed[0]);
+ flush();
+ stamped = simple.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped.length, 3, 'total stamped count incorrect');
+ movedItem = simple.$.repeat.modelForElement(stamped[0]).item;
+ assert.equal(removed[0], movedItem);
+ assert.equal(stamped[0].itemaProp, 'prop-1');
+ assert(stamped[0].classList.contains('x-simple-repeat'), 'expected scoping');
+ });
+
+ test('paths update on observed properties', function() {
+ let simple = fixture('simple');
+ flush();
+ //debugger;
+ var stamped = simple.root.querySelectorAll('*:not(template):not(dom-repeat)');
+ assert.equal(stamped[0].itemaProp, 'prop-1');
+ simple.$.repeat.observe = 'prop';
+ flush();
+ simple.set('items.0.prop', {foo: 0});
+ flush();
+ assert.equal(stamped[0].get('itemaProp.foo'), 0);
+ simple.set('items.0.prop.foo', 1);
+ flush();
+ assert.equal(stamped[0].get('itemaProp.foo'), 1);
+ simple.set('items.0.prop.foo', 2);
+ flush();
+ assert.equal(stamped[0].get('itemaProp.foo'), 2);
+ });
+});
+
+suite('timing', function() {
+
+ test('non-upgrade case finds template', function() {
+ assert.equal(nonUpgrade.textContent.trim(), 'stamped');
+ });
+
+});
+
+suite('dom-change composed', function() {
+
+ test('dom-change event composed, bubbles outside dom-if scope', function() {
+ var el = fixture('simple');
+ var domChangeFired = 0;
+ el.addEventListener('dom-change', function() {
+ domChangeFired++;
+ });
+ el.push('items', {prop: 'added1'});
+ flush();
+ el.push('items', {prop: 'added2'});
+ flush();
+ assert.equal(domChangeFired, 2);
+ });
+});
+</script>
+
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/dynamic-import.html b/third_party/polymer3/bower_components/polymer/test/unit/dynamic-import.html
new file mode 100644
index 0000000..588c2f5
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/dynamic-import.html
@@ -0,0 +1,137 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="./dynamic-imports/dynamic-element.js"></script>
+</head>
+<body>
+
+<dynamic-element></dynamic-element>
+
+<script type="module">
+import './dynamic-imports/dynamic-element.js';
+import { Base } from '../../polymer-legacy.js';
+
+suite('dynamic imports', function() {
+
+ test('use importHref to load and create an element', function(done) {
+ var d = document.querySelector('dynamic-element');
+ d.whenDynamicContentReady(function() {
+ assert.isTrue(d.isAttached, true, 'dynamic element not readied');
+ assert.ok(d.$.content, 'dynamic element does not have content');
+ assert.isTrue(d.$.outer.isAttached, true, 'dynamic sub-element not readied');
+ assert.ok(d.$.outer.$.content, 'dynamic sub-element does not have content');
+ assert.isTrue(d.$.outer.$.inner.isAttached, true, 'dynamic sub-element not readied');
+ assert.ok(d.$.outer.$.inner.$.content, 'dynamic sub-element does not have content');
+ done();
+ });
+ });
+
+ suite('async/sync loading', function() {
+
+ var url = 'dynamic-imports/dynamic-element.html';
+
+ test('importHref does not cache failed results', function(done) {
+ Base.importHref('does_not_exist.html', function() {
+ throw new Error('Load handler should not be called.');
+ }, function() {
+ var link = document.head
+ .querySelector('[href="does_not_exist.html"]');
+ assert.isNotOk(link, 'The link should not exist');
+ done();
+ });
+ });
+
+ test('importHref caches successful results', function(done) {
+ var targetUrl = 'dynamic-imports/async-import.html';
+
+ Base.importHref(targetUrl, function(event) {
+ var targetOne = event.target;
+ Base.importHref(targetUrl, function(event) {
+ var targetTwo = event.target;
+
+ assert.isOk(targetOne, 'Event target should be available');
+ assert.strictEqual(targetOne, targetTwo,
+ 'Link element references should be identical');
+ done();
+ }, done);
+ }, done);
+ });
+
+ test('importHref sync loads by default', function(done) {
+ Base.importHref(url, function(e) {
+ assert.isFalse(e.target.hasAttribute('async'),
+ 'sync load is default');
+ done();
+ });
+ });
+
+ test('importHref sync called again, triggers load', function(done) {
+ Base.importHref(url, function() {
+ Base.importHref(url, function() {
+ done();
+ });
+ });
+ });
+
+ test('importHref async loading', function(done) {
+ Base.importHref('dynamic-imports/async-import.html', function(e) {
+ assert.isTrue(window.asyncImportLoaded, 'flag not set from import');
+ assert.isTrue(e.target.hasAttribute('async'), 'async load');
+ assert.ok(e.target.import);
+ done();
+ }, null, true);
+ });
+
+ test('importHref does not leak event listeners on load', function(done) {
+ var errorSpy = sinon.spy();
+ var loadSpy = sinon.spy(function(e) {
+ var target = e.target;
+ target.dispatchEvent(new Event('error'));
+ assert.isFalse(errorSpy.called, 'doesn\'t trigger the error event listener');
+ setTimeout(function() {
+ loadSpy.reset();
+ target.dispatchEvent(new Event('load'));
+ assert.isFalse(loadSpy.called, 'doesn\'t trigger the load event listener');
+ done();
+ });
+ });
+
+ Base.importHref('dynamic-imports/async-import.html', loadSpy, errorSpy, true);
+ });
+
+ test('importHref does not leak event listeners on error', function(done) {
+ var loadSpy = sinon.spy();
+ var errorSpy = sinon.spy(function(e) {
+ var target = e.target;
+ target.dispatchEvent(new Event('load'));
+ assert.isFalse(loadSpy.called, 'doesn\'t trigger the load event listener');
+ setTimeout(function() {
+ errorSpy.reset();
+ target.dispatchEvent(new Event('error'));
+ assert.isFalse(errorSpy.called, 'doesn\'t trigger the error event listener');
+ done();
+ });
+ });
+
+ Base.importHref('dynamic-imports/async-import-invalid.html', loadSpy, errorSpy, true);
+ });
+
+ });
+
+});
+</script>
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/dynamic-imports/async-import.html b/third_party/polymer3/bower_components/polymer/test/unit/dynamic-imports/async-import.html
new file mode 100644
index 0000000..b62b372
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/dynamic-imports/async-import.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<script>
+ window.asyncImportLoaded = true;
+</script>
\ No newline at end of file
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/dynamic-imports/async.html b/third_party/polymer3/bower_components/polymer/test/unit/dynamic-imports/async.html
new file mode 100644
index 0000000..779cad7
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/dynamic-imports/async.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/dynamic-imports/dynamic-element.js b/third_party/polymer3/bower_components/polymer/test/unit/dynamic-imports/dynamic-element.js
new file mode 100644
index 0000000..71bb347
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/dynamic-imports/dynamic-element.js
@@ -0,0 +1,42 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import '../../../polymer-legacy.js';
+
+import { Polymer } from '../../../lib/legacy/polymer-fn.js';
+import { html } from '../../../lib/utils/html-tag.js';
+import { dom } from '../../../lib/legacy/polymer.dom.js';
+Polymer({
+ _template: html`
+ <span id="content">dynamic-element</span> :
+`,
+
+ is: 'dynamic-element',
+
+ ready: function() {
+ var url = this.resolveUrl('outer-element.html');
+ this.importHref(url, function() {
+ this.$.outer = document.createElement('outer-element');
+ dom(this.root).appendChild(this.$.outer);
+ this._hasContent = true;
+ if (this._callback) {
+ this._callback();
+ }
+ }, function() {
+ assert.fail('failed to load import', url);
+ });
+ },
+
+ whenDynamicContentReady: function(callback) {
+ this._callback = callback;
+ if (this._hasContent) {
+ this._callback();
+ }
+ }
+});
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/dynamic-imports/inner-element.js b/third_party/polymer3/bower_components/polymer/test/unit/dynamic-imports/inner-element.js
new file mode 100644
index 0000000..ae8a735
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/dynamic-imports/inner-element.js
@@ -0,0 +1,20 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import '../../../polymer-legacy.js';
+
+import { Polymer } from '../../../lib/legacy/polymer-fn.js';
+import { html } from '../../../lib/utils/html-tag.js';
+Polymer({
+ _template: html`
+ <span id="content">inner-element</span>
+`,
+
+ is: 'inner-element'
+});
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/dynamic-imports/outer-element.html b/third_party/polymer3/bower_components/polymer/test/unit/dynamic-imports/outer-element.html
new file mode 100644
index 0000000..8670c26
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/dynamic-imports/outer-element.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+
+<script type="module" src="../../../polymer-legacy.js"></script>
+<script type="module" src="./inner-element.js"></script>
+
+<dom-module id="outer-element">
+ <template>
+ <span id="content">
+ outer-element : <inner-element id="inner"></inner-element>
+ </span>
+ </template>
+</dom-module>
+
+<script type="module">
+import '../../../polymer-legacy.js';
+import './inner-element.js';
+import { Polymer } from '../../../lib/legacy/polymer-fn.js';
+Polymer({
+ is: 'outer-element'
+});
+</script>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/events-elements.js b/third_party/polymer3/bower_components/polymer/test/unit/events-elements.js
new file mode 100644
index 0000000..02b5087
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/events-elements.js
@@ -0,0 +1,88 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import { Base } from '../../polymer-legacy.js';
+
+import { Polymer } from '../../lib/legacy/polymer-fn.js';
+import { html } from '../../lib/utils/html-tag.js';
+var EventLoggerImpl = {
+ created: function() {
+ this._handled = {};
+ this._removed = [];
+ },
+ handle: function(e) {
+ const order = e._handleOrder = e._handleOrder || [];
+ order.push(this.localName);
+ this._handled[e.currentTarget.localName] = e.type;
+ },
+ unlisten: function(node, eventName, handler) {
+ this._removed.push({target: node.localName, event: eventName});
+ Base.unlisten.call(this, node, eventName, handler);
+ }
+};
+Polymer({
+ is: 'x-listeners',
+ behaviors: [EventLoggerImpl],
+ listeners: {
+ foo: 'handle',
+ bar: 'missing'
+ }
+});
+Polymer({
+ _template: html`
+ <div id="inner" on-foo="handle" on-bar="missing"></div>
+`,
+
+ is: 'x-on',
+ behaviors: [EventLoggerImpl]
+});
+Polymer({
+ _template: html`
+ <x-listeners id="inner" on-foo="handle"></x-listeners>
+`,
+
+ is: 'x-order',
+ behaviors: [EventLoggerImpl]
+});
+Polymer({
+ _template: html`
+ <div id="inner"></div>
+`,
+
+ is: 'x-dynamic',
+ behaviors: [EventLoggerImpl],
+
+ setup: function() {
+ this.listen(this, 'foo', 'handle');
+ this.listen(this.$.inner, 'foo', 'handle');
+ this.listen(this, 'bar', 'missing');
+ this.listen(this.$.inner, 'bar', 'missing');
+ },
+
+ teardown: function() {
+ this.unlisten(this, 'foo', 'handle');
+ this.unlisten(this.$.inner, 'foo', 'handle');
+ this.unlisten(this, 'bar', 'missing');
+ this.unlisten(this.$.inner, 'bar', 'missing');
+ }
+});
+Polymer({
+ is: 'x-double',
+ behaviors: [EventLoggerImpl],
+ ready: function() {
+ this.fooChanged = sinon.spy();
+ },
+ setup: function() {
+ this.listen(this, 'foo', 'fooChanged');
+ this.listen(this, 'foo', 'fooChanged');
+ },
+ teardown: function() {
+ this.unlisten(this, 'foo', 'fooChanged');
+ }
+});
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/events.html b/third_party/polymer3/bower_components/polymer/test/unit/events.html
new file mode 100644
index 0000000..d9bd9f4
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/events.html
@@ -0,0 +1,178 @@
+<!DOCTYPE html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="UTF-8">
+
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+
+ <script type="module" src="../../polymer-legacy.js"></script>
+ <script type="module" src="./events-elements.js"></script>
+</head>
+<body>
+
+ <script type="module">
+import './events-elements.js';
+import { afterNextRender } from '../../lib/utils/render-status.js';
+suite('Event Listeners', function() {
+ var el;
+
+ suite('listeners block', function() {
+ suiteSetup(function() {
+ el = document.createElement('x-listeners');
+ document.body.appendChild(el);
+ });
+
+ suiteTeardown(function() {
+ document.body.removeChild(el);
+ });
+
+ test('fire - method exists', function() {
+ el.fire('foo');
+ assert.equal(el._handled[el.localName], 'foo');
+ });
+
+ test('fire - method missing', function() {
+ sinon.spy(console, 'warn');
+ el.fire('bar');
+ assert.isTrue(console.warn.calledOnce);
+ assert.equal(console.warn.getCall(0).args[0], 'listener method `missing` not defined');
+ console.warn.restore();
+ });
+
+ });
+
+ suite('on-*', function() {
+
+ var options;
+ suiteSetup(function() {
+ el = document.createElement('x-on');
+ document.body.appendChild(el);
+ options = {node: el.$.inner};
+ });
+
+ suiteTeardown(function() {
+ document.body.removeChild(el);
+ });
+
+ test('fire - method exists', function() {
+ el.fire('foo', {}, options);
+ assert.equal(el._handled.div, 'foo');
+ assert(!el._handled[el.localName]);
+ });
+
+ test('fire - method missing', function() {
+ sinon.spy(console, 'warn');
+ el.fire('bar', {}, options);
+ assert.isTrue(console.warn.calledOnce);
+ assert.equal(console.warn.getCall(0).args[0], 'listener method `missing` not defined');
+ console.warn.restore();
+ });
+
+ });
+
+ suite('listeners + on-*', function() {
+ suiteSetup(function() {
+ el = document.createElement('x-order');
+ document.body.appendChild(el);
+ });
+
+ suiteTeardown(function() {
+ document.body.removeChild(el);
+ });
+
+ test('listeners handled before on-* events', function() {
+ const e = el.$.inner.fire('foo', {});
+ assert.deepEqual(e._handleOrder, ['x-listeners', 'x-order']);
+ });
+
+ });
+
+ suite('dynamic', function() {
+
+ var options;
+ suiteSetup(function(done) {
+ el = document.createElement('x-dynamic');
+ document.body.appendChild(el);
+ afterNextRender(null, function() {
+ options = {node: el.$.inner};
+ done();
+ });
+ });
+
+ suiteTeardown(function() {
+ document.body.removeChild(el);
+ });
+
+ test('setup', function() {
+ assert(!el.__boundListeners, 'listeners are not bound');
+ el.setup();
+ var boundListeners = el.__boundListeners;
+ assert(boundListeners, 'listeners are bound');
+ var outerMap = boundListeners.get(el);
+ assert(outerMap, 'element events have handlers');
+ var innerMap = boundListeners.get(el.$.inner);
+ assert(innerMap, 'inner div events have handlers');
+ });
+
+ test('fire - method exists', function() {
+ el.fire('foo', {}, options);
+ assert.equal(el._handled.div, 'foo', 'inner handler');
+ assert.equal(el._handled[el.localName], 'foo', 'outer handler');
+ });
+
+ test('fire - method missing', function() {
+ sinon.spy(console, 'warn');
+ el.fire('bar', {}, options);
+ assert.isTrue(console.warn.calledTwice);
+ assert.equal(console.warn.getCall(0).args[0], 'listener method `missing` not defined');
+ assert.equal(console.warn.getCall(1).args[0], 'listener method `missing` not defined');
+ console.warn.restore();
+ });
+
+ test('teardown', function() {
+ el.teardown();
+ assert.deepEqual(el._removed[0], {target: el.localName, event: 'foo'});
+ assert.deepEqual(el._removed[1], {target: 'div', event: 'foo'});
+ assert.deepEqual(el._removed[2], {target: el.localName, event: 'bar'});
+ assert.deepEqual(el._removed[3], {target: 'div', event: 'bar'});
+ });
+ });
+
+ suite('Event Listener Cache', function() {
+ suiteSetup(function() {
+ el = document.createElement('x-double');
+ el.setup();
+ document.body.appendChild(el);
+ });
+
+ suiteTeardown(function() {
+ document.body.removeChild(el);
+ });
+
+ test('Event handler fires only once', function() {
+ el.fire('foo');
+ assert.isTrue(el.fooChanged.calledOnce, 'event should fire only once');
+ });
+
+ test('once unlistened, no handler fire', function() {
+ el.teardown();
+ el.fire('foo');
+ assert.isTrue(el.fooChanged.calledOnce, 'event should not be handled anymore');
+ });
+ });
+});
+</script>
+
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/flattened-nodes-observer.html b/third_party/polymer3/bower_components/polymer/test/unit/flattened-nodes-observer.html
new file mode 100644
index 0000000..8d111e8
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/flattened-nodes-observer.html
@@ -0,0 +1,1058 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-element.js"></script>
+ <script type="module" src="../../lib/utils/flattened-nodes-observer.js"></script>
+</head>
+<body>
+
+ <dom-module id='test-self-observe'>
+ <template>
+ <slot id="slot"></slot>
+ </template>
+ <script type="module">
+import { PolymerElement } from '../../polymer-element.js';
+import { FlattenedNodesObserver } from '../../lib/utils/flattened-nodes-observer.js';
+class TestSelfObserve extends PolymerElement {
+ static get is() { return 'test-self-observe';}
+
+ connectedCallback() {
+ super.connectedCallback();
+ this._observer = new FlattenedNodesObserver(this, (info) => {
+ this.info = info;
+ });
+ }
+ disconnectedCallback() {
+ super.disconnectedCallback();
+ this._observer.disconnect();
+ }
+}
+customElements.define(TestSelfObserve.is, TestSelfObserve);
+</script>
+ </dom-module>
+
+ <dom-module id='test-static'>
+ <template>
+ <div>static</div>
+ </template>
+ <script type="module">
+import { PolymerElement } from '../../polymer-element.js';
+import '../../lib/utils/flattened-nodes-observer.js';
+class TestStatic extends PolymerElement {
+ static get is() { return 'test-static'; }
+}
+customElements.define(TestStatic.is, TestStatic);
+</script>
+ </dom-module>
+
+ <dom-module id='test-slot'>
+ <template>
+ <span id="slotContainer">[<slot id="slot"></slot>]</span>
+ </template>
+ <script type="module">
+import { PolymerElement } from '../../polymer-element.js';
+import '../../lib/utils/flattened-nodes-observer.js';
+class TestSlot extends PolymerElement {
+ static get is() { return 'test-slot'; }
+}
+customElements.define(TestSlot.is, TestSlot);
+</script>
+ </dom-module>
+
+ <dom-module id='test-slot1'>
+ <template>
+ <test-slot id="slot"><slot></slot></test-slot>
+ </template>
+ <script type="module">
+import { PolymerElement } from '../../polymer-element.js';
+import '../../lib/utils/flattened-nodes-observer.js';
+class TestSlot1 extends PolymerElement {
+ static get is() { return 'test-slot1'; }
+}
+customElements.define(TestSlot1.is, TestSlot1);
+</script>
+ </dom-module>
+
+ <dom-module id='test-slot2'>
+ <template>
+ <test-slot1 id="slot"><slot></slot></test-slot1>
+ </template>
+ <script type="module">
+import { PolymerElement } from '../../polymer-element.js';
+import '../../lib/utils/flattened-nodes-observer.js';
+class TestSlot2 extends PolymerElement {
+ static get is() { return 'test-slot2'; }
+}
+customElements.define(TestSlot2.is, TestSlot2);
+</script>
+ </dom-module>
+
+ <dom-module id='test-slot3'>
+ <template>
+ <test-slot2 id="slot"><slot></slot></test-slot2>
+ </template>
+ <script type="module">
+import { PolymerElement } from '../../polymer-element.js';
+import '../../lib/utils/flattened-nodes-observer.js';
+class TestSlot3 extends PolymerElement {
+ static get is() { return 'test-slot3'; }
+}
+customElements.define(TestSlot3.is, TestSlot3);
+</script>
+ </dom-module>
+
+ <dom-module id='test-slot-raw'>
+ <template>
+ <div id="slot"><slot></slot></div>
+ </template>
+ <script type="module">
+import { PolymerElement } from '../../polymer-element.js';
+import '../../lib/utils/flattened-nodes-observer.js';
+class TestSlotRaw extends PolymerElement {
+ static get is() { return 'test-slot-raw'; }
+}
+customElements.define(TestSlotRaw.is, TestSlotRaw);
+</script>
+ </dom-module>
+
+ <dom-module id='test-slot-attr'>
+ <template>
+ [<slot id="slot" name="d"></slot>]
+ </template>
+ <script type="module">
+import { PolymerElement } from '../../polymer-element.js';
+import '../../lib/utils/flattened-nodes-observer.js';
+class El extends PolymerElement {
+ static get is() { return 'test-slot-attr'; }
+}
+customElements.define(El.is, El);
+</script>
+ </dom-module>
+
+ <dom-module id='test-slot-attr1'>
+ <template>
+ <test-slot-attr id="slot"><slot name="c" slot="d"></slot></test-slot-attr>
+ </template>
+ <script type="module">
+import { PolymerElement } from '../../polymer-element.js';
+import '../../lib/utils/flattened-nodes-observer.js';
+class El extends PolymerElement {
+ static get is() { return 'test-slot-attr1'; }
+}
+customElements.define(El.is, El);
+</script>
+ </dom-module>
+
+ <dom-module id='test-slot-attr2'>
+ <template>
+ <test-slot-attr1 id="slot"><slot name="b" slot="c"></slot></test-slot-attr1>
+ </template>
+ <script type="module">
+import { PolymerElement } from '../../polymer-element.js';
+import '../../lib/utils/flattened-nodes-observer.js';
+class El extends PolymerElement {
+ static get is() { return 'test-slot-attr2'; }
+}
+customElements.define(El.is, El);
+</script>
+ </dom-module>
+
+ <dom-module id='test-slot-attr3'>
+ <template>
+ <test-slot-attr2 id="slot"><slot name="a" slot="b"></slot></test-slot-attr2>
+ </template>
+ <script type="module">
+import { PolymerElement } from '../../polymer-element.js';
+import '../../lib/utils/flattened-nodes-observer.js';
+class El extends PolymerElement {
+ static get is() { return 'test-slot-attr3'; }
+}
+customElements.define(El.is, El);
+</script>
+ </dom-module>
+
+ <dom-module id='test-slot-attr-inside'>
+ <template>
+ <test-slot-attr3 id="slot"><slot name="a" slot="a"></slot></test-slot-attr3>
+ </template>
+ <script type="module">
+import { PolymerElement } from '../../polymer-element.js';
+import '../../lib/utils/flattened-nodes-observer.js';
+class El extends PolymerElement {
+ static get is() { return 'test-slot-attr-inside'; }
+}
+customElements.define(El.is, El);
+</script>
+ </dom-module>
+
+
+ <test-slot><div>A</div><div>B</div></test-slot>
+
+ <test-static><div>static A</div><div>static B</div></test-static>
+
+ <div id="staticDiv"></div>
+
+<script type="module">
+import '../../polymer-element.js';
+import { FlattenedNodesObserver } from '../../lib/utils/flattened-nodes-observer.js';
+
+suite('observeNodes', function() {
+
+ test('observe initial state of distributing element', function() {
+ var recordedA;
+ var el = document.querySelector('test-slot');
+ var observer1 = new FlattenedNodesObserver(el, function(info) {
+ recordedA = info;
+ });
+ observer1.flush();
+ assert.equal(recordedA.addedNodes.length, 2);
+ recordedA = null;
+ var recordedB;
+ var observer2 = new FlattenedNodesObserver(el, function(info) {
+ recordedB = info;
+ });
+ observer2.flush();
+ assert.equal(recordedA, null);
+ assert.equal(recordedB.addedNodes.length, 2);
+ observer1.disconnect();
+ observer2.disconnect();
+ });
+
+ test('observe initial state of non-distributing element', function() {
+ var recordedA;
+ var el = document.querySelector('test-static');
+ var observer1 = new FlattenedNodesObserver(el, function(info) {
+ recordedA = info;
+ });
+ observer1.flush();
+ assert.equal(recordedA.addedNodes.length, 2);
+ recordedA = null;
+ var recordedB;
+ var observer2 = new FlattenedNodesObserver(el, function(info) {
+ recordedB = info;
+ });
+ observer2.flush();
+ assert.equal(recordedA, null);
+ assert.equal(recordedB.addedNodes.length, 2);
+ observer1.disconnect();
+ observer2.disconnect();
+ });
+
+ test('observeNodes called in observed node context', function(done) {
+ var el = document.createElement('test-slot');
+ document.body.appendChild(el);
+ var observer = new FlattenedNodesObserver(el, function() {
+ assert.equal(this, el);
+ done();
+ });
+ // add
+ var d = document.createElement('div');
+ el.appendChild(d);
+ observer.flush();
+ });
+
+ test('observe children changes to distributing element', function() {
+ var el = document.createElement('test-slot');
+ document.body.appendChild(el);
+
+ var recorded;
+ var observer = new FlattenedNodesObserver(el, function(info) {
+ recorded = info;
+ });
+ // add
+ var d = document.createElement('div');
+ var d1 = document.createElement('div');
+ el.appendChild(d);
+ el.appendChild(d1);
+ observer.flush();
+ assert.equal(recorded.addedNodes.length, 2);
+ assert.equal(recorded.removedNodes.length, 0);
+ assert.equal(recorded.addedNodes[0], d);
+ assert.equal(recorded.addedNodes[1], d1);
+ // remove
+ el.removeChild(d);
+ el.removeChild(d1);
+ observer.flush();
+ assert.equal(recorded.addedNodes.length, 0);
+ assert.equal(recorded.removedNodes.length, 2);
+ assert.equal(recorded.removedNodes[0], d);
+ assert.equal(recorded.removedNodes[1], d1);
+ // add
+ el.appendChild(d);
+ el.appendChild(d1);
+ observer.flush();
+ assert.equal(recorded.addedNodes.length, 2);
+ assert.equal(recorded.addedNodes[0], d);
+ assert.equal(recorded.addedNodes[1], d1);
+ // reset, unobserve and remove
+ recorded = null;
+ observer.disconnect();
+ el.removeChild(d);
+ el.removeChild(d1);
+ observer.flush();
+ assert.equal(recorded, null);
+ document.body.removeChild(el);
+ });
+
+ test('observe children changes to distributing element that provoke additional changes', function() {
+ var el = document.createElement('test-slot');
+ document.body.appendChild(el);
+
+ var recordedInfo, elAddedInObserver;
+ var observerCallCount = 0;
+ var observer = new FlattenedNodesObserver(el, function(info) {
+ observerCallCount++;
+ recordedInfo = info;
+ if (info.target.childNodes.length < 5) {
+ elAddedInObserver = document.createElement('div');
+ info.target.appendChild(elAddedInObserver);
+ }
+
+ });
+ // add
+ var d = document.createElement('div');
+ el.appendChild(d);
+ while (observer.flush()) {
+ // re-flush until done
+ }
+ assert.equal(observerCallCount, 5);
+ assert.equal(recordedInfo.addedNodes.length, 1);
+ assert.equal(recordedInfo.addedNodes[0], elAddedInObserver);
+ assert.equal(el.childNodes.length, 5);
+ document.body.removeChild(el);
+ observer.disconnect();
+ });
+
+ test('observe children changes to distributing element (async)', function(done) {
+ var el = document.createElement('test-slot');
+ document.body.appendChild(el);
+
+ var nodes = [];
+ var handle = new FlattenedNodesObserver(el, function(info) {
+ for (var i=0, at; i < info.removedNodes.length; i++) {
+ at = nodes.indexOf(info.removedNodes[i]);
+ assert.isAbove(at, -1);
+ nodes.splice(at, 1);
+ }
+ nodes = nodes.concat(info.addedNodes);
+ });
+ // add
+ var d = document.createElement('div');
+ var d1 = document.createElement('div');
+ el.appendChild(d);
+ el.appendChild(d1);
+ let getFlattenedNodes = FlattenedNodesObserver.getFlattenedNodes;
+ setTimeout(function() {
+ assert.sameMembers(getFlattenedNodes(el), nodes);
+ // remove
+ el.removeChild(d);
+ el.removeChild(d1);
+ setTimeout(function() {
+ assert.sameMembers(getFlattenedNodes(el), nodes);
+ // add
+ el.appendChild(d);
+ el.appendChild(d1);
+ setTimeout(function() {
+ assert.sameMembers(getFlattenedNodes(el), nodes);
+ handle.disconnect();
+ el.removeChild(d);
+ el.removeChild(d1);
+ setTimeout(function() {
+ assert.notEqual(nodes.length, getFlattenedNodes(el).length);
+ document.body.removeChild(el);
+ done();
+ });
+ });
+ });
+ });
+ });
+
+ test('observe children changes to non-distributing element', function() {
+ var el = document.createElement('test-static');
+ document.body.appendChild(el);
+
+ var recorded;
+ var observer = new FlattenedNodesObserver(el, function(info) {
+ recorded = info;
+ });
+ // add
+ var d = document.createElement('div');
+ var d1 = document.createElement('div');
+ el.appendChild(d);
+ el.appendChild(d1);
+ observer.flush();
+ assert.equal(recorded.addedNodes.length, 2);
+ assert.equal(recorded.removedNodes.length, 0);
+ assert.equal(recorded.addedNodes[0], d);
+ assert.equal(recorded.addedNodes[1], d1);
+ // remove
+ el.removeChild(d);
+ el.removeChild(d1);
+ observer.flush();
+ assert.equal(recorded.addedNodes.length, 0);
+ assert.equal(recorded.removedNodes.length, 2);
+ assert.equal(recorded.removedNodes[0], d);
+ assert.equal(recorded.removedNodes[1], d1);
+ // add
+ el.appendChild(d);
+ el.appendChild(d1);
+ observer.flush();
+ assert.equal(recorded.addedNodes.length, 2);
+ assert.equal(recorded.addedNodes[0], d);
+ assert.equal(recorded.addedNodes[1], d1);
+ // reset, unobserve and remove
+ recorded = null;
+ observer.disconnect();
+ el.removeChild(d);
+ el.removeChild(d1);
+ observer.flush();
+ assert.equal(recorded, null);
+ document.body.removeChild(el);
+ });
+
+ test('observe changes to inner node wrapping <slot>', function() {
+ var el = document.createElement('test-slot');
+ document.body.appendChild(el);
+
+ var observedInfo;
+ var observer = new FlattenedNodesObserver(el.$.slotContainer, function(info) {
+ observedInfo = info;
+ });
+ observer.flush();
+ // add
+ var d = document.createElement('div');
+ var d1 = document.createElement('div');
+ el.appendChild(d);
+ el.appendChild(d1);
+ observer.flush();
+ assert.equal(observedInfo.target, el.$.slotContainer);
+ assert.equal(observedInfo.addedNodes.length, 2);
+ assert.equal(observedInfo.removedNodes.length, 0);
+ // remove
+ el.removeChild(d);
+ el.removeChild(d1);
+ observer.flush();
+ assert.equal(observedInfo.addedNodes.length, 0);
+ assert.equal(observedInfo.removedNodes.length, 2);
+ // add
+ el.appendChild(d);
+ el.appendChild(d1);
+ observer.flush();
+ assert.equal(observedInfo.addedNodes.length, 2);
+ assert.equal(observedInfo.removedNodes.length, 0);
+ // reset, unobserve and remove
+ observedInfo = null;
+ observer.disconnect();
+ el.removeChild(d);
+ el.removeChild(d1);
+ observer.flush();
+ assert.equal(observedInfo, null);
+ document.body.removeChild(el);
+ });
+
+ test('observe changes to <slot>', function() {
+ var el = document.createElement('test-slot');
+ document.body.appendChild(el);
+
+ var observedInfo;
+ var observer = new FlattenedNodesObserver(el.$.slot, function(info) {
+ observedInfo = info;
+ });
+ observer.flush();
+ // add
+ var d = document.createElement('div');
+ var d1 = document.createElement('div');
+ el.appendChild(d);
+ el.appendChild(d1);
+ observer.flush();
+ assert.equal(observedInfo.target, el.$.slot);
+ assert.equal(observedInfo.addedNodes.length, 2);
+ assert.equal(observedInfo.removedNodes.length, 0);
+ // remove
+ el.removeChild(d);
+ el.removeChild(d1);
+ observer.flush();
+ assert.equal(observedInfo.addedNodes.length, 0);
+ assert.equal(observedInfo.removedNodes.length, 2);
+ // add
+ el.appendChild(d);
+ el.appendChild(d1);
+ observer.flush();
+ assert.equal(observedInfo.addedNodes.length, 2);
+ assert.equal(observedInfo.removedNodes.length, 0);
+ // reset, unobserve and remove
+ observedInfo = null;
+ observer.disconnect();
+ el.removeChild(d);
+ el.removeChild(d1);
+ observer.flush();
+ assert.equal(observedInfo, null);
+ document.body.removeChild(el);
+ });
+
+ test('observe effective children inside distributing element', function() {
+ var el = document.createElement('test-slot1');
+ document.body.appendChild(el);
+
+ var recorded;
+ var observer = new FlattenedNodesObserver(el.$.slot, function(info) {
+ recorded = info;
+ });
+ observer.flush();
+ // add
+ var d = document.createElement('div');
+ var d1 = document.createElement('div');
+ el.appendChild(d);
+ el.appendChild(d1);
+ observer.flush();
+ assert.equal(recorded.addedNodes.length, 2);
+ assert.equal(recorded.removedNodes.length, 0);
+ assert.equal(recorded.addedNodes[0], d);
+ assert.equal(recorded.addedNodes[1], d1);
+ // remove
+ el.removeChild(d);
+ el.removeChild(d1);
+ observer.flush();
+ assert.equal(recorded.addedNodes.length, 0);
+ assert.equal(recorded.removedNodes.length, 2);
+ assert.equal(recorded.removedNodes[0], d);
+ assert.equal(recorded.removedNodes[1], d1);
+ // add
+ el.appendChild(d);
+ el.appendChild(d1);
+ observer.flush();
+ assert.equal(recorded.addedNodes.length, 2);
+ assert.equal(recorded.addedNodes[0], d);
+ assert.equal(recorded.addedNodes[1], d1);
+ // reset, unobserve and remove
+ recorded = null;
+ observer.disconnect();
+ el.removeChild(d);
+ el.removeChild(d1);
+ observer.flush();
+ assert.equal(recorded, null);
+ document.body.removeChild(el);
+ });
+
+ test('observe effective children changes when adding to another host', function() {
+ var el = document.createElement('test-slot1');
+ document.body.appendChild(el);
+
+ var recorded;
+ var observer = new FlattenedNodesObserver(el.$.slot, function(info) {
+ recorded = info;
+ });
+ observer.flush();
+ // add
+ var d = document.createElement('div');
+ var d1 = document.createElement('div');
+ el.appendChild(d);
+ el.appendChild(d1);
+ observer.flush();
+ assert.equal(recorded.addedNodes.length, 2);
+ assert.equal(recorded.removedNodes.length, 0);
+ assert.equal(recorded.addedNodes[0], d);
+ assert.equal(recorded.addedNodes[1], d1);
+ // add somewhere else... we should see these as removes
+ document.body.appendChild(d);
+ document.body.appendChild(d1);
+ observer.flush();
+ assert.equal(recorded.addedNodes.length, 0);
+ assert.equal(recorded.removedNodes.length, 2);
+ assert.equal(recorded.removedNodes[0], d);
+ assert.equal(recorded.removedNodes[1], d1);
+ // cleanup
+ document.body.removeChild(d);
+ document.body.removeChild(d1);
+ document.body.removeChild(el);
+ observer.disconnect();
+ });
+
+ test('observe effective children changes in static slot when adding to another host', function() {
+ var el = document.createElement('staticDiv');
+ document.body.appendChild(el);
+
+ var recorded;
+ var observer = new FlattenedNodesObserver(el, function(info) {
+ recorded = info;
+ });
+ observer.flush();
+ // add
+ var d = document.createElement('div');
+ var d1 = document.createElement('div');
+ el.appendChild(d);
+ el.appendChild(d1);
+ observer.flush();
+ assert.equal(recorded.addedNodes.length, 2);
+ assert.equal(recorded.removedNodes.length, 0);
+ assert.equal(recorded.addedNodes[0], d);
+ assert.equal(recorded.addedNodes[1], d1);
+ // add somewhere else... we should see these as removes
+ document.body.appendChild(d);
+ document.body.appendChild(d1);
+ observer.flush();
+ assert.equal(recorded.addedNodes.length, 0);
+ assert.equal(recorded.removedNodes.length, 2);
+ assert.equal(recorded.removedNodes[0], d);
+ assert.equal(recorded.removedNodes[1], d1);
+ // cleanup
+ document.body.removeChild(d);
+ document.body.removeChild(d1);
+ document.body.removeChild(el);
+ observer.disconnect();
+ });
+
+ test('observe effective children inside deep distributing element', function() {
+ var el = document.createElement('test-slot3');
+ document.body.appendChild(el);
+
+ var recorded;
+ var slot = el.$.slot.$.slot.$.slot;
+ var observer = new FlattenedNodesObserver(slot, function(info) {
+ recorded = info;
+ });
+ // add
+ var d = document.createElement('div');
+ var d1 = document.createElement('div');
+ el.appendChild(d);
+ el.appendChild(d1);
+ observer.flush();
+ assert.equal(recorded.addedNodes.length, 2);
+ assert.equal(recorded.removedNodes.length, 0);
+ assert.equal(recorded.addedNodes[0], d);
+ assert.equal(recorded.addedNodes[1], d1);
+ // remove
+ el.removeChild(d);
+ el.removeChild(d1);
+ observer.flush();
+ assert.equal(recorded.addedNodes.length, 0);
+ assert.equal(recorded.removedNodes.length, 2);
+ assert.equal(recorded.removedNodes[0], d);
+ assert.equal(recorded.removedNodes[1], d1);
+ // add
+ el.appendChild(d);
+ el.appendChild(d1);
+ observer.flush();
+ assert.equal(recorded.addedNodes.length, 2);
+ assert.equal(recorded.addedNodes[0], d);
+ assert.equal(recorded.addedNodes[1], d1);
+ // reset, unobserve and remove
+ recorded = null;
+ observer.disconnect();
+ el.removeChild(d);
+ el.removeChild(d1);
+ observer.flush();
+ assert.equal(recorded, null);
+ document.body.removeChild(el);
+ });
+
+ test('observe <slot> inside deep distributing element', function() {
+ var el = document.createElement('test-slot3');
+ document.body.appendChild(el);
+
+ var recorded;
+ var slot = el.$.slot.$.slot.$.slot.$.slot;
+ assert.equal(slot.localName, 'slot');
+ var observer = new FlattenedNodesObserver(slot, function(info) {
+ recorded = info;
+ });
+ // add
+ var d = document.createElement('div');
+ var d1 = document.createElement('div');
+ el.appendChild(d);
+ el.appendChild(d1);
+ observer.flush();
+ assert.equal(recorded.addedNodes.length, 2);
+ assert.equal(recorded.removedNodes.length, 0);
+ assert.equal(recorded.addedNodes[0], d);
+ assert.equal(recorded.addedNodes[1], d1);
+ // remove
+ el.removeChild(d);
+ el.removeChild(d1);
+ observer.flush();
+ assert.equal(recorded.addedNodes.length, 0);
+ assert.equal(recorded.removedNodes.length, 2);
+ assert.equal(recorded.removedNodes[0], d);
+ assert.equal(recorded.removedNodes[1], d1);
+ // add
+ el.appendChild(d);
+ el.appendChild(d1);
+ observer.flush();
+ assert.equal(recorded.addedNodes.length, 2);
+ assert.equal(recorded.addedNodes[0], d);
+ assert.equal(recorded.addedNodes[1], d1);
+ // reset, unobserve and remove
+ recorded = null;
+ observer.disconnect();
+ el.removeChild(d);
+ el.removeChild(d1);
+ observer.flush();
+ assert.equal(recorded, null);
+ document.body.removeChild(el);
+ });
+
+ test('observe effective children inside deep distributing element (async)', function(done) {
+ var el = document.createElement('test-slot3');
+ document.body.appendChild(el);
+
+ var recorded;
+ var slot = el.$.slot.$.slot.$.slot;
+ var observer = new FlattenedNodesObserver(slot, function(info) {
+ recorded = info;
+ });
+ // add
+ var d = document.createElement('div');
+ var d1 = document.createElement('div');
+ el.appendChild(d);
+ el.appendChild(d1);
+ setTimeout(function() {
+ assert.equal(recorded.addedNodes.length, 2);
+ assert.equal(recorded.removedNodes.length, 0);
+ assert.equal(recorded.addedNodes[0], d);
+ assert.equal(recorded.addedNodes[1], d1);
+ // remove
+ el.removeChild(d);
+ el.removeChild(d1);
+ setTimeout(function() {
+ assert.equal(recorded.addedNodes.length, 0);
+ assert.equal(recorded.removedNodes.length, 2);
+ assert.equal(recorded.removedNodes[0], d);
+ assert.equal(recorded.removedNodes[1], d1);
+ // add
+ el.appendChild(d);
+ el.appendChild(d1);
+ setTimeout(function() {
+ assert.equal(recorded.addedNodes.length, 2);
+ assert.equal(recorded.addedNodes[0], d);
+ assert.equal(recorded.addedNodes[1], d1);
+ // reset, unobserve and remove
+ recorded = null;
+ observer.disconnect();
+ el.removeChild(d);
+ el.removeChild(d1);
+ setTimeout(function() {
+ assert.equal(recorded, null);
+ document.body.removeChild(el);
+ done();
+ });
+ });
+ });
+ });
+ });
+
+
+ test('observe effective children attr changes inside deep distributing element (async)', function(done) {
+ var el = document.createElement('test-slot-attr3');
+ document.body.appendChild(el);
+
+ var recorded;
+ var slot = el.$.slot.$.slot.$.slot;
+ var observer = new FlattenedNodesObserver(slot, function(info) {
+ recorded = info;
+ });
+ observer.flush();
+ recorded = null;
+ // add
+ var d = document.createElement('div');
+ var d1 = document.createElement('div');
+ el.appendChild(d);
+ el.appendChild(d1);
+ observer.flush();
+ assert.equal(recorded, null);
+ setTimeout(function() {
+ assert.equal(recorded, null);
+ d.setAttribute('slot', 'a');
+ setTimeout(function() {
+ assert.equal(recorded.addedNodes.length, 1);
+ assert.equal(recorded.removedNodes.length, 0);
+ assert.equal(recorded.addedNodes[0], d);
+ d.removeAttribute('slot');
+ setTimeout(function() {
+ assert.equal(recorded.addedNodes.length, 0);
+ assert.equal(recorded.removedNodes.length, 1);
+ assert.equal(recorded.removedNodes[0], d);
+ recorded = null;
+ observer.disconnect();
+ d.setAttribute('slot', 'a');
+ setTimeout(function() {
+ assert.equal(recorded, null);
+ document.body.removeChild(el);
+ done();
+ });
+ });
+ });
+ });
+ });
+
+ test('observe effective children attr changes inside deep distributing element without outer select (async)', function(done) {
+ var el = document.createElement('test-slot-attr-inside');
+ document.body.appendChild(el);
+
+ var recorded;
+ var slot = el.$.slot.$.slot.$.slot.$.slot;
+ var observer = new FlattenedNodesObserver(slot, function(info) {
+ recorded = info;
+ });
+ observer.flush();
+ recorded = null;
+ // add
+ var d = document.createElement('div');
+ var d1 = document.createElement('div');
+ el.appendChild(d);
+ el.appendChild(d1);
+ observer.flush();
+ assert.equal(recorded, null);
+ setTimeout(function() {
+ assert.equal(recorded, null);
+ d.setAttribute('slot', 'a');
+ setTimeout(function() {
+ assert.equal(recorded.addedNodes.length, 1);
+ assert.equal(recorded.removedNodes.length, 0);
+ assert.equal(recorded.addedNodes[0], d);
+ d.removeAttribute('slot');
+ setTimeout(function() {
+ assert.equal(recorded.addedNodes.length, 0);
+ assert.equal(recorded.removedNodes.length, 1);
+ assert.equal(recorded.removedNodes[0], d);
+ recorded = null;
+ observer.disconnect();
+ d.setAttribute('slot', 'a');
+ setTimeout(function() {
+ assert.equal(recorded, null);
+ document.body.removeChild(el);
+ done();
+ });
+ });
+ });
+ });
+ });
+
+ test('add/remove multiple observers', function() {
+ var el = document.createElement('test-slot1');
+ document.body.appendChild(el);
+
+ var r1 = 0;
+ var h1 = new FlattenedNodesObserver(el.$.slot, function() {
+ r1++;
+ });
+ var r2 = 0;
+ var h2 = new FlattenedNodesObserver(el.$.slot, function() {
+ r2++;
+ });
+ var r3 = 0;
+ var h3 = new FlattenedNodesObserver(el.$.slot, function() {
+ r3++;
+ });
+ // add
+ var d = document.createElement('div');
+ el.appendChild(d);
+ h1.flush();
+ h2.flush();
+ h3.flush();
+ assert.equal(r1, 1);
+ assert.equal(r2, 1);
+ assert.equal(r3, 1);
+ h1.disconnect();
+ d = document.createElement('div');
+ el.appendChild(d);
+ h1.flush();
+ h2.flush();
+ h3.flush();
+ assert.equal(r1, 1);
+ assert.equal(r2, 2);
+ assert.equal(r3, 2);
+ h2.disconnect();
+ d = document.createElement('div');
+ el.appendChild(d);
+ h1.flush();
+ h2.flush();
+ h3.flush();
+ assert.equal(r1, 1);
+ assert.equal(r2, 2);
+ assert.equal(r3, 3);
+ h3.disconnect();
+ d = document.createElement('div');
+ el.appendChild(d);
+ h1.flush();
+ h2.flush();
+ h3.flush();
+ assert.equal(r1, 1);
+ assert.equal(r2, 2);
+ assert.equal(r3, 3);
+ h1 = new FlattenedNodesObserver(el.$.slot, h1.callback);
+ h2 = new FlattenedNodesObserver(el.$.slot, h2.callback);
+ h3 = new FlattenedNodesObserver(el.$.slot, h3.callback);
+ h1.flush();
+ h2.flush();
+ h3.flush();
+ assert.equal(r1, 2);
+ assert.equal(r2, 3);
+ assert.equal(r3, 4);
+ d = document.createElement('div');
+ el.appendChild(d);
+ h1.flush();
+ h2.flush();
+ h3.flush();
+ assert.equal(r1, 3);
+ assert.equal(r2, 4);
+ assert.equal(r3, 5);
+ h3.disconnect();
+ d = document.createElement('div');
+ el.appendChild(d);
+ h1.flush();
+ h2.flush();
+ h3.flush();
+ assert.equal(r1, 4);
+ assert.equal(r2, 5);
+ assert.equal(r3, 5);
+ h2.disconnect();
+ d = document.createElement('div');
+ el.appendChild(d);
+ h1.flush();
+ h2.flush();
+ h3.flush();
+ assert.equal(r1, 5);
+ assert.equal(r2, 5);
+ assert.equal(r3, 5);
+ h1.disconnect();
+ d = document.createElement('div');
+ el.appendChild(d);
+ h1.flush();
+ h2.flush();
+ h3.flush();
+ assert.equal(r1, 5);
+ assert.equal(r2, 5);
+ assert.equal(r3, 5);
+ });
+
+ test('observe changes of target with dynamically added <slot>', function() {
+ var el = document.createElement('test-static');
+ document.body.appendChild(el);
+ var container = el.shadowRoot.childNodes[1];
+ var recorded = null;
+ var observer = new FlattenedNodesObserver(container, function(info) {
+ recorded = info;
+ });
+ var slot = document.createElement('slot');
+ container.appendChild(slot);
+ observer.flush();
+ recorded = null;
+ var child = document.createElement('div');
+ el.appendChild(child);
+ observer.flush();
+ assert.equal(recorded.addedNodes.length, 1);
+ assert.equal(recorded.addedNodes[0], child);
+ recorded = null;
+ el.removeChild(child);
+ observer.flush();
+ assert.equal(recorded.removedNodes.length, 1);
+ assert.equal(recorded.removedNodes[0], child);
+ recorded = null;
+ container.removeChild(slot);
+ observer.flush();
+ el.appendChild(child);
+ assert.equal(recorded, null);
+ observer.disconnect();
+ document.body.removeChild(el);
+ });
+
+ test('observe changes of target with dynamically added <slot> (flush/async)', function(done) {
+ var el = document.createElement('test-static');
+ document.body.appendChild(el);
+ var container = el.shadowRoot.childNodes[1];
+ var recorded = null;
+ var observer = new FlattenedNodesObserver(container, function(info) {
+ recorded = info;
+ });
+ var slot = document.createElement('slot');
+ container.appendChild(slot);
+ observer.flush();
+ recorded = null;
+ var child = document.createElement('div');
+ el.appendChild(child);
+ setTimeout(function() {
+ assert.equal(recorded.addedNodes.length, 1);
+ assert.equal(recorded.addedNodes[0], child);
+ done();
+ });
+ });
+
+ test('observe changes of target with dynamically added <slot> (async)', function(done) {
+ var el = document.createElement('test-static');
+ document.body.appendChild(el);
+ var container = el.shadowRoot.childNodes[1];
+ var recorded = null;
+ var observer = new FlattenedNodesObserver(container, function(info) {
+ recorded = info;
+ });
+ var slot = document.createElement('slot');
+ container.appendChild(slot);
+ observer.flush();
+ recorded = null;
+ var child = document.createElement('div');
+ el.appendChild(child);
+ setTimeout(function() {
+ assert.equal(recorded.addedNodes.length, 1);
+ assert.equal(recorded.addedNodes[0], child);
+ recorded = null;
+ el.removeChild(child);
+ setTimeout(function() {
+ assert.equal(recorded.removedNodes.length, 1);
+ assert.equal(recorded.removedNodes[0], child);
+ recorded = null;
+ container.removeChild(slot);
+ setTimeout(function() {
+ el.appendChild(child);
+ assert.equal(recorded, null);
+ observer.disconnect();
+ document.body.removeChild(el);
+ done();
+ });
+ });
+ });
+ });
+
+ test('element distributed to insertion point observing itself', function() {
+ var host = document.createElement('test-slot');
+ var el = document.createElement('test-self-observe');
+ host.appendChild(el);
+ document.body.appendChild(host);
+ if (window.ShadyDOM) {
+ ShadyDOM.flush();
+ }
+ assert.ok(el._observer);
+ var div = document.createElement('div');
+ el.appendChild(div);
+ el._observer.flush();
+ assert.equal(el.info.addedNodes[0], div);
+ document.body.removeChild(host);
+ });
+
+ test('should not fail on node without children', function() {
+ var recorded;
+ var el = document;
+ var observer = new FlattenedNodesObserver(el, function(info) {
+ recorded = info;
+ });
+ assert.equal(recorded, null);
+ observer.disconnect();
+ });
+
+});
+</script>
+
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/gestures-elements.js b/third_party/polymer3/bower_components/polymer/test/unit/gestures-elements.js
new file mode 100644
index 0000000..9030278
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/gestures-elements.js
@@ -0,0 +1,218 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+
+import { Polymer } from '../../lib/legacy/polymer-fn.js';
+import { html } from '../../lib/utils/html-tag.js';
+import { PolymerElement } from '../../polymer-element.js';
+import { GestureEventListeners } from '../../lib/mixins/gesture-event-listeners.js';
+Polymer({
+ _template: html`
+ <style>
+ #div {
+ height: 40px;
+ background: red;
+ }
+ </style>
+
+ <div id="div"></div>
+`,
+
+ is: 'x-foo',
+
+ listeners: {
+ tap: 'tapHandler'
+ },
+
+ tapHandler: function(e) {
+ this._testLocalTarget = e.target;
+ this._testRootTarget = e.composedPath()[0];
+ }
+});
+Polymer({
+ _template: html`
+ <x-foo id="foo"></x-foo>
+`,
+
+ is: 'x-app',
+
+ listeners: {
+ tap: 'tapHandler'
+ },
+
+ tapHandler: function(e) {
+ this._testLocalTarget = e.target;
+ this._testRootTarget = e.composedPath()[0];
+ }
+});
+Polymer({
+ _template: html`
+ <div id="inner" on-tap="handler" on-track="handler" on-down="handler" on-up="handler"></div>
+`,
+
+ is: 'x-setup',
+
+ listeners: {
+ tap: 'handler',
+ track: 'handler',
+ down: 'handler',
+ up: 'handler'
+ },
+
+ handler: function() {
+ }
+});
+Polymer({
+ is: 'x-dynamic',
+ handler: function(){},
+ setup: function() {
+ this.listen(this, 'tap', 'handler');
+ },
+ teardown: function() {
+ this.unlisten(this, 'tap', 'handler');
+ }
+});
+var EventCaptureBehavior = {
+ properties: {
+ stream: {
+ type: Array,
+ value: function() {
+ return [];
+ }
+ }
+ },
+ handle: function(e) {
+ this.stream.push(e);
+ }
+};
+Polymer({
+ listeners: {
+ 'down': 'prevent',
+ 'up': 'handle',
+ 'tap': 'handle',
+ 'track': 'handle'
+ },
+ behaviors: [EventCaptureBehavior],
+ is: 'x-prevent',
+ prevent: function(e, detail) {
+ detail.prevent('tap');
+ detail.prevent('track');
+ e.preventDefault();
+ this.handle(e);
+ }
+});
+Polymer({
+ is: 'x-buttons',
+ listeners: {
+ 'down': 'handle',
+ 'up': 'handle',
+ 'tap': 'handle',
+ 'track': 'handle'
+ },
+ behaviors: [EventCaptureBehavior]
+});
+Polymer({
+ is: 'x-document-listener',
+ setup: function() {
+ this.listen(document, 'down', 'handle');
+ },
+ teardown: function() {
+ this.unlisten(document, 'down', 'handle');
+ },
+ behaviors: [EventCaptureBehavior]
+});
+Polymer({
+ is: 'x-nested-child-prevent',
+ listeners: {
+ tap: 'handle'
+ },
+ behaviors: [EventCaptureBehavior]
+});
+Polymer({
+ _template: html`
+ <style>
+ :host {
+ position: absolute;
+ display: block;
+ background: orange;
+ height: 100px;
+ width: 100px;
+ }
+ #child {
+ position: relative;
+ display: block;
+ background: blue;
+ height: 50px;
+ width: 50px;
+ margin-top: 25px;
+ margin-left: 25px;
+ }
+ </style>
+ <x-nested-child-prevent id="child"></x-nested-child-prevent>
+`,
+
+ is: 'x-nested-prevent',
+
+ listeners: {
+ track: 'handle'
+ },
+
+ behaviors: [EventCaptureBehavior]
+});
+Polymer({
+ is: 'x-imperative',
+ behaviors: [EventCaptureBehavior]
+});
+class XNativeLabel extends PolymerElement {
+ static get template() {
+ return html`
+ <label id="label" for="check"></label>
+ <input id="check" type="checkbox">
+`;
+ }
+
+ static get is() {
+ return 'x-native-label';
+ }
+}
+customElements.define(XNativeLabel.is, XNativeLabel);
+class XNativeLabelNested extends PolymerElement {
+ static get template() {
+ return html`
+ <label id="label">
+ <input id="check" type="checkbox">
+ </label>
+`;
+ }
+
+ static get is() {
+ return 'x-native-label-nested';
+ }
+}
+customElements.define(XNativeLabelNested.is, XNativeLabelNested);
+class XDisabled extends GestureEventListeners(PolymerElement) {
+ static get template() {
+ return html`
+ <button id="disabled" on-tap="tap" disabled=""></button>
+ <div disabled="">
+ <button id="nested" on-tap="tap"></button>
+ </div>
+`;
+ }
+
+ constructor() {
+ super();
+ this.taps = [];
+ }
+ static get is() {return 'x-disabled-tap';}
+ tap(e) {
+ this.taps.push(e.id);
+ }
+}
+customElements.define(XDisabled.is, XDisabled);
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/gestures.html b/third_party/polymer3/bower_components/polymer/test/unit/gestures.html
new file mode 100644
index 0000000..84f3550
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/gestures.html
@@ -0,0 +1,665 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+ <script type="module" src="./gestures-elements.js"></script>
+
+</head>
+<body>
+
+ <script type="module">
+import './gestures-elements.js';
+import { afterNextRender } from '../../lib/utils/render-status.js';
+import * as gestures from '../../lib/utils/gestures.js';
+import { resetMouseCanceller, deepTargetFind, recognizers as recognizers$0, addListener, removeListener } from '../../lib/utils/gestures.js';
+
+suite('simulate events', function() {
+
+ var app;
+
+ setup(function(done) {
+ app = document.createElement('x-app');
+ document.body.appendChild(app);
+ afterNextRender(null, done);
+ });
+
+ teardown(function() {
+ document.body.removeChild(app);
+ resetMouseCanceller();
+ });
+
+ test('tap on x-foo and check localTarget and rootTarget', function() {
+ var foo = app.$.foo;
+ foo.dispatchEvent(new CustomEvent('click', {bubbles: true, composed: true}));
+ assert.equal(app._testLocalTarget, app, 'local target');
+ assert.equal(app._testRootTarget, foo, 'root target');
+ let touches = [{
+ clientX: 0,
+ clientY: 0,
+ identifier: 1,
+ // target is set to the element with `addEventListener`, which is app
+ target: app
+ }];
+ let touchstart = new CustomEvent('touchstart', {bubbles: true, composed: true});
+ touchstart.changedTouches = touchstart.touches = touches;
+ foo.dispatchEvent(touchstart);
+ let touchend = new CustomEvent('touchend', {bubbles: true, composed: true});
+ touchend.touches = touchend.changedTouches = touches;
+ foo.dispatchEvent(touchend);
+ assert.equal(app._testLocalTarget, app, 'local target touch');
+ assert.equal(app._testRootTarget, foo, 'root target touch');
+ });
+
+ test('tap on x-foo.div and check target info', function() {
+ var foo = app.$.foo;
+ var div = foo.$.div;
+ div.dispatchEvent(new CustomEvent('click', {bubbles: true, composed: true}));
+ assert.equal(app._testLocalTarget, app, 'app local target');
+ assert.equal(app._testRootTarget, div, 'app root target');
+ assert.equal(foo._testLocalTarget, foo, 'foo local target');
+ assert.equal(foo._testRootTarget, div, 'foo root target');
+ let touches = [{
+ clientX: 0,
+ clientY: 0,
+ identifier: 1,
+ // target is set to the element with `addEventListener`, which is app
+ target: app
+ }];
+ let touchstart = new CustomEvent('touchstart', {bubbles: true, composed: true});
+ touchstart.touches = touchstart.changedTouches = touches;
+ let touchend = new CustomEvent('touchend', {composed: true, bubbles: true});
+ touchend.touches = touchend.changedTouches = touches;
+ div.dispatchEvent(touchstart);
+ div.dispatchEvent(touchend);
+ assert.equal(app._testLocalTarget, app, 'app local target touch');
+ assert.equal(app._testRootTarget, div, 'app root target touch');
+ assert.equal(foo._testLocalTarget, foo, 'foo local target touch');
+ assert.equal(foo._testRootTarget, div, 'foo root target touch');
+ });
+
+ test('HTMLElement.click triggers tap', function() {
+ // put the element off screen to prevent x/y weirdness from .click()
+ app.style.cssText = 'position: absolute; left: -1000px; top: -1000px;';
+ // make a mousedown *very* far away to tickle the distance check
+ var ev = new CustomEvent('mousedown', {composed: true});
+ ev.clientX = 1e8;
+ ev.clientY = 1e8;
+ app.dispatchEvent(ev);
+ app.click();
+ assert.equal(app._testLocalTarget, app, 'app local target');
+ assert.equal(app._testRootTarget, app, 'app root target');
+ });
+});
+
+suite('Event Setup and Teardown', function() {
+ var outer, inner;
+ suiteSetup(function(done) {
+ outer = document.createElement('x-setup');
+ document.body.appendChild(outer);
+ afterNextRender(null, function() {
+ inner = outer.$.inner;
+ done();
+ });
+ });
+
+ suite('setup', function() {
+ test('listeners block', function() {
+ assert.equal(outer.__polymerGesturesTouchAction, 'none');
+ var obj = outer.__polymerGestures;
+ assert.equal(obj.mousedown.downup, 2, 'mousedown downup');
+ assert.equal(obj.mousedown.track, 1, 'mousedown track');
+ assert.equal(obj.mousedown.tap, 1, 'mousedown tap');
+ assert.equal(obj.mousedown._count, 4, 'total mousedown');
+ assert.equal(obj.touchstart.downup, 2, 'touchstart downup');
+ assert.equal(obj.touchstart.tap, 1, 'touchstart tap');
+ assert.equal(obj.touchstart.track, 1, 'touchstart track');
+ assert.equal(obj.touchstart._count, 4, 'total touchstart');
+ assert.equal(obj.touchmove.track, 1, 'touchmove track');
+ assert.equal(obj.touchmove._count, 1, 'total touchmove');
+ assert.equal(obj.touchend.downup, 2, 'touchend downup');
+ assert.equal(obj.touchend.track, 1, 'touchend track');
+ assert.equal(obj.touchend.tap, 1, 'touchend tap');
+ assert.equal(obj.touchend._count, 4, 'total touchend');
+ });
+
+ test('on-*', function() {
+ assert.equal(inner.__polymerGesturesTouchAction, 'none');
+ var obj = inner.__polymerGestures;
+ assert.equal(obj.mousedown.downup, 2, 'mousedown downup');
+ assert.equal(obj.mousedown.track, 1, 'mousedown track');
+ assert.equal(obj.mousedown.tap, 1, 'mousedown tap');
+ assert.equal(obj.mousedown._count, 4, 'total mousedown');
+ assert.equal(obj.touchstart.downup, 2, 'touchstart downup');
+ assert.equal(obj.touchstart.tap, 1, 'touchstart tap');
+ assert.equal(obj.touchstart.track, 1, 'touchstart track');
+ assert.equal(obj.touchstart._count, 4, 'total touchstart');
+ assert.equal(obj.touchmove.track, 1, 'touchmove track');
+ assert.equal(obj.touchmove._count, 1, 'total touchmove');
+ assert.equal(obj.touchend.downup, 2, 'touchend downup');
+ assert.equal(obj.touchend.track, 1, 'touchend track');
+ assert.equal(obj.touchend.tap, 1, 'touchend tap');
+ assert.equal(obj.touchend._count, 4, 'total touchend');
+ });
+
+ test('dynamic', function(done) {
+ var el = document.createElement('x-dynamic');
+ afterNextRender(null, function() {
+ var obj = el.__polymerGestures;
+ assert(!obj);
+ el.setup();
+ obj = el.__polymerGestures;
+ assert(obj, 'gestures object exists');
+ assert.equal(obj.mousedown.tap, 1, 'mousedown tap');
+ assert.equal(obj.click.tap, 1, 'click tap');
+ assert.equal(obj.touchstart.tap, 1, 'touchstart tap');
+ assert.equal(obj.touchend.tap, 1, 'touchend tap');
+ done();
+ });
+ });
+ });
+
+ suite('teardown', function() {
+ test('dynamic', function(){
+ var el = document.createElement('x-dynamic');
+ var obj = el.__polymerGestures;
+ assert(!obj);
+ el.setup();
+ el.teardown();
+ obj = el.__polymerGestures;
+ assert(obj, 'gestures object exists');
+ assert.equal(obj.mousedown.tap, 0, 'mousedown tap');
+ assert.equal(obj.click.tap, 0, 'click tap');
+ assert.equal(obj.touchstart.tap, 0, 'touchstart tap');
+ assert.equal(obj.touchend.tap, 0, 'touchend tap');
+ });
+ });
+});
+
+suite('target finding', function() {
+ var div, divLocation;
+
+ setup(function() {
+ div = document.createElement('div');
+ div.style.cssText = 'height: 50px; width: 50px; background: red;';
+ div.id = 'target';
+ document.body.appendChild(div);
+ divLocation = div.getBoundingClientRect();
+ });
+
+ test('target finding returns null outside the window', function() {
+ var actual = deepTargetFind(-1, -1);
+ assert.equal(actual, null);
+ });
+
+ test('find the div in document', function() {
+ var x = divLocation.left, y = divLocation.top;
+ var actual = deepTargetFind(x, y);
+ assert.equal(actual, div);
+ });
+
+ test('find the div with a shadowroot', function() {
+ div.attachShadow({mode: 'open'});
+ var x = divLocation.left, y = divLocation.top;
+ var actual = deepTargetFind(x, y);
+ assert.equal(actual, div);
+ });
+
+ test('find the div inside a shadowroot', function() {
+ var divOwner = document.createElement('span');
+ document.body.appendChild(divOwner);
+ divOwner.attachShadow({mode: 'open'}).appendChild(div);
+ var bcr = divOwner.getBoundingClientRect();
+ var x = bcr.left+10, y = bcr.top+10;
+ var actual = deepTargetFind(x, y);
+ assert.equal(actual, div);
+ });
+
+ test('find the div with a shadowroot inside a shadowroot', function() {
+ div.attachShadow({mode: 'open'});
+ var divOwner = document.createElement('span');
+ document.body.appendChild(divOwner);
+ divOwner.attachShadow({mode: 'open'}).appendChild(div);
+ var bcr = divOwner.getBoundingClientRect();
+ var x = bcr.left, y = bcr.top;
+ var actual = deepTargetFind(x, y);
+ assert.equal(actual, div);
+ });
+});
+
+suite('Prevention', function() {
+ var el;
+ setup(function(done) {
+ el = document.createElement('x-prevent');
+ document.body.appendChild(el);
+ afterNextRender(null, done);
+ });
+ teardown(function() {
+ el.parentNode.removeChild(el);
+ resetMouseCanceller();
+ });
+
+ test('tap', function() {
+ var ev = new CustomEvent('mousedown', {
+ bubbles: true,
+ cancelable: true,
+ composed: true
+ });
+ el.dispatchEvent(ev);
+ assert.equal(el.stream.length, 1, 'one event dispatched');
+ assert.equal(el.stream[0].type, 'down', 'was down event');
+ assert.equal(el.stream[0].defaultPrevented, true, 'was prevented');
+ assert.equal(ev.defaultPrevented, true, 'base event was prevented');
+ });
+
+ test('track', function() {
+ var ev = new CustomEvent('mousedown', {
+ bubbles: true,
+ cancelable: true,
+ composed: true
+ });
+ ev.clientX = ev.clientY = 0;
+ el.dispatchEvent(ev);
+ assert.equal(el.stream.length, 1);
+ for (var i = 0; i < 10; i++) {
+ ev = new CustomEvent(
+ i === 9 ? 'mouseup' : 'mousemove',
+ {bubbles: true, cancelable: true, composed: true}
+ );
+ ev.clientX = ev.clientY = 10 * i;
+ el.dispatchEvent(ev);
+ }
+ assert.equal(el.stream.length, 2, 'expected only down and up');
+ assert.equal(el.stream[0].type, 'down', 'down was found');
+ assert.equal(el.stream[0].defaultPrevented, true, 'down was prevented');
+ assert.equal(el.stream[1].type, 'up', 'up was found');
+ });
+
+ test('nested track and tap with touch', function(done) {
+ el.parentNode.removeChild(el);
+ el = document.createElement('x-nested-prevent');
+ document.body.appendChild(el);
+ afterNextRender(null, function() {
+ var child = el.$.child;
+ var options = {bubbles: true, cancelable: true, composed: true};
+
+ var bgr = el.getBoundingClientRect();
+ var clientX = bgr.left + (bgr.width / 2);
+ var clientY = bgr.top + (bgr.bottom / 2);
+ var ev = new CustomEvent('touchstart', options);
+ ev.touches = ev.changedTouches = [
+ {
+ clientX: clientX,
+ clientY: clientY,
+ identifier: 1,
+ // target is set to the element with `addEventListener`, which is el
+ target: el
+ }
+ ];
+ ev.clientX = clientX;
+ ev.clientY = clientY;
+ child.dispatchEvent(ev);
+
+ for (var i = 0; i < 10; i++) {
+ clientX += 1;
+ ev = new CustomEvent(i === 9 ? 'touchend' : 'touchmove', options);
+ ev.touches = ev.changedTouches = [
+ {
+ clientX: clientX,
+ clientY: clientY,
+ identifier: 1,
+ // target is set to the element with `addEventListener`, which is el
+ target: el
+ }
+ ];
+ ev.clientX = clientX;
+ ev.clientY = clientY;
+ // tell gestures to not turn off mouse events
+ child.dispatchEvent(ev);
+ }
+
+ assert.equal(child.stream.length, 0, 'expected no taps on the child');
+ assert.notEqual(el.stream.length, 0, 'expected some tracks on the parent');
+ done();
+ });
+ });
+});
+
+suite('Buttons', function() {
+ var el;
+
+ setup(function(done) {
+ el = document.createElement('x-buttons');
+ document.body.appendChild(el);
+ afterNextRender(null, done);
+ });
+
+ teardown(function() {
+ el.parentNode.removeChild(el);
+ });
+
+ suite('Down and Up', function() {
+ test('Left Mouse Button Only', function() {
+ var options = {bubbles: true, composed: true};
+ var evLeftDown = new CustomEvent('mousedown', options);
+ // left button
+ evLeftDown.button = 0;
+ evLeftDown.clientX = 1;
+ var evLeftUp = new CustomEvent('mouseup', options);
+ var evRightDown = new CustomEvent('mousedown', options);
+ // right button
+ evRightDown.button = 2;
+ evRightDown.clientX = 2;
+ var evRightUp = new CustomEvent('mouseup', options);
+
+ el.dispatchEvent(evLeftDown);
+ el.dispatchEvent(evLeftUp);
+ el.dispatchEvent(evRightDown);
+ el.dispatchEvent(evRightUp);
+
+ assert.equal(el.stream.length, 2, 'only saw one up and down pair');
+ assert.equal(el.stream[0].type, 'down');
+ assert.equal(el.stream[1].type, 'up');
+ assert.equal(el.stream[0].detail.x, 1, 'only from the left button');
+ });
+
+ test('Recover from right click', function() {
+ var options = {bubbles: true, composed: true};
+ var evDown = new CustomEvent('mousedown', options);
+ var evMove = new CustomEvent('mousemove', options);
+ evMove.buttons = 0;
+ var evUp = new CustomEvent('mouseup', options);
+
+ el.dispatchEvent(evDown);
+ el.dispatchEvent(evMove);
+ el.dispatchEvent(evUp);
+
+ assert.equal(el.stream.length, 2, 'always get an up');
+ });
+ });
+
+ suite('Tap', function() {
+ test('Left Mouse Button Only', function() {
+ var evMid = new CustomEvent('click', {bubbles: true, composed: true});
+ evMid.button = 1;
+ var evLeft = new CustomEvent('click', {bubbles: true, composed: true});
+ evLeft.button = 0;
+
+ el.dispatchEvent(evMid);
+ el.dispatchEvent(evLeft);
+
+ assert.equal(el.stream.length, 1, 'only one tap');
+ });
+ });
+
+ suite('Track', function() {
+ test('Left Mouse Button Only', function() {
+ var options = {bubbles: true, composed: true};
+ var ev = new CustomEvent('mousedown', options);
+ ev.clientX = ev.clientY = 0;
+ el.dispatchEvent(ev);
+ for (var i = 0; i < 5; i++) {
+ ev = new CustomEvent('mousemove', options);
+ ev.clientX = 10 * i;
+ ev.clientY = 10 * i;
+ // left button until move 4
+ ev.buttons = (i > 3) ? 2 : 1;
+ el.dispatchEvent(ev);
+ }
+ el.dispatchEvent(new CustomEvent('mouseup', options));
+
+ // down, <skipped>, track:start, track:track, track:track, track:end, up
+ assert.equal(el.stream.length, 6);
+ assert.equal(el.stream[0].type, 'down');
+ assert.equal(el.stream[1].detail.state, 'start');
+ assert.equal(el.stream[2].detail.state, 'track');
+ assert.equal(el.stream[3].detail.state, 'track');
+ assert.equal(el.stream[4].type, 'up');
+ assert.equal(el.stream[5].detail.state, 'end');
+ });
+ });
+});
+
+suite('SD Polyfill', function() {
+ var el;
+ setup(function(done) {
+ el = document.createElement('x-document-listener');
+ document.body.appendChild(el);
+ afterNextRender(null, function() {
+ el.setup();
+ done();
+ });
+ });
+
+ teardown(function() {
+ el.teardown();
+ document.body.removeChild(el);
+ });
+
+ test('document listener works in SD polyfill', function() {
+ var ev = new CustomEvent('mousedown', {bubbles: true, composed: true});
+ el.dispatchEvent(ev);
+ assert.equal(el.stream.length, 1);
+ });
+});
+
+suite('Reference Cleanup', function() {
+ var el;
+
+ setup(function(done) {
+ el = document.createElement('x-buttons');
+ document.body.appendChild(el);
+ afterNextRender(null, done);
+ });
+
+ teardown(function() {
+ document.body.removeChild(el);
+ });
+
+ test('down and up clear document tracking', function() {
+ var ev = new CustomEvent('mousedown', {bubbles: true, composed: true});
+ el.dispatchEvent(ev);
+
+ // some recognizers do not track the document, like tap
+ var recognizers = recognizers$0.filter(function(r) {
+ return r.info.hasOwnProperty('movefn') &&
+ r.info.hasOwnProperty('upfn');
+ });
+
+ assert.isAbove(recognizers.length, 0, 'some recognizers track the document');
+
+ recognizers.forEach(function(r) {
+ assert.isFunction(r.info.movefn, r.name + ' movefn');
+ assert.isFunction(r.info.upfn, r.name + ' upfn');
+ });
+
+ ev = new CustomEvent('mouseup', {bubbles: true, composed: true});
+ el.dispatchEvent(ev);
+
+ recognizers.forEach(function(r) {
+ assert.isNull(r.info.movefn, r.name + ' movefn');
+ assert.isNull(r.info.upfn, r.name + ' upfn');
+ });
+ });
+});
+
+suite('Imperative API', function() {
+ var el, fn;
+ suiteSetup(function() {
+ el = document.createElement('x-imperative');
+ document.body.appendChild(el);
+ fn = function(e) { el.handle(e); };
+ });
+ suiteTeardown(function() {
+ document.body.removeChild(el);
+ });
+
+ test('add listeners with addListener', function() {
+ addListener(el, 'down', fn);
+ gestures.add(el, 'up', fn);
+ var ev = new CustomEvent('mousedown', {bubbles: true, composed: true});
+ el.dispatchEvent(ev);
+ assert.equal(el.stream.length, 1);
+ assert.equal(el.stream[0].type, 'down');
+ ev = new CustomEvent('mouseup', {bubbles: true, composed: true});
+ el.dispatchEvent(ev);
+ assert.equal(el.stream.length, 2);
+ assert.equal(el.stream[1].type, 'up');
+ });
+
+ test('remove listeners with removeListener', function() {
+ gestures.remove(el, 'down', fn);
+ removeListener(el, 'up', fn);
+ var ev = new CustomEvent('mousedown', {bubbles: true, composed: true});
+ el.dispatchEvent(ev);
+ ev = new CustomEvent('mouseup', {bubbles: true, composed: true});
+ el.dispatchEvent(ev);
+ assert.equal(el.stream.length, 2);
+ });
+});
+
+suite('setScrollDirection', function() {
+ test('mapping', function() {
+ var el = document.createElement('x-imperative');
+ var key = '__polymerGesturesTouchAction';
+ el.setScrollDirection('none');
+ assert.equal(el[key], 'none');
+ el.setScrollDirection('all');
+ assert.equal(el[key], 'auto');
+ el.setScrollDirection('x');
+ assert.equal(el[key], 'pan-x');
+ el.setScrollDirection('y');
+ assert.equal(el[key], 'pan-y');
+ });
+});
+
+suite('Regression Testing', function() {
+ test('#4459', function() {
+ gestures.add(document, 'tap', null);
+ document.dispatchEvent(new MouseEvent('mousedown', { detail: 1, clientX: -100, bubbles: true, composed: true }));
+ document.dispatchEvent(new MouseEvent('mouseup', { detail: 1, clientX: 100, bubbles: true, composed: true }));
+ document.dispatchEvent(new MouseEvent('click', { detail: 1, clientX: 100, bubbles: true, composed: true }));
+ gestures.remove(document, 'tap', null);
+ });
+
+ test('#5030', function() {
+ let count = 0;
+ const increment = function() { count++; };
+ gestures.add(window, 'tap', increment);
+ window.dispatchEvent(new MouseEvent('click', {bubbles: true}));
+ assert.equal(count, 1);
+ gestures.remove(window, 'tap', increment);
+ });
+
+ suite('native label click', function() {
+
+ test('native label click', function() {
+ let el = document.createElement('x-native-label');
+ document.body.appendChild(el);
+ let target = el.$.label;
+ // simulate the event sequence of a touch on the screen
+ let touches = [{
+ clientX: 0,
+ clientY: 0,
+ identifier: 1,
+ // target is set to the element with `addEventListener`, which is `target`
+ target
+ }];
+ let touchstart = new CustomEvent('touchstart', {bubbles: true, composed: true});
+ touchstart.changedTouches = touchstart.touches = touches;
+ target.dispatchEvent(touchstart);
+ let touchend = new CustomEvent('touchend', {bubbles: true, composed: true});
+ touchend.touches = touchend.changedTouches = touches;
+ target.dispatchEvent(touchend);
+ // simulate a mouse click on the label
+ let click = new MouseEvent('click', {bubbles: true, composed: true});
+ target.dispatchEvent(click);
+ // check that the mouse click on the label will activate the checkbox
+ assert.equal(el.$.check.checked, true, 'checkbox should be checked');
+ document.body.removeChild(el);
+ });
+
+ test('label click with nested element', function() {
+ let el = document.createElement('x-native-label-nested');
+ document.body.appendChild(el);
+ let target = el.$.label;
+ // simulate the event sequence of a touch on the screen
+ let touches = [{
+ clientX: 0,
+ clientY: 0,
+ identifier: 1,
+ // target is set to the element with `addEventListener`, which is `target`
+ target
+ }];
+ let touchstart = new CustomEvent('touchstart', {bubbles: true, composed: true});
+ touchstart.changedTouches = touchstart.touches = touches;
+ target.dispatchEvent(touchstart);
+ let touchend = new CustomEvent('touchend', {bubbles: true, composed: true});
+ touchend.touches = touchend.changedTouches = touches;
+ target.dispatchEvent(touchend);
+ // simulate a mouse click on the label
+ let click = new MouseEvent('click', {bubbles: true, composed: true});
+ target.dispatchEvent(click);
+ // check that the mouse click on the label will activate the checkbox
+ assert.equal(el.$.check.checked, true, 'checkbox should be checked');
+ document.body.removeChild(el);
+ });
+ });
+
+ test('disabled elements don\'t fire taps', function() {
+ let el = document.createElement('x-disabled-tap');
+ document.body.appendChild(el);
+ // tap an element with disabled attribute
+ let target = el.$.disabled;
+ // simulate the event sequence of a touch on the screen
+ let touches = [{
+ clientX: 0,
+ clientY: 0,
+ identifier: 1,
+ // target is set to the element with `addEventListener`, which is `target`
+ target
+ }];
+ let touchstart = new CustomEvent('touchstart', {bubbles: true, composed: true});
+ touchstart.changedTouches = touchstart.touches = touches;
+ target.dispatchEvent(touchstart);
+ let touchend = new CustomEvent('touchend', {bubbles: true, composed: true});
+ touchend.touches = touchend.changedTouches = touches;
+ target.dispatchEvent(touchend);
+ assert.equal(el.taps.length, 0);
+ // tap an element with a disabled ancestor
+ target = el.$.nested;
+ // simulate the event sequence of a touch on the screen
+ touches = [{
+ clientX: 0,
+ clientY: 0,
+ identifier: 1,
+ // target is set to the element with `addEventListener`, which is `target`
+ target
+ }];
+ touchstart = new CustomEvent('touchstart', {bubbles: true, composed: true});
+ touchstart.changedTouches = touchstart.touches = touches;
+ target.dispatchEvent(touchstart);
+ touchend = new CustomEvent('touchend', {bubbles: true, composed: true});
+ touchend.touches = touchend.changedTouches = touches;
+ target.dispatchEvent(touchend);
+ assert.equal(el.taps.length, 1);
+ document.body.removeChild(el);
+ });
+});
+</script>
+
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/globals.html b/third_party/polymer3/bower_components/polymer/test/unit/globals.html
new file mode 100644
index 0000000..2525591
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/globals.html
@@ -0,0 +1,112 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script type="module">
+window.origOwnProps = Object.getOwnPropertyNames(window).reduce(function(props, prop) {
+ return props[prop] = true && props;
+}, {});
+</script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+<body>
+<!-- Exercise the core features of Polymer -->
+
+<dom-module id="shared-styles">
+ <template strip-whitespace>
+ <style>:host{ --foo: var(--bar); };</style>
+ </template>
+</dom-module>
+<dom-module id="global-test">
+ <template strip-whitespace>
+ <style include="shared-styles">:host{ --foo: var(--bar); };</style>
+ <div class$="{{stuff.is.here}}">{{bindings(are, cool)}}</div>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'global-test',
+ properties: {
+ foo: {
+ notify: true,
+ reflectToAttribute: true,
+ observer: 'observeFoo',
+ value: 'foo'
+ }
+ },
+ observers: ['observeFooDeep(foo.*)'],
+ hostAttributes: {
+ tabIndex: 0
+ },
+ listeners: {
+ tap: 'handleTap'
+ },
+ observeFooDeep() {},
+ observeFoo() {}
+});
+</script>
+</dom-module>
+
+<global-test></global-test>
+
+<script type="module">
+import '../../polymer-legacy.js';
+
+/* global origOwnProps */
+suite('globals', function() {
+
+ var expected = {
+ origOwnProps: true,
+
+ // Test harness
+ a11ySuite: true,
+ assert: true,
+ expect: true,
+ run: true,
+ fixture: true,
+ replace: true,
+ stub: true,
+
+ // Polymer
+ JSCompiler_renameProperty: true,
+
+ // weird safari + selenium globals
+ alert: true,
+ confirm: true,
+ prompt: true,
+
+ // weird Firefox event
+ NotifyPaintEvent: true,
+
+ // module-to-amd transform
+ require: true,
+ resolve: true,
+ _wctCallback: true
+ };
+
+ test('check global leakage', function() {
+ // Only run on native ES6 browsers, to avoid transpiler globals
+ if (!window._classCallCheck) {
+ var newProps = Object.getOwnPropertyNames(window).filter(function(prop) {
+ return !origOwnProps[prop] && !expected[prop];
+ });
+ assert.equal(newProps.length, 0, 'new globals added: \n' + newProps.sort().join('\n'));
+ }
+ });
+
+});
+</script>
+
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/html-tag.html b/third_party/polymer3/bower_components/polymer/test/unit/html-tag.html
new file mode 100644
index 0000000..b55d981
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/html-tag.html
@@ -0,0 +1,145 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+</head>
+<body>
+ <script type="module">
+import { html, htmlLiteral } from '../../lib/utils/html-tag.js';
+import { PolymerElement } from '../../polymer-element.js';
+import { Polymer } from '../../lib/legacy/polymer-fn.js';
+suite('html function', function() {
+ test('html makes an HTML template', function() {
+ let t = html``;
+ assert.instanceOf(t, HTMLTemplateElement);
+ });
+ test('template output has elements', function() {
+ let t = html`<div><span></span></div><!-- hi -->`;
+ assert(t.content.querySelector('div'));
+ assert(t.content.querySelector('span'));
+ assert.instanceOf(t.content.lastChild, Comment);
+ });
+ test('escaping works as expected', function() {
+ let t = html`<span>the \`price\` is \${{foo}}\n</span>`;
+ assert.equal(t.innerHTML, '<span>the `price` is ${{foo}}\n</span>');
+ });
+ test('interpolation of non-templates throw', function() {
+ assert.throws(() => html`<div>${'a'}</div>`);
+ });
+ test('interpolation of templates include the template contents', function() {
+ let t1 = html`<div></div>`;
+ let t2 = html`<span>${t1}</span>`;
+ assert.equal(t2.innerHTML, '<span><div></div></span>');
+ });
+ test('interpolation of literal values', function() {
+ let s1 = htmlLiteral`hello`;
+ assert.equal(s1.value, `hello`);
+ let s2 = htmlLiteral`hello${htmlLiteral` ${htmlLiteral`world`}!`}!`;
+ assert.equal(s2.value, 'hello world!!');
+ });
+ test('interpolation of literal values within html values', function() {
+ let s1 = htmlLiteral`foo`;
+ let s2 = htmlLiteral`display: block;`;
+ let t = html`<style>:host {${s2}}</style><div ${s1}></div>`;
+ assert.equal(t.innerHTML, `<style>:host {display: block;}</style><div foo=""></div>`);
+ });
+});
+suite('Polymer + html fn', function() {
+ suiteSetup(function() {
+
+ class HtmlFn extends PolymerElement {
+ static get is() {return 'html-fn';}
+ static get template() {
+ return html`
+ <style>
+ :host {
+ display: block;
+ }
+ </style>
+ <div id="child">
+ [[databoundProperty]]
+ </div>
+ `;
+ }
+ static get properties() {
+ return {
+ databoundProperty: String
+ };
+ }
+ ready() {
+ super.ready();
+ this.databoundProperty = 'first';
+ }
+ }
+
+ customElements.define(HtmlFn.is, HtmlFn);
+
+ class HtmlFnSub extends HtmlFn {
+ static get is() {return 'html-fn-sub';}
+ static get template() {
+ return html`
+ <div id="super">
+ ${super.template}
+ </div>
+ `;
+ }
+ ready() {
+ super.ready();
+ this.databoundProperty = 'second';
+ }
+ }
+
+ customElements.define(HtmlFnSub.is, HtmlFnSub);
+
+ Polymer({
+ is: 'html-legacy',
+ _template: html`
+ <div id="child">[[databoundProperty]]</div>
+ `,
+ properties: {
+ databoundProperty: {
+ type: String,
+ value: 'legacy'
+ }
+ }
+ });
+ });
+
+ test('Polymer elements can use html fn', function () {
+ let el = document.createElement('html-fn');
+ document.body.appendChild(el);
+ assert(el.shadowRoot);
+ assert.equal(el.$.child.textContent.trim(), 'first');
+ });
+
+ test('subclass elements can embed the superclass template', function() {
+ let el = document.createElement('html-fn-sub');
+ document.body.appendChild(el);
+ assert(el.$.super);
+ assert(el.$.child);
+ assert.equal(el.$.child.textContent.trim(), 'second');
+ });
+
+ test('legacy element works with html fn', function() {
+ let el = document.createElement('html-legacy');
+ document.body.appendChild(el);
+ assert(el.shadowRoot);
+ assert.equal(el.$.child.textContent.trim(), 'legacy');
+ });
+});
+</script>
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/importHref.html b/third_party/polymer3/bower_components/polymer/test/unit/importHref.html
new file mode 100644
index 0000000..746db86
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/importHref.html
@@ -0,0 +1,70 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../lib/utils/import-href.js"></script>
+<body>
+
+<x-test></x-test>
+
+<script type="module">
+import { importHref as importHref$0 } from '../../lib/utils/import-href.js';
+import { PolymerElement } from '../../polymer-element.js';
+import { Base } from '../../polymer-legacy.js';
+
+suite('importHref', function() {
+
+ let parsedEl = document.querySelector('x-test');
+
+ test('importing polymer via Polymer.importHref', function(done) {
+ assert.notOk(PolymerElement);
+ importHref$0('../../polymer.html', function() {
+ assert.ok(PolymerElement);
+ done();
+ });
+ });
+
+ test('element loaded with Polymer.Base.importHref upgrades properly', function(done) {
+ Base.importHref('sub/x-test.html', function() {
+ assert.ok(parsedEl.$.sub, 'parsed element not upgraded with template when import loaded');
+ assert.notOk(parsedEl.$.sub.$, 'sub element of imported element should not yet be upgraded');
+ var el = document.createElement('x-test');
+ document.body.appendChild(el);
+ assert.ok(el.$.sub, 'imperatively created element not upgraded with template when import loaded');
+ done();
+ });
+ });
+
+ test('sub-element loaded with instance importHref upgrades properly', function(done) {
+ parsedEl.importHref('sub/x-sub.html', function() {
+ assert.equal(this, parsedEl);
+ assert.ok(parsedEl.$.sub.$.test, 'sub element not upgraded when import loaded');
+ done();
+ });
+ });
+
+ test('load is triggered on second call', function(done) {
+ Base.importHref('sub/x-test.html', function() {
+ Base.importHref('sub/x-test.html', function() {
+ done();
+ });
+ });
+ });
+
+});
+</script>
+
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/inheritance.html b/third_party/polymer3/bower_components/polymer/test/unit/inheritance.html
new file mode 100644
index 0000000..346498a
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/inheritance.html
@@ -0,0 +1,271 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+<body>
+
+ <dom-module id="base-el">
+ <template>
+ <style>
+ :host {
+ display: block;
+ color: red;
+ }
+ code {
+ color: black;
+ }
+ </style>
+ <!-- dummy nodes with notes be removed by subclass -->
+ <i i=[[i]]></i>
+ <i i=[[i]]></i>
+ <i i=[[i]]></i>
+ <i i=[[i]]></i>
+ <i i=[[i]]></i>
+ <input id="input" value="{{foo::input}}" on-custom="handleCustomEvent">
+ <span>base element: <code>foo = [[foo]]</code></span>
+ </template>
+
+ <script type="module">
+import { PolymerElement } from '../../polymer-element.js';
+class BaseEl extends PolymerElement {
+ static get is() { return 'base-el'; }
+ static get properties() {
+ return { foo: { type: String, value: 5 } };
+ }
+ constructor() {
+ super();
+ this.handleCustomEvent = sinon.spy();
+ }
+}
+customElements.define(BaseEl.is, BaseEl);
+window.BaseEl = BaseEl;
+</script>
+ </dom-module>
+
+ <dom-module id="child-el">
+ <script type="module">
+class ChildEl extends window.BaseEl {
+ static get is() { return 'child-el'; }
+ static get properties() {
+ return { bar: { type: String, value: 3 } };
+ }
+}
+customElements.define(ChildEl.is, ChildEl);
+window.ChildEl = ChildEl;
+</script>
+ </dom-module>
+
+ <dom-module id="grand-child-el">
+ <script type="module">
+class GrandChildEl extends window.ChildEl {
+ static get is() { return 'grand-child-el'; }
+ static get properties() {
+ return { bar: { type: String, value: 3 } };
+ }
+}
+customElements.define(GrandChildEl.is, GrandChildEl);
+window.GrandChildEl = GrandChildEl;
+</script>
+ </dom-module>
+
+ <dom-module id="child-el-with-template">
+ <template>should ignore this template</template>
+ <script type="module">
+class ChildElWithTemplate extends window.GrandChildEl {
+ static get properties() {
+ return { bar: { type: String, value: 3 } };
+ }
+ static get template() {
+ var template = window.GrandChildEl.template.cloneNode(true);
+ var div = document.createElement('div');
+ div.textContent = 'child';
+ template.content.appendChild(div);
+ // Move input to the end
+ template.content.appendChild(template.content.querySelector('#input'));
+ // Remove all the <i>'s, such that the total number of nodes in
+ // this template is less than the super
+ Array.from(template.content.querySelectorAll('i'))
+ .forEach(i=>i.parentNode.removeChild(i));
+ return template;
+ }
+}
+customElements.define('child-el-with-template', ChildElWithTemplate);
+window.ChildElWithTemplate = ChildElWithTemplate;
+</script>
+ </dom-module>
+
+ <dom-module id="parent-element-template-overriding">
+ <script type="module">
+import { html } from '../../lib/utils/html-tag.js';
+import { PolymerElement } from '../../polymer-element.js';
+class ParentElementWithTemplate extends PolymerElement {
+ static get template() {
+ return html`This template should not exist`;
+ }
+}
+class ChildWithNoTemplate extends ParentElementWithTemplate {
+ static get template() {
+ return null;
+ }
+}
+customElements.define('child-with-no-template', ChildWithNoTemplate);
+</script>
+ </dom-module>
+
+ <test-fixture id="basic">
+ <template>
+ <base-el></base-el>
+ <child-el></child-el>
+ </template>
+ </test-fixture>
+
+ <test-fixture id="basic-with-attributes">
+ <template>
+ <base-el></base-el>
+ <child-el foo="7" bar="7"></child-el>
+ </template>
+ </test-fixture>
+
+ <test-fixture id="with-template">
+ <template>
+ <base-el></base-el>
+ <child-el-with-template></child-el-with-template>
+ </template>
+ </test-fixture>
+
+ <script type="module">
+suite('ChildElement extends BaseElement', function() {
+ test('child has base properties', function() {
+ var f = fixture('basic');
+ var child = f[1];
+ assert.equal(child.foo, 5);
+ assert.equal(child.bar, 3);
+ });
+
+ test('child can change base properties', function() {
+ var f = fixture('basic-with-attributes');
+ var child = f[1];
+ assert.equal(child.foo, 7);
+ assert.equal(child.bar, 7);
+ });
+
+ test('child has base template and style', function() {
+ var f = fixture('basic');
+ var base = f[0];
+ var child = f[1];
+
+ // Child template is the same as the base template.
+ assert.equal(child.shadowRoot.childNodes.length, child.shadowRoot.childNodes.length);
+ for (var i=0; i < child.shadowRoot.childNodes.length; i++) {
+ var childEl = child.shadowRoot.childNodes[i];
+ var baseEl = child.shadowRoot.childNodes[i];
+ assert.equal(childEl.innerHTML, baseEl.innerHTML);
+ }
+
+ // And it's something that we expect.
+ var code = child.shadowRoot.querySelector('code');
+ assert.equal(code.innerHTML, 'foo = 5');
+
+ // And the base style is the same.
+ assert.equal(getComputedStyle(base).color, getComputedStyle(child).color);
+
+ // Id map works as expected
+ assert.equal(child.$.input.localName, 'input');
+ assert.equal(child.$.input.id, 'input');
+
+ // 2-way bindings work as expected
+ child.$.input.value = 'changed';
+ child.$.input.dispatchEvent(new CustomEvent('input'));
+ assert.equal(child.foo, 'changed');
+
+ // Declarative event listeners work as expected
+ assert.equal(child.handleCustomEvent.callCount, 0);
+ child.$.input.dispatchEvent(new CustomEvent('custom'));
+ assert.equal(child.handleCustomEvent.callCount, 1);
+ });
+
+ test('child with properties has updated base template', function() {
+ var f = fixture('basic-with-attributes');
+ var base = f[0];
+ var child = f[1];
+
+ // Child template is not the same as the base template.
+ assert.notEqual(child.shadowRoot.innerHTML, base.shadowRoot.innerHTML);
+
+ // And it's something that we expect.
+ var code = child.shadowRoot.querySelector('code');
+ assert.equal(code.innerHTML, 'foo = 7');
+ });
+});
+
+suite('ChildElement extends BaseElement and the template', function() {
+ test('child has base properties', function() {
+ var f = fixture('with-template');
+ var child = f[1];
+ assert.equal(child.foo, 5);
+ assert.equal(child.bar, 3);
+ });
+
+ test('child has derived template and style', function() {
+ var f = fixture('with-template');
+ var base = f[0];
+ var child = f[1];
+
+ // Child template is not the same as the base template.
+ assert.notEqual(child.shadowRoot.innerHTML, base.shadowRoot.innerHTML);
+
+ // And it's something that we expect.
+ assert.equal(child.shadowRoot.querySelector('code').innerHTML, 'foo = 5');
+ assert.equal(child.shadowRoot.querySelector('div').innerHTML, 'child');
+
+ // And the base style is the same.
+ assert.equal(getComputedStyle(base).color, getComputedStyle(child).color);
+
+ // Id map works as expected
+ assert.equal(child.$.input.localName, 'input');
+ assert.equal(child.$.input.id, 'input');
+
+ // 2-way bindings work as expected
+ child.$.input.value = 'changed';
+ child.$.input.dispatchEvent(new CustomEvent('input'));
+ assert.equal(child.foo, 'changed');
+
+ // Declarative event listeners work as expected
+ assert.equal(child.handleCustomEvent.callCount, 0);
+ child.$.input.dispatchEvent(new CustomEvent('custom'));
+ assert.equal(child.handleCustomEvent.callCount, 1);
+ });
+});
+
+suite('child overriding a template', function() {
+ let el;
+
+ setup(function() {
+ el = document.createElement('child-with-no-template');
+ document.body.appendChild(el);
+ });
+
+ teardown(function() {
+ document.body.removeChild(el);
+ });
+
+ test('returning null nullifies the parent template', function() {
+ assert.equal(el.shadowRoot, null);
+ });
+});
+</script>
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/logging.html b/third_party/polymer3/bower_components/polymer/test/unit/logging.html
new file mode 100644
index 0000000..a6102b9
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/logging.html
@@ -0,0 +1,105 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+</head>
+<body>
+ <dom-module id="x-logging">
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-logging',
+ properties: {
+ stream: {
+ value: () => [],
+ type: Array
+ }
+ },
+ _logger(level, args) {
+ this.stream.push({level, args});
+ }
+});
+</script>
+ </dom-module>
+ <script type="module">
+import { LegacyElementMixin } from '../../lib/legacy/legacy-element-mixin.js';
+class XMixin extends LegacyElementMixin(HTMLElement) {
+ static get is() { return 'x-mixin'; }
+ static get properties() {
+ return {
+ stream: {
+ value: () => [],
+ type: Array
+ }
+ };
+ }
+ _logger(level, args) {
+ this.stream.push({level, args});
+ }
+}
+customElements.define(XMixin.is, XMixin);
+</script>
+ <script type="module">
+import { Base } from '../../polymer-legacy.js';
+suite('Logging', () => {
+ let fnEl, classEl;
+ suiteSetup(() => {
+ fnEl = document.createElement('x-logging');
+ document.body.appendChild(fnEl);
+ classEl = document.createElement('x-mixin');
+ document.body.appendChild(classEl);
+ });
+ test('API', () => {
+ ['_log', '_warn', '_error', '_logf', '_logger'].forEach((n) => {
+ assert.isFunction(fnEl[n], `${n} not defined on Polymer() element`);
+ assert.isFunction(classEl[n], `${n} not defined on Polymer.Element element`);
+ });
+ });
+ test('_log, _warn_, and _error go through _logger', () => {
+ fnEl._log('fn');
+ classEl._log('class');
+ fnEl._warn('fn');
+ classEl._warn('class');
+ fnEl._error('fn');
+ classEl._error('class');
+ assert.deepEqual(fnEl.stream, [{level: 'log', args: ['fn']}, {level: 'warn', args: ['fn']}, {level: 'error', args: ['fn']}]);
+ assert.deepEqual(classEl.stream, [{level: 'log', args: ['class']}, {level: 'warn', args: ['class']}, {level: 'error', args: ['class']}]);
+ });
+ test('_logf', () => {
+ let args = ['hi', 'there'];
+ let output = fnEl._logf(...args);
+ assert.oneOf(fnEl.is, output, `${fnEl.is} should be in ${output}`);
+ assert.includeMembers(output, args, `${args} should be in ${output}`);
+ });
+});
+suite('_logger', () => {
+ test('_log with single parameter', () => {
+ const msg = 'log test';
+ const orgConsole = console;
+ const spy = sinon.spy();
+ window.console = {
+ log: spy
+ };
+ Base._log(msg);
+ window.console = orgConsole;
+ assert.equal(spy.callCount, 1, 'console.log called more than one time');
+ assert.equal(spy.args[0].length, 1, 'console.log called with more than one argument');
+ assert.equal(spy.args[0][0], msg, 'message not pass properly to log');
+ });
+});
+</script>
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/mixin-behaviors.html b/third_party/polymer3/bower_components/polymer/test/unit/mixin-behaviors.html
new file mode 100644
index 0000000..7c16962
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/mixin-behaviors.html
@@ -0,0 +1,572 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+<body>
+
+ <script type="module">
+window.LifeCycleBehavior1 = {
+ _calledCreated: 0,
+ _calledAttached: 0,
+ _calledAttributeChanged: 0,
+
+ properties: {
+ foo: {
+ type: String
+ }
+ },
+
+ created() {
+ this._calledCreated++;
+ },
+
+ attached() {
+ this._calledAttached++;
+ },
+
+ attributeChanged() {
+ this._calledAttributeChanged++;
+ }
+};
+
+window.LifeCycleBehavior2 = {
+ created() {
+ this._calledCreated++;
+ },
+
+ attached() {
+ this._calledAttached++;
+ },
+
+};
+
+window.BehaviorA = {
+ properties: {
+
+ label: {
+ type: String,
+ observer: '_labelChanged'
+ },
+
+ hasOptionsA: {
+ readOnly: true,
+ notify: true
+ },
+
+ overridableProperty: {
+ value: false
+ },
+
+ overridablePropertyB: {
+ value: false
+ },
+
+ hasBehaviorA: {
+ value: true
+ },
+
+ computeADependency: {
+ value: true
+ },
+
+ computeA: {
+ computed: '_computeProp(computeADependency)'
+ }
+ },
+
+ _simpleProperty: 'A',
+
+ hostAttributes: {
+ behavior: 'A',
+ element: 'A',
+ user: 'A'
+ },
+
+ listeners: {
+ change: '_changeHandler'
+ },
+
+ ready: function() {
+ this.__readyA = true;
+ },
+
+ _labelChanged: function(label) {
+ this.__label = label;
+ },
+
+ _changeHandler: function(e) {
+ this.__change = e.detail.value;
+ },
+
+ _computeProp: function(a) {
+ return a;
+ }
+};
+
+window.BehaviorB = {
+ properties: {
+
+ disabled: {
+ type: Boolean,
+ value: false,
+ observer: '_disabledChanged'
+ },
+
+ hasOptionsB: {
+ readOnly: true,
+ notify: true
+ },
+
+ hasBehaviorB: {
+ value: true
+ },
+
+ overridablePropertyB: {
+ value: true
+ },
+
+ computeADependencyDependency: {
+ value: 'hi'
+ },
+
+ computeADependency: {
+ computed: '_computeProp(computeADependencyDependency)'
+ }
+
+ },
+
+ hostAttributes: {
+ behavior: 'B',
+ element: 'B',
+ user: 'B'
+ },
+
+ _simpleProperty: 'B',
+
+ _disabledChanged: function(disabled) {
+ this.__disabled = disabled;
+ },
+
+ ready: function() {
+ this.__readyB = true;
+ },
+
+};
+
+window.BehaviorC = {
+
+ properties: {
+
+ hasBehaviorC: {
+ value: true
+ }
+
+ },
+
+ _simpleProperty: 'C'
+};
+
+window.BehaviorD = {
+
+ properties: {
+
+ hasBehaviorD: {
+ value: true
+ }
+
+ },
+ _simpleProperty: 'D'
+
+};
+</script>
+
+ <dom-module id="single-behavior">
+ <script type="module">
+import { mixinBehaviors } from '../../lib/legacy/class.js';
+import { PolymerElement } from '../../polymer-element.js';
+customElements.define('single-behavior',
+ mixinBehaviors(window.BehaviorA, PolymerElement));
+</script>
+ </dom-module>
+
+ <dom-module id="lifecycle-behavior">
+ <script type="module">
+import { mixinBehaviors } from '../../lib/legacy/class.js';
+import { PolymerElement } from '../../polymer-element.js';
+customElements.define('lifecycle-behavior',
+ mixinBehaviors([window.LifeCycleBehavior1,
+ window.LifeCycleBehavior2], PolymerElement));
+</script>
+ </dom-module>
+
+ <dom-module id="multi-behaviors">
+ <script type="module">
+import { mixinBehaviors } from '../../lib/legacy/class.js';
+import { PolymerElement } from '../../polymer-element.js';
+customElements.define('multi-behaviors',
+ class extends mixinBehaviors(
+ [window.BehaviorA, window.BehaviorB], PolymerElement) {
+
+ static get properties() {
+ return {
+ foo: {
+ type: String,
+ reflectToAttribute: true,
+ readOnly: true,
+ observer: '_fooChanged'
+ },
+
+ overridableProperty: {
+ value: true
+ }
+ };
+ }
+
+ constructor() {
+ super();
+ }
+
+ _fooChanged(foo) {
+ this.__foo = foo;
+ }
+
+ _ensureAttributes() {
+ this._ensureAttribute('element', 'element');
+ super._ensureAttributes();
+ }
+});
+</script>
+ </dom-module>
+
+ <dom-module id="nested-behaviors">
+ <script type="module">
+import { mixinBehaviors } from '../../lib/legacy/class.js';
+import { PolymerElement } from '../../polymer-element.js';
+customElements.define('nested-behaviors',
+ class extends mixinBehaviors(
+ [
+ [window.BehaviorB, [window.BehaviorC, window.BehaviorB], window.BehaviorA],
+ [window.BehaviorD]
+ ], PolymerElement) {
+});
+</script>
+ </dom-module>
+
+ <dom-module id="behavior-registered">
+ <template>
+ <div id="content"></div>
+ </template>
+ <script type="module">
+import { mixinBehaviors } from '../../lib/legacy/class.js';
+import { PolymerElement } from '../../polymer-element.js';
+
+window.registerBehavior1 ={
+ registered: function() {
+ this._createPropertyObserver('prop', 'propChanged1');
+ this._createMethodObserver('propChanged2(prop)');
+ this.registeredCount++;
+ this.registeredProps = [this.prop1, this.prop2, this.prop3];
+ this.registeredBehaviors = this.behaviors;
+ },
+ prop1: true,
+ ready: function() {
+ this._ensureAttribute('attr', true);
+ },
+ propChanged1: function() {
+ this.propChanged1Called = true;
+ },
+ propChanged2: function() {
+ this.propChanged2Called = true;
+ }
+};
+
+window.registerBehavior2 ={
+ prop2: true,
+ registered: function() {
+ this.registeredCount++;
+ }
+};
+
+window.registerBehavior3 ={
+ prop3: true,
+ registered: function() {
+ this.registeredCount++;
+ }
+};
+
+class BehaviorRegistered extends mixinBehaviors([
+ window.registerBehavior1,
+ window.registerBehavior2,
+ window.registerBehavior3
+ ], PolymerElement) {
+
+ static get is() { return 'behavior-registered';}
+
+ _initializeProperties() {
+ super._initializeProperties();
+ this.registeredCount++;
+ }
+}
+
+BehaviorRegistered.prototype.registeredCount = 0;
+
+customElements.define(BehaviorRegistered.is, BehaviorRegistered);
+
+class BehaviorRegisteredExt extends BehaviorRegistered {
+ static get is() { return 'behavior-registered-ext';}
+}
+
+BehaviorRegisteredExt.prototype.registeredCount = 0;
+
+customElements.define(BehaviorRegisteredExt.is, BehaviorRegisteredExt);
+</script>
+ </dom-module>
+
+ <test-fixture id="single">
+ <template>
+ <single-behavior></single-behavior>
+ </template>
+ </test-fixture>
+
+ <test-fixture id="lifecycle">
+ <template>
+ <lifecycle-behavior foo="foo"></lifecycle-behavior>
+ </template>
+ </test-fixture>
+
+ <test-fixture id="multi">
+ <template>
+ <multi-behaviors user="user"></multi-behaviors>
+ </template>
+ </test-fixture>
+
+ <test-fixture id="nested">
+ <template>
+ <nested-behaviors></nested-behaviors>
+ </template>
+ </test-fixture>
+
+ <test-fixture id="registered">
+ <template>
+ <behavior-registered></behavior-registered>
+ </template>
+ </test-fixture>
+
+ <test-fixture id="registered-ext">
+ <template>
+ <behavior-registered-ext></behavior-registered-ext>
+ </template>
+ </test-fixture>
+<script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+import { mixinBehaviors } from '../../lib/legacy/class.js';
+import { PolymerElement } from '../../polymer-element.js';
+
+suite('single behavior element', function() {
+ var el;
+
+ setup(function() {
+ el = fixture('single');
+ });
+
+ test('ready from behavior', function() {
+ assert.equal(el.__readyA, true);
+ });
+
+ test('properties from behavior', function() {
+ el.label = 'foo';
+ assert.equal(el.__label, 'foo');
+ });
+
+ test('instance behaviors', function() {
+ assert.equal(el.behaviors.length, 1);
+ });
+
+ test('listener from behavior', function() {
+ el.fire('change', {value: 'bar'});
+ assert.equal(el.__change, 'bar');
+ });
+
+ test('property info from behavior', function() {
+ assert.equal(el._hasNotifyEffect('hasOptionsA'), true);
+ assert.equal(el._hasReadOnlyEffect('hasOptionsA'), true);
+ assert.equal(typeof el._setHasOptionsA, 'function');
+ });
+
+ test('compute property from behavior', function() {
+ assert.equal(el.computeA, true);
+ });
+
+});
+
+suite('behavior.registered', function() {
+ test('can install dynamic properties', function() {
+ var el = fixture('registered');
+ assert.ok(el.$.content);
+ el.prop = 42;
+ assert.isTrue(el.propChanged1Called);
+ assert.isTrue(el.propChanged2Called);
+ assert.isTrue(el.hasAttribute('attr'));
+ });
+
+ test('called once for each behavior with access to element prototype', function() {
+ var el = fixture('registered');
+ assert.equal(el.registeredCount, 4);
+ assert.equal(el.registeredBehaviors.length, 3);
+ assert.equal(el.registeredBehaviors, el.behaviors);
+ assert.deepEqual(el.registeredProps, [true, true, true]);
+ });
+
+ test('extending element with behaviors with registered properly registers', function() {
+ var el = fixture('registered-ext');
+ assert.equal(el.registeredCount, 4);
+ assert.equal(el.registeredBehaviors.length, 3);
+ assert.equal(el.registeredBehaviors, el.behaviors);
+ assert.deepEqual(el.registeredProps, [true, true, true]);
+ });
+
+});
+
+suite('behavior lifecycle', function() {
+
+ var el;
+
+ setup(function() {
+ el = fixture('lifecycle');
+ });
+
+ test('lifecycle', function() {
+ assert.equal(el._calledCreated, 2, 'created call count wrong');
+ assert.equal(el._calledAttached, 2, 'attached call count wrong');
+ assert.equal(el._calledAttributeChanged, 1, 'attributeChanged call count wrong');
+ });
+
+ });
+
+suite('multi-behaviors element', function() {
+ var el;
+
+ setup(function() {
+ el = fixture('multi');
+ });
+
+ test('ready from behaviors', function() {
+ assert.equal(el.__readyA, true);
+ assert.equal(el.__readyB, true);
+ });
+
+ test('instance behaviors', function() {
+ assert.equal(el.behaviors.length, 2);
+ });
+
+ test('properties from behaviors', function() {
+ el.label = 'foo';
+ assert.equal(el.__label, 'foo');
+ el.disabled = true;
+ assert.equal(el.__disabled, true);
+ });
+
+ test('properties from itself', function() {
+ assert.isDefined(el._setFoo, 'readOnly setter not available');
+ el._setFoo('bar');
+ assert.equal(el.__foo, 'bar', 'observer not getting called');
+ assert.equal(el.getAttribute('foo'), 'bar', 'not getting reflected');
+ });
+
+ test('listener from behaviors', function() {
+ el.fire('change', {value: 'bar'});
+ assert.equal(el.__change, 'bar');
+ });
+
+ test('property info from behavior A', function() {
+ assert.equal(el._hasNotifyEffect('hasOptionsA'), true);
+ assert.equal(el._hasReadOnlyEffect('hasOptionsA'), true);
+ assert.equal(typeof el._setHasOptionsA, 'function');
+ });
+
+ test('property info from behavior B', function() {
+ assert.equal(el._hasReadOnlyEffect('hasOptionsB'), true);
+ assert.equal(el._hasNotifyEffect('hasOptionsB'), true);
+ assert.equal(typeof el._setHasOptionsB, 'function');
+ });
+
+ test('computed property dependency can become a computed property', function() {
+ assert.equal(el.computeA, 'hi');
+ });
+
+ test('multi-behavior overrides ordering', function() {
+ assert(el.overridableProperty, 'Behavior property was not overridden by prototype');
+ assert(el.overridablePropertyB, 'Behavior config-property was not overridden by sub-behavior');
+ });
+
+ test('hostAttributes ordering', function() {
+ assert.equal(el.attributes.behavior.value, 'B', 'Behavior hostAttribute not overridden by younger behavior');
+ assert.equal(el.attributes.element.value, 'element', 'Behavior hostAttribute overridden by behavior');
+ assert.equal(el.attributes.user.value, 'user', 'Behavior hostAttribute overrode user attribute');
+ });
+
+ test('behavior is null generates warning', function() {
+ sinon.spy(console, 'warn');
+ Polymer({
+ is: 'behavior-null',
+ behaviors: [
+ null
+ ]
+ });
+ document.createElement('behavior-null');
+ assert.equal(console.warn.callCount, 1, 'Null behaviour should generate warning');
+ console.warn.restore();
+ });
+
+ test('behavior array is unique', function() {
+ customElements.define('behavior-unique', mixinBehaviors(
+ [window.BehaviorA, window.BehaviorA], PolymerElement));
+ assert.equal(document.createElement('behavior-unique').behaviors.length, 1);
+ });
+
+ test('duplicate behaviors keep first behavior', function() {
+ customElements.define('behavior-unique-last-behavior', mixinBehaviors(
+ [window.BehaviorA, window.BehaviorB, window.BehaviorC, window.BehaviorA, window.BehaviorB], PolymerElement));
+ var behaviors = document.createElement('behavior-unique-last-behavior').behaviors;
+ assert.deepEqual(behaviors, [window.BehaviorC, window.BehaviorA, window.BehaviorB]);
+ });
+
+});
+
+suite('nested-behaviors element', function() {
+ var el;
+
+ setup(function() {
+ el = fixture('nested');
+ });
+
+ test('nested-behavior dedups', function() {
+ assert.equal(el.behaviors.length, 4);
+ });
+
+ test('nested-behavior overrides ordering', function() {
+ assert.ok(el.hasBehaviorA, "missing BehaviorA");
+ assert.ok(el.hasBehaviorB, "missing BehaviorB");
+ assert.ok(el.hasBehaviorC, "missing BehaviorC");
+ assert.ok(el.hasBehaviorD, "missing BehaviorD");
+ assert.equal(el._simpleProperty, 'D', 'Behavior simple property was not overridden by sub-behavior');
+ });
+
+});
+</script>
+
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/mixin-utils.html b/third_party/polymer3/bower_components/polymer/test/unit/mixin-utils.html
new file mode 100644
index 0000000..92aab93
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/mixin-utils.html
@@ -0,0 +1,120 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+</head>
+<body>
+ <script type="module">
+import { dedupingMixin } from '../../lib/utils/mixin.js';
+suite('Mixin Utilities', () => {
+ suite('Mixin Caching', () => {
+ let mixinFn;
+ let cachingMixinFn;
+ suiteSetup(() => {
+ mixinFn = (base) => class mixin extends base {
+ mixed(){ return true; }
+ };
+ cachingMixinFn = dedupingMixin(mixinFn);
+ });
+ test('cachingMixin applies mixins', () => {
+ let app = cachingMixinFn(class {});
+ let inst = new app();
+ assert.isFunction(inst.mixed);
+ assert.equal(inst.mixed(), true);
+ });
+ test('Mixins are cached when the base class is identical', () => {
+ class base {}
+ let applicationOne = cachingMixinFn(base);
+ let applicationTwo = cachingMixinFn(base);
+ assert.equal(applicationOne, applicationTwo);
+ });
+ test('Original Mixin function keeps the cache', () => {
+ assert.ok(mixinFn.__mixinApplications);
+ assert.instanceOf(mixinFn.__mixinApplications, WeakMap);
+ assert.notOk(cachingMixinFn.__mixinApplications);
+ });
+ });
+ suite('Mixin Deduplicating', () => {
+ let mixinFn, dedupingMixinFn;
+ suiteSetup(() => {
+ mixinFn = (base) => class mixin extends base {
+ mixed(){ return true; }
+ };
+ dedupingMixinFn = dedupingMixin(mixinFn);
+ });
+ test('dedupingMixin applies mixins', () => {
+ let app = dedupingMixinFn(class {});
+ let inst = new app();
+ assert.isFunction(inst.mixed);
+ assert.equal(inst.mixed(), true);
+ });
+ test('dedupingMixin also caches', () => {
+ class base {}
+ let appOne = dedupingMixinFn(base);
+ let appTwo = dedupingMixinFn(base);
+ assert.equal(appOne, appTwo);
+ });
+ test('Mixins apply only if unique on the base class', () => {
+ class base {}
+ let appOne = dedupingMixinFn(base);
+ class intermediate extends appOne {}
+ let appTwo = dedupingMixinFn(intermediate);
+ assert.equal(intermediate, appTwo);
+ let inst = new appTwo();
+ assert.equal(inst.mixed(), true);
+ });
+ test('Multiple deduplicating mixins apply uniquely', () => {
+ let mixinFn1 = dedupingMixin((base) => class one extends base {
+ one(){ return true; }
+ });
+ let mixinFn2 = dedupingMixin((base) => class two extends base {
+ two(){ return true; }
+ });
+ class base {}
+ let app1 = mixinFn1(base);
+ let app2 = mixinFn2(app1);
+ let app3 = mixinFn1(app2);
+ assert.equal(app3, app2);
+ let inst = new app3();
+ assert.equal(inst.one(), true);
+ assert.equal(inst.two(), true);
+ });
+ test('Classes with mixins do not share mixin sets', () => {
+ let mixinFn1 = dedupingMixin((base) => class one extends base {
+ one(){ return true; }
+ });
+ let mixinFn2 = dedupingMixin((base) => class two extends base {
+ two(){ return true; }
+ });
+ let mixinFn3 = dedupingMixin((base) => class three extends base {
+ three(){ return true; }
+ });
+ class base {}
+ let app1 = mixinFn1(base);
+ let app2 = mixinFn2(app1);
+ let app3 = mixinFn3(app2);
+ let appNot2 = mixinFn3(app1);
+ assert.notEqual(appNot2.__mixinSet, app3.__mixinSet);
+ let inst = new appNot2();
+ assert.isFunction(inst.one);
+ assert.isFunction(inst.three);
+ assert.isNotFunction(inst.two);
+ });
+ });
+});
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/multi-style.html b/third_party/polymer3/bower_components/polymer/test/unit/multi-style.html
new file mode 100644
index 0000000..9d4b095
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/multi-style.html
@@ -0,0 +1,126 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+</head>
+<body>
+ <dom-module id="shared-styles">
+ <template>
+ <style>
+ #zot {
+ border: 1px solid black;
+ }
+ </style>
+ </template>
+ </dom-module>
+
+ <dom-module id="my-element">
+
+ <template>
+ <style>
+ #foo {
+ border: 2px solid green;
+ }
+ </style>
+ <style>
+ #bar {
+ border: 3px solid orange;
+ }
+ </style>
+ <div id="foo">foo</div>
+ <div id="bar">bar</div>
+ </template>
+ </dom-module>
+
+ <dom-module id="my-element2">
+
+ <template>
+ <style include="shared-styles">
+ #zug {
+ border: 4px solid red;
+ }
+ </style>
+ <div id="zug">zug</div>
+ <div id="zot">zot</div>
+ </template>
+
+ <script type="module">
+</script>
+
+ </dom-module>
+
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+import { PolymerElement } from '../../polymer-element.js';
+import { DomModule } from '../../lib/elements/dom-module.js';
+suite('elements including multiple styles', function() {
+
+ suiteSetup(function() {
+ const skip = window.ShadyDOM || !Polymer;
+ if (skip) {
+ this.skip();
+ } else {
+ class MyElement extends PolymerElement {
+ static get is() { return 'my-element'; }
+ }
+ customElements.define(MyElement.is, MyElement);
+
+ class MyElement2 extends MyElement {
+ static get is() { return 'my-element2'; }
+ static get template() {
+ Object.getPrototypeOf(this.prototype).constructor.template;
+ const t = DomModule.import(MyElement2.is, 'template');
+ const superT = MyElement.template;
+ t.content.insertBefore(superT.content.cloneNode(true), t.content.firstElementChild.nextElementSibling);
+ return t;
+ }
+ }
+ customElements.define(MyElement2.is, MyElement2);
+ }
+ });
+
+ function assertComputed(element, value, property, pseudo) {
+ var computed = getComputedStyle(element, pseudo);
+ property = property || 'border-top-width';
+ if (Array.isArray(value)) {
+ assert.oneOf(computed[property], value, 'computed style incorrect for ' + property);
+ } else {
+ assert.equal(computed[property], value, 'computed style incorrect for ' + property);
+ }
+ }
+
+ test('multiple styles preserved separately in element root and apply', function() {
+ const e = document.createElement('my-element');
+ document.body.appendChild(e);
+ const styles = e.shadowRoot.querySelectorAll('style');
+ assert.equal(styles.length, 2);
+ assertComputed(e.$.foo, '2px');
+ assertComputed(e.$.bar, '3px');
+ });
+
+ test('super class and included styles preserved separately in element root and apply', function() {
+ const e = document.createElement('my-element2');
+ document.body.appendChild(e);
+ const styles = e.shadowRoot.querySelectorAll('style');
+ assert.equal(styles.length, 4);
+ assertComputed(e.$.foo, '2px');
+ assertComputed(e.$.bar, '3px');
+ assertComputed(e.$.zug, '4px');
+ assertComputed(e.$.zot, '1px');
+ });
+
+});
+</script>
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/path-effects-elements.js b/third_party/polymer3/bower_components/polymer/test/unit/path-effects-elements.js
new file mode 100644
index 0000000..2a80f07
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/path-effects-elements.js
@@ -0,0 +1,276 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import { PropertiesMixin } from '../../lib/mixins/properties-mixin.js';
+
+import { Polymer } from '../../lib/legacy/polymer-fn.js';
+import { html } from '../../lib/utils/html-tag.js';
+class XPropertiesElement extends PropertiesMixin(HTMLElement) {
+ static get properties() {
+ return {
+ obj: Object
+ };
+ }
+ constructor() {
+ super();
+ this.resetObservers();
+ }
+ // Allow re-set objects to show in _propertiesChanged
+ _shouldPropertyChange(property, value, old) {
+ return (typeof value == 'object') ||
+ super._shouldPropertyChange(property, value, old);
+ }
+ resetObservers() {
+ this._propertiesChanged = sinon.spy();
+ }
+}
+customElements.define('x-pe', XPropertiesElement);
+Polymer({
+ is: 'x-basic',
+ properties: {
+ notifyingValue: {
+ type: Number,
+ notify: true
+ },
+ computed: {
+ computed: 'compute(notifyingValue)'
+ }
+ },
+ compute: function(val) {
+ return '[' + val + ']';
+ }
+});
+Polymer({
+ _template: html`
+ <x-basic id="basic1" notifying-value="{{obj.value}}" attrvalue\$="{{obj.value}}" othervalue="{{obj.value2}}"></x-basic>
+ <x-basic id="basic2" notifying-value="{{obj.value}}" attrvalue\$="{{obj.value}}"></x-basic>
+`,
+
+ is: 'x-compose',
+
+ properties: {
+ obj: {
+ type: Object,
+ notify: true
+ },
+ computed: {
+ computed: 'compute(obj.value)'
+ }
+ },
+
+ observers: [
+ 'objSubpathChanged(obj.*)',
+ 'objValueChanged(obj.value)',
+ ],
+
+ created: function() {
+ this.resetObservers();
+ },
+
+ resetObservers: function() {
+ this.objSubpathChanged = sinon.spy();
+ this.objValueChanged = sinon.spy();
+ },
+
+ compute: function(val) {
+ return '[' + val + ']';
+ }
+});
+Polymer({
+ _template: html`
+ <x-compose id="compose" obj="{{obj}}"></x-compose>
+`,
+
+ is: 'x-forward',
+
+ properties: {
+ obj: {
+ type: Object,
+ notify: true
+ },
+ computed: {
+ computed: 'compute(obj.value)'
+ }
+ },
+
+ observers: [
+ 'objSubpathChanged(obj.*)',
+ 'objValueChanged(obj.value)'
+ ],
+
+ created: function() {
+ this.resetObservers();
+ },
+
+ resetObservers: function() {
+ this.objSubpathChanged = sinon.spy();
+ this.objValueChanged = sinon.spy();
+ if (this.$) {
+ this.$.compose.resetObservers();
+ }
+ },
+
+ compute: function(val) {
+ return '[' + val + ']';
+ }
+});
+Polymer({
+ _template: html`
+ <x-basic id="basic" notifying-value="{{nested.obj.value}}" attrvalue\$="{{nested.obj.value}}"></x-basic>
+ <x-compose id="compose" obj="{{nested.obj}}"></x-compose>
+ <x-forward id="forward" obj="{{nested.obj}}"></x-forward>
+ <div id="boundChild" computed-from-paths="{{computeFromPaths(a, nested.b, nested.obj.c)}}" array-length="{{data.length}}"></div>
+ <x-pe id="pe" obj="[[nested.obj]]"></x-pe>
+`,
+
+ is: 'x-stuff',
+
+ properties: {
+ nested: {
+ observer: 'nestedChanged'
+ },
+ computedFromPaths: {
+ computed: 'computeFromPaths(a, nested.b, nested.obj.c)'
+ },
+ computedFromLinkedPaths: {
+ computed: 'computeFromLinkedPaths(a, linked1.prop, linked2.prop)'
+ },
+ computed: {
+ computed: 'compute(nested.obj.value)'
+ }
+ },
+
+ observers: [
+ 'nestedSubpathChanged(nested.*)',
+ 'nestedObjChanged(nested.obj)',
+ 'nestedObjSubpathChanged(nested.obj.*)',
+ 'nestedObjValueChanged(nested.obj.value)',
+ 'multipleChanged(a, b, nested.obj.*)',
+ 'multiplePathsChanged(a, nested.b, nested.obj.c)',
+ 'arrayChanged(array.splices)',
+ 'arrayChangedDeep(array.*)',
+ 'arrayNoCollChanged(arrayNoColl.splices)',
+ 'arrayOrPropChanged(prop, array.splices)',
+ // a has other (computed) effects; x & y don't, which allows testing
+ // different code paths in linkPaths tests
+ 'aChanged(a.*)',
+ 'xChanged(x.*)',
+ 'yChanged(y.*)',
+ ],
+
+ created: function() {
+ this.resetObservers();
+ },
+
+ resetObservers: function() {
+ this.nestedChanged = sinon.spy();
+ this.nestedSubpathChanged = sinon.spy();
+ this.nestedObjChanged = sinon.spy();
+ this.nestedObjSubpathChanged = sinon.spy();
+ this.nestedObjValueChanged = sinon.spy();
+ this.multipleChanged = sinon.spy();
+ this.multiplePathsChanged = sinon.spy();
+ this.arrayChanged = sinon.spy(function(splices) {
+ this.arraySplices = splices;
+ });
+ this.arrayChangedDeep = sinon.spy();
+ this.arrayNoCollChanged = sinon.spy();
+ this.arrayOrPropChanged = sinon.spy();
+ this.aChanged = sinon.spy();
+ this.xChanged = sinon.spy();
+ this.yChanged = sinon.spy();
+ if (this.$) {
+ this.$.compose.resetObservers();
+ this.$.forward.resetObservers();
+ this.$.pe.resetObservers();
+ }
+ },
+
+ computeFromPaths: function(a, b, c) {
+ return a + b + c;
+ },
+
+ computeFromLinkedPaths: sinon.spy(function(a, b, c) {
+ return a + b + c;
+ }),
+
+ compute: function(val) {
+ return '[' + val + ']';
+ }
+});
+Polymer({
+ is: 'x-reentry-client',
+ properties: {
+ prop: {
+ notify: true
+ }
+ },
+ observers: ['objChanged(obj.*)'],
+ created: function() {
+ this.objChanged = sinon.spy(this.objChanged);
+ },
+ objChanged: function(info) {
+ if (info.path !== 'obj') {
+ this.prop++;
+ }
+ }
+});
+Polymer({
+ _template: html`
+ <x-reentry-client obj="{{obj}}" prop="{{prop}}"></x-reentry-client>
+`,
+
+ is: 'x-reentry-host',
+
+ properties: {
+ obj: {
+ value: function() {
+ return {prop: 0};
+ }
+ },
+ prop: {
+ value: 0
+ }
+ },
+
+ observers: ['objChanged(obj.*)'],
+
+ created: function() {
+ this.objChanged = sinon.spy();
+ }
+});
+Polymer({
+ is: 'x-path-client',
+ observers: ['objChanged(obj.*)'],
+ objChanged: function() {}
+});
+Polymer({
+ _template: html`
+ <x-path-client id="client" obj="{{obj}}"></x-path-client>
+`,
+
+ is: 'x-path-host',
+
+ properties: {
+ obj: {
+ value: function() {
+ return {prop: 0};
+ }
+ },
+ prop: {
+ value: 0
+ }
+ },
+
+ observers: ['objChanged(obj.*)'],
+
+ created: function() {
+ this.objChanged = sinon.spy();
+ }
+});
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/path-effects.html b/third_party/polymer3/bower_components/polymer/test/unit/path-effects.html
new file mode 100644
index 0000000..b597469
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/path-effects.html
@@ -0,0 +1,1123 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+ <script type="module" src="./path-effects-elements.js"></script>
+<body>
+
+<script type="module">
+import './path-effects-elements.js';
+import { Polymer } from '../../lib/legacy/polymer-fn.js';
+
+// Safari 9 has a horrible bug related to array enumeration after defining
+// a non-enumerable property on it (we do for `.splices`); for now we work
+// around chai's deepEqual implementation that enumerates array keys using
+// `for in` in the specific case the bug causes an assert failure
+function arraysEqual(a, b) {
+ for (var i=0; i<a.length; i++) {
+ if (a[i] !== b[i]) {
+ throw new Error('expected ' + a + ' to equal ' + b);
+ }
+ }
+ if (a.length != b.length) {
+ throw new Error('expected ' + a + ' to equal ' + b);
+ }
+}
+
+suite('basic path bindings', function() {
+
+ var el;
+
+ setup(function() {
+ el = document.createElement('x-stuff');
+ document.body.appendChild(el);
+ });
+
+ teardown(function() {
+ document.body.removeChild(el);
+ });
+
+ function verifyObserverOutput(nestingLevel, nested, done) {
+ assert.equal(el.computed, '[' + nested.obj.value + ']');
+ assert.equal(el.nestedChanged.callCount, nestingLevel == 0 ? 1 : 0);
+ if (nestingLevel == 0) {
+ assert.equal(el.nestedChanged.firstCall.args[0], nested);
+ }
+ assert.equal(el.nestedSubpathChanged.callCount, 1);
+ assert.equal(el.nestedObjChanged.callCount, nestingLevel <= 1 ? 1 : 0);
+ if (nestingLevel <= 1) {
+ assert.equal(el.nestedObjChanged.firstCall.args[0], nested.obj);
+ }
+ assert.equal(el.nestedObjSubpathChanged.callCount, 1);
+ assert.equal(el.nestedObjSubpathChanged.firstCall.args[0].base, nested.obj);
+ assert.equal(el.nestedObjValueChanged.callCount, 1);
+ assert.equal(el.nestedObjValueChanged.firstCall.args[0], nested.obj.value);
+ assert.equal(el.nestedSubpathChanged.callCount, 1);
+ assert.equal(el.nestedSubpathChanged.firstCall.args[0].base, nested);
+ assert.equal(el.$.compose.computed, '[' + nested.obj.value + ']');
+ assert.equal(el.$.compose.objSubpathChanged.callCount, 1);
+ assert.equal(el.$.compose.objSubpathChanged.firstCall.args[0].base, nested.obj);
+ assert.equal(el.$.compose.objValueChanged.callCount, 1);
+ assert.equal(el.$.compose.objValueChanged.firstCall.args[0], nested.obj.value);
+ assert.equal(el.$.forward.computed, '[' + nested.obj.value + ']');
+ assert.equal(el.$.forward.objSubpathChanged.callCount, 1);
+ assert.equal(el.$.forward.objSubpathChanged.firstCall.args[0].base, nested.obj);
+ assert.equal(el.$.forward.objValueChanged.callCount, 1);
+ assert.equal(el.$.forward.objValueChanged.firstCall.args[0], nested.obj.value);
+ assert.equal(el.$.basic.computed, '[' + nested.obj.value + ']');
+ assert.equal(el.$.basic.notifyingValue, 42);
+ assert.equal(el.$.basic.notifyingValue, 42);
+ assert.equal(el.$.compose.$.basic1.computed, '[' + nested.obj.value + ']');
+ assert.equal(el.$.compose.$.basic1.notifyingValue, 42);
+ assert.equal(el.$.compose.$.basic2.computed, '[' + nested.obj.value + ']');
+ assert.equal(el.$.compose.$.basic2.notifyingValue, 42);
+ assert.equal(el.$.forward.$.compose.$.basic1.computed, '[' + nested.obj.value + ']');
+ assert.equal(el.$.forward.$.compose.$.basic1.notifyingValue, 42);
+ assert.equal(el.$.forward.$.compose.$.basic2.computed, '[' + nested.obj.value + ']');
+ assert.equal(el.$.forward.$.compose.$.basic2.notifyingValue, 42);
+ assert.equal(el.$.basic.getAttribute('attrvalue'), '42');
+ assert.equal(el.$.compose.$.basic1.getAttribute('attrvalue'), '42');
+ assert.equal(el.$.compose.$.basic2.getAttribute('attrvalue'), '42');
+ assert.equal(el.$.forward.$.compose.$.basic1.getAttribute('attrvalue'), '42');
+ assert.equal(el.$.forward.$.compose.$.basic2.getAttribute('attrvalue'), '42');
+ assert.equal(el.$.pe.obj, nested.obj);
+ switch (nestingLevel) {
+ case 0:
+ assert.equal(el.nestedSubpathChanged.firstCall.args[0].path, 'nested');
+ assert.equal(el.nestedSubpathChanged.firstCall.args[0].value, nested);
+ assert.equal(el.nestedObjSubpathChanged.firstCall.args[0].path, 'nested.obj');
+ assert.equal(el.nestedObjSubpathChanged.firstCall.args[0].value, nested.obj);
+ assert.equal(el.$.compose.objSubpathChanged.firstCall.args[0].path, 'obj');
+ assert.equal(el.$.compose.objSubpathChanged.firstCall.args[0].value, nested.obj);
+ assert.equal(el.$.forward.objSubpathChanged.firstCall.args[0].path, 'obj');
+ assert.equal(el.$.forward.objSubpathChanged.firstCall.args[0].value, nested.obj);
+ assert.equal(el.$.forward.$.compose.objSubpathChanged.firstCall.args[0].path, 'obj');
+ assert.equal(el.$.forward.$.compose.objSubpathChanged.firstCall.args[0].value, nested.obj);
+ // x-pe uses async PropertiesChanged
+ setTimeout(() => {
+ assert.equal(el.$.pe._propertiesChanged.callCount, 1);
+ assert.equal(el.$.pe._propertiesChanged.firstCall.args[1].obj, nested.obj);
+ done();
+ });
+ break;
+ case 1:
+ assert.equal(el.nestedSubpathChanged.firstCall.args[0].path, 'nested.obj');
+ assert.equal(el.nestedSubpathChanged.firstCall.args[0].value, nested.obj);
+ assert.equal(el.nestedObjSubpathChanged.firstCall.args[0].path, 'nested.obj');
+ assert.equal(el.nestedObjSubpathChanged.firstCall.args[0].value, nested.obj);
+ assert.equal(el.$.compose.objSubpathChanged.firstCall.args[0].path, 'obj');
+ assert.equal(el.$.compose.objSubpathChanged.firstCall.args[0].value, nested.obj);
+ assert.equal(el.$.forward.objSubpathChanged.firstCall.args[0].path, 'obj');
+ assert.equal(el.$.forward.objSubpathChanged.firstCall.args[0].value, nested.obj);
+ assert.equal(el.$.forward.$.compose.objSubpathChanged.firstCall.args[0].path, 'obj');
+ assert.equal(el.$.forward.$.compose.objSubpathChanged.firstCall.args[0].value, nested.obj);
+ // x-pe uses async PropertiesChanged
+ setTimeout(() => {
+ assert.equal(el.$.pe._propertiesChanged.callCount, 1);
+ assert.equal(el.$.pe._propertiesChanged.firstCall.args[1].obj, nested.obj);
+ done();
+ });
+ break;
+ case 2:
+ assert.equal(el.nestedSubpathChanged.firstCall.args[0].path, 'nested.obj.value');
+ assert.equal(el.nestedSubpathChanged.firstCall.args[0].value, 42);
+ assert.equal(el.nestedObjSubpathChanged.firstCall.args[0].path, 'nested.obj.value');
+ assert.equal(el.nestedObjSubpathChanged.firstCall.args[0].value, 42);
+ assert.equal(el.$.compose.objSubpathChanged.firstCall.args[0].path, 'obj.value');
+ assert.equal(el.$.compose.objSubpathChanged.firstCall.args[0].value, 42);
+ assert.equal(el.$.forward.objSubpathChanged.firstCall.args[0].path, 'obj.value');
+ assert.equal(el.$.forward.objSubpathChanged.firstCall.args[0].value, 42);
+ assert.equal(el.$.forward.$.compose.objSubpathChanged.firstCall.args[0].path, 'obj.value');
+ assert.equal(el.$.forward.$.compose.objSubpathChanged.firstCall.args[0].value, 42);
+ // x-pe uses async PropertiesChanged
+ setTimeout(() => {
+ // Note the PropertiesMixin element only sees a deep set to 'nested.obj.value'
+ // because it overrides _shouldPropertyChange to allow object re-sets through
+ assert.equal(el.$.pe._propertiesChanged.callCount, 1);
+ assert.equal(el.$.pe._propertiesChanged.firstCall.args[1].obj, nested.obj);
+ done();
+ });
+ break;
+ }
+ }
+
+ test('downward data flow', function(done) {
+ // Do the thing
+ el.nested = {
+ obj: {
+ value: 42
+ }
+ };
+ // Verify
+ verifyObserverOutput(0, el.nested, done);
+ });
+
+ test('notification from basic element property change', function(done) {
+ // Setup
+ el.nested = {
+ obj: {
+ value: 41
+ }
+ };
+ el.resetObservers();
+ // Do the thing
+ el.$.basic.notifyingValue = 42;
+ // Verify
+ verifyObserverOutput(2, el.nested, done);
+ });
+
+ test('notification from composed element property change', function(done) {
+ // Setup
+ el.nested = {
+ obj: {
+ value: 41
+ }
+ };
+ el.resetObservers();
+ // Do the thing
+ el.$.compose.$.basic1.notifyingValue = 42;
+ // Verify
+ verifyObserverOutput(2, el.nested, done);
+ });
+
+ test('notification from forward\'s composed element property change', function(done) {
+ // Setup
+ el.nested = {
+ obj: {
+ value: 41
+ }
+ };
+ el.resetObservers();
+ // Do the thing
+ el.$.forward.$.compose.$.basic1.notifyingValue = 42;
+ // Verify
+ verifyObserverOutput(2, el.nested, done);
+ });
+
+ test('notification from set in top element', function(done) {
+ // Setup
+ el.nested = {
+ obj: {
+ value: 41
+ }
+ };
+ el.resetObservers();
+ // Do the thing
+ el.set('nested.obj.value', 42);
+ // Verify
+ verifyObserverOutput(2, el.nested, done);
+ });
+
+ test('notification from set in composed element', function(done) {
+ // Setup
+ el.nested = {
+ obj: {
+ value: 41
+ }
+ };
+ el.resetObservers();
+ // Do the thing
+ el.$.compose.set('obj.value', 42);
+ // Verify
+ verifyObserverOutput(2, el.nested, done);
+ });
+
+ test('notification from set in forward element', function(done) {
+ // Setup
+ el.nested = {
+ obj: {
+ value: 41
+ }
+ };
+ el.resetObservers();
+ // Do the thing
+ el.$.forward.set('obj.value', 42);
+ // Verify
+ verifyObserverOutput(2, el.nested, done);
+ });
+
+ test('notification from set in forward\'s composed element', function(done) {
+ // Setup
+ el.nested = {
+ obj: {
+ value: 41
+ }
+ };
+ el.resetObservers();
+ // Do the thing
+ el.$.forward.$.compose.set('obj.value', 42);
+ // Verify
+ verifyObserverOutput(2, el.nested, done);
+ });
+
+ test('notification from object change in compose element', function(done) {
+ // Setup
+ el.nested = {
+ obj: {
+ value: 41
+ }
+ };
+ el.resetObservers();
+ // Do the thing
+ el.$.compose.obj = {
+ value: 42
+ };
+ // Verify
+ verifyObserverOutput(1, el.nested, done);
+ });
+
+ test('notification from object change in forward element', function(done) {
+ // Setup
+ el.nested = {
+ obj: {
+ value: 41
+ }
+ };
+ el.resetObservers();
+ // Do the thing
+ el.$.forward.obj = {
+ value: 42
+ };
+ // Verify
+ verifyObserverOutput(1, el.nested, done);
+ });
+
+ test('notification from object change in forward\'s compose element', function(done) {
+ // Setup
+ el.nested = {
+ obj: {
+ value: 41
+ }
+ };
+ el.resetObservers();
+ // Do the thing
+ // Do the thing
+ el.$.forward.$.compose.obj = {
+ value: 42
+ };
+ // Verify
+ verifyObserverOutput(1, el.nested, done);
+ });
+
+ test('cached paths get invalidated by object sets', function() {
+ el.nested = {obj: { value: 'initial' }};
+ assert.equal(el.$.forward.$.compose.$.basic1.notifyingValue, 'initial');
+ el.$.forward.$.compose.$.basic1.notifyingValue = 'correct';
+ assert.equal(el.$.forward.$.compose.$.basic1.notifyingValue, 'correct');
+ el.nested = {obj: { value: 'wrong' }};
+ assert.equal(el.$.forward.$.compose.$.basic1.notifyingValue, 'wrong');
+ el.set('nested.obj.value', 'correct');
+ assert.equal(el.$.forward.$.compose.$.basic1.notifyingValue, 'correct');
+ });
+
+ test('similarly named properties', function() {
+ var nested = {
+ obj: {
+ value: 41,
+ value2: 99
+ }
+ };
+ el.nested = nested;
+ assert.equal(el.$.compose.$.basic1.notifyingValue, 41);
+ assert.equal(el.$.compose.$.basic1.othervalue, 99);
+ el.set('nested.obj.value', 42);
+ assert.equal(el.$.compose.$.basic1.notifyingValue, 42);
+ assert.equal(el.$.compose.$.basic1.othervalue, 99);
+ el.set('nested.obj.value2', 98);
+ assert.equal(el.$.compose.$.basic1.notifyingValue, 42);
+ assert.equal(el.$.compose.$.basic1.othervalue, 98);
+ });
+
+});
+
+suite('path effects', function() {
+
+ var el;
+
+ setup(function() {
+ el = document.createElement('x-stuff');
+ document.body.appendChild(el);
+ });
+
+ teardown(function() {
+ document.body.removeChild(el);
+ });
+
+ test('observer with multiple args, object last', function() {
+ // Setup
+ var nested = {
+ obj: {
+ value: 42
+ }
+ };
+ // Do the thing
+ el.setProperties({
+ a: 'a',
+ b: 'b',
+ nested: nested
+ });
+ // Verify
+ assert.equal(el.multipleChanged.callCount, 1);
+ assert.equal(el.multipleChanged.firstCall.args[0], 'a');
+ assert.equal(el.multipleChanged.firstCall.args[1], 'b');
+ assert.equal(el.multipleChanged.firstCall.args[2].path, 'nested.obj');
+ assert.equal(el.multipleChanged.firstCall.args[2].value, nested.obj);
+ assert.equal(el.multipleChanged.firstCall.args[2].base, nested.obj);
+ });
+
+ test('observer with multiple args, object not last', function() {
+ // Setup
+ var nested = {
+ obj: {
+ value: 42
+ }
+ };
+ // Do the thing
+ el.setProperties({
+ a: 'a',
+ nested: nested,
+ b: 'b'
+ });
+ // Verify
+ assert.equal(el.multipleChanged.callCount, 1);
+ assert.equal(el.multipleChanged.firstCall.args[0], 'a');
+ assert.equal(el.multipleChanged.firstCall.args[1], 'b');
+ assert.equal(el.multipleChanged.firstCall.args[2].path, 'nested.obj');
+ assert.equal(el.multipleChanged.firstCall.args[2].value, nested.obj);
+ assert.equal(el.multipleChanged.firstCall.args[2].base, nested.obj);
+ });
+
+ test('observer with multiple args, object first, then last', function() {
+ // Setup
+ var nested = {
+ obj: {
+ value: 42
+ }
+ };
+ el.nested = nested;
+ el.resetObservers();
+ // Do the thing
+ el.setProperties({
+ a: 'a',
+ b: 'b'
+ });
+ // Verify
+ assert.equal(el.multipleChanged.callCount, 1);
+ assert.equal(el.multipleChanged.firstCall.args[0], 'a');
+ assert.equal(el.multipleChanged.firstCall.args[1], 'b');
+ assert.equal(el.multipleChanged.firstCall.args[2].path, 'nested.obj');
+ assert.equal(el.multipleChanged.firstCall.args[2].value, nested.obj);
+ assert.equal(el.multipleChanged.firstCall.args[2].base, nested.obj);
+
+ // Do another thing
+ el.set('nested.obj.value', 43);
+ // Verify
+ assert.equal(el.multipleChanged.callCount, 2);
+ assert.equal(el.multipleChanged.secondCall.args[0], 'a');
+ assert.equal(el.multipleChanged.secondCall.args[1], 'b');
+ assert.equal(el.multipleChanged.secondCall.args[2].path, 'nested.obj.value');
+ assert.equal(el.multipleChanged.secondCall.args[2].value, 43);
+ assert.equal(el.multipleChanged.secondCall.args[2].base, nested.obj);
+ });
+
+ test('observer & computed with multiple path args', function() {
+ // Setup
+ var nested = {
+ b: 33,
+ obj: {
+ c: 66
+ }
+ };
+ var a = 1;
+ // Do the thing
+ el.setProperties({
+ a: a,
+ nested: nested
+ });
+ // Verify
+ assert.equal(el.multiplePathsChanged.callCount, 1);
+ assert.equal(el.multiplePathsChanged.firstCall.args[0], 1);
+ assert.equal(el.multiplePathsChanged.firstCall.args[1], 33);
+ assert.equal(el.multiplePathsChanged.firstCall.args[2], 66);
+ assert.equal(el.computedFromPaths, 100);
+ assert.equal(el.$.boundChild.computedFromPaths, 100);
+
+ el.set('a', a + 10);
+ assert.equal(el.$.boundChild.computedFromPaths, 110);
+
+ el.set('nested.b', nested.b + 10);
+ assert.equal(el.$.boundChild.computedFromPaths, 120);
+
+ el.set('nested.obj.c', nested.obj.c + 10);
+ assert.equal(el.$.boundChild.computedFromPaths, 130);
+ });
+
+ test('array.splices notified', function() {
+ el.arrayNoColl = [];
+ assert.equal(el.arrayNoCollChanged.callCount, 1);
+ el.push('arrayNoColl', 1, 2, 3);
+ assert.equal(el.arrayNoCollChanged.callCount, 2);
+ el.push('arrayNoColl', 4, 5, 6);
+ assert.equal(el.arrayNoCollChanged.callCount, 3);
+ });
+
+ test('ensure splices sent into userland dont get nulled', function(){
+ el.array = [];
+ el.push('array', 1, 2, 3);
+ assert.notEqual(el.arraySplices.indexSplices, null);
+ });
+
+ test('array.splices notified, multiple args, prop first', function() {
+ var array = [];
+ el.setProperties({
+ array: array,
+ prop: 'first'
+ });
+ assert.equal(el.arrayOrPropChanged.callCount, 1);
+ el.push('array', 1, 2, 3);
+ assert.equal(el.arrayOrPropChanged.callCount, 2);
+ el.push('array', 4, 5, 6);
+ assert.equal(el.arrayOrPropChanged.callCount, 3);
+ });
+
+ test('array.splices notified, multiple args, prop last', function() {
+ el.array = [];
+ el.push('array', 1, 2, 3);
+ el.prop = 'last';
+ // Twice for array (.splices & .length), once for prop
+ assert.equal(el.arrayOrPropChanged.callCount, 3);
+ });
+
+ test('array.length notified', function() {
+ el.data = [];
+ assert.equal(el.$.boundChild.arrayLength, el.data.length);
+ el.push('data', 1, 2, 3);
+ assert.equal(el.$.boundChild.arrayLength, el.data.length);
+ el.pop('data');
+ el.pop('data');
+ assert.equal(el.$.boundChild.arrayLength, el.data.length);
+ el.unshift('data', 4, 5);
+ el.unshift('data', 6, 7, 8);
+ assert.equal(el.$.boundChild.arrayLength, el.data.length);
+ el.splice('data', 9, 10, 11, 12, 13);
+ assert.equal(el.$.boundChild.arrayLength, el.data.length);
+ el.shift('data');
+ el.shift('data');
+ el.shift('data');
+ assert.equal(el.$.boundChild.arrayLength, el.data.length);
+ });
+
+ test('splice correctly deletes full array if only 1 argument is passed in', function() {
+ el.data = [1,2,3];
+ assert.equal(el.data.length, 3);
+ el.splice('data', 0);
+ assert.equal(el.data.length, 0);
+ });
+
+});
+
+suite('path API', function() {
+
+ var el;
+
+ setup(function() {
+ el = document.createElement('x-stuff');
+ document.body.appendChild(el);
+ });
+
+ teardown(function() {
+ document.body.removeChild(el);
+ });
+
+ test('get', function() {
+ el.simple = 11;
+ el.nested = {
+ again: {
+ again: {
+ wayOverThere: 99
+ },
+ there: 55
+ },
+ here: 42
+ };
+ assert.equal(el.get('simple'), 11);
+ assert.equal(el.get('nested'), el.nested);
+ assert.equal(el.get('nested.here'), 42);
+ assert.equal(el.get(['nested', 'again']), el.nested.again);
+ assert.equal(el.get('nested.again.there'), 55);
+ assert.equal(el.get('nested.again.again'), el.nested.again.again);
+ assert.equal(el.get(['nested', 'again.again', 'wayOverThere']), 99);
+ });
+
+ test('set', function() {
+ el.set('simple', 11);
+ el.set('nested', {});
+ el.set('nested.here', 42);
+ el.set(['nested', 'again'], {});
+ el.set('nested.again.there', 55);
+ el.set('nested.again.again', {});
+ el.set(['nested', 'again.again', 'wayOverThere'], 99);
+ el.set(['again.thereToo'], 111, el.nested.again);
+ assert.equal(el.simple, 11);
+ assert.equal(el.get('simple'), 11);
+ assert.equal(el.get('nested'), el.nested);
+ assert.equal(el.nested.here, 42);
+ assert.equal(el.get('nested.here'), 42);
+ assert.equal(el.get('nested.again'), el.nested.again);
+ assert.equal(el.nested.again.there, 55);
+ assert.equal(el.get('nested.again.there'), 55);
+ assert.equal(el.get('nested.again.again'), el.nested.again.again);
+ assert.equal(el.nested.again.again.wayOverThere, 99);
+ assert.equal(el.get('nested.again.again.wayOverThere'), 99);
+ assert.equal(el.nested.again.again.thereToo, 111);
+ assert.equal(el.get('nested.again.again.thereToo'), 111);
+ });
+
+ test('notifyPath basic', function() {
+ el.a = {b: {c: 0}};
+ el.resetObservers();
+ el.a.b.c = 55;
+ el.notifyPath('a.b.c');
+ assert.isTrue(el.aChanged.calledOnce);
+ assert.equal(el.aChanged.firstCall.args[0].path, 'a.b.c');
+ assert.equal(el.aChanged.firstCall.args[0].value, 55);
+ assert.equal(el.get('a.b.c'), 55);
+ });
+
+ test('notifyPath with array path argument', function() {
+ el.a = {b: {c: 0}};
+ el.resetObservers();
+ el.a.b.c = 56;
+ el.notifyPath(['a', 'b.c']);
+ assert.isTrue(el.aChanged.calledOnce);
+ assert.equal(el.aChanged.firstCall.args[0].path, 'a.b.c');
+ assert.equal(el.aChanged.firstCall.args[0].value, 56);
+ assert.equal(el.get('a.b.c'), 56);
+ });
+
+ test('notifyPath with value argument', function() {
+ el.a = {b: {c: 0}};
+ el.resetObservers();
+ el.a.b.c = 57;
+ el.notifyPath('a.b.c', 57);
+ assert.isTrue(el.aChanged.calledOnce);
+ assert.equal(el.aChanged.firstCall.args[0].path, 'a.b.c');
+ assert.equal(el.aChanged.firstCall.args[0].value, 57);
+ assert.equal(el.get('a.b.c'), 57);
+ });
+
+ test('notifyPath with value argument and array path argument', function() {
+ el.a = {b: {c: 0}};
+ el.resetObservers();
+ el.a.b.c = 57;
+ el.notifyPath(['a', 'b.c'], 57);
+ assert.isTrue(el.aChanged.calledOnce);
+ assert.equal(el.aChanged.firstCall.args[0].path, 'a.b.c');
+ assert.equal(el.aChanged.firstCall.args[0].value, 57);
+ assert.equal(el.get('a.b.c'), 57);
+ });
+
+ test('notifyPath a non-extistant does nothing', function() {
+ el.notifyPath('does.not.exist', true);
+ });
+
+ test('get array', function() {
+ el.arrayChanged = function() {};
+ el.array = [1, 2, 3];
+ el.array.array = [5, 6, 7];
+ el.array.prop = 'prop';
+ assert.equal(el.get('array'), el.array);
+ assert.equal(el.get('array.0'), 1);
+ assert.equal(el.get('array.1'), 2);
+ assert.equal(el.get('array.2'), 3);
+ assert.equal(el.get('array.array'), el.array.array);
+ assert.equal(el.get('array.array.0'), 5);
+ assert.equal(el.get('array.array.1'), 6);
+ assert.equal(el.get('array.array.2'), 7);
+ assert.equal(el.get('array.prop'), 'prop');
+ el.unshift('array', 0);
+ el.splice('array', 2, 0, 1.5);
+ el.unshift('array.array', 4);
+ el.splice('array.array', 2, 0, 5.5);
+ assert.equal(el.get('array.0'), 0);
+ assert.equal(el.get('array.1'), 1);
+ assert.equal(el.get('array.2'), 1.5);
+ assert.equal(el.get('array.3'), 2);
+ assert.equal(el.get('array.4'), 3);
+ assert.equal(el.get('array.array.0'), 4);
+ assert.equal(el.get('array.array.1'), 5);
+ assert.equal(el.get('array.array.2'), 5.5);
+ assert.equal(el.get('array.array.3'), 6);
+ assert.equal(el.get('array.array.4'), 7);
+ });
+
+ test('set array', function() {
+ el.arrayChanged = function() {};
+ el.set('array', [1, 2, 3]);
+ el.set('array.array', [5, 6, 7]);
+ el.set('array.prop', 'prop');
+ assert.equal(el.get('array'), el.array);
+ assert.equal(el.get('array.0'), 1);
+ assert.equal(el.get('array.1'), 2);
+ assert.equal(el.get('array.2'), 3);
+ assert.equal(el.get('array.array'), el.array.array);
+ assert.equal(el.get('array.array.0'), 5);
+ assert.equal(el.get('array.array.1'), 6);
+ assert.equal(el.get('array.array.2'), 7);
+ assert.equal(el.get('array.prop'), 'prop');
+ el.set(['array', 0], 81);
+ el.set(['array', 1], 82);
+ el.set(['array', 2], 83);
+ el.set(['array.array', 0], 91);
+ el.set(['array.array', 1], 92);
+ el.set(['array.array', 2], 93);
+ el.set('array.prop', 'foo');
+ assert.equal(el.get('array.0'), 81);
+ assert.equal(el.get('array.1'), 82);
+ assert.equal(el.get('array.2'), 83);
+ assert.equal(el.get('array.array.0'), 91);
+ assert.equal(el.get('array.array.1'), 92);
+ assert.equal(el.get('array.array.2'), 93);
+ assert.equal(el.get('array.prop'), 'foo');
+ // el.set(['array', '#0'], 31);
+ // el.set(['array', '#1'], 32);
+ // el.set(['array', '#2'], 33);
+ // el.set(['array.array', '#0'], 41);
+ // el.set(['array.array', '#1'], 42);
+ // el.set(['array.array', '#2'], 43);
+ });
+
+ var nop = function() {};
+
+ test('push array', function() {
+ el.arrayChanged = nop;
+ el.array = ['orig1', 'orig2', 'orig3'];
+ // var key = el.array.length;
+ el.arrayChanged = function(change) {
+ assert.strictEqual(change.indexSplices.length, 1);
+ assert.strictEqual(change.indexSplices[0].index, 3);
+ assert.strictEqual(change.indexSplices[0].addedCount, 2);
+ assert.strictEqual(change.indexSplices[0].removed.length, 0);
+ };
+ var ret = el.push('array', 'new1', 'new2');
+ assert.strictEqual(ret, 5);
+ assert.strictEqual(el.array.length, 5);
+ assert.strictEqual(el.array[0], 'orig1');
+ assert.strictEqual(el.array[1], 'orig2');
+ assert.strictEqual(el.array[2], 'orig3');
+ assert.strictEqual(el.array[3], 'new1');
+ assert.strictEqual(el.array[4], 'new2');
+ });
+
+ test('pop array', function() {
+ el.arrayChanged = nop;
+ el.array = ['orig1', 'orig2', 'orig3'];
+ // var key = el.array.length-1;
+ el.arrayChanged = function(change) {
+ assert.strictEqual(change.indexSplices.length, 1);
+ assert.strictEqual(change.indexSplices[0].index, 2);
+ assert.strictEqual(change.indexSplices[0].addedCount, 0);
+ assert.strictEqual(change.indexSplices[0].removed.length, 1);
+ assert.strictEqual(change.indexSplices[0].removed[0], 'orig3');
+ };
+ var ret = el.pop('array');
+ assert.strictEqual(ret, 'orig3');
+ assert.strictEqual(el.array.length, 2);
+ assert.strictEqual(el.array[0], 'orig1');
+ assert.strictEqual(el.array[1], 'orig2');
+ });
+
+ test('unshift array', function() {
+ el.arrayChanged = nop;
+ el.array = ['orig1', 'orig2', 'orig3'];
+ // var key = el.array.length;
+ el.arrayChanged = function(change) {
+ assert.strictEqual(change.indexSplices.length, 1);
+ assert.strictEqual(change.indexSplices[0].index, 0);
+ assert.strictEqual(change.indexSplices[0].addedCount, 2);
+ assert.strictEqual(change.indexSplices[0].removed.length, 0);
+ };
+ var ret = el.unshift('array', 'new1', 'new2');
+ assert.strictEqual(ret, 5);
+ assert.strictEqual(el.array.length, 5);
+ assert.strictEqual(el.array[0], 'new1');
+ assert.strictEqual(el.array[1], 'new2');
+ assert.strictEqual(el.array[2], 'orig1');
+ assert.strictEqual(el.array[3], 'orig2');
+ assert.strictEqual(el.array[4], 'orig3');
+ });
+
+ test('shift array', function() {
+ el.arrayChanged = nop;
+ el.array = ['orig1', 'orig2', 'orig3'];
+ el.arrayChanged = function(change) {
+ assert.strictEqual(change.indexSplices.length, 1);
+ assert.strictEqual(change.indexSplices[0].index, 0);
+ assert.strictEqual(change.indexSplices[0].addedCount, 0);
+ assert.strictEqual(change.indexSplices[0].removed.length, 1);
+ assert.strictEqual(change.indexSplices[0].removed[0], 'orig1');
+ };
+ var ret = el.shift('array');
+ assert.strictEqual(ret, 'orig1');
+ assert.strictEqual(el.array.length, 2);
+ assert.strictEqual(el.array[0], 'orig2');
+ assert.strictEqual(el.array[1], 'orig3');
+ });
+
+ test('splice array', function() {
+ el.arrayChanged = nop;
+ el.array = ['orig1', 'orig2', 'orig3'];
+ // var key = el.array.length;
+ el.arrayChanged = function(change) {
+ assert.strictEqual(change.indexSplices.length, 1);
+ assert.strictEqual(change.indexSplices[0].index, 1);
+ assert.strictEqual(change.indexSplices[0].addedCount, 2);
+ assert.strictEqual(change.indexSplices[0].removed.length, 1);
+ assert.strictEqual(change.indexSplices[0].removed[0], 'orig2');
+ };
+ var ret = el.splice('array', 1, 1, 'new1', 'new2');
+ assert.deepEqual(ret, ['orig2']);
+ assert.strictEqual(el.array.length, 4);
+ assert.strictEqual(el.array[0], 'orig1');
+ assert.strictEqual(el.array[1], 'new1');
+ assert.strictEqual(el.array[2], 'new2');
+ assert.strictEqual(el.array[3], 'orig3');
+ });
+
+ test('corner: no-op push array', function() {
+ el.arrayChanged = nop;
+ el.array = ['orig1', 'orig2', 'orig3'];
+ el.arrayChanged = function() {
+ throw new Error("should not notify");
+ };
+ var ret = el.push('array');
+ assert.deepEqual(ret, 3);
+ assert.strictEqual(el.array.length, 3);
+ assert.strictEqual(el.array[0], 'orig1');
+ assert.strictEqual(el.array[1], 'orig2');
+ assert.strictEqual(el.array[2], 'orig3');
+ });
+
+ test('corner: no-op pop array', function() {
+ el.arrayChanged = nop;
+ el.array = [];
+ el.arrayChanged = function() {
+ throw new Error("should not notify");
+ };
+ var ret = el.pop('array');
+ assert.strictEqual(ret, undefined);
+ assert.strictEqual(el.array.length, 0);
+ });
+
+ test('corner: no-op unshift array', function() {
+ el.arrayChanged = nop;
+ el.array = ['orig1', 'orig2', 'orig3'];
+ el.arrayChanged = function() {
+ throw new Error("should not notify");
+ };
+ var ret = el.unshift('array');
+ assert.deepEqual(ret, 3);
+ assert.strictEqual(el.array.length, 3);
+ assert.strictEqual(el.array[0], 'orig1');
+ assert.strictEqual(el.array[1], 'orig2');
+ assert.strictEqual(el.array[2], 'orig3');
+ });
+
+ test('corner: no-op shift array', function() {
+ el.arrayChanged = nop;
+ el.array = [];
+ el.arrayChanged = function() {
+ throw new Error("should not notify");
+ };
+ var ret = el.shift('array');
+ assert.strictEqual(ret, undefined);
+ assert.strictEqual(ret, undefined);
+ assert.strictEqual(el.array.length, 0);
+ });
+
+ test('corner: no-op splice array', function() {
+ el.arrayChanged = nop;
+ el.array = ['orig1', 'orig2', 'orig3'];
+ el.arrayChanged = function() {
+ throw new Error("should not notify");
+ };
+ var ret = el.splice('array');
+ assert.deepEqual(ret, []);
+ assert.strictEqual(el.array.length, 3);
+ assert.strictEqual(el.array[0], 'orig1');
+ assert.strictEqual(el.array[1], 'orig2');
+ assert.strictEqual(el.array[2], 'orig3');
+ });
+
+ test('corner: splice array: string args', function() {
+ el.arrayChanged = nop;
+ el.array = ['orig1', 'orig2', 'orig3'];
+ // var key = el.array.length;
+ el.arrayChanged = function(change) {
+ assert.strictEqual(change.indexSplices.length, 1);
+ assert.strictEqual(change.indexSplices[0].index, 1);
+ assert.strictEqual(change.indexSplices[0].addedCount, 2);
+ assert.strictEqual(change.indexSplices[0].removed.length, 1);
+ assert.strictEqual(change.indexSplices[0].removed[0], 'orig2');
+ };
+ var ret = el.splice('array', '1', '1', 'new1', 'new2');
+ assert.deepEqual(ret, ['orig2']);
+ assert.strictEqual(el.array.length, 4);
+ assert.strictEqual(el.array[0], 'orig1');
+ assert.strictEqual(el.array[1], 'new1');
+ assert.strictEqual(el.array[2], 'new2');
+ assert.strictEqual(el.array[3], 'orig3');
+ });
+
+ test('corner: splice array: negative start', function() {
+ el.arrayChanged = nop;
+ el.array = ['orig1', 'orig2', 'orig3'];
+ // var key = el.array.length;
+ el.arrayChanged = function(change) {
+ assert.strictEqual(change.indexSplices.length, 1);
+ assert.strictEqual(change.indexSplices[0].index, 1);
+ assert.strictEqual(change.indexSplices[0].addedCount, 2);
+ assert.strictEqual(change.indexSplices[0].removed.length, 1);
+ assert.strictEqual(change.indexSplices[0].removed[0], 'orig2');
+ };
+ var ret = el.splice('array', '-2', '1', 'new1', 'new2');
+ assert.deepEqual(ret, ['orig2']);
+ assert.strictEqual(el.array.length, 4);
+ assert.strictEqual(el.array[0], 'orig1');
+ assert.strictEqual(el.array[1], 'new1');
+ assert.strictEqual(el.array[2], 'new2');
+ assert.strictEqual(el.array[3], 'orig3');
+ });
+
+ test('link two objects', function() {
+ el.x = el.y = {};
+ el.linkPaths('y', 'x');
+ el.xChanged = sinon.spy();
+ el.yChanged = sinon.spy();
+ el.set('x.foo', 1);
+ assert.equal(el.xChanged.callCount, 1);
+ assert.equal(el.yChanged.callCount, 1);
+ el.unlinkPaths('y');
+ el.set('x.foo', 2);
+ assert.equal(el.xChanged.callCount, 2);
+ assert.equal(el.yChanged.callCount, 1);
+ });
+
+ test('link three objects', function() {
+ el.x = el.y = el.a = {};
+ el.linkPaths('y', 'x');
+ el.linkPaths('a', 'x');
+ el.xChanged = sinon.spy();
+ el.yChanged = sinon.spy();
+ el.aChanged = sinon.spy();
+ el.set('x.foo', 1);
+ assert.equal(el.xChanged.callCount, 1);
+ assert.equal(el.yChanged.callCount, 1);
+ assert.equal(el.aChanged.callCount, 1);
+ el.set('a.foo', 2);
+ assert.equal(el.xChanged.callCount, 2);
+ assert.equal(el.yChanged.callCount, 2);
+ assert.equal(el.aChanged.callCount, 2);
+ el.unlinkPaths('y');
+ el.set('a.foo', 3);
+ assert.equal(el.xChanged.callCount, 3);
+ assert.equal(el.yChanged.callCount, 2);
+ assert.equal(el.aChanged.callCount, 3);
+ });
+
+ test('multiple linked dependencies to computed property', function() {
+ let linkedObj = {prop: 'Linked'};
+ el.computeFromLinkedPaths.reset();
+ el.setProperties({
+ linked1: linkedObj,
+ linked2: linkedObj,
+ a: 'A'
+ });
+ assert.equal(el.computeFromLinkedPaths.callCount, 1);
+ assert.equal(el.computedFromLinkedPaths, 'ALinkedLinked');
+
+ el.linkPaths('linked1', 'linked2');
+ el.set('linked1.prop', 'Linked+');
+ assert.equal(el.computeFromLinkedPaths.callCount, 2);
+ assert.equal(el.computedFromLinkedPaths, 'ALinked+Linked+');
+ el.linked3 = el.linked2;
+ el.linkPaths('linked2', 'linked3');
+ el.set('linked3.prop', 'Linked++');
+ assert.equal(el.computeFromLinkedPaths.callCount, 3);
+ assert.equal(el.computedFromLinkedPaths, 'ALinked++Linked++');
+ el.set('linked2.prop', 'Linked+++');
+ assert.equal(el.computeFromLinkedPaths.callCount, 4);
+ assert.equal(el.computedFromLinkedPaths, 'ALinked+++Linked+++');
+ el.set('linked1.prop', 'Linked++++');
+ assert.equal(el.computeFromLinkedPaths.callCount, 5);
+ assert.equal(el.computedFromLinkedPaths, 'ALinked++++Linked++++');
+
+ el.linked4 = el.linked1;
+ el.linkPaths('linked4', 'linked1');
+ el.set('linked4.prop', 'Linked+++++');
+ assert.equal(el.computeFromLinkedPaths.callCount, 6);
+ assert.equal(el.computedFromLinkedPaths, 'ALinked+++++Linked+++++');
+ el.set('linked3.prop', 'Linked++++++');
+ assert.equal(el.computeFromLinkedPaths.callCount, 7);
+ assert.equal(el.computedFromLinkedPaths, 'ALinked++++++Linked++++++');
+ el.set('linked2.prop', 'Linked+++++++');
+ assert.equal(el.computeFromLinkedPaths.callCount, 8);
+ assert.equal(el.computedFromLinkedPaths, 'ALinked+++++++Linked+++++++');
+ el.set('linked1.prop', 'Linked++++++++');
+ assert.equal(el.computeFromLinkedPaths.callCount, 9);
+ assert.equal(el.computedFromLinkedPaths, 'ALinked++++++++Linked++++++++');
+
+ el.linked5 = el.linked3;
+ el.linkPaths('linked5', 'linked3');
+ el.set('linked4.prop', 'Linked+++++++++');
+ assert.equal(el.computeFromLinkedPaths.callCount, 10);
+ assert.equal(el.computedFromLinkedPaths, 'ALinked+++++++++Linked+++++++++');
+ el.set('linked3.prop', 'Linked++++++++++');
+ assert.equal(el.computeFromLinkedPaths.callCount, 11);
+ assert.equal(el.computedFromLinkedPaths, 'ALinked++++++++++Linked++++++++++');
+ el.set('linked2.prop', 'Linked+++++++++++');
+ assert.equal(el.computeFromLinkedPaths.callCount, 12);
+ assert.equal(el.computedFromLinkedPaths, 'ALinked+++++++++++Linked+++++++++++');
+ el.set('linked1.prop', 'Linked++++++++++++');
+ assert.equal(el.computeFromLinkedPaths.callCount, 13);
+ assert.equal(el.computedFromLinkedPaths, 'ALinked++++++++++++Linked++++++++++++');
+
+ el.unlinkPaths('linked4');
+ el.set('linked4.prop', 'Linked+++++++++++++');
+ assert.equal(el.computeFromLinkedPaths.callCount, 13);
+ assert.equal(el.computedFromLinkedPaths, 'ALinked++++++++++++Linked++++++++++++');
+ });
+
+ test('link two arrays', function() {
+ el.x = el.y = [];
+ el.linkPaths('y', 'x');
+ el.xChanged = sinon.spy();
+ el.yChanged = sinon.spy();
+ el.push('x', {});
+ // 2 changes for arrays (splices & length)
+ assert.equal(el.xChanged.callCount, 2);
+ assert.equal(el.yChanged.callCount, 2);
+ el.unlinkPaths('y');
+ el.push('x', {});
+ assert.equal(el.xChanged.callCount, 4);
+ assert.equal(el.yChanged.callCount, 2);
+ });
+
+ test('link three arrays', function() {
+ el.x = el.y = el.a = [];
+ el.linkPaths('y', 'x');
+ el.linkPaths('a', 'x');
+ el.xChanged = sinon.spy();
+ el.yChanged = sinon.spy();
+ el.aChanged = sinon.spy();
+ el.push('x', {});
+ // 2 changes for arrays (splices & length)
+ assert.equal(el.xChanged.callCount, 2);
+ assert.equal(el.yChanged.callCount, 2);
+ assert.equal(el.aChanged.callCount, 2);
+ el.unlinkPaths('y');
+ el.push('x', {});
+ assert.equal(el.xChanged.callCount, 4);
+ assert.equal(el.yChanged.callCount, 2);
+ assert.equal(el.aChanged.callCount, 4);
+ });
+
+ test('get from path in deep observer', function() {
+ el.arrayChanged = nop;
+ var array = [1, 2, 3];
+ // Initialize array
+ el.arrayChangedDeep = function(info) {
+ assert.strictEqual(el.get(info.path), array);
+ };
+ el.array = array;
+ // Change index 0
+ el.arrayChangedDeep = function(info) {
+ assert.strictEqual(el.get(info.path), 99);
+ };
+ el.set('array.0', 99);
+ // Unshift value
+ el.arrayChangedDeep = function(info) {
+ if (info.path == 'array.splices') {
+ assert.strictEqual(el.get(info.path), array.splices);
+ } else {
+ assert.strictEqual(el.get(info.path), 4);
+ }
+ };
+ el.unshift('array', 0);
+ // Change index 0
+ el.arrayChangedDeep = function(info) {
+ assert.strictEqual(el.get(info.path), -1);
+ };
+ el.set('array.0', -1);
+ // Verify array contents
+ arraysEqual(el.array, [-1, 99, 2, 3]);
+ });
+
+});
+
+suite('corner cases', function() {
+
+ test('malformed observer has nice message on failure', function() {
+ var thrown = false;
+ var verifyError = function(e) {
+ assert.equal(e.message, "Malformed observer expression 'foo(missingParenthesis'");
+ thrown = true;
+ };
+ try {
+ Polymer({
+ is: 'x-broken',
+ observers: ['foo(missingParenthesis']
+ }).finalize();
+ } catch (e) {
+ verifyError(e);
+ }
+
+ assert.equal(thrown, true, "No exception thrown when parsing malformed observer");
+ });
+
+ test('reentry during path processing', function() {
+ let host = document.createElement('x-reentry-host');
+ document.body.appendChild(host);
+ assert.equal(host.objChanged.callCount, 1);
+ assert.equal(host.obj.prop, 0);
+ host.set('obj.prop', host.obj.prop+1);
+ assert.equal(host.objChanged.callCount, 2);
+ assert.equal(host.objChanged.secondCall.args[0].path, 'obj.prop');
+ assert.equal(host.objChanged.secondCall.args[0].value, 1);
+ });
+
+ test('element without notify effects still notifies paths (1.x guarantee)', function() {
+ let host = document.createElement('x-path-host');
+ let listener = sinon.spy();
+ host.addEventListener('obj-changed', listener);
+ document.body.appendChild(host);
+ assert.equal(host.objChanged.callCount, 1);
+ assert.equal(host.obj.prop, 0);
+ assert.equal(listener.callCount, 0);
+ host.$.client.set('obj.prop', host.obj.prop+1);
+ assert.equal(host.objChanged.callCount, 2);
+ assert.equal(host.objChanged.secondCall.args[0].path, 'obj.prop');
+ assert.equal(host.objChanged.secondCall.args[0].value, 1);
+ assert.equal(listener.callCount, 1);
+ assert.equal(listener.firstCall.args[0].detail.path, 'obj.prop');
+ assert.equal(listener.firstCall.args[0].detail.value, 1);
+ });
+
+});
+</script>
+
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/path.html b/third_party/polymer3/bower_components/polymer/test/unit/path.html
new file mode 100644
index 0000000..a008a4e
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/path.html
@@ -0,0 +1,89 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../lib/utils/path.js"></script>
+</head>
+<body>
+
+<script type="module">
+import * as path from '../../lib/utils/path.js';
+import { isDeep } from '../../lib/utils/path.js';
+suite('path utilities', function() {
+
+ var Path;
+
+ setup(function() {
+ Path = path;
+ });
+
+ test('root()', function() {
+ assert.equal(Path.root('foo'), 'foo');
+ assert.equal(Path.root('foo.bar'), 'foo');
+ });
+
+ test('isDeep()', function() {
+ assert.equal(isDeep('foo'), false);
+ assert.equal(isDeep('foo.bar'), true);
+ });
+
+ test('isAncestor()', function() {
+ assert.equal(Path.isAncestor('foo.bar', 'foo'), true);
+
+ assert.equal(Path.isAncestor('foo.bar', 'foo.bar'), false);
+ assert.equal(Path.isAncestor('foo.bar', 'foo.baz'), false);
+ assert.equal(Path.isAncestor('foo.bar', 'fooz'), false);
+ assert.equal(Path.isAncestor('foo.bar', 'bar'), false);
+ assert.equal(Path.isAncestor('foo.bar', 'foo.bars'), false);
+ assert.equal(Path.isAncestor('foo.bar', 'foo.bar.quux'), false);
+
+
+ assert.equal(Path.isAncestor('foo.bar.baz', 'foo'), true);
+ assert.equal(Path.isAncestor('foo.bar.baz', 'foo.bar'), true);
+
+ assert.equal(Path.isAncestor('foo.bar.baz', 'foo.baz'), false);
+ assert.equal(Path.isAncestor('foo.bar.baz', 'foo.bars'), false);
+ });
+
+ test('isDescendant()', function() {
+ assert.equal(Path.isDescendant('foo.bar', 'foo.bar.baz'), true);
+ assert.equal(Path.isDescendant('foo.bar', 'foo.bar'), false);
+ assert.equal(Path.isDescendant('foo.bar', 'foo.bars'), false);
+ assert.equal(Path.isDescendant('foo.bar', 'foo'), false);
+ assert.equal(Path.isDescendant('foo.bar', 'bar'), false);
+
+ assert.equal(Path.isDescendant('foo', 'foo.bar'), true);
+ assert.equal(Path.isDescendant('foo', 'foo'), false);
+ });
+
+ test('translate()', function() {
+ assert.equal(Path.translate('foo', 'baz', 'foo.bar'),
+ 'baz.bar');
+ assert.equal(Path.translate('foo', 'quux', 'foo.bar.baz'),
+ 'quux.bar.baz');
+ assert.equal(Path.translate('foo.bar', 'quux', 'foo.bar.baz'),
+ 'quux.baz');
+ });
+
+ test('matches()', function() {
+ assert.equal(Path.matches('foo.bar','foo'), true);
+ assert.equal(Path.matches('foo.bar','foo.bar'), true);
+ assert.equal(Path.matches('foo.bar','foo.bar.baz'), true);
+ assert.equal(Path.matches('foo.bar','fooz'), false);
+ assert.equal(Path.matches('foo.bar','foo.baz'), false);
+ assert.equal(Path.matches('foo.bar','foo.bars'), false);
+ });
+});
+</script>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/polymer-dom-observeNodes.html b/third_party/polymer3/bower_components/polymer/test/unit/polymer-dom-observeNodes.html
new file mode 100644
index 0000000..3c33026
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/polymer-dom-observeNodes.html
@@ -0,0 +1,1019 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+</head>
+<body>
+
+ <dom-module id='test-self-observe'>
+ <template>
+ <slot id="slot"></slot>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+import { dom } from '../../lib/legacy/polymer.dom.js';
+Polymer({
+ is:'test-self-observe',
+ attached: function() {
+ this._observer = dom(this).observeNodes(function(info) {
+ this.info = info;
+ });
+ },
+ detached: function() {
+ dom(this).unobserveNodes(this._observer);
+ }
+});
+</script>
+ </dom-module>
+
+ <dom-module id='test-static'>
+ <template>
+ <div>static</div>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is:'test-static'
+});
+</script>
+ </dom-module>
+
+ <dom-module id='test-slot'>
+ <template>
+ <span id="slotContainer">[<slot id="slot"></slot>]</span>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is:'test-slot'
+});
+</script>
+ </dom-module>
+
+ <dom-module id='test-slot1'>
+ <template>
+ <test-slot id="slot"><slot></slot></test-slot>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is:'test-slot1'
+});
+</script>
+ </dom-module>
+
+ <dom-module id='test-slot2'>
+ <template>
+ <test-slot1 id="slot"><slot></slot></test-slot1>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is:'test-slot2'
+});
+</script>
+ </dom-module>
+
+ <dom-module id='test-slot3'>
+ <template>
+ <test-slot2 id="slot"><slot></slot></test-slot2>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is:'test-slot3'
+});
+</script>
+ </dom-module>
+
+ <dom-module id='test-slot-raw'>
+ <template>
+ <div id="slot"><slot></slot></div>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is:'test-slot-raw'
+});
+</script>
+ </dom-module>
+
+ <dom-module id='test-slot-attr'>
+ <template>
+ [<slot id="slot" name="d"></slot>]
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is:'test-slot-attr'
+});
+</script>
+ </dom-module>
+
+ <dom-module id='test-slot-attr1'>
+ <template>
+ <test-slot-attr id="slot"><slot name="c" slot="d"></slot></test-slot-attr>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is:'test-slot-attr1'
+});
+</script>
+ </dom-module>
+
+ <dom-module id='test-slot-attr2'>
+ <template>
+ <test-slot-attr1 id="slot"><slot name="b" slot="c"></slot></test-slot-attr1>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is:'test-slot-attr2'
+});
+</script>
+ </dom-module>
+
+ <dom-module id='test-slot-attr3'>
+ <template>
+ <test-slot-attr2 id="slot"><slot name="a" slot="b"></slot></test-slot-attr2>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is:'test-slot-attr3'
+});
+</script>
+ </dom-module>
+
+ <dom-module id='test-slot-attr-inside'>
+ <template>
+ <test-slot-attr3 id="slot"><slot name="a" slot="a"></slot></test-slot-attr3>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is:'test-slot-attr-inside'
+});
+</script>
+ </dom-module>
+
+
+ <test-slot><div>A</div><div>B</div></test-slot>
+
+ <test-static><div>static A</div><div>static B</div></test-static>
+
+ <div id="staticDiv"></div>
+
+<script type="module">
+import { dom } from '../../lib/legacy/polymer.dom.js';
+
+suite('observeNodes', function() {
+
+ test('observe initial state of distributing element', function() {
+ var recordedA;
+ var el = document.querySelector('test-slot');
+ var observer1 = dom(el).observeNodes(function(info) {
+ recordedA = info;
+ });
+ observer1.flush();
+ assert.equal(recordedA.addedNodes.length, 2);
+ recordedA = null;
+ var recordedB;
+ var observer2 = dom(el).observeNodes(function(info) {
+ recordedB = info;
+ });
+ observer2.flush();
+ assert.equal(recordedA, null);
+ assert.equal(recordedB.addedNodes.length, 2);
+ dom(el).unobserveNodes(observer1);
+ dom(el).unobserveNodes(observer2);
+ });
+
+ test('observe initial state of non-distributing element', function() {
+ var recordedA;
+ var el = document.querySelector('test-static');
+ var observer1 = dom(el).observeNodes(function(info) {
+ recordedA = info;
+ });
+ observer1.flush();
+ assert.equal(recordedA.addedNodes.length, 2);
+ recordedA = null;
+ var recordedB;
+ var observer2 = dom(el).observeNodes(function(info) {
+ recordedB = info;
+ });
+ observer2.flush();
+ assert.equal(recordedA, null);
+ assert.equal(recordedB.addedNodes.length, 2);
+ dom(el).unobserveNodes(observer1);
+ dom(el).unobserveNodes(observer2);
+ });
+
+ test('observeNodes called in observed node context', function(done) {
+ var el = document.createElement('test-slot');
+ document.body.appendChild(el);
+ var observer = dom(el).observeNodes(function() {
+ assert.equal(this, el);
+ done();
+ });
+ // add
+ var d = document.createElement('div');
+ dom(el).appendChild(d);
+ observer.flush();
+ });
+
+ test('observe children changes to distributing element', function() {
+ var el = document.createElement('test-slot');
+ document.body.appendChild(el);
+
+ var recorded;
+ var observer = dom(el).observeNodes(function(info) {
+ recorded = info;
+ });
+ // add
+ var d = document.createElement('div');
+ var d1 = document.createElement('div');
+ dom(el).appendChild(d);
+ dom(el).appendChild(d1);
+ observer.flush();
+ assert.equal(recorded.addedNodes.length, 2);
+ assert.equal(recorded.removedNodes.length, 0);
+ assert.equal(recorded.addedNodes[0], d);
+ assert.equal(recorded.addedNodes[1], d1);
+ // remove
+ dom(el).removeChild(d);
+ dom(el).removeChild(d1);
+ observer.flush();
+ assert.equal(recorded.addedNodes.length, 0);
+ assert.equal(recorded.removedNodes.length, 2);
+ assert.equal(recorded.removedNodes[0], d);
+ assert.equal(recorded.removedNodes[1], d1);
+ // add
+ dom(el).appendChild(d);
+ dom(el).appendChild(d1);
+ observer.flush();
+ assert.equal(recorded.addedNodes.length, 2);
+ assert.equal(recorded.addedNodes[0], d);
+ assert.equal(recorded.addedNodes[1], d1);
+ // reset, unobserve and remove
+ recorded = null;
+ dom(el).unobserveNodes(observer);
+ dom(el).removeChild(d);
+ dom(el).removeChild(d1);
+ observer.flush();
+ assert.equal(recorded, null);
+ document.body.removeChild(el);
+ });
+
+ test('observe children changes to distributing element that provoke additional changes', function() {
+ var el = document.createElement('test-slot');
+ document.body.appendChild(el);
+
+ var recordedInfo, elAddedInObserver;
+ var observerCallCount = 0;
+ var observer = dom(el).observeNodes(function(info) {
+ observerCallCount++;
+ recordedInfo = info;
+ if (dom(info.target).childNodes.length < 5) {
+ elAddedInObserver = document.createElement('div');
+ dom(info.target).appendChild(elAddedInObserver);
+ }
+
+ });
+ // add
+ var d = document.createElement('div');
+ dom(el).appendChild(d);
+ while (observer.flush()) {
+ // re-flush until done
+ }
+ assert.equal(observerCallCount, 5);
+ assert.equal(recordedInfo.addedNodes.length, 1);
+ assert.equal(recordedInfo.addedNodes[0], elAddedInObserver);
+ assert.equal(dom(el).childNodes.length, 5);
+ document.body.removeChild(el);
+ dom(el).unobserveNodes(observer);
+ });
+
+ test('observe children changes to distributing element (async)', function(done) {
+ var el = document.createElement('test-slot');
+ document.body.appendChild(el);
+
+ var nodes = [];
+ var handle = dom(el).observeNodes(function(info) {
+ for (var i=0, at; i < info.removedNodes.length; i++) {
+ at = nodes.indexOf(info.removedNodes[i]);
+ assert.isAbove(at, -1);
+ nodes.splice(at, 1);
+ }
+ nodes = nodes.concat(info.addedNodes);
+ });
+ // add
+ var d = document.createElement('div');
+ var d1 = document.createElement('div');
+ dom(el).appendChild(d);
+ dom(el).appendChild(d1);
+ setTimeout(function() {
+ assert.sameMembers(el.getEffectiveChildNodes(), nodes);
+ // remove
+ dom(el).removeChild(d);
+ dom(el).removeChild(d1);
+ setTimeout(function() {
+ assert.sameMembers(el.getEffectiveChildNodes(), nodes);
+ // add
+ dom(el).appendChild(d);
+ dom(el).appendChild(d1);
+ setTimeout(function() {
+ assert.sameMembers(el.getEffectiveChildNodes(), nodes);
+ dom(el).unobserveNodes(handle);
+ dom(el).removeChild(d);
+ dom(el).removeChild(d1);
+ setTimeout(function() {
+ assert.notEqual(nodes.length, el.getEffectiveChildNodes().length);
+ document.body.removeChild(el);
+ done();
+ });
+ });
+ });
+ });
+ });
+
+ test('observe children changes to non-distributing element', function() {
+ var el = document.createElement('test-static');
+ document.body.appendChild(el);
+
+ var recorded;
+ var observer = dom(el).observeNodes(function(info) {
+ recorded = info;
+ });
+ // add
+ var d = document.createElement('div');
+ var d1 = document.createElement('div');
+ dom(el).appendChild(d);
+ dom(el).appendChild(d1);
+ observer.flush();
+ assert.equal(recorded.addedNodes.length, 2);
+ assert.equal(recorded.removedNodes.length, 0);
+ assert.equal(recorded.addedNodes[0], d);
+ assert.equal(recorded.addedNodes[1], d1);
+ // remove
+ dom(el).removeChild(d);
+ dom(el).removeChild(d1);
+ observer.flush();
+ assert.equal(recorded.addedNodes.length, 0);
+ assert.equal(recorded.removedNodes.length, 2);
+ assert.equal(recorded.removedNodes[0], d);
+ assert.equal(recorded.removedNodes[1], d1);
+ // add
+ dom(el).appendChild(d);
+ dom(el).appendChild(d1);
+ observer.flush();
+ assert.equal(recorded.addedNodes.length, 2);
+ assert.equal(recorded.addedNodes[0], d);
+ assert.equal(recorded.addedNodes[1], d1);
+ // reset, unobserve and remove
+ recorded = null;
+ dom(el).unobserveNodes(observer);
+ dom(el).removeChild(d);
+ dom(el).removeChild(d1);
+ observer.flush();
+ assert.equal(recorded, null);
+ document.body.removeChild(el);
+ });
+
+ test('observe changes to inner node wrapping <slot>', function() {
+ var el = document.createElement('test-slot');
+ document.body.appendChild(el);
+
+ var observedInfo;
+ var observer = dom(el.$.slotContainer).observeNodes(function(info) {
+ observedInfo = info;
+ });
+ observer.flush();
+ // add
+ var d = document.createElement('div');
+ var d1 = document.createElement('div');
+ dom(el).appendChild(d);
+ dom(el).appendChild(d1);
+ observer.flush();
+ assert.equal(observedInfo.target, el.$.slotContainer);
+ assert.equal(observedInfo.addedNodes.length, 2);
+ assert.equal(observedInfo.removedNodes.length, 0);
+ // remove
+ dom(el).removeChild(d);
+ dom(el).removeChild(d1);
+ observer.flush();
+ assert.equal(observedInfo.addedNodes.length, 0);
+ assert.equal(observedInfo.removedNodes.length, 2);
+ // add
+ dom(el).appendChild(d);
+ dom(el).appendChild(d1);
+ observer.flush();
+ assert.equal(observedInfo.addedNodes.length, 2);
+ assert.equal(observedInfo.removedNodes.length, 0);
+ // reset, unobserve and remove
+ observedInfo = null;
+ dom(el.$.slotContainer).unobserveNodes(observer);
+ dom(el).removeChild(d);
+ dom(el).removeChild(d1);
+ observer.flush();
+ assert.equal(observedInfo, null);
+ document.body.removeChild(el);
+ });
+
+ test('observe changes to <slot>', function() {
+ var el = document.createElement('test-slot');
+ document.body.appendChild(el);
+
+ var observedInfo;
+ var observer = dom(el.$.slot).observeNodes(function(info) {
+ observedInfo = info;
+ });
+ observer.flush();
+ // add
+ var d = document.createElement('div');
+ var d1 = document.createElement('div');
+ dom(el).appendChild(d);
+ dom(el).appendChild(d1);
+ observer.flush();
+ assert.equal(observedInfo.target, el.$.slot);
+ assert.equal(observedInfo.addedNodes.length, 2);
+ assert.equal(observedInfo.removedNodes.length, 0);
+ // remove
+ dom(el).removeChild(d);
+ dom(el).removeChild(d1);
+ observer.flush();
+ assert.equal(observedInfo.addedNodes.length, 0);
+ assert.equal(observedInfo.removedNodes.length, 2);
+ // add
+ dom(el).appendChild(d);
+ dom(el).appendChild(d1);
+ observer.flush();
+ assert.equal(observedInfo.addedNodes.length, 2);
+ assert.equal(observedInfo.removedNodes.length, 0);
+ // reset, unobserve and remove
+ observedInfo = null;
+ dom(el.$.slot).unobserveNodes(observer);
+ dom(el).removeChild(d);
+ dom(el).removeChild(d1);
+ observer.flush();
+ assert.equal(observedInfo, null);
+ document.body.removeChild(el);
+ });
+
+ test('observe effective children inside distributing element', function() {
+ var el = document.createElement('test-slot1');
+ document.body.appendChild(el);
+
+ var recorded;
+ var observer = dom(el.$.slot).observeNodes(function(info) {
+ recorded = info;
+ });
+ observer.flush();
+ // add
+ var d = document.createElement('div');
+ var d1 = document.createElement('div');
+ dom(el).appendChild(d);
+ dom(el).appendChild(d1);
+ observer.flush();
+ assert.equal(recorded.addedNodes.length, 2);
+ assert.equal(recorded.removedNodes.length, 0);
+ assert.equal(recorded.addedNodes[0], d);
+ assert.equal(recorded.addedNodes[1], d1);
+ // remove
+ dom(el).removeChild(d);
+ dom(el).removeChild(d1);
+ observer.flush();
+ assert.equal(recorded.addedNodes.length, 0);
+ assert.equal(recorded.removedNodes.length, 2);
+ assert.equal(recorded.removedNodes[0], d);
+ assert.equal(recorded.removedNodes[1], d1);
+ // add
+ dom(el).appendChild(d);
+ dom(el).appendChild(d1);
+ observer.flush();
+ assert.equal(recorded.addedNodes.length, 2);
+ assert.equal(recorded.addedNodes[0], d);
+ assert.equal(recorded.addedNodes[1], d1);
+ // reset, unobserve and remove
+ recorded = null;
+ dom(el.$.slot).unobserveNodes(observer);
+ dom(el).removeChild(d);
+ dom(el).removeChild(d1);
+ observer.flush();
+ assert.equal(recorded, null);
+ document.body.removeChild(el);
+ });
+
+ test('observe effective children changes when adding to another host', function() {
+ var el = document.createElement('test-slot1');
+ document.body.appendChild(el);
+
+ var recorded;
+ var observer = dom(el.$.slot).observeNodes(function(info) {
+ recorded = info;
+ });
+ observer.flush();
+ // add
+ var d = document.createElement('div');
+ var d1 = document.createElement('div');
+ dom(el).appendChild(d);
+ dom(el).appendChild(d1);
+ observer.flush();
+ assert.equal(recorded.addedNodes.length, 2);
+ assert.equal(recorded.removedNodes.length, 0);
+ assert.equal(recorded.addedNodes[0], d);
+ assert.equal(recorded.addedNodes[1], d1);
+ // add somewhere else... we should see these as removes
+ dom(document.body).appendChild(d);
+ dom(document.body).appendChild(d1);
+ observer.flush();
+ assert.equal(recorded.addedNodes.length, 0);
+ assert.equal(recorded.removedNodes.length, 2);
+ assert.equal(recorded.removedNodes[0], d);
+ assert.equal(recorded.removedNodes[1], d1);
+ // cleanup
+ dom(document.body).removeChild(d);
+ dom(document.body).removeChild(d1);
+ document.body.removeChild(el);
+ dom(el.$.slot).unobserveNodes(observer);
+ });
+
+ test('observe effective children changes in static slot when adding to another host', function() {
+ var el = document.createElement('staticDiv');
+ document.body.appendChild(el);
+
+ var recorded;
+ var observer = dom(el).observeNodes(function(info) {
+ recorded = info;
+ });
+ observer.flush();
+ // add
+ var d = document.createElement('div');
+ var d1 = document.createElement('div');
+ dom(el).appendChild(d);
+ dom(el).appendChild(d1);
+ observer.flush();
+ assert.equal(recorded.addedNodes.length, 2);
+ assert.equal(recorded.removedNodes.length, 0);
+ assert.equal(recorded.addedNodes[0], d);
+ assert.equal(recorded.addedNodes[1], d1);
+ // add somewhere else... we should see these as removes
+ dom(document.body).appendChild(d);
+ dom(document.body).appendChild(d1);
+ observer.flush();
+ assert.equal(recorded.addedNodes.length, 0);
+ assert.equal(recorded.removedNodes.length, 2);
+ assert.equal(recorded.removedNodes[0], d);
+ assert.equal(recorded.removedNodes[1], d1);
+ // cleanup
+ dom(document.body).removeChild(d);
+ dom(document.body).removeChild(d1);
+ document.body.removeChild(el);
+ dom(el).unobserveNodes(observer);
+ });
+
+ test('observe effective children inside deep distributing element', function() {
+ var el = document.createElement('test-slot3');
+ document.body.appendChild(el);
+
+ var recorded;
+ var slot = el.$.slot.$.slot.$.slot;
+ var observer = dom(slot).observeNodes(function(info) {
+ recorded = info;
+ });
+ // add
+ var d = document.createElement('div');
+ var d1 = document.createElement('div');
+ dom(el).appendChild(d);
+ dom(el).appendChild(d1);
+ observer.flush();
+ assert.equal(recorded.addedNodes.length, 2);
+ assert.equal(recorded.removedNodes.length, 0);
+ assert.equal(recorded.addedNodes[0], d);
+ assert.equal(recorded.addedNodes[1], d1);
+ // remove
+ dom(el).removeChild(d);
+ dom(el).removeChild(d1);
+ observer.flush();
+ assert.equal(recorded.addedNodes.length, 0);
+ assert.equal(recorded.removedNodes.length, 2);
+ assert.equal(recorded.removedNodes[0], d);
+ assert.equal(recorded.removedNodes[1], d1);
+ // add
+ dom(el).appendChild(d);
+ dom(el).appendChild(d1);
+ observer.flush();
+ assert.equal(recorded.addedNodes.length, 2);
+ assert.equal(recorded.addedNodes[0], d);
+ assert.equal(recorded.addedNodes[1], d1);
+ // reset, unobserve and remove
+ recorded = null;
+ dom(slot).unobserveNodes(observer);
+ dom(el).removeChild(d);
+ dom(el).removeChild(d1);
+ observer.flush();
+ assert.equal(recorded, null);
+ document.body.removeChild(el);
+ });
+
+ test('observe <slot> inside deep distributing element', function() {
+ var el = document.createElement('test-slot3');
+ document.body.appendChild(el);
+
+ var recorded;
+ var slot = el.$.slot.$.slot.$.slot.$.slot;
+ assert.equal(slot.localName, 'slot');
+ var observer = dom(slot).observeNodes(function(info) {
+ recorded = info;
+ });
+ // add
+ var d = document.createElement('div');
+ var d1 = document.createElement('div');
+ dom(el).appendChild(d);
+ dom(el).appendChild(d1);
+ observer.flush();
+ assert.equal(recorded.addedNodes.length, 2);
+ assert.equal(recorded.removedNodes.length, 0);
+ assert.equal(recorded.addedNodes[0], d);
+ assert.equal(recorded.addedNodes[1], d1);
+ // remove
+ dom(el).removeChild(d);
+ dom(el).removeChild(d1);
+ observer.flush();
+ assert.equal(recorded.addedNodes.length, 0);
+ assert.equal(recorded.removedNodes.length, 2);
+ assert.equal(recorded.removedNodes[0], d);
+ assert.equal(recorded.removedNodes[1], d1);
+ // add
+ dom(el).appendChild(d);
+ dom(el).appendChild(d1);
+ observer.flush();
+ assert.equal(recorded.addedNodes.length, 2);
+ assert.equal(recorded.addedNodes[0], d);
+ assert.equal(recorded.addedNodes[1], d1);
+ // reset, unobserve and remove
+ recorded = null;
+ dom(slot).unobserveNodes(observer);
+ dom(el).removeChild(d);
+ dom(el).removeChild(d1);
+ observer.flush();
+ assert.equal(recorded, null);
+ document.body.removeChild(el);
+ });
+
+ test('observe effective children inside deep distributing element (async)', function(done) {
+ var el = document.createElement('test-slot3');
+ document.body.appendChild(el);
+
+ var recorded;
+ var slot = el.$.slot.$.slot.$.slot;
+ var observer = dom(slot).observeNodes(function(info) {
+ recorded = info;
+ });
+ // add
+ var d = document.createElement('div');
+ var d1 = document.createElement('div');
+ dom(el).appendChild(d);
+ dom(el).appendChild(d1);
+ setTimeout(function() {
+ assert.equal(recorded.addedNodes.length, 2);
+ assert.equal(recorded.removedNodes.length, 0);
+ assert.equal(recorded.addedNodes[0], d);
+ assert.equal(recorded.addedNodes[1], d1);
+ // remove
+ dom(el).removeChild(d);
+ dom(el).removeChild(d1);
+ setTimeout(function() {
+ assert.equal(recorded.addedNodes.length, 0);
+ assert.equal(recorded.removedNodes.length, 2);
+ assert.equal(recorded.removedNodes[0], d);
+ assert.equal(recorded.removedNodes[1], d1);
+ // add
+ dom(el).appendChild(d);
+ dom(el).appendChild(d1);
+ setTimeout(function() {
+ assert.equal(recorded.addedNodes.length, 2);
+ assert.equal(recorded.addedNodes[0], d);
+ assert.equal(recorded.addedNodes[1], d1);
+ // reset, unobserve and remove
+ recorded = null;
+ dom(slot).unobserveNodes(observer);
+ dom(el).removeChild(d);
+ dom(el).removeChild(d1);
+ setTimeout(function() {
+ assert.equal(recorded, null);
+ document.body.removeChild(el);
+ done();
+ });
+ });
+ });
+ });
+ });
+
+
+ test('observe effective children attr changes inside deep distributing element (async)', function(done) {
+ var el = document.createElement('test-slot-attr3');
+ document.body.appendChild(el);
+
+ var recorded;
+ var slot = el.$.slot.$.slot.$.slot;
+ var observer = dom(slot).observeNodes(function(info) {
+ recorded = info;
+ });
+ observer.flush();
+ recorded = null;
+ // add
+ var d = document.createElement('div');
+ var d1 = document.createElement('div');
+ dom(el).appendChild(d);
+ dom(el).appendChild(d1);
+ observer.flush();
+ assert.equal(recorded, null);
+ setTimeout(function() {
+ assert.equal(recorded, null);
+ dom(d).setAttribute('slot', 'a');
+ setTimeout(function() {
+ assert.equal(recorded.addedNodes.length, 1);
+ assert.equal(recorded.removedNodes.length, 0);
+ assert.equal(recorded.addedNodes[0], d);
+ dom(d).removeAttribute('slot');
+ setTimeout(function() {
+ assert.equal(recorded.addedNodes.length, 0);
+ assert.equal(recorded.removedNodes.length, 1);
+ assert.equal(recorded.removedNodes[0], d);
+ recorded = null;
+ dom(slot).unobserveNodes(observer);
+ dom(d).setAttribute('slot', 'a');
+ setTimeout(function() {
+ assert.equal(recorded, null);
+ document.body.removeChild(el);
+ done();
+ });
+ });
+ });
+ });
+ });
+
+ test('observe effective children attr changes inside deep distributing element without outer select (async)', function(done) {
+ var el = document.createElement('test-slot-attr-inside');
+ document.body.appendChild(el);
+
+ var recorded;
+ var slot = el.$.slot.$.slot.$.slot.$.slot;
+ var observer = dom(slot).observeNodes(function(info) {
+ recorded = info;
+ });
+ observer.flush();
+ recorded = null;
+ // add
+ var d = document.createElement('div');
+ var d1 = document.createElement('div');
+ dom(el).appendChild(d);
+ dom(el).appendChild(d1);
+ observer.flush();
+ assert.equal(recorded, null);
+ setTimeout(function() {
+ assert.equal(recorded, null);
+ dom(d).setAttribute('slot', 'a');
+ setTimeout(function() {
+ assert.equal(recorded.addedNodes.length, 1);
+ assert.equal(recorded.removedNodes.length, 0);
+ assert.equal(recorded.addedNodes[0], d);
+ dom(d).removeAttribute('slot');
+ setTimeout(function() {
+ assert.equal(recorded.addedNodes.length, 0);
+ assert.equal(recorded.removedNodes.length, 1);
+ assert.equal(recorded.removedNodes[0], d);
+ recorded = null;
+ dom(slot).unobserveNodes(observer);
+ dom(d).setAttribute('slot', 'a');
+ setTimeout(function() {
+ assert.equal(recorded, null);
+ document.body.removeChild(el);
+ done();
+ });
+ });
+ });
+ });
+ });
+
+ test('add/remove multiple observers', function() {
+ var el = document.createElement('test-slot1');
+ document.body.appendChild(el);
+
+ var r1 = 0;
+ var h1 = dom(el.$.slot).observeNodes(function() {
+ r1++;
+ });
+ var r2 = 0;
+ var h2 = dom(el.$.slot).observeNodes(function() {
+ r2++;
+ });
+ var r3 = 0;
+ var h3 = dom(el.$.slot).observeNodes(function() {
+ r3++;
+ });
+ // add
+ var d = document.createElement('div');
+ dom(el).appendChild(d);
+ h1.flush();
+ h2.flush();
+ h3.flush();
+ assert.equal(r1, 1);
+ assert.equal(r2, 1);
+ assert.equal(r3, 1);
+ dom(el.$.slot).unobserveNodes(h1);
+ d = document.createElement('div');
+ dom(el).appendChild(d);
+ h1.flush();
+ h2.flush();
+ h3.flush();
+ assert.equal(r1, 1);
+ assert.equal(r2, 2);
+ assert.equal(r3, 2);
+ dom(el.$.slot).unobserveNodes(h2);
+ d = document.createElement('div');
+ dom(el).appendChild(d);
+ h1.flush();
+ h2.flush();
+ h3.flush();
+ assert.equal(r1, 1);
+ assert.equal(r2, 2);
+ assert.equal(r3, 3);
+ dom(el.$.slot).unobserveNodes(h3);
+ d = document.createElement('div');
+ dom(el).appendChild(d);
+ h1.flush();
+ h2.flush();
+ h3.flush();
+ assert.equal(r1, 1);
+ assert.equal(r2, 2);
+ assert.equal(r3, 3);
+ h1 = dom(el.$.slot).observeNodes(h1.callback);
+ h2 = dom(el.$.slot).observeNodes(h2.callback);
+ h3 = dom(el.$.slot).observeNodes(h3.callback);
+ h1.flush();
+ h2.flush();
+ h3.flush();
+ assert.equal(r1, 2);
+ assert.equal(r2, 3);
+ assert.equal(r3, 4);
+ d = document.createElement('div');
+ dom(el).appendChild(d);
+ h1.flush();
+ h2.flush();
+ h3.flush();
+ assert.equal(r1, 3);
+ assert.equal(r2, 4);
+ assert.equal(r3, 5);
+ dom(el.$.slot).unobserveNodes(h3);
+ d = document.createElement('div');
+ dom(el).appendChild(d);
+ h1.flush();
+ h2.flush();
+ h3.flush();
+ assert.equal(r1, 4);
+ assert.equal(r2, 5);
+ assert.equal(r3, 5);
+ dom(el.$.slot).unobserveNodes(h2);
+ d = document.createElement('div');
+ dom(el).appendChild(d);
+ h1.flush();
+ h2.flush();
+ h3.flush();
+ assert.equal(r1, 5);
+ assert.equal(r2, 5);
+ assert.equal(r3, 5);
+ dom(el.$.slot).unobserveNodes(h1);
+ d = document.createElement('div');
+ dom(el).appendChild(d);
+ h1.flush();
+ h2.flush();
+ h3.flush();
+ assert.equal(r1, 5);
+ assert.equal(r2, 5);
+ assert.equal(r3, 5);
+ });
+
+ test('observe changes of target with dynamically added <slot>', function() {
+ var el = document.createElement('test-static');
+ document.body.appendChild(el);
+ var container = el.shadowRoot.childNodes[1];
+ var recorded = null;
+ var observer = dom(container).observeNodes(function(info) {
+ recorded = info;
+ });
+ var slot = document.createElement('slot');
+ container.appendChild(slot);
+ observer.flush();
+ recorded = null;
+ var child = document.createElement('div');
+ el.appendChild(child);
+ observer.flush();
+ assert.equal(recorded.addedNodes.length, 1);
+ assert.equal(recorded.addedNodes[0], child);
+ recorded = null;
+ el.removeChild(child);
+ observer.flush();
+ assert.equal(recorded.removedNodes.length, 1);
+ assert.equal(recorded.removedNodes[0], child);
+ recorded = null;
+ container.removeChild(slot);
+ observer.flush();
+ el.appendChild(child);
+ assert.equal(recorded, null);
+ dom(container).unobserveNodes(observer);
+ document.body.removeChild(el);
+ });
+
+ test('observe changes of target with dynamically added <slot> (flush/async)', function(done) {
+ var el = document.createElement('test-static');
+ document.body.appendChild(el);
+ var container = el.shadowRoot.childNodes[1];
+ var recorded = null;
+ var observer = dom(container).observeNodes(function(info) {
+ recorded = info;
+ });
+ var slot = document.createElement('slot');
+ container.appendChild(slot);
+ observer.flush();
+ recorded = null;
+ var child = document.createElement('div');
+ el.appendChild(child);
+ setTimeout(function() {
+ assert.equal(recorded.addedNodes.length, 1);
+ assert.equal(recorded.addedNodes[0], child);
+ done();
+ });
+ });
+
+ test('observe changes of target with dynamically added <slot> (async)', function(done) {
+ var el = document.createElement('test-static');
+ document.body.appendChild(el);
+ var container = el.shadowRoot.childNodes[1];
+ var recorded = null;
+ var observer = dom(container).observeNodes(function(info) {
+ recorded = info;
+ });
+ var slot = document.createElement('slot');
+ container.appendChild(slot);
+ observer.flush();
+ recorded = null;
+ var child = document.createElement('div');
+ el.appendChild(child);
+ setTimeout(function() {
+ assert.equal(recorded.addedNodes.length, 1);
+ assert.equal(recorded.addedNodes[0], child);
+ recorded = null;
+ el.removeChild(child);
+ setTimeout(function() {
+ assert.equal(recorded.removedNodes.length, 1);
+ assert.equal(recorded.removedNodes[0], child);
+ recorded = null;
+ container.removeChild(slot);
+ setTimeout(function() {
+ el.appendChild(child);
+ assert.equal(recorded, null);
+ dom(container).unobserveNodes(observer);
+ document.body.removeChild(el);
+ done();
+ });
+ });
+ });
+ });
+
+ test('element distributed to insertion point observing itself', function() {
+ var host = document.createElement('test-slot');
+ var el = document.createElement('test-self-observe');
+ host.appendChild(el);
+ document.body.appendChild(host);
+ if (window.ShadyDOM) {
+ ShadyDOM.flush();
+ }
+ assert.ok(el._observer);
+ var div = document.createElement('div');
+ el.appendChild(div);
+ el._observer.flush();
+ assert.equal(el.info.addedNodes[0], div);
+ document.body.removeChild(host);
+ });
+
+});
+</script>
+
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/polymer-dom.html b/third_party/polymer3/bower_components/polymer/test/unit/polymer-dom.html
new file mode 100644
index 0000000..8bea7e1
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/polymer-dom.html
@@ -0,0 +1,349 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+</head>
+<body>
+
+ <dom-module id="x-slot">
+ <template>
+ <div id="container"><slot id="slot"></slot></div>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-slot'
+});
+</script>
+ </dom-module>
+
+ <dom-module id="x-container-slot">
+ <template>
+ <x-slot id="container"><div id="first">first</div><slot id="slot"></slot><div id="last">last</div></x-slot>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-container-slot'
+});
+</script>
+ </dom-module>
+
+ <dom-module id="x-event-scoped">
+ <template>
+ <div id="scoped"></div>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-event-scoped',
+ fireComposed: function() {
+ return this.fire('composed', null, {node: this.$.scoped});
+ }
+});
+</script>
+ </dom-module>
+
+ <dom-module id="x-focusable-in-shadow">
+ <template>
+ <input id="focusable"></input>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-focusable-in-shadow'
+});
+</script>
+ </dom-module>
+
+ <test-fixture id="scoped">
+ <template>
+ <x-event-scoped></x-event-scoped>
+ </template>
+ </test-fixture>
+
+ <test-fixture id="slot">
+ <template>
+ <x-container-slot></x-container-slot>
+ </template>
+ </test-fixture>
+
+ <test-fixture id="focusableInShadow">
+ <template>
+ <x-focusable-in-shadow></x-focusable-in-shadow>
+ </template>
+ </test-fixture>
+
+<script type="module">
+import { dom } from '../../lib/legacy/polymer.dom.js';
+import { useShadow, useNativeCustomElements, useNativeCSSProperties } from '../../lib/utils/settings.js';
+
+suite('extended dom api', function() {
+ test('getEffectiveChildNodes', function() {
+ var el = fixture('slot');
+ var div = document.createElement('div');
+ el.appendChild(div);
+ if (window.ShadyDOM) {
+ ShadyDOM.flush();
+ }
+ assert.deepEqual(dom(el).getEffectiveChildNodes(),
+ [div]);
+ assert.deepEqual(dom(el.$.container).getEffectiveChildNodes(),
+ [el.$.first, div, el.$.last]);
+ assert.deepEqual(dom(el.$.container.$.container).getEffectiveChildNodes(),
+ [el.$.first, div, el.$.last]);
+ });
+
+ test('queryDistributedElements', function() {
+ var el = fixture('slot');
+ var div = document.createElement('div');
+ el.appendChild(div);
+ if (window.ShadyDOM) {
+ ShadyDOM.flush();
+ }
+ assert.deepEqual(dom(el).queryDistributedElements('foo'),
+ []);
+ assert.deepEqual(dom(el).queryDistributedElements('div'),
+ [div]);
+ assert.deepEqual(dom(el.$.container).queryDistributedElements('#first'),
+ [el.$.first]);
+ assert.deepEqual(dom(el.$.container.$.container).queryDistributedElements('#last'),
+ [el.$.last]);
+ });
+
+});
+
+suite('distribution', function() {
+ test('getDistributedNodes', function() {
+ var el = fixture('slot');
+ var div = document.createElement('div');
+ el.appendChild(div);
+ if (window.ShadyDOM) {
+ ShadyDOM.flush();
+ }
+ assert.deepEqual(dom(el.$.slot).getDistributedNodes(), [div]);
+ assert.deepEqual(dom(el.$.container.$.slot).getDistributedNodes(),
+ [el.$.first, div, el.$.last]);
+ });
+
+ test('getDestinationInsertionPoints', function() {
+ var el = fixture('slot');
+ var div = document.createElement('div');
+ el.appendChild(div);
+ if (window.ShadyDOM) {
+ ShadyDOM.flush();
+ }
+ assert.deepEqual(dom(el.$.first).getDestinationInsertionPoints(),
+ [el.$.container.$.slot]);
+ assert.deepEqual(dom(div).getDestinationInsertionPoints(),
+ [el.$.slot, el.$.container.$.slot]);
+ });
+});
+
+suite('events', function() {
+
+ test('localTarget, rootTarget, path', function(done) {
+ var el = fixture('scoped');
+ el.addEventListener('composed', function(e) {
+ assert.equal(dom(e).rootTarget, el.$.scoped);
+ assert.equal(dom(e).localTarget, el);
+ let nodes = [];
+ let p = el.$.scoped;
+ while (p) {
+ nodes.push(p);
+ p = p.parentNode || p.host;
+ }
+ nodes.push(window);
+ assert.deepEqual(Array.from(dom(e).path), nodes);
+ done();
+ });
+ el.fireComposed();
+ });
+
+});
+
+suite('activeElement getter', function() {
+ test('Retrieves `_activeElement` (ShadyDOM) or `activeElement`.', function() {
+ var focusableInShadow = fixture('focusableInShadow');
+ focusableInShadow.$.focusable.focus();
+ var rootNode = focusableInShadow.getRootNode();
+ assert.equal(dom(rootNode).activeElement, focusableInShadow);
+ assert.equal(dom(focusableInShadow.shadowRoot).activeElement, focusableInShadow.$.focusable);
+ });
+});
+
+suite('legacy api', function() {
+ test('getEffectiveChildNodes', function() {
+ var el = fixture('slot');
+ var div = document.createElement('div');
+ var t = document.createTextNode('');
+ el.appendChild(div);
+ el.appendChild(t);
+ if (window.ShadyDOM) {
+ ShadyDOM.flush();
+ }
+ assert.deepEqual(el.getEffectiveChildNodes(),
+ [div, t]);
+ assert.deepEqual(el.$.container.getEffectiveChildNodes(),
+ [el.$.first, div, t, el.$.last]);
+ });
+
+ test('getEffectiveChildren', function() {
+ var el = fixture('slot');
+ var div = document.createElement('div');
+ el.appendChild(div);
+ if (window.ShadyDOM) {
+ ShadyDOM.flush();
+ }
+ assert.deepEqual(el.getEffectiveChildNodes(),
+ [div]);
+ assert.deepEqual(el.$.container.getEffectiveChildNodes(),
+ [el.$.first, div, el.$.last]);
+ });
+
+ test('getEffectiveTextContent', function() {
+ var el = fixture('slot');
+ var t1 = document.createTextNode('a');
+ var t2 = document.createTextNode('b');
+ el.appendChild(t1);
+ el.appendChild(t2);
+ if (window.ShadyDOM) {
+ ShadyDOM.flush();
+ }
+ assert.deepEqual(el.getEffectiveTextContent(), 'ab');
+ assert.deepEqual(el.$.container.getEffectiveTextContent(), 'firstablast');
+ });
+
+ test('getContentChildNodes', function() {
+ var el = fixture('slot');
+ var div1 = document.createElement('div');
+ var t = document.createTextNode('');
+ var div2 = document.createElement('div');
+ el.appendChild(div1);
+ el.appendChild(t);
+ el.appendChild(div2);
+ if (window.ShadyDOM) {
+ ShadyDOM.flush();
+ }
+ assert.deepEqual(el.getContentChildNodes(),
+ [div1, t, div2]);
+ assert.deepEqual(el.getContentChildNodes('slot'),
+ [div1, t, div2]);
+ });
+
+ test('getContentChildren', function() {
+ var el = fixture('slot');
+ var div1 = document.createElement('div');
+ var t = document.createTextNode('');
+ var div2 = document.createElement('div');
+ el.appendChild(div1);
+ el.appendChild(t);
+ el.appendChild(div2);
+ if (window.ShadyDOM) {
+ ShadyDOM.flush();
+ }
+ assert.deepEqual(el.getContentChildren(),
+ [div1, div2]);
+ assert.deepEqual(el.getContentChildren('slot'),
+ [div1, div2]);
+ });
+
+ test('queryDistributedElements', function() {
+ var el = fixture('slot');
+ var div = document.createElement('div');
+ el.appendChild(div);
+ if (window.ShadyDOM) {
+ ShadyDOM.flush();
+ }
+ assert.deepEqual(el.queryDistributedElements('foo'),
+ []);
+ assert.deepEqual(el.queryDistributedElements('div'),
+ [div]);
+ assert.deepEqual(el.$.container.queryDistributedElements('#first'),
+ [el.$.first]);
+ });
+
+ test('queryEffectiveChildren', function() {
+ var el = fixture('slot');
+ var div = document.createElement('div');
+ el.appendChild(div);
+ if (window.ShadyDOM) {
+ ShadyDOM.flush();
+ }
+ assert.equal(el.queryEffectiveChildren('foo'),
+ null);
+ assert.deepEqual(el.queryEffectiveChildren('div'),
+ div);
+ assert.deepEqual(el.$.container.queryEffectiveChildren('#first'),
+ el.$.first);
+ });
+
+ test('queryAllEffectiveChildren', function() {
+ var el = fixture('slot');
+ var div1 = document.createElement('div');
+ var div2 = document.createElement('div');
+ el.appendChild(div1);
+ el.appendChild(div2);
+ if (window.ShadyDOM) {
+ ShadyDOM.flush();
+ }
+ assert.deepEqual(el.queryAllEffectiveChildren('foo'),
+ []);
+ assert.deepEqual(el.queryAllEffectiveChildren('div'),
+ [div1, div2]);
+ assert.deepEqual(el.$.container.queryAllEffectiveChildren('div'),
+ [el.$.first, div1, div2, el.$.last]);
+ });
+
+ test('isLightDescendant', function() {
+ var el = fixture('slot');
+ var div1 = document.createElement('div');
+ el.appendChild(div1);
+ if (window.ShadyDOM) {
+ ShadyDOM.flush();
+ }
+ assert.equal(el.isLightDescendant(div1), true);
+ assert.equal(el.isLightDescendant(el.$.container), false);
+ });
+
+ test('isLocalDescendant', function() {
+ var el = fixture('slot');
+ var div1 = document.createElement('div');
+ el.appendChild(div1);
+ if (window.ShadyDOM) {
+ ShadyDOM.flush();
+ }
+ assert.equal(el.isLocalDescendant(div1), false);
+ assert.equal(el.isLocalDescendant(el.$.container), true);
+ });
+
+ test('domHost', function() {
+ var el = fixture('slot');
+ assert.equal(el.domHost, document);
+ assert.equal(el.$.container.domHost, el);
+ });
+
+ test('legacy settings', function() {
+ assert.equal(useShadow, !(window.ShadyDOM));
+ assert.equal(useNativeCustomElements, !(window.customElements.polyfillWrapFlushCallback));
+ assert.equal(useNativeCSSProperties, Boolean(!window.ShadyCSS || window.ShadyCSS.nativeCss));
+ });
+
+});
+</script>
+
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/polymer-element-with-apply-import.js b/third_party/polymer3/bower_components/polymer/test/unit/polymer-element-with-apply-import.js
new file mode 100644
index 0000000..897ed99
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/polymer-element-with-apply-import.js
@@ -0,0 +1,55 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import { PolymerElement } from '../../polymer-element.js';
+
+import '@webcomponents/shadycss/entrypoints/apply-shim.js';
+import '../../lib/elements/custom-style.js';
+import { html } from '../../lib/utils/html-tag.js';
+class ApplyElement extends PolymerElement {
+ static get template() {
+ return html`
+ <style>
+ :host {
+ display: block;
+ @apply --mixin;
+ }
+ </style>
+`;
+ }
+
+ static get is() {return 'apply-element';}
+}
+customElements.define('apply-element', ApplyElement);
+class XOuter extends PolymerElement {
+ static get template() {
+ return html`
+ <style>
+ :host {
+ display: block;
+ @apply --mixin;
+ background-color: rgb(123, 123, 123);
+ }
+ :host > * {
+ --mixin: {
+ position: absolute;
+ margin: 50px;
+ height: 100px;
+ width: 100px;
+ background-color: rgb(255, 0, 0);
+ }
+ }
+ </style>
+ <apply-element></apply-element>
+`;
+ }
+
+ static get is() {return 'x-outer';}
+}
+customElements.define('x-outer', XOuter);
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/polymer-element-with-apply.html b/third_party/polymer3/bower_components/polymer/test/unit/polymer-element-with-apply.html
new file mode 100644
index 0000000..bd9132f
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/polymer-element-with-apply.html
@@ -0,0 +1,67 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-loader.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="./polymer-element-with-apply-import.js"></script>
+</head>
+<body>
+ <custom-style>
+ <style>
+ html {
+ --mixin: {
+ height: 200px;
+ width: 200px;
+ background-color: rgb(0, 0, 255);
+ }
+ }
+ </style>
+ </custom-style>
+
+ <test-fixture id="apply">
+ <template>
+ <apply-element></apply-element>
+ </template>
+ </test-fixture>
+
+ <test-fixture id="outer">
+ <template>
+ <x-outer></x-outer>
+ </template>
+ </test-fixture>
+
+ <script type="module">
+import './polymer-element-with-apply-import.js';
+suite('Polymer.Element with ApplyShim', function() {
+ test('mixin from custom style', function() {
+ var el = fixture('apply');
+ assert.equal(ShadyCSS.getComputedStyleValue(el, 'background-color'), 'rgb(0, 0, 255)');
+ assert.equal(ShadyCSS.getComputedStyleValue(el, 'height'), '200px');
+ assert.equal(ShadyCSS.getComputedStyleValue(el, 'width'), '200px');
+ });
+ test('nested', function() {
+ var el = fixture('outer');
+ var inner = el.shadowRoot.querySelector('apply-element');
+ assert.equal(ShadyCSS.getComputedStyleValue(el, 'background-color'), 'rgb(123, 123, 123)');
+ assert.equal(ShadyCSS.getComputedStyleValue(el, 'height'), '200px');
+ assert.equal(ShadyCSS.getComputedStyleValue(el, 'width'), '200px');
+
+ assert.equal(ShadyCSS.getComputedStyleValue(inner, 'background-color'), 'rgb(255, 0, 0)');
+ assert.equal(ShadyCSS.getComputedStyleValue(inner, 'height'), '100px');
+ assert.equal(ShadyCSS.getComputedStyleValue(inner, 'width'), '100px');
+ assert.equal(ShadyCSS.getComputedStyleValue(inner, 'margin-top'), '50px');
+ });
+});
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/polymer.element.html b/third_party/polymer3/bower_components/polymer/test/unit/polymer.element.html
new file mode 100644
index 0000000..b81d21e
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/polymer.element.html
@@ -0,0 +1,608 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-element.js"></script>
+<body>
+
+ <dom-module id="my-element">
+ <template>
+ <div id="content">{{prop}}</div>
+ </template>
+ <script type="module">
+import { PolymerElement } from '../../polymer-element.js';
+
+class MyElement extends PolymerElement {
+
+ static get is() { return 'my-element'; }
+
+ static get properties() {
+ return {
+ prop: {
+ value: 'base',
+ observer: '_propObserver'
+ },
+ computedPropDep: {
+ value: true
+ },
+ computedProp: {
+ computed: '_compute(computedPropDep)'
+ },
+ accessor: String,
+ noStomp: String
+ };
+ }
+
+ static get observers() {
+ return [
+ '_methodObserver(prop)'
+ ];
+ }
+
+ constructor() {
+ super();
+ this._propObserver = sinon.spy();
+ this._methodObserver = sinon.spy();
+ this._tapListener = sinon.spy();
+ this._calledConstructor++;
+ }
+
+ get noStomp() {
+ return 'noStomp';
+ }
+
+ connectedCallback() {
+ super.connectedCallback();
+ this._calledConnectedCallback++;
+ }
+
+ attributeChangedCallback() {
+ super.attributeChangedCallback.apply(this, arguments);
+ this._callAttributeChangedCallback++;
+ }
+
+ ready() {
+ super.ready();
+ this._ensureAttribute('tabIndex', 0);
+ this.addEventListener('click', (e) => this._tapListener(e));
+ this._calledReady++;
+ }
+
+ _compute(value) {
+ return value;
+ }
+}
+
+MyElement.prototype._calledConstructor = 0;
+MyElement.prototype._calledConnectedCallback = 0;
+MyElement.prototype._calledReady = 0;
+MyElement.prototype._callAttributeChangedCallback = 0;
+
+customElements.define(MyElement.is, MyElement);
+
+window.MyElement = MyElement;
+</script>
+ </dom-module>
+
+
+ <dom-module id="sub-element">
+ <script type="module">
+import '../../polymer-element.js';
+
+class SubElement extends window.MyElement {
+
+ static get is() { return 'sub-element'; }
+
+ static get properties() {
+ return {
+ prop: {
+ value: 'sub'
+ },
+ prop2: {
+ value: 'prop2',
+ observer: '_prop2Observer'
+ },
+ computedPropDep: {
+ computed: '_compute(prop2)'
+ }
+ };
+ }
+
+ static get observers() {
+ return [
+ '_subMethodObserver(prop, prop2)'
+ ];
+ }
+
+ constructor() {
+ super();
+ this._calledConstructor++;
+ this._prop2Observer = sinon.spy();
+ this._subMethodObserver = sinon.spy();
+ }
+
+ connectedCallback() {
+ super.connectedCallback();
+ this._calledConnectedCallback++;
+ }
+
+ ready() {
+ super.ready();
+ this._calledReady++;
+ this._ensureAttribute('role', 'button');
+ this.addEventListener('click', (e) => this._tapListener(e));
+ }
+
+}
+
+customElements.define(SubElement.is, SubElement);
+
+window.SubElement = SubElement;
+</script>
+ </dom-module>
+
+ <dom-module id="sub-mixin-element">
+ <script type="module">
+import '../../polymer-element.js';
+
+function MyMixin(Base) {
+ return class extends Base {
+
+ static get properties() {
+ return {
+ prop: {
+ value: 'mixin'
+ },
+ mixin: {
+ value: 'mixin',
+ observer: '_mixinObserver'
+ }
+ };
+ }
+
+ static get observers() {
+ return [
+ '_mixinMethodObserver(mixin, prop, prop2)'
+ ];
+ }
+
+ constructor() {
+ super();
+ this._calledConstructor++;
+ this._mixinObserver = sinon.spy();
+ this._mixinMethodObserver = sinon.spy();
+ }
+
+ connectedCallback() {
+ super.connectedCallback();
+ this._calledConnectedCallback++;
+ }
+
+ ready() {
+ super.ready();
+ this._calledReady++;
+ this._ensureAttribute('mixinattr', 'mixinattr');
+ this.addEventListener('click', (e) => this._tapListener(e));
+ }
+
+ };
+}
+
+class SubMixinElement extends MyMixin(window.SubElement) {
+
+ static get is() { return 'sub-mixin-element'; }
+
+ static get properties() {
+ return {
+ prop3: {
+ value: 'prop3',
+ observer: '_prop3Observer'
+ }
+ };
+ }
+
+ static get observers() {
+ return [
+ '_subMixinMethodObserver(mixin, prop, prop2, prop3)'
+ ];
+ }
+
+ constructor() {
+ super();
+ this._calledConstructor++;
+ this._prop3Observer = sinon.spy();
+ this._subMixinMethodObserver = sinon.spy();
+ }
+
+ connectedCallback() {
+ super.connectedCallback();
+ this._calledConnectedCallback++;
+ }
+
+ ready() {
+ super.ready();
+ this._calledReady++;
+ this._ensureAttribute('submixinattr', 'submixinattr');
+ this.addEventListener('click', (e) => this._tapListener(e));
+ }
+
+}
+
+customElements.define(SubMixinElement.is, SubMixinElement);
+
+window.SubMixinElement = SubMixinElement;
+</script>
+ </dom-module>
+
+ <script type="module">
+import { html } from '../../polymer-element.js';
+
+class SubNewTemplate extends window.MyElement {
+ static get template() {
+ return html`
+ <h1>Sub template</h1>
+ <div id="subContent">{{prop2}}</div>`;
+ }
+
+ static get properties() {
+ return {
+ prop2: {
+ value: 'prop2',
+ }
+ };
+ }
+}
+
+customElements.define('sub-new-template', SubNewTemplate);
+</script>
+
+ <template id="no-dom-module">
+ <style>
+ :host {
+ display: block;
+ border: 10px solid rgb(123, 123, 123);
+ }
+ </style>
+ <div id="child">Content</div>
+ </template>
+ <script type="module">
+import { PolymerElement } from '../../polymer-element.js';
+class NoDomModule extends PolymerElement {
+ static get is() {return 'no-dom-module';}
+ static get template() {
+ return document.body.querySelector('template#no-dom-module');
+ }
+}
+customElements.define('no-dom-module', NoDomModule);
+</script>
+
+ <dom-module id="sub-extended-template">
+ <script type="module">
+import '../../polymer-element.js';
+// Setting up property bind listeners in both base and sub class
+// is required to catch regression bug
+class ElementWithBindListeners extends window.MyElement {
+ static get is() { return 'element-with-bind-listeners'; }
+}
+class SubExtendedTemplate extends ElementWithBindListeners {
+ static get is() { return 'sub-extended-template'; }
+ static get template() {
+ if (!this.hasOwnProperty('_template')) {
+ const baseClass = Object.getPrototypeOf(this.prototype).constructor;
+ this._template = baseClass.template.cloneNode(true);
+ const newElement = document.createElement('div');
+ newElement.innerHTML = '<div id="subContent" imaginary-prop$="{{prop}}""></div>';
+ this._template.content.appendChild(newElement.firstChild);
+ }
+ return this._template;
+ }
+}
+customElements.define(ElementWithBindListeners.is, ElementWithBindListeners);
+customElements.define(SubExtendedTemplate.is, SubExtendedTemplate);
+</script>
+ </dom-module>
+
+ <test-fixture id="my-element-attr">
+ <template>
+ <my-element prop="attr" foo="foo"></my-element>
+ </template>
+ </test-fixture>
+
+ <test-fixture id="sub-element-attr">
+ <template>
+ <sub-element prop="attr" prop2="attr"></sub-element>
+ </template>
+ </test-fixture>
+
+ <test-fixture id="sub-mixin-element-attr">
+ <template>
+ <sub-mixin-element prop="attr" prop2="attr" prop3="attr"></sub-mixin-element>
+ </template>
+ </test-fixture>
+
+ <script type="module">
+import { PolymerElement } from '../../polymer-element.js';
+suite('class extends Polymer.Element', function() {
+
+ var el;
+
+ setup(function() {
+ el = document.createElement('my-element');
+ document.body.appendChild(el);
+ });
+
+ teardown(function() {
+ document.body.removeChild(el);
+ });
+
+ test('instanceof', function() {
+ assert.instanceOf(el, HTMLElement);
+ assert.instanceOf(el, PolymerElement);
+ assert.instanceOf(el, window.MyElement);
+ });
+
+ test('lifecycle', function() {
+ assert.equal(el._calledConstructor, 1);
+ assert.equal(el._calledConnectedCallback, 1);
+ assert.equal(el._calledReady, 1);
+ assert.equal(el._callAttributeChangedCallback, 0);
+ });
+
+ test('template', function() {
+ assert.equal(el.prop, 'base');
+ assert.equal(el.$.content.textContent, el.prop);
+ });
+
+ test('observers', function() {
+ assert.isTrue(el._propObserver.calledOnce);
+ assert.isTrue(el._propObserver.calledWith('base'));
+ assert.isTrue(el._methodObserver.calledOnce);
+ assert.isTrue(el._methodObserver.calledWith('base'));
+ });
+
+ test('listeners', function() {
+ el.dispatchEvent(new CustomEvent('click'));
+ assert.equal(el._tapListener.callCount, 1);
+ });
+
+ test('properties', function() {
+ assert.equal(el.prop, 'base');
+ assert.equal(el.computedPropDep, true);
+ assert.equal(el.computedProp, true);
+ });
+
+ test('attributes', function() {
+ const fixtureEl = fixture('my-element-attr');
+ assert.equal(fixtureEl.prop, 'attr');
+ assert.equal(fixtureEl._callAttributeChangedCallback, 1);
+ assert.isTrue(fixtureEl.hasAttribute('tabindex'));
+ });
+
+ test('reflecting attributes', function() {
+ const fixtureEl = fixture('my-element-attr');
+ fixtureEl.prop = 'propValue';
+ fixtureEl._propertyToAttribute('prop');
+ assert.equal(fixtureEl.getAttribute('prop'), 'propValue');
+ });
+
+});
+
+suite('subclass', function() {
+
+ let el;
+
+ setup(function() {
+ el = document.createElement('sub-element');
+ document.body.appendChild(el);
+ });
+
+ teardown(function() {
+ document.body.removeChild(el);
+ });
+
+ test('instanceof', function() {
+ assert.instanceOf(el, HTMLElement);
+ assert.instanceOf(el, PolymerElement);
+ assert.instanceOf(el, window.MyElement);
+ assert.instanceOf(el, window.SubElement);
+ });
+
+ test('lifecycle', function() {
+ assert.equal(el._calledConstructor, 2);
+ assert.equal(el._calledConnectedCallback, 2);
+ assert.equal(el._calledReady, 2);
+ assert.equal(el._callAttributeChangedCallback, 0);
+ });
+
+ test('template', function() {
+ assert.equal(el.prop, 'sub');
+ assert.equal(el.$.content.textContent, el.prop);
+ });
+
+ test('observers', function() {
+ assert.isTrue(el._propObserver.calledOnce);
+ assert.isTrue(el._propObserver.calledWith('sub'));
+ assert.isTrue(el._methodObserver.calledOnce);
+ assert.isTrue(el._methodObserver.calledWith('sub'));
+ // sub
+ assert.isTrue(el._prop2Observer.calledOnce);
+ assert.isTrue(el._prop2Observer.calledWith('prop2'));
+ assert.isTrue(el._subMethodObserver.calledOnce);
+ assert.isTrue(el._subMethodObserver.calledWith('sub', 'prop2'));
+ });
+
+ test('listeners', function() {
+ el.dispatchEvent(new CustomEvent('click'));
+ assert.equal(el._tapListener.callCount, 2);
+ });
+
+ test('properties', function() {
+ assert.equal(el.prop, 'sub');
+ assert.equal(el.prop2, 'prop2');
+ assert.equal(el.computedPropDep, 'prop2');
+ assert.equal(el.computedProp, 'prop2', 'computedProp dependency cannot itself be a computed property');
+ });
+
+ test('attributes', function() {
+ const fixtureEl = fixture('sub-element-attr');
+ assert.equal(fixtureEl.prop, 'attr');
+ assert.equal(fixtureEl.prop2, 'attr');
+ assert.equal(fixtureEl._callAttributeChangedCallback, 2);
+ assert.isTrue(fixtureEl.hasAttribute('tabindex'));
+ assert.equal(fixtureEl.getAttribute('role'), 'button');
+ });
+
+});
+
+suite('mixin', function() {
+
+ let el;
+
+ setup(function() {
+ el = document.createElement('sub-mixin-element');
+ document.body.appendChild(el);
+ });
+
+ teardown(function() {
+ document.body.removeChild(el);
+ });
+
+ test('instanceof', function() {
+ assert.instanceOf(el, HTMLElement);
+ assert.instanceOf(el, PolymerElement);
+ assert.instanceOf(el, window.MyElement);
+ assert.instanceOf(el, window.SubElement);
+ assert.instanceOf(el, window.SubMixinElement);
+ });
+
+ test('lifecycle', function() {
+ assert.equal(el._calledConstructor, 4);
+ assert.equal(el._calledConnectedCallback, 4);
+ assert.equal(el._calledReady, 4);
+ assert.equal(el._callAttributeChangedCallback, 0);
+ });
+
+ test('template', function() {
+ assert.equal(el.prop, 'mixin');
+ assert.equal(el.$.content.textContent, el.prop);
+ });
+
+ test('observers', function() {
+ assert.isTrue(el._propObserver.calledOnce);
+ assert.isTrue(el._propObserver.calledWith('mixin'));
+ assert.isTrue(el._methodObserver.calledOnce);
+ assert.isTrue(el._methodObserver.calledWith('mixin'));
+ // sub
+ assert.isTrue(el._prop2Observer.calledOnce);
+ assert.isTrue(el._prop2Observer.calledWith('prop2'));
+ assert.isTrue(el._subMethodObserver.calledOnce);
+ assert.isTrue(el._subMethodObserver.calledWith('mixin', 'prop2'));
+ // mixin
+ assert.isTrue(el._mixinObserver.calledOnce);
+ assert.isTrue(el._mixinObserver.calledWith('mixin'));
+ assert.isTrue(el._mixinMethodObserver.calledOnce);
+ assert.isTrue(el._mixinMethodObserver.calledWith('mixin', 'mixin', 'prop2'));
+ // submixin
+ assert.isTrue(el._prop3Observer.calledOnce);
+ assert.isTrue(el._prop3Observer.calledWith('prop3'));
+ assert.isTrue(el._subMixinMethodObserver.calledOnce);
+ assert.isTrue(el._subMixinMethodObserver.calledWith('mixin', 'mixin', 'prop2', 'prop3'));
+
+ });
+
+ test('listeners', function() {
+ el.dispatchEvent(new CustomEvent('click'));
+ assert.equal(el._tapListener.callCount, 4);
+ });
+
+ test('attributes', function() {
+ const fixtureEl = fixture('sub-mixin-element-attr');
+ assert.equal(fixtureEl.prop, 'attr');
+ assert.equal(fixtureEl.prop2, 'attr');
+ assert.equal(fixtureEl.prop3, 'attr');
+ assert.equal(fixtureEl._callAttributeChangedCallback, 3);
+ assert.isTrue(fixtureEl.hasAttribute('tabindex'));
+ assert.equal(fixtureEl.getAttribute('role'), 'button');
+ assert.equal(fixtureEl.getAttribute('mixinattr'), 'mixinattr');
+ assert.equal(fixtureEl.getAttribute('submixinattr'), 'submixinattr');
+ });
+
+});
+
+suite('subclass new template', function() {
+ let el;
+
+ setup(function() {
+ el = document.createElement('sub-new-template');
+ document.body.appendChild(el);
+ });
+
+ teardown(function() {
+ document.body.removeChild(el);
+ });
+
+ test('template', function() {
+ assert.equal(el.prop2, 'prop2');
+ assert.equal(el.$.subContent.textContent, el.prop2);
+ assert.notOk(el.$.content);
+ });
+
+ suite('use without dom-module', function() {
+ let el;
+
+ setup(function() {
+ el = document.createElement('no-dom-module');
+ document.body.appendChild(el);
+ });
+
+ teardown(function() {
+ document.body.removeChild(el);
+ });
+
+ test('template', function() {
+ assert.ok(el.$.child);
+ assert.equal(el.$.child.textContent, 'Content');
+ assert.equal(window.ShadyCSS.getComputedStyleValue(el, 'border-top-width'), '10px');
+ });
+ });
+});
+
+suite('extend sub-class template', function() {
+ let el, baseEl;
+ setup(function() {
+ el = document.createElement('sub-extended-template');
+ document.body.appendChild(el);
+ baseEl = document.createElement('element-with-bind-listeners');
+ document.body.appendChild(baseEl);
+ });
+ teardown(function() {
+ document.body.removeChild(el);
+ document.body.removeChild(baseEl);
+ });
+ test('has original template', function() {
+ assert.equal(el.prop, 'base');
+ assert.equal(el.$.content.textContent, el.prop);
+ });
+ test('has new element', function() {
+ assert.ok(el.$.subContent);
+ assert.equal(el.$.subContent.getAttribute('imaginary-prop'), 'base');
+ });
+ test('base doesnt have new element', function() {
+ assert.notOk(baseEl.$.subContent);
+ });
+});
+</script>
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/polymer.legacyelement.html b/third_party/polymer3/bower_components/polymer/test/unit/polymer.legacyelement.html
new file mode 100644
index 0000000..eebd4c4
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/polymer.legacyelement.html
@@ -0,0 +1,191 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+<body>
+
+ <dom-module id="my-element">
+ <template>
+ <div id="content"></div>
+ </template>
+ <script type="module">
+import { LegacyElementMixin } from '../../lib/legacy/legacy-element-mixin.js';
+
+class MyElement extends LegacyElementMixin(HTMLElement) {
+
+ static get is() { return 'my-element'; }
+
+ static get properties() {
+ return {
+ prop: {
+ value: 'base'
+ }
+ };
+ }
+
+ created() {
+ super.created();
+ this._calledCreated++;
+ }
+
+ attached() {
+ super.attached();
+ this._calledAttached++;
+ }
+
+ attributeChanged() {
+ super.attributeChanged.apply(this, arguments);
+ this._callAttributeChanged++;
+ }
+
+ ready() {
+ super.ready();
+ this._calledReady++;
+ }
+}
+
+MyElement.prototype._calledCreated = 0;
+MyElement.prototype._calledAttached = 0;
+MyElement.prototype._calledReady = 0;
+MyElement.prototype._callAttributeChanged = 0;
+
+customElements.define(MyElement.is, MyElement);
+
+window.MyElement = MyElement;
+</script>
+ </dom-module>
+
+
+ <dom-module id="sub-element">
+ <script type="module">
+
+class SubElement extends window.MyElement {
+
+ static get is() { return 'sub-element'; }
+
+ created() {
+ super.created();
+ this._calledCreated++;
+ }
+
+ attached() {
+ super.attached();
+ this._calledAttached++;
+ }
+
+ ready() {
+ super.ready();
+ this._calledReady++;
+ }
+
+}
+
+customElements.define(SubElement.is, SubElement);
+
+window.SubElement = SubElement;
+</script>
+ </dom-module>
+
+ <test-fixture id="my-element-attr">
+ <template>
+ <my-element prop="attr"></my-element>
+ </template>
+ </test-fixture>
+
+ <script type="module">
+import { PolymerElement } from '../../polymer-element.js';
+import { ElementMixin } from '../../lib/mixins/element-mixin.js';
+import { LegacyElementMixin } from '../../lib/legacy/legacy-element-mixin.js';
+suite('class extends Polymer.LegacyElementMixin(HTMLElement)', function() {
+
+ var el;
+
+ setup(function() {
+ el = document.createElement('my-element');
+ document.body.appendChild(el);
+ });
+
+ teardown(function() {
+ document.body.removeChild(el);
+ });
+
+ test('instanceof', function() {
+ assert.instanceOf(el, HTMLElement);
+ assert.instanceOf(el, PolymerElement);
+ assert.instanceOf(el, window.MyElement);
+ });
+
+ test('lifecycle', function() {
+ assert.equal(el._calledCreated, 1);
+ assert.equal(el._calledAttached, 1);
+ assert.equal(el._calledReady, 1);
+ assert.equal(el._callAttributeChanged, 0);
+ });
+
+ test('attributes', function() {
+ var fixtureEl = fixture('my-element-attr');
+ assert.equal(fixtureEl.prop, 'attr');
+ assert.equal(fixtureEl._callAttributeChanged, 1);
+ });
+
+});
+
+suite('subclass', function() {
+
+ var el;
+
+ setup(function() {
+ el = document.createElement('sub-element');
+ document.body.appendChild(el);
+ });
+
+ teardown(function() {
+ document.body.removeChild(el);
+ });
+
+ test('instanceof', function() {
+ assert.instanceOf(el, HTMLElement);
+ assert.instanceOf(el, PolymerElement);
+ assert.instanceOf(el, window.MyElement);
+ assert.instanceOf(el, window.SubElement);
+ });
+
+ test('lifecycle', function() {
+ assert.equal(el._calledCreated, 2);
+ assert.equal(el._calledAttached, 2);
+ assert.equal(el._calledReady, 2);
+ assert.equal(el._callAttributeChanged, 0);
+ });
+
+});
+
+suite('misc', function() {
+
+ test('Polymer.ElementMixin caches', function() {
+ assert.equal(PolymerElement, ElementMixin(HTMLElement));
+ assert.equal(ElementMixin(HTMLElement),
+ ElementMixin(HTMLElement));
+ });
+
+ test('Polymer.LegacyElementMixin caches', function() {
+ assert.equal(LegacyElementMixin(HTMLElement),
+ LegacyElementMixin(HTMLElement));
+ });
+
+});
+</script>
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/polymer.properties-mixin-with-property-accessors.html b/third_party/polymer3/bower_components/polymer/test/unit/polymer.properties-mixin-with-property-accessors.html
new file mode 100644
index 0000000..0a7514f
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/polymer.properties-mixin-with-property-accessors.html
@@ -0,0 +1,355 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../lib/mixins/properties-mixin.js"></script>
+ <script type="module" src="../../lib/mixins/property-accessors.js"></script>
+<body>
+
+ <dom-module id="my-element">
+ <script type="module">
+import { PropertiesMixin } from '../../lib/mixins/properties-mixin.js';
+import { PropertyAccessors } from '../../lib/mixins/property-accessors.js';
+
+class MyElement extends PropertyAccessors(PropertiesMixin(HTMLElement)) {
+
+ static get properties() {
+ return {
+ prop: String
+ };
+ }
+
+ constructor() {
+ super();
+ this._propertiesChanged = sinon.spy();
+ this._tapListener = sinon.spy();
+ this._calledConstructor++;
+ this.prop = 'prop';
+ }
+
+ connectedCallback() {
+ super.connectedCallback();
+ this._calledConnectedCallback++;
+ }
+
+ attributeChangedCallback() {
+ super.attributeChangedCallback.apply(this, arguments);
+ this._callAttributeChangedCallback++;
+ }
+
+ ready() {
+ super.ready();
+ this._ensureAttribute('tabIndex', 0);
+ this.addEventListener('click', (e) => this._tapListener(e));
+ this._calledReady++;
+ }
+
+}
+
+MyElement.prototype._calledConstructor = 0;
+MyElement.prototype._calledConnectedCallback = 0;
+MyElement.prototype._calledReady = 0;
+MyElement.prototype._callAttributeChangedCallback = 0;
+
+customElements.define('my-element', MyElement);
+
+window.MyElement = MyElement;
+</script>
+ </dom-module>
+
+
+ <dom-module id="sub-element">
+ <script type="module">
+import '../../lib/mixins/properties-mixin.js';
+import '../../lib/mixins/property-accessors.js';
+
+class SubElement extends window.MyElement {
+
+ static get properties() {
+ return {
+ prop2: String
+ };
+ }
+
+ constructor() {
+ super();
+ this._calledConstructor++;
+ this.prop = 'sub';
+ this.prop2 = 'prop2';
+ }
+
+ connectedCallback() {
+ super.connectedCallback();
+ this._calledConnectedCallback++;
+ }
+
+ ready() {
+ super.ready();
+ this._calledReady++;
+ this._ensureAttribute('role', 'button');
+ this.addEventListener('click', (e) => this._tapListener(e));
+ }
+
+}
+
+customElements.define('sub-element', SubElement);
+
+window.SubElement = SubElement;
+</script>
+ </dom-module>
+
+ <dom-module id="sub-mixin-element">
+ <script type="module">
+import '../../lib/mixins/properties-mixin.js';
+import '../../lib/mixins/property-accessors.js';
+
+function MyMixin(Base) {
+ return class extends Base {
+
+ static get properties() {
+ return {
+ mixin: Number
+ };
+ }
+
+ constructor() {
+ super();
+ this._calledConstructor++;
+ this.mixin = 'mixin';
+ }
+
+ connectedCallback() {
+ super.connectedCallback();
+ this._calledConnectedCallback++;
+ }
+
+ ready() {
+ super.ready();
+ this._calledReady++;
+ this._ensureAttribute('mixinattr', 'mixinattr');
+ this.addEventListener('click', (e) => this._tapListener(e));
+ }
+
+ };
+}
+
+class SubMixinElement extends MyMixin(window.SubElement) {
+
+ static get properties() {
+ return {
+ prop3: String,
+ camelCase: String
+ };
+ }
+
+ constructor() {
+ super();
+ this._calledConstructor++;
+ this.prop3 = 'prop3';
+ }
+
+ connectedCallback() {
+ super.connectedCallback();
+ this._calledConnectedCallback++;
+ }
+
+ ready() {
+ super.ready();
+ this._calledReady++;
+ this._ensureAttribute('submixinattr', 'submixinattr');
+ this.addEventListener('click', (e) => this._tapListener(e));
+ }
+
+}
+
+customElements.define('sub-mixin-element', SubMixinElement);
+
+window.SubMixinElement = SubMixinElement;
+</script>
+ </dom-module>
+
+ <test-fixture id="my-element-attr">
+ <template>
+ <my-element prop="attr"></my-element>
+ </template>
+ </test-fixture>
+
+ <test-fixture id="sub-element-attr">
+ <template>
+ <sub-element prop="attr" prop2="attr"></sub-element>
+ </template>
+ </test-fixture>
+
+ <test-fixture id="sub-mixin-element-attr">
+ <template>
+ <sub-mixin-element prop="attr" prop2="attr" prop3="attr" mixin="5" camel-case="camelCase"></sub-mixin-element>
+ </template>
+ </test-fixture>
+
+ <script type="module">
+import '../../lib/mixins/properties-mixin.js';
+import '../../lib/mixins/property-accessors.js';
+suite('class extends Polymer.PropertiesMixin', function() {
+
+ let el;
+
+ setup(function() {
+ el = document.createElement('my-element');
+ document.body.appendChild(el);
+ });
+
+ teardown(function() {
+ document.body.removeChild(el);
+ });
+
+ test('instanceof', function() {
+ assert.instanceOf(el, HTMLElement);
+ assert.instanceOf(el, window.MyElement);
+ });
+
+ test('lifecycle', function() {
+ assert.equal(el._calledConstructor, 1);
+ assert.equal(el._calledConnectedCallback, 1);
+ assert.equal(el._calledReady, 1);
+ assert.equal(el._callAttributeChangedCallback, 0);
+ });
+
+ test('listeners', function() {
+ el.dispatchEvent(new CustomEvent('click'));
+ assert.equal(el._tapListener.callCount, 1);
+ });
+
+ test('properties', function() {
+ assert.equal(el.prop, 'prop');
+ assert.isTrue(el._propertiesChanged.calledOnce);
+ assert.deepEqual(el._propertiesChanged.args[0][0], {prop: 'prop'});
+ });
+
+ test('attributes', function() {
+ const fixtureEl = fixture('my-element-attr');
+ assert.equal(fixtureEl.prop, 'attr');
+ assert.equal(fixtureEl._callAttributeChangedCallback, 1);
+ assert.isTrue(fixtureEl.hasAttribute('tabindex'));
+ });
+
+});
+
+suite('subclass', function() {
+
+ let el;
+
+ setup(function() {
+ el = document.createElement('sub-element');
+ document.body.appendChild(el);
+ });
+
+ teardown(function() {
+ document.body.removeChild(el);
+ });
+
+ test('instanceof', function() {
+ assert.instanceOf(el, HTMLElement);
+ assert.instanceOf(el, window.MyElement);
+ assert.instanceOf(el, window.SubElement);
+ });
+
+ test('lifecycle', function() {
+ assert.equal(el._calledConstructor, 2);
+ assert.equal(el._calledConnectedCallback, 2);
+ assert.equal(el._calledReady, 2);
+ assert.equal(el._callAttributeChangedCallback, 0);
+ });
+
+ test('listeners', function() {
+ el.dispatchEvent(new CustomEvent('click'));
+ assert.equal(el._tapListener.callCount, 2);
+ });
+
+ test('properties', function() {
+ assert.equal(el.prop, 'sub');
+ assert.equal(el.prop2, 'prop2');
+ assert.isTrue(el._propertiesChanged.calledOnce);
+ assert.deepEqual(el._propertiesChanged.args[0][0], {prop: 'sub', prop2: 'prop2'});
+ });
+
+ test('attributes', function() {
+ const fixtureEl = fixture('sub-element-attr');
+ assert.equal(fixtureEl.prop, 'attr');
+ assert.equal(fixtureEl.prop2, 'attr');
+ assert.equal(fixtureEl._callAttributeChangedCallback, 2);
+ assert.isTrue(fixtureEl.hasAttribute('tabindex'));
+ assert.equal(fixtureEl.getAttribute('role'), 'button');
+ });
+
+});
+
+suite('mixin', function() {
+
+ let el;
+
+ setup(function() {
+ el = document.createElement('sub-mixin-element');
+ document.body.appendChild(el);
+ });
+
+ teardown(function() {
+ document.body.removeChild(el);
+ });
+
+ test('instanceof', function() {
+ assert.instanceOf(el, HTMLElement);
+ assert.instanceOf(el, window.MyElement);
+ assert.instanceOf(el, window.SubElement);
+ assert.instanceOf(el, window.SubMixinElement);
+ });
+
+ test('lifecycle', function() {
+ assert.equal(el._calledConstructor, 4);
+ assert.equal(el._calledConnectedCallback, 4);
+ assert.equal(el._calledReady, 4);
+ assert.equal(el._callAttributeChangedCallback, 0);
+ });
+
+ test('listeners', function() {
+ el.dispatchEvent(new CustomEvent('click'));
+ assert.equal(el._tapListener.callCount, 4);
+ });
+
+ test('properties', function() {
+ assert.equal(el.prop, 'sub');
+ assert.equal(el.prop2, 'prop2');
+ assert.equal(el.mixin, 'mixin');
+ assert.equal(el.prop3, 'prop3');
+ assert.isTrue(el._propertiesChanged.calledOnce);
+ assert.deepEqual(el._propertiesChanged.args[0][0], {prop: 'sub', prop2: 'prop2', mixin: 'mixin', prop3: 'prop3'});
+ });
+
+ test('attributes', function() {
+ const fixtureEl = fixture('sub-mixin-element-attr');
+ assert.strictEqual(fixtureEl.prop, 'attr');
+ assert.strictEqual(fixtureEl.prop2, 'attr');
+ assert.strictEqual(fixtureEl.prop3, 'attr');
+ assert.strictEqual(fixtureEl.camelCase, 'camelCase');
+ assert.strictEqual(fixtureEl.mixin, 5);
+ assert.equal(fixtureEl._callAttributeChangedCallback, 5);
+ assert.isTrue(fixtureEl.hasAttribute('tabindex'));
+ assert.equal(fixtureEl.getAttribute('role'), 'button');
+ assert.equal(fixtureEl.getAttribute('mixinattr'), 'mixinattr');
+ });
+
+});
+</script>
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/polymer.properties-mixin.html b/third_party/polymer3/bower_components/polymer/test/unit/polymer.properties-mixin.html
new file mode 100644
index 0000000..3943c01
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/polymer.properties-mixin.html
@@ -0,0 +1,427 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../lib/mixins/properties-mixin.js"></script>
+ <body>
+
+ <dom-module id="my-element">
+ <script type="module">
+import { PropertiesMixin } from '../../lib/mixins/properties-mixin.js';
+
+class Glar {}
+class Blar {}
+
+class MyElement extends PropertiesMixin(HTMLElement) {
+
+ static get properties() {
+ return {
+ prop: String,
+ noStomp: String,
+ id: String,
+ camelCase: String,
+ boo: Boolean,
+ num: Number,
+ glar: Glar,
+ blar: Blar
+ };
+ }
+
+ constructor() {
+ super();
+ this._propertiesChanged = sinon.spy();
+ this._tapListener = sinon.spy();
+ this._calledConstructor++;
+ this.prop = 'prop';
+ this.noStomp = 'stomped';
+ }
+
+ _deserializeValue(value, type) {
+ if (type == Glar) {
+ return 'glar';
+ }
+ return super._deserializeValue(value, type);
+ }
+
+ get noStomp() {
+ return 'noStomp';
+ }
+
+ set noStomp(value) {}
+
+ get id() {
+ return this._getProperty('id');
+ }
+
+ set id(value) {
+ this._setProperty('id', value);
+ // cannot call super cuz older browsers
+ this._propertyToAttribute('id');
+ }
+
+ connectedCallback() {
+ super.connectedCallback();
+ this._calledConnectedCallback++;
+ }
+
+ attributeChangedCallback() {
+ super.attributeChangedCallback.apply(this, arguments);
+ this._callAttributeChangedCallback++;
+ }
+
+ ready() {
+ super.ready();
+ this.addEventListener('click', (e) => this._tapListener(e));
+ this._calledReady++;
+ }
+
+}
+
+MyElement.prototype._calledConstructor = 0;
+MyElement.prototype._calledConnectedCallback = 0;
+MyElement.prototype._calledReady = 0;
+MyElement.prototype._callAttributeChangedCallback = 0;
+
+customElements.define('my-element', MyElement);
+
+window.MyElement = MyElement;
+</script>
+ </dom-module>
+
+
+ <dom-module id="sub-element">
+ <script type="module">
+import '../../lib/mixins/properties-mixin.js';
+
+class SubElement extends window.MyElement {
+
+ static get observedAttributes() {
+ return ['custom-observed-attr'].concat(super.observedAttributes);
+ }
+
+ static get properties() {
+ return {
+ prop2: String,
+ camelCase2: String
+ };
+ }
+
+ constructor() {
+ super();
+ this._calledConstructor++;
+ this.prop = 'sub';
+ this.prop2 = 'prop2';
+ }
+
+ connectedCallback() {
+ super.connectedCallback();
+ this._calledConnectedCallback++;
+ }
+
+ ready() {
+ super.ready();
+ this._calledReady++;
+ this.addEventListener('click', (e) => this._tapListener(e));
+ }
+
+}
+
+customElements.define('sub-element', SubElement);
+
+window.SubElement = SubElement;
+</script>
+ </dom-module>
+
+ <dom-module id="sub-mixin-element">
+ <script type="module">
+import '../../lib/mixins/properties-mixin.js';
+
+function MyMixin(Base) {
+ return class extends Base {
+
+ static get properties() {
+ return {
+ mixin: Number
+ };
+ }
+
+ constructor() {
+ super();
+ this._calledConstructor++;
+ this.mixin = 'mixin';
+ }
+
+ connectedCallback() {
+ super.connectedCallback();
+ this._calledConnectedCallback++;
+ }
+
+ ready() {
+ super.ready();
+ this._calledReady++;
+ this.addEventListener('click', (e) => this._tapListener(e));
+ }
+
+ };
+}
+
+class SubMixinElement extends MyMixin(window.SubElement) {
+
+ static get properties() {
+ return {
+ prop3: String,
+ camelCase: String
+ };
+ }
+
+ constructor() {
+ super();
+ this._calledConstructor++;
+ this.prop3 = 'prop3';
+ }
+
+ connectedCallback() {
+ super.connectedCallback();
+ this._calledConnectedCallback++;
+ }
+
+ ready() {
+ super.ready();
+ this._calledReady++;
+ this.addEventListener('click', (e) => this._tapListener(e));
+ }
+
+}
+
+customElements.define('sub-mixin-element', SubMixinElement);
+
+window.SubMixinElement = SubMixinElement;
+</script>
+ </dom-module>
+
+ <test-fixture id="my-element-attr">
+ <template>
+ <my-element prop="attr" camelCase="camelCase"></my-element>
+ </template>
+ </test-fixture>
+
+ <test-fixture id="sub-element-attr">
+ <template>
+ <sub-element prop="attr" prop2="attr" camelCase="camelCase" camelCase2="camelCase2" custom-observed-attr="custom"></sub-element>
+ </template>
+ </test-fixture>
+
+ <test-fixture id="sub-mixin-element-attr">
+ <template>
+ <sub-mixin-element prop="attr" prop2="attr" prop3="attr" mixin="5" custom-observed-attr="custom"></sub-mixin-element>
+ </template>
+ </test-fixture>
+
+ <script type="module">
+import '../../lib/mixins/properties-mixin.js';
+suite('class extends Polymer.PropertiesMixin', function() {
+
+ let el;
+
+ setup(function() {
+ el = document.createElement('my-element');
+ document.body.appendChild(el);
+ });
+
+ teardown(function() {
+ document.body.removeChild(el);
+ });
+
+ test('instanceof', function() {
+ assert.instanceOf(el, HTMLElement);
+ assert.instanceOf(el, window.MyElement);
+ });
+
+ test('lifecycle', function() {
+ assert.equal(el._calledConstructor, 1);
+ assert.equal(el._calledConnectedCallback, 1);
+ assert.equal(el._calledReady, 1);
+ assert.equal(el._callAttributeChangedCallback, 0);
+ });
+
+ test('listeners', function() {
+ el.dispatchEvent(new CustomEvent('click'));
+ assert.equal(el._tapListener.callCount, 1);
+ });
+
+ test('properties', function() {
+ assert.equal(el.prop, 'prop');
+ assert.equal(el.noStomp, 'noStomp');
+ assert.isTrue(el._propertiesChanged.calledOnce);
+ assert.deepEqual(el._propertiesChanged.args[0][0], {prop: 'prop'});
+ });
+
+ test('properties: accessor for native property', function() {
+ // old browsers with broken native properties on instances
+ // cannot pass this test.
+ if (el.hasOwnProperty('id')) {
+ this.skip();
+ }
+ el.setAttribute('id', 'yo');
+ assert.equal(el.id, 'yo');
+ el._flushProperties();
+ assert.isTrue(el._propertiesChanged.calledTwice);
+ assert.deepEqual(el._propertiesChanged.args[1][1], {id: 'yo'});
+ });
+
+ test('attributes', function() {
+ const fixtureEl = fixture('my-element-attr');
+ assert.equal(fixtureEl.prop, 'attr');
+ assert.equal(fixtureEl.camelCase, 'camelCase');
+ assert.equal(fixtureEl._callAttributeChangedCallback, 2);
+ fixtureEl.removeAttribute('prop');
+ assert.equal(fixtureEl.prop, null);
+ });
+
+ test('deserialize standard types', function() {
+ el.setAttribute('boo', '');
+ assert.equal(el.boo, true);
+ el.removeAttribute('boo');
+ assert.equal(el.boo, false);
+ el.setAttribute('prop', '1');
+ assert.equal(el.prop, '1');
+ el.setAttribute('num', '1');
+ assert.equal(el.num, 1);
+ el.setAttribute('num', '0');
+ assert.equal(el.num, 0);
+ });
+
+ test('deserialize class constructor type', function() {
+ el.setAttribute('blar', 'a');
+ assert.equal(el.blar, 'a');
+ });
+
+ test('deserialize custom type via `_deserializeValue`', function() {
+ el.setAttribute('glar', 'b');
+ assert.equal(el.glar, 'glar');
+ });
+
+ test('reflecting attributes', function() {
+ const fixtureEl = fixture('my-element-attr');
+ fixtureEl.prop = 'propValue';
+ fixtureEl._propertyToAttribute('prop');
+ assert.equal(fixtureEl.getAttribute('prop'), 'propValue');
+ });
+
+});
+
+suite('subclass', function() {
+
+ let el;
+
+ setup(function() {
+ el = document.createElement('sub-element');
+ document.body.appendChild(el);
+ });
+
+ teardown(function() {
+ document.body.removeChild(el);
+ });
+
+ test('instanceof', function() {
+ assert.instanceOf(el, HTMLElement);
+ assert.instanceOf(el, window.MyElement);
+ assert.instanceOf(el, window.SubElement);
+ });
+
+ test('lifecycle', function() {
+ assert.equal(el._calledConstructor, 2);
+ assert.equal(el._calledConnectedCallback, 2);
+ assert.equal(el._calledReady, 2);
+ assert.equal(el._callAttributeChangedCallback, 0);
+ });
+
+ test('listeners', function() {
+ el.dispatchEvent(new CustomEvent('click'));
+ assert.equal(el._tapListener.callCount, 2);
+ });
+
+ test('properties', function() {
+ assert.equal(el.prop, 'sub');
+ assert.equal(el.prop2, 'prop2');
+ assert.isTrue(el._propertiesChanged.calledOnce);
+ assert.deepEqual(el._propertiesChanged.args[0][0], {prop: 'sub', prop2: 'prop2'});
+ });
+
+ test('attributes', function() {
+ const fixtureEl = fixture('sub-element-attr');
+ assert.equal(fixtureEl.prop, 'attr');
+ assert.equal(fixtureEl.prop2, 'attr');
+ assert.equal(fixtureEl.camelCase, 'camelCase');
+ assert.equal(fixtureEl.camelCase2, 'camelCase2');
+ assert.equal(fixtureEl._callAttributeChangedCallback, 5);
+ });
+
+});
+
+suite('mixin', function() {
+
+ let el;
+
+ setup(function() {
+ el = document.createElement('sub-mixin-element');
+ document.body.appendChild(el);
+ });
+
+ teardown(function() {
+ document.body.removeChild(el);
+ });
+
+ test('instanceof', function() {
+ assert.instanceOf(el, HTMLElement);
+ assert.instanceOf(el, window.MyElement);
+ assert.instanceOf(el, window.SubElement);
+ assert.instanceOf(el, window.SubMixinElement);
+ });
+
+ test('lifecycle', function() {
+ assert.equal(el._calledConstructor, 4);
+ assert.equal(el._calledConnectedCallback, 4);
+ assert.equal(el._calledReady, 4);
+ assert.equal(el._callAttributeChangedCallback, 0);
+ });
+
+ test('listeners', function() {
+ el.dispatchEvent(new CustomEvent('click'));
+ assert.equal(el._tapListener.callCount, 4);
+ });
+
+ test('properties', function() {
+ assert.equal(el.prop, 'sub');
+ assert.equal(el.prop2, 'prop2');
+ assert.equal(el.mixin, 'mixin');
+ assert.equal(el.prop3, 'prop3');
+ assert.isTrue(el._propertiesChanged.calledOnce);
+ assert.deepEqual(el._propertiesChanged.args[0][0], {prop: 'sub', prop2: 'prop2', mixin: 'mixin', prop3: 'prop3'});
+ });
+
+ test('attributes', function() {
+ const fixtureEl = fixture('sub-mixin-element-attr');
+ assert.strictEqual(fixtureEl.prop, 'attr');
+ assert.strictEqual(fixtureEl.prop2, 'attr');
+ assert.strictEqual(fixtureEl.prop3, 'attr');
+ assert.strictEqual(fixtureEl.mixin, 5);
+ assert.equal(fixtureEl._callAttributeChangedCallback, 5);
+ });
+
+});
+</script>
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/properties-changed.html b/third_party/polymer3/bower_components/polymer/test/unit/properties-changed.html
new file mode 100644
index 0000000..4d3329c
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/properties-changed.html
@@ -0,0 +1,168 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+<body>
+
+<x-foo prop1="a" prop2="b"></x-foo>
+
+<script type="module">
+import { PropertiesChanged } from '../../lib/mixins/properties-changed.js';
+class XFoo extends PropertiesChanged(HTMLElement) {
+ static get observedAttributes() {
+ return ['prop1', 'prop2'];
+ }
+ constructor() {
+ super();
+ this._propertiesChanged = sinon.spy();
+ }
+ connectedCallback() {
+ this._enableProperties();
+ }
+
+ attributeChangedCallback(name, old, value) {
+ if (value !== old) {
+ this._setProperty(name, value);
+ }
+ }
+
+ get prop1() {
+ return this._getProperty('prop1');
+ }
+
+ set prop1(value) {
+ this.setAttribute('prop1', value);
+ }
+
+ get prop2() {
+ return this._getProperty('prop2');
+ }
+
+ set prop2(value) {
+ this.setAttribute('prop2', value);
+ }
+}
+window.XFoo = XFoo;
+customElements.define('x-foo', XFoo);
+
+class ShouldPropertiesChange extends PropertiesChanged(HTMLElement) {
+ constructor() {
+ super();
+ this._propertiesChanged = sinon.spy();
+ }
+
+ connectedCallback() {
+ this._enableProperties();
+ //this._flushProperties();
+ }
+
+ _shouldPropertiesChange() {
+ return true;
+ }
+}
+
+customElements.define('should-properties-change', ShouldPropertiesChange);
+</script>
+
+<script type="module">
+
+suite('properties-changed', function() {
+
+ test('attributes reflected to properties via upgrade', function() {
+ var el = document.querySelector('x-foo');
+ assert.equal(el.prop1, 'a');
+ assert.equal(el.prop2, 'b');
+ });
+
+ test('setting properties results in _propertiesChanged', function(done) {
+ var el = document.createElement('x-foo');
+ document.body.appendChild(el);
+ el.prop1 = 'a';
+ el.prop2 = 'b';
+ assert.equal(el._propertiesChanged.callCount, 0, '_propertiesChanged is not async');
+ setTimeout(function() {
+ assert.isTrue(el._propertiesChanged.calledOnce);
+ assert.equal(el._propertiesChanged.getCall(0).args[0].prop1, 'a');
+ assert.equal(el._propertiesChanged.getCall(0).args[0].prop2, 'b');
+ assert.equal(el._propertiesChanged.getCall(0).args[1].prop1, 'a');
+ assert.equal(el._propertiesChanged.getCall(0).args[1].prop2, 'b');
+ assert.equal(el._propertiesChanged.getCall(0).args[2].prop1, undefined);
+ assert.equal(el._propertiesChanged.getCall(0).args[2].prop2, undefined);
+ assert.equal(el.prop1, 'a');
+ assert.equal(el.prop2, 'b');
+ el.prop1 = 'aa';
+ setTimeout(function() {
+ assert.isTrue(el._propertiesChanged.calledTwice);
+ assert.equal(el._propertiesChanged.getCall(1).args[0].prop1, 'aa');
+ assert.equal(el._propertiesChanged.getCall(1).args[0].prop2, 'b');
+ assert.equal(el._propertiesChanged.getCall(1).args[1].prop1, 'aa');
+ assert.equal(el._propertiesChanged.getCall(1).args[2].prop1, 'a');
+ assert.isFalse('prop2' in el._propertiesChanged.getCall(1).args[1]);
+ assert.isFalse('prop2' in el._propertiesChanged.getCall(1).args[2]);
+ done();
+ });
+ });
+ });
+
+ test('setting attributes results in _propertiesChanged', function(done) {
+ var el = document.createElement('x-foo');
+ document.body.appendChild(el);
+ el.setAttribute('prop1', 'a');
+ el.setAttribute('prop2', 'b');
+ setTimeout(function() {
+ assert.isTrue(el._propertiesChanged.calledOnce);
+ assert.equal(el._propertiesChanged.getCall(0).args[0].prop1, 'a');
+ assert.equal(el._propertiesChanged.getCall(0).args[0].prop2, 'b');
+ assert.equal(el._propertiesChanged.getCall(0).args[1].prop1, 'a');
+ assert.equal(el._propertiesChanged.getCall(0).args[1].prop2, 'b');
+ assert.equal(el._propertiesChanged.getCall(0).args[2].prop1, undefined);
+ assert.equal(el._propertiesChanged.getCall(0).args[2].prop2, undefined);
+ assert.equal(el.prop1, 'a');
+ assert.equal(el.prop2, 'b');
+ el.setAttribute('prop1', 'aa');
+ setTimeout(function() {
+ assert.isTrue(el._propertiesChanged.calledTwice);
+ assert.equal(el._propertiesChanged.getCall(1).args[0].prop1, 'aa');
+ assert.equal(el._propertiesChanged.getCall(1).args[0].prop2, 'b');
+ assert.equal(el._propertiesChanged.getCall(1).args[1].prop1, 'aa');
+ assert.equal(el._propertiesChanged.getCall(1).args[2].prop1, 'a');
+ assert.isFalse('prop2' in el._propertiesChanged.getCall(1).args[1]);
+ assert.isFalse('prop2' in el._propertiesChanged.getCall(1).args[2]);
+ done();
+ });
+
+ });
+ });
+
+ test('shouldPropertiesChange', function(done) {
+ const el = document.createElement('should-properties-change');
+ document.body.appendChild(el);
+ assert.isTrue(el._propertiesChanged.calledOnce);
+ el._invalidateProperties();
+ setTimeout(function() {
+ assert.isTrue(el._propertiesChanged.calledTwice);
+ el._setProperty('foo', true);
+ setTimeout(function() {
+ assert.isTrue(el._propertiesChanged.calledThrice);
+ done();
+ });
+ });
+ });
+});
+</script>
+
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/property-accessors.html b/third_party/polymer3/bower_components/polymer/test/unit/property-accessors.html
new file mode 100644
index 0000000..b50510b
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/property-accessors.html
@@ -0,0 +1,143 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+<body>
+
+<x-foo prop1="a" prop2="b"></x-foo>
+
+<script type="module">
+import { PropertyAccessors } from '../../lib/mixins/property-accessors.js';
+class XFoo extends PropertyAccessors(HTMLElement) {
+ static get observedAttributes() {
+ return ['prop1', 'prop2'];
+ }
+ constructor() {
+ super();
+ this._propertiesChanged = sinon.spy();
+ }
+ connectedCallback() {
+ this._enableProperties();
+ }
+}
+XFoo.createPropertiesForAttributes();
+window.XFoo = XFoo;
+customElements.define('x-foo', XFoo);
+</script>
+
+<script type="module">
+
+suite('property-accessors', function() {
+
+ test('createPropertiesForAttributes creates accessors', function() {
+ assert.ok(Object.getOwnPropertyDescriptor(window.XFoo.prototype, 'prop1'));
+ assert.ok(Object.getOwnPropertyDescriptor(window.XFoo.prototype, 'prop2'));
+ });
+
+ test('attributes reflected to properties via upgrade', function() {
+ var el = document.querySelector('x-foo');
+ assert.equal(el.prop1, 'a');
+ assert.equal(el.prop2, 'b');
+ });
+
+ test('setting properties results in _propertiesChanged', function(done) {
+ var el = document.createElement('x-foo');
+ document.body.appendChild(el);
+ el.prop1 = 'a';
+ el.prop2 = 'b';
+ assert.equal(el._propertiesChanged.callCount, 0, '_propertiesChanged is not async');
+ setTimeout(function() {
+ assert.isTrue(el._propertiesChanged.calledOnce);
+ assert.equal(el._propertiesChanged.getCall(0).args[0].prop1, 'a');
+ assert.equal(el._propertiesChanged.getCall(0).args[0].prop2, 'b');
+ assert.equal(el._propertiesChanged.getCall(0).args[1].prop1, 'a');
+ assert.equal(el._propertiesChanged.getCall(0).args[1].prop2, 'b');
+ assert.equal(el._propertiesChanged.getCall(0).args[2].prop1, undefined);
+ assert.equal(el._propertiesChanged.getCall(0).args[2].prop2, undefined);
+ assert.equal(el.prop1, 'a');
+ assert.equal(el.prop2, 'b');
+ el.prop1 = 'aa';
+ setTimeout(function() {
+ assert.isTrue(el._propertiesChanged.calledTwice);
+ assert.equal(el._propertiesChanged.getCall(1).args[0].prop1, 'aa');
+ assert.equal(el._propertiesChanged.getCall(1).args[0].prop2, 'b');
+ assert.equal(el._propertiesChanged.getCall(1).args[1].prop1, 'aa');
+ assert.equal(el._propertiesChanged.getCall(1).args[2].prop1, 'a');
+ assert.isFalse('prop2' in el._propertiesChanged.getCall(1).args[1]);
+ assert.isFalse('prop2' in el._propertiesChanged.getCall(1).args[2]);
+ done();
+ });
+ });
+ });
+
+ test('setting attributes results in _propertiesChanged', function(done) {
+ var el = document.createElement('x-foo');
+ document.body.appendChild(el);
+ el.setAttribute('prop1', 'a');
+ el.setAttribute('prop2', 'b');
+ setTimeout(function() {
+ assert.isTrue(el._propertiesChanged.calledOnce);
+ assert.equal(el._propertiesChanged.getCall(0).args[0].prop1, 'a');
+ assert.equal(el._propertiesChanged.getCall(0).args[0].prop2, 'b');
+ assert.equal(el._propertiesChanged.getCall(0).args[1].prop1, 'a');
+ assert.equal(el._propertiesChanged.getCall(0).args[1].prop2, 'b');
+ assert.equal(el._propertiesChanged.getCall(0).args[2].prop1, undefined);
+ assert.equal(el._propertiesChanged.getCall(0).args[2].prop2, undefined);
+ assert.equal(el.prop1, 'a');
+ assert.equal(el.prop2, 'b');
+ el.setAttribute('prop1', 'aa');
+ setTimeout(function() {
+ assert.isTrue(el._propertiesChanged.calledTwice);
+ assert.equal(el._propertiesChanged.getCall(1).args[0].prop1, 'aa');
+ assert.equal(el._propertiesChanged.getCall(1).args[0].prop2, 'b');
+ assert.equal(el._propertiesChanged.getCall(1).args[1].prop1, 'aa');
+ assert.equal(el._propertiesChanged.getCall(1).args[2].prop1, 'a');
+ assert.isFalse('prop2' in el._propertiesChanged.getCall(1).args[1]);
+ assert.isFalse('prop2' in el._propertiesChanged.getCall(1).args[2]);
+ done();
+ });
+
+ });
+ });
+
+ suite('testing for deserialization of date', function() {
+ let date;
+
+ setup(function() {
+ date = new Date();
+ });
+
+ test('can handle string timestamp', function() {
+ const deserializedDate = window.XFoo.prototype._deserializeValue(String(date.getTime()), Date);
+ assert.equal(deserializedDate.getTime(), date.getTime());
+ });
+
+ test('can handle number timestamp', function() {
+ const deserializedDate = window.XFoo.prototype._deserializeValue(date.getTime(), Date);
+ assert.equal(deserializedDate.getTime(), date.getTime());
+ });
+
+ test('can handle full date', function() {
+ const deserializedDate = window.XFoo.prototype._deserializeValue(date.toString(), Date);
+ assert.equal(deserializedDate.toString(), date.toString());
+ });
+ });
+
+});
+</script>
+
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/property-effects-elements.js b/third_party/polymer3/bower_components/polymer/test/unit/property-effects-elements.js
new file mode 100644
index 0000000..7986f2a
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/property-effects-elements.js
@@ -0,0 +1,1029 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+
+import { StrictBindingParser } from '../../lib/mixins/strict-binding-parser.js';
+import { Polymer } from '../../lib/legacy/polymer-fn.js';
+import { html } from '../../lib/utils/html-tag.js';
+import { PolymerElement } from '../../polymer-element.js';
+import { MutableDataBehavior } from '../../lib/legacy/mutable-data-behavior.js';
+import { MutableData } from '../../lib/mixins/mutable-data.js';
+let ComputingBehavior = {
+ properties: {
+ computeFromBehavior: Function
+ },
+ computeFromBehavior: function(value) {
+ return 'computed:' + value;
+ }
+};
+Polymer({
+ _template: html`
+ <div id="boundChild" value="{{ value }}" negvalue="{{!bool}}" attrvalue\$="{{attrvalue}}" sanitize-value="{{sanitizeValue}}" computedvalue="{{computedvalue}}" computedvaluetwo="{{computedvaluetwo}}" camel-case="{{value}}" computed-inline="{{computeInline(value,add, divide)}}" computed-inline2="{{computeInline(value, add,divide)}}" computed-inline3="{{computeInline(value, add,
+ divide )}}" computedattribute\$="{{computeInline(value, add,divide)}}" computedattribute2\$="{{computeInline(
+ value, add, divide)}}" neg-computed-inline="{{!computeInline(value,add,divide)}}" computed-negative-number="{{computeNegativeNumber(-1)}}" computed-negative-literal="{{computeNegativeNumber(-A)}}" computed-wildcard="{{computeWildcard(a, b.*)}}" style\$="{{boundStyle}}" data-id\$="{{dataSetId}}" custom-event-value="{{customEventValue::custom}}" custom-event-object-value="{{customEventObject.value::change}}" computed-from-mixed-literals="{{computeFromLiterals(3, "foo", bool)}}" computed-from-pure-literals="{{computeFromLiterals( 3, "foo")}}" computed-from-tricky-function="{{\$computeTrickyFunctionFromLiterals( 3, "foo")}}" computed-from-tricky-literals="{{computeFromTrickyLiterals(3, 'tricky\\,\\'zot\\'')}}" computed-from-tricky-literals2="{{computeFromTrickyLiterals(3,"tricky\\,'zot'" )}}" computed-from-tricky-literals3="{{computeFromTrickyLiterals(3,
+ "tricky\\,'zot'" )}}" computed-from-no-args="{{computeFromNoArgs( )}}" no-computed="{{foobared(noInlineComputed)}}" compoundattr1\$="{{cpnd1}}{{ cpnd2 }}{{cpnd3.prop}}{{ computeCompound(cpnd4, cpnd5, 'literalComputed')}}" compoundattr2\$="literal1 {{cpnd1}} literal2 {{cpnd2}}{{cpnd3.prop}} literal3 {{computeCompound(cpnd4, cpnd5, 'literalComputed')}} literal4" compoundattr3\$="[yes/no]: {{cpnd1}}, {{computeCompound('world', 'username ', 'Hello {0} ')}}" computed-from-behavior="{{computeFromBehavior(value)}}" computed-dynamic-fn="{{dynamicFn('hello', 'username')}}">
+ Test
+ <!-- Malformed bindings to be ignored -->
+ {{really.long.identifier.in.malformed.binding.should.be.ignored]}
+ {{computeFromLiterals(3, 'really.long.literal.in.malformed.binding.should.be.ignored)]}
+ <!-- Should still parse -->
+ {{computeFromLiterals(3, 'foo', bool)}}
+ </div>
+ <x-prop id="boundProps" prop1="{{cpnd1}}{{ cpnd2 }}{{cpnd3.prop}}{{ computeCompound(cpnd4, cpnd5, 'literalComputed')}}" prop2="literal1 {{cpnd1}} literal2 {{cpnd2}}{{cpnd3.prop}} literal3 {{computeCompound(cpnd4, cpnd5, 'literalComputed')}} literal4"></x-prop>
+ <span id="boundText">{{text}}</span>
+ <span id="sanitizeText">{{sanitizeText}}</span>
+ <span idtest="" id="{{boundId}}"></span>
+ <s id="computedContent">{{computeFromTrickyLiterals(3, 'tricky\\,\\'zot\\'')}}</s>
+ <s id="computedContent2">{{computeFromTrickyLiterals("(",3)}}</s>
+ <input id="boundInput" value="{{text::input}}">
+ <textarea id="boundTextArea" value="{{text::input}}"></textarea>
+ <div id="compound1">{{cpnd1}}{{cpnd2}}{{cpnd3.prop}}{{computeCompound(cpnd4, cpnd5, 'literalComputed')}}</div>
+ <div id="compound2">
+ literal1 {{cpnd1}} literal2 {{cpnd2}}{{cpnd3.prop}} literal3 {{computeCompound(cpnd4, cpnd5, 'literalComputed')}} literal4
+ </div>
+ <span id="boundWithDash">{{objectWithDash.binding-with-dash}}</span>
+ <script id="scriptWithBinding">
+ /* eslint-disable no-unused-vars */
+ function foo() {
+ return "We have a {{binding}} here";
+ }
+ /* eslint-enable no-unused-vars */
+ </script>
+ <style id="styleWithBinding">
+ :host {
+ content: '[[binding]]'
+ }
+ </style>
+ <span id="boundWithSlash">[[objectWithSlash.binding/with/slash]]</span>
+ <span id="jsonContent">[["Jan", 31],["Feb", 28],["Mar", 31]]</span>
+ <span id="nonEnglishUnicode">{{objectWithNonEnglishUnicode.商品名}}</span>
+ <span id="booleanTrue">foo(field, true): {{computeWithBoolean(otherValue, true)}}</span>
+ <span id="booleanFalse">foo(field, false): {{computeWithBoolean(otherValue, false)}}</span>
+`,
+
+ is: 'x-basic',
+ behaviors: [ComputingBehavior],
+
+ properties: {
+ value: {
+ type: Number,
+ observer: 'valueChanged',
+ value: 10
+ },
+ computedvalue: {
+ computed: 'computeValue(value)',
+ observer: 'computedvalueChanged'
+ },
+ computedvaluetwo: {
+ computed: 'computeValue(valuetwo)',
+ observer: 'computedvaluetwoChanged'
+ },
+ notifyingvalue: {
+ type: Number,
+ notify: true,
+ observer: 'notifyingvalueChanged'
+ },
+ notifyingvalueWithDefault: {
+ notify: true,
+ value: 99
+ },
+ computednotifyingvalue: {
+ type: Number,
+ notify: true,
+ // Naming here is to test that a private setter is not created for
+ // computed properties
+ computed: '_setComputednotifyingvalue(notifyingvalue)'
+ },
+ computedFromMultipleValues: {
+ type: Number,
+ notify: true,
+ computed: 'computeFromMultipleValues(sum1, sum2, divide)',
+ observer: 'computedFromMultipleValuesChanged'
+ },
+ camelNotifyingValue: {
+ type: Number,
+ notify: true
+ },
+ readonlyvalue: {
+ type: Number,
+ readOnly: true,
+ notify: true,
+ observer: 'readonlyvalueChanged'
+ },
+ notifierWithoutComputing: {
+ type: Number,
+ observer: 'notifierWithoutComputingChanged',
+ notify: true,
+ value: 0
+ },
+ add: {
+ value: 20
+ },
+ divide: {
+ value: 2
+ },
+ customEventValue: {
+ type: Number,
+ observer: 'customEventValueChanged'
+ },
+ customEventObject: {
+ type: Object,
+ value: function() { return {}; }
+ },
+ boundId: {
+ type: String,
+ value: 'span'
+ },
+ noObserver: {
+ observer: 'foobared'
+ },
+ noComputedProp: {
+ computed: 'foobared(noComputed)'
+ },
+ objectWithDash: {
+ type: Object
+ },
+ title: {
+ observer: 'titleChanged'
+ },
+ dynamicFn: {
+ type: Function
+ }
+ },
+
+ observers: [
+ 'multipleDepChangeHandler(dep1, dep2, dep3)',
+ 'customEventObjectValueChanged(customEventObject.value)',
+ 'foobared(noComplexObserver.*)'
+ ],
+
+ created: function() {
+ this.observerCounts = {
+ valueChanged: 0,
+ computedvalueChanged: 0,
+ computedvaluetwoChanged: 0,
+ notifyingvalueChanged: 0,
+ readonlyvalueChanged: 0,
+ computedFromMultipleValuesChanged: 0,
+ multipleDepChangeHandler: 0,
+ customEventValueChanged: 0,
+ customEventObjectValueChanged: 0,
+ notifierWithoutComputingChanged: 0
+ };
+ this.titleChanged = sinon.spy();
+ this._dynamicFnCalled = false;
+ },
+
+ ready: function() {
+ this.isReady = true;
+ },
+
+ clearObserverCounts: function() {
+ for (var i in this.observerCounts) {
+ this.observerCounts[i] = 0;
+ }
+ },
+
+ valueChanged: function(val, old) {
+ this.observerCounts.valueChanged++;
+ assert.equal(arguments.length, 2, 'observer argument length wrong');
+ assert.equal(val, this.value, 'observer value argument wrong');
+ assert.equal(old, this._value, 'observer old argument wrong');
+ this._value = val;
+ },
+
+ computeValue: function(val) {
+ return val + 1;
+ },
+
+ computedvalueChanged: function(val, old) {
+ this.observerCounts.computedvalueChanged++;
+ assert.equal(arguments.length, 2, 'observer argument length wrong');
+ assert.equal(val, this.computedvalue, 'observer value argument wrong');
+ assert.equal(old, this._computedvalue, 'observer old argument wrong');
+ this._computedvalue = val;
+ },
+
+ computedvaluetwoChanged: function(val, old) {
+ this.observerCounts.computedvaluetwoChanged++;
+ assert.equal(arguments.length, 2, 'observer argument length wrong');
+ assert.equal(val, this.computedvaluetwo, 'observer value argument wrong');
+ assert.equal(old, this._computedvaluetwo, 'observer old argument wrong');
+ this._computedvaluetwo = val;
+ },
+
+ notifyingvalueChanged: function(val, old) {
+ this.observerCounts.notifyingvalueChanged++;
+ assert.equal(arguments.length, 2, 'observer argument length wrong');
+ assert.equal(val, this.notifyingvalue, 'observer value argument wrong');
+ assert.equal(old, this._notifyingvalue, 'observer old argument wrong');
+ this._notifyingvalue = val;
+ },
+
+ readonlyvalueChanged: function(val, old) {
+ this.observerCounts.readonlyvalueChanged++;
+ assert.equal(arguments.length, 2, 'observer argument length wrong');
+ assert.equal(val, this.readonlyvalue, 'observer value argument wrong');
+ assert.equal(old, this._readonlyvalue, 'observer old argument wrong');
+ this._readonlyvalue = val;
+ },
+
+ notifierWithoutComputingChanged: function() {
+ this.observerCounts.notifierWithoutComputingChanged++;
+ },
+
+ _setComputednotifyingvalue: function(val) {
+ return val + 2;
+ },
+
+ computeFromMultipleValues: function(sum1, sum2, divide) {
+ assert.equal(arguments.length, 3, 'observer argument length wrong');
+ assert.equal(sum1, this.sum1, 'observer value argument wrong');
+ assert.equal(sum2, this.sum2, 'observer value argument wrong');
+ assert.equal(divide, this.divide, 'observer value argument wrong');
+ if (!isNaN(sum1) && !isNaN(sum2) && !isNaN(divide)) {
+ return (sum1 + sum2) / divide;
+ }
+ },
+
+ computedFromMultipleValuesChanged: function(val, old) {
+ this.observerCounts.computedFromMultipleValuesChanged++;
+ assert.equal(arguments.length, 2, 'observer argument length wrong');
+ assert.equal(val, this.computedFromMultipleValues, 'observer value argument wrong');
+ assert.equal(old, this._computedFromMultipleValues, 'observer old argument wrong');
+ this._computedFromMultipleValues = val;
+ },
+
+ multipleDepChangeHandler: function(dep1, dep2, dep3) {
+ this.observerCounts.multipleDepChangeHandler++;
+ assert.equal(arguments.length, 3, 'observer argument length wrong');
+ assert.equal(dep1, this.dep1, 'dependency 1 argument wrong');
+ assert.equal(dep2, this.dep2, 'dependency 2 argument wrong');
+ assert.equal(dep3, this.dep3, 'dependency 3 argument wrong');
+ },
+
+ computeInline: function(value, add, divide) {
+ assert.equal(arguments.length, 3, 'observer argument length wrong');
+ assert.equal(value, this.value, 'dependency 1 argument wrong');
+ assert.equal(add, this.add, 'dependency 2 argument wrong');
+ assert.equal(divide, this.divide, 'dependency 3 argument wrong');
+ return (value + add) / divide;
+ },
+
+ customEventValueChanged: function(val, old) {
+ this.observerCounts.customEventValueChanged++;
+ assert.equal(arguments.length, 2, 'observer argument length wrong');
+ assert.equal(val, this.customEventValue, 'observer value argument wrong');
+ assert.equal(old, this._customEventValue, 'observer old argument wrong');
+ this._customEventValue = val;
+ },
+
+ customEventObjectValueChanged: function(val) {
+ this.observerCounts.customEventObjectValueChanged++;
+ assert.equal(arguments.length, 1, 'observer argument length wrong');
+ assert.equal(val, this.customEventObject.value, 'observer value argument wrong');
+ // note, no `old` argument for path observers
+ },
+
+ computeFromLiterals: function(num, str) {
+ assert.equal(num, 3);
+ assert.equal(str, 'foo');
+ return num + str;
+ },
+
+ $computeTrickyFunctionFromLiterals: function(num, str) {
+ return this.computeFromLiterals(num, str);
+ },
+
+ computeFromTrickyLiterals: function(a, b) {
+ return a + b;
+ },
+
+ computeFromNoArgs: function() {
+ return 'no args!';
+ },
+
+ computeNegativeNumber: function (num) {
+ return num;
+ },
+
+ computeCompound: function(a, b, c) {
+ return '' + (c || '') + (b || '') + (a || '');
+ },
+
+ computeWildcard: function(a, bInfo) {
+ return a + (bInfo && bInfo.base ? bInfo.base.value : 0);
+ },
+
+ computeWithBoolean: function(value, bool) {
+ return bool ? value : value * 2;
+ },
+
+ fireCustomNotifyingEvent: function() {
+ this.customNotifyingValue = 'changed!';
+ this.dispatchEvent(new CustomEvent('custom-notifying-value-changed'),
+ {value: this.customNotifyingValue});
+ },
+
+ dynamicFn: function() {}
+});
+
+class XBasicWithStrictBindingParser extends StrictBindingParser(customElements.get('x-basic')) {
+ static get is() { return 'x-basic-strict-binding-parser'; }
+}
+customElements.define(XBasicWithStrictBindingParser.is, XBasicWithStrictBindingParser);
+Polymer({
+ _template: html`
+ <x-basic id="basic1" value="{{boundvalue}}" notifyingvalue="{{boundnotifyingvalue}}" notifyingvalue-with-default="{{boundnotifyingvalueWithDefault}}" camel-notifying-value="{{boundnotifyingvalue}}" computedvalue="{{boundcomputedvalue}}" computednotifyingvalue="{{boundcomputednotifyingvalue}}" readonlyvalue="{{boundreadonlyvalue}}" custom-notifying-value="{{boundCustomNotifyingValue}}">
+ </x-basic>
+ <x-basic id="basic2" value="[[boundvalue]]" notifyingvalue="[[boundnotifyingvalue]]" computedvalue="[[boundcomputedvalue]]" computednotifyingvalue="[[boundcomputednotifyingvalue]]">
+ </x-basic>
+ <x-basic id="basic3" notifyingvalue="{{computedValue}}" computedvalue="{{value}}">
+ </x-basic>
+ <x-basic id="basic4" notifyingvalue="{{!negatedValue}}">
+ </x-basic>
+`,
+
+ is: 'x-compose',
+
+ observers: [
+ 'boundvalueChanged(boundvalue)',
+ 'boundnotifyingvalueChanged(boundnotifyingvalue)',
+ 'boundcomputedvalueChanged(boundcomputedvalue)',
+ 'boundcomputednotifyingvalueChanged(boundcomputednotifyingvalue)',
+ 'boundreadonlyvalueChanged(boundreadonlyvalue)',
+ 'boundCustomNotifyingValueChanged(boundCustomNotifyingValue)',
+ 'boundnotifyingvalueWithDefaultChanged(boundnotifyingvalueWithDefault)'
+ ],
+
+ properties: {
+ a: {
+ value: 10
+ },
+ b: {
+ value: 20
+ },
+ computedValue: {
+ computed: 'computeComputedValue(a, b)'
+ },
+ negatedValue: {
+ value: false
+ }
+ },
+
+ created: function() {
+ this.observerCounts = {
+ boundvalueChanged: 0,
+ boundnotifyingvalueChanged: 0,
+ boundcomputedvalueChanged: 0,
+ boundcomputednotifyingvalueChanged: 0,
+ boundreadonlyvalueChanged: 0,
+ boundCustomNotifyingValueChanged: 0,
+ boundnotifyingvalueWithDefault: 0
+ };
+ },
+
+ computeComputedValue: function(a, b) {
+ return a + b;
+ },
+
+ clearObserverCounts: function() {
+ for (var i in this.observerCounts) {
+ this.observerCounts[i] = 0;
+ }
+ },
+
+ assertClientsReady: function() {
+ assert.isTrue(this.$.basic1.isReady, 'basic1 not `ready` by observer time');
+ assert.isTrue(this.$.basic2.isReady, 'basic2 element not `ready` by observer time');
+ assert.isTrue(this.$.basic3.isReady, 'basic3 element not `ready` by observer time');
+ assert.isTrue(this.$.basic4.isReady, 'basic4 element not `ready` by observer time');
+ },
+
+ boundvalueChanged: function() {
+ this.assertClientsReady();
+ this.observerCounts.boundvalueChanged++;
+ },
+
+ boundnotifyingvalueChanged: function() {
+ this.assertClientsReady();
+ this.observerCounts.boundnotifyingvalueChanged++;
+ },
+
+ boundcomputedvalueChanged: function() {
+ this.assertClientsReady();
+ this.observerCounts.boundcomputedvalueChanged++;
+ },
+
+ boundcomputednotifyingvalueChanged: function() {
+ this.assertClientsReady();
+ this.observerCounts.boundcomputednotifyingvalueChanged++;
+ },
+
+ boundreadonlyvalueChanged: function() {
+ this.assertClientsReady();
+ this.observerCounts.boundreadonlyvalueChanged++;
+ },
+
+ boundCustomNotifyingValueChanged: function() {
+ this.assertClientsReady();
+ this.observerCounts.boundCustomNotifyingValueChanged++;
+ },
+
+ boundnotifyingvalueWithDefaultChanged: function() {
+ this.assertClientsReady();
+ this.observerCounts.boundnotifyingvalueWithDefault++;
+ }
+});
+Polymer({
+ _template: html`
+ <slot name="drawer"></slot>
+ <div id="before"></div>
+ <x-basic id="basic1" on-notifyingvalue-with-default-changed="handleNotify">
+ </x-basic>
+ <div id="later"></div>
+`,
+
+ is: 'x-handle-notify-event',
+
+ properties: {
+ prop: {
+ observer: 'propChanged'
+ }
+ },
+
+ created: function() {
+ this.readySpy = sinon.spy();
+ this.afterSettingProp = sinon.spy();
+ this.propChanged = sinon.spy();
+ this.handleNotify = sinon.spy(function() {
+ this.prop = 'prop';
+ this.afterSettingProp();
+ });
+ },
+
+ ready: function() {
+ this.readySpy();
+ }
+});
+Polymer({
+ is: 'x-reflect',
+ properties: {
+ reflectedobject: {
+ type: Object,
+ reflectToAttribute: true
+ },
+ reflectedarray: {
+ type: Array,
+ reflectToAttribute: true
+ },
+ reflectedNumber: {
+ type: Number,
+ reflectToAttribute: true
+ },
+ reflectedstring: {
+ type: String,
+ reflectToAttribute: true
+ },
+ reflectedboolean: {
+ type: Boolean,
+ reflectToAttribute: true
+ },
+ reflecteddate: {
+ type: Date,
+ reflectToAttribute: true
+ }
+ }
+});
+Polymer({
+ is: 'x-prop',
+ properties: {
+ prop1: {
+ value: 'default',
+ observer: 'prop1Changed'
+ },
+ prop2: {
+ value: 'default',
+ observer: function(newProp, oldProp) { return this.prop2Changed(newProp, oldProp); }
+ }
+ },
+ created: function() {
+ this.prop1Changed = sinon.spy();
+ this.prop2Changed = sinon.spy();
+ }
+});
+Polymer({
+ is: 'x-notifies1',
+ properties: {
+ notifies: {
+ notify: true
+ }
+ },
+ ready: function() {
+ this.notifies = 'readyValue';
+ }
+});
+Polymer({
+ _template: html`
+ <x-notifies1 id="notifies1" notifies="{{shouldChange}}"></x-notifies1>
+`,
+
+ is: 'x-notifies2',
+
+ properties: {
+ notifies: {
+ notify: true
+ }
+ }
+});
+Polymer({
+ _template: html`
+ <x-notifies2 id="notifies2" notifies="{{shouldNotChange}}"></x-notifies2>
+`,
+
+ is: 'x-notifies3',
+
+ properties: {
+ shouldNotChange: {
+ observer: 'shouldNotChangeChanged'
+ }
+ },
+
+ shouldNotChangeChanged: function() { }
+});
+Polymer({
+ _template: html`
+ <p>©</p>
+ <p id="binding">{{myText}}</p>
+`,
+
+ is: "x-entity-and-binding",
+
+ properties: {
+ myText: {
+ type: String,
+ value: 'binding'
+ }
+ }
+});
+Polymer({
+ _template: html`
+ <input id="input" value\$="{{inputValue}}">
+`,
+
+ is: 'x-input-value'
+});
+Polymer({
+ _template: html`
+ <div id="check">{{isAttached}}</div>
+`,
+
+ is: 'x-bind-is-attached',
+
+ properties: {
+ isAttached: {
+ observer: '_isAttachedChanged'
+ }
+ },
+
+ _isAttachedChanged: function() {}
+});
+var invocations = [];
+Polymer({
+ _template: html`
+ <x-order-of-effects id="child" base="{{base}}"></x-order-of-effects>
+`,
+
+ is: 'x-order-of-effects-grand-parent',
+ initializeWhenCreated: true,
+
+ properties: {
+ base: {
+ observer: '_childPropertyChanged'
+ }
+ },
+
+ _childPropertyChanged: function() {
+ invocations.push('notify');
+ }
+});
+Polymer({
+ _template: html`
+ <x-order-of-effects-child prop1="[[base]]" prop2="[[_computedAnnotation(base)]]"></x-order-of-effects-child>
+`,
+
+ is: 'x-order-of-effects',
+ initializeWhenCreated: true,
+
+ properties: {
+ base: {
+ type: String,
+ observer: '_observer',
+ notify: true,
+ reflectToAttribute: true
+ },
+ computed: {
+ type: String,
+ computed: '_computed(base)'
+ }
+ },
+
+ observers: ['_complexObserver(base)'],
+
+ created: function() {
+ this.invocations = invocations;
+ },
+
+ attributeChanged(name) {
+ if (name == 'base') {
+ invocations.push('reflect');
+ }
+ },
+
+ _computed: function(base) {
+ invocations.push('compute');
+ return base;
+ },
+
+ _computedAnnotation: function(base) {
+ return base;
+ },
+
+ _observer: function() {
+ invocations.push('observe');
+ },
+
+ _complexObserver: function() {
+ invocations.push('observe');
+ }
+});
+Polymer({
+ is: 'x-order-of-effects-child',
+ properties: {
+ prop1: {
+ observer: '_prop1Changed'
+ },
+ prop2: {
+ observer: '_prop2Changed'
+ }
+ },
+ _prop1Changed: function() {
+ invocations.push('propagate');
+ },
+ _prop2Changed: function() {
+ invocations.push('propagate');
+ }
+});
+var TranslateBehavior = {
+ properties: {
+ translateMessage: {
+ type: Function,
+ computed: '_computeTranslateFn(translator)'
+ }
+ }
+};
+Polymer({
+ _template: html`
+ <div id="check">[[translateMessage('Hello World.')]]</div>
+`,
+
+ is: 'x-bind-computed-property',
+ behaviors: [TranslateBehavior],
+
+ properties: {
+ translator: {
+ type: Function,
+ value: function() {
+ return function(message) {
+ return 'translated: ' + message;
+ };
+ }
+ }
+ },
+
+ _computeTranslateFn: function(translator) {
+ return function(message) {
+ return translator(message);
+ };
+ }
+});
+Polymer({
+ _template: html`
+ <div id="check">[[translateMessage(message)]]</div>
+`,
+
+ is: 'x-bind-computed-property-late-translator',
+
+ properties: {
+ message: {
+ type: String,
+ value: 'Hello'
+ },
+ translateMessage: {
+ type: Function,
+ computed: '_computeTranslateFn(translator)'
+ },
+ translator: {
+ type: Function
+ }
+ },
+
+ _computeTranslateFn: function(translator) {
+ return function(message) {
+ return translator(message);
+ };
+ }
+});
+Polymer({
+ _template: html`
+ <div -u-p-c-a-s-e\$="[[UPCASE]]"></div>
+`,
+
+ is: 'x-bind-bad-attribute-name',
+
+ properties: {
+ UPCASE: {
+ type: String,
+ value: 'foo'
+ }
+ }
+});
+Polymer({
+ _template: html`
+ <template is="dom-if" if="[[visible]]">
+ <p>[[translateMessage('text')]]</p>
+ </template>
+`,
+
+ is: 'x-child-template-with-dynamic-fn',
+
+ properties: {
+ translateMessage: {
+ type: Function,
+ value: function () {
+ return function(str) {
+ return str;
+ };
+ }
+ },
+ visible: {
+ type: Boolean,
+ value: true
+ }
+ }
+});
+Polymer({
+ is: 'x-propagate',
+ properties: {
+ value: {
+ type: Number,
+ value: -1
+ }
+ },
+ observers: [
+ '_boundOne(value)',
+ '_boundTwo(value)'
+ ],
+ _boundOne: function(value) {
+ if (value < 0) {
+ this.value = 1;
+ }
+ },
+ _boundTwo: function(value) {
+ if (value < 0) {
+ this.value = 2;
+ }
+ }
+});
+class XRaw extends HTMLElement {
+ constructor() {
+ super();
+ this._value = null;
+ this.valueChangedCount = 0;
+ this.valueChanged = sinon.spy();
+ this.arrayChanged = sinon.spy();
+ this.compoundChanged = sinon.spy();
+ }
+ get value() {
+ return this._value;
+ }
+ set value(value) {
+ this._value = value;
+ this.valueChanged(value);
+ this.notify();
+ }
+ get compound() {
+ return this._compound;
+ }
+ set compound(value) {
+ this._compound = value;
+ this.compoundChanged(value);
+ }
+ increment() {
+ this._value++;
+ this.notify();
+ }
+ notify() {
+ this.dispatchEvent(new CustomEvent('value-changed'));
+ }
+ set array(value) {
+ this.arrayChanged(value);
+ this.textContent = value;
+ }
+}
+customElements.define('x-raw', XRaw);
+
+Polymer({
+ is: 'x-polymer',
+ created: function() {
+ this.arrayChanged = sinon.spy();
+ this.compoundChanged = sinon.spy();
+ },
+ observers: ['compoundChanged(compound)'],
+ set array(value) {
+ this._array = value;
+ this.arrayChanged(value);
+ },
+ get array() {
+ return this._array;
+ }
+});
+
+Polymer({
+ _template: html`
+ <x-polymer id="polymer" array="{{array}}" compound="**{{array}}**">{{array}}</x-polymer>
+ <x-raw id="raw" array="{{array}}" value="{{value}}" compound="**{{array}}**"></x-raw>
+`,
+
+ is: 'x-interop',
+
+ properties: {
+ value: {
+ value: 10
+ },
+ array: {
+ value: function() {
+ return [1,2,3];
+ }
+ }
+ }
+});
+
+Polymer({
+ is: 'x-template-proto',
+ _template: (function() {
+ let template = document.createElement('template');
+ template.innerHTML = '<div id="div" on-click="clicked">{{bound}}</div>';
+ return template;
+ })(),
+ properties: {
+ bound: {
+ value: 'yes'
+ }
+ },
+ clicked: sinon.spy()
+});
+
+let TemplateBehavior = {
+ _template: (function() {
+ let template = document.createElement('template');
+ template.innerHTML = '<div id="div" on-click="clicked">{{bound}}</div>';
+ return template;
+ })(),
+ properties: {
+ bound: {
+ value: 'yes'
+ }
+ },
+ clicked: sinon.spy()
+};
+
+Polymer({
+ is: 'x-template-behavior',
+ behaviors: [TemplateBehavior]
+});
+
+Polymer({
+ _template: html`
+ <x-immutable-b b="[[a.b]]" x="[[a.x]]" id="b"></x-immutable-b>
+`,
+
+ is: 'x-immutable-a',
+ observers: ['aChanged(a)', 'xChanged(x)'],
+
+ created() {
+ this.aChanged = sinon.spy();
+ this.xChanged = sinon.spy();
+ }
+});
+class XImmutableB extends PolymerElement {
+ static get template() {
+ return html`
+ <x-immutable-c c="[[b.c]]" x="[[b.x]]" id="c">
+ </x-immutable-c>
+`;
+ }
+
+ static get is() { return 'x-immutable-b'; }
+ static get observers() { return ['bChanged(b)', 'xChanged(x)']; }
+ constructor() {
+ super();
+ this.bChanged = sinon.spy();
+ this.xChanged = sinon.spy();
+ }
+}
+customElements.define('x-immutable-b', XImmutableB);
+Polymer({
+ is: 'x-immutable-c',
+ observers: ['cChanged(c)', 'xChanged(x)'],
+ created() {
+ this.cChanged = sinon.spy();
+ this.xChanged = sinon.spy();
+ }
+});
+Polymer({
+ _template: html`
+ <x-mutable-b b="[[a.b]]" x="[[a.x]]" id="b"></x-mutable-b>
+`,
+
+ is: 'x-mutable-a',
+ behaviors: [MutableDataBehavior],
+ observers: ['aChanged(a)', 'xChanged(x)'],
+
+ created() {
+ this.aChanged = sinon.spy();
+ this.xChanged = sinon.spy();
+ }
+});
+class XMutableB extends MutableData(PolymerElement) {
+ static get template() {
+ return html`
+ <x-mutable-c c="[[b.c]]" x="[[b.x]]" id="c">
+ </x-mutable-c>
+`;
+ }
+
+ static get is() { return 'x-mutable-b'; }
+ static get observers() { return ['bChanged(b)', 'xChanged(x)']; }
+ constructor() {
+ super();
+ this.bChanged = sinon.spy();
+ this.xChanged = sinon.spy();
+ }
+}
+customElements.define('x-mutable-b', XMutableB);
+Polymer({
+ is: 'x-mutable-c',
+ behaviors: [MutableDataBehavior],
+ observers: ['cChanged(c)', 'xChanged(x)'],
+ created() {
+ this.cChanged = sinon.spy();
+ this.xChanged = sinon.spy();
+ }
+});
+
+class SuperObserverElement extends PolymerElement {
+ static get is() { return 'super-observer-element'; }
+ static get properties() {
+ return {
+ prop: {
+ value: 'String',
+ observer() {
+ this.__observerCalled++;
+ }
+ }
+ };
+ }
+}
+SuperObserverElement.prototype.__observerCalled = 0;
+customElements.define(SuperObserverElement.is, SuperObserverElement);
+
+class SubObserverElement extends SuperObserverElement {
+ static get is() { return 'sub-observer-element'; }
+}
+customElements.define(SubObserverElement.is, SubObserverElement);
+
+class SVGElement extends PolymerElement {
+ static get template() {
+ return html`
+ <svg id="svg" viewBox="[[value]]"></svg>
+`;
+ }
+
+ static get is() { return 'svg-element'; }
+ static get properties() {
+ return {
+ value: {
+ type: String,
+ value: '0 0 50 50'
+ }
+ };
+ }
+}
+customElements.define(SVGElement.is, SVGElement);
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/property-effects-template.html b/third_party/polymer3/bower_components/polymer/test/unit/property-effects-template.html
new file mode 100644
index 0000000..2f761f6
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/property-effects-template.html
@@ -0,0 +1,824 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-element.js"></script>
+ <script type="module" src="../../lib/mixins/gesture-event-listeners.js"></script>
+ <script type="module" src="../../lib/elements/dom-if.js"></script>
+<body>
+
+<script type="module">
+import { PolymerElement } from '../../polymer-element.js';
+import '../../lib/mixins/gesture-event-listeners.js';
+import '../../lib/elements/dom-if.js';
+class XElementChild extends PolymerElement {
+ ready() {
+ super.ready();
+ window.lifecycleOrder.log(this, 'ready');
+ }
+}
+customElements.define('x-element-child', XElementChild);
+</script>
+
+<dom-module id="x-element">
+ <template>
+ [[prop]] - [[path]]
+ <x-element-child id="noBinding" log></x-element>
+ <x-element-child id="hasBinding" prop="{{prop}}" path="{{path}}" log></x-element>
+ <x-element-child id="events" on-click="handleClick" on-tap="handleTap"></x-element-child>
+ </template>
+ <script type="module">
+import { PolymerElement } from '../../polymer-element.js';
+import '../../lib/mixins/gesture-event-listeners.js';
+import '../../lib/elements/dom-if.js';
+class XElement extends PolymerElement {
+ static get is() { return 'x-element'; }
+ static get observers() { return ['propChanged(prop)', 'pathChanged(path)']; }
+ static get properties() { return { prop: { notify: true }, path: { notify: true } }; }
+ constructor() {
+ super();
+ this.propChanged = sinon.spy();
+ this.pathChanged = sinon.spy();
+ }
+ ready() {
+ super.ready();
+ window.lifecycleOrder.log(this, 'ready');
+ }
+}
+customElements.define('x-element', XElement);
+</script>
+</dom-module>
+
+<dom-module id="x-runtime">
+ <template>
+ <!-- Main template content -->
+ <style>
+ x-element {
+ display: block;
+ border-bottom: 10px solid orange;
+ }
+ </style>
+ <x-element id="first"></x-element>
+ <x-element id="textBinding">[[prop]] - [[obj.path]] - [[compute(prop, obj.path)]]</x-element>
+ <x-element id="propBinding" prop="{{prop}}" log="proto"></x-element>
+ <x-element id="pathBinding" path="{{obj.path}}"></x-element>
+ <x-element id="compoundPropBinding" compound="[[prop]] - [[obj.path]] - [[compute(prop, obj.path)]]"></x-element>
+ <x-element id="events" on-click="handleClick" on-tap="handleTap"></x-element>
+ <template id="domIf" is="dom-if" if="[[prop]]">
+ <x-element id="ifElement" prop="{{prop}}" path="{{obj.path}}"></x-element>
+ </template>
+ <!-- Nested template in Shadow DOM for runtime stamping -->
+ <template id="templateFromShadowDom">
+ <x-element early="[[earlyProp]]" id="first"></x-element>
+ <x-element id="events" on-click="handleClick" on-tap="handleTap"></x-element>
+ <template id="domIf" is="dom-if" if="[[prop]]">
+ <x-element id="ifElementSD" prop="{{prop}}" path="{{obj.path}}"></x-element>
+ </template>
+ <span></span><span></span><span></span><span></span>
+ <x-element id="compoundPropBinding" compound="[[prop]] - [[obj.path]] - [[compute(prop, obj.path)]]"></x-element>
+ <x-element id="pathBinding" path="{{obj.path}}"></x-element>
+ <x-element id="propBinding" prop="{{prop}}" log="shadow"></x-element>
+ <x-element id="textBinding">[[prop]] - [[obj.path]] - [[compute(prop, obj.path)]]</x-element>
+ </template>
+ </template>
+ <!-- Template in light DOM for runtime stamping -->
+ <template id="templateFromLightDom">
+ <x-element id="first"></x-element>
+ <span></span><span></span><span></span><span></span>
+ <x-element id="compoundPropBinding" compound="[[prop]] - [[obj.path]] - [[compute(prop, obj.path)]]"></x-element>
+ <x-element id="pathBinding" path="{{obj.path}}"></x-element>
+ <x-element id="propBinding" prop="{{prop}}" log="light"></x-element>
+ <x-element id="textBinding">[[prop]] - [[obj.path]] - [[compute(prop, obj.path)]]</x-element>
+ <x-element id="events" on-click="handleClick" on-tap="handleTap"></x-element>
+ <template id="domIf" is="dom-if" if="[[prop]]">
+ <x-element id="ifElementLD" prop="{{prop}}" path="{{obj.path}}"></x-element>
+ </template>
+ </template>
+ <template id="templateWithDifferentProps">
+ <div id="bound">[[otherProp]]</div>
+ </template>
+ <script type="module">
+import { PolymerElement } from '../../polymer-element.js';
+import { GestureEventListeners } from '../../lib/mixins/gesture-event-listeners.js';
+import '../../lib/elements/dom-if.js';
+import { DomModule } from '../../lib/elements/dom-module.js';
+class XRuntime extends GestureEventListeners(PolymerElement) {
+ static get is() { return 'x-runtime'; }
+ static get observers() { return ['propChanged(prop)', 'pathChanged(obj.path)']; }
+ constructor() {
+ super();
+ this.propChanged = sinon.spy();
+ this.pathChanged = sinon.spy();
+ this.prop = 'prop';
+ this.obj = {path: 'obj.path'};
+ }
+ ready() {
+ super.setAttribute('log', '');
+ super.ready();
+ window.lifecycleOrder.log(this, 'ready');
+ }
+ compute(a, b) {
+ return `[${a} - ${b}]`;
+ }
+ stampTemplateFromShadow() {
+ let dom = this._stampTemplate(this.$.templateFromShadowDom);
+ this.shadowRoot.appendChild(dom);
+ return dom;
+ }
+ stampTemplateAndSetPropFromShadow() {
+ let dom = this._stampTemplate(this.$.templateFromShadowDom);
+ this.earlyProp = 'early';
+ this.shadowRoot.appendChild(dom);
+ return dom;
+ }
+ stampTemplateFromLight() {
+ let dom = this._stampTemplate(DomModule.import(this.localName, '#templateFromLightDom'));
+ this.shadowRoot.appendChild(dom);
+ return dom;
+ }
+ stampTemplateWithDifferentProps() {
+ let dom = this._stampTemplate(DomModule.import(this.localName, '#templateWithDifferentProps'));
+ this.shadowRoot.appendChild(dom);
+ return dom;
+ }
+}
+customElements.define('x-runtime', XRuntime);
+</script>
+</dom-module>
+
+<template id="custom-template">
+ <x-special name="el1" special="attr1" binding="[[prop]]" on-event="handler"></x-special>
+ <div name="el2" special="attr2">
+ <div name="el3" special="attr3">
+ <x-special name="el4" special="attr4"></x-special>
+ </div>
+ <div></div><div></div><div></div>
+ <div name="el5" binding="[[prop]]" on-event="handler"></div>
+ <template name="el6">
+ <div>
+ <x-special name="t-el" special="t-attr" binding="[[prop]]" on-event="handler"></x-special>
+ </div>
+ </template>
+ </div>
+ <x-special name="el7" special="attr5"><x-special name="el8" special="attr6"></x-special></x-special>
+</template>
+<script type="module">
+import { PolymerElement } from '../../polymer-element.js';
+import '../../lib/mixins/gesture-event-listeners.js';
+import '../../lib/elements/dom-if.js';
+class XParsing extends PolymerElement {
+ static get template() { return document.getElementById('custom-template'); }
+ static _parseTemplateNodeAttribute(node, templateInfo, nodeInfo, name, value) {
+ if (name == 'special') {
+ nodeInfo.specialAttr = value;
+ node.removeAttribute('special');
+ node.setAttribute('had-special', '');
+ return true;
+ } else {
+ return super._parseTemplateNodeAttribute(node, templateInfo, nodeInfo, name, value);
+ }
+ }
+ static _parseTemplateNode(node, templateInfo, nodeInfo) {
+ let noted = super._parseTemplateNode(node, templateInfo, nodeInfo);
+ if (node.localName == 'x-special') {
+ noted = nodeInfo.specialNode = true;
+ }
+ return noted;
+ }
+ _bindTemplate(template) {
+ return this.templateInfoForTesting = super._bindTemplate(template);
+ }
+}
+customElements.define('x-parsing', XParsing);
+
+class XEffects extends XParsing {
+ static get template() { return document.getElementById('custom-template'); }
+ static _parseTemplateNodeAttribute(node, templateInfo, nodeInfo, name, value) {
+ let noted = super._parseTemplateNodeAttribute(node, templateInfo, nodeInfo, name, value);
+ if (nodeInfo.specialAttr) {
+ this._addTemplatePropertyEffect(templateInfo, 'attr', {
+ fn(inst, property, props, oldProps, info, hasPaths, nodeList) {
+ nodeList[nodeInfo.infoIndex].specialAttr = props[property];
+ }
+ });
+ }
+ return noted;
+ }
+ static _parseTemplateNode(node, templateInfo, nodeInfo) {
+ let noted = super._parseTemplateNode(node, templateInfo, nodeInfo);
+ if (nodeInfo.specialNode) {
+ this._addTemplatePropertyEffect(templateInfo, 'node', {
+ fn(inst, property, props, oldProps, info, hasPaths, nodeList) {
+ nodeList[nodeInfo.infoIndex].specialNode = props[property];
+ }
+ });
+ }
+ return noted;
+ }
+}
+customElements.define('x-effects', XEffects);
+</script>
+
+<dom-module id="x-binding">
+ <template>
+ <x-element id="standard1" prop="[[prop]]" path="[[obj.path]]"></x-element>
+ <x-element id="custom1" prop='[{"a": "prop", "b": "prop2"}]'></x-element>
+ <div>
+ <x-element id="standard2" prop="[[prop]]" path="[[obj.path]]"></x-element>
+ <x-element id="custom2" prop='[{"a": "prop", "b": "prop2"}]'></x-element>
+ </div>
+ <template id="domIf" is="dom-if" if="[[prop2]]" restamp>
+ <x-element id="standard3" prop="[[prop]]" path="[[obj.path]]"></x-element>
+ <x-element id="custom3" prop='[{"a": "prop", "b": "prop2"}]'></x-element>
+ </template>
+ </template>
+ <script type="module">
+import { PolymerElement } from '../../polymer-element.js';
+import '../../lib/mixins/gesture-event-listeners.js';
+import '../../lib/elements/dom-if.js';
+class XBinding extends PolymerElement {
+ static get is() { return 'x-binding'; }
+ constructor() {
+ super();
+ this.prop = true;
+ this.obj = {path: 'obj.path'};
+ this.prop2 = true;
+ }
+ static _parseBindings(text, templateInfo) {
+ if (text.slice(0,2) == '[{' && text.slice(-2) == '}]') {
+ let bindingData = JSON.parse(text.slice(1,-1));
+ let dependencies = Object.keys(bindingData).map(n=>bindingData[n]);
+ return [{dependencies, bindingData}];
+ } else {
+ return super._parseBindings(text, templateInfo);
+ }
+ }
+ static _evaluateBinding(scope, part, path, props, oldProps, hasPaths) {
+ if (part.bindingData) {
+ return Object.keys(part.bindingData)
+ .map(n => scope[part.bindingData[n]] ? n : '')
+ .filter(c => Boolean(c))
+ .join(' ');
+ } else {
+ return super._evaluateBinding(scope, part, path, props, oldProps, hasPaths);
+ }
+ }
+}
+customElements.define(XBinding.is, XBinding);
+</script>
+</dom-module>
+
+<script type="module">
+import '../../polymer-element.js';
+import '../../lib/mixins/gesture-event-listeners.js';
+import '../../lib/elements/dom-if.js';
+
+suite('runtime template stamping', function() {
+
+ let el;
+
+ setup(function() {
+ window.lifecycleOrder = {
+ log(el, lifecycle) {
+ if (this.shouldLog(el)) {
+ let list = this[lifecycle] = this[lifecycle] || [];
+ list.push(this.idFor(el));
+ }
+ },
+ shouldLog(el) {
+ let host = el.getRootNode().host;
+ return (!host || this.shouldLog(host)) && el.hasAttribute('log');
+ },
+ idFor(el) {
+ let host = el.getRootNode().host;
+ let id = el.getAttribute('log') || el.id;
+ return (host ? this.idFor(host) + '|' : '') + el.localName + (id ? '#' + id : '');
+ }
+ };
+ el = document.createElement('x-runtime');
+ document.body.appendChild(el);
+ });
+
+ teardown(function() {
+ document.body.removeChild(el);
+ });
+
+ function assertStampingCorrect(el, $, type) {
+ // Text binding
+ assert.equal($.textBinding.textContent, 'prop - obj.path - [prop - obj.path]');
+ // Property binding
+ assert.equal($.propBinding.prop, 'prop');
+ assert.equal($.propBinding.propChanged.callCount, 1);
+ assert.equal($.propBinding.propChanged.firstCall.args[0], 'prop');
+ // Path binding
+ assert.equal($.pathBinding.path, 'obj.path');
+ assert.equal($.pathBinding.pathChanged.callCount, 1);
+ assert.equal($.pathBinding.pathChanged.firstCall.args[0], 'obj.path');
+ // Compound property binding
+ assert.equal($.compoundPropBinding.compound, 'prop - obj.path - [prop - obj.path]');
+ // Observers
+ assert.equal(el.propChanged.callCount, 1);
+ assert.equal(el.propChanged.firstCall.args[0], 'prop');
+ assert.equal(el.pathChanged.callCount, 1);
+ assert.equal(el.pathChanged.firstCall.args[0], 'obj.path');
+ // Event handlers
+ el.handleClick = sinon.spy();
+ el.handleTap = sinon.spy();
+ $.events.click();
+ assert.equal(el.handleClick.callCount, 1);
+ assert.equal(el.handleTap.callCount, 1);
+ // Nested dom-* template
+ $.domIf.render();
+ let ifElement = el.shadowRoot.querySelector(`#ifElement${type||''}`);
+ assert.equal(ifElement.prop, 'prop');
+ assert.equal(ifElement.path, 'obj.path');
+ // Styling correct
+ assert.equal(getComputedStyle($.textBinding).borderBottomWidth, '10px');
+ }
+
+ test('prototypical stamping', () => {
+ assertStampingCorrect(el, el.$);
+ let stamped = el.shadowRoot.querySelectorAll('x-element#first');
+ assert.equal(stamped.length, 1);
+ assert.equal(stamped[0], el.$.first);
+ // Lifecycle order correct
+ assert.deepEqual(window.lifecycleOrder.ready, [
+ 'x-runtime|x-element#proto|x-element-child#noBinding',
+ 'x-runtime|x-element#proto|x-element-child#hasBinding',
+ 'x-runtime|x-element#proto',
+ 'x-runtime'
+ ]);
+ });
+
+ test('runtime stamp template (from shadow dom)', () => {
+ let dom = el.stampTemplateFromShadow();
+ assertStampingCorrect(el, el.$);
+ assertStampingCorrect(el, dom.$, 'SD');
+ let stamped = el.shadowRoot.querySelectorAll('x-element#first');
+ assert.equal(stamped.length, 2);
+ assert.equal(stamped[0], el.$.first);
+ assert.equal(stamped[1], dom.$.first);
+ assert.deepEqual(window.lifecycleOrder.ready, [
+ 'x-runtime|x-element#proto|x-element-child#noBinding',
+ 'x-runtime|x-element#proto|x-element-child#hasBinding',
+ 'x-runtime|x-element#proto',
+ 'x-runtime',
+ 'x-runtime|x-element#shadow|x-element-child#noBinding',
+ 'x-runtime|x-element#shadow|x-element-child#hasBinding',
+ 'x-runtime|x-element#shadow'
+ ]);
+ });
+
+ test('runtime stamp and remove multiple templates (from shadow dom)', () => {
+ let stamped;
+ // Stamp template
+ let dom1 = el.stampTemplateFromShadow();
+ assertStampingCorrect(el, el.$);
+ assertStampingCorrect(el, dom1.$, 'SD');
+ stamped = el.shadowRoot.querySelectorAll('x-element#first');
+ assert.equal(stamped.length, 2);
+ assert.equal(stamped[0], el.$.first);
+ assert.equal(stamped[1], dom1.$.first);
+ // Unstamp
+ el._removeBoundDom(dom1);
+ for (let n in dom1.$) {
+ assert.notOk(dom1.$[n].parentNode, null);
+ }
+ stamped = el.shadowRoot.querySelectorAll('x-element#first');
+ assert.equal(stamped.length, 1);
+ assert.equal(stamped[0], el.$.first);
+ // Stamp again
+ let dom2 = el.stampTemplateFromShadow();
+ assertStampingCorrect(el, el.$);
+ assertStampingCorrect(el, dom2.$, 'SD');
+ stamped = el.shadowRoot.querySelectorAll('x-element#first');
+ assert.equal(stamped.length, 2);
+ assert.equal(stamped[0], el.$.first);
+ assert.equal(stamped[1], dom2.$.first);
+ // Stamp again
+ let dom3 = el.stampTemplateFromShadow();
+ assertStampingCorrect(el, el.$);
+ assertStampingCorrect(el, dom2.$, 'SD');
+ assertStampingCorrect(el, dom3.$, 'SD');
+ stamped = el.shadowRoot.querySelectorAll('x-element#first');
+ assert.equal(stamped.length, 3);
+ assert.equal(stamped[0], el.$.first);
+ assert.equal(stamped[1], dom2.$.first);
+ assert.equal(stamped[2], dom3.$.first);
+ assert.deepEqual(window.lifecycleOrder.ready, [
+ 'x-runtime|x-element#proto|x-element-child#noBinding',
+ 'x-runtime|x-element#proto|x-element-child#hasBinding',
+ 'x-runtime|x-element#proto',
+ 'x-runtime',
+ 'x-runtime|x-element#shadow|x-element-child#noBinding',
+ 'x-runtime|x-element#shadow|x-element-child#hasBinding',
+ 'x-runtime|x-element#shadow',
+ 'x-runtime|x-element#shadow|x-element-child#noBinding',
+ 'x-runtime|x-element#shadow|x-element-child#hasBinding',
+ 'x-runtime|x-element#shadow',
+ 'x-runtime|x-element#shadow|x-element-child#noBinding',
+ 'x-runtime|x-element#shadow|x-element-child#hasBinding',
+ 'x-runtime|x-element#shadow'
+ ]);
+ // Unstamp
+ el._removeBoundDom(dom2);
+ el._removeBoundDom(dom3);
+ for (let n in dom2.$) {
+ assert.notOk(dom1.$[n].parentNode, null);
+ }
+ for (let n in dom3.$) {
+ assert.notOk(dom1.$[n].parentNode, null);
+ }
+ stamped = el.shadowRoot.querySelectorAll('x-element#first');
+ assert.equal(stamped.length, 1);
+ assert.equal(stamped[0], el.$.first);
+ });
+
+ test('runtime stamp template and set prop before attaching (from shadow dom)', () => {
+ let dom = el.stampTemplateAndSetPropFromShadow();
+ assertStampingCorrect(el, el.$);
+ assertStampingCorrect(el, dom.$, 'SD');
+ let stamped = el.shadowRoot.querySelectorAll('x-element#first');
+ assert.equal(stamped.length, 2);
+ assert.equal(stamped[0], el.$.first);
+ assert.equal(stamped[1], dom.$.first);
+ assert.deepEqual(window.lifecycleOrder.ready, [
+ 'x-runtime|x-element#proto|x-element-child#noBinding',
+ 'x-runtime|x-element#proto|x-element-child#hasBinding',
+ 'x-runtime|x-element#proto',
+ 'x-runtime',
+ 'x-element#shadow|x-element-child#noBinding',
+ 'x-element#shadow|x-element-child#hasBinding',
+ 'x-element#shadow'
+ ]);
+ });
+
+ test('runtime stamp and remove multiple templates and set prop before attaching (from shadow dom)', () => {
+ let stamped;
+ // Stamp template
+ let dom1 = el.stampTemplateAndSetPropFromShadow();
+ assertStampingCorrect(el, el.$);
+ assertStampingCorrect(el, dom1.$, 'SD');
+ stamped = el.shadowRoot.querySelectorAll('x-element#first');
+ assert.equal(stamped.length, 2);
+ assert.equal(stamped[0], el.$.first);
+ assert.equal(stamped[1], dom1.$.first);
+ // Unstamp
+ el._removeBoundDom(dom1);
+ for (let n in dom1.$) {
+ assert.notOk(dom1.$[n].parentNode, null);
+ }
+ stamped = el.shadowRoot.querySelectorAll('x-element#first');
+ assert.equal(stamped.length, 1);
+ assert.equal(stamped[0], el.$.first);
+ // Stamp again
+ let dom2 = el.stampTemplateAndSetPropFromShadow();
+ assertStampingCorrect(el, el.$);
+ assertStampingCorrect(el, dom2.$, 'SD');
+ stamped = el.shadowRoot.querySelectorAll('x-element#first');
+ assert.equal(stamped.length, 2);
+ assert.equal(stamped[0], el.$.first);
+ assert.equal(stamped[1], dom2.$.first);
+ // Stamp again
+ let dom3 = el.stampTemplateAndSetPropFromShadow();
+ assertStampingCorrect(el, el.$);
+ assertStampingCorrect(el, dom2.$, 'SD');
+ assertStampingCorrect(el, dom3.$, 'SD');
+ stamped = el.shadowRoot.querySelectorAll('x-element#first');
+ assert.equal(stamped.length, 3);
+ assert.equal(stamped[0], el.$.first);
+ assert.equal(stamped[1], dom2.$.first);
+ assert.equal(stamped[2], dom3.$.first);
+ assert.deepEqual(window.lifecycleOrder.ready, [
+ 'x-runtime|x-element#proto|x-element-child#noBinding',
+ 'x-runtime|x-element#proto|x-element-child#hasBinding',
+ 'x-runtime|x-element#proto',
+ 'x-runtime',
+ 'x-element#shadow|x-element-child#noBinding',
+ 'x-element#shadow|x-element-child#hasBinding',
+ 'x-element#shadow',
+ 'x-runtime|x-element#shadow|x-element-child#noBinding',
+ 'x-runtime|x-element#shadow|x-element-child#hasBinding',
+ 'x-runtime|x-element#shadow',
+ 'x-runtime|x-element#shadow|x-element-child#noBinding',
+ 'x-runtime|x-element#shadow|x-element-child#hasBinding',
+ 'x-runtime|x-element#shadow'
+ ]);
+ // Unstamp
+ el._removeBoundDom(dom2);
+ el._removeBoundDom(dom3);
+ for (let n in dom2.$) {
+ assert.notOk(dom1.$[n].parentNode, null);
+ }
+ for (let n in dom3.$) {
+ assert.notOk(dom1.$[n].parentNode, null);
+ }
+ stamped = el.shadowRoot.querySelectorAll('x-element#first');
+ assert.equal(stamped.length, 1);
+ assert.equal(stamped[0], el.$.first);
+ });
+
+ test('runtime stamp template (from light dom)', () => {
+ let dom = el.stampTemplateFromLight();
+ assertStampingCorrect(el, el.$);
+ assertStampingCorrect(el, dom.$, 'LD');
+ let stamped = el.shadowRoot.querySelectorAll('x-element#first');
+ assert.equal(stamped.length, 2);
+ assert.equal(stamped[0], el.$.first);
+ assert.equal(stamped[1], dom.$.first);
+ assert.deepEqual(window.lifecycleOrder.ready, [
+ 'x-runtime|x-element#proto|x-element-child#noBinding',
+ 'x-runtime|x-element#proto|x-element-child#hasBinding',
+ 'x-runtime|x-element#proto',
+ 'x-runtime',
+ 'x-runtime|x-element#light|x-element-child#noBinding',
+ 'x-runtime|x-element#light|x-element-child#hasBinding',
+ 'x-runtime|x-element#light'
+ ]);
+ });
+
+ test('runtime stamp and remove multiple templates (from light dom)', () => {
+ let stamped;
+ // Stamp template
+ let dom1 = el.stampTemplateFromLight();
+ assertStampingCorrect(el, el.$);
+ assertStampingCorrect(el, dom1.$, 'LD');
+ stamped = el.shadowRoot.querySelectorAll('x-element#first');
+ assert.equal(stamped.length, 2);
+ assert.equal(stamped[0], el.$.first);
+ assert.equal(stamped[1], dom1.$.first);
+ // Unstamp
+ el._removeBoundDom(dom1);
+ for (let n in dom1.$) {
+ assert.notOk(dom1.$[n].parentNode, null);
+ }
+ // Stamp again
+ let dom2 = el.stampTemplateFromLight();
+ assertStampingCorrect(el, el.$);
+ assertStampingCorrect(el, dom2.$, 'LD');
+ stamped = el.shadowRoot.querySelectorAll('x-element#first');
+ assert.equal(stamped.length, 2);
+ assert.equal(stamped[0], el.$.first);
+ assert.equal(stamped[1], dom2.$.first);
+ // Stamp again
+ let dom3 = el.stampTemplateFromLight();
+ assertStampingCorrect(el, el.$);
+ assertStampingCorrect(el, dom2.$, 'LD');
+ assertStampingCorrect(el, dom3.$, 'LD');
+ stamped = el.shadowRoot.querySelectorAll('x-element#first');
+ assert.equal(stamped.length, 3);
+ assert.equal(stamped[0], el.$.first);
+ assert.equal(stamped[1], dom2.$.first);
+ assert.equal(stamped[2], dom3.$.first);
+ assert.deepEqual(window.lifecycleOrder.ready, [
+ 'x-runtime|x-element#proto|x-element-child#noBinding',
+ 'x-runtime|x-element#proto|x-element-child#hasBinding',
+ 'x-runtime|x-element#proto',
+ 'x-runtime',
+ 'x-runtime|x-element#light|x-element-child#noBinding',
+ 'x-runtime|x-element#light|x-element-child#hasBinding',
+ 'x-runtime|x-element#light',
+ 'x-runtime|x-element#light|x-element-child#noBinding',
+ 'x-runtime|x-element#light|x-element-child#hasBinding',
+ 'x-runtime|x-element#light',
+ 'x-runtime|x-element#light|x-element-child#noBinding',
+ 'x-runtime|x-element#light|x-element-child#hasBinding',
+ 'x-runtime|x-element#light'
+ ]);
+ // Unstamp
+ el._removeBoundDom(dom2);
+ el._removeBoundDom(dom3);
+ for (let n in dom2.$) {
+ assert.notOk(dom1.$[n].parentNode, null);
+ }
+ for (let n in dom3.$) {
+ assert.notOk(dom1.$[n].parentNode, null);
+ }
+ stamped = el.shadowRoot.querySelectorAll('x-element#first');
+ assert.equal(stamped.length, 1);
+ assert.equal(stamped[0], el.$.first);
+ });
+
+ function assertPropValues(el, prop, value, count) {
+ let e = el.$[prop + 'Binding'];
+ assert.equal(e[prop], value);
+ assert.equal(e[prop + 'Changed'].callCount, count);
+ assert.equal(e[prop + 'Changed'].getCall(count-1).args[0], value);
+ assert.equal(e.$.hasBinding[prop], value);
+ }
+
+ function assertAllPropValues(el, ld, sd, prop, value, count) {
+ assertPropValues(el, prop, value, count);
+ assertPropValues(ld, prop, value, count);
+ assertPropValues(sd, prop, value, count);
+ }
+
+ test('downward runtime binding', () => {
+ let sd = el.stampTemplateFromShadow();
+ let ld = el.stampTemplateFromLight();
+ assertAllPropValues(el, sd, ld, 'prop', 'prop', 1);
+ assertAllPropValues(el, sd, ld, 'path', 'obj.path', 1);
+ el.prop = 'prop+';
+ assertAllPropValues(el, sd, ld, 'prop', 'prop+', 2);
+ assertAllPropValues(el, sd, ld, 'path', 'obj.path', 1);
+ el.obj = {path: 'obj.path+'};
+ assertAllPropValues(el, sd, ld, 'prop', 'prop+', 2);
+ assertAllPropValues(el, sd, ld, 'path', 'obj.path+', 2);
+ el.set('obj.path', 'obj.path++');
+ assertAllPropValues(el, sd, ld, 'prop', 'prop+', 2);
+ assertAllPropValues(el, sd, ld, 'path', 'obj.path++', 3);
+ });
+
+ test('two-way runtime binding', () => {
+ let sd = el.stampTemplateFromShadow();
+ let ld = el.stampTemplateFromLight();
+ assertAllPropValues(el, sd, ld, 'prop', 'prop', 1);
+ assertAllPropValues(el, sd, ld, 'path', 'obj.path', 1);
+ el.$.propBinding.prop = 'prop+';
+ assertAllPropValues(el, sd, ld, 'prop', 'prop+', 2);
+ assertAllPropValues(el, sd, ld, 'path', 'obj.path', 1);
+ sd.$.propBinding.prop = 'prop++';
+ assertAllPropValues(el, sd, ld, 'prop', 'prop++', 3);
+ assertAllPropValues(el, sd, ld, 'path', 'obj.path', 1);
+ ld.$.propBinding.prop = 'prop+++';
+ assertAllPropValues(el, sd, ld, 'prop', 'prop+++', 4);
+ assertAllPropValues(el, sd, ld, 'path', 'obj.path', 1);
+ el.$.pathBinding.path = 'obj.path+';
+ assertAllPropValues(el, sd, ld, 'prop', 'prop+++', 4);
+ assertAllPropValues(el, sd, ld, 'path', 'obj.path+', 2);
+ sd.$.pathBinding.path = 'obj.path++';
+ assertAllPropValues(el, sd, ld, 'prop', 'prop+++', 4);
+ assertAllPropValues(el, sd, ld, 'path', 'obj.path++', 3);
+ ld.$.pathBinding.path = 'obj.path+++';
+ assertAllPropValues(el, sd, ld, 'prop', 'prop+++', 4);
+ assertAllPropValues(el, sd, ld, 'path', 'obj.path+++', 4);
+ });
+
+ test('accessors for non-prototypically bound properties created', () => {
+ // First element
+ let dom = el.stampTemplateWithDifferentProps();
+ el.otherProp = 'otherProp';
+ assert.equal(dom.$.bound.textContent, 'otherProp');
+ // Second element
+ let el2 = document.createElement('x-runtime');
+ document.body.appendChild(el2);
+ let dom2 = el2.stampTemplateWithDifferentProps();
+ el2.otherProp = 'otherProp';
+ assert.equal(dom2.$.bound.textContent, 'otherProp');
+ document.body.removeChild(el2);
+ });
+
+ test('prototypical stamping not affected by runtime stamping', () => {
+ assertStampingCorrect(el, el.$);
+ let stamped = el.shadowRoot.querySelectorAll('x-element#first');
+ assert.equal(stamped.length, 1);
+ assert.equal(stamped[0], el.$.first);
+ // Lifecycle order correct
+ assert.deepEqual(window.lifecycleOrder.ready, [
+ 'x-runtime|x-element#proto|x-element-child#noBinding',
+ 'x-runtime|x-element#proto|x-element-child#hasBinding',
+ 'x-runtime|x-element#proto',
+ 'x-runtime'
+ ]);
+ });
+
+});
+
+suite('template parsing hooks', () => {
+
+ test('custom parsing', () => {
+ let el = document.createElement('x-parsing');
+ document.body.appendChild(el);
+ let templateInfo = el.templateInfoForTesting;
+ let nodeInfoList = templateInfo.nodeInfoList;
+ let nodeList = templateInfo.nodeList;
+ // The node order is depth-first bottom up but not a guarantee or generally
+ // important; as such, just ensure all expected nodes are there, then
+ // loop to
+ assert.sameMembers(nodeList.map(e=>e.getAttribute('name')),
+ ['el1', 'el2', 'el3', 'el4', 'el5', 'el6', 'el7', 'el8']);
+ for (let i=0; i<nodeList.length; i++) {
+ let node = nodeList[i];
+ let nodeInfo = nodeInfoList[i];
+ let templateNodeInfo;
+ switch (node.getAttribute('name')) {
+ case 'el1':
+ assert.equal(nodeInfo.specialNode, true);
+ assert.equal(nodeInfo.specialAttr, 'attr1');
+ assert.equal(nodeInfo.bindings.length, 1);
+ assert.equal(nodeInfo.events.length, 1);
+ break;
+ case 'el2':
+ assert.equal(nodeInfo.specialAttr, 'attr2');
+ break;
+ case 'el3':
+ assert.equal(nodeInfo.specialAttr, 'attr3');
+ break;
+ case 'el4':
+ assert.equal(nodeInfo.specialNode, true);
+ assert.equal(nodeInfo.specialAttr, 'attr4');
+ break;
+ case 'el5':
+ assert.equal(nodeInfo.bindings.length, 1);
+ assert.equal(nodeInfo.events.length, 1);
+ break;
+ case 'el6':
+ assert.isOk(nodeInfo.templateInfo);
+ assert.equal(nodeInfo.templateInfo.nodeInfoList.length, 1);
+ templateNodeInfo = nodeInfo.templateInfo.nodeInfoList[0];
+ assert.equal(templateNodeInfo.bindings.length, 1);
+ assert.equal(templateNodeInfo.events.length, 1);
+ assert.equal(templateNodeInfo.specialAttr, 't-attr');
+ assert.equal(templateNodeInfo.specialNode, true);
+ break;
+ case 'el7':
+ assert.equal(nodeInfo.specialNode, true);
+ assert.equal(nodeInfo.specialAttr, 'attr5');
+ break;
+ case 'el8':
+ assert.equal(nodeInfo.specialNode, true);
+ assert.equal(nodeInfo.specialAttr, 'attr6');
+ break;
+ default:
+ throw new Error('unexpected node was recorded');
+ }
+ }
+ });
+
+ test('custom template effects', () => {
+ let el = document.createElement('x-effects');
+ document.body.appendChild(el);
+
+ assert.equal(Array.from(el.shadowRoot.querySelectorAll('x-special')).length, 4);
+ Array.from(el.shadowRoot.querySelectorAll('x-special')).forEach(e => {
+ assert.notOk(e.isSpecialNode);
+ });
+ el.node = 'node!';
+ Array.from(el.shadowRoot.querySelectorAll('x-special')).forEach(e => {
+ assert.equal(e.specialNode, 'node!');
+ });
+
+ assert.equal(Array.from(el.shadowRoot.querySelectorAll('[had-special]')).length, 6);
+ Array.from(el.shadowRoot.querySelectorAll('[had-special]')).forEach(e => {
+ assert.notOk(e.hasSpecialAttr);
+ });
+ el.attr = 'attr!';
+ Array.from(el.shadowRoot.querySelectorAll('[had-special]')).forEach(e => {
+ assert.equal(e.specialAttr, 'attr!');
+ });
+ document.body.removeChild(el);
+ });
+
+ test('custom template binding', () => {
+ let el = document.createElement('x-binding');
+ document.body.appendChild(el);
+ el.$.domIf.render();
+ assert.equal(el.$.standard1.prop, true);
+ assert.equal(el.$.standard2.prop, true);
+ assert.equal(el.shadowRoot.querySelector('#standard3').prop, true);
+ assert.equal(el.$.standard1.path, 'obj.path');
+ assert.equal(el.$.standard2.path, 'obj.path');
+ assert.equal(el.shadowRoot.querySelector('#standard3').path, 'obj.path');
+ assert.equal(el.$.custom1.prop, 'a b');
+ assert.equal(el.$.custom2.prop, 'a b');
+ assert.equal(el.shadowRoot.querySelector('#custom3').prop, 'a b');
+ el.prop = false;
+ assert.equal(el.$.standard1.prop, false);
+ assert.equal(el.$.standard2.prop, false);
+ assert.equal(el.shadowRoot.querySelector('#standard3').prop, false);
+ assert.equal(el.$.standard1.path, 'obj.path');
+ assert.equal(el.$.standard2.path, 'obj.path');
+ assert.equal(el.shadowRoot.querySelector('#standard3').path, 'obj.path');
+ assert.equal(el.$.custom1.prop, 'b');
+ assert.equal(el.$.custom2.prop, 'b');
+ assert.equal(el.shadowRoot.querySelector('#custom3').prop, 'b');
+ el.prop = true;
+ assert.equal(el.$.standard1.prop, true);
+ assert.equal(el.$.standard2.prop, true);
+ assert.equal(el.shadowRoot.querySelector('#standard3').prop, true);
+ assert.equal(el.$.standard1.path, 'obj.path');
+ assert.equal(el.$.standard2.path, 'obj.path');
+ assert.equal(el.shadowRoot.querySelector('#standard3').path, 'obj.path');
+ assert.equal(el.$.custom1.prop, 'a b');
+ assert.equal(el.$.custom2.prop, 'a b');
+ assert.equal(el.shadowRoot.querySelector('#custom3').prop, 'a b');
+ document.body.removeChild(el);
+ });
+});
+</script>
+
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/property-effects.html b/third_party/polymer3/bower_components/polymer/test/unit/property-effects.html
new file mode 100644
index 0000000..ca6ff7d
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/property-effects.html
@@ -0,0 +1,1869 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+ <script type="module" src="./property-effects-elements.js"></script>
+<body>
+<dom-repeat id="class-repeat" items='["class1", "class2"]'>
+ <template>
+ <div class$=[[item]] clazz$="[[item]]">[[item]]</div>
+ </template>
+</dom-repeat>
+
+<script type="module">
+import './property-effects-elements.js';
+import { Polymer } from '../../lib/legacy/polymer-fn.js';
+import { setSanitizeDOMValue, sanitizeDOMValue } from '../../lib/utils/settings.js';
+import { PropertyEffects } from '../../lib/mixins/property-effects.js';
+
+suite('single-element binding effects', function() {
+
+ var el;
+
+ setup(function() {
+ el = document.createElement('x-basic');
+ document.body.appendChild(el);
+ });
+
+ teardown(function() {
+ document.body.removeChild(el);
+ });
+
+ test('undefined input value', function() {
+ assert.equal(el.$.boundInput.value, '', 'undefined input value not blank');
+ el.text = 'this is a test';
+ assert.equal(el.$.boundInput.value, 'this is a test', 'binding to input didn\'t go');
+ el.text = undefined;
+ assert.equal(el.$.boundInput.value, '', 'undefined input value not blank');
+ });
+
+ test('undefined textarea value', function() {
+ assert.equal(el.$.boundTextArea.value, '', 'undefined textarea value not blank');
+ el.text = 'this is a test';
+ assert.equal(el.$.boundTextArea.value, 'this is a test', 'binding to textarea didn\'t go');
+ el.text = undefined;
+ assert.equal(el.$.boundTextArea.value, '', 'undefined textarea value not blank');
+ });
+
+ test('id is bindable', function() {
+ assert.equal(el.root.querySelector('span[idtest]').id, 'span', 'id bound to <span> not found');
+ });
+
+ test('textContent binding updates', function() {
+ el.text = 'this is a test';
+ assert.equal(el.$.boundText.textContent, 'this is a test', 'Value not propagated to textContent');
+ });
+
+ test('textContent binding to undefined is empty string', function() {
+ el.text = 'this is a test';
+ el.text = undefined;
+ assert.equal(el.$.boundText.textContent, '', 'undefined bound to textContent should be empty string');
+ });
+
+ test('textContent binding to null is empty string', function() {
+ el.text = null;
+ assert.equal(el.$.boundText.textContent, '', 'null bound to textContent should be empty string');
+ });
+
+ test('textContent binding to zero is empty correct', function() {
+ el.text = 0;
+ assert.equal(el.$.boundText.textContent, '0', 'zero bound to textContent should be empty string');
+ });
+
+ test('camel-case binding updates', function() {
+ el.value = 41;
+ assert.equal(el.$.boundChild.camelCase, 41, 'Value not propagated to camelCase property');
+ });
+
+ test('annotation binding updates', function() {
+ el.value = 42;
+ assert.equal(el.$.boundChild.value, 42, 'Value not propagated to bound child');
+ });
+
+ test('negated annotation binding updates', function() {
+ el.bool = true;
+ assert.equal(el.$.boundChild.negvalue, false, 'Value not negated');
+ el.bool = false;
+ assert.equal(el.$.boundChild.negvalue, true, 'Value not negated');
+ });
+
+ test('observer called', function() {
+ assert.equal(el.observerCounts.valueChanged, 1, 'observer not called once for default value at configure');
+ el.value = 43;
+ assert.equal(el.observerCounts.valueChanged, 2, 'observer not called after property change');
+ });
+
+ test('observer called only once for null', function() {
+ el.clearObserverCounts();
+ assert.equal(el.observerCounts.valueChanged, 0);
+ el.value = {};
+ assert.equal(el.observerCounts.valueChanged, 1);
+ el.value = null;
+ assert.equal(el.observerCounts.valueChanged, 2);
+ el.value = null;
+ assert.equal(el.observerCounts.valueChanged, 2);
+ el.value = {};
+ assert.equal(el.observerCounts.valueChanged, 3);
+ el.value = null;
+ assert.equal(el.observerCounts.valueChanged, 4);
+ el.value = null;
+ assert.equal(el.observerCounts.valueChanged, 4);
+ });
+
+ test('computed value updates', function() {
+ el.value = 44;
+ assert.equal(el.computedvalue, 45, 'Computed value not correct');
+ assert.equal(el.$.boundChild.computedvalue, 45, 'Computed value not propagated to bound child');
+ });
+
+ test('computed value readOnly from imperative set', function() {
+ el.value = 44;
+ // Should have no effect
+ el.computedvalue = 99;
+ assert.equal(el.computedvalue, 45, 'Computed value not correct');
+ assert.equal(el.$.boundChild.computedvalue, 45, 'Computed value not propagated to bound child');
+ });
+
+ test('computed values to same method updates', function() {
+ el.value = 44;
+ el.valuetwo = 144;
+ assert.equal(el.computedvalue, 45, 'Computed value not correct');
+ assert.equal(el.computedvaluetwo, 145, 'Computed value not correct');
+ assert.equal(el.$.boundChild.computedvalue, 45, 'Computed value not propagated to bound child');
+ });
+
+ test('computed value using computing fn from behavior', function() {
+ el.value = 44;
+ assert.equal(el.$.boundChild.computedFromBehavior, 'computed:44');
+ el.computeFromBehavior = function(value) {
+ return 'new:' + value;
+ };
+ assert.equal(el.$.boundChild.computedFromBehavior, 'new:44');
+ });
+
+ test('notification sent', function() {
+ var notified = 0;
+ el.addEventListener('notifyingvalue-changed', function(e) {
+ assert.equal(e.detail.value, 45);
+ notified++;
+ });
+ el.addEventListener('camel-notifying-value-changed', function(e) {
+ assert.equal(e.detail.value, 45);
+ notified++;
+ });
+ el.notifyingvalue = 45;
+ el.camelNotifyingValue = 45;
+ assert.equal(notified, 2, 'Notification events not sent');
+ });
+
+ test('computed observer called', function() {
+ el.clearObserverCounts();
+ el.value = 46;
+ assert.equal(el.observerCounts.computedvalueChanged, 1, 'observer not called');
+ });
+
+ test('NaN does not loop observers', function() {
+ el.clearObserverCounts();
+ el.addEventListener('notifierwithoutcomputing-changed', function() {
+ if (el.observerCounts.notifierWithoutComputingChanged >= 3) {
+ throw new Error('infinite loop!');
+ }
+ });
+ el.notifierWithoutComputing = NaN;
+ assert.equal(el.observerCounts.notifierWithoutComputingChanged, 1,
+ 'NaN was not handled as expected');
+ });
+
+
+ test('computed notification sent', function() {
+ var notified = 0;
+ el.addEventListener('computednotifyingvalue-changed', function(e) {
+ assert.equal(e.detail.value, 49);
+ notified++;
+ });
+ el.notifyingvalue = 47;
+ assert.equal(notified, 1, 'Notification event not sent');
+ });
+
+ test('computed property with multiple dependencies', function() {
+ var notified = 0;
+ el.addEventListener('computed-from-multiple-values-changed', function() {
+ notified++;
+ });
+ el.sum1 = 10;
+ el.sum2 = 20;
+ el.divide = 2;
+ assert.equal(el.computedFromMultipleValues, 15, 'Computed value wrong');
+ assert.equal(notified, 1, 'Notification event not sent');
+ assert.equal(el.observerCounts.computedFromMultipleValuesChanged, 1, 'observer not called');
+ });
+
+ test('computed annotation with literals', function() {
+ el.bool = true;
+ assert.equal(el.$.boundChild.computedFromMixedLiterals, '3foo', 'Wrong result from mixed literal arg computation');
+ assert.equal(el.$.boundChild.computedFromPureLiterals, '3foo', 'Wrong result from pure literal arg computation');
+ assert.equal(el.$.boundChild.computedFromTrickyFunction, '3foo', 'Wrong result from tricky function with pure literal arg computation');
+ assert.equal(el.$.boundChild.computedFromTrickyLiterals, '3tricky,\'zot\'', 'Wrong result from tricky literal arg computation');
+ assert.equal(el.$.boundChild.computedFromTrickyLiterals2, '3tricky,\'zot\'', 'Wrong result from tricky literal arg computation');
+ assert.equal(el.$.boundChild.computedFromTrickyLiterals3, '3tricky,\'zot\'', 'Wrong result from tricky literal arg computation');
+ assert.equal(el.$.computedContent.textContent, '3tricky,\'zot\'', 'Wrong textContent from tricky literal arg computation');
+ assert.equal(el.$.computedContent2.textContent, '(3', 'Wrong textContent from tricky literal arg computation');
+ });
+
+ test('computed annotation with no args', function() {
+ assert.equal(el.$.boundChild.computedFromNoArgs, 'no args!', 'Wrong content when computed has no args');
+ });
+
+ test('no read-only observer called with assignment', function() {
+ el.readonlyvalue = 46;
+ assert.equal(el.observerCounts.readonlyvalueChanged, 0, 'observer should not be called for readOnly prop assignment');
+ });
+
+ test('read-only observer called with _setReadonlyvalue', function() {
+ el._setReadonlyvalue(46);
+ assert.equal(el.observerCounts.readonlyvalueChanged, 1, 'observer should be called');
+ assert(el.readonlyvalue == 46, 'value should be changed but was not');
+ });
+
+ test('no read-only notification sent with assignment', function() {
+ var notified = 0;
+ el.addEventListener('readonlyvalue-changed', function() {
+ notified++;
+ });
+ el.readonlyvalue = 47;
+ assert.equal(notified, 0, 'Notification should not be called for readOnly prop assignment');
+ });
+
+ test('read-only notification sent with _setReadonlyvalue', function() {
+ var notified = 0;
+ el.addEventListener('readonlyvalue-changed', function(e) {
+ assert.equal(e.detail.value, 47);
+ notified++;
+ });
+ el._setReadonlyvalue(47);
+ assert.equal(notified, 1, 'Notification event not sent');
+ });
+
+ test('multiple dependency observer called once', function() {
+ el.setProperties({
+ dep1: true,
+ dep2: {},
+ dep3: 42
+ });
+ assert.equal(el.observerCounts.multipleDepChangeHandler, 1, 'observer not called once');
+ });
+
+ test('setProperties does not set readOnly by default', function() {
+ assert.equal(el.observerCounts.valueChanged, 1);
+ assert.equal(el.observerCounts.readonlyvalueChanged, 0);
+ el.setProperties({
+ value: 'shouldChange',
+ nofx: 'shouldChange',
+ readonlyvalue: 'shouldNotChange'
+ });
+ assert.equal(el.value, 'shouldChange');
+ assert.equal(el.nofx, 'shouldChange');
+ assert.equal(el.readonlyvalue, undefined);
+ assert.equal(el.observerCounts.valueChanged, 2);
+ assert.equal(el.observerCounts.readonlyvalueChanged, 0);
+ });
+
+ test('setProperties sets readOnly using `setPrivate` arg', function() {
+ assert.equal(el.observerCounts.valueChanged, 1);
+ assert.equal(el.observerCounts.readonlyvalueChanged, 0);
+ el.setProperties({
+ value: 'shouldChange',
+ nofx: 'shouldChange',
+ readonlyvalue: 'shouldChange'
+ }, true);
+ assert.equal(el.value, 'shouldChange');
+ assert.equal(el.nofx, 'shouldChange');
+ assert.equal(el.readonlyvalue, 'shouldChange');
+ assert.equal(el.observerCounts.valueChanged, 2);
+ assert.equal(el.observerCounts.readonlyvalueChanged, 1);
+ });
+
+ test('annotated computed property', function() {
+ el.value = 20;
+ el.add = 40;
+ el.divide = 3;
+ assert.equal(el.$.boundChild.computedInline, 20, 'computedInline not correct');
+ assert.equal(el.$.boundChild.computedInline2, 20, 'computedInline2 not correct');
+ assert.equal(el.$.boundChild.computedInline3, 20, 'computedInline3 not correct');
+ assert.equal(el.$.boundChild.negComputedInline, false, 'negComputedInline not correct');
+ });
+
+ test('annotated computed attribute', function() {
+ el.value = 20;
+ el.add = 40;
+ el.divide = 3;
+ assert.equal(el.$.boundChild.getAttribute('computedattribute'), 20, 'computed attribute not correct');
+ assert.equal(el.$.boundChild.getAttribute('computedattribute2'), 20, 'computed attribute not correct');
+ });
+
+ test('annotated style attribute binding', function() {
+ el.boundStyle = 'padding: 37px;';
+ assert.equal(getComputedStyle(el.$.boundChild).paddingTop, '37px', 'style attribute binding not correct');
+ });
+
+ test('annotated dataset attribute binding', function() {
+ if (el.$.boundChild.datast) { // IE10, sigh
+ el.dataSetId = 'yeah';
+ assert.equal(el.$.boundChild.dataset.id, 'yeah', 'dataset.id dataset property not set correctly');
+ assert.equal(el.$.boundChild.getAttribute('data-id'), 'yeah', 'data-id attribute not set correctly');
+ }
+ });
+
+ test('custom notification event to property', function() {
+ el.$.boundChild.customEventValue = 42;
+ el.fire('custom', null, {node: el.$.boundChild});
+ assert.equal(el.customEventValue, 42, 'custom bound property incorrect');
+ assert.equal(el.observerCounts.customEventValueChanged, 1, 'custom bound property observer not called');
+ });
+
+ test('custom notification event to path', function() {
+ el.clearObserverCounts();
+ el.$.boundChild.customEventObjectValue = 84;
+ el.$.boundChild.dispatchEvent(new Event('change'));
+ assert.equal(el.customEventObject.value, 84, 'custom bound path incorrect');
+ assert.equal(el.observerCounts.customEventObjectValueChanged, 1, 'custom bound path observer not called');
+ });
+
+ test('computed property with negative number', function() {
+ assert.equal(el.$.boundChild.computedNegativeNumber, -1);
+ });
+
+ test('computed property with negative literal', function() {
+ assert.equal(el.$.boundChild.computedNegativeLiteral, undefined);
+ });
+
+ test('computed binding with wildcard', function() {
+ el.a = 5;
+ el.b = {value: 10};
+ assert.equal(el.$.boundChild.computedWildcard, 15);
+ });
+
+ test('binding with dash', function() {
+ el.objectWithDash = {
+ 'binding-with-dash': 'yes'
+ };
+ assert.equal(el.$.boundWithDash.textContent, 'yes');
+ });
+
+ test('class attribute without template scope not erased', function() {
+ var el = document.querySelector('.class1');
+ assert.notEqual(el, null, 'class without template scope is undefined');
+ var el2 = document.querySelector('.class2');
+ assert.notEqual(el2, null, 'class without template scope is undefined');
+ });
+
+
+ test('property effect for native property (title)', function() {
+ // NOTE: This will FAIL on browser on which `title` is an own property so
+ // just let this pass.
+ if (document.createElement('div').hasOwnProperty('title')) {
+ this.skip();
+ }
+ assert.isTrue(el.titleChanged.notCalled);
+ el.title = 'a title';
+ assert.isTrue(el.titleChanged.calledOnce);
+ assert.equal(el.titleChanged.firstCall.args[0], 'a title');
+ });
+
+ test('property effect added at instance time', function() {
+ el.earlyBoundObserver = sinon.spy();
+ el.lateBoundObserver = sinon.spy();
+ el.earlyBound = 'early';
+ el._createPropertyObserver('earlyBound', 'earlyBoundObserver');
+ el._createPropertyObserver('lateBound', 'lateBoundObserver');
+ el._flushProperties();
+ el.lateBound = 'late';
+ assert.equal(el.earlyBound, 'early');
+ assert.equal(el.earlyBoundObserver.callCount, 1);
+ assert.equal(el.earlyBoundObserver.firstCall.args[0], 'early');
+ assert.equal(el.lateBound, 'late');
+ assert.equal(el.lateBoundObserver.callCount, 1);
+ assert.equal(el.lateBoundObserver.firstCall.args[0], 'late');
+ });
+
+ test('does not parse bindings inside <script>', function() {
+ assert.include(el.$.scriptWithBinding.textContent, "{{binding}}");
+ });
+
+ test('does not parse bindings inside <style>', function() {
+ var style = el.shadowRoot.querySelector('style');
+ // native shadow dom
+ if (style) {
+ assert.include(style.textContent, "[[binding]]");
+ // shady dom
+ } else {
+ assert.include(document.querySelector('[scope="x-basic"]').textContent, "[[binding]]");
+ }
+ });
+
+ test('only calls dynamic functions once', function() {
+ el.dynamicFn = function() {
+ assert.isFalse(this._dynamicFnCalled);
+ this._dynamicFnCalled = true;
+ };
+ });
+
+ suite('observer inheritance', function() {
+ setup(function() {
+ el = document.createElement('sub-observer-element');
+ document.body.appendChild(el);
+ });
+
+ test('does not invoke observer twice', function() {
+ assert.equal(el.__observerCalled, 1);
+ });
+ });
+
+ suite('automated attribute capitalization detection', function() {
+ let el;
+
+ setup(function() {
+ el = document.createElement('svg-element');
+ document.body.appendChild(el);
+ });
+
+ teardown(function() {
+ document.body.removeChild(el);
+ });
+
+ test('can handle capitalized HTML attribute', function() {
+ assert.equal(el.$.svg.getAttribute('viewBox'), el.value);
+ });
+ });
+
+ suite('can work with strict binding parser', function() {
+ setup(function() {
+ document.body.removeChild(el);
+ el = document.createElement('x-basic-strict-binding-parser');
+ document.body.appendChild(el);
+ });
+
+ test('binding with slash', function() {
+ el.objectWithSlash = {
+ 'binding/with/slash': 'yes'
+ };
+ assert.equal(el.$.boundWithSlash.textContent, 'yes');
+ });
+
+ test('json should not be a binding', function() {
+ assert.equal(el.$.jsonContent.textContent, '[["Jan", 31],["Feb", 28],["Mar", 31]]');
+ });
+
+ test('binding with non-English unicode', function() {
+ el.objectWithNonEnglishUnicode = {
+ 商品名: 'yes'
+ };
+ assert.equal(el.$.nonEnglishUnicode.textContent, 'yes');
+ });
+
+ test('binding with booleans', function() {
+ el.otherValue = 10;
+ assert.equal(el.$.booleanTrue.textContent, 'foo(field, true): 10');
+ assert.equal(el.$.booleanFalse.textContent, 'foo(field, false): 20');
+ });
+
+ suite('equivalent behavior as regex', function() {
+ // Loop over the suite "single-element binding effects" (parent of the parent of this suite)
+ // And make sure that the tests there also pass on the binding-parser
+ //
+ // t.title is the name of the test and t.fn contains the test body
+ this.parent.parent.tests.forEach(t => {
+ test(t.title, t.fn);
+ });
+ });
+ });
+});
+
+suite('computed bindings with dynamic functions', function() {
+
+ var el;
+
+ setup(function() {
+ sinon.spy(console, 'warn');
+ });
+
+ teardown(function() {
+ document.body.removeChild(el);
+ console.warn.restore();
+ });
+
+ test('annotated computation with dynamic function', function() {
+ el = document.createElement('x-bind-computed-property');
+ document.body.appendChild(el);
+
+ assert.equal(el.$.check.textContent, 'translated: Hello World.');
+
+ el.translator = function(message) {
+ return 'changed: ' + message;
+ };
+
+ assert.equal(el.$.check.textContent, 'changed: Hello World.');
+ assert.equal(console.warn.callCount, 0);
+ });
+
+ test('annotated computation / late resolved dynamic function', function() {
+ el = document.createElement('x-bind-computed-property-late-translator');
+ document.body.appendChild(el);
+
+ assert.equal(el.$.check.textContent.trim(), '');
+
+ el.translator = function(message) {
+ return 'translated: ' + message;
+ };
+
+ assert.equal(el.$.check.textContent, 'translated: Hello');
+ assert.equal(console.warn.callCount, 0);
+ });
+
+ test('method observer with dynamic function', function() {
+ Polymer({
+ is: 'x-method-observer-with-dynamic-function',
+ properties: {
+ translateMessage: {
+ type: Function
+ },
+ message: {
+ type: String,
+ value: 'Hello'
+ }
+ },
+
+ observers: ['translateMessage(message)']
+
+ });
+
+ el = document.createElement('x-method-observer-with-dynamic-function');
+ document.body.appendChild(el);
+
+ el.translateMessage = sinon.spy();
+ assert.equal(el.translateMessage.callCount, 1);
+ assert.equal(console.warn.callCount, 0);
+ });
+
+ test('observer with dynamic function', function() {
+ Polymer({
+ is: 'x-observer-with-dynamic-function',
+ properties: {
+ messageChanged: {
+ type: Function
+ },
+ message: {
+ type: String,
+ value: 'Hello',
+ observer: 'messageChanged'
+ }
+ }
+
+ });
+
+ el = document.createElement('x-observer-with-dynamic-function');
+ document.body.appendChild(el);
+
+ el.messageChanged = sinon.spy();
+ assert.equal(el.messageChanged.callCount, 1);
+ assert.equal(console.warn.callCount, 0);
+ });
+
+ test('computed property with dynamic function', function() {
+ Polymer({
+ is: 'x-computed-property-with-dynamic-function',
+ properties: {
+ computedValue: {
+ computed: "translateMessage('Hello')"
+ },
+ translateMessage: {
+ type: Function
+ }
+ }
+ });
+
+ el = document.createElement('x-computed-property-with-dynamic-function');
+ document.body.appendChild(el);
+
+ assert.equal(el.computedValue, undefined);
+
+ var called = 0;
+ el.translateMessage = function(message) {
+ called += 1;
+ return 'translated: ' + message;
+ };
+
+ assert.equal(called, 1);
+ assert.equal(el.computedValue, 'translated: Hello');
+ assert.equal(console.warn.callCount, 0);
+ });
+
+ test('ensure annotator can pass dynamic fn to parent props', function(done) {
+ el = document.createElement('x-child-template-with-dynamic-fn');
+ document.body.appendChild(el);
+
+ setTimeout(function() {
+ var check = el.root.querySelector('p');
+ assert.equal(check.textContent, 'text');
+ assert.equal(console.warn.callCount, 0);
+ done();
+ });
+
+ });
+
+});
+
+suite('2-way binding effects between elements', function() {
+
+ var el;
+
+ setup(function() {
+ el = document.createElement('x-compose');
+ document.body.appendChild(el);
+ });
+
+ teardown(function() {
+ document.body.removeChild(el);
+ });
+
+ test('binding to non-notifying property', function() {
+ el.boundvalue = 42;
+ assert.equal(el.$.basic1.value, 42, 'binding to child not updated');
+ el.$.basic1.value = 43;
+ assert.equal(el.boundvalue, 42, 'binding to non-notifying property updated and should not have been');
+ });
+
+ test('observer for property bound to non-notifying property', function() {
+ el.$.basic1.value = 44;
+ assert.equal(el.observerCounts.boundvalueChanged, 0, 'observer for property bound to non-notifying property called and should not have been');
+ });
+
+ test('binding to non-notifying computed property', function() {
+ el.boundcomputedvalue = 42;
+ el.$.basic1.value = 43;
+ assert.equal(el.boundcomputedvalue, 42, 'binding to non-notifying computed property updated and should not have been');
+ });
+
+ test('observer for property bound to non-notifying computed property', function() {
+ el.$.basic1.value = 44;
+ assert.equal(el.observerCounts.boundcomputedvalueChanged, 0, 'observer for property bound to non-notifying computed property called and should not have been');
+ });
+
+ test('computed value readOnly from downward binding', function() {
+ el.$.basic3.value = 10;
+ assert.equal(el.$.basic3.computedvalue, 11);
+ // should have no effect
+ el.value = 99;
+ assert.equal(el.$.basic3.computedvalue, 11);
+ });
+
+ test('computed value readOnly from upward notification', function() {
+ assert.equal(el.computedValue, 30);
+ // should have no effect
+ el.$.basic3.notifyingvalue = 10;
+ assert.equal(el.computedValue, 30);
+ });
+
+ test('binding to notifying property', function() {
+ el.boundnotifyingvalue = 42;
+ assert.equal(el.$.basic1.notifyingvalue, 42, 'binding to child not updated');
+ assert.equal(el.$.basic1.camelNotifyingValue, 42, 'camel-case binding to child not updated');
+ el.$.basic1.notifyingvalue = 43;
+ assert.equal(el.boundnotifyingvalue, 43, 'binding to notifying property not updated');
+ el.$.basic1.camelNotifyingValue = -43;
+ assert.equal(el.boundnotifyingvalue, -43, 'camel-case binding to notifying property not updated');
+ });
+
+ test('binding to notifying property with default', function() {
+ assert.equal(el.boundnotifyingvalueWithDefault, 99);
+ });
+
+ test('observer for property bound to notifying property', function() {
+ el.$.basic1.notifyingvalue = 45;
+ assert.equal(el.observerCounts.boundnotifyingvalueChanged, 1, 'observer for property bound to notifying property not called');
+ });
+
+ test('binding to notifying computed property', function() {
+ el.$.basic1.notifyingvalue = 43;
+ assert.equal(el.boundcomputednotifyingvalue, 45, 'binding to notifying computed property not updated');
+ });
+
+ test('observer for property bound to notifying computed property', function() {
+ el.$.basic1.notifyingvalue = 45;
+ assert.equal(el.observerCounts.boundcomputednotifyingvalueChanged, 1, 'observer for property bound to non-notifying computed property not called');
+ });
+
+ test('no change for binding into read-only property', function() {
+ el.$.basic1._setReadonlyvalue(45);
+ el.$.basic1.clearObserverCounts();
+ el.boundreadonlyvalue = 46;
+ assert.equal(el.$.basic1.observerCounts.readonlyvalueChanged, 0, 'observer for read-only property should not be called from change to bound value');
+ assert.equal(el.$.basic1.readonlyvalue, 45, 'read-only property should not change from change to bound value');
+ });
+
+ test('change for binding out of read-only property', function() {
+ el.$.basic1._setReadonlyvalue(46);
+ assert.equal(el.observerCounts.boundreadonlyvalueChanged, 1, 'observer for property bound to read-only property should be called from change to bound value');
+ assert.equal(el.boundreadonlyvalue, 46, 'property bound to read-only property should change from change to bound value');
+ });
+
+ test('negated binding update negates value for parent', function() {
+ assert.equal(el.negatedValue, false);
+ assert.equal(el.$.basic4.notifyingvalue, true);
+ el.$.basic4.notifyingvalue = false;
+ assert.equal(el.negatedValue, true);
+ });
+
+ test('custom xxx-changed event notifies correctly', function() {
+ assert.equal(el.boundCustomNotifyingValue, undefined);
+ assert.equal(el.observerCounts.boundCustomNotifyingValueChanged, 0);
+ el.$.basic1.fireCustomNotifyingEvent();
+ assert.equal(el.boundCustomNotifyingValue, 'changed!');
+ assert.equal(el.observerCounts.boundCustomNotifyingValueChanged, 1);
+ });
+
+});
+
+suite('handling notifying evevnts', function() {
+
+ test('handle notification event and set property with observer when connected', function() {
+ var el = document.createElement('x-handle-notify-event');
+ document.body.appendChild(el);
+ assert.ok(el.shadowRoot.querySelector('#before'), 'element not found before default notifying element');
+ assert.ok(el.shadowRoot.querySelector('#later'), 'element not found after default notifying element');
+ assert.isTrue(el.readySpy.calledOnce, 'ready called more than once');
+ assert.isTrue(el.handleNotify.calledOnce, 'listener called more than once');
+ assert.isTrue(el.propChanged.calledOnce, 'observer called more than once');
+ assert.isTrue(el.handleNotify.calledBefore(el.propChanged), 'observer called before event');
+ assert.isTrue(el.afterSettingProp.calledBefore(el.propChanged), 'accessor side effect processed during notifying event (before clients ready)');
+ assert.isTrue(el.propChanged.calledBefore(el.readySpy), 'observer called before ready');
+ document.body.removeChild(el);
+ });
+
+ test('handle notification event and set property with observer when *not* connected and _enableProperties called', function() {
+ var el = document.createElement('x-handle-notify-event');
+ el._enableProperties();
+ assert.ok(el.shadowRoot.querySelector('#before'), 'element not found before default notifying element');
+ assert.ok(el.shadowRoot.querySelector('#later'), 'element not found after default notifying element');
+ assert.isTrue(el.readySpy.calledOnce, 'ready called more than once');
+ assert.isTrue(el.handleNotify.calledOnce, 'listener called more than once');
+ assert.isTrue(el.propChanged.calledOnce, 'observer called more than once');
+ assert.isTrue(el.handleNotify.calledBefore(el.propChanged), 'observer called before event');
+ assert.isTrue(el.afterSettingProp.calledBefore(el.propChanged), 'accessor side effect processed during notifying event (before clients ready)');
+ assert.isTrue(el.propChanged.calledBefore(el.readySpy), 'observer called before ready');
+ });
+
+});
+
+suite('1-way binding effects between elements', function() {
+
+ var el;
+
+ setup(function() {
+ el = document.createElement('x-compose');
+ document.body.appendChild(el);
+ });
+
+ teardown(function() {
+ document.body.removeChild(el);
+ });
+
+ test('one-way binding to non-notifying property', function() {
+ el.boundvalue = 42;
+ assert.equal(el.$.basic1.value, 42, 'binding to child not updated');
+ el.$.basic2.value = 43;
+ assert.equal(el.boundvalue, 42, 'binding to non-notifying property updated and should not have been');
+ });
+
+ test('observer for property one-way-bound to non-notifying property', function() {
+ el.$.basic2.value = 44;
+ assert.equal(el.observerCounts.boundvalueChanged, 0, 'observer for property one-way-bound to non-notifying property called and should not have been');
+ });
+
+ test('one-way binding to non-notifying computed property', function() {
+ el.boundcomputedvalue = 42;
+ el.$.basic2.value = 43;
+ assert.equal(el.boundcomputedvalue, 42, 'binding to non-notifying computed property updated and should not have been');
+ });
+
+ test('observer for property one-way-bound to non-notifying computed property', function() {
+ el.$.basic2.value = 44;
+ assert.equal(el.observerCounts.boundcomputedvalueChanged, 0, 'observer for property bound to non-notifying computed property called and should not have been');
+ });
+
+ test('one-way binding to notifying property', function() {
+ el.boundnotifyingvalue = 42;
+ assert.equal(el.$.basic2.notifyingvalue, 42, 'binding to child not updated');
+ el.$.basic2.notifyingvalue = 43;
+ assert.equal(el.boundnotifyingvalue, 42, 'binding to notifying property updated and should not have been');
+ });
+
+ test('observer for property one-way-bound to notifying property', function() {
+ el.$.basic2.notifyingvalue = 45;
+ assert.equal(el.observerCounts.boundnotifyingvalueChanged, 0, 'observer for property bound to notifying property called and should not have been');
+ });
+
+ test('one-way binding to notifying computed property', function() {
+ el.boundcomputednotifyingvalue = 42;
+ el.$.basic2.notifyingvalue = 43;
+ assert.equal(el.boundcomputednotifyingvalue, 42, 'binding to notifying computed property updated and should not have been');
+ });
+
+ test('observer for property one-way-bound to notifying computed property', function() {
+ el.$.basic2.notifyingvalue = 45;
+ assert.equal(el.observerCounts.boundcomputednotifyingvalueChanged, 0, 'observer for property bound to non-notifying computed property called and should not have been');
+ });
+
+});
+
+suite('reflection to attribute', function() {
+
+ var el;
+
+ setup(function() {
+ el = document.createElement('x-reflect');
+ document.body.appendChild(el);
+ });
+
+ teardown(function() {
+ document.body.removeChild(el);
+ });
+
+ test('reflect object', function() {
+ var obj = {foo: 'bar', array: [1, '2', {3:3}]};
+ el.reflectedobject = obj;
+ assert.equal(el.getAttribute('reflectedobject'), '{"foo":"bar","array":[1,"2",{"3":3}]}');
+ // Ensure object wasn't re-deserialized
+ assert.equal(el.reflectedobject, obj);
+ el.reflectedobject = null;
+ assert(!el.hasAttribute('reflectedobject'));
+ });
+
+ test('reflect array', function() {
+ var arr = [1, '2', {3:3}, {'four': 'four'}];
+ el.reflectedarray = arr;
+ assert.equal(el.getAttribute('reflectedarray'), '[1,"2",{"3":3},{"four":"four"}]');
+ // Ensure array wasn't re-deserialized
+ assert.equal(el.reflectedarray, arr);
+ el.reflectedarray = null;
+ assert(!el.hasAttribute('reflectedarray'));
+ });
+
+ test('reflect string', function() {
+ var str = '"polymer is grrrrreat, ain\'t it?"';
+ el.reflectedstring = str;
+ assert.equal(el.getAttribute('reflectedstring'), str);
+ assert.equal(el.reflectedstring, str);
+ el.reflectedstring = '';
+ assert.equal(el.getAttribute('reflectedstring'), '');
+ assert.equal(el.reflectedstring, '');
+ el.reflectedstring = null;
+ assert(!el.hasAttribute('reflectedstring'));
+ assert.equal(el.reflectedstring, null);
+ });
+
+ test('reflect number', function() {
+ el.reflectedNumber = 765;
+ assert.equal(el.getAttribute('reflected-number'), '765');
+ assert.equal(el.reflectedNumber, 765);
+ el.reflectedNumber = 765.4321;
+ assert.equal(el.getAttribute('reflected-number'), '765.4321');
+ assert.equal(el.reflectedNumber, 765.4321);
+ el.reflectedNumber = null;
+ assert(!el.hasAttribute('reflected-number'));
+ assert.equal(el.reflectedNumber, null);
+ });
+
+ test('reflect boolean', function() {
+ el.reflectedboolean = true;
+ assert(el.hasAttribute('reflectedboolean'));
+ assert.equal(el.getAttribute('reflectedboolean'), '');
+ assert.equal(el.reflectedboolean, true);
+ el.reflectedboolean = false;
+ assert(!el.hasAttribute('reflectedboolean'));
+ assert.equal(el.reflectedboolean, false);
+ el.reflectedboolean = true;
+ el.reflectedboolean = null;
+ assert(!el.hasAttribute('reflectedboolean'));
+ assert.equal(el.reflectedboolean, null);
+ });
+
+ test('reflect date', function() {
+ var date = new Date('Fri Jan 23 2015 17:40:29 GMT-0800 (PST)');
+ el.reflecteddate = date;
+ assert(el.hasAttribute('reflecteddate'));
+ assert.equal(Date.parse(el.getAttribute('reflecteddate')),
+ el.reflecteddate.getTime());
+ assert.equal(el.reflecteddate, date);
+ el.reflecteddate = null;
+ assert(!el.hasAttribute('reflecteddate'));
+ assert.equal(el.reflecteddate, null);
+ });
+
+ test('reflect wrong type', function() {
+ el.reflectedstring = true;
+ assert(el.hasAttribute('reflectedstring'));
+ assert.equal(el.getAttribute('reflectedstring'), '');
+ // Ensure value wasn't re-deserialized
+ assert.strictEqual(el.reflectedstring, true);
+ });
+
+});
+
+suite('binding to attribute', function() {
+
+ var el;
+
+ setup(function() {
+ el = document.createElement('x-basic');
+ document.body.appendChild(el);
+ });
+
+ teardown(function() {
+ document.body.removeChild(el);
+ });
+
+ test('bind object to attribute', function() {
+ el.attrvalue = {foo: 'bar', array: [1, '2', {3:3}]};
+ assert.equal(el.$.boundChild.getAttribute('attrvalue'),
+ '{"foo":"bar","array":[1,"2",{"3":3}]}');
+ el.attrvalue = null;
+ assert(!el.$.boundChild.hasAttribute('attrvalue'));
+ });
+
+ test('bind array to attribute', function() {
+ el.attrvalue = [1, '2', {3:3}, {'four': 'four'}];
+ assert.equal(el.$.boundChild.getAttribute('attrvalue'),
+ '[1,"2",{"3":3},{"four":"four"}]');
+ el.attrvalue = null;
+ assert(!el.$.boundChild.hasAttribute('attrvalue'));
+ });
+
+ test('bind string to attribute', function() {
+ el.attrvalue = '"polymer is grrrrreat, ain\'t it?"';
+ assert.equal(el.$.boundChild.getAttribute('attrvalue'),
+ '"polymer is grrrrreat, ain\'t it?"');
+ el.attrvalue = '';
+ assert.equal(el.$.boundChild.getAttribute('attrvalue'), '');
+ el.attrvalue = null;
+ assert(!el.$.boundChild.hasAttribute('attrvalue'));
+ });
+
+ test('bind number to attribute', function() {
+ el.attrvalue = 765;
+ assert.equal(el.$.boundChild.getAttribute('attrvalue'), '765');
+ el.attrvalue = 765.4321;
+ assert.equal(el.$.boundChild.getAttribute('attrvalue'), '765.4321');
+ el.attrvalue = null;
+ assert(!el.$.boundChild.hasAttribute('attrvalue'));
+ });
+
+ test('bind boolean to attribute', function() {
+ el.attrvalue = true;
+ assert(el.$.boundChild.hasAttribute('attrvalue'));
+ assert.equal(el.$.boundChild.getAttribute('attrvalue'), '');
+ el.attrvalue = false;
+ assert(!el.$.boundChild.hasAttribute('attrvalue'));
+ el.attrvalue = true;
+ el.attrvalue = null;
+ assert(!el.$.boundChild.hasAttribute('attrvalue'));
+ });
+
+ test('bind date to attribute', function() {
+ el.attrvalue = new Date('Fri Jan 23 2015 17:40:29 GMT-0800 (PST)');
+ assert(el.$.boundChild.hasAttribute('attrvalue'));
+ assert.equal(Date.parse(el.$.boundChild.getAttribute('attrvalue')),
+ el.attrvalue.getTime());
+ el.attrvalue = null;
+ assert(!el.$.boundChild.hasAttribute('attrvalue'));
+ });
+
+ test('bind to value attribute on input should not fail', function() {
+ var el = document.createElement('x-input-value');
+ document.body.appendChild(el);
+ el.inputValue = "the value";
+ assert.equal(el.$.input.value, "the value", "The value of the input is not propagated");
+ assert.equal(el.$.input.value$, undefined, "value$ should be removed from input");
+ document.body.removeChild(el);
+ });
+
+});
+
+suite('avoid non-bubbling event gotchas', function() {
+
+ var el;
+ var container;
+
+ setup(function() {
+ container = document.createElement('div');
+ document.body.appendChild(container);
+ container.innerHTML = '<x-notifies3></x-notifies3>';
+ el = container.firstChild;
+ });
+
+ teardown(function() {
+ document.body.removeChild(container);
+ });
+
+ test('avoid non-bubbling event gotchas', function() {
+ el.$.notifies2.$.notifies1.notifies = 'runtimeValue';
+ assert.equal(el.$.notifies2.$.notifies1.notifies, 'runtimeValue');
+ assert.equal(el.$.notifies2.shouldChange, 'runtimeValue');
+ assert.notEqual(el.shouldNotChange, 'runtimeValue');
+ });
+
+ test('avoid non-bubbling event gotchas at ready time', function() {
+ assert.equal(el.$.notifies2.$.notifies1.notifies, 'readyValue');
+ assert.equal(el.$.notifies2.shouldChange, 'readyValue');
+ assert.notEqual(el.shouldNotChange, 'readyValue');
+ });
+
+});
+
+suite('warnings', function() {
+
+ var el;
+ var warn; //eslint-disable-line no-unused-vars
+
+ setup(function() {
+ sinon.spy(console, 'warn');
+ el = document.createElement('x-basic');
+ document.body.appendChild(el);
+ });
+
+ teardown(function() {
+ console.warn.restore();
+ document.body.removeChild(el);
+ });
+
+ test('undefined observer', function() {
+ el.noObserver = 42;
+ assert.isTrue(console.warn.calledOnce, 'no warning for undefined observer');
+ });
+
+ test('undefined complex observer', function() {
+ el.noComplexObserver = {};
+ assert.isTrue(console.warn.calledOnce, 'no warning for undefined complex observer');
+ });
+
+ test('undefined computed function', function() {
+ el.noComputed = 99;
+ assert.isTrue(console.warn.calledOnce, 'no warning for undefined computed function');
+ });
+
+ test('undefined inline computed function', function() {
+ el.noInlineComputed = 99;
+ assert.isTrue(console.warn.calledOnce, 'no warning for undefined computed function');
+ });
+
+ test('binding to a bad attribute warns', function() {
+ document.createElement('x-bind-bad-attribute-name');
+ assert.isTrue(console.warn.calledOnce, 'no warning for setting a bad attribute');
+ });
+
+});
+
+suite('binding corner cases', function() {
+
+ // IE can create adjacent text nodes that split bindings; this test
+ // ensures the code that addresses this is functional
+ test('text binding after entity', function() {
+ var el = document.createElement('x-entity-and-binding');
+ document.body.appendChild(el);
+ assert.equal(el.$.binding.textContent, 'binding');
+ document.body.removeChild(el);
+ });
+
+ test('bind to isAttached', function() {
+ var el = document.createElement('x-bind-is-attached');
+ sinon.spy(el, '_isAttachedChanged');
+ document.body.appendChild(el);
+ assert.equal(el.$.check.textContent, 'true');
+ assert.isTrue(el._isAttachedChanged.calledOnce);
+ document.body.removeChild(el);
+ });
+
+});
+
+suite('binding interop', function() {
+
+ test('do not set same value to a non-Polymer element', function() {
+ var el = document.createElement('x-interop');
+ document.body.appendChild(el);
+ assert.equal(el.$.raw.value, 10);
+ assert.equal(el.$.raw.valueChanged.callCount, 1);
+ assert.equal(el.$.raw.valueChanged.firstCall.args[0], 10);
+ // Should set value
+ el.value++;
+ assert.equal(el.$.raw.value, 11);
+ assert.equal(el.$.raw.valueChanged.callCount, 2);
+ assert.equal(el.$.raw.valueChanged.secondCall.args[0], 11);
+ // Notifies up to host, should not be re-set down to element
+ el.$.raw.increment();
+ assert.equal(el.$.raw.value, 12);
+ assert.equal(el.$.raw.valueChanged.callCount, 2);
+ document.body.removeChild(el);
+ });
+
+ test('path notification of object bound to textContent of a Polymer element', function() {
+ var el = document.createElement('x-interop');
+ document.body.appendChild(el);
+ // Initial state
+ assert.equal(el.$.polymer.textContent, '1,2,3');
+ // Push
+ el.push('array', 4);
+ assert.equal(el.$.polymer.textContent, '1,2,3,4');
+ document.body.removeChild(el);
+ });
+
+ test('path notification of array bound to setter of a Polymer element', function() {
+ var el = document.createElement('x-interop');
+ document.body.appendChild(el);
+ // Initial state
+ assert.equal(el.$.polymer.array, el.array);
+ assert.equal(el.$.polymer.arrayChanged.callCount, 1);
+ assert.equal(el.$.polymer.arrayChanged.firstCall.args[0], el.array);
+ // Push
+ el.push('array', 4);
+ assert.equal(el.$.polymer.array, el.array);
+ // Gets called twice, once for splice info, once for length :(
+ assert.equal(el.$.polymer.arrayChanged.callCount, 3);
+ assert.equal(el.$.polymer.arrayChanged.secondCall.args[0], el.array);
+ assert.equal(el.$.polymer.arrayChanged.thirdCall.args[0], el.array);
+ document.body.removeChild(el);
+ });
+
+ test('path notification of array in compound binding to property of Polymer element', function() {
+ var el = document.createElement('x-interop');
+ document.body.appendChild(el);
+ // Initial state
+ assert.equal(el.$.polymer.compound, '**1,2,3**');
+ assert.equal(el.$.polymer.compoundChanged.callCount, 1);
+ assert.equal(el.$.polymer.compoundChanged.firstCall.args[0], '**1,2,3**');
+ // Push
+ el.push('array', 4);
+ assert.equal(el.$.polymer.compound, '**1,2,3,4**');
+ assert.equal(el.$.polymer.compoundChanged.callCount, 2);
+ assert.equal(el.$.polymer.compoundChanged.secondCall.args[0], '**1,2,3,4**');
+ document.body.removeChild(el);
+ });
+
+ test('path notification of array bound to setter of a non-Polymer element', function() {
+ var el = document.createElement('x-interop');
+ document.body.appendChild(el);
+ // Initial state
+ assert.equal(el.$.raw.textContent, '1,2,3');
+ assert.equal(el.$.raw.arrayChanged.callCount, 1);
+ assert.equal(el.$.raw.arrayChanged.firstCall.args[0], el.array);
+ // Push
+ el.push('array', 4);
+ assert.equal(el.$.raw.textContent, '1,2,3,4');
+ // Array change notifies once for splice info, once for length, and
+ // since the property is a Array, it passes the dirty check and will go
+ // through twice; this test also happens to not have a getter, so that
+ // would cause the dirty check to pass even if it wasn't an Object
+ assert.equal(el.$.raw.arrayChanged.callCount, 3);
+ assert.equal(el.$.raw.arrayChanged.secondCall.args[0], el.array);
+ assert.equal(el.$.raw.arrayChanged.thirdCall.args[0], el.array);
+ document.body.removeChild(el);
+ });
+
+ test('path notification of array in compound binding to property of non-Polymer element', function() {
+ var el = document.createElement('x-interop');
+ document.body.appendChild(el);
+ // Initial state
+ assert.equal(el.$.raw.compound, '**1,2,3**');
+ // Raw elements with compound bindings will first see the
+ // literals, then the properties, hence 2 sets initially
+ assert.equal(el.$.raw.compoundChanged.callCount, 2);
+ assert.equal(el.$.raw.compoundChanged.firstCall.args[0], '****');
+ assert.equal(el.$.raw.compoundChanged.secondCall.args[0], '**1,2,3**');
+ // Push
+ el.push('array', 4);
+ assert.equal(el.$.raw.compound, '**1,2,3,4**');
+ assert.equal(el.$.raw.compoundChanged.callCount, 3);
+ assert.equal(el.$.raw.compoundChanged.thirdCall.args[0], '**1,2,3,4**');
+ document.body.removeChild(el);
+ });
+
+});
+
+suite('compound binding / string interpolation', function() {
+
+ var el;
+
+ setup(function() {
+ el = document.createElement('x-basic');
+ document.body.appendChild(el);
+ });
+
+ teardown(function() {
+ document.body.removeChild(el);
+ });
+
+ test('compound adjacent property bindings', function() {
+ // Adjacent compound binding with no literal do not override the default
+ assert.equal(el.$.boundProps.prop1, 'default');
+ assert.isTrue(el.$.boundProps.prop1Changed.calledOnce);
+ el.cpnd2 = 'cpnd2';
+ assert.equal(el.$.boundProps.prop1, 'cpnd2');
+ el.cpnd1 = 'cpnd1';
+ el.cpnd3 = {prop: 'cpnd3'};
+ assert.equal(el.$.boundProps.prop1, 'cpnd1cpnd2cpnd3');
+ el.cpnd4 = 'cpnd4';
+ assert.equal(el.$.boundProps.prop1, 'cpnd1cpnd2cpnd3literalComputedcpnd4');
+ el.cpnd5 = 'cpnd5';
+ assert.equal(el.$.boundProps.prop1, 'cpnd1cpnd2cpnd3literalComputedcpnd5cpnd4');
+ });
+
+ test('compound property bindings with literals', function() {
+ assert.equal(el.$.boundProps.prop2, 'literal1 literal2 literal3 literal4');
+ assert.isTrue(el.$.boundProps.prop2Changed.calledOnce);
+ el.cpnd1 = 'cpnd1';
+ el.cpnd2 = 'cpnd2';
+ el.cpnd3 = {prop: 'cpnd3'};
+ el.cpnd4 = 'cpnd4';
+ el.cpnd5 = 'cpnd5';
+ assert.equal(el.$.boundProps.prop2, 'literal1 cpnd1 literal2 cpnd2cpnd3 literal3 literalComputedcpnd5cpnd4 literal4');
+ el.cpnd1 = null;
+ el.cpnd2 = undefined;
+ el.cpnd3 = {};
+ el.cpnd4 = '';
+ el.cpnd5 = '';
+ assert.equal(el.$.boundProps.prop2, 'literal1 literal2 literal3 literalComputed literal4');
+ });
+
+ test('compound adjacent attribute bindings', function() {
+ // Adjacent compound binding with no literal do not override the default
+ assert.equal(el.$.boundChild.getAttribute('compoundAttr1'), null);
+ el.cpnd2 = 'cpnd2';
+ assert.equal(el.$.boundChild.getAttribute('compoundAttr1'), 'cpnd2');
+ el.cpnd1 = 'cpnd1';
+ el.cpnd3 = {prop: 'cpnd3'};
+ assert.equal(el.$.boundChild.getAttribute('compoundAttr1'), 'cpnd1cpnd2cpnd3');
+ el.cpnd4 = 'cpnd4';
+ assert.equal(el.$.boundChild.getAttribute('compoundAttr1'), 'cpnd1cpnd2cpnd3literalComputedcpnd4');
+ el.cpnd5 = 'cpnd5';
+ assert.equal(el.$.boundChild.getAttribute('compoundAttr1'), 'cpnd1cpnd2cpnd3literalComputedcpnd5cpnd4');
+ });
+
+ test('compound property attribute with literals', function() {
+ assert.equal(el.$.boundChild.getAttribute('compoundAttr2'), 'literal1 literal2 literal3 literal4');
+ el.cpnd1 = 'cpnd1';
+ el.cpnd2 = 'cpnd2';
+ el.cpnd3 = {prop: 'cpnd3'};
+ el.cpnd4 = 'cpnd4';
+ el.cpnd5 = 'cpnd5';
+ assert.equal(el.$.boundChild.getAttribute('compoundAttr2'), 'literal1 cpnd1 literal2 cpnd2cpnd3 literal3 literalComputedcpnd5cpnd4 literal4');
+ el.cpnd1 = null;
+ el.cpnd2 = undefined;
+ el.cpnd3 = {};
+ el.cpnd4 = '';
+ el.cpnd5 = '';
+ assert.equal(el.$.boundChild.getAttribute('compoundAttr2'), 'literal1 literal2 literal3 literalComputed literal4');
+ });
+
+ test('compound property attribute with {} and [] in text', function() {
+ el.cpnd1 = 'cpnd1';
+ assert.equal(el.$.boundChild.getAttribute('compoundAttr3'), '[yes/no]: cpnd1, Hello {0} username world');
+ });
+
+ test('compound adjacent textNode bindings', function() {
+ // The single space is due to the gambit to prevent empty text nodes
+ // from being omitted by IE during importNode from the template; it will
+ // only be there when in the virgin state after cloning the template
+ assert.equal(el.$.compound1.textContent, ' ');
+ el.cpnd2 = 'cpnd2';
+ assert.equal(el.$.compound1.textContent, 'cpnd2');
+ el.cpnd1 = 'cpnd1';
+ el.cpnd3 = {prop: 'cpnd3'};
+ assert.equal(el.$.compound1.textContent, 'cpnd1cpnd2cpnd3');
+ el.cpnd4 = 'cpnd4';
+ assert.equal(el.$.compound1.textContent, 'cpnd1cpnd2cpnd3literalComputedcpnd4');
+ el.cpnd5 = 'cpnd5';
+ assert.equal(el.$.compound1.textContent, 'cpnd1cpnd2cpnd3literalComputedcpnd5cpnd4');
+ // Once the binding evaluates back to '', it will in fact be ''
+ el.computeCompound = function() { return ''; };
+ el.cpnd1 = null;
+ el.cpnd2 = '';
+ el.cpnd3 = {prop: null};
+ el.cpnd4 = null;
+ el.cpnd5 = '';
+ assert.equal(el.$.compound1.textContent, '');
+ });
+
+ test('compound textNode bindings with literals', function() {
+ assert.equal(el.$.compound2.textContent.trim(), 'literal1 literal2 literal3 literal4');
+ el.cpnd1 = 'cpnd1';
+ el.cpnd2 = 'cpnd2';
+ el.cpnd3 = {prop: 'cpnd3'};
+ el.cpnd4 = 'cpnd4';
+ el.cpnd5 = 'cpnd5';
+ assert.equal(el.$.compound2.textContent.trim(), 'literal1 cpnd1 literal2 cpnd2cpnd3 literal3 literalComputedcpnd5cpnd4 literal4');
+ el.cpnd1 = null;
+ el.cpnd2 = undefined;
+ el.cpnd3 = {};
+ el.cpnd4 = '';
+ el.cpnd5 = '';
+ assert.equal(el.$.compound2.textContent.trim(), 'literal1 literal2 literal3 literalComputed literal4');
+ });
+
+ test('malformed bindings ignored', function() {
+ el.bool = true;
+ assert.isTrue(el.$.boundChild.textContent.indexOf('really.long.identifier.in.malformed.binding.should.be.ignored') >= 0, true);
+ assert.isTrue(el.$.boundChild.textContent.indexOf('really.long.literal.in.malformed.binding.should.be.ignored') >= 0, true);
+ assert.isTrue(el.$.boundChild.textContent.indexOf('3foo') >= 0, true);
+ });
+
+});
+
+suite('order of effects', function() {
+
+ var el;
+
+ setup(function() {
+ let gp = document.createElement('x-order-of-effects-grand-parent');
+ document.body.appendChild(gp);
+ el = gp.$.child;
+ });
+
+ test('effects are sorted', function() {
+ assert.equal(el.invocations.length, 0);
+ el.base = 'changed';
+
+ var expected = [
+ 'compute',
+ 'propagate', // as observed by child; note: order of binding vs.
+ 'propagate', // computed binding is not guaranteed
+ 'reflect',
+ 'observe', // note: order of single-property observer vs.
+ 'observe', // multi-property observer is not guaranteed
+ 'notify' // as observed by grand-parent
+ ];
+
+ assert.deepEqual(el.invocations, expected);
+ });
+});
+
+suite('misc', function() {
+
+ test('effects forward propagate value', function() {
+ var el = document.createElement('x-propagate');
+ document.body.appendChild(el);
+ assert.equal(el.value, 1, 'observers did not receive latest value for property');
+ document.body.removeChild(el);
+ });
+
+ test('custom _template on prototype', function() {
+ var el = document.createElement('x-template-proto');
+ document.body.appendChild(el);
+ if (window.ShadyDOM) {
+ ShadyDOM.flush();
+ }
+ assert.equal(el.$.div.textContent, 'yes');
+ assert.equal(el.clicked.callCount, 0);
+ el.$.div.click();
+ assert.equal(el.clicked.callCount, 1);
+ document.body.removeChild(el);
+ });
+
+ test('custom _template on behavior', function() {
+ var el = document.createElement('x-template-behavior');
+ document.body.appendChild(el);
+ if (window.ShadyDOM) {
+ ShadyDOM.flush();
+ }
+ assert.equal(el.$.div.textContent, 'yes');
+ assert.equal(el.clicked.callCount, 0);
+ el.$.div.click();
+ assert.equal(el.clicked.callCount, 1);
+ document.body.removeChild(el);
+ });
+
+});
+
+suite('DOM sanitization', function() {
+
+ setup(function() {
+ setSanitizeDOMValue(sinon.spy(function(value) {
+ return (value && value.toString().indexOf('javascript') >= 0) ? 'notallowed!' : value;
+ }));
+ });
+
+ teardown(function() {
+ setSanitizeDOMValue(null);
+ });
+
+ test('bound property', function() {
+ var el = document.createElement('x-basic');
+ document.body.appendChild(el);
+ el.sanitizeValue = 'ok';
+ assert.equal(el.$.boundChild.sanitizeValue, 'ok');
+ el.sanitizeValue = 'javascript';
+ assert.equal(el.$.boundChild.sanitizeValue, 'notallowed!');
+ assert.deepEqual(sanitizeDOMValue.lastCall.args,
+ ['javascript', 'sanitizeValue', 'property', el.$.boundChild]);
+ });
+
+ test('bound textContent', function() {
+ var el = document.createElement('x-basic');
+ document.body.appendChild(el);
+ el.sanitizeText = 'ok';
+ assert.equal(el.$.sanitizeText.textContent, 'ok');
+ el.sanitizeText = 'javascript';
+ assert.equal(el.$.sanitizeText.textContent, 'notallowed!');
+ assert.deepEqual(sanitizeDOMValue.lastCall.args,
+ ['javascript', 'textContent', 'text', el.$.sanitizeText.firstChild]);
+ });
+
+ test('bound attribute', function() {
+ var el = document.createElement('x-basic');
+ document.body.appendChild(el);
+ el.attrvalue = 'ok';
+ assert.equal(el.$.boundChild.getAttribute('attrvalue'), 'ok');
+ el.attrvalue = 'javascript';
+ assert.equal(el.$.boundChild.getAttribute('attrvalue'), 'notallowed!');
+ assert.deepEqual(sanitizeDOMValue.lastCall.args,
+ ['javascript', 'attrvalue', 'attribute', el.$.boundChild]);
+ });
+
+ test('reflected attribute', function() {
+ var el = document.createElement('x-reflect');
+ document.body.appendChild(el);
+ el.reflectedstring = 'ok';
+ assert.equal(el.getAttribute('reflectedstring'), 'ok');
+ el.reflectedstring = 'javascript';
+ assert.equal(el.getAttribute('reflectedstring'), 'notallowed!');
+ assert.deepEqual(sanitizeDOMValue.lastCall.args,
+ ['javascript', 'reflectedstring', 'attribute', el]);
+ });
+
+});
+
+suite('data (im)mutability', function() {
+
+ test('immutable data propagation', function() {
+ let el = document.createElement('x-immutable-a');
+ document.body.appendChild(el);
+ // Flow initial data
+ el.a = {x: 'xb', b: {x: 'xc', c: 'c'}};
+ assert.equal(el.a, el.a);
+ assert.equal(el.aChanged.callCount, 1);
+ assert.equal(el.$.b.b, el.a.b);
+ assert.equal(el.$.b.x, 'xb');
+ assert.equal(el.$.b.bChanged.callCount, 1);
+ assert.equal(el.$.b.xChanged.callCount, 1);
+ assert.equal(el.$.b.$.c.c, 'c');
+ assert.equal(el.$.b.$.c.x, 'xc');
+ assert.equal(el.$.b.$.c.cChanged.callCount, 1);
+ assert.equal(el.$.b.$.c.xChanged.callCount, 1);
+ // Mutate in place with reset (error, does nothing)
+ el.a.b.c = 'wontchange';
+ el.a = el.a;
+ assert.equal(el.a, el.a);
+ assert.equal(el.aChanged.callCount, 1);
+ assert.equal(el.$.b.b, el.a.b);
+ assert.equal(el.$.b.x, 'xb');
+ assert.equal(el.$.b.bChanged.callCount, 1);
+ assert.equal(el.$.b.xChanged.callCount, 1);
+ assert.equal(el.$.b.$.c.c, 'c');
+ assert.equal(el.$.b.$.c.x, 'xc');
+ assert.equal(el.$.b.$.c.cChanged.callCount, 1);
+ assert.equal(el.$.b.$.c.xChanged.callCount, 1);
+ // Mutate via immutable pattern:
+ el.a = Object.assign({}, el.a, {b:
+ Object.assign({}, el.a.b, {
+ c: 'willchange1'
+ })
+ });
+ assert.equal(el.a, el.a);
+ assert.equal(el.aChanged.callCount, 2);
+ assert.equal(el.$.b.b, el.a.b);
+ assert.equal(el.$.b.x, 'xb');
+ assert.equal(el.$.b.bChanged.callCount, 2);
+ assert.equal(el.$.b.xChanged.callCount, 1);
+ assert.equal(el.$.b.$.c.c, 'willchange1');
+ assert.equal(el.$.b.$.c.x, 'xc');
+ assert.equal(el.$.b.$.c.cChanged.callCount, 2);
+ assert.equal(el.$.b.$.c.xChanged.callCount, 1);
+ // Mutate via path API
+ el.set('a.b.c', 'willchange2');
+ assert.equal(el.a, el.a);
+ assert.equal(el.aChanged.callCount, 2);
+ assert.equal(el.$.b.b, el.a.b);
+ assert.equal(el.$.b.x, 'xb');
+ assert.equal(el.$.b.bChanged.callCount, 2);
+ assert.equal(el.$.b.xChanged.callCount, 1);
+ assert.equal(el.$.b.$.c.c, 'willchange2');
+ assert.equal(el.$.b.$.c.x, 'xc');
+ assert.equal(el.$.b.$.c.cChanged.callCount, 3);
+ assert.equal(el.$.b.$.c.xChanged.callCount, 1);
+ });
+
+ test('mutable data propagation', function() {
+ let el = document.createElement('x-mutable-a');
+ document.body.appendChild(el);
+ // Flow initial data
+ el.a = {x: 'xb', b: {x: 'xc', c: 'c'}};
+ assert.equal(el.a, el.a);
+ assert.equal(el.aChanged.callCount, 1);
+ assert.equal(el.$.b.b, el.a.b);
+ assert.equal(el.$.b.x, 'xb');
+ assert.equal(el.$.b.bChanged.callCount, 1);
+ assert.equal(el.$.b.xChanged.callCount, 1);
+ assert.equal(el.$.b.$.c.c, 'c');
+ assert.equal(el.$.b.$.c.x, 'xc');
+ assert.equal(el.$.b.$.c.cChanged.callCount, 1);
+ assert.equal(el.$.b.$.c.xChanged.callCount, 1);
+ // Mutate in place with reset
+ el.a.b.c = 'willchange1';
+ el.a = el.a;
+ assert.equal(el.a, el.a);
+ assert.equal(el.aChanged.callCount, 2);
+ assert.equal(el.$.b.b, el.a.b);
+ assert.equal(el.$.b.x, 'xb');
+ assert.equal(el.$.b.bChanged.callCount, 2);
+ assert.equal(el.$.b.xChanged.callCount, 1);
+ assert.equal(el.$.b.$.c.c, 'willchange1');
+ assert.equal(el.$.b.$.c.x, 'xc');
+ assert.equal(el.$.b.$.c.cChanged.callCount, 2);
+ assert.equal(el.$.b.$.c.xChanged.callCount, 1);
+ // Mutate via immutable pattern:
+ el.a = Object.assign({}, el.a, {b:
+ Object.assign({}, el.a.b, {
+ c: 'willchange2'
+ })
+ });
+ assert.equal(el.a, el.a);
+ assert.equal(el.aChanged.callCount, 3);
+ assert.equal(el.$.b.b, el.a.b);
+ assert.equal(el.$.b.x, 'xb');
+ assert.equal(el.$.b.bChanged.callCount, 3);
+ assert.equal(el.$.b.xChanged.callCount, 1);
+ assert.equal(el.$.b.$.c.c, 'willchange2');
+ assert.equal(el.$.b.$.c.x, 'xc');
+ assert.equal(el.$.b.$.c.cChanged.callCount, 3);
+ assert.equal(el.$.b.$.c.xChanged.callCount, 1);
+ // Mutate via path API
+ el.set('a.b.c', 'willchange3');
+ assert.equal(el.a, el.a);
+ assert.equal(el.aChanged.callCount, 3);
+ assert.equal(el.$.b.b, el.a.b);
+ assert.equal(el.$.b.x, 'xb');
+ assert.equal(el.$.b.bChanged.callCount, 3);
+ assert.equal(el.$.b.xChanged.callCount, 1);
+ assert.equal(el.$.b.$.c.c, 'willchange3');
+ assert.equal(el.$.b.$.c.x, 'xc');
+ assert.equal(el.$.b.$.c.cChanged.callCount, 4);
+ assert.equal(el.$.b.$.c.xChanged.callCount, 1);
+ });
+
+});
+
+suite('runtime effects', function() {
+
+ var el, el2;
+
+ setup(function() {
+ el = document.createElement('x-basic');
+ document.body.appendChild(el);
+ });
+
+ teardown(function() {
+ document.body.removeChild(el);
+ document.body.removeChild(el2);
+ });
+
+ test('add/remove runtime property effect', function() {
+ assert.equal(el.observerCounts.valueChanged, 1);
+ let info = {};
+ let fn = sinon.spy();
+ let effect = { info, fn };
+ el._addPropertyEffect('value', el.PROPERTY_EFFECT_TYPES.OBSERVE, effect);
+ el.value = 'value++';
+ assert.equal(el.observerCounts.valueChanged, 2);
+ assert.equal(fn.callCount, 1);
+ assert.equal(fn.firstCall.args[0], el);
+ assert.equal(fn.firstCall.args[1], 'value');
+ assert.equal(fn.firstCall.args[2].value, 'value++');
+ assert.equal(fn.firstCall.args[4], info);
+ el._removePropertyEffect('value', el.PROPERTY_EFFECT_TYPES.OBSERVE, effect);
+ el.value = 'value+++';
+ assert.equal(fn.callCount, 1);
+ // Ensure prototype wasn't affected
+ el2 = document.createElement('x-basic');
+ document.body.appendChild(el2);
+ assert.equal(fn.callCount, 1);
+ });
+
+ test('add/remove runtime path effect', function() {
+ assert.equal(el.observerCounts.valueChanged, 1);
+ let info = {};
+ let fn = sinon.spy();
+ let trigger = {name: 'value.path', structured: true};
+ let effect = { info, fn, trigger };
+ el._addPropertyEffect('value', el.PROPERTY_EFFECT_TYPES.OBSERVE, effect);
+ el.value = {path: 'value.path'};
+ assert.equal(el.observerCounts.valueChanged, 2);
+ assert.equal(fn.callCount, 1);
+ assert.equal(fn.getCall(0).args[0], el);
+ assert.equal(fn.getCall(0).args[1], 'value');
+ assert.equal(fn.getCall(0).args[2].value, el.value);
+ assert.equal(fn.getCall(0).args[4], info);
+ el.set('value.path', 'value.path++');
+ assert.equal(el.observerCounts.valueChanged, 2);
+ assert.equal(fn.callCount, 2);
+ assert.equal(fn.getCall(1).args[0], el);
+ assert.equal(fn.getCall(1).args[1], 'value.path');
+ assert.equal(fn.getCall(1).args[2]['value.path'], 'value.path++');
+ assert.equal(fn.getCall(1).args[4], info);
+ el._removePropertyEffect('value', el.PROPERTY_EFFECT_TYPES.OBSERVE, effect);
+ el.set('value.path', 'value.path+++');
+ assert.equal(fn.callCount, 2);
+ // Ensure prototype wasn't affected
+ el2 = document.createElement('x-basic');
+ document.body.appendChild(el2);
+ assert.equal(fn.callCount, 2);
+ });
+
+});
+
+suite('a la carte usage of API', function() {
+
+ let BaseClass;
+
+ suiteSetup(function() {
+ BaseClass = class extends PropertyEffects(HTMLElement) {
+ connectedCallback() {
+ this.pcSpy = sinon.spy();
+ this._enableProperties();
+ }
+ _propertiesChanged(props, changedProps, oldProps) {
+ this.pcSpy(props, changedProps, oldProps);
+ super._propertiesChanged(props, changedProps, oldProps);
+ }
+ };
+ });
+
+ test('generic property effect', function() {
+ class TestClass extends BaseClass {
+ constructor() {
+ super();
+ this.observer = sinon.spy();
+ }
+ }
+ let observer = sinon.spy();
+ TestClass.addPropertyEffect('prop', TestClass.prototype.PROPERTY_EFFECT_TYPES.OBSERVE, {
+ fn: observer
+ });
+ customElements.define('pe-pe', TestClass);
+ let el = document.createElement('pe-pe');
+ document.body.appendChild(el);
+ assert.equal(observer.callCount, 0);
+ assert.equal(el.pcSpy.callCount, 0);
+ el.prop = true;
+ assert.equal(observer.callCount, 1);
+ assert.equal(el.pcSpy.callCount, 1);
+ el.prop = 'hithere';
+ assert.equal(observer.callCount, 2);
+ assert.equal(el.pcSpy.callCount, 2);
+ el.prop = false;
+ assert.equal(observer.callCount, 3);
+ assert.equal(el.pcSpy.callCount, 3);
+ document.body.removeChild(el);
+ });
+
+ test('read only property', function() {
+ class TestClass extends BaseClass {}
+ TestClass.createReadOnlyProperty('prop', true);
+ customElements.define('pe-read-only', TestClass);
+ let el = document.createElement('pe-read-only');
+ document.body.appendChild(el);
+ el.prop = true;
+ assert.equal(el.prop, undefined);
+ assert.equal(el.pcSpy.callCount, 0);
+ el._setProp(true);
+ assert.equal(el.prop, true);
+ assert.equal(el.pcSpy.callCount, 1);
+ el.prop = false;
+ assert.equal(el.prop, true);
+ assert.equal(el.pcSpy.callCount, 1);
+ document.body.removeChild(el);
+ });
+
+ test('reflected property', function() {
+ class TestClass extends BaseClass {}
+ TestClass.createReflectedProperty('prop', true);
+ customElements.define('pe-reflected', TestClass);
+ let el = document.createElement('pe-reflected');
+ document.body.appendChild(el);
+ assert.equal(el.hasAttribute('prop'), false);
+ assert.equal(el.pcSpy.callCount, 0);
+ el.prop = true;
+ assert.equal(el.getAttribute('prop'), '');
+ assert.equal(el.pcSpy.callCount, 1);
+ el.prop = 'hithere';
+ assert.equal(el.getAttribute('prop'), 'hithere');
+ assert.equal(el.pcSpy.callCount, 2);
+ el.prop = false;
+ assert.equal(el.hasAttribute('prop'), false);
+ assert.equal(el.pcSpy.callCount, 3);
+ document.body.removeChild(el);
+ });
+
+ test('property observer', function() {
+ class TestClass extends BaseClass {
+ constructor() {
+ super();
+ this.observer = sinon.spy();
+ }
+ }
+ TestClass.createPropertyObserver('prop', 'observer');
+ customElements.define('pe-observer', TestClass);
+ let el = document.createElement('pe-observer');
+ document.body.appendChild(el);
+ assert.equal(el.observer.callCount, 0);
+ assert.equal(el.pcSpy.callCount, 0);
+ el.prop = true;
+ assert.equal(el.observer.callCount, 1);
+ assert.equal(el.pcSpy.callCount, 1);
+ el.prop = 'hithere';
+ assert.equal(el.observer.callCount, 2);
+ assert.equal(el.pcSpy.callCount, 2);
+ el.prop = false;
+ assert.equal(el.observer.callCount, 3);
+ assert.equal(el.pcSpy.callCount, 3);
+ document.body.removeChild(el);
+ });
+
+ test('method observer', function() {
+ class TestClass extends BaseClass {
+ constructor() {
+ super();
+ this.observer = sinon.spy();
+ }
+ }
+ TestClass.createMethodObserver('observer(a, b.c)', true);
+ customElements.define('pe-method-observer', TestClass);
+ let el = document.createElement('pe-method-observer');
+ document.body.appendChild(el);
+ assert.equal(el.observer.callCount, 1);
+ assert.deepEqual(el.observer.getCall(0).args, [undefined, undefined]);
+ assert.equal(el.pcSpy.callCount, 1);
+ el.a = 'a';
+ assert.equal(el.observer.callCount, 2);
+ assert.deepEqual(el.observer.getCall(1).args, ['a', undefined]);
+ assert.equal(el.pcSpy.callCount, 2);
+ el.b = {c: 'c'};
+ assert.equal(el.observer.callCount, 3);
+ assert.deepEqual(el.observer.getCall(2).args, ['a', 'c']);
+ assert.equal(el.pcSpy.callCount, 3);
+ el.setProperties({
+ a: 'A',
+ b: {c: 'C'}
+ });
+ assert.equal(el.observer.callCount, 4);
+ assert.deepEqual(el.observer.getCall(3).args, ['A', 'C']);
+ assert.equal(el.pcSpy.callCount, 4);
+
+ el.observer = sinon.spy();
+ assert.equal(el.observer.callCount, 1);
+ assert.deepEqual(el.observer.getCall(0).args, ['A', 'C']);
+ assert.equal(el.pcSpy.callCount, 5);
+ document.body.removeChild(el);
+ });
+
+ test('computed property', function() {
+ class TestClass extends BaseClass {
+ constructor() {
+ super();
+ this.compute = sinon.spy(function(a, c) { return a + c; });
+ }
+ }
+ TestClass.createComputedProperty('prop', 'compute(a, b.c)');
+ customElements.define('pe-computed', TestClass);
+ let el = document.createElement('pe-computed');
+ document.body.appendChild(el);
+ assert.equal(el.compute.callCount, 0);
+ assert.equal(el.pcSpy.callCount, 0);
+ el.a = 'a';
+ assert.equal(el.compute.callCount, 1);
+ assert.deepEqual(el.compute.getCall(0).args, ['a', undefined]);
+ assert.equal(el.prop, 'aundefined');
+ assert.equal(el.pcSpy.callCount, 1);
+ el.b = {c: 'c'};
+ assert.equal(el.compute.callCount, 2);
+ assert.deepEqual(el.compute.getCall(1).args, ['a', 'c']);
+ assert.equal(el.prop, 'ac');
+ assert.equal(el.pcSpy.callCount, 2);
+ el.setProperties({
+ a: 'A',
+ b: {c: 'C'}
+ });
+ assert.equal(el.compute.callCount, 3);
+ assert.deepEqual(el.compute.getCall(2).args, ['A', 'C']);
+ assert.equal(el.prop, 'AC');
+ assert.equal(el.pcSpy.callCount, 3);
+ document.body.removeChild(el);
+ });
+
+ test('notifying property', function() {
+ class TestClass extends BaseClass { }
+ TestClass.createNotifyingProperty('prop');
+ customElements.define('pe-notify', TestClass);
+ let el = document.createElement('pe-notify');
+ let handler = sinon.spy();
+ el.addEventListener('prop-changed', handler);
+ document.body.appendChild(el);
+ assert.equal(handler.callCount, 0);
+ assert.equal(el.pcSpy.callCount, 0);
+ el.prop = 'prop';
+ assert.equal(handler.callCount, 1);
+ assert.equal(handler.getCall(0).args[0].detail.value, 'prop');
+ assert.equal(el.pcSpy.callCount, 1);
+ el.prop += '+';
+ assert.equal(handler.callCount, 2);
+ assert.equal(handler.getCall(1).args[0].detail.value, 'prop+');
+ document.body.removeChild(el);
+ });
+
+ test('bound template', function() {
+ let template = document.createElement('template');
+ template.innerHTML = '<div>[[prop]]</div><button on-click="handler"></button>';
+ class TestClass extends BaseClass {
+ connectedCallback() {
+ this.handler = sinon.spy();
+ this.attachShadow({mode:'open'}).appendChild(this._stampTemplate(template));
+ super.connectedCallback();
+ }
+ }
+ TestClass.bindTemplate(template);
+ customElements.define('pe-template', TestClass);
+ let el = document.createElement('pe-template');
+ document.body.appendChild(el);
+ assert.equal(el.handler.callCount, 0);
+ el.prop = 'prop';
+ assert.equal(el.shadowRoot.querySelector('div').textContent, 'prop');
+ el.shadowRoot.querySelector('button').click();
+ assert.equal(el.handler.callCount, 1);
+ document.body.removeChild(el);
+ });
+
+});
+</script>
+
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/ready-attached-order-class.html b/third_party/polymer3/bower_components/polymer/test/unit/ready-attached-order-class.html
new file mode 100644
index 0000000..18427fb
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/ready-attached-order-class.html
@@ -0,0 +1,272 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+</head>
+<body>
+
+<script type="module">
+window.clearTestLists = function() {
+ window.actualAttachedList = [];
+ window.actualReadyList = [];
+ window.actualReadyBeforeAttachedList = [];
+};
+
+window.clearTestLists();
+
+window.readyMixin = function(base) {
+ return class readyMixin extends base {
+ static get properties() {
+ return {
+ prop: {
+ value: true,
+ observer: '_propChanged'
+ }
+ };
+ }
+
+ _propChanged() {
+ this.observerShadowRoot = Boolean(this.shadowRoot);
+ }
+ ready() {
+ super.ready();
+ this._readied = true;
+ this.readyList = window.actualReadyList.slice();
+ this.readyShadowRoot = Boolean(this.shadowRoot);
+ window.actualReadyList.push(this);
+ }
+
+ connectedCallback() {
+ this._eventList = [];
+ this.addEventListener('e', (e) => {
+ this._eventList.push(e.composedPath()[0]);
+ });
+ super.connectedCallback();
+ this.dispatchEvent(new Event('e', {composed: true, bubbles: true}));
+ this.attachedShadowRoot = Boolean(this.shadowRoot);
+ this.attachedTime$Keys = Object.keys(this.$);
+ this.attachedList = window.actualAttachedList.slice();
+ window.actualAttachedList.push(this);
+ if (!this._readied) {
+ window.actualReadyBeforeAttachedList.push(this);
+ }
+ }
+ };
+};
+</script>
+
+<dom-module id="x-zot">
+ <template>
+ x-zot<slot></slot>
+ </template>
+ <script type="module">
+import { PolymerElement } from '../../polymer-element.js';
+class El extends window.readyMixin(PolymerElement) {
+ static get is() { return 'x-zot'; }
+}
+customElements.define(El.is, El);
+</script>
+</dom-module>
+
+<dom-module id="x-bar">
+ <template>
+ <x-zot id="zot"></x-zot>
+ </template>
+ <script type="module">
+import { PolymerElement } from '../../polymer-element.js';
+class El extends window.readyMixin(PolymerElement) {
+ static get is() { return 'x-bar'; }
+}
+customElements.define(El.is, El);
+</script>
+</dom-module>
+
+<dom-module id="x-foo">
+ <template>
+ <x-bar id="bar1"></x-bar>
+ <x-bar id="bar2"></x-bar>
+ </template>
+ <script type="module">
+import { PolymerElement } from '../../polymer-element.js';
+class El extends window.readyMixin(PolymerElement) {
+ static get is() { return 'x-foo'; }
+}
+customElements.define(El.is, El);
+</script>
+</dom-module>
+
+<dom-module id="x-ready">
+ <template>
+ <x-zot id="a">
+ <x-zot id="b"></x-zot>
+ <x-zot id="c">
+ <x-zot id="d"></x-zot>
+ </x-zot>
+ </x-zot>
+ <x-foo id="foo"></x-foo>
+ </template>
+ <script type="module">
+import { PolymerElement } from '../../polymer-element.js';
+class El extends window.readyMixin(PolymerElement) {
+ static get is() { return 'x-ready'; }
+ static get properties() {
+ return {
+ foo: {
+ observer: '_fooChanged'
+ }
+ };
+ }
+ _fooChanged() {}
+}
+customElements.define(El.is, El);
+</script>
+</dom-module>
+
+<dom-module id="x-templatized">
+ <template>
+ <template is="dom-if" if>
+ <x-ready foo="[[foo]]"></x-ready>
+ </template>
+ </template>
+ <script type="module">
+import { PolymerElement } from '../../polymer-element.js';
+class El extends PolymerElement {
+ static get is() { return 'x-templatized'; }
+ static get properties() {
+ return {
+ foo: {
+ value: 'foo'
+ }
+ };
+ }
+}
+customElements.define(El.is, El);
+</script>
+</dom-module>
+
+<script type="module">
+import { flush } from '../../lib/utils/flush.js';
+
+suite('ready and attached ordering', function() {
+
+ let el;
+
+ setup(function() {
+ window.clearTestLists();
+ el = document.createElement('x-ready');
+ document.body.appendChild(el);
+ });
+
+ teardown(function() {
+ document.body.removeChild(el);
+ });
+
+ test('element dom ready before element', function() {
+ assert.includeMembers(el.readyList, [el.$.a, el.$.b, el.$.c, el.$.d, el.$.foo]);
+ var foo = el.$.foo;
+ assert.includeMembers(foo.readyList, [foo.$.bar1, foo.$.bar1.$.zot, foo.$.bar2, foo.$.bar2.$.zot]);
+ var b1 = foo.$.bar1, b2 = foo.$.bar2;
+ assert.includeMembers(b1.readyList, [b1.$.zot]);
+ assert.includeMembers(b2.readyList, [b2.$.zot]);
+ });
+
+ test('can listen to events fired by element dom in connected', function() {
+ assert.includeMembers(el._eventList, [el.$.a, el.$.b, el.$.c, el.$.d, el.$.foo]);
+ var foo = el.$.foo;
+ assert.includeMembers(foo._eventList, [foo.$.bar1, foo.$.bar2]);
+ var b1 = foo.$.bar1, b2 = foo.$.bar2;
+ assert.includeMembers(b1._eventList, [b1.$.zot]);
+ assert.includeMembers(b2._eventList, [b2.$.zot]);
+ });
+
+ test('shadowRoot available in ready, connected, observer', function() {
+ [el, el.$.a, el.$.b, el.$.c, el.$.d, el.$.foo,
+ el.$.foo.$.bar1, el.$.foo.$.bar1.$.zot,
+ el.$.foo.$.bar2, el.$.foo.$.bar2.$.zot].forEach((e) => {
+ assert.isTrue(e.observerShadowRoot);
+ assert.isTrue(e.readyShadowRoot);
+ assert.isTrue(e.attachedShadowRoot);
+ });
+ });
+
+ test('element attached called after ready', function() {
+ assert.equal(window.actualReadyBeforeAttachedList.length, 0);
+ });
+
+ test('element has $ references at attached time', function() {
+ assert.sameMembers(el.attachedTime$Keys, ['a', 'b', 'c', 'd', 'foo']);
+ assert.sameMembers(el.$.foo.attachedTime$Keys, ['bar1', 'bar2']);
+ });
+
+});
+
+suite('templatized: ready and attached ordering', function() {
+
+ let container, el;
+
+ setup(function() {
+ window.clearTestLists();
+ container = document.createElement('x-templatized');
+ document.body.appendChild(container);
+ flush();
+ el = container.shadowRoot.querySelector('x-ready');
+ });
+
+ teardown(function() {
+ document.body.removeChild(container);
+ });
+
+ test('element dom ready before element', function() {
+ assert.includeMembers(el.readyList, [el.$.a, el.$.b, el.$.c, el.$.d, el.$.foo]);
+ var foo = el.$.foo;
+ assert.includeMembers(foo.readyList, [foo.$.bar1, foo.$.bar1.$.zot, foo.$.bar2, foo.$.bar2.$.zot]);
+ var b1 = foo.$.bar1, b2 = foo.$.bar2;
+ assert.includeMembers(b1.readyList, [b1.$.zot]);
+ assert.includeMembers(b2.readyList, [b2.$.zot]);
+ });
+
+ test('can listen to events fired by element dom in connected', function() {
+ assert.includeMembers(el._eventList, [el.$.a, el.$.b, el.$.c, el.$.d, el.$.foo]);
+ var foo = el.$.foo;
+ assert.includeMembers(foo._eventList, [foo.$.bar1, foo.$.bar2]);
+ var b1 = foo.$.bar1, b2 = foo.$.bar2;
+ assert.includeMembers(b1._eventList, [b1.$.zot]);
+ assert.includeMembers(b2._eventList, [b2.$.zot]);
+ });
+
+ test('shadowRoot available in ready, connected, observer', function() {
+ [el, el.$.a, el.$.b, el.$.c, el.$.d, el.$.foo,
+ el.$.foo.$.bar1, el.$.foo.$.bar1.$.zot,
+ el.$.foo.$.bar2, el.$.foo.$.bar2.$.zot].forEach((e) => {
+ assert.isTrue(e.observerShadowRoot);
+ assert.isTrue(e.readyShadowRoot);
+ assert.isTrue(e.attachedShadowRoot);
+ });
+ });
+
+ test('element attached called after ready', function() {
+ assert.equal(window.actualReadyBeforeAttachedList.length, 0);
+ });
+
+ test('element has $ references at attached time', function() {
+ assert.sameMembers(el.attachedTime$Keys, ['a', 'b', 'c', 'd', 'foo']);
+ assert.sameMembers(el.$.foo.attachedTime$Keys, ['bar1', 'bar2']);
+ });
+
+});
+</script>
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/ready-attached-order.html b/third_party/polymer3/bower_components/polymer/test/unit/ready-attached-order.html
new file mode 100644
index 0000000..f02e8fc
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/ready-attached-order.html
@@ -0,0 +1,246 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+</head>
+<body>
+
+<script type="module">
+window.clearTestLists = function() {
+ window.actualAttachedList = [];
+ window.actualReadyList = [];
+ window.actualReadyBeforeAttachedList = [];
+};
+
+window.clearTestLists();
+
+window.readyBehavior = {
+ properties: {
+ prop: {
+ value: true,
+ observer: '_propChanged'
+ },
+ },
+ _propChanged: function() {
+ this.observerShadowRoot = Boolean(this.shadowRoot);
+ },
+ ready: function() {
+ this._readied = true;
+ this.readyList = window.actualReadyList.slice();
+ this.readyShadowRoot = Boolean(this.shadowRoot);
+ window.actualReadyList.push(this);
+ },
+
+ attached: function() {
+ this.attachedShadowRoot = Boolean(this.shadowRoot);
+ this.attachedTime$Keys = Object.keys(this.$);
+ this.attachedList = window.actualAttachedList.slice();
+ window.actualAttachedList.push(this);
+ if (!this._readied) {
+ window.actualReadyBeforeAttachedList.push(this);
+ }
+ }
+};
+</script>
+
+<dom-module id="x-zot">
+ <template>
+ x-zot<slot></slot>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-zot',
+ behaviors: [window.readyBehavior]
+});
+</script>
+</dom-module>
+
+<dom-module id="x-bar">
+ <template>
+ <x-zot id="zot"></x-zot>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-bar',
+ behaviors: [window.readyBehavior]
+});
+</script>
+</dom-module>
+
+<dom-module id="x-foo">
+ <template>
+ <x-bar id="bar1"></x-bar>
+ <x-bar id="bar2"></x-bar>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-foo',
+ behaviors: [window.readyBehavior]
+});
+</script>
+</dom-module>
+
+<dom-module id="x-ready">
+ <template>
+ <x-zot id="a">
+ <x-zot id="b"></x-zot>
+ <x-zot id="c">
+ <x-zot id="d"></x-zot>
+ </x-zot>
+ </x-zot>
+ <x-foo id="foo"></x-foo>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-ready',
+ properties: {
+ foo: {
+ observer: '_fooChanged'
+ }
+ },
+ behaviors: [window.readyBehavior],
+ _fooChanged: function() {}
+});
+</script>
+</dom-module>
+
+<dom-module id="x-templatized">
+ <template>
+ <template is="dom-if" if>
+ <x-ready foo="[[foo]]"></x-ready>
+ </template>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-templatized',
+ properties: {
+ foo: {
+ value: 'foo'
+ }
+ }
+});
+</script>
+</dom-module>
+
+<script type="module">
+import { flush } from '../../lib/utils/flush.js';
+
+suite('ready and attached ordering', function() {
+
+ let el;
+
+ setup(function() {
+ window.clearTestLists();
+ el = document.createElement('x-ready');
+ document.body.appendChild(el);
+ });
+
+ teardown(function() {
+ document.body.removeChild(el);
+ });
+
+ test('element dom ready before element', function() {
+ assert.includeMembers(el.readyList, [el.$.a, el.$.b, el.$.c, el.$.d, el.$.foo]);
+ var foo = el.$.foo;
+ assert.includeMembers(foo.readyList, [foo.$.bar1, foo.$.bar1.$.zot, foo.$.bar2, foo.$.bar2.$.zot]);
+ var b1 = foo.$.bar1, b2 = foo.$.bar2;
+ assert.includeMembers(b1.readyList, [b1.$.zot]);
+ assert.includeMembers(b2.readyList, [b2.$.zot]);
+ });
+
+ // test('element dom connected before element', function() {
+ // assert.includeMembers(el.attachedList, [el.$.a, el.$.b, el.$.c, el.$.d, el.$.foo]);
+ // var foo = el.$.foo;
+ // assert.includeMembers(foo.attachedList, [foo.$.bar1, foo.$.bar2]);
+ // var b1 = foo.$.bar1, b2 = foo.$.bar2;
+ // assert.includeMembers(b1.attachedList, [b1.$.zot]);
+ // assert.includeMembers(b2.attachedList, [b2.$.zot]);
+ // });
+
+ test('shadowRoot available in ready, connected, observer', function() {
+ [el, el.$.a, el.$.b, el.$.c, el.$.d, el.$.foo,
+ el.$.foo.$.bar1, el.$.foo.$.bar1.$.zot,
+ el.$.foo.$.bar2, el.$.foo.$.bar2.$.zot].forEach((e) => {
+ assert.isTrue(e.observerShadowRoot);
+ assert.isTrue(e.readyShadowRoot);
+ assert.isTrue(e.attachedShadowRoot);
+ });
+ });
+
+ test('element attached called after ready', function() {
+ assert.equal(window.actualReadyBeforeAttachedList.length, 0);
+ });
+
+ test('element has $ references at attached time', function() {
+ assert.sameMembers(el.attachedTime$Keys, ['a', 'b', 'c', 'd', 'foo']);
+ assert.sameMembers(el.$.foo.attachedTime$Keys, ['bar1', 'bar2']);
+ });
+
+});
+
+suite('templatized: ready and attached ordering', function() {
+
+ let container, el;
+
+ setup(function() {
+ window.clearTestLists();
+ container = document.createElement('x-templatized');
+ document.body.appendChild(container);
+ flush();
+ el = container.shadowRoot.querySelector('x-ready');
+ });
+
+ teardown(function() {
+ document.body.removeChild(container);
+ });
+
+ test('element dom ready before element', function() {
+ assert.includeMembers(el.readyList, [el.$.a, el.$.b, el.$.c, el.$.d, el.$.foo]);
+ var foo = el.$.foo;
+ assert.includeMembers(foo.readyList, [foo.$.bar1, foo.$.bar1.$.zot, foo.$.bar2, foo.$.bar2.$.zot]);
+ var b1 = foo.$.bar1, b2 = foo.$.bar2;
+ assert.includeMembers(b1.readyList, [b1.$.zot]);
+ assert.includeMembers(b2.readyList, [b2.$.zot]);
+ });
+
+ test('shadowRoot available in ready, connected, observer', function() {
+ [el, el.$.a, el.$.b, el.$.c, el.$.d, el.$.foo,
+ el.$.foo.$.bar1, el.$.foo.$.bar1.$.zot,
+ el.$.foo.$.bar2, el.$.foo.$.bar2.$.zot].forEach((e) => {
+ assert.isTrue(e.observerShadowRoot);
+ assert.isTrue(e.readyShadowRoot);
+ assert.isTrue(e.attachedShadowRoot);
+ });
+ });
+
+ test('element attached called after ready', function() {
+ assert.equal(window.actualReadyBeforeAttachedList.length, 0);
+ });
+
+ test('element has $ references at attached time', function() {
+ assert.sameMembers(el.attachedTime$Keys, ['a', 'b', 'c', 'd', 'foo']);
+ assert.sameMembers(el.$.foo.attachedTime$Keys, ['bar1', 'bar2']);
+ });
+
+});
+</script>
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/render-status.html b/third_party/polymer3/bower_components/polymer/test/unit/render-status.html
new file mode 100644
index 0000000..3f43129
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/render-status.html
@@ -0,0 +1,122 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+<body>
+
+<script type="module">
+import { beforeNextRender as beforeNextRender$0, afterNextRender as afterNextRender$0 } from '../../lib/utils/render-status.js';
+import { LegacyElementMixin } from '../../lib/legacy/legacy-element-mixin.js';
+class XFoo extends LegacyElementMixin(HTMLElement) {
+ ready() {
+ super.ready();
+ sinon.spy(this, 'beforeNextRender');
+ sinon.spy(this, 'stillBeforeNextRender');
+ beforeNextRender$0(this, this.beforeNextRender,
+ ['before']);
+ }
+
+ beforeNextRender() {
+ beforeNextRender$0(this, this.stillBeforeNextRender,
+ ['still-before']);
+ }
+ stillBeforeNextRender() {
+ if (this.beforeDone) {
+ this.beforeDone();
+ }
+ }
+}
+customElements.define('x-foo', XFoo);
+
+class XBar extends LegacyElementMixin(HTMLElement) {
+ ready() {
+ super.ready();
+ sinon.spy(this, 'afterNextRender');
+ sinon.spy(this, 'afterAfterNextRender');
+ afterNextRender$0(this, (a) => {
+ this.afterNextRender(a);
+ }, ['after']);
+ }
+
+ afterNextRender() {
+ afterNextRender$0(this, (a) => {
+ this.afterAfterNextRender(a);
+ }, ['after-after']);
+ }
+ afterAfterNextRender() {
+ if (this.afterDone) {
+ this.afterDone();
+ }
+ }
+
+}
+customElements.define('x-bar', XBar);
+</script>
+
+<script type="module">
+import { flush } from '../../lib/utils/render-status.js';
+
+suite('render-status', function() {
+
+ test('beforeNextRender', function(done) {
+ let el = document.createElement('x-foo');
+ document.body.appendChild(el);
+ el.beforeDone = function() {
+ assert.ok(el.beforeNextRender.withArgs('before').calledOnce);
+ assert.ok(el.stillBeforeNextRender.withArgs('still-before').calledOnce);
+ // break out of this raf so next test is not tainted.
+ requestAnimationFrame(() => { done(); });
+ };
+ });
+
+ test('afterNextRender', function(done) {
+ let el = document.createElement('x-bar');
+ let raf1 = sinon.spy();
+ let raf2 = sinon.spy();
+ requestAnimationFrame(() => {
+ raf1();
+ requestAnimationFrame(() => {
+ raf2();
+ });
+ });
+ el.afterDone = function() {
+ assert.ok(el.afterNextRender.withArgs('after').calledOnce);
+ assert.ok(el.afterNextRender.calledAfter(raf1));
+ assert.ok(el.afterAfterNextRender.withArgs('after-after').calledOnce);
+ assert.ok(el.afterAfterNextRender.calledAfter(raf2));
+ // break out of this raf so next test is not tainted.
+ requestAnimationFrame(() => { done(); });
+ };
+ document.body.appendChild(el);
+ });
+
+ test('flush', function() {
+ let el1 = document.createElement('x-foo');
+ let el2 = document.createElement('x-bar');
+ document.body.appendChild(el1);
+ document.body.appendChild(el2);
+ flush();
+ assert.ok(el1.beforeNextRender.withArgs('before').calledOnce);
+ assert.ok(el1.stillBeforeNextRender.withArgs('still-before').calledOnce);
+ assert.ok(el2.afterNextRender.withArgs('after').calledOnce);
+ assert.ok(el2.afterAfterNextRender.withArgs('after-after').calledOnce);
+ });
+
+});
+</script>
+
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/resolveurl.html b/third_party/polymer3/bower_components/polymer/test/unit/resolveurl.html
new file mode 100644
index 0000000..7a3106b
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/resolveurl.html
@@ -0,0 +1,175 @@
+<!DOCTYPE html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="UTF-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module">
+ import { setRootPath } from '../../lib/utils/settings.js';
+ setRootPath('earlyRootPath/');
+ </script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+ <script type="module" src="./sub/resolveurl-elements.js"></script>
+</head>
+<body>
+ <x-resolve></x-resolve>
+
+ <dom-module id="x-late">
+ <template>
+ <style>
+ :host {
+ background: url('foo.png');
+ }
+ </style>
+ <img id="root" src$="[[rootPath]]foo.png">
+ <img id="import" src$="[[importPath]]foo.png">
+ </template>
+ </dom-module>
+
+ <dom-module id="x-resolve">
+ </dom-module>
+
+ <script type="module">
+import './sub/resolveurl-elements.js';
+import { PolymerElement } from '../../polymer-element.js';
+class XResolve extends PolymerElement {
+ static get is() { return 'x-resolve'; }
+}
+customElements.define(XResolve.is, XResolve);
+</script>
+
+
+ <script type="module">
+import './sub/resolveurl-elements.js';
+import { PolymerElement } from '../../polymer-element.js';
+import { setRootPath } from '../../lib/utils/settings.js';
+suite('ResolveUrl', function() {
+
+ const testStylesAndAttributes = (elementName) => () => {
+ var el = document.createElement(elementName);
+ document.body.appendChild(el);
+ var resolvedUrl = /sub\/foo\.z/;
+ var styleHashUrl = /url\('#bar'\)/;
+ var styleAbsUrl = /url\('\/zot'\)/;
+ var style = el.shadowRoot.querySelector('style') || document.querySelector(`style[scope=${elementName}]`);
+ assert.match(style.textContent, resolvedUrl, 'url not relative to main document');
+ assert.match(style.textContent, styleHashUrl, 'hash url incorrectly resolved');
+ assert.match(style.textContent, styleAbsUrl, 'absolute url incorrectly resolved');
+ assert.match(el.$.div.getAttribute('style'), resolvedUrl, 'style url not relative to main document');
+ assert.match(el.$.img.src, resolvedUrl, 'src url not relative to main document');
+ assert.match(el.$.a.href, resolvedUrl, 'href url not relative to main document');
+ assert.match(el.$.import.getAttribute('url'), resolvedUrl, 'url url not relative to main document');
+ assert.match(el.$.resolveUrl.getAttribute('url'), resolvedUrl, 'url url not relative to main document');
+ assert.equal(el.$.resolveUrlHash.getAttribute('url'), '#foo', 'url url not relative to main document');
+ assert.equal(el.$.resolveUrlAbs.getAttribute('url'), '/foo', 'url url not relative to main document');
+ assert.notMatch(el.$.root.getAttribute('url'), resolvedUrl, 'url url not relative to main document');
+ assert.notMatch(el.$.rel.href, resolvedUrl, 'relative href url not relative to main document');
+ assert.match(el.$.rel.href, /\?123$/, 'relative href does not preserve query string');
+ assert.equal(el.$.action.getAttribute('action'), 'foo.z', 'action attribute relativized for incorrect element type');
+ assert.match(el.$.formAction.action, resolvedUrl, 'action attribute relativized for incorrect element type');
+ assert.equal(el.$.hash.getAttribute('href'), '#foo.z', 'hash-only url should not be resolved');
+ assert.equal(el.$.absolute.getAttribute('href'), '/foo.z', 'absolute urls should not be resolved');
+ assert.equal(el.$.protocol.getAttribute('href'), 'data:foo.z', 'urls with other protocols should not be resolved');
+ document.body.removeChild(el);
+ };
+
+ test('Urls in styles and attributes', testStylesAndAttributes('p-r'));
+
+ test('Urls in styles and attributes (hybrid)', testStylesAndAttributes('p-r-hybrid'));
+
+ test('url changes via setting importPath/rootPath on element instance', function() {
+ var el = document.createElement('p-r');
+ document.body.appendChild(el);
+ el.rootPath = 'instanceRoot/';
+ el.importPath = 'instanceImport/';
+ var matchRoot = /instanceRoot\//;
+ var matchImport = /instanceImport\//;
+ assert.match(el.$.div.getAttribute('style'), matchImport);
+ assert.match(el.$.import.getAttribute('url'), matchImport);
+ assert.match(el.$.root.getAttribute('url'), matchRoot);
+ document.body.removeChild(el);
+ });
+
+ test('rootPath set early', function() {
+ class XEarly extends PolymerElement {
+ static get is() { return 'x-late';}
+ }
+ customElements.define('x-early', XEarly);
+ var el = document.createElement('x-early');
+ document.body.appendChild(el);
+ var matchRoot = /earlyRootPath\//i;
+ assert.match(el.$.root.getAttribute('src'), matchRoot);
+ document.body.removeChild(el);
+ });
+
+ test('url changes via setting importPath/rootPath when defining element', function() {
+ setRootPath('defineRoot/');
+ class XLate extends PolymerElement {
+ static get is() { return 'x-late';}
+ static get importPath() { return 'defineImport/';}
+ }
+ customElements.define(XLate.is, XLate);
+ var el = document.createElement('x-late');
+ document.body.appendChild(el);
+ var matchRoot = /defineRoot\//i;
+ var matchImport = /defineImport\//i;
+ var style = el.shadowRoot.querySelector('style') || document.querySelector('style[scope=x-late]');
+ assert.match(style.textContent, matchImport);
+ assert.match(el.$.import.getAttribute('src'), matchImport);
+ assert.match(el.$.root.getAttribute('src'), matchRoot);
+ document.body.removeChild(el);
+ });
+
+ test('resolveUrl api', function() {
+ var el = document.createElement('p-r');
+ var expected = document.location.href.replace(/[?#].*$/, '');
+ var actual = el.resolveUrl('../resolveurl.html');
+ assert.equal(actual, expected);
+ });
+
+ test('resolveUrl api with base', function() {
+ var el = document.createElement('p-r');
+ var expected = 'http://example.com/resolveurl.html';
+ var actual = el.resolveUrl('resolveurl.html', 'http://example.com/');
+ assert.equal(actual, expected);
+ });
+
+ test('resolveUrl api, when defined in main doc', function() {
+ var el = document.querySelector('x-resolve');
+ var expected = document.location.href.replace(/[?#].*$/, '');
+ expected = expected.split('/');
+ expected.pop();
+ expected = expected.join('/') + '/foo/bar.png';
+ var actual = el.resolveUrl('foo/../foo/bar.png');
+ assert.equal(actual, expected);
+ });
+
+ test('resolveUrl api with assetpath', function() {
+ var el = document.createElement('p-r-ap');
+ // Manually calculate expected URL, to avoid dependence on
+ // URL object for this test for IE! Otherwise, would do this:
+ // var importPath = document.querySelector('#elements').href;
+ // var expected = new URL('../../assets/Beaker2.jpg', importPath);
+ var expected = document.location.href.replace(/[?#].*$/, '');
+ expected = expected.split('/');
+ expected.pop();
+ expected.pop();
+ expected = expected.join('/');
+ expected = expected + '/assets/Beaker2.jpg';
+ var actual = el.resolveUrl('Beaker2.jpg');
+ assert.equal(actual, expected);
+ });
+});
+</script>
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/shady-content.html b/third_party/polymer3/bower_components/polymer/test/unit/shady-content.html
new file mode 100644
index 0000000..d5a0e36
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/shady-content.html
@@ -0,0 +1,1476 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script>
+ if (!window.customElements) {
+ window.customElements = {};
+ }
+ customElements.forcePolyfill = true;
+ window.ShadyDOM = {
+ force: true
+ };
+ </script>
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+</head>
+<body>
+
+<dom-module id="x-dist">
+ <template>
+ x-dist
+ <div id="distWrapper"><slot id="content"></slot></div>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-dist'});
+</script>
+</dom-module>
+
+<dom-module id="x-dist-simple">
+ <template>
+ <slot id="content"></slot>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-dist-simple'});
+</script>
+</dom-module>
+
+<dom-module id="x-dist-star">
+ <template><slot></slot></template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-dist-star'});
+</script>
+</dom-module>
+
+<dom-module id="x-dist-inside-deep-tree">
+ <template>
+ x-dist-inside-deep-tree
+ <div></div>
+ <div>
+ <div>
+ <div>
+ <div id="distWrapper"><slot id="content"></slot></div>
+ </div>
+ </div>
+ </div>
+ <div></div>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-dist-inside-deep-tree'});
+</script>
+</dom-module>
+
+<dom-module id="x-no-dist">
+ <template><span id="static">x-no-dist</span></template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-no-dist'});
+</script>
+</dom-module>
+
+<dom-module id="x-compose-dist">
+ <template>
+ <x-dist id="dist"></x-dist>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-compose-dist'});
+</script>
+</dom-module>
+
+<dom-module id="x-compose-no-dist">
+ <template>
+ <x-no-dist id="noDist"></x-no-dist>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-compose-no-dist'});
+</script>
+</dom-module>
+
+<dom-module id="x-dynamic-content">
+ <template>
+ <div>
+ <div>
+ <div>
+ <div id="container">
+ <template is="dom-if" id="domif">
+ <slot name="insert" id="dynamicContent"></slot>
+ </template>
+ </div>
+ </div>
+ </div>
+ </div>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-dynamic-content'});
+</script>
+</dom-module>
+
+<dom-module id="x-dynamic-content-wrapped">
+ <template>
+ <div>
+ <template is="dom-if" id="domif">
+ <div id="container">
+ <slot name="insert"></slot>
+ </div>
+ </template>
+ </div>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-dynamic-content-wrapped'});
+</script>
+</dom-module>
+
+<dom-module id="x-dynamic-content-redist">
+ <template>
+ <x-dynamic-content id="redistContainer">
+ <template is="dom-if" id="redistDomif">
+ <slot name="insert" id="redistContent"></slot>
+ </template>
+ </x-dynamic-content>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-dynamic-content-redist'});
+</script>
+</dom-module>
+
+<dom-module id="x-dynamic-content-redist-element">
+ <template>
+ <template is="dom-if" id="redistDomif">
+ <x-dist id="redistContainer">
+ <slot name="insert" id="redistContent"></slot>
+ </x-dist>
+ </template>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-dynamic-content-redist-element'});
+</script>
+</dom-module>
+
+<dom-module id="x-dynamic-content-and-dynamic-no-content">
+ <template>
+ <div id="container">
+ <template is="dom-if" id="staticIf" restamp>
+ <div id="static">static</div>
+ </template>
+ <template is="dom-if" id="contentIf" restamp>
+ <slot name="one"></slot>
+ </template>
+ </div>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-dynamic-content-and-dynamic-no-content'});
+</script>
+</dom-module>
+
+<dom-module id="x-multi-dist">
+ <template>
+ <x-dist id="dist1"><slot id="content1"></slot></x-dist>
+ <x-dist id="dist2"><slot id="content2"></slot></x-dist>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-multi-dist'});
+</script>
+</dom-module>
+
+<dom-module id="x-lazy-no-dist">
+ <template>
+ Lazy no dist!
+ </template>
+</dom-module>
+
+<dom-module id="x-compose-lazy-no-dist">
+ <template>
+ <x-lazy-no-dist id="lazy">
+ <slot></slot>
+ </x-lazy-no-dist>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-compose-lazy-no-dist'});
+</script>
+</dom-module>
+
+<dom-module id="x-toggle-if">
+ <template>
+ <div id="container1">
+ <template id="foo" is="dom-if" if="{{foo}}" restamp>
+ <span>foo</span>
+ <slot id="1.1" name="one"></slot>
+ <slot id="1.2" name="two"></slot>
+ </template>
+ </div>
+ <div id="container2">
+ <template id="notFoo" is="dom-if" if="{{!foo}}" restamp>
+ <span>Not foo</span>
+ <slot id="2.1" name="one"></slot>
+ <slot id="2.2" name="two"></slot>
+ </template>
+ </div>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-toggle-if',
+ properties: {
+ foo: {
+ type: Boolean,
+ value: true
+ }
+ }
+});
+</script>
+</dom-module>
+
+<dom-module id="x-repeat">
+ <template>
+ <x-dist-inside-deep-tree id="dist">
+ <template is="dom-repeat" items="{{items}}"><div>{{item}}</div></template>
+ </x-dist-inside-deep-tree>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-repeat',
+ properties: {
+ items: {
+ type: Array,
+ value: ["ITEM1", "ITEM2", "ITEM3"]
+ }
+ }
+});
+</script>
+</dom-module>
+
+<dom-module id="x-repeat2">
+ <template>
+ <x-dist-star id="dist">
+ <template is="dom-repeat" items="{{items}}">
+ <div>{{item}}</div>
+ </template>
+ </x-dist-star>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-repeat2',
+ properties: {
+ items: {
+ type: Array,
+ value: ["ITEM1", "ITEM2", "ITEM3"]
+ }
+ }
+});
+</script>
+</dom-module>
+
+<x-repeat2 id="repeat2"></x-repeat2>
+
+<x-compose-lazy-no-dist><span>Child</span></x-compose-lazy-no-dist>
+
+<script>
+ if (!window.ShadyDOM) {
+ ShadyDOM = {
+ patch: function() {},
+ flush: function() {}
+ };
+ }
+</script>
+<script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+import { flush as flush$0 } from '../../lib/utils/flush.js';
+function createPatchedDocumentFragment() {
+ var frag = document.createDocumentFragment();
+ return frag;
+}
+
+suite('appendChild & removeChild of <slot>', function() {
+
+ test('append div to distributing element', function() {
+ var dist = document.createElement('x-dist');
+ document.body.appendChild(dist);
+ // Distribute div
+ var div = document.createElement('div');
+ dist.appendChild(div);
+ ShadyDOM.flush();
+ // Append to distributed div
+ var div2 = document.createElement('div');
+ div.appendChild(div2);
+ ShadyDOM.flush();
+ // Remove
+ dist.removeChild(div);
+ ShadyDOM.flush();
+ document.body.removeChild(dist);
+ });
+
+ test('append div to non-distributing element', function() {
+ var noDist = document.createElement('x-no-dist');
+ document.body.appendChild(noDist);
+ // Distribute div
+ var div = document.createElement('div');
+ noDist.appendChild(div);
+ ShadyDOM.flush();
+ // Append to distributed div
+ var div2 = document.createElement('div');
+ div.appendChild(div2);
+ ShadyDOM.flush();
+ // Remove
+ noDist.removeChild(div);
+ ShadyDOM.flush();
+ document.body.removeChild(noDist);
+ });
+
+ test('append div to shady root of distributing element', function() {
+ var dist = document.createElement('x-dist');
+ document.body.appendChild(dist);
+ // Append div to root
+ var div = document.createElement('div');
+ dist.root.appendChild(div);
+ ShadyDOM.flush();
+ // Append to div in root
+ var div2 = document.createElement('div');
+ div.appendChild(div2);
+ ShadyDOM.flush();
+ // Remove
+ dist.root.removeChild(div);
+ ShadyDOM.flush();
+ document.body.removeChild(dist);
+ });
+
+ test('append div to shady root of non-distributing element', function() {
+ var noDist = document.createElement('x-no-dist');
+ document.body.appendChild(noDist);
+ // Append div to root
+ var div = document.createElement('div');
+ noDist.root.appendChild(div);
+ ShadyDOM.flush();
+ // Append to div in root
+ var div2 = document.createElement('div');
+ div.appendChild(div2);
+ ShadyDOM.flush();
+ // Remove
+ noDist.root.removeChild(div);
+ ShadyDOM.flush();
+ document.body.removeChild(noDist);
+ });
+
+ test('append div to distributing element in root', function() {
+ var compose = document.createElement('x-compose-dist');
+ document.body.appendChild(compose);
+ // Distribute div
+ var div = document.createElement('div');
+ compose.$.dist.appendChild(div);
+ ShadyDOM.flush();
+ // Append to distributed div
+ var div2 = document.createElement('div');
+ div.appendChild(div2);
+ ShadyDOM.flush();
+ // Remove
+ compose.$.dist.removeChild(div);
+ ShadyDOM.flush();
+ document.body.removeChild(compose);
+ });
+
+ test('append div to non-distributing element in root', function() {
+ var compose = document.createElement('x-compose-no-dist');
+ document.body.appendChild(compose);
+ // Append div to root
+ var div = document.createElement('div');
+ compose.$.noDist.appendChild(div);
+ ShadyDOM.flush();
+ // Append to div in root
+ var div2 = document.createElement('div');
+ div.appendChild(div2);
+ ShadyDOM.flush();
+ // Remove
+ compose.$.noDist.removeChild(div);
+ ShadyDOM.flush();
+ document.body.removeChild(compose);
+ });
+
+ test('append slot to shady root of element (div first)', function() {
+ var noDist = document.createElement('x-no-dist');
+ document.body.appendChild(noDist);
+ // Append div to light dom
+ var div = document.createElement('div');
+ div.name = 'insert';
+ noDist.appendChild(div);
+ ShadyDOM.flush();
+ // Append slot to shady root
+ var slot = document.createElement('slot');
+ slot.setAttribute('name', 'insert');
+ noDist.root.appendChild(slot);
+ ShadyDOM.flush();
+ // Remove
+ noDist.root.removeChild(slot);
+ ShadyDOM.flush();
+ document.body.removeChild(noDist);
+ });
+
+ test('append slot to shady root of element (slot first)', function() {
+ var noDist = document.createElement('x-no-dist');
+ document.body.appendChild(noDist);
+ // Append slot to shady root
+ var slot = document.createElement('slot');
+ slot.setAttribute('name', 'insert');
+ noDist.root.appendChild(slot);
+ // Append div to light dom
+ var div = document.createElement('div');
+ div.name = 'insert';
+ noDist.appendChild(div);
+ ShadyDOM.flush();
+ // Remove
+ noDist.root.removeChild(slot);
+ ShadyDOM.flush();
+ document.body.removeChild(noDist);
+ });
+
+ test('append slot to div in shady root of element (div first)', function() {
+ var noDist = document.createElement('x-no-dist');
+ document.body.appendChild(noDist);
+ // Append div to light dom
+ var div = document.createElement('div');
+ div.name = 'insert';
+ noDist.appendChild(div);
+ ShadyDOM.flush();
+ // Append slot to shady root
+ var slot = document.createElement('slot');
+ slot.setAttribute('name', 'insert');
+ noDist.$.static.appendChild(slot);
+ ShadyDOM.flush();
+ // Remove
+ noDist.$.static.removeChild(slot);
+ ShadyDOM.flush();
+ document.body.removeChild(noDist);
+ });
+
+ test('append slot to div in shady root of element (slot first)', function() {
+ var noDist = document.createElement('x-no-dist');
+ document.body.appendChild(noDist);
+ // Append slot to shady root
+ var slot = document.createElement('slot');
+ slot.setAttribute('name', 'insert');
+ noDist.$.static.appendChild(slot);
+ // Append div to light dom
+ var div = document.createElement('div');
+ div.name = 'insert';
+ noDist.appendChild(div);
+ ShadyDOM.flush();
+ // Remove
+ noDist.$.static.removeChild(slot);
+ ShadyDOM.flush();
+ document.body.removeChild(noDist);
+ });
+
+ test('append slot in fragment to shady root of element (div first)', function() {
+ var noDist = document.createElement('x-no-dist');
+ document.body.appendChild(noDist);
+ // Append div to light dom
+ var div = document.createElement('div');
+ div.name = 'insert';
+ noDist.appendChild(div);
+ ShadyDOM.flush();
+ // Append slot to shady root
+ var frag = document.createDocumentFragment();
+ var slot = document.createElement('slot');
+ slot.setAttribute('name', 'insert');
+ frag.appendChild(slot);
+ noDist.root.appendChild(frag);
+ ShadyDOM.flush();
+ // Remove
+ noDist.root.removeChild(slot);
+ ShadyDOM.flush();
+ document.body.removeChild(noDist);
+ });
+
+ test('append slot in fragment to shady root of element (slot first)', function() {
+ var noDist = document.createElement('x-no-dist');
+ document.body.appendChild(noDist);
+ // Append slot to shady root
+ var frag = document.createDocumentFragment();
+ var slot = document.createElement('slot');
+ slot.setAttribute('name', 'insert');
+ frag.appendChild(slot);
+ noDist.root.appendChild(frag);
+ // Append div to light dom
+ var div = document.createElement('div');
+ div.name = 'insert';
+ noDist.appendChild(div);
+ ShadyDOM.flush();
+
+ // Remove
+ noDist.root.removeChild(slot);
+ ShadyDOM.flush();
+
+ document.body.removeChild(noDist);
+ });
+
+ test('append wrapped slot to shady root of element (div first)', function() {
+ var noDist = document.createElement('x-no-dist');
+ document.body.appendChild(noDist);
+ // Append div to light dom
+ var div = document.createElement('div');
+ div.name = 'insert';
+ noDist.appendChild(div);
+ ShadyDOM.flush();
+ // Append slot to shady root
+ var frag = document.createDocumentFragment();
+ var wrapper = document.createElement('div');
+ var slot = document.createElement('slot');
+ slot.setAttribute('name', 'insert');
+ wrapper.appendChild(slot);
+ frag.appendChild(wrapper);
+ noDist.root.appendChild(frag);
+ ShadyDOM.flush();
+
+ // Remove
+ noDist.root.removeChild(wrapper);
+ ShadyDOM.flush();
+
+ document.body.removeChild(noDist);
+ });
+
+ test('append wrapped slot to shady root of element (slot first)', function() {
+ var noDist = document.createElement('x-no-dist');
+ document.body.appendChild(noDist);
+ // Append slot to shady root
+ var frag = document.createDocumentFragment();
+ var wrapper = document.createElement('div');
+ var slot = document.createElement('slot');
+ slot.setAttribute('name', 'insert');
+ wrapper.appendChild(slot);
+ frag.appendChild(wrapper);
+ noDist.root.appendChild(frag);
+ // Append div to light dom
+ var div = document.createElement('div');
+ div.name = 'insert';
+ noDist.appendChild(div);
+ ShadyDOM.flush();
+
+ // Remove
+ noDist.root.removeChild(wrapper);
+ ShadyDOM.flush();
+
+ document.body.removeChild(noDist);
+ });
+
+ test('append wrapped slot to div in shady root of element (div first)', function() {
+ var noDist = document.createElement('x-no-dist');
+ document.body.appendChild(noDist);
+ // Append div to light dom
+ var div = document.createElement('div');
+ div.name = 'insert';
+ noDist.appendChild(div);
+ ShadyDOM.flush();
+ // Append slot to shady root
+ var frag = document.createDocumentFragment();
+ var wrapper = document.createElement('div');
+ var slot = document.createElement('slot');
+ slot.setAttribute('name', 'insert');
+ wrapper.appendChild(slot);
+ frag.appendChild(wrapper);
+ noDist.$.static.appendChild(frag);
+ ShadyDOM.flush();
+
+ // Remove
+ noDist.$.static.removeChild(wrapper);
+ ShadyDOM.flush();
+
+ document.body.removeChild(noDist);
+ });
+
+ test('append wrapped slot to div in shady root of element (slot first)', function() {
+ var noDist = document.createElement('x-no-dist');
+ document.body.appendChild(noDist);
+ // Append slot to shady root
+ var frag = document.createDocumentFragment();
+ var wrapper = document.createElement('div');
+ var slot = document.createElement('slot');
+ slot.setAttribute('name', 'insert');
+ wrapper.appendChild(slot);
+ frag.appendChild(wrapper);
+ noDist.$.static.appendChild(frag);
+ // Append div to light dom
+ var div = document.createElement('div');
+ div.name = 'insert';
+ noDist.appendChild(div);
+ ShadyDOM.flush();
+
+ // Remove
+ noDist.$.static.removeChild(wrapper);
+ ShadyDOM.flush();
+
+ document.body.removeChild(noDist);
+ });
+
+ test('append slot to non-distributing element in shady root of composed element (div first)', function() {
+ var compose = document.createElement('x-compose-no-dist');
+ document.body.appendChild(compose);
+ // Append slot to light DOM of non-distributing element
+ var div = document.createElement('div');
+ div.name = 'insert';
+ compose.appendChild(div);
+ ShadyDOM.flush();
+ // Append slot to non-distributing element
+ var slot = document.createElement('slot');
+ slot.setAttribute('name', 'insert');
+ compose.$.noDist.appendChild(slot);
+ ShadyDOM.flush();
+
+ // Remove
+ compose.$.noDist.removeChild(slot);
+ ShadyDOM.flush();
+
+ document.body.removeChild(compose);
+ });
+
+ test('append slot to non-distributing element in shady root of composed element (slot first)', function() {
+ var compose = document.createElement('x-compose-no-dist');
+ document.body.appendChild(compose);
+ // Append slot to light DOM of non-distributing element
+ var slot = document.createElement('slot');
+ slot.setAttribute('name', 'insert');
+ compose.$.noDist.appendChild(slot);
+ // Append div to light dom
+ var div = document.createElement('div');
+ div.name = 'insert';
+ compose.appendChild(div);
+ ShadyDOM.flush();
+
+ // Remove
+ compose.$.noDist.removeChild(slot);
+ ShadyDOM.flush();
+
+ document.body.removeChild(compose);
+ });
+
+ test('append wrapped slot to non-distributing element in shady root of composed element (div first)', function() {
+ var compose = document.createElement('x-compose-no-dist');
+ document.body.appendChild(compose);
+ // Append div to light dom
+ var div = document.createElement('div');
+ div.name = 'insert';
+ compose.appendChild(div);
+ ShadyDOM.flush();
+ // Append slot to shady root
+ var frag = document.createDocumentFragment();
+ var wrapper = document.createElement('div');
+ var slot = document.createElement('slot');
+ slot.setAttribute('name', 'insert');
+ wrapper.appendChild(slot);
+ frag.appendChild(wrapper);
+ compose.$.noDist.appendChild(frag);
+ ShadyDOM.flush();
+
+ // Remove
+ compose.$.noDist.removeChild(wrapper);
+ ShadyDOM.flush();
+
+ document.body.removeChild(compose);
+ });
+
+ test('append wrapped slot to non-distributing element in shady root of composed element (slot first)', function() {
+ var compose = document.createElement('x-compose-no-dist');
+ document.body.appendChild(compose);
+ // Append slot to shady root
+ var frag = document.createDocumentFragment();
+ var wrapper = document.createElement('div');
+ var slot = document.createElement('slot');
+ slot.setAttribute('name', 'insert');
+ wrapper.appendChild(slot);
+ frag.appendChild(wrapper);
+ compose.$.noDist.appendChild(frag);
+ // Append div to light dom
+ var div = document.createElement('div');
+ div.name = 'insert';
+ compose.appendChild(div);
+ ShadyDOM.flush();
+
+ // Remove
+ compose.$.noDist.removeChild(wrapper);
+ ShadyDOM.flush();
+
+ document.body.removeChild(compose);
+ });
+
+ test('append slot to distributing element in shady root of composed element (div first)', function() {
+ var compose = document.createElement('x-compose-dist');
+ document.body.appendChild(compose);
+ // Append slot to light DOM of non-distributing element
+ var div = document.createElement('div');
+ div.name = 'insert';
+ compose.appendChild(div);
+ ShadyDOM.flush();
+ // Append slot to non-distributing element
+ var slot = document.createElement('slot');
+ slot.setAttribute('name', 'insert');
+ compose.$.dist.appendChild(slot);
+ ShadyDOM.flush();
+
+ // Remove
+ compose.$.dist.removeChild(slot);
+ ShadyDOM.flush();
+
+ document.body.removeChild(compose);
+ });
+
+ test('append slot to distributing element in shady root of composed element (slot first)', function() {
+ var compose = document.createElement('x-compose-dist');
+ document.body.appendChild(compose);
+ // Append slot to non-distributing element
+ var slot = document.createElement('slot');
+ slot.setAttribute('name', 'insert');
+ compose.$.dist.appendChild(slot);
+ // Append slot to light DOM of non-distributing element
+ var div = document.createElement('div');
+ div.name = 'insert';
+ compose.appendChild(div);
+ ShadyDOM.flush();
+
+ // Remove
+ compose.$.dist.removeChild(slot);
+ ShadyDOM.flush();
+
+ document.body.removeChild(compose);
+ });
+
+ test('append wrapped slot to distributing element in shady root of composed element (div first)', function() {
+ var compose = document.createElement('x-compose-dist');
+ document.body.appendChild(compose);
+ // Append div to light dom
+ var div = document.createElement('div');
+ div.name = 'insert';
+ compose.appendChild(div);
+ ShadyDOM.flush();
+ // Append slot to shady root
+ var frag = document.createDocumentFragment();
+ var wrapper = document.createElement('div');
+ var slot = document.createElement('slot');
+ slot.setAttribute('name', 'insert');
+ wrapper.appendChild(slot);
+ frag.appendChild(wrapper);
+ compose.$.dist.appendChild(frag);
+ ShadyDOM.flush();
+
+ // Remove
+ compose.$.dist.removeChild(wrapper);
+ ShadyDOM.flush();
+
+ document.body.removeChild(compose);
+ });
+
+ test('append wrapped slot to distributing element in shady root of composed element (slot first)', function() {
+ var compose = document.createElement('x-compose-dist');
+ document.body.appendChild(compose);
+ // Append slot to shady root
+ var frag = document.createDocumentFragment();
+ var wrapper = document.createElement('div');
+ var slot = document.createElement('slot');
+ slot.setAttribute('name', 'insert');
+ wrapper.appendChild(slot);
+ frag.appendChild(wrapper);
+ compose.$.dist.appendChild(frag);
+ // Append div to light dom
+ var div = document.createElement('div');
+ div.name = 'insert';
+ compose.appendChild(div);
+ ShadyDOM.flush();
+
+ // Remove
+ compose.$.dist.removeChild(wrapper);
+ ShadyDOM.flush();
+
+ document.body.removeChild(compose);
+ });
+
+ test('append slot to initially un-upgraded element', function() {
+ var lazyContainer = document.querySelector('x-compose-lazy-no-dist');
+ var child = lazyContainer.firstElementChild;
+ Polymer({is: 'x-lazy-no-dist'});
+ var slot = document.createElement('slot');
+ lazyContainer.$.lazy.root.appendChild(slot);
+ ShadyDOM.flush();
+ assert.equal(slot.assignedNodes({flatten: true})[1], child);
+
+ });
+
+ test('composed children distributed', function() {
+ var host = document.createElement('x-dist');
+ document.body.appendChild(host);
+ var s0 = document.createElement('span');
+ var frag = document.createDocumentFragment();
+ var s1 = document.createElement('span');
+ var s2 = document.createElement('span');
+ var s3 = document.createElement('span');
+ frag.appendChild(s1);
+ frag.appendChild(s2);
+ frag.appendChild(s3);
+ host.appendChild(s0);
+ host.insertBefore(frag, s0);
+ ShadyDOM.flush();
+
+ host.removeChild(s1);
+ host.removeChild(s2);
+ host.removeChild(s3);
+ ShadyDOM.flush();
+
+ });
+
+ test('composed children added but not distributed', function() {
+ var host = document.createElement('x-dist');
+ document.body.appendChild(host);
+ var s0 = document.createElement('span');
+ var frag = document.createDocumentFragment();
+ var s1 = document.createElement('span');
+ var s2 = document.createElement('span');
+ var s3 = document.createElement('span');
+ frag.appendChild(s1);
+ frag.appendChild(s2);
+ frag.appendChild(s3);
+ host.$.distWrapper.appendChild(s0);
+ host.$.distWrapper.insertBefore(frag, s0);
+ ShadyDOM.flush();
+
+ host.$.distWrapper.removeChild(s1);
+ host.$.distWrapper.removeChild(s2);
+ host.$.distWrapper.removeChild(s3);
+ ShadyDOM.flush();
+
+ });
+
+ test('moving children between distributing hosts', function() {
+ var h1 = document.createElement('x-dist');
+ var h2 = document.createElement('x-dist');
+ document.body.appendChild(h1);
+ document.body.appendChild(h2);
+ ShadyDOM.flush();
+ var d = document.createElement('div');
+ h1.appendChild(d);
+ ShadyDOM.flush();
+ assert.equal(h1.childNodes.length, 1);
+ assert.equal(h1.firstElementChild, d);
+ assert.deepEqual(h1.$.content.assignedNodes({flatten: true}), [d]);
+ assert.equal(h2.childNodes.length, 0);
+ assert.deepEqual(h2.$.content.assignedNodes({flatten: true}).length, 0);
+ h2.appendChild(d);
+ ShadyDOM.flush();
+ assert.equal(h2.childNodes.length, 1);
+ assert.equal(h2.firstElementChild, d);
+ assert.deepEqual(h2.$.content.assignedNodes({flatten: true}), [d]);
+ assert.equal(h1.childNodes.length, 0);
+ assert.deepEqual(h1.$.content.assignedNodes({flatten: true}).length, 0);
+ h1.appendChild(d);
+ ShadyDOM.flush();
+ assert.equal(h1.childNodes.length, 1);
+ assert.equal(h1.firstElementChild, d);
+ assert.deepEqual(h1.$.content.assignedNodes({flatten: true}), [d]);
+ assert.equal(h2.childNodes.length, 0);
+ assert.deepEqual(h2.$.content.assignedNodes({flatten: true}).length, 0);
+ h2.appendChild(d);
+ ShadyDOM.flush();
+ assert.equal(h2.childNodes.length, 1);
+ assert.equal(h2.firstElementChild, d);
+ assert.deepEqual(h2.$.content.assignedNodes({flatten: true}), [d]);
+ assert.equal(h1.childNodes.length, 0);
+ assert.deepEqual(h1.$.content.assignedNodes({flatten: true}).length, 0);
+ document.body.removeChild(h1);
+ document.body.removeChild(h2);
+ });
+
+ test('moving children between distributing hosts (parsed child)', function() {
+ var div = document.createElement('div');
+ div.innerHTML = '<x-dist><div></div></x-dist>';
+ var h1 = div.firstChild;
+ var h2 = document.createElement('x-dist');
+ document.body.appendChild(div);
+ document.body.appendChild(h2);
+ ShadyDOM.flush();
+ var d = h1.firstElementChild;
+ assert.equal(d.localName, 'div');
+ assert.equal(h1.childNodes.length, 1);
+ assert.equal(h1.firstElementChild, d);
+ assert.deepEqual(h1.$.content.assignedNodes({flatten: true}), [d]);
+ assert.equal(h2.childNodes.length, 0);
+ assert.deepEqual(h2.$.content.assignedNodes({flatten: true}).length, 0);
+ h2.appendChild(d);
+ ShadyDOM.flush();
+ assert.equal(h2.childNodes.length, 1);
+ assert.equal(h2.firstElementChild, d);
+ assert.deepEqual(h2.$.content.assignedNodes({flatten: true}), [d]);
+ assert.equal(h1.childNodes.length, 0);
+ assert.deepEqual(h1.$.content.assignedNodes({flatten: true}).length, 0);
+ h1.appendChild(d);
+ ShadyDOM.flush();
+ assert.equal(h1.childNodes.length, 1);
+ assert.equal(h1.firstElementChild, d);
+ assert.deepEqual(h1.$.content.assignedNodes({flatten: true}), [d]);
+ assert.equal(h2.childNodes.length, 0);
+ assert.deepEqual(h2.$.content.assignedNodes({flatten: true}).length, 0);
+ h2.appendChild(d);
+ ShadyDOM.flush();
+ assert.equal(h2.childNodes.length, 1);
+ assert.equal(h2.firstElementChild, d);
+ assert.deepEqual(h2.$.content.assignedNodes({flatten: true}), [d]);
+ assert.equal(h1.childNodes.length, 0);
+ assert.deepEqual(h1.$.content.assignedNodes({flatten: true}).length, 0);
+ document.body.removeChild(div);
+ document.body.removeChild(h2);
+ });
+
+ test('moving children between distributing host and fragment', function() {
+ var h1 = document.createElement('x-dist');
+ var h2 = createPatchedDocumentFragment();
+ document.body.appendChild(h1);
+ ShadyDOM.flush();
+ var d = document.createElement('div');
+ h1.appendChild(d);
+ ShadyDOM.flush();
+ assert.equal(h1.childNodes.length, 1);
+ assert.equal(h1.firstElementChild, d);
+ assert.deepEqual(h1.$.content.assignedNodes({flatten: true}), [d]);
+ assert.equal(h2.childNodes.length, 0);
+ h2.appendChild(d);
+ ShadyDOM.flush();
+ assert.equal(h2.childNodes.length, 1);
+ assert.equal(h2.firstChild, d);
+ assert.equal(h1.childNodes.length, 0);
+ assert.deepEqual(h1.$.content.assignedNodes({flatten: true}).length, 0);
+ h1.appendChild(d);
+ ShadyDOM.flush();
+ assert.equal(h1.childNodes.length, 1);
+ assert.equal(h1.firstElementChild, d);
+ assert.deepEqual(h1.$.content.assignedNodes({flatten: true}), [d]);
+ assert.equal(h2.childNodes.length, 0);
+ h2.appendChild(d);
+ ShadyDOM.flush();
+ assert.equal(h2.childNodes.length, 1);
+ assert.equal(h2.firstChild, d);
+ assert.equal(h1.childNodes.length, 0);
+ assert.deepEqual(h1.$.content.assignedNodes({flatten: true}).length, 0);
+ document.body.removeChild(h1);
+ });
+
+ test('moving children between distributing host and fragment (parsed child)', function() {
+ var div = document.createElement('div');
+ div.innerHTML = '<x-dist><div></div></x-dist>';
+ var h1 = div.firstChild;
+ var h2 = createPatchedDocumentFragment();
+ document.body.appendChild(h1);
+ ShadyDOM.flush();
+ var d = h1.firstElementChild;
+ assert.equal(d.localName, 'div');
+ assert.equal(h1.childNodes.length, 1);
+ assert.equal(h1.firstElementChild, d);
+ assert.deepEqual(h1.$.content.assignedNodes({flatten: true}), [d]);
+ assert.equal(h2.childNodes.length, 0);
+ h2.appendChild(d);
+ ShadyDOM.flush();
+ assert.equal(h2.childNodes.length, 1);
+ assert.equal(h2.firstChild, d);
+ assert.equal(h1.childNodes.length, 0);
+ assert.deepEqual(h1.$.content.assignedNodes({flatten: true}).length, 0);
+ h1.appendChild(d);
+ ShadyDOM.flush();
+ assert.equal(h1.childNodes.length, 1);
+ assert.equal(h1.firstElementChild, d);
+ assert.deepEqual(h1.$.content.assignedNodes({flatten: true}), [d]);
+ assert.equal(h2.childNodes.length, 0);
+ h2.appendChild(d);
+ ShadyDOM.flush();
+ assert.equal(h2.childNodes.length, 1);
+ assert.equal(h2.firstChild, d);
+ assert.equal(h1.childNodes.length, 0);
+ assert.deepEqual(h1.$.content.assignedNodes({flatten: true}).length, 0);
+ document.body.removeChild(h1);
+ });
+
+ test('moving children between distributing hosts with deep insertion points', function() {
+ var h1 = document.createElement('x-dist-inside-deep-tree');
+ var h2 = document.createElement('x-dist-inside-deep-tree');
+ document.body.appendChild(h1);
+ document.body.appendChild(h2);
+ ShadyDOM.flush();
+ var d = document.createElement('div');
+ h1.appendChild(d);
+ ShadyDOM.flush();
+ assert.equal(h1.childNodes.length, 1);
+ assert.equal(h1.firstElementChild, d);
+ assert.deepEqual(h1.$.content.assignedNodes({flatten: true}), [d]);
+ assert.equal(h2.childNodes.length, 0);
+ assert.deepEqual(h2.$.content.assignedNodes({flatten: true}).length, 0);
+ h2.appendChild(d);
+ ShadyDOM.flush();
+ assert.equal(h2.childNodes.length, 1);
+ assert.equal(h2.firstElementChild, d);
+ assert.deepEqual(h2.$.content.assignedNodes({flatten: true}), [d]);
+ assert.equal(h1.childNodes.length, 0);
+ assert.deepEqual(h1.$.content.assignedNodes({flatten: true}).length, 0);
+ h1.appendChild(d);
+ ShadyDOM.flush();
+ assert.equal(h1.childNodes.length, 1);
+ assert.equal(h1.firstElementChild, d);
+ assert.deepEqual(h1.$.content.assignedNodes({flatten: true}), [d]);
+ assert.equal(h2.childNodes.length, 0);
+ assert.deepEqual(h2.$.content.assignedNodes({flatten: true}).length, 0);
+ h2.appendChild(d);
+ ShadyDOM.flush();
+ assert.equal(h2.childNodes.length, 1);
+ assert.equal(h2.firstElementChild, d);
+ assert.deepEqual(h2.$.content.assignedNodes({flatten: true}), [d]);
+ assert.equal(h1.childNodes.length, 0);
+ assert.deepEqual(h1.$.content.assignedNodes({flatten: true}).length, 0);
+ document.body.removeChild(h1);
+ document.body.removeChild(h2);
+ });
+
+ test('moving children between distributing hosts with deep insertion points (parsed child)', function() {
+ var div = document.createElement('div');
+ div.innerHTML = '<x-dist-inside-deep-tree><div></div></x-dist-inside-deep-tree>';
+ var h1 = div.firstChild;
+ var h2 = document.createElement('x-dist-inside-deep-tree');
+ document.body.appendChild(div);
+ document.body.appendChild(h2);
+ ShadyDOM.flush();
+ var d = h1.firstElementChild;
+ assert.equal(d.localName, 'div');
+ assert.equal(h1.childNodes.length, 1);
+ assert.equal(h1.firstElementChild, d);
+ assert.deepEqual(h1.$.content.assignedNodes({flatten: true}), [d]);
+ assert.equal(h2.childNodes.length, 0);
+ assert.deepEqual(h2.$.content.assignedNodes({flatten: true}).length, 0);
+ h2.appendChild(d);
+ ShadyDOM.flush();
+ assert.equal(h2.childNodes.length, 1);
+ assert.equal(h2.firstElementChild, d);
+ assert.deepEqual(h2.$.content.assignedNodes({flatten: true}), [d]);
+ assert.equal(h1.childNodes.length, 0);
+ assert.deepEqual(h1.$.content.assignedNodes({flatten: true}).length, 0);
+ h1.appendChild(d);
+ ShadyDOM.flush();
+ assert.equal(h1.childNodes.length, 1);
+ assert.equal(h1.firstElementChild, d);
+ assert.deepEqual(h1.$.content.assignedNodes({flatten: true}), [d]);
+ assert.equal(h2.childNodes.length, 0);
+ assert.deepEqual(h2.$.content.assignedNodes({flatten: true}).length, 0);
+ h2.appendChild(d);
+ ShadyDOM.flush();
+ assert.equal(h2.childNodes.length, 1);
+ assert.equal(h2.firstElementChild, d);
+ assert.deepEqual(h2.$.content.assignedNodes({flatten: true}), [d]);
+ assert.equal(h1.childNodes.length, 0);
+ assert.deepEqual(h1.$.content.assignedNodes({flatten: true}).length, 0);
+ document.body.removeChild(div);
+ document.body.removeChild(h2);
+ });
+
+ test('moving children between distributing host with deep insertion and fragment', function() {
+ var h1 = document.createElement('x-dist-inside-deep-tree');
+ var h2 = createPatchedDocumentFragment();
+ document.body.appendChild(h1);
+ ShadyDOM.flush();
+ var d = document.createElement('div');
+ h1.appendChild(d);
+ ShadyDOM.flush();
+ assert.equal(h1.childNodes.length, 1);
+ assert.equal(h1.firstElementChild, d);
+ assert.deepEqual(h1.$.content.assignedNodes({flatten: true}), [d]);
+ assert.equal(h2.childNodes.length, 0);
+ h2.appendChild(d);
+ ShadyDOM.flush();
+ assert.equal(h2.childNodes.length, 1);
+ assert.equal(h2.firstChild, d);
+ assert.equal(h1.childNodes.length, 0);
+ assert.deepEqual(h1.$.content.assignedNodes({flatten: true}).length, 0);
+ h1.appendChild(d);
+ ShadyDOM.flush();
+ assert.equal(h1.childNodes.length, 1);
+ assert.equal(h1.firstElementChild, d);
+ assert.deepEqual(h1.$.content.assignedNodes({flatten: true}), [d]);
+ assert.equal(h2.childNodes.length, 0);
+ h2.appendChild(d);
+ ShadyDOM.flush();
+ assert.equal(h2.childNodes.length, 1);
+ assert.equal(h2.firstChild, d);
+ assert.equal(h1.childNodes.length, 0);
+ assert.deepEqual(h1.$.content.assignedNodes({flatten: true}).length, 0);
+ document.body.removeChild(h1);
+ });
+
+ test('moving children between distributing host with deep insertion and fragment (parsed child)', function() {
+ var div = document.createElement('div');
+ div.innerHTML = '<x-dist-inside-deep-tree><div></div></x-dist-inside-deep-tree>';
+ var h1 = div.firstChild;
+ var h2 = createPatchedDocumentFragment();
+ document.body.appendChild(h1);
+ ShadyDOM.flush();
+ var d = h1.firstElementChild;
+ assert.equal(d.localName, 'div');
+ assert.equal(h1.childNodes.length, 1);
+ assert.equal(h1.firstElementChild, d);
+ assert.deepEqual(h1.$.content.assignedNodes({flatten: true}), [d]);
+ assert.equal(h2.childNodes.length, 0);
+ h2.appendChild(d);
+ ShadyDOM.flush();
+ assert.equal(h2.childNodes.length, 1);
+ assert.equal(h2.firstChild, d);
+ assert.equal(h1.childNodes.length, 0);
+ assert.deepEqual(h1.$.content.assignedNodes({flatten: true}).length, 0);
+ h1.appendChild(d);
+ ShadyDOM.flush();
+ assert.equal(h1.childNodes.length, 1);
+ assert.equal(h1.firstElementChild, d);
+ assert.deepEqual(h1.$.content.assignedNodes({flatten: true}), [d]);
+ assert.equal(h2.childNodes.length, 0);
+ h2.appendChild(d);
+ ShadyDOM.flush();
+ assert.equal(h2.childNodes.length, 1);
+ assert.equal(h2.firstChild, d);
+ assert.equal(h1.childNodes.length, 0);
+ assert.deepEqual(h1.$.content.assignedNodes({flatten: true}).length, 0);
+ document.body.removeChild(h1);
+ });
+
+ test('moving children between distributing host with shallow insertion and fragment', function() {
+ var h1 = document.createElement('x-dist-simple');
+ var h2 = createPatchedDocumentFragment();
+ document.body.appendChild(h1);
+ ShadyDOM.flush();
+ var d = document.createElement('div');
+ h1.appendChild(d);
+ ShadyDOM.flush();
+ assert.equal(h1.childNodes.length, 1);
+ assert.equal(h1.firstElementChild, d);
+ assert.deepEqual(h1.$.content.assignedNodes({flatten: true}), [d]);
+ assert.equal(h2.childNodes.length, 0);
+ h2.appendChild(d);
+ ShadyDOM.flush();
+ assert.equal(h2.childNodes.length, 1);
+ assert.equal(h2.firstChild, d);
+ assert.equal(h1.childNodes.length, 0);
+ assert.deepEqual(h1.$.content.assignedNodes({flatten: true}).length, 0);
+ h1.appendChild(d);
+ ShadyDOM.flush();
+ assert.equal(h1.childNodes.length, 1);
+ assert.equal(h1.firstElementChild, d);
+ assert.deepEqual(h1.$.content.assignedNodes({flatten: true}), [d]);
+ assert.equal(h2.childNodes.length, 0);
+ h2.appendChild(d);
+ ShadyDOM.flush();
+ assert.equal(h2.childNodes.length, 1);
+ assert.equal(h2.firstChild, d);
+ assert.equal(h1.childNodes.length, 0);
+ assert.deepEqual(h1.$.content.assignedNodes({flatten: true}).length, 0);
+ document.body.removeChild(h1);
+ });
+
+ test('moving children between distributing host with shallow insertion and fragment (parsed child)', function() {
+ var div = document.createElement('div');
+ div.innerHTML = '<x-dist-simple><div></div></x-dist-simple>';
+ var h1 = div.firstChild;
+ var h2 = createPatchedDocumentFragment();
+ document.body.appendChild(h1);
+ ShadyDOM.flush();
+ var d = h1.firstElementChild;
+ assert.equal(d.localName, 'div');
+ assert.equal(h1.childNodes.length, 1);
+ assert.equal(h1.firstElementChild, d);
+ assert.deepEqual(h1.$.content.assignedNodes({flatten: true}), [d]);
+ assert.equal(h2.childNodes.length, 0);
+ h2.appendChild(d);
+ ShadyDOM.flush();
+ assert.equal(h2.childNodes.length, 1);
+ assert.equal(h2.firstChild, d);
+ assert.equal(h1.childNodes.length, 0);
+ assert.deepEqual(h1.$.content.assignedNodes({flatten: true}).length, 0);
+ h1.appendChild(d);
+ ShadyDOM.flush();
+ assert.equal(h1.childNodes.length, 1);
+ assert.equal(h1.firstElementChild, d);
+ assert.deepEqual(h1.$.content.assignedNodes({flatten: true}), [d]);
+ assert.equal(h2.childNodes.length, 0);
+ h2.appendChild(d);
+ ShadyDOM.flush();
+ assert.equal(h2.childNodes.length, 1);
+ assert.equal(h2.firstChild, d);
+ assert.equal(h1.childNodes.length, 0);
+ assert.deepEqual(h1.$.content.assignedNodes({flatten: true}).length, 0);
+ document.body.removeChild(h1);
+ });
+
+ test('moving an element containing a dom-repeat that distributes items', function() {
+ var x1 = document.createElement('x-repeat');
+ var div = document.createElement('div');
+ document.body.appendChild(x1);
+ document.body.appendChild(div);
+ flush$0();
+ assert.equal(x1.$.dist.children.length, 4);
+
+ div.appendChild(x1);
+ ShadyDOM.flush();
+ assert.equal(x1.$.dist.children.length, 4);
+
+ document.body.appendChild(x1);
+ ShadyDOM.flush();
+ assert.equal(x1.$.dist.children.length, 4);
+
+ div.appendChild(x1);
+ ShadyDOM.flush();
+ assert.equal(x1.$.dist.children.length, 4);
+
+ document.body.removeChild(div);
+ });
+
+ test('dom-repeat that distributes inside a slot container', function(done) {
+ var x1 = document.querySelector('#repeat2');
+ ShadyDOM.flush();
+ // async due to attachment.
+ setTimeout(function() {
+ assert.equal(x1.$.dist.children.length, 4);
+
+ done();
+ });
+ });
+
+ test('adding a document fragment clears nodes in the fragment', function() {
+ var x = document.createElement('x-dist-star');
+ document.body.appendChild(x);
+ var frag = document.createDocumentFragment();
+ var t = document.createTextNode('hi');
+ var d = document.createElement('div');
+ frag.appendChild(t);
+ frag.appendChild(d);
+ x.appendChild(frag);
+ ShadyDOM.flush();
+ assert.equal(t.parentNode, x, 'logical parent wrong');
+ assert.equal(d.parentNode, x, 'logical parent wrong');
+ assert.equal(frag.childNodes.length, 0, 'fragment not empty');
+ document.body.removeChild(x);
+ });
+
+ test('adding a non-distributing node removes the node from its current location', function() {
+ var x = document.createElement('x-dist-star');
+ var t = document.createTextNode('hi');
+ document.body.appendChild(t);
+ x.appendChild(t);
+ ShadyDOM.flush();
+ assert.equal(t.parentNode, x);
+
+ });
+
+});
+
+suite('multi-content mutations', function() {
+
+ test('remove, append first content', function() {
+ var el = document.createElement('x-multi-dist');
+ document.body.appendChild(el);
+ // Append div
+ var div = document.createElement('div');
+ el.appendChild(div);
+ ShadyDOM.flush();
+
+ // Remove first content
+ el.$.dist1.removeChild(el.$.content1);
+ ShadyDOM.flush();
+
+ // Re-add a new first content
+ el.$.dist1.appendChild(document.createElement('slot'));
+ ShadyDOM.flush();
+
+ });
+
+ test('remove, append first distributing element', function() {
+ var el = document.createElement('x-multi-dist');
+ document.body.appendChild(el);
+ // Append div
+ var div = document.createElement('div');
+ el.appendChild(div);
+ ShadyDOM.flush();
+
+ // Remove first element with nested content
+ el.root.removeChild(el.$.dist1);
+ ShadyDOM.flush();
+
+ // Re-add a new first content
+ var frag = document.createDocumentFragment();
+ var dist = document.createElement('x-dist');
+ dist.appendChild(document.createElement('slot'));
+ frag.appendChild(dist);
+ el.root.insertBefore(frag, el.$.dist2);
+ // Note, special call required here
+ ShadyDOM.flush();
+
+ });
+
+ test('move first distributing element', function() {
+ var el = document.createElement('x-multi-dist');
+ document.body.appendChild(el);
+ // Append div
+ var div = document.createElement('div');
+ el.appendChild(div);
+ ShadyDOM.flush();
+
+ // Remove first element with nested content to the end
+ el.root.appendChild(el.$.dist1);
+ // Note, special call required here
+ ShadyDOM.flush();
+
+ });
+
+});
+
+suite('dom-if append <slot>', function() {
+
+ test('x-dynamic-content', function() {
+ var el = document.createElement('x-dynamic-content');
+ document.body.appendChild(el);
+ var div = document.createElement('div');
+ div.name = 'insert';
+ el.appendChild(div);
+
+ el.$.domif.if = true;
+ el.$.domif.render();
+ ShadyDOM.flush();
+
+ document.body.removeChild(el);
+ });
+
+ test('x-dynamic-content-wrapped', function() {
+ var el = document.createElement('x-dynamic-content-wrapped');
+ document.body.appendChild(el);
+ var div = document.createElement('div');
+ div.name = 'insert';
+ el.appendChild(div);
+
+ el.$.domif.if = true;
+ el.$.domif.render();
+ ShadyDOM.flush();
+
+ document.body.removeChild(el);
+ });
+
+ test('x-dynamic-content-redist', function() {
+ var el = document.createElement('x-dynamic-content-redist');
+ document.body.appendChild(el);
+ var div = document.createElement('div');
+ div.name = 'insert';
+ el.appendChild(div);
+
+ el.$.redistDomif.if = true;
+ el.$.redistContainer.$.domif.if = true;
+ el.$.redistDomif.render();
+ ShadyDOM.flush();
+
+ document.body.removeChild(el);
+ });
+
+ test('x-dynamic-content-redist-element', function() {
+ var el = document.createElement('x-dynamic-content-redist-element');
+ document.body.appendChild(el);
+ var div = document.createElement('div');
+ div.name = 'insert';
+ el.appendChild(div);
+
+ el.$.redistDomif.if = true;
+ el.$.redistDomif.render();
+ ShadyDOM.flush();
+
+ document.body.removeChild(el);
+ });
+
+ test('x-toggle-if', function() {
+ var el = document.createElement('x-toggle-if');
+ document.body.appendChild(el);
+ var c1 = document.createElement('div');
+ c1.id = 'one';
+ el.appendChild(c1);
+ var c2 = document.createElement('div');
+ c2.id = 'two';
+ el.appendChild(c2);
+ el.$.foo.render();
+ el.$.notFoo.render();
+ ShadyDOM.flush();
+
+ el.foo = false;
+ el.$.foo.render();
+ el.$.notFoo.render();
+ ShadyDOM.flush();
+
+ el.foo = true;
+ el.$.foo.render();
+ el.$.notFoo.render();
+ ShadyDOM.flush();
+
+ el.foo = false;
+ el.$.foo.render();
+ el.$.notFoo.render();
+ ShadyDOM.flush();
+
+ el.foo = true;
+ el.$.foo.render();
+ el.$.notFoo.render();
+ ShadyDOM.flush();
+
+ document.body.removeChild(el);
+ });
+
+ test('x-dynamic-content-and-dynamic-no-content', function() {
+ var el = document.createElement('x-dynamic-content-and-dynamic-no-content');
+ document.body.appendChild(el);
+ var c1 = document.createElement('div');
+ c1.slot = 'one';
+ el.appendChild(c1);
+ flush$0();
+ assert.equal(el.querySelector('[slot="one"]'), c1);
+ assert.notOk(el.root.querySelector('#static'));
+ assert.notOk(el.root.querySelector('slot'));
+ el.$.contentIf.if = true;
+ el.$.staticIf.if = true;
+ flush$0();
+ assert.ok(el.root.querySelector('#static'));
+ var ip = el.root.querySelector('slot');
+ assert.ok(ip);
+ assert.equal(ip.assignedNodes({flatten: true})[0], c1);
+ el.$.contentIf.if = false;
+ el.$.staticIf.if = false;
+ flush$0();
+ assert.equal(el.querySelector('[slot="one"]'), c1);
+ assert.notOk(el.root.querySelector('#static'));
+ assert.notOk(el.root.querySelector('slot'));
+ el.$.contentIf.if = true;
+ el.$.staticIf.if = true;
+ flush$0();
+ assert.ok(el.root.querySelector('#static'));
+ ip = el.root.querySelector('slot');
+ assert.ok(ip);
+ assert.equal(ip.assignedNodes({flatten: true})[0], c1);
+ document.body.removeChild(el);
+ });
+
+});
+</script>
+
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/shady-dynamic.html b/third_party/polymer3/bower_components/polymer/test/unit/shady-dynamic.html
new file mode 100644
index 0000000..9e70c6e
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/shady-dynamic.html
@@ -0,0 +1,1984 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script>
+ if (!window.customElements) {
+ window.customElements = {};
+ }
+ customElements.forcePolyfill = true;
+ window.ShadyDOM = {
+ force: true
+ };
+ </script>
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+</head>
+<body>
+
+<dom-module id="x-project">
+ <template>
+ x-project: [<slot></slot>]
+ </template>
+</dom-module>
+<script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-project'
+});
+</script>
+
+<dom-module id="x-reproject">
+ <template>
+ <x-project>x-reproject: [<slot></slot>]</x-project>
+ </template>
+</dom-module>
+<script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-reproject'
+});
+</script>
+
+<dom-module id='x-rereproject'>
+ <template>
+ <x-reproject>x-rereproject: [<slot></slot>]</x-reproject>
+ </template>
+</dom-module>
+<script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-rereproject',
+ attachedCount: 0,
+ attached: function() {
+ this.attachedCount++;
+ }
+});
+</script>
+
+<dom-module id="x-test">
+ <template>
+ <x-rereproject><span id="projected">projected</span></x-rereproject>
+ </template>
+</dom-module>
+<script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-test'
+});
+</script>
+
+<dom-module id="x-test-no-distribute">
+ <template>
+ <span>Local dom without insertion point.</span>
+ </template>
+</dom-module>
+<script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-test-no-distribute'
+});
+</script>
+
+<dom-module id="x-distribute">
+ <template>
+ <div>
+ <span>Elements without test attribute</span>
+ <div id="notTestContainer" style="color: white; background-color: green; min-height: 1em;">
+ <slot id="notTestContent"></slot>
+ </div>
+ <span>Elements with test attribute</span>
+ <div style="color: white; background-color: red; min-height: 1em;">
+ <div id="testContainer">
+ <slot id="testContent" name="test"></slot>
+ </div>
+ </div>
+ </div>
+ </template>
+</dom-module>
+
+<script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: "x-distribute"
+});
+</script>
+
+<dom-module id="x-compose">
+ <template><x-project id="project"></x-project></template>
+</dom-module>
+<script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-compose'
+});
+</script>
+
+
+<dom-module id="x-select3">
+ <template><slot id="x-select3-slot" name="s3"></slot></template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-select3'});
+</script>
+</dom-module>
+
+<dom-module id="x-select2">
+ <template><x-select3 id="select"><slot id="x-select2-slot" name="s2"></slot></x-select3></template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-select2'});
+</script>
+</dom-module>
+
+<dom-module id="x-select1">
+ <template><x-select2 id="select"><slot id="x-select1-slot" name="s1"></slot></x-select2></template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-select1'});
+</script>
+</dom-module>
+
+<dom-module id="x-echo">
+ <template><slot></slot></template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-echo'});
+</script>
+</dom-module>
+
+<dom-module id="x-simple">
+ <template><div>simple</div></template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-simple'});
+</script>
+</dom-module>
+
+
+<dom-module id="x-redistribute-a-b">
+ <template>
+ <x-echo id="echo1"><slot name="a"></slot></x-echo>
+ <x-echo id="echo2"><slot name="b"></slot></x-echo>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-redistribute-a-b'});
+</script>
+</dom-module>
+
+<dom-module id="x-attr">
+ <template>Attr1</template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-attr',
+ hostAttributes: {
+ slot: 'bar'
+ }
+
+});
+</script>
+</dom-module>
+
+<dom-module id="x-attr2">
+ <template>Attr2</template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-attr2',
+ // TODO(sorvell): cannot put `slot` into properties because it is patched.
+ ready: function() {
+ this.slot = 'foo';
+ }
+
+});
+</script>
+</dom-module>
+
+<dom-module id="x-select-attr">
+ <template>
+ Foo: [<slot name="foo"></slot>]
+ Bar: [<slot name="bar"></slot>]
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-select-attr'});
+</script>
+</dom-module>
+
+<dom-module id="x-compose-select-attr">
+ <template>
+ <x-select-attr id="select">
+ <x-attr id="attr1"></x-attr>
+ <x-attr2 id="attr2"></x-attr2>
+ </x-select-attr>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-compose-select-attr'});
+</script>
+</dom-module>
+
+
+<dom-module id="x-clonate">
+ <template><span>[</span><slot></slot><span>]</span></template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-clonate'
+});
+</script>
+</dom-module>
+
+<dom-module id="x-attach3">
+ <template>
+ <style>
+ :host {
+ display: block;
+ border: 1px dashed orange;
+ padding: 4px;
+ box-sizing: border-box;
+ }
+
+ :host > ::slotted(.add3) {
+ box-sizing: border-box;
+ height: 20px;
+ background: #333;
+ border: 2px solid yellow;
+ }
+ </style>
+ <slot></slot>
+ <template is="dom-if" if="{{shouldIf(done.count)}}">
+ <x-attach2></x-attach2>
+ </template>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-attach3',
+ properties: {
+ done: {value: {count: 0}}
+ },
+ ready: function() {
+ this.done.count++;
+ },
+ attached: function() {
+ var d = document.createElement('div');
+ d.className = 'add3';
+ this.appendChild(d);
+ },
+ shouldIf: function(x) {
+ return x < 3;
+ }
+});
+</script>
+</dom-module>
+
+<dom-module id="x-attach2">
+ <template>
+ <style>
+ :host {
+ display: block;
+ border: 1px dashed tomato;
+ padding: 4px;
+ }
+
+ x-attach3 > ::slotted(.add2) {
+ box-sizing: border-box;
+ height: 20px;
+ background: gray;
+ border: 2px solid yellow;
+ }
+ </style>
+ <x-attach3><slot></slot></x-attach3>
+ <template is="dom-if" if="{{shouldIf(done.count)}}">
+ <x-attach1></x-attach1>
+ </template>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-attach2',
+ properties: {
+ done: {value: {count: 0}}
+ },
+ ready: function() {
+ this.done.count++;
+ },
+ attached: function() {
+ var d = document.createElement('div');
+ d.className = 'add2';
+ this.appendChild(d);
+ },
+ shouldIf: function(x) {
+ return x < 3;
+ }
+});
+</script>
+</dom-module>
+
+<dom-module id="x-attach1">
+ <template>
+ <style>
+ :host {
+ display: block;
+ border: 1px dashed seagreen;
+ padding: 4px;
+ }
+
+ .slotContainer ::slotted(.add1) {
+ box-sizing: border-box;
+ height: 20px;
+ background: lightgray;
+ border: 2px solid yellow;
+ }
+ </style>
+ <x-attach2><div class="slotContainer"><slot></slot><div></x-attach2>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-attach1',
+ attached: function() {
+ var d = document.createElement('div');
+ d.className = 'add1';
+ this.appendChild(d);
+ }
+});
+</script>
+</dom-module>
+
+<dom-module id="x-commented">
+ <template><span>[</span><!--comment--><slot></slot></span><span>]</span></slot></template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-commented'});
+</script>
+</dom-module>
+
+
+<dom-module id="polymer-dom-repeat">
+ <template>
+ <div>
+ <div>
+ <div>
+ <div id="container">
+ <template id="repeater" is="dom-repeat" items="{{items}}">
+ <div>stuff</div>
+ </template>
+ </div>
+ </div>
+ </div>
+ </div>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'polymer-dom-repeat',
+ properties: {
+ items: {
+ value: function() {
+ return ['a', 'b', 'c', 'd', 'e'];
+ }
+ }
+ }
+});
+</script>
+</dom-module>
+
+<dom-module id="x-deep-contains">
+ <template>
+ <div id="shadowed"></div>
+ <slot name="light"></slot>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-deep-contains',
+ created: function() {
+ var e = document.createElement('div');
+ e.setAttribute('slot', 'light');
+ this.appendChild(e);
+ e = document.createElement('div');
+ e.setAttribute('slot', 'notdistributed');
+ this.appendChild(e);
+ }
+});
+</script>
+</dom-module>
+
+<dom-module id="x-wrapped">
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-wrapped'
+});
+</script>
+</dom-module>
+
+
+<dom-module id="x-shadow-host-root-0-0">
+ <template>
+ <slot></slot>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-shadow-host-root-0-0',
+ hostAttributes: {
+ tabindex: '-1'
+ }
+});
+</script>
+</dom-module>
+
+<dom-module id="x-shadow-host-root-0-0-light-0">
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-shadow-host-root-0-0-light-0',
+ hostAttributes: {
+ tabindex: '-1'
+ }
+});
+</script>
+</dom-module>
+
+<dom-module id="x-shadow-host-root-0-0-light">
+ <template>
+ <div>
+ <div>
+ <x-shadow-host-root-0-0-light-0></x-shadow-host-root-0-0-light-0>
+ </div>
+ </div>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-shadow-host-root-0-0-light',
+ hostAttributes: {
+ tabindex: '-1'
+ }
+});
+</script>
+</dom-module>
+
+<dom-module id="x-shadow-host-root-0-1">
+ <template>
+ <slot></slot>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-shadow-host-root-0-1',
+ hostAttributes: {
+ tabindex: '-1'
+ }
+});
+</script>
+</dom-module>
+
+<dom-module id="x-shadow-host-root-0-1-light">
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-shadow-host-root-0-1-light',
+ hostAttributes: {
+ tabindex: '-1'
+ }
+});
+</script>
+</dom-module>
+
+<dom-module id="x-shadow-host-root-0">
+ <template>
+ <slot></slot>
+ <div>
+ <x-shadow-host-root-0-0>
+ <x-shadow-host-root-0-0-light></x-shadow-host-root-0-0-light>
+ </x-shadow-host-root-0-0>
+ </div>
+ <x-shadow-host-root-0-1>
+ <x-shadow-host-root-0-1-light></x-shadow-host-root-0-1-light>
+ </x-shadow-host-root-0-1>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-shadow-host-root-0',
+ hostAttributes: {
+ tabindex: '-1'
+ }
+});
+</script>
+</dom-module>
+
+<dom-module id="x-shadow-host-root-0-light">
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-shadow-host-root-0-light',
+ hostAttributes: {
+ tabindex: '-1'
+ }
+});
+</script>
+</dom-module>
+
+<dom-module id="x-shadow-host-root-1-0">
+ <template>
+ <slot></slot>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-shadow-host-root-1-0',
+ hostAttributes: {
+ tabindex: '-1'
+ }
+});
+</script>
+</dom-module>
+
+<dom-module id="x-shadow-host-root-1-0-light">
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-shadow-host-root-1-0-light',
+ hostAttributes: {
+ tabindex: '-1'
+ }
+});
+</script>
+</dom-module>
+
+<dom-module id="x-shadow-host-root-1-1">
+ <template>
+ <slot></slot>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-shadow-host-root-1-1',
+ hostAttributes: {
+ tabindex: '-1'
+ }
+});
+</script>
+</dom-module>
+
+<dom-module id="x-shadow-host-root-1-1-light">
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-shadow-host-root-1-1-light',
+ hostAttributes: {
+ tabindex: '-1'
+ }
+});
+</script>
+</dom-module>
+
+<dom-module id="x-shadow-host-root-1">
+ <template>
+ <slot></slot>
+ <div>
+ <x-shadow-host-root-1-0>
+ <x-shadow-host-root-1-0-light></x-shadow-host-root-1-0-light>
+ </x-shadow-host-root-1-0>
+ </div>
+ <div>
+ <div>
+ <div>
+ <x-shadow-host-root-1-1>
+ <x-shadow-host-root-1-1-light></x-shadow-host-root-1-1-light>
+ </x-shadow-host-root-1-1>
+ </div>
+ </div>
+ </div>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-shadow-host-root-1',
+ hostAttributes: {
+ tabindex: '-1'
+ }
+});
+</script>
+</dom-module>
+
+<dom-module id="x-shadow-host-root-1-light-0">
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-shadow-host-root-1-light-0',
+ hostAttributes: {
+ tabindex: '-1'
+ }
+});
+</script>
+</dom-module>
+
+<dom-module id="x-shadow-host-root-1-light">
+ <template>
+ <x-shadow-host-root-1-light-0></x-shadow-host-root-1-light-0>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-shadow-host-root-1-light',
+ hostAttributes: {
+ tabindex: '-1'
+ }
+});
+</script>
+</dom-module>
+
+<dom-module id="x-shadow-host-root">
+ <template>
+ <slot></slot>
+ <div>
+ <div>
+ <x-shadow-host-root-0>
+ <x-shadow-host-root-0-light></x-shadow-host-root-0-light>
+ </x-shadow-host-root-0>
+ </div>
+ </div>
+ <div>
+ <x-shadow-host-root-1>
+ <x-shadow-host-root-1-light></x-shadow-host-root-1-light>
+ </x-shadow-host-root-1>
+ </div>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-shadow-host-root',
+ hostAttributes: {
+ tabindex: '-1'
+ }
+});
+</script>
+</dom-module>
+
+<dom-module id="x-shadow-host-root-light">
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-shadow-host-root-light',
+ hostAttributes: {
+ tabindex: '-1'
+ }
+});
+</script>
+</dom-module>
+
+<dom-module id="x-outer">
+ <template>
+ <x-inner id="inner">
+ <slot></slot>
+ </x-inner>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-outer'
+});
+</script>
+</dom-module>
+
+<dom-module id="x-inner">
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-inner',
+ attached: function(){
+ this.listen(this, 'click', '_onClick');
+ },
+ _onClick: function(event){
+ this._eventTarget = event.target;
+ }
+});
+</script>
+</dom-module>
+
+
+<x-test></x-test>
+
+<div class="accessors">
+ <x-test-no-distribute><div class="child"></div></x-test-no-distribute>
+ <x-project><div class="child"></div></x-project>
+</div>
+
+<x-test-no-distribute id="noDistribute">
+ <div class="bar">Bar</div>
+ <div class="foo">Foo</div>
+</x-test-no-distribute>
+
+<x-select1>
+ <div class="select-child"></div>
+</x-select1>
+
+<x-select-class1>
+ <div></div>
+</x-select-class1>
+
+<x-select-attr>
+ <x-attr></x-attr>
+</x-select-attr>
+
+<x-compose-select-attr></x-compose-select-attr>
+
+<x-redistribute-a-b></x-redistribute-a-b>
+
+<div id="container">
+ <x-echo></x-echo>
+ <span>1</span>
+ <span>2</span>
+</div>
+
+<x-deep-contains></x-deep-contains>
+
+<x-wrapped></x-wrapped>
+
+<x-shadow-host-root>
+ <x-shadow-host-root-light></x-shadow-host-root-light>
+</x-shadow-host-root>
+
+<x-outer>
+ <button>click me</button>
+</x-outer>
+<script>
+ if (!window.ShadyDOM) {
+ ShadyDOM = {
+ patch: function() {},
+ flush: function() {}
+ };
+ }
+</script>
+<script type="module">
+import { flush } from '../../lib/utils/flush.js';
+import { dom } from '../../lib/legacy/polymer.dom.js';
+
+function createEnabledElement(tag) {
+ var e = document.createElement(tag);
+ document.body.appendChild(e);
+ document.body.removeChild(e);
+ return e;
+}
+
+function allInsertionPoints(e) {
+ var r = [];
+ while (e) {
+ e = e.assignedSlot;
+ if (e) {
+ r.push(e);
+ }
+ }
+ return r;
+}
+
+var checkUnpatchedDom = false;
+
+suite('ShadyDOM', function() {
+
+var testElement;
+
+suiteSetup(function() {
+ testElement = document.querySelector('x-test');
+});
+
+test('querySelector (local)', function() {
+ var projected = testElement.root.querySelector('#projected');
+ assert.equal(projected.textContent, 'projected');
+ var p2 = testElement.querySelector('#projected');
+ assert.isNull(p2);
+ var rere = testElement.root.querySelector('x-rereproject');
+ assert.equal(rere.is, 'x-rereproject');
+ var re = rere.root.querySelector('x-reproject');
+ assert.equal(re.is, 'x-reproject');
+ var p = re.root.querySelector('x-project');
+ assert.equal(p.is, 'x-project');
+});
+
+test('querySelectorAll (local)', function() {
+ var rere = testElement.root.querySelector('x-rereproject');
+ var re = rere.root.querySelector('x-reproject');
+ var p = re.root.querySelector('x-project');
+ var rereList = rere.root.querySelectorAll('*');
+ assert.include(rereList, re);
+ assert.equal(rereList.length, 2);
+ var reList = re.root.querySelectorAll('*');
+ assert.include(reList, p);
+ assert.equal(reList.length, 2);
+ var pList = p.root.querySelectorAll('*');
+ assert.equal(pList.length, 1);
+});
+
+test('querySelector (light)', function() {
+ var projected = testElement.root.querySelector('#projected');
+ var rere = testElement.root.querySelector('x-rereproject');
+ var re = rere.root.querySelector('x-reproject');
+ var p = re.root.querySelector('x-project');
+ assert.equal(rere.querySelector('#projected'), projected);
+ assert(re.querySelector('slot'));
+ assert(p.querySelector('slot'));
+});
+
+test('querySelectorAll (light)', function() {
+ var projected = testElement.root.querySelector('#projected');
+ var rere = testElement.root.querySelector('x-rereproject');
+ var re = rere.root.querySelector('x-reproject');
+ var p = re.root.querySelector('x-project');
+ assert.equal(rere.querySelectorAll('#projected')[0], projected);
+ assert(re.querySelectorAll('slot').length, 1);
+ assert(p.querySelectorAll('slot').length, 1);
+});
+
+test('querySelectorAll with dom-repeat', function() {
+ var el = document.createElement('polymer-dom-repeat');
+ document.body.appendChild(el);
+ el.$.repeater.render();
+ flush();
+ assert.equal(el.$.container.querySelectorAll('*').length, 7, 'querySelectorAll finds repeated elements');
+ document.body.removeChild(el);
+});
+
+test('querySelector document', function() {
+ assert.ok(document.querySelector('body'));
+});
+
+test('projection', function() {
+ var projected = testElement.root.querySelector('#projected');
+ assert.equal(projected.textContent, 'projected');
+ var rere = testElement.root.querySelector('x-rereproject');
+ assert.equal(rere.is, 'x-rereproject');
+ var re = rere.root.querySelector('x-reproject');
+ assert.equal(re.is, 'x-reproject');
+ var p = re.root.querySelector('x-project');
+ assert.equal(p.is, 'x-project');
+ var c1 = rere.root.querySelector('slot');
+ assert.include(c1.assignedNodes({flatten: true}), projected);
+ var c2 = re.root.querySelector('slot');
+ assert.include(c2.assignedNodes({flatten: true}), projected);
+ var c3 = p.root.querySelector('slot');
+ assert.include(c3.assignedNodes({flatten: true}), projected);
+ var ip$ = [c1, c2, c3];
+ var as$ = allInsertionPoints(projected);
+ assert.deepEqual(as$, ip$);
+});
+
+test('shadyRoot (reproject)', function() {
+ var select = document.querySelector('x-select1');
+ var child = select.firstElementChild;
+ var c1 = select.root.querySelector('slot');
+ var c2 = select.$.select.root.querySelector('slot');
+ var c3 = select.$.select.$.select.root.querySelector('slot');
+ assert.equal(c1.getAttribute('name'), 's1');
+ assert.equal(c2.getAttribute('name'), 's2');
+ assert.equal(c3.getAttribute('name'), 's3');
+ // var ip$ = [c1, c2, c3];
+ assert.equal(child.className, 'select-child');
+ assert.equal(allInsertionPoints(child).length, 0);
+ child.slot = 's1';
+ flush();
+ assert.deepEqual(allInsertionPoints(child), [c1]);
+ child.slot = 's2';
+ c1.setAttribute('name', 's2');
+ c1.slot = 's2';
+ flush();
+ assert.deepEqual(allInsertionPoints(child), [c1, c2]);
+ child.slot = 's3';
+ c1.setAttribute('name', 's3');
+ c1.slot = 's3';
+ c2.setAttribute('name', 's3');
+ c2.slot = 's3';
+ flush();
+ assert.deepEqual(allInsertionPoints(child), [c1, c2, c3]);
+ child.slot = '';
+ flush();
+ assert.deepEqual(allInsertionPoints(child), []);
+ child.slot = 's3';
+ flush();
+ assert.deepEqual(allInsertionPoints(child), [c1, c2, c3]);
+ child.slot = '';
+ flush();
+ assert.deepEqual(allInsertionPoints(child), []);
+ child.slot = 's2';
+ c1.setAttribute('name', 's2');
+ c1.slot = 's2';
+ c2.setAttribute('name', 's2');
+ c2.slot = 's2';
+ flush();
+ assert.deepEqual(allInsertionPoints(child), [c1, c2]);
+ child.slot = 's1';
+ c1.setAttribute('name', 's1');
+ c1.slot = 's1';
+ flush();
+ assert.deepEqual(allInsertionPoints(child), [c1]);
+ child.slot = '';
+ flush();
+ assert.deepEqual(allInsertionPoints(child), []);
+});
+
+test('without a host setting hostAttributes/reflecting properties provokes distribution', function() {
+ var e = document.querySelector('x-select-attr');
+ var ip$ = e.root.querySelectorAll('slot');
+ var c = e.firstElementChild;
+ flush();
+ assert.equal(allInsertionPoints(c)[0], ip$[1], 'child not distributed based on host attribute');
+ c.slot = 'foo';
+ flush();
+ assert.equal(allInsertionPoints(c)[0], ip$[0], 'child not distributed based on reflecting attribute');
+ c.slot = '';
+ flush();
+ assert.equal(allInsertionPoints(c).length, 0, 'child not distributed based on reflecting attribute');
+});
+
+test('within a host setting hostAttributes/reflecting properties provokes distribution', function() {
+ var e = document.querySelector('x-compose-select-attr');
+ var ip$ = e.$.select.root.querySelectorAll('slot');
+ var c1 = e.$.attr1;
+ flush();
+ assert.equal(allInsertionPoints(c1)[0], ip$[1], 'child not distributed based on host attribute');
+ c1.slot = 'foo';
+ flush();
+ assert.equal(allInsertionPoints(c1)[0], ip$[0], 'child not distributed based on reflecting attribute');
+ c1.slot = 'bar';
+ flush();
+ assert.equal(allInsertionPoints(c1)[0], ip$[1], 'child not distributed based on reflecting attribute');
+ var c2 = e.$.attr2;
+ flush();
+ assert.equal(allInsertionPoints(c2)[0], ip$[0], 'child not distributed based on default value');
+});
+
+test('appendChild (light)', function() {
+ var rere = testElement.root.querySelector('x-rereproject');
+ var s = document.createElement('span');
+ s.id = 'added';
+ s.textContent = 'Added';
+ rere.appendChild(s);
+ assert.equal(testElement.root.querySelector('#added'), s);
+});
+
+test('insertBefore (light)', function() {
+ var rere = testElement.root.querySelector('x-rereproject');
+ var ref = testElement.root.querySelector('#added');
+ var s = document.createElement('span');
+ s.id = 'added2';
+ s.textContent = 'Added2';
+ rere.insertBefore(s, ref);
+ assert.equal(testElement.root.querySelector('#added2'), s);
+});
+
+test('removeChild (light)', function() {
+ var added = testElement.root.querySelector('#added');
+ var added2 = testElement.root.querySelector('#added2');
+ var rere = testElement.root.querySelector('x-rereproject');
+ assert.equal(testElement.root.querySelectorAll('*').length, 4);
+ rere.removeChild(added);
+ rere.removeChild(added2);
+ assert.equal(testElement.root.querySelectorAll('*').length, 2);
+});
+
+test('appendChild (local)', function() {
+ var rere = testElement.root.querySelector('x-rereproject');
+ var s = document.createElement('span');
+ s.id = 'local';
+ s.textContent = 'Local';
+ rere.root.appendChild(s);
+ assert.equal(rere.root.querySelector('#local'), s);
+});
+
+test('insertBefore (local)', function() {
+ var rere = testElement.root.querySelector('x-rereproject');
+ var ref = testElement.root.querySelector('#local');
+ var s = document.createElement('span');
+ s.id = 'local2';
+ s.textContent = 'Local2';
+ rere.root.insertBefore(s, ref);
+ assert.equal(rere.root.querySelector('#local2'), s);
+});
+
+test('removeChild (local)', function() {
+ var rere = testElement.root.querySelector('x-rereproject');
+ var local = rere.root.querySelector('#local');
+ var local2 = rere.root.querySelector('#local2');
+ rere.root.removeChild(local);
+ rere.root.removeChild(local2);
+ assert.equal(rere.root.querySelectorAll('#local').length, 0);
+});
+
+test('localDom.insertBefore first element results in minimal change', function() {
+ var children = testElement.root.childNodes;
+ var rere = testElement.root.querySelector('x-rereproject');
+ assert.equal(rere.attachedCount, 1);
+ var s = document.createElement('span');
+ s.id = 'local-first';
+ s.textContent = 'Local First';
+ testElement.root.insertBefore(s, children[0]);
+ assert.equal(testElement.root.querySelector('#local-first'), s);
+ assert.equal(rere.attachedCount, 1);
+ testElement.root.removeChild(s);
+ assert.equal(rere.attachedCount, 1);
+});
+
+test('appendChild (fragment, local)', function() {
+ var rere = testElement.root.querySelector('x-rereproject');
+ var fragment = document.createDocumentFragment();
+ var childCount = 5;
+ for (var i=0; i < childCount; i++) {
+ var s = document.createElement('span');
+ s.textContent = i;
+ fragment.appendChild(s);
+ }
+ rere.root.appendChild(fragment);
+ var added = rere.root.querySelectorAll('span');
+ assert.equal(added.length, childCount);
+ for (i=0; i < added.length; i++) {
+ rere.root.removeChild(added[i]);
+ }
+ assert.equal(rere.root.querySelectorAll('span').length, 0);
+});
+
+test('insertBefore (fragment, local)', function() {
+ var rere = testElement.root.querySelector('x-rereproject');
+ var fragment = document.createDocumentFragment();
+ var childCount = 5;
+ for (var i=0; i < childCount; i++) {
+ var s = document.createElement('span');
+ s.textContent = i;
+ fragment.appendChild(s);
+ }
+ var l = document.createElement('span');
+ l.textContent = 'last';
+ rere.root.appendChild(l);
+ rere.root.insertBefore(fragment, l);
+ var added = rere.root.querySelectorAll('span');
+ assert.equal(added.length, childCount+1);
+ assert.equal(added[added.length-1], l);
+ for (i=0; i < added.length; i++) {
+ rere.root.removeChild(added[i]);
+ }
+ assert.equal(rere.root.querySelectorAll('span').length, 0);
+});
+
+test('mutations using fragments without logical dom', function() {
+ var d = document.createElement('div');
+ document.body.appendChild(d);
+ assert.equal(d.childNodes.length, 0);
+ var frag = document.createDocumentFragment();
+ var c = document.createElement('div');
+ frag.appendChild(c);
+ d.appendChild(frag);
+ assert.equal(d.childNodes.length, 1);
+ assert.equal(d.firstChild, c);
+ var c1 = document.createElement('div');
+ frag.appendChild(c1);
+ d.appendChild(frag);
+ assert.equal(d.childNodes.length, 2);
+ assert.equal(d.firstChild, c);
+ assert.equal(d.lastChild, c1);
+});
+
+test('appendChild interacts with unmanaged parent tree', function() {
+ var container = document.querySelector('#container');
+ var echo = container.firstElementChild;
+ assert.equal(echo.localName, 'x-echo');
+ var s1 = echo.nextElementSibling;
+ assert.equal(s1.textContent, '1');
+ var s2 = s1.nextElementSibling;
+ assert.equal(s2.textContent, '2');
+ assert.equal(container.children.length, 3);
+ echo.appendChild(s1);
+ flush();
+ assert.equal(container.children.length, 2);
+ assert.equal(echo.nextElementSibling, s2);
+ echo.appendChild(s2);
+ flush();
+ assert.equal(container.children.length, 1);
+ assert.equal(echo.nextElementSibling, null);
+ container.appendChild(s1);
+ flush();
+ assert.equal(container.children.length, 2);
+ assert.equal(echo.nextElementSibling, s1);
+ container.appendChild(s2);
+ flush();
+ assert.equal(container.children.length, 3);
+ assert.equal(echo.nextElementSibling, s1);
+ assert.equal(s1.nextElementSibling, s2);
+});
+
+test('distribute (forced)', function() {
+ var rere = testElement.root.querySelector('x-rereproject');
+ var re = rere.root.querySelector('x-reproject');
+ var p = re.root.querySelector('x-project');
+ var s = document.createElement('span');
+ s.id = 'light';
+ s.textContent = 'Light';
+ rere.appendChild(s);
+ assert.equal(rere.querySelector('#light'), s);
+ assert.equal(s.parentNode, rere);
+ if (checkUnpatchedDom) {
+ assert.notEqual(Polymer.TreeApi.Composed.getParentNode(s), rere);
+ }
+ if (checkUnpatchedDom) {
+ assert.equal(Polymer.TreeApi.Composed.getParentNode(s), p);
+ }
+ rere.removeChild(s);
+ if (checkUnpatchedDom) {
+ assert.equal(Polymer.TreeApi.Composed.getParentNode(s), p);
+ }
+ if (checkUnpatchedDom) {
+ assert.equal(Polymer.TreeApi.Composed.getParentNode(s), null);
+ }
+});
+
+test('queryDistributedElements', function() {
+ var rere = testElement.root.querySelector('x-rereproject');
+ var re = rere.root.querySelector('x-reproject');
+ var p = re.root.querySelector('x-project');
+ var projected = testElement.root.querySelector('#projected');
+ var d$ = p.queryDistributedElements('*');
+ assert.equal(d$.length, 1);
+ assert.equal(d$[0], projected);
+
+});
+
+test('getEffectiveChildNodes', function() {
+ var rere = testElement.root.querySelector('x-rereproject');
+ var re = rere.root.querySelector('x-reproject');
+ var projected = testElement.root.querySelector('#projected');
+ var c$ = re.getEffectiveChildNodes();
+ assert.equal(c$.length, 3);
+ assert.equal(c$[1], projected);
+});
+
+test('querySelector', function() {
+ var test = document.querySelector('x-test');
+ var rere = document.querySelector('x-rereproject');
+ var projected = document.querySelector('#projected');
+ assert.ok(test);
+ assert.notOk(rere);
+ assert.notOk(projected);
+});
+
+test('event', function() {
+ var rere = testElement.root.querySelector('x-rereproject');
+ var re = rere.root.querySelector('x-reproject');
+ var p = re.root.querySelector('x-project');
+ var eventHandled = 0;
+ testElement.addEventListener('test-event', function(e) {
+ eventHandled++;
+ assert.equal(e.composedPath()[0], p);
+ assert.equal(e.target, testElement);
+ var path = e.composedPath();
+ // path includes window only on more recent Shadow DOM implementations
+ // account for that here.
+ assert.ok(path.length >= 10);
+ assert.equal(path[0], p);
+ assert.equal(path[2], re);
+ assert.equal(path[4], rere);
+ assert.equal(path[6], testElement);
+ // event.path *should* be an array
+ assert.isArray(path);
+ assert.isFunction(path.indexOf);
+ assert(path.indexOf(testElement) > -1);
+ });
+
+ rere.addEventListener('test-event', function(e) {
+ eventHandled++;
+ assert.equal(e.target, rere);
+ });
+
+ p.fire('test-event');
+ assert.equal(eventHandled, 2);
+});
+
+test('event.target', function() {
+ var e = document.querySelector('x-outer');
+ var b = document.querySelector('x-outer button');
+ b.dispatchEvent(new Event('click', {bubbles: true}));
+ assert.equal(e.$.inner._eventTarget.localName, 'button', 'event restarted incorrectly');
+});
+
+test('parentNode', function() {
+ var rere = testElement.root.querySelector('x-rereproject');
+ var projected = testElement.root.querySelector('#projected');
+ assert.equal(testElement.parentNode, document.body);
+ assert.equal(projected.parentNode, rere);
+});
+
+test('childNodes is an array', function() {
+ var test = document.querySelector('x-test');
+ assert.isTrue(Array.isArray(test.childNodes));
+});
+
+test('cloneNode shallow', function() {
+ var a = document.createElement('div');
+ a.innerHTML = '<x-clonate><span>1</span><span>2</span></x-clonate>';
+ var b = a.firstElementChild.cloneNode();
+ document.body.appendChild(b);
+ assert.equal(b.childNodes.length, 0, 'shallow copy has incorrect children');
+ if (checkUnpatchedDom) {
+ assert.equal(b.children.length, 2, 'shallow copy has incorrect composed children');
+ }
+});
+
+test('cloneNode deep', function() {
+ var a = document.createElement('div');
+ a.innerHTML = '<x-clonate><span>1</span><span>2</span></x-clonate>';
+ var b = a.cloneNode(true);
+ document.body.appendChild(b);
+ assert.equal(b.firstElementChild.childNodes.length, 2, 'deep copy has incorrect children');
+ if (checkUnpatchedDom) {
+ assert.equal(b.children.length, 4, 'deep copy has incorrect composed children');
+ }
+});
+
+test('importNode shallow', function() {
+ var a = document.createElement('div');
+ a.innerHTML = '<x-clonate><span>1</span><span>2</span></x-clonate>';
+ // NOTE: Safari defaults do `deep` true for importNode so be explicit here.
+ var b = document.importNode(a.firstElementChild, false);
+ document.body.appendChild(b);
+ assert.equal(b.childNodes.length, 0, 'shallow import has incorrect children');
+ if (checkUnpatchedDom) {
+ assert.equal(b.children.length, 2, 'shallow import has incorrect composed children');
+ }
+});
+
+test('importNode deep', function() {
+ var a = document.createElement('div');
+ a.innerHTML = '<x-clonate><span>1</span><span>2</span></x-clonate>';
+ var b = document.importNode(a, true);
+ document.body.appendChild(b);
+ assert.equal(b.firstElementChild.childNodes.length, 2, 'deep copy has incorrect children');
+ if (checkUnpatchedDom) {
+ assert.equal(b.children.length, 4, 'deep copy has incorrect composed children');
+ }
+});
+
+test('styling: flush causes attached and re-flushes if necessary', function(done) {
+ var a = document.createElement('x-attach1');
+ document.body.appendChild(a);
+ flush();
+ assert.equal(a.offsetHeight, 540);
+ done();
+});
+
+test('flush reentrancy', function() {
+ // Setup callbacks
+ var order = [];
+ var cb1 = sinon.spy(function() { order.push(cb1); });
+ var cb2 = sinon.spy(function() { order.push(cb2); });
+ var cb3 = sinon.spy(function() { order.push(cb3); });
+ var cb4 = sinon.spy(function() { order.push(cb4); });
+ var cbReentrant = sinon.spy(function() {
+ order.push(cbReentrant);
+ ShadyDOM.enqueue(cb3);
+ flush();
+ ShadyDOM.enqueue(cb4);
+ });
+ // Enqueue
+ ShadyDOM.enqueue(cb1);
+ ShadyDOM.enqueue(cbReentrant);
+ ShadyDOM.enqueue(cb2);
+ // Flush
+ flush();
+ // Check callbacks called and in correct order
+ assert.isTrue(cb1.calledOnce);
+ assert.isTrue(cb2.calledOnce);
+ assert.isTrue(cb3.calledOnce);
+ assert.isTrue(cb4.calledOnce);
+ assert.isTrue(cbReentrant.calledOnce);
+ assert.sameMembers(order, [cb1, cbReentrant, cb2, cb3, cb4]);
+});
+
+test('event.composedPath correctly calculated for elements with destination insertion points', function(done) {
+ var re = document.createElement('x-reproject');
+ document.body.appendChild(re);
+ flush();
+ var p = re.root.querySelector('x-project');
+ var child = document.createElement('p');
+ child.innerHTML = "hello";
+ // child will be inserted into p after distributeContent is performed.
+ re.appendChild(child);
+ flush();
+ child.addEventListener('child-event', function(e){
+ var path = e.composedPath();
+ assert.isTrue(path.indexOf(p) !== -1, 'path contains p');
+ assert.isTrue(path.indexOf(re) !== -1, 'path contains re');
+ done();
+ });
+ var evt = new CustomEvent('child-event');
+ child.dispatchEvent(evt);
+ document.body.removeChild(re);
+});
+
+});
+
+suite('Accessors', function() {
+ var noDistribute, distribute;
+
+ suiteSetup(function() {
+ noDistribute = document.querySelector('.accessors x-test-no-distribute');
+ distribute = document.querySelector('.accessors x-project');
+ });
+
+ test('node accessors (no distribute)', function() {
+ var child = noDistribute.children[0];
+ assert.isTrue(child.classList.contains('child'), 'test node could not be found');
+ var before = document.createElement('div');
+ var after = document.createElement('div');
+ noDistribute.insertBefore(before, child);
+ noDistribute.appendChild(after);
+ flush();
+ assert.equal(noDistribute.firstChild, before, 'firstChild incorrect');
+ assert.equal(noDistribute.lastChild, after, 'lastChild incorrect');
+ assert.equal(before.nextSibling, child, 'nextSibling incorrect');
+ assert.equal(child.nextSibling, after, 'nextSibling incorrect');
+ assert.equal(after.previousSibling, child, 'previousSibling incorrect');
+ assert.equal(after.nextSibling, null, 'nextSibling incorrect');
+ assert.equal(child.previousSibling, before, 'previousSibling incorrect');
+ });
+
+ test('node accessors (distribute)', function() {
+ var child = distribute.children[0];
+ assert.isTrue(child.classList.contains('child'), 'test node could not be found');
+ var before = document.createElement('div');
+ var after = document.createElement('div');
+ distribute.insertBefore(before, child);
+ distribute.appendChild(after);
+ flush();
+ assert.equal(distribute.firstChild, before, 'firstChild incorrect');
+ assert.equal(distribute.lastChild, after, 'lastChild incorrect');
+ assert.equal(before.nextSibling, child, 'nextSibling incorrect');
+ assert.equal(child.nextSibling, after, 'nextSibling incorrect');
+ assert.equal(after.previousSibling, child, 'previousSibling incorrect');
+ assert.equal(after.nextSibling, null, 'nextSibling incorrect');
+ assert.equal(child.previousSibling, before, 'previousSibling incorrect');
+ });
+
+ test('element accessors (no distribute)', function() {
+ var parent = document.createElement('x-test-no-distribute');
+ var child = document.createElement('div');
+ parent.appendChild(child);
+ var before = document.createElement('div');
+ var after = document.createElement('div');
+ parent.insertBefore(before, child);
+ parent.appendChild(after);
+ assert.equal(parent.firstElementChild, before, 'firstElementChild incorrect');
+ assert.equal(parent.lastElementChild, after, 'lastElementChild incorrect');
+ assert.equal(before.nextElementSibling, child, 'nextElementSibling incorrect');
+ assert.equal(child.nextElementSibling, after, 'nextElementSibling incorrect');
+ assert.equal(after.previousElementSibling, child, 'previousElementSibling incorrect');
+ assert.equal(child.previousElementSibling, before, 'previousElementSibling incorrect');
+ });
+
+ test('element accessors (distribute)', function() {
+ var parent = document.createElement('x-project');
+ var child = document.createElement('div');
+ parent.appendChild(child);
+ var before = document.createElement('div');
+ var after = document.createElement('div');
+ parent.insertBefore(before, child);
+ parent.appendChild(after);
+ assert.equal(parent.firstElementChild, before, 'firstElementChild incorrect');
+ assert.equal(parent.lastElementChild, after, 'lastElementChild incorrect');
+ assert.equal(before.nextElementSibling, child, 'nextElementSibling incorrect');
+ assert.equal(child.nextElementSibling, after, 'nextElementSibling incorrect');
+ assert.equal(after.previousElementSibling, child, 'previousElementSibling incorrect');
+ assert.equal(child.previousElementSibling, before, 'previousElementSibling incorrect');
+ });
+
+ test('node accessors (empty logical tree)', function() {
+ var element = document.createElement('x-simple');
+ assert.equal(element.parentNode, null, 'parentNode incorrect');
+ assert.equal(element.firstChild, null, 'firstChild incorrect');
+ assert.equal(element.lastChild, null, 'lastChild incorrect');
+ assert.equal(element.nextSibling, null, 'nextSibling incorrect');
+ assert.equal(element.previousSibling, null, 'previousSibling incorrect');
+ assert.equal(element.firstElementChild, null, 'firstElementChild incorrect');
+ assert.equal(element.lastElementChild, null, 'lastElementChild incorrect');
+ assert.equal(element.nextElementSibling, null, 'nextElementSibling incorrect');
+ assert.equal(element.previousElementSibling, null, 'previousElementSibling incorrect');
+ });
+
+ test('node accessors (unmanaged logical tree)', function() {
+ var element = document.createElement('div');
+ var child1 = document.createElement('div');
+ var child2 = document.createElement('div');
+ element.appendChild(child1);
+ element.appendChild(child2);
+ assert.equal(element.parentNode, null, 'parentNode incorrect');
+ assert.equal(element.firstChild, child1, 'firstChild incorrect');
+ assert.equal(element.lastChild, child2, 'lastChild incorrect');
+ assert.equal(element.nextSibling, null, 'nextSibling incorrect');
+ assert.equal(element.previousSibling, null, 'previousSibling incorrect');
+ assert.equal(element.firstElementChild, child1, 'firstElementChild incorrect');
+ assert.equal(element.lastElementChild, child2, 'lastElementChild incorrect');
+ assert.equal(element.nextElementSibling, null, 'nextElementSibling incorrect');
+ assert.equal(element.previousElementSibling, null, 'previousElementSibling incorrect');
+ });
+
+ test('textContent', function() {
+ var testElement = document.createElement('x-project');
+ testElement.textContent = 'Hello World';
+ assert.equal(testElement.textContent, 'Hello World', 'textContent getter incorrect');
+ if (checkUnpatchedDom) {
+ flush();
+ assert.equal(Polymer.TreeApi.Composed.getChildNodes(testElement)[1].textContent, 'Hello World', 'text content setter incorrect');
+ }
+ testElement = createEnabledElement('x-commented');
+ assert.equal(testElement.root.textContent, '[]', 'text content getter with comment incorrect');
+
+ var textNode = document.createTextNode('foo');
+ assert.equal(textNode.textContent, 'foo', 'text content getter on textnode incorrect');
+ textNode.textContent = 'bar';
+ assert.equal(textNode.textContent, 'bar', 'text content setter on textnode incorrect');
+
+ var commentNode = document.createComment('foo');
+ assert.equal(commentNode.textContent, 'foo', 'text content getter on commentnode incorrect');
+ commentNode.textContent = 'bar';
+ assert.equal(commentNode.textContent, 'bar', 'text content setter on commentnode incorrect');
+ });
+
+ test('innerHTML', function() {
+ var testElement = document.createElement('x-project');
+ testElement.innerHTML = '<div>Hello World</div><div>2</div><div>3</div>';
+ var added = testElement.firstChild;
+ assert.equal(added.textContent , 'Hello World', 'innerHTML setter incorrect');
+ assert.equal(testElement.innerHTML , '<div>Hello World</div><div>2</div><div>3</div>', 'innerHTML getter incorrect');
+ if (checkUnpatchedDom) {
+ flush();
+ var children = Polymer.TreeApi.Composed.getChildNodes(testElement);
+ assert.equal(children[1], added, 'innerHTML setter composed incorrectly');
+ assert.equal(children[2].textContent, '2', 'innerHTML setter composed incorrectly');
+ assert.equal(children[3].textContent, '3', 'innerHTML setter composed incorrectly');
+ }
+ });
+
+ test('innerHTML (non-composed)', function() {
+ var testElement = document.createElement('div');
+ document.body.appendChild(testElement);
+ testElement.innerHTML = '<div>Hello World</div><div>2</div><div>3</div>';
+ var added = testElement.firstChild;
+ assert.equal(added.textContent , 'Hello World', 'innerHTML setter incorrect');
+ assert.equal(testElement.innerHTML , '<div>Hello World</div><div>2</div><div>3</div>', 'innerHTML getter incorrect');
+ assert.equal(testElement.children.length, 3);
+ });
+
+});
+
+suite('activeElement', function() {
+ var r;
+ // light
+ var r_l;
+ // shadow
+ var r_0;
+ // light
+ var r_0_l;
+ // shadow
+ var r_0_0;
+ // light
+ var r_0_0_l;
+ // shadow
+ var r_0_0_l_0;
+ var r_0_1;
+ // light
+ var r_0_1_l;
+ var r_1;
+ // light
+ var r_1_l;
+ // shadow
+ var r_1_l_0;
+ // shadow
+ var r_1_0;
+ // light
+ var r_1_0_l;
+ var r_1_1;
+ // light
+ var r_1_1_l;
+
+ suiteSetup(function() {
+ r = document.querySelector('x-shadow-host-root');
+ r_l = r.querySelector('x-shadow-host-root-light');
+ r_0 = r.root.querySelector('x-shadow-host-root-0');
+ r_0_l = r_0.querySelector('x-shadow-host-root-0-light');
+ r_0_0 = r_0.root.querySelector('x-shadow-host-root-0-0');
+ r_0_0_l = r_0_0.querySelector('x-shadow-host-root-0-0-light');
+ r_0_0_l_0 = r_0_0_l.root.querySelector('x-shadow-host-root-0-0-light-0');
+ r_0_1 = r_0.root.querySelector('x-shadow-host-root-0-1');
+ r_0_1_l = r_0_1.querySelector('x-shadow-host-root-0-1-light');
+ r_1 = r.root.querySelector('x-shadow-host-root-1');
+ r_1_l = r_1.querySelector('x-shadow-host-root-1-light');
+ r_1_l_0 = r_1_l.root.querySelector('x-shadow-host-root-1-light-0');
+ r_1_0 = r_1.root.querySelector('x-shadow-host-root-1-0');
+ r_1_0_l = r_1_0.querySelector('x-shadow-host-root-1-0-light');
+ r_1_1 = r_1.root.querySelector('x-shadow-host-root-1-1');
+ r_1_1_l = r_1_1.querySelector('x-shadow-host-root-1-1-light');
+ });
+
+ test('r.focus()', function() {
+ r.focus();
+
+ assert.equal(document._activeElement, r, 'document.activeElement === r');
+ assert.equal(r.root.activeElement, null, 'r.root.activeElement === null');
+ assert.equal(r_0.root.activeElement, null, 'r_0.root.activeElement === null');
+ assert.equal(r_0_0.root.activeElement, null, 'r_0_0.root.activeElement === null');
+ assert.equal(r_0_1.root.activeElement, null, 'r_0_1.root.activeElement === null');
+ assert.equal(r_1.root.activeElement, null, 'r_1.root.activeElement === null');
+ assert.equal(r_1_0.root.activeElement, null, 'r_1_0.root.activeElement === null');
+ assert.equal(r_1_1.root.activeElement, null, 'r_1_1.root.activeElement === null');
+ });
+
+ test('r_l.focus()', function() {
+ r_l.focus();
+
+ assert.equal(document._activeElement, r_l, 'document.activeElement === r_l');
+ assert.equal(r.root.activeElement, null, 'r.root.activeElement === null');
+ assert.equal(r_0.root.activeElement, null, 'r_0.root.activeElement === null');
+ assert.equal(r_0_0.root.activeElement, null, 'r_0_0.root.activeElement === null');
+ assert.equal(r_0_1.root.activeElement, null, 'r_0_1.root.activeElement === null');
+ assert.equal(r_1.root.activeElement, null, 'r_1.root.activeElement === null');
+ assert.equal(r_1_0.root.activeElement, null, 'r_1_0.root.activeElement === null');
+ assert.equal(r_1_1.root.activeElement, null, 'r_1_1.root.activeElement === null');
+ });
+
+ test('r_0.focus()', function() {
+ r_0.focus();
+
+ assert.equal(document._activeElement, r, 'document.activeElement === r');
+ assert.equal(r.root.activeElement, r_0, 'r.root.activeElement === r_0');
+ assert.equal(r_0.root.activeElement, null, 'r_0.root.activeElement === null');
+ assert.equal(r_0_0.root.activeElement, null, 'r_0_0.root.activeElement === null');
+ assert.equal(r_0_1.root.activeElement, null, 'r_0_1.root.activeElement === null');
+ assert.equal(r_1.root.activeElement, null, 'r_1.root.activeElement === null');
+ assert.equal(r_1_0.root.activeElement, null, 'r_1_0.root.activeElement === null');
+ assert.equal(r_1_1.root.activeElement, null, 'r_1_1.root.activeElement === null');
+ });
+
+ test('r_0_l.focus()', function() {
+ r_0_l.focus();
+
+ assert.equal(document._activeElement, r, 'document.activeElement === r');
+ assert.equal(r.root.activeElement, r_0_l, 'r.root.activeElement === r_0_l');
+ assert.equal(r_0.root.activeElement, null, 'r_0.root.activeElement === null');
+ assert.equal(r_1.root.activeElement, null, 'r_1.root.activeElement === null');
+
+ assert.equal(r_0_0.root.activeElement, null, 'r_0_0.root.activeElement === null');
+ assert.equal(r_0_1.root.activeElement, null, 'r_0_1.root.activeElement === null');
+ assert.equal(r_1_0.root.activeElement, null, 'r_1_0.root.activeElement === null');
+ assert.equal(r_1_1.root.activeElement, null, 'r_1_1.root.activeElement === null');
+ });
+
+ test('r_0_0.focus()', function() {
+ r_0_0.focus();
+
+ assert.equal(document._activeElement, r, 'document.activeElement === r');
+ assert.equal(r.root.activeElement, r_0, 'r.root.activeElement === r_0');
+ assert.equal(r_0.root.activeElement, r_0_0, 'r_0.root.activeElement === r_0_0');
+ assert.equal(r_0_0.root.activeElement, null, 'r_0_0.root.activeElement === null');
+ assert.equal(r_0_1.root.activeElement, null, 'r_0_1.root.activeElement === null');
+ assert.equal(r_1.root.activeElement, null, 'r_1.root.activeElement === null');
+ assert.equal(r_1_0.root.activeElement, null, 'r_1_0.root.activeElement === null');
+ assert.equal(r_1_1.root.activeElement, null, 'r_1_1.root.activeElement === null');
+ });
+
+ test('r_0_0_l.focus()', function() {
+ r_0_0_l.focus();
+
+ assert.equal(document._activeElement, r, 'document.activeElement === r');
+ assert.equal(r.root.activeElement, r_0, 'r.root.activeElement === r_0');
+ assert.equal(r_0.root.activeElement, r_0_0_l, 'r_0.root.activeElement === r_0_0_l');
+ assert.equal(r_0_0.root.activeElement, null, 'r_0_0.root.activeElement === null');
+ assert.equal(r_0_1.root.activeElement, null, 'r_0_1.root.activeElement === null');
+ assert.equal(r_1.root.activeElement, null, 'r_1.root.activeElement === null');
+ assert.equal(r_1_0.root.activeElement, null, 'r_1_0.root.activeElement === null');
+ assert.equal(r_1_1.root.activeElement, null, 'r_1_1.root.activeElement === null');
+ });
+
+ test('r_0_0_l_0.focus()', function() {
+ r_0_0_l_0.focus();
+
+ assert.equal(document._activeElement, r, 'document.activeElement === r');
+ assert.equal(r.root.activeElement, r_0, 'r.root.activeElement === r_0');
+ assert.equal(r_0.root.activeElement, r_0_0_l, 'r_0.root.activeElement === r_0_0_l');
+ assert.equal(r_0_0.root.activeElement, null, 'r_0_0.root.activeElement === null');
+ assert.equal(r_0_0_l.root.activeElement, r_0_0_l_0, 'r_0_0_l.root.activeElement === r_0_0_l_0');
+ assert.equal(r_0_1.root.activeElement, null, 'r_0_1.root.activeElement === null');
+ assert.equal(r_1.root.activeElement, null, 'r_1.root.activeElement === null');
+ assert.equal(r_1_0.root.activeElement, null, 'r_1_0.root.activeElement === null');
+ assert.equal(r_1_1.root.activeElement, null, 'r_1_1.root.activeElement === null');
+ });
+
+ test('r_0_1.focus()', function() {
+ r_0_1.focus();
+
+ assert.equal(document._activeElement, r, 'document.activeElement === r');
+ assert.equal(r.root.activeElement, r_0, 'r.root.activeElement === r_0');
+ assert.equal(r_0.root.activeElement, r_0_1, 'r_0.root.activeElement === r_0_1');
+ assert.equal(r_0_0.root.activeElement, null, 'r_0_0.root.activeElement === null');
+ assert.equal(r_0_1.root.activeElement, null, 'r_0_1.root.activeElement === null');
+ assert.equal(r_1.root.activeElement, null, 'r_1.root.activeElement === null');
+ assert.equal(r_1_0.root.activeElement, null, 'r_1_0.root.activeElement === null');
+ assert.equal(r_1_1.root.activeElement, null, 'r_1_1.root.activeElement === null');
+ });
+
+ test('r_0_1_l.focus()', function() {
+ r_0_1_l.focus();
+
+ assert.equal(document._activeElement, r, 'document.activeElement === r');
+ assert.equal(r.root.activeElement, r_0, 'r.root.activeElement === r_0');
+ assert.equal(r_0.root.activeElement, r_0_1_l, 'r_0.root.activeElement === r_0_1_l');
+ assert.equal(r_0_0.root.activeElement, null, 'r_0_0.root.activeElement === null');
+ assert.equal(r_0_1.root.activeElement, null, 'r_0_1.root.activeElement === null');
+ assert.equal(r_1.root.activeElement, null, 'r_1.root.activeElement === null');
+ assert.equal(r_1_0.root.activeElement, null, 'r_1_0.root.activeElement === null');
+ assert.equal(r_1_1.root.activeElement, null, 'r_1_1.root.activeElement === null');
+ });
+
+ test('r_1.focus()', function() {
+ r_1.focus();
+
+ assert.equal(document._activeElement, r, 'document.activeElement === r');
+ assert.equal(r.root.activeElement, r_1, 'r.root.activeElement === r_1');
+ assert.equal(r_0.root.activeElement, null, 'r_0.root.activeElement === null');
+ assert.equal(r_0_0.root.activeElement, null, 'r_0_0.root.activeElement === null');
+ assert.equal(r_0_1.root.activeElement, null, 'r_0_1.root.activeElement === null');
+ assert.equal(r_1.root.activeElement, null, 'r_1.root.activeElement === null');
+ assert.equal(r_1_0.root.activeElement, null, 'r_1_0.root.activeElement === null');
+ assert.equal(r_1_1.root.activeElement, null, 'r_1_1.root.activeElement === null');
+ });
+
+ test('r_1_l.focus()', function() {
+ r_1_l.focus();
+
+ assert.equal(document._activeElement, r, 'document.activeElement === r');
+ assert.equal(r.root.activeElement, r_1_l, 'r.root.activeElement === r_1_l');
+ assert.equal(r_0.root.activeElement, null, 'r_0.root.activeElement === null');
+ assert.equal(r_0_0.root.activeElement, null, 'r_0_0.root.activeElement === null');
+ assert.equal(r_0_1.root.activeElement, null, 'r_0_1.root.activeElement === null');
+ assert.equal(r_1.root.activeElement, null, 'r_1.root.activeElement === null');
+ assert.equal(r_1_0.root.activeElement, null, 'r_1_0.root.activeElement === null');
+ assert.equal(r_1_1.root.activeElement, null, 'r_1_1.root.activeElement === null');
+ });
+
+ test('r_1_l_0.focus()', function() {
+ r_1_l_0.focus();
+
+ assert.equal(document._activeElement, r, 'document.activeElement === r');
+ assert.equal(r.root.activeElement, r_1_l, 'r.root.activeElement === r_1_l');
+ assert.equal(r_0.root.activeElement, null, 'r_0.root.activeElement === null');
+ assert.equal(r_0_0.root.activeElement, null, 'r_0_0.root.activeElement === null');
+ assert.equal(r_0_1.root.activeElement, null, 'r_0_1.root.activeElement === null');
+ assert.equal(r_1.root.activeElement, null, 'r_1.root.activeElement === null');
+ assert.equal(r_1_l.root.activeElement, r_1_l_0, 'r_1.root.activeElement === r_1_l_0');
+ assert.equal(r_1_0.root.activeElement, null, 'r_1_0.root.activeElement === null');
+ assert.equal(r_1_1.root.activeElement, null, 'r_1_1.root.activeElement === null');
+ });
+
+ test('r_1_0.focus()', function() {
+ r_1_0.focus();
+
+ assert.equal(document._activeElement, r, 'document.activeElement === r');
+ assert.equal(r.root.activeElement, r_1, 'r.root.activeElement === r_1');
+ assert.equal(r_0.root.activeElement, null, 'r_0.root.activeElement === null');
+ assert.equal(r_0_0.root.activeElement, null, 'r_0_0.root.activeElement === null');
+ assert.equal(r_0_1.root.activeElement, null, 'r_0_1.root.activeElement === null');
+ assert.equal(r_1.root.activeElement, r_1_0, 'r_1.root.activeElement === r_1_0');
+ assert.equal(r_1_0.root.activeElement, null, 'r_1_0.root.activeElement === null');
+ assert.equal(r_1_1.root.activeElement, null, 'r_1_1.root.activeElement === null');
+ });
+
+ test('r_1_0_l.focus()', function() {
+ r_1_0_l.focus();
+
+ assert.equal(document._activeElement, r, 'document.activeElement === r');
+ assert.equal(r.root.activeElement, r_1, 'r.root.activeElement === r_1');
+ assert.equal(r_0.root.activeElement, null, 'r_0.root.activeElement === null');
+ assert.equal(r_0_0.root.activeElement, null, 'r_0_0.root.activeElement === null');
+ assert.equal(r_0_1.root.activeElement, null, 'r_0_1.root.activeElement === null');
+ assert.equal(r_1.root.activeElement, r_1_0_l, 'r_1.root.activeElement === r_1_0_l');
+ assert.equal(r_1_0.root.activeElement, null, 'r_1_0.root.activeElement === null');
+ assert.equal(r_1_1.root.activeElement, null, 'r_1_1.root.activeElement === null');
+ });
+
+ test('r_1_1.focus()', function() {
+ r_1_1.focus();
+
+ assert.equal(document._activeElement, r, 'document.activeElement === r');
+ assert.equal(r.root.activeElement, r_1, 'r.root.activeElement === r_1');
+ assert.equal(r_0.root.activeElement, null, 'r_0.root.activeElement === null');
+ assert.equal(r_0_0.root.activeElement, null, 'r_0_0.root.activeElement === null');
+ assert.equal(r_0_1.root.activeElement, null, 'r_0_1.root.activeElement === null');
+ assert.equal(r_1.root.activeElement, r_1_1, 'r_1.root.activeElement === r_1_1');
+ assert.equal(r_1_0.root.activeElement, null, 'r_1_0.root.activeElement === null');
+ assert.equal(r_1_1.root.activeElement, null, 'r_1_1.root.activeElement === null');
+ });
+
+ test('r_1_1_l.focus()', function() {
+ r_1_1_l.focus();
+
+ assert.equal(document._activeElement, r, 'document.activeElement === r');
+ assert.equal(r.root.activeElement, r_1, 'r.root.activeElement === r_1');
+ assert.equal(r_0.root.activeElement, null, 'r_0.root.activeElement === null');
+ assert.equal(r_0_0.root.activeElement, null, 'r_0_0.root.activeElement === null');
+ assert.equal(r_0_1.root.activeElement, null, 'r_0_1.root.activeElement === null');
+ assert.equal(r_1.root.activeElement, r_1_1_l, 'r_1.root.activeElement === r_1_1_l');
+ assert.equal(r_1_0.root.activeElement, null, 'r_1_0.root.activeElement === null');
+ assert.equal(r_1_1.root.activeElement, null, 'r_1_1.root.activeElement === null');
+ });
+
+ test('setting activeElement on document has no effect', function() {
+ r_1_1.focus();
+
+ // throws on some browsers only
+ try {
+ document.activeElement = "abc";
+ } catch(e) {
+ // no need to do anything
+ }
+ assert.equal(document._activeElement, r, 'document.activeElement === r');
+ assert.equal(r.root.activeElement, r_1, 'r.root.activeElement === r_1');
+ assert.equal(r_0.root.activeElement, null, 'r_0.root.activeElement === null');
+ assert.equal(r_0_0.root.activeElement, null, 'r_0_0.root.activeElement === null');
+ assert.equal(r_0_1.root.activeElement, null, 'r_0_1.root.activeElement === null');
+ assert.equal(r_1.root.activeElement, r_1_1, 'r_1.root.activeElement === r_1_1');
+ assert.equal(r_1_0.root.activeElement, null, 'r_1_0.root.activeElement === null');
+ assert.equal(r_1_1.root.activeElement, null, 'r_1_1.root.activeElement === null');
+ });
+
+ test('setting activeElement on a shadow root has no effect', function() {
+ r_1_1.focus();
+
+ // throws on some browsers only
+ try {
+ r_1.root.activeElement = "abc";
+ } catch(e) {
+ // no need to do anything
+ }
+ assert.equal(document._activeElement, r, 'document.activeElement === r');
+ assert.equal(r.root.activeElement, r_1, 'r.root.activeElement === r_1');
+ assert.equal(r_0.root.activeElement, null, 'r_0.root.activeElement === null');
+ assert.equal(r_0_0.root.activeElement, null, 'r_0_0.root.activeElement === null');
+ assert.equal(r_0_1.root.activeElement, null, 'r_0_1.root.activeElement === null');
+ assert.equal(r_1.root.activeElement, r_1_1, 'r_1.root.activeElement === r_1_1');
+ assert.equal(r_1_0.root.activeElement, null, 'r_1_0.root.activeElement === null');
+ assert.equal(r_1_1.root.activeElement, null, 'r_1_1.root.activeElement === null');
+ });
+});
+
+suite('non-distributed elements', function() {
+
+ var nd;
+
+ suiteSetup(function() {
+ nd = document.querySelector('#noDistribute');
+ });
+
+ test('finds undistributed child', function() {
+ assert.ok(nd.children.length, 2, 'light children includes distributed and non-distributed nodes');
+ });
+
+ test('removes/adds undistributed child', function() {
+ var b = nd.children[0];
+ assert.equal(allInsertionPoints(b).length, 0, 'element improperly distributed');
+ nd.removeChild(b);
+ flush();
+ assert.equal(nd.children.length, 1, 'children length not decremented due to element removal');
+ nd.appendChild(b);
+ flush();
+ assert.equal(nd.children.length, 2, 'children length not incremented due to element addition');
+ var d = document.createElement('div');
+ d.innerHTML = 'added';
+ nd.insertBefore(d, b);
+ flush();
+ assert.equal(nd.children.length, 3, 'children length not incremented due to element addition');
+ nd.removeChild(d);
+ flush();
+ assert.equal(nd.children.length, 2, 'children length not decremented due to element removal');
+ });
+
+ test('removes/adds between light and local dom', function() {
+ var b = nd.children[1];
+ assert.equal(allInsertionPoints(b).length, 0, 'element improperly distributed');
+ nd.root.appendChild(b);
+ flush();
+ assert.equal(nd.children.length, 1, 'children length not decremented due to element removal');
+ assert.equal(nd.root.children.length, 2, 'root children length not incremented due to element addition');
+ nd.appendChild(b);
+ flush();
+ assert.equal(nd.children.length, 2, 'children length not incremented due to element addition');
+ assert.equal(nd.root.children.length, 1, 'root children length not decremented due to element removal');
+ });
+
+ test('modifying slots correctly distributes changes to light dom', function() {
+ function testNoAttr() {
+ assert.equal(allInsertionPoints(child)[0], d.$.notTestContent, 'child not distributed logically');
+ if (checkUnpatchedDom) {
+ assert.equal(Polymer.TreeApi.Composed.getParentNode(child), d.$.notTestContainer, 'child not rendered in composed dom');
+ }
+ }
+ function testWithAttr() {
+ assert.equal(allInsertionPoints(child)[0], d.$.testContent, 'child not distributed logically');
+ if (checkUnpatchedDom) {
+ assert.equal(Polymer.TreeApi.Composed.getParentNode(child), d.$.testContainer, 'child not rendered in composed dom');
+ }
+ }
+ // test with x-distribute
+ var d = document.createElement('x-distribute');
+ document.body.appendChild(d);
+ var child = document.createElement('div');
+ child.classList.add('child');
+ child.textContent = 'Child';
+ d.appendChild(child);
+ flush();
+ assert.equal(d.children[0], child, 'child not added to logical dom');
+ testNoAttr();
+ // set / unset `test` attr and see if it distributes properly
+ child.setAttribute('slot', 'test');
+ flush();
+ testWithAttr();
+ //
+ child.removeAttribute('slot');
+ flush();
+ testNoAttr();
+ //
+ child.setAttribute('slot', 'test');
+ flush();
+ testWithAttr();
+ });
+
+ test('getRootNode', function() {
+ var test = document.createElement('div');
+ var c1 = createEnabledElement('x-compose');
+ var c2 = createEnabledElement('x-compose');
+ c1.$.project.appendChild(test);
+ flush();
+ assert.equal(test.getRootNode(), c1.root, 'getOwnerRoot incorrect for child added to element in root');
+ c2.$.project.appendChild(test);
+ flush();
+ assert.equal(test.getRootNode(), c2.root, 'getOwnerRoot not correctly reset when element moved to different root');
+ c1.appendChild(test);
+ assert.equal(test.getRootNode(), c1, 'getOwnerRoot incorrect for child moved from a root to no root');
+ });
+
+ test('getRootNode when out of tree', function() {
+ var test = document.createElement('div');
+ assert.equal(test.getRootNode(), test, 'getOwnerRoot incorrect when not in root');
+ var c1 = createEnabledElement('x-compose');
+ var project = c1.$.project;
+ project.appendChild(test);
+ flush();
+ assert.equal(test.getRootNode(), c1.root, 'getOwnerRoot incorrect for child added to element in root');
+ project.removeChild(test);
+ flush();
+ assert.equal(test.getRootNode(), test, 'getOwnerRoot incorrect for child moved from a root to no root');
+ project.appendChild(test);
+ flush();
+ assert.equal(test.getRootNode(), c1.root, 'getOwnerRoot incorrect for child added to element in root');
+ });
+
+ test('getRootNode when out of tree and adding subtree', function() {
+ var container = document.createDocumentFragment();
+ var test = document.createElement('div');
+ container.appendChild(test);
+ assert.equal(test.getRootNode(), container, 'getOwnerRoot incorrect when not in root');
+ var c1 = createEnabledElement('x-compose');
+ var project = c1.$.project;
+ project.appendChild(container);
+ flush();
+ assert.equal(test.getRootNode(), c1.root, 'getOwnerRoot incorrect for child added to element in root');
+ project.removeChild(test);
+ flush();
+ assert.equal(test.getRootNode(), test, 'getOwnerRoot incorrect for child moved from a root to no root');
+ project.appendChild(test);
+ flush();
+ assert.equal(test.getRootNode(), c1.root, 'getOwnerRoot incorrect for child added to element in root');
+ });
+
+ test('getRootNode, subtree', function() {
+ var test = document.createElement('div');
+ var testChild = document.createElement('div');
+ test.appendChild(testChild);
+ assert.equal(test.getRootNode(), test, 'getOwnerRoot incorrect when not in root');
+ var c1 = createEnabledElement('x-compose');
+ var project = c1.$.project;
+ project.appendChild(test);
+ flush();
+ assert.equal(test.getRootNode(), c1.root, 'getOwnerRoot incorrect for child added to element in root');
+ assert.equal(testChild.getRootNode(), c1.root, 'getOwnerRoot incorrect for sub-child added to element in root');
+ project.removeChild(test);
+ flush();
+ assert.equal(test.getRootNode(), test, 'getOwnerRoot incorrect for child moved from a root to no root');
+ assert.equal(testChild.getRootNode(), test, 'getOwnerRoot incorrect for sub-child moved from a root to no root');
+ project.appendChild(test);
+ flush();
+ assert.equal(test.getRootNode(), c1.root, 'getOwnerRoot incorrect for child added to element in root');
+ assert.equal(testChild.getRootNode(), c1.root, 'getOwnerRoot incorrect for sub-child added to element in root');
+ });
+
+ test('getRootNode (paper-ripple use case)', function() {
+ var test = document.createElement('div');
+ // child
+ var d = document.createElement('div');
+ test.appendChild(d);
+ var c1 = createEnabledElement('x-compose');
+ var c2 = createEnabledElement('x-compose');
+ c1.$.project.appendChild(test);
+ flush();
+ assert.equal(test.getRootNode(), c1.root, 'getOwnerRoot incorrect for child added to element in root');
+ c2.$.project.appendChild(test);
+ flush();
+ assert.equal(test.getRootNode(), c2.root, 'getOwnerRoot not correctly reset when element moved to different root');
+ c1.appendChild(test);
+ assert.equal(test.getRootNode(), c1, 'getOwnerRoot incorrect for child moved from a root to no root');
+ });
+
+ test('getDestinationInsertionPoints on non-distributable element', function() {
+ var d = document.createElement('div');
+ assert.equal(allInsertionPoints(d).length, 0);
+ assert.equal(allInsertionPoints(document).length, 0);
+ });
+
+ test('(Polymer.dom) Deep Contains', function() {
+ var el = document.querySelector('x-deep-contains');
+ var shadow = el.$.shadowed;
+ var light = el.querySelector('[slot=light]');
+ var notdistributed = el.children[1];
+ var disconnected = document.createElement('div');
+ var separate = document.createElement('div');
+ document.body.appendChild(separate);
+
+ var pd = dom(el);
+
+ assert.equal(pd.deepContains(el), true, 'Element should deepContain itself');
+ assert.equal(pd.deepContains(shadow), true, 'Shadowed Child element should be found');
+ assert.equal(pd.deepContains(light), true, 'Light Child element should be found');
+ assert.equal(pd.deepContains(notdistributed), true, 'Non-distributed child element should be found');
+ assert.equal(pd.deepContains(disconnected), false, 'Disconnected element should not be found');
+ assert.equal(pd.deepContains(separate), false, 'Unassociated, attached element should not be found');
+
+ document.body.removeChild(separate);
+ });
+
+});
+</script>
+
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/shady-events.html b/third_party/polymer3/bower_components/polymer/test/unit/shady-events.html
new file mode 100644
index 0000000..2f47d4e
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/shady-events.html
@@ -0,0 +1,273 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+<script>
+ if (!window.customElements) {
+ window.customElements = {};
+ }
+ customElements.forcePolyfill = true;
+ window.ShadyDOM = {
+ force: true
+ };
+</script>
+<script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+<script src="wct-browser-config.js"></script>
+<script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+<script type="module" src="../../polymer-legacy.js"></script>
+</head>
+<body>
+
+ <dom-module id="x-event-scoped">
+ <template>
+ <div id="scoped" on-composed="childHandler" on-scoped="childHandler"></div>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-event-scoped',
+ properties: {
+ hostEvents: {
+ type: Array,
+ value: function() {
+ return [];
+ }
+ },
+ childEvents: {
+ type: Array,
+ value: function() {
+ return [];
+ }
+ }
+ },
+ listeners: {
+ 'composed': 'hostHandler',
+ 'scoped': 'hostHandler'
+ },
+ hostHandler: function(e) {
+ this.hostEvents.push({
+ target: e.target,
+ type: e.type,
+ path: e.composedPath()
+ });
+ },
+ childHandler: function(e) {
+ this.childEvents.push({
+ target: e.target,
+ type: e.type,
+ path: e.composedPath()
+ });
+ },
+ fireComposed: function() {
+ return this.fire('composed', null, {node: this.$.scoped});
+ },
+ fireScoped: function(){
+ return this.fire('scoped', null, {node: this.$.scoped, composed: false});
+ }
+});
+</script>
+ </dom-module>
+
+ <dom-module id="x-focus">
+ <template>
+ <style>
+ :host {
+ display: block;
+ }
+ </style>
+ <div id="child" on-focus="focusHandler"></div>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-focus',
+ properties: {
+ events: {
+ type: Array,
+ value: function() {
+ return [];
+ }
+ }
+ },
+ listeners: {
+ focus: 'focusHandler'
+ },
+ focusHandler: function(e) {
+ this.events.push(e.target);
+ },
+ fireComposed: function() {
+ var ev = new Event('focus', {composed: true});
+ this.$.child.dispatchEvent(ev);
+ },
+ fireScoped: function() {
+ var ev = new Event('focus');
+ this.$.child.dispatchEvent(ev);
+ }
+});
+</script>
+ </dom-module>
+
+ <dom-module id="x-a">
+ <template>
+ <div id="child" on-foo="childFooHandler"></div>
+ <div id="child2"></div>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-a',
+ listeners: {
+ 'foo': 'fooHandler'
+ },
+ fooHandler: function(e) {
+ this.event = {target: e.target, relatedTarget: e.relatedTarget};
+ },
+ childFooHandler: function(e) {
+ this.childEvent = {target: e.target, relatedTarget: e.relatedTarget};
+ }
+});
+</script>
+ </dom-module>
+
+ <test-fixture id="scoped">
+ <template>
+ <x-event-scoped></x-event-scoped>
+ </template>
+ </test-fixture>
+
+ <test-fixture id="globalpatch">
+ <template>
+ <div></div>
+ </template>
+ </test-fixture>
+
+ <test-fixture id="focus">
+ <template>
+ <x-focus></x-focus>
+ </template>
+ </test-fixture>
+
+ <test-fixture id="relatedtarget">
+ <template>
+ <x-a id="one"></x-a>
+ <x-a id="two"></x-a>
+ </template>
+ </test-fixture>
+
+ <dom-module id="x-slot-inner">
+ </dom-module>
+
+ <test-fixture id="slot">
+ <template>
+ <x-slot>
+ <span class="target"></span>
+ </x-slot>
+ </template>
+ </test-fixture>
+
+<script type="module">
+suite('ShadyDOM event patching', function() {
+
+ test('events retarget', function() {
+ var el = fixture('scoped');
+ el.fireComposed();
+ assert.equal(el.hostEvents[0].target, el);
+ assert.equal(el.childEvents[0].target, el.$.scoped);
+ });
+
+ test('event.composedPath is consistent', function() {
+ var el = fixture('scoped');
+ el.fireComposed();
+ assert.equal(el.hostEvents.length, el.childEvents.length);
+ });
+
+ test('event patching works on non Polymer elements', function() {
+ var el = fixture('globalpatch');
+ var path;
+ el.addEventListener('foo', function(e) {
+ path = e.composedPath();
+ });
+ var e = new Event('foo', {composed: true});
+ el.dispatchEvent(e);
+ assert.deepEqual([el, el.parentNode, document.body, document.documentElement, document, window], path);
+ });
+
+ test('`composed` flag controls event propagation through roots', function() {
+ var el = fixture('scoped');
+ el.fireScoped();
+ el.fireComposed();
+ assert.equal(el.hostEvents.length, 1);
+ assert.equal(el.hostEvents[0].type, 'composed');
+ assert.equal(el.childEvents.length, 2);
+ assert.equal(el.childEvents[0].type, 'scoped');
+ assert.equal(el.childEvents[1].type, 'composed');
+ });
+
+ test('composed focus and blur events retarget up tree', function() {
+ var el = fixture('focus');
+ el.fireComposed();
+ assert.equal(el.events.length, 2);
+ assert.equal(el.events[0], el.$.child);
+ assert.equal(el.events[1], el);
+ });
+
+ test('scoped focus and blur events do not retarget', function() {
+ var el = fixture('focus');
+ var e = new Event('focus');
+ if (e.isTrused !== false) {
+ // skip browser if we cannot distinguish
+ // native focus events from user created ones
+ this.skip();
+ }
+ el.fireScoped();
+ assert.equal(el.events.length, 1);
+ assert.equal(el.events[0], el.$.child);
+ });
+
+ test('composed relatedTarget retargets', function() {
+ var els = fixture('relatedtarget');
+ var a = els[0];
+ var b = els[1];
+ var ev = new MouseEvent('foo', {bubbles: true, composed: true, relatedTarget: b.$.child});
+ a.$.child.dispatchEvent(ev);
+ assert.property(a, 'childEvent');
+ assert.deepEqual(a.childEvent, {target: a.$.child, relatedTarget: b});
+ assert.property(a, 'event');
+ assert.deepEqual(a.event, {target: a, relatedTarget: b});
+ });
+
+ test('events do not fire if relatedtarget and target are the same node after retargeting', function() {
+ var els = fixture('relatedtarget');
+ var a = els[0];
+ var ev = new MouseEvent('foo', {bubbles: true, composed: true, relatedTarget: a.$.child2});
+ a.$.child.dispatchEvent(ev);
+ assert.property(a, 'childEvent');
+ assert.deepEqual(a.childEvent, {target: a.$.child, relatedTarget: a.$.child2});
+ assert.notProperty(a, 'event');
+ });
+
+ test('capturing event listeners fire correctly for focus and blur', function() {
+ var el = fixture('focus');
+ var timeStamp;
+ el.addEventListener('focus', function(e) {
+ timeStamp = e.timeStamp;
+ }, true);
+ el.fireComposed();
+ assert.ok(timeStamp);
+ assert.equal(el.events.length, 2);
+ assert.equal(el.events[0], el.$.child);
+ assert.equal(el.events[1], el);
+ });
+
+});
+</script>
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/shady-unscoped-style-import.js b/third_party/polymer3/bower_components/polymer/test/unit/shady-unscoped-style-import.js
new file mode 100644
index 0000000..13a0029
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/shady-unscoped-style-import.js
@@ -0,0 +1,36 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+
+const $_documentContainer = document.createElement('template');
+$_documentContainer.setAttribute('style', 'display: none;');
+
+$_documentContainer.innerHTML = `<dom-module id="global-shared1">
+ <template>
+ <style shady-unscoped="">
+ :root {
+ --zug: margin: 10px;
+ }
+
+ .happy {
+ @apply --zug;
+ border: 1px solid green;
+ }
+ </style>
+
+ <style>
+ .normal {
+ border: 3px solid orange;
+ }
+ </style>
+ </template>
+</dom-module><dom-module id="global-shared2">
+</dom-module>`;
+
+document.head.appendChild($_documentContainer.content);
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/shady-unscoped-style.html b/third_party/polymer3/bower_components/polymer/test/unit/shady-unscoped-style.html
new file mode 100644
index 0000000..7f84896
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/shady-unscoped-style.html
@@ -0,0 +1,118 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+ <script type="module" src="./shady-unscoped-style-import.js"></script>
+</head>
+<body>
+
+<custom-style>
+ <style is="custom-style">
+ html {
+ --foo: {
+ padding: 10px;
+ }
+ }
+ </style>
+</custom-style>
+
+ <dom-module id="my-element">
+
+ <template>
+ <style include="global-shared1 global-shared2">
+ :host {
+ display: block;
+ }
+
+ .happy {
+ @apply --foo;
+ }
+ </style>
+ <div id="fromStyle" class="happy">Happy: green</div>
+ <div id="fromImport" class="import">Happy: yellow</div>
+ <div id="normal" class="normal">Happy: orange</div>
+ </template>
+
+ <script type="module">
+import './shady-unscoped-style-import.js';
+import { Polymer } from '../../lib/legacy/polymer-fn.js';
+Polymer({
+ is: 'my-element'
+});
+</script>
+
+ </dom-module>
+
+ <dom-module id="my-element2">
+
+ <template>
+ <style include="global-shared1">
+ :host {
+ display: block;
+ }
+
+ </style>
+ <div id="fromStyle" class="happy">Happy: green</div>
+ <div id="fromImport" class="import">Happy: yellow</div>
+ <div id="normal" class="normal">Happy: orange</div>
+ </template>
+
+ <script type="module">
+import './shady-unscoped-style-import.js';
+import { Polymer } from '../../lib/legacy/polymer-fn.js';
+Polymer({ is: 'my-element2'});
+</script>
+
+ </dom-module>
+
+ <my-element></my-element>
+ <my-element2></my-element2>
+
+<script type="module">
+import './shady-unscoped-style-import.js';
+suite('shady-unscoped styles', function() {
+
+ function assertComputed(element, value, property, pseudo) {
+ var computed = getComputedStyle(element, pseudo);
+ property = property || 'border-top-width';
+ if (Array.isArray(value)) {
+ assert.oneOf(computed[property], value, 'computed style incorrect for ' + property);
+ } else {
+ assert.equal(computed[property], value, 'computed style incorrect for ' + property);
+ }
+ }
+
+ var el1 = document.querySelector('my-element');
+ var el2 = document.querySelector('my-element2');
+
+ test('unscoped styles apply', function() {
+ assertComputed(el1.$.fromStyle, '1px');
+ assertComputed(el2.$.fromStyle, '1px');
+ });
+
+ test('shared and @apply apply when used with unscoped styles', function() {
+ assertComputed(el1.$.fromStyle, '10px', 'padding-top');
+ assertComputed(el1.$.normal, '3px');
+ assertComputed(el2.$.normal, '3px');
+ });
+
+ test('@apply does not apply under ShadyDOM for shady-unscoped styles', function() {
+ assertComputed(el1.$.fromStyle, '0px', 'margin-top');
+ assertComputed(el2.$.fromStyle, '0px', 'margin-top');
+ });
+});
+</script>
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/shady.html b/third_party/polymer3/bower_components/polymer/test/unit/shady.html
new file mode 100644
index 0000000..7dfba7b
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/shady.html
@@ -0,0 +1,479 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js" register="true" shadydom="true"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+</head>
+<body>
+<template></template>
+<script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+var template = document.querySelector('template');
+Polymer({
+ is: 'x-content-test',
+ _template: template
+});
+
+/*
+ * Test the `<slot>` element distribution algorithm by verifying the
+ * resulting composed tree structure.
+ */
+function testRender(descr, hostInnerHtml, shadowRootHtml, expectedHtml) {
+ test(descr, function() {
+ // Create an instance of the test element.
+ var host = document.createElement('x-content-test');
+ // Populate the initial pool of light DOM children.
+ host.innerHTML = hostInnerHtml;
+ document.body.appendChild(host);
+ // Pretend we're stamping the template contents.
+ if (shadowRootHtml) {
+ host.shadowRoot.innerHTML = shadowRootHtml;
+ }
+ // Invoke distribution and verify the resulting tree.
+ ShadyDOM.flush();
+ assert.strictEqual(getComposedHTML(host), expectedHtml);
+ document.body.removeChild(host);
+ });
+ test(descr + ' fragment', function() {
+ // Create an instance of the test element.
+ var host = document.createElement('x-content-test');
+ // Populate the initial pool of light DOM children.
+ host.innerHTML = hostInnerHtml;
+ document.body.appendChild(host);
+ // Pretend we're stamping the template contents.
+ var div = document.createElement('div');
+ div.innerHTML = shadowRootHtml;
+ var frag = document.createDocumentFragment();
+ while (div.firstChild) {
+ frag.appendChild(div.firstChild);
+ }
+ host.shadowRoot.appendChild(frag);
+ // Invoke distribution and verify the resulting tree.
+ ShadyDOM.flush();
+ assert.strictEqual(getComposedHTML(host), expectedHtml);
+ document.body.removeChild(host);
+ });
+}
+
+testRender('Empty shadow', 'abc', '', '');
+testRender('Simple shadow', 'abc', 'def', 'def');
+testRender('Fallback shadow', 'abc',
+ '<slot name="xxx">fallback</name>', 'fallback');
+testRender('Fallback shadow, empty host', '',
+ '<slot name="xxx">fallback</name>', 'fallback');
+testRender('Content', 'abc',
+ '<slot>fallback</slot>', 'abc');
+testRender('Content before', 'abc',
+ 'before<slot>fallback</slot>', 'beforeabc');
+testRender('Content after', 'abc',
+ '<slot>fallback</slot>after', 'abcafter');
+
+suite('render content', function() {
+ testRender('no select', '<a href="">Link</a> <b>bold</b>',
+ '<slot></slot>',
+ '<a href="">Link</a> <b>bold</b>');
+ testRender('select ""', '<a href="">Link</a> <b>bold</b>',
+ '<slot></slot>',
+ '<a href="">Link</a> <b>bold</b>');
+
+ testRender('slot a',
+ '<a slot="a">a</a> <a slot="b">b</a>',
+ '<slot name="a"></slot>',
+ '<a slot="a">a</a>');
+
+ testRender('slot b a',
+ '<a slot="a">a</a> <a slot="b">b</a>',
+ '<slot name="b"></slot><slot name="a"></slot>',
+ '<a slot="b">b</a><a slot="a">a</a>');
+
+ testRender('slot b a 2',
+ '<a slot="a">a</a> <a slot="b">b</a> <a slot="b">c</a>',
+ '<slot name="b"></slot><slot name="a"></slot>',
+ '<a slot="b">b</a><a slot="b">c</a><a slot="a">a</a>');
+
+ testRender('slot c catchall',
+ '<span>a</span><span>b</span><span slot="c">c</span><span>d</span>',
+ '<slot name="c"></slot><slot></slot>',
+ '<span slot="c">c</span><span>a</span><span>b</span><span>d</span>');
+});
+
+
+test('Reproject', function() {
+ var host = document.createElement('x-content-test');
+ document.body.appendChild(host);
+ host.innerHTML = '<a></a>';
+ // pre-distirbution grab first composed node.
+ var a = getComposedChildAtIndex(host, 0);
+
+ host.shadowRoot.innerHTML = '<x-content-test id="p"></x-content-test>';
+ // force upgrade on polyfilled browsers
+ var p = host.shadowRoot.firstChild;
+ p.innerHTML = '<b slot="b"></b><slot slot="a"></slot>';
+ var b = p.firstChild;
+ var content = p.lastChild;
+
+ p.shadowRoot.innerHTML =
+ 'a: <slot name="a"></slot>b: <slot name="b"></slot>';
+ var textNodeA = p.shadowRoot.firstChild;
+ var contentA = p.shadowRoot.childNodes[1];
+ var textNodeB = p.shadowRoot.childNodes[2];
+ var contentB = p.shadowRoot.childNodes[3];
+
+ function testRender() {
+ ShadyDOM.flush();
+ assert.strictEqual(getComposedHTML(host),
+ '<x-content-test id="p">a: <a></a>b: <b slot="b"></b></x-content-test>');
+
+ assertArrayEqual(host.childNodes, [a]);
+ assert.strictEqual(a.parentNode, host);
+ assertArrayEqual(host.shadowRoot.childNodes, [p]);
+ assert.strictEqual(p.parentNode, host.shadowRoot);
+ assertArrayEqual(p.childNodes, [b, content]);
+ assert.strictEqual(b.parentNode, p);
+ assert.strictEqual(content.parentNode, p);
+ assertArrayEqual(p.shadowRoot.childNodes,
+ [textNodeA, contentA, textNodeB, contentB]);
+ }
+
+ testRender();
+ testRender();
+ document.body.removeChild(host);
+});
+
+
+suite('Mutate light DOM', function() {
+ var host;
+
+ setup(function() {
+ host = document.createElement('x-content-test');
+ document.body.appendChild(host);
+ });
+
+ teardown(function() {
+ document.body.removeChild(host);
+ });
+
+ test('removeAllChildNodes - mutate host', function() {
+ host.innerHTML = '<a>Hello</a>';
+
+ host.shadowRoot.innerHTML = '<slot>fallback</slot>';
+ ShadyDOM.flush();
+ assert.strictEqual(getComposedHTML(host), '<a>Hello</a>');
+
+ host.firstChild.textContent = '';
+ ShadyDOM.flush();
+ assert.strictEqual(getComposedHTML(host), '<a></a>');
+
+ host.innerHTML = '';
+ ShadyDOM.flush();
+ assert.strictEqual(getComposedHTML(host), 'fallback');
+ });
+
+
+ test('removeAllChildNodes - mutate shadow', function() {
+ host.innerHTML = '<a>Hello</a>';
+
+ host.shadowRoot.innerHTML = '<slot></slot><b>after</b>';
+ ShadyDOM.flush();
+ assert.strictEqual(getComposedHTML(host), '<a>Hello</a><b>after</b>');
+
+ host.shadowRoot.childNodes[1].textContent = '';
+ ShadyDOM.flush();
+ assert.strictEqual(getComposedHTML(host), '<a>Hello</a><b></b>');
+
+ host.shadowRoot.innerHTML = '';
+ ShadyDOM.flush();
+ assert.strictEqual(getComposedHTML(host), '');
+ });
+
+ test('removeAllChildNodes - mutate shadow fallback', function() {
+ host.innerHTML = '<a>Hello</a>';
+
+ host.shadowRoot.innerHTML = '<slot name="xxx"><b>fallback</b></slot>';
+ var b = host.shadowRoot.firstChild.firstChild;
+ ShadyDOM.flush();
+ assert.strictEqual(getComposedHTML(host), '<b>fallback</b>');
+
+ b.textContent = '';
+ ShadyDOM.flush();
+ assert.strictEqual(getComposedHTML(host), '<b></b>');
+
+ host.shadowRoot.firstChild.innerHTML = '';
+ ShadyDOM.flush();
+ assert.strictEqual(getComposedHTML(host), '');
+
+ host.shadowRoot.innerHTML = '';
+ ShadyDOM.flush();
+ assert.strictEqual(getComposedHTML(host), '');
+ });
+
+ test('removeChild - mutate host', function() {
+ host.innerHTML = '<a>Hello</a>';
+
+ host.shadowRoot.innerHTML = '<slot>fallback</slot>';
+ ShadyDOM.flush();
+ assert.strictEqual(getComposedHTML(host), '<a>Hello</a>');
+
+ host.firstChild.removeChild(host.firstChild.firstChild);
+ ShadyDOM.flush();
+ assert.strictEqual(getComposedHTML(host), '<a></a>');
+
+ host.innerHTML = '';
+ ShadyDOM.flush();
+ assert.strictEqual(getComposedHTML(host), 'fallback');
+ });
+
+ test('removeChild - mutate host 2', function() {
+ host.innerHTML = '<a></a><b></b>';
+ var a = getComposedChildAtIndex(host, 0);
+ var b = getComposedChildAtIndex(host, 1);
+
+ host.shadowRoot.innerHTML = '<slot>fallback</slot>';
+ ShadyDOM.flush();
+ assert.strictEqual(getComposedHTML(host), '<a></a><b></b>');
+
+ host.removeChild(b);
+ ShadyDOM.flush();
+ assert.strictEqual(getComposedHTML(host), '<a></a>');
+
+ host.removeChild(a);
+ ShadyDOM.flush();
+ assert.strictEqual(getComposedHTML(host), 'fallback');
+ });
+
+ test('removeChild - mutate shadow', function() {
+ host.innerHTML = '<a>Hello</a>';
+
+ host.shadowRoot.innerHTML = '<slot></slot><b>after</b>';
+ var b = host.shadowRoot.lastChild;
+ ShadyDOM.flush();
+ assert.strictEqual(getComposedHTML(host), '<a>Hello</a><b>after</b>');
+
+ b.removeChild(b.firstChild);
+ ShadyDOM.flush();
+ assert.strictEqual(getComposedHTML(host), '<a>Hello</a><b></b>');
+
+ host.shadowRoot.removeChild(b);
+ ShadyDOM.flush();
+ assert.strictEqual(getComposedHTML(host), '<a>Hello</a>');
+
+ host.shadowRoot.removeChild(host.shadowRoot.firstChild);
+ ShadyDOM.flush();
+ assert.strictEqual(getComposedHTML(host), '');
+ });
+
+ test('setAttribute slot', function() {
+ host.innerHTML = '<a slot="a">Hello</a><b slot="b">World</b>';
+
+
+ host.shadowRoot.innerHTML = '<slot name="b">fallback b</slot>' +
+ '<slot name="a">fallback a</slot>';
+ ShadyDOM.flush();
+ assert.strictEqual(getComposedHTML(host), '<b slot="b">World</b><a slot="a">Hello</a>');
+
+ host.shadowRoot.firstChild.setAttribute('name', 'xxx');
+ ShadyDOM.flush();
+ assert.strictEqual(getComposedHTML(host), 'fallback b<a slot="a">Hello</a>');
+
+ host.shadowRoot.firstChild.setAttribute('name', '');
+ host.shadowRoot.lastChild.setAttribute('name', '');
+ ShadyDOM.flush();
+ assert.strictEqual(getComposedHTML(host), 'fallback bfallback a');
+ });
+
+ test('appendChild - mutate host', function() {
+ host.innerHTML = '<a>Hello</a>';
+ host.shadowRoot.innerHTML = '<slot></slot>';
+ ShadyDOM.flush();
+ assert.strictEqual(getComposedHTML(host), '<a>Hello</a>');
+
+ var b = document.createElement('b');
+ host.appendChild(b);
+ ShadyDOM.flush();
+ assert.strictEqual(getComposedHTML(host), '<a>Hello</a><b></b>');
+ });
+
+ test('appendChild - mutate shadow', function() {
+ host.innerHTML = '<a>Hello</a>';
+ host.shadowRoot.innerHTML = '<slot></slot>';
+ ShadyDOM.flush();
+ assert.strictEqual(getComposedHTML(host), '<a>Hello</a>');
+
+ var b = document.createElement('b');
+ host.shadowRoot.appendChild(b);
+ ShadyDOM.flush();
+ assert.strictEqual(getComposedHTML(host), '<a>Hello</a><b></b>');
+ });
+
+ test('insertBefore - mutate host', function() {
+ host.innerHTML = '<a>Hello</a>';
+ var a = getComposedChildAtIndex(host, 0);
+ host.shadowRoot.innerHTML = '<slot></slot>';
+ ShadyDOM.flush();
+ assert.strictEqual(getComposedHTML(host), '<a>Hello</a>');
+
+ var b = document.createElement('b');
+ host.insertBefore(b, a);
+ ShadyDOM.flush();
+ assert.strictEqual(getComposedHTML(host), '<b></b><a>Hello</a>');
+ });
+
+ test('insertBefore - mutate shadow', function() {
+ host.innerHTML = '<a>Hello</a>';
+
+
+ host.shadowRoot.innerHTML = '<slot></slot>';
+ var content = host.shadowRoot.firstChild;
+ ShadyDOM.flush();
+ assert.strictEqual(getComposedHTML(host), '<a>Hello</a>');
+
+ var b = document.createElement('b');
+ host.shadowRoot.insertBefore(b, content);
+ ShadyDOM.flush();
+ assert.strictEqual(getComposedHTML(host), '<b></b><a>Hello</a>');
+ });
+
+ test('replaceChild - mutate host', function() {
+ host.innerHTML = '<a>Hello</a>';
+ host.shadowRoot.innerHTML = '<slot></slot>';
+ ShadyDOM.flush();
+ assert.strictEqual(getComposedHTML(host), '<a>Hello</a>');
+ var b = document.createElement('b');
+ host.replaceChild(b, host.firstChild);
+ ShadyDOM.flush();
+ assert.strictEqual(getComposedHTML(host), '<b></b>');
+ });
+
+ test('replaceChild - mutate shadow', function() {
+ host.innerHTML = '<a>Hello</a>';
+ host.shadowRoot.innerHTML = '<slot></slot>';
+ var content = host.shadowRoot.firstChild;
+ ShadyDOM.flush();
+ assert.strictEqual(getComposedHTML(host), '<a>Hello</a>');
+ var b = document.createElement('b');
+ host.shadowRoot.replaceChild(b, content);
+ ShadyDOM.flush();
+ assert.strictEqual(getComposedHTML(host), '<b></b>');
+ });
+
+ test('querySelectorAll (shadowRoot)', function() {
+ host.innerHTML = '<div id="main"></div>';
+ host.shadowRoot.innerHTML = '<slot></slot><span id="main"></span>' +
+ '<x-content-test></x-content-test>';
+ // force upgrade on polyfilled browsers
+ ShadyDOM.flush();
+ var hostLocalMain = getComposedChildAtIndex(host.shadowRoot, 1);
+ var child = getComposedChildAtIndex(host.shadowRoot, 100);
+ child.innerHTML = '<div id="sub"></div>';
+ var childLightSub = getComposedChildAtIndex(child, 0);
+ child.shadowRoot.innerHTML = '<slot></slot><span id="sub"></span>';
+ var childLocalSub = child.shadowRoot.lastChild;
+ ShadyDOM.flush();
+ assert.deepEqual(host.root.querySelectorAll('span#main'), [hostLocalMain]);
+ assert.deepEqual(host.root.querySelectorAll('div#sub'), [childLightSub]);
+ assert.deepEqual(child.root.querySelectorAll('span#sub'), [childLocalSub]);
+ });
+
+ test('querySelectorAll (light dom)', function() {
+ host.innerHTML = '<div id="main"></div>';
+ var hostLightMain = getComposedChildAtIndex(host, 0);
+ host.shadowRoot.innerHTML = '<slot></slot><span id="main"></span>' +
+ '<x-content-test></x-content-test>';
+ var child = getComposedChildAtIndex(host.shadowRoot, 100);
+ child.innerHTML = '<div id="sub"></div>';
+ var childLightSub = getComposedChildAtIndex(child, 100) ;
+ child.shadowRoot.innerHTML = '<slot></slot><span id="sub"></span>';
+ ShadyDOM.flush();
+ assert.deepEqual(host.querySelectorAll('div#main'), [hostLightMain]);
+ assert.deepEqual(host.querySelectorAll('#sub'), []);
+ assert.deepEqual(child.querySelectorAll('div#sub'), [childLightSub]);
+ });
+
+});
+
+suite('Add shadowRoot to element with childNodes', function() {
+
+ var el;
+
+ setup(function() {
+ el = document.createElement('div');
+ el.testHTML = '<div slot="a">hi</div>';
+ el.innerHTML = el.testHTML;
+ el.attachShadow({mode: 'open'});
+ });
+
+ test('empty root', function() {
+ ShadyDOM.flush();
+ assert.equal(getComposedHTML(el), '');
+ });
+
+ test('simple root', function() {
+ var shadow = '<div>shadow</div>';
+ el.shadowRoot.innerHTML = shadow;
+ ShadyDOM.flush();
+ assert.equal(getComposedHTML(el), shadow);
+ });
+
+ test('slot matching', function() {
+ var shadow = '<div><slot name="a"></slot></div>';
+ el.shadowRoot.innerHTML = shadow;
+ ShadyDOM.flush();
+ assert.equal(getComposedHTML(el), '<div>' + el.testHTML + '</div>');
+ });
+
+ test('slot not matching', function() {
+ var shadow = '<div><slot name="b"></slot></div>';
+ el.shadowRoot.innerHTML = shadow;
+ ShadyDOM.flush();
+ assert.equal(getComposedHTML(el), '<div></div>');
+ });
+
+});
+
+function getEffectiveChildNodes(node) {
+ var list = [];
+ var c$ = node.childNodes;
+ for (var i=0, l=c$.length, c; (i<l) && (c=c$[i]); i++) {
+ if (c.localName && (c.localName === 'content' || c.localName === 'slot')) {
+ list = list.concat(c.assignedNodes({flatten: true}));
+ } else {
+ list.push(c);
+ }
+ }
+ return list;
+}
+
+function getComposedHTML(node) {
+ return ShadyDOM.nativeTree.innerHTML(node);
+}
+
+function getComposedChildAtIndex(node, index) {
+ var c$ = getEffectiveChildNodes(node);
+ if (c$) {
+ index = index || 0;
+ index = Math.max(0, Math.min(index, c$.length-1));
+ return c$[index];
+ }
+}
+
+function assertArrayEqual(a, b, msg) {
+ assert.equal(a.length, b.length, msg);
+ for (var i = 0; i < a.length; i++) {
+ assert.equal(a[i], b[i], msg);
+ }
+}
+</script>
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/styling-cross-scope-apply.html b/third_party/polymer3/bower_components/polymer/test/unit/styling-cross-scope-apply.html
new file mode 100644
index 0000000..d699490
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/styling-cross-scope-apply.html
@@ -0,0 +1,668 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+</head>
+<body>
+
+ <x-scope></x-scope>
+
+ <dom-module id="story-card">
+ <template>
+ <style>
+ :host {
+ display: block;
+ }
+
+ #story-card .story-content {
+ font-family: 'Roboto', sans-serif;
+ font-size: 1.2em;
+ @apply --story-content;
+ }
+ </style>
+
+ <div id="story-card">
+ <div class="story-content" id="content">Content</div>
+ </div>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'story-card'});
+</script>
+ </dom-module>
+
+ <dom-module id="x-child-scope">
+ <template>
+ <style>
+ :host {
+ display: block;
+
+ --mixin2: {
+ border: 3px solid seagreen;
+ background: url(http://www.google.com/icon.png);
+ };
+ }
+
+ #mixin1 {
+ @apply --mixin1;
+ }
+
+ #mixin2 {
+ @apply --mixin2;
+ }
+
+ #mixin3 {
+ padding: 3px;
+ @apply --mixin3;
+ }
+
+ #mixin4 {
+ @apply --mixin4;
+ }
+
+ #mixin6 {
+ @apply --mixin6
+ }
+
+ #mixin7 {@apply --mixin7}
+
+ #mixin8 {
+ @apply --mixin8
+ }
+
+ #mixin9 {
+ @apply --mixin9
+ }
+ </style>
+
+ <div id="mixin1">mixin1</div>
+ <div id="mixin2">mixin2</div>
+ <div id="mixin3">mixin3</div>
+ <div id="mixin4">mixin4</div>
+ <div id="mixin6">mixin6</div>
+ <div id="mixin7">mixin7</div>
+ <div id="mixin8">mixin8</div>
+ <div id="mixin9">mixin9</div>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-child-scope'});
+</script>
+ </dom-module>
+
+ <dom-module id="x-keyframes">
+ <template>
+ <style>
+ :host {
+ display: block;
+ position: relative;
+ border: 10px solid blue;
+ left: 0px;
+ /* Prefix required by Safari <= 8 */
+ -webkit-animation-duration: 0.3s;
+ animation-duration: 0.3s;
+ -webkit-animation-fill-mode: forwards;
+ animation-fill-mode: forwards;
+ }
+
+ :host([animated]) {
+ /* Prefix required by Safari <= 8 */
+ -webkit-animation-name: x-keyframes-animation;
+ animation-name: x-keyframes-animation;
+ }
+
+ /* Prefix required by Safari <= 8 */
+ @-webkit-keyframes x-keyframes-animation {
+ 0% {
+ left: var(--c1);
+ }
+
+ 100% {
+ left: var(--c2);
+ @apply --keyframe-finish;
+ }
+ }
+ @keyframes x-keyframes-animation {
+ 0% {
+ left: var(--c1);
+ }
+
+ 100% {
+ left: var(--c2);
+ @apply --keyframe-finish;
+ }
+ }
+ </style>
+ x-keyframes
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-keyframes',
+ properties: {
+ animated: {
+ type: Boolean,
+ value: false,
+ reflectToAttribute: true
+ }
+ }
+});
+</script>
+ </dom-module>
+
+ <dom-module id="x-scope">
+ <template>
+ <style>
+ :host {
+ display: block;
+ padding: 8px;
+
+ --override-me: {
+ border: 11px solid black;
+ };
+
+ --mixin1: {
+ border: 1px solid black;
+ };
+
+ --b: 2px solid orange;
+
+ --m1: 1px;
+ --m2: 2px;
+
+ --c1: 5px;
+ --c2: 10px;
+
+ --mixin2: {
+ border: var(--b);
+ };
+
+ --mixin3: {
+ @apply --mixin2;
+ };
+
+ --mixin4: {
+ padding: 2px;
+ @apply --mixin3;
+ margin: var(--m2);
+ };
+
+ --mixin5: {
+ border: calc(var(--c1) + var(--c2)) solid orange;
+ };
+
+ --mixin6: {
+ border: 16px solid orange;
+ };
+
+ --mixin7: {
+ border: 17px solid navy;
+ };
+
+ --mixin8: {
+ border: 17px dotted navy;
+ };
+
+ --mixin9: var(--mixin8);
+ }
+
+ #mixin1 {
+ @apply --mixin1;
+ }
+
+ #mixin2 {
+ @apply --mixin2;
+ }
+
+ #mixin3 {
+ padding: 1px;
+ margin: var(--m1);
+ @apply --mixin3;
+ }
+
+ #mixin4 {
+ @apply --mixin4;
+ }
+
+ #mixin5 {
+ @apply --mixin5;
+ }
+
+ #keyframes2 {
+ --keyframe-finish: {
+ left: 20px;
+ };
+ }
+
+ x-child-scope {
+ padding: 10px;
+ }
+
+ #card {
+ --story-content: {
+ border: 11px solid orange;
+ };
+ }
+
+ #override {
+ @apply --override-me;
+ border: 19px solid steelblue;
+ }
+
+ </style>
+
+ <div id="mixin1">mixin1</div>
+ <div id="mixin2">mixin2</div>
+ <div id="mixin3">mixin3</div>
+ <div id="mixin4">mixin4</div>
+ <div id="mixin5">mixin5</div>
+ <hr>
+ <x-keyframes id="keyframes1"></x-keyframes>
+ <x-keyframes id="keyframes2"></x-keyframes>
+ <x-child-scope id="child"></x-child-scope>
+ <story-card id="card"></story-card>
+ <div id="override">override</div>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-scope'});
+</script>
+ </dom-module>
+
+ <dom-module id="x-var-produce-via-consume">
+ <template>
+ <style>
+ :host {
+ display: block;
+ border: 10px solid orange;
+ --foo: {
+ color: var(--bar);
+ }
+ }
+ </style>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-var-produce-via-consume'
+});
+</script>
+</dom-module>
+
+<dom-module id="x-cache-child">
+ <template>
+ <style>
+ :host {
+ display: block;
+ color: var(--foo);
+ @apply --bar;
+ }
+ </style>
+ X
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-cache-child'
+});
+</script>
+</dom-module>
+
+<dom-module id="x-cache-host-1">
+ <template>
+ <style>
+ :host {
+ display: block;
+ --foo: blue;
+ --bar: {
+ border: 10px solid black;
+ };
+ }
+ </style>
+ <x-cache-child id="child"></x-bad-child>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-cache-host-1'
+});
+</script>
+</dom-module>
+
+<dom-module id="x-cache-host-2">
+ <template>
+ <style>
+ :host {
+ display: block;
+ --foo: blue;
+ --bar: {
+ border: 1px dotted green;
+ };
+ }
+ </style>
+ <x-cache-child id="child"></x-bad-child>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-cache-host-2'
+});
+</script>
+</dom-module>
+
+<dom-module id="x-no-paren-apply-only">
+ <template>
+ <style>
+ :host {
+ --bar: {
+ border: 2px solid green;
+ }
+ }
+ #child {
+ @apply --bar;
+ }
+ </style>
+ <div id="child">X</div>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-no-paren-apply-only'
+});
+</script>
+</dom-module>
+
+<dom-module id="x-redefine-three">
+ <template>
+ <style>
+ div {
+ @apply --redefine;
+ }
+ </style>
+ <div id="div"></div>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-redefine-three'});
+</script>
+</dom-module>
+
+<dom-module id="x-redefine-two">
+ <template>
+ <style>
+ x-redefine-three {
+ --redefine: {
+ border: 2px solid gray;
+ };
+ }
+ </style>
+ <x-redefine-three id="three"></x-redefine-three>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-redefine-two'});
+</script>
+</dom-module>
+
+<dom-module id="x-redefine-one">
+ <template>
+ <style>
+ x-redefine-two {
+ --redefine: {
+ height: 100px;
+ width: 100px;
+ };
+ }
+ </style>
+ <x-redefine-two id="two"></x-redefine-two>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-redefine-one'});
+</script>
+</dom-module>
+
+<dom-module id="order-child">
+ <template>
+ <style>
+ div {
+ @apply --order-mixin;
+ }
+ </style>
+ <div id="target"></div>
+ </template>
+</dom-module>
+
+<dom-module id="order-parent">
+ <template>
+ <style>
+ order-child {
+ --order-mixin: {
+ border: 10px solid black;
+ };
+ }
+ </style>
+ <order-child id="child"></order-child>
+ </template>
+</dom-module>
+
+<dom-module id="order-gp">
+ <template>
+ <style>
+ order-child {
+ --order-mixin: {
+ };
+ }
+ </style>
+ <order-child id="child"></order-child>
+ <order-parent id="parent"></order-parent>
+ </template>
+</dom-module>
+
+<script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'order-child'});
+Polymer({is: 'order-parent'});
+Polymer({is: 'order-gp'});
+</script>
+<script type="module">
+import { flush } from '../../lib/utils/flush.js';
+suite('scoped-styling-apply', function() {
+ function assertComputed(element, value, property) {
+ var computed = getComputedStyle(element);
+ property = property || 'border-top-width';
+ assert.equal(computed[property], value, 'computed style incorrect for ' + property);
+ }
+
+ var styled = document.querySelector('x-scope');
+
+ test('variable mixins calculated correctly and inherit', function() {
+ if (!window.ShadyCSS || ShadyCSS.nativeCss) {
+ this.skip();
+ }
+ var suffix = window.ShadyCSS.ApplyShim._separator + 'border';
+ var e = styled;
+ let mixin1 = ShadyCSS.ScopingShim.getComputedStyleValue(e, '--mixin1' + suffix);
+ let mixin2 = ShadyCSS.ScopingShim.getComputedStyleValue(e, '--mixin2' + suffix);
+ let mixin3 = ShadyCSS.ScopingShim.getComputedStyleValue(e, '--mixin3' + suffix);
+ let mixin4 = ShadyCSS.ScopingShim.getComputedStyleValue(e, '--mixin4' + suffix);
+ e = styled.$.child;
+ let cmixin1 = ShadyCSS.ScopingShim.getComputedStyleValue(e, '--mixin1' + suffix);
+ let cmixin2 = ShadyCSS.ScopingShim.getComputedStyleValue(e, '--mixin2' + suffix);
+ let cmixin3 = ShadyCSS.ScopingShim.getComputedStyleValue(e, '--mixin3' + suffix);
+ let cmixin4 = ShadyCSS.ScopingShim.getComputedStyleValue(e, '--mixin4' + suffix);
+ assert.equal(mixin1, cmixin1);
+ assert.equal(mixin2, cmixin2);
+ assert.equal(mixin3, cmixin3);
+ assert.equal(mixin4, cmixin4);
+ });
+
+ test('variable mixins apply', function() {
+ assertComputed(styled.$.mixin1, '1px');
+ assertComputed(styled.$.mixin2, '2px');
+ assertComputed(styled.$.mixin3, '2px');
+ assertComputed(styled.$.mixin3, '1px', 'padding-top');
+ assertComputed(styled.$.mixin3, '1px', 'margin-top');
+ assertComputed(styled.$.mixin4, '2px');
+ assertComputed(styled.$.mixin4, '2px', 'padding-top');
+ assertComputed(styled.$.mixin4, '2px', 'margin-top');
+ });
+
+ test('mixins apply with url values', function() {
+ var url = 'http://www.google.com/icon.png';
+ var e = styled.$.child;
+ var actual, unescaped, propertyName;
+ if (window.ShadyCSS && ShadyCSS.nativeCssApply) {
+ actual = getComputedStyle(e).getPropertyValue('--mixin2');
+ // if strings aren't used in the url, getPropertyValue will escape the string, which breaks assert.include
+ unescaped = actual.replace(/\\/g, '');
+ assert.include(unescaped, url);
+ } else if (!window.ShadyCSS || ShadyCSS.nativeCss) {
+ propertyName = '--mixin2' + window.ShadyCSS.ApplyShim._separator + 'background';
+ actual = getComputedStyle(e).getPropertyValue(propertyName);
+ // if strings aren't used in the url, getPropertyValue will escape the string, which breaks assert.include
+ unescaped = actual.replace(/\\/g, '');
+ assert.include(unescaped, url);
+ } else {
+ propertyName = '--mixin2';
+ actual = ShadyCSS.ScopingShim.getComputedStyleValue(e, propertyName);
+ unescaped = actual.replace(/\\/g, '');
+ assert.include(unescaped, url);
+ }
+ });
+
+ test('variable mixins inherit and override', function() {
+ var e = styled.$.child;
+ assertComputed(e.$.mixin1, '1px');
+ assertComputed(e.$.mixin2, '3px');
+ assertComputed(e.$.mixin3, '2px');
+ assertComputed(e.$.mixin3, '3px', 'padding-top');
+ assertComputed(e.$.mixin4, '2px');
+ assertComputed(e.$.mixin4, '2px', 'padding-top');
+ assertComputed(e.$.mixin4, '2px', 'margin-top');
+ });
+
+ test('calc can be used in mixins', function() {
+ assertComputed(styled.$.mixin5, '15px');
+ });
+
+ test('mixins work with selectors that contain element name', function() {
+ assertComputed(styled.$.card.$.content, '11px');
+ });
+
+ test('mixins with trailing new line or } apply', function() {
+ assertComputed(styled.$.child.$.mixin6, '16px');
+ assertComputed(styled.$.child.$.mixin7, '17px');
+ });
+
+ test('mixins with new `@apply --foo` syntax', function() {
+ assertComputed(styled.$.child.$.mixin8, '17px');
+ });
+
+ test('mixins can be realiased with var()', function() {
+ assertComputed(styled.$.child.$.mixin9, '17px');
+ });
+
+ test('mixins apply to @keyframe rules', function(done) {
+ if (navigator.userAgent.match('Edge') && (!window.ShadyCSS || window.ShadyCSS.nativeCss)) {
+ // skip test due to missing variable support in keyframes
+ // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/12084341/
+ this.skip();
+ }
+ var xKeyframes1 = styled.$.keyframes1;
+ var xKeyframes2 = styled.$.keyframes2;
+ var completed = 0;
+
+ [xKeyframes1, xKeyframes2].forEach(function(xKeyframes, index) {
+ var target = index === 0 ? '10px' : '20px';
+ var onAnimationEnd = function() {
+ assert.include(xKeyframes.getComputedStyleValue('left'), target, xKeyframes.id);
+
+ xKeyframes.removeEventListener('animationend', onAnimationEnd);
+ xKeyframes.removeEventListener('webkitAnimationEnd', onAnimationEnd);
+ xKeyframes.animated = false;
+ if (++completed > 1) {
+ done();
+ }
+ };
+
+ xKeyframes.addEventListener('animationend', onAnimationEnd);
+ xKeyframes.addEventListener('webkitAnimationEnd', onAnimationEnd);
+
+ xKeyframes.animated = true;
+ });
+ });
+
+ test('producing a var that consumes another var preserves static styling', function() {
+ var d = document.createElement('x-var-produce-via-consume');
+ document.body.appendChild(d);
+ assertComputed(d, '10px');
+ });
+
+ test('producing a var that consumes results in static and not dynamic stylesheet', function() {
+ var d = document.createElement('x-var-produce-via-consume');
+ document.body.appendChild(d);
+ var styleRoot = (!window.ShadyDOM || !ShadyDOM.isShadyRoot(d.shadowRoot)) ? d.shadowRoot : document.head;
+ var selector = window.ShadyDOM ? 'style[scope~=x-var-produce-via-consume]' : 'style';
+ var staticStyle = styleRoot.querySelector(selector);
+ assert.ok(staticStyle);
+ assert.match(staticStyle.textContent, /display/, 'static style does not contain style content');
+ assert.equal(styleRoot.querySelectorAll(selector).length, 1);
+ });
+
+ test('mixin values can be overridden by subsequent concrete properties', function() {
+ assertComputed(styled.$.override, '19px');
+ });
+
+ test('@apply without parens is included in style cache behavior', function() {
+ var e1 = document.createElement('x-cache-host-1');
+ var e2 = document.createElement('x-cache-host-2');
+ document.body.appendChild(e1);
+ document.body.appendChild(e2);
+ flush();
+ assertComputed(e1.$.child, '10px');
+ assertComputed(e2.$.child, '1px');
+ });
+
+ test('@apply without parens triggers property shim', function() {
+ var e = document.createElement('x-no-paren-apply-only');
+ document.body.appendChild(e);
+ flush();
+ assertComputed(e.$.child, '2px');
+ });
+
+ test('mixin redefinition resets old properties', function() {
+ var e = document.createElement('x-redefine-one');
+ document.body.appendChild(e);
+ flush();
+ var div = e.$.two.$.three.$.div;
+ assertComputed(div, '2px');
+ assertComputed(div, '0px', 'height');
+ });
+
+ test('mixin redefinition applies to complicated hierarchies', function() {
+ var e = document.createElement('order-gp');
+ document.body.appendChild(e);
+ flush();
+ var childDiv = e.$.child.$.target;
+ var parentDiv = e.$.parent.$.child.$.target;
+ assertComputed(childDiv, '0px');
+ assertComputed(parentDiv, '10px');
+ });
+});
+</script>
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/styling-cross-scope-unknown-host.html b/third_party/polymer3/bower_components/polymer/test/unit/styling-cross-scope-unknown-host.html
new file mode 100644
index 0000000..6583b84
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/styling-cross-scope-unknown-host.html
@@ -0,0 +1,129 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+</head>
+<body>
+ <custom-style>
+ <style is="custom-style">
+ unknown-host {
+ display: block;
+ }
+
+ html {
+ --border: 2px solid steelblue;
+ --mixin: {
+ color: blue;
+ };
+ }
+ </style>
+ </custom-style>
+
+ <script type="module">
+'use strict';
+class UnknownHost extends HTMLElement {
+ constructor() {
+ super();
+ this.attachShadow({mode: 'open'});
+ }
+}
+customElements.define('unknown-host', UnknownHost);
+</script>
+
+ <dom-module id="x-foo">
+ <template>
+ <style>
+ :host {
+ border: var(--border);
+ display: block;
+ @apply --mixin;
+ }
+ </style>
+ x-foo
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-foo'
+});
+</script>
+ </dom-module>
+
+ <dom-module id="x-nest">
+ <template>
+ <style>
+ :host {
+ --border: 4px solid tomato;
+ }
+ </style>
+ <unknown-host id="unknown"></unknown-host>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-nest',
+
+ attached: function() {
+ this.$.unknown.shadowRoot.appendChild(document.createElement('x-foo'));
+ }
+});
+</script>
+ </dom-module>
+
+ <script type="module">
+suite('scoped-styling-unknown-host', function() {
+
+ function assertComputed(element, value, pseudo) {
+ var computed = getComputedStyle(element, pseudo);
+ assert.equal(computed['border-top-width'], value, 'computed style incorrect');
+ }
+
+ /* eslint-disable no-unused-vars */
+ function assertStylePropertyValue(properties, name, includeValue) {
+ assert.property(properties, name);
+ assert.include(properties[name], includeValue);
+ }
+ /* eslint-enable no-unused-vars */
+
+ test('element in top level unknown host styled via property defaults', function() {
+ var host = document.createElement('unknown-host');
+ var foo = document.createElement('x-foo');
+ host.shadowRoot.appendChild(foo);
+ document.body.appendChild(host);
+ if (window.ShadyDOM) {
+ ShadyDOM.flush();
+ }
+ assertComputed(foo, '2px');
+ });
+
+ test('element in unknown host styled via containing polymer element', function() {
+ var n = document.createElement('x-nest');
+ document.body.appendChild(n);
+ if (window.ShadyDOM) {
+ ShadyDOM.flush();
+ }
+ if (window.customElements.flush) {
+ customElements.flush();
+ }
+ var foo = n.$.unknown.shadowRoot.querySelector('x-foo');
+ assertComputed(foo, '4px');
+ });
+
+});
+</script>
+
+
+</body>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/styling-cross-scope-var.html b/third_party/polymer3/bower_components/polymer/test/unit/styling-cross-scope-var.html
new file mode 100644
index 0000000..41ec306
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/styling-cross-scope-var.html
@@ -0,0 +1,1090 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+ <style>
+ .variable-override {
+ border-top-width: 10px;
+ }
+</style>
+</head>
+<body>
+
+ <simple-element></simple-element>
+ <simple-element></simple-element>
+
+ <x-scope></x-scope>
+
+ <dom-module id="x-grand-child-scope">
+ <template>
+ <style>
+ :host {
+ display: block;
+ padding: 8px;
+ }
+
+ #scope {
+ border: var(--scope-var);
+ }
+
+ #child {
+ border: var(--child-scope-var);
+ }
+
+ #me {
+ border: var(--grand-child-scope-var);
+ }
+
+ </style>
+ <div id="me">x-grand-child-scope</div>
+ <div id="scope">From x-scope</div>
+ <div id="child">From x-child-scope</div>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-grand-child-scope'});
+</script>
+ </dom-module>
+
+ <dom-module id="x-host-property">
+ <template>
+ <style>
+ :host {
+ display: block;
+ padding: 8px;
+ border: var(--scope-var);
+ }
+
+ :host(.foo) {
+ border: var(--scope-var-foo);
+ }
+ </style>
+ Host property
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-host-property'});
+</script>
+ </dom-module>
+
+ <dom-module id="x-host-host-property">
+ <template>
+ <x-host-property id="hosted"></x-host-property>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-host-host-property'});
+</script>
+ </dom-module>
+
+ <dom-module id="x-produce-use-property">
+ <template>
+ <style>
+ :host {
+ --scope-var: 6px solid steelblue;
+ --scope-var-foo: 8px solid steelblue;
+ }
+ </style>
+ <x-host-host-property id="hosted"></x-host-host-property>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-produce-use-property'});
+</script>
+ </dom-module>
+
+ <dom-module id="x-child-scope">
+ <template>
+ <style>
+ :host {
+ display: block;
+ padding: 8px;
+ }
+
+ :host > * {
+ --gc4-scope: 5px solid green;
+ }
+
+ #me {
+ border: var(--child-scope-var);
+ }
+
+ #gc2 {
+ --grand-child-scope-var: 4px solid seagreen;
+ }
+
+ #gc4 {
+ --grand-child-scope-var:
+ var(--gc4-scope);
+ }
+ </style>
+ <div id="me">x-child-scope</div>
+ <x-grand-child-scope id="gc1"></x-grand-child-scope>
+ <x-grand-child-scope id="gc2"></x-grand-child-scope>
+ <x-grand-child-scope id="gc3"></x-grand-child-scope>
+ <x-grand-child-scope id="gc4"></x-grand-child-scope>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-child-scope'});
+</script>
+ </dom-module>
+
+ <dom-module id="x-overrides">
+ <template>
+ <style>
+ :host {
+ border: 1px dashed gray;
+ margin: 8px;
+ padding: 8px;
+ display: block;
+ --grand-child-scope-var: var(--rename);
+ }
+ </style>
+ overrides:
+ <x-grand-child-scope id="gc1"></x-grand-child-scope>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-overrides'});
+</script>
+ </dom-module>
+
+ <dom-module id="x-overrides2">
+ <template>
+ <style>
+ :host {
+ border: 1px dashed gray;
+ margin: 8px;
+ padding: 8px;
+ display: block;
+ }
+
+ :host > * {
+ --grand-child-scope-var: var(--rename);
+ }
+
+ </style>
+ overrides:
+ <x-grand-child-scope id="gc1"></x-grand-child-scope>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-overrides2'});
+</script>
+ </dom-module>
+
+ <dom-module id="x-late">
+ <template>
+ <style>
+ :host {
+ border: var(--late);
+ display: block;
+ }
+ </style>
+ late
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-late'});
+</script>
+ </dom-module>
+
+ <dom-module id="x-overrides3">
+ <template>
+ <style>
+ :host {
+ border: 1px dashed gray;
+ margin: 8px;
+ padding: 8px;
+ display: block;
+ }
+
+ :host > * {
+ --fillin: 16px;
+ }
+ </style>
+ overrides:
+ <x-late id="late"></x-late>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-overrides3'});
+</script>
+ </dom-module>
+
+ <dom-module id="x-has-def">
+ <template>
+ <style>
+ :host {
+ border: var(--border, var(--defaultBorder));
+ margin: 8px;
+ padding: 8px;
+ display: block;
+ }
+ </style>
+ Element with default variable.
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-has-def'});
+</script>
+ </dom-module>
+
+ <dom-module id="x-has-if">
+ <template>
+ <style>
+ .iffy {
+ border: var(--scope-var);
+ }
+ </style>
+ <template is="dom-if" if="{{gogo}}">
+ <div class="iffy">iffy</div>
+ </template>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-has-if',
+ properties: {
+ gogo: {value: true}
+ }
+});
+</script>
+ </dom-module>
+
+ <dom-module id="x-button">
+ <template>
+ <style>
+ :host {
+ display: block;
+ border: var(--button-border);
+ }
+ </style>
+ Button!
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-button',
+ extends: 'button'
+});
+</script>
+ </dom-module>
+
+ <dom-module id="x-dynamic">
+ <template>
+ <style>
+ :host {
+ display: block;
+ margin: 20px;
+ border: var(--dynamic);
+ }
+ </style>
+ Dynamic
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-dynamic'
+});
+</script>
+ </dom-module>
+
+ <dom-module id="x-keyframes">
+ <template>
+ <style>
+ :host {
+ display: block;
+ position: relative;
+ border: 10px solid blue;
+ left: 0px;
+ /* Prefix required by Safari <= 8 */
+ -webkit-animation-duration: 0.3s;
+ animation-duration: 0.3s;
+ -webkit-animation-fill-mode: forwards;
+ animation-fill-mode: forwards;
+ }
+
+ :host([animated]) {
+ /* Prefix required by Safari <= 8 */
+ -webkit-animation-name: x-keyframes-animation;
+ animation-name: x-keyframes-animation;
+ }
+
+ /* Prefix required by Safari <= 8 */
+ @-webkit-keyframes x-keyframes-animation {
+ 0% {
+ left: var(--a);
+ }
+
+ 100% {
+ left: var(--b);
+ }
+ }
+ @keyframes x-keyframes-animation {
+ 0% {
+ left: var(--a);
+ }
+
+ 100% {
+ left: var(--b);
+ }
+ }
+ </style>
+ x-keyframes
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-keyframes',
+ properties: {
+ animated: {
+ type: Boolean,
+ value: false,
+ reflectToAttribute: true
+ }
+ }
+});
+</script>
+ </dom-module>
+
+ <dom-module id="x-scope">
+ <template>
+ <style>
+ :host {
+ x--invalid: 15px solid gray;
+ display: block;
+ padding: 8px;
+ --scope-var: 1px solid black;
+ --fallback: 7px solid orange;
+ --default1: var(--undefined, 6px solid yellow);
+ --default2: var(--undefined, var(--fallback));
+ --default3: var(--undefined, rgb(128, 200, 250));
+ --defaultBorder: 22px solid green;
+ --a: 10px;
+ --b: 5px;
+ --primary-color: rgb(128, 128, 128);
+ --late: var(--fillin);
+
+ --button-border: 16px solid tomato;
+ --after: 17px solid brown;
+
+ --end-term: 19px solid blue}
+
+ :host > *{--ws-term: 18px solid orange}
+
+ #me {
+ border: var(--scope-var);
+ }
+
+ x-child-scope {
+ --child-scope-var: 2px solid orange;
+ --grand-child-scope-var: 3px solid steelblue;
+ }
+
+ x-child-scope.special {
+ --child-scope-var: 12px solid orange;
+ }
+
+ #applyDefault1 {
+ border: var(--undefined, 6px solid yellow);
+ }
+
+ #applyDefault2 {
+ border: var(--undefined, var(--fallback));
+ }
+
+ #default1 {
+ border: var(--default1);
+ }
+
+ #default2 {
+ border: var(--default2);
+ }
+
+ #default3 {
+ padding: 8px;
+ background-color: var(--default3);
+ }
+
+ #defaultElement2 {
+ --defaultBorder: 23px solid goldenrod;
+ }
+
+ #overrides1a, #overrides1b, #overrides2 {
+ --rename: 8px solid navy;
+ }
+
+ #overrides1b, #overrides2 {
+ --grand-child-scope-var: 9px solid orange;
+ }
+
+ #overridesConcrete {
+ border: var(--scope-var);
+ border: 4px solid steelblue;
+ }
+
+ #calc {
+ border: solid red;
+ border-width: calc(var(--a) + var(--b));
+ }
+
+ #shadow {
+ box-shadow: 10px 10px 10px var(--primary-color);
+ -webkit-box-shadow: 10px 10px 10px var(--primary-color);
+ }
+
+ x-host-property {
+ border: 10px solid purple;
+ }
+
+ #invalid {
+ border: var(--invalid);
+ }
+
+ #after::after {
+ content: 'after';
+ border: var(--after);
+ }
+
+ #wsTerm {
+ border: var(--ws-term)
+ }
+
+ x-keyframes:nth-of-type(2) {
+ --b: -5px;
+ }
+
+ #endTerm {border: var(--end-term)}
+
+ #parenthesis {
+ background-image: var(--foo-background-image, url(http://placehold.it/400x300));
+ }
+
+ #nestedFallback {
+ border: var(--undefined, var(--undefined, 20px solid blue));
+ }
+
+ #doubleNestedFallback {
+ border: var(--undefined, var(--undefined, var(--undefined, 20px solid red)));
+ }
+
+ #cornerFallback {
+ background-image: var(--undefined, var(--undefined, var(--undefined, url(http://placehold.it/400x300))));
+ }
+ </style>
+ <div id="me">x-scope</div>
+ <x-keyframes id="keyframes"></x-keyframes>
+ <x-keyframes id="keyframes2"></x-keyframes>
+ <x-child-scope id="child"></x-child-scope>
+ <x-child-scope id="child2"></x-child-scope>
+ <x-overrides id="overrides1a"></x-overrides>
+ <x-overrides id="overrides1b"></x-overrides>
+ <x-overrides2 id="overrides2"></x-overrides2>
+ <x-overrides3 id="overrides3"></x-overrides3>
+ <div id="overridesConcrete">override concrete</div>
+ <button id="button" is="x-button"></button>
+ <div id="default1">default</div>
+ <div id="default2">var default</div>
+ <div id="default3">tricky property rgb(...) default</div>
+ <x-has-def id="defaultElement1"></x-has-def>
+ <x-has-def id="defaultElement2"></x-has-def>
+ <div id="applyDefault1">default</div>
+ <div id="applyDefault2">var default</div>
+ <div id="calc">Calc</div>
+ <div id="shadow">Shadow</div>
+ <div id="invalid">invalid</div>
+ <x-host-property id="hostProp"></x-host-property>
+ <x-has-if id="iffy"></x-has-if>
+ <div id="after"></div>
+ <x-dynamic id="dynamic"></x-dynamic>
+ <div id="wsTerm">new line var</div>
+ <div id="endTerm">end var</div>
+ <div id="parenthesis">parenthesis</div>
+ <div id="nestedFallback"></div>
+ <div id="doubleNestedFallback"></div>
+ <div id="cornerFallback"></div>
+ <div id="badFallback"></div>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-scope'
+});
+</script>
+ </dom-module>
+
+ <dom-module id="x-inside">
+ <template>
+ <style>
+ :host {
+ display: inline-block;
+ border: var(--border) solid orange;
+ height: 10px;
+ width: 10px;
+ background-color: tomato;
+ }
+ </style>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-inside'
+});
+</script>
+ </dom-module>
+
+ <dom-module id="simple-element">
+ <template>
+ <style>
+ :host {
+ display: block;
+ }
+
+ x-inside {
+ color: var(--dne);
+ --border: 10px;
+ }
+ </style>
+ <x-inside id="inner"></x-inside>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'simple-element'
+});
+</script>
+ </dom-module>
+
+
+<dom-module id="x-variable-override">
+ <template>
+ <style>
+ :host {
+ --b: 2px solid black;
+ display: block;
+ border: var(--b);
+ }
+ </style>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-variable-override'
+});
+</script>
+</dom-module>
+
+<dom-module id="x-variable-consumer">
+ <template>
+ <style>
+ :host(.foo) {
+ border: var(--consumer);
+ }
+ </style>
+ test
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-variable-consumer'
+});
+</script>
+</dom-module>
+
+<dom-module id="x-host-variable-consumer">
+ <template>
+ <style>
+ :host {
+ --consumer: 2px solid orange;
+ }
+
+ .foo {
+ display: block;
+ /* should override */
+ border: 10px solid black;
+ }
+ </style>
+ <x-variable-consumer id="consumer" class="foo"></x-variable-consumer>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-host-variable-consumer'
+});
+</script>
+</dom-module>
+
+<dom-module id="x-var-produce-via-consume">
+ <template>
+ <style>
+ :host {
+ display: block;
+ border: 10px solid orange;
+ --foo: var(--bar);
+ }
+ </style>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-var-produce-via-consume'
+});
+</script>
+</dom-module>
+
+<dom-module id="x-non-media-matching">
+ <template>
+ <style>
+ @media (min-width: 100000px) {
+ #inside {
+ --consumer: 10px solid red;
+ }
+ }
+ </style>
+ <x-variable-consumer id="inside" class="foo"></x-variable-consumer>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-non-media-matching'
+});
+</script>
+</dom-module>
+
+<dom-module id="x-non-media-matching-host">
+ <template>
+ <style>
+ @media (min-width: 100000px) {
+ :host {
+ --border: 10px solid red;
+ }
+ }
+
+ :host {
+ display: block;
+ border: var(--border);
+ }
+ </style>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-non-media-matching-host'
+});
+</script>
+</dom-module>
+
+<dom-module id="x-update-styles">
+ <template>
+ <style>
+ :host {
+ --border: 10px solid red;
+ }
+
+ :host([active]) {
+ --consumer: 6px solid orange;
+ }
+
+ :host {
+ display: block;
+ border: var(--border);
+ }
+ </style>
+ <x-variable-consumer id="child" class="foo"></x-variable-consumer>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-update-styles',
+ properties: {
+ active: {
+ reflectToAttribute: true,
+ observer: '_activeChanged'
+ }
+ },
+
+ _activeChanged: function() {
+ this.updateStyles();
+ }
+});
+</script>
+</dom-module>
+
+<script type="module">
+import { updateStyles as updateStyles$0 } from '../../lib/mixins/element-mixin.js';
+import { dom } from '../../lib/legacy/polymer.dom.js';
+suite('scoped-styling-var', function() {
+
+function assertComputed(element, value, pseudo, name) {
+ // force a style-recalc for Safari missing updated CSS Custom Properties
+ // https://bugs.webkit.org/show_bug.cgi?id=170708
+ element.offsetWidth;
+ name = name || 'border-top-width';
+ var computed = element.getComputedStyleValue && !pseudo ?
+ element.getComputedStyleValue(name) :
+ getComputedStyle(element, pseudo)[name];
+ assert.equal(computed, value, 'computed style incorrect');
+}
+
+function assertStylePropertyValue(element, name, includeValue) {
+ var value = element.getComputedStyleValue(name);
+ assert.include(value, includeValue);
+}
+
+var styled = document.querySelector('x-scope');
+
+test('variables in @keyframes', function(done) {
+ var xKeyframes = styled.$.keyframes;
+ var onAnimationEnd = function() {
+ assertStylePropertyValue(xKeyframes, 'left', '5px');
+
+ xKeyframes.removeEventListener('animationend', onAnimationEnd);
+ xKeyframes.removeEventListener('webkitAnimationEnd', onAnimationEnd);
+ xKeyframes.animated = false;
+ done();
+ };
+
+ assertStylePropertyValue(xKeyframes, '--a', '10px');
+ assertStylePropertyValue(xKeyframes, '--b', '5px');
+
+ xKeyframes.addEventListener('animationend', onAnimationEnd);
+ xKeyframes.addEventListener('webkitAnimationEnd', onAnimationEnd);
+
+ xKeyframes.animated = true;
+});
+
+test('instances of scoped @keyframes', function(done) {
+ if (navigator.userAgent.match(/Safari\/60(3|4)/) && ShadyCSS.nativeCss && ShadyCSS.nativeShadow) {
+ // `:nth-of-type` is broken in shadow roots on Safari 10.1
+ // https://bugs.webkit.org/show_bug.cgi?id=166748
+ this.skip();
+ }
+ var xKeyframes = styled.$.keyframes2;
+ var onAnimationEnd = function() {
+ assertStylePropertyValue(xKeyframes, 'left', '5px');
+
+ xKeyframes.removeEventListener('animationend', onAnimationEnd);
+ xKeyframes.removeEventListener('webkitAnimationEnd', onAnimationEnd);
+ xKeyframes.animated = false;
+ done();
+ };
+
+ assertStylePropertyValue(xKeyframes, '--a', '10px');
+ assertStylePropertyValue(xKeyframes, '--b', '-5px');
+
+ xKeyframes.addEventListener('animationend', onAnimationEnd);
+ xKeyframes.addEventListener('webkitAnimationEnd', onAnimationEnd);
+
+ xKeyframes.animated = true;
+});
+
+test('multiple elements in document', function() {
+ var e$ = document.querySelectorAll('simple-element');
+ assertComputed(e$[0].$.inner, '10px');
+ assertComputed(e$[1].$.inner, '10px');
+});
+
+test('simple variables calculated correctly between scopes', function() {
+ assertStylePropertyValue(styled, '--scope-var', '1px');
+ //
+ var child = styled.$.child;
+ assertStylePropertyValue(child, '--scope-var', '1px');
+ assertStylePropertyValue(child, '--child-scope-var', '2px');
+ assertStylePropertyValue(child, '--grand-child-scope-var', '3px');
+ //
+ var gc1 = child.$.gc1;
+ assertStylePropertyValue(gc1, '--scope-var', '1px');
+ assertStylePropertyValue(gc1, '--child-scope-var', '2px');
+ assertStylePropertyValue(gc1, '--grand-child-scope-var', '3px');
+ //
+ var gc2 = child.$.gc2;
+ assertStylePropertyValue(gc2, '--scope-var', '1px');
+ assertStylePropertyValue(gc2, '--child-scope-var', '2px');
+ assertStylePropertyValue(gc2, '--grand-child-scope-var', '4px');
+ //
+ var gc3 = child.$.gc3;
+ assertStylePropertyValue(gc3, '--scope-var', '1px');
+ assertStylePropertyValue(gc3, '--child-scope-var', '2px');
+ assertStylePropertyValue(gc3, '--grand-child-scope-var', '3px');
+
+});
+
+test('invalid variables not parsed', function() {
+ if (!window.ShadyCSS || ShadyCSS.nativeCss) {
+ this.skip();
+ }
+ assert.notOk(ShadyCSS.ScopingShim.getComputedStyleValue(styled, 'x--invalid'));
+ assertComputed(styled.$.invalid, '0px');
+});
+
+test('simple variables applied correctly between scopes', function() {
+ assertComputed(styled.$.me, '1px');
+ assertComputed(styled.$.child.$.me, '2px');
+ assertComputed(styled.$.child.$.gc1.$.me, '3px');
+ assertComputed(styled.$.child.$.gc1.$.scope, '1px');
+ assertComputed(styled.$.child.$.gc1.$.child, '2px');
+ assertComputed(styled.$.child.$.gc2.$.me, '4px');
+ assertComputed(styled.$.child.$.gc2.$.scope, '1px');
+ assertComputed(styled.$.child.$.gc2.$.child, '2px');
+});
+
+test('variable can be set to another variable', function() {
+ var gc4 = styled.$.child.$.gc4;
+ assertStylePropertyValue(gc4, '--grand-child-scope-var', '5px');
+ assertComputed(gc4.$.me, '5px');
+});
+
+test('variable default values can be assigned to other variables', function() {
+ assertStylePropertyValue(styled, '--default1', '6px');
+ assertStylePropertyValue(styled, '--default2', '7px');
+ assertComputed(styled.$.default1, '6px');
+ assertComputed(styled.$.default2, '7px');
+ assertComputed(styled.$.applyDefault1, '6px');
+ assertComputed(styled.$.applyDefault2, '7px');
+});
+
+test('variable literal defaults can contain one (...)', function() {
+ var b = getComputedStyle(styled.$.default3).backgroundColor;
+ assert.match(b, /rgb\(128/, 'literal fallback containing (...) not set');
+});
+
+test('variable values can be used with calc', function() {
+ assertComputed(styled.$.calc, '15px');
+});
+
+test('variable values can be used with box-shadow', function() {
+ var b = getComputedStyle(styled.$.shadow).boxShadow;
+ assert.match(b, /rgb\(128/, 'box shadow not set correctly');
+});
+
+test('host properties can be overridden with outer scope styles', function() {
+ assertComputed(styled.$.hostProp, '10px');
+});
+
+test('updateStyles changes property values and using style cache', function() {
+ styled.$.child.classList.add('special');
+ var l = document.querySelectorAll('style').length;
+ styled.updateStyles();
+ if (styled.shadowRoot && window.ShadyCSS && !ShadyCSS.nativeCss) {
+ assert.equal(document.querySelectorAll('style').length, l+4);
+ }
+ assertComputed(styled.$.child.$.me, '12px');
+ styled.$.child.classList.remove('special');
+ styled.updateStyles();
+ if (styled.shadowRoot && window.ShadyCSS && !ShadyCSS.nativeCss) {
+ assert.equal(document.querySelectorAll('style').length, l);
+ }
+ assertComputed(styled.$.child.$.me, '2px');
+});
+
+test('Nested element uses style cache when attached and updateStyles is called', function() {
+ var l = document.querySelectorAll('style').length;
+ var e1 = document.createElement('x-produce-use-property');
+ document.body.appendChild(e1);
+ var e1t = e1.$.hosted.$.hosted;
+ var e2 = document.createElement('x-produce-use-property');
+ document.body.appendChild(e2);
+ var e2t = e2.$.hosted.$.hosted;
+ if (styled.shadowRoot && window.ShadyDOM) {
+ assert.equal(document.querySelectorAll('style').length, l+1);
+ }
+ assertComputed(e1t, '6px');
+ assertComputed(e2t, '6px');
+ e1.updateStyles({'--scope-var': '8px solid purple'});
+ e2.updateStyles({'--scope-var': '8px solid purple'});
+ assertComputed(e1t, '8px');
+ assertComputed(e2t, '8px');
+ if (styled.shadowRoot && window.ShadyDOM) {
+ assert.equal(document.querySelectorAll('style').length, l+1);
+ }
+ e1.updateStyles({'--scope-var': null});
+ e2.updateStyles({'--scope-var': null});
+ assertComputed(e1t, '6px');
+ assertComputed(e2t, '6px');
+ if (styled.shadowRoot && window.ShadyDOM) {
+ assert.equal(document.querySelectorAll('style').length, l+1);
+ }
+});
+
+test('updateStyles with properties argument changes styles', function() {
+ styled.$.child.updateStyles({'--child-scope-var': '26px solid seagreen'});
+ assertComputed(styled.$.child.$.me, '26px');
+ styled.$.child.updateStyles({'--child-scope-var': null});
+ assertComputed(styled.$.child.$.me, '2px');
+});
+
+test('updateStyles on when element when not attached', function() {
+ var x = document.createElement('x-update-styles');
+ document.body.appendChild(x);
+ assertComputed(x, '10px');
+ document.body.removeChild(x);
+ x.updateStyles({'--border': '8px solid orange'});
+ document.body.appendChild(x);
+ assertComputed(x, '8px');
+});
+
+test('updateStyles called in observer when element not attached', function() {
+ var x = document.createElement('x-update-styles');
+ document.body.appendChild(x);
+ assertComputed(x.$.child, '0px');
+ x.active = true;
+ assertComputed(x.$.child, '6px');
+ x.active = false;
+ assertComputed(x.$.child, '0px');
+ document.body.removeChild(x);
+ x.active = true;
+ // disable element's updateStyles to show that observer for `active`'s call to updateStyles
+ // functions correctly.
+ x.updateStyles = function(){};
+ document.body.appendChild(x);
+ assertComputed(x.$.child, '6px');
+});
+
+
+
+test('styles update based on root customStyle changes', function() {
+ assertComputed(styled.$.dynamic, '0px');
+ updateStyles$0({'--dynamic': '4px solid navy'});
+ assertComputed(styled.$.dynamic, '4px');
+ updateStyles$0({'--dynamic': '6px solid gray'});
+ assertComputed(styled.$.dynamic, '6px');
+});
+
+test('null customStyles unapply', function() {
+ styled.$.dynamic.updateStyles({'--dynamic': '8px solid black'});
+ assertComputed(styled.$.dynamic, '8px');
+ styled.$.dynamic.updateStyles({'--dynamic': null});
+ assertComputed(styled.$.dynamic, '6px');
+ styled.$.dynamic.updateStyles({'--dynamic': '8px solid black'});
+ assertComputed(styled.$.dynamic, '8px');
+ styled.$.dynamic.updateStyles({'--dynamic': null});
+ assertComputed(styled.$.dynamic, '6px');
+});
+
+test('style properties with dom-if', function() {
+ var e = styled.$.iffy;
+ var c = dom(e.root).querySelector('.iffy');
+ assert.ok(c, 'dom-if did not stamp');
+ assertComputed(c, '1px');
+});
+
+test('variable precedence and overrides', function() {
+ // renamed property applied
+ var o1a = styled.$.overrides1a;
+ assertStylePropertyValue(o1a, '--rename', '8px');
+ assertStylePropertyValue(o1a, '--grand-child-scope-var', '8px');
+ assertComputed(o1a.$.gc1.$.me, '8px');
+ // :host property overridden by outer scope
+ var o1b = styled.$.overrides1b;
+ assertStylePropertyValue(o1b, '--rename', '8px');
+ assertStylePropertyValue(o1b, '--grand-child-scope-var', '9px');
+ assertComputed(o1b.$.gc1.$.me, '9px');
+ // own scope property overrides outer scope
+ var o2 = styled.$.overrides2;
+ assertStylePropertyValue(o2, '--rename', '8px');
+ assertStylePropertyValue(o2.$.gc1, '--grand-child-scope-var', '8px');
+ assertComputed(o2.$.gc1.$.me, '8px');
+
+ // late bound property does *not* resolve using inherited value
+ var o3 = styled.$.overrides3;
+ if (window.ShadyCSS && !ShadyCSS.nativeCss) {
+ assert.equal(ShadyCSS.ScopingShim.getComputedStyleValue(o3, '--late'), '', 'property should not be late bound');
+ }
+ assertStylePropertyValue(o3.$.late, '--fillin', '16px');
+ assertComputed(o3.$.late, '0px');
+
+});
+
+test('pseudo-elements can consume custom properties', function() {
+ assertComputed(styled.$.after, '17px', '::after');
+});
+
+test('elements using only variable defaults are styled properly', function() {
+ assertComputed(styled.$.defaultElement1, '22px');
+ assertComputed(styled.$.defaultElement2, '23px');
+});
+
+test('vars with trailing new line or } apply', function() {
+ assertComputed(styled.$.wsTerm, '18px');
+ assertComputed(styled.$.endTerm, '19px');
+});
+
+test('variable with parenthesis', function() {
+ var url = getComputedStyle(styled.$.parenthesis).backgroundImage.replace(/['"]/g, '');
+ assert.equal('url(http://placehold.it/400x300)', url);
+});
+
+test('custom style class overrides css variable', function() {
+ var d = document.createElement('x-variable-override');
+ d.classList.add('variable-override');
+ document.body.appendChild(d);
+ assertComputed(d, '10px');
+});
+
+test('class selector overrides :host(class) property on element with only dynamic styles', function() {
+ var d = document.createElement('x-host-variable-consumer');
+ document.body.appendChild(d);
+ assertComputed(d.$.consumer, '10px');
+});
+
+test('var values can be overridden by subsequent concrete properties', function() {
+ assertComputed(styled.$.overridesConcrete, '4px');
+});
+
+test('producing a var that consumes another var preserves static styling', function() {
+ var d = document.createElement('x-var-produce-via-consume');
+ document.body.appendChild(d);
+ assertComputed(d, '10px');
+});
+
+test('producing a var that consumes results in static and not dynamic stylesheet', function() {
+ if (!window.ShadyCSS || ShadyCSS.nativeCss) {
+ this.skip();
+ }
+ var d = document.createElement('x-var-produce-via-consume');
+ document.body.appendChild(d);
+ var styleRoot = (!window.ShadyCSS || ShadyCSS.nativeShadow) ? d.shadowRoot : document.head;
+ var staticStyle = styleRoot.querySelector('style[scope=x-var-produce-via-consume]');
+ assert.ok(staticStyle);
+ assert.match(staticStyle.textContent, /display/, 'static style does not contain style content');
+ assert.equal(styleRoot.querySelectorAll('style[scope~=x-var-produce-via-consume]').length, 1);
+});
+
+test('Nested var fallback syntax', function() {
+ assertComputed(styled.$.nestedFallback, '20px');
+ assertComputed(styled.$.doubleNestedFallback, '20px');
+ var url = getComputedStyle(styled.$.cornerFallback).backgroundImage.replace(/['"]/g, '');
+ assert.equal('url(http://placehold.it/400x300)', url);
+});
+
+test('invalid @media rules do not match', function() {
+ var e = document.createElement('x-non-media-matching');
+ document.body.appendChild(e);
+ assertComputed(e.$.inside, '0px');
+});
+
+test('invalid @media rules do not match :host rule', function() {
+ var e = document.createElement('x-non-media-matching-host');
+ document.body.appendChild(e);
+ assertComputed(e, '0px');
+});
+
+});
+</script>
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/styling-import-host2.css b/third_party/polymer3/bower_components/polymer/test/unit/styling-import-host2.css
new file mode 100644
index 0000000..bfbf139
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/styling-import-host2.css
@@ -0,0 +1,13 @@
+/*
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+:host {
+ display: block;
+ border: 2px solid black;
+}
\ No newline at end of file
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/styling-import-shared-styles.js b/third_party/polymer3/bower_components/polymer/test/unit/styling-import-shared-styles.js
new file mode 100644
index 0000000..a5c3636
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/styling-import-shared-styles.js
@@ -0,0 +1,31 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+
+const $_documentContainer = document.createElement('template');
+$_documentContainer.setAttribute('style', 'display: none;');
+
+$_documentContainer.innerHTML = `<dom-module id="shared-styles">
+ <style>
+ :host {
+ border: 4px solid tomato;
+ }
+ </style>
+
+
+ <template>
+ <style>
+ #three {
+ border: 3px solid tomato;
+ }
+ </style>
+ </template>
+</dom-module>`;
+
+document.head.appendChild($_documentContainer.content);
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/styling-only-with-template.html b/third_party/polymer3/bower_components/polymer/test/unit/styling-only-with-template.html
new file mode 100644
index 0000000..97eb2fd
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/styling-only-with-template.html
@@ -0,0 +1,79 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+</head>
+
+<body>
+ <custom-style>
+ <style is="custom-style">
+ html {
+ --mixin: {
+ border: 2px solid rgb(255, 0, 0);
+ };
+ }
+ </style>
+ </custom-style>
+
+ <custom-style>
+ <style is="custom-style">
+ #target {
+ @apply --mixin;
+ }
+ </style>
+ </custom-style>
+
+ <div id="target"></div>
+ <dom-if><template></template></dom-if>
+ <dom-repeat><template></template></dom-repeat>
+
+ <script type="module">
+import { PolymerElement } from '../../polymer-element.js';
+class XFoo extends PolymerElement {
+ connectedCallback() {
+ this.spy = sinon.spy(window.ShadyCSS, 'styleElement');
+ super.connectedCallback();
+ this.spy.restore();
+ }
+}
+customElements.define('x-foo', XFoo);
+</script>
+
+ <script type="module">
+suite('styling-only-template', function () {
+
+ function assertComputed(element, value, pseudo) {
+ var computed = getComputedStyle(element, pseudo);
+ assert.equal(computed['border-top-width'], value, 'computed style incorrect');
+ }
+
+ test('elements without templates do not call ShadyCSS', () => {
+ let el = document.createElement('x-foo');
+ document.body.appendChild(el);
+ assert.ok(el.spy);
+ assert.isTrue(el.spy.notCalled);
+ });
+
+ test('dom-repeat and dom-if do not break custom-style', () => {
+ // force custom-style flushing
+ let target = document.querySelector('#target');
+ window.ShadyCSS.styleDocument();
+ assertComputed(target, '2px');
+ });
+});
+</script>
+</body>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/styling-scoped.html b/third_party/polymer3/bower_components/polymer/test/unit/styling-scoped.html
new file mode 100644
index 0000000..bd3f4e2
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/styling-scoped.html
@@ -0,0 +1,1160 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module">
+ let define = window.customElements.define;
+ let order = [];
+ window.customElements.define = function(name, fn, options) {
+ order.push(name);
+ return define.call(window.customElements, name, fn, options);
+ };
+ customElements.defineOrder = order;
+ </script>
+ <style>
+ #priority[style-scope=x-styled], #priority.style-scope.x-styled {
+ border: 1px solid black;
+ }
+ </style>
+</head>
+<body>
+
+<dom-module id="x-keyframes">
+ <template>
+ <style>
+ :host {
+ display: block;
+ position: relative;
+ border: 10px solid blue;
+ left: 0px;
+ /* Prefix required by Safari <= 8 */
+ -webkit-animation-duration: 0.3s;
+ animation-duration: 0.3s;
+ -webkit-animation-fill-mode: forwards;
+ animation-fill-mode: forwards;
+ }
+
+ :host([animated]) {
+ /* Prefix required by Safari <= 8 */
+ -webkit-animation-name: x-keyframes-animation;
+ animation-name: x-keyframes-animation;
+ }
+
+ /* Prefix required by Safari <= 8 */
+ @-webkit-keyframes x-keyframes-animation {
+ 0% {
+ left: var(--keyframes0, 0px);
+ }
+
+ 100% {
+ left: var(--keyframes100, 10px);
+ }
+ }
+ @keyframes x-keyframes-animation {
+ 0% {
+ left: var(--keyframes0, 0px);
+ }
+
+ 100% {
+ left: var(--keyframes100, 10px);
+ }
+ }
+ </style>
+ x-keyframes
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-keyframes',
+ properties: {
+ animated: {
+ type: Boolean,
+ value: false,
+ reflectToAttribute: true
+ }
+ }
+});
+</script>
+</dom-module>
+<dom-module id="x-gchild">
+ <template>
+ <style>
+ </style>
+ <div id="target">x-gchild</div>
+ </template>
+</dom-module>
+<script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-gchild'
+});
+</script>
+
+<dom-module id="x-child">
+ <template>
+ <div id="simple">simple</div>
+ <div id="complex1" class="scoped">complex1</div>
+ <div id="complex2" selected>complex2</div>
+ <div id="media">media</div>
+ <div id="shadow" class="shadowTarget">shadowTarget</div>
+ <div id="deep" class="deepTarget">deepTarget</div>
+ <x-gchild id="gchild1"></x-gchild>
+ <x-gchild id="gchild2" class="wide"></x-gchild>
+ </template>
+</dom-module>
+<script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-child',
+ hostAttributes: {
+ class: 'nug'
+ }
+});
+</script>
+
+<dom-module id="x-child2">
+ <template>
+ <style>
+ :host(.wide) #target{
+ border: none;
+ }
+ </style>
+ <div id="target">x-child2</div>
+ </template>
+</dom-module>
+<script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-child2'
+});
+</script>
+
+<dom-module id="x-scope-class">
+ <template>
+ <div id="scope">Trivial</div>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-scope-class'
+});
+</script>
+</dom-module>
+
+
+
+<dom-module id="x-styled">
+ <template>
+ <style>
+ :host {
+ display: block;
+ border: 1px solid orange;
+ --keyframes100: 100px;
+ }
+
+ :host(.wide) {
+ border-width: 2px;
+ }
+
+ :host(.wide)::after {
+ content: '-content-';
+ };
+
+ #keyframes2.special {
+ --keyframes100: 200px;
+ }
+
+ #simple {
+ border: 3px solid orange;
+ }
+
+ .scoped, [selected] {
+ border: 4px solid pink;
+ }
+
+ @media(max-width: 10000px) {
+ .media {
+ border: 5px solid brown;
+ }
+ }
+
+ .container ::slotted(*) {
+ border: 6px solid navy;
+ }
+
+ #priority {
+ border: 9px solid orange;
+ }
+
+ .container1 > ::slotted([slot=content1]) {
+ border: 13px solid navy;
+ }
+
+ .container2 > ::slotted([slot=content2]) {
+ border: 14px solid navy;
+ }
+
+ .computed {
+ border: 15px solid orange;
+ }
+
+ .computeda {
+ border: 20px solid orange;
+ }
+
+ .a.computedb {
+ border: 16px solid gray;
+ }
+
+ #child {
+ border: 16px solid tomato;
+ display: block;
+ }
+
+ svg {
+ margin-top: 20px;
+ }
+
+ #circle {
+ fill: seagreen;
+ stroke-width: 1px;
+ stroke: tomato;
+ }
+ </style>
+ <slot name="blank"></slot>
+ <div id="simple">simple</div>
+ <div id="complex1" class="scoped">complex1</div>
+ <div id="complex2" selected>complex2</div>
+ <div id="media" class="media">media</div>
+ <div class="container1">
+ <slot name="content1"></slot>
+ </div>
+ <div class="container2">
+ <slot name="content2"></slot>
+ </div>
+ <div class="container">
+ <slot></slot>
+ </div>
+ <x-child id="child"></x-child>
+ <div id="priority">priority</div>
+ <x-child2 class="wide" id="child2"></x-child2>
+ <div id="computed" class$="{{computeClass(aClass)}}">Computed</div>
+ <div>
+ <div id="computed2" class$="a {{computeClass('computedb')}}">Computed</div>
+ </div>
+ <div id="repeatContainer">
+ <template id="repeat" is="dom-repeat" items="{{items}}">
+ <a class$="{{aaClass}}">A Computed</a>
+ </template>
+ </div>
+ <svg height="25" width="25">
+ <circle id="circle" cx="12" cy="12" r="10"></circle>
+ </svg>
+ <x-scope-class id="scopeClass"></x-scope-class>
+ <x-keyframes id="keyframes"></x-keyframes>
+ <x-keyframes id="keyframes2"></x-keyframes>
+ </template>
+</dom-module>
+<script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-styled',
+
+ properties: {
+ items: {value: [{}]}
+ },
+
+ computeClass: function(className) {
+ return className;
+ }
+
+});
+</script>
+
+<template id="dynamic">
+ <div class="added">
+ Added
+ <div class="sub-added">
+ Sub-added
+ </div>
+ </div>
+</template>
+
+<dom-module id="x-dynamic-scope">
+ <template>
+ <style>
+ .added {
+ border: 17px solid beige;
+ }
+
+ .sub-added {
+ border: 18px solid #fafafa;
+ }
+ </style>
+ <div id="container"></div>
+ </template>
+</dom-module>
+<script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+var doc = window.document;
+var dynamic = doc.querySelector('template#dynamic');
+
+Polymer({
+ is: 'x-dynamic-scope',
+ ready: function() {
+ // simulate 3rd party action by using normal dom to add to element.
+ var dom = document.importNode(dynamic.content, true);
+ this.$.container.appendChild(dom);
+ }
+});
+</script>
+
+<template id="dynamic-style-template">
+ <style>
+ :host {
+ border: 40px solid tomato;
+ }
+ </style>
+ <div>big border</div>
+</template>
+
+<script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+var doc = window.document;
+var template = doc.querySelector('template#dynamic-style-template');
+
+Polymer({
+ is: 'x-dynamic-template',
+ registered: function() {
+ this._template = template;
+ }
+});
+</script>
+
+<template id="svg">
+ <svg class="svg" viewBox="0 0 24 24">
+ <circle id="circle" r="12" cx="12" cy="12" />
+ </svg>
+</template>
+
+<dom-module id="x-dynamic-svg">
+ <template>
+ <style>
+ .svg {
+ height: 24px;
+ width: 24px;
+ }
+ #circle {
+ fill: red;
+ fill-opacity: 0.5;
+ }
+ </style>
+ <div id="container"></div>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+var doc = window.document;
+var template = doc.querySelector('template#svg');
+
+Polymer({
+ is: 'x-dynamic-svg',
+ ready: function() {
+ this.scopeSubtree(this.$.container, true);
+ var dom = document.importNode(template.content, true);
+ this.$.container.appendChild(dom);
+ }
+});
+</script>
+</dom-module>
+
+<dom-module id="x-specificity">
+ <template>
+ <style>
+ :host {
+ border-top: 1px solid red;
+ }
+ :host(.bar) {
+ border-top: 2px solid red;
+ }
+ </style>
+ <slot></slot>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-specificity'});
+</script>
+</dom-module>
+
+<custom-style>
+ <style>
+ html {
+ --x-specificity-parent : {
+ border: 10px solid blue;
+ };
+ --x-specificity-nested : {
+ border: 3px solid red;
+ };
+ }
+ </style>
+</custom-style>
+
+<dom-module id="x-specificity-parent">
+ <template>
+ <style>
+ ::slotted(:not(template)) {
+ @apply(--x-specificity-parent);
+ }
+ </style>
+ <slot></slot>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-specificity-parent'});
+</script>
+</dom-module>
+
+<dom-module id="x-specificity-nested">
+ <template>
+ <style>
+ :host {
+ @apply(--x-specificity-nested);
+ }
+ </style>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-specificity-nested'});
+</script>
+</dom-module>
+
+<custom-style>
+ <style>
+ html {
+ --x-overriding : {
+ border-top: 1px solid red;
+ }
+ }
+ </style>
+</custom-style>
+
+<dom-module id="x-overriding">
+ <template>
+ <style>
+ .red {
+ @apply(--x-overriding);
+ }
+ .green {
+ @apply(--x-overriding);
+ border-top: 2px solid green;
+ }
+ .red-2 {
+ border-top: 2px solid green;
+ @apply(--x-overriding);
+ }
+ .blue {
+ @apply(--x-overriding);
+ border-top: 3px solid blue;
+ }
+ </style>
+
+ <div class="red">red</div>
+ <div class="green">green</div>
+ <div class="red-2">green-2</div>
+ <div class="blue">blue</div>
+ </template>
+</dom-module>
+
+<script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'x-overriding'
+});
+</script>
+
+<dom-module id="x-attr-selector">
+ <template>
+ <style>
+ #foo1 ~ #bar1 {
+ border: 2px solid red;
+ }
+
+ #foo1 ~ #bar1 ~ #foo2[attr~=foo2] ~ #bar2[attr~=bar2] {
+ border: 4px solid red;
+ }
+
+ #foo1 ~ #bar1 ~ #foo2[attr~=foo2] ~ #bar2[attr~=bar2] ~ #foo3[attr~=foo3][a~=a] ~ #bar3[attr~=bar3][a~=a] {
+ border: 6px solid red;
+ }
+ </style>
+ <div id="foo1"></div>
+ <div id="bar1">bar1</div>
+ <div id="foo2" attr="foo2"></div>
+ <div id="bar2" attr="bar2">bar2</div>
+ <div id="foo3" attr="foo3" a="a"></div>
+ <div id="bar3" attr="bar3" a="a">bar3</div>
+
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-attr-selector'});
+</script>
+</dom-module>
+
+<dom-module id="shared-style">
+ <template>
+ <style>
+ :host(x-shared1) {
+ display: block;
+ border: 2px solid orange;
+ }
+
+ :host(x-shared2) {
+ display: block;
+ border: 4px solid orange;
+ }
+
+ :host(.x-shared1) {
+ top: 10px;
+ };
+ </style>
+ </template>
+</dom-module>
+
+<dom-module id="x-shared1">
+ <template>
+ <style include="shared-style"></style>
+ x-shared1
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-shared1'});
+</script>
+</dom-module>
+
+<dom-module id="x-shared2">
+ <template>
+ <style include="shared-style"></style>
+ x-shared2
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-shared2'});
+</script>
+</dom-module>
+
+<dom-module id="x-slotted">
+ <template>
+ <style>
+ ::slotted(.auto-content) {
+ border: 2px solid orange;
+ }
+ .bar, ::slotted(.complex-child) {
+ border: 6px solid navy;
+ }
+ #container ::slotted(*) {
+ border: 8px solid green;
+ }
+ </style>
+ <slot></slot>
+ <div id="container">
+ <slot name="container"></slot>
+ </div>
+ </template>
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({is: 'x-slotted'});
+</script>
+</dom-module>
+
+<template id="xClass">
+ <style>
+ :host {
+ display: block;
+ border: 1px solid orange;
+ }
+ </style>
+</template>
+<script type="module">
+import { PolymerElement, html } from '../../polymer-element.js';
+customElements.define('x-class-no-is', class extends PolymerElement {
+ static get template() {
+ return window.xClass;
+ }
+});
+
+customElements.define('x-template-string', class extends PolymerElement {
+ static get template() {
+ return html`<style>
+ :host {
+ display: block;
+ border: 1px solid orange;
+ }
+ </style>;`;
+ }
+});
+</script>
+
+
+ <div class="scoped">no margin</div>
+
+ <x-styled>
+ <div slot="content1">Foo</div>
+ <div slot="content2">Bar</div>
+ <div class="content">Content</div>
+ </x-styled>
+
+ <x-styled class="wide"></x-styled>
+
+ <x-dynamic-scope></x-dynamic-scope>
+
+ <dom-bind id="bind">
+ <template>
+ <div id="dom-bind-static" class="static">static</div>
+ <span id="dom-bind-dynamic" class$="[[dynamic]]">[[dynamic]]</span>
+ </template>
+ </dom-bind>
+
+ <x-dynamic-svg></x-dynamic-svg>
+ <x-specificity></x-specificity>
+ <x-specificity class="bar"></x-specificity>
+ <x-specificity-parent>
+ <x-specificity-nested></x-specificity-nested>
+ </x-specificity-parent>
+ <x-overriding></x-overriding>
+
+ <dom-module id="nested-shared-style">
+ <template>
+ <style>
+ :host {
+ padding-top: 10px;
+ }
+ </style>
+ </template>
+ </dom-module>
+
+ <dom-module id="x-nested-style">
+ <template>
+ <div id="container">
+ <style include="nested-shared-style">
+ :host {
+ display: block;
+ border: 10px solid black;
+ }
+ </style>
+ </div>
+ </template>
+ <script type="module">
+import { PolymerElement } from '../../polymer-element.js';
+class XNestedStyle extends PolymerElement {
+ static get is() {return 'x-nested-style';}
+}
+customElements.define(XNestedStyle.is, XNestedStyle);
+</script>
+ </dom-module>
+
+ <dom-module id="x-interleaved-styles">
+ <template>
+ <style include="x-nested-style"></style>
+ <style>
+ :host {
+ padding-top: 5px;
+ }
+ </style>
+ <style>
+ :host {
+ color: blue;
+ }
+ </style>
+ </template>
+ <script type="module">
+import { PolymerElement } from '../../polymer-element.js';
+class XInterleaved extends PolymerElement {
+ static get is() {return 'x-interleaved-styles';}
+}
+customElements.define(XInterleaved.is, XInterleaved);
+</script>
+ </dom-module>
+
+ <dom-module id="double-shared-style">
+ <template>
+ <style>
+ .double-shared-style {
+ color: green;
+ }
+ </style>
+ </template>
+ </dom-module>
+
+ <dom-module id="importing-double-shared-style">
+ <template>
+ <style include="double-shared-style">
+ </style>
+ </template>
+ </dom-module>
+
+ <dom-module id="double-shared-styling-element">
+ <template>
+ <style include="importing-double-shared-style double-shared-style"></style>
+ </template>
+ <script type="module">
+import { PolymerElement } from '../../polymer-element.js';
+class DoubleSharedStylingElement extends PolymerElement {
+ static get is() { return 'double-shared-styling-element'; }
+}
+customElements.define(DoubleSharedStylingElement.is, DoubleSharedStylingElement);
+</script>
+ </dom-module>
+
+<script type="module">
+import { dom } from '../../lib/legacy/polymer.dom.js';
+import { flush } from '../../lib/utils/flush.js';
+function assertComputed(element, value, property, pseudo) {
+ var computed = getComputedStyle(element, pseudo);
+ property = property || 'border-top-width';
+ if (Array.isArray(value)) {
+ assert.oneOf(computed[property], value, 'computed style incorrect for ' + property);
+ } else {
+ assert.equal(computed[property], value, 'computed style incorrect for ' + property);
+ }
+}
+
+var styled = document.querySelector('x-styled');
+var styledWide = document.querySelector('x-styled.wide');
+var unscoped = document.querySelector('.scoped');
+
+suite('scoped-styling', function() {
+
+ test(':host, :host(...)', function() {
+ assertComputed(styled, '1px');
+ assertComputed(styledWide, '2px');
+ assertComputed(styled, ['', 'none'], 'content', '::after');
+ assertComputed(styledWide, ['"-content-"', '-content-'], 'content', '::after');
+ });
+
+ test('scoped selectors, simple and complex', function() {
+ assertComputed(styled.$.simple, '3px');
+ assertComputed(styled.$.complex1, '4px');
+ assertComputed(styled.$.complex2, '4px');
+ });
+
+ test('media query scoped selectors', function() {
+ assertComputed(styled.$.media, '5px');
+ });
+
+ test('upper bound encapsulation', function() {
+ assertComputed(unscoped, '0px');
+ });
+
+ test('lower bound encapsulation', function() {
+ assertComputed(styled.$.child.$.simple, '0px');
+ assertComputed(styled.$.child.$.complex1, '0px');
+ assertComputed(styled.$.child.$.complex2, '0px');
+ assertComputed(styled.$.child.$.media, '0px');
+ });
+
+ test('::slotted selectors', function() {
+ var content = document.querySelector('.content');
+ var content1 = document.querySelector('[slot=content1]');
+ var content2 = document.querySelector('[slot=content2]');
+ assertComputed(content, '6px');
+ assertComputed(content1, '13px');
+ assertComputed(content2, '14px');
+ });
+
+ test('auto ::slotted selector', function() {
+ var x = document.createElement('x-slotted');
+ var d1 = document.createElement('div');
+ d1.classList.add('auto-content');
+ d1.textContent = 'auto-content';
+ document.body.appendChild(x);
+ dom(x).appendChild(d1);
+ flush();
+ assertComputed(d1, '2px');
+ });
+
+ test('::slotted + child in complex selector', function() {
+ var x = document.createElement('x-slotted');
+ var d1 = document.createElement('div');
+ d1.classList.add('complex-child');
+ d1.textContent = 'complex-child';
+ document.body.appendChild(x);
+ dom(x).appendChild(d1);
+ flush();
+ assertComputed(d1, '6px');
+ });
+
+ test('::slotted + named slot', function() {
+ var x = document.createElement('x-slotted');
+ var d1 = document.createElement('div');
+ d1.setAttribute('slot', 'container');
+ d1.textContent = 'named slot child';
+ document.body.appendChild(x);
+ dom(x).appendChild(d1);
+ flush();
+ assertComputed(d1, '8px');
+ });
+
+ test('elements dynamically added/removed from root', function() {
+ var d = document.createElement('div');
+ d.classList.add('scoped');
+ d.textContent = 'Dynamically... Scoped!';
+ dom(styled.root).appendChild(d);
+ flush();
+ assertComputed(d, '4px');
+ dom(document.body).appendChild(d);
+ flush();
+ assert.notInclude(d.getAttribute('style-scoped') || '', styled.is, 'scoping attribute not removed when added to other root');
+ assert.notInclude(d.className, styled.is, 'scoping class not removed when added to other root');
+ assertComputed(d, '0px');
+ dom(styled.root).appendChild(d);
+ flush();
+ assertComputed(d, '4px');
+ });
+
+ test('elements dynamically added/removed from host', function() {
+ var d = document.createElement('div');
+ d.classList.add('scoped');
+ d.slot = 'blank';
+ d.textContent = 'Dynamically... unScoped!';
+ dom(styled).appendChild(d);
+ flush();
+ assertComputed(d, '0px');
+ dom(document.body).appendChild(d);
+ flush();
+ assert.notInclude(d.getAttribute('style-scoped') || '', styled.is, 'scoping attribute not removed when added to other root');
+ assert.notInclude(d.className, styled.is, 'scoping class not removed when added to other root');
+ dom(styled).appendChild(d);
+ flush();
+ assertComputed(d, '0px');
+ dom(styled).removeChild(d);
+ flush();
+ assert.notInclude(d.getAttribute('style-scoped') || '', styled.is, 'scoping attribute not removed when removed from root');
+ assert.notInclude(d.className, styled.is, 'scoping class not removed when removed from root');
+ dom(styled).appendChild(d);
+ flush();
+ assertComputed(d, '0px');
+ });
+
+ test('keyframes change scope', function(done) {
+ if (navigator.userAgent.match('Edge') && (!window.ShadyCSS || window.ShadyCSS.nativeCss)) {
+ // skip test due to missing variable support in keyframes
+ // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/12084341/
+ this.skip();
+ }
+ var xKeyframes = styled.$.keyframes;
+
+ var onAnimationEnd = function() {
+ xKeyframes.removeEventListener('animationend', onAnimationEnd);
+ xKeyframes.removeEventListener('webkitAnimationEnd', onAnimationEnd);
+ assertComputed(xKeyframes, '100px', 'left');
+
+ xKeyframes = styled.$.keyframes2;
+
+ onAnimationEnd = function() {
+ xKeyframes.removeEventListener('animationend', onAnimationEnd);
+ xKeyframes.removeEventListener('webkitAnimationEnd', onAnimationEnd);
+ assertComputed(xKeyframes, '200px', 'left');
+ done();
+ };
+
+ xKeyframes.addEventListener('animationend', onAnimationEnd);
+ xKeyframes.addEventListener('webkitAnimationEnd', onAnimationEnd);
+
+ dom(xKeyframes).classList.add('special');
+ xKeyframes.updateStyles();
+ xKeyframes.animated = true;
+ };
+
+ xKeyframes.addEventListener('animationend', onAnimationEnd);
+ xKeyframes.addEventListener('webkitAnimationEnd', onAnimationEnd);
+
+ xKeyframes.animated = true;
+ assertComputed(xKeyframes, '0px', 'left');
+ });
+
+ test('elements with computed classes', function() {
+ assertComputed(styled.$.computed, '0px');
+ styled.aClass = 'computed';
+ assertComputed(styled.$.computed, '15px');
+ assertComputed(styled.$.computed2, '16px');
+ });
+
+ test('<a> with computed classes dynamically added', function() {
+ assertComputed(styled.$.repeatContainer.firstElementChild, '0px');
+ styled.aaClass = 'computeda';
+ assertComputed(styled.$.repeatContainer.firstElementChild, '20px');
+ });
+
+ test('elements with hostAttributes: class', function() {
+ assertComputed(styled.$.child, '16px');
+ });
+
+ test('element subtree added via dom api', function() {
+ var container = document.querySelector('x-dynamic-scope').$.container;
+ var a = container.querySelector('.added');
+ assertComputed(a, '17px');
+ var b = container.querySelector('.sub-added');
+ assertComputed(b, '18px');
+ });
+
+ test('styles in dynamically selected template', function() {
+ var el = document.createElement('x-dynamic-template');
+ document.body.appendChild(el);
+ if (el.shadowRoot) {
+ // style properly removed
+ assert.notOk(el.querySelector('style'));
+ }
+ assertComputed(el, '40px');
+ document.body.removeChild(el);
+ });
+
+ test('attribute inclusive selector and general sibling selectors', function() {
+ var e = document.createElement('x-attr-selector');
+ document.body.appendChild(e);
+ flush();
+ assertComputed(e.$.bar1, '2px');
+ assertComputed(e.$.bar2, '4px');
+ assertComputed(e.$.bar3, '6px');
+ });
+
+ test('svg classes are dynamically scoped correctly', function() {
+ var container = document.querySelector('x-dynamic-svg').$.container;
+ var svg = container.querySelector('.svg');
+ var computed = getComputedStyle(svg);
+ assert.equal(computed.height, '24px');
+ assert.equal(computed.width, '24px');
+ var circle = container.querySelector('#circle');
+ computed = getComputedStyle(circle);
+ assert.equal(computed['fill-opacity'], '0.5');
+ });
+
+ test(':host with element tag selector', function() {
+ var s1 = document.createElement('x-shared1');
+ document.body.appendChild(s1);
+ assertComputed(s1, '2px');
+ var s2 = document.createElement('x-shared2');
+ document.body.appendChild(s2);
+ assertComputed(s2, '4px');
+ });
+
+ test(':host with superset of element tag selector does not leak', function() {
+ var t = document.createElement('div');
+ t.textContent = 'host leak test';
+ t.classList.add('x-shared1');
+ document.body.appendChild(t);
+ assertComputed(t, 'auto', 'top');
+ });
+
+ test(':host(...) with non-matching type selector does not leak', function() {
+ var t = document.createElement('x-shared1x-shared2');
+ t.textContent = ':host(non-matching-type-selector)';
+ document.body.appendChild(t);
+ assertComputed(t, '0px');
+ t = document.createElement('x-shared2x-shared1');
+ t.textContent = ':host(non-matching-type-selector)';
+ document.body.appendChild(t);
+ assertComputed(t, '0px');
+ });
+
+ test('static is not required for scoping styling', function() {
+ var e = document.createElement('x-class-no-is');
+ document.body.appendChild(e);
+ assertComputed(e, '1px');
+ });
+
+ test('template string has scoped styling', function() {
+ var e = document.createElement('x-template-string');
+ document.body.appendChild(e);
+ assertComputed(e, '1px');
+ });
+
+ test('styles work correctly when not direct children of the template', function() {
+ var e = document.createElement('x-nested-style');
+ document.body.appendChild(e);
+ assertComputed(e, '10px');
+ assertComputed(e, '10px', 'padding-top');
+ });
+
+ test('interleaved styles and styles with includes work as expected', function() {
+ var e = document.createElement('x-interleaved-styles');
+ document.body.appendChild(e);
+ assertComputed(e, '5px', 'padding-top');
+ });
+
+});
+
+suite('double including style sheets', function() {
+ let el;
+
+ setup(function() {
+ el = document.createElement('double-shared-styling-element');
+ document.body.appendChild(el);
+ });
+
+ teardown(function() {
+ document.body.removeChild(el);
+ });
+
+ test('only includes style modules once', function() {
+ const style = el.shadowRoot.querySelector('style');
+
+ // We cant use the regular "does a sub-node have the correct style",
+ // because we actually need to assert on the actual style content.
+ // In native shadow dom, the style element resides in the shadowRoot,
+ // but in shadyDOM it has moved to the head and the selector has been altered.
+ if (style) {
+ assert.equal(style.textContent, `.double-shared-style {
+ color: green;
+}`, 'There should be only one class selector in this style element');
+ } else {
+ assert.equal(document.head.querySelector('[scope="double-shared-styling-element"]').textContent,
+`.double-shared-style.double-shared-styling-element {
+ color: green;
+}`);
+ }
+ });
+});
+
+if (window.ShadyDOM) {
+
+ suite('scoped-styling-shady-only', function() {
+
+ test('element style precedence below document styles', function() {
+ assertComputed(styledWide.$.priority, '1px');
+ });
+
+ test('styles shimmed in registration order', function() {
+ var regList = customElements.defineOrder;
+ function regIndex(styleScope) {
+ for (var i=0, r; (r=regList[i]); i++) {
+ if (styleScope.match(new RegExp(r + '\\-?\\d*$'))) {
+ return i;
+ }
+ }
+ }
+ var s$ = document.head.querySelectorAll('style[scope]');
+ for (var i=0, scope, prevScope, n=0, o=0; i<s$.length; i++) {
+ scope = s$[i].getAttribute('scope');
+ n = regIndex(scope);
+ assert.isTrue(n >= o, 'style not in registration order, expected `' +
+ scope + '` to be before `' + prevScope + '`');
+ o = n;
+ prevScope = scope;
+ }
+ });
+
+ test('svg elements properly scoped', function() {
+ assert.include(styled.$.circle.getAttribute('class'), 'x-styled');
+ assert.include(styled.$.circle.getAttribute('class'), 'style-scope');
+ assert.notInclude(styled.$.circle.getAttribute('class'), 'null');
+ assertComputed(styled.$.circle, '1px', 'strokeWidth');
+ });
+
+ test('dom-bind content is unscoped', function() {
+ var e = document.querySelector('#bind');
+ e.dynamic = 'dynamic';
+ var staticClassEl = document.querySelector('#dom-bind-static');
+ assert.equal(staticClassEl.className, 'static');
+ var dynamicClassEl = document.querySelector('#dom-bind-dynamic');
+ assert.equal(dynamicClassEl.className, 'dynamic');
+ });
+
+ test('serializeValueToAttribute for class', function() {
+ var s = styled.$.scopeClass;
+ var scope = s.$.scope;
+ assert.isTrue(s.classList.contains('style-scope'));
+ assert.isTrue(s.classList.contains('x-styled'));
+ s.serializeValueToAttribute('foo', 'class');
+ assert.isTrue(s.classList.contains('foo'));
+ assert.isTrue(s.classList.contains('style-scope'));
+ assert.isTrue(s.classList.contains('x-styled'));
+ //
+ assert.isTrue(scope.classList.contains('style-scope'));
+ assert.isTrue(scope.classList.contains('x-scope-class'));
+ s.serializeValueToAttribute('foo', 'class', scope);
+ assert.isTrue(scope.classList.contains('foo'));
+ assert.isTrue(scope.classList.contains('style-scope'));
+ assert.isTrue(scope.classList.contains('x-scope-class'));
+ });
+
+ test('specificity of :host selector with class', function() {
+ assertComputed(document.querySelector('x-specificity'), '1px');
+ assertComputed(document.querySelector('x-specificity.bar'), '2px');
+ });
+
+ test('specificity of ::slotted :not(template) selector', function() {
+ assertComputed(document.querySelector('x-specificity-nested'), '10px');
+ });
+
+ test('overwriting mixin properties', function() {
+ var el = document.querySelector('x-overriding');
+ assertComputed(el.shadowRoot.querySelector('.red'), '1px');
+ assertComputed(el.shadowRoot.querySelector('.green'), '2px');
+ assertComputed(el.shadowRoot.querySelector('.red-2'), '1px');
+ assertComputed(el.shadowRoot.querySelector('.blue'), '3px');
+ });
+
+ test('dynamically scope element class on add/remove', function () {
+ var el = document.createElement('x-scope-class');
+ document.body.appendChild(el);
+ flush();
+ var div = document.createElement('div');
+ el.shadowRoot.appendChild(div);
+ flush();
+ assert.isTrue(div.classList.contains('style-scope'));
+ assert.isTrue(div.classList.contains('x-scope-class'));
+ el.shadowRoot.appendChild(div);
+ flush();
+ document.body.removeChild(el);
+ });
+
+ test('dynamically scope element class on setAttribute class', function () {
+ var el = document.createElement('x-scope-class');
+ document.body.appendChild(el);
+ flush();
+ var div = document.createElement('div');
+ el.shadowRoot.appendChild(div);
+ flush();
+ div.setAttribute('class', 'foo');
+ assert.isTrue(div.classList.contains('foo'));
+ assert.isTrue(div.classList.contains('style-scope'));
+ assert.isTrue(div.classList.contains('x-scope-class'));
+ el.shadowRoot.appendChild(div);
+ flush();
+ document.body.removeChild(el);
+ });
+
+ test('dynamically scope element class on set className', function () {
+ var el = document.createElement('x-scope-class');
+ document.body.appendChild(el);
+ flush();
+ var div = document.createElement('div');
+ el.shadowRoot.appendChild(div);
+ flush();
+ div.className = 'foo';
+ assert.isTrue(div.classList.contains('foo'));
+ assert.isTrue(div.classList.contains('style-scope'));
+ assert.isTrue(div.classList.contains('x-scope-class'));
+ el.shadowRoot.appendChild(div);
+ flush();
+ document.body.removeChild(el);
+ });
+
+ });
+
+}
+</script>
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/sub/resolveurl-elements.js b/third_party/polymer3/bower_components/polymer/test/unit/sub/resolveurl-elements.js
new file mode 100644
index 0000000..59ba244
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/sub/resolveurl-elements.js
@@ -0,0 +1,65 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import { html } from '../../../lib/utils/html-tag.js';
+
+import { PolymerElement } from '../../../polymer-element.js';
+import { DomModule } from '../../../lib/elements/dom-module.js';
+import { Polymer } from '../../../lib/legacy/polymer-fn.js';
+import { pathFromUrl } from '../../../lib/utils/resolve-url.js';
+
+const $_documentContainer = document.createElement('template');
+$_documentContainer.setAttribute('style', 'display: none;');
+const baseAssetPath = pathFromUrl(import.meta.url);
+$_documentContainer.innerHTML = `<dom-module id="p-r-ap" assetpath="${baseAssetPath}../../assets/"></dom-module>`;
+document.head.appendChild($_documentContainer.content);
+
+class PR extends PolymerElement {
+ static get template() {
+ return html`
+ <style>
+ .logo {
+ background-image: url(foo.z);
+ clip-path: url('#bar');
+ mask-image: url('/zot');
+ }
+ </style>
+ <div id="div" class="logo" style\$="background-image: url('[[importPath]]foo.z');"></div>
+ <img id="img" src\$="[[importPath]]foo.z">
+ <a id="a" href\$="[[importPath]]foo.z">Foo</a>
+ <zonk id="import" url\$="[[importPath]]foo.z"></zonk>
+ <zonk id="resolveUrl" url\$="[[resolveUrl('foo.z')]]"></zonk>
+ <zonk id="resolveUrlHash" url\$="[[resolveUrl('#foo')]]"></zonk>
+ <zonk id="resolveUrlAbs" url\$="[[resolveUrl('/foo')]]"></zonk>
+ <zonk id="root" url\$="[[rootPath]]foo.z"></zonk>
+ <a id="rel" href\$="[[importPath]]../foo.z?123">Foo</a>
+ <a id="action" action="foo.z">Foo</a>
+ <form id="formAction" action\$="[[importPath]]foo.z"></form>
+ <a id="hash" href="#foo.z">Foo</a>
+ <a id="absolute" href="/foo.z">Foo</a>
+ <a id="protocol" href="data:foo.z">Foo</a>
+`;
+ }
+ static get is() { return 'p-r'; }
+ static get importMeta() {
+ return import.meta;
+ }
+}
+customElements.define(PR.is, PR);
+
+const PRHybrid = Polymer({
+ is: 'p-r-hybrid',
+ _template: PR.template,
+ importMeta: import.meta
+});
+
+class PRAp extends PolymerElement {
+ static get is() { return 'p-r-ap'; }
+}
+customElements.define(PRAp.is, PRAp);
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/sub/style-import.js b/third_party/polymer3/bower_components/polymer/test/unit/sub/style-import.js
new file mode 100644
index 0000000..c7cfbe4
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/sub/style-import.js
@@ -0,0 +1,26 @@
+import { pathFromUrl } from '../../../lib/utils/resolve-url.js';
+
+const $_documentContainer = document.createElement('template');
+$_documentContainer.setAttribute('style', 'display: none;');
+const baseAssetPath = pathFromUrl(import.meta.url);
+$_documentContainer.innerHTML = `<dom-module id="style-import" assetpath="${baseAssetPath}">
+ <template>
+ <style>
+ .foo {
+ height: 2px;
+ border: 1px solid orange;
+ background: url(google.png);
+ }
+ </style>
+ </template>
+</dom-module><dom-module id="style-import2" assetpath="${baseAssetPath}">
+ <template>
+ <style>
+ .foo {
+ width: 4px;
+ }
+ </style>
+ </template>
+</dom-module>`;
+
+document.head.appendChild($_documentContainer.content);
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/sub/x-sub.html b/third_party/polymer3/bower_components/polymer/test/unit/sub/x-sub.html
new file mode 100644
index 0000000..79f8c12
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/sub/x-sub.html
@@ -0,0 +1,12 @@
+<dom-module id="x-sub">
+ <template>
+ <div id="test">test</div>
+ </template>
+ <script type="module">
+import { PolymerElement } from '../../../polymer-element.js';
+class XSub extends PolymerElement {
+ static get is() { return 'x-sub' }
+}
+customElements.define(XSub.is, XSub);
+</script>
+</dom-module>
\ No newline at end of file
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/sub/x-test.html b/third_party/polymer3/bower_components/polymer/test/unit/sub/x-test.html
new file mode 100644
index 0000000..8cfe535
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/sub/x-test.html
@@ -0,0 +1,11 @@
+<dom-module id="x-test">
+ <template>
+ <x-sub id="sub">sub</x-sub>
+ </template>
+ <script type="module">
+import { Polymer } from '../../../lib/legacy/polymer-fn.js';
+Polymer({
+ is: 'x-test'
+})
+</script>
+</dom-module>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/template-stamp.html b/third_party/polymer3/bower_components/polymer/test/unit/template-stamp.html
new file mode 100644
index 0000000..6337a15
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/template-stamp.html
@@ -0,0 +1,99 @@
+<!DOCTYPE html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="UTF-8">
+
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+
+ <script type="module" src="../../lib/mixins/template-stamp.js"></script>
+</head>
+<body>
+
+ <template id="test-template" strip-whitespace>
+ <div id="a">a</div>
+ <div id="eventHandler" on-click="handleClick"></div>
+ <div id="b">b</div>
+ <template id="nestedTemplate">
+ <div on-click="handleClick"></div>
+ </template>
+ <template id="preservedTemplate" preserve-content>
+ <div on-click="shouldNotBeRemoved"></div>
+ </template>
+ </template>
+
+ <script type="module">
+import { TemplateStamp } from '../../lib/mixins/template-stamp.js';
+class TemplateStamper extends TemplateStamp(HTMLElement) {
+ connectedCallback() {
+ this.handleClick = sinon.spy(event => {
+ this.handleClickTarget = event.target;
+ });
+ let template = document.getElementById('test-template');
+ this.dom = this._stampTemplate(template);
+ this.attachShadow({mode:'open'}).appendChild(this.dom);
+ }
+}
+customElements.define('template-stamper', TemplateStamper);
+</script>
+
+ <script type="module">
+import '../../lib/mixins/template-stamp.js';
+
+suite('template-stamp', () => {
+
+ test('id map', () => {
+ let el = document.createElement('template-stamper');
+ document.body.appendChild(el);
+ assert.equal(el.dom.$.a.textContent, 'a');
+ assert.equal(el.dom.$.b.textContent, 'b');
+ document.body.removeChild(el);
+ });
+
+ test('declarative events', () => {
+ let el = document.createElement('template-stamper');
+ document.body.appendChild(el);
+ el.dom.$.eventHandler.click();
+ assert.equal(el.handleClick.callCount, 1);
+ assert.equal(el.handleClick.firstCall.args[0].type, 'click');
+ assert.equal(el.handleClickTarget, el.dom.$.eventHandler);
+ document.body.removeChild(el);
+ });
+
+ test('cached template content', () => {
+ let el = document.createElement('template-stamper');
+ document.body.appendChild(el);
+ let content = el.constructor._contentForTemplate(el.dom.$.nestedTemplate);
+ assert.isTrue(content instanceof DocumentFragment);
+ assert.notOk(content.ownerDocument.defaultView);
+ assert.equal(content.firstChild.getAttribute('on-click'), null);
+ document.body.removeChild(el);
+ });
+
+ test('preserved template content', () => {
+ let el = document.createElement('template-stamper');
+ document.body.appendChild(el);
+ let content = el.dom.$.preservedTemplate.content;
+ assert.isTrue(content instanceof DocumentFragment);
+ assert.equal(content.childNodes[1].getAttribute('on-click'), 'shouldNotBeRemoved');
+ document.body.removeChild(el);
+ });
+
+});
+
+// Note template parsing API is tested in `property-effects-template.html`,
+// combined with adding property effects
+</script>
+
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/template-whitespace.html b/third_party/polymer3/bower_components/polymer/test/unit/template-whitespace.html
new file mode 100644
index 0000000..b080748
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/template-whitespace.html
@@ -0,0 +1,205 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+</head>
+<body>
+
+<dom-module id="has-whitespace">
+
+ <template> <div>A</div> <div>B</div> </template>
+
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'has-whitespace'
+});
+</script>
+
+</dom-module>
+
+
+
+<dom-module id="no-whitespace">
+
+ <template strip-whitespace>
+ <div>A</div>
+ <div>A</div>
+ <div>B</div>
+ </template>
+
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'no-whitespace'
+});
+</script>
+
+</dom-module>
+
+
+
+<dom-module id="no-whitespace-style">
+
+ <template strip-whitespace>
+ <style>
+ :host {
+ display: block;
+ }
+ </style>
+ <div>A</div>
+ <div>B</div>
+ </template>
+
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'no-whitespace-style'
+});
+</script>
+
+</dom-module>
+
+<dom-module id="no-whitespace-nested">
+
+ <template strip-whitespace>
+ <div>
+ <div>A</div>
+ </div>
+ <div>
+ <div>B</div>
+ </div>
+ </template>
+
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ is: 'no-whitespace-nested'
+});
+</script>
+
+</dom-module>
+
+<dom-module id="no-whitespace-binding">
+
+ <template strip-whitespace>
+
+ <div id="text">{{text}}</div>
+ <div id="attr" attr$="{{attr}}">
+ <div>A</div>
+ </div>
+ <div>
+ <div>B</div>
+ </div>
+ <div id="compound"> {{a}} {{b}} </div>
+ </template>
+
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ properties: {
+ text: {value: 'text'},
+ attr: {value: 'attr'},
+ a: {value: 'a'},
+ b: {value: 'b'}
+ },
+ is: 'no-whitespace-binding'
+});
+</script>
+
+</dom-module>
+
+<dom-module id="no-whitespace-repeat">
+
+ <template strip-whitespace>
+
+ <template is="dom-repeat" items="[[items]]">
+ <div></div>
+ </template>
+
+ </template>
+
+ <script type="module">
+import { Polymer } from '../../polymer-legacy.js';
+Polymer({
+ properties: {
+ items: {
+ value: function() { return [1, 2, 3];}
+ }
+ },
+ is: 'no-whitespace-repeat'
+});
+</script>
+
+</dom-module>
+
+
+
+<script type="module">
+import { flush } from '../../lib/utils/flush.js';
+
+suite('polymer: template whitespace', function() {
+
+ test('template stamped with whitespace preserved', function() {
+ var el = document.createElement('has-whitespace');
+ document.body.appendChild(el);
+ assert.equal(el.root.childNodes.length, 5);
+ assert.equal(el.root.childNodes[0].nodeType, Node.TEXT_NODE);
+ });
+
+ test('template stamped without whitespace when strip-template is used', function() {
+ var el = document.createElement('no-whitespace');
+ document.body.appendChild(el);
+ assert.equal(el.root.childNodes.length, 3);
+ assert.equal(el.root.childNodes.length, el.root.children.length);
+ });
+
+ test('template including style stamped without whitespace when strip-template is used', function() {
+ var el = document.createElement('no-whitespace-style');
+ document.body.appendChild(el);
+ var c$ = Array.from(el.root.childNodes).filter(function(e) {
+ return e.localName != 'style';});
+ assert.equal(c$.length, 2);
+ });
+
+ test('template with nested content stamped without whitespace when strip-template is used', function() {
+ var el = document.createElement('no-whitespace-nested');
+ document.body.appendChild(el);
+ assert.equal(el.root.childNodes.length, 2);
+ assert.equal(el.root.childNodes.length, el.root.children.length);
+ assert.equal(el.root.childNodes[0].childNodes.length, el.root.childNodes[0].children.length);
+ assert.equal(el.root.childNodes[1].childNodes.length, el.root.childNodes[1].children.length);
+ });
+
+ test('template with nested content stamped without whitespace when strip-template is used', function() {
+ var el = document.createElement('no-whitespace-binding');
+ document.body.appendChild(el);
+ assert.equal(el.$.text.textContent, 'text');
+ assert.equal(el.$.attr.getAttribute('attr'), 'attr');
+ assert.equal(el.$.compound.textContent, ' a b ');
+ });
+
+ test('template with dom-repeat stamped without whitespace when strip-template is used', function() {
+ var el = document.createElement('no-whitespace-repeat');
+ document.body.appendChild(el);
+ flush();
+ assert.equal(el.shadowRoot.childNodes.length, 4);
+ });
+
+});
+</script>
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/templatize-elements.js b/third_party/polymer3/bower_components/polymer/test/unit/templatize-elements.js
new file mode 100644
index 0000000..e9b7c6d
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/templatize-elements.js
@@ -0,0 +1,230 @@
+/**
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+import { Polymer } from '../../lib/legacy/polymer-fn.js';
+
+import { templatize as templatize$0 } from '../../lib/utils/templatize.js';
+import { Templatizer } from '../../lib/legacy/templatizer-behavior.js';
+import { html } from '../../lib/utils/html-tag.js';
+
+Polymer({
+ is: 'x-child',
+ properties: {
+ outerProp: {
+ notify: true
+ },
+ outerObj: {
+ notify: true
+ },
+ outerObjProp: {
+ notify: true
+ },
+ prop: {
+ notify: true
+ },
+ obj: {
+ notify: true
+ },
+ objProp: {
+ notify: true
+ },
+ outerInnerConflict: {
+ notify: true
+ }
+ },
+ observers: [
+ 'objChanged(obj.*)',
+ 'outerObjChanged(outerObj.*)'
+ ],
+ objChanged: function() {},
+ outerObjChanged: function() {}
+});
+
+Polymer({
+ is: 'x-templatize',
+ properties: {
+ obj: {
+ notify: true
+ },
+ prop: {
+ notify: true,
+ observer: 'propChanged'
+ }
+ },
+ observers: [
+ 'objChanged(obj.*)'
+ ],
+ propChanged: function(value) {
+ if (this.instance) {
+ this.instance.prop = value;
+ }
+ },
+ objChanged: function(info) {
+ if (this.instance) {
+ this.instance.notifyPath(info.path, info.value);
+ }
+ },
+ go: function(withProps) {
+ var template = this.querySelector('template');
+ var ctor = templatize$0(template, this, {
+ parentModel: true,
+ instanceProps: {
+ obj: true,
+ prop: true,
+ outerInnerConflict: true
+ },
+ forwardHostProp: function(prop, value) {
+ if (this.instance) {
+ this.instance.forwardHostProp(prop, value);
+ }
+ },
+ notifyInstanceProp: function(inst, prop, value) {
+ // notify path on host (set won't work since it dirty checks)
+ this.notifyPath(prop, value);
+ }
+ });
+ this.instance = new ctor(
+ withProps ? {
+ obj: this.obj,
+ prop: this.prop,
+ outerInnerConflict: {
+ prop: 'bar'
+ }
+ } : null);
+ this.parentNode.appendChild(this.instance.root);
+ }
+});
+
+Polymer({
+ is: 'x-templatize-behavior',
+ properties: {
+ obj: {
+ notify: true
+ },
+ prop: {
+ notify: true,
+ observer: 'propChanged'
+ }
+ },
+ observers: [
+ 'objChanged(obj.*)'
+ ],
+ behaviors: [Templatizer],
+ propChanged: function(value) {
+ if (this.instance) {
+ this.instance.prop = value;
+ }
+ },
+ objChanged: function(info) {
+ if (this.instance) {
+ this.instance.notifyPath(info.path, info.value);
+ }
+ },
+ _parentModel: true,
+ _instanceProps: {
+ obj: true,
+ prop: true,
+ outerInnerConflict: true
+ },
+ _forwardHostPropV2: function(prop, value) {
+ if (this.instance) {
+ this.instance.forwardHostProp(prop, value);
+ }
+ },
+ _notifyInstancePropV2: function(inst, prop, value) {
+ // notify path on host (set won't work since it dirty checks)
+ this.notifyPath(prop, value);
+ },
+ go: function(withProps) {
+ var template = this.querySelector('template');
+ this.templatize(template);
+ this.instance = this.stamp(
+ withProps ? {
+ obj: this.obj,
+ prop: this.prop,
+ outerInnerConflict: {
+ prop: 'bar'
+ }
+ } : null);
+ this.parentNode.appendChild(this.instance.root);
+ }
+});
+
+Polymer({
+ _template: html`
+ <x-templatize obj="{{objA}}" prop="{{propA}}" id="templatizeA">
+ <template>
+ <x-child on-tap="handleTap" id="childA" outer-prop="{{outerProp}}" outer-obj="{{outerObj}}" outer-obj-prop="{{outerObj.prop}}" prop="{{prop}}" obj="{{obj}}" obj-prop="{{obj.prop}}" conflict="{{outerInnerConflict.prop}}" computed-from-literal="{{computeFromLiteral(33, prop)}}"></x-child>
+ </template>
+ </x-templatize>
+
+ <x-templatize prop="prop-a" name="templatizeB">
+ <template>
+ <x-child id="childB" computed-from-literal="{{computeFromLiteral(33, prop)}}"></x-child>
+ </template>
+ </x-templatize>
+
+ <x-templatize-behavior obj="{{objA}}" prop="{{propA}}" id="templatizeC">
+ <template>
+ <x-child on-tap="handleTap" id="childC" outer-prop="{{outerProp}}" outer-obj="{{outerObj}}" outer-obj-prop="{{outerObj.prop}}" prop="{{prop}}" obj="{{obj}}" obj-prop="{{obj.prop}}" conflict="{{outerInnerConflict.prop}}" computed-from-literal="{{computeFromLiteral(33, prop)}}"></x-child>
+ </template>
+
+
+ </x-templatize-behavior>
+`,
+
+ is: 'x-host',
+
+ properties: {
+ outerProp: {
+ value: 'outerProp'
+ },
+ outerObj: {
+ value: function() {
+ return { prop: 'outerObj.prop' };
+ }
+ },
+ propA: {
+ value: 'prop-a'
+ },
+ objA: {
+ value: function() {
+ return { prop: 'objA.prop' };
+ }
+ },
+ propB: {
+ value: 'prop-b'
+ },
+ objB: {
+ value: function() {
+ return { prop: 'objB.prop' };
+ }
+ },
+ outerInnerConflict: {
+ value: function() {
+ return { prop: 'conflict' };
+ }
+ }
+ },
+
+ observers: [
+ 'outerObjChanged(outerObj.*)',
+ 'objAChanged(objA.*)',
+ 'objBChanged(objB.*)'
+ ],
+
+ created: function() {
+ this.handleTap = sinon.spy();
+ },
+
+ outerObjChanged: function() {},
+ objAChanged: function() {},
+ objBChanged: function() {},
+ computeFromLiteral: function(literal, prop) { return literal + '-' + prop; }
+});
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/templatize.html b/third_party/polymer3/bower_components/polymer/test/unit/templatize.html
new file mode 100644
index 0000000..487f870
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/templatize.html
@@ -0,0 +1,373 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+Code distributed by Google as part of the polymer project is also
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="../../node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js"></script>
+ <script src="wct-browser-config.js"></script>
+ <script src="../../node_modules/wct-browser-legacy/browser.js"></script>
+ <script type="module" src="../../polymer-legacy.js"></script>
+ <script type="module" src="./templatize-elements.js"></script>
+</head>
+<body>
+
+<template id="standalone"><div prop="[[prop]]">[[text]]</div></template>
+
+<script type="module">
+import './templatize-elements.js';
+import { templatize } from '../../lib/utils/templatize.js';
+
+suite('templatize basic', function() {
+
+ let host;
+ let childA;
+
+ setup(function() {
+ host = document.createElement('x-host');
+ document.body.appendChild(host);
+ host.$.templatizeA.go(true);
+ childA = host.shadowRoot.querySelector('#childA');
+ assert.ok(childA);
+ });
+
+ teardown(function() {
+ document.body.removeChild(host);
+ });
+
+ test('stamped with initial data', function() {
+ assert.equal(childA.outerProp, 'outerProp');
+ assert.equal(childA.outerObj, host.outerObj);
+ assert.equal(childA.outerObjProp, 'outerObj.prop');
+ assert.equal(childA.prop, 'prop-a');
+ assert.equal(childA.obj, host.objA);
+ assert.equal(childA.objProp, 'objA.prop');
+ });
+
+ test('host properties propagated in', function() {
+ host.outerProp = 'outerProp++';
+ assert.equal(childA.outerProp, 'outerProp++');
+ host.outerObj = { prop: 'outerObj++.prop' };
+ assert.equal(childA.outerObj, host.outerObj);
+ assert.equal(childA.outerObjProp, 'outerObj++.prop');
+ });
+
+ test('host paths propagated in', function() {
+ sinon.spy(childA, 'outerObjChanged');
+ host.set('outerObj.prop', 'outerObj.prop++');
+ assert.equal(childA.outerObjProp, 'outerObj.prop++');
+ assert.isTrue(childA.outerObjChanged.calledOnce);
+ assert.equal(childA.outerObjChanged.getCall(0).args[0].path, 'outerObj.prop');
+ assert.equal(childA.outerObjChanged.getCall(0).args[0].value, 'outerObj.prop++');
+ });
+
+ test('host properties propagated out', function() {
+ childA.outerProp = 'outerProp++';
+ assert.equal(host.outerProp, 'outerProp++');
+ childA.outerObj = { prop: 'outerObj++.prop' };
+ assert.equal(host.outerObj.prop, 'outerObj++.prop');
+ });
+
+ test('host paths propagated out', function() {
+ sinon.spy(host, 'outerObjChanged');
+ childA.set('outerObj.prop', 'outerObj.prop++');
+ assert.equal(host.outerObj.prop, 'outerObj.prop++');
+ assert.isTrue(host.outerObjChanged.calledOnce);
+ assert.equal(host.outerObjChanged.getCall(0).args[0].path, 'outerObj.prop');
+ assert.equal(host.outerObjChanged.getCall(0).args[0].value, 'outerObj.prop++');
+ });
+
+ test('instance properties propagated in', function() {
+ host.propA = 'prop-a++';
+ assert.equal(childA.prop, 'prop-a++');
+ host.objA = { prop: 'objA++.prop' };
+ assert.equal(childA.obj, host.objA);
+ assert.equal(childA.objProp, 'objA++.prop');
+ });
+
+ test('instance paths propagated in', function() {
+ sinon.spy(childA, 'objChanged');
+ host.set('objA.prop', 'objA.prop++');
+ assert.equal(childA.obj.prop, 'objA.prop++');
+ assert.isTrue(childA.objChanged.calledOnce);
+ assert.equal(childA.objChanged.getCall(0).args[0].path, 'obj.prop');
+ assert.equal(childA.objChanged.getCall(0).args[0].value, 'objA.prop++');
+ });
+
+ test('instance properties propagated out', function() {
+ childA.prop = 'prop-a++';
+ assert.equal(host.propA, 'prop-a++');
+ childA.obj = { prop: 'objA++.prop' };
+ assert.equal(host.objA.prop, 'objA++.prop');
+ });
+
+ test('instance paths propagated out', function() {
+ sinon.spy(host, 'objAChanged');
+ childA.set('obj.prop', 'objA.prop++');
+ assert.equal(host.objA.prop, 'objA.prop++');
+ assert.isTrue(host.objAChanged.calledOnce);
+ assert.equal(host.objAChanged.getCall(0).args[0].path, 'objA.prop');
+ assert.equal(host.objAChanged.getCall(0).args[0].value, 'objA.prop++');
+ });
+
+ test('outer & inner props conflict', function() {
+ assert.equal(childA.conflict, 'bar');
+ host.set('outerInnerConflict.prop', 'foo');
+ assert.equal(childA.conflict, 'bar');
+ });
+
+ test('inline computed functions', function() {
+ assert.equal(childA.computedFromLiteral, '33-prop-a');
+ });
+
+ test('ensure literals are not forwarded to templates', function() {
+ assert.notOk(host._hasAccessor(33));
+ assert.notOk(Object.getOwnPropertyDescriptor(Object.getPrototypeOf(host), 33));
+ });
+
+ test('ensure undefined is not set on templatizee', function() {
+ assert.equal(host.$.templatizeA[undefined], undefined);
+ });
+
+ test('able to add gesture listeners', function() {
+ assert.equal(host.handleTap.callCount, 0);
+ childA.click();
+ assert.equal(host.handleTap.callCount, 1);
+ });
+
+ test('listener event decorated with model', function() {
+ host.outerProp = 'foo';
+ childA.click();
+ assert.equal(host.handleTap.callCount, 1);
+ let event = host.handleTap.firstCall.args[0];
+ assert.instanceOf(event, Event);
+ assert.ok(event.model);
+ assert.equal(event.model.outerProp, 'foo');
+ host.outerProp = 'bar';
+ assert.equal(event.model.outerProp, 'bar');
+ assert.equal(event.model.parentModel, host);
+ });
+
+});
+
+
+suite('templatize client with/without props', function() {
+
+ let host;
+ let childB;
+
+ setup(function() {
+ host = document.createElement('x-host');
+ document.body.appendChild(host);
+ });
+
+ teardown(function() {
+ document.body.removeChild(host);
+ });
+
+ test('templatize with no dataHost', function() {
+ host.shadowRoot.querySelector('[name=templatizeB]').go(true);
+ childB = host.shadowRoot.querySelector('#childB');
+ assert.ok(childB);
+ assert.equal(childB.computedFromLiteral, '33-prop-a');
+ });
+
+ test('templatize with no props', function() {
+ host.shadowRoot.querySelector('[name=templatizeB]').go(false);
+ childB = host.shadowRoot.querySelector('#childB');
+ assert.ok(childB);
+ assert.isUndefined(childB.computedFromLiteral);
+ });
+
+ test('templatize with no props, instance manually flushes', function() {
+ let templatizeA = host.shadowRoot.querySelector('[id=templatizeA]');
+ templatizeA.go(false);
+ let childA = host.shadowRoot.querySelector('#childA');
+ assert.ok(childA);
+ sinon.spy(childA, 'objChanged');
+ assert.isUndefined(childA.obj);
+ let o = {foo: true};
+ templatizeA.instance._setPendingProperty('obj', o);
+ templatizeA.instance._flushProperties();
+ assert.equal(childA.obj, o);
+ assert.isTrue(childA.objChanged.calledOnce);
+ });
+
+});
+
+suite('templatizer behavior', function() {
+
+ let host;
+ let childC;
+
+ setup(function() {
+ host = document.createElement('x-host');
+ document.body.appendChild(host);
+ host.$.templatizeC.go(true);
+ childC = host.shadowRoot.querySelector('#childC');
+ assert.ok(childC);
+ });
+
+ teardown(function() {
+ document.body.removeChild(host);
+ });
+
+ test('stamped with initial data', function() {
+ assert.equal(childC.outerProp, 'outerProp');
+ assert.equal(childC.outerObj, host.outerObj);
+ assert.equal(childC.outerObjProp, 'outerObj.prop');
+ assert.equal(childC.prop, 'prop-a');
+ assert.equal(childC.obj, host.objA);
+ assert.equal(childC.objProp, 'objA.prop');
+ });
+
+ test('host properties propagated in', function() {
+ host.outerProp = 'outerProp++';
+ assert.equal(childC.outerProp, 'outerProp++');
+ host.outerObj = { prop: 'outerObj++.prop' };
+ assert.equal(childC.outerObj, host.outerObj);
+ assert.equal(childC.outerObjProp, 'outerObj++.prop');
+ });
+
+ test('host paths propagated in', function() {
+ sinon.spy(childC, 'outerObjChanged');
+ host.set('outerObj.prop', 'outerObj.prop++');
+ assert.equal(childC.outerObjProp, 'outerObj.prop++');
+ assert.isTrue(childC.outerObjChanged.calledOnce);
+ assert.equal(childC.outerObjChanged.getCall(0).args[0].path, 'outerObj.prop');
+ assert.equal(childC.outerObjChanged.getCall(0).args[0].value, 'outerObj.prop++');
+ });
+
+ test('host properties propagated out', function() {
+ childC.outerProp = 'outerProp++';
+ assert.equal(host.outerProp, 'outerProp++');
+ childC.outerObj = { prop: 'outerObj++.prop' };
+ assert.equal(host.outerObj.prop, 'outerObj++.prop');
+ });
+
+ test('host paths propagated out', function() {
+ sinon.spy(host, 'outerObjChanged');
+ childC.set('outerObj.prop', 'outerObj.prop++');
+ assert.equal(host.outerObj.prop, 'outerObj.prop++');
+ assert.isTrue(host.outerObjChanged.calledOnce);
+ assert.equal(host.outerObjChanged.getCall(0).args[0].path, 'outerObj.prop');
+ assert.equal(host.outerObjChanged.getCall(0).args[0].value, 'outerObj.prop++');
+ });
+
+ test('instance properties propagated in', function() {
+ host.propA = 'prop-a++';
+ assert.equal(childC.prop, 'prop-a++');
+ host.objA = { prop: 'objA++.prop' };
+ assert.equal(childC.obj, host.objA);
+ assert.equal(childC.objProp, 'objA++.prop');
+ });
+
+ test('instance paths propagated in', function() {
+ sinon.spy(childC, 'objChanged');
+ host.set('objA.prop', 'objA.prop++');
+ assert.equal(childC.obj.prop, 'objA.prop++');
+ assert.isTrue(childC.objChanged.calledOnce);
+ assert.equal(childC.objChanged.getCall(0).args[0].path, 'obj.prop');
+ assert.equal(childC.objChanged.getCall(0).args[0].value, 'objA.prop++');
+ });
+
+ test('instance properties propagated out', function() {
+ childC.prop = 'prop-a++';
+ assert.equal(host.propA, 'prop-a++');
+ childC.obj = { prop: 'objA++.prop' };
+ assert.equal(host.objA.prop, 'objA++.prop');
+ });
+
+ test('instance paths propagated out', function() {
+ sinon.spy(host, 'objAChanged');
+ childC.set('obj.prop', 'objA.prop++');
+ assert.equal(host.objA.prop, 'objA.prop++');
+ assert.isTrue(host.objAChanged.calledOnce);
+ assert.equal(host.objAChanged.getCall(0).args[0].path, 'objA.prop');
+ assert.equal(host.objAChanged.getCall(0).args[0].value, 'objA.prop++');
+ });
+
+ test('outer & inner props conflict', function() {
+ assert.equal(childC.conflict, 'bar');
+ host.set('outerInnerConflict.prop', 'foo');
+ assert.equal(childC.conflict, 'bar');
+ });
+
+ test('inline computed functions', function() {
+ assert.equal(childC.computedFromLiteral, '33-prop-a');
+ });
+
+ test('ensure literals are not forwarded to templates', function() {
+ assert.notOk(host._hasAccessor(33));
+ assert.notOk(Object.getOwnPropertyDescriptor(Object.getPrototypeOf(host), 33));
+ });
+
+ test('ensure undefined is not set on templatizee', function() {
+ assert.equal(host.$.templatizeA[undefined], undefined);
+ });
+
+ test('able to add gesture listeners', function() {
+ assert.equal(host.handleTap.callCount, 0);
+ childC.click();
+ assert.equal(host.handleTap.callCount, 1);
+ });
+
+ test('listener event decorated with model', function() {
+ host.outerProp = 'foo';
+ childC.click();
+ assert.equal(host.handleTap.callCount, 1);
+ let event = host.handleTap.firstCall.args[0];
+ assert.instanceOf(event, Event);
+ assert.ok(event.model);
+ assert.equal(event.model.outerProp, 'foo');
+ host.outerProp = 'bar';
+ assert.equal(event.model.outerProp, 'bar');
+ });
+
+});
+
+suite('templatize with no host', function() {
+
+ test('stamped with initial data', function() {
+ const template = document.getElementById('standalone').cloneNode(true);
+ const Template = templatize(template);
+ const inst = new Template({prop: 'prop', text: 'text'});
+ const div = inst.root.firstChild;
+ assert.equal(div.prop, 'prop');
+ assert.equal(div.textContent, 'text');
+ });
+
+ test('stamped with no initial data', function() {
+ const template = document.getElementById('standalone').cloneNode(true);
+ const Template = templatize(template);
+ const inst = new Template();
+ const div = inst.root.firstChild;
+ assert.equal(div.prop, undefined);
+ assert.equal(div.textContent.trim(), '');
+ inst.setProperties({prop: 'prop', text: 'text'});
+ assert.equal(div.prop, 'prop');
+ assert.equal(div.textContent, 'text');
+ });
+
+ test('notifies path data changes', function() {
+ const template = document.getElementById('standalone').cloneNode(true);
+ const Template = templatize(template);
+ const inst = new Template();
+ const div = inst.root.firstChild;
+ inst.setProperties({prop: {foo: true}});
+ assert.equal(div.prop.foo, true);
+ inst.set('prop.foo', false);
+ assert.equal(div.prop.foo, false);
+ });
+
+});
+</script>
+</body>
+</html>
diff --git a/third_party/polymer3/bower_components/polymer/test/unit/wct-browser-config.js b/third_party/polymer3/bower_components/polymer/test/unit/wct-browser-config.js
new file mode 100644
index 0000000..5c7a463
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/test/unit/wct-browser-config.js
@@ -0,0 +1,12 @@
+window.WCT = {
+ environmentScripts: [
+ 'stacky/lib/parsing.js',
+ 'stacky/lib/formatting.js',
+ 'stacky/lib/normalization.js',
+ 'mocha/mocha.js',
+ 'chai/chai.js',
+ '@polymer/sinonjs/sinon.js',
+ 'accessibility-developer-tools/dist/js/axs_testing.js',
+ '@polymer/test-fixture/test-fixture.js'
+]
+};
diff --git a/third_party/polymer3/bower_components/polymer/util/.eslintrc.json b/third_party/polymer3/bower_components/polymer/util/.eslintrc.json
new file mode 100644
index 0000000..10d2238
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/util/.eslintrc.json
@@ -0,0 +1,5 @@
+{
+ "env": {
+ "node": true
+ }
+}
diff --git a/third_party/polymer3/bower_components/polymer/util/gen-changelog.sh b/third_party/polymer3/bower_components/polymer/util/gen-changelog.sh
new file mode 100755
index 0000000..dcfb7fb
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/util/gen-changelog.sh
@@ -0,0 +1,30 @@
+#!/bin/bash
+#
+# @license
+# Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+# This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+# The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+# The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+# Code distributed by Google as part of the polymer project is also
+# subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+#
+
+PRETTY="- %s ([commit](https://github.com/Polymer/polymer/commit/%h))%n"
+start="$1"
+end="$2"
+
+enddate=`git log -1 ${end} --pretty="%ai" | cut -d ' ' -f 1`
+
+old=""
+if [ -e CHANGELOG.md ]; then
+ old="`sed -e '1,2d' CHANGELOG.md`"
+fi
+
+cat > CHANGELOG.md <<EOD
+# Change Log
+
+## [${end}](https://github.com/Polymer/polymer/tree/${end}) (${enddate})
+`git log --no-merges "${start}".."${end}^1" --pretty="${PRETTY}"`
+
+${old}
+EOD
diff --git a/third_party/polymer3/bower_components/polymer/util/minimalDocument.js b/third_party/polymer3/bower_components/polymer/util/minimalDocument.js
new file mode 100644
index 0000000..b40256e
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/util/minimalDocument.js
@@ -0,0 +1,72 @@
+/**
+ * @license
+ * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+ * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ * Code distributed by Google as part of the polymer project is also
+ * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+ */
+
+const dom5 = require('dom5');
+const parse5 = require('parse5');
+const {Transform} = require('stream');
+
+const p = dom5.predicates;
+
+function onlyOneLicense(doc) {
+ let comments = dom5.nodeWalkAll(doc, dom5.isCommentNode);
+ let hasLicense = false;
+ for (let i = 0; i < comments.length; i++) {
+ let c = comments[i];
+ let text = dom5.getTextContent(c);
+ if (text.indexOf('@license') === -1 || hasLicense) {
+ dom5.remove(c);
+ } else {
+ hasLicense = true;
+ }
+ }
+}
+
+const blankRx = /^\s+$/;
+
+const isBlankNode = p.AND(dom5.isTextNode, (t) => blankRx.test(dom5.getTextContent(t)));
+
+class MinimalDocTransform extends Transform {
+ constructor() {
+ super({objectMode: true});
+ }
+ _transform(file, enc, cb) {
+ let doc = parse5.parse(String(file.contents), {locationInfo: true});
+ let vulc = dom5.query(doc, p.AND(p.hasTagName('div'), p.hasAttr('by-polymer-bundler'), p.hasAttr('hidden')));
+ let charset = dom5.query(doc, p.AND(p.hasTagName('meta'), p.hasAttrValue('charset', 'UTF-8')));
+
+ if (charset) {
+ dom5.remove(charset);
+ }
+
+ dom5.removeNodeSaveChildren(vulc);
+
+ let scripts = dom5.queryAll(doc, p.hasTagName('script'));
+ let collector = scripts[0];
+ let contents = [dom5.getTextContent(collector)];
+ for (let i = 1, s; i < scripts.length; i++) {
+ s = scripts[i];
+ dom5.remove(s);
+ contents.push(dom5.getTextContent(s));
+ }
+ dom5.setTextContent(collector, contents.join(''));
+
+ onlyOneLicense(doc);
+
+ dom5.removeFakeRootElements(doc);
+
+ dom5.nodeWalkAll(doc, isBlankNode).forEach((t) => dom5.remove(t));
+
+ file.contents = new Buffer(parse5.serialize(doc));
+
+ cb(null, file);
+ }
+}
+
+module.exports = () => new MinimalDocTransform();
diff --git a/third_party/polymer3/bower_components/polymer/util/travis-sauce-test.sh b/third_party/polymer3/bower_components/polymer/util/travis-sauce-test.sh
new file mode 100755
index 0000000..c2f80dd
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/util/travis-sauce-test.sh
@@ -0,0 +1,12 @@
+#!/usr/bin/env bash
+#
+# @license
+# Copyright (c) 2018 The Polymer Project Authors. All rights reserved.
+# This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+# The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+# The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+# Code distributed by Google as part of the polymer project is also
+# subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+#
+set -x
+node ./node_modules/.bin/polymer test --npm --module-resolution=node -s 'windows 10/microsoftedge@15' -s 'windows 10/microsoftedge@17' -s 'windows 8.1/internet explorer@11' -s 'os x 10.11/safari@9' -s 'macos 10.12/safari@10' -s 'macos 10.13/safari@11' -s 'Linux/chrome@41'
\ No newline at end of file
diff --git a/third_party/polymer3/bower_components/polymer/wct.conf.json b/third_party/polymer3/bower_components/polymer/wct.conf.json
new file mode 100644
index 0000000..5b315d7
--- /dev/null
+++ b/third_party/polymer3/bower_components/polymer/wct.conf.json
@@ -0,0 +1,20 @@
+{
+ "suites": ["test/runner.html"],
+ "environmentImports": [
+ "test-fixture/test-fixture.html"
+ ],
+ "plugins": {
+ "local": {
+ "browserOptions": {
+ "chrome": [
+ "headless",
+ "disable-gpu",
+ "no-sandbox"
+ ],
+ "firefox": [
+ "-headless"
+ ]
+ }
+ }
+ }
+}