CIPD UI: Add new Polymer 2.0 deps.

Commands used to generate this CL:

bower install chopsui --save
bower install app-router --save
bower install sugar --save

Then, I also manually edited bower.json to change google-apis to the latest and reran bower install.

Bug:495976
Change-Id: I0a64488dff202bf76c7ec758266c13b55b7c1b2c
diff --git a/polymer_2.0.2/bower.json b/polymer_2.0.2/bower.json
index 4b0548d..51beb4b 100644
--- a/polymer_2.0.2/bower.json
+++ b/polymer_2.0.2/bower.json
@@ -3,7 +3,7 @@
   "dependencies": {
     "app-layout": "^2.0.1",
     "app-route": "PolymerElements/app-route#^v2.0.1",
-    "google-apis": "^2.0.0",
+    "google-apis": "^2.0.1",
     "google-chart": "^1.1.2",
     "google-signin": "^1.3.7",
     "iron-ajax": "^2.0.4",
@@ -31,7 +31,10 @@
     "paper-toast": "^2.0.0",
     "paper-tooltip": "^2.0.0",
     "polymer": "^2.0.2",
-    "paper-styles": "^2.0.0"
+    "paper-styles": "^2.0.0",
+    "sugar": "^2.0.4",
+    "chopsui": "^0.0.36",
+    "app-router": "^2.7.2"
   },
   "devDependencies": {
     "web-component-tester": "^6.0.0"
@@ -45,6 +48,7 @@
     "iron-icon": "^2.0.1",
     "iron-iconset-svg": "^2.0.0",
     "iron-meta": "^2.0.2",
-    "webcomponentsjs": "^v1.0.2"
+    "webcomponentsjs": "^v1.0.2",
+    "paper-styles": "^2.0.0"
   }
 }
diff --git a/polymer_2.0.2/bower_components/app-layout/.bower.json b/polymer_2.0.2/bower_components/app-layout/.bower.json
index 2dd935b..09fdd9a 100644
--- a/polymer_2.0.2/bower_components/app-layout/.bower.json
+++ b/polymer_2.0.2/bower_components/app-layout/.bower.json
@@ -1,6 +1,6 @@
 {
   "name": "app-layout",
-  "version": "2.0.1",
+  "version": "2.0.4",
   "description": "A set of layout elements for your app",
   "authors": [
     "The Polymer Authors"
@@ -50,7 +50,7 @@
       },
       "devDependencies": {
         "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-        "web-component-tester": "^4.0.0",
+        "web-component-tester": "^6.0.0",
         "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
       },
       "resolutions": {
@@ -65,11 +65,11 @@
   "resolutions": {
     "webcomponentsjs": "^1.0.0"
   },
-  "_release": "2.0.1",
+  "_release": "2.0.4",
   "_resolution": {
     "type": "version",
-    "tag": "v2.0.1",
-    "commit": "63b5453e260d4fbe19513d02ca8a34a0555394dd"
+    "tag": "v2.0.4",
+    "commit": "623997a76bea695a51de0d4e96e11a8198e367da"
   },
   "_source": "https://github.com/PolymerElements/app-layout.git",
   "_target": "^2.0.1",
diff --git a/polymer_2.0.2/bower_components/app-layout/README.md b/polymer_2.0.2/bower_components/app-layout/README.md
index 505c0de..cd07604 100644
--- a/polymer_2.0.2/bower_components/app-layout/README.md
+++ b/polymer_2.0.2/bower_components/app-layout/README.md
@@ -218,7 +218,7 @@
   </app-box>
   ```
 
-- In `app-drawer-layout`, the `drawer-toggle` element will not be automatically hidden
+- In `app-drawer-layout`, the `drawer-toggle` element needs to be manually hidden
 when `app-drawer-layout` is not in narrow layout. To add this, add the following CSS rule where
 `app-drawer-layout` is used:
 
diff --git a/polymer_2.0.2/bower_components/app-layout/app-drawer-layout/README.md b/polymer_2.0.2/bower_components/app-layout/app-drawer-layout/README.md
index e5211b6..2ffe9b4 100644
--- a/polymer_2.0.2/bower_components/app-layout/app-drawer-layout/README.md
+++ b/polymer_2.0.2/bower_components/app-layout/app-drawer-layout/README.md
@@ -73,7 +73,7 @@
 </app-drawer-layout>
 ```
 
-**NOTE:** With app-layout 2.0, the `drawer-toggle` element will not be automatically hidden
+**NOTE:** With app-layout 2.0, the `drawer-toggle` element needs to be manually hidden
 when app-drawer-layout is not in narrow layout. To add this, add the following CSS rule where
 app-drawer-layout is used:
 
diff --git a/polymer_2.0.2/bower_components/app-layout/app-drawer-layout/app-drawer-layout.html b/polymer_2.0.2/bower_components/app-layout/app-drawer-layout/app-drawer-layout.html
index 1f1a02f..f85f261 100644
--- a/polymer_2.0.2/bower_components/app-layout/app-drawer-layout/app-drawer-layout.html
+++ b/polymer_2.0.2/bower_components/app-layout/app-drawer-layout/app-drawer-layout.html
@@ -85,7 +85,7 @@
 </app-drawer-layout>
 ```
 
-**NOTE:** With app-layout 2.0, the `drawer-toggle` element will not be automatically hidden
+**NOTE:** With app-layout 2.0, the `drawer-toggle` element needs to be manually hidden
 when app-drawer-layout is not in narrow layout. To add this, add the following CSS rule where
 app-drawer-layout is used:
 
diff --git a/polymer_2.0.2/bower_components/app-layout/app-header-layout/app-header-layout.html b/polymer_2.0.2/bower_components/app-layout/app-header-layout/app-header-layout.html
index db4cef0..5771f0c 100644
--- a/polymer_2.0.2/bower_components/app-layout/app-header-layout/app-header-layout.html
+++ b/polymer_2.0.2/bower_components/app-layout/app-header-layout/app-header-layout.html
@@ -125,6 +125,12 @@
         z-index: 0;
       }
 
+      @media print {
+        :host([has-scrolling-region]) #wrapper #contentContainer {
+          overflow-y: visible;
+        }
+      }
+
     </style>
 
     <div id="wrapper" class="initializing">
diff --git a/polymer_2.0.2/bower_components/app-layout/app-header/app-header.html b/polymer_2.0.2/bower_components/app-layout/app-header/app-header.html
index 58fbc83..38bd2fb 100644
--- a/polymer_2.0.2/bower_components/app-layout/app-header/app-header.html
+++ b/polymer_2.0.2/bower_components/app-layout/app-header/app-header.html
@@ -452,7 +452,7 @@
         }
         var nodes = Polymer.dom(this.$.slot).getDistributedNodes();
         // Get the element with the sticky attribute on it or the first element in the light DOM.
-        for (var i = 0, node; node = nodes[i]; i++) {
+        for (var i = 0, node; node = /** @type {!HTMLElement} */ (nodes[i]); i++) {
           if (node.nodeType === Node.ELEMENT_NODE) {
             if (node.hasAttribute('sticky')) {
               this._stickyElRef = node;
diff --git a/polymer_2.0.2/bower_components/app-layout/app-scroll-effects/effects/parallax-background.html b/polymer_2.0.2/bower_components/app-layout/app-scroll-effects/effects/parallax-background.html
index 52fa2c0..7c49fb7 100644
--- a/polymer_2.0.2/bower_components/app-layout/app-scroll-effects/effects/parallax-background.html
+++ b/polymer_2.0.2/bower_components/app-layout/app-scroll-effects/effects/parallax-background.html
@@ -30,7 +30,7 @@
         if (isNaN(scalar)) {
           scalar = 0.8;
         }
-        fx.deltaBg = this._dHeight * scalar;
+        fx.deltaBg = (this._dHeight || 0) * scalar;
       } else {
         if (isNaN(scalar)) {
           scalar = 1;
diff --git a/polymer_2.0.2/bower_components/app-layout/bower.json b/polymer_2.0.2/bower_components/app-layout/bower.json
index b62faa2..25d5f44 100644
--- a/polymer_2.0.2/bower_components/app-layout/bower.json
+++ b/polymer_2.0.2/bower_components/app-layout/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "app-layout",
-  "version": "2.0.1",
+  "version": "2.0.4",
   "description": "A set of layout elements for your app",
   "authors": [
     "The Polymer Authors"
@@ -50,7 +50,7 @@
       },
       "devDependencies": {
         "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-        "web-component-tester": "^4.0.0",
+        "web-component-tester": "^6.0.0",
         "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
       },
       "resolutions": {
diff --git a/polymer_2.0.2/bower_components/app-layout/helpers/helpers.html b/polymer_2.0.2/bower_components/app-layout/helpers/helpers.html
index cc932dd..f54c3f9 100644
--- a/polymer_2.0.2/bower_components/app-layout/helpers/helpers.html
+++ b/polymer_2.0.2/bower_components/app-layout/helpers/helpers.html
@@ -11,9 +11,11 @@
 <link rel="import" href="../../polymer/polymer.html">
 
 <script>
+  /** @namespace */
   Polymer.AppLayout = Polymer.AppLayout || {};
 
-  Polymer.AppLayout._scrollEffects = Polymer.AppLayout._scrollEffects || {};
+  Polymer.AppLayout._scrollEffects = {};
+  Polymer.AppLayout._scrollTimer = null;
 
   Polymer.AppLayout.scrollTimingFunction = function easeOutQuad(t, b, c, d) {
     t /= d;
@@ -42,7 +44,7 @@
     while (queue.length > 0) {
       var node = queue.shift();
       matches.push.apply(matches, node.querySelectorAll(selector));
-      for (i = 0; node.children[i]; i++) {
+      for (var i = 0; node.children[i]; i++) {
         if (node.children[i].shadowRoot) {
           queue.push(node.children[i].shadowRoot);
         }
@@ -131,7 +133,9 @@
       // This seems to only apply when using document scrolling.
       // Therefore, when should we remove the class from the document element?
 
-      window.cancelAnimationFrame(Polymer.AppLayout._scrollTimer);
+      if (Polymer.AppLayout._scrollTimer) {
+        window.cancelAnimationFrame(Polymer.AppLayout._scrollTimer);
+      }
 
       Polymer.AppLayout._scrollTimer = window.requestAnimationFrame(function() {
         headers.forEach(function(header) {
diff --git a/polymer_2.0.2/bower_components/app-route/.bower.json b/polymer_2.0.2/bower_components/app-route/.bower.json
index 712e3ce..ad63869 100644
--- a/polymer_2.0.2/bower_components/app-route/.bower.json
+++ b/polymer_2.0.2/bower_components/app-route/.bower.json
@@ -1,6 +1,6 @@
 {
   "name": "app-route",
-  "version": "2.0.1",
+  "version": "2.0.3",
   "authors": [
     "The Polymer Authors"
   ],
@@ -31,7 +31,7 @@
     "paper-styles": "PolymerElements/paper-styles#1 - 2",
     "paper-toggle-button": "polymerelements/paper-toggle-button#1 - 2",
     "url": "webcomponents/URL#^0.5.7",
-    "web-component-tester": "^4.0.0",
+    "web-component-tester": "^6.0.0",
     "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
   },
   "variants": {
@@ -52,7 +52,7 @@
         "paper-spinner": "PolymerElements/paper-spinner#^1.1.1",
         "paper-styles": "polymerelements/paper-styles#^1.0.13",
         "paper-toggle-button": "polymerelements/paper-toggle-button#^1.0.0",
-        "web-component-tester": "^4.0.0",
+        "web-component-tester": "^6.0.0",
         "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
       },
       "resolutions": {
@@ -63,11 +63,11 @@
   "resolutions": {
     "webcomponentsjs": "^1.0.0"
   },
-  "_release": "2.0.1",
+  "_release": "2.0.3",
   "_resolution": {
     "type": "version",
-    "tag": "v2.0.1",
-    "commit": "da2d1c251202bf0c76542a4cfdedec028ee3f33c"
+    "tag": "v2.0.3",
+    "commit": "951dc29dcf73583aee5e629bae3f1065107fd281"
   },
   "_source": "https://github.com/PolymerElements/app-route.git",
   "_target": "^v2.0.1",
diff --git a/polymer_2.0.2/bower_components/app-route/app-location.html b/polymer_2.0.2/bower_components/app-route/app-location.html
index 48a9b60..63fc343 100644
--- a/polymer_2.0.2/bower_components/app-route/app-location.html
+++ b/polymer_2.0.2/bower_components/app-route/app-location.html
@@ -66,16 +66,16 @@
 -->
 <dom-module id="app-location">
   <template>
+    <iron-query-params
+        params-string="{{__query}}"
+        params-object="{{queryParams}}">
+    </iron-query-params>
     <iron-location
         path="{{__path}}"
         query="{{__query}}"
         hash="{{__hash}}"
         url-space-regex={{urlSpaceRegex}}>
     </iron-location>
-    <iron-query-params
-        params-string="{{__query}}"
-        params-object="{{queryParams}}">
-    </iron-query-params>
   </template>
   <script>
     (function() {
diff --git a/polymer_2.0.2/bower_components/app-route/app-route.html b/polymer_2.0.2/bower_components/app-route/app-route.html
index 2165f84..9478f53 100644
--- a/polymer_2.0.2/bower_components/app-route/app-route.html
+++ b/polymer_2.0.2/bower_components/app-route/app-route.html
@@ -318,11 +318,8 @@
         }
 
         if (this.setProperties) {
-          if (!this.active) {
-            this._setActive(true);
-          }
           // atomic update
-          this.setProperties(propertyUpdates);
+          this.setProperties(propertyUpdates, true);
         } else {
           this.__setMulti(propertyUpdates);
         }
diff --git a/polymer_2.0.2/bower_components/app-route/bower.json b/polymer_2.0.2/bower_components/app-route/bower.json
index 2513e4c..ba6ffde 100644
--- a/polymer_2.0.2/bower_components/app-route/bower.json
+++ b/polymer_2.0.2/bower_components/app-route/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "app-route",
-  "version": "2.0.1",
+  "version": "2.0.3",
   "authors": [
     "The Polymer Authors"
   ],
@@ -31,7 +31,7 @@
     "paper-styles": "PolymerElements/paper-styles#1 - 2",
     "paper-toggle-button": "polymerelements/paper-toggle-button#1 - 2",
     "url": "webcomponents/URL#^0.5.7",
-    "web-component-tester": "^4.0.0",
+    "web-component-tester": "^6.0.0",
     "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0"
   },
   "variants": {
@@ -52,7 +52,7 @@
         "paper-spinner": "PolymerElements/paper-spinner#^1.1.1",
         "paper-styles": "polymerelements/paper-styles#^1.0.13",
         "paper-toggle-button": "polymerelements/paper-toggle-button#^1.0.0",
-        "web-component-tester": "^4.0.0",
+        "web-component-tester": "^6.0.0",
         "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
       },
       "resolutions": {
diff --git a/polymer_2.0.2/bower_components/app-route/test/app-route.html b/polymer_2.0.2/bower_components/app-route/test/app-route.html
index de44b70..9e0fcf0 100644
--- a/polymer_2.0.2/bower_components/app-route/test/app-route.html
+++ b/polymer_2.0.2/bower_components/app-route/test/app-route.html
@@ -195,6 +195,22 @@
     });
 
     suite('propagating data', function() {
+      test('data is defined when active is true', function(done) {
+        var chainedRoutes = fixture('ChainedRoutes');
+
+        chainedRoutes.$.foo.addEventListener('active-changed', function(e) {
+          if (e.detail.value = true) {
+            expect(chainedRoutes.$.foo.data.foo).to.be.equal('bar');
+            done();
+          }
+        });
+
+        chainedRoutes.$.foo.route = {
+          prefix: '',
+          path: '/foo/bar',
+          __queryParams: {}
+        };
+      });
       test('data is empty if no routes in the tree have matched', function() {
         var routes = fixtureChainedRoutes({ path: '' });
 
diff --git a/polymer_2.0.2/bower_components/app-router/.bower.json b/polymer_2.0.2/bower_components/app-router/.bower.json
new file mode 100644
index 0000000..6eb7725
--- /dev/null
+++ b/polymer_2.0.2/bower_components/app-router/.bower.json
@@ -0,0 +1,42 @@
+{
+  "name": "app-router",
+  "version": "2.7.2",
+  "authors": [
+    "Erik Ringsmuth <erik.ringsmuth@gmail.com>"
+  ],
+  "description": "Router for Web Components.",
+  "keywords": [
+    "web-components",
+    "router",
+    "polymer",
+    "x-tag"
+  ],
+  "main": "app-router.html",
+  "license": "MIT",
+  "homepage": "https://github.com/erikringsmuth/app-router",
+  "ignore": [
+    "**/.*",
+    "bower_components",
+    "node_modules",
+    "tests",
+    "tmp",
+    "gulpfile.js",
+    "package.json"
+  ],
+  "devDependencies": {
+    "polymer": "~0.5.4",
+    "webcomponentsjs": "^0.7.22",
+    "core-elements": "Polymer/core-elements#~0.5.4",
+    "pushstate-anchor": "^0.4.0"
+  },
+  "_release": "2.7.2",
+  "_resolution": {
+    "type": "version",
+    "tag": "v2.7.2",
+    "commit": "1d3936b627131db5657e8fe9ad1bed2ca4309376"
+  },
+  "_source": "https://github.com/erikringsmuth/app-router.git",
+  "_target": "^2.7.2",
+  "_originalSource": "app-router",
+  "_direct": true
+}
\ No newline at end of file
diff --git a/polymer_2.0.2/bower_components/app-router/LICENSE.md b/polymer_2.0.2/bower_components/app-router/LICENSE.md
new file mode 100644
index 0000000..773d537
--- /dev/null
+++ b/polymer_2.0.2/bower_components/app-router/LICENSE.md
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Erik Ringsmuth
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/polymer_2.0.2/bower_components/app-router/README.md b/polymer_2.0.2/bower_components/app-router/README.md
new file mode 100644
index 0000000..a6eead7
--- /dev/null
+++ b/polymer_2.0.2/bower_components/app-router/README.md
@@ -0,0 +1,217 @@
+## Router for Web Components
+> Works with [Polymer](https://www.polymer-project.org/), [X-Tag](http://www.x-tags.org/), and natively.
+>
+> [erikringsmuth.github.io/app-router](https://erikringsmuth.github.io/app-router/)
+
+Manage page state. Lazy-load content. Data-bind path variables and query parameters. Use multiple layouts. Navigate with `hashchange` and HTML5 `pushState`. Animate transitions using `core-animated-pages`.
+
+[Download](https://github.com/erikringsmuth/app-router/archive/master.zip) or run `bower install app-router --save`.
+
+## Configuration
+
+Define how URLs map to pages.
+
+```html
+<!doctype html>
+<html>
+  <head>
+    <title>App Router</title>
+    <link rel="import" href="/bower_components/app-router/app-router.html">
+  </head>
+  <body>
+    <app-router>
+      <!-- matches an exact path -->
+      <app-route path="/home" import="/pages/home-page.html"></app-route>
+
+      <!-- matches using a wildcard -->
+      <app-route path="/customer/*" import="/pages/customer-page.html"></app-route>
+
+      <!-- matches using a path variable -->
+      <app-route path="/order/:id" import="/pages/order-page.html"></app-route>
+
+      <!-- matches a pattern like '/word/number' -->
+      <app-route path="/^\/\w+\/\d+$/i" regex import="/pages/regex-page.html"></app-route>
+
+      <!-- matches everything else -->
+      <app-route path="*" import="/pages/not-found-page.html"></app-route>
+    </app-router>
+  </body>
+</html>
+```
+
+## Navigation
+
+Click links or call `router.go()`.
+
+```html
+<!-- hashchange -->
+<a href="#/home">Home</a>
+
+<!-- pushState() -->
+<a is="pushstate-anchor" href="/home">Home</a>
+
+<!-- router.go(path, options) -->
+<script>
+  document.querySelector('app-router').go('/home');
+</script>
+```
+
+The router listens to `popstate` and `hashchange` events. Changing the URL will find the first `app-route` that matches, load the element or template, and replace the current view.
+
+#### hashchange
+Clicking `<a href="#/home">Home</a>` will fire a `hashchange` event and tell the router to load the first route that matches `/home`. You don't need to handle the event in your Javascript. Hash paths `#/home` match routes without the hash `<app-route path="/home">`.
+
+#### pushState
+You can use the [pushstate-anchor](https://github.com/erikringsmuth/pushstate-anchor) or [html5-history-anchor](https://github.com/erikringsmuth/html5-history-anchor) to extend `<a>` tags with the HTML5 history API.
+
+```html
+<a is="pushstate-anchor" href="/home">Home</a>
+```
+
+This will call `pushState()` and dispatch a `popstate` event.
+
+#### go(path, options)
+You can call the router from Javascript to navigate imperatively.
+
+```js
+document.querySelector('app-router').go('/home');
+// or
+document.querySelector('app-router').go('/home', {replace: true});
+```
+
+If you use `go(path, options)` you should also set the mode to `hash` or `pushstate` on the router.
+
+```html
+<app-router mode="auto|pushstate|hash">
+  <!-- app-routes -->
+</app-router>
+```
+
+## Data Binding
+Path variables and query parameters automatically attach to the element's attributes.
+
+``` html
+<!-- url -->
+<a is="pushstate-anchor" href="/order/123?sort=ascending">Order 123</a>
+
+<!-- route -->
+<app-route path="/order/:orderId" import="/pages/order-page.html"></app-route>
+
+<!-- will bind 123 to the page's `orderId` attribute and "ascending" to the `sort` attribute -->
+<order-page orderId="123" sort="ascending"></order-page>
+```
+
+If you're using Polymer, you can also bind path variables and query parameters to templates.
+```html
+<app-route path="/order/:orderId">
+  <template>
+    <p>Your order number is {{orderId}}</p>
+  </template>
+</app-route>
+```
+
+See it in action [here](https://erikringsmuth.github.io/app-router/#/databinding/1337?queryParam1=Routing%20with%20Web%20Components!).
+
+## &lt;app-route&gt; options
+
+#### import a custom element
+Lazy-load a custom element.
+
+```html
+<app-route path="/customer/:customerId" import="/pages/customer-page.html" [element="customer-page"]></app-route>
+```
+
+You only need to set the `element` attribute if the element's name is different than the file name.
+
+#### pre-loaded custom element
+Include the `element="element-name"` attribute on the route to use a pre-loaded custom element. This is how you use bundled (vulcanized) custom elements.
+
+```html
+<head>
+  <link rel="import" href="/pages/page-bundle.html">
+</head>
+<app-router>
+  <app-route path="/customer/:customerId" element="customer-page"></app-route>
+</app-router>
+```
+
+#### import template
+You can import a `<template>` instead of a custom element. Just include the `template` attribute.
+
+```html
+<app-route path="/example" import="/pages/template-page.html" template></app-route>
+```
+
+#### inline template
+Finally, you can in-line a `<template>` like this.
+
+```html
+<app-route path="/example">
+  <template>
+    <p>Inline template FTW!</p>
+  </template>
+</app-route>
+```
+
+#### regular expressions
+Include the `regex` attribute to match on a regular expression. The format is the same as a JavaScript regular expression.
+
+```html
+<!-- matches a pattern like '/word/number' -->
+<app-route path="/^\/\w+\/\d+$/i" regex import="/pages/regex-page.html"></app-route>
+```
+
+#### redirect
+A route can redirect to another path.
+
+```html
+<app-router mode="pushstate">
+  <app-route path="/home" import="/pages/home-page.html"></app-route>
+  <app-route path="*" redirect="/home"></app-route>
+</app-router>
+```
+
+When you use `redirect` you should also set `mode="hash|pushstate"` on the `app-router`.
+
+## &lt;app-router&gt; options
+
+#### mode
+One set of routes will match regular paths `/` and hash paths `#/`. You can force a specific mode with `mode="auto|hash|pushstate"`.
+
+```html
+<app-router mode="pushstate">
+  <!-- always ignore the hash and match on the path -->
+</app-router>
+```
+
+When left in `auto`, redirects and `go(path, options)` will use hash paths.
+
+#### trailing slashes
+By default `/home` and `/home/` are treated as separate routes. You can configure the router to ignore trailing slashes with `trailingSlash="ignore"`.
+```html
+<app-router trailingSlash="ignore">
+  <!-- matches '/home' and '/home/' -->
+  <app-route path="/home" import="/pages/home-page.html"></app-route>
+</app-router>
+```
+
+## Demo Site & Example Setup
+Check out the `app-router` in action at [erikringsmuth.github.io/app-router](https://erikringsmuth.github.io/app-router/).
+
+You can download an example setup here https://github.com/erikringsmuth/app-router-examples to get running locally.
+
+Examples showing `app-router` and `flatiron-director` versus no router https://github.com/erikringsmuth/polymer-router-demos.
+
+## Breaking Changes
+Check the [change log](https://github.com/erikringsmuth/app-router/blob/master/changelog.md) for breaking changes in major versions.
+
+## Build, Test, and Debug [![Build Status](https://travis-ci.org/erikringsmuth/app-router.png?branch=master)](https://travis-ci.org/erikringsmuth/app-router)
+Source files are under the `src` folder. The build process writes to the root directory. The easiest way to debug is to include the source script rather than the minified HTML import.
+```html
+<script src="/bower_components/app-router/src/app-router.js"></script>
+```
+
+To build:
+- Run `bower install` and `npm install` to install dev dependencies
+- Lint, test, build, and minify code with `gulp`
+- Manually run functional tests in the browser by starting a static content server (node `http-server` or `python -m SimpleHTTPServer`) and open [http://localhost:8080/tests/functional-tests/](http://localhost:8080/tests/functional-tests/)
diff --git a/polymer_2.0.2/bower_components/app-router/app-router.csp.html b/polymer_2.0.2/bower_components/app-router/app-router.csp.html
new file mode 100644
index 0000000..335fc32
--- /dev/null
+++ b/polymer_2.0.2/bower_components/app-router/app-router.csp.html
@@ -0,0 +1,2 @@
+<!-- Copyright (C) 2015 Erik Ringsmuth - MIT license -->
+<script src="app-router.js"></script>
diff --git a/polymer_2.0.2/bower_components/app-router/app-router.html b/polymer_2.0.2/bower_components/app-router/app-router.html
new file mode 100644
index 0000000..d4dd821
--- /dev/null
+++ b/polymer_2.0.2/bower_components/app-router/app-router.html
@@ -0,0 +1,4 @@
+<!-- Copyright (C) 2015 Erik Ringsmuth - MIT license -->
+<script type="text/javascript">
+!function(t,e){function a(t,a,r){var i=e.createEvent("CustomEvent");return i.initCustomEvent(t,!1,!0,a),r.dispatchEvent(i)}function r(e){var r=m.parseUrl(t.location.href,e.getAttribute("mode"));if(r.hash!==E.hash&&r.path===E.path&&r.search===E.search&&r.isHashPath===E.isHashPath)return"disabled"!==e.getAttribute("scroll-to-hash")&&g(r.hash),void(E=r);E=r;var n={path:r.path,state:t.history.state};if(a("state-change",n,e)){for(var s=e.firstElementChild;s;){if("APP-ROUTE"===s.tagName&&m.testRoute(s.getAttribute("path"),r.path,e.getAttribute("trailingSlash"),s.hasAttribute("regex")))return void i(e,s,r);s=s.nextSibling}a("not-found",n,e)}}function i(e,r,i){if(r.hasAttribute("redirect"))return void e.go(r.getAttribute("redirect"),{replace:!0});if(r!==e.activeRoute||"noop"!==r.getAttribute("onUrlChange")){var o={path:i.path,route:r,oldRoute:e.activeRoute,state:t.history.state};a("activate-route-start",o,e)&&a("activate-route-start",o,r)&&(e.loadingRoute=r,r===e.activeRoute&&"updateModel"===r.getAttribute("onUrlChange")?n(e,r,i,o):r.hasAttribute("import")?s(e,r.getAttribute("import"),r,i,o):r.hasAttribute("element")?h(e,r.getAttribute("element"),r,i,o):r.firstElementChild&&"TEMPLATE"===r.firstElementChild.tagName&&(r.isInlineTemplate=!0,u(e,r.firstElementChild,r,i,o)))}}function n(t,e,r,i){var n=l(t,e,r,i);e.hasAttribute("template")||e.isInlineTemplate?c(e.lastElementChild.templateInstance.model,n):c(e.firstElementChild,n),a("activate-route-end",i,t),a("activate-route-end",i,i.route)}function s(t,r,i,n,s){function h(){l.loaded=!0,o(t,l,r,i,n,s)}function u(e){var n={errorEvent:e,importUri:r,routeDetail:s};a("import-error",n,t),a("import-error",n,i)}var l;b.hasOwnProperty(r)?(l=b[r],l.loaded?o(t,l,r,i,n,s):(l.addEventListener("load",h),l.addEventListener("error",u))):(l=e.createElement("link"),l.setAttribute("rel","import"),l.setAttribute("href",r),l.setAttribute("async","async"),l.addEventListener("load",h),l.addEventListener("error",u),l.loaded=!1,e.head.appendChild(l),b[r]=l)}function o(t,e,a,r,i,n){if(r.importLink=e,r===t.loadingRoute)if(r.hasAttribute("template")){var s,o=r.getAttribute("template");s=o?e.import.getElementById(o):e.import.querySelector("template"),u(t,s,r,i,n)}else h(t,r.getAttribute("element")||a.split("/").slice(-1)[0].replace(".html",""),r,i,n)}function h(t,a,r,i,n){var s=e.createElement(a),o=l(t,r,i,n);c(s,o),p(t,s,i,n)}function u(t,a,r,i,n){var s;if("createInstance"in a){var o=l(t,r,i,n);s=a.createInstance(o)}else s=e.importNode(a.content,!0);p(t,s,i,n)}function l(t,e,r,i){var n=m.routeArguments(e.getAttribute("path"),r.path,r.search,e.hasAttribute("regex"),"auto"===t.getAttribute("typecast"));return(e.hasAttribute("bindRouter")||t.hasAttribute("bindRouter"))&&(n.router=t),i.model=n,a("before-data-binding",i,t),a("before-data-binding",i,i.route),i.model}function c(t,e){for(var a in e)e.hasOwnProperty(a)&&(t[a]=e[a])}function p(t,e,r,i){d(t.previousRoute),t.previousRoute=t.activeRoute,t.activeRoute=t.loadingRoute,t.loadingRoute=null,t.previousRoute&&t.previousRoute.removeAttribute("active"),t.activeRoute.setAttribute("active","active"),t.hasAttribute("core-animated-pages")&&i.route!==i.oldRoute||d(t.previousRoute),t.activeRoute.appendChild(e),t.hasAttribute("core-animated-pages")&&(t.coreAnimatedPages.selected=t.activeRoute.getAttribute("path")),r.hash&&!t.hasAttribute("core-animated-pages")&&"disabled"!==t.getAttribute("scroll-to-hash")&&g(r.hash),a("activate-route-end",i,t),a("activate-route-end",i,i.route)}function d(t){if(t){var e=t.firstChild;for(t.isInlineTemplate&&(e=t.querySelector("template").nextSibling);e;){var a=e;e=e.nextSibling,t.removeChild(a)}}}function g(t){t&&setTimeout(function(){var a;try{a=e.querySelector("html /deep/ "+t)||e.querySelector('html /deep/ [name="'+t.substring(1)+'"]')}catch(r){a=e.querySelector(t)||e.querySelector('[name="'+t.substring(1)+'"]')}a&&a.scrollIntoView&&a.scrollIntoView(!0)},0)}function v(t,e,a,r,i){var n=t[e],s=a[r];if("**"===n&&e===t.length-1)return!0;if("undefined"==typeof n||"undefined"==typeof s)return n===s;if(n===s||"*"===n||":"===n.charAt(0))return":"===n.charAt(0)&&"undefined"!=typeof i&&(i[n.substring(1)]=a[r]),v(t,e+1,a,r+1,i);if("**"===n)for(var o=r;o<a.length;o++)if(v(t,e+1,a,o,i))return!0;return!1}var m={},b={},f="ActiveXObject"in t,A=!!t.navigator.userAgent.match(/Edge/),E={},R=Object.create(HTMLElement.prototype);R.util=m,e.registerElement("app-route",{prototype:Object.create(HTMLElement.prototype)}),R.attachedCallback=function(){"manual"!==this.getAttribute("init")&&this.init()},R.init=function(){var a=this;a.isInitialized||(a.isInitialized=!0,a.hasAttribute("trailingSlash")||a.setAttribute("trailingSlash","strict"),a.hasAttribute("mode")||a.setAttribute("mode","auto"),a.hasAttribute("typecast")||a.setAttribute("typecast","auto"),a.hasAttribute("scroll-to-hash")||a.setAttribute("scroll-to-hash","auto"),a.hasAttribute("core-animated-pages")&&(a.createShadowRoot(),a.coreAnimatedPages=e.createElement("core-animated-pages"),a.coreAnimatedPages.appendChild(e.createElement("content")),a.coreAnimatedPages.style.position="static",a.coreAnimatedPages.setAttribute("valueattr","path"),a.coreAnimatedPages.setAttribute("transitions",a.getAttribute("transitions")),a.shadowRoot.appendChild(a.coreAnimatedPages),a.coreAnimatedPages.addEventListener("core-animated-pages-transition-end",function(){a.previousRoute&&!a.previousRoute.hasAttribute("active")&&d(a.previousRoute)})),a.stateChangeHandler=r.bind(null,a),t.addEventListener("popstate",a.stateChangeHandler,!1),(f||A)&&t.addEventListener("hashchange",a.stateChangeHandler,!1),r(a))},R.detachedCallback=function(){t.removeEventListener("popstate",this.stateChangeHandler,!1),(f||A)&&t.removeEventListener("hashchange",this.stateChangeHandler,!1)},R.go=function(a,r){"pushstate"!==this.getAttribute("mode")&&(a="hashbang"===this.getAttribute("mode")?"#!"+a:"#"+a);var i=t.history.state;r&&r.replace===!0?t.history.replaceState(i,null,a):t.history.pushState(i,null,a);try{var n=new PopStateEvent("popstate",{bubbles:!1,cancelable:!1,state:i});"dispatchEvent_"in t?t.dispatchEvent_(n):t.dispatchEvent(n)}catch(a){var s=e.createEvent("CustomEvent");s.initCustomEvent("popstate",!1,!1,{state:i}),t.dispatchEvent(s)}},m.parseUrl=function(t,a){var r={isHashPath:"hash"===a};if("function"==typeof URL){var i=new URL(t);r.path=i.pathname,r.hash=i.hash,r.search=i.search}else{var n=e.createElement("a");n.href=t,r.path=n.pathname,"/"!==r.path.charAt(0)&&(r.path="/"+r.path),r.hash=n.hash,r.search=n.search}if("pushstate"!==a&&("#/"===r.hash.substring(0,2)?(r.isHashPath=!0,r.path=r.hash.substring(1)):"#!/"===r.hash.substring(0,3)?(r.isHashPath=!0,r.path=r.hash.substring(2)):r.isHashPath&&(0===r.hash.length?r.path="/":r.path=r.hash.substring(1)),r.isHashPath)){r.hash="";var s=r.path.indexOf("#");s!==-1&&(r.hash=r.path.substring(s),r.path=r.path.substring(0,s));var o=r.path.indexOf("?");o!==-1&&(r.search=r.path.substring(o),r.path=r.path.substring(0,o))}return r},m.testRoute=function(t,e,a,r){return"ignore"===a&&("/"===e.slice(-1)&&(e=e.slice(0,-1)),"/"!==t.slice(-1)||r||(t=t.slice(0,-1))),r?m.testRegExString(t,e):t===e||"*"===t||("/"!==t.charAt(0)&&(t="/**/"+t),v(t.split("/"),1,e.split("/"),1))},m.routeArguments=function(t,e,a,r,i){var n={};r||("/"!==t.charAt(0)&&(t="/**/"+t),v(t.split("/"),1,e.split("/"),1,n));var s=a.substring(1).split("&");1===s.length&&""===s[0]&&(s=[]);for(var o=0;o<s.length;o++){var h=s[o],u=h.split("=");n[u[0]]=u.splice(1,u.length-1).join("=")}if(i)for(var l in n)n[l]=m.typecast(n[l]);return n},m.typecast=function(t){return"true"===t||"false"!==t&&(isNaN(t)||""===t||"0"===t.charAt(0)?decodeURIComponent(t):+t)},m.testRegExString=function(t,e){if("/"!==t.charAt(0))return!1;t=t.slice(1);var a="";if("/"===t.slice(-1))t=t.slice(0,-1);else{if("/i"!==t.slice(-2))return!1;t=t.slice(0,-2),a="i"}return new RegExp(t,a).test(e)},e.registerElement("app-router",{prototype:R})}(window,document);
+</script>
diff --git a/polymer_2.0.2/bower_components/app-router/app-router.js b/polymer_2.0.2/bower_components/app-router/app-router.js
new file mode 100644
index 0000000..8ccae77
--- /dev/null
+++ b/polymer_2.0.2/bower_components/app-router/app-router.js
@@ -0,0 +1,2 @@
+// @license Copyright (C) 2015 Erik Ringsmuth - MIT license
+!function(t,e){function a(t,a,r){var i=e.createEvent("CustomEvent");return i.initCustomEvent(t,!1,!0,a),r.dispatchEvent(i)}function r(e){var r=m.parseUrl(t.location.href,e.getAttribute("mode"));if(r.hash!==E.hash&&r.path===E.path&&r.search===E.search&&r.isHashPath===E.isHashPath)return"disabled"!==e.getAttribute("scroll-to-hash")&&g(r.hash),void(E=r);E=r;var n={path:r.path,state:t.history.state};if(a("state-change",n,e)){for(var s=e.firstElementChild;s;){if("APP-ROUTE"===s.tagName&&m.testRoute(s.getAttribute("path"),r.path,e.getAttribute("trailingSlash"),s.hasAttribute("regex")))return void i(e,s,r);s=s.nextSibling}a("not-found",n,e)}}function i(e,r,i){if(r.hasAttribute("redirect"))return void e.go(r.getAttribute("redirect"),{replace:!0});if(r!==e.activeRoute||"noop"!==r.getAttribute("onUrlChange")){var o={path:i.path,route:r,oldRoute:e.activeRoute,state:t.history.state};a("activate-route-start",o,e)&&a("activate-route-start",o,r)&&(e.loadingRoute=r,r===e.activeRoute&&"updateModel"===r.getAttribute("onUrlChange")?n(e,r,i,o):r.hasAttribute("import")?s(e,r.getAttribute("import"),r,i,o):r.hasAttribute("element")?h(e,r.getAttribute("element"),r,i,o):r.firstElementChild&&"TEMPLATE"===r.firstElementChild.tagName&&(r.isInlineTemplate=!0,u(e,r.firstElementChild,r,i,o)))}}function n(t,e,r,i){var n=l(t,e,r,i);e.hasAttribute("template")||e.isInlineTemplate?c(e.lastElementChild.templateInstance.model,n):c(e.firstElementChild,n),a("activate-route-end",i,t),a("activate-route-end",i,i.route)}function s(t,r,i,n,s){function h(){l.loaded=!0,o(t,l,r,i,n,s)}function u(e){var n={errorEvent:e,importUri:r,routeDetail:s};a("import-error",n,t),a("import-error",n,i)}var l;b.hasOwnProperty(r)?(l=b[r],l.loaded?o(t,l,r,i,n,s):(l.addEventListener("load",h),l.addEventListener("error",u))):(l=e.createElement("link"),l.setAttribute("rel","import"),l.setAttribute("href",r),l.setAttribute("async","async"),l.addEventListener("load",h),l.addEventListener("error",u),l.loaded=!1,e.head.appendChild(l),b[r]=l)}function o(t,e,a,r,i,n){if(r.importLink=e,r===t.loadingRoute)if(r.hasAttribute("template")){var s,o=r.getAttribute("template");s=o?e.import.getElementById(o):e.import.querySelector("template"),u(t,s,r,i,n)}else h(t,r.getAttribute("element")||a.split("/").slice(-1)[0].replace(".html",""),r,i,n)}function h(t,a,r,i,n){var s=e.createElement(a),o=l(t,r,i,n);c(s,o),p(t,s,i,n)}function u(t,a,r,i,n){var s;if("createInstance"in a){var o=l(t,r,i,n);s=a.createInstance(o)}else s=e.importNode(a.content,!0);p(t,s,i,n)}function l(t,e,r,i){var n=m.routeArguments(e.getAttribute("path"),r.path,r.search,e.hasAttribute("regex"),"auto"===t.getAttribute("typecast"));return(e.hasAttribute("bindRouter")||t.hasAttribute("bindRouter"))&&(n.router=t),i.model=n,a("before-data-binding",i,t),a("before-data-binding",i,i.route),i.model}function c(t,e){for(var a in e)e.hasOwnProperty(a)&&(t[a]=e[a])}function p(t,e,r,i){d(t.previousRoute),t.previousRoute=t.activeRoute,t.activeRoute=t.loadingRoute,t.loadingRoute=null,t.previousRoute&&t.previousRoute.removeAttribute("active"),t.activeRoute.setAttribute("active","active"),t.hasAttribute("core-animated-pages")&&i.route!==i.oldRoute||d(t.previousRoute),t.activeRoute.appendChild(e),t.hasAttribute("core-animated-pages")&&(t.coreAnimatedPages.selected=t.activeRoute.getAttribute("path")),r.hash&&!t.hasAttribute("core-animated-pages")&&"disabled"!==t.getAttribute("scroll-to-hash")&&g(r.hash),a("activate-route-end",i,t),a("activate-route-end",i,i.route)}function d(t){if(t){var e=t.firstChild;for(t.isInlineTemplate&&(e=t.querySelector("template").nextSibling);e;){var a=e;e=e.nextSibling,t.removeChild(a)}}}function g(t){t&&setTimeout(function(){var a;try{a=e.querySelector("html /deep/ "+t)||e.querySelector('html /deep/ [name="'+t.substring(1)+'"]')}catch(r){a=e.querySelector(t)||e.querySelector('[name="'+t.substring(1)+'"]')}a&&a.scrollIntoView&&a.scrollIntoView(!0)},0)}function v(t,e,a,r,i){var n=t[e],s=a[r];if("**"===n&&e===t.length-1)return!0;if("undefined"==typeof n||"undefined"==typeof s)return n===s;if(n===s||"*"===n||":"===n.charAt(0))return":"===n.charAt(0)&&"undefined"!=typeof i&&(i[n.substring(1)]=a[r]),v(t,e+1,a,r+1,i);if("**"===n)for(var o=r;o<a.length;o++)if(v(t,e+1,a,o,i))return!0;return!1}var m={},b={},f="ActiveXObject"in t,A=!!t.navigator.userAgent.match(/Edge/),E={},R=Object.create(HTMLElement.prototype);R.util=m,e.registerElement("app-route",{prototype:Object.create(HTMLElement.prototype)}),R.attachedCallback=function(){"manual"!==this.getAttribute("init")&&this.init()},R.init=function(){var a=this;a.isInitialized||(a.isInitialized=!0,a.hasAttribute("trailingSlash")||a.setAttribute("trailingSlash","strict"),a.hasAttribute("mode")||a.setAttribute("mode","auto"),a.hasAttribute("typecast")||a.setAttribute("typecast","auto"),a.hasAttribute("scroll-to-hash")||a.setAttribute("scroll-to-hash","auto"),a.hasAttribute("core-animated-pages")&&(a.createShadowRoot(),a.coreAnimatedPages=e.createElement("core-animated-pages"),a.coreAnimatedPages.appendChild(e.createElement("content")),a.coreAnimatedPages.style.position="static",a.coreAnimatedPages.setAttribute("valueattr","path"),a.coreAnimatedPages.setAttribute("transitions",a.getAttribute("transitions")),a.shadowRoot.appendChild(a.coreAnimatedPages),a.coreAnimatedPages.addEventListener("core-animated-pages-transition-end",function(){a.previousRoute&&!a.previousRoute.hasAttribute("active")&&d(a.previousRoute)})),a.stateChangeHandler=r.bind(null,a),t.addEventListener("popstate",a.stateChangeHandler,!1),(f||A)&&t.addEventListener("hashchange",a.stateChangeHandler,!1),r(a))},R.detachedCallback=function(){t.removeEventListener("popstate",this.stateChangeHandler,!1),(f||A)&&t.removeEventListener("hashchange",this.stateChangeHandler,!1)},R.go=function(a,r){"pushstate"!==this.getAttribute("mode")&&(a="hashbang"===this.getAttribute("mode")?"#!"+a:"#"+a);var i=t.history.state;r&&r.replace===!0?t.history.replaceState(i,null,a):t.history.pushState(i,null,a);try{var n=new PopStateEvent("popstate",{bubbles:!1,cancelable:!1,state:i});"dispatchEvent_"in t?t.dispatchEvent_(n):t.dispatchEvent(n)}catch(a){var s=e.createEvent("CustomEvent");s.initCustomEvent("popstate",!1,!1,{state:i}),t.dispatchEvent(s)}},m.parseUrl=function(t,a){var r={isHashPath:"hash"===a};if("function"==typeof URL){var i=new URL(t);r.path=i.pathname,r.hash=i.hash,r.search=i.search}else{var n=e.createElement("a");n.href=t,r.path=n.pathname,"/"!==r.path.charAt(0)&&(r.path="/"+r.path),r.hash=n.hash,r.search=n.search}if("pushstate"!==a&&("#/"===r.hash.substring(0,2)?(r.isHashPath=!0,r.path=r.hash.substring(1)):"#!/"===r.hash.substring(0,3)?(r.isHashPath=!0,r.path=r.hash.substring(2)):r.isHashPath&&(0===r.hash.length?r.path="/":r.path=r.hash.substring(1)),r.isHashPath)){r.hash="";var s=r.path.indexOf("#");s!==-1&&(r.hash=r.path.substring(s),r.path=r.path.substring(0,s));var o=r.path.indexOf("?");o!==-1&&(r.search=r.path.substring(o),r.path=r.path.substring(0,o))}return r},m.testRoute=function(t,e,a,r){return"ignore"===a&&("/"===e.slice(-1)&&(e=e.slice(0,-1)),"/"!==t.slice(-1)||r||(t=t.slice(0,-1))),r?m.testRegExString(t,e):t===e||"*"===t||("/"!==t.charAt(0)&&(t="/**/"+t),v(t.split("/"),1,e.split("/"),1))},m.routeArguments=function(t,e,a,r,i){var n={};r||("/"!==t.charAt(0)&&(t="/**/"+t),v(t.split("/"),1,e.split("/"),1,n));var s=a.substring(1).split("&");1===s.length&&""===s[0]&&(s=[]);for(var o=0;o<s.length;o++){var h=s[o],u=h.split("=");n[u[0]]=u.splice(1,u.length-1).join("=")}if(i)for(var l in n)n[l]=m.typecast(n[l]);return n},m.typecast=function(t){return"true"===t||"false"!==t&&(isNaN(t)||""===t||"0"===t.charAt(0)?decodeURIComponent(t):+t)},m.testRegExString=function(t,e){if("/"!==t.charAt(0))return!1;t=t.slice(1);var a="";if("/"===t.slice(-1))t=t.slice(0,-1);else{if("/i"!==t.slice(-2))return!1;t=t.slice(0,-2),a="i"}return new RegExp(t,a).test(e)},e.registerElement("app-router",{prototype:R})}(window,document);
\ No newline at end of file
diff --git a/polymer_2.0.2/bower_components/app-router/bower.json b/polymer_2.0.2/bower_components/app-router/bower.json
new file mode 100644
index 0000000..b4259f0
--- /dev/null
+++ b/polymer_2.0.2/bower_components/app-router/bower.json
@@ -0,0 +1,32 @@
+{
+  "name": "app-router",
+  "version": "2.7.2",
+  "authors": [
+    "Erik Ringsmuth <erik.ringsmuth@gmail.com>"
+  ],
+  "description": "Router for Web Components.",
+  "keywords": [
+    "web-components",
+    "router",
+    "polymer",
+    "x-tag"
+  ],
+  "main": "app-router.html",
+  "license": "MIT",
+  "homepage": "https://github.com/erikringsmuth/app-router",
+  "ignore": [
+    "**/.*",
+    "bower_components",
+    "node_modules",
+    "tests",
+    "tmp",
+    "gulpfile.js",
+    "package.json"
+  ],
+  "devDependencies": {
+    "polymer": "~0.5.4",
+    "webcomponentsjs": "^0.7.22",
+    "core-elements": "Polymer/core-elements#~0.5.4",
+    "pushstate-anchor": "^0.4.0"
+  }
+}
diff --git a/polymer_2.0.2/bower_components/app-router/changelog.md b/polymer_2.0.2/bower_components/app-router/changelog.md
new file mode 100644
index 0000000..a615050
--- /dev/null
+++ b/polymer_2.0.2/bower_components/app-router/changelog.md
@@ -0,0 +1,99 @@
+## app-router change log
+
+#### master
+- Adding a new `state` property that references `window.history.state` in the router's lifecycle events.
+
+#### 2.6.1
+- Adding `hashbang` mode in addition to the existing `auto`, `hash`, and `pushstate`.
+- Fixed URL change bug when only changing the hash.
+
+#### 2.6.0
+- Adding ability to bundle templates and select by ID `<app-route path="/home" import="pages/bundled-templates.html" template="homepage"></app-route>`.
+- Adding `async` flag to `<app-route>` HTML imports. By default HTML imports block rendering of the page. The router waits for the link's `load` event to fire before using the imported document so this will speed up rendering when navigating between routes.
+
+#### 2.5.0
+- Adding `onUrlChange="reload|updateModel|noop"` attribute to `<app-route>`. This is useful when you have nested routers and you only want to change the inner most route.
+
+#### v2.4.2
+- Fixing bug where navigating multiple times before any page finishes importing will lose the reference to the currently loaded route (`previousRoute`) before it is removed from the DOM.
+- Adding `route.importLink` reference.
+
+#### v2.4.1
+- Fixed bug where navigating to the same link twice with `core-animated-pages` would remove the page after 5 seconds.
+
+#### v2.4.0
+- Adding globstar `**` support.
+- Adding relative paths `users/:userId` which is the same as `/**/users/:userId`.
+
+#### v2.3.2
+- Fixed bug where calling `router.go('/path')` on the current path wouldn't reload the page.
+- Switched `router.go('/path')` to fire a `popstate` event instead of directly calling `stateChange()` in order to support multiple routers on the same page.
+
+#### v2.3.1
+- Fixing bug where `router.go('/path')` would replace state instead of push state.
+
+#### v2.3.0
+- Adding `typecast="auto|string"` option on the `app-router`. Path variables and query parameters are typecast to numbers, booleans, and unescaped strings by default. Now you can get the raw string with `typecast="string"`.
+- Optimized hash fragment changes so that if only the hash fragment changes it will scroll to the fragment and not reload the entire page.
+
+#### v2.2.1
+- Fixing bug where the `before-data-binding` event wasn't using the updated model if the entire model was replaced.
+
+#### v2.2.0
+- Added ability to scroll to hash fragment on navigation. For example, `http://example.com/#/page1#middle` will now scroll to an element with `id="middle"` or `name="middle"`.
+
+#### v2.1.0
+- Added data binding to `<template>` tags when Polymer (`TemplateBinding.js`) is present.
+- Added `bindRouter` attribute to pass the router to the `app-route`'s page.
+- Added `before-data-binding` event to add properties to a model before it's bound to the route's custom element or template.
+- Fixed a `core-animated-pages` bug where multiple URLs matched the same `app-route` (ex: `path="/page/:num"` and paths `/page/1`, `/page/2`).
+
+#### v2.0.4
+- The move from `platform.js` to `webcomponents.js` removed the `URL()` constructor polyfill. The v2.0.3 fix created a bug in Safari when parsing the URL. This fixes Safari.
+
+#### v2.0.3
+- The move from `platform.js` to `webcomponents.js` removed the `URL()` constructor polyfill https://github.com/Polymer/webcomponentsjs/issues/53. IE doesn't support the `URL()` constructor yet so this fix is adding URL parse support for IE.
+
+#### v2.0.2
+- Fixing [issue 19](https://github.com/erikringsmuth/app-router/issues/19) using best effort approach. Use `template.createInstance()` if Polymer is loaded, otherwise use `document.importNode()`.
+
+#### v2.0.1
+- Fixing bug where multiple `<app-route>`s had an `active` attribute.
+
+#### v2.0.0
+New features
+
+- Added support for `<core-animated-pages>`. Example: set up the router like `<app-router core-animated-pages transitions="hero-transition cross-fade">` then include the `hero` and `cross-fade` attributes on the elements you want transitioned.
+
+Breaking changes
+
+- Previously the active route's content was under an `<active-route>` element. Now the content for the route is under it's `<app-route>` element. This changed to support `<core-animated-pages>`.
+- The `<active-route>` element and `router.activeRouteContent` have been removed.
+- Removed the `shadow` attribute from the `<app-router>`. This was applied to the `<active-route>` element which no longer exists.
+
+#### v1.0.0
+Breaking changes
+
+- `pathType="auto|hash|regular"` has been replaced with `mode="auto|hash|pushstate"` for redirects, `router.go(path, options)`, and testing routes.
+
+New features
+
+- Added support for redirects with `<app-route path="..." redirect="/other/path"></app-route>`.
+- Added `router.go(path, options)`. Example: `document.querySelector('app-router').go('/home', {replace: true})`.
+- Note: If you're using redirects or `go()` you should specify the mode with `<app-router mode="pushstate|hash"></app-router>`. Leaving the mode as `auto` (the default) will change the hash, even if you wanted it to change the real path with pushstate.
+
+#### v0.9.0
+- Refactor `parseUrl()` to use the native `URL()` constructor and return additional information about the hash path.
+- Cleaned up `testRoute()` and `routeArguments()` with additional information from `parseUrl()`.
+- Moved utility functions to `AppRouter.util`.
+
+#### v0.8.1
+- Fixed bug where the regular path was being used when `pathType="hash"` was set on the router.
+
+#### v0.8.0
+- `template` no longer required on inline template routes.
+- Only use `app-route`s that are direct children of the router by replacing `querySelector()` with `firstElementChild` and iterating with `nextSibling`.
+- Took internal functions off the public API and simplified parameters.
+
+#### v0.7.0
+- Added the `pathType` attribute to the router. The options are `auto`, `hash`, and `regular`.
diff --git a/polymer_2.0.2/bower_components/app-router/preview.png b/polymer_2.0.2/bower_components/app-router/preview.png
new file mode 100644
index 0000000..d18770f
--- /dev/null
+++ b/polymer_2.0.2/bower_components/app-router/preview.png
Binary files differ
diff --git a/polymer_2.0.2/bower_components/app-router/src/app-router.html b/polymer_2.0.2/bower_components/app-router/src/app-router.html
new file mode 100644
index 0000000..ec1bd60
--- /dev/null
+++ b/polymer_2.0.2/bower_components/app-router/src/app-router.html
@@ -0,0 +1,2 @@
+<!-- Copyright (C) 2015 Erik Ringsmuth - MIT license -->
+<script type="text/javascript" src="app-router.js"></script>
diff --git a/polymer_2.0.2/bower_components/app-router/src/app-router.js b/polymer_2.0.2/bower_components/app-router/src/app-router.js
new file mode 100644
index 0000000..ccc51d5
--- /dev/null
+++ b/polymer_2.0.2/bower_components/app-router/src/app-router.js
@@ -0,0 +1,730 @@
+// @license Copyright (C) 2015 Erik Ringsmuth - MIT license
+(function(window, document) {
+  var utilities = {};
+  var importedURIs = {};
+  var isIE = 'ActiveXObject' in window;
+  var isEdge = (!!window.navigator.userAgent.match(/Edge/));
+  var previousUrl = {};
+
+  // <app-router
+  //   init="auto|manual"
+  //   mode="auto|hash|hashbang|pushstate"
+  //   trailingSlash="strict|ignore"
+  //   typecast="auto|string"
+  //   bindRouter
+  //   ></app-router>
+  var AppRouter = Object.create(HTMLElement.prototype);
+  AppRouter.util = utilities;
+
+  // <app-route
+  //   path="/path"
+  //   import="/page/cust-el.html"
+  //   element[="cust-el"]
+  //   template[="template-id"]
+  //   regex
+  //   redirect="/path"
+  //   onUrlChange="reload|updateModel|noop"
+  //   bindRouter
+  //   ></app-route>
+  document.registerElement('app-route', {
+    prototype: Object.create(HTMLElement.prototype)
+  });
+
+  // Initial set up when attached
+  AppRouter.attachedCallback = function() {
+    // init="auto|manual"
+    if(this.getAttribute('init') !== 'manual') {
+      this.init();
+    }
+  };
+
+  // Initialize the router
+  AppRouter.init = function() {
+    var router = this;
+    if (router.isInitialized) {
+      return;
+    }
+    router.isInitialized = true;
+
+    // trailingSlash="strict|ignore"
+    if (!router.hasAttribute('trailingSlash')) {
+      router.setAttribute('trailingSlash', 'strict');
+    }
+
+    // mode="auto|hash|hashbang|pushstate"
+    if (!router.hasAttribute('mode')) {
+      router.setAttribute('mode', 'auto');
+    }
+
+    // typecast="auto|string"
+    if (!router.hasAttribute('typecast')) {
+      router.setAttribute('typecast', 'auto');
+    }
+
+    // scroll-to-hash="auto|disabled"
+    if (!router.hasAttribute('scroll-to-hash')) {
+      router.setAttribute('scroll-to-hash', 'auto');
+    }
+
+    // <app-router core-animated-pages transitions="hero-transition cross-fade">
+    if (router.hasAttribute('core-animated-pages')) {
+      // use shadow DOM to wrap the <app-route> elements in a <core-animated-pages> element
+      // <app-router>
+      //   # shadowRoot
+      //   <core-animated-pages>
+      //     # content in the light DOM
+      //     <app-route element="home-page">
+      //       <home-page>
+      //       </home-page>
+      //     </app-route>
+      //   </core-animated-pages>
+      // </app-router>
+      router.createShadowRoot();
+      router.coreAnimatedPages = document.createElement('core-animated-pages');
+      router.coreAnimatedPages.appendChild(document.createElement('content'));
+
+      // don't know why it needs to be static, but absolute doesn't display the page
+      router.coreAnimatedPages.style.position = 'static';
+
+      // toggle the selected page using selected="path" instead of selected="integer"
+      router.coreAnimatedPages.setAttribute('valueattr', 'path');
+
+      // pass the transitions attribute from <app-router core-animated-pages transitions="hero-transition cross-fade">
+      // to <core-animated-pages transitions="hero-transition cross-fade">
+      router.coreAnimatedPages.setAttribute('transitions', router.getAttribute('transitions'));
+
+      // set the shadow DOM's content
+      router.shadowRoot.appendChild(router.coreAnimatedPages);
+
+      // when a transition finishes, remove the previous route's content. there is a temporary overlap where both
+      // the new and old route's content is in the DOM to animate the transition.
+      router.coreAnimatedPages.addEventListener('core-animated-pages-transition-end', function() {
+        // with core-animated-pages, navigating to the same route twice quickly will set the new route to both the
+        // activeRoute and the previousRoute before the animation finishes. we don't want to delete the route content
+        // if it's actually the active route.
+        if (router.previousRoute && !router.previousRoute.hasAttribute('active')) {
+          deactivateRoute(router.previousRoute);
+        }
+      });
+    }
+
+    // listen for URL change events
+    router.stateChangeHandler = stateChange.bind(null, router);
+    window.addEventListener('popstate', router.stateChangeHandler, false);
+    if (isIE || isEdge) {
+      // IE & Edge bug. A hashchange is supposed to trigger a popstate event, making popstate the only event you
+      // need to listen to. That's not the case in IE & Edge so we make another event listener for it.
+      window.addEventListener('hashchange', router.stateChangeHandler, false);
+    }
+
+    // load the web component for the current route
+    stateChange(router);
+  };
+
+  // clean up global event listeners
+  AppRouter.detachedCallback = function() {
+    window.removeEventListener('popstate', this.stateChangeHandler, false);
+    if (isIE || isEdge) {
+      window.removeEventListener('hashchange', this.stateChangeHandler, false);
+    }
+  };
+
+  // go(path, options) Navigate to the path
+  //
+  // options = {
+  //   replace: true
+  // }
+  AppRouter.go = function(path, options) {
+    if (this.getAttribute('mode') !== 'pushstate') {
+      // mode == auto, hash or hashbang
+      if (this.getAttribute('mode') === 'hashbang') {
+        path = '#!' + path;
+      } else {
+        path = '#' + path;
+      }
+    }
+    var currentState = window.history.state;
+    if (options && options.replace === true) {
+      window.history.replaceState(currentState, null, path);
+    } else {
+      window.history.pushState(currentState, null, path);
+    }
+
+    // dispatch a popstate event
+    try {
+      var popstateEvent = new PopStateEvent('popstate', {
+        bubbles: false,
+        cancelable: false,
+        state: currentState
+      });
+
+      if ('dispatchEvent_' in window) {
+        // FireFox with polyfill
+        window.dispatchEvent_(popstateEvent);
+      } else {
+        // normal
+        window.dispatchEvent(popstateEvent);
+      }
+    } catch(error) {
+      // Internet Exploder
+      var fallbackEvent = document.createEvent('CustomEvent');
+      fallbackEvent.initCustomEvent('popstate', false, false, { state: currentState });
+      window.dispatchEvent(fallbackEvent);
+    }
+  };
+
+  // fire(type, detail, node) - Fire a new CustomEvent(type, detail) on the node
+  //
+  // listen with document.querySelector('app-router').addEventListener(type, function(event) {
+  //   event.detail, event.preventDefault()
+  // })
+  function fire(type, detail, node) {
+    // create a CustomEvent the old way for IE9/10 support
+    var event = document.createEvent('CustomEvent');
+
+    // initCustomEvent(type, bubbles, cancelable, detail)
+    event.initCustomEvent(type, false, true, detail);
+
+    // returns false when event.preventDefault() is called, true otherwise
+    return node.dispatchEvent(event);
+  }
+
+  // Find the first <app-route> that matches the current URL and change the active route
+  function stateChange(router) {
+    var url = utilities.parseUrl(window.location.href, router.getAttribute('mode'));
+
+    // don't load a new route if only the hash fragment changed
+    if (url.hash !== previousUrl.hash && url.path === previousUrl.path && url.search === previousUrl.search && url.isHashPath === previousUrl.isHashPath) {
+      if (router.getAttribute('scroll-to-hash') !== 'disabled') {
+        scrollToHash(url.hash);
+      }
+      previousUrl = url;
+      return;
+    }
+    previousUrl = url;
+
+    // fire a state-change event on the app-router and return early if the user called event.preventDefault()
+    var eventDetail = {
+      path: url.path,
+      state: window.history.state
+    };
+    if (!fire('state-change', eventDetail, router)) {
+      return;
+    }
+
+    // find the first matching route
+    var route = router.firstElementChild;
+    while (route) {
+      if (route.tagName === 'APP-ROUTE' && utilities.testRoute(route.getAttribute('path'), url.path, router.getAttribute('trailingSlash'), route.hasAttribute('regex'))) {
+        activateRoute(router, route, url);
+        return;
+      }
+      route = route.nextSibling;
+    }
+
+    fire('not-found', eventDetail, router);
+  }
+
+  // Activate the route
+  function activateRoute(router, route, url) {
+    if (route.hasAttribute('redirect')) {
+      router.go(route.getAttribute('redirect'), {replace: true});
+      return;
+    }
+
+    // if we're on the same route and `onUrlChange="noop"` then don't reload the route or update the model
+    if (route === router.activeRoute && route.getAttribute('onUrlChange') === 'noop') {
+      return;
+    }
+
+    var eventDetail = {
+      path: url.path,
+      route: route,
+      oldRoute: router.activeRoute,
+      state: window.history.state
+    };
+    if (!fire('activate-route-start', eventDetail, router)) {
+      return;
+    }
+    if (!fire('activate-route-start', eventDetail, route)) {
+      return;
+    }
+
+    // keep track of the route currently being loaded
+    router.loadingRoute = route;
+
+    // if we're on the same route and `onUrlChange="updateModel"` then update the model but don't replace the page content
+    if (route === router.activeRoute && route.getAttribute('onUrlChange') === 'updateModel') {
+      updateModelAndActivate(router, route, url, eventDetail);
+    }
+    // import custom element or template
+    else if (route.hasAttribute('import')) {
+      importAndActivate(router, route.getAttribute('import'), route, url, eventDetail);
+    }
+    // pre-loaded custom element
+    else if (route.hasAttribute('element')) {
+      activateCustomElement(router, route.getAttribute('element'), route, url, eventDetail);
+    }
+    // inline template
+    else if (route.firstElementChild && route.firstElementChild.tagName === 'TEMPLATE') {
+      // mark the route as an inline template so we know how to clean it up when we remove the route's content
+      route.isInlineTemplate = true;
+      activateTemplate(router, route.firstElementChild, route, url, eventDetail);
+    }
+  }
+
+  // If we are only hiding and showing the route, update the model and activate the route
+  function updateModelAndActivate(router, route, url, eventDetail) {
+    var model = createModel(router, route, url, eventDetail);
+
+    if (route.hasAttribute('template') || route.isInlineTemplate) {
+      // update the template model
+      setObjectProperties(route.lastElementChild.templateInstance.model, model);
+    } else {
+      // update the custom element model
+      setObjectProperties(route.firstElementChild, model);
+    }
+
+    fire('activate-route-end', eventDetail, router);
+    fire('activate-route-end', eventDetail, eventDetail.route);
+  }
+
+  // Import and activate a custom element or template
+  function importAndActivate(router, importUri, route, url, eventDetail) {
+    var importLink;
+    function importLoadedCallback() {
+      importLink.loaded = true;
+      activateImport(router, importLink, importUri, route, url, eventDetail);
+    }
+    function importErrorCallback(event) {
+      var errorDetail = {
+        errorEvent: event,
+        importUri: importUri,
+        routeDetail: eventDetail
+      };
+      fire('import-error', errorDetail, router);
+      fire('import-error', errorDetail, route);
+    }
+
+    if (!importedURIs.hasOwnProperty(importUri)) {
+      // hasn't been imported yet
+      importLink = document.createElement('link');
+      importLink.setAttribute('rel', 'import');
+      importLink.setAttribute('href', importUri);
+      importLink.setAttribute('async', 'async');
+      importLink.addEventListener('load', importLoadedCallback);
+      importLink.addEventListener('error', importErrorCallback);
+      importLink.loaded = false;
+      document.head.appendChild(importLink);
+      importedURIs[importUri] = importLink;
+    } else {
+      // previously imported. this is an async operation and may not be complete yet.
+      importLink = importedURIs[importUri];
+      if (!importLink.loaded) {
+        importLink.addEventListener('load', importLoadedCallback);
+        importLink.addEventListener('error', importErrorCallback);
+      } else {
+        activateImport(router, importLink, importUri, route, url, eventDetail);
+      }
+    }
+  }
+
+  // Activate the imported custom element or template
+  function activateImport(router, importLink, importUri, route, url, eventDetail) {
+    // allow referencing the route's import link in the activate-route-end callback
+    route.importLink = importLink;
+
+    // make sure the user didn't navigate to a different route while it loaded
+    if (route === router.loadingRoute) {
+      if (route.hasAttribute('template')) {
+        // template
+        var templateId = route.getAttribute('template');
+        var template;
+        if (templateId) {
+          template = importLink.import.getElementById(templateId);
+        } else {
+          template = importLink.import.querySelector('template');
+        }
+        activateTemplate(router, template, route, url, eventDetail);
+      } else {
+        // custom element
+        activateCustomElement(router, route.getAttribute('element') || importUri.split('/').slice(-1)[0].replace('.html', ''), route, url, eventDetail);
+      }
+    }
+  }
+
+  // Data bind the custom element then activate it
+  function activateCustomElement(router, elementName, route, url, eventDetail) {
+    var customElement = document.createElement(elementName);
+    var model = createModel(router, route, url, eventDetail);
+    setObjectProperties(customElement, model);
+    activateElement(router, customElement, url, eventDetail);
+  }
+
+  // Create an instance of the template
+  function activateTemplate(router, template, route, url, eventDetail) {
+    var templateInstance;
+    if ('createInstance' in template) {
+      // template.createInstance(model) is a Polymer method that binds a model to a template and also fixes
+      // https://github.com/erikringsmuth/app-router/issues/19
+      var model = createModel(router, route, url, eventDetail);
+      templateInstance = template.createInstance(model);
+    } else {
+      templateInstance = document.importNode(template.content, true);
+    }
+    activateElement(router, templateInstance, url, eventDetail);
+  }
+
+  // Create the route's model
+  function createModel(router, route, url, eventDetail) {
+    var model = utilities.routeArguments(route.getAttribute('path'), url.path, url.search, route.hasAttribute('regex'), router.getAttribute('typecast') === 'auto');
+    if (route.hasAttribute('bindRouter') || router.hasAttribute('bindRouter')) {
+      model.router = router;
+    }
+    eventDetail.model = model;
+    fire('before-data-binding', eventDetail, router);
+    fire('before-data-binding', eventDetail, eventDetail.route);
+    return eventDetail.model;
+  }
+
+  // Copy properties from one object to another
+  function setObjectProperties(object, model) {
+    for (var property in model) {
+      if (model.hasOwnProperty(property)) {
+        object[property] = model[property];
+      }
+    }
+  }
+
+  // Replace the active route's content with the new element
+  function activateElement(router, element, url, eventDetail) {
+    // when using core-animated-pages, the router doesn't remove the previousRoute's content right away. if you
+    // navigate between 3 routes quickly (ex: /a -> /b -> /c) you might set previousRoute to '/b' before '/a' is
+    // removed from the DOM. this verifies old content is removed before switching the reference to previousRoute.
+    deactivateRoute(router.previousRoute);
+
+    // update references to the activeRoute, previousRoute, and loadingRoute
+    router.previousRoute = router.activeRoute;
+    router.activeRoute = router.loadingRoute;
+    router.loadingRoute = null;
+    if (router.previousRoute) {
+      router.previousRoute.removeAttribute('active');
+    }
+    router.activeRoute.setAttribute('active', 'active');
+
+    // remove the old route's content before loading the new route. core-animated-pages temporarily needs the old and
+    // new route in the DOM at the same time to animate the transition, otherwise we can remove the old route's content
+    // right away. there is one exception for core-animated-pages where the route we're navigating to matches the same
+    // route (ex: path="/article/:id" navigating from /article/0 to /article/1). in this case we have to simply replace
+    // the route's content instead of animating a transition.
+    if (!router.hasAttribute('core-animated-pages') || eventDetail.route === eventDetail.oldRoute) {
+      deactivateRoute(router.previousRoute);
+    }
+
+    // add the new content
+    router.activeRoute.appendChild(element);
+
+    // animate the transition if core-animated-pages are being used
+    if (router.hasAttribute('core-animated-pages')) {
+      router.coreAnimatedPages.selected = router.activeRoute.getAttribute('path');
+      // the 'core-animated-pages-transition-end' event handler in init() will call deactivateRoute() on the previousRoute
+    }
+
+    // scroll to the URL hash if it's present
+    if (url.hash && !router.hasAttribute('core-animated-pages') && router.getAttribute('scroll-to-hash') !== 'disabled') {
+      scrollToHash(url.hash);
+    }
+
+    fire('activate-route-end', eventDetail, router);
+    fire('activate-route-end', eventDetail, eventDetail.route);
+  }
+
+  // Remove the route's content
+  function deactivateRoute(route) {
+    if (route) {
+      // remove the route content
+      var node = route.firstChild;
+
+      // don't remove an inline <template>
+      if (route.isInlineTemplate) {
+        node = route.querySelector('template').nextSibling;
+      }
+
+      while (node) {
+        var nodeToRemove = node;
+        node = node.nextSibling;
+        route.removeChild(nodeToRemove);
+      }
+    }
+  }
+
+  // scroll to the element with id="hash" or name="hash"
+  function scrollToHash(hash) {
+    if (!hash) return;
+
+    // wait for the browser's scrolling to finish before we scroll to the hash
+    // ex: http://example.com/#/page1#middle
+    // the browser will scroll to an element with id or name `/page1#middle` when the page finishes loading. if it doesn't exist
+    // it will scroll to the top of the page. let the browser finish the current event loop and scroll to the top of the page
+    // before we scroll to the element with id or name `middle`.
+    setTimeout(function() {
+      var hashElement;
+      try {
+        hashElement = document.querySelector('html /deep/ ' + hash) || document.querySelector('html /deep/ [name="' + hash.substring(1) + '"]');
+      } catch (e) {
+        // DOM exception 12 (unknown selector) is thrown in Firefox, Safari etc. when using Polymer 1.x Shady DOM mode
+        hashElement = document.querySelector(hash) || document.querySelector('[name="' + hash.substring(1) + '"]');
+      }
+      if (hashElement && hashElement.scrollIntoView) {
+        hashElement.scrollIntoView(true);
+      }
+    }, 0);
+  }
+
+  // parseUrl(location, mode) - Augment the native URL() constructor to get info about hash paths
+  //
+  // Example parseUrl('http://domain.com/other/path?queryParam3=false#/example/path?queryParam1=true&queryParam2=example%20string#middle', 'auto')
+  //
+  // returns {
+  //   path: '/example/path',
+  //   hash: '#middle'
+  //   search: '?queryParam1=true&queryParam2=example%20string',
+  //   isHashPath: true
+  // }
+  //
+  // Note: The location must be a fully qualified URL with a protocol like 'http(s)://'
+  utilities.parseUrl = function(location, mode) {
+    var url = {
+      isHashPath: mode === 'hash'
+    };
+
+    if (typeof URL === 'function') {
+      // browsers that support `new URL()`
+      var nativeUrl = new URL(location);
+      url.path = nativeUrl.pathname;
+      url.hash = nativeUrl.hash;
+      url.search = nativeUrl.search;
+    } else {
+      // IE
+      var anchor = document.createElement('a');
+      anchor.href = location;
+      url.path = anchor.pathname;
+      if (url.path.charAt(0) !== '/') {
+        url.path = '/' + url.path;
+      }
+      url.hash = anchor.hash;
+      url.search = anchor.search;
+    }
+
+    if (mode !== 'pushstate') {
+      // auto or hash
+
+      // check for a hash path
+      if (url.hash.substring(0, 2) === '#/') {
+        // hash path
+        url.isHashPath = true;
+        url.path = url.hash.substring(1);
+      } else if (url.hash.substring(0, 3) === '#!/') {
+        // hashbang path
+        url.isHashPath = true;
+        url.path = url.hash.substring(2);
+      } else if (url.isHashPath) {
+        // still use the hash if mode="hash"
+        if (url.hash.length === 0) {
+          url.path = '/';
+        } else {
+          url.path = url.hash.substring(1);
+        }
+      }
+
+      if (url.isHashPath) {
+        url.hash = '';
+
+        // hash paths might have an additional hash in the hash path for scrolling to a specific part of the page #/hash/path#elementId
+        var secondHashIndex = url.path.indexOf('#');
+        if (secondHashIndex !== -1) {
+          url.hash = url.path.substring(secondHashIndex);
+          url.path = url.path.substring(0, secondHashIndex);
+        }
+
+        // hash paths get the search from the hash if it exists
+        var searchIndex = url.path.indexOf('?');
+        if (searchIndex !== -1) {
+          url.search = url.path.substring(searchIndex);
+          url.path = url.path.substring(0, searchIndex);
+        }
+      }
+    }
+
+    return url;
+  };
+
+  // testRoute(routePath, urlPath, trailingSlashOption, isRegExp) - Test if the route's path matches the URL's path
+  //
+  // Example routePath: '/user/:userId/**'
+  // Example urlPath = '/user/123/bio'
+  utilities.testRoute = function(routePath, urlPath, trailingSlashOption, isRegExp) {
+    // try to fail or succeed as quickly as possible for the most common cases
+
+    // handle trailing slashes (options: strict (default), ignore)
+    if (trailingSlashOption === 'ignore') {
+      // remove trailing / from the route path and URL path
+      if(urlPath.slice(-1) === '/') {
+        urlPath = urlPath.slice(0, -1);
+      }
+      if(routePath.slice(-1) === '/' && !isRegExp) {
+        routePath = routePath.slice(0, -1);
+      }
+    }
+
+    // test regular expressions
+    if (isRegExp) {
+      return utilities.testRegExString(routePath, urlPath);
+    }
+
+    // if the urlPath is an exact match or '*' then the route is a match
+    if (routePath === urlPath || routePath === '*') {
+      return true;
+    }
+
+    // relative routes a/b/c are the same as routes that start with a globstar /**/a/b/c
+    if (routePath.charAt(0) !== '/') {
+      routePath = '/**/' + routePath;
+    }
+
+    // recursively test if the segments match (start at 1 because 0 is always an empty string)
+    return segmentsMatch(routePath.split('/'), 1, urlPath.split('/'), 1)
+  };
+
+  // segmentsMatch(routeSegments, routeIndex, urlSegments, urlIndex, pathVariables)
+  // recursively test the route segments against the url segments in place (without creating copies of the arrays
+  // for each recursive call)
+  //
+  // example routeSegments ['', 'user', ':userId', '**']
+  // example urlSegments ['', 'user', '123', 'bio']
+  function segmentsMatch(routeSegments, routeIndex, urlSegments, urlIndex, pathVariables) {
+    var routeSegment = routeSegments[routeIndex];
+    var urlSegment = urlSegments[urlIndex];
+
+    // if we're at the last route segment and it is a globstar, it will match the rest of the url
+    if (routeSegment === '**' && routeIndex === routeSegments.length - 1) {
+      return true;
+    }
+
+    // we hit the end of the route segments or the url segments
+    if (typeof routeSegment === 'undefined' || typeof urlSegment === 'undefined') {
+      // return true if we hit the end of both at the same time meaning everything else matched, else return false
+      return routeSegment === urlSegment;
+    }
+
+    // if the current segments match, recursively test the remaining segments
+    if (routeSegment === urlSegment || routeSegment === '*' || routeSegment.charAt(0) === ':') {
+      // store the path variable if we have a pathVariables object
+      if (routeSegment.charAt(0) === ':' && typeof pathVariables !== 'undefined') {
+        pathVariables[routeSegment.substring(1)] = urlSegments[urlIndex];
+      }
+      return segmentsMatch(routeSegments, routeIndex + 1, urlSegments, urlIndex + 1, pathVariables);
+    }
+
+    // globstars can match zero to many URL segments
+    if (routeSegment === '**') {
+      // test if the remaining route segments match any combination of the remaining url segments
+      for (var i = urlIndex; i < urlSegments.length; i++) {
+        if (segmentsMatch(routeSegments, routeIndex + 1, urlSegments, i, pathVariables)) {
+          return true;
+        }
+      }
+    }
+
+    // all tests failed, the route segments do not match the url segments
+    return false;
+  }
+
+  // routeArguments(routePath, urlPath, search, isRegExp) - Gets the path variables and query parameter values from the URL
+  utilities.routeArguments = function(routePath, urlPath, search, isRegExp, typecast) {
+    var args = {};
+
+    // regular expressions can't have path variables
+    if (!isRegExp) {
+      // relative routes a/b/c are the same as routes that start with a globstar /**/a/b/c
+      if (routePath.charAt(0) !== '/') {
+        routePath = '/**/' + routePath;
+      }
+
+      // get path variables
+      // urlPath '/customer/123'
+      // routePath '/customer/:id'
+      // parses id = '123'
+      segmentsMatch(routePath.split('/'), 1, urlPath.split('/'), 1, args);
+    }
+
+    var queryParameters = search.substring(1).split('&');
+    // split() on an empty string has a strange behavior of returning [''] instead of []
+    if (queryParameters.length === 1 && queryParameters[0] === '') {
+      queryParameters = [];
+    }
+    for (var i = 0; i < queryParameters.length; i++) {
+      var queryParameter = queryParameters[i];
+      var queryParameterParts = queryParameter.split('=');
+      args[queryParameterParts[0]] = queryParameterParts.splice(1, queryParameterParts.length - 1).join('=');
+    }
+
+    if (typecast) {
+      // parse the arguments into unescaped strings, numbers, or booleans
+      for (var arg in args) {
+        args[arg] = utilities.typecast(args[arg]);
+      }
+    }
+
+    return args;
+  };
+
+  // typecast(value) - Typecast the string value to an unescaped string, number, or boolean
+  utilities.typecast = function(value) {
+    // bool
+    if (value === 'true') {
+      return true;
+    }
+    if (value === 'false') {
+      return false;
+    }
+
+    // number
+    if (!isNaN(value) && value !== '' && value.charAt(0) !== '0') {
+      return +value;
+    }
+
+    // string
+    return decodeURIComponent(value);
+  };
+
+  // testRegExString(pattern, value) - Parse HTML attribute path="/^\/\w+\/\d+$/i" to a regular
+  // expression `new RegExp('^\/\w+\/\d+$', 'i')` and test against it.
+  //
+  // note that 'i' is the only valid option. global 'g', multiline 'm', and sticky 'y' won't be valid matchers for a path.
+  utilities.testRegExString = function(pattern, value) {
+    if (pattern.charAt(0) !== '/') {
+      // must start with a slash
+      return false;
+    }
+    pattern = pattern.slice(1);
+    var options = '';
+    if (pattern.slice(-1) === '/') {
+      pattern = pattern.slice(0, -1);
+    }
+    else if (pattern.slice(-2) === '/i') {
+      pattern = pattern.slice(0, -2);
+      options = 'i';
+    }
+    else {
+      // must end with a slash followed by zero or more options
+      return false;
+    }
+    return new RegExp(pattern, options).test(value);
+  };
+
+  document.registerElement('app-router', {
+    prototype: AppRouter
+  });
+
+})(window, document);
diff --git a/polymer_2.0.2/bower_components/chopsui/.bower.json b/polymer_2.0.2/bower_components/chopsui/.bower.json
new file mode 100644
index 0000000..204fc3a
--- /dev/null
+++ b/polymer_2.0.2/bower_components/chopsui/.bower.json
@@ -0,0 +1,59 @@
+{
+  "name": "chopsui",
+  "description": "Common elements for ChOps Frontends",
+  "authors": [
+    "ChOps CRDX Team"
+  ],
+  "keywords": [
+    "chopsui",
+    "chops-ui"
+  ],
+  "main": "chops-user-dropdown.html",
+  "repository": {
+    "type": "git",
+    "url": "https://chromium.googlesource.com/infra/infra/crdx/chopsui.git"
+  },
+  "moduleType": [
+    "es6"
+  ],
+  "license": "MIT",
+  "ignore": [
+    "**/.*",
+    "node_modules",
+    "bower_components",
+    "test",
+    "tests",
+    "README.md"
+  ],
+  "dependencies": {
+    "iron-behaviors": "PolymerElements/iron-behaviors#~2.0",
+    "iron-dropdown": "PolymerElements/iron-dropdown#~2.0",
+    "iron-icons": "^2.0.0",
+    "moment": "2.17.1",
+    "moment-timezone": "^0.5.10",
+    "paper-item": "PolymerElements/paper-item#~2.0",
+    "paper-input": "PolymerElements/paper-input#~2.0",
+    "paper-tooltip": "PolymerElements/paper-tooltip#~2.0",
+    "polymer": "Polymer/polymer#^2.0.0",
+    "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.1"
+  },
+  "devDependencies": {
+    "iron-test-helpers": "PolymerElements/iron-test-helpers",
+    "iron-demo-helpers": "PolymerElements/iron-demo-helpers",
+    "web-component-tester": "web-component-tester#6.0.0"
+  },
+  "resolutions": {
+    "polymer": "^2.0.0"
+  },
+  "version": "0.0.36",
+  "_release": "0.0.36",
+  "_resolution": {
+    "type": "version",
+    "tag": "v0.0.36",
+    "commit": "927de0cbeaf36ef78931bd7c6dc65b1ae20a6963"
+  },
+  "_source": "https://chromium.googlesource.com/infra/infra/crdx/chopsui.git",
+  "_target": "^0.0.36",
+  "_originalSource": "chopsui",
+  "_direct": true
+}
\ No newline at end of file
diff --git a/polymer_2.0.2/bower_components/chopsui/bower.json b/polymer_2.0.2/bower_components/chopsui/bower.json
new file mode 100644
index 0000000..ad25d5a
--- /dev/null
+++ b/polymer_2.0.2/bower_components/chopsui/bower.json
@@ -0,0 +1,48 @@
+{
+  "name": "chopsui",
+  "description": "Common elements for ChOps Frontends",
+  "authors": [
+    "ChOps CRDX Team"
+  ],
+  "keywords": [
+    "chopsui",
+    "chops-ui"
+  ],
+  "main": "chops-user-dropdown.html",
+  "repository": {
+    "type": "git",
+    "url": "https://chromium.googlesource.com/infra/infra/crdx/chopsui.git"
+  },
+  "moduleType": [
+    "es6"
+  ],
+  "license": "MIT",
+  "ignore": [
+    "**/.*",
+    "node_modules",
+    "bower_components",
+    "test",
+    "tests",
+    "README.md"
+  ],
+  "dependencies": {
+      "iron-behaviors": "PolymerElements/iron-behaviors#~2.0",
+      "iron-dropdown": "PolymerElements/iron-dropdown#~2.0",
+      "iron-icons": "^2.0.0",
+      "moment": "2.17.1",
+      "moment-timezone": "^0.5.10",
+      "paper-item": "PolymerElements/paper-item#~2.0",
+      "paper-input": "PolymerElements/paper-input#~2.0",
+      "paper-tooltip": "PolymerElements/paper-tooltip#~2.0",
+      "polymer": "Polymer/polymer#^2.0.0",
+      "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.1"
+  },
+  "devDependencies": {
+      "iron-test-helpers": "PolymerElements/iron-test-helpers",
+      "iron-demo-helpers": "PolymerElements/iron-demo-helpers",
+      "web-component-tester": "web-component-tester#6.0.0"
+  },
+  "resolutions": {
+    "polymer": "^2.0.0"
+  }
+}
diff --git a/polymer_2.0.2/bower_components/chopsui/chops-bug-input.html b/polymer_2.0.2/bower_components/chopsui/chops-bug-input.html
new file mode 100644
index 0000000..8d3517a
--- /dev/null
+++ b/polymer_2.0.2/bower_components/chopsui/chops-bug-input.html
@@ -0,0 +1,84 @@
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../paper-input/paper-input.html">
+
+<dom-module id="chops-bug-input">
+  <template>
+    <paper-input
+      label="[[inputLabel]]"
+      value="{{_bug}}"
+      auto-validate
+      pattern="[[_bugPattern]]"
+      error-message="Please enter a bug id or bug url">
+    </paper-input>
+  </template>
+  <script>
+    'use strict';
+
+    const bugIdRe = /[0-9]{3,}/;
+    const bugRe = /([^0-9]*)?[0-9]{3,}([^0-9]*)?/;
+    const bugProjectUrlRe = /(\/p\/[a-z0-9][-a-z0-9]*[a-z0-9]\/)/i;
+    const bugProjectPairRe = /([a-z0-9][-a-z0-9]*[a-z0-9]:)/i;
+    const bugProjectNameRe = /[a-z0-9][-a-z0-9]*[a-z0-9]/i;
+
+    /**
+     * `<chops-bug-input>` is an input element for crbug urls and bug ids.
+     *
+     * `<chops-bug-input>` does validation on the input and puts the final bug id in
+     * the bugId property. If the input is invalid, this will be expressed in
+     * the invalidBug property.
+     *
+     *
+     * @customElement
+     * @polymer
+     * @demo /demo/chops-bug-input_demo.html
+     */
+    class ChopsBugInput extends Polymer.Element {
+      static get is() { return 'chops-bug-input'; }
+
+      static get properties() {
+        return {
+          _bug: String,
+          /** The input label for the user inputting the bug with 'Bug # or URL' default. */
+          inputLabel: {
+            type: String,
+            value: 'Bug # or URL',
+          },
+          /** True if the given bug is an invalid id or url. */
+          invalidBug: {
+            type: Boolean,
+            notify: true,
+            computed: '_computeInvalidBug(bugId)',
+          },
+          /** The final bug id. */
+          bugId: {
+            type: String,
+            notify: true,
+            computed: '_computeBugId(_bug)',
+          },
+          /** The final bug project name. */
+          bugProject: {
+            type: String,
+            notify: true,
+            computed: '_computeBugProject(_bug)',
+          },
+        }
+      }
+
+      _computeBugId(bug) {
+        return bugRe.test(bug) ? bugIdRe.exec(bug) : 'Unknown';
+      }
+
+      _computeBugProject(bug) {
+        let cleanBug = bug.replace(/http(s?):/i, "");
+        let projectSection = bugProjectUrlRe.exec(cleanBug) || bugProjectPairRe.exec(cleanBug);
+        return projectSection ? bugProjectNameRe.exec(projectSection)[0] : 'chromium';
+      }
+
+      _computeInvalidBug(bugId) {
+        return bugId == 'Unknown';
+      }
+
+    }
+    customElements.define(ChopsBugInput.is, ChopsBugInput);
+  </script>
+<dom-module>
diff --git a/polymer_2.0.2/bower_components/chopsui/chops-bug-link.html b/polymer_2.0.2/bower_components/chopsui/chops-bug-link.html
new file mode 100644
index 0000000..d30f368
--- /dev/null
+++ b/polymer_2.0.2/bower_components/chopsui/chops-bug-link.html
@@ -0,0 +1,93 @@
+<link rel="import" href="../polymer/polymer.html">
+
+<dom-module id="chops-bug-link">
+  <template>
+    <style>
+      :host {
+        display: block;
+      }
+      p {
+        display: inline;
+      }
+    </style>
+    <a href$="http://bugs.chromium.org/p/[[_bugProject]]/issues/detail?id=[[_bugId]]">
+      [[_bugProject]]:[[_bugId]]</a>
+    <template is="dom-if" if="[[status]]">
+      <p>([[status]])</p>
+    </template>
+
+    <template is="dom-if" if="[[pri]]">
+      <p>(Pri-[[pri]])</p>
+    </template>
+
+    <template is="dom-if" if="[[!short]]">
+      <p>[[description]]</p>
+    </template>
+
+  </template>
+  <script>
+    'use strict';
+
+    const bugIdRe = /[0-9]{3,}/;
+    const bugRe = /([^0-9]*)?[0-9]{3,}([^0-9]*)?/;
+    const bugProjectUrlRe = /(\/p\/[a-z0-9][-a-z0-9]*[a-z0-9]\/)/i;
+    const bugProjectPairRe = /([a-z0-9][-a-z0-9]*[a-z0-9]:)/i;
+    const bugProjectNameRe = /[a-z0-9][-a-z0-9]*[a-z0-9]/i;
+
+    /**
+     * `<chops-bug-link>` displays a link to a chromium bug.
+     *
+     * All properties except for `bug` are optional. Set short to true
+     * when the description should not be shown.
+     *
+     * @customElement
+     * @polymer
+     * @demo /demo/chops-bug-link_demo.html
+     */
+    class ChopsBugLink extends Polymer.Element {
+      static get is() { return 'chops-bug-link'; }
+
+      static get properties() {
+        return {
+          /** A bug id, bug url, or a bug in the form of 'projectName:bugId' . Required. */
+          bug: String,
+          /** The bug id. */
+          _bugId: {
+            type: String,
+            computed: '_computeBugId(bug)',
+          },
+          /** The bug's project name. */
+          _bugProject: {
+            type: String,
+            computed: '_computeBugProject(bug)',
+          },
+          /** The status of the bug, eg. 'Untriaged', 'Available'. Optional. */
+          status: String,
+          /** The priority number of the bug. Optional. */
+          pri: {
+            type: String,
+          },
+          /** The bug's description. Optional. */
+          description: String,
+          /** Set to true if you don't want the bug's description to be displayed. */
+          short: {
+            type: Boolean,
+            value: false,
+          }
+        }
+      }
+
+      _computeBugId(bug) {
+        return bugRe.test(bug) ? bugIdRe.exec(bug) : 'Unknown';
+      }
+
+      _computeBugProject(bug) {
+        let cleanBug = bug.replace(/http(s?):/i, "");
+        let projectSection = bugProjectUrlRe.exec(cleanBug) || bugProjectPairRe.exec(cleanBug);
+        return projectSection ? bugProjectNameRe.exec(projectSection)[0] : 'chromium';
+      }
+
+    }
+    customElements.define(ChopsBugLink.is, ChopsBugLink);
+  </script>
+<dom-module>
diff --git a/polymer_2.0.2/bower_components/chopsui/chops-cl-link.html b/polymer_2.0.2/bower_components/chopsui/chops-cl-link.html
new file mode 100644
index 0000000..dc18243
--- /dev/null
+++ b/polymer_2.0.2/bower_components/chopsui/chops-cl-link.html
@@ -0,0 +1,55 @@
+<link rel="import" href="../polymer/polymer.html">
+
+<dom-module id="chops-cl-link">
+  <template>
+    <style>
+      * {
+        font-family: 'Roboto', 'Noto', sans-serif;
+      }
+    </style>
+    <p>
+      <a href$="https://crrev.com/[[change]]">[[change]]</a>
+      (<a href$="mailto:[[ownerEmail]]">[[_userName]]</a>):
+      [[description]]
+    </p>
+  </template>
+  <script>
+    'use strict';
+
+    /**
+     * `<chops-cl-link>` displays basic information of a cl with a
+     * link to the full details of the change
+     *
+     * Provide the change number, owner email, and description.
+     *
+     * @customElement
+     * @polymer
+     * @demo /demo/chops-cl-link_demo.html
+     */
+    class ChopsClLink extends Polymer.Element {
+      static get is() { return 'chops-cl-link'; }
+
+      static get properties() {
+        return {
+          /** The change number. */
+          change: String,
+          /** The owner's email. */
+          ownerEmail: String,
+          /** The change description. */
+          description: String,
+          _userName : {
+            type: String,
+            computed: '_computeUserName(ownerEmail)',
+          },
+        }
+      }
+
+      _computeUserName(email) {
+        let cutoff = email.indexOf('@');
+        return (cutoff < 0) ? 'Unkown' : email.substring(0, cutoff);
+      }
+
+    }
+    customElements.define(ChopsClLink.is, ChopsClLink);
+  </script>
+<dom-module>
diff --git a/polymer_2.0.2/bower_components/chopsui/chops-header.html b/polymer_2.0.2/bower_components/chopsui/chops-header.html
new file mode 100644
index 0000000..27a912b
--- /dev/null
+++ b/polymer_2.0.2/bower_components/chopsui/chops-header.html
@@ -0,0 +1,126 @@
+<link rel="import" href="../../bower_components/polymer/polymer.html">
+<link rel="import" href="../../bower_components/polymer/polymer-element.html">
+
+<link rel="import" href="chops-login.html">
+
+<dom-module id="chops-header">
+  <template>
+    <style>
+      :host {
+        --chops-header-text-color: inherit;
+        color: var(--chops-header-text-color);
+        background: #dce5f8;
+        font-size: 14px;
+        width: 100%;
+        height: 50px;
+        display: flex;
+        flex-direction: row;
+        justify-content: space-between;
+        align-items: center;
+        z-index: 100;
+      }
+      #headerTitle {
+        font-size: 18px;
+        display: flex;
+        align-items: center;
+        @apply --chops-header-title-theme;
+      }
+      #headerTitle a {
+        color: var(--chops-header-text-color);
+        text-decoration: none;
+      }
+      #headerTitle a:hover {
+        text-decoration: underline;
+      }
+      #headerTitle img {
+        height: 32px;
+        width: 32px;
+        font-size: 10px;
+        overflow: hidden;
+      }
+      #headerTitle small {
+        font-size: 14px;
+      }
+      #headerTitleText {
+        display: flex;
+        align-items: baseline;
+      }
+      #headerTitleTextMain {
+        padding: 0 8px;
+      }
+      .header-section {
+        padding: 0.5em 16px;
+        display: flex;
+        align-items: center;
+      }
+      @media (max-width: 840px) {
+        .header-section {
+          font-size: 0.8em;
+          min-width: 10%;
+          text-align: left;
+        }
+      }
+    </style>
+    <div class="header-section">
+      <slot name="before-header"></slot>
+      <div id="headerTitle">
+        <template is="dom-if" if="[[logoSrc]]">
+          <a href="/">
+            <img src$="[[logoSrc]]" alt$="[[appTitle]] Logo" title$="[[appTitle]] Logo" />
+          </a>
+        </template>
+        <span id="headerTitleText">
+          <a id="headerTitleTextMain" href="/">
+            [[appTitle]]
+          </a>
+          <small>
+            <slot name="subheader"></slot>
+          </small>
+        </span>
+      </div>
+    </div>
+    <slot class="header-section"></slot>
+  </template>
+  <script>
+    'use strict';
+
+    /**
+     * `chops-header` is a shared header element for ChOps frontends to use.
+     *
+     * This element contains two slots for clients to add content. The default
+     * slot holds content in the header section to the right of the title. And
+     * the 'subheader' slot holds content which appears next to the title.
+     *
+     *
+     * @customElement
+     * @polymer
+     * @demo /demo/chops-header_demo.html
+     */
+    class ChopsHeader extends Polymer.Element {
+
+      static get is() {
+        return 'chops-header';
+      }
+
+      static get properties() {
+        return {
+          /* String for the title of the application. */
+          appTitle: {
+            type: String,
+            value: 'Chops App',
+          },
+          /* The home URL for the application. Defaults to '/'. */
+          homeUrl: {
+            type: String,
+            value: '/',
+          },
+          /* URL for the image location of the application's logo. No logo is
+           * shown if this is not specified. */
+          logoSrc: String,
+        };
+      }
+    }
+
+    customElements.define(ChopsHeader.is, ChopsHeader);
+  </script>
+</dom-module>
diff --git a/polymer_2.0.2/bower_components/chopsui/chops-login.html b/polymer_2.0.2/bower_components/chopsui/chops-login.html
new file mode 100644
index 0000000..cceda63
--- /dev/null
+++ b/polymer_2.0.2/bower_components/chopsui/chops-login.html
@@ -0,0 +1,60 @@
+<link rel="import" href="../polymer/polymer.html">
+
+<dom-module id="chops-login">
+  <template>
+    <style>
+      :host {
+        --chops-login-link-color: inherit;
+      }
+      a, a:link {
+        color: var(--chops-login-link-color);
+        font-size: 0.75em;
+        text-decoration: none;
+      }
+    </style>
+    <template is="dom-if" if="[[!user]]">
+      <a href="[[loginUrl]]">LOGIN</a>
+    </template>
+    <template is="dom-if" if="[[user]]">
+      [[user]] (<a href="[[logoutUrl]]">LOGOUT</a>)
+    </template>
+  </template>
+  <script>
+    'use strict';
+
+    /**
+     * `chops-login` shows the login/logout links and current user, if provided.
+     *
+     * When the user is logged in provide, at least, the user and logoutURL properties.
+     * When there is no user logged in provide, at least the loginURL property.
+     * In either case, bother URLs may be provided but only one will be shown.
+     *
+     *
+     * @customElement
+     * @polymer
+     * @demo /demo/chops-login_demo.html
+     */
+    class ChopsLogin extends Polymer.Element {
+      static get is() { return 'chops-login'; }
+
+      static get properties() {
+        return {
+          /** The login URL must be provided if no user is given. */
+          loginUrl: {
+            type: String,
+          },
+          /** The logout URL must be provided if a user is given. */
+          logoutUrl: {
+            type: String,
+          },
+          /** The logged in user. If this isn't given the login URL will be shown.*/
+          user: {
+            type: String,
+            value: "",
+          },
+        }
+      }
+    }
+    customElements.define(ChopsLogin.is, ChopsLogin);
+  </script>
+<dom-module>
diff --git a/polymer_2.0.2/bower_components/chopsui/chops-styles.css b/polymer_2.0.2/bower_components/chopsui/chops-styles.css
new file mode 100644
index 0000000..54bca4c
--- /dev/null
+++ b/polymer_2.0.2/bower_components/chopsui/chops-styles.css
@@ -0,0 +1,3 @@
+:root {
+  font-family: 'Roboto', 'Noto', sans-serif;
+}
diff --git a/polymer_2.0.2/bower_components/chopsui/chops-timestamp.html b/polymer_2.0.2/bower_components/chopsui/chops-timestamp.html
new file mode 100644
index 0000000..d2a92cd
--- /dev/null
+++ b/polymer_2.0.2/bower_components/chopsui/chops-timestamp.html
@@ -0,0 +1,66 @@
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../paper-tooltip/paper-tooltip.html">
+<script src="../moment/min/moment.min.js"></script>
+<script src="../moment-timezone/builds/moment-timezone-with-data.min.js"></script>
+
+<dom-module id="chops-timestamp">
+  <template>
+    <style>
+    </style>
+    <template is="dom-if" if="[[!short]]">
+      [[_fmtDate]] ([[_computeRelativeTime(date)]])
+    </template>
+    <template is="dom-if" if="[[short]]">
+      [[_computeRelativeTime(date)]]
+      <paper-tooltip>[[_fmtDate]]</paper-tooltip>
+    </template>
+  </template>
+  <script>
+    'use strict';
+
+    /**
+     * `<chops-timestamp>` displays a formatted time string in PDT and the relative time.
+     *
+     * This element shows a time in a human readable form.
+     *
+     * @customElement
+     * @polymer
+     * @demo /demo/chops-timestamp_demo.html
+     */
+    class ChopsTimestamp extends Polymer.Element {
+      static get is() { return 'chops-timestamp'; }
+
+      static get properties() {
+        return {
+          /** The javascript Date object, which is stored in UTC, to be processed. */
+          date: Object,
+          /** When true, a shorter version of the date will be displayed. */
+          short: {
+            type: Boolean,
+            value: false,
+          },
+          /** The format of the date. */
+          dateFormat: {
+            type: String,
+            value: "ddd D MMM 'YY, h:mm a z",
+          },
+          /** The formatted date. */
+          _fmtDate: {
+            type: String,
+            computed: '_computeDisplayedTime(date, dateFormat)',
+          },
+        }
+      }
+
+      _computeDisplayedTime(date, format) {
+        return moment(date).tz('America/Los_Angeles').format(format);
+      }
+
+      _computeRelativeTime(date) {
+        return moment(date).fromNow();
+      }
+
+    }
+    customElements.define(ChopsTimestamp.is, ChopsTimestamp);
+  </script>
+<dom-module>
diff --git a/polymer_2.0.2/bower_components/chopsui/chops-tree-status.html b/polymer_2.0.2/bower_components/chopsui/chops-tree-status.html
new file mode 100644
index 0000000..ef91356
--- /dev/null
+++ b/polymer_2.0.2/bower_components/chopsui/chops-tree-status.html
@@ -0,0 +1,143 @@
+<link rel="import" href="../polymer/polymer.html">
+
+<dom-module id="chops-tree-status">
+  <template>
+    <style>
+      .closed {
+        background-color: #E98080;
+      }
+      .maintenance {
+        background-color: #ff80ff;
+      }
+      .open {
+        background-color: #8FDF5F;
+      }
+      .throttled {
+        background-color: #fffc6c;
+      }
+      .tree-banner {
+        box-sizing: border-box;
+        color: #222;
+        margin: 0.5em auto;
+        padding: 0.5em 8px;
+        width: 100%;
+      }
+    </style>
+    <div class="error" hidden$="[[!_hasError]]">
+      Error fetching tree status from <a href$="[[statusUrl]]" target="_blank">[[statusUrl]]</a>
+    </div>
+    <div class$="treeStatus [[_status]]" hidden$="[[_hasError]]">
+      Tree status: [[_message]] by
+      <a href$="mailto:[[_email]]">[[_username]]</a>
+      on [[_time]]
+      (<a href$="[[statusUrl]]" target="_blank">More</a>)
+    </div>
+  </template>
+  <script>
+    'use strict';
+    /**
+     * `<chops-tree-status>` is an element used for displaying the tree status
+     * available via the statusUrl.
+     *
+     * Provide a statusUrl like 'https://infra-status.appspot.com/' or
+     * 'http://chromium-status.appspot.com/'
+     *
+     * @customElement
+     * @polymer
+     * @demo /demo/chops-tree-status_demo.html
+     */
+    class ChopsTreeStatus extends Polymer.Element {
+      static get is() { return 'chops-tree-status'; }
+
+      static get properties() {
+        return {
+          /**
+           * The url where the tree's status can be found.
+           *
+           * @type String
+           */
+          statusUrl: {
+            type: String,
+            value: '',
+          },
+          /**
+           * The error data json. This property should only be passed in if
+           * there was an error getting the status.
+           *
+           * @type Object{error}
+           */
+          statusErrorJson: {
+            type: Object,
+            value: () => { return {}; },
+          },
+          /**
+           * The tree status data json. This can be taken directly from the
+           * 'current?format=json' page and passed directly to <chops-tree-status>
+           *
+           * @type Object{username, generatl_status, date, message}
+           */
+          statusJson: {
+            type: Object,
+            value: () => {
+              return {message: 'Unknown', date: 'Unknown', general_state: '', username: ''};
+            },
+          },
+          _hasError: {
+            type: Boolean,
+            computed: '_computeHasError(statusErrorJson)',
+            value: false,
+          },
+
+          // Processed JSON data
+          _email: {
+            type: String,
+            computed: '_computeEmail(statusJson)',
+          },
+          _message: {
+            type: String,
+            computed: '_computeMessage(statusJson)',
+          },
+          _status: {
+            type: String,
+            computed: '_computeStatus(statusJson)',
+          },
+          _time: {
+            type: String,
+            computed: '_computeTime(statusJson)',
+          },
+          _username: {
+            type: String,
+            computed: '_computeUsername(_email)',
+          },
+        };
+      }
+
+      _computeHasError(errorJson) {
+        return !!errorJson && Object.keys(errorJson).length > 0;
+      }
+
+      _computeEmail(json) {
+        return json ? json.username : '';
+      }
+
+      _computeStatus(json) {
+        return json ? json.general_state : ''
+      }
+
+      _computeMessage(json) {
+        return json ? json.message : 'Unknown';
+      }
+
+      _computeTime(json) {
+        return json ? `${json.date.split(".")[0]} GMT`: 'Unknown';
+      }
+
+      _computeUsername(email) {
+        let cutoff = email.indexOf('@');
+        return (cutoff < 0) ? 'Unknown' : email.substring(0, cutoff);
+      }
+
+    }
+    customElements.define(ChopsTreeStatus.is, ChopsTreeStatus);
+  </script>
+</dom-module>
diff --git a/polymer_2.0.2/bower_components/chopsui/chops-user-dropdown.html b/polymer_2.0.2/bower_components/chopsui/chops-user-dropdown.html
new file mode 100644
index 0000000..ea80226
--- /dev/null
+++ b/polymer_2.0.2/bower_components/chopsui/chops-user-dropdown.html
@@ -0,0 +1,89 @@
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../paper-item/paper-item.html">
+
+<dom-module id="chops-user-dropdown">
+  <template>
+    <style>
+      .resize {
+        display: block;
+        overflow: auto;
+      }
+      .hidden {
+        display: none !important;
+      }
+      paper-item:hover {
+        background: grey;
+      }
+    </style>
+    <div id="dropdown" class="resize">
+      <template is="dom-repeat" items="[[suggestions]]">
+        <paper-item id$="[[index]]" on-click="_userSelected">[[_computeUserDisplay(item)]]</paper-item>
+      </template>
+    </div>
+  </template>
+  <script>
+    'use strict';
+
+    /**
+     * `chops-user-dropdown` is a dropdown element displaying a list of user ids.
+     *
+     * When using this, provide an array of suggestions that should be displayed
+     * This element should, idealy, be used with chops-user-input
+     *
+     * @customElement
+     * @polymer
+     *
+     */
+    class UsersDropdown extends Polymer.Element {
+      static get is() { return 'chops-user-dropdown'; }
+
+      static get properties() {
+        return {
+        /**
+         * The array of users that should be listed.
+         *
+         * @type Array<Object{userId, email(opt), profileLink(opt), fullName(opt)}>
+         */
+          suggestions: {
+            type: Array,
+            value: () => {return []; },
+          },
+        }
+      }
+
+      ready() {
+        super.ready();
+        this.$.dropdown.classList.add('hidden');
+      }
+
+      /** Opens the dropdown element. */
+      open() {
+        this.$.dropdown.classList.remove('hidden');
+      }
+
+      /** Closes the dropdown element. */
+      close() {
+        this.$.dropdown.classList.add('hidden');
+      }
+
+      /** Gets the selected user information and fires 'user-selected'. */
+      _userSelected(e) {
+        let user = this.suggestions[e.currentTarget.id];
+        this.dispatchEvent(new CustomEvent('user-selected', {detail: {selectedUser: user}}));
+      }
+
+      _computeUserDisplay(user) {
+        return user.email ? `${user.userId} <${user.email}> ` : user.userId;
+      }
+
+      /**
+       * Fired when a user has been selected.
+       *
+       * @event user-selected
+       * @param {string} selectedUser username of the selected user.
+       */
+
+    }
+    customElements.define(UsersDropdown.is, UsersDropdown);
+  </script>
+</dom-module>
diff --git a/polymer_2.0.2/bower_components/chopsui/chops-user-id.html b/polymer_2.0.2/bower_components/chopsui/chops-user-id.html
new file mode 100644
index 0000000..51b1626
--- /dev/null
+++ b/polymer_2.0.2/bower_components/chopsui/chops-user-id.html
@@ -0,0 +1,125 @@
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="../paper-tooltip/paper-tooltip.html">
+<link rel="import" href="../iron-icons/iron-icons.html">
+
+<dom-module id="chops-user-id">
+  <template>
+    <style>
+      a {
+        color: black;
+        text-decoration: none;
+      }
+      a:hover {
+        text-decoration: underline;
+      }
+      iron-icon {
+        top: -1px;
+        --iron-icon-height: 10px;
+        --iron-icon-width: 10px;
+      }
+      iron-icon:hover {
+        background-color: #CECECE;
+      }
+      .user-label {
+        font-size: .81em;
+        border-radius: 15px;
+        padding: 2px 8px;
+        background-color: #E0E0E0;
+      }
+    </style>
+    <span class="user-label">
+      <template is="dom-if" if="[[profileLink]]">
+        <a href$="[[profileLink]]">[[userId]]</a>
+      </template>
+      <template is="dom-if" if="[[!profileLink]]">
+        [[userId]]
+      </template>
+      <iron-icon icon="clear" hidden$="[[!removeable]]" on-click="_removeUser"></iron-icon>
+      <paper-tooltip>[[fullName]] [[email]]</paper-tooltip>
+    </span>
+  </template>
+  <script>
+    'use strict';
+
+    /**
+    * `<chops-user-id>` is an element used for displaying users.
+    *
+    * The only required attribute is userId. If the profile-link is provided
+    * the userId text will be displayed as a link. If an email and/or fullName
+    * are provided they will be visible when hovering over the element.
+    *
+    *
+    * @customElement
+    * @polymer
+    * @demo /demo/chops-user-id_demo.html
+    */
+    class ChopsUserId extends Polymer.Element {
+      static get is() { return 'chops-user-id'; }
+
+      static get properties() {
+        return {
+          /**
+           * The user's id to be displayed. Required.
+           *
+           * @type String
+           */
+          userId: {
+            type: String,
+          },
+          /**
+           * The user's email. Optional.
+           *
+           * @type String
+           */
+          email: {
+            type: String,
+          },
+          /**
+           * The full name of the user. Optional.
+           *
+           * @type String
+           */
+          fullName: {
+            type: String,
+          },
+          /**
+           * The link to the user's profile page. Optional.
+           *
+           * @type String
+           */
+          profileLink: {
+            type: String,
+            value: "",
+          },
+          /**
+           * If true, a 'remove' icon will be visible and fire 'remove-user' on click.
+           *
+           * @type Boolean
+           */
+          removeable: {
+            type: Boolean,
+            value: false,
+          },
+        }
+      }
+
+      /** Gets the user information and fires 'user-removed'. */
+      _removeUser(e) {
+        let user = {userId: this.userId};
+        if (this.email) { user.email = this.email; }
+        if (this.fullName) { user.fullName = this.fullName; }
+        if (this.profileLink) { user.profileLink = this.profileLink; }
+        this.dispatchEvent(new CustomEvent('remove-user', {detail: {removedUser: user}}));
+      }
+
+      /**
+       * Fired when a user wants to remove this user.
+       *
+       * @event remove-user
+       * @param {Object} removedUser object containing all of the user's given information.
+       */
+
+    }
+    customElements.define(ChopsUserId.is, ChopsUserId);
+  </script>
+  <dom-module>
diff --git a/polymer_2.0.2/bower_components/chopsui/chops-user-input.html b/polymer_2.0.2/bower_components/chopsui/chops-user-input.html
new file mode 100644
index 0000000..70b033b
--- /dev/null
+++ b/polymer_2.0.2/bower_components/chopsui/chops-user-input.html
@@ -0,0 +1,177 @@
+<link rel="import" href="../polymer/polymer.html">
+<link rel="import" href="chops-user-dropdown.html">
+<link rel="import" href="chops-user-id.html">
+<link rel="import" href="../paper-input/paper-input.html">
+<link rel="import" href="../iron-behaviors/iron-control-state.html">
+
+<dom-module id="chops-user-input">
+  <template>
+    <style>
+    </style>
+    <paper-input id="input" label="[[label]]" value="{{inputValue}}" on-input="_inputChanged">
+      <template is="dom-repeat" items="[[selectedUsers]]">
+        <chops-user-id
+          slot="prefix"
+          user-id="[[item.userId]]"
+          email="[[item.email]]"
+          profile-link="[[item.profileLink]]"
+          full-name="[[item.fullName]]"
+          on-remove-user="_removeUser"
+          removeable>
+        </chops-user-id>
+      </template>
+    </paper-input>
+    <chops-user-dropdown id="dropdown" on-user-selected="_saveUser" suggestions="[[suggestions]]">
+    </chops-user-dropdown>
+  </template>
+  <script>
+    'use strict';
+
+    /**
+     *
+     * `<chops-user-input>` as an input element for choosing users with
+     * dropdown suggestions and autocomplete.
+     *
+     * It is up to the developer using this element to provide and update
+     * the users listed in the `suggestions` property. The properties,
+     * `inputValue` and `selectedUsers` are available for two-way binding
+     * for this purpose.
+     *
+     * customElement
+     * @polymer
+     * @demo /demo/chops-user-input_demo.html
+     *
+     */
+    class ChopsUserInput extends Polymer.mixinBehaviors(
+        [Polymer.IronControlState], Polymer.Element) {
+      static get is() { return 'chops-user-input'; }
+
+      static get properties() {
+        return {
+          /**
+           * The current input value.
+           *
+           * @type String
+           */
+          inputValue: {
+            type: String,
+            value: '',
+            notify: true,
+          },
+          /**
+           * The display label.
+           *
+           * @type String
+           */
+          label: {
+            type: String,
+            value: 'place holder',
+          },
+          /**
+           * List of suggestions displayed in the dropdown.
+           *
+           * @type Array<Object{userId, email(opt), profileLink(opt), fullName(opt)}>
+           */
+          suggestions: {
+            type: Array,
+            value: () => { return []; },
+            notify: true,
+          },
+          /**
+           * List of users selected, so far.
+           *
+           * @type Array<Object{userId, email(opt), profileLink(opt), fullName(opt)}>
+           */
+          selectedUsers: {
+            type: Array,
+            value: () => { return []; },
+            notify: true,
+          },
+          /**
+           * If true, multiple users can be selected.
+           *
+           * @type Boolean
+           */
+          multiple: {
+            type: Boolean,
+            value: false,
+          },
+          /**
+           * If true, additional users cannot be selected.
+           *
+           * @type Boolean
+           */
+          _inputDisabled: {
+            type: Boolean,
+            value: false,
+          },
+        }
+      }
+
+      static get observers() {
+        return [
+          '_updateInputDisabled(selectedUsers.length)'
+        ]
+      }
+
+      ready() {
+        super.ready();
+        this.addEventListener('focused-changed', e => this._toggleDropdown(e));
+      }
+
+      /** Updates inputDisabled. */
+      _updateInputDisabled(length) {
+        this._inputDisabled = Boolean(!this.multiple && length);
+      }
+
+      /** Toggles the visibility of the dropdown element. */
+      _toggleDropdown(e) {
+        if (!this._inputDisabled) {
+          if (!this.focused) {
+            this.$.dropdown.close();
+          } else {
+            this.$.dropdown.open();
+          }
+        }
+      }
+
+      /**
+       * Pushes a newly selected user to the selectedUser property
+       *
+       * @param {Event} e event that triggered the function with selectedUser
+       * in the detail{}.
+       */
+      _saveUser(e) {
+         this.push('selectedUsers', e.detail.selectedUser);
+         this.$.dropdown.close();
+         this.inputValue = '';
+         this.dispatchEvent(
+             new CustomEvent('user-selected', {detail: e.detail}));
+      }
+
+      /**
+       * Removes a selected user from the selectedUser property.
+       *
+       * @param {Event} e event that triggered the function with removedUser
+       * in the detail{}.
+      */
+      _removeUser(e) {
+        let userId = e.detail.removedUser.userId;
+        let index = -1;
+        this.selectedUsers.forEach((user, i) => {
+          if (user.userId === userId) {
+            index = i;
+          }
+        });
+        if (index != -1) {
+          this.splice('selectedUsers', index, 1);
+        }
+      }
+
+      _inputChanged(e) {
+        this.dispatchEvent(new CustomEvent('input', {detail: e.detail}));
+      }
+    }
+    customElements.define(ChopsUserInput.is, ChopsUserInput);
+  </script>
+</dom-moduel>
diff --git a/polymer_2.0.2/bower_components/chopsui/demo/chops-bug-input_demo.html b/polymer_2.0.2/bower_components/chopsui/demo/chops-bug-input_demo.html
new file mode 100644
index 0000000..b0eaa6c
--- /dev/null
+++ b/polymer_2.0.2/bower_components/chopsui/demo/chops-bug-input_demo.html
@@ -0,0 +1,9 @@
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+<link rel="import" href="../chops-bug-input.html">
+
+<demo-snippet>
+  <template>
+    <chops-bug-input></chops-bug-input>
+  </template>
+</demo-snippet>
diff --git a/polymer_2.0.2/bower_components/chopsui/demo/chops-bug-link_demo.html b/polymer_2.0.2/bower_components/chopsui/demo/chops-bug-link_demo.html
new file mode 100644
index 0000000..67144e5
--- /dev/null
+++ b/polymer_2.0.2/bower_components/chopsui/demo/chops-bug-link_demo.html
@@ -0,0 +1,12 @@
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+<link rel="import" href="../chops-bug-link.html">
+
+<demo-snippet>
+  <template>
+    <chops-bug-link bug="https://bugs.chromium.org/p/monorail/issues/detail?id=1347#c3"></chops-bug-link>
+    <chops-bug-link bug="crbug/761347" short description="Some long bug description" pri="0" status="Untriaged"></chops-bug-link>
+    <chops-bug-link bug="crbug.com/761347" pri="2" description="Some long bug description"></chops-bug-link>
+    <chops-bug-link bug="gerrit:1347" pri="2" description="problem in gerrit"></chops-bug-link>
+  </template>
+</demo-snippet>
diff --git a/polymer_2.0.2/bower_components/chopsui/demo/chops-cl-link_demo.html b/polymer_2.0.2/bower_components/chopsui/demo/chops-cl-link_demo.html
new file mode 100644
index 0000000..e1596d5
--- /dev/null
+++ b/polymer_2.0.2/bower_components/chopsui/demo/chops-cl-link_demo.html
@@ -0,0 +1,9 @@
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+<link rel="import" href="../chops-cl-link.html">
+
+<demo-snippet>
+  <template>
+    <chops-cl-link change="6f1faebd" owner-email="avi@chromium.org" description="Added something cool"></chops-cl-link>
+  </template>
+</demo-snippet>
diff --git a/polymer_2.0.2/bower_components/chopsui/demo/chops-header_demo.html b/polymer_2.0.2/bower_components/chopsui/demo/chops-header_demo.html
new file mode 100644
index 0000000..2d949aa
--- /dev/null
+++ b/polymer_2.0.2/bower_components/chopsui/demo/chops-header_demo.html
@@ -0,0 +1,25 @@
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+<link rel="import" href="../chops-header.html">
+<link rel="import" href="../chops-login.html">
+
+<link rel="stylesheet" type="text/css" href="../chops-styles.css">
+
+Example of chops-header without any content in slots
+
+<demo-snippet>
+  <template>
+    <chops-header app-title="Demo" logo-src="../img/logo.png"></chops-header>
+  </template>
+</demo-snippet>
+
+Example of chops-header using slots and chops-login
+
+<demo-snippet>
+  <template>
+    <chops-header app-title="Demo" logo-src="../img/logo.png">
+      <span slot="subheader">&gt; <a href="#">Breadcrumbs</a></span>
+      <chops-login login-url="https://www.google.com/" logout-url="https://store.google.com/" user="jojwang@chromium.org"></chops-login>
+    </chops-header>
+  </template>
+</demo-snippet>
diff --git a/polymer_2.0.2/bower_components/chopsui/demo/chops-login_demo.html b/polymer_2.0.2/bower_components/chopsui/demo/chops-login_demo.html
new file mode 100644
index 0000000..c451fca
--- /dev/null
+++ b/polymer_2.0.2/bower_components/chopsui/demo/chops-login_demo.html
@@ -0,0 +1,19 @@
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+<link rel="import" href="../chops-login.html">
+
+Example of chops-login with no current user specified
+
+<demo-snippet>
+  <template>
+    <chops-login login-url="https://www.google.com/" logout-url="https://store.google.com/"></chops-login>
+  </template>
+</demo-snippet>
+
+Example of chops-login with a current user specified
+
+<demo-snippet>
+  <template>
+    <chops-login login-url="https://www.google.com/" logout-url="https://store.google.com/" user="jojwang@chromium.org"></chops-login>
+  </template>
+</demo-snippet>
diff --git a/polymer_2.0.2/bower_components/chopsui/demo/chops-timestamp_demo.html b/polymer_2.0.2/bower_components/chopsui/demo/chops-timestamp_demo.html
new file mode 100644
index 0000000..542a5f3
--- /dev/null
+++ b/polymer_2.0.2/bower_components/chopsui/demo/chops-timestamp_demo.html
@@ -0,0 +1,29 @@
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+<link rel="import" href="../chops-timestamp.html">
+
+<demo-snippet>
+  <template>
+    <script>
+      // Set first chops-timestamp element properties.
+      let date = new Date();
+      let ts1 = document.getElementById('js-ts1');
+      ts1.date = date;
+
+      // Set second chops-timestamp element properties.
+      let date2 = date;
+      date2.setDate(date2.getDate() - 3);
+      let ts2 = document.getElementById('js-ts2')
+      ts2.date = date2;
+      ts2.dateFormat = 'D MMM YYYY';
+
+      // Set second chops-timestamp element properties.
+      document.getElementById('js-ts3').date = date;
+    </script>
+    <chops-timestamp id="js-ts1"></chops-timestamp>
+    <br>
+    <chops-timestamp id="js-ts2"></chops-timestamp>
+    <br>
+    <chops-timestamp id="js-ts3" short></chops-timestamp>
+  </template>
+</demo-snippet>
diff --git a/polymer_2.0.2/bower_components/chopsui/demo/chops-tree-status_demo.html b/polymer_2.0.2/bower_components/chopsui/demo/chops-tree-status_demo.html
new file mode 100644
index 0000000..4386a7b
--- /dev/null
+++ b/polymer_2.0.2/bower_components/chopsui/demo/chops-tree-status_demo.html
@@ -0,0 +1,38 @@
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+<link rel="import" href="../chops-tree-status.html">
+
+<demo-snippet>
+  <template>
+    <script>
+      let closedStatusJson = {
+        'username': 'nobody@chromium.org',
+        'general_state': 'closed',
+        'date': '2017-08-28 18:29:00.267230',
+        'message': 'whoopsie',
+      }
+      let closedTree = document.getElementById('closed-tree');
+      closedTree.statusJson = closedStatusJson;
+      closedTree.statusUrl = 'http://chromium-status.appspot.com/';
+
+      let openStatusJson = {
+        'username': 'nobody@chromium.org',
+        'general_state': 'open',
+        'date': '2017-08-28 18:29:00.267230',
+        'message': 'chill',
+      }
+      let openTree = document.getElementById('open-tree');
+      openTree.statusJson = openStatusJson;
+      openTree.statusUrl = 'https://infra-status.appspot.com/';
+
+      let errorTree = document.getElementById('error-tree');
+      errorTree.statusErrorJson = {error: 'Failure!'};
+      errorTree.statusUrl = 'https://infra-status.appspot.com/';
+    </script>
+    <chops-tree-status id="closed-tree"> </chops-tree-status>
+    <br>
+    <chops-tree-status id="open-tree"></chops-tree-status>
+    <br>
+    <chops-tree-status id="error-tree"></chops-tree-status>
+  </template>
+</demo-snippet>
diff --git a/polymer_2.0.2/bower_components/chopsui/demo/chops-user-id_demo.html b/polymer_2.0.2/bower_components/chopsui/demo/chops-user-id_demo.html
new file mode 100644
index 0000000..d116917
--- /dev/null
+++ b/polymer_2.0.2/bower_components/chopsui/demo/chops-user-id_demo.html
@@ -0,0 +1,12 @@
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+<link rel="import" href="../chops-user-id.html">
+<!--- TODO(jojwang): Add some element that listens for the 'remove-user' event -->
+
+<demo-snippet>
+  <template>
+    <chops-user-id user-id="afinch"></chops-user-id>
+    <chops-user-id user-id="sfinch" profile-link="https://www.google.com" removeable></chops-user-id>
+    <chops-user-id user-id="gatsby" full-name="Jay Gatsby" email="gatsbylooking@greenlight.com"></chops-user-id>
+  </template>
+</demo-snippet>
diff --git a/polymer_2.0.2/bower_components/chopsui/demo/chops-user-input_demo.html b/polymer_2.0.2/bower_components/chopsui/demo/chops-user-input_demo.html
new file mode 100644
index 0000000..2c84bc9
--- /dev/null
+++ b/polymer_2.0.2/bower_components/chopsui/demo/chops-user-input_demo.html
@@ -0,0 +1,12 @@
+<link rel="import" href="../../polymer/polymer.html">
+<link rel="import" href="../../iron-demo-helpers/demo-snippet.html">
+<link rel="import" href="../chops-user-input.html">
+
+<demo-snippet>
+  <template>
+    <chops-user-input suggestions='[{"userId": "one", "email": "one@gmail.com"}, {"userId": "userTwo"}]'>
+    </chops-user-input>
+    <chops-user-input suggestions='[{"userId": "one", "email": "one@gmail.com"}, {"userId": "userTwo"}]' multiple>
+    </chops-user-input>
+  </template>
+</demo-snippet>
diff --git a/polymer_2.0.2/bower_components/chopsui/img/logo.png b/polymer_2.0.2/bower_components/chopsui/img/logo.png
new file mode 100644
index 0000000..c436234
--- /dev/null
+++ b/polymer_2.0.2/bower_components/chopsui/img/logo.png
Binary files differ
diff --git a/polymer_2.0.2/bower_components/chopsui/new-element-test.sh b/polymer_2.0.2/bower_components/chopsui/new-element-test.sh
new file mode 100755
index 0000000..64164ca
--- /dev/null
+++ b/polymer_2.0.2/bower_components/chopsui/new-element-test.sh
@@ -0,0 +1,40 @@
+#!/bin/bash                                                                                     
+# Create the skeleton for a polymer element.
+# ./new-element-test time-stamp > test/time-stamp_test.html
+
+spinal=$1
+camel=$(sed -r 's/(^|-)([a-z])/\U\2/g' <<< "${spinal}")
+
+cat <<- _EOF_
+<!DOCTYPE html>
+<title>${camel}</title>
+<meta charset="utf-8">
+<script src="/bower_components/webcomponentsjs/webcomponents-lite.js"></script>
+<script src="/bower_components/web-component-tester/browser.js"></script>
+<link rel="import" href="/elements/${spinal}.html">
+
+<test-fixture id="${spinal}-test">
+  <template>
+    <${spinal}></${spinal}>
+  </template>
+</test-fixture>
+
+<script>
+  'use strict';
+
+  suite('${spinal}', function() {
+    let element;
+    setup(function() {
+      element = fixture('${spinal}-test');
+
+    });
+
+    test('TEST DESCRIPTION', function(done) {
+
+      done();
+    });
+
+  });
+</script>
+
+_EOF_
diff --git a/polymer_2.0.2/bower_components/chopsui/new-element.sh b/polymer_2.0.2/bower_components/chopsui/new-element.sh
new file mode 100755
index 0000000..f7ef1c3
--- /dev/null
+++ b/polymer_2.0.2/bower_components/chopsui/new-element.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+# Create the skeleton for a polymer element.
+# ./new-element time-stamp > elements/time-stamp.html
+
+spinal=$1
+camel=$(sed -r 's/(^|-)([a-z])/\U\2/g' <<< "${spinal}")
+
+cat <<- _EOF_
+<link rel="import" href="/bower_components/polymer/polymer.html">
+
+<dom-module id="${spinal}">
+  <template>
+    <style>
+    </style>
+  </template>
+  <script>
+    'use strict';
+
+    /**
+     * \`<${spinal}>\` ....
+     *
+     *   Element description here.
+     *
+     * @customElement
+     * @polymer
+     * @demo /demo/${spinal}_demo.html
+     */
+    class ${camel} extends Polymer.Element {
+      static get is() { return '${spinal}'; }
+
+      static get properties() {
+        return {
+        }
+      }
+
+    }
+    customElements.define(${camel}.is, ${camel});
+  </script>
+<dom-module>
+_EOF_
diff --git a/polymer_2.0.2/bower_components/font-roboto/.bower.json b/polymer_2.0.2/bower_components/font-roboto/.bower.json
index ac86d01..fe6809d 100644
--- a/polymer_2.0.2/bower_components/font-roboto/.bower.json
+++ b/polymer_2.0.2/bower_components/font-roboto/.bower.json
@@ -26,6 +26,6 @@
     "commit": "6b16584ff654fea05d6bf3e812fb8b225202663f"
   },
   "_source": "https://github.com/PolymerElements/font-roboto.git",
-  "_target": "^1.0.0",
+  "_target": "^1.0.1",
   "_originalSource": "PolymerElements/font-roboto"
 }
\ No newline at end of file
diff --git a/polymer_2.0.2/bower_components/google-apis/.bower.json b/polymer_2.0.2/bower_components/google-apis/.bower.json
index e76db4d..1c880b8 100644
--- a/polymer_2.0.2/bower_components/google-apis/.bower.json
+++ b/polymer_2.0.2/bower_components/google-apis/.bower.json
@@ -1,6 +1,6 @@
 {
   "name": "google-apis",
-  "version": "2.0.0",
+  "version": "2.0.1",
   "description": "Web components to load Google API libraries",
   "homepage": "https://elements.polymer-project.org/elements/google-apis?active=google-js-api",
   "main": "google-apis.html",
@@ -44,13 +44,13 @@
   "resolutions": {
     "webcomponentsjs": "^1.0.0"
   },
-  "_release": "2.0.0",
+  "_release": "2.0.1",
   "_resolution": {
     "type": "version",
-    "tag": "v2.0.0",
-    "commit": "519662dcc5357e088979b7cad502cd468ac67d9f"
+    "tag": "v2.0.1",
+    "commit": "cb0a9fd502a845096a63e4a1499fe43efe942638"
   },
   "_source": "https://github.com/GoogleWebComponents/google-apis.git",
-  "_target": "^2.0.0",
+  "_target": "^2.0.1",
   "_originalSource": "google-apis"
 }
\ No newline at end of file
diff --git a/polymer_2.0.2/bower_components/google-apis/bower.json b/polymer_2.0.2/bower_components/google-apis/bower.json
index 295bb36..d854f69 100644
--- a/polymer_2.0.2/bower_components/google-apis/bower.json
+++ b/polymer_2.0.2/bower_components/google-apis/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "google-apis",
-  "version": "2.0.0",
+  "version": "2.0.1",
   "description": "Web components to load Google API libraries",
   "homepage": "https://elements.polymer-project.org/elements/google-apis?active=google-js-api",
   "main": "google-apis.html",
diff --git a/polymer_2.0.2/bower_components/google-apis/google-client-loader.html b/polymer_2.0.2/bower_components/google-apis/google-client-loader.html
index 0257a86..cbbb6d0 100644
--- a/polymer_2.0.2/bower_components/google-apis/google-client-loader.html
+++ b/polymer_2.0.2/bower_components/google-apis/google-client-loader.html
@@ -139,6 +139,10 @@
 
       ready: function() {
         this._loader = document.createElement('google-js-api');
+          
+        if (!this.shadowRoot) { this.attachShadow({mode: 'open'}); }
+        this.shadowRoot.appendChild(this._loader);
+          
         this.listen(this._loader, 'js-api-load', '_loadClient');
       },
 
diff --git a/polymer_2.0.2/bower_components/iron-ajax/.bower.json b/polymer_2.0.2/bower_components/iron-ajax/.bower.json
index 87ebdc0..e1fc405 100644
--- a/polymer_2.0.2/bower_components/iron-ajax/.bower.json
+++ b/polymer_2.0.2/bower_components/iron-ajax/.bower.json
@@ -1,6 +1,6 @@
 {
   "name": "iron-ajax",
-  "version": "2.0.5",
+  "version": "2.0.8",
   "description": "Makes it easy to make ajax calls and parse the response",
   "private": true,
   "authors": [
@@ -53,11 +53,11 @@
   "resolutions": {
     "webcomponentsjs": "^1.0.0"
   },
-  "_release": "2.0.5",
+  "_release": "2.0.8",
   "_resolution": {
     "type": "version",
-    "tag": "v2.0.5",
-    "commit": "536c76a4206e08a16b364930855e46f58ce3565d"
+    "tag": "v2.0.8",
+    "commit": "fd9fd3b7f6f4dca92358085ee0f9b4f783394410"
   },
   "_source": "https://github.com/PolymerElements/iron-ajax.git",
   "_target": "^2.0.4",
diff --git a/polymer_2.0.2/bower_components/iron-ajax/bower.json b/polymer_2.0.2/bower_components/iron-ajax/bower.json
index fc9ae9d..de7f4f6 100644
--- a/polymer_2.0.2/bower_components/iron-ajax/bower.json
+++ b/polymer_2.0.2/bower_components/iron-ajax/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "iron-ajax",
-  "version": "2.0.5",
+  "version": "2.0.8",
   "description": "Makes it easy to make ajax calls and parse the response",
   "private": true,
   "authors": [
diff --git a/polymer_2.0.2/bower_components/iron-ajax/iron-ajax.html b/polymer_2.0.2/bower_components/iron-ajax/iron-ajax.html
index 1a9dddf..caa6a1f 100644
--- a/polymer_2.0.2/bower_components/iron-ajax/iron-ajax.html
+++ b/polymer_2.0.2/bower_components/iron-ajax/iron-ajax.html
@@ -236,6 +236,15 @@
       },
 
       /**
+       * The `progress` property of this element's `lastRequest`.
+       */
+      lastProgress: {
+        type: Object,
+        notify: true,
+        readOnly: true
+      },
+
+      /**
        * True while lastRequest is in flight.
        */
       loading: {
@@ -348,6 +357,10 @@
           'body, sync, handleAs, jsonPrefix, withCredentials, timeout, auto)'
     ],
 
+    created: function() {
+      this._boundOnProgressChanged = this._onProgressChanged.bind(this);
+    },
+
     /**
      * The query string that should be appended to the `url`, serialized from
      * the current value of `params`.
@@ -422,6 +435,10 @@
       return headers;
     },
 
+    _onProgressChanged: function(event) {
+      this._setLastProgress(event.detail.value);
+    },
+
     /**
      * Request options suitable for generating an `iron-request` instance based
      * on the current state of the `iron-ajax` instance's properties.
@@ -481,8 +498,16 @@
         return request;
       }
 
-      request.send(requestOptions);
+      if (this.lastRequest) {
+        this.lastRequest.removeEventListener('iron-request-progress-changed',
+                this._boundOnProgressChanged);
+      }
 
+      request.addEventListener('iron-request-progress-changed',
+          this._boundOnProgressChanged);
+
+      request.send(requestOptions);
+      this._setLastProgress(null);
       this._setLastRequest(request);
       this._setLoading(true);
 
diff --git a/polymer_2.0.2/bower_components/iron-ajax/iron-request.html b/polymer_2.0.2/bower_components/iron-ajax/iron-request.html
index 0bb3b7f..a3612af 100644
--- a/polymer_2.0.2/bower_components/iron-ajax/iron-request.html
+++ b/polymer_2.0.2/bower_components/iron-ajax/iron-request.html
@@ -85,8 +85,8 @@
        * if there is an error before the `xhr` completes.
        * The resolve callback is called with the original request as an argument.
        * By default, the reject callback is called with an `Error` as an argument.
-       * If `rejectWithRequest` is true, the reject callback is called with an 
-       * object with two keys: `request`, the original request, and `error`, the 
+       * If `rejectWithRequest` is true, the reject callback is called with an
+       * object with two keys: `request`, the original request, and `error`, the
        * error object.
        *
        * @type {Promise}
@@ -215,7 +215,10 @@
           loaded: progress.loaded,
           total: progress.total
         });
-      }.bind(this));
+
+        // Webcomponents v1 spec does not fire *-changed events when not connected
+        this.fire('iron-request-progress-changed', { value: this.progress });
+      }.bind(this))
 
       xhr.addEventListener('error', function(error) {
         this._setErrored(true);
@@ -267,10 +270,11 @@
       }.bind(this));
 
       this.url = options.url;
+      var isXHRAsync = options.async !== false;
       xhr.open(
         options.method || 'GET',
         options.url,
-        options.async !== false
+        isXHRAsync
       );
 
       var acceptType = {
@@ -300,10 +304,8 @@
         );
       }, this);
 
-      if (options.async !== false) {
-        if (options.async) {
-          xhr.timeout = options.timeout;
-        }
+      if (isXHRAsync) {
+        xhr.timeout = options.timeout;
 
         var handleAs = options.handleAs;
 
@@ -365,6 +367,7 @@
               try {
                 return JSON.parse(xhr.responseText);
               } catch (_) {
+                console.warn('Failed to parse JSON sent from ' + xhr.responseUrl);
                 return null;
               }
             }
@@ -386,6 +389,7 @@
               try {
                 return JSON.parse(xhr.responseText.substring(prefixLen));
               } catch (_) {
+                console.warn('Failed to parse JSON sent from ' + xhr.responseUrl);
                 return null;
               }
             }
diff --git a/polymer_2.0.2/bower_components/iron-ajax/test/iron-ajax.html b/polymer_2.0.2/bower_components/iron-ajax/test/iron-ajax.html
index eae0171..57746e1 100644
--- a/polymer_2.0.2/bower_components/iron-ajax/test/iron-ajax.html
+++ b/polymer_2.0.2/bower_components/iron-ajax/test/iron-ajax.html
@@ -961,6 +961,55 @@
           ajax.generateRequest();
         });
       });
+
+      suite('Progress Tests', function() {
+        var ajax;
+
+        setup(function() {
+          server.restore();
+        });
+
+        test('lastProgress is same as lastRequest', function(done) {
+          ajax = fixture('TrivialGet');
+
+          var lastProgressUpdated = false;
+
+          expect(ajax.lastProgress).to.be.eql(undefined);
+
+          ajax.generateRequest();
+
+          expect(ajax.lastProgress).to.be.eql(null);
+
+          var onLastProgressChanged = function() {
+            expect(ajax.lastProgress.total).to.not.be.undefined;
+            expect(ajax.lastProgress).to.be.equal(ajax.lastRequest.progress);
+            lastProgressUpdated = true;
+          };
+
+          ajax.lastRequest.completes.then(function() {
+            // should have something from last request
+            expect(ajax.lastProgress).to.be.ok;
+            ajax.removeEventListener('last-progress-changed',
+                onLastProgressChanged);
+            ajax.generateRequest();
+
+            // should reset
+            expect(ajax.lastProgress).to.be.eql(null);
+
+            if (lastProgressUpdated) {
+              done();
+            } else {
+              done('lastProgress was never updated');
+            }
+          }).catch(function(err) {
+            done(err);
+          });
+
+          server.respond();
+
+          ajax.addEventListener('last-progress-changed', onLastProgressChanged);
+        });
+      });
     });
   </script>
 
diff --git a/polymer_2.0.2/bower_components/iron-ajax/test/iron-request.html b/polymer_2.0.2/bower_components/iron-ajax/test/iron-request.html
index 6161bb5..b07e033 100644
--- a/polymer_2.0.2/bower_components/iron-ajax/test/iron-request.html
+++ b/polymer_2.0.2/bower_components/iron-ajax/test/iron-request.html
@@ -84,6 +84,12 @@
           async: true,
           timeout: 100
         };
+
+        asynchronousUndefSuccessfulRequestOptions = {
+          url: '/responds_to_get_with_json',
+          async: undefined,
+          timeout: 100
+        };
       });
 
       teardown(function() {
@@ -106,8 +112,8 @@
           expect(request.xhr.timeout).to.be.eql(undefined);
         });
 
-        test('timeout set if asynchronous', function() {
-          request.send(asynchronousSuccessfulRequestOptions);
+        test('timeout set if asynchronous is undefined', function() {
+          request.send(asynchronousUndefSuccessfulRequestOptions);
 
           expect(request.xhr.async).to.be.eql(true);
           expect(request.xhr.timeout).to.be.eql(100);
diff --git a/polymer_2.0.2/bower_components/iron-dropdown/.bower.json b/polymer_2.0.2/bower_components/iron-dropdown/.bower.json
index cfbc7e1..3b2df13 100644
--- a/polymer_2.0.2/bower_components/iron-dropdown/.bower.json
+++ b/polymer_2.0.2/bower_components/iron-dropdown/.bower.json
@@ -66,6 +66,6 @@
     "commit": "1f581967ae539bf6d94f08a29783e323992a33c8"
   },
   "_source": "https://github.com/PolymerElements/iron-dropdown.git",
-  "_target": "1 - 2",
+  "_target": "~2.0",
   "_originalSource": "PolymerElements/iron-dropdown"
 }
\ No newline at end of file
diff --git a/polymer_2.0.2/bower_components/iron-fit-behavior/.bower.json b/polymer_2.0.2/bower_components/iron-fit-behavior/.bower.json
index b774797..cc2a342 100644
--- a/polymer_2.0.2/bower_components/iron-fit-behavior/.bower.json
+++ b/polymer_2.0.2/bower_components/iron-fit-behavior/.bower.json
@@ -1,6 +1,6 @@
 {
   "name": "iron-fit-behavior",
-  "version": "2.0.1",
+  "version": "2.1.0",
   "license": "http://polymer.github.io/LICENSE.txt",
   "description": "Fits an element inside another element",
   "private": true,
@@ -47,11 +47,11 @@
     "webcomponentsjs": "^1.0.0"
   },
   "homepage": "https://github.com/PolymerElements/iron-fit-behavior",
-  "_release": "2.0.1",
+  "_release": "2.1.0",
   "_resolution": {
     "type": "version",
-    "tag": "v2.0.1",
-    "commit": "8603fa1778ffa25b35f04d2c2f2deb2fa38bbb58"
+    "tag": "v2.1.0",
+    "commit": "d112c1c0c4fb6ac7a848c8a5712d9a9021242bdb"
   },
   "_source": "https://github.com/PolymerElements/iron-fit-behavior.git",
   "_target": "1 - 2",
diff --git a/polymer_2.0.2/bower_components/iron-fit-behavior/bower.json b/polymer_2.0.2/bower_components/iron-fit-behavior/bower.json
index 5b3cb53..9e4209e 100644
--- a/polymer_2.0.2/bower_components/iron-fit-behavior/bower.json
+++ b/polymer_2.0.2/bower_components/iron-fit-behavior/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "iron-fit-behavior",
-  "version": "2.0.1",
+  "version": "2.1.0",
   "license": "http://polymer.github.io/LICENSE.txt",
   "description": "Fits an element inside another element",
   "private": true,
diff --git a/polymer_2.0.2/bower_components/iron-fit-behavior/demo/index.html b/polymer_2.0.2/bower_components/iron-fit-behavior/demo/index.html
index dde1d55..3b166d9 100644
--- a/polymer_2.0.2/bower_components/iron-fit-behavior/demo/index.html
+++ b/polymer_2.0.2/bower_components/iron-fit-behavior/demo/index.html
@@ -80,12 +80,14 @@
           <h2>Align</h2>
           <p>
             <button on-tap="updateAlign" vertical-align="top">top</button>
+            <button on-tap="updateAlign" vertical-align="middle">middle</button>
             <button on-tap="updateAlign" vertical-align="bottom">bottom</button>
             <button on-tap="updateAlign" vertical-align="auto">auto</button>
             <button on-tap="updateAlign" vertical-align>null</button>
           </p>
           <p>
             <button on-tap="updateAlign" horizontal-align="left">left</button>
+            <button on-tap="updateAlign" horizontal-align="center">center</button>
             <button on-tap="updateAlign" horizontal-align="right">right</button>
             <button on-tap="updateAlign" horizontal-align="auto">auto</button>
             <button on-tap="updateAlign" horizontal-align>null</button>
diff --git a/polymer_2.0.2/bower_components/iron-fit-behavior/iron-fit-behavior.html b/polymer_2.0.2/bower_components/iron-fit-behavior/iron-fit-behavior.html
index 3b44d46..304ae7a 100644
--- a/polymer_2.0.2/bower_components/iron-fit-behavior/iron-fit-behavior.html
+++ b/polymer_2.0.2/bower_components/iron-fit-behavior/iron-fit-behavior.html
@@ -100,7 +100,7 @@
 
       /**
        * The orientation against which to align the element horizontally
-       * relative to the `positionTarget`. Possible values are "left", "right", "auto".
+       * relative to the `positionTarget`. Possible values are "left", "right", "center", "auto".
        */
       horizontalAlign: {
         type: String
@@ -108,7 +108,7 @@
 
       /**
        * The orientation against which to align the element vertically
-       * relative to the `positionTarget`. Possible values are "top", "bottom", "auto".
+       * relative to the `positionTarget`. Possible values are "top", "bottom", "middle", "auto".
        */
       verticalAlign: {
         type: String
@@ -128,8 +128,8 @@
        * of it as increasing or decreasing the distance to the side of the
        * screen given by `horizontalAlign`.
        *
-       * If `horizontalAlign` is "left", this offset will increase or decrease
-       * the distance to the left side of the screen: a negative offset will
+       * If `horizontalAlign` is "left" or "center", this offset will increase or
+       * decrease the distance to the left side of the screen: a negative offset will
        * move the dropdown to the left; a positive one, to the right.
        *
        * Conversely if `horizontalAlign` is "right", this offset will increase
@@ -148,8 +148,8 @@
        * of it as increasing or decreasing the distance to the side of the
        * screen given by `verticalAlign`.
        *
-       * If `verticalAlign` is "top", this offset will increase or decrease
-       * the distance to the top side of the screen: a negative offset will
+       * If `verticalAlign` is "top" or "middle", this offset will increase or
+       * decrease the distance to the top side of the screen: a negative offset will
        * move the dropdown upwards; a positive one, downwards.
        *
        * Conversely if `verticalAlign` is "bottom", this offset will increase
@@ -246,6 +246,15 @@
       return this.horizontalAlign;
     },
 
+    /**
+     * True if the element should be positioned instead of centered.
+     * @private
+     */
+    get __shouldPosition() {
+      return (this.horizontalAlign || this.verticalAlign) &&
+        (this.horizontalAlign !== 'center' || this.verticalAlign !== 'middle');
+    },
+
     attached: function() {
       // Memoize this to avoid expensive calculations & relayouts.
       // Make sure we do it only once
@@ -362,7 +371,7 @@
      * Positions the element according to `horizontalAlign, verticalAlign`.
      */
     position: function() {
-      if (!this.horizontalAlign && !this.verticalAlign) {
+      if (!this.__shouldPosition) {
         // needs to be centered, and it is done after constrain.
         return;
       }
@@ -387,7 +396,7 @@
         height: rect.height + margin.top + margin.bottom
       };
 
-      var position = this.__getPosition(this._localeHorizontalAlign, this.verticalAlign, size, positionRect,
+      var position = this.__getPosition(this._localeHorizontalAlign, this.verticalAlign, size, rect, positionRect,
         fitRect);
 
       var left = position.left + margin.left;
@@ -418,7 +427,7 @@
      * and/or `max-width`.
      */
     constrain: function() {
-      if (this.horizontalAlign || this.verticalAlign) {
+      if (this.__shouldPosition) {
         return;
       }
       this._discoverInfo();
@@ -474,7 +483,7 @@
      * `position:fixed`.
      */
     center: function() {
-      if (this.horizontalAlign || this.verticalAlign) {
+      if (this.__shouldPosition) {
         return;
       }
       this._discoverInfo();
@@ -522,14 +531,14 @@
       return target.getBoundingClientRect();
     },
 
-    __getCroppedArea: function(position, size, fitRect) {
+    __getOffscreenArea: function(position, size, fitRect) {
       var verticalCrop = Math.min(0, position.top) + Math.min(0, fitRect.bottom - (position.top + size.height));
       var horizontalCrop = Math.min(0, position.left) + Math.min(0, fitRect.right - (position.left + size.width));
       return Math.abs(verticalCrop) * size.width + Math.abs(horizontalCrop) * size.height;
     },
 
 
-    __getPosition: function(hAlign, vAlign, size, positionRect, fitRect) {
+    __getPosition: function(hAlign, vAlign, size, sizeNoMargins, positionRect, fitRect) {
       // All the possible configurations.
       // Ordered as top-left, top-right, bottom-left, bottom-right.
       var positions = [{
@@ -575,23 +584,53 @@
       vAlign = vAlign === 'auto' ? null : vAlign;
       hAlign = hAlign === 'auto' ? null : hAlign;
 
+      if (!hAlign || hAlign === 'center') {
+        positions.push({
+          verticalAlign: 'top',
+          horizontalAlign: 'center',
+          top: positionRect.top + this.verticalOffset + (this.noOverlap ? positionRect.height : 0),
+          left: positionRect.left - sizeNoMargins.width / 2 + positionRect.width / 2 + this.horizontalOffset
+        });
+        positions.push({
+          verticalAlign: 'bottom',
+          horizontalAlign: 'center',
+          top: positionRect.bottom - size.height - this.verticalOffset - (this.noOverlap ? positionRect.height : 0),
+          left: positionRect.left - sizeNoMargins.width / 2 + positionRect.width / 2 + this.horizontalOffset
+        });
+      }
+
+      if (!vAlign || vAlign === 'middle') {
+        positions.push({
+          verticalAlign: 'middle',
+          horizontalAlign: 'left',
+          top: positionRect.top - sizeNoMargins.height / 2 + positionRect.height / 2 + this.verticalOffset,
+          left: positionRect.left + this.horizontalOffset + (this.noOverlap ? positionRect.width : 0)
+        });
+        positions.push({
+          verticalAlign: 'middle',
+          horizontalAlign: 'right',
+          top: positionRect.top - sizeNoMargins.height / 2 + positionRect.height / 2 + this.verticalOffset,
+          left: positionRect.right - size.width - this.horizontalOffset - (this.noOverlap ? positionRect.width : 0)
+        });
+      }
+
       var position;
       for (var i = 0; i < positions.length; i++) {
-        var pos = positions[i];
+        var candidate = positions[i];
+        var vAlignOk = candidate.verticalAlign === vAlign;
+        var hAlignOk = candidate.horizontalAlign === hAlign;
 
         // If both vAlign and hAlign are defined, return exact match.
         // For dynamicAlign and noOverlap we'll have more than one candidate, so
-        // we'll have to check the croppedArea to make the best choice.
-        if (!this.dynamicAlign && !this.noOverlap &&
-          pos.verticalAlign === vAlign && pos.horizontalAlign === hAlign) {
-          position = pos;
+        // we'll have to check the offscreenArea to make the best choice.
+        if (!this.dynamicAlign && !this.noOverlap && vAlignOk && hAlignOk) {
+          position = candidate;
           break;
         }
 
         // Align is ok if alignment preferences are respected. If no preferences,
         // it is considered ok.
-        var alignOk = (!vAlign || pos.verticalAlign === vAlign) &&
-          (!hAlign || pos.horizontalAlign === hAlign);
+        var alignOk = (!vAlign || vAlignOk) && (!hAlign || hAlignOk);
 
         // Filter out elements that don't match the alignment (if defined).
         // With dynamicAlign, we need to consider all the positions to find the
@@ -600,23 +639,25 @@
           continue;
         }
 
-        position = position || pos;
-        pos.croppedArea = this.__getCroppedArea(pos, size, fitRect);
-        var diff = pos.croppedArea - position.croppedArea;
-        // Check which crops less. If it crops equally, check if align is ok.
-        if (diff < 0 || (diff === 0 && alignOk)) {
-          position = pos;
-        }
+        candidate.offscreenArea = this.__getOffscreenArea(candidate, size, fitRect);
         // If not cropped and respects the align requirements, keep it.
         // This allows to prefer positions overlapping horizontally over the
         // ones overlapping vertically.
-        if (position.croppedArea === 0 && alignOk) {
+        if (candidate.offscreenArea === 0 && alignOk) {
+          position = candidate;
           break;
         }
+        position = position || candidate;
+        var diff = candidate.offscreenArea - position.offscreenArea;
+        // Check which crops less. If it crops equally, check if at least one
+        // align setting is ok.
+        if (diff < 0 || (diff === 0 && (vAlignOk || hAlignOk))) {
+          position = candidate;
+        }
       }
 
       return position;
     }
 
   };
-</script>
+</script>
\ No newline at end of file
diff --git a/polymer_2.0.2/bower_components/iron-fit-behavior/test/iron-fit-behavior.html b/polymer_2.0.2/bower_components/iron-fit-behavior/test/iron-fit-behavior.html
index 7dcc15d..8dde82b 100644
--- a/polymer_2.0.2/bower_components/iron-fit-behavior/test/iron-fit-behavior.html
+++ b/polymer_2.0.2/bower_components/iron-fit-behavior/test/iron-fit-behavior.html
@@ -691,6 +691,102 @@
           });
         });
 
+        suite('when verticalAlign is middle', function() {
+          test('element is aligned to the positionTarget middle', function() {
+            el.verticalAlign = 'middle';
+            el.refit();
+            var rect = el.getBoundingClientRect();
+            assert.equal(rect.top, parentRect.top + (parentRect.height - rect.height) / 2, 'top ok');
+            assert.equal(rect.height, elRect.height, 'no cropping');
+          });
+
+          test('element is aligned to the positionTarget top without overlapping it', function() {
+            // Allow enough space on the parent's bottom & right.
+            el.verticalAlign = 'middle';
+            el.noOverlap = true;
+            el.refit();
+            var rect = el.getBoundingClientRect();
+            assert.isFalse(intersects(rect, parentRect), 'no overlap');
+            assert.equal(rect.height, elRect.height, 'no cropping');
+          });
+
+          test('element margin is considered as offset', function() {
+            el.verticalAlign = 'middle';
+            el.style.marginTop = '10px';
+            el.refit();
+            var rect = el.getBoundingClientRect();
+            assert.equal(rect.top, parentRect.top + (parentRect.height - rect.height) / 2 + 10, 'top ok');
+            assert.equal(rect.height, elRect.height, 'no cropping');
+
+            el.style.marginTop = '-10px';
+            el.refit();
+            rect = el.getBoundingClientRect();
+            assert.equal(rect.top, parentRect.top + (parentRect.height - rect.height) / 2 - 10, 'top ok');
+            assert.equal(rect.height, elRect.height, 'no cropping');
+          });
+
+          test('verticalOffset is applied', function() {
+            el.verticalAlign = 'middle';
+            el.verticalOffset = 10;
+            el.refit();
+            var rect = el.getBoundingClientRect();
+            assert.equal(rect.top, parentRect.top + (parentRect.height - rect.height) / 2 + 10, 'top ok');
+            assert.equal(rect.height, elRect.height, 'no cropping');
+          });
+
+          test('element is kept in viewport', function() {
+            el.verticalAlign = 'middle';
+            // Make it go out of screen
+            el.verticalOffset = -1000;
+            el.refit();
+            var rect = el.getBoundingClientRect();
+            assert.equal(rect.top, 0, 'top in viewport');
+            assert.isTrue(rect.height < elRect.height, 'reduced size');
+          });
+
+          test('negative verticalOffset does not crop element', function() {
+            // Push to the bottom of the screen.
+            parent.style.top = (window.innerHeight - 50) +'px';
+            el.verticalAlign = 'middle';
+            el.verticalOffset = -10;
+            el.refit();
+            var rect = el.getBoundingClientRect();
+            assert.equal(rect.top, window.innerHeight - 35, 'top ok');
+            assert.equal(rect.bottom, window.innerHeight, 'bottom ok');
+          });
+
+          test('max-height is updated', function() {
+            parent.style.top = '-50px';
+            el.verticalAlign = 'middle';
+            el.refit();
+            var rect = el.getBoundingClientRect();
+            assert.equal(rect.top, 0, 'top ok');
+            assert.isBelow(rect.height, elRect.height, 'height ok');
+          });
+
+          test('min-height is preserved: element is displayed even if partially', function() {
+            parent.style.top = '-50px';
+            el.verticalAlign = 'middle';
+            el.style.minHeight = elRect.height + 'px';
+            el.refit();
+            var rect = el.getBoundingClientRect();
+            assert.equal(rect.top, 0, 'top ok');
+            assert.equal(rect.height, elRect.height, 'min-height ok');
+            assert.isTrue(intersects(rect, fitRect), 'partially visible');
+          });
+
+          test('dynamicAlign will prefer bottom align if it minimizes the cropping', function() {
+            parent.style.top = '-50px';
+            parentRect = parent.getBoundingClientRect();
+            el.verticalAlign = 'middle';
+            el.dynamicAlign = true;
+            el.refit();
+            var rect = el.getBoundingClientRect();
+            assert.equal(rect.bottom, parentRect.bottom, 'bottom ok');
+            assert.equal(rect.height, elRect.height, 'no cropping');
+          });
+        });
+
         suite('when verticalAlign is auto', function() {
           test('element is aligned to the positionTarget top', function() {
             el.verticalAlign = 'auto';
@@ -926,6 +1022,102 @@
 
         });
 
+        suite('when horizontalAlign is center', function() {
+          test('element is aligned to the positionTarget center', function() {
+            el.horizontalAlign = 'center';
+            el.refit();
+            var rect = el.getBoundingClientRect();
+            assert.equal(rect.left, parentRect.left + (parentRect.width - rect.width) / 2, 'left ok');
+            assert.equal(rect.width, elRect.width, 'no cropping');
+          });
+
+          test('element is aligned to the positionTarget left without overlapping it', function() {
+            el.horizontalAlign = 'center';
+            el.noOverlap = true;
+            el.refit();
+            var rect = el.getBoundingClientRect();
+            assert.isFalse(intersects(rect, parentRect), 'no overlap');
+            assert.equal(rect.width, elRect.width, 'no cropping');
+          });
+
+          test('element margin is considered as offset', function() {
+            el.horizontalAlign = 'center';
+            el.style.marginLeft = '10px';
+            el.refit();
+            var rect = el.getBoundingClientRect();
+            assert.equal(rect.left, parentRect.left + (parentRect.width - rect.width) / 2 + 10, 'left ok');
+            assert.equal(rect.width, elRect.width, 'no cropping');
+
+            el.style.marginLeft = '-10px';
+            el.refit();
+            rect = el.getBoundingClientRect();
+            assert.equal(rect.left, parentRect.left + (parentRect.width - rect.width) / 2 - 10, 'left ok');
+            assert.equal(rect.width, elRect.width, 'no cropping');
+          });
+
+          test('horizontalOffset is applied', function() {
+            el.horizontalAlign = 'center';
+            el.horizontalOffset = 10;
+            el.refit();
+            var rect = el.getBoundingClientRect();
+            assert.equal(rect.left, parentRect.left + (parentRect.width - rect.width) / 2 + 10, 'left ok');
+            assert.equal(rect.width, elRect.width, 'no cropping');
+          });
+
+          test('element is kept in viewport', function() {
+            el.horizontalAlign = 'center';
+            // Make it go out of screen.
+            el.horizontalOffset = -1000;
+            el.refit();
+            var rect = el.getBoundingClientRect();
+            assert.equal(rect.left, 0, 'left in viewport');
+            assert.isTrue(rect.width < elRect.width, 'reduced size');
+          });
+
+          test('negative horizontalOffset does not crop element', function() {
+            // Push to the bottom of the screen.
+            parent.style.left = (window.innerWidth - 50) +'px';
+            el.horizontalAlign = 'center';
+            el.horizontalOffset = -10;
+            el.refit();
+            var rect = el.getBoundingClientRect();
+            assert.equal(rect.left, window.innerWidth - 35, 'left ok');
+            assert.equal(rect.right, window.innerWidth, 'right ok');
+          });
+
+          test('element max-width is updated', function() {
+            parent.style.left = '-50px';
+            el.horizontalAlign = 'center';
+            el.refit();
+            var rect = el.getBoundingClientRect();
+            assert.equal(rect.left, 0, 'left ok');
+            assert.isBelow(rect.width, elRect.width, 'width ok');
+          });
+
+          test('min-width is preserved: element is displayed even if partially', function() {
+            parent.style.left = '-50px';
+            el.style.minWidth = elRect.width + 'px';
+            el.horizontalAlign = 'center';
+            el.refit();
+            var rect = el.getBoundingClientRect();
+            assert.equal(rect.left, 0, 'left ok');
+            assert.equal(rect.width, elRect.width, 'min-width ok');
+            assert.isTrue(intersects(rect, fitRect), 'partially visible');
+          });
+
+          test('dynamicAlign will prefer right align if it minimizes the cropping', function() {
+            parent.style.left = '-50px';
+            parentRect = parent.getBoundingClientRect();
+            el.horizontalAlign = 'center';
+            el.dynamicAlign = true;
+            el.refit();
+            var rect = el.getBoundingClientRect();
+            assert.equal(rect.right, parentRect.right, 'right ok');
+            assert.equal(rect.height, elRect.height, 'no cropping');
+          });
+
+        });
+
         suite('when horizontalAlign is auto', function() {
           test('element is aligned to the positionTarget left', function() {
             el.horizontalAlign = 'auto';
diff --git a/polymer_2.0.2/bower_components/iron-flex-layout/.bower.json b/polymer_2.0.2/bower_components/iron-flex-layout/.bower.json
index aed2f05..5a37873 100644
--- a/polymer_2.0.2/bower_components/iron-flex-layout/.bower.json
+++ b/polymer_2.0.2/bower_components/iron-flex-layout/.bower.json
@@ -1,6 +1,6 @@
 {
   "name": "iron-flex-layout",
-  "version": "2.0.0",
+  "version": "2.0.1",
   "description": "Provide flexbox-based layouts",
   "keywords": [
     "web-components",
@@ -52,11 +52,11 @@
     "webcomponentsjs": "^1.0.0"
   },
   "homepage": "https://github.com/PolymerElements/iron-flex-layout",
-  "_release": "2.0.0",
+  "_release": "2.0.1",
   "_resolution": {
     "type": "version",
-    "tag": "v2.0.0",
-    "commit": "985972fddaae4969f885d8f4451f72d735093946"
+    "tag": "v2.0.1",
+    "commit": "f1d33ea9589e0a8d632ee4d5e00174df4c53661a"
   },
   "_source": "https://github.com/PolymerElements/iron-flex-layout.git",
   "_target": "1 - 2",
diff --git a/polymer_2.0.2/bower_components/iron-flex-layout/bower.json b/polymer_2.0.2/bower_components/iron-flex-layout/bower.json
index 3807cb7..2baa0fa 100644
--- a/polymer_2.0.2/bower_components/iron-flex-layout/bower.json
+++ b/polymer_2.0.2/bower_components/iron-flex-layout/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "iron-flex-layout",
-  "version": "2.0.0",
+  "version": "2.0.1",
   "description": "Provide flexbox-based layouts",
   "keywords": [
     "web-components",
diff --git a/polymer_2.0.2/bower_components/iron-flex-layout/iron-flex-layout.html b/polymer_2.0.2/bower_components/iron-flex-layout/iron-flex-layout.html
index 5050ce8..8f0648e 100644
--- a/polymer_2.0.2/bower_components/iron-flex-layout/iron-flex-layout.html
+++ b/polymer_2.0.2/bower_components/iron-flex-layout/iron-flex-layout.html
@@ -58,6 +58,14 @@
 @pseudoElement iron-flex-layout
 @demo demo/index.html
 -->
+
+<style>
+  /* IE 10 support for HTML5 hidden attr */
+  [hidden] {
+    display: none !important;
+  }
+</style>
+
 <custom-style>
   <style is="custom-style">
     html {
@@ -402,4 +410,4 @@
 
     }
   </style>
-</custom-style>
\ No newline at end of file
+</custom-style>
diff --git a/polymer_2.0.2/bower_components/iron-form/.bower.json b/polymer_2.0.2/bower_components/iron-form/.bower.json
index c12b900..8669483 100644
--- a/polymer_2.0.2/bower_components/iron-form/.bower.json
+++ b/polymer_2.0.2/bower_components/iron-form/.bower.json
@@ -1,6 +1,6 @@
 {
   "name": "iron-form",
-  "version": "2.0.0",
+  "version": "2.0.1",
   "description": "Wrapper around native form that submits native and custom elements",
   "keywords": [
     "web-components",
@@ -66,11 +66,11 @@
   "resolutions": {
     "webcomponentsjs": "^1.0.0"
   },
-  "_release": "2.0.0",
+  "_release": "2.0.1",
   "_resolution": {
     "type": "version",
-    "tag": "v2.0.0",
-    "commit": "f1c9b04b9d2d57334192537736a61e22708cd7b4"
+    "tag": "v2.0.1",
+    "commit": "430bb2c9f82d08595dbe9479feb7ca1724582631"
   },
   "_source": "https://github.com/PolymerElements/iron-form.git",
   "_target": "^2.0.0",
diff --git a/polymer_2.0.2/bower_components/iron-form/bower.json b/polymer_2.0.2/bower_components/iron-form/bower.json
index bb86dd8..d4048a2 100644
--- a/polymer_2.0.2/bower_components/iron-form/bower.json
+++ b/polymer_2.0.2/bower_components/iron-form/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "iron-form",
-  "version": "2.0.0",
+  "version": "2.0.1",
   "description": "Wrapper around native form that submits native and custom elements",
   "keywords": [
     "web-components",
diff --git a/polymer_2.0.2/bower_components/iron-form/iron-form.html b/polymer_2.0.2/bower_components/iron-form/iron-form.html
index f4dbdf7..258ca99 100644
--- a/polymer_2.0.2/bower_components/iron-form/iron-form.html
+++ b/polymer_2.0.2/bower_components/iron-form/iron-form.html
@@ -152,7 +152,8 @@
 
       /**
        * Fired after the form is submitted and an error is received. An
-       * IronRequestElement is included as the event.detail object.
+       * error message is included in event.detail.error and an
+       * IronRequestElement is included in event.detail.request.
        *
        * @event iron-form-error
       */
@@ -247,14 +248,14 @@
         if (this.allowRedirect) {
           // If we're submitting the form natively, then create a hidden element for
           // each of the values.
-          for (element in json) {
+          for (var element in json) {
             this.$.helper.appendChild(this._createHiddenElement(element, json[element]));
           }
 
           // Copy the original form attributes.
           this.$.helper.action = this._form.getAttribute('action');
           this.$.helper.method = this._form.getAttribute('method') || 'GET';
-          this.$.helper.contentType = this._form.getAttribute('enctype');
+          this.$.helper.contentType = this._form.getAttribute('enctype') || 'application/x-www-form-urlencoded';
 
           this.$.helper.submit();
           this.fire('iron-form-submit');
@@ -329,7 +330,7 @@
         // elements with those names.
         this.request.url = this._form.getAttribute('action');
         this.request.method = this._form.getAttribute('method') || 'GET';
-        this.request.contentType = this._form.getAttribute('enctype');
+        this.request.contentType = this._form.getAttribute('enctype') || 'application/x-www-form-urlencoded';
         this.request.withCredentials = this.withCredentials;
         this.request.headers = this.headers;
 
diff --git a/polymer_2.0.2/bower_components/iron-form/test/basic.html b/polymer_2.0.2/bower_components/iron-form/test/basic.html
index cd16783..8f64918 100644
--- a/polymer_2.0.2/bower_components/iron-form/test/basic.html
+++ b/polymer_2.0.2/bower_components/iron-form/test/basic.html
@@ -230,6 +230,12 @@
             <paper-input name="paper2" value="value2"></paper-input>
           </form>
         </iron-form>
+          <iron-form id="plain-form">
+              <form action="/valid/url" method="post" enctype="text/plain">
+                  <paper-input name="paper1" value="value1"></paper-input>
+                  <paper-input name="paper2" value="value2"></paper-input>
+              </form>
+          </iron-form>
         </div>
     </template>
   </test-fixture>
@@ -845,14 +851,14 @@
       });
 
       test('submits a form with text/plain', function(done) {
-        var form = f.querySelector('#simple-form');
+        var form = f.querySelector('#plain-form');
 
         server.respondWith(
           'POST',
           /\/valid\/url.*/,
           function (request) {
             expect(request.requestHeaders).to.deep.equal({
-                "Content-Type": "text/plain;charset=utf-8",
+                "content-type": "text/plain;charset=utf-8",
                 "accept": "application/json"});
             expect(request.requestBody).to.deep.equal({
                 "paper1": "value1",
@@ -889,6 +895,28 @@
             server.respond();
           });
       });
+        test('submits a form with application/x-www-form-urlencoded', function(done) {
+            var form = f.querySelector('#simple-form');
+
+            server.respondWith(
+                'POST',
+                /\/valid\/url.*/,
+                function (request) {
+                    expect(request.requestHeaders).to.deep.equal({
+                        "content-type": "application/x-www-form-urlencoded;charset=utf-8",
+                        "accept": "application/json"});
+                    expect(request.requestBody).to.equal(
+                        'paper1=value1&paper2=value2');
+                    done();
+                }
+            );
+
+            // Wait one tick for observeNodes.
+            Polymer.Base.async(function() {
+                form.submit();
+                server.respond();
+            });
+        });
     });
   </script>
 </body>
diff --git a/polymer_2.0.2/bower_components/iron-input/.bower.json b/polymer_2.0.2/bower_components/iron-input/.bower.json
index e7c9216..764c41a 100644
--- a/polymer_2.0.2/bower_components/iron-input/.bower.json
+++ b/polymer_2.0.2/bower_components/iron-input/.bower.json
@@ -1,6 +1,6 @@
 {
   "name": "iron-input",
-  "version": "2.0.0",
+  "version": "2.0.1",
   "description": "An input element with data binding",
   "authors": [
     "The Polymer Authors"
@@ -57,11 +57,11 @@
   "resolutions": {
     "webcomponentsjs": "^1.0.0"
   },
-  "_release": "2.0.0",
+  "_release": "2.0.1",
   "_resolution": {
     "type": "version",
-    "tag": "v2.0.0",
-    "commit": "330e8431f2ff423c34cd6e1744293dc779b4e3b0"
+    "tag": "v2.0.1",
+    "commit": "354343f4bdad87de7049f6c8242941f2457a6b8c"
   },
   "_source": "https://github.com/PolymerElements/iron-input.git",
   "_target": "1 - 2",
diff --git a/polymer_2.0.2/bower_components/iron-input/README.md b/polymer_2.0.2/bower_components/iron-input/README.md
index bf79f7a..32a84eb 100644
--- a/polymer_2.0.2/bower_components/iron-input/README.md
+++ b/polymer_2.0.2/bower_components/iron-input/README.md
@@ -50,7 +50,7 @@
 
 ```html
 <iron-input bind-value="{{bindValue}}">
-  <input value="{{value::input}}"></iron-input>
+  <input value="{{value::input}}">
 </iron-input>
 ```
 
diff --git a/polymer_2.0.2/bower_components/iron-input/bower.json b/polymer_2.0.2/bower_components/iron-input/bower.json
index 00ae4fe..1015c94 100644
--- a/polymer_2.0.2/bower_components/iron-input/bower.json
+++ b/polymer_2.0.2/bower_components/iron-input/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "iron-input",
-  "version": "2.0.0",
+  "version": "2.0.1",
   "description": "An input element with data binding",
   "authors": [
     "The Polymer Authors"
diff --git a/polymer_2.0.2/bower_components/iron-input/iron-input.html b/polymer_2.0.2/bower_components/iron-input/iron-input.html
index 34d6c42..9a21b17 100644
--- a/polymer_2.0.2/bower_components/iron-input/iron-input.html
+++ b/polymer_2.0.2/bower_components/iron-input/iron-input.html
@@ -160,7 +160,12 @@
         autoValidate: {
           type: Boolean,
           value: false
-        }
+        },
+          
+       /**
+        * The native input element.
+        */
+        _inputElement: Object,
       },
 
       observers: [
diff --git a/polymer_2.0.2/bower_components/iron-jsonp-library/.bower.json b/polymer_2.0.2/bower_components/iron-jsonp-library/.bower.json
index 9c383b6..b5032b5 100644
--- a/polymer_2.0.2/bower_components/iron-jsonp-library/.bower.json
+++ b/polymer_2.0.2/bower_components/iron-jsonp-library/.bower.json
@@ -1,6 +1,6 @@
 {
   "name": "iron-jsonp-library",
-  "version": "2.0.0",
+  "version": "1.0.5",
   "description": "Loads jsonp libraries",
   "authors": [
     "Aleks Totic <a@totic.org>",
@@ -23,44 +23,23 @@
     "/test/"
   ],
   "dependencies": {
-    "polymer": "Polymer/polymer#1.9 - 2"
+    "polymer": "Polymer/polymer#^1.5.0"
   },
   "devDependencies": {
-    "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
-    "test-fixture": "PolymerElements/test-fixture#^3.0.0-rc.1",
-    "web-component-tester": "^6.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0",
-    "paper-styles": "PolymerElements/paper-styles#1 - 2",
-    "paper-spinner": "PolymerElements/paper-spinner#1 - 2"
+    "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+    "test-fixture": "PolymerElements/test-fixture#^1.0.0",
+    "web-component-tester": "^4.0.0",
+    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
+    "paper-styles": "PolymerElements/paper-styles#^1.0.2",
+    "paper-spinner": "PolymerElements/paper-spinner#^1.0.1"
   },
-  "variants": {
-    "1.x": {
-      "dependencies": {
-        "polymer": "Polymer/polymer#^1.9"
-      },
-      "devDependencies": {
-        "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
-        "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-        "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
-        "paper-styles": "PolymerElements/paper-styles#^1.0.2",
-        "paper-spinner": "PolymerElements/paper-spinner#^1.0.1",
-        "web-component-tester": "Polymer/web-component-tester#^4.0.0"
-      },
-      "resolutions": {
-        "webcomponentsjs": "^0.7"
-      }
-    }
-  },
-  "resolutions": {
-    "webcomponentsjs": "^1.0.0"
-  },
-  "_release": "2.0.0",
+  "_release": "1.0.5",
   "_resolution": {
     "type": "version",
-    "tag": "v2.0.0",
-    "commit": "61d47ed327b76bd597d1e1800d3040b2279ae329"
+    "tag": "v1.0.5",
+    "commit": "b06ee1e480022a5803545288057f2fb3c3520d67"
   },
   "_source": "https://github.com/PolymerElements/iron-jsonp-library.git",
-  "_target": "1 - 2",
+  "_target": "^1.0.0",
   "_originalSource": "PolymerElements/iron-jsonp-library"
 }
\ No newline at end of file
diff --git a/polymer_2.0.2/bower_components/iron-jsonp-library/bower.json b/polymer_2.0.2/bower_components/iron-jsonp-library/bower.json
index ef4c8b7..f3c47b3 100644
--- a/polymer_2.0.2/bower_components/iron-jsonp-library/bower.json
+++ b/polymer_2.0.2/bower_components/iron-jsonp-library/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "iron-jsonp-library",
-  "version": "2.0.0",
+  "version": "1.0.5",
   "description": "Loads jsonp libraries",
   "authors": [
     "Aleks Totic <a@totic.org>",
@@ -23,35 +23,14 @@
     "/test/"
   ],
   "dependencies": {
-    "polymer": "Polymer/polymer#1.9 - 2"
+    "polymer": "Polymer/polymer#^1.5.0"
   },
   "devDependencies": {
-    "iron-component-page": "PolymerElements/iron-component-page#1 - 2",
-    "test-fixture": "PolymerElements/test-fixture#^3.0.0-rc.1",
-    "web-component-tester": "^6.0.0",
-    "webcomponentsjs": "webcomponents/webcomponentsjs#^1.0.0",
-    "paper-styles": "PolymerElements/paper-styles#1 - 2",
-    "paper-spinner": "PolymerElements/paper-spinner#1 - 2"
-  },
-  "variants": {
-    "1.x": {
-      "dependencies": {
-        "polymer": "Polymer/polymer#^1.9"
-      },
-      "devDependencies": {
-        "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
-        "test-fixture": "PolymerElements/test-fixture#^1.0.0",
-        "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
-        "paper-styles": "PolymerElements/paper-styles#^1.0.2",
-        "paper-spinner": "PolymerElements/paper-spinner#^1.0.1",
-        "web-component-tester": "Polymer/web-component-tester#^4.0.0"
-      },
-      "resolutions": {
-        "webcomponentsjs": "^0.7"
-      }
-    }
-  },
-  "resolutions": {
-    "webcomponentsjs": "^1.0.0"
+    "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
+    "test-fixture": "PolymerElements/test-fixture#^1.0.0",
+    "web-component-tester": "^4.0.0",
+    "webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0",
+    "paper-styles": "PolymerElements/paper-styles#^1.0.2",
+    "paper-spinner": "PolymerElements/paper-spinner#^1.0.1"
   }
 }
diff --git a/polymer_2.0.2/bower_components/iron-jsonp-library/demo/index.html b/polymer_2.0.2/bower_components/iron-jsonp-library/demo/index.html
index 13abb9a..41502c2 100644
--- a/polymer_2.0.2/bower_components/iron-jsonp-library/demo/index.html
+++ b/polymer_2.0.2/bower_components/iron-jsonp-library/demo/index.html
@@ -44,73 +44,67 @@
 
     <div class="vertical-section vertical-section-container centered">
       <h1>&lt;iron-jsonp-library&gt;</h1>
-      <dom-bind>
-        <template is="dom-bind">
-          <h3>Good loader</h3>
-          <iron-jsonp-library
-            library-url="https://apis.google.com/js/plusone.js?onload=%%callback%%"
-            notify-event="api-load"
-            library-loaded="{{loaded}}"
-            library-error-message="{{errorMessage}}"></iron-jsonp-library>
-          <template is="dom-if" if="{{loaded}}">
-            <p class="success">The <code>Google+ API</code> has been loaded</p>
+      <template is="dom-bind">
+        <h3>Good loader</h3>
+        <iron-jsonp-library
+          library-url="https://apis.google.com/js/plusone.js?onload=%%callback%%"
+          notify-event="api-load"
+          library-loaded="{{loaded}}"
+          library-error-message="{{errorMessage}}"></iron-jsonp-library>
+        <template is="dom-if" if="{{loaded}}">
+          <p class="success">The <code>Google+ API</code> has been loaded</p>
+        </template>
+        <template is="dom-if" if="{{!loaded}}">
+          <template is="dom-if" if="{{errorMessage}}">
+            <p class="failure">{{errorMessage}}</p>
           </template>
-          <template is="dom-if" if="{{!loaded}}">
-            <template is="dom-if" if="{{errorMessage}}">
-              <p class="failure">{{errorMessage}}</p>
-            </template>
-            <template is="dom-if" if="{{!errorMessage}}">
-              <p class="loading">Loading...</p>
-            </template>
+          <template is="dom-if" if="{{!errorMessage}}">
+            <p class="loading">Loading...</p>
           </template>
         </template>
-      </dom-bind>
+      </template>
 
       <hr>
-      <dom-bind>
-        <template is="dom-bind">
-          <h3>Bad loader</h3>
-          <iron-jsonp-library
-            library-url="https://badapis.google.com/js/plusone.js?onload=%%callback%%"
-            notify-event="api-load"
-            library-loaded="{{loaded}}"
-            library-error-message="{{errorMessage}}"></iron-jsonp-library>
-          <template is="dom-if" if="{{loaded}}">
-            <p><code>badapis</code> has been loaded</p>
+      <template is="dom-bind">
+        <h3>Bad loader</h3>
+        <iron-jsonp-library
+          library-url="https://badapis.google.com/js/plusone.js?onload=%%callback%%"
+          notify-event="api-load"
+          library-loaded="{{loaded}}"
+          library-error-message="{{errorMessage}}"></iron-jsonp-library>
+        <template is="dom-if" if="{{loaded}}">
+          <p><code>badapis</code> has been loaded</p>
+        </template>
+        <template is="dom-if" if="{{!loaded}}">
+          <template is="dom-if" if="{{errorMessage}}">
+            <p class="failure">{{errorMessage}}</p>
           </template>
-          <template is="dom-if" if="{{!loaded}}">
-            <template is="dom-if" if="{{errorMessage}}">
-              <p class="failure">{{errorMessage}}</p>
-            </template>
-            <template is="dom-if" if="{{!errorMessage}}">
-              <p class="loading">Loading...</p>
-            </template>
+          <template is="dom-if" if="{{!errorMessage}}">
+            <p class="loading">Loading...</p>
           </template>
         </template>
-      </dom-bind>
+      </template>
 
       <hr>
-      <dom-bind>
-        <template is="dom-bind" id="delayedLoader">
-          <h3>Delayed libraryUrl loader</h3>
-          <iron-jsonp-library
-            library-url="{{libraryUrl}}"
-            library-loaded="{{loaded}}"
-            library-error-message="{{errorMessage}}">
-          </iron-jsonp-library>
-          <template is="dom-if" if="{{loaded}}">
-            <p><code>{{libraryUrl}}</code> has been loaded</p>
+      <template is="dom-bind" id="delayedLoader">
+        <h3>Delayed libraryUrl loader</h3>
+        <iron-jsonp-library
+          library-url="{{libraryUrl}}"
+          library-loaded="{{loaded}}"
+          library-error-message="{{errorMessage}}">
+        </iron-jsonp-library>
+        <template is="dom-if" if="{{loaded}}">
+          <p><code>{{libraryUrl}}</code> has been loaded</p>
+        </template>
+        <template is="dom-if" if="{{!loaded}}">
+          <template is="dom-if" if="{{errorMessage}}">
+            <p class="failure">{{errorMessage}}</p>
           </template>
-          <template is="dom-if" if="{{!loaded}}">
-            <template is="dom-if" if="{{errorMessage}}">
-              <p class="failure">{{errorMessage}}</p>
-            </template>
-            <template is="dom-if" if="{{!errorMessage}}">
-              <p class="loading">Loading...<code>{{libraryUrl}}</code></p>
-            </template>
+           <template is="dom-if" if="{{!errorMessage}}">
+            <p class="loading">Loading...<code>{{libraryUrl}}</code></p>
           </template>
         </template>
-      </dom-bind>
+      </template>
 
     </div>
 
@@ -118,14 +112,7 @@
       // kick off delayed loader by setting libraryUrl
       window.setTimeout(function() {
         var t = document.querySelector('#delayedLoader');
-
-        if (Polymer.Element) {
-          // value is set on the dom-bind in 2.x
-          t.parentNode.libraryUrl = 'https://apis.google.com/js/drive-realtime.js?onload=%%callback%%';
-        } else {
-          // value is set on template in Polymer 1.x
-          t.libraryUrl = 'https://apis.google.com/js/drive-realtime.js?onload=%%callback%%';
-        }
+        t.libraryUrl = 'https://apis.google.com/js/drive-realtime.js?onload=%%callback%%';
       },
       1000);
     </script>
diff --git a/polymer_2.0.2/bower_components/iron-jsonp-library/iron-jsonp-library.html b/polymer_2.0.2/bower_components/iron-jsonp-library/iron-jsonp-library.html
index 09277da..81c4129 100644
--- a/polymer_2.0.2/bower_components/iron-jsonp-library/iron-jsonp-library.html
+++ b/polymer_2.0.2/bower_components/iron-jsonp-library/iron-jsonp-library.html
@@ -91,7 +91,7 @@
         this._setLibraryErrorMessage(null);
         this._setLibraryLoaded(true);
         if (this.notifyEvent)
-          this.fire(this.notifyEvent, result, {composed: true});
+          this.fire(this.notifyEvent, result);
       }
     },
 
diff --git a/polymer_2.0.2/bower_components/iron-location/.bower.json b/polymer_2.0.2/bower_components/iron-location/.bower.json
index fabdba8..0d1e333 100644
--- a/polymer_2.0.2/bower_components/iron-location/.bower.json
+++ b/polymer_2.0.2/bower_components/iron-location/.bower.json
@@ -1,6 +1,6 @@
 {
   "name": "iron-location",
-  "version": "2.0.1",
+  "version": "2.0.3",
   "description": "Bidirectional data binding into the page's URL.",
   "private": true,
   "authors": [
@@ -59,11 +59,11 @@
   "resolutions": {
     "webcomponentsjs": "^1.0.0"
   },
-  "_release": "2.0.1",
+  "_release": "2.0.3",
   "_resolution": {
     "type": "version",
-    "tag": "v2.0.1",
-    "commit": "faaa959813d1dfa5defc5db30e55e799c89ec903"
+    "tag": "v2.0.3",
+    "commit": "1a0c6f979e3ae2f3040daab87c6005dca94d78c5"
   },
   "_source": "https://github.com/PolymerElements/iron-location.git",
   "_target": "1 - 2",
diff --git a/polymer_2.0.2/bower_components/iron-location/README.md b/polymer_2.0.2/bower_components/iron-location/README.md
index a28a757..ec532cf 100644
--- a/polymer_2.0.2/bower_components/iron-location/README.md
+++ b/polymer_2.0.2/bower_components/iron-location/README.md
@@ -13,6 +13,7 @@
 -->
 
 [![Build status](https://travis-ci.org/PolymerElements/iron-location.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-location)
+[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://www.webcomponents.org/element/PolymerElements/iron-location)
 
 _[Demo and API docs](https://elements.polymer-project.org/elements/iron-location)_
 
diff --git a/polymer_2.0.2/bower_components/iron-location/bower.json b/polymer_2.0.2/bower_components/iron-location/bower.json
index 84116f1..cff300d 100644
--- a/polymer_2.0.2/bower_components/iron-location/bower.json
+++ b/polymer_2.0.2/bower_components/iron-location/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "iron-location",
-  "version": "2.0.1",
+  "version": "2.0.3",
   "description": "Bidirectional data binding into the page's URL.",
   "private": true,
   "authors": [
diff --git a/polymer_2.0.2/bower_components/iron-location/iron-location.html b/polymer_2.0.2/bower_components/iron-location/iron-location.html
index f073149..d5fa2ef 100644
--- a/polymer_2.0.2/bower_components/iron-location/iron-location.html
+++ b/polymer_2.0.2/bower_components/iron-location/iron-location.html
@@ -181,6 +181,10 @@
         '_updateUrl(path, query, hash)'
       ],
 
+      created: function() {
+        this.__location = window.location;
+      },
+
       attached: function() {
         this.listen(window, 'hashchange', '_hashChanged');
         this.listen(window, 'location-changed', '_urlChanged');
@@ -203,7 +207,7 @@
       },
 
       _hashChanged: function() {
-        this.hash = window.decodeURIComponent(window.location.hash.substring(1));
+        this.hash = window.decodeURIComponent(this.__location.hash.substring(1));
       },
 
       _urlChanged: function() {
@@ -214,8 +218,8 @@
         // one when we set this.hash. Likewise for query.
         this._dontUpdateUrl = true;
         this._hashChanged();
-        this.path = window.decodeURIComponent(window.location.pathname);
-        this.query = window.location.search.substring(1);
+        this.path = window.decodeURIComponent(this.__location.pathname);
+        this.query = this.__location.search.substring(1);
         this._dontUpdateUrl = false;
         this._updateUrl();
       },
@@ -240,17 +244,17 @@
           return;
         }
 
-        if (this.path === window.decodeURIComponent(window.location.pathname) &&
-            this.query === window.location.search.substring(1) &&
+        if (this.path === window.decodeURIComponent(this.__location.pathname) &&
+            this.query === this.__location.search.substring(1) &&
             this.hash === window.decodeURIComponent(
-                window.location.hash.substring(1))) {
+                this.__location.hash.substring(1))) {
           // Nothing to do, the current URL is a representation of our properties.
           return;
         }
 
         var newUrl = this._getUrl();
         // Need to use a full URL in case the containing page has a base URI.
-        var fullNewUrl = resolveURL(newUrl, window.location.protocol + '//' + window.location.host).href;
+        var fullNewUrl = resolveURL(newUrl, this.__location.protocol + '//' + this.__location.host).href;
         var now = window.performance.now();
         var shouldReplace = this._lastChangedAt + this.dwellTime > now;
         this._lastChangedAt = now;
@@ -288,7 +292,7 @@
 
         // If the navigation is to the current page we shouldn't add a history
         // entry or fire a change event.
-        if (href === window.location.href) {
+        if (href === this.__location.href) {
           return;
         }
 
@@ -344,6 +348,11 @@
             window.top !== window) {
           return null;
         }
+        
+        // If the link is a download, don't intercept.
+        if (anchor.download) {
+          return null;
+        }
 
         var href = anchor.href;
 
@@ -360,10 +369,10 @@
         var origin;
 
         // IE Polyfill
-        if (window.location.origin) {
-          origin = window.location.origin;
+        if (this.__location.origin) {
+          origin = this.__location.origin;
         } else {
-          origin = window.location.protocol + '//' + window.location.host;
+          origin = this.__location.protocol + '//' + this.__location.host;
         }
 
         var urlOrigin;
@@ -371,7 +380,18 @@
         if (url.origin) {
           urlOrigin = url.origin;
         } else {
-          urlOrigin = url.protocol + '//' + url.host;
+          // IE always adds port number on HTTP and HTTPS on <a>.host but not on
+          // window.location.host
+          var urlHost = url.host;
+          var urlPort = url.port;
+          var urlProtocol = url.protocol;
+          var isExtraneousHTTPS = urlProtocol === 'https:' && urlPort === '443';
+          var isExtraneousHTTP = urlProtocol === 'http:' && urlPort === '80';
+
+          if (isExtraneousHTTPS || isExtraneousHTTP) {
+            urlHost = url.hostname;
+          }
+          urlOrigin = urlProtocol + '//' + urlHost;
         }
 
         if (urlOrigin !== origin) {
@@ -393,7 +413,7 @@
 
         // Need to use a full URL in case the containing page has a base URI.
         var fullNormalizedHref = resolveURL(
-            normalizedHref, window.location.href).href;
+            normalizedHref, this.__location.href).href;
         return fullNormalizedHref;
       },
 
diff --git a/polymer_2.0.2/bower_components/iron-location/test/index.html b/polymer_2.0.2/bower_components/iron-location/test/index.html
index b5dffd5..4fbcc50 100644
--- a/polymer_2.0.2/bower_components/iron-location/test/index.html
+++ b/polymer_2.0.2/bower_components/iron-location/test/index.html
@@ -18,10 +18,12 @@
     <script>
       WCT.loadSuites([
         'iron-location.html?dom=shadow',
+        'iron-location-base-uri.html?dom=shadow',
         'iron-query-params.html?dom=shadow',
         'initialization-tests.html?dom=shadow',
         'integration.html?dom=shadow',
         'iron-location.html?wc-shadydom=true&wc-ce=true',
+        'iron-location-base-uri.html?wc-shadydom=true&wc-ce=true',
         'iron-query-params.html?wc-shadydom=true&wc-ce=true',
         'initialization-tests.html?wc-shadydom=true&wc-ce=true',
         'integration.html?wc-shadydom=true&wc-ce=true'
diff --git a/polymer_2.0.2/bower_components/iron-location/test/initialization-tests.html b/polymer_2.0.2/bower_components/iron-location/test/initialization-tests.html
index 5b1236b..7418169 100644
--- a/polymer_2.0.2/bower_components/iron-location/test/initialization-tests.html
+++ b/polymer_2.0.2/bower_components/iron-location/test/initialization-tests.html
@@ -113,8 +113,9 @@
         });
         var cases = [
           'default-before', 'attached-before', 'ready-before',
-          'default-after', 'attached-after', 'ready-after',
-          'default-below', 'attached-below', 'ready-below',
+          // TODO: These tests are failing with Polymer 2 (#95).
+          // 'default-after', 'attached-after', 'ready-after',
+          // 'default-below', 'attached-below', 'ready-below',
           'default-above', 'attached-above', 'ready-above',
           'default-container', 'attached-container', 'ready-container'
         ];
diff --git a/polymer_2.0.2/bower_components/iron-location/test/iron-location-base-uri.html b/polymer_2.0.2/bower_components/iron-location/test/iron-location-base-uri.html
new file mode 100644
index 0000000..c91c886
--- /dev/null
+++ b/polymer_2.0.2/bower_components/iron-location/test/iron-location-base-uri.html
@@ -0,0 +1,534 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 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>iron-location</title>
+
+  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+  <script src="../../web-component-tester/browser.js"></script>
+
+  <link rel="import" href="../../polymer/polymer.html">
+  <link rel="import" href="../../promise-polyfill/promise-polyfill.html">
+  <link rel="import" href="../iron-location.html">
+  <link rel="import" href="./redirection.html">
+  <style>
+    #safari-cooldown {
+      font-size: 18px;
+      max-width: 300px;
+    }
+    #safari-cooldown div {
+      margin-bottom: 20px;
+    }
+  </style>
+</head>
+<body>
+
+  <div id='safari-cooldown' hidden>
+    <div>Danger: URL overheating.</div>
+    <div>
+      Safari requires a cooldown period before we call
+      pushState/replaceState any more.
+    </div>
+    <div>Testing will resume after 30 seconds.</div>
+    <div>
+      <a href="https://forums.developer.apple.com/thread/36650">More info</a>
+    </div>
+  </div>
+
+<test-fixture id='Solo'>
+  <template>
+    <iron-location></iron-location>
+  </template>
+</test-fixture>
+<test-fixture id='Together'>
+  <template>
+    <div>
+      <iron-location id='one'></iron-location>
+      <iron-location id='two'></iron-location>
+    </div>
+  </template>
+</test-fixture>
+<test-fixture id='RedirectHash'>
+  <template>
+    <redirect-hash></redirect-hash>
+  </template>
+</test-fixture>
+<test-fixture id='RedirectPath'>
+  <template>
+    <redirect-path></redirect-path>
+  </template>
+</test-fixture>
+<test-fixture id='RedirectQuery'>
+  <template>
+    <redirect-query></redirect-query>
+  </template>
+</test-fixture>
+
+<script>
+  'use strict';
+
+  function timePasses(ms) {
+    return new Promise(function(resolve) {
+      window.setTimeout(function() {
+        resolve();
+      }, ms);
+    });
+  }
+
+  function makeAbsoluteUrl(path) {
+    return window.location.protocol + '//' + window.location.host + path;
+  }
+
+  // A window.history.replaceState wrapper that's smart about baseURI.
+  function replaceState(path) {
+    window.history.replaceState({}, '', makeAbsoluteUrl(path));
+  }
+
+  /**
+   * We run the iron location tests with a couple different page configurations
+   * (e.g. with and withoug a base URI), so we define the test set as a function
+   * that we call in each of these configurations.
+   */
+  function ironLocationTests() {
+    suite('when used solo', function() {
+      var urlElem;
+      var toRemove;
+      setup(function() {
+        replaceState('/');
+        urlElem = fixture('Solo');
+        toRemove = [];
+      });
+      teardown(function() {
+        for (var i = 0; i < toRemove.length; i++) {
+          document.body.removeChild(toRemove[i]);
+        }
+      });
+      test('basic functionality with #hash urls', function() {
+        // Initialized to the window location's hash.
+        expect(window.location.hash).to.be.equal(urlElem.hash);
+
+        // Changing the urlElem's hash changes the URL
+        urlElem.hash = '/lol/ok';
+        expect(window.location.hash).to.be.equal('#/lol/ok');
+
+        // Changing the hash via normal means changes the urlElem.
+        var anchor = document.createElement('a');
+        var base =
+            window.location.protocol + '//' + window.location.host +
+            window.location.pathname;
+        anchor.href = base + '#/wat';
+        document.body.appendChild(anchor);
+        anchor.click();
+        // In IE10 it appears that the hashchange event is asynchronous.
+        return timePasses(10).then(function() {
+          expect(urlElem.hash).to.be.equal('/wat');
+        });
+      });
+      test('basic functionality with paths', function() {
+        // Initialized to the window location's path.
+        expect(window.location.pathname).to.be.equal(urlElem.path);
+
+        // Changing the urlElem's path changes the URL
+        urlElem.path = '/foo/bar';
+        expect(window.location.pathname).to.be.equal('/foo/bar');
+
+        // Changing the path and sending a custom event on the window changes
+        // the urlElem.
+        replaceState('/baz');
+        window.dispatchEvent(new CustomEvent('location-changed'));
+        expect(urlElem.path).to.be.equal('/baz');
+      });
+      function makeTemporaryIronLocation() {
+        var ironLocation = document.createElement('iron-location');
+        document.body.appendChild(ironLocation);
+        toRemove.push(ironLocation);
+        return ironLocation
+      }
+      test('dealing with paths with unusual characters', function() {
+        var pathEncodingExamples = {
+          '/foo': '/foo',
+          '/': '/',
+          '/foo bar': '/foo%20bar',
+          '/foo#bar': '/foo%23bar',
+          '/foo?xyz': '/foo%3Fxyz',
+          '/foo\'bar\'baz': '/foo\'bar\'baz',
+        };
+
+        for (var plainTextPath in pathEncodingExamples) {
+          var encodedPath = pathEncodingExamples[plainTextPath];
+
+          urlElem.path = plainTextPath;
+          expect(window.location.pathname).to.be.equal(encodedPath);
+          expect(urlElem.path).to.be.equal(plainTextPath);
+          var temporaryIronLocation = makeTemporaryIronLocation();
+          expect(temporaryIronLocation.path).to.be.equal(plainTextPath);
+        }
+      });
+      test('dealing with hashes with unusual characters', function() {
+        var hashEncodingExamples = {
+          'foo': '#foo',
+          '': '',
+          'foo bar': ['#foo%20bar', '#foo bar'],
+          'foo#bar': '#foo#bar',
+          'foo?bar': '#foo?bar',
+          '/foo\'bar\'baz': ['#/foo%27bar%27baz', '#/foo\'bar\'baz'],
+        };
+        for (var plainTextHash in hashEncodingExamples) {
+          var encodedHashes = hashEncodingExamples[plainTextHash];
+          if (typeof encodedHashes === 'string') {
+            encodedHashes = [encodedHashes];
+          }
+
+          urlElem.hash = plainTextHash;
+          expect(encodedHashes).to.contain(window.location.hash);
+          expect(urlElem.hash).to.be.equal(plainTextHash);
+          expect(makeTemporaryIronLocation().hash).to.be.equal(plainTextHash);
+        }
+      });
+      test('dealing with queries with unusual characters', function() {
+        var queryEncodingExamples = {
+          'foo': '?foo',
+          '': '',
+          'foo bar': '?foo%20bar',
+          'foo#bar': '?foo%23bar',
+          'foo?bar': '?foo?bar',
+          '/foo\'bar\'baz': ['?/foo%27bar%27baz', '?/foo\'bar\'baz'],
+          'foo/bar/baz': '?foo/bar/baz'
+        };
+        for (var plainTextQuery in queryEncodingExamples) {
+          var encodedQueries = queryEncodingExamples[plainTextQuery];
+          if (typeof encodedQueries === 'string') {
+            encodedQueries = [encodedQueries];
+          }
+
+          var ironLocationQuery = encodedQueries.map(function(value) {
+            return value.substring(1);
+          });
+
+          expect(urlElem._initialized).to.be.eq(true);
+          urlElem.query = plainTextQuery;
+          expect(encodedQueries).to.contain(window.location.search);
+          expect(ironLocationQuery).to.contain(urlElem.query);
+          expect(ironLocationQuery).to.contain(makeTemporaryIronLocation().query);
+
+          urlElem.query = 'dummyValue';
+          urlElem.query = ironLocationQuery[0];
+
+          expect(encodedQueries).to.contain(window.location.search);
+          expect(ironLocationQuery).to.contain(urlElem.query);
+          expect(ironLocationQuery).to.contain(makeTemporaryIronLocation().query);
+        }
+      });
+      test('assigning to a relative path URL', function() {
+        urlElem.path = '/foo/bar';
+        expect(window.location.pathname).to.be.equal('/foo/bar');
+
+        // A relative path is treated as an absolute one, just with a
+        // missing leading slash.
+        urlElem.path = 'baz';
+        expect(window.location.pathname).to.be.equal('/baz');
+      });
+      test('basic functionality with ?key=value params', function() {
+        // Initialized to the window location's params.
+        expect(urlElem.query).to.be.eq('');
+
+        // Changing location.search and sending a custom event on the window
+        // changes the urlElem.
+        replaceState('/?greeting=hello&target=world');
+        window.dispatchEvent(new CustomEvent('location-changed'));
+        expect(urlElem.query).to.be.equal('greeting=hello&target=world');
+
+        // Changing the urlElem's query changes the URL.
+        urlElem.query = 'greeting=hello&target=world&another=key';
+        expect(window.location.search).to.be.equal(
+            '?greeting=hello&target=world&another=key');
+      });
+    });
+    suite('does not spam the user\'s history', function() {
+      var replaceStateCalls, pushStateCalls;
+      var nativeReplaceState, nativePushState;
+      setup(function() {
+        replaceStateCalls = pushStateCalls = 0;
+        nativeReplaceState = window.history.replaceState;
+        nativePushState = window.history.pushState;
+        window.history.replaceState = function() {
+          replaceStateCalls++;
+        };
+        window.history.pushState = function() {
+          pushStateCalls++;
+        };
+      });
+      teardown(function() {
+        window.history.replaceState = nativeReplaceState;
+        window.history.pushState = nativePushState;
+      });
+      test('when a change happens immediately after ' +
+           'the iron-location is attached', function() {
+        var ironLocation = fixture('Solo');
+        expect(pushStateCalls).to.be.equal(0);
+        expect(replaceStateCalls).to.be.equal(0);
+        ironLocation.path = '/foo';
+        expect(replaceStateCalls).to.be.equal(1);
+        expect(pushStateCalls).to.be.equal(0);
+    });
+
+      suite('when intercepting links', function() {
+      /**
+       * Clicks the given link while an iron-location element with the given
+       * urlSpaceRegex is in the same document. Returns whether the
+       * iron-location prevented the default behavior of the click.
+       *
+       * No matter what, it prevents the default behavior of the click itself
+       * to ensure that no navigation occurs (as that would interrupt
+       * running and reporting these tests!)
+       */
+      function isClickCaptured(anchor, urlSpaceRegex, location) {
+        var defaultWasPrevented;
+        function handler(event) {
+          expect(event.target).to.be.eq(anchor);
+          defaultWasPrevented = event.defaultPrevented;
+          event.preventDefault();
+          expect(event.defaultPrevented).to.be.eq(true);
+        }
+        window.addEventListener('click', handler);
+        var ironLocation = fixture('Solo');
+        if (urlSpaceRegex != null) {
+          ironLocation.urlSpaceRegex = urlSpaceRegex;
+        }
+
+        if (location) {
+          ironLocation.__location = location;
+        }
+
+        document.body.appendChild(anchor);
+        anchor.click();
+        document.body.removeChild(anchor);
+        window.removeEventListener('click', handler);
+        return defaultWasPrevented;
+      }
+
+      test('simple link to / is intercepted', function() {
+        var anchor = document.createElement('a');
+        if (document.baseURI !== window.location.href) {
+          anchor.href = makeAbsoluteUrl('/');
+        } else {
+          anchor.href = '/';
+        }
+
+        expect(isClickCaptured(anchor)).to.be.eq(true);
+          expect(pushStateCalls).to.be.equal(1);
+      });
+
+      test('test http port 80 intercepted', function() {
+        var anchor = document.createElement('a');
+        anchor.href = 'http://www.example.com/hello/world'
+
+        var location = {
+          hash: '',
+          pathname: '',
+          search: '',
+          protocol: 'http:',
+          host: 'www.example.com',
+          href: 'http://www.example.com/',
+          origin: 'http://www.example.com'
+        };
+
+        expect(isClickCaptured(anchor, null, location)).to.be.eq(true);
+        expect(pushStateCalls).to.be.equal(1);
+      });
+
+      test('test https port 443 intercepted', function() {
+        var anchor = document.createElement('a');
+        anchor.href = 'https://www.google.com/hello/world'
+
+        var location = {
+          hash: '',
+          pathname: '',
+          search: '',
+          protocol: 'https:',
+          host: 'www.google.com',
+          href: 'https://www.google.com/',
+          origin: 'https://www.google.com'
+        };
+
+        expect(isClickCaptured(anchor, null, location)).to.be.eq(true);
+        expect(pushStateCalls).to.be.equal(1);
+      });
+
+      test('link that matches url space is intercepted', function() {
+        var anchor = document.createElement('a');
+        anchor.href = makeAbsoluteUrl('/foo');
+
+        expect(isClickCaptured(anchor, '/fo+')).to.be.eq(true);
+          expect(pushStateCalls).to.be.equal(1);
+      });
+
+      test('link that doesn\'t match url space isn\'t intercepted', function() {
+        var anchor = document.createElement('a');
+        anchor.href = makeAbsoluteUrl('/bar');
+
+        expect(isClickCaptured(anchor, '/fo+')).to.be.eq(false);
+          expect(pushStateCalls).to.be.equal(0);
+      });
+
+      test('link to another domain isn\'t intercepted', function() {
+        var anchor = document.createElement('a');
+        anchor.href = 'http://example.com/';
+
+        expect(isClickCaptured(anchor)).to.be.eq(false);
+          expect(pushStateCalls).to.be.equal(0);
+      });
+
+      test('a link with target=_blank isn\'t intercepted', function() {
+        var anchor = document.createElement('a');
+        anchor.href = makeAbsoluteUrl('/');
+        anchor.target = '_blank';
+
+        expect(isClickCaptured(anchor)).to.be.eq(false);
+          expect(pushStateCalls).to.be.equal(0);
+        });
+
+        test('a link with an href to the ' +
+             'current page shouldn\'t add to history.', function() {
+          var anchor = document.createElement('a');
+          anchor.href = window.location.href;
+
+          // The click is captured, but it doesn't add to history.
+          expect(isClickCaptured(anchor)).to.be.equal(true);
+          expect(pushStateCalls).to.be.equal(0);
+        });
+
+        test('a click that has already been defaultPrevented ' +
+             'shouldn\'t result in a navigation', function() {
+           fixture('Solo');
+           var anchor = document.createElement('a');
+           anchor.href = makeAbsoluteUrl('/');
+           anchor.addEventListener('click', function(event) {
+             event.preventDefault();
+           });
+           document.body.appendChild(anchor);
+
+           var originalPushState = window.history.pushState;
+           var count = 0;
+           window.history.pushState = function() {
+             count++;
+           }
+           anchor.click();
+           window.history.pushState = originalPushState;
+
+           expect(count).to.be.equal(0);
+        });
+      });
+    });
+    suite('when used with other iron-location elements', function() {
+      var otherUrlElem;
+      var urlElem;
+      setup(function() {
+        var elems = fixture('Together');
+        urlElem = elems.querySelector('#one');
+        otherUrlElem = elems.querySelector('#two');
+      });
+      function assertHaveSameUrls(urlElemOne, urlElemTwo) {
+        expect(urlElemOne.path).to.be.equal(urlElemTwo.path);
+        expect(urlElemOne.hash).to.be.equal(urlElemTwo.hash);
+        expect(urlElemOne.query).to.be.equal(urlElemTwo.query);
+      }
+      test('coordinate their changes (by firing events on window)', function() {
+        assertHaveSameUrls(urlElem, otherUrlElem);
+
+        urlElem.path = '/a/b/c';
+        assertHaveSameUrls(urlElem, otherUrlElem);
+
+        otherUrlElem.query = 'alsdkjflaksjfd=alksjfdlkajsdfl';
+        assertHaveSameUrls(urlElem, otherUrlElem);
+
+        urlElem.hash = 'lkjljifosjkldfjlksjfldsjf';
+        assertHaveSameUrls(urlElem, otherUrlElem);
+      });
+    });
+
+    suite('supports doing synchronous redirection', function() {
+      test('of the hash portion of the URL', function() {
+        expect(window.location.hash).to.be.equal('');
+        var redirector = fixture('RedirectHash');
+        expect(window.location.hash).to.be.equal('#redirectedTo');
+        expect(redirector.hash).to.be.equal('redirectedTo');
+        redirector.hash = 'newHash';
+        expect(window.location.hash).to.be.equal('#redirectedTo');
+        expect(redirector.hash).to.be.equal('redirectedTo');
+      });
+
+      test('of the path portion of the URL', function() {
+        expect(window.location.pathname).to.not.be.equal('/redirectedTo');
+        var redirector = fixture('RedirectPath');
+        expect(window.location.pathname).to.be.equal('/redirectedTo');
+        expect(redirector.path).to.be.equal('/redirectedTo');
+        redirector.path = '/newPath';
+        expect(window.location.pathname).to.be.equal('/redirectedTo');
+        expect(redirector.path).to.be.equal('/redirectedTo');
+      });
+
+      test('of the query portion of the URL', function() {
+        expect(window.location.search).to.not.be.equal('?redirectedTo');
+        var redirector = fixture('RedirectQuery');
+        expect(window.location.search).to.be.equal('?redirectedTo');
+        expect(redirector.query).to.be.equal('redirectedTo');
+        redirector.query = 'newQuery';
+        expect(window.location.search).to.be.equal('?redirectedTo');
+        expect(redirector.query).to.be.equal('redirectedTo');
+      });
+    });
+  }
+
+  suite('<iron-location>', function () {
+    var initialUrl;
+    setup(function() {
+      initialUrl = window.location.href;
+    });
+    teardown(function(){
+      window.history.replaceState({}, '', initialUrl);
+    });
+
+    // This is as dumb as it looks. See #safari-cooldown in the dom above.
+    var cooldownFunction = function() {};
+    if (/^Apple/.test(navigator.vendor)) {
+      cooldownFunction = function(done) {
+        var cooldownPeriod = 30 * 1000;
+        this.timeout(cooldownPeriod + 5000);
+        var cooldownMessage = document.querySelector('#safari-cooldown');
+        cooldownMessage.removeAttribute('hidden');
+        setTimeout(function() {
+          done();
+          cooldownMessage.setAttribute('hidden', 'hidden');
+        }, cooldownPeriod);
+      };
+    }
+
+    suite('with a base URI', function() {
+      var baseElem;
+      setup(function() {
+        expect(document.baseURI).to.be.equal(window.location.href);
+        baseElem = document.createElement('base');
+        var href = 'https://example.com/i/dont/exist/obviously'
+        baseElem.href = href;
+        document.head.appendChild(baseElem);
+        expect(document.baseURI).to.be.equal(href);
+      });
+      teardown(function() {
+        document.head.removeChild(baseElem);
+      });
+      suiteTeardown(cooldownFunction);
+      ironLocationTests();
+    });
+  });
+
+</script>
+</body>
diff --git a/polymer_2.0.2/bower_components/iron-location/test/iron-location.html b/polymer_2.0.2/bower_components/iron-location/test/iron-location.html
index ea91ef1..8fbb9a5 100644
--- a/polymer_2.0.2/bower_components/iron-location/test/iron-location.html
+++ b/polymer_2.0.2/bower_components/iron-location/test/iron-location.html
@@ -290,7 +290,7 @@
        * to ensure that no navigation occurs (as that would interrupt
        * running and reporting these tests!)
        */
-      function isClickCaptured(anchor, urlSpaceRegex) {
+      function isClickCaptured(anchor, urlSpaceRegex, location) {
         var defaultWasPrevented;
         function handler(event) {
           expect(event.target).to.be.eq(anchor);
@@ -303,6 +303,11 @@
         if (urlSpaceRegex != null) {
           ironLocation.urlSpaceRegex = urlSpaceRegex;
         }
+
+        if (location) {
+          ironLocation.__location = location;
+        }
+
         document.body.appendChild(anchor);
         anchor.click();
         document.body.removeChild(anchor);
@@ -322,6 +327,42 @@
           expect(pushStateCalls).to.be.equal(1);
       });
 
+      test('test http port 80 intercepted', function() {
+        var anchor = document.createElement('a');
+        anchor.href = 'http://www.example.com/hello/world'
+
+        var location = {
+          hash: '',
+          pathname: '',
+          search: '',
+          protocol: 'http:',
+          host: 'www.example.com',
+          href: 'http://www.example.com/',
+          origin: 'http://www.example.com'
+        };
+
+        expect(isClickCaptured(anchor, null, location)).to.be.eq(true);
+        expect(pushStateCalls).to.be.equal(1);
+      });
+
+      test('test https port 443 intercepted', function() {
+        var anchor = document.createElement('a');
+        anchor.href = 'https://www.google.com/hello/world'
+
+        var location = {
+          hash: '',
+          pathname: '',
+          search: '',
+          protocol: 'https:',
+          host: 'www.google.com',
+          href: 'https://www.google.com/',
+          origin: 'https://www.google.com'
+        };
+
+        expect(isClickCaptured(anchor, null, location)).to.be.eq(true);
+        expect(pushStateCalls).to.be.equal(1);
+      });
+
       test('link that matches url space is intercepted', function() {
         var anchor = document.createElement('a');
         anchor.href = makeAbsoluteUrl('/foo');
@@ -384,8 +425,8 @@
            window.history.pushState = originalPushState;
 
            expect(count).to.be.equal(0);
-      })
-    });
+        });
+      });
     });
     suite('when used with other iron-location elements', function() {
       var otherUrlElem;
@@ -476,23 +517,6 @@
 
       suiteTeardown(cooldownFunction);
     });
-
-    suite('with a base URI', function() {
-      var baseElem;
-      setup(function() {
-        expect(document.baseURI).to.be.equal(window.location.href);
-        baseElem = document.createElement('base');
-        var href = 'https://example.com/i/dont/exist/obviously'
-        baseElem.href = href;
-        document.head.appendChild(baseElem);
-        expect(document.baseURI).to.be.equal(href);
-      });
-      teardown(function() {
-        document.head.removeChild(baseElem);
-      });
-      suiteTeardown(cooldownFunction);
-      ironLocationTests();
-    });
   });
 
 </script>
diff --git a/polymer_2.0.2/bower_components/iron-meta/.bower.json b/polymer_2.0.2/bower_components/iron-meta/.bower.json
index 557dae5..7443ebf 100644
--- a/polymer_2.0.2/bower_components/iron-meta/.bower.json
+++ b/polymer_2.0.2/bower_components/iron-meta/.bower.json
@@ -1,6 +1,6 @@
 {
   "name": "iron-meta",
-  "version": "2.0.2",
+  "version": "2.0.4",
   "keywords": [
     "web-components",
     "polymer"
@@ -46,11 +46,11 @@
     "webcomponentsjs": "^1.0.0"
   },
   "homepage": "https://github.com/PolymerElements/iron-meta",
-  "_release": "2.0.2",
+  "_release": "2.0.4",
   "_resolution": {
     "type": "version",
-    "tag": "v2.0.2",
-    "commit": "d98128f771ede383b9b5c5c5f1f63feb056b2786"
+    "tag": "v2.0.4",
+    "commit": "88d89fbcb45a8ae87986df686ed3f8659aa11b37"
   },
   "_source": "https://github.com/PolymerElements/iron-meta.git",
   "_target": "1 - 2",
diff --git a/polymer_2.0.2/bower_components/iron-meta/bower.json b/polymer_2.0.2/bower_components/iron-meta/bower.json
index dfbac10..0b99dc7 100644
--- a/polymer_2.0.2/bower_components/iron-meta/bower.json
+++ b/polymer_2.0.2/bower_components/iron-meta/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "iron-meta",
-  "version": "2.0.2",
+  "version": "2.0.4",
   "keywords": [
     "web-components",
     "polymer"
diff --git a/polymer_2.0.2/bower_components/iron-meta/iron-meta.html b/polymer_2.0.2/bower_components/iron-meta/iron-meta.html
index cc8ed55..4118c0f 100644
--- a/polymer_2.0.2/bower_components/iron-meta/iron-meta.html
+++ b/polymer_2.0.2/bower_components/iron-meta/iron-meta.html
@@ -57,12 +57,16 @@
 
     /**
      * @constructor
-     * @param {{type: (string|null), key: (string|null), value: *}} options
+     * @param {{
+     *   type: (string|null|undefined),
+     *   key: (string|null|undefined),
+     *   value: *,
+     * }=} options
      */
     function IronMeta(options) {
       this.type = (options && options.type) || 'default';
       this.key = options && options.key;
-      if ('value' in options) {
+      if (options && 'value' in options) {
         this.value = options.value;
       }
     }
@@ -97,7 +101,12 @@
         var type = this.type;
 
         if (type) {
-          return Object.keys(IronMeta.types[this.type]).map(function(key) {
+          const items = IronMeta.types[this.type];
+          if (!items) {
+            return [];
+          }
+
+          return Object.keys(items).map(function(key) {
             return metaDatas[this.type][key];
           }, this);
         }
diff --git a/polymer_2.0.2/bower_components/iron-meta/test/basic.html b/polymer_2.0.2/bower_components/iron-meta/test/basic.html
index 9d857ef..10de591 100644
--- a/polymer_2.0.2/bower_components/iron-meta/test/basic.html
+++ b/polymer_2.0.2/bower_components/iron-meta/test/basic.html
@@ -41,6 +41,12 @@
         assert.equal(document.querySelector('iron-meta').list.length, 1);
       });
 
+      test('constructor with no arguments', function() {
+        expect(function() {
+          new Polymer.IronMeta();
+        }).to.not.throw();
+      });
+
     });
 
   </script>
diff --git a/polymer_2.0.2/bower_components/iron-meta/test/iron-meta.html b/polymer_2.0.2/bower_components/iron-meta/test/iron-meta.html
index a0e1084..a754f59 100644
--- a/polymer_2.0.2/bower_components/iron-meta/test/iron-meta.html
+++ b/polymer_2.0.2/bower_components/iron-meta/test/iron-meta.html
@@ -201,6 +201,13 @@
         key: meta.key
       }).value).to.be.equal(meta.value);
     });
+
+    test('getting `list` does not throw if no objects of the given type exist', function() {
+      const meta = new Polymer.IronMeta({type: 'NO ITEMS OF THIS TYPE'});
+      assert.doesNotThrow(function() {
+        meta.list;
+      });
+    });
   });
 });
     </script>
diff --git a/polymer_2.0.2/bower_components/iron-overlay-behavior/.bower.json b/polymer_2.0.2/bower_components/iron-overlay-behavior/.bower.json
index fde13c0..8eeb4fd 100644
--- a/polymer_2.0.2/bower_components/iron-overlay-behavior/.bower.json
+++ b/polymer_2.0.2/bower_components/iron-overlay-behavior/.bower.json
@@ -1,6 +1,6 @@
 {
   "name": "iron-overlay-behavior",
-  "version": "2.0.0",
+  "version": "2.3.1",
   "license": "http://polymer.github.io/LICENSE.txt",
   "description": "Provides a behavior for making an element an overlay",
   "private": true,
@@ -58,11 +58,11 @@
     "webcomponentsjs": "^1.0.0"
   },
   "homepage": "https://github.com/PolymerElements/iron-overlay-behavior",
-  "_release": "2.0.0",
+  "_release": "2.3.1",
   "_resolution": {
     "type": "version",
-    "tag": "v2.0.0",
-    "commit": "3c00626301eeb787ef74da5d18c2179113e0b0b8"
+    "tag": "v2.3.1",
+    "commit": "801c585feb7a7d3f7be21b03419e0cdf247870f2"
   },
   "_source": "https://github.com/PolymerElements/iron-overlay-behavior.git",
   "_target": "1 - 2",
diff --git a/polymer_2.0.2/bower_components/iron-overlay-behavior/README.md b/polymer_2.0.2/bower_components/iron-overlay-behavior/README.md
index cc92939..979118c 100644
--- a/polymer_2.0.2/bower_components/iron-overlay-behavior/README.md
+++ b/polymer_2.0.2/bower_components/iron-overlay-behavior/README.md
@@ -1,4 +1,5 @@
 [![Build status](https://travis-ci.org/PolymerElements/iron-overlay-behavior.svg?branch=master)](https://travis-ci.org/PolymerElements/iron-overlay-behavior)
+[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://www.webcomponents.org/element/PolymerElements/iron-overlay-behavior)
 
 _[Demo and API docs](https://elements.polymer-project.org/elements/iron-overlay-behavior)_
 
diff --git a/polymer_2.0.2/bower_components/iron-overlay-behavior/bower.json b/polymer_2.0.2/bower_components/iron-overlay-behavior/bower.json
index 17a5115..7af1355 100644
--- a/polymer_2.0.2/bower_components/iron-overlay-behavior/bower.json
+++ b/polymer_2.0.2/bower_components/iron-overlay-behavior/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "iron-overlay-behavior",
-  "version": "2.0.0",
+  "version": "2.3.1",
   "license": "http://polymer.github.io/LICENSE.txt",
   "description": "Provides a behavior for making an element an overlay",
   "private": true,
diff --git a/polymer_2.0.2/bower_components/iron-overlay-behavior/demo/index.html b/polymer_2.0.2/bower_components/iron-overlay-behavior/demo/index.html
index 3620f4b..61be62d 100644
--- a/polymer_2.0.2/bower_components/iron-overlay-behavior/demo/index.html
+++ b/polymer_2.0.2/bower_components/iron-overlay-behavior/demo/index.html
@@ -55,7 +55,7 @@
   <demo-snippet>
     <template>
       <button onclick="backdrop.open()">Overlay with backdrop</button>
-      <simple-overlay id="backdrop" with-backdrop>
+      <simple-overlay id="backdrop" with-backdrop scroll-action="lock">
         <p>Hello world!</p>
         <button>Button</button>
         <button onclick="backdrop.close()">Close</button>
@@ -90,15 +90,19 @@
   <demo-snippet>
     <template>
       <button onclick="multiple.open()">Open first overlay</button>
-      <simple-overlay id="multiple" tabindex=-1>
+      <simple-overlay id="multiple" tabindex=-1 with-backdrop>
         <p>click to open another overlay</p>
         <button onclick="multiple2.open()">Open second overlay</button>
         <button onclick="multiple.close()">Close this</button>
       </simple-overlay>
-      <simple-overlay id="multiple2" tabindex=-1>
-        <h2>Hi!</h2>
+      <simple-overlay id="multiple2" tabindex=-1 with-backdrop>
+        <button onclick="multiple3.open()">Open third overlay</button>
         <button onclick="multiple2.close()">Close</button>
       </simple-overlay>
+      <simple-overlay id="multiple3" tabindex=-1>
+        <h2>Hello!</h2>
+        <button onclick="multiple3.close()">Close</button>
+      </simple-overlay>
     </template>
   </demo-snippet>
 
@@ -140,7 +144,7 @@
       </custom-style>
       <button onclick="scrolling.open()">Scrolling overlay</button>
 
-      <simple-overlay id="scrolling" class="with-margin scrollable" tabindex=-1>
+      <simple-overlay id="scrolling" class="with-margin scrollable" tabindex=-1 scroll-action="lock">
         <h2>This overlay scrolls internally.</h2>
         <p>
           Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
@@ -205,7 +209,7 @@
 
       <button onclick="scrolling2.open()">Scrolling content</button>
 
-      <simple-overlay id="scrolling2" class="with-margin" tabindex=-1>
+      <simple-overlay id="scrolling2" class="with-margin" tabindex=-1 scroll-action="lock">
         <h2>This overlay has a scrolling child.</h2>
         <p class="scrollable">
           Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
@@ -275,6 +279,47 @@
     </template>
   </demo-snippet>
 
+  <h3>Use <code>allow-click-through</code> to allow click events to be handled by overlays below the top overlay.</h3>
+  <demo-snippet>
+    <template>
+      <button onclick="plain.open();toast.open()">Overlay that allows click through</button>
+      <simple-overlay id="toast" allow-click-through no-cancel-on-outside-click horizontal-align="left" vertical-align="bottom" no-auto-focus>
+        <span>This overlay allows click-through which can close overlays below it.</span>
+        <button onclick="toast.close()">Close</button>
+      </simple-overlay>
+    </template>
+  </demo-snippet>
+  
+  <h3>Use <code>scroll-action</code> to lock, refit or cancel an overlay on scroll.</h3>
+  <demo-snippet>
+    <template>
+      <span>
+        <button onclick="lockOnScroll.open()">locks scroll</button>
+        <simple-overlay id="lockOnScroll" scroll-action="lock" no-overlap
+                        vertical-align="bottom" horizontal-align="left" tabindex=-1>
+          <h2>Prevents scroll outside</h2>
+          <button onclick="lockOnScroll.close()">Close this</button>
+        </simple-overlay>
+      </span>
+      <span>
+        <button onclick="refitOnScroll.open()">refits on scroll</button>
+        <simple-overlay id="refitOnScroll" scroll-action="refit" no-overlap
+                        vertical-align="bottom" horizontal-align="left" tabindex=-1>
+          <h2>Refits on scroll</h2>
+          <button onclick="refitOnScroll.close()">Close this</button>
+        </simple-overlay>
+      </span>
+      <span>
+        <button onclick="cancelOnScroll.open()">cancels on scroll</button>
+        <simple-overlay id="cancelOnScroll" scroll-action="cancel" no-overlap
+                        vertical-align="bottom" horizontal-align="left" tabindex=-1>
+          <h2>Cancels on scroll</h2>
+          <button onclick="cancelOnScroll.close()">Close this</button>
+        </simple-overlay>
+      </span>
+    </template>
+  </demo-snippet>
+
 </body>
 
 </html>
\ No newline at end of file
diff --git a/polymer_2.0.2/bower_components/iron-overlay-behavior/iron-overlay-behavior.html b/polymer_2.0.2/bower_components/iron-overlay-behavior/iron-overlay-behavior.html
index ae085c5..cf61639 100644
--- a/polymer_2.0.2/bower_components/iron-overlay-behavior/iron-overlay-behavior.html
+++ b/polymer_2.0.2/bower_components/iron-overlay-behavior/iron-overlay-behavior.html
@@ -12,6 +12,7 @@
 <link rel="import" href="../iron-fit-behavior/iron-fit-behavior.html">
 <link rel="import" href="../iron-resizable-behavior/iron-resizable-behavior.html">
 <link rel="import" href="iron-overlay-manager.html">
+<link rel="import" href="iron-scroll-manager.html">
 <link rel="import" href="iron-focusables-helper.html">
 
 <script>
@@ -97,6 +98,15 @@
       },
 
       /**
+       * Set to true to allow clicks to go through overlays. 
+       * When the user clicks outside this overlay, the click may
+       * close the overlay below.
+       */
+      allowClickThrough: {
+        type: Boolean
+      },
+
+      /**
        * Set to true to keep overlay always on top.
        */
       alwaysOnTop: {
@@ -104,6 +114,17 @@
       },
 
       /**
+       * Determines which action to perform when scroll outside an opened overlay happens.
+       * Possible values:
+       * lock - blocks scrolling from happening,
+       * refit - computes the new position on the overlay
+       * cancel - causes the overlay to close
+       */
+      scrollAction: {
+        type: String
+      },
+
+      /**
        * Shortcut to access to the overlay manager.
        * @private
        * @type {Polymer.IronOverlayManagerClass}
@@ -127,6 +148,10 @@
       'iron-resize': '_onIronResize'
     },
 
+    observers: [
+      '__updateScrollObservers(isAttached, opened, scrollAction)'
+    ],
+
     /**
      * The backdrop element.
      * @type {Element}
@@ -165,10 +190,15 @@
       this.__shouldRemoveTabIndex = false;
       // Used for wrapping the focus on TAB / Shift+TAB.
       this.__firstFocusableNode = this.__lastFocusableNode = null;
-      // Used by __onNextAnimationFrame to cancel any previous callback.
-      this.__raf = null;
+      // Used by to keep track of the RAF callbacks.
+      this.__rafs = {};
       // Focused node before overlay gets opened. Can be restored on close.
       this.__restoreFocusNode = null;
+      // Scroll info to be restored.
+      this.__scrollTop = this.__scrollLeft = null;
+      this.__onCaptureScroll = this.__onCaptureScroll.bind(this);
+      // Root nodes hosting the overlay, used to listen for scroll events on them.
+      this.__rootNodes = null;
       this._ensureSetup();
     },
 
@@ -183,11 +213,25 @@
     detached: function() {
       Polymer.dom(this).unobserveNodes(this._observer);
       this._observer = null;
-      if (this.__raf) {
-        window.cancelAnimationFrame(this.__raf);
-        this.__raf = null;
+      for (var cb in this.__rafs) {
+        if (this.__rafs[cb] !== null) {
+          cancelAnimationFrame(this.__rafs[cb]);
+        }
       }
+      this.__rafs = {};
       this._manager.removeOverlay(this);
+
+      // We got detached while animating, ensure we show/hide the overlay
+      // and fire iron-overlay-opened/closed event!
+      if (this.__isAnimating) {
+        if (this.opened) {
+          this._finishRenderOpened();
+        } else {
+          // Restore the focus if necessary.
+          this._applyFocus();
+          this._finishRenderClosed();
+        }
+      }
     },
 
     /**
@@ -265,8 +309,8 @@
 
       this.__isAnimating = true;
 
-      // Use requestAnimationFrame for non-blocking rendering.
-      this.__onNextAnimationFrame(this.__openedChanged);
+      // Deraf for non-blocking rendering.
+      this.__deraf('__openedChanged', this.__openedChanged);
     },
 
     _canceledChanged: function() {
@@ -387,7 +431,16 @@
         this._focusedChild = null;
         // Restore focus.
         if (this.restoreFocusOnClose && this.__restoreFocusNode) {
-          this.__restoreFocusNode.focus();
+          // If the activeElement is `<body>` or inside the overlay,
+          // we are allowed to restore the focus. In all the other
+          // cases focus might have been moved elsewhere by another
+          // component or by an user interaction (e.g. click on a
+          // button outside the overlay).
+          var activeElement = this._manager.deepActiveElement;
+          if (activeElement === document.body ||
+            Polymer.dom(this).deepContains(activeElement)) {
+            this.__restoreFocusNode.focus();
+          }
         }
         this.__restoreFocusNode = null;
         // If many overlays get closed at the same time, one of them would still
@@ -496,7 +549,7 @@
      */
     _onIronResize: function() {
       if (this.opened && !this.__isAnimating) {
-        this.__onNextAnimationFrame(this.refit);
+        this.__deraf('refit', this.refit);
       }
     },
 
@@ -549,23 +602,152 @@
     },
 
     /**
-     * Executes a callback on the next animation frame, overriding any previous
-     * callback awaiting for the next animation frame. e.g.
-     * `__onNextAnimationFrame(callback1) && __onNextAnimationFrame(callback2)`;
-     * `callback1` will never be invoked.
-     * @param {!Function} callback Its `this` parameter is the overlay itself.
+     * Debounces the execution of a callback to the next animation frame.
+     * @param {!string} jobname
+     * @param {!Function} callback Always bound to `this`
      * @private
      */
-    __onNextAnimationFrame: function(callback) {
-      if (this.__raf) {
-        window.cancelAnimationFrame(this.__raf);
+    __deraf: function(jobname, callback) {
+      var rafs = this.__rafs;
+      if (rafs[jobname] !== null) {
+        cancelAnimationFrame(rafs[jobname]);
       }
-      var self = this;
-      this.__raf = window.requestAnimationFrame(function nextAnimationFrame() {
-        self.__raf = null;
-        callback.call(self);
-      });
-    }
+      rafs[jobname] = requestAnimationFrame(function nextAnimationFrame() {
+        rafs[jobname] = null;
+        callback.call(this);
+      }.bind(this));
+    },
+
+    /**
+     * @param {boolean} isAttached
+     * @param {boolean} opened
+     * @param {string=} scrollAction
+     * @private
+     */
+    __updateScrollObservers: function(isAttached, opened, scrollAction) {
+      if (!isAttached || !opened || !this.__isValidScrollAction(scrollAction)) {
+        Polymer.IronScrollManager.removeScrollLock(this);
+        this.__removeScrollListeners();
+      } else {
+        if (scrollAction === 'lock') {
+          this.__saveScrollPosition();
+          Polymer.IronScrollManager.pushScrollLock(this);
+        }
+        this.__addScrollListeners();
+      }
+    },
+    
+    /**
+     * @private
+     */
+    __addScrollListeners: function() {
+      if (!this.__rootNodes) {
+        this.__rootNodes = [];
+        // Listen for scroll events in all shadowRoots hosting this overlay only
+        // when in native ShadowDOM.
+        if ('attachShadow' in Element.prototype && 'getRootNode' in Element.prototype) {
+          var node = this;
+          while (node) {
+            if (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE && node.host) {
+              this.__rootNodes.push(node);
+            }
+            node = node.host || node.assignedSlot || node.parentNode;
+          }
+        }
+        this.__rootNodes.push(document);
+      }
+      this.__rootNodes.forEach(function(el) {
+        el.addEventListener('scroll', this.__onCaptureScroll, {
+          capture: true,
+          passive: true,
+        });
+      }, this);
+    },
+    
+    /**
+     * @private
+     */
+    __removeScrollListeners: function() {
+      if (this.__rootNodes) {
+        this.__rootNodes.forEach(function(el) {
+          el.removeEventListener('scroll', this.__onCaptureScroll, {
+            capture: true,
+            passive: true,
+          });
+        }, this);
+      }
+      if (!this.isAttached) {
+        this.__rootNodes = null;
+      }
+    },
+
+    /**
+     * @param {string=} scrollAction
+     * @return {boolean}
+     * @private
+     */
+    __isValidScrollAction: function(scrollAction) {
+      return scrollAction === 'lock' ||
+             scrollAction === 'refit' ||
+             scrollAction === 'cancel';
+    },
+
+    /**
+     * @private
+     */
+    __onCaptureScroll: function(event) {
+      if (this.__isAnimating) {
+        return;
+      }
+      // Check if scroll outside the overlay.
+      if (Polymer.dom(event).path.indexOf(this) >= 0) {
+        return;
+      }
+      switch (this.scrollAction) {
+        case 'lock':
+          // NOTE: scrolling might happen if a scroll event is not cancellable, or if
+          // user pressed keys that cause scrolling (they're not prevented in order not to
+          // break a11y features like navigate with arrow keys).
+          this.__restoreScrollPosition();
+          break;
+        case 'refit':
+          this.__deraf('refit', this.refit);
+          break;
+        case 'cancel':
+          this.cancel(event);
+          break;
+      }
+    },
+
+    /**
+     * Memoizes the scroll position of the outside scrolling element.
+     * @private
+     */
+    __saveScrollPosition: function() {
+      if (document.scrollingElement) {
+        this.__scrollTop = document.scrollingElement.scrollTop;
+        this.__scrollLeft = document.scrollingElement.scrollLeft;
+      } else {
+        // Since we don't know if is the body or html, get max.
+        this.__scrollTop = Math.max(document.documentElement.scrollTop, document.body.scrollTop);
+        this.__scrollLeft = Math.max(document.documentElement.scrollLeft, document.body.scrollLeft);
+      }
+    },
+
+    /**
+     * Resets the scroll position of the outside scrolling element.
+     * @private
+     */
+    __restoreScrollPosition: function() {
+      if (document.scrollingElement) {
+        document.scrollingElement.scrollTop = this.__scrollTop;
+        document.scrollingElement.scrollLeft = this.__scrollLeft;
+      } else {
+        // Since we don't know if is the body or html, set both.
+        document.documentElement.scrollTop = document.body.scrollTop = this.__scrollTop;
+        document.documentElement.scrollLeft = document.body.scrollLeft = this.__scrollLeft;
+      }
+    },
 
   };
 
diff --git a/polymer_2.0.2/bower_components/iron-overlay-behavior/iron-overlay-manager.html b/polymer_2.0.2/bower_components/iron-overlay-behavior/iron-overlay-manager.html
index fa7e500..8598bfc 100644
--- a/polymer_2.0.2/bower_components/iron-overlay-behavior/iron-overlay-manager.html
+++ b/polymer_2.0.2/bower_components/iron-overlay-behavior/iron-overlay-manager.html
@@ -13,7 +13,6 @@
 <link rel="import" href="iron-overlay-backdrop.html">
 
 <script>
-
   /**
    * @struct
    * @constructor
@@ -44,7 +43,9 @@
     // of an overlay via event.stopPropagation(). The only way to prevent
     // closing of an overlay should be through its APIs.
     // NOTE: enable tap on <html> to workaround Polymer/polymer#4459
-    Polymer.Gestures.add(document.documentElement, 'tap', null);
+    // Pass no-op function because MSEdge 15 doesn't handle null as 2nd argument
+    // https://github.com/Microsoft/ChakraCore/issues/3863
+    Polymer.Gestures.add(document.documentElement, 'tap', function() {});
     document.addEventListener('tap', this._onCaptureClick.bind(this), true);
     document.addEventListener('focus', this._onCaptureFocus.bind(this), true);
     document.addEventListener('keydown', this._onCaptureKeyDown.bind(this), true);
@@ -70,10 +71,14 @@
      * @type {!Element} activeElement the active element
      */
     get deepActiveElement() {
+      var active = document.activeElement;
       // document.activeElement can be null
       // https://developer.mozilla.org/en-US/docs/Web/API/Document/activeElement
-      // In case of null, default it to document.body.
-      var active = document.activeElement || document.body;
+      // In IE 11, it can also be an object when operating in iframes.
+      // In these cases, default it to document.body.
+      if (!active || active instanceof Element === false) {
+        active = document.body;
+      }
       while (active.root && Polymer.dom(active.root).activeElement) {
         active = Polymer.dom(active.root).activeElement;
       }
@@ -248,12 +253,12 @@
     },
 
     /**
-     * Returns the first opened overlay that has a backdrop.
+     * Returns the top opened overlay that has a backdrop.
      * @return {Element|undefined}
      * @private
      */
     _overlayWithBackdrop: function() {
-      for (var i = 0; i < this._overlays.length; i++) {
+      for (var i = this._overlays.length - 1; i >= 0; i--) {
         if (this._overlays[i].withBackdrop) {
           return this._overlays[i];
         }
@@ -318,10 +323,18 @@
      * @private
      */
     _onCaptureClick: function(event) {
-      var overlay = /** @type {?} */ (this.currentOverlay());
-      // Check if clicked outside of top overlay.
-      if (overlay && this._overlayInPath(Polymer.dom(event).path) !== overlay) {
+      var i = this._overlays.length - 1;
+      if (i === -1) return;
+      var path = Polymer.dom(event).path;
+      var overlay;
+      // Check if clicked outside of overlay.
+      while ((overlay = /** @type {?} */ (this._overlays[i])) && this._overlayInPath(path) !== overlay) {
         overlay._onCaptureClick(event);
+        if (overlay.allowClickThrough) {
+          i--;
+        } else {
+          break;
+        }
       }
     },
 
diff --git a/polymer_2.0.2/bower_components/iron-overlay-behavior/iron-scroll-manager.html b/polymer_2.0.2/bower_components/iron-overlay-behavior/iron-scroll-manager.html
new file mode 100644
index 0000000..2c34a36
--- /dev/null
+++ b/polymer_2.0.2/bower_components/iron-overlay-behavior/iron-scroll-manager.html
@@ -0,0 +1,381 @@
+<!--
+@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
+-->
+
+<link rel="import" href="../polymer/polymer.html">
+
+<script>
+  (function() {
+    'use strict';
+    /**
+     * Used to calculate the scroll direction during touch events.
+     * @type {!Object}
+     */
+    var lastTouchPosition = {
+      pageX: 0,
+      pageY: 0
+    };
+    /**
+     * Used to avoid computing event.path and filter scrollable nodes (better perf).
+     * @type {?EventTarget}
+     */
+    var lastRootTarget = null;
+    /**
+     * @type {!Array<Node>}
+     */
+    var lastScrollableNodes = [];
+    /**
+     * @type {!Array<string>}
+     */
+    var scrollEvents = [
+      // Modern `wheel` event for mouse wheel scrolling:
+      'wheel',
+      // Older, non-standard `mousewheel` event for some FF:
+      'mousewheel',
+      // IE:
+      'DOMMouseScroll',
+      // Touch enabled devices
+      'touchstart',
+      'touchmove'
+    ];
+
+    /**
+     * The IronScrollManager is intended to provide a central source
+     * of authority and control over which elements in a document are currently
+     * allowed to scroll.
+     */
+
+    Polymer.IronScrollManager = {
+
+      /**
+       * The current element that defines the DOM boundaries of the
+       * scroll lock. This is always the most recently locking element.
+       */
+      get currentLockingElement() {
+        return this._lockingElements[this._lockingElements.length - 1];
+      },
+
+      /**
+       * Returns true if the provided element is "scroll locked", which is to
+       * say that it cannot be scrolled via pointer or keyboard interactions.
+       *
+       * @param {HTMLElement} element An HTML element instance which may or may
+       * not be scroll locked.
+       */
+      elementIsScrollLocked: function(element) {
+        var currentLockingElement = this.currentLockingElement;
+
+        if (currentLockingElement === undefined)
+          return false;
+
+        var scrollLocked;
+
+        if (this._hasCachedLockedElement(element)) {
+          return true;
+        }
+
+        if (this._hasCachedUnlockedElement(element)) {
+          return false;
+        }
+
+        scrollLocked = !!currentLockingElement &&
+          currentLockingElement !== element &&
+          !this._composedTreeContains(currentLockingElement, element);
+
+        if (scrollLocked) {
+          this._lockedElementCache.push(element);
+        } else {
+          this._unlockedElementCache.push(element);
+        }
+
+        return scrollLocked;
+      },
+
+      /**
+       * Push an element onto the current scroll lock stack. The most recently
+       * pushed element and its children will be considered scrollable. All
+       * other elements will not be scrollable.
+       *
+       * Scroll locking is implemented as a stack so that cases such as
+       * dropdowns within dropdowns are handled well.
+       *
+       * @param {HTMLElement} element The element that should lock scroll.
+       */
+      pushScrollLock: function(element) {
+        // Prevent pushing the same element twice
+        if (this._lockingElements.indexOf(element) >= 0) {
+          return;
+        }
+
+        if (this._lockingElements.length === 0) {
+          this._lockScrollInteractions();
+        }
+
+        this._lockingElements.push(element);
+
+        this._lockedElementCache = [];
+        this._unlockedElementCache = [];
+      },
+
+      /**
+       * Remove an element from the scroll lock stack. The element being
+       * removed does not need to be the most recently pushed element. However,
+       * the scroll lock constraints only change when the most recently pushed
+       * element is removed.
+       *
+       * @param {HTMLElement} element The element to remove from the scroll
+       * lock stack.
+       */
+      removeScrollLock: function(element) {
+        var index = this._lockingElements.indexOf(element);
+
+        if (index === -1) {
+          return;
+        }
+
+        this._lockingElements.splice(index, 1);
+
+        this._lockedElementCache = [];
+        this._unlockedElementCache = [];
+
+        if (this._lockingElements.length === 0) {
+          this._unlockScrollInteractions();
+        }
+      },
+
+      _lockingElements: [],
+
+      _lockedElementCache: null,
+
+      _unlockedElementCache: null,
+
+      _hasCachedLockedElement: function(element) {
+        return this._lockedElementCache.indexOf(element) > -1;
+      },
+
+      _hasCachedUnlockedElement: function(element) {
+        return this._unlockedElementCache.indexOf(element) > -1;
+      },
+
+      _composedTreeContains: function(element, child) {
+        // NOTE(cdata): This method iterates over content elements and their
+        // corresponding distributed nodes to implement a contains-like method
+        // that pierces through the composed tree of the ShadowDOM. Results of
+        // this operation are cached (elsewhere) on a per-scroll-lock basis, to
+        // guard against potentially expensive lookups happening repeatedly as
+        // a user scrolls / touchmoves.
+        var contentElements;
+        var distributedNodes;
+        var contentIndex;
+        var nodeIndex;
+
+        if (element.contains(child)) {
+          return true;
+        }
+
+        contentElements = Polymer.dom(element).querySelectorAll('content,slot');
+
+        for (contentIndex = 0; contentIndex < contentElements.length; ++contentIndex) {
+
+          distributedNodes = Polymer.dom(contentElements[contentIndex]).getDistributedNodes();
+
+          for (nodeIndex = 0; nodeIndex < distributedNodes.length; ++nodeIndex) {
+            // Polymer 2.x returns slot.assignedNodes which can contain text nodes.
+            if (distributedNodes[nodeIndex].nodeType !== Node.ELEMENT_NODE) continue;
+
+            if (this._composedTreeContains(distributedNodes[nodeIndex], child)) {
+              return true;
+            }
+          }
+        }
+
+        return false;
+      },
+
+      _scrollInteractionHandler: function(event) {
+        // Avoid canceling an event with cancelable=false, e.g. scrolling is in
+        // progress and cannot be interrupted.
+        if (event.cancelable && this._shouldPreventScrolling(event)) {
+          event.preventDefault();
+        }
+        // If event has targetTouches (touch event), update last touch position.
+        if (event.targetTouches) {
+          var touch = event.targetTouches[0];
+          lastTouchPosition.pageX = touch.pageX;
+          lastTouchPosition.pageY = touch.pageY;
+        }
+      },
+
+      _lockScrollInteractions: function() {
+        this._boundScrollHandler = this._boundScrollHandler ||
+          this._scrollInteractionHandler.bind(this);
+        for (var i = 0, l = scrollEvents.length; i < l; i++) {
+          // NOTE: browsers that don't support objects as third arg will
+          // interpret it as boolean, hence useCapture = true in this case. 
+          document.addEventListener(scrollEvents[i], this._boundScrollHandler, {
+            capture: true,
+            passive: false
+          });
+        }
+      },
+
+      _unlockScrollInteractions: function() {
+        for (var i = 0, l = scrollEvents.length; i < l; i++) {
+          // NOTE: browsers that don't support objects as third arg will
+          // interpret it as boolean, hence useCapture = true in this case.
+          document.removeEventListener(scrollEvents[i], this._boundScrollHandler, {
+            capture: true,
+            passive: false
+          });
+        }
+      },
+
+      /**
+       * Returns true if the event causes scroll outside the current locking
+       * element, e.g. pointer/keyboard interactions, or scroll "leaking"
+       * outside the locking element when it is already at its scroll boundaries.
+       * @param {!Event} event
+       * @return {boolean}
+       * @private
+       */
+      _shouldPreventScrolling: function(event) {
+
+        // Update if root target changed. For touch events, ensure we don't
+        // update during touchmove.
+        var target = Polymer.dom(event).rootTarget;
+        if (event.type !== 'touchmove' && lastRootTarget !== target) {
+          lastRootTarget = target;
+          lastScrollableNodes = this._getScrollableNodes(Polymer.dom(event).path);
+        }
+
+        // Prevent event if no scrollable nodes.
+        if (!lastScrollableNodes.length) {
+          return true;
+        }
+        // Don't prevent touchstart event inside the locking element when it has
+        // scrollable nodes.
+        if (event.type === 'touchstart') {
+          return false;
+        }
+        // Get deltaX/Y.
+        var info = this._getScrollInfo(event);
+        // Prevent if there is no child that can scroll.
+        return !this._getScrollingNode(lastScrollableNodes, info.deltaX, info.deltaY);
+      },
+
+      /**
+       * Returns an array of scrollable nodes up to the current locking element,
+       * which is included too if scrollable.
+       * @param {!Array<Node>} nodes
+       * @return {Array<Node>} scrollables
+       * @private
+       */
+      _getScrollableNodes: function(nodes) {
+        var scrollables = [];
+        var lockingIndex = nodes.indexOf(this.currentLockingElement);
+        // Loop from root target to locking element (included).
+        for (var i = 0; i <= lockingIndex; i++) {
+          // Skip non-Element nodes.
+          if (nodes[i].nodeType !== Node.ELEMENT_NODE) {
+            continue;
+          }
+          var node = /** @type {!Element} */ (nodes[i]);
+          // Check inline style before checking computed style.
+          var style = node.style;
+          if (style.overflow !== 'scroll' && style.overflow !== 'auto') {
+            style = window.getComputedStyle(node);
+          }
+          if (style.overflow === 'scroll' || style.overflow === 'auto') {
+            scrollables.push(node);
+          }
+        }
+        return scrollables;
+      },
+
+      /**
+       * Returns the node that is scrolling. If there is no scrolling,
+       * returns undefined.
+       * @param {!Array<Node>} nodes
+       * @param {number} deltaX Scroll delta on the x-axis
+       * @param {number} deltaY Scroll delta on the y-axis
+       * @return {Node|undefined}
+       * @private
+       */
+      _getScrollingNode: function(nodes, deltaX, deltaY) {
+        // No scroll.
+        if (!deltaX && !deltaY) {
+          return;
+        }
+        // Check only one axis according to where there is more scroll.
+        // Prefer vertical to horizontal.
+        var verticalScroll = Math.abs(deltaY) >= Math.abs(deltaX);
+        for (var i = 0; i < nodes.length; i++) {
+          var node = nodes[i];
+          var canScroll = false;
+          if (verticalScroll) {
+            // delta < 0 is scroll up, delta > 0 is scroll down.
+            canScroll = deltaY < 0 ? node.scrollTop > 0 :
+              node.scrollTop < node.scrollHeight - node.clientHeight;
+          } else {
+            // delta < 0 is scroll left, delta > 0 is scroll right.
+            canScroll = deltaX < 0 ? node.scrollLeft > 0 :
+              node.scrollLeft < node.scrollWidth - node.clientWidth;
+          }
+          if (canScroll) {
+            return node;
+          }
+        }
+      },
+
+      /**
+       * Returns scroll `deltaX` and `deltaY`.
+       * @param {!Event} event The scroll event
+       * @return {{deltaX: number, deltaY: number}} Object containing the
+       * x-axis scroll delta (positive: scroll right, negative: scroll left,
+       * 0: no scroll), and the y-axis scroll delta (positive: scroll down,
+       * negative: scroll up, 0: no scroll).
+       * @private
+       */
+      _getScrollInfo: function(event) {
+        var info = {
+          deltaX: event.deltaX,
+          deltaY: event.deltaY
+        };
+        // Already available.
+        if ('deltaX' in event) {
+          // do nothing, values are already good.
+        }
+        // Safari has scroll info in `wheelDeltaX/Y`.
+        else if ('wheelDeltaX' in event && 'wheelDeltaY' in event) {
+          info.deltaX = -event.wheelDeltaX;
+          info.deltaY = -event.wheelDeltaY;
+        }
+        // IE10 has only vertical scroll info in `wheelDelta`.
+        else if ('wheelDelta' in event) {
+          info.deltaX = 0;
+          info.deltaY = -event.wheelDelta;
+        }
+        // Firefox has scroll info in `detail` and `axis`.
+        else if ('axis' in event) {
+          info.deltaX = event.axis === 1 ? event.detail : 0;
+          info.deltaY = event.axis === 2 ? event.detail : 0;
+        }
+        // On mobile devices, calculate scroll direction.
+        else if (event.targetTouches) {
+          var touch = event.targetTouches[0];
+          // Touch moves from right to left => scrolling goes right.
+          info.deltaX = lastTouchPosition.pageX - touch.pageX;
+          // Touch moves from down to up => scrolling goes down.
+          info.deltaY = lastTouchPosition.pageY - touch.pageY;
+        }
+        return info;
+      }
+    };
+  })();
+</script>
\ No newline at end of file
diff --git a/polymer_2.0.2/bower_components/iron-overlay-behavior/test/index.html b/polymer_2.0.2/bower_components/iron-overlay-behavior/test/index.html
index 97e9bf9..ac4532c 100644
--- a/polymer_2.0.2/bower_components/iron-overlay-behavior/test/index.html
+++ b/polymer_2.0.2/bower_components/iron-overlay-behavior/test/index.html
@@ -24,9 +24,13 @@
         'iron-overlay-behavior.html?wc-shadydom=true&wc-ce=true', //shady
         'iron-focusables-helper.html?wc-shadydom=true&wc-ce=true', //shady
         'iron-overlay-backdrop.html?wc-shadydom=true&wc-ce=true', //shady
+        'iron-scroll-manager.html?wc-shadydom=true&wc-ce=true', //shady
+        'iron-overlay-behavior-scroll-actions.html?wc-shadydom=true&wc-ce=true', //shady
         'iron-overlay-behavior.html?dom=shadow', //shadow
         'iron-focusables-helper.html?dom=shadow', //shadow
         'iron-overlay-backdrop.html?dom=shadow', //shadow
+        'iron-scroll-manager.html?dom=shadow', //shadow
+        'iron-overlay-behavior-scroll-actions.html?dom=shadow', //shadow
       ]);
     </script>
 
diff --git a/polymer_2.0.2/bower_components/iron-overlay-behavior/test/iron-overlay-behavior-scroll-actions.html b/polymer_2.0.2/bower_components/iron-overlay-behavior/test/iron-overlay-behavior-scroll-actions.html
new file mode 100644
index 0000000..b14a7e3
--- /dev/null
+++ b/polymer_2.0.2/bower_components/iron-overlay-behavior/test/iron-overlay-behavior-scroll-actions.html
@@ -0,0 +1,360 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 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>iron-overlay-behavior tests</title>
+
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+  <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+
+  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+
+  <script src="../../web-component-tester/browser.js"></script>
+  <link rel="import" href="test-overlay.html">
+  <link rel="import" href="test-scrollable.html">
+
+</head>
+
+<body>
+
+  <style>
+    .scrollable {
+      overflow: auto;
+      width: 200px;
+      height: 200px;
+    }
+
+    .big {
+      width: 150vmax;
+      height: 150vmax;
+    }
+  </style>
+
+  <div class="big">
+    This element makes the page scrollable.
+  </div>
+
+  <test-fixture id="basic">
+    <template>
+      <test-overlay class="scrollable">
+        <div class="big">
+          This element makes the overlay scrollable.
+        </div>
+      </test-overlay>
+    </template>
+  </test-fixture>
+
+  <test-fixture id="scrollable">
+    <template>
+      <test-scrollable>
+        <div slot="scrollable-content" class="big">
+          This element makes the overlay scrollable.
+          <test-overlay>Overlay in light dom</test-overlay>
+        </div>
+        <div slot="overlay-content" class="big">Overlay in shadow root</div>
+      </test-scrollable>
+    </template>
+  </test-fixture>
+
+  <script>
+    // Need to discover if html or body is scrollable.
+    // Here we are sure the page is scrollable.
+    var scrollTarget;
+    document.documentElement.scrollTop = 1;
+    if (document.documentElement.scrollTop === 1) {
+      document.documentElement.scrollTop = 0;
+      scrollTarget = document.documentElement;
+    } else {
+      scrollTarget = document.body;
+    }
+
+    function runAfterOpen(overlay, callback) {
+      overlay.addEventListener('iron-overlay-opened', callback);
+      overlay.open();
+    }
+
+    function runAfterClose(overlay, callback) {
+      overlay.addEventListener('iron-overlay-closed', callback);
+      overlay.close();
+    }
+
+    function fireWheel(node, deltaX, deltaY) {
+      // IE 11 doesn't support WheelEvent, use CustomEvent.
+      var event = new CustomEvent('wheel', {
+        cancelable: true,
+        bubbles: true,
+        composed: true,
+      });
+      event.deltaX = deltaX;
+      event.deltaY = deltaY;
+      node.dispatchEvent(event);
+      return event;
+    }
+
+    function dispatchScroll(target, scrollLeft, scrollTop) {
+      target.scrollLeft = scrollLeft;
+      target.scrollTop = scrollTop;
+      target.dispatchEvent(new CustomEvent('scroll', {
+        bubbles: true,
+        composed: false
+      }));
+    }
+
+    suite('scroll actions', function() {
+
+      var overlay;
+      setup(function() {
+        // Ensure we always scroll to top.
+        dispatchScroll(scrollTarget, 0, 0);
+        overlay = fixture('basic');
+      });
+
+      test('default: outside scroll not prevented', function(done) {
+        runAfterOpen(overlay, function() {
+          assert.isFalse(Polymer.IronScrollManager.elementIsScrollLocked(scrollTarget));
+          assert.isFalse(fireWheel(scrollTarget, 0, 10).defaultPrevented);
+          dispatchScroll(scrollTarget, 0, 10);
+          Polymer.RenderStatus.afterNextRender(overlay, function() {
+            assert.equal(scrollTarget.scrollTop, 10, 'scrollTop ok');
+            assert.equal(scrollTarget.scrollLeft, 0, 'scrollLeft ok');
+            done();
+          });
+        });
+      });
+
+      test('default: outside scroll does NOT trigger refit', function(done) {
+        runAfterOpen(overlay, function() {
+          var refitSpy = sinon.spy(overlay, 'refit');
+          dispatchScroll(scrollTarget, 0, 10);
+          Polymer.RenderStatus.afterNextRender(overlay, function() {
+            assert.equal(refitSpy.callCount, 0, 'did not refit on scroll');
+            done();
+          });
+        });
+      });
+
+      test('refit scrollAction does NOT refit the overlay on scroll inside', function(done) {
+        overlay.scrollAction = 'refit';
+        runAfterOpen(overlay, function() {
+          // Wait a tick, otherwise this fails in FF/Safari.
+          setTimeout(function() {
+            var refitSpy = sinon.spy(overlay, 'refit');
+            dispatchScroll(overlay, 0, 10);
+            Polymer.RenderStatus.afterNextRender(overlay, function() {
+              assert.equal(refitSpy.callCount, 0, 'did not refit on scroll inside');
+              done();
+            });
+          });
+        });
+      });
+
+      test('refit scrollAction refits the overlay on scroll outside', function(done) {
+        overlay.scrollAction = 'refit';
+        runAfterOpen(overlay, function() {
+          var refitSpy = sinon.spy(overlay, 'refit');
+          dispatchScroll(scrollTarget, 0, 10);
+          Polymer.RenderStatus.afterNextRender(overlay, function() {
+            assert.notEqual(refitSpy.callCount, 0, 'did refit on scroll outside');
+            done();
+          });
+        });
+      });
+
+      test('cancel scrollAction does NOT close the overlay on scroll inside', function(done) {
+        overlay.scrollAction = 'cancel';
+        runAfterOpen(overlay, function() {
+          dispatchScroll(overlay, 0, 10);
+          assert.isTrue(overlay.opened, 'overlay was not closed');
+          done();
+        });
+      });
+
+      test('cancel scrollAction closes the overlay on scroll outside', function(done) {
+        overlay.scrollAction = 'cancel';
+        runAfterOpen(overlay, function() {
+          overlay.addEventListener('iron-overlay-canceled', function(event) {
+            assert.equal(event.detail.type, 'scroll', 'detail contains original event');
+            assert.equal(event.detail.target, scrollTarget, 'original scroll event target ok');
+            overlay.addEventListener('iron-overlay-closed', function() {
+              done();
+            });
+          });
+          dispatchScroll(scrollTarget, 0, 10);
+        });
+      });
+
+      test('lock scrollAction locks scroll', function(done) {
+        overlay.scrollAction = 'lock';
+        runAfterOpen(overlay, function() {
+          assert.isTrue(Polymer.IronScrollManager.elementIsScrollLocked(scrollTarget));
+          assert.isTrue(fireWheel(scrollTarget, 0, 10).defaultPrevented);
+          dispatchScroll(scrollTarget, 0, 10);
+          assert.equal(scrollTarget.scrollTop, 0, 'scrollTop ok');
+          assert.equal(scrollTarget.scrollLeft, 0, 'scrollLeft ok');
+          done();
+        });
+      });
+
+      test('should lock, only once', function(done) {
+        var openCount = 0;
+        overlay.scrollAction = 'lock';
+        runAfterOpen(overlay, function() {
+          assert.isTrue(Polymer.IronScrollManager.elementIsScrollLocked(scrollTarget));
+          assert.isTrue(fireWheel(scrollTarget, 0, 10).defaultPrevented);
+          assert.equal(Polymer.IronScrollManager._lockingElements.length, 1);
+          if (openCount === 0) {
+            // This triggers a second `pushScrollLock` with the same element, however
+            // that should not add the element to the `_lockingElements` stack twice
+            runAfterClose(overlay, function() {
+              assert.isFalse(Polymer.IronScrollManager.elementIsScrollLocked(overlay));
+              assert.isFalse(fireWheel(scrollTarget, 0, 10).defaultPrevented);
+              overlay.open();
+            });
+          } else {
+            done();
+          }
+          openCount++;
+        });
+      });
+
+    });
+
+    suite('scroll actions in shadow root', function() {
+
+      var scrollable, overlay;
+      setup(function() {
+        var f = fixture('scrollable');
+        scrollable = f.$.scrollable;
+        overlay = f.$.overlay;
+      });
+
+      test('refit scrollAction does NOT refit the overlay on scroll inside', function(done) {
+        overlay.scrollAction = 'refit';
+        runAfterOpen(overlay, function() {
+          var refitSpy = sinon.spy(overlay, 'refit');
+          dispatchScroll(overlay, 0, 10);
+          Polymer.RenderStatus.afterNextRender(overlay, function() {
+            assert.equal(refitSpy.callCount, 0, 'did not refit on scroll inside');
+            done();
+          });
+        });
+      });
+
+      test('refit scrollAction refits the overlay on scroll outside', function(done) {
+        overlay.scrollAction = 'refit';
+        runAfterOpen(overlay, function() {
+          var refitSpy = sinon.spy(overlay, 'refit');
+          dispatchScroll(scrollable, 0, 10);
+          Polymer.RenderStatus.afterNextRender(overlay, function() {
+            assert.notEqual(refitSpy.callCount, 0, 'did refit on scroll outside');
+            done();
+          });
+        });
+      });
+
+      test('cancel scrollAction does NOT close the overlay on scroll inside', function(done) {
+        overlay.scrollAction = 'cancel';
+        runAfterOpen(overlay, function() {
+          dispatchScroll(overlay, 0, 10);
+          assert.isTrue(overlay.opened, 'overlay was not closed');
+          done();
+        });
+      });
+
+      test('cancel scrollAction closes the overlay on scroll outside', function(done) {
+        overlay.scrollAction = 'cancel';
+        runAfterOpen(overlay, function() {
+          overlay.addEventListener('iron-overlay-canceled', function(event) {
+            assert.equal(event.detail.type, 'scroll', 'detail contains original event');
+            // In Polymer 1.x with dom=shadow, triggering a scroll event on a node inside a shadowRoot
+            // doesn't set the correct target, so we skip this check. 
+            if (Polymer.Element || !Polymer.Settings.useShadow) {
+              assert.equal(event.detail.target, scrollable, 'original scroll event target ok');
+            }
+            overlay.addEventListener('iron-overlay-closed', function() {
+              done();
+            });
+          });
+          dispatchScroll(scrollable, 0, 10);
+        });
+      });
+
+    });
+
+    suite('scroll actions in shadow root, overlay distributed', function() {
+
+      var scrollable, overlay;
+      setup(function() {
+        var f = fixture('scrollable');
+        scrollable = f.$.scrollable;
+        overlay = Polymer.dom(f).querySelector('test-overlay');
+      });
+
+      test('refit scrollAction does NOT refit the overlay on scroll inside', function(done) {
+        overlay.scrollAction = 'refit';
+        runAfterOpen(overlay, function() {
+          var refitSpy = sinon.spy(overlay, 'refit');
+          dispatchScroll(overlay, 0, 10);
+          Polymer.RenderStatus.afterNextRender(overlay, function() {
+            assert.equal(refitSpy.callCount, 0, 'did not refit on scroll inside');
+            done();
+          });
+        });
+      });
+
+      test('refit scrollAction refits the overlay on scroll outside', function(done) {
+        overlay.scrollAction = 'refit';
+        runAfterOpen(overlay, function() {
+          var refitSpy = sinon.spy(overlay, 'refit');
+          dispatchScroll(scrollable, 0, 10);
+          Polymer.RenderStatus.afterNextRender(overlay, function() {
+            assert.notEqual(refitSpy.callCount, 0, 'did refit on scroll outside');
+            done();
+          });
+        });
+      });
+
+      test('cancel scrollAction does NOT close the overlay on scroll inside', function(done) {
+        overlay.scrollAction = 'cancel';
+        runAfterOpen(overlay, function() {
+          dispatchScroll(overlay, 0, 10);
+          assert.isTrue(overlay.opened, 'overlay was not closed');
+          done();
+        });
+      });
+
+      test('cancel scrollAction closes the overlay on scroll outside', function(done) {
+        overlay.scrollAction = 'cancel';
+        runAfterOpen(overlay, function() {
+          overlay.addEventListener('iron-overlay-canceled', function(event) {
+            assert.equal(event.detail.type, 'scroll', 'detail contains original event');
+            // In Polymer 1.x with dom=shadow, triggering a scroll event on a node inside a shadowRoot
+            // doesn't set the correct target, so we skip this check. 
+            if (Polymer.Element || !Polymer.Settings.useShadow) {
+              assert.equal(event.detail.target, scrollable, 'original scroll event target ok');
+            }
+            overlay.addEventListener('iron-overlay-closed', function() {
+              done();
+            });
+          });
+          dispatchScroll(scrollable, 0, 10);
+        });
+      });
+
+    });
+  </script>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/polymer_2.0.2/bower_components/iron-overlay-behavior/test/iron-overlay-behavior.html b/polymer_2.0.2/bower_components/iron-overlay-behavior/test/iron-overlay-behavior.html
index 4772b82..8a0cc0f 100644
--- a/polymer_2.0.2/bower_components/iron-overlay-behavior/test/iron-overlay-behavior.html
+++ b/polymer_2.0.2/bower_components/iron-overlay-behavior/test/iron-overlay-behavior.html
@@ -847,6 +847,34 @@
         });
       });
 
+      test('avoids restoring focus if focus changed', function(done) {
+        var button0 = document.getElementById('buttons').$.button0;
+        var button1 = document.getElementById('buttons').$.button1;
+        button0.focus();
+        runAfterOpen(overlay, function() {
+          button1.focus();
+          runAfterClose(overlay, function() {
+            assert.equal(Polymer.IronOverlayManager.deepActiveElement, button1,
+              'focus was not modified');
+            done();
+          });
+        });
+      });
+
+      test('focus restored if overlay detached before closing is done', function(done) {
+        var focusable = document.getElementById('focusInput');
+        focusable.focus();
+        runAfterOpen(overlay, function() {
+          // Close overlay and remove it from the DOM.
+          runAfterClose(overlay, function() {
+            assert.equal(Polymer.IronOverlayManager.deepActiveElement, focusable,
+              'focus restored to focusable');
+            done();
+          });
+          overlay.parentNode.removeChild(overlay);
+        });
+      });
+
     });
 
     suite('overlay with backdrop', function() {
@@ -888,7 +916,7 @@
 
       test('backdrop is removed when the element is removed from DOM', function(done) {
         runAfterOpen(overlay, function() {
-          Polymer.dom(overlay).parentNode.removeChild(overlay);
+          overlay.parentNode.removeChild(overlay);
           // Ensure detached is executed.
           Polymer.dom.flush();
           assert.isFalse(overlay.backdropElement.opened, 'backdrop is closed');
@@ -988,6 +1016,31 @@
         })
       });
 
+      test('allow-click-through allows overlay below to handle click', function(done) {
+        overlay2.allowClickThrough = true;
+        runAfterOpen(overlay1, function() {
+          runAfterOpen(overlay2, function() {
+            MockInteractions.tap(document.body);
+            assert.isFalse(overlay1.opened, 'overlay1 was closed');
+            assert.isFalse(overlay2.opened, 'overlay2 was closed');
+            done();
+          });
+        });
+      });
+
+      test('allow-click-through and no-cancel-on-outside-click combo', function(done) {
+        overlay2.allowClickThrough = true;
+        overlay2.noCancelOnOutsideClick = true;
+        runAfterOpen(overlay1, function() {
+          runAfterOpen(overlay2, function() {
+            MockInteractions.tap(document.body);
+            assert.isTrue(overlay2.opened, 'overlay2 still open');
+            assert.isFalse(overlay1.opened, 'overlay1 was closed');
+            done();
+          });
+        });
+      });
+
     });
 
     suite('Manager overlays in sync', function() {
@@ -1140,11 +1193,26 @@
       test('newest overlay appear on top', function(done) {
         runAfterOpen(overlay1, function() {
           runAfterOpen(overlay2, function() {
-            var styleZ = parseInt(window.getComputedStyle(overlay1).zIndex, 10);
-            var style1Z = parseInt(window.getComputedStyle(overlay2).zIndex, 10);
+            var style1Z = parseInt(window.getComputedStyle(overlay1).zIndex, 10);
+            var style2Z = parseInt(window.getComputedStyle(overlay2).zIndex, 10);
             var bgStyleZ = parseInt(window.getComputedStyle(overlay1.backdropElement).zIndex, 10);
-            assert.isTrue(style1Z > styleZ, 'overlay2 has higher z-index than overlay1');
-            assert.isTrue(styleZ > bgStyleZ, 'overlay1 has higher z-index than backdrop');
+            assert.isAbove(style2Z, style1Z, 'overlay2 above overlay1');
+            assert.isAbove(style2Z, bgStyleZ, 'overlay2 above backdrop');
+            assert.isBelow(style1Z, bgStyleZ, 'overlay1 below backdrop');
+            done();
+          });
+        });
+      });
+
+      test('updating with-backdrop updates z-index', function(done) {
+        runAfterOpen(overlay1, function() {
+          runAfterOpen(overlay2, function() {
+            overlay2.withBackdrop = false;
+            var style1Z = parseInt(window.getComputedStyle(overlay1).zIndex, 10);
+            var style2Z = parseInt(window.getComputedStyle(overlay2).zIndex, 10);
+            var bgStyleZ = parseInt(window.getComputedStyle(overlay1.backdropElement).zIndex, 10);
+            assert.isAbove(style2Z, bgStyleZ, 'overlay2 above backdrop');
+            assert.isAbove(style1Z, bgStyleZ, 'overlay1 below backdrop');
             done();
           });
         });
@@ -1182,20 +1250,6 @@
         });
       });
 
-      test('updating with-backdrop updates z-index', function(done) {
-        runAfterOpen(overlay1, function() {
-          runAfterOpen(overlay2, function() {
-            overlay1.withBackdrop = false;
-            var styleZ = parseInt(window.getComputedStyle(overlay1).zIndex, 10);
-            var style1Z = parseInt(window.getComputedStyle(overlay2).zIndex, 10);
-            var bgStyleZ = parseInt(window.getComputedStyle(overlay1.backdropElement).zIndex, 10);
-            assert.isTrue(style1Z > bgStyleZ, 'overlay2 has higher z-index than backdrop');
-            assert.isTrue(styleZ < bgStyleZ, 'overlay1 has lower z-index than backdrop');
-            done();
-          });
-        });
-      });
-
     });
 
     suite('overlay in composed tree', function() {
@@ -1302,10 +1356,13 @@
 
     suite('animations', function() {
 
-      test('overlay animations correctly triggered', function(done) {
-        var overlay = fixture('basic');
+      var overlay;
+      setup(function() {
+        overlay = fixture('basic');
         overlay.animated = true;
-        overlay.open();
+      });
+
+      test('overlay animations correctly triggered', function(done) {
         overlay.addEventListener('simple-overlay-open-animation-start', function() {
           // Since animated overlay will transition center + 300px to center,
           // we should not find the element at the center when the open animation starts.
@@ -1313,6 +1370,37 @@
           assert.notEqual(centerElement, overlay, 'overlay should not be centered already');
           done();
         });
+        overlay.open();
+      });
+
+      test('overlay detached before opening animation is done', function(done) {
+        // Test will fail if `done` is called more than once.
+        runAfterOpen(overlay, function() {
+          assert.equal(overlay.style.display, '', 'overlay displayed');
+          assert.notEqual(overlay.style.zIndex, '', 'z-index ok');
+          done();
+        });
+        // After some time, but before the animation is completed...
+        setTimeout(function() {
+          // Animation is not done yet, but we remove the overlay already.
+          overlay.parentNode.removeChild(overlay);
+        }, 50);
+      });
+
+      test('overlay detached before closing animation is done', function(done) {
+        runAfterOpen(overlay, function() {
+          // Test will fail if `done` is called more than once.
+          runAfterClose(overlay, function() {
+            assert.equal(overlay.style.display, 'none', 'overlay hidden');
+            assert.equal(overlay.style.zIndex, '', 'z-index reset');
+            done();
+          });
+          // After some time, but before the animation is completed...
+          setTimeout(function() {
+            // Animation is not done yet, but we remove the overlay already.
+            overlay.parentNode.removeChild(overlay);
+          }, 50);
+        });
       });
 
     });
diff --git a/polymer_2.0.2/bower_components/iron-overlay-behavior/test/iron-scroll-manager.html b/polymer_2.0.2/bower_components/iron-overlay-behavior/test/iron-scroll-manager.html
new file mode 100644
index 0000000..04aa874
--- /dev/null
+++ b/polymer_2.0.2/bower_components/iron-overlay-behavior/test/iron-scroll-manager.html
@@ -0,0 +1,186 @@
+<!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">
+  <title>iron-dropdown-scroll-manager tests</title>
+  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
+
+  <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+  <script src="../../web-component-tester/browser.js"></script>
+  <script src="../../iron-test-helpers/mock-interactions.js"></script>
+
+  <link rel="import" href="../iron-scroll-manager.html">
+  <link rel="import" href="x-scrollable-element.html">
+</head>
+
+<body>
+
+  <test-fixture id="DOMSubtree">
+    <template>
+      <x-scrollable-element id="Parent"></x-scrollable-element>
+    </template>
+  </test-fixture>
+  <script>
+    var scrollEvents = [
+      'wheel',
+      'mousewheel',
+      'DOMMouseScroll',
+      'touchstart',
+      'touchmove',
+    ];
+
+    suite('IronScrollManager', function() {
+      var parent;
+      var childOne;
+      var childTwo;
+      var grandChildOne;
+      var grandChildTwo;
+      var ancestor;
+
+      setup(function() {
+        parent = fixture('DOMSubtree');
+        childOne = parent.$$('#ChildOne');
+        childTwo = parent.$$('#ChildTwo');
+        grandChildOne = parent.$$('#GrandchildOne');
+        grandChildTwo = parent.$$('#GrandchildTwo');
+        ancestor = document.body;
+      });
+
+      suite('constraining scroll in the DOM', function() {
+        setup(function() {
+          Polymer.IronScrollManager.pushScrollLock(childOne);
+        });
+
+        teardown(function() {
+          Polymer.IronScrollManager.removeScrollLock(childOne);
+        });
+
+        test('recognizes sibling as locked', function() {
+          expect(Polymer.IronScrollManager.elementIsScrollLocked(childTwo))
+            .to.be.equal(true);
+        });
+
+        test('recognizes neice as locked', function() {
+          expect(Polymer.IronScrollManager.elementIsScrollLocked(grandChildTwo))
+            .to.be.equal(true);
+        });
+
+        test('recognizes parent as locked', function() {
+          expect(Polymer.IronScrollManager.elementIsScrollLocked(parent))
+            .to.be.equal(true);
+        });
+
+        test('recognizes ancestor as locked', function() {
+          expect(Polymer.IronScrollManager.elementIsScrollLocked(ancestor))
+            .to.be.equal(true);
+        });
+
+        test('recognizes locking child as unlocked', function() {
+          expect(Polymer.IronScrollManager.elementIsScrollLocked(childOne))
+            .to.be.equal(false);
+        });
+
+        test('recognizes descendant of locking child as unlocked', function() {
+          expect(Polymer.IronScrollManager.elementIsScrollLocked(grandChildOne))
+            .to.be.equal(false);
+        });
+
+        test('unlocks locked elements when there are no locking elements', function() {
+          Polymer.IronScrollManager.removeScrollLock(childOne);
+
+          expect(Polymer.IronScrollManager.elementIsScrollLocked(parent))
+            .to.be.equal(false);
+        });
+
+        suite('various scroll events', function() {
+          var events;
+          setup(function() {
+            events = scrollEvents.map(function(scrollEvent) {
+              var event = new CustomEvent(scrollEvent, {
+                bubbles: true,
+                cancelable: true,
+                composed: true
+              });
+              event.deltaX = 0;
+              event.deltaY = 10;
+              return event;
+            });
+          });
+
+          test('prevents wheel events from locked elements', function() {
+            events.forEach(function(event) {
+              childTwo.dispatchEvent(event);
+              assert.isTrue(event.defaultPrevented, event.type + ' ok');
+            });
+          });
+
+          test('allows wheel events when there are no locking elements', function() {
+            Polymer.IronScrollManager.removeScrollLock(childOne);
+            events.forEach(function(event) {
+              childTwo.dispatchEvent(event);
+              assert.isFalse(event.defaultPrevented, event.type + ' ok');
+            });
+          });
+
+          test('allows wheel events from unlocked elements', function() {
+            events.forEach(function(event) {
+              childOne.dispatchEvent(event);
+              assert.isFalse(event.defaultPrevented, event.type + ' ok');
+            });
+          });
+
+          test('touchstart is prevented if dispatched by an element outside the locking element', function() {
+            var event = new CustomEvent('touchstart', {
+              bubbles: true,
+              cancelable: true,
+              composed: true
+            });
+            childTwo.dispatchEvent(event);
+            assert.isTrue(event.defaultPrevented, event.type + ' ok');
+          });
+
+          test('touchstart is not prevented if dispatched by an element inside the locking element', function() {
+            var event = new CustomEvent('touchstart', {
+              bubbles: true,
+              cancelable: true,
+              composed: true
+            });
+            grandChildOne.dispatchEvent(event);
+            assert.isFalse(event.defaultPrevented, event.type + ' ok');
+          });
+
+          test('arrow keyboard events not prevented by manager', function() {
+            // Even if these events might cause scrolling, they should not be
+            // prevented because they might cause a11y issues (e.g. arrow keys
+            // used for navigating the content). iron-dropdown is capable of
+            // restoring the scroll position of the document if necessary.
+            var left = MockInteractions.keyboardEventFor('keydown', 37);
+            var up = MockInteractions.keyboardEventFor('keydown', 38);
+            var right = MockInteractions.keyboardEventFor('keydown', 39);
+            var down = MockInteractions.keyboardEventFor('keydown', 40);
+            grandChildOne.dispatchEvent(left);
+            grandChildOne.dispatchEvent(up);
+            grandChildOne.dispatchEvent(right);
+            grandChildOne.dispatchEvent(down);
+            assert.isFalse(left.defaultPrevented, 'left ok');
+            assert.isFalse(up.defaultPrevented, 'up ok');
+            assert.isFalse(right.defaultPrevented, 'right ok');
+            assert.isFalse(down.defaultPrevented, 'down ok');
+          });
+        });
+      });
+    });
+  </script>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/polymer_2.0.2/bower_components/iron-overlay-behavior/test/test-scrollable.html b/polymer_2.0.2/bower_components/iron-overlay-behavior/test/test-scrollable.html
new file mode 100644
index 0000000..0228f72
--- /dev/null
+++ b/polymer_2.0.2/bower_components/iron-overlay-behavior/test/test-scrollable.html
@@ -0,0 +1,42 @@
+<!--

+@license

+Copyright (c) 2015 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

+-->

+

+<link rel="import" href="../../polymer/polymer.html">

+

+<link rel="import" href="./test-overlay.html">

+

+<dom-module id="test-scrollable">

+  <template>

+    <style>

+      #scrollable, #overlay {

+        max-width: 200px;

+        max-height: 200px;

+        overflow: auto;

+      }

+    </style>

+    <div id="scrollable">

+      <slot name="scrollable-content"></slot>

+    </div>

+    <test-overlay id="overlay">

+      <slot name="overlay-content"></slot>

+    </test-overlay>

+  </template>

+

+</dom-module>

+

+<script>

+  (function() {

+

+    Polymer({

+      is: 'test-scrollable'

+    });

+

+  })();

+</script>
\ No newline at end of file
diff --git a/polymer_2.0.2/bower_components/iron-overlay-behavior/test/x-scrollable-element.html b/polymer_2.0.2/bower_components/iron-overlay-behavior/test/x-scrollable-element.html
new file mode 100644
index 0000000..0cffe52
--- /dev/null
+++ b/polymer_2.0.2/bower_components/iron-overlay-behavior/test/x-scrollable-element.html
@@ -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
+-->
+
+<link rel="import" href="../../polymer/polymer.html">
+
+<dom-module id="x-scrollable-element">
+  <template>
+    <style>
+      :host {
+        display: block;
+        height: 100px;
+        border: 1px solid red;
+        overflow: auto;
+      }
+      #ChildOne, #ChildTwo {
+        height: 200px;
+        border: 1px solid blue;
+        overflow: auto;
+      }
+      #GrandchildOne, #GrandchildTwo {
+        height: 300px;
+        border: 1px solid green;
+        overflow: auto;
+      }
+      .scrollContent {
+        height: 400px;
+        background-color: yellow;
+      }
+    </style>
+    <div id="ChildOne">
+      <div id="GrandchildOne">
+        <div class="scrollContent"></div>
+      </div>
+    </div>
+    <div id="ChildTwo">
+      <div id="GrandchildTwo">
+        <div class="scrollContent"></div>
+      </div>
+    </div>
+  </template>
+  <script>
+    Polymer({
+      is: 'x-scrollable-element'
+    });
+  </script>
+</dom-module>
diff --git a/polymer_2.0.2/bower_components/iron-pages/.bower.json b/polymer_2.0.2/bower_components/iron-pages/.bower.json
index f1a4c5a..174280e 100644
--- a/polymer_2.0.2/bower_components/iron-pages/.bower.json
+++ b/polymer_2.0.2/bower_components/iron-pages/.bower.json
@@ -1,6 +1,6 @@
 {
   "name": "iron-pages",
-  "version": "2.0.0",
+  "version": "2.0.1",
   "license": "http://polymer.github.io/LICENSE.txt",
   "description": "Organizes a set of pages and shows one at a time",
   "main": "iron-pages.html",
@@ -53,11 +53,11 @@
     "webcomponentsjs": "^1.0.0"
   },
   "homepage": "https://github.com/PolymerElements/iron-pages",
-  "_release": "2.0.0",
+  "_release": "2.0.1",
   "_resolution": {
     "type": "version",
-    "tag": "v2.0.0",
-    "commit": "79809fd3d40f4d6c4e93babe6ca35968a1c906e4"
+    "tag": "v2.0.1",
+    "commit": "ea551b48282f944b45710747d25c461d471bf2b9"
   },
   "_source": "https://github.com/PolymerElements/iron-pages.git",
   "_target": "^2.0.0",
diff --git a/polymer_2.0.2/bower_components/iron-pages/bower.json b/polymer_2.0.2/bower_components/iron-pages/bower.json
index 33b7158..0607749 100644
--- a/polymer_2.0.2/bower_components/iron-pages/bower.json
+++ b/polymer_2.0.2/bower_components/iron-pages/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "iron-pages",
-  "version": "2.0.0",
+  "version": "2.0.1",
   "license": "http://polymer.github.io/LICENSE.txt",
   "description": "Organizes a set of pages and shows one at a time",
   "main": "iron-pages.html",
diff --git a/polymer_2.0.2/bower_components/iron-pages/iron-pages.html b/polymer_2.0.2/bower_components/iron-pages/iron-pages.html
index 1f65dfa..c64b2e2 100644
--- a/polymer_2.0.2/bower_components/iron-pages/iron-pages.html
+++ b/polymer_2.0.2/bower_components/iron-pages/iron-pages.html
@@ -44,7 +44,7 @@
         display: block;
       }
 
-      :host > ::slotted(:not(.iron-selected)) {
+      :host > ::slotted(:not(slot):not(.iron-selected)) {
         display: none !important;
       }
     </style>
diff --git a/polymer_2.0.2/bower_components/iron-pages/test/index.html b/polymer_2.0.2/bower_components/iron-pages/test/index.html
index e8b5650..8ce6bd9 100644
--- a/polymer_2.0.2/bower_components/iron-pages/test/index.html
+++ b/polymer_2.0.2/bower_components/iron-pages/test/index.html
@@ -25,7 +25,9 @@
         'basic.html?dom=shadow',
         'basic.html?wc-shadydom=true&wc-ce=true',
         'attr-for-selected.html?dom=shadow',
-        'attr-for-selected.html?wc-shadydom=true&wc-ce=true'
+        'attr-for-selected.html?wc-shadydom=true&wc-ce=true',
+        'nested.html?dom=shadow',
+        'nested.html?wc-shadydom=true&wc-ce=true',
       ]);
 
     </script>
diff --git a/polymer_2.0.2/bower_components/iron-pages/test/nested-pages.html b/polymer_2.0.2/bower_components/iron-pages/test/nested-pages.html
new file mode 100644
index 0000000..9c69f88
--- /dev/null
+++ b/polymer_2.0.2/bower_components/iron-pages/test/nested-pages.html
@@ -0,0 +1,37 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 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
+-->
+<link rel="import" href="../iron-pages.html">
+<dom-module id="nested-pages">
+  <template>
+    <h1>header</h1>
+    <iron-pages selected="{{selected}}" on-iron-items-changed="refire" on-selected-item-changed="reselect">
+      <slot></slot>
+    </iron-pages>
+  </template>
+  <script>
+    Polymer({
+      is: 'nested-pages',
+      properties: {
+        selected: {
+          type: Number,
+          value: 0,
+        },
+      },  
+      refire: function(e, detail) {
+        this.items = e.target.items
+        this.fire('iron-items-changed', e)
+      },
+      reselect: function(e, detail) {
+        this.selectedItem = e.target.selectedItem
+      },
+    });
+  </script>
+</dom-module>
diff --git a/polymer_2.0.2/bower_components/iron-pages/test/nested.html b/polymer_2.0.2/bower_components/iron-pages/test/nested.html
new file mode 100644
index 0000000..a75a52f
--- /dev/null
+++ b/polymer_2.0.2/bower_components/iron-pages/test/nested.html
@@ -0,0 +1,75 @@
+<!doctype html>
+<!--
+@license
+Copyright (c) 2015 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>iron-pages-nested</title>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=yes">
+
+    <script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+    <script src="../../web-component-tester/browser.js"></script>
+    <link rel="import" href="./nested-pages.html">
+    
+  </head>
+  <body>
+
+    <test-fixture id="nested">
+      <template>
+        <nested-pages>
+          <div id="page0">Page 0</div>
+          <div id="page1">Page 1</div>
+          <div id="page2">Page 2</div>
+          <div id="page3">Page 3</div>
+        </nested-pages>
+      </template>
+    </test-fixture>
+
+    <script>
+
+      suite('nested', function() {
+        var pages;
+        
+        suite('0 is selected', function() {
+          setup(function(done) {
+            pages = fixture('nested');
+            pages.addEventListener('iron-items-changed', function onIronItemsChanged() {
+              pages.removeEventListener('iron-items-changed', onIronItemsChanged);
+              done();
+            });
+          });
+
+          test('selected item is display:block and all others are display:none', function(done) {
+            Polymer.Base.async(function() {
+              var p = pages.selectedItem;
+              assert.equal(getComputedStyle(p).display, 'block');
+              assert.isAbove(p.clientHeight, 0);
+              assert.isAbove(p.offsetHeight, 0);
+              assert.isAbove(p.scrollHeight, 0);
+              pages.items.forEach(function(p) {
+                if (p != pages.selectedItem)  {
+                  assert.equal(getComputedStyle(p).display, 'none');
+                  assert.equal(p.clientHeight, 0);
+                  assert.equal(p.offsetHeight, 0);
+                  assert.equal(p.scrollHeight, 0);
+                }
+              });
+              done();
+            }, 1);
+          });
+        });
+      });
+
+    </script>
+
+  </body>
+</html>
diff --git a/polymer_2.0.2/bower_components/iron-selector/.bower.json b/polymer_2.0.2/bower_components/iron-selector/.bower.json
index b634ee3..d34cf78 100644
--- a/polymer_2.0.2/bower_components/iron-selector/.bower.json
+++ b/polymer_2.0.2/bower_components/iron-selector/.bower.json
@@ -1,6 +1,6 @@
 {
   "name": "iron-selector",
-  "version": "2.0.0",
+  "version": "2.0.1",
   "description": "Manages a set of elements that can be selected",
   "private": true,
   "license": "http://polymer.github.io/LICENSE.txt",
@@ -56,11 +56,11 @@
   "resolutions": {
     "webcomponentsjs": "^1.0.0"
   },
-  "_release": "2.0.0",
+  "_release": "2.0.1",
   "_resolution": {
     "type": "version",
-    "tag": "v2.0.0",
-    "commit": "cc49ccd0769f76faa8e5d0e572ef2a65be06f4cb"
+    "tag": "v2.0.1",
+    "commit": "01dd7ae23d0330c470058ccd95b8cf77a6525ddd"
   },
   "_source": "https://github.com/PolymerElements/iron-selector.git",
   "_target": "1 - 2",
diff --git a/polymer_2.0.2/bower_components/iron-selector/.travis.yml b/polymer_2.0.2/bower_components/iron-selector/.travis.yml
index 5760ebf..03a2b6c 100644
--- a/polymer_2.0.2/bower_components/iron-selector/.travis.yml
+++ b/polymer_2.0.2/bower_components/iron-selector/.travis.yml
@@ -1,7 +1,7 @@
 language: node_js
 sudo: required
 before_script:
-  - npm install -g polymer-cli
+  - npm install -g polymer-cli web-component-tester
   - polymer install --variants
 env:
   global:
@@ -18,8 +18,8 @@
     packages:
       - google-chrome-stable
 script:
-  - xvfb-run polymer test
+  - xvfb-run wct
   - >-
-    if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then polymer test -s 'default';
+    if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then wct -s 'default';
     fi
 dist: trusty
diff --git a/polymer_2.0.2/bower_components/iron-selector/bower.json b/polymer_2.0.2/bower_components/iron-selector/bower.json
index 8a9a13b..7a233b0 100755
--- a/polymer_2.0.2/bower_components/iron-selector/bower.json
+++ b/polymer_2.0.2/bower_components/iron-selector/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "iron-selector",
-  "version": "2.0.0",
+  "version": "2.0.1",
   "description": "Manages a set of elements that can be selected",
   "private": true,
   "license": "http://polymer.github.io/LICENSE.txt",
diff --git a/polymer_2.0.2/bower_components/iron-selector/iron-selectable.html b/polymer_2.0.2/bower_components/iron-selector/iron-selectable.html
index 3f48273..30cd1e7 100644
--- a/polymer_2.0.2/bower_components/iron-selector/iron-selectable.html
+++ b/polymer_2.0.2/bower_components/iron-selector/iron-selectable.html
@@ -186,7 +186,7 @@
      * @returns Returns the index of the item
      */
     indexOf: function(item) {
-      return this.items.indexOf(item);
+      return this.items ? this.items.indexOf(item) : -1;
     },
 
     /**
@@ -346,7 +346,10 @@
       if (!item) {
         return null;
       }
-
+      if (!this.attrForSelected) {
+        var i = this.indexOf(item);
+        return i === -1 ? null : i;
+      }
       var propValue = item[Polymer.CaseMap.dashToCamelCase(this.attrForSelected)];
       return propValue != undefined ? propValue : item.getAttribute(this.attrForSelected);
     },
diff --git a/polymer_2.0.2/bower_components/iron-selector/iron-selection.html b/polymer_2.0.2/bower_components/iron-selector/iron-selection.html
index 408ccae..0bca07d 100644
--- a/polymer_2.0.2/bower_components/iron-selector/iron-selection.html
+++ b/polymer_2.0.2/bower_components/iron-selector/iron-selection.html
@@ -16,6 +16,7 @@
   /**
    * @param {!Function} selectCallback
    * @constructor
+   * @suppress {missingProvide}
    */
   Polymer.IronSelection = function(selectCallback) {
     this.selection = [];
diff --git a/polymer_2.0.2/bower_components/iron-selector/test/attr-for-selected.html b/polymer_2.0.2/bower_components/iron-selector/test/attr-for-selected.html
index 9e53747..aab2ae9 100644
--- a/polymer_2.0.2/bower_components/iron-selector/test/attr-for-selected.html
+++ b/polymer_2.0.2/bower_components/iron-selector/test/attr-for-selected.html
@@ -108,6 +108,15 @@
           done();
         });
       });
+
+      test('setting attr-for-selected to null keeps current selection', function() {
+        selector.select('value0');
+        assert.equal(selector.selectedItem, items[0]);
+        assert.equal(selector.selected, 'value0');
+        selector.attrForSelected = null;
+        assert.equal(selector.selectedItem, items[0]);
+        assert.equal(selector.selected, 0);
+      });
     });
 
     suite('reflected properties as attributes', function() {
diff --git a/polymer_2.0.2/bower_components/iron-selector/test/numeric-ids.html b/polymer_2.0.2/bower_components/iron-selector/test/numeric-ids.html
index b08f522..98458bf 100644
--- a/polymer_2.0.2/bower_components/iron-selector/test/numeric-ids.html
+++ b/polymer_2.0.2/bower_components/iron-selector/test/numeric-ids.html
@@ -99,7 +99,6 @@
         assert.equal(selector.selected, '1');
 
         // select item with a name value of 0
-        debugger;
         MockInteractions.tap(selector.items[0]);
         assert.equal(selector.selected, 0);
       });
diff --git a/polymer_2.0.2/bower_components/mocha/.bower.json b/polymer_2.0.2/bower_components/mocha/.bower.json
index 6a64ebb..cfa71a6 100644
--- a/polymer_2.0.2/bower_components/mocha/.bower.json
+++ b/polymer_2.0.2/bower_components/mocha/.bower.json
@@ -35,12 +35,12 @@
     "tap"
   ],
   "license": "MIT",
-  "version": "3.5.0",
-  "_release": "3.5.0",
+  "version": "3.5.3",
+  "_release": "3.5.3",
   "_resolution": {
     "type": "version",
-    "tag": "v3.5.0",
-    "commit": "f37b69bd455fc7ff324fcd9c75e0026ddc4a3af6"
+    "tag": "v3.5.3",
+    "commit": "1ff41a05a599e8bffe90b2b13597b01a2031b88f"
   },
   "_source": "https://github.com/mochajs/mocha.git",
   "_target": "^3.1.2",
diff --git a/polymer_2.0.2/bower_components/mocha/CHANGELOG.md b/polymer_2.0.2/bower_components/mocha/CHANGELOG.md
index 66e5aac..96fc1c5 100644
--- a/polymer_2.0.2/bower_components/mocha/CHANGELOG.md
+++ b/polymer_2.0.2/bower_components/mocha/CHANGELOG.md
@@ -1,3 +1,47 @@
+# 3.5.3 / 2017-09-11
+
+## :bug: Fixes
+
+- [#3003]: Fix invalid entities in xUnit reporter first appearing in v3.5.1 ([@jkrems])
+
+[#3003]: https://github.com/mochajs/mocha/pull/3003
+
+# 3.5.2 / 2017-09-10
+
+## :bug: Fixes
+
+- [#3001]: Fix AMD-related failures first appearing in v3.5.1 ([@boneskull])
+
+[#3001]: https://github.com/mochajs/mocha/pull/3001
+
+# 3.5.1 / 2017-09-09
+
+## :newspaper: News
+
+- :mega: Mocha is now sponsoring [PDXNode](http://pdxnode.org)!  If you're in the [Portland](https://wikipedia.org/wiki/Portland,_Oregon) area, come check out the monthly talks and hack nights!
+
+## :bug: Fixes
+
+- [#2997]: Fix missing `xit` export for "require" interface ([@solodynamo])
+- [#2957]: Fix unicode character handling in XUnit reporter failures ([@jkrems])
+
+## :nut_and_bolt: Other
+
+- [#2986]: Add issue and PR templates ([@kungapal])
+- [#2918]: Drop bash dependency for glob-related tests ([@ScottFreeCode])
+- [#2922]: Improve `--compilers` coverage ([@ScottFreeCode])
+- [#2981]: Fix tpyos and spelling errors ([@jsoref])
+ 
+[#2997]: https://github.com/mochajs/mocha/pull/2997
+[#2957]: https://github.com/mochajs/mocha/pull/2957
+[#2918]: https://github.com/mochajs/mocha/pull/2918
+[#2986]: https://github.com/mochajs/mocha/pull/2986
+[#2922]: https://github.com/mochajs/mocha/pull/2922
+[#2981]: https://github.com/mochajs/mocha/pull/2981
+[@solodynamo]: https://github.com/solodynamo
+[@jkrems]: https://github.com/jkrems
+[@jsoref]: https://github.com/jsoref
+
 # 3.5.0 / 2017-07-31
 
 ## :newspaper: News
@@ -863,7 +907,7 @@
   * utils.stringify should handle objects without an Object prototype
   * in runnable test, comparing to undefined error's message rather than a literal
   * Fix test running output truncation on async STDIO
-  * ammended for deprecated customFds option in child_process
+  * amended for deprecated customFds option in child_process
 
 2.1.0 / 2014-12-23
 ==================
@@ -1091,7 +1135,7 @@
 ==================
 
   * add: sort test files with --sort (#813)
-  * update: diff depedency to 1.0.7
+  * update: diff dependency to 1.0.7
   * update: glob dependency to 3.2.3 (#927)
   * fix: diffs show whitespace differences (#976)
   * fix: improve global leaks (#783)
diff --git a/polymer_2.0.2/bower_components/mocha/mocha.js b/polymer_2.0.2/bower_components/mocha/mocha.js
index 2ad1356..9a40e98 100644
--- a/polymer_2.0.2/bower_components/mocha/mocha.js
+++ b/polymer_2.0.2/bower_components/mocha/mocha.js
@@ -189,7 +189,7 @@
 module.exports = global;
 
 }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-},{"./lib/mocha":14,"_process":81,"browser-stdout":41}],2:[function(require,module,exports){
+},{"./lib/mocha":14,"_process":82,"browser-stdout":41}],2:[function(require,module,exports){
 'use strict';
 
 function noop () {}
@@ -647,7 +647,7 @@
   }, 2);
 };
 
-},{"json3":68}],7:[function(require,module,exports){
+},{"json3":69}],7:[function(require,module,exports){
 'use strict';
 
 /**
@@ -1464,6 +1464,7 @@
     exports.before = context.before || context.suiteSetup;
     exports.describe = context.describe || context.suite;
     exports.it = context.it || context.test;
+    exports.xit = context.xit || context.test.skip;
     exports.setup = context.setup || context.beforeEach;
     exports.suiteSetup = context.suiteSetup || context.before;
     exports.suiteTeardown = context.suiteTeardown || context.after;
@@ -1810,7 +1811,7 @@
 };
 
 }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},"/lib")
-},{"./context":6,"./hook":7,"./interfaces":11,"./reporters":21,"./runnable":33,"./runner":34,"./suite":35,"./test":36,"./utils":38,"_process":81,"escape-string-regexp":61,"growl":63,"path":42}],15:[function(require,module,exports){
+},{"./context":6,"./hook":7,"./interfaces":11,"./reporters":21,"./runnable":33,"./runner":34,"./suite":35,"./test":36,"./utils":38,"_process":82,"escape-string-regexp":61,"growl":63,"path":42}],15:[function(require,module,exports){
 'use strict';
 
 /**
@@ -2120,7 +2121,7 @@
 };
 
 /**
- * Outut the given `failures` as a list.
+ * Output the given `failures` as a list.
  *
  * @param {Array} failures
  * @api public
@@ -2455,7 +2456,7 @@
 }
 
 }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-},{"../ms":15,"../utils":38,"_process":81,"diff":55,"supports-color":42,"tty":5}],18:[function(require,module,exports){
+},{"../ms":15,"../utils":38,"_process":82,"diff":55,"supports-color":42,"tty":5}],18:[function(require,module,exports){
 'use strict';
 
 /**
@@ -2593,7 +2594,7 @@
 inherits(Dot, Base);
 
 }).call(this,require('_process'))
-},{"../utils":38,"./base":17,"_process":81}],20:[function(require,module,exports){
+},{"../utils":38,"./base":17,"_process":82}],20:[function(require,module,exports){
 (function (global){
 'use strict';
 
@@ -3033,7 +3034,7 @@
 }
 
 }).call(this,require('_process'))
-},{"./base":17,"_process":81,"json3":68}],23:[function(require,module,exports){
+},{"./base":17,"_process":82,"json3":69}],23:[function(require,module,exports){
 (function (process){
 'use strict';
 
@@ -3129,7 +3130,7 @@
 }
 
 }).call(this,require('_process'))
-},{"./base":17,"_process":81}],24:[function(require,module,exports){
+},{"./base":17,"_process":82}],24:[function(require,module,exports){
 (function (process){
 'use strict';
 
@@ -3227,7 +3228,7 @@
 inherits(Landing, Base);
 
 }).call(this,require('_process'))
-},{"../utils":38,"./base":17,"_process":81}],25:[function(require,module,exports){
+},{"../utils":38,"./base":17,"_process":82}],25:[function(require,module,exports){
 (function (process){
 'use strict';
 
@@ -3294,7 +3295,7 @@
 inherits(List, Base);
 
 }).call(this,require('_process'))
-},{"../utils":38,"./base":17,"_process":81}],26:[function(require,module,exports){
+},{"../utils":38,"./base":17,"_process":82}],26:[function(require,module,exports){
 (function (process){
 'use strict';
 
@@ -3397,7 +3398,7 @@
 }
 
 }).call(this,require('_process'))
-},{"../utils":38,"./base":17,"_process":81}],27:[function(require,module,exports){
+},{"../utils":38,"./base":17,"_process":82}],27:[function(require,module,exports){
 (function (process){
 'use strict';
 
@@ -3439,7 +3440,7 @@
 inherits(Min, Base);
 
 }).call(this,require('_process'))
-},{"../utils":38,"./base":17,"_process":81}],28:[function(require,module,exports){
+},{"../utils":38,"./base":17,"_process":82}],28:[function(require,module,exports){
 (function (process){
 'use strict';
 
@@ -3706,7 +3707,7 @@
 }
 
 }).call(this,require('_process'))
-},{"../utils":38,"./base":17,"_process":81}],29:[function(require,module,exports){
+},{"../utils":38,"./base":17,"_process":82}],29:[function(require,module,exports){
 (function (process){
 'use strict';
 
@@ -3801,7 +3802,7 @@
 inherits(Progress, Base);
 
 }).call(this,require('_process'))
-},{"../utils":38,"./base":17,"_process":81}],30:[function(require,module,exports){
+},{"../utils":38,"./base":17,"_process":82}],30:[function(require,module,exports){
 'use strict';
 
 /**
@@ -4128,7 +4129,7 @@
 }
 
 }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-},{"../utils":38,"./base":17,"_process":81,"fs":42,"mkdirp":78,"path":42}],33:[function(require,module,exports){
+},{"../utils":38,"./base":17,"_process":82,"fs":42,"mkdirp":79,"path":42}],33:[function(require,module,exports){
 (function (global){
 'use strict';
 
@@ -4521,7 +4522,7 @@
 };
 
 }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-},{"./ms":15,"./pending":16,"./utils":38,"debug":2,"events":3,"json3":68,"lodash.create":69}],34:[function(require,module,exports){
+},{"./ms":15,"./pending":16,"./utils":38,"debug":2,"events":3,"json3":69,"lodash.create":75}],34:[function(require,module,exports){
 (function (process,global){
 'use strict';
 
@@ -5493,7 +5494,7 @@
 }
 
 }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-},{"./pending":16,"./runnable":33,"./utils":38,"_process":81,"debug":2,"events":3}],35:[function(require,module,exports){
+},{"./pending":16,"./runnable":33,"./utils":38,"_process":82,"debug":2,"events":3}],35:[function(require,module,exports){
 'use strict';
 
 /**
@@ -5951,7 +5952,7 @@
   return test;
 };
 
-},{"./runnable":33,"./utils":38,"lodash.create":69}],37:[function(require,module,exports){
+},{"./runnable":33,"./utils":38,"lodash.create":75}],37:[function(require,module,exports){
 'use strict';
 
 /**
@@ -6012,6 +6013,7 @@
 var watchFile = require('fs').watchFile;
 var lstatSync = require('fs').lstatSync;
 var toISOString = require('./to-iso-string');
+var he = require('he');
 
 /**
  * Ignored directories.
@@ -6029,11 +6031,7 @@
  * @return {string}
  */
 exports.escape = function (html) {
-  return String(html)
-    .replace(/&/g, '&amp;')
-    .replace(/"/g, '&quot;')
-    .replace(/</g, '&lt;')
-    .replace(/>/g, '&gt;');
+  return he.encode(String(html), { useNamedReferences: false });
 };
 
 /**
@@ -6801,7 +6799,7 @@
 exports.noop = function () {};
 
 }).call(this,require('_process'),require("buffer").Buffer)
-},{"./to-iso-string":37,"_process":81,"buffer":43,"debug":2,"fs":42,"glob":42,"json3":68,"path":42,"util":101}],39:[function(require,module,exports){
+},{"./to-iso-string":37,"_process":82,"buffer":43,"debug":2,"fs":42,"glob":42,"he":64,"json3":69,"path":42,"util":102}],39:[function(require,module,exports){
 'use strict'
 
 exports.byteLength = byteLength
@@ -6948,7 +6946,7 @@
 }
 
 }).call(this,require('_process'))
-},{"_process":81,"stream":95,"util":101}],42:[function(require,module,exports){
+},{"_process":82,"stream":96,"util":102}],42:[function(require,module,exports){
 arguments[4][40][0].apply(exports,arguments)
 },{"dup":40}],43:[function(require,module,exports){
 (function (global){
@@ -8743,7 +8741,7 @@
 }
 
 }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-},{"base64-js":39,"ieee754":64,"isarray":67}],44:[function(require,module,exports){
+},{"base64-js":39,"ieee754":65,"isarray":68}],44:[function(require,module,exports){
 (function (Buffer){
 // Copyright Joyent, Inc. and other Node contributors.
 //
@@ -8854,7 +8852,7 @@
 }
 
 }).call(this,{"isBuffer":require("../../is-buffer/index.js")})
-},{"../../is-buffer/index.js":66}],45:[function(require,module,exports){
+},{"../../is-buffer/index.js":67}],45:[function(require,module,exports){
 /*istanbul ignore start*/"use strict";
 
 exports.__esModule = true;
@@ -10716,7 +10714,351 @@
 };
 
 }).call(this,require('_process'))
-},{"_process":81,"child_process":42,"fs":42,"os":79,"path":42}],64:[function(require,module,exports){
+},{"_process":82,"child_process":42,"fs":42,"os":80,"path":42}],64:[function(require,module,exports){
+(function (global){
+/*! https://mths.be/he v1.1.1 by @mathias | MIT license */
+;(function(root) {
+
+	// Detect free variables `exports`.
+	var freeExports = typeof exports == 'object' && exports;
+
+	// Detect free variable `module`.
+	var freeModule = typeof module == 'object' && module &&
+		module.exports == freeExports && module;
+
+	// Detect free variable `global`, from Node.js or Browserified code,
+	// and use it as `root`.
+	var freeGlobal = typeof global == 'object' && global;
+	if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) {
+		root = freeGlobal;
+	}
+
+	/*--------------------------------------------------------------------------*/
+
+	// All astral symbols.
+	var regexAstralSymbols = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g;
+	// All ASCII symbols (not just printable ASCII) except those listed in the
+	// first column of the overrides table.
+	// https://html.spec.whatwg.org/multipage/syntax.html#table-charref-overrides
+	var regexAsciiWhitelist = /[\x01-\x7F]/g;
+	// All BMP symbols that are not ASCII newlines, printable ASCII symbols, or
+	// code points listed in the first column of the overrides table on
+	// https://html.spec.whatwg.org/multipage/syntax.html#table-charref-overrides.
+	var regexBmpWhitelist = /[\x01-\t\x0B\f\x0E-\x1F\x7F\x81\x8D\x8F\x90\x9D\xA0-\uFFFF]/g;
+
+	var regexEncodeNonAscii = /<\u20D2|=\u20E5|>\u20D2|\u205F\u200A|\u219D\u0338|\u2202\u0338|\u2220\u20D2|\u2229\uFE00|\u222A\uFE00|\u223C\u20D2|\u223D\u0331|\u223E\u0333|\u2242\u0338|\u224B\u0338|\u224D\u20D2|\u224E\u0338|\u224F\u0338|\u2250\u0338|\u2261\u20E5|\u2264\u20D2|\u2265\u20D2|\u2266\u0338|\u2267\u0338|\u2268\uFE00|\u2269\uFE00|\u226A\u0338|\u226A\u20D2|\u226B\u0338|\u226B\u20D2|\u227F\u0338|\u2282\u20D2|\u2283\u20D2|\u228A\uFE00|\u228B\uFE00|\u228F\u0338|\u2290\u0338|\u2293\uFE00|\u2294\uFE00|\u22B4\u20D2|\u22B5\u20D2|\u22D8\u0338|\u22D9\u0338|\u22DA\uFE00|\u22DB\uFE00|\u22F5\u0338|\u22F9\u0338|\u2933\u0338|\u29CF\u0338|\u29D0\u0338|\u2A6D\u0338|\u2A70\u0338|\u2A7D\u0338|\u2A7E\u0338|\u2AA1\u0338|\u2AA2\u0338|\u2AAC\uFE00|\u2AAD\uFE00|\u2AAF\u0338|\u2AB0\u0338|\u2AC5\u0338|\u2AC6\u0338|\u2ACB\uFE00|\u2ACC\uFE00|\u2AFD\u20E5|[\xA0-\u0113\u0116-\u0122\u0124-\u012B\u012E-\u014D\u0150-\u017E\u0192\u01B5\u01F5\u0237\u02C6\u02C7\u02D8-\u02DD\u0311\u0391-\u03A1\u03A3-\u03A9\u03B1-\u03C9\u03D1\u03D2\u03D5\u03D6\u03DC\u03DD\u03F0\u03F1\u03F5\u03F6\u0401-\u040C\u040E-\u044F\u0451-\u045C\u045E\u045F\u2002-\u2005\u2007-\u2010\u2013-\u2016\u2018-\u201A\u201C-\u201E\u2020-\u2022\u2025\u2026\u2030-\u2035\u2039\u203A\u203E\u2041\u2043\u2044\u204F\u2057\u205F-\u2063\u20AC\u20DB\u20DC\u2102\u2105\u210A-\u2113\u2115-\u211E\u2122\u2124\u2127-\u2129\u212C\u212D\u212F-\u2131\u2133-\u2138\u2145-\u2148\u2153-\u215E\u2190-\u219B\u219D-\u21A7\u21A9-\u21AE\u21B0-\u21B3\u21B5-\u21B7\u21BA-\u21DB\u21DD\u21E4\u21E5\u21F5\u21FD-\u2205\u2207-\u2209\u220B\u220C\u220F-\u2214\u2216-\u2218\u221A\u221D-\u2238\u223A-\u2257\u2259\u225A\u225C\u225F-\u2262\u2264-\u228B\u228D-\u229B\u229D-\u22A5\u22A7-\u22B0\u22B2-\u22BB\u22BD-\u22DB\u22DE-\u22E3\u22E6-\u22F7\u22F9-\u22FE\u2305\u2306\u2308-\u2310\u2312\u2313\u2315\u2316\u231C-\u231F\u2322\u2323\u232D\u232E\u2336\u233D\u233F\u237C\u23B0\u23B1\u23B4-\u23B6\u23DC-\u23DF\u23E2\u23E7\u2423\u24C8\u2500\u2502\u250C\u2510\u2514\u2518\u251C\u2524\u252C\u2534\u253C\u2550-\u256C\u2580\u2584\u2588\u2591-\u2593\u25A1\u25AA\u25AB\u25AD\u25AE\u25B1\u25B3-\u25B5\u25B8\u25B9\u25BD-\u25BF\u25C2\u25C3\u25CA\u25CB\u25EC\u25EF\u25F8-\u25FC\u2605\u2606\u260E\u2640\u2642\u2660\u2663\u2665\u2666\u266A\u266D-\u266F\u2713\u2717\u2720\u2736\u2758\u2772\u2773\u27C8\u27C9\u27E6-\u27ED\u27F5-\u27FA\u27FC\u27FF\u2902-\u2905\u290C-\u2913\u2916\u2919-\u2920\u2923-\u292A\u2933\u2935-\u2939\u293C\u293D\u2945\u2948-\u294B\u294E-\u2976\u2978\u2979\u297B-\u297F\u2985\u2986\u298B-\u2996\u299A\u299C\u299D\u29A4-\u29B7\u29B9\u29BB\u29BC\u29BE-\u29C5\u29C9\u29CD-\u29D0\u29DC-\u29DE\u29E3-\u29E5\u29EB\u29F4\u29F6\u2A00-\u2A02\u2A04\u2A06\u2A0C\u2A0D\u2A10-\u2A17\u2A22-\u2A27\u2A29\u2A2A\u2A2D-\u2A31\u2A33-\u2A3C\u2A3F\u2A40\u2A42-\u2A4D\u2A50\u2A53-\u2A58\u2A5A-\u2A5D\u2A5F\u2A66\u2A6A\u2A6D-\u2A75\u2A77-\u2A9A\u2A9D-\u2AA2\u2AA4-\u2AB0\u2AB3-\u2AC8\u2ACB\u2ACC\u2ACF-\u2ADB\u2AE4\u2AE6-\u2AE9\u2AEB-\u2AF3\u2AFD\uFB00-\uFB04]|\uD835[\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDCCF\uDD04\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDD6B]/g;
+	var encodeMap = {'\xAD':'shy','\u200C':'zwnj','\u200D':'zwj','\u200E':'lrm','\u2063':'ic','\u2062':'it','\u2061':'af','\u200F':'rlm','\u200B':'ZeroWidthSpace','\u2060':'NoBreak','\u0311':'DownBreve','\u20DB':'tdot','\u20DC':'DotDot','\t':'Tab','\n':'NewLine','\u2008':'puncsp','\u205F':'MediumSpace','\u2009':'thinsp','\u200A':'hairsp','\u2004':'emsp13','\u2002':'ensp','\u2005':'emsp14','\u2003':'emsp','\u2007':'numsp','\xA0':'nbsp','\u205F\u200A':'ThickSpace','\u203E':'oline','_':'lowbar','\u2010':'dash','\u2013':'ndash','\u2014':'mdash','\u2015':'horbar',',':'comma',';':'semi','\u204F':'bsemi',':':'colon','\u2A74':'Colone','!':'excl','\xA1':'iexcl','?':'quest','\xBF':'iquest','.':'period','\u2025':'nldr','\u2026':'mldr','\xB7':'middot','\'':'apos','\u2018':'lsquo','\u2019':'rsquo','\u201A':'sbquo','\u2039':'lsaquo','\u203A':'rsaquo','"':'quot','\u201C':'ldquo','\u201D':'rdquo','\u201E':'bdquo','\xAB':'laquo','\xBB':'raquo','(':'lpar',')':'rpar','[':'lsqb',']':'rsqb','{':'lcub','}':'rcub','\u2308':'lceil','\u2309':'rceil','\u230A':'lfloor','\u230B':'rfloor','\u2985':'lopar','\u2986':'ropar','\u298B':'lbrke','\u298C':'rbrke','\u298D':'lbrkslu','\u298E':'rbrksld','\u298F':'lbrksld','\u2990':'rbrkslu','\u2991':'langd','\u2992':'rangd','\u2993':'lparlt','\u2994':'rpargt','\u2995':'gtlPar','\u2996':'ltrPar','\u27E6':'lobrk','\u27E7':'robrk','\u27E8':'lang','\u27E9':'rang','\u27EA':'Lang','\u27EB':'Rang','\u27EC':'loang','\u27ED':'roang','\u2772':'lbbrk','\u2773':'rbbrk','\u2016':'Vert','\xA7':'sect','\xB6':'para','@':'commat','*':'ast','/':'sol','undefined':null,'&':'amp','#':'num','%':'percnt','\u2030':'permil','\u2031':'pertenk','\u2020':'dagger','\u2021':'Dagger','\u2022':'bull','\u2043':'hybull','\u2032':'prime','\u2033':'Prime','\u2034':'tprime','\u2057':'qprime','\u2035':'bprime','\u2041':'caret','`':'grave','\xB4':'acute','\u02DC':'tilde','^':'Hat','\xAF':'macr','\u02D8':'breve','\u02D9':'dot','\xA8':'die','\u02DA':'ring','\u02DD':'dblac','\xB8':'cedil','\u02DB':'ogon','\u02C6':'circ','\u02C7':'caron','\xB0':'deg','\xA9':'copy','\xAE':'reg','\u2117':'copysr','\u2118':'wp','\u211E':'rx','\u2127':'mho','\u2129':'iiota','\u2190':'larr','\u219A':'nlarr','\u2192':'rarr','\u219B':'nrarr','\u2191':'uarr','\u2193':'darr','\u2194':'harr','\u21AE':'nharr','\u2195':'varr','\u2196':'nwarr','\u2197':'nearr','\u2198':'searr','\u2199':'swarr','\u219D':'rarrw','\u219D\u0338':'nrarrw','\u219E':'Larr','\u219F':'Uarr','\u21A0':'Rarr','\u21A1':'Darr','\u21A2':'larrtl','\u21A3':'rarrtl','\u21A4':'mapstoleft','\u21A5':'mapstoup','\u21A6':'map','\u21A7':'mapstodown','\u21A9':'larrhk','\u21AA':'rarrhk','\u21AB':'larrlp','\u21AC':'rarrlp','\u21AD':'harrw','\u21B0':'lsh','\u21B1':'rsh','\u21B2':'ldsh','\u21B3':'rdsh','\u21B5':'crarr','\u21B6':'cularr','\u21B7':'curarr','\u21BA':'olarr','\u21BB':'orarr','\u21BC':'lharu','\u21BD':'lhard','\u21BE':'uharr','\u21BF':'uharl','\u21C0':'rharu','\u21C1':'rhard','\u21C2':'dharr','\u21C3':'dharl','\u21C4':'rlarr','\u21C5':'udarr','\u21C6':'lrarr','\u21C7':'llarr','\u21C8':'uuarr','\u21C9':'rrarr','\u21CA':'ddarr','\u21CB':'lrhar','\u21CC':'rlhar','\u21D0':'lArr','\u21CD':'nlArr','\u21D1':'uArr','\u21D2':'rArr','\u21CF':'nrArr','\u21D3':'dArr','\u21D4':'iff','\u21CE':'nhArr','\u21D5':'vArr','\u21D6':'nwArr','\u21D7':'neArr','\u21D8':'seArr','\u21D9':'swArr','\u21DA':'lAarr','\u21DB':'rAarr','\u21DD':'zigrarr','\u21E4':'larrb','\u21E5':'rarrb','\u21F5':'duarr','\u21FD':'loarr','\u21FE':'roarr','\u21FF':'hoarr','\u2200':'forall','\u2201':'comp','\u2202':'part','\u2202\u0338':'npart','\u2203':'exist','\u2204':'nexist','\u2205':'empty','\u2207':'Del','\u2208':'in','\u2209':'notin','\u220B':'ni','\u220C':'notni','\u03F6':'bepsi','\u220F':'prod','\u2210':'coprod','\u2211':'sum','+':'plus','\xB1':'pm','\xF7':'div','\xD7':'times','<':'lt','\u226E':'nlt','<\u20D2':'nvlt','=':'equals','\u2260':'ne','=\u20E5':'bne','\u2A75':'Equal','>':'gt','\u226F':'ngt','>\u20D2':'nvgt','\xAC':'not','|':'vert','\xA6':'brvbar','\u2212':'minus','\u2213':'mp','\u2214':'plusdo','\u2044':'frasl','\u2216':'setmn','\u2217':'lowast','\u2218':'compfn','\u221A':'Sqrt','\u221D':'prop','\u221E':'infin','\u221F':'angrt','\u2220':'ang','\u2220\u20D2':'nang','\u2221':'angmsd','\u2222':'angsph','\u2223':'mid','\u2224':'nmid','\u2225':'par','\u2226':'npar','\u2227':'and','\u2228':'or','\u2229':'cap','\u2229\uFE00':'caps','\u222A':'cup','\u222A\uFE00':'cups','\u222B':'int','\u222C':'Int','\u222D':'tint','\u2A0C':'qint','\u222E':'oint','\u222F':'Conint','\u2230':'Cconint','\u2231':'cwint','\u2232':'cwconint','\u2233':'awconint','\u2234':'there4','\u2235':'becaus','\u2236':'ratio','\u2237':'Colon','\u2238':'minusd','\u223A':'mDDot','\u223B':'homtht','\u223C':'sim','\u2241':'nsim','\u223C\u20D2':'nvsim','\u223D':'bsim','\u223D\u0331':'race','\u223E':'ac','\u223E\u0333':'acE','\u223F':'acd','\u2240':'wr','\u2242':'esim','\u2242\u0338':'nesim','\u2243':'sime','\u2244':'nsime','\u2245':'cong','\u2247':'ncong','\u2246':'simne','\u2248':'ap','\u2249':'nap','\u224A':'ape','\u224B':'apid','\u224B\u0338':'napid','\u224C':'bcong','\u224D':'CupCap','\u226D':'NotCupCap','\u224D\u20D2':'nvap','\u224E':'bump','\u224E\u0338':'nbump','\u224F':'bumpe','\u224F\u0338':'nbumpe','\u2250':'doteq','\u2250\u0338':'nedot','\u2251':'eDot','\u2252':'efDot','\u2253':'erDot','\u2254':'colone','\u2255':'ecolon','\u2256':'ecir','\u2257':'cire','\u2259':'wedgeq','\u225A':'veeeq','\u225C':'trie','\u225F':'equest','\u2261':'equiv','\u2262':'nequiv','\u2261\u20E5':'bnequiv','\u2264':'le','\u2270':'nle','\u2264\u20D2':'nvle','\u2265':'ge','\u2271':'nge','\u2265\u20D2':'nvge','\u2266':'lE','\u2266\u0338':'nlE','\u2267':'gE','\u2267\u0338':'ngE','\u2268\uFE00':'lvnE','\u2268':'lnE','\u2269':'gnE','\u2269\uFE00':'gvnE','\u226A':'ll','\u226A\u0338':'nLtv','\u226A\u20D2':'nLt','\u226B':'gg','\u226B\u0338':'nGtv','\u226B\u20D2':'nGt','\u226C':'twixt','\u2272':'lsim','\u2274':'nlsim','\u2273':'gsim','\u2275':'ngsim','\u2276':'lg','\u2278':'ntlg','\u2277':'gl','\u2279':'ntgl','\u227A':'pr','\u2280':'npr','\u227B':'sc','\u2281':'nsc','\u227C':'prcue','\u22E0':'nprcue','\u227D':'sccue','\u22E1':'nsccue','\u227E':'prsim','\u227F':'scsim','\u227F\u0338':'NotSucceedsTilde','\u2282':'sub','\u2284':'nsub','\u2282\u20D2':'vnsub','\u2283':'sup','\u2285':'nsup','\u2283\u20D2':'vnsup','\u2286':'sube','\u2288':'nsube','\u2287':'supe','\u2289':'nsupe','\u228A\uFE00':'vsubne','\u228A':'subne','\u228B\uFE00':'vsupne','\u228B':'supne','\u228D':'cupdot','\u228E':'uplus','\u228F':'sqsub','\u228F\u0338':'NotSquareSubset','\u2290':'sqsup','\u2290\u0338':'NotSquareSuperset','\u2291':'sqsube','\u22E2':'nsqsube','\u2292':'sqsupe','\u22E3':'nsqsupe','\u2293':'sqcap','\u2293\uFE00':'sqcaps','\u2294':'sqcup','\u2294\uFE00':'sqcups','\u2295':'oplus','\u2296':'ominus','\u2297':'otimes','\u2298':'osol','\u2299':'odot','\u229A':'ocir','\u229B':'oast','\u229D':'odash','\u229E':'plusb','\u229F':'minusb','\u22A0':'timesb','\u22A1':'sdotb','\u22A2':'vdash','\u22AC':'nvdash','\u22A3':'dashv','\u22A4':'top','\u22A5':'bot','\u22A7':'models','\u22A8':'vDash','\u22AD':'nvDash','\u22A9':'Vdash','\u22AE':'nVdash','\u22AA':'Vvdash','\u22AB':'VDash','\u22AF':'nVDash','\u22B0':'prurel','\u22B2':'vltri','\u22EA':'nltri','\u22B3':'vrtri','\u22EB':'nrtri','\u22B4':'ltrie','\u22EC':'nltrie','\u22B4\u20D2':'nvltrie','\u22B5':'rtrie','\u22ED':'nrtrie','\u22B5\u20D2':'nvrtrie','\u22B6':'origof','\u22B7':'imof','\u22B8':'mumap','\u22B9':'hercon','\u22BA':'intcal','\u22BB':'veebar','\u22BD':'barvee','\u22BE':'angrtvb','\u22BF':'lrtri','\u22C0':'Wedge','\u22C1':'Vee','\u22C2':'xcap','\u22C3':'xcup','\u22C4':'diam','\u22C5':'sdot','\u22C6':'Star','\u22C7':'divonx','\u22C8':'bowtie','\u22C9':'ltimes','\u22CA':'rtimes','\u22CB':'lthree','\u22CC':'rthree','\u22CD':'bsime','\u22CE':'cuvee','\u22CF':'cuwed','\u22D0':'Sub','\u22D1':'Sup','\u22D2':'Cap','\u22D3':'Cup','\u22D4':'fork','\u22D5':'epar','\u22D6':'ltdot','\u22D7':'gtdot','\u22D8':'Ll','\u22D8\u0338':'nLl','\u22D9':'Gg','\u22D9\u0338':'nGg','\u22DA\uFE00':'lesg','\u22DA':'leg','\u22DB':'gel','\u22DB\uFE00':'gesl','\u22DE':'cuepr','\u22DF':'cuesc','\u22E6':'lnsim','\u22E7':'gnsim','\u22E8':'prnsim','\u22E9':'scnsim','\u22EE':'vellip','\u22EF':'ctdot','\u22F0':'utdot','\u22F1':'dtdot','\u22F2':'disin','\u22F3':'isinsv','\u22F4':'isins','\u22F5':'isindot','\u22F5\u0338':'notindot','\u22F6':'notinvc','\u22F7':'notinvb','\u22F9':'isinE','\u22F9\u0338':'notinE','\u22FA':'nisd','\u22FB':'xnis','\u22FC':'nis','\u22FD':'notnivc','\u22FE':'notnivb','\u2305':'barwed','\u2306':'Barwed','\u230C':'drcrop','\u230D':'dlcrop','\u230E':'urcrop','\u230F':'ulcrop','\u2310':'bnot','\u2312':'profline','\u2313':'profsurf','\u2315':'telrec','\u2316':'target','\u231C':'ulcorn','\u231D':'urcorn','\u231E':'dlcorn','\u231F':'drcorn','\u2322':'frown','\u2323':'smile','\u232D':'cylcty','\u232E':'profalar','\u2336':'topbot','\u233D':'ovbar','\u233F':'solbar','\u237C':'angzarr','\u23B0':'lmoust','\u23B1':'rmoust','\u23B4':'tbrk','\u23B5':'bbrk','\u23B6':'bbrktbrk','\u23DC':'OverParenthesis','\u23DD':'UnderParenthesis','\u23DE':'OverBrace','\u23DF':'UnderBrace','\u23E2':'trpezium','\u23E7':'elinters','\u2423':'blank','\u2500':'boxh','\u2502':'boxv','\u250C':'boxdr','\u2510':'boxdl','\u2514':'boxur','\u2518':'boxul','\u251C':'boxvr','\u2524':'boxvl','\u252C':'boxhd','\u2534':'boxhu','\u253C':'boxvh','\u2550':'boxH','\u2551':'boxV','\u2552':'boxdR','\u2553':'boxDr','\u2554':'boxDR','\u2555':'boxdL','\u2556':'boxDl','\u2557':'boxDL','\u2558':'boxuR','\u2559':'boxUr','\u255A':'boxUR','\u255B':'boxuL','\u255C':'boxUl','\u255D':'boxUL','\u255E':'boxvR','\u255F':'boxVr','\u2560':'boxVR','\u2561':'boxvL','\u2562':'boxVl','\u2563':'boxVL','\u2564':'boxHd','\u2565':'boxhD','\u2566':'boxHD','\u2567':'boxHu','\u2568':'boxhU','\u2569':'boxHU','\u256A':'boxvH','\u256B':'boxVh','\u256C':'boxVH','\u2580':'uhblk','\u2584':'lhblk','\u2588':'block','\u2591':'blk14','\u2592':'blk12','\u2593':'blk34','\u25A1':'squ','\u25AA':'squf','\u25AB':'EmptyVerySmallSquare','\u25AD':'rect','\u25AE':'marker','\u25B1':'fltns','\u25B3':'xutri','\u25B4':'utrif','\u25B5':'utri','\u25B8':'rtrif','\u25B9':'rtri','\u25BD':'xdtri','\u25BE':'dtrif','\u25BF':'dtri','\u25C2':'ltrif','\u25C3':'ltri','\u25CA':'loz','\u25CB':'cir','\u25EC':'tridot','\u25EF':'xcirc','\u25F8':'ultri','\u25F9':'urtri','\u25FA':'lltri','\u25FB':'EmptySmallSquare','\u25FC':'FilledSmallSquare','\u2605':'starf','\u2606':'star','\u260E':'phone','\u2640':'female','\u2642':'male','\u2660':'spades','\u2663':'clubs','\u2665':'hearts','\u2666':'diams','\u266A':'sung','\u2713':'check','\u2717':'cross','\u2720':'malt','\u2736':'sext','\u2758':'VerticalSeparator','\u27C8':'bsolhsub','\u27C9':'suphsol','\u27F5':'xlarr','\u27F6':'xrarr','\u27F7':'xharr','\u27F8':'xlArr','\u27F9':'xrArr','\u27FA':'xhArr','\u27FC':'xmap','\u27FF':'dzigrarr','\u2902':'nvlArr','\u2903':'nvrArr','\u2904':'nvHarr','\u2905':'Map','\u290C':'lbarr','\u290D':'rbarr','\u290E':'lBarr','\u290F':'rBarr','\u2910':'RBarr','\u2911':'DDotrahd','\u2912':'UpArrowBar','\u2913':'DownArrowBar','\u2916':'Rarrtl','\u2919':'latail','\u291A':'ratail','\u291B':'lAtail','\u291C':'rAtail','\u291D':'larrfs','\u291E':'rarrfs','\u291F':'larrbfs','\u2920':'rarrbfs','\u2923':'nwarhk','\u2924':'nearhk','\u2925':'searhk','\u2926':'swarhk','\u2927':'nwnear','\u2928':'toea','\u2929':'tosa','\u292A':'swnwar','\u2933':'rarrc','\u2933\u0338':'nrarrc','\u2935':'cudarrr','\u2936':'ldca','\u2937':'rdca','\u2938':'cudarrl','\u2939':'larrpl','\u293C':'curarrm','\u293D':'cularrp','\u2945':'rarrpl','\u2948':'harrcir','\u2949':'Uarrocir','\u294A':'lurdshar','\u294B':'ldrushar','\u294E':'LeftRightVector','\u294F':'RightUpDownVector','\u2950':'DownLeftRightVector','\u2951':'LeftUpDownVector','\u2952':'LeftVectorBar','\u2953':'RightVectorBar','\u2954':'RightUpVectorBar','\u2955':'RightDownVectorBar','\u2956':'DownLeftVectorBar','\u2957':'DownRightVectorBar','\u2958':'LeftUpVectorBar','\u2959':'LeftDownVectorBar','\u295A':'LeftTeeVector','\u295B':'RightTeeVector','\u295C':'RightUpTeeVector','\u295D':'RightDownTeeVector','\u295E':'DownLeftTeeVector','\u295F':'DownRightTeeVector','\u2960':'LeftUpTeeVector','\u2961':'LeftDownTeeVector','\u2962':'lHar','\u2963':'uHar','\u2964':'rHar','\u2965':'dHar','\u2966':'luruhar','\u2967':'ldrdhar','\u2968':'ruluhar','\u2969':'rdldhar','\u296A':'lharul','\u296B':'llhard','\u296C':'rharul','\u296D':'lrhard','\u296E':'udhar','\u296F':'duhar','\u2970':'RoundImplies','\u2971':'erarr','\u2972':'simrarr','\u2973':'larrsim','\u2974':'rarrsim','\u2975':'rarrap','\u2976':'ltlarr','\u2978':'gtrarr','\u2979':'subrarr','\u297B':'suplarr','\u297C':'lfisht','\u297D':'rfisht','\u297E':'ufisht','\u297F':'dfisht','\u299A':'vzigzag','\u299C':'vangrt','\u299D':'angrtvbd','\u29A4':'ange','\u29A5':'range','\u29A6':'dwangle','\u29A7':'uwangle','\u29A8':'angmsdaa','\u29A9':'angmsdab','\u29AA':'angmsdac','\u29AB':'angmsdad','\u29AC':'angmsdae','\u29AD':'angmsdaf','\u29AE':'angmsdag','\u29AF':'angmsdah','\u29B0':'bemptyv','\u29B1':'demptyv','\u29B2':'cemptyv','\u29B3':'raemptyv','\u29B4':'laemptyv','\u29B5':'ohbar','\u29B6':'omid','\u29B7':'opar','\u29B9':'operp','\u29BB':'olcross','\u29BC':'odsold','\u29BE':'olcir','\u29BF':'ofcir','\u29C0':'olt','\u29C1':'ogt','\u29C2':'cirscir','\u29C3':'cirE','\u29C4':'solb','\u29C5':'bsolb','\u29C9':'boxbox','\u29CD':'trisb','\u29CE':'rtriltri','\u29CF':'LeftTriangleBar','\u29CF\u0338':'NotLeftTriangleBar','\u29D0':'RightTriangleBar','\u29D0\u0338':'NotRightTriangleBar','\u29DC':'iinfin','\u29DD':'infintie','\u29DE':'nvinfin','\u29E3':'eparsl','\u29E4':'smeparsl','\u29E5':'eqvparsl','\u29EB':'lozf','\u29F4':'RuleDelayed','\u29F6':'dsol','\u2A00':'xodot','\u2A01':'xoplus','\u2A02':'xotime','\u2A04':'xuplus','\u2A06':'xsqcup','\u2A0D':'fpartint','\u2A10':'cirfnint','\u2A11':'awint','\u2A12':'rppolint','\u2A13':'scpolint','\u2A14':'npolint','\u2A15':'pointint','\u2A16':'quatint','\u2A17':'intlarhk','\u2A22':'pluscir','\u2A23':'plusacir','\u2A24':'simplus','\u2A25':'plusdu','\u2A26':'plussim','\u2A27':'plustwo','\u2A29':'mcomma','\u2A2A':'minusdu','\u2A2D':'loplus','\u2A2E':'roplus','\u2A2F':'Cross','\u2A30':'timesd','\u2A31':'timesbar','\u2A33':'smashp','\u2A34':'lotimes','\u2A35':'rotimes','\u2A36':'otimesas','\u2A37':'Otimes','\u2A38':'odiv','\u2A39':'triplus','\u2A3A':'triminus','\u2A3B':'tritime','\u2A3C':'iprod','\u2A3F':'amalg','\u2A40':'capdot','\u2A42':'ncup','\u2A43':'ncap','\u2A44':'capand','\u2A45':'cupor','\u2A46':'cupcap','\u2A47':'capcup','\u2A48':'cupbrcap','\u2A49':'capbrcup','\u2A4A':'cupcup','\u2A4B':'capcap','\u2A4C':'ccups','\u2A4D':'ccaps','\u2A50':'ccupssm','\u2A53':'And','\u2A54':'Or','\u2A55':'andand','\u2A56':'oror','\u2A57':'orslope','\u2A58':'andslope','\u2A5A':'andv','\u2A5B':'orv','\u2A5C':'andd','\u2A5D':'ord','\u2A5F':'wedbar','\u2A66':'sdote','\u2A6A':'simdot','\u2A6D':'congdot','\u2A6D\u0338':'ncongdot','\u2A6E':'easter','\u2A6F':'apacir','\u2A70':'apE','\u2A70\u0338':'napE','\u2A71':'eplus','\u2A72':'pluse','\u2A73':'Esim','\u2A77':'eDDot','\u2A78':'equivDD','\u2A79':'ltcir','\u2A7A':'gtcir','\u2A7B':'ltquest','\u2A7C':'gtquest','\u2A7D':'les','\u2A7D\u0338':'nles','\u2A7E':'ges','\u2A7E\u0338':'nges','\u2A7F':'lesdot','\u2A80':'gesdot','\u2A81':'lesdoto','\u2A82':'gesdoto','\u2A83':'lesdotor','\u2A84':'gesdotol','\u2A85':'lap','\u2A86':'gap','\u2A87':'lne','\u2A88':'gne','\u2A89':'lnap','\u2A8A':'gnap','\u2A8B':'lEg','\u2A8C':'gEl','\u2A8D':'lsime','\u2A8E':'gsime','\u2A8F':'lsimg','\u2A90':'gsiml','\u2A91':'lgE','\u2A92':'glE','\u2A93':'lesges','\u2A94':'gesles','\u2A95':'els','\u2A96':'egs','\u2A97':'elsdot','\u2A98':'egsdot','\u2A99':'el','\u2A9A':'eg','\u2A9D':'siml','\u2A9E':'simg','\u2A9F':'simlE','\u2AA0':'simgE','\u2AA1':'LessLess','\u2AA1\u0338':'NotNestedLessLess','\u2AA2':'GreaterGreater','\u2AA2\u0338':'NotNestedGreaterGreater','\u2AA4':'glj','\u2AA5':'gla','\u2AA6':'ltcc','\u2AA7':'gtcc','\u2AA8':'lescc','\u2AA9':'gescc','\u2AAA':'smt','\u2AAB':'lat','\u2AAC':'smte','\u2AAC\uFE00':'smtes','\u2AAD':'late','\u2AAD\uFE00':'lates','\u2AAE':'bumpE','\u2AAF':'pre','\u2AAF\u0338':'npre','\u2AB0':'sce','\u2AB0\u0338':'nsce','\u2AB3':'prE','\u2AB4':'scE','\u2AB5':'prnE','\u2AB6':'scnE','\u2AB7':'prap','\u2AB8':'scap','\u2AB9':'prnap','\u2ABA':'scnap','\u2ABB':'Pr','\u2ABC':'Sc','\u2ABD':'subdot','\u2ABE':'supdot','\u2ABF':'subplus','\u2AC0':'supplus','\u2AC1':'submult','\u2AC2':'supmult','\u2AC3':'subedot','\u2AC4':'supedot','\u2AC5':'subE','\u2AC5\u0338':'nsubE','\u2AC6':'supE','\u2AC6\u0338':'nsupE','\u2AC7':'subsim','\u2AC8':'supsim','\u2ACB\uFE00':'vsubnE','\u2ACB':'subnE','\u2ACC\uFE00':'vsupnE','\u2ACC':'supnE','\u2ACF':'csub','\u2AD0':'csup','\u2AD1':'csube','\u2AD2':'csupe','\u2AD3':'subsup','\u2AD4':'supsub','\u2AD5':'subsub','\u2AD6':'supsup','\u2AD7':'suphsub','\u2AD8':'supdsub','\u2AD9':'forkv','\u2ADA':'topfork','\u2ADB':'mlcp','\u2AE4':'Dashv','\u2AE6':'Vdashl','\u2AE7':'Barv','\u2AE8':'vBar','\u2AE9':'vBarv','\u2AEB':'Vbar','\u2AEC':'Not','\u2AED':'bNot','\u2AEE':'rnmid','\u2AEF':'cirmid','\u2AF0':'midcir','\u2AF1':'topcir','\u2AF2':'nhpar','\u2AF3':'parsim','\u2AFD':'parsl','\u2AFD\u20E5':'nparsl','\u266D':'flat','\u266E':'natur','\u266F':'sharp','\xA4':'curren','\xA2':'cent','$':'dollar','\xA3':'pound','\xA5':'yen','\u20AC':'euro','\xB9':'sup1','\xBD':'half','\u2153':'frac13','\xBC':'frac14','\u2155':'frac15','\u2159':'frac16','\u215B':'frac18','\xB2':'sup2','\u2154':'frac23','\u2156':'frac25','\xB3':'sup3','\xBE':'frac34','\u2157':'frac35','\u215C':'frac38','\u2158':'frac45','\u215A':'frac56','\u215D':'frac58','\u215E':'frac78','\uD835\uDCB6':'ascr','\uD835\uDD52':'aopf','\uD835\uDD1E':'afr','\uD835\uDD38':'Aopf','\uD835\uDD04':'Afr','\uD835\uDC9C':'Ascr','\xAA':'ordf','\xE1':'aacute','\xC1':'Aacute','\xE0':'agrave','\xC0':'Agrave','\u0103':'abreve','\u0102':'Abreve','\xE2':'acirc','\xC2':'Acirc','\xE5':'aring','\xC5':'angst','\xE4':'auml','\xC4':'Auml','\xE3':'atilde','\xC3':'Atilde','\u0105':'aogon','\u0104':'Aogon','\u0101':'amacr','\u0100':'Amacr','\xE6':'aelig','\xC6':'AElig','\uD835\uDCB7':'bscr','\uD835\uDD53':'bopf','\uD835\uDD1F':'bfr','\uD835\uDD39':'Bopf','\u212C':'Bscr','\uD835\uDD05':'Bfr','\uD835\uDD20':'cfr','\uD835\uDCB8':'cscr','\uD835\uDD54':'copf','\u212D':'Cfr','\uD835\uDC9E':'Cscr','\u2102':'Copf','\u0107':'cacute','\u0106':'Cacute','\u0109':'ccirc','\u0108':'Ccirc','\u010D':'ccaron','\u010C':'Ccaron','\u010B':'cdot','\u010A':'Cdot','\xE7':'ccedil','\xC7':'Ccedil','\u2105':'incare','\uD835\uDD21':'dfr','\u2146':'dd','\uD835\uDD55':'dopf','\uD835\uDCB9':'dscr','\uD835\uDC9F':'Dscr','\uD835\uDD07':'Dfr','\u2145':'DD','\uD835\uDD3B':'Dopf','\u010F':'dcaron','\u010E':'Dcaron','\u0111':'dstrok','\u0110':'Dstrok','\xF0':'eth','\xD0':'ETH','\u2147':'ee','\u212F':'escr','\uD835\uDD22':'efr','\uD835\uDD56':'eopf','\u2130':'Escr','\uD835\uDD08':'Efr','\uD835\uDD3C':'Eopf','\xE9':'eacute','\xC9':'Eacute','\xE8':'egrave','\xC8':'Egrave','\xEA':'ecirc','\xCA':'Ecirc','\u011B':'ecaron','\u011A':'Ecaron','\xEB':'euml','\xCB':'Euml','\u0117':'edot','\u0116':'Edot','\u0119':'eogon','\u0118':'Eogon','\u0113':'emacr','\u0112':'Emacr','\uD835\uDD23':'ffr','\uD835\uDD57':'fopf','\uD835\uDCBB':'fscr','\uD835\uDD09':'Ffr','\uD835\uDD3D':'Fopf','\u2131':'Fscr','\uFB00':'fflig','\uFB03':'ffilig','\uFB04':'ffllig','\uFB01':'filig','fj':'fjlig','\uFB02':'fllig','\u0192':'fnof','\u210A':'gscr','\uD835\uDD58':'gopf','\uD835\uDD24':'gfr','\uD835\uDCA2':'Gscr','\uD835\uDD3E':'Gopf','\uD835\uDD0A':'Gfr','\u01F5':'gacute','\u011F':'gbreve','\u011E':'Gbreve','\u011D':'gcirc','\u011C':'Gcirc','\u0121':'gdot','\u0120':'Gdot','\u0122':'Gcedil','\uD835\uDD25':'hfr','\u210E':'planckh','\uD835\uDCBD':'hscr','\uD835\uDD59':'hopf','\u210B':'Hscr','\u210C':'Hfr','\u210D':'Hopf','\u0125':'hcirc','\u0124':'Hcirc','\u210F':'hbar','\u0127':'hstrok','\u0126':'Hstrok','\uD835\uDD5A':'iopf','\uD835\uDD26':'ifr','\uD835\uDCBE':'iscr','\u2148':'ii','\uD835\uDD40':'Iopf','\u2110':'Iscr','\u2111':'Im','\xED':'iacute','\xCD':'Iacute','\xEC':'igrave','\xCC':'Igrave','\xEE':'icirc','\xCE':'Icirc','\xEF':'iuml','\xCF':'Iuml','\u0129':'itilde','\u0128':'Itilde','\u0130':'Idot','\u012F':'iogon','\u012E':'Iogon','\u012B':'imacr','\u012A':'Imacr','\u0133':'ijlig','\u0132':'IJlig','\u0131':'imath','\uD835\uDCBF':'jscr','\uD835\uDD5B':'jopf','\uD835\uDD27':'jfr','\uD835\uDCA5':'Jscr','\uD835\uDD0D':'Jfr','\uD835\uDD41':'Jopf','\u0135':'jcirc','\u0134':'Jcirc','\u0237':'jmath','\uD835\uDD5C':'kopf','\uD835\uDCC0':'kscr','\uD835\uDD28':'kfr','\uD835\uDCA6':'Kscr','\uD835\uDD42':'Kopf','\uD835\uDD0E':'Kfr','\u0137':'kcedil','\u0136':'Kcedil','\uD835\uDD29':'lfr','\uD835\uDCC1':'lscr','\u2113':'ell','\uD835\uDD5D':'lopf','\u2112':'Lscr','\uD835\uDD0F':'Lfr','\uD835\uDD43':'Lopf','\u013A':'lacute','\u0139':'Lacute','\u013E':'lcaron','\u013D':'Lcaron','\u013C':'lcedil','\u013B':'Lcedil','\u0142':'lstrok','\u0141':'Lstrok','\u0140':'lmidot','\u013F':'Lmidot','\uD835\uDD2A':'mfr','\uD835\uDD5E':'mopf','\uD835\uDCC2':'mscr','\uD835\uDD10':'Mfr','\uD835\uDD44':'Mopf','\u2133':'Mscr','\uD835\uDD2B':'nfr','\uD835\uDD5F':'nopf','\uD835\uDCC3':'nscr','\u2115':'Nopf','\uD835\uDCA9':'Nscr','\uD835\uDD11':'Nfr','\u0144':'nacute','\u0143':'Nacute','\u0148':'ncaron','\u0147':'Ncaron','\xF1':'ntilde','\xD1':'Ntilde','\u0146':'ncedil','\u0145':'Ncedil','\u2116':'numero','\u014B':'eng','\u014A':'ENG','\uD835\uDD60':'oopf','\uD835\uDD2C':'ofr','\u2134':'oscr','\uD835\uDCAA':'Oscr','\uD835\uDD12':'Ofr','\uD835\uDD46':'Oopf','\xBA':'ordm','\xF3':'oacute','\xD3':'Oacute','\xF2':'ograve','\xD2':'Ograve','\xF4':'ocirc','\xD4':'Ocirc','\xF6':'ouml','\xD6':'Ouml','\u0151':'odblac','\u0150':'Odblac','\xF5':'otilde','\xD5':'Otilde','\xF8':'oslash','\xD8':'Oslash','\u014D':'omacr','\u014C':'Omacr','\u0153':'oelig','\u0152':'OElig','\uD835\uDD2D':'pfr','\uD835\uDCC5':'pscr','\uD835\uDD61':'popf','\u2119':'Popf','\uD835\uDD13':'Pfr','\uD835\uDCAB':'Pscr','\uD835\uDD62':'qopf','\uD835\uDD2E':'qfr','\uD835\uDCC6':'qscr','\uD835\uDCAC':'Qscr','\uD835\uDD14':'Qfr','\u211A':'Qopf','\u0138':'kgreen','\uD835\uDD2F':'rfr','\uD835\uDD63':'ropf','\uD835\uDCC7':'rscr','\u211B':'Rscr','\u211C':'Re','\u211D':'Ropf','\u0155':'racute','\u0154':'Racute','\u0159':'rcaron','\u0158':'Rcaron','\u0157':'rcedil','\u0156':'Rcedil','\uD835\uDD64':'sopf','\uD835\uDCC8':'sscr','\uD835\uDD30':'sfr','\uD835\uDD4A':'Sopf','\uD835\uDD16':'Sfr','\uD835\uDCAE':'Sscr','\u24C8':'oS','\u015B':'sacute','\u015A':'Sacute','\u015D':'scirc','\u015C':'Scirc','\u0161':'scaron','\u0160':'Scaron','\u015F':'scedil','\u015E':'Scedil','\xDF':'szlig','\uD835\uDD31':'tfr','\uD835\uDCC9':'tscr','\uD835\uDD65':'topf','\uD835\uDCAF':'Tscr','\uD835\uDD17':'Tfr','\uD835\uDD4B':'Topf','\u0165':'tcaron','\u0164':'Tcaron','\u0163':'tcedil','\u0162':'Tcedil','\u2122':'trade','\u0167':'tstrok','\u0166':'Tstrok','\uD835\uDCCA':'uscr','\uD835\uDD66':'uopf','\uD835\uDD32':'ufr','\uD835\uDD4C':'Uopf','\uD835\uDD18':'Ufr','\uD835\uDCB0':'Uscr','\xFA':'uacute','\xDA':'Uacute','\xF9':'ugrave','\xD9':'Ugrave','\u016D':'ubreve','\u016C':'Ubreve','\xFB':'ucirc','\xDB':'Ucirc','\u016F':'uring','\u016E':'Uring','\xFC':'uuml','\xDC':'Uuml','\u0171':'udblac','\u0170':'Udblac','\u0169':'utilde','\u0168':'Utilde','\u0173':'uogon','\u0172':'Uogon','\u016B':'umacr','\u016A':'Umacr','\uD835\uDD33':'vfr','\uD835\uDD67':'vopf','\uD835\uDCCB':'vscr','\uD835\uDD19':'Vfr','\uD835\uDD4D':'Vopf','\uD835\uDCB1':'Vscr','\uD835\uDD68':'wopf','\uD835\uDCCC':'wscr','\uD835\uDD34':'wfr','\uD835\uDCB2':'Wscr','\uD835\uDD4E':'Wopf','\uD835\uDD1A':'Wfr','\u0175':'wcirc','\u0174':'Wcirc','\uD835\uDD35':'xfr','\uD835\uDCCD':'xscr','\uD835\uDD69':'xopf','\uD835\uDD4F':'Xopf','\uD835\uDD1B':'Xfr','\uD835\uDCB3':'Xscr','\uD835\uDD36':'yfr','\uD835\uDCCE':'yscr','\uD835\uDD6A':'yopf','\uD835\uDCB4':'Yscr','\uD835\uDD1C':'Yfr','\uD835\uDD50':'Yopf','\xFD':'yacute','\xDD':'Yacute','\u0177':'ycirc','\u0176':'Ycirc','\xFF':'yuml','\u0178':'Yuml','\uD835\uDCCF':'zscr','\uD835\uDD37':'zfr','\uD835\uDD6B':'zopf','\u2128':'Zfr','\u2124':'Zopf','\uD835\uDCB5':'Zscr','\u017A':'zacute','\u0179':'Zacute','\u017E':'zcaron','\u017D':'Zcaron','\u017C':'zdot','\u017B':'Zdot','\u01B5':'imped','\xFE':'thorn','\xDE':'THORN','\u0149':'napos','\u03B1':'alpha','\u0391':'Alpha','\u03B2':'beta','\u0392':'Beta','\u03B3':'gamma','\u0393':'Gamma','\u03B4':'delta','\u0394':'Delta','\u03B5':'epsi','\u03F5':'epsiv','\u0395':'Epsilon','\u03DD':'gammad','\u03DC':'Gammad','\u03B6':'zeta','\u0396':'Zeta','\u03B7':'eta','\u0397':'Eta','\u03B8':'theta','\u03D1':'thetav','\u0398':'Theta','\u03B9':'iota','\u0399':'Iota','\u03BA':'kappa','\u03F0':'kappav','\u039A':'Kappa','\u03BB':'lambda','\u039B':'Lambda','\u03BC':'mu','\xB5':'micro','\u039C':'Mu','\u03BD':'nu','\u039D':'Nu','\u03BE':'xi','\u039E':'Xi','\u03BF':'omicron','\u039F':'Omicron','\u03C0':'pi','\u03D6':'piv','\u03A0':'Pi','\u03C1':'rho','\u03F1':'rhov','\u03A1':'Rho','\u03C3':'sigma','\u03A3':'Sigma','\u03C2':'sigmaf','\u03C4':'tau','\u03A4':'Tau','\u03C5':'upsi','\u03A5':'Upsilon','\u03D2':'Upsi','\u03C6':'phi','\u03D5':'phiv','\u03A6':'Phi','\u03C7':'chi','\u03A7':'Chi','\u03C8':'psi','\u03A8':'Psi','\u03C9':'omega','\u03A9':'ohm','\u0430':'acy','\u0410':'Acy','\u0431':'bcy','\u0411':'Bcy','\u0432':'vcy','\u0412':'Vcy','\u0433':'gcy','\u0413':'Gcy','\u0453':'gjcy','\u0403':'GJcy','\u0434':'dcy','\u0414':'Dcy','\u0452':'djcy','\u0402':'DJcy','\u0435':'iecy','\u0415':'IEcy','\u0451':'iocy','\u0401':'IOcy','\u0454':'jukcy','\u0404':'Jukcy','\u0436':'zhcy','\u0416':'ZHcy','\u0437':'zcy','\u0417':'Zcy','\u0455':'dscy','\u0405':'DScy','\u0438':'icy','\u0418':'Icy','\u0456':'iukcy','\u0406':'Iukcy','\u0457':'yicy','\u0407':'YIcy','\u0439':'jcy','\u0419':'Jcy','\u0458':'jsercy','\u0408':'Jsercy','\u043A':'kcy','\u041A':'Kcy','\u045C':'kjcy','\u040C':'KJcy','\u043B':'lcy','\u041B':'Lcy','\u0459':'ljcy','\u0409':'LJcy','\u043C':'mcy','\u041C':'Mcy','\u043D':'ncy','\u041D':'Ncy','\u045A':'njcy','\u040A':'NJcy','\u043E':'ocy','\u041E':'Ocy','\u043F':'pcy','\u041F':'Pcy','\u0440':'rcy','\u0420':'Rcy','\u0441':'scy','\u0421':'Scy','\u0442':'tcy','\u0422':'Tcy','\u045B':'tshcy','\u040B':'TSHcy','\u0443':'ucy','\u0423':'Ucy','\u045E':'ubrcy','\u040E':'Ubrcy','\u0444':'fcy','\u0424':'Fcy','\u0445':'khcy','\u0425':'KHcy','\u0446':'tscy','\u0426':'TScy','\u0447':'chcy','\u0427':'CHcy','\u045F':'dzcy','\u040F':'DZcy','\u0448':'shcy','\u0428':'SHcy','\u0449':'shchcy','\u0429':'SHCHcy','\u044A':'hardcy','\u042A':'HARDcy','\u044B':'ycy','\u042B':'Ycy','\u044C':'softcy','\u042C':'SOFTcy','\u044D':'ecy','\u042D':'Ecy','\u044E':'yucy','\u042E':'YUcy','\u044F':'yacy','\u042F':'YAcy','\u2135':'aleph','\u2136':'beth','\u2137':'gimel','\u2138':'daleth'};
+
+	var regexEscape = /["&'<>`]/g;
+	var escapeMap = {
+		'"': '&quot;',
+		'&': '&amp;',
+		'\'': '&#x27;',
+		'<': '&lt;',
+		// See https://mathiasbynens.be/notes/ambiguous-ampersands: in HTML, the
+		// following is not strictly necessary unless it’s part of a tag or an
+		// unquoted attribute value. We’re only escaping it to support those
+		// situations, and for XML support.
+		'>': '&gt;',
+		// In Internet Explorer ≤ 8, the backtick character can be used
+		// to break out of (un)quoted attribute values or HTML comments.
+		// See http://html5sec.org/#102, http://html5sec.org/#108, and
+		// http://html5sec.org/#133.
+		'`': '&#x60;'
+	};
+
+	var regexInvalidEntity = /&#(?:[xX][^a-fA-F0-9]|[^0-9xX])/;
+	var regexInvalidRawCodePoint = /[\0-\x08\x0B\x0E-\x1F\x7F-\x9F\uFDD0-\uFDEF\uFFFE\uFFFF]|[\uD83F\uD87F\uD8BF\uD8FF\uD93F\uD97F\uD9BF\uD9FF\uDA3F\uDA7F\uDABF\uDAFF\uDB3F\uDB7F\uDBBF\uDBFF][\uDFFE\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/;
+	var regexDecode = /&#([0-9]+)(;?)|&#[xX]([a-fA-F0-9]+)(;?)|&([0-9a-zA-Z]+);|&(Aacute|Agrave|Atilde|Ccedil|Eacute|Egrave|Iacute|Igrave|Ntilde|Oacute|Ograve|Oslash|Otilde|Uacute|Ugrave|Yacute|aacute|agrave|atilde|brvbar|ccedil|curren|divide|eacute|egrave|frac12|frac14|frac34|iacute|igrave|iquest|middot|ntilde|oacute|ograve|oslash|otilde|plusmn|uacute|ugrave|yacute|AElig|Acirc|Aring|Ecirc|Icirc|Ocirc|THORN|Ucirc|acirc|acute|aelig|aring|cedil|ecirc|icirc|iexcl|laquo|micro|ocirc|pound|raquo|szlig|thorn|times|ucirc|Auml|COPY|Euml|Iuml|Ouml|QUOT|Uuml|auml|cent|copy|euml|iuml|macr|nbsp|ordf|ordm|ouml|para|quot|sect|sup1|sup2|sup3|uuml|yuml|AMP|ETH|REG|amp|deg|eth|not|reg|shy|uml|yen|GT|LT|gt|lt)([=a-zA-Z0-9])?/g;
+	var decodeMap = {'aacute':'\xE1','Aacute':'\xC1','abreve':'\u0103','Abreve':'\u0102','ac':'\u223E','acd':'\u223F','acE':'\u223E\u0333','acirc':'\xE2','Acirc':'\xC2','acute':'\xB4','acy':'\u0430','Acy':'\u0410','aelig':'\xE6','AElig':'\xC6','af':'\u2061','afr':'\uD835\uDD1E','Afr':'\uD835\uDD04','agrave':'\xE0','Agrave':'\xC0','alefsym':'\u2135','aleph':'\u2135','alpha':'\u03B1','Alpha':'\u0391','amacr':'\u0101','Amacr':'\u0100','amalg':'\u2A3F','amp':'&','AMP':'&','and':'\u2227','And':'\u2A53','andand':'\u2A55','andd':'\u2A5C','andslope':'\u2A58','andv':'\u2A5A','ang':'\u2220','ange':'\u29A4','angle':'\u2220','angmsd':'\u2221','angmsdaa':'\u29A8','angmsdab':'\u29A9','angmsdac':'\u29AA','angmsdad':'\u29AB','angmsdae':'\u29AC','angmsdaf':'\u29AD','angmsdag':'\u29AE','angmsdah':'\u29AF','angrt':'\u221F','angrtvb':'\u22BE','angrtvbd':'\u299D','angsph':'\u2222','angst':'\xC5','angzarr':'\u237C','aogon':'\u0105','Aogon':'\u0104','aopf':'\uD835\uDD52','Aopf':'\uD835\uDD38','ap':'\u2248','apacir':'\u2A6F','ape':'\u224A','apE':'\u2A70','apid':'\u224B','apos':'\'','ApplyFunction':'\u2061','approx':'\u2248','approxeq':'\u224A','aring':'\xE5','Aring':'\xC5','ascr':'\uD835\uDCB6','Ascr':'\uD835\uDC9C','Assign':'\u2254','ast':'*','asymp':'\u2248','asympeq':'\u224D','atilde':'\xE3','Atilde':'\xC3','auml':'\xE4','Auml':'\xC4','awconint':'\u2233','awint':'\u2A11','backcong':'\u224C','backepsilon':'\u03F6','backprime':'\u2035','backsim':'\u223D','backsimeq':'\u22CD','Backslash':'\u2216','Barv':'\u2AE7','barvee':'\u22BD','barwed':'\u2305','Barwed':'\u2306','barwedge':'\u2305','bbrk':'\u23B5','bbrktbrk':'\u23B6','bcong':'\u224C','bcy':'\u0431','Bcy':'\u0411','bdquo':'\u201E','becaus':'\u2235','because':'\u2235','Because':'\u2235','bemptyv':'\u29B0','bepsi':'\u03F6','bernou':'\u212C','Bernoullis':'\u212C','beta':'\u03B2','Beta':'\u0392','beth':'\u2136','between':'\u226C','bfr':'\uD835\uDD1F','Bfr':'\uD835\uDD05','bigcap':'\u22C2','bigcirc':'\u25EF','bigcup':'\u22C3','bigodot':'\u2A00','bigoplus':'\u2A01','bigotimes':'\u2A02','bigsqcup':'\u2A06','bigstar':'\u2605','bigtriangledown':'\u25BD','bigtriangleup':'\u25B3','biguplus':'\u2A04','bigvee':'\u22C1','bigwedge':'\u22C0','bkarow':'\u290D','blacklozenge':'\u29EB','blacksquare':'\u25AA','blacktriangle':'\u25B4','blacktriangledown':'\u25BE','blacktriangleleft':'\u25C2','blacktriangleright':'\u25B8','blank':'\u2423','blk12':'\u2592','blk14':'\u2591','blk34':'\u2593','block':'\u2588','bne':'=\u20E5','bnequiv':'\u2261\u20E5','bnot':'\u2310','bNot':'\u2AED','bopf':'\uD835\uDD53','Bopf':'\uD835\uDD39','bot':'\u22A5','bottom':'\u22A5','bowtie':'\u22C8','boxbox':'\u29C9','boxdl':'\u2510','boxdL':'\u2555','boxDl':'\u2556','boxDL':'\u2557','boxdr':'\u250C','boxdR':'\u2552','boxDr':'\u2553','boxDR':'\u2554','boxh':'\u2500','boxH':'\u2550','boxhd':'\u252C','boxhD':'\u2565','boxHd':'\u2564','boxHD':'\u2566','boxhu':'\u2534','boxhU':'\u2568','boxHu':'\u2567','boxHU':'\u2569','boxminus':'\u229F','boxplus':'\u229E','boxtimes':'\u22A0','boxul':'\u2518','boxuL':'\u255B','boxUl':'\u255C','boxUL':'\u255D','boxur':'\u2514','boxuR':'\u2558','boxUr':'\u2559','boxUR':'\u255A','boxv':'\u2502','boxV':'\u2551','boxvh':'\u253C','boxvH':'\u256A','boxVh':'\u256B','boxVH':'\u256C','boxvl':'\u2524','boxvL':'\u2561','boxVl':'\u2562','boxVL':'\u2563','boxvr':'\u251C','boxvR':'\u255E','boxVr':'\u255F','boxVR':'\u2560','bprime':'\u2035','breve':'\u02D8','Breve':'\u02D8','brvbar':'\xA6','bscr':'\uD835\uDCB7','Bscr':'\u212C','bsemi':'\u204F','bsim':'\u223D','bsime':'\u22CD','bsol':'\\','bsolb':'\u29C5','bsolhsub':'\u27C8','bull':'\u2022','bullet':'\u2022','bump':'\u224E','bumpe':'\u224F','bumpE':'\u2AAE','bumpeq':'\u224F','Bumpeq':'\u224E','cacute':'\u0107','Cacute':'\u0106','cap':'\u2229','Cap':'\u22D2','capand':'\u2A44','capbrcup':'\u2A49','capcap':'\u2A4B','capcup':'\u2A47','capdot':'\u2A40','CapitalDifferentialD':'\u2145','caps':'\u2229\uFE00','caret':'\u2041','caron':'\u02C7','Cayleys':'\u212D','ccaps':'\u2A4D','ccaron':'\u010D','Ccaron':'\u010C','ccedil':'\xE7','Ccedil':'\xC7','ccirc':'\u0109','Ccirc':'\u0108','Cconint':'\u2230','ccups':'\u2A4C','ccupssm':'\u2A50','cdot':'\u010B','Cdot':'\u010A','cedil':'\xB8','Cedilla':'\xB8','cemptyv':'\u29B2','cent':'\xA2','centerdot':'\xB7','CenterDot':'\xB7','cfr':'\uD835\uDD20','Cfr':'\u212D','chcy':'\u0447','CHcy':'\u0427','check':'\u2713','checkmark':'\u2713','chi':'\u03C7','Chi':'\u03A7','cir':'\u25CB','circ':'\u02C6','circeq':'\u2257','circlearrowleft':'\u21BA','circlearrowright':'\u21BB','circledast':'\u229B','circledcirc':'\u229A','circleddash':'\u229D','CircleDot':'\u2299','circledR':'\xAE','circledS':'\u24C8','CircleMinus':'\u2296','CirclePlus':'\u2295','CircleTimes':'\u2297','cire':'\u2257','cirE':'\u29C3','cirfnint':'\u2A10','cirmid':'\u2AEF','cirscir':'\u29C2','ClockwiseContourIntegral':'\u2232','CloseCurlyDoubleQuote':'\u201D','CloseCurlyQuote':'\u2019','clubs':'\u2663','clubsuit':'\u2663','colon':':','Colon':'\u2237','colone':'\u2254','Colone':'\u2A74','coloneq':'\u2254','comma':',','commat':'@','comp':'\u2201','compfn':'\u2218','complement':'\u2201','complexes':'\u2102','cong':'\u2245','congdot':'\u2A6D','Congruent':'\u2261','conint':'\u222E','Conint':'\u222F','ContourIntegral':'\u222E','copf':'\uD835\uDD54','Copf':'\u2102','coprod':'\u2210','Coproduct':'\u2210','copy':'\xA9','COPY':'\xA9','copysr':'\u2117','CounterClockwiseContourIntegral':'\u2233','crarr':'\u21B5','cross':'\u2717','Cross':'\u2A2F','cscr':'\uD835\uDCB8','Cscr':'\uD835\uDC9E','csub':'\u2ACF','csube':'\u2AD1','csup':'\u2AD0','csupe':'\u2AD2','ctdot':'\u22EF','cudarrl':'\u2938','cudarrr':'\u2935','cuepr':'\u22DE','cuesc':'\u22DF','cularr':'\u21B6','cularrp':'\u293D','cup':'\u222A','Cup':'\u22D3','cupbrcap':'\u2A48','cupcap':'\u2A46','CupCap':'\u224D','cupcup':'\u2A4A','cupdot':'\u228D','cupor':'\u2A45','cups':'\u222A\uFE00','curarr':'\u21B7','curarrm':'\u293C','curlyeqprec':'\u22DE','curlyeqsucc':'\u22DF','curlyvee':'\u22CE','curlywedge':'\u22CF','curren':'\xA4','curvearrowleft':'\u21B6','curvearrowright':'\u21B7','cuvee':'\u22CE','cuwed':'\u22CF','cwconint':'\u2232','cwint':'\u2231','cylcty':'\u232D','dagger':'\u2020','Dagger':'\u2021','daleth':'\u2138','darr':'\u2193','dArr':'\u21D3','Darr':'\u21A1','dash':'\u2010','dashv':'\u22A3','Dashv':'\u2AE4','dbkarow':'\u290F','dblac':'\u02DD','dcaron':'\u010F','Dcaron':'\u010E','dcy':'\u0434','Dcy':'\u0414','dd':'\u2146','DD':'\u2145','ddagger':'\u2021','ddarr':'\u21CA','DDotrahd':'\u2911','ddotseq':'\u2A77','deg':'\xB0','Del':'\u2207','delta':'\u03B4','Delta':'\u0394','demptyv':'\u29B1','dfisht':'\u297F','dfr':'\uD835\uDD21','Dfr':'\uD835\uDD07','dHar':'\u2965','dharl':'\u21C3','dharr':'\u21C2','DiacriticalAcute':'\xB4','DiacriticalDot':'\u02D9','DiacriticalDoubleAcute':'\u02DD','DiacriticalGrave':'`','DiacriticalTilde':'\u02DC','diam':'\u22C4','diamond':'\u22C4','Diamond':'\u22C4','diamondsuit':'\u2666','diams':'\u2666','die':'\xA8','DifferentialD':'\u2146','digamma':'\u03DD','disin':'\u22F2','div':'\xF7','divide':'\xF7','divideontimes':'\u22C7','divonx':'\u22C7','djcy':'\u0452','DJcy':'\u0402','dlcorn':'\u231E','dlcrop':'\u230D','dollar':'$','dopf':'\uD835\uDD55','Dopf':'\uD835\uDD3B','dot':'\u02D9','Dot':'\xA8','DotDot':'\u20DC','doteq':'\u2250','doteqdot':'\u2251','DotEqual':'\u2250','dotminus':'\u2238','dotplus':'\u2214','dotsquare':'\u22A1','doublebarwedge':'\u2306','DoubleContourIntegral':'\u222F','DoubleDot':'\xA8','DoubleDownArrow':'\u21D3','DoubleLeftArrow':'\u21D0','DoubleLeftRightArrow':'\u21D4','DoubleLeftTee':'\u2AE4','DoubleLongLeftArrow':'\u27F8','DoubleLongLeftRightArrow':'\u27FA','DoubleLongRightArrow':'\u27F9','DoubleRightArrow':'\u21D2','DoubleRightTee':'\u22A8','DoubleUpArrow':'\u21D1','DoubleUpDownArrow':'\u21D5','DoubleVerticalBar':'\u2225','downarrow':'\u2193','Downarrow':'\u21D3','DownArrow':'\u2193','DownArrowBar':'\u2913','DownArrowUpArrow':'\u21F5','DownBreve':'\u0311','downdownarrows':'\u21CA','downharpoonleft':'\u21C3','downharpoonright':'\u21C2','DownLeftRightVector':'\u2950','DownLeftTeeVector':'\u295E','DownLeftVector':'\u21BD','DownLeftVectorBar':'\u2956','DownRightTeeVector':'\u295F','DownRightVector':'\u21C1','DownRightVectorBar':'\u2957','DownTee':'\u22A4','DownTeeArrow':'\u21A7','drbkarow':'\u2910','drcorn':'\u231F','drcrop':'\u230C','dscr':'\uD835\uDCB9','Dscr':'\uD835\uDC9F','dscy':'\u0455','DScy':'\u0405','dsol':'\u29F6','dstrok':'\u0111','Dstrok':'\u0110','dtdot':'\u22F1','dtri':'\u25BF','dtrif':'\u25BE','duarr':'\u21F5','duhar':'\u296F','dwangle':'\u29A6','dzcy':'\u045F','DZcy':'\u040F','dzigrarr':'\u27FF','eacute':'\xE9','Eacute':'\xC9','easter':'\u2A6E','ecaron':'\u011B','Ecaron':'\u011A','ecir':'\u2256','ecirc':'\xEA','Ecirc':'\xCA','ecolon':'\u2255','ecy':'\u044D','Ecy':'\u042D','eDDot':'\u2A77','edot':'\u0117','eDot':'\u2251','Edot':'\u0116','ee':'\u2147','efDot':'\u2252','efr':'\uD835\uDD22','Efr':'\uD835\uDD08','eg':'\u2A9A','egrave':'\xE8','Egrave':'\xC8','egs':'\u2A96','egsdot':'\u2A98','el':'\u2A99','Element':'\u2208','elinters':'\u23E7','ell':'\u2113','els':'\u2A95','elsdot':'\u2A97','emacr':'\u0113','Emacr':'\u0112','empty':'\u2205','emptyset':'\u2205','EmptySmallSquare':'\u25FB','emptyv':'\u2205','EmptyVerySmallSquare':'\u25AB','emsp':'\u2003','emsp13':'\u2004','emsp14':'\u2005','eng':'\u014B','ENG':'\u014A','ensp':'\u2002','eogon':'\u0119','Eogon':'\u0118','eopf':'\uD835\uDD56','Eopf':'\uD835\uDD3C','epar':'\u22D5','eparsl':'\u29E3','eplus':'\u2A71','epsi':'\u03B5','epsilon':'\u03B5','Epsilon':'\u0395','epsiv':'\u03F5','eqcirc':'\u2256','eqcolon':'\u2255','eqsim':'\u2242','eqslantgtr':'\u2A96','eqslantless':'\u2A95','Equal':'\u2A75','equals':'=','EqualTilde':'\u2242','equest':'\u225F','Equilibrium':'\u21CC','equiv':'\u2261','equivDD':'\u2A78','eqvparsl':'\u29E5','erarr':'\u2971','erDot':'\u2253','escr':'\u212F','Escr':'\u2130','esdot':'\u2250','esim':'\u2242','Esim':'\u2A73','eta':'\u03B7','Eta':'\u0397','eth':'\xF0','ETH':'\xD0','euml':'\xEB','Euml':'\xCB','euro':'\u20AC','excl':'!','exist':'\u2203','Exists':'\u2203','expectation':'\u2130','exponentiale':'\u2147','ExponentialE':'\u2147','fallingdotseq':'\u2252','fcy':'\u0444','Fcy':'\u0424','female':'\u2640','ffilig':'\uFB03','fflig':'\uFB00','ffllig':'\uFB04','ffr':'\uD835\uDD23','Ffr':'\uD835\uDD09','filig':'\uFB01','FilledSmallSquare':'\u25FC','FilledVerySmallSquare':'\u25AA','fjlig':'fj','flat':'\u266D','fllig':'\uFB02','fltns':'\u25B1','fnof':'\u0192','fopf':'\uD835\uDD57','Fopf':'\uD835\uDD3D','forall':'\u2200','ForAll':'\u2200','fork':'\u22D4','forkv':'\u2AD9','Fouriertrf':'\u2131','fpartint':'\u2A0D','frac12':'\xBD','frac13':'\u2153','frac14':'\xBC','frac15':'\u2155','frac16':'\u2159','frac18':'\u215B','frac23':'\u2154','frac25':'\u2156','frac34':'\xBE','frac35':'\u2157','frac38':'\u215C','frac45':'\u2158','frac56':'\u215A','frac58':'\u215D','frac78':'\u215E','frasl':'\u2044','frown':'\u2322','fscr':'\uD835\uDCBB','Fscr':'\u2131','gacute':'\u01F5','gamma':'\u03B3','Gamma':'\u0393','gammad':'\u03DD','Gammad':'\u03DC','gap':'\u2A86','gbreve':'\u011F','Gbreve':'\u011E','Gcedil':'\u0122','gcirc':'\u011D','Gcirc':'\u011C','gcy':'\u0433','Gcy':'\u0413','gdot':'\u0121','Gdot':'\u0120','ge':'\u2265','gE':'\u2267','gel':'\u22DB','gEl':'\u2A8C','geq':'\u2265','geqq':'\u2267','geqslant':'\u2A7E','ges':'\u2A7E','gescc':'\u2AA9','gesdot':'\u2A80','gesdoto':'\u2A82','gesdotol':'\u2A84','gesl':'\u22DB\uFE00','gesles':'\u2A94','gfr':'\uD835\uDD24','Gfr':'\uD835\uDD0A','gg':'\u226B','Gg':'\u22D9','ggg':'\u22D9','gimel':'\u2137','gjcy':'\u0453','GJcy':'\u0403','gl':'\u2277','gla':'\u2AA5','glE':'\u2A92','glj':'\u2AA4','gnap':'\u2A8A','gnapprox':'\u2A8A','gne':'\u2A88','gnE':'\u2269','gneq':'\u2A88','gneqq':'\u2269','gnsim':'\u22E7','gopf':'\uD835\uDD58','Gopf':'\uD835\uDD3E','grave':'`','GreaterEqual':'\u2265','GreaterEqualLess':'\u22DB','GreaterFullEqual':'\u2267','GreaterGreater':'\u2AA2','GreaterLess':'\u2277','GreaterSlantEqual':'\u2A7E','GreaterTilde':'\u2273','gscr':'\u210A','Gscr':'\uD835\uDCA2','gsim':'\u2273','gsime':'\u2A8E','gsiml':'\u2A90','gt':'>','Gt':'\u226B','GT':'>','gtcc':'\u2AA7','gtcir':'\u2A7A','gtdot':'\u22D7','gtlPar':'\u2995','gtquest':'\u2A7C','gtrapprox':'\u2A86','gtrarr':'\u2978','gtrdot':'\u22D7','gtreqless':'\u22DB','gtreqqless':'\u2A8C','gtrless':'\u2277','gtrsim':'\u2273','gvertneqq':'\u2269\uFE00','gvnE':'\u2269\uFE00','Hacek':'\u02C7','hairsp':'\u200A','half':'\xBD','hamilt':'\u210B','hardcy':'\u044A','HARDcy':'\u042A','harr':'\u2194','hArr':'\u21D4','harrcir':'\u2948','harrw':'\u21AD','Hat':'^','hbar':'\u210F','hcirc':'\u0125','Hcirc':'\u0124','hearts':'\u2665','heartsuit':'\u2665','hellip':'\u2026','hercon':'\u22B9','hfr':'\uD835\uDD25','Hfr':'\u210C','HilbertSpace':'\u210B','hksearow':'\u2925','hkswarow':'\u2926','hoarr':'\u21FF','homtht':'\u223B','hookleftarrow':'\u21A9','hookrightarrow':'\u21AA','hopf':'\uD835\uDD59','Hopf':'\u210D','horbar':'\u2015','HorizontalLine':'\u2500','hscr':'\uD835\uDCBD','Hscr':'\u210B','hslash':'\u210F','hstrok':'\u0127','Hstrok':'\u0126','HumpDownHump':'\u224E','HumpEqual':'\u224F','hybull':'\u2043','hyphen':'\u2010','iacute':'\xED','Iacute':'\xCD','ic':'\u2063','icirc':'\xEE','Icirc':'\xCE','icy':'\u0438','Icy':'\u0418','Idot':'\u0130','iecy':'\u0435','IEcy':'\u0415','iexcl':'\xA1','iff':'\u21D4','ifr':'\uD835\uDD26','Ifr':'\u2111','igrave':'\xEC','Igrave':'\xCC','ii':'\u2148','iiiint':'\u2A0C','iiint':'\u222D','iinfin':'\u29DC','iiota':'\u2129','ijlig':'\u0133','IJlig':'\u0132','Im':'\u2111','imacr':'\u012B','Imacr':'\u012A','image':'\u2111','ImaginaryI':'\u2148','imagline':'\u2110','imagpart':'\u2111','imath':'\u0131','imof':'\u22B7','imped':'\u01B5','Implies':'\u21D2','in':'\u2208','incare':'\u2105','infin':'\u221E','infintie':'\u29DD','inodot':'\u0131','int':'\u222B','Int':'\u222C','intcal':'\u22BA','integers':'\u2124','Integral':'\u222B','intercal':'\u22BA','Intersection':'\u22C2','intlarhk':'\u2A17','intprod':'\u2A3C','InvisibleComma':'\u2063','InvisibleTimes':'\u2062','iocy':'\u0451','IOcy':'\u0401','iogon':'\u012F','Iogon':'\u012E','iopf':'\uD835\uDD5A','Iopf':'\uD835\uDD40','iota':'\u03B9','Iota':'\u0399','iprod':'\u2A3C','iquest':'\xBF','iscr':'\uD835\uDCBE','Iscr':'\u2110','isin':'\u2208','isindot':'\u22F5','isinE':'\u22F9','isins':'\u22F4','isinsv':'\u22F3','isinv':'\u2208','it':'\u2062','itilde':'\u0129','Itilde':'\u0128','iukcy':'\u0456','Iukcy':'\u0406','iuml':'\xEF','Iuml':'\xCF','jcirc':'\u0135','Jcirc':'\u0134','jcy':'\u0439','Jcy':'\u0419','jfr':'\uD835\uDD27','Jfr':'\uD835\uDD0D','jmath':'\u0237','jopf':'\uD835\uDD5B','Jopf':'\uD835\uDD41','jscr':'\uD835\uDCBF','Jscr':'\uD835\uDCA5','jsercy':'\u0458','Jsercy':'\u0408','jukcy':'\u0454','Jukcy':'\u0404','kappa':'\u03BA','Kappa':'\u039A','kappav':'\u03F0','kcedil':'\u0137','Kcedil':'\u0136','kcy':'\u043A','Kcy':'\u041A','kfr':'\uD835\uDD28','Kfr':'\uD835\uDD0E','kgreen':'\u0138','khcy':'\u0445','KHcy':'\u0425','kjcy':'\u045C','KJcy':'\u040C','kopf':'\uD835\uDD5C','Kopf':'\uD835\uDD42','kscr':'\uD835\uDCC0','Kscr':'\uD835\uDCA6','lAarr':'\u21DA','lacute':'\u013A','Lacute':'\u0139','laemptyv':'\u29B4','lagran':'\u2112','lambda':'\u03BB','Lambda':'\u039B','lang':'\u27E8','Lang':'\u27EA','langd':'\u2991','langle':'\u27E8','lap':'\u2A85','Laplacetrf':'\u2112','laquo':'\xAB','larr':'\u2190','lArr':'\u21D0','Larr':'\u219E','larrb':'\u21E4','larrbfs':'\u291F','larrfs':'\u291D','larrhk':'\u21A9','larrlp':'\u21AB','larrpl':'\u2939','larrsim':'\u2973','larrtl':'\u21A2','lat':'\u2AAB','latail':'\u2919','lAtail':'\u291B','late':'\u2AAD','lates':'\u2AAD\uFE00','lbarr':'\u290C','lBarr':'\u290E','lbbrk':'\u2772','lbrace':'{','lbrack':'[','lbrke':'\u298B','lbrksld':'\u298F','lbrkslu':'\u298D','lcaron':'\u013E','Lcaron':'\u013D','lcedil':'\u013C','Lcedil':'\u013B','lceil':'\u2308','lcub':'{','lcy':'\u043B','Lcy':'\u041B','ldca':'\u2936','ldquo':'\u201C','ldquor':'\u201E','ldrdhar':'\u2967','ldrushar':'\u294B','ldsh':'\u21B2','le':'\u2264','lE':'\u2266','LeftAngleBracket':'\u27E8','leftarrow':'\u2190','Leftarrow':'\u21D0','LeftArrow':'\u2190','LeftArrowBar':'\u21E4','LeftArrowRightArrow':'\u21C6','leftarrowtail':'\u21A2','LeftCeiling':'\u2308','LeftDoubleBracket':'\u27E6','LeftDownTeeVector':'\u2961','LeftDownVector':'\u21C3','LeftDownVectorBar':'\u2959','LeftFloor':'\u230A','leftharpoondown':'\u21BD','leftharpoonup':'\u21BC','leftleftarrows':'\u21C7','leftrightarrow':'\u2194','Leftrightarrow':'\u21D4','LeftRightArrow':'\u2194','leftrightarrows':'\u21C6','leftrightharpoons':'\u21CB','leftrightsquigarrow':'\u21AD','LeftRightVector':'\u294E','LeftTee':'\u22A3','LeftTeeArrow':'\u21A4','LeftTeeVector':'\u295A','leftthreetimes':'\u22CB','LeftTriangle':'\u22B2','LeftTriangleBar':'\u29CF','LeftTriangleEqual':'\u22B4','LeftUpDownVector':'\u2951','LeftUpTeeVector':'\u2960','LeftUpVector':'\u21BF','LeftUpVectorBar':'\u2958','LeftVector':'\u21BC','LeftVectorBar':'\u2952','leg':'\u22DA','lEg':'\u2A8B','leq':'\u2264','leqq':'\u2266','leqslant':'\u2A7D','les':'\u2A7D','lescc':'\u2AA8','lesdot':'\u2A7F','lesdoto':'\u2A81','lesdotor':'\u2A83','lesg':'\u22DA\uFE00','lesges':'\u2A93','lessapprox':'\u2A85','lessdot':'\u22D6','lesseqgtr':'\u22DA','lesseqqgtr':'\u2A8B','LessEqualGreater':'\u22DA','LessFullEqual':'\u2266','LessGreater':'\u2276','lessgtr':'\u2276','LessLess':'\u2AA1','lesssim':'\u2272','LessSlantEqual':'\u2A7D','LessTilde':'\u2272','lfisht':'\u297C','lfloor':'\u230A','lfr':'\uD835\uDD29','Lfr':'\uD835\uDD0F','lg':'\u2276','lgE':'\u2A91','lHar':'\u2962','lhard':'\u21BD','lharu':'\u21BC','lharul':'\u296A','lhblk':'\u2584','ljcy':'\u0459','LJcy':'\u0409','ll':'\u226A','Ll':'\u22D8','llarr':'\u21C7','llcorner':'\u231E','Lleftarrow':'\u21DA','llhard':'\u296B','lltri':'\u25FA','lmidot':'\u0140','Lmidot':'\u013F','lmoust':'\u23B0','lmoustache':'\u23B0','lnap':'\u2A89','lnapprox':'\u2A89','lne':'\u2A87','lnE':'\u2268','lneq':'\u2A87','lneqq':'\u2268','lnsim':'\u22E6','loang':'\u27EC','loarr':'\u21FD','lobrk':'\u27E6','longleftarrow':'\u27F5','Longleftarrow':'\u27F8','LongLeftArrow':'\u27F5','longleftrightarrow':'\u27F7','Longleftrightarrow':'\u27FA','LongLeftRightArrow':'\u27F7','longmapsto':'\u27FC','longrightarrow':'\u27F6','Longrightarrow':'\u27F9','LongRightArrow':'\u27F6','looparrowleft':'\u21AB','looparrowright':'\u21AC','lopar':'\u2985','lopf':'\uD835\uDD5D','Lopf':'\uD835\uDD43','loplus':'\u2A2D','lotimes':'\u2A34','lowast':'\u2217','lowbar':'_','LowerLeftArrow':'\u2199','LowerRightArrow':'\u2198','loz':'\u25CA','lozenge':'\u25CA','lozf':'\u29EB','lpar':'(','lparlt':'\u2993','lrarr':'\u21C6','lrcorner':'\u231F','lrhar':'\u21CB','lrhard':'\u296D','lrm':'\u200E','lrtri':'\u22BF','lsaquo':'\u2039','lscr':'\uD835\uDCC1','Lscr':'\u2112','lsh':'\u21B0','Lsh':'\u21B0','lsim':'\u2272','lsime':'\u2A8D','lsimg':'\u2A8F','lsqb':'[','lsquo':'\u2018','lsquor':'\u201A','lstrok':'\u0142','Lstrok':'\u0141','lt':'<','Lt':'\u226A','LT':'<','ltcc':'\u2AA6','ltcir':'\u2A79','ltdot':'\u22D6','lthree':'\u22CB','ltimes':'\u22C9','ltlarr':'\u2976','ltquest':'\u2A7B','ltri':'\u25C3','ltrie':'\u22B4','ltrif':'\u25C2','ltrPar':'\u2996','lurdshar':'\u294A','luruhar':'\u2966','lvertneqq':'\u2268\uFE00','lvnE':'\u2268\uFE00','macr':'\xAF','male':'\u2642','malt':'\u2720','maltese':'\u2720','map':'\u21A6','Map':'\u2905','mapsto':'\u21A6','mapstodown':'\u21A7','mapstoleft':'\u21A4','mapstoup':'\u21A5','marker':'\u25AE','mcomma':'\u2A29','mcy':'\u043C','Mcy':'\u041C','mdash':'\u2014','mDDot':'\u223A','measuredangle':'\u2221','MediumSpace':'\u205F','Mellintrf':'\u2133','mfr':'\uD835\uDD2A','Mfr':'\uD835\uDD10','mho':'\u2127','micro':'\xB5','mid':'\u2223','midast':'*','midcir':'\u2AF0','middot':'\xB7','minus':'\u2212','minusb':'\u229F','minusd':'\u2238','minusdu':'\u2A2A','MinusPlus':'\u2213','mlcp':'\u2ADB','mldr':'\u2026','mnplus':'\u2213','models':'\u22A7','mopf':'\uD835\uDD5E','Mopf':'\uD835\uDD44','mp':'\u2213','mscr':'\uD835\uDCC2','Mscr':'\u2133','mstpos':'\u223E','mu':'\u03BC','Mu':'\u039C','multimap':'\u22B8','mumap':'\u22B8','nabla':'\u2207','nacute':'\u0144','Nacute':'\u0143','nang':'\u2220\u20D2','nap':'\u2249','napE':'\u2A70\u0338','napid':'\u224B\u0338','napos':'\u0149','napprox':'\u2249','natur':'\u266E','natural':'\u266E','naturals':'\u2115','nbsp':'\xA0','nbump':'\u224E\u0338','nbumpe':'\u224F\u0338','ncap':'\u2A43','ncaron':'\u0148','Ncaron':'\u0147','ncedil':'\u0146','Ncedil':'\u0145','ncong':'\u2247','ncongdot':'\u2A6D\u0338','ncup':'\u2A42','ncy':'\u043D','Ncy':'\u041D','ndash':'\u2013','ne':'\u2260','nearhk':'\u2924','nearr':'\u2197','neArr':'\u21D7','nearrow':'\u2197','nedot':'\u2250\u0338','NegativeMediumSpace':'\u200B','NegativeThickSpace':'\u200B','NegativeThinSpace':'\u200B','NegativeVeryThinSpace':'\u200B','nequiv':'\u2262','nesear':'\u2928','nesim':'\u2242\u0338','NestedGreaterGreater':'\u226B','NestedLessLess':'\u226A','NewLine':'\n','nexist':'\u2204','nexists':'\u2204','nfr':'\uD835\uDD2B','Nfr':'\uD835\uDD11','nge':'\u2271','ngE':'\u2267\u0338','ngeq':'\u2271','ngeqq':'\u2267\u0338','ngeqslant':'\u2A7E\u0338','nges':'\u2A7E\u0338','nGg':'\u22D9\u0338','ngsim':'\u2275','ngt':'\u226F','nGt':'\u226B\u20D2','ngtr':'\u226F','nGtv':'\u226B\u0338','nharr':'\u21AE','nhArr':'\u21CE','nhpar':'\u2AF2','ni':'\u220B','nis':'\u22FC','nisd':'\u22FA','niv':'\u220B','njcy':'\u045A','NJcy':'\u040A','nlarr':'\u219A','nlArr':'\u21CD','nldr':'\u2025','nle':'\u2270','nlE':'\u2266\u0338','nleftarrow':'\u219A','nLeftarrow':'\u21CD','nleftrightarrow':'\u21AE','nLeftrightarrow':'\u21CE','nleq':'\u2270','nleqq':'\u2266\u0338','nleqslant':'\u2A7D\u0338','nles':'\u2A7D\u0338','nless':'\u226E','nLl':'\u22D8\u0338','nlsim':'\u2274','nlt':'\u226E','nLt':'\u226A\u20D2','nltri':'\u22EA','nltrie':'\u22EC','nLtv':'\u226A\u0338','nmid':'\u2224','NoBreak':'\u2060','NonBreakingSpace':'\xA0','nopf':'\uD835\uDD5F','Nopf':'\u2115','not':'\xAC','Not':'\u2AEC','NotCongruent':'\u2262','NotCupCap':'\u226D','NotDoubleVerticalBar':'\u2226','NotElement':'\u2209','NotEqual':'\u2260','NotEqualTilde':'\u2242\u0338','NotExists':'\u2204','NotGreater':'\u226F','NotGreaterEqual':'\u2271','NotGreaterFullEqual':'\u2267\u0338','NotGreaterGreater':'\u226B\u0338','NotGreaterLess':'\u2279','NotGreaterSlantEqual':'\u2A7E\u0338','NotGreaterTilde':'\u2275','NotHumpDownHump':'\u224E\u0338','NotHumpEqual':'\u224F\u0338','notin':'\u2209','notindot':'\u22F5\u0338','notinE':'\u22F9\u0338','notinva':'\u2209','notinvb':'\u22F7','notinvc':'\u22F6','NotLeftTriangle':'\u22EA','NotLeftTriangleBar':'\u29CF\u0338','NotLeftTriangleEqual':'\u22EC','NotLess':'\u226E','NotLessEqual':'\u2270','NotLessGreater':'\u2278','NotLessLess':'\u226A\u0338','NotLessSlantEqual':'\u2A7D\u0338','NotLessTilde':'\u2274','NotNestedGreaterGreater':'\u2AA2\u0338','NotNestedLessLess':'\u2AA1\u0338','notni':'\u220C','notniva':'\u220C','notnivb':'\u22FE','notnivc':'\u22FD','NotPrecedes':'\u2280','NotPrecedesEqual':'\u2AAF\u0338','NotPrecedesSlantEqual':'\u22E0','NotReverseElement':'\u220C','NotRightTriangle':'\u22EB','NotRightTriangleBar':'\u29D0\u0338','NotRightTriangleEqual':'\u22ED','NotSquareSubset':'\u228F\u0338','NotSquareSubsetEqual':'\u22E2','NotSquareSuperset':'\u2290\u0338','NotSquareSupersetEqual':'\u22E3','NotSubset':'\u2282\u20D2','NotSubsetEqual':'\u2288','NotSucceeds':'\u2281','NotSucceedsEqual':'\u2AB0\u0338','NotSucceedsSlantEqual':'\u22E1','NotSucceedsTilde':'\u227F\u0338','NotSuperset':'\u2283\u20D2','NotSupersetEqual':'\u2289','NotTilde':'\u2241','NotTildeEqual':'\u2244','NotTildeFullEqual':'\u2247','NotTildeTilde':'\u2249','NotVerticalBar':'\u2224','npar':'\u2226','nparallel':'\u2226','nparsl':'\u2AFD\u20E5','npart':'\u2202\u0338','npolint':'\u2A14','npr':'\u2280','nprcue':'\u22E0','npre':'\u2AAF\u0338','nprec':'\u2280','npreceq':'\u2AAF\u0338','nrarr':'\u219B','nrArr':'\u21CF','nrarrc':'\u2933\u0338','nrarrw':'\u219D\u0338','nrightarrow':'\u219B','nRightarrow':'\u21CF','nrtri':'\u22EB','nrtrie':'\u22ED','nsc':'\u2281','nsccue':'\u22E1','nsce':'\u2AB0\u0338','nscr':'\uD835\uDCC3','Nscr':'\uD835\uDCA9','nshortmid':'\u2224','nshortparallel':'\u2226','nsim':'\u2241','nsime':'\u2244','nsimeq':'\u2244','nsmid':'\u2224','nspar':'\u2226','nsqsube':'\u22E2','nsqsupe':'\u22E3','nsub':'\u2284','nsube':'\u2288','nsubE':'\u2AC5\u0338','nsubset':'\u2282\u20D2','nsubseteq':'\u2288','nsubseteqq':'\u2AC5\u0338','nsucc':'\u2281','nsucceq':'\u2AB0\u0338','nsup':'\u2285','nsupe':'\u2289','nsupE':'\u2AC6\u0338','nsupset':'\u2283\u20D2','nsupseteq':'\u2289','nsupseteqq':'\u2AC6\u0338','ntgl':'\u2279','ntilde':'\xF1','Ntilde':'\xD1','ntlg':'\u2278','ntriangleleft':'\u22EA','ntrianglelefteq':'\u22EC','ntriangleright':'\u22EB','ntrianglerighteq':'\u22ED','nu':'\u03BD','Nu':'\u039D','num':'#','numero':'\u2116','numsp':'\u2007','nvap':'\u224D\u20D2','nvdash':'\u22AC','nvDash':'\u22AD','nVdash':'\u22AE','nVDash':'\u22AF','nvge':'\u2265\u20D2','nvgt':'>\u20D2','nvHarr':'\u2904','nvinfin':'\u29DE','nvlArr':'\u2902','nvle':'\u2264\u20D2','nvlt':'<\u20D2','nvltrie':'\u22B4\u20D2','nvrArr':'\u2903','nvrtrie':'\u22B5\u20D2','nvsim':'\u223C\u20D2','nwarhk':'\u2923','nwarr':'\u2196','nwArr':'\u21D6','nwarrow':'\u2196','nwnear':'\u2927','oacute':'\xF3','Oacute':'\xD3','oast':'\u229B','ocir':'\u229A','ocirc':'\xF4','Ocirc':'\xD4','ocy':'\u043E','Ocy':'\u041E','odash':'\u229D','odblac':'\u0151','Odblac':'\u0150','odiv':'\u2A38','odot':'\u2299','odsold':'\u29BC','oelig':'\u0153','OElig':'\u0152','ofcir':'\u29BF','ofr':'\uD835\uDD2C','Ofr':'\uD835\uDD12','ogon':'\u02DB','ograve':'\xF2','Ograve':'\xD2','ogt':'\u29C1','ohbar':'\u29B5','ohm':'\u03A9','oint':'\u222E','olarr':'\u21BA','olcir':'\u29BE','olcross':'\u29BB','oline':'\u203E','olt':'\u29C0','omacr':'\u014D','Omacr':'\u014C','omega':'\u03C9','Omega':'\u03A9','omicron':'\u03BF','Omicron':'\u039F','omid':'\u29B6','ominus':'\u2296','oopf':'\uD835\uDD60','Oopf':'\uD835\uDD46','opar':'\u29B7','OpenCurlyDoubleQuote':'\u201C','OpenCurlyQuote':'\u2018','operp':'\u29B9','oplus':'\u2295','or':'\u2228','Or':'\u2A54','orarr':'\u21BB','ord':'\u2A5D','order':'\u2134','orderof':'\u2134','ordf':'\xAA','ordm':'\xBA','origof':'\u22B6','oror':'\u2A56','orslope':'\u2A57','orv':'\u2A5B','oS':'\u24C8','oscr':'\u2134','Oscr':'\uD835\uDCAA','oslash':'\xF8','Oslash':'\xD8','osol':'\u2298','otilde':'\xF5','Otilde':'\xD5','otimes':'\u2297','Otimes':'\u2A37','otimesas':'\u2A36','ouml':'\xF6','Ouml':'\xD6','ovbar':'\u233D','OverBar':'\u203E','OverBrace':'\u23DE','OverBracket':'\u23B4','OverParenthesis':'\u23DC','par':'\u2225','para':'\xB6','parallel':'\u2225','parsim':'\u2AF3','parsl':'\u2AFD','part':'\u2202','PartialD':'\u2202','pcy':'\u043F','Pcy':'\u041F','percnt':'%','period':'.','permil':'\u2030','perp':'\u22A5','pertenk':'\u2031','pfr':'\uD835\uDD2D','Pfr':'\uD835\uDD13','phi':'\u03C6','Phi':'\u03A6','phiv':'\u03D5','phmmat':'\u2133','phone':'\u260E','pi':'\u03C0','Pi':'\u03A0','pitchfork':'\u22D4','piv':'\u03D6','planck':'\u210F','planckh':'\u210E','plankv':'\u210F','plus':'+','plusacir':'\u2A23','plusb':'\u229E','pluscir':'\u2A22','plusdo':'\u2214','plusdu':'\u2A25','pluse':'\u2A72','PlusMinus':'\xB1','plusmn':'\xB1','plussim':'\u2A26','plustwo':'\u2A27','pm':'\xB1','Poincareplane':'\u210C','pointint':'\u2A15','popf':'\uD835\uDD61','Popf':'\u2119','pound':'\xA3','pr':'\u227A','Pr':'\u2ABB','prap':'\u2AB7','prcue':'\u227C','pre':'\u2AAF','prE':'\u2AB3','prec':'\u227A','precapprox':'\u2AB7','preccurlyeq':'\u227C','Precedes':'\u227A','PrecedesEqual':'\u2AAF','PrecedesSlantEqual':'\u227C','PrecedesTilde':'\u227E','preceq':'\u2AAF','precnapprox':'\u2AB9','precneqq':'\u2AB5','precnsim':'\u22E8','precsim':'\u227E','prime':'\u2032','Prime':'\u2033','primes':'\u2119','prnap':'\u2AB9','prnE':'\u2AB5','prnsim':'\u22E8','prod':'\u220F','Product':'\u220F','profalar':'\u232E','profline':'\u2312','profsurf':'\u2313','prop':'\u221D','Proportion':'\u2237','Proportional':'\u221D','propto':'\u221D','prsim':'\u227E','prurel':'\u22B0','pscr':'\uD835\uDCC5','Pscr':'\uD835\uDCAB','psi':'\u03C8','Psi':'\u03A8','puncsp':'\u2008','qfr':'\uD835\uDD2E','Qfr':'\uD835\uDD14','qint':'\u2A0C','qopf':'\uD835\uDD62','Qopf':'\u211A','qprime':'\u2057','qscr':'\uD835\uDCC6','Qscr':'\uD835\uDCAC','quaternions':'\u210D','quatint':'\u2A16','quest':'?','questeq':'\u225F','quot':'"','QUOT':'"','rAarr':'\u21DB','race':'\u223D\u0331','racute':'\u0155','Racute':'\u0154','radic':'\u221A','raemptyv':'\u29B3','rang':'\u27E9','Rang':'\u27EB','rangd':'\u2992','range':'\u29A5','rangle':'\u27E9','raquo':'\xBB','rarr':'\u2192','rArr':'\u21D2','Rarr':'\u21A0','rarrap':'\u2975','rarrb':'\u21E5','rarrbfs':'\u2920','rarrc':'\u2933','rarrfs':'\u291E','rarrhk':'\u21AA','rarrlp':'\u21AC','rarrpl':'\u2945','rarrsim':'\u2974','rarrtl':'\u21A3','Rarrtl':'\u2916','rarrw':'\u219D','ratail':'\u291A','rAtail':'\u291C','ratio':'\u2236','rationals':'\u211A','rbarr':'\u290D','rBarr':'\u290F','RBarr':'\u2910','rbbrk':'\u2773','rbrace':'}','rbrack':']','rbrke':'\u298C','rbrksld':'\u298E','rbrkslu':'\u2990','rcaron':'\u0159','Rcaron':'\u0158','rcedil':'\u0157','Rcedil':'\u0156','rceil':'\u2309','rcub':'}','rcy':'\u0440','Rcy':'\u0420','rdca':'\u2937','rdldhar':'\u2969','rdquo':'\u201D','rdquor':'\u201D','rdsh':'\u21B3','Re':'\u211C','real':'\u211C','realine':'\u211B','realpart':'\u211C','reals':'\u211D','rect':'\u25AD','reg':'\xAE','REG':'\xAE','ReverseElement':'\u220B','ReverseEquilibrium':'\u21CB','ReverseUpEquilibrium':'\u296F','rfisht':'\u297D','rfloor':'\u230B','rfr':'\uD835\uDD2F','Rfr':'\u211C','rHar':'\u2964','rhard':'\u21C1','rharu':'\u21C0','rharul':'\u296C','rho':'\u03C1','Rho':'\u03A1','rhov':'\u03F1','RightAngleBracket':'\u27E9','rightarrow':'\u2192','Rightarrow':'\u21D2','RightArrow':'\u2192','RightArrowBar':'\u21E5','RightArrowLeftArrow':'\u21C4','rightarrowtail':'\u21A3','RightCeiling':'\u2309','RightDoubleBracket':'\u27E7','RightDownTeeVector':'\u295D','RightDownVector':'\u21C2','RightDownVectorBar':'\u2955','RightFloor':'\u230B','rightharpoondown':'\u21C1','rightharpoonup':'\u21C0','rightleftarrows':'\u21C4','rightleftharpoons':'\u21CC','rightrightarrows':'\u21C9','rightsquigarrow':'\u219D','RightTee':'\u22A2','RightTeeArrow':'\u21A6','RightTeeVector':'\u295B','rightthreetimes':'\u22CC','RightTriangle':'\u22B3','RightTriangleBar':'\u29D0','RightTriangleEqual':'\u22B5','RightUpDownVector':'\u294F','RightUpTeeVector':'\u295C','RightUpVector':'\u21BE','RightUpVectorBar':'\u2954','RightVector':'\u21C0','RightVectorBar':'\u2953','ring':'\u02DA','risingdotseq':'\u2253','rlarr':'\u21C4','rlhar':'\u21CC','rlm':'\u200F','rmoust':'\u23B1','rmoustache':'\u23B1','rnmid':'\u2AEE','roang':'\u27ED','roarr':'\u21FE','robrk':'\u27E7','ropar':'\u2986','ropf':'\uD835\uDD63','Ropf':'\u211D','roplus':'\u2A2E','rotimes':'\u2A35','RoundImplies':'\u2970','rpar':')','rpargt':'\u2994','rppolint':'\u2A12','rrarr':'\u21C9','Rrightarrow':'\u21DB','rsaquo':'\u203A','rscr':'\uD835\uDCC7','Rscr':'\u211B','rsh':'\u21B1','Rsh':'\u21B1','rsqb':']','rsquo':'\u2019','rsquor':'\u2019','rthree':'\u22CC','rtimes':'\u22CA','rtri':'\u25B9','rtrie':'\u22B5','rtrif':'\u25B8','rtriltri':'\u29CE','RuleDelayed':'\u29F4','ruluhar':'\u2968','rx':'\u211E','sacute':'\u015B','Sacute':'\u015A','sbquo':'\u201A','sc':'\u227B','Sc':'\u2ABC','scap':'\u2AB8','scaron':'\u0161','Scaron':'\u0160','sccue':'\u227D','sce':'\u2AB0','scE':'\u2AB4','scedil':'\u015F','Scedil':'\u015E','scirc':'\u015D','Scirc':'\u015C','scnap':'\u2ABA','scnE':'\u2AB6','scnsim':'\u22E9','scpolint':'\u2A13','scsim':'\u227F','scy':'\u0441','Scy':'\u0421','sdot':'\u22C5','sdotb':'\u22A1','sdote':'\u2A66','searhk':'\u2925','searr':'\u2198','seArr':'\u21D8','searrow':'\u2198','sect':'\xA7','semi':';','seswar':'\u2929','setminus':'\u2216','setmn':'\u2216','sext':'\u2736','sfr':'\uD835\uDD30','Sfr':'\uD835\uDD16','sfrown':'\u2322','sharp':'\u266F','shchcy':'\u0449','SHCHcy':'\u0429','shcy':'\u0448','SHcy':'\u0428','ShortDownArrow':'\u2193','ShortLeftArrow':'\u2190','shortmid':'\u2223','shortparallel':'\u2225','ShortRightArrow':'\u2192','ShortUpArrow':'\u2191','shy':'\xAD','sigma':'\u03C3','Sigma':'\u03A3','sigmaf':'\u03C2','sigmav':'\u03C2','sim':'\u223C','simdot':'\u2A6A','sime':'\u2243','simeq':'\u2243','simg':'\u2A9E','simgE':'\u2AA0','siml':'\u2A9D','simlE':'\u2A9F','simne':'\u2246','simplus':'\u2A24','simrarr':'\u2972','slarr':'\u2190','SmallCircle':'\u2218','smallsetminus':'\u2216','smashp':'\u2A33','smeparsl':'\u29E4','smid':'\u2223','smile':'\u2323','smt':'\u2AAA','smte':'\u2AAC','smtes':'\u2AAC\uFE00','softcy':'\u044C','SOFTcy':'\u042C','sol':'/','solb':'\u29C4','solbar':'\u233F','sopf':'\uD835\uDD64','Sopf':'\uD835\uDD4A','spades':'\u2660','spadesuit':'\u2660','spar':'\u2225','sqcap':'\u2293','sqcaps':'\u2293\uFE00','sqcup':'\u2294','sqcups':'\u2294\uFE00','Sqrt':'\u221A','sqsub':'\u228F','sqsube':'\u2291','sqsubset':'\u228F','sqsubseteq':'\u2291','sqsup':'\u2290','sqsupe':'\u2292','sqsupset':'\u2290','sqsupseteq':'\u2292','squ':'\u25A1','square':'\u25A1','Square':'\u25A1','SquareIntersection':'\u2293','SquareSubset':'\u228F','SquareSubsetEqual':'\u2291','SquareSuperset':'\u2290','SquareSupersetEqual':'\u2292','SquareUnion':'\u2294','squarf':'\u25AA','squf':'\u25AA','srarr':'\u2192','sscr':'\uD835\uDCC8','Sscr':'\uD835\uDCAE','ssetmn':'\u2216','ssmile':'\u2323','sstarf':'\u22C6','star':'\u2606','Star':'\u22C6','starf':'\u2605','straightepsilon':'\u03F5','straightphi':'\u03D5','strns':'\xAF','sub':'\u2282','Sub':'\u22D0','subdot':'\u2ABD','sube':'\u2286','subE':'\u2AC5','subedot':'\u2AC3','submult':'\u2AC1','subne':'\u228A','subnE':'\u2ACB','subplus':'\u2ABF','subrarr':'\u2979','subset':'\u2282','Subset':'\u22D0','subseteq':'\u2286','subseteqq':'\u2AC5','SubsetEqual':'\u2286','subsetneq':'\u228A','subsetneqq':'\u2ACB','subsim':'\u2AC7','subsub':'\u2AD5','subsup':'\u2AD3','succ':'\u227B','succapprox':'\u2AB8','succcurlyeq':'\u227D','Succeeds':'\u227B','SucceedsEqual':'\u2AB0','SucceedsSlantEqual':'\u227D','SucceedsTilde':'\u227F','succeq':'\u2AB0','succnapprox':'\u2ABA','succneqq':'\u2AB6','succnsim':'\u22E9','succsim':'\u227F','SuchThat':'\u220B','sum':'\u2211','Sum':'\u2211','sung':'\u266A','sup':'\u2283','Sup':'\u22D1','sup1':'\xB9','sup2':'\xB2','sup3':'\xB3','supdot':'\u2ABE','supdsub':'\u2AD8','supe':'\u2287','supE':'\u2AC6','supedot':'\u2AC4','Superset':'\u2283','SupersetEqual':'\u2287','suphsol':'\u27C9','suphsub':'\u2AD7','suplarr':'\u297B','supmult':'\u2AC2','supne':'\u228B','supnE':'\u2ACC','supplus':'\u2AC0','supset':'\u2283','Supset':'\u22D1','supseteq':'\u2287','supseteqq':'\u2AC6','supsetneq':'\u228B','supsetneqq':'\u2ACC','supsim':'\u2AC8','supsub':'\u2AD4','supsup':'\u2AD6','swarhk':'\u2926','swarr':'\u2199','swArr':'\u21D9','swarrow':'\u2199','swnwar':'\u292A','szlig':'\xDF','Tab':'\t','target':'\u2316','tau':'\u03C4','Tau':'\u03A4','tbrk':'\u23B4','tcaron':'\u0165','Tcaron':'\u0164','tcedil':'\u0163','Tcedil':'\u0162','tcy':'\u0442','Tcy':'\u0422','tdot':'\u20DB','telrec':'\u2315','tfr':'\uD835\uDD31','Tfr':'\uD835\uDD17','there4':'\u2234','therefore':'\u2234','Therefore':'\u2234','theta':'\u03B8','Theta':'\u0398','thetasym':'\u03D1','thetav':'\u03D1','thickapprox':'\u2248','thicksim':'\u223C','ThickSpace':'\u205F\u200A','thinsp':'\u2009','ThinSpace':'\u2009','thkap':'\u2248','thksim':'\u223C','thorn':'\xFE','THORN':'\xDE','tilde':'\u02DC','Tilde':'\u223C','TildeEqual':'\u2243','TildeFullEqual':'\u2245','TildeTilde':'\u2248','times':'\xD7','timesb':'\u22A0','timesbar':'\u2A31','timesd':'\u2A30','tint':'\u222D','toea':'\u2928','top':'\u22A4','topbot':'\u2336','topcir':'\u2AF1','topf':'\uD835\uDD65','Topf':'\uD835\uDD4B','topfork':'\u2ADA','tosa':'\u2929','tprime':'\u2034','trade':'\u2122','TRADE':'\u2122','triangle':'\u25B5','triangledown':'\u25BF','triangleleft':'\u25C3','trianglelefteq':'\u22B4','triangleq':'\u225C','triangleright':'\u25B9','trianglerighteq':'\u22B5','tridot':'\u25EC','trie':'\u225C','triminus':'\u2A3A','TripleDot':'\u20DB','triplus':'\u2A39','trisb':'\u29CD','tritime':'\u2A3B','trpezium':'\u23E2','tscr':'\uD835\uDCC9','Tscr':'\uD835\uDCAF','tscy':'\u0446','TScy':'\u0426','tshcy':'\u045B','TSHcy':'\u040B','tstrok':'\u0167','Tstrok':'\u0166','twixt':'\u226C','twoheadleftarrow':'\u219E','twoheadrightarrow':'\u21A0','uacute':'\xFA','Uacute':'\xDA','uarr':'\u2191','uArr':'\u21D1','Uarr':'\u219F','Uarrocir':'\u2949','ubrcy':'\u045E','Ubrcy':'\u040E','ubreve':'\u016D','Ubreve':'\u016C','ucirc':'\xFB','Ucirc':'\xDB','ucy':'\u0443','Ucy':'\u0423','udarr':'\u21C5','udblac':'\u0171','Udblac':'\u0170','udhar':'\u296E','ufisht':'\u297E','ufr':'\uD835\uDD32','Ufr':'\uD835\uDD18','ugrave':'\xF9','Ugrave':'\xD9','uHar':'\u2963','uharl':'\u21BF','uharr':'\u21BE','uhblk':'\u2580','ulcorn':'\u231C','ulcorner':'\u231C','ulcrop':'\u230F','ultri':'\u25F8','umacr':'\u016B','Umacr':'\u016A','uml':'\xA8','UnderBar':'_','UnderBrace':'\u23DF','UnderBracket':'\u23B5','UnderParenthesis':'\u23DD','Union':'\u22C3','UnionPlus':'\u228E','uogon':'\u0173','Uogon':'\u0172','uopf':'\uD835\uDD66','Uopf':'\uD835\uDD4C','uparrow':'\u2191','Uparrow':'\u21D1','UpArrow':'\u2191','UpArrowBar':'\u2912','UpArrowDownArrow':'\u21C5','updownarrow':'\u2195','Updownarrow':'\u21D5','UpDownArrow':'\u2195','UpEquilibrium':'\u296E','upharpoonleft':'\u21BF','upharpoonright':'\u21BE','uplus':'\u228E','UpperLeftArrow':'\u2196','UpperRightArrow':'\u2197','upsi':'\u03C5','Upsi':'\u03D2','upsih':'\u03D2','upsilon':'\u03C5','Upsilon':'\u03A5','UpTee':'\u22A5','UpTeeArrow':'\u21A5','upuparrows':'\u21C8','urcorn':'\u231D','urcorner':'\u231D','urcrop':'\u230E','uring':'\u016F','Uring':'\u016E','urtri':'\u25F9','uscr':'\uD835\uDCCA','Uscr':'\uD835\uDCB0','utdot':'\u22F0','utilde':'\u0169','Utilde':'\u0168','utri':'\u25B5','utrif':'\u25B4','uuarr':'\u21C8','uuml':'\xFC','Uuml':'\xDC','uwangle':'\u29A7','vangrt':'\u299C','varepsilon':'\u03F5','varkappa':'\u03F0','varnothing':'\u2205','varphi':'\u03D5','varpi':'\u03D6','varpropto':'\u221D','varr':'\u2195','vArr':'\u21D5','varrho':'\u03F1','varsigma':'\u03C2','varsubsetneq':'\u228A\uFE00','varsubsetneqq':'\u2ACB\uFE00','varsupsetneq':'\u228B\uFE00','varsupsetneqq':'\u2ACC\uFE00','vartheta':'\u03D1','vartriangleleft':'\u22B2','vartriangleright':'\u22B3','vBar':'\u2AE8','Vbar':'\u2AEB','vBarv':'\u2AE9','vcy':'\u0432','Vcy':'\u0412','vdash':'\u22A2','vDash':'\u22A8','Vdash':'\u22A9','VDash':'\u22AB','Vdashl':'\u2AE6','vee':'\u2228','Vee':'\u22C1','veebar':'\u22BB','veeeq':'\u225A','vellip':'\u22EE','verbar':'|','Verbar':'\u2016','vert':'|','Vert':'\u2016','VerticalBar':'\u2223','VerticalLine':'|','VerticalSeparator':'\u2758','VerticalTilde':'\u2240','VeryThinSpace':'\u200A','vfr':'\uD835\uDD33','Vfr':'\uD835\uDD19','vltri':'\u22B2','vnsub':'\u2282\u20D2','vnsup':'\u2283\u20D2','vopf':'\uD835\uDD67','Vopf':'\uD835\uDD4D','vprop':'\u221D','vrtri':'\u22B3','vscr':'\uD835\uDCCB','Vscr':'\uD835\uDCB1','vsubne':'\u228A\uFE00','vsubnE':'\u2ACB\uFE00','vsupne':'\u228B\uFE00','vsupnE':'\u2ACC\uFE00','Vvdash':'\u22AA','vzigzag':'\u299A','wcirc':'\u0175','Wcirc':'\u0174','wedbar':'\u2A5F','wedge':'\u2227','Wedge':'\u22C0','wedgeq':'\u2259','weierp':'\u2118','wfr':'\uD835\uDD34','Wfr':'\uD835\uDD1A','wopf':'\uD835\uDD68','Wopf':'\uD835\uDD4E','wp':'\u2118','wr':'\u2240','wreath':'\u2240','wscr':'\uD835\uDCCC','Wscr':'\uD835\uDCB2','xcap':'\u22C2','xcirc':'\u25EF','xcup':'\u22C3','xdtri':'\u25BD','xfr':'\uD835\uDD35','Xfr':'\uD835\uDD1B','xharr':'\u27F7','xhArr':'\u27FA','xi':'\u03BE','Xi':'\u039E','xlarr':'\u27F5','xlArr':'\u27F8','xmap':'\u27FC','xnis':'\u22FB','xodot':'\u2A00','xopf':'\uD835\uDD69','Xopf':'\uD835\uDD4F','xoplus':'\u2A01','xotime':'\u2A02','xrarr':'\u27F6','xrArr':'\u27F9','xscr':'\uD835\uDCCD','Xscr':'\uD835\uDCB3','xsqcup':'\u2A06','xuplus':'\u2A04','xutri':'\u25B3','xvee':'\u22C1','xwedge':'\u22C0','yacute':'\xFD','Yacute':'\xDD','yacy':'\u044F','YAcy':'\u042F','ycirc':'\u0177','Ycirc':'\u0176','ycy':'\u044B','Ycy':'\u042B','yen':'\xA5','yfr':'\uD835\uDD36','Yfr':'\uD835\uDD1C','yicy':'\u0457','YIcy':'\u0407','yopf':'\uD835\uDD6A','Yopf':'\uD835\uDD50','yscr':'\uD835\uDCCE','Yscr':'\uD835\uDCB4','yucy':'\u044E','YUcy':'\u042E','yuml':'\xFF','Yuml':'\u0178','zacute':'\u017A','Zacute':'\u0179','zcaron':'\u017E','Zcaron':'\u017D','zcy':'\u0437','Zcy':'\u0417','zdot':'\u017C','Zdot':'\u017B','zeetrf':'\u2128','ZeroWidthSpace':'\u200B','zeta':'\u03B6','Zeta':'\u0396','zfr':'\uD835\uDD37','Zfr':'\u2128','zhcy':'\u0436','ZHcy':'\u0416','zigrarr':'\u21DD','zopf':'\uD835\uDD6B','Zopf':'\u2124','zscr':'\uD835\uDCCF','Zscr':'\uD835\uDCB5','zwj':'\u200D','zwnj':'\u200C'};
+	var decodeMapLegacy = {'aacute':'\xE1','Aacute':'\xC1','acirc':'\xE2','Acirc':'\xC2','acute':'\xB4','aelig':'\xE6','AElig':'\xC6','agrave':'\xE0','Agrave':'\xC0','amp':'&','AMP':'&','aring':'\xE5','Aring':'\xC5','atilde':'\xE3','Atilde':'\xC3','auml':'\xE4','Auml':'\xC4','brvbar':'\xA6','ccedil':'\xE7','Ccedil':'\xC7','cedil':'\xB8','cent':'\xA2','copy':'\xA9','COPY':'\xA9','curren':'\xA4','deg':'\xB0','divide':'\xF7','eacute':'\xE9','Eacute':'\xC9','ecirc':'\xEA','Ecirc':'\xCA','egrave':'\xE8','Egrave':'\xC8','eth':'\xF0','ETH':'\xD0','euml':'\xEB','Euml':'\xCB','frac12':'\xBD','frac14':'\xBC','frac34':'\xBE','gt':'>','GT':'>','iacute':'\xED','Iacute':'\xCD','icirc':'\xEE','Icirc':'\xCE','iexcl':'\xA1','igrave':'\xEC','Igrave':'\xCC','iquest':'\xBF','iuml':'\xEF','Iuml':'\xCF','laquo':'\xAB','lt':'<','LT':'<','macr':'\xAF','micro':'\xB5','middot':'\xB7','nbsp':'\xA0','not':'\xAC','ntilde':'\xF1','Ntilde':'\xD1','oacute':'\xF3','Oacute':'\xD3','ocirc':'\xF4','Ocirc':'\xD4','ograve':'\xF2','Ograve':'\xD2','ordf':'\xAA','ordm':'\xBA','oslash':'\xF8','Oslash':'\xD8','otilde':'\xF5','Otilde':'\xD5','ouml':'\xF6','Ouml':'\xD6','para':'\xB6','plusmn':'\xB1','pound':'\xA3','quot':'"','QUOT':'"','raquo':'\xBB','reg':'\xAE','REG':'\xAE','sect':'\xA7','shy':'\xAD','sup1':'\xB9','sup2':'\xB2','sup3':'\xB3','szlig':'\xDF','thorn':'\xFE','THORN':'\xDE','times':'\xD7','uacute':'\xFA','Uacute':'\xDA','ucirc':'\xFB','Ucirc':'\xDB','ugrave':'\xF9','Ugrave':'\xD9','uml':'\xA8','uuml':'\xFC','Uuml':'\xDC','yacute':'\xFD','Yacute':'\xDD','yen':'\xA5','yuml':'\xFF'};
+	var decodeMapNumeric = {'0':'\uFFFD','128':'\u20AC','130':'\u201A','131':'\u0192','132':'\u201E','133':'\u2026','134':'\u2020','135':'\u2021','136':'\u02C6','137':'\u2030','138':'\u0160','139':'\u2039','140':'\u0152','142':'\u017D','145':'\u2018','146':'\u2019','147':'\u201C','148':'\u201D','149':'\u2022','150':'\u2013','151':'\u2014','152':'\u02DC','153':'\u2122','154':'\u0161','155':'\u203A','156':'\u0153','158':'\u017E','159':'\u0178'};
+	var invalidReferenceCodePoints = [1,2,3,4,5,6,7,8,11,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,64976,64977,64978,64979,64980,64981,64982,64983,64984,64985,64986,64987,64988,64989,64990,64991,64992,64993,64994,64995,64996,64997,64998,64999,65000,65001,65002,65003,65004,65005,65006,65007,65534,65535,131070,131071,196606,196607,262142,262143,327678,327679,393214,393215,458750,458751,524286,524287,589822,589823,655358,655359,720894,720895,786430,786431,851966,851967,917502,917503,983038,983039,1048574,1048575,1114110,1114111];
+
+	/*--------------------------------------------------------------------------*/
+
+	var stringFromCharCode = String.fromCharCode;
+
+	var object = {};
+	var hasOwnProperty = object.hasOwnProperty;
+	var has = function(object, propertyName) {
+		return hasOwnProperty.call(object, propertyName);
+	};
+
+	var contains = function(array, value) {
+		var index = -1;
+		var length = array.length;
+		while (++index < length) {
+			if (array[index] == value) {
+				return true;
+			}
+		}
+		return false;
+	};
+
+	var merge = function(options, defaults) {
+		if (!options) {
+			return defaults;
+		}
+		var result = {};
+		var key;
+		for (key in defaults) {
+			// A `hasOwnProperty` check is not needed here, since only recognized
+			// option names are used anyway. Any others are ignored.
+			result[key] = has(options, key) ? options[key] : defaults[key];
+		}
+		return result;
+	};
+
+	// Modified version of `ucs2encode`; see https://mths.be/punycode.
+	var codePointToSymbol = function(codePoint, strict) {
+		var output = '';
+		if ((codePoint >= 0xD800 && codePoint <= 0xDFFF) || codePoint > 0x10FFFF) {
+			// See issue #4:
+			// “Otherwise, if the number is in the range 0xD800 to 0xDFFF or is
+			// greater than 0x10FFFF, then this is a parse error. Return a U+FFFD
+			// REPLACEMENT CHARACTER.”
+			if (strict) {
+				parseError('character reference outside the permissible Unicode range');
+			}
+			return '\uFFFD';
+		}
+		if (has(decodeMapNumeric, codePoint)) {
+			if (strict) {
+				parseError('disallowed character reference');
+			}
+			return decodeMapNumeric[codePoint];
+		}
+		if (strict && contains(invalidReferenceCodePoints, codePoint)) {
+			parseError('disallowed character reference');
+		}
+		if (codePoint > 0xFFFF) {
+			codePoint -= 0x10000;
+			output += stringFromCharCode(codePoint >>> 10 & 0x3FF | 0xD800);
+			codePoint = 0xDC00 | codePoint & 0x3FF;
+		}
+		output += stringFromCharCode(codePoint);
+		return output;
+	};
+
+	var hexEscape = function(codePoint) {
+		return '&#x' + codePoint.toString(16).toUpperCase() + ';';
+	};
+
+	var decEscape = function(codePoint) {
+		return '&#' + codePoint + ';';
+	};
+
+	var parseError = function(message) {
+		throw Error('Parse error: ' + message);
+	};
+
+	/*--------------------------------------------------------------------------*/
+
+	var encode = function(string, options) {
+		options = merge(options, encode.options);
+		var strict = options.strict;
+		if (strict && regexInvalidRawCodePoint.test(string)) {
+			parseError('forbidden code point');
+		}
+		var encodeEverything = options.encodeEverything;
+		var useNamedReferences = options.useNamedReferences;
+		var allowUnsafeSymbols = options.allowUnsafeSymbols;
+		var escapeCodePoint = options.decimal ? decEscape : hexEscape;
+
+		var escapeBmpSymbol = function(symbol) {
+			return escapeCodePoint(symbol.charCodeAt(0));
+		};
+
+		if (encodeEverything) {
+			// Encode ASCII symbols.
+			string = string.replace(regexAsciiWhitelist, function(symbol) {
+				// Use named references if requested & possible.
+				if (useNamedReferences && has(encodeMap, symbol)) {
+					return '&' + encodeMap[symbol] + ';';
+				}
+				return escapeBmpSymbol(symbol);
+			});
+			// Shorten a few escapes that represent two symbols, of which at least one
+			// is within the ASCII range.
+			if (useNamedReferences) {
+				string = string
+					.replace(/&gt;\u20D2/g, '&nvgt;')
+					.replace(/&lt;\u20D2/g, '&nvlt;')
+					.replace(/&#x66;&#x6A;/g, '&fjlig;');
+			}
+			// Encode non-ASCII symbols.
+			if (useNamedReferences) {
+				// Encode non-ASCII symbols that can be replaced with a named reference.
+				string = string.replace(regexEncodeNonAscii, function(string) {
+					// Note: there is no need to check `has(encodeMap, string)` here.
+					return '&' + encodeMap[string] + ';';
+				});
+			}
+			// Note: any remaining non-ASCII symbols are handled outside of the `if`.
+		} else if (useNamedReferences) {
+			// Apply named character references.
+			// Encode `<>"'&` using named character references.
+			if (!allowUnsafeSymbols) {
+				string = string.replace(regexEscape, function(string) {
+					return '&' + encodeMap[string] + ';'; // no need to check `has()` here
+				});
+			}
+			// Shorten escapes that represent two symbols, of which at least one is
+			// `<>"'&`.
+			string = string
+				.replace(/&gt;\u20D2/g, '&nvgt;')
+				.replace(/&lt;\u20D2/g, '&nvlt;');
+			// Encode non-ASCII symbols that can be replaced with a named reference.
+			string = string.replace(regexEncodeNonAscii, function(string) {
+				// Note: there is no need to check `has(encodeMap, string)` here.
+				return '&' + encodeMap[string] + ';';
+			});
+		} else if (!allowUnsafeSymbols) {
+			// Encode `<>"'&` using hexadecimal escapes, now that they’re not handled
+			// using named character references.
+			string = string.replace(regexEscape, escapeBmpSymbol);
+		}
+		return string
+			// Encode astral symbols.
+			.replace(regexAstralSymbols, function($0) {
+				// https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
+				var high = $0.charCodeAt(0);
+				var low = $0.charCodeAt(1);
+				var codePoint = (high - 0xD800) * 0x400 + low - 0xDC00 + 0x10000;
+				return escapeCodePoint(codePoint);
+			})
+			// Encode any remaining BMP symbols that are not printable ASCII symbols
+			// using a hexadecimal escape.
+			.replace(regexBmpWhitelist, escapeBmpSymbol);
+	};
+	// Expose default options (so they can be overridden globally).
+	encode.options = {
+		'allowUnsafeSymbols': false,
+		'encodeEverything': false,
+		'strict': false,
+		'useNamedReferences': false,
+		'decimal' : false
+	};
+
+	var decode = function(html, options) {
+		options = merge(options, decode.options);
+		var strict = options.strict;
+		if (strict && regexInvalidEntity.test(html)) {
+			parseError('malformed character reference');
+		}
+		return html.replace(regexDecode, function($0, $1, $2, $3, $4, $5, $6, $7) {
+			var codePoint;
+			var semicolon;
+			var decDigits;
+			var hexDigits;
+			var reference;
+			var next;
+			if ($1) {
+				// Decode decimal escapes, e.g. `&#119558;`.
+				decDigits = $1;
+				semicolon = $2;
+				if (strict && !semicolon) {
+					parseError('character reference was not terminated by a semicolon');
+				}
+				codePoint = parseInt(decDigits, 10);
+				return codePointToSymbol(codePoint, strict);
+			}
+			if ($3) {
+				// Decode hexadecimal escapes, e.g. `&#x1D306;`.
+				hexDigits = $3;
+				semicolon = $4;
+				if (strict && !semicolon) {
+					parseError('character reference was not terminated by a semicolon');
+				}
+				codePoint = parseInt(hexDigits, 16);
+				return codePointToSymbol(codePoint, strict);
+			}
+			if ($5) {
+				// Decode named character references with trailing `;`, e.g. `&copy;`.
+				reference = $5;
+				if (has(decodeMap, reference)) {
+					return decodeMap[reference];
+				} else {
+					// Ambiguous ampersand. https://mths.be/notes/ambiguous-ampersands
+					if (strict) {
+						parseError(
+							'named character reference was not terminated by a semicolon'
+						);
+					}
+					return $0;
+				}
+			}
+			// If we’re still here, it’s a legacy reference for sure. No need for an
+			// extra `if` check.
+			// Decode named character references without trailing `;`, e.g. `&amp`
+			// This is only a parse error if it gets converted to `&`, or if it is
+			// followed by `=` in an attribute context.
+			reference = $6;
+			next = $7;
+			if (next && options.isAttributeValue) {
+				if (strict && next == '=') {
+					parseError('`&` did not start a character reference');
+				}
+				return $0;
+			} else {
+				if (strict) {
+					parseError(
+						'named character reference was not terminated by a semicolon'
+					);
+				}
+				// Note: there is no need to check `has(decodeMapLegacy, reference)`.
+				return decodeMapLegacy[reference] + (next || '');
+			}
+		});
+	};
+	// Expose default options (so they can be overridden globally).
+	decode.options = {
+		'isAttributeValue': false,
+		'strict': false
+	};
+
+	var escape = function(string) {
+		return string.replace(regexEscape, function($0) {
+			// Note: there is no need to check `has(escapeMap, $0)` here.
+			return escapeMap[$0];
+		});
+	};
+
+	/*--------------------------------------------------------------------------*/
+
+	var he = {
+		'version': '1.1.1',
+		'encode': encode,
+		'decode': decode,
+		'escape': escape,
+		'unescape': decode
+	};
+
+	// Some AMD build optimizers, like r.js, check for specific condition patterns
+	// like the following:
+	if (
+		false
+	) {
+		define(function() {
+			return he;
+		});
+	}	else if (freeExports && !freeExports.nodeType) {
+		if (freeModule) { // in Node.js, io.js, or RingoJS v0.8.0+
+			freeModule.exports = he;
+		} else { // in Narwhal or RingoJS v0.7.0-
+			for (var key in he) {
+				has(he, key) && (freeExports[key] = he[key]);
+			}
+		}
+	} else { // in Rhino or a web browser
+		root.he = he;
+	}
+
+}(this));
+
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{}],65:[function(require,module,exports){
 exports.read = function (buffer, offset, isLE, mLen, nBytes) {
   var e, m
   var eLen = nBytes * 8 - mLen - 1
@@ -10802,7 +11144,7 @@
   buffer[offset + i - d] |= s * 128
 }
 
-},{}],65:[function(require,module,exports){
+},{}],66:[function(require,module,exports){
 if (typeof Object.create === 'function') {
   // implementation from standard node.js 'util' module
   module.exports = function inherits(ctor, superCtor) {
@@ -10827,7 +11169,7 @@
   }
 }
 
-},{}],66:[function(require,module,exports){
+},{}],67:[function(require,module,exports){
 /*!
  * Determine if an object is a Buffer
  *
@@ -10850,14 +11192,14 @@
   return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0))
 }
 
-},{}],67:[function(require,module,exports){
+},{}],68:[function(require,module,exports){
 var toString = {}.toString;
 
 module.exports = Array.isArray || function (arr) {
   return toString.call(arr) == '[object Array]';
 };
 
-},{}],68:[function(require,module,exports){
+},{}],69:[function(require,module,exports){
 (function (global){
 /*! JSON v3.3.2 | http://bestiejs.github.io/json3 | Copyright 2012-2014, Kit Cambridge | http://kit.mit-license.org */
 ;(function () {
@@ -11763,7 +12105,402 @@
 }).call(this);
 
 }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-},{}],69:[function(require,module,exports){
+},{}],70:[function(require,module,exports){
+/**
+ * lodash 3.2.0 (Custom Build) <https://lodash.com/>
+ * Build: `lodash modern modularize exports="npm" -o ./`
+ * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>
+ * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
+ * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+ * Available under MIT license <https://lodash.com/license>
+ */
+var baseCopy = require('lodash._basecopy'),
+    keys = require('lodash.keys');
+
+/**
+ * The base implementation of `_.assign` without support for argument juggling,
+ * multiple sources, and `customizer` functions.
+ *
+ * @private
+ * @param {Object} object The destination object.
+ * @param {Object} source The source object.
+ * @returns {Object} Returns `object`.
+ */
+function baseAssign(object, source) {
+  return source == null
+    ? object
+    : baseCopy(source, keys(source), object);
+}
+
+module.exports = baseAssign;
+
+},{"lodash._basecopy":71,"lodash.keys":78}],71:[function(require,module,exports){
+/**
+ * lodash 3.0.1 (Custom Build) <https://lodash.com/>
+ * Build: `lodash modern modularize exports="npm" -o ./`
+ * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>
+ * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
+ * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+ * Available under MIT license <https://lodash.com/license>
+ */
+
+/**
+ * Copies properties of `source` to `object`.
+ *
+ * @private
+ * @param {Object} source The object to copy properties from.
+ * @param {Array} props The property names to copy.
+ * @param {Object} [object={}] The object to copy properties to.
+ * @returns {Object} Returns `object`.
+ */
+function baseCopy(source, props, object) {
+  object || (object = {});
+
+  var index = -1,
+      length = props.length;
+
+  while (++index < length) {
+    var key = props[index];
+    object[key] = source[key];
+  }
+  return object;
+}
+
+module.exports = baseCopy;
+
+},{}],72:[function(require,module,exports){
+/**
+ * lodash 3.0.3 (Custom Build) <https://lodash.com/>
+ * Build: `lodash modern modularize exports="npm" -o ./`
+ * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>
+ * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
+ * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+ * Available under MIT license <https://lodash.com/license>
+ */
+
+/**
+ * The base implementation of `_.create` without support for assigning
+ * properties to the created object.
+ *
+ * @private
+ * @param {Object} prototype The object to inherit from.
+ * @returns {Object} Returns the new object.
+ */
+var baseCreate = (function() {
+  function object() {}
+  return function(prototype) {
+    if (isObject(prototype)) {
+      object.prototype = prototype;
+      var result = new object;
+      object.prototype = undefined;
+    }
+    return result || {};
+  };
+}());
+
+/**
+ * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.
+ * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an object, else `false`.
+ * @example
+ *
+ * _.isObject({});
+ * // => true
+ *
+ * _.isObject([1, 2, 3]);
+ * // => true
+ *
+ * _.isObject(1);
+ * // => false
+ */
+function isObject(value) {
+  // Avoid a V8 JIT bug in Chrome 19-20.
+  // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.
+  var type = typeof value;
+  return !!value && (type == 'object' || type == 'function');
+}
+
+module.exports = baseCreate;
+
+},{}],73:[function(require,module,exports){
+/**
+ * lodash 3.9.1 (Custom Build) <https://lodash.com/>
+ * Build: `lodash modern modularize exports="npm" -o ./`
+ * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>
+ * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
+ * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+ * Available under MIT license <https://lodash.com/license>
+ */
+
+/** `Object#toString` result references. */
+var funcTag = '[object Function]';
+
+/** Used to detect host constructors (Safari > 5). */
+var reIsHostCtor = /^\[object .+?Constructor\]$/;
+
+/**
+ * Checks if `value` is object-like.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
+ */
+function isObjectLike(value) {
+  return !!value && typeof value == 'object';
+}
+
+/** Used for native method references. */
+var objectProto = Object.prototype;
+
+/** Used to resolve the decompiled source of functions. */
+var fnToString = Function.prototype.toString;
+
+/** Used to check objects for own properties. */
+var hasOwnProperty = objectProto.hasOwnProperty;
+
+/**
+ * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+var objToString = objectProto.toString;
+
+/** Used to detect if a method is native. */
+var reIsNative = RegExp('^' +
+  fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&')
+  .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
+);
+
+/**
+ * Gets the native function at `key` of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {string} key The key of the method to get.
+ * @returns {*} Returns the function if it's native, else `undefined`.
+ */
+function getNative(object, key) {
+  var value = object == null ? undefined : object[key];
+  return isNative(value) ? value : undefined;
+}
+
+/**
+ * Checks if `value` is classified as a `Function` object.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
+ * @example
+ *
+ * _.isFunction(_);
+ * // => true
+ *
+ * _.isFunction(/abc/);
+ * // => false
+ */
+function isFunction(value) {
+  // The use of `Object#toString` avoids issues with the `typeof` operator
+  // in older versions of Chrome and Safari which return 'function' for regexes
+  // and Safari 8 equivalents which return 'object' for typed array constructors.
+  return isObject(value) && objToString.call(value) == funcTag;
+}
+
+/**
+ * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.
+ * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an object, else `false`.
+ * @example
+ *
+ * _.isObject({});
+ * // => true
+ *
+ * _.isObject([1, 2, 3]);
+ * // => true
+ *
+ * _.isObject(1);
+ * // => false
+ */
+function isObject(value) {
+  // Avoid a V8 JIT bug in Chrome 19-20.
+  // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.
+  var type = typeof value;
+  return !!value && (type == 'object' || type == 'function');
+}
+
+/**
+ * Checks if `value` is a native function.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a native function, else `false`.
+ * @example
+ *
+ * _.isNative(Array.prototype.push);
+ * // => true
+ *
+ * _.isNative(_);
+ * // => false
+ */
+function isNative(value) {
+  if (value == null) {
+    return false;
+  }
+  if (isFunction(value)) {
+    return reIsNative.test(fnToString.call(value));
+  }
+  return isObjectLike(value) && reIsHostCtor.test(value);
+}
+
+module.exports = getNative;
+
+},{}],74:[function(require,module,exports){
+/**
+ * lodash 3.0.9 (Custom Build) <https://lodash.com/>
+ * Build: `lodash modern modularize exports="npm" -o ./`
+ * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>
+ * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
+ * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+ * Available under MIT license <https://lodash.com/license>
+ */
+
+/** Used to detect unsigned integer values. */
+var reIsUint = /^\d+$/;
+
+/**
+ * Used as the [maximum length](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.max_safe_integer)
+ * of an array-like value.
+ */
+var MAX_SAFE_INTEGER = 9007199254740991;
+
+/**
+ * The base implementation of `_.property` without support for deep paths.
+ *
+ * @private
+ * @param {string} key The key of the property to get.
+ * @returns {Function} Returns the new function.
+ */
+function baseProperty(key) {
+  return function(object) {
+    return object == null ? undefined : object[key];
+  };
+}
+
+/**
+ * Gets the "length" property value of `object`.
+ *
+ * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)
+ * that affects Safari on at least iOS 8.1-8.3 ARM64.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {*} Returns the "length" value.
+ */
+var getLength = baseProperty('length');
+
+/**
+ * Checks if `value` is array-like.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
+ */
+function isArrayLike(value) {
+  return value != null && isLength(getLength(value));
+}
+
+/**
+ * Checks if `value` is a valid array-like index.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
+ * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
+ */
+function isIndex(value, length) {
+  value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;
+  length = length == null ? MAX_SAFE_INTEGER : length;
+  return value > -1 && value % 1 == 0 && value < length;
+}
+
+/**
+ * Checks if the provided arguments are from an iteratee call.
+ *
+ * @private
+ * @param {*} value The potential iteratee value argument.
+ * @param {*} index The potential iteratee index or key argument.
+ * @param {*} object The potential iteratee object argument.
+ * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`.
+ */
+function isIterateeCall(value, index, object) {
+  if (!isObject(object)) {
+    return false;
+  }
+  var type = typeof index;
+  if (type == 'number'
+      ? (isArrayLike(object) && isIndex(index, object.length))
+      : (type == 'string' && index in object)) {
+    var other = object[index];
+    return value === value ? (value === other) : (other !== other);
+  }
+  return false;
+}
+
+/**
+ * Checks if `value` is a valid array-like length.
+ *
+ * **Note:** This function is based on [`ToLength`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength).
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
+ */
+function isLength(value) {
+  return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
+}
+
+/**
+ * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.
+ * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an object, else `false`.
+ * @example
+ *
+ * _.isObject({});
+ * // => true
+ *
+ * _.isObject([1, 2, 3]);
+ * // => true
+ *
+ * _.isObject(1);
+ * // => false
+ */
+function isObject(value) {
+  // Avoid a V8 JIT bug in Chrome 19-20.
+  // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.
+  var type = typeof value;
+  return !!value && (type == 'object' || type == 'function');
+}
+
+module.exports = isIterateeCall;
+
+},{}],75:[function(require,module,exports){
 /**
  * lodash 3.1.1 (Custom Build) <https://lodash.com/>
  * Build: `lodash modern modularize exports="npm" -o ./`
@@ -11820,38 +12557,240 @@
 
 module.exports = create;
 
-},{"lodash._baseassign":70,"lodash._basecreate":76,"lodash._isiterateecall":77}],70:[function(require,module,exports){
+},{"lodash._baseassign":70,"lodash._basecreate":72,"lodash._isiterateecall":74}],76:[function(require,module,exports){
 /**
- * lodash 3.2.0 (Custom Build) <https://lodash.com/>
- * Build: `lodash modern modularize exports="npm" -o ./`
- * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>
+ * lodash (Custom Build) <https://lodash.com/>
+ * Build: `lodash modularize exports="npm" -o ./`
+ * Copyright jQuery Foundation and other contributors <https://jquery.org/>
+ * Released under MIT license <https://lodash.com/license>
  * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
- * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
- * Available under MIT license <https://lodash.com/license>
+ * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
  */
-var baseCopy = require('lodash._basecopy'),
-    keys = require('lodash.keys');
+
+/** Used as references for various `Number` constants. */
+var MAX_SAFE_INTEGER = 9007199254740991;
+
+/** `Object#toString` result references. */
+var argsTag = '[object Arguments]',
+    funcTag = '[object Function]',
+    genTag = '[object GeneratorFunction]';
+
+/** Used for built-in method references. */
+var objectProto = Object.prototype;
+
+/** Used to check objects for own properties. */
+var hasOwnProperty = objectProto.hasOwnProperty;
 
 /**
- * The base implementation of `_.assign` without support for argument juggling,
- * multiple sources, and `customizer` functions.
- *
- * @private
- * @param {Object} object The destination object.
- * @param {Object} source The source object.
- * @returns {Object} Returns `object`.
+ * Used to resolve the
+ * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
+ * of values.
  */
-function baseAssign(object, source) {
-  return source == null
-    ? object
-    : baseCopy(source, keys(source), object);
+var objectToString = objectProto.toString;
+
+/** Built-in value references. */
+var propertyIsEnumerable = objectProto.propertyIsEnumerable;
+
+/**
+ * Checks if `value` is likely an `arguments` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an `arguments` object,
+ *  else `false`.
+ * @example
+ *
+ * _.isArguments(function() { return arguments; }());
+ * // => true
+ *
+ * _.isArguments([1, 2, 3]);
+ * // => false
+ */
+function isArguments(value) {
+  // Safari 8.1 makes `arguments.callee` enumerable in strict mode.
+  return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&
+    (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);
 }
 
-module.exports = baseAssign;
-
-},{"lodash._basecopy":71,"lodash.keys":72}],71:[function(require,module,exports){
 /**
- * lodash 3.0.1 (Custom Build) <https://lodash.com/>
+ * Checks if `value` is array-like. A value is considered array-like if it's
+ * not a function and has a `value.length` that's an integer greater than or
+ * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
+ * @example
+ *
+ * _.isArrayLike([1, 2, 3]);
+ * // => true
+ *
+ * _.isArrayLike(document.body.children);
+ * // => true
+ *
+ * _.isArrayLike('abc');
+ * // => true
+ *
+ * _.isArrayLike(_.noop);
+ * // => false
+ */
+function isArrayLike(value) {
+  return value != null && isLength(value.length) && !isFunction(value);
+}
+
+/**
+ * This method is like `_.isArrayLike` except that it also checks if `value`
+ * is an object.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an array-like object,
+ *  else `false`.
+ * @example
+ *
+ * _.isArrayLikeObject([1, 2, 3]);
+ * // => true
+ *
+ * _.isArrayLikeObject(document.body.children);
+ * // => true
+ *
+ * _.isArrayLikeObject('abc');
+ * // => false
+ *
+ * _.isArrayLikeObject(_.noop);
+ * // => false
+ */
+function isArrayLikeObject(value) {
+  return isObjectLike(value) && isArrayLike(value);
+}
+
+/**
+ * Checks if `value` is classified as a `Function` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a function, else `false`.
+ * @example
+ *
+ * _.isFunction(_);
+ * // => true
+ *
+ * _.isFunction(/abc/);
+ * // => false
+ */
+function isFunction(value) {
+  // The use of `Object#toString` avoids issues with the `typeof` operator
+  // in Safari 8-9 which returns 'object' for typed array and other constructors.
+  var tag = isObject(value) ? objectToString.call(value) : '';
+  return tag == funcTag || tag == genTag;
+}
+
+/**
+ * Checks if `value` is a valid array-like length.
+ *
+ * **Note:** This method is loosely based on
+ * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
+ * @example
+ *
+ * _.isLength(3);
+ * // => true
+ *
+ * _.isLength(Number.MIN_VALUE);
+ * // => false
+ *
+ * _.isLength(Infinity);
+ * // => false
+ *
+ * _.isLength('3');
+ * // => false
+ */
+function isLength(value) {
+  return typeof value == 'number' &&
+    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
+}
+
+/**
+ * Checks if `value` is the
+ * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
+ * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an object, else `false`.
+ * @example
+ *
+ * _.isObject({});
+ * // => true
+ *
+ * _.isObject([1, 2, 3]);
+ * // => true
+ *
+ * _.isObject(_.noop);
+ * // => true
+ *
+ * _.isObject(null);
+ * // => false
+ */
+function isObject(value) {
+  var type = typeof value;
+  return !!value && (type == 'object' || type == 'function');
+}
+
+/**
+ * Checks if `value` is object-like. A value is object-like if it's not `null`
+ * and has a `typeof` result of "object".
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
+ * @example
+ *
+ * _.isObjectLike({});
+ * // => true
+ *
+ * _.isObjectLike([1, 2, 3]);
+ * // => true
+ *
+ * _.isObjectLike(_.noop);
+ * // => false
+ *
+ * _.isObjectLike(null);
+ * // => false
+ */
+function isObjectLike(value) {
+  return !!value && typeof value == 'object';
+}
+
+module.exports = isArguments;
+
+},{}],77:[function(require,module,exports){
+/**
+ * lodash 3.0.4 (Custom Build) <https://lodash.com/>
  * Build: `lodash modern modularize exports="npm" -o ./`
  * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>
  * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
@@ -11859,31 +12798,179 @@
  * Available under MIT license <https://lodash.com/license>
  */
 
+/** `Object#toString` result references. */
+var arrayTag = '[object Array]',
+    funcTag = '[object Function]';
+
+/** Used to detect host constructors (Safari > 5). */
+var reIsHostCtor = /^\[object .+?Constructor\]$/;
+
 /**
- * Copies properties of `source` to `object`.
+ * Checks if `value` is object-like.
  *
  * @private
- * @param {Object} source The object to copy properties from.
- * @param {Array} props The property names to copy.
- * @param {Object} [object={}] The object to copy properties to.
- * @returns {Object} Returns `object`.
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
  */
-function baseCopy(source, props, object) {
-  object || (object = {});
+function isObjectLike(value) {
+  return !!value && typeof value == 'object';
+}
 
-  var index = -1,
-      length = props.length;
+/** Used for native method references. */
+var objectProto = Object.prototype;
 
-  while (++index < length) {
-    var key = props[index];
-    object[key] = source[key];
+/** Used to resolve the decompiled source of functions. */
+var fnToString = Function.prototype.toString;
+
+/** Used to check objects for own properties. */
+var hasOwnProperty = objectProto.hasOwnProperty;
+
+/**
+ * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+var objToString = objectProto.toString;
+
+/** Used to detect if a method is native. */
+var reIsNative = RegExp('^' +
+  fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&')
+  .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
+);
+
+/* Native method references for those with the same name as other `lodash` methods. */
+var nativeIsArray = getNative(Array, 'isArray');
+
+/**
+ * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)
+ * of an array-like value.
+ */
+var MAX_SAFE_INTEGER = 9007199254740991;
+
+/**
+ * Gets the native function at `key` of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {string} key The key of the method to get.
+ * @returns {*} Returns the function if it's native, else `undefined`.
+ */
+function getNative(object, key) {
+  var value = object == null ? undefined : object[key];
+  return isNative(value) ? value : undefined;
+}
+
+/**
+ * Checks if `value` is a valid array-like length.
+ *
+ * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
+ */
+function isLength(value) {
+  return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
+}
+
+/**
+ * Checks if `value` is classified as an `Array` object.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
+ * @example
+ *
+ * _.isArray([1, 2, 3]);
+ * // => true
+ *
+ * _.isArray(function() { return arguments; }());
+ * // => false
+ */
+var isArray = nativeIsArray || function(value) {
+  return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag;
+};
+
+/**
+ * Checks if `value` is classified as a `Function` object.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
+ * @example
+ *
+ * _.isFunction(_);
+ * // => true
+ *
+ * _.isFunction(/abc/);
+ * // => false
+ */
+function isFunction(value) {
+  // The use of `Object#toString` avoids issues with the `typeof` operator
+  // in older versions of Chrome and Safari which return 'function' for regexes
+  // and Safari 8 equivalents which return 'object' for typed array constructors.
+  return isObject(value) && objToString.call(value) == funcTag;
+}
+
+/**
+ * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.
+ * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an object, else `false`.
+ * @example
+ *
+ * _.isObject({});
+ * // => true
+ *
+ * _.isObject([1, 2, 3]);
+ * // => true
+ *
+ * _.isObject(1);
+ * // => false
+ */
+function isObject(value) {
+  // Avoid a V8 JIT bug in Chrome 19-20.
+  // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.
+  var type = typeof value;
+  return !!value && (type == 'object' || type == 'function');
+}
+
+/**
+ * Checks if `value` is a native function.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a native function, else `false`.
+ * @example
+ *
+ * _.isNative(Array.prototype.push);
+ * // => true
+ *
+ * _.isNative(_);
+ * // => false
+ */
+function isNative(value) {
+  if (value == null) {
+    return false;
   }
-  return object;
+  if (isFunction(value)) {
+    return reIsNative.test(fnToString.call(value));
+  }
+  return isObjectLike(value) && reIsHostCtor.test(value);
 }
 
-module.exports = baseCopy;
+module.exports = isArray;
 
-},{}],72:[function(require,module,exports){
+},{}],78:[function(require,module,exports){
 /**
  * lodash 3.1.2 (Custom Build) <https://lodash.com/>
  * Build: `lodash modern modularize exports="npm" -o ./`
@@ -12121,752 +13208,7 @@
 
 module.exports = keys;
 
-},{"lodash._getnative":73,"lodash.isarguments":74,"lodash.isarray":75}],73:[function(require,module,exports){
-/**
- * lodash 3.9.1 (Custom Build) <https://lodash.com/>
- * Build: `lodash modern modularize exports="npm" -o ./`
- * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>
- * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
- * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
- * Available under MIT license <https://lodash.com/license>
- */
-
-/** `Object#toString` result references. */
-var funcTag = '[object Function]';
-
-/** Used to detect host constructors (Safari > 5). */
-var reIsHostCtor = /^\[object .+?Constructor\]$/;
-
-/**
- * Checks if `value` is object-like.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
- */
-function isObjectLike(value) {
-  return !!value && typeof value == 'object';
-}
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/** Used to resolve the decompiled source of functions. */
-var fnToString = Function.prototype.toString;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
-
-/**
- * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
- * of values.
- */
-var objToString = objectProto.toString;
-
-/** Used to detect if a method is native. */
-var reIsNative = RegExp('^' +
-  fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&')
-  .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
-);
-
-/**
- * Gets the native function at `key` of `object`.
- *
- * @private
- * @param {Object} object The object to query.
- * @param {string} key The key of the method to get.
- * @returns {*} Returns the function if it's native, else `undefined`.
- */
-function getNative(object, key) {
-  var value = object == null ? undefined : object[key];
-  return isNative(value) ? value : undefined;
-}
-
-/**
- * Checks if `value` is classified as a `Function` object.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
- * @example
- *
- * _.isFunction(_);
- * // => true
- *
- * _.isFunction(/abc/);
- * // => false
- */
-function isFunction(value) {
-  // The use of `Object#toString` avoids issues with the `typeof` operator
-  // in older versions of Chrome and Safari which return 'function' for regexes
-  // and Safari 8 equivalents which return 'object' for typed array constructors.
-  return isObject(value) && objToString.call(value) == funcTag;
-}
-
-/**
- * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.
- * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an object, else `false`.
- * @example
- *
- * _.isObject({});
- * // => true
- *
- * _.isObject([1, 2, 3]);
- * // => true
- *
- * _.isObject(1);
- * // => false
- */
-function isObject(value) {
-  // Avoid a V8 JIT bug in Chrome 19-20.
-  // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.
-  var type = typeof value;
-  return !!value && (type == 'object' || type == 'function');
-}
-
-/**
- * Checks if `value` is a native function.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a native function, else `false`.
- * @example
- *
- * _.isNative(Array.prototype.push);
- * // => true
- *
- * _.isNative(_);
- * // => false
- */
-function isNative(value) {
-  if (value == null) {
-    return false;
-  }
-  if (isFunction(value)) {
-    return reIsNative.test(fnToString.call(value));
-  }
-  return isObjectLike(value) && reIsHostCtor.test(value);
-}
-
-module.exports = getNative;
-
-},{}],74:[function(require,module,exports){
-/**
- * lodash (Custom Build) <https://lodash.com/>
- * Build: `lodash modularize exports="npm" -o ./`
- * Copyright jQuery Foundation and other contributors <https://jquery.org/>
- * Released under MIT license <https://lodash.com/license>
- * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
- * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
- */
-
-/** Used as references for various `Number` constants. */
-var MAX_SAFE_INTEGER = 9007199254740991;
-
-/** `Object#toString` result references. */
-var argsTag = '[object Arguments]',
-    funcTag = '[object Function]',
-    genTag = '[object GeneratorFunction]';
-
-/** Used for built-in method references. */
-var objectProto = Object.prototype;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
-
-/**
- * Used to resolve the
- * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
- * of values.
- */
-var objectToString = objectProto.toString;
-
-/** Built-in value references. */
-var propertyIsEnumerable = objectProto.propertyIsEnumerable;
-
-/**
- * Checks if `value` is likely an `arguments` object.
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an `arguments` object,
- *  else `false`.
- * @example
- *
- * _.isArguments(function() { return arguments; }());
- * // => true
- *
- * _.isArguments([1, 2, 3]);
- * // => false
- */
-function isArguments(value) {
-  // Safari 8.1 makes `arguments.callee` enumerable in strict mode.
-  return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&
-    (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);
-}
-
-/**
- * Checks if `value` is array-like. A value is considered array-like if it's
- * not a function and has a `value.length` that's an integer greater than or
- * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
- * @example
- *
- * _.isArrayLike([1, 2, 3]);
- * // => true
- *
- * _.isArrayLike(document.body.children);
- * // => true
- *
- * _.isArrayLike('abc');
- * // => true
- *
- * _.isArrayLike(_.noop);
- * // => false
- */
-function isArrayLike(value) {
-  return value != null && isLength(value.length) && !isFunction(value);
-}
-
-/**
- * This method is like `_.isArrayLike` except that it also checks if `value`
- * is an object.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an array-like object,
- *  else `false`.
- * @example
- *
- * _.isArrayLikeObject([1, 2, 3]);
- * // => true
- *
- * _.isArrayLikeObject(document.body.children);
- * // => true
- *
- * _.isArrayLikeObject('abc');
- * // => false
- *
- * _.isArrayLikeObject(_.noop);
- * // => false
- */
-function isArrayLikeObject(value) {
-  return isObjectLike(value) && isArrayLike(value);
-}
-
-/**
- * Checks if `value` is classified as a `Function` object.
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a function, else `false`.
- * @example
- *
- * _.isFunction(_);
- * // => true
- *
- * _.isFunction(/abc/);
- * // => false
- */
-function isFunction(value) {
-  // The use of `Object#toString` avoids issues with the `typeof` operator
-  // in Safari 8-9 which returns 'object' for typed array and other constructors.
-  var tag = isObject(value) ? objectToString.call(value) : '';
-  return tag == funcTag || tag == genTag;
-}
-
-/**
- * Checks if `value` is a valid array-like length.
- *
- * **Note:** This method is loosely based on
- * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
- * @example
- *
- * _.isLength(3);
- * // => true
- *
- * _.isLength(Number.MIN_VALUE);
- * // => false
- *
- * _.isLength(Infinity);
- * // => false
- *
- * _.isLength('3');
- * // => false
- */
-function isLength(value) {
-  return typeof value == 'number' &&
-    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
-}
-
-/**
- * Checks if `value` is the
- * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
- * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an object, else `false`.
- * @example
- *
- * _.isObject({});
- * // => true
- *
- * _.isObject([1, 2, 3]);
- * // => true
- *
- * _.isObject(_.noop);
- * // => true
- *
- * _.isObject(null);
- * // => false
- */
-function isObject(value) {
-  var type = typeof value;
-  return !!value && (type == 'object' || type == 'function');
-}
-
-/**
- * Checks if `value` is object-like. A value is object-like if it's not `null`
- * and has a `typeof` result of "object".
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
- * @example
- *
- * _.isObjectLike({});
- * // => true
- *
- * _.isObjectLike([1, 2, 3]);
- * // => true
- *
- * _.isObjectLike(_.noop);
- * // => false
- *
- * _.isObjectLike(null);
- * // => false
- */
-function isObjectLike(value) {
-  return !!value && typeof value == 'object';
-}
-
-module.exports = isArguments;
-
-},{}],75:[function(require,module,exports){
-/**
- * lodash 3.0.4 (Custom Build) <https://lodash.com/>
- * Build: `lodash modern modularize exports="npm" -o ./`
- * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>
- * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
- * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
- * Available under MIT license <https://lodash.com/license>
- */
-
-/** `Object#toString` result references. */
-var arrayTag = '[object Array]',
-    funcTag = '[object Function]';
-
-/** Used to detect host constructors (Safari > 5). */
-var reIsHostCtor = /^\[object .+?Constructor\]$/;
-
-/**
- * Checks if `value` is object-like.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
- */
-function isObjectLike(value) {
-  return !!value && typeof value == 'object';
-}
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/** Used to resolve the decompiled source of functions. */
-var fnToString = Function.prototype.toString;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
-
-/**
- * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
- * of values.
- */
-var objToString = objectProto.toString;
-
-/** Used to detect if a method is native. */
-var reIsNative = RegExp('^' +
-  fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&')
-  .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
-);
-
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeIsArray = getNative(Array, 'isArray');
-
-/**
- * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)
- * of an array-like value.
- */
-var MAX_SAFE_INTEGER = 9007199254740991;
-
-/**
- * Gets the native function at `key` of `object`.
- *
- * @private
- * @param {Object} object The object to query.
- * @param {string} key The key of the method to get.
- * @returns {*} Returns the function if it's native, else `undefined`.
- */
-function getNative(object, key) {
-  var value = object == null ? undefined : object[key];
-  return isNative(value) ? value : undefined;
-}
-
-/**
- * Checks if `value` is a valid array-like length.
- *
- * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
- */
-function isLength(value) {
-  return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
-}
-
-/**
- * Checks if `value` is classified as an `Array` object.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
- * @example
- *
- * _.isArray([1, 2, 3]);
- * // => true
- *
- * _.isArray(function() { return arguments; }());
- * // => false
- */
-var isArray = nativeIsArray || function(value) {
-  return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag;
-};
-
-/**
- * Checks if `value` is classified as a `Function` object.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
- * @example
- *
- * _.isFunction(_);
- * // => true
- *
- * _.isFunction(/abc/);
- * // => false
- */
-function isFunction(value) {
-  // The use of `Object#toString` avoids issues with the `typeof` operator
-  // in older versions of Chrome and Safari which return 'function' for regexes
-  // and Safari 8 equivalents which return 'object' for typed array constructors.
-  return isObject(value) && objToString.call(value) == funcTag;
-}
-
-/**
- * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.
- * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an object, else `false`.
- * @example
- *
- * _.isObject({});
- * // => true
- *
- * _.isObject([1, 2, 3]);
- * // => true
- *
- * _.isObject(1);
- * // => false
- */
-function isObject(value) {
-  // Avoid a V8 JIT bug in Chrome 19-20.
-  // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.
-  var type = typeof value;
-  return !!value && (type == 'object' || type == 'function');
-}
-
-/**
- * Checks if `value` is a native function.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a native function, else `false`.
- * @example
- *
- * _.isNative(Array.prototype.push);
- * // => true
- *
- * _.isNative(_);
- * // => false
- */
-function isNative(value) {
-  if (value == null) {
-    return false;
-  }
-  if (isFunction(value)) {
-    return reIsNative.test(fnToString.call(value));
-  }
-  return isObjectLike(value) && reIsHostCtor.test(value);
-}
-
-module.exports = isArray;
-
-},{}],76:[function(require,module,exports){
-/**
- * lodash 3.0.3 (Custom Build) <https://lodash.com/>
- * Build: `lodash modern modularize exports="npm" -o ./`
- * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>
- * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
- * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
- * Available under MIT license <https://lodash.com/license>
- */
-
-/**
- * The base implementation of `_.create` without support for assigning
- * properties to the created object.
- *
- * @private
- * @param {Object} prototype The object to inherit from.
- * @returns {Object} Returns the new object.
- */
-var baseCreate = (function() {
-  function object() {}
-  return function(prototype) {
-    if (isObject(prototype)) {
-      object.prototype = prototype;
-      var result = new object;
-      object.prototype = undefined;
-    }
-    return result || {};
-  };
-}());
-
-/**
- * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.
- * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an object, else `false`.
- * @example
- *
- * _.isObject({});
- * // => true
- *
- * _.isObject([1, 2, 3]);
- * // => true
- *
- * _.isObject(1);
- * // => false
- */
-function isObject(value) {
-  // Avoid a V8 JIT bug in Chrome 19-20.
-  // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.
-  var type = typeof value;
-  return !!value && (type == 'object' || type == 'function');
-}
-
-module.exports = baseCreate;
-
-},{}],77:[function(require,module,exports){
-/**
- * lodash 3.0.9 (Custom Build) <https://lodash.com/>
- * Build: `lodash modern modularize exports="npm" -o ./`
- * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>
- * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
- * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
- * Available under MIT license <https://lodash.com/license>
- */
-
-/** Used to detect unsigned integer values. */
-var reIsUint = /^\d+$/;
-
-/**
- * Used as the [maximum length](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.max_safe_integer)
- * of an array-like value.
- */
-var MAX_SAFE_INTEGER = 9007199254740991;
-
-/**
- * The base implementation of `_.property` without support for deep paths.
- *
- * @private
- * @param {string} key The key of the property to get.
- * @returns {Function} Returns the new function.
- */
-function baseProperty(key) {
-  return function(object) {
-    return object == null ? undefined : object[key];
-  };
-}
-
-/**
- * Gets the "length" property value of `object`.
- *
- * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)
- * that affects Safari on at least iOS 8.1-8.3 ARM64.
- *
- * @private
- * @param {Object} object The object to query.
- * @returns {*} Returns the "length" value.
- */
-var getLength = baseProperty('length');
-
-/**
- * Checks if `value` is array-like.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
- */
-function isArrayLike(value) {
-  return value != null && isLength(getLength(value));
-}
-
-/**
- * Checks if `value` is a valid array-like index.
- *
- * @private
- * @param {*} value The value to check.
- * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
- * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
- */
-function isIndex(value, length) {
-  value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;
-  length = length == null ? MAX_SAFE_INTEGER : length;
-  return value > -1 && value % 1 == 0 && value < length;
-}
-
-/**
- * Checks if the provided arguments are from an iteratee call.
- *
- * @private
- * @param {*} value The potential iteratee value argument.
- * @param {*} index The potential iteratee index or key argument.
- * @param {*} object The potential iteratee object argument.
- * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`.
- */
-function isIterateeCall(value, index, object) {
-  if (!isObject(object)) {
-    return false;
-  }
-  var type = typeof index;
-  if (type == 'number'
-      ? (isArrayLike(object) && isIndex(index, object.length))
-      : (type == 'string' && index in object)) {
-    var other = object[index];
-    return value === value ? (value === other) : (other !== other);
-  }
-  return false;
-}
-
-/**
- * Checks if `value` is a valid array-like length.
- *
- * **Note:** This function is based on [`ToLength`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength).
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
- */
-function isLength(value) {
-  return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
-}
-
-/**
- * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.
- * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an object, else `false`.
- * @example
- *
- * _.isObject({});
- * // => true
- *
- * _.isObject([1, 2, 3]);
- * // => true
- *
- * _.isObject(1);
- * // => false
- */
-function isObject(value) {
-  // Avoid a V8 JIT bug in Chrome 19-20.
-  // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.
-  var type = typeof value;
-  return !!value && (type == 'object' || type == 'function');
-}
-
-module.exports = isIterateeCall;
-
-},{}],78:[function(require,module,exports){
+},{"lodash._getnative":73,"lodash.isarguments":76,"lodash.isarray":77}],79:[function(require,module,exports){
 (function (process){
 var path = require('path');
 var fs = require('fs');
@@ -12968,7 +13310,7 @@
 };
 
 }).call(this,require('_process'))
-},{"_process":81,"fs":42,"path":42}],79:[function(require,module,exports){
+},{"_process":82,"fs":42,"path":42}],80:[function(require,module,exports){
 exports.endianness = function () { return 'LE' };
 
 exports.hostname = function () {
@@ -13015,7 +13357,7 @@
 
 exports.EOL = '\n';
 
-},{}],80:[function(require,module,exports){
+},{}],81:[function(require,module,exports){
 (function (process){
 'use strict';
 
@@ -13062,7 +13404,7 @@
 }
 
 }).call(this,require('_process'))
-},{"_process":81}],81:[function(require,module,exports){
+},{"_process":82}],82:[function(require,module,exports){
 // shim for using process in browser
 var process = module.exports = {};
 
@@ -13248,10 +13590,10 @@
 };
 process.umask = function() { return 0; };
 
-},{}],82:[function(require,module,exports){
+},{}],83:[function(require,module,exports){
 module.exports = require('./lib/_stream_duplex.js');
 
-},{"./lib/_stream_duplex.js":83}],83:[function(require,module,exports){
+},{"./lib/_stream_duplex.js":84}],84:[function(require,module,exports){
 // a duplex stream is just a stream that is both readable and writable.
 // Since JS doesn't have multiple prototypal inheritance, this class
 // prototypally inherits from Readable, and then parasitically from
@@ -13327,7 +13669,7 @@
     f(xs[i], i);
   }
 }
-},{"./_stream_readable":85,"./_stream_writable":87,"core-util-is":44,"inherits":65,"process-nextick-args":80}],84:[function(require,module,exports){
+},{"./_stream_readable":86,"./_stream_writable":88,"core-util-is":44,"inherits":66,"process-nextick-args":81}],85:[function(require,module,exports){
 // a passthrough stream.
 // basically just the most minimal sort of Transform stream.
 // Every written chunk gets output as-is.
@@ -13354,7 +13696,7 @@
 PassThrough.prototype._transform = function (chunk, encoding, cb) {
   cb(null, chunk);
 };
-},{"./_stream_transform":86,"core-util-is":44,"inherits":65}],85:[function(require,module,exports){
+},{"./_stream_transform":87,"core-util-is":44,"inherits":66}],86:[function(require,module,exports){
 (function (process){
 'use strict';
 
@@ -14291,7 +14633,7 @@
   return -1;
 }
 }).call(this,require('_process'))
-},{"./_stream_duplex":83,"./internal/streams/BufferList":88,"./internal/streams/stream":89,"_process":81,"core-util-is":44,"events":62,"inherits":65,"isarray":67,"process-nextick-args":80,"safe-buffer":94,"string_decoder/":96,"util":40}],86:[function(require,module,exports){
+},{"./_stream_duplex":84,"./internal/streams/BufferList":89,"./internal/streams/stream":90,"_process":82,"core-util-is":44,"events":62,"inherits":66,"isarray":68,"process-nextick-args":81,"safe-buffer":95,"string_decoder/":97,"util":40}],87:[function(require,module,exports){
 // a transform stream is a readable/writable stream where you do
 // something with the data.  Sometimes it's called a "filter",
 // but that's not a great name for it, since that implies a thing where
@@ -14474,7 +14816,7 @@
 
   return stream.push(null);
 }
-},{"./_stream_duplex":83,"core-util-is":44,"inherits":65}],87:[function(require,module,exports){
+},{"./_stream_duplex":84,"core-util-is":44,"inherits":66}],88:[function(require,module,exports){
 (function (process){
 // A bit simpler than readable streams.
 // Implement an async ._write(chunk, encoding, cb), and it'll handle all
@@ -15020,7 +15362,7 @@
   };
 }
 }).call(this,require('_process'))
-},{"./_stream_duplex":83,"./internal/streams/stream":89,"_process":81,"core-util-is":44,"inherits":65,"process-nextick-args":80,"safe-buffer":94,"util-deprecate":98}],88:[function(require,module,exports){
+},{"./_stream_duplex":84,"./internal/streams/stream":90,"_process":82,"core-util-is":44,"inherits":66,"process-nextick-args":81,"safe-buffer":95,"util-deprecate":99}],89:[function(require,module,exports){
 'use strict';
 
 /*<replacement>*/
@@ -15085,13 +15427,13 @@
   }
   return ret;
 };
-},{"safe-buffer":94}],89:[function(require,module,exports){
+},{"safe-buffer":95}],90:[function(require,module,exports){
 module.exports = require('events').EventEmitter;
 
-},{"events":62}],90:[function(require,module,exports){
+},{"events":62}],91:[function(require,module,exports){
 module.exports = require('./readable').PassThrough
 
-},{"./readable":91}],91:[function(require,module,exports){
+},{"./readable":92}],92:[function(require,module,exports){
 exports = module.exports = require('./lib/_stream_readable.js');
 exports.Stream = exports;
 exports.Readable = exports;
@@ -15100,16 +15442,16 @@
 exports.Transform = require('./lib/_stream_transform.js');
 exports.PassThrough = require('./lib/_stream_passthrough.js');
 
-},{"./lib/_stream_duplex.js":83,"./lib/_stream_passthrough.js":84,"./lib/_stream_readable.js":85,"./lib/_stream_transform.js":86,"./lib/_stream_writable.js":87}],92:[function(require,module,exports){
+},{"./lib/_stream_duplex.js":84,"./lib/_stream_passthrough.js":85,"./lib/_stream_readable.js":86,"./lib/_stream_transform.js":87,"./lib/_stream_writable.js":88}],93:[function(require,module,exports){
 module.exports = require('./readable').Transform
 
-},{"./readable":91}],93:[function(require,module,exports){
+},{"./readable":92}],94:[function(require,module,exports){
 module.exports = require('./lib/_stream_writable.js');
 
-},{"./lib/_stream_writable.js":87}],94:[function(require,module,exports){
+},{"./lib/_stream_writable.js":88}],95:[function(require,module,exports){
 module.exports = require('buffer')
 
-},{"buffer":43}],95:[function(require,module,exports){
+},{"buffer":43}],96:[function(require,module,exports){
 // Copyright Joyent, Inc. and other Node contributors.
 //
 // Permission is hereby granted, free of charge, to any person obtaining a
@@ -15238,7 +15580,7 @@
   return dest;
 };
 
-},{"events":62,"inherits":65,"readable-stream/duplex.js":82,"readable-stream/passthrough.js":90,"readable-stream/readable.js":91,"readable-stream/transform.js":92,"readable-stream/writable.js":93}],96:[function(require,module,exports){
+},{"events":62,"inherits":66,"readable-stream/duplex.js":83,"readable-stream/passthrough.js":91,"readable-stream/readable.js":92,"readable-stream/transform.js":93,"readable-stream/writable.js":94}],97:[function(require,module,exports){
 'use strict';
 
 var Buffer = require('safe-buffer').Buffer;
@@ -15511,7 +15853,7 @@
 function simpleEnd(buf) {
   return buf && buf.length ? this.write(buf) : '';
 }
-},{"safe-buffer":97}],97:[function(require,module,exports){
+},{"safe-buffer":98}],98:[function(require,module,exports){
 /* eslint-disable node/no-deprecated-api */
 var buffer = require('buffer')
 var Buffer = buffer.Buffer
@@ -15575,7 +15917,7 @@
   return buffer.SlowBuffer(size)
 }
 
-},{"buffer":43}],98:[function(require,module,exports){
+},{"buffer":43}],99:[function(require,module,exports){
 (function (global){
 
 /**
@@ -15646,16 +15988,16 @@
 }
 
 }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-},{}],99:[function(require,module,exports){
-arguments[4][65][0].apply(exports,arguments)
-},{"dup":65}],100:[function(require,module,exports){
+},{}],100:[function(require,module,exports){
+arguments[4][66][0].apply(exports,arguments)
+},{"dup":66}],101:[function(require,module,exports){
 module.exports = function isBuffer(arg) {
   return arg && typeof arg === 'object'
     && typeof arg.copy === 'function'
     && typeof arg.fill === 'function'
     && typeof arg.readUInt8 === 'function';
 }
-},{}],101:[function(require,module,exports){
+},{}],102:[function(require,module,exports){
 (function (process,global){
 // Copyright Joyent, Inc. and other Node contributors.
 //
@@ -16245,4 +16587,4 @@
 }
 
 }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-},{"./support/isBuffer":100,"_process":81,"inherits":99}]},{},[1]);
+},{"./support/isBuffer":101,"_process":82,"inherits":100}]},{},[1]);
diff --git a/polymer_2.0.2/bower_components/moment-timezone/.bower.json b/polymer_2.0.2/bower_components/moment-timezone/.bower.json
new file mode 100644
index 0000000..bf3cfdb
--- /dev/null
+++ b/polymer_2.0.2/bower_components/moment-timezone/.bower.json
@@ -0,0 +1,30 @@
+{
+  "name": "moment-timezone",
+  "description": "Parse and display moments in any timezone.",
+  "license": "MIT",
+  "main": "builds/moment-timezone-with-data-2012-2022.js",
+  "dependencies": {
+    "moment": ">= 2.9.0"
+  },
+  "ignore": [
+    "**/.*",
+    "tests",
+    "tasks",
+    "data/*/20*.json",
+    "contributing.md",
+    "Gruntfile.js",
+    "index.js",
+    "package.json"
+  ],
+  "homepage": "https://github.com/moment/moment-timezone",
+  "version": "0.5.14",
+  "_release": "0.5.14",
+  "_resolution": {
+    "type": "version",
+    "tag": "0.5.14",
+    "commit": "e843cfd21b13ea0e03dd06e518bff0fdef514a62"
+  },
+  "_source": "https://github.com/moment/moment-timezone.git",
+  "_target": "^0.5.10",
+  "_originalSource": "moment-timezone"
+}
\ No newline at end of file
diff --git a/polymer_2.0.2/bower_components/moment-timezone/LICENSE b/polymer_2.0.2/bower_components/moment-timezone/LICENSE
new file mode 100644
index 0000000..f0bb3b4
--- /dev/null
+++ b/polymer_2.0.2/bower_components/moment-timezone/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) JS Foundation and other contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
diff --git a/polymer_2.0.2/bower_components/moment-timezone/README.md b/polymer_2.0.2/bower_components/moment-timezone/README.md
new file mode 100644
index 0000000..06b2681
--- /dev/null
+++ b/polymer_2.0.2/bower_components/moment-timezone/README.md
@@ -0,0 +1,36 @@
+# [Moment Timezone](http://momentjs.com/timezone)
+
+[![Join the chat at https://gitter.im/moment/moment-timezone](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/moment/moment-timezone?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+
+[![NPM version][npm-version-image]][npm-url] [![NPM downloads][npm-downloads-image]][npm-url] [![MIT License][license-image]][license-url] [![Build Status][travis-image]][travis-url]
+
+IANA Time Zone Database + [Moment.js](http://momentjs.com).
+
+```js
+var june = moment("2014-06-01T12:00:00Z");
+june.tz('America/Los_Angeles').format('ha z'); // 5am PDT
+june.tz('America/New_York').format('ha z');    // 8am EDT
+june.tz('Asia/Tokyo').format('ha z');          // 9pm JST
+june.tz('Australia/Sydney').format('ha z');    // 10pm EST
+
+var dec = moment("2014-12-01T12:00:00Z");
+dec.tz('America/Los_Angeles').format('ha z');  // 4am PST
+dec.tz('America/New_York').format('ha z');     // 7am EST
+dec.tz('Asia/Tokyo').format('ha z');           // 9pm JST
+dec.tz('Australia/Sydney').format('ha z');     // 11pm EST
+```
+
+#### [Contribute code or compile time zone data](contributing.md)
+
+#### [Read the changelog](changelog.md)
+
+
+[license-image]: http://img.shields.io/badge/license-MIT-blue.svg?style=flat
+[license-url]: LICENSE
+
+[npm-url]: https://npmjs.org/package/moment-timezone
+[npm-version-image]: http://img.shields.io/npm/v/moment-timezone.svg?style=flat
+[npm-downloads-image]: http://img.shields.io/npm/dm/moment-timezone.svg?style=flat
+
+[travis-url]: http://travis-ci.org/moment/moment-timezone
+[travis-image]: http://img.shields.io/travis/moment/moment-timezone/develop.svg?style=flat
diff --git a/polymer_2.0.2/bower_components/moment-timezone/bower.json b/polymer_2.0.2/bower_components/moment-timezone/bower.json
new file mode 100644
index 0000000..041bf7d
--- /dev/null
+++ b/polymer_2.0.2/bower_components/moment-timezone/bower.json
@@ -0,0 +1,19 @@
+{
+  "name": "moment-timezone",
+  "description" : "Parse and display moments in any timezone.",
+  "license" : "MIT",
+  "main": "builds/moment-timezone-with-data-2012-2022.js",
+  "dependencies" : {
+    "moment" : ">= 2.9.0"
+  },
+  "ignore": [
+    "**/.*",
+    "tests",
+    "tasks",
+    "data/*/20*.json",
+    "contributing.md",
+    "Gruntfile.js",
+    "index.js",
+    "package.json"
+  ]
+}
diff --git a/polymer_2.0.2/bower_components/moment-timezone/builds/moment-timezone-with-data-2012-2022.js b/polymer_2.0.2/bower_components/moment-timezone/builds/moment-timezone-with-data-2012-2022.js
new file mode 100644
index 0000000..d675245
--- /dev/null
+++ b/polymer_2.0.2/bower_components/moment-timezone/builds/moment-timezone-with-data-2012-2022.js
@@ -0,0 +1,1204 @@
+//! moment-timezone.js
+//! version : 0.5.14
+//! Copyright (c) JS Foundation and other contributors
+//! license : MIT
+//! github.com/moment/moment-timezone
+
+(function (root, factory) {
+	"use strict";
+
+	/*global define*/
+	if (typeof define === 'function' && define.amd) {
+		define(['moment'], factory);                 // AMD
+	} else if (typeof module === 'object' && module.exports) {
+		module.exports = factory(require('moment')); // Node
+	} else {
+		factory(root.moment);                        // Browser
+	}
+}(this, function (moment) {
+	"use strict";
+
+	// Do not load moment-timezone a second time.
+	// if (moment.tz !== undefined) {
+	// 	logError('Moment Timezone ' + moment.tz.version + ' was already loaded ' + (moment.tz.dataVersion ? 'with data from ' : 'without any data') + moment.tz.dataVersion);
+	// 	return moment;
+	// }
+
+	var VERSION = "0.5.14",
+		zones = {},
+		links = {},
+		names = {},
+		guesses = {},
+		cachedGuess,
+
+		momentVersion = moment.version.split('.'),
+		major = +momentVersion[0],
+		minor = +momentVersion[1];
+
+	// Moment.js version check
+	if (major < 2 || (major === 2 && minor < 6)) {
+		logError('Moment Timezone requires Moment.js >= 2.6.0. You are using Moment.js ' + moment.version + '. See momentjs.com');
+	}
+
+	/************************************
+		Unpacking
+	************************************/
+
+	function charCodeToInt(charCode) {
+		if (charCode > 96) {
+			return charCode - 87;
+		} else if (charCode > 64) {
+			return charCode - 29;
+		}
+		return charCode - 48;
+	}
+
+	function unpackBase60(string) {
+		var i = 0,
+			parts = string.split('.'),
+			whole = parts[0],
+			fractional = parts[1] || '',
+			multiplier = 1,
+			num,
+			out = 0,
+			sign = 1;
+
+		// handle negative numbers
+		if (string.charCodeAt(0) === 45) {
+			i = 1;
+			sign = -1;
+		}
+
+		// handle digits before the decimal
+		for (i; i < whole.length; i++) {
+			num = charCodeToInt(whole.charCodeAt(i));
+			out = 60 * out + num;
+		}
+
+		// handle digits after the decimal
+		for (i = 0; i < fractional.length; i++) {
+			multiplier = multiplier / 60;
+			num = charCodeToInt(fractional.charCodeAt(i));
+			out += num * multiplier;
+		}
+
+		return out * sign;
+	}
+
+	function arrayToInt (array) {
+		for (var i = 0; i < array.length; i++) {
+			array[i] = unpackBase60(array[i]);
+		}
+	}
+
+	function intToUntil (array, length) {
+		for (var i = 0; i < length; i++) {
+			array[i] = Math.round((array[i - 1] || 0) + (array[i] * 60000)); // minutes to milliseconds
+		}
+
+		array[length - 1] = Infinity;
+	}
+
+	function mapIndices (source, indices) {
+		var out = [], i;
+
+		for (i = 0; i < indices.length; i++) {
+			out[i] = source[indices[i]];
+		}
+
+		return out;
+	}
+
+	function unpack (string) {
+		var data = string.split('|'),
+			offsets = data[2].split(' '),
+			indices = data[3].split(''),
+			untils  = data[4].split(' ');
+
+		arrayToInt(offsets);
+		arrayToInt(indices);
+		arrayToInt(untils);
+
+		intToUntil(untils, indices.length);
+
+		return {
+			name       : data[0],
+			abbrs      : mapIndices(data[1].split(' '), indices),
+			offsets    : mapIndices(offsets, indices),
+			untils     : untils,
+			population : data[5] | 0
+		};
+	}
+
+	/************************************
+		Zone object
+	************************************/
+
+	function Zone (packedString) {
+		if (packedString) {
+			this._set(unpack(packedString));
+		}
+	}
+
+	Zone.prototype = {
+		_set : function (unpacked) {
+			this.name       = unpacked.name;
+			this.abbrs      = unpacked.abbrs;
+			this.untils     = unpacked.untils;
+			this.offsets    = unpacked.offsets;
+			this.population = unpacked.population;
+		},
+
+		_index : function (timestamp) {
+			var target = +timestamp,
+				untils = this.untils,
+				i;
+
+			for (i = 0; i < untils.length; i++) {
+				if (target < untils[i]) {
+					return i;
+				}
+			}
+		},
+
+		parse : function (timestamp) {
+			var target  = +timestamp,
+				offsets = this.offsets,
+				untils  = this.untils,
+				max     = untils.length - 1,
+				offset, offsetNext, offsetPrev, i;
+
+			for (i = 0; i < max; i++) {
+				offset     = offsets[i];
+				offsetNext = offsets[i + 1];
+				offsetPrev = offsets[i ? i - 1 : i];
+
+				if (offset < offsetNext && tz.moveAmbiguousForward) {
+					offset = offsetNext;
+				} else if (offset > offsetPrev && tz.moveInvalidForward) {
+					offset = offsetPrev;
+				}
+
+				if (target < untils[i] - (offset * 60000)) {
+					return offsets[i];
+				}
+			}
+
+			return offsets[max];
+		},
+
+		abbr : function (mom) {
+			return this.abbrs[this._index(mom)];
+		},
+
+		offset : function (mom) {
+			logError("zone.offset has been deprecated in favor of zone.utcOffset");
+			return this.offsets[this._index(mom)];
+		},
+
+		utcOffset : function (mom) {
+			return this.offsets[this._index(mom)];
+		}
+	};
+
+	/************************************
+		Current Timezone
+	************************************/
+
+	function OffsetAt(at) {
+		var timeString = at.toTimeString();
+		var abbr = timeString.match(/\([a-z ]+\)/i);
+		if (abbr && abbr[0]) {
+			// 17:56:31 GMT-0600 (CST)
+			// 17:56:31 GMT-0600 (Central Standard Time)
+			abbr = abbr[0].match(/[A-Z]/g);
+			abbr = abbr ? abbr.join('') : undefined;
+		} else {
+			// 17:56:31 CST
+			// 17:56:31 GMT+0800 (台北標準時間)
+			abbr = timeString.match(/[A-Z]{3,5}/g);
+			abbr = abbr ? abbr[0] : undefined;
+		}
+
+		if (abbr === 'GMT') {
+			abbr = undefined;
+		}
+
+		this.at = +at;
+		this.abbr = abbr;
+		this.offset = at.getTimezoneOffset();
+	}
+
+	function ZoneScore(zone) {
+		this.zone = zone;
+		this.offsetScore = 0;
+		this.abbrScore = 0;
+	}
+
+	ZoneScore.prototype.scoreOffsetAt = function (offsetAt) {
+		this.offsetScore += Math.abs(this.zone.utcOffset(offsetAt.at) - offsetAt.offset);
+		if (this.zone.abbr(offsetAt.at).replace(/[^A-Z]/g, '') !== offsetAt.abbr) {
+			this.abbrScore++;
+		}
+	};
+
+	function findChange(low, high) {
+		var mid, diff;
+
+		while ((diff = ((high.at - low.at) / 12e4 | 0) * 6e4)) {
+			mid = new OffsetAt(new Date(low.at + diff));
+			if (mid.offset === low.offset) {
+				low = mid;
+			} else {
+				high = mid;
+			}
+		}
+
+		return low;
+	}
+
+	function userOffsets() {
+		var startYear = new Date().getFullYear() - 2,
+			last = new OffsetAt(new Date(startYear, 0, 1)),
+			offsets = [last],
+			change, next, i;
+
+		for (i = 1; i < 48; i++) {
+			next = new OffsetAt(new Date(startYear, i, 1));
+			if (next.offset !== last.offset) {
+				change = findChange(last, next);
+				offsets.push(change);
+				offsets.push(new OffsetAt(new Date(change.at + 6e4)));
+			}
+			last = next;
+		}
+
+		for (i = 0; i < 4; i++) {
+			offsets.push(new OffsetAt(new Date(startYear + i, 0, 1)));
+			offsets.push(new OffsetAt(new Date(startYear + i, 6, 1)));
+		}
+
+		return offsets;
+	}
+
+	function sortZoneScores (a, b) {
+		if (a.offsetScore !== b.offsetScore) {
+			return a.offsetScore - b.offsetScore;
+		}
+		if (a.abbrScore !== b.abbrScore) {
+			return a.abbrScore - b.abbrScore;
+		}
+		return b.zone.population - a.zone.population;
+	}
+
+	function addToGuesses (name, offsets) {
+		var i, offset;
+		arrayToInt(offsets);
+		for (i = 0; i < offsets.length; i++) {
+			offset = offsets[i];
+			guesses[offset] = guesses[offset] || {};
+			guesses[offset][name] = true;
+		}
+	}
+
+	function guessesForUserOffsets (offsets) {
+		var offsetsLength = offsets.length,
+			filteredGuesses = {},
+			out = [],
+			i, j, guessesOffset;
+
+		for (i = 0; i < offsetsLength; i++) {
+			guessesOffset = guesses[offsets[i].offset] || {};
+			for (j in guessesOffset) {
+				if (guessesOffset.hasOwnProperty(j)) {
+					filteredGuesses[j] = true;
+				}
+			}
+		}
+
+		for (i in filteredGuesses) {
+			if (filteredGuesses.hasOwnProperty(i)) {
+				out.push(names[i]);
+			}
+		}
+
+		return out;
+	}
+
+	function rebuildGuess () {
+
+		// use Intl API when available and returning valid time zone
+		try {
+			var intlName = Intl.DateTimeFormat().resolvedOptions().timeZone;
+			if (intlName && intlName.length > 3) {
+				var name = names[normalizeName(intlName)];
+				if (name) {
+					return name;
+				}
+				logError("Moment Timezone found " + intlName + " from the Intl api, but did not have that data loaded.");
+			}
+		} catch (e) {
+			// Intl unavailable, fall back to manual guessing.
+		}
+
+		var offsets = userOffsets(),
+			offsetsLength = offsets.length,
+			guesses = guessesForUserOffsets(offsets),
+			zoneScores = [],
+			zoneScore, i, j;
+
+		for (i = 0; i < guesses.length; i++) {
+			zoneScore = new ZoneScore(getZone(guesses[i]), offsetsLength);
+			for (j = 0; j < offsetsLength; j++) {
+				zoneScore.scoreOffsetAt(offsets[j]);
+			}
+			zoneScores.push(zoneScore);
+		}
+
+		zoneScores.sort(sortZoneScores);
+
+		return zoneScores.length > 0 ? zoneScores[0].zone.name : undefined;
+	}
+
+	function guess (ignoreCache) {
+		if (!cachedGuess || ignoreCache) {
+			cachedGuess = rebuildGuess();
+		}
+		return cachedGuess;
+	}
+
+	/************************************
+		Global Methods
+	************************************/
+
+	function normalizeName (name) {
+		return (name || '').toLowerCase().replace(/\//g, '_');
+	}
+
+	function addZone (packed) {
+		var i, name, split, normalized;
+
+		if (typeof packed === "string") {
+			packed = [packed];
+		}
+
+		for (i = 0; i < packed.length; i++) {
+			split = packed[i].split('|');
+			name = split[0];
+			normalized = normalizeName(name);
+			zones[normalized] = packed[i];
+			names[normalized] = name;
+			addToGuesses(normalized, split[2].split(' '));
+		}
+	}
+
+	function getZone (name, caller) {
+		name = normalizeName(name);
+
+		var zone = zones[name];
+		var link;
+
+		if (zone instanceof Zone) {
+			return zone;
+		}
+
+		if (typeof zone === 'string') {
+			zone = new Zone(zone);
+			zones[name] = zone;
+			return zone;
+		}
+
+		// Pass getZone to prevent recursion more than 1 level deep
+		if (links[name] && caller !== getZone && (link = getZone(links[name], getZone))) {
+			zone = zones[name] = new Zone();
+			zone._set(link);
+			zone.name = names[name];
+			return zone;
+		}
+
+		return null;
+	}
+
+	function getNames () {
+		var i, out = [];
+
+		for (i in names) {
+			if (names.hasOwnProperty(i) && (zones[i] || zones[links[i]]) && names[i]) {
+				out.push(names[i]);
+			}
+		}
+
+		return out.sort();
+	}
+
+	function addLink (aliases) {
+		var i, alias, normal0, normal1;
+
+		if (typeof aliases === "string") {
+			aliases = [aliases];
+		}
+
+		for (i = 0; i < aliases.length; i++) {
+			alias = aliases[i].split('|');
+
+			normal0 = normalizeName(alias[0]);
+			normal1 = normalizeName(alias[1]);
+
+			links[normal0] = normal1;
+			names[normal0] = alias[0];
+
+			links[normal1] = normal0;
+			names[normal1] = alias[1];
+		}
+	}
+
+	function loadData (data) {
+		addZone(data.zones);
+		addLink(data.links);
+		tz.dataVersion = data.version;
+	}
+
+	function zoneExists (name) {
+		if (!zoneExists.didShowError) {
+			zoneExists.didShowError = true;
+				logError("moment.tz.zoneExists('" + name + "') has been deprecated in favor of !moment.tz.zone('" + name + "')");
+		}
+		return !!getZone(name);
+	}
+
+	function needsOffset (m) {
+		var isUnixTimestamp = (m._f === 'X' || m._f === 'x');
+		return !!(m._a && (m._tzm === undefined) && !isUnixTimestamp);
+	}
+
+	function logError (message) {
+		if (typeof console !== 'undefined' && typeof console.error === 'function') {
+			console.error(message);
+		}
+	}
+
+	/************************************
+		moment.tz namespace
+	************************************/
+
+	function tz (input) {
+		var args = Array.prototype.slice.call(arguments, 0, -1),
+			name = arguments[arguments.length - 1],
+			zone = getZone(name),
+			out  = moment.utc.apply(null, args);
+
+		if (zone && !moment.isMoment(input) && needsOffset(out)) {
+			out.add(zone.parse(out), 'minutes');
+		}
+
+		out.tz(name);
+
+		return out;
+	}
+
+	tz.version      = VERSION;
+	tz.dataVersion  = '';
+	tz._zones       = zones;
+	tz._links       = links;
+	tz._names       = names;
+	tz.add          = addZone;
+	tz.link         = addLink;
+	tz.load         = loadData;
+	tz.zone         = getZone;
+	tz.zoneExists   = zoneExists; // deprecated in 0.1.0
+	tz.guess        = guess;
+	tz.names        = getNames;
+	tz.Zone         = Zone;
+	tz.unpack       = unpack;
+	tz.unpackBase60 = unpackBase60;
+	tz.needsOffset  = needsOffset;
+	tz.moveInvalidForward   = true;
+	tz.moveAmbiguousForward = false;
+
+	/************************************
+		Interface with Moment.js
+	************************************/
+
+	var fn = moment.fn;
+
+	moment.tz = tz;
+
+	moment.defaultZone = null;
+
+	moment.updateOffset = function (mom, keepTime) {
+		var zone = moment.defaultZone,
+			offset;
+
+		if (mom._z === undefined) {
+			if (zone && needsOffset(mom) && !mom._isUTC) {
+				mom._d = moment.utc(mom._a)._d;
+				mom.utc().add(zone.parse(mom), 'minutes');
+			}
+			mom._z = zone;
+		}
+		if (mom._z) {
+			offset = mom._z.utcOffset(mom);
+			if (Math.abs(offset) < 16) {
+				offset = offset / 60;
+			}
+			if (mom.utcOffset !== undefined) {
+				mom.utcOffset(-offset, keepTime);
+			} else {
+				mom.zone(offset, keepTime);
+			}
+		}
+	};
+
+	fn.tz = function (name, keepTime) {
+		if (name) {
+			this._z = getZone(name);
+			if (this._z) {
+				moment.updateOffset(this, keepTime);
+			} else {
+				logError("Moment Timezone has no data for " + name + ". See http://momentjs.com/timezone/docs/#/data-loading/.");
+			}
+			return this;
+		}
+		if (this._z) { return this._z.name; }
+	};
+
+	function abbrWrap (old) {
+		return function () {
+			if (this._z) { return this._z.abbr(this); }
+			return old.call(this);
+		};
+	}
+
+	function resetZoneWrap (old) {
+		return function () {
+			this._z = null;
+			return old.apply(this, arguments);
+		};
+	}
+
+	fn.zoneName = abbrWrap(fn.zoneName);
+	fn.zoneAbbr = abbrWrap(fn.zoneAbbr);
+	fn.utc      = resetZoneWrap(fn.utc);
+
+	moment.tz.setDefault = function(name) {
+		if (major < 2 || (major === 2 && minor < 9)) {
+			logError('Moment Timezone setDefault() requires Moment.js >= 2.9.0. You are using Moment.js ' + moment.version + '.');
+		}
+		moment.defaultZone = name ? getZone(name) : null;
+		return moment;
+	};
+
+	// Cloning a moment should include the _z property.
+	var momentProperties = moment.momentProperties;
+	if (Object.prototype.toString.call(momentProperties) === '[object Array]') {
+		// moment 2.8.1+
+		momentProperties.push('_z');
+		momentProperties.push('_a');
+	} else if (momentProperties) {
+		// moment 2.7.0
+		momentProperties._z = null;
+	}
+
+	loadData({
+		"version": "2017c",
+		"zones": [
+			"Africa/Abidjan|GMT|0|0||48e5",
+			"Africa/Nairobi|EAT|-30|0||47e5",
+			"Africa/Algiers|CET|-10|0||26e5",
+			"Africa/Lagos|WAT|-10|0||17e6",
+			"Africa/Maputo|CAT|-20|0||26e5",
+			"Africa/Cairo|EET EEST|-20 -30|01010|1M2m0 gL0 e10 mn0|15e6",
+			"Africa/Casablanca|WET WEST|0 -10|0101010101010101010101010101010101010101010|1H3C0 wM0 co0 go0 1o00 s00 dA0 vc0 11A0 A00 e00 y00 11A0 uM0 e00 Dc0 11A0 s00 e00 IM0 WM0 mo0 gM0 LA0 WM0 jA0 e00 Rc0 11A0 e00 e00 U00 11A0 8o0 e00 11A0 11A0 5A0 e00 17c0 1fA0 1a00|32e5",
+			"Europe/Paris|CET CEST|-10 -20|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|11e6",
+			"Africa/Johannesburg|SAST|-20|0||84e5",
+			"Africa/Khartoum|EAT CAT|-30 -20|01|1Usl0|51e5",
+			"Africa/Tripoli|EET CET CEST|-20 -10 -20|0120|1IlA0 TA0 1o00|11e5",
+			"Africa/Windhoek|WAST WAT CAT|-20 -10 -20|0101010101012|1GQo0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0|32e4",
+			"America/Adak|HST HDT|a0 90|01010101010101010101010|1GIc0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|326",
+			"America/Anchorage|AKST AKDT|90 80|01010101010101010101010|1GIb0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|30e4",
+			"America/Santo_Domingo|AST|40|0||29e5",
+			"America/Araguaina|-03 -02|30 20|010|1IdD0 Lz0|14e4",
+			"America/Fortaleza|-03|30|0||34e5",
+			"America/Asuncion|-03 -04|30 40|01010101010101010101010|1GTf0 1cN0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0|28e5",
+			"America/Panama|EST|50|0||15e5",
+			"America/Bahia|-02 -03|20 30|01|1GCq0|27e5",
+			"America/Mexico_City|CST CDT|60 50|01010101010101010101010|1GQw0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0|20e6",
+			"America/Managua|CST|60|0||22e5",
+			"America/La_Paz|-04|40|0||19e5",
+			"America/Lima|-05|50|0||11e6",
+			"America/Denver|MST MDT|70 60|01010101010101010101010|1GI90 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|26e5",
+			"America/Campo_Grande|-03 -04|30 40|01010101010101010101010|1GCr0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1C10 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0|77e4",
+			"America/Cancun|CST CDT EST|60 50 50|01010102|1GQw0 1nX0 14p0 1lb0 14p0 1lb0 Dd0|63e4",
+			"America/Caracas|-0430 -04|4u 40|01|1QMT0|29e5",
+			"America/Chicago|CST CDT|60 50|01010101010101010101010|1GI80 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|92e5",
+			"America/Chihuahua|MST MDT|70 60|01010101010101010101010|1GQx0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0|81e4",
+			"America/Phoenix|MST|70|0||42e5",
+			"America/Los_Angeles|PST PDT|80 70|01010101010101010101010|1GIa0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|15e6",
+			"America/New_York|EST EDT|50 40|01010101010101010101010|1GI70 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|21e6",
+			"America/Rio_Branco|-04 -05|40 50|01|1KLE0|31e4",
+			"America/Fort_Nelson|PST PDT MST|80 70 70|01010102|1GIa0 1zb0 Op0 1zb0 Op0 1zb0 Op0|39e2",
+			"America/Halifax|AST ADT|40 30|01010101010101010101010|1GI60 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|39e4",
+			"America/Godthab|-03 -02|30 20|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|17e3",
+			"America/Grand_Turk|EST EDT AST|50 40 40|0101010121010101010|1GI70 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 5Ip0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|37e2",
+			"America/Havana|CST CDT|50 40|01010101010101010101010|1GQt0 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0|21e5",
+			"America/Metlakatla|PST AKST AKDT|80 90 80|0121212121212121|1PAa0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|14e2",
+			"America/Miquelon|-03 -02|30 20|01010101010101010101010|1GI50 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|61e2",
+			"America/Montevideo|-02 -03|20 30|01010101|1GI40 1o10 11z0 1o10 11z0 1o10 11z0|17e5",
+			"America/Noronha|-02|20|0||30e2",
+			"America/Port-au-Prince|EST EDT|50 40|010101010101010101010|1GI70 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 3iN0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|23e5",
+			"Antarctica/Palmer|-03 -04|30 40|010101010|1H3D0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0|40",
+			"America/Santiago|-03 -04|30 40|010101010101010101010|1H3D0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Dd0 1Nb0 Ap0|62e5",
+			"America/Sao_Paulo|-02 -03|20 30|01010101010101010101010|1GCq0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1C10 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0|20e6",
+			"Atlantic/Azores|-01 +00|10 0|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|25e4",
+			"America/St_Johns|NST NDT|3u 2u|01010101010101010101010|1GI5u 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|11e4",
+			"Antarctica/Casey|+11 +08|-b0 -80|010|1GAF0 blz0|10",
+			"Antarctica/Davis|+05 +07|-50 -70|01|1GAI0|70",
+			"Pacific/Port_Moresby|+10|-a0|0||25e4",
+			"Pacific/Guadalcanal|+11|-b0|0||11e4",
+			"Asia/Tashkent|+05|-50|0||23e5",
+			"Pacific/Auckland|NZDT NZST|-d0 -c0|01010101010101010101010|1GQe0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00|14e5",
+			"Asia/Baghdad|+03|-30|0||66e5",
+			"Antarctica/Troll|+00 +02|0 -20|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|40",
+			"Asia/Dhaka|+06|-60|0||16e6",
+			"Asia/Amman|EET EEST|-20 -30|010101010101010101010|1GPy0 4bX0 Dd0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00|25e5",
+			"Asia/Kamchatka|+12|-c0|0||18e4",
+			"Asia/Baku|+04 +05|-40 -50|010101010|1GNA0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|27e5",
+			"Asia/Bangkok|+07|-70|0||15e6",
+			"Asia/Barnaul|+07 +06|-70 -60|010|1N7v0 3rd0",
+			"Asia/Beirut|EET EEST|-20 -30|01010101010101010101010|1GNy0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0|22e5",
+			"Asia/Manila|+08|-80|0||24e6",
+			"Asia/Kolkata|IST|-5u|0||15e6",
+			"Asia/Chita|+10 +08 +09|-a0 -80 -90|012|1N7s0 3re0|33e4",
+			"Asia/Ulaanbaatar|+08 +09|-80 -90|01010|1O8G0 1cJ0 1cP0 1cJ0|12e5",
+			"Asia/Shanghai|CST|-80|0||23e6",
+			"Asia/Colombo|+0530|-5u|0||22e5",
+			"Asia/Damascus|EET EEST|-20 -30|01010101010101010101010|1GPy0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0|26e5",
+			"Asia/Dili|+09|-90|0||19e4",
+			"Asia/Dubai|+04|-40|0||39e5",
+			"Asia/Famagusta|EET EEST +03|-20 -30 -30|0101010101201010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 15U0 2Ks0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0",
+			"Asia/Gaza|EET EEST|-20 -30|01010101010101010101010|1GPy0 1a00 1fA0 1cL0 1cN0 1nX0 1210 1nz0 1220 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0|18e5",
+			"Asia/Hong_Kong|HKT|-80|0||73e5",
+			"Asia/Hovd|+07 +08|-70 -80|01010|1O8H0 1cJ0 1cP0 1cJ0|81e3",
+			"Asia/Irkutsk|+09 +08|-90 -80|01|1N7t0|60e4",
+			"Europe/Istanbul|EET EEST +03|-20 -30 -30|01010101012|1GNB0 1qM0 11A0 1o00 1200 1nA0 11A0 1tA0 U00 15w0|13e6",
+			"Asia/Jakarta|WIB|-70|0||31e6",
+			"Asia/Jayapura|WIT|-90|0||26e4",
+			"Asia/Jerusalem|IST IDT|-20 -30|01010101010101010101010|1GPA0 1aL0 1eN0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0|81e4",
+			"Asia/Kabul|+0430|-4u|0||46e5",
+			"Asia/Karachi|PKT|-50|0||24e6",
+			"Asia/Kathmandu|+0545|-5J|0||12e5",
+			"Asia/Yakutsk|+10 +09|-a0 -90|01|1N7s0|28e4",
+			"Asia/Krasnoyarsk|+08 +07|-80 -70|01|1N7u0|10e5",
+			"Asia/Magadan|+12 +10 +11|-c0 -a0 -b0|012|1N7q0 3Cq0|95e3",
+			"Asia/Makassar|WITA|-80|0||15e5",
+			"Europe/Athens|EET EEST|-20 -30|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|35e5",
+			"Asia/Novosibirsk|+07 +06|-70 -60|010|1N7v0 4eN0|15e5",
+			"Asia/Omsk|+07 +06|-70 -60|01|1N7v0|12e5",
+			"Asia/Pyongyang|KST KST|-90 -8u|01|1P4D0|29e5",
+			"Asia/Rangoon|+0630|-6u|0||48e5",
+			"Asia/Sakhalin|+11 +10|-b0 -a0|010|1N7r0 3rd0|58e4",
+			"Asia/Seoul|KST|-90|0||23e6",
+			"Asia/Srednekolymsk|+12 +11|-c0 -b0|01|1N7q0|35e2",
+			"Asia/Tehran|+0330 +0430|-3u -4u|01010101010101010101010|1GLUu 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0|14e6",
+			"Asia/Tokyo|JST|-90|0||38e6",
+			"Asia/Tomsk|+07 +06|-70 -60|010|1N7v0 3Qp0|10e5",
+			"Asia/Vladivostok|+11 +10|-b0 -a0|01|1N7r0|60e4",
+			"Asia/Yekaterinburg|+06 +05|-60 -50|01|1N7w0|14e5",
+			"Europe/Lisbon|WET WEST|0 -10|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|27e5",
+			"Atlantic/Cape_Verde|-01|10|0||50e4",
+			"Australia/Sydney|AEDT AEST|-b0 -a0|01010101010101010101010|1GQg0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0|40e5",
+			"Australia/Adelaide|ACDT ACST|-au -9u|01010101010101010101010|1GQgu 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0|11e5",
+			"Australia/Brisbane|AEST|-a0|0||20e5",
+			"Australia/Darwin|ACST|-9u|0||12e4",
+			"Australia/Eucla|+0845|-8J|0||368",
+			"Australia/Lord_Howe|+11 +1030|-b0 -au|01010101010101010101010|1GQf0 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu|347",
+			"Australia/Perth|AWST|-80|0||18e5",
+			"Pacific/Easter|-05 -06|50 60|010101010101010101010|1H3D0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Dd0 1Nb0 Ap0|30e2",
+			"Europe/Dublin|GMT IST|0 -10|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|12e5",
+			"Pacific/Tahiti|-10|a0|0||18e4",
+			"Pacific/Niue|-11|b0|0||12e2",
+			"Etc/GMT+12|-12|c0|0|",
+			"Pacific/Galapagos|-06|60|0||25e3",
+			"Etc/GMT+7|-07|70|0|",
+			"Pacific/Pitcairn|-08|80|0||56",
+			"Pacific/Gambier|-09|90|0||125",
+			"Etc/GMT-1|+01|-10|0|",
+			"Pacific/Fakaofo|+13|-d0|0||483",
+			"Pacific/Kiritimati|+14|-e0|0||51e2",
+			"Etc/GMT-2|+02|-20|0|",
+			"Etc/UCT|UCT|0|0|",
+			"Etc/UTC|UTC|0|0|",
+			"Europe/Astrakhan|+04 +03|-40 -30|010|1N7y0 3rd0",
+			"Europe/London|GMT BST|0 -10|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|10e6",
+			"Europe/Chisinau|EET EEST|-20 -30|01010101010101010101010|1GNA0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|67e4",
+			"Europe/Kaliningrad|+03 EET|-30 -20|01|1N7z0|44e4",
+			"Europe/Volgograd|+04 +03|-40 -30|01|1N7y0|10e5",
+			"Europe/Moscow|MSK MSK|-40 -30|01|1N7y0|16e6",
+			"Europe/Saratov|+04 +03|-40 -30|010|1N7y0 5810",
+			"Europe/Simferopol|EET EEST MSK MSK|-20 -30 -40 -30|0101023|1GNB0 1qM0 11A0 1o00 11z0 1nW0|33e4",
+			"Pacific/Honolulu|HST|a0|0||37e4",
+			"MET|MET MEST|-10 -20|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0",
+			"Pacific/Chatham|+1345 +1245|-dJ -cJ|01010101010101010101010|1GQe0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00|600",
+			"Pacific/Apia|+14 +13|-e0 -d0|01010101010101010101010|1GQe0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00|37e3",
+			"Pacific/Bougainville|+10 +11|-a0 -b0|01|1NwE0|18e4",
+			"Pacific/Fiji|+13 +12|-d0 -c0|01010101010101010101010|1Goe0 1Nc0 Ao0 1Q00 xz0 1SN0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0|88e4",
+			"Pacific/Guam|ChST|-a0|0||17e4",
+			"Pacific/Marquesas|-0930|9u|0||86e2",
+			"Pacific/Pago_Pago|SST|b0|0||37e2",
+			"Pacific/Norfolk|+1130 +11|-bu -b0|01|1PoCu|25e4",
+			"Pacific/Tongatapu|+13 +14|-d0 -e0|010|1S4d0 s00|75e3"
+		],
+		"links": [
+			"Africa/Abidjan|Africa/Accra",
+			"Africa/Abidjan|Africa/Bamako",
+			"Africa/Abidjan|Africa/Banjul",
+			"Africa/Abidjan|Africa/Bissau",
+			"Africa/Abidjan|Africa/Conakry",
+			"Africa/Abidjan|Africa/Dakar",
+			"Africa/Abidjan|Africa/Freetown",
+			"Africa/Abidjan|Africa/Lome",
+			"Africa/Abidjan|Africa/Monrovia",
+			"Africa/Abidjan|Africa/Nouakchott",
+			"Africa/Abidjan|Africa/Ouagadougou",
+			"Africa/Abidjan|Africa/Sao_Tome",
+			"Africa/Abidjan|Africa/Timbuktu",
+			"Africa/Abidjan|America/Danmarkshavn",
+			"Africa/Abidjan|Atlantic/Reykjavik",
+			"Africa/Abidjan|Atlantic/St_Helena",
+			"Africa/Abidjan|Etc/GMT",
+			"Africa/Abidjan|Etc/GMT+0",
+			"Africa/Abidjan|Etc/GMT-0",
+			"Africa/Abidjan|Etc/GMT0",
+			"Africa/Abidjan|Etc/Greenwich",
+			"Africa/Abidjan|GMT",
+			"Africa/Abidjan|GMT+0",
+			"Africa/Abidjan|GMT-0",
+			"Africa/Abidjan|GMT0",
+			"Africa/Abidjan|Greenwich",
+			"Africa/Abidjan|Iceland",
+			"Africa/Algiers|Africa/Tunis",
+			"Africa/Cairo|Egypt",
+			"Africa/Casablanca|Africa/El_Aaiun",
+			"Africa/Johannesburg|Africa/Maseru",
+			"Africa/Johannesburg|Africa/Mbabane",
+			"Africa/Lagos|Africa/Bangui",
+			"Africa/Lagos|Africa/Brazzaville",
+			"Africa/Lagos|Africa/Douala",
+			"Africa/Lagos|Africa/Kinshasa",
+			"Africa/Lagos|Africa/Libreville",
+			"Africa/Lagos|Africa/Luanda",
+			"Africa/Lagos|Africa/Malabo",
+			"Africa/Lagos|Africa/Ndjamena",
+			"Africa/Lagos|Africa/Niamey",
+			"Africa/Lagos|Africa/Porto-Novo",
+			"Africa/Maputo|Africa/Blantyre",
+			"Africa/Maputo|Africa/Bujumbura",
+			"Africa/Maputo|Africa/Gaborone",
+			"Africa/Maputo|Africa/Harare",
+			"Africa/Maputo|Africa/Kigali",
+			"Africa/Maputo|Africa/Lubumbashi",
+			"Africa/Maputo|Africa/Lusaka",
+			"Africa/Nairobi|Africa/Addis_Ababa",
+			"Africa/Nairobi|Africa/Asmara",
+			"Africa/Nairobi|Africa/Asmera",
+			"Africa/Nairobi|Africa/Dar_es_Salaam",
+			"Africa/Nairobi|Africa/Djibouti",
+			"Africa/Nairobi|Africa/Juba",
+			"Africa/Nairobi|Africa/Kampala",
+			"Africa/Nairobi|Africa/Mogadishu",
+			"Africa/Nairobi|Indian/Antananarivo",
+			"Africa/Nairobi|Indian/Comoro",
+			"Africa/Nairobi|Indian/Mayotte",
+			"Africa/Tripoli|Libya",
+			"America/Adak|America/Atka",
+			"America/Adak|US/Aleutian",
+			"America/Anchorage|America/Juneau",
+			"America/Anchorage|America/Nome",
+			"America/Anchorage|America/Sitka",
+			"America/Anchorage|America/Yakutat",
+			"America/Anchorage|US/Alaska",
+			"America/Campo_Grande|America/Cuiaba",
+			"America/Chicago|America/Indiana/Knox",
+			"America/Chicago|America/Indiana/Tell_City",
+			"America/Chicago|America/Knox_IN",
+			"America/Chicago|America/Matamoros",
+			"America/Chicago|America/Menominee",
+			"America/Chicago|America/North_Dakota/Beulah",
+			"America/Chicago|America/North_Dakota/Center",
+			"America/Chicago|America/North_Dakota/New_Salem",
+			"America/Chicago|America/Rainy_River",
+			"America/Chicago|America/Rankin_Inlet",
+			"America/Chicago|America/Resolute",
+			"America/Chicago|America/Winnipeg",
+			"America/Chicago|CST6CDT",
+			"America/Chicago|Canada/Central",
+			"America/Chicago|US/Central",
+			"America/Chicago|US/Indiana-Starke",
+			"America/Chihuahua|America/Mazatlan",
+			"America/Chihuahua|Mexico/BajaSur",
+			"America/Denver|America/Boise",
+			"America/Denver|America/Cambridge_Bay",
+			"America/Denver|America/Edmonton",
+			"America/Denver|America/Inuvik",
+			"America/Denver|America/Ojinaga",
+			"America/Denver|America/Shiprock",
+			"America/Denver|America/Yellowknife",
+			"America/Denver|Canada/Mountain",
+			"America/Denver|MST7MDT",
+			"America/Denver|Navajo",
+			"America/Denver|US/Mountain",
+			"America/Fortaleza|America/Argentina/Buenos_Aires",
+			"America/Fortaleza|America/Argentina/Catamarca",
+			"America/Fortaleza|America/Argentina/ComodRivadavia",
+			"America/Fortaleza|America/Argentina/Cordoba",
+			"America/Fortaleza|America/Argentina/Jujuy",
+			"America/Fortaleza|America/Argentina/La_Rioja",
+			"America/Fortaleza|America/Argentina/Mendoza",
+			"America/Fortaleza|America/Argentina/Rio_Gallegos",
+			"America/Fortaleza|America/Argentina/Salta",
+			"America/Fortaleza|America/Argentina/San_Juan",
+			"America/Fortaleza|America/Argentina/San_Luis",
+			"America/Fortaleza|America/Argentina/Tucuman",
+			"America/Fortaleza|America/Argentina/Ushuaia",
+			"America/Fortaleza|America/Belem",
+			"America/Fortaleza|America/Buenos_Aires",
+			"America/Fortaleza|America/Catamarca",
+			"America/Fortaleza|America/Cayenne",
+			"America/Fortaleza|America/Cordoba",
+			"America/Fortaleza|America/Jujuy",
+			"America/Fortaleza|America/Maceio",
+			"America/Fortaleza|America/Mendoza",
+			"America/Fortaleza|America/Paramaribo",
+			"America/Fortaleza|America/Recife",
+			"America/Fortaleza|America/Rosario",
+			"America/Fortaleza|America/Santarem",
+			"America/Fortaleza|Antarctica/Rothera",
+			"America/Fortaleza|Atlantic/Stanley",
+			"America/Fortaleza|Etc/GMT+3",
+			"America/Halifax|America/Glace_Bay",
+			"America/Halifax|America/Goose_Bay",
+			"America/Halifax|America/Moncton",
+			"America/Halifax|America/Thule",
+			"America/Halifax|Atlantic/Bermuda",
+			"America/Halifax|Canada/Atlantic",
+			"America/Havana|Cuba",
+			"America/La_Paz|America/Boa_Vista",
+			"America/La_Paz|America/Guyana",
+			"America/La_Paz|America/Manaus",
+			"America/La_Paz|America/Porto_Velho",
+			"America/La_Paz|Brazil/West",
+			"America/La_Paz|Etc/GMT+4",
+			"America/Lima|America/Bogota",
+			"America/Lima|America/Guayaquil",
+			"America/Lima|Etc/GMT+5",
+			"America/Los_Angeles|America/Dawson",
+			"America/Los_Angeles|America/Ensenada",
+			"America/Los_Angeles|America/Santa_Isabel",
+			"America/Los_Angeles|America/Tijuana",
+			"America/Los_Angeles|America/Vancouver",
+			"America/Los_Angeles|America/Whitehorse",
+			"America/Los_Angeles|Canada/Pacific",
+			"America/Los_Angeles|Canada/Yukon",
+			"America/Los_Angeles|Mexico/BajaNorte",
+			"America/Los_Angeles|PST8PDT",
+			"America/Los_Angeles|US/Pacific",
+			"America/Los_Angeles|US/Pacific-New",
+			"America/Managua|America/Belize",
+			"America/Managua|America/Costa_Rica",
+			"America/Managua|America/El_Salvador",
+			"America/Managua|America/Guatemala",
+			"America/Managua|America/Regina",
+			"America/Managua|America/Swift_Current",
+			"America/Managua|America/Tegucigalpa",
+			"America/Managua|Canada/Saskatchewan",
+			"America/Mexico_City|America/Bahia_Banderas",
+			"America/Mexico_City|America/Merida",
+			"America/Mexico_City|America/Monterrey",
+			"America/Mexico_City|Mexico/General",
+			"America/New_York|America/Detroit",
+			"America/New_York|America/Fort_Wayne",
+			"America/New_York|America/Indiana/Indianapolis",
+			"America/New_York|America/Indiana/Marengo",
+			"America/New_York|America/Indiana/Petersburg",
+			"America/New_York|America/Indiana/Vevay",
+			"America/New_York|America/Indiana/Vincennes",
+			"America/New_York|America/Indiana/Winamac",
+			"America/New_York|America/Indianapolis",
+			"America/New_York|America/Iqaluit",
+			"America/New_York|America/Kentucky/Louisville",
+			"America/New_York|America/Kentucky/Monticello",
+			"America/New_York|America/Louisville",
+			"America/New_York|America/Montreal",
+			"America/New_York|America/Nassau",
+			"America/New_York|America/Nipigon",
+			"America/New_York|America/Pangnirtung",
+			"America/New_York|America/Thunder_Bay",
+			"America/New_York|America/Toronto",
+			"America/New_York|Canada/Eastern",
+			"America/New_York|EST5EDT",
+			"America/New_York|US/East-Indiana",
+			"America/New_York|US/Eastern",
+			"America/New_York|US/Michigan",
+			"America/Noronha|Atlantic/South_Georgia",
+			"America/Noronha|Brazil/DeNoronha",
+			"America/Noronha|Etc/GMT+2",
+			"America/Panama|America/Atikokan",
+			"America/Panama|America/Cayman",
+			"America/Panama|America/Coral_Harbour",
+			"America/Panama|America/Jamaica",
+			"America/Panama|EST",
+			"America/Panama|Jamaica",
+			"America/Phoenix|America/Creston",
+			"America/Phoenix|America/Dawson_Creek",
+			"America/Phoenix|America/Hermosillo",
+			"America/Phoenix|MST",
+			"America/Phoenix|US/Arizona",
+			"America/Rio_Branco|America/Eirunepe",
+			"America/Rio_Branco|America/Porto_Acre",
+			"America/Rio_Branco|Brazil/Acre",
+			"America/Santiago|Chile/Continental",
+			"America/Santo_Domingo|America/Anguilla",
+			"America/Santo_Domingo|America/Antigua",
+			"America/Santo_Domingo|America/Aruba",
+			"America/Santo_Domingo|America/Barbados",
+			"America/Santo_Domingo|America/Blanc-Sablon",
+			"America/Santo_Domingo|America/Curacao",
+			"America/Santo_Domingo|America/Dominica",
+			"America/Santo_Domingo|America/Grenada",
+			"America/Santo_Domingo|America/Guadeloupe",
+			"America/Santo_Domingo|America/Kralendijk",
+			"America/Santo_Domingo|America/Lower_Princes",
+			"America/Santo_Domingo|America/Marigot",
+			"America/Santo_Domingo|America/Martinique",
+			"America/Santo_Domingo|America/Montserrat",
+			"America/Santo_Domingo|America/Port_of_Spain",
+			"America/Santo_Domingo|America/Puerto_Rico",
+			"America/Santo_Domingo|America/St_Barthelemy",
+			"America/Santo_Domingo|America/St_Kitts",
+			"America/Santo_Domingo|America/St_Lucia",
+			"America/Santo_Domingo|America/St_Thomas",
+			"America/Santo_Domingo|America/St_Vincent",
+			"America/Santo_Domingo|America/Tortola",
+			"America/Santo_Domingo|America/Virgin",
+			"America/Sao_Paulo|Brazil/East",
+			"America/St_Johns|Canada/Newfoundland",
+			"Antarctica/Palmer|America/Punta_Arenas",
+			"Asia/Baghdad|Antarctica/Syowa",
+			"Asia/Baghdad|Asia/Aden",
+			"Asia/Baghdad|Asia/Bahrain",
+			"Asia/Baghdad|Asia/Kuwait",
+			"Asia/Baghdad|Asia/Qatar",
+			"Asia/Baghdad|Asia/Riyadh",
+			"Asia/Baghdad|Etc/GMT-3",
+			"Asia/Baghdad|Europe/Minsk",
+			"Asia/Bangkok|Asia/Ho_Chi_Minh",
+			"Asia/Bangkok|Asia/Novokuznetsk",
+			"Asia/Bangkok|Asia/Phnom_Penh",
+			"Asia/Bangkok|Asia/Saigon",
+			"Asia/Bangkok|Asia/Vientiane",
+			"Asia/Bangkok|Etc/GMT-7",
+			"Asia/Bangkok|Indian/Christmas",
+			"Asia/Dhaka|Antarctica/Vostok",
+			"Asia/Dhaka|Asia/Almaty",
+			"Asia/Dhaka|Asia/Bishkek",
+			"Asia/Dhaka|Asia/Dacca",
+			"Asia/Dhaka|Asia/Kashgar",
+			"Asia/Dhaka|Asia/Qyzylorda",
+			"Asia/Dhaka|Asia/Thimbu",
+			"Asia/Dhaka|Asia/Thimphu",
+			"Asia/Dhaka|Asia/Urumqi",
+			"Asia/Dhaka|Etc/GMT-6",
+			"Asia/Dhaka|Indian/Chagos",
+			"Asia/Dili|Etc/GMT-9",
+			"Asia/Dili|Pacific/Palau",
+			"Asia/Dubai|Asia/Muscat",
+			"Asia/Dubai|Asia/Tbilisi",
+			"Asia/Dubai|Asia/Yerevan",
+			"Asia/Dubai|Etc/GMT-4",
+			"Asia/Dubai|Europe/Samara",
+			"Asia/Dubai|Indian/Mahe",
+			"Asia/Dubai|Indian/Mauritius",
+			"Asia/Dubai|Indian/Reunion",
+			"Asia/Gaza|Asia/Hebron",
+			"Asia/Hong_Kong|Hongkong",
+			"Asia/Jakarta|Asia/Pontianak",
+			"Asia/Jerusalem|Asia/Tel_Aviv",
+			"Asia/Jerusalem|Israel",
+			"Asia/Kamchatka|Asia/Anadyr",
+			"Asia/Kamchatka|Etc/GMT-12",
+			"Asia/Kamchatka|Kwajalein",
+			"Asia/Kamchatka|Pacific/Funafuti",
+			"Asia/Kamchatka|Pacific/Kwajalein",
+			"Asia/Kamchatka|Pacific/Majuro",
+			"Asia/Kamchatka|Pacific/Nauru",
+			"Asia/Kamchatka|Pacific/Tarawa",
+			"Asia/Kamchatka|Pacific/Wake",
+			"Asia/Kamchatka|Pacific/Wallis",
+			"Asia/Kathmandu|Asia/Katmandu",
+			"Asia/Kolkata|Asia/Calcutta",
+			"Asia/Makassar|Asia/Ujung_Pandang",
+			"Asia/Manila|Asia/Brunei",
+			"Asia/Manila|Asia/Kuala_Lumpur",
+			"Asia/Manila|Asia/Kuching",
+			"Asia/Manila|Asia/Singapore",
+			"Asia/Manila|Etc/GMT-8",
+			"Asia/Manila|Singapore",
+			"Asia/Rangoon|Asia/Yangon",
+			"Asia/Rangoon|Indian/Cocos",
+			"Asia/Seoul|ROK",
+			"Asia/Shanghai|Asia/Chongqing",
+			"Asia/Shanghai|Asia/Chungking",
+			"Asia/Shanghai|Asia/Harbin",
+			"Asia/Shanghai|Asia/Macao",
+			"Asia/Shanghai|Asia/Macau",
+			"Asia/Shanghai|Asia/Taipei",
+			"Asia/Shanghai|PRC",
+			"Asia/Shanghai|ROC",
+			"Asia/Tashkent|Antarctica/Mawson",
+			"Asia/Tashkent|Asia/Aqtau",
+			"Asia/Tashkent|Asia/Aqtobe",
+			"Asia/Tashkent|Asia/Ashgabat",
+			"Asia/Tashkent|Asia/Ashkhabad",
+			"Asia/Tashkent|Asia/Atyrau",
+			"Asia/Tashkent|Asia/Dushanbe",
+			"Asia/Tashkent|Asia/Oral",
+			"Asia/Tashkent|Asia/Samarkand",
+			"Asia/Tashkent|Etc/GMT-5",
+			"Asia/Tashkent|Indian/Kerguelen",
+			"Asia/Tashkent|Indian/Maldives",
+			"Asia/Tehran|Iran",
+			"Asia/Tokyo|Japan",
+			"Asia/Ulaanbaatar|Asia/Choibalsan",
+			"Asia/Ulaanbaatar|Asia/Ulan_Bator",
+			"Asia/Vladivostok|Asia/Ust-Nera",
+			"Asia/Yakutsk|Asia/Khandyga",
+			"Atlantic/Azores|America/Scoresbysund",
+			"Atlantic/Cape_Verde|Etc/GMT+1",
+			"Australia/Adelaide|Australia/Broken_Hill",
+			"Australia/Adelaide|Australia/South",
+			"Australia/Adelaide|Australia/Yancowinna",
+			"Australia/Brisbane|Australia/Lindeman",
+			"Australia/Brisbane|Australia/Queensland",
+			"Australia/Darwin|Australia/North",
+			"Australia/Lord_Howe|Australia/LHI",
+			"Australia/Perth|Australia/West",
+			"Australia/Sydney|Australia/ACT",
+			"Australia/Sydney|Australia/Canberra",
+			"Australia/Sydney|Australia/Currie",
+			"Australia/Sydney|Australia/Hobart",
+			"Australia/Sydney|Australia/Melbourne",
+			"Australia/Sydney|Australia/NSW",
+			"Australia/Sydney|Australia/Tasmania",
+			"Australia/Sydney|Australia/Victoria",
+			"Etc/UCT|UCT",
+			"Etc/UTC|Etc/Universal",
+			"Etc/UTC|Etc/Zulu",
+			"Etc/UTC|UTC",
+			"Etc/UTC|Universal",
+			"Etc/UTC|Zulu",
+			"Europe/Astrakhan|Europe/Ulyanovsk",
+			"Europe/Athens|Asia/Nicosia",
+			"Europe/Athens|EET",
+			"Europe/Athens|Europe/Bucharest",
+			"Europe/Athens|Europe/Helsinki",
+			"Europe/Athens|Europe/Kiev",
+			"Europe/Athens|Europe/Mariehamn",
+			"Europe/Athens|Europe/Nicosia",
+			"Europe/Athens|Europe/Riga",
+			"Europe/Athens|Europe/Sofia",
+			"Europe/Athens|Europe/Tallinn",
+			"Europe/Athens|Europe/Uzhgorod",
+			"Europe/Athens|Europe/Vilnius",
+			"Europe/Athens|Europe/Zaporozhye",
+			"Europe/Chisinau|Europe/Tiraspol",
+			"Europe/Dublin|Eire",
+			"Europe/Istanbul|Asia/Istanbul",
+			"Europe/Istanbul|Turkey",
+			"Europe/Lisbon|Atlantic/Canary",
+			"Europe/Lisbon|Atlantic/Faeroe",
+			"Europe/Lisbon|Atlantic/Faroe",
+			"Europe/Lisbon|Atlantic/Madeira",
+			"Europe/Lisbon|Portugal",
+			"Europe/Lisbon|WET",
+			"Europe/London|Europe/Belfast",
+			"Europe/London|Europe/Guernsey",
+			"Europe/London|Europe/Isle_of_Man",
+			"Europe/London|Europe/Jersey",
+			"Europe/London|GB",
+			"Europe/London|GB-Eire",
+			"Europe/Moscow|W-SU",
+			"Europe/Paris|Africa/Ceuta",
+			"Europe/Paris|Arctic/Longyearbyen",
+			"Europe/Paris|Atlantic/Jan_Mayen",
+			"Europe/Paris|CET",
+			"Europe/Paris|Europe/Amsterdam",
+			"Europe/Paris|Europe/Andorra",
+			"Europe/Paris|Europe/Belgrade",
+			"Europe/Paris|Europe/Berlin",
+			"Europe/Paris|Europe/Bratislava",
+			"Europe/Paris|Europe/Brussels",
+			"Europe/Paris|Europe/Budapest",
+			"Europe/Paris|Europe/Busingen",
+			"Europe/Paris|Europe/Copenhagen",
+			"Europe/Paris|Europe/Gibraltar",
+			"Europe/Paris|Europe/Ljubljana",
+			"Europe/Paris|Europe/Luxembourg",
+			"Europe/Paris|Europe/Madrid",
+			"Europe/Paris|Europe/Malta",
+			"Europe/Paris|Europe/Monaco",
+			"Europe/Paris|Europe/Oslo",
+			"Europe/Paris|Europe/Podgorica",
+			"Europe/Paris|Europe/Prague",
+			"Europe/Paris|Europe/Rome",
+			"Europe/Paris|Europe/San_Marino",
+			"Europe/Paris|Europe/Sarajevo",
+			"Europe/Paris|Europe/Skopje",
+			"Europe/Paris|Europe/Stockholm",
+			"Europe/Paris|Europe/Tirane",
+			"Europe/Paris|Europe/Vaduz",
+			"Europe/Paris|Europe/Vatican",
+			"Europe/Paris|Europe/Vienna",
+			"Europe/Paris|Europe/Warsaw",
+			"Europe/Paris|Europe/Zagreb",
+			"Europe/Paris|Europe/Zurich",
+			"Europe/Paris|Poland",
+			"Europe/Volgograd|Europe/Kirov",
+			"Pacific/Auckland|Antarctica/McMurdo",
+			"Pacific/Auckland|Antarctica/South_Pole",
+			"Pacific/Auckland|NZ",
+			"Pacific/Chatham|NZ-CHAT",
+			"Pacific/Easter|Chile/EasterIsland",
+			"Pacific/Fakaofo|Etc/GMT-13",
+			"Pacific/Fakaofo|Pacific/Enderbury",
+			"Pacific/Galapagos|Etc/GMT+6",
+			"Pacific/Gambier|Etc/GMT+9",
+			"Pacific/Guadalcanal|Antarctica/Macquarie",
+			"Pacific/Guadalcanal|Etc/GMT-11",
+			"Pacific/Guadalcanal|Pacific/Efate",
+			"Pacific/Guadalcanal|Pacific/Kosrae",
+			"Pacific/Guadalcanal|Pacific/Noumea",
+			"Pacific/Guadalcanal|Pacific/Pohnpei",
+			"Pacific/Guadalcanal|Pacific/Ponape",
+			"Pacific/Guam|Pacific/Saipan",
+			"Pacific/Honolulu|HST",
+			"Pacific/Honolulu|Pacific/Johnston",
+			"Pacific/Honolulu|US/Hawaii",
+			"Pacific/Kiritimati|Etc/GMT-14",
+			"Pacific/Niue|Etc/GMT+11",
+			"Pacific/Pago_Pago|Pacific/Midway",
+			"Pacific/Pago_Pago|Pacific/Samoa",
+			"Pacific/Pago_Pago|US/Samoa",
+			"Pacific/Pitcairn|Etc/GMT+8",
+			"Pacific/Port_Moresby|Antarctica/DumontDUrville",
+			"Pacific/Port_Moresby|Etc/GMT-10",
+			"Pacific/Port_Moresby|Pacific/Chuuk",
+			"Pacific/Port_Moresby|Pacific/Truk",
+			"Pacific/Port_Moresby|Pacific/Yap",
+			"Pacific/Tahiti|Etc/GMT+10",
+			"Pacific/Tahiti|Pacific/Rarotonga"
+		]
+	});
+
+
+	return moment;
+}));
diff --git a/polymer_2.0.2/bower_components/moment-timezone/builds/moment-timezone-with-data-2012-2022.min.js b/polymer_2.0.2/bower_components/moment-timezone/builds/moment-timezone-with-data-2012-2022.min.js
new file mode 100644
index 0000000..7e823d4
--- /dev/null
+++ b/polymer_2.0.2/bower_components/moment-timezone/builds/moment-timezone-with-data-2012-2022.min.js
@@ -0,0 +1 @@
+!function(a,i){"use strict";"function"==typeof define&&define.amd?define(["moment"],i):"object"==typeof module&&module.exports?module.exports=i(require("moment")):i(a.moment)}(this,function(a){"use strict";function i(a){return a>96?a-87:a>64?a-29:a-48}function e(a){var e=0,r=a.split("."),o=r[0],A=r[1]||"",c=1,n=0,t=1;for(45===a.charCodeAt(0)&&(e=1,t=-1),e;e<o.length;e++)n=60*n+i(o.charCodeAt(e));for(e=0;e<A.length;e++)c/=60,n+=i(A.charCodeAt(e))*c;return n*t}function r(a){for(var i=0;i<a.length;i++)a[i]=e(a[i])}function o(a,i){for(var e=0;e<i;e++)a[e]=Math.round((a[e-1]||0)+6e4*a[e]);a[i-1]=1/0}function A(a,i){var e,r=[];for(e=0;e<i.length;e++)r[e]=a[i[e]];return r}function c(a){var i=a.split("|"),e=i[2].split(" "),c=i[3].split(""),n=i[4].split(" ");return r(e),r(c),r(n),o(n,c.length),{name:i[0],abbrs:A(i[1].split(" "),c),offsets:A(e,c),untils:n,population:0|i[5]}}function n(a){a&&this._set(c(a))}function t(a){var i=a.toTimeString(),e=i.match(/\([a-z ]+\)/i);"GMT"===(e=e&&e[0]?(e=e[0].match(/[A-Z]/g))?e.join(""):void 0:(e=i.match(/[A-Z]{3,5}/g))?e[0]:void 0)&&(e=void 0),this.at=+a,this.abbr=e,this.offset=a.getTimezoneOffset()}function s(a){this.zone=a,this.offsetScore=0,this.abbrScore=0}function u(a,i){for(var e,r;r=6e4*((i.at-a.at)/12e4|0);)(e=new t(new Date(a.at+r))).offset===a.offset?a=e:i=e;return a}function m(){var a,i,e,r=(new Date).getFullYear()-2,o=new t(new Date(r,0,1)),A=[o];for(e=1;e<48;e++)(i=new t(new Date(r,e,1))).offset!==o.offset&&(a=u(o,i),A.push(a),A.push(new t(new Date(a.at+6e4)))),o=i;for(e=0;e<4;e++)A.push(new t(new Date(r+e,0,1))),A.push(new t(new Date(r+e,6,1)));return A}function f(a,i){return a.offsetScore!==i.offsetScore?a.offsetScore-i.offsetScore:a.abbrScore!==i.abbrScore?a.abbrScore-i.abbrScore:i.zone.population-a.zone.population}function l(a,i){var e,o;for(r(i),e=0;e<i.length;e++)o=i[e],D[o]=D[o]||{},D[o][a]=!0}function p(a){var i,e,r,o=a.length,A={},c=[];for(i=0;i<o;i++){r=D[a[i].offset]||{};for(e in r)r.hasOwnProperty(e)&&(A[e]=!0)}for(i in A)A.hasOwnProperty(i)&&c.push(O[i]);return c}function b(){try{var a=Intl.DateTimeFormat().resolvedOptions().timeZone;if(a&&a.length>3){var i=O[M(a)];if(i)return i;S("Moment Timezone found "+a+" from the Intl api, but did not have that data loaded.")}}catch(a){}var e,r,o,A=m(),c=A.length,n=p(A),t=[];for(r=0;r<n.length;r++){for(e=new s(h(n[r]),c),o=0;o<c;o++)e.scoreOffsetAt(A[o]);t.push(e)}return t.sort(f),t.length>0?t[0].zone.name:void 0}function M(a){return(a||"").toLowerCase().replace(/\//g,"_")}function d(a){var i,e,r,o;for("string"==typeof a&&(a=[a]),i=0;i<a.length;i++)o=M(e=(r=a[i].split("|"))[0]),N[o]=a[i],O[o]=e,l(o,r[2].split(" "))}function h(a,i){a=M(a);var e,r=N[a];return r instanceof n?r:"string"==typeof r?(r=new n(r),N[a]=r,r):C[a]&&i!==h&&(e=h(C[a],h))?((r=N[a]=new n)._set(e),r.name=O[a],r):null}function z(a){var i,e,r,o;for("string"==typeof a&&(a=[a]),i=0;i<a.length;i++)r=M((e=a[i].split("|"))[0]),o=M(e[1]),C[r]=o,O[r]=e[0],C[o]=r,O[o]=e[1]}function E(a){d(a.zones),z(a.links),P.dataVersion=a.version}function g(a){return g.didShowError||(g.didShowError=!0,S("moment.tz.zoneExists('"+a+"') has been deprecated in favor of !moment.tz.zone('"+a+"')")),!!h(a)}function T(a){var i="X"===a._f||"x"===a._f;return!(!a._a||void 0!==a._tzm||i)}function S(a){"undefined"!=typeof console&&"function"==typeof console.error&&console.error(a)}function P(i){var e=Array.prototype.slice.call(arguments,0,-1),r=arguments[arguments.length-1],o=h(r),A=a.utc.apply(null,e);return o&&!a.isMoment(i)&&T(A)&&A.add(o.parse(A),"minutes"),A.tz(r),A}function _(a){return function(){return this._z?this._z.abbr(this):a.call(this)}}var k,N={},C={},O={},D={},G=a.version.split("."),B=+G[0],L=+G[1];(B<2||2===B&&L<6)&&S("Moment Timezone requires Moment.js >= 2.6.0. You are using Moment.js "+a.version+". See momentjs.com"),n.prototype={_set:function(a){this.name=a.name,this.abbrs=a.abbrs,this.untils=a.untils,this.offsets=a.offsets,this.population=a.population},_index:function(a){var i,e=+a,r=this.untils;for(i=0;i<r.length;i++)if(e<r[i])return i},parse:function(a){var i,e,r,o,A=+a,c=this.offsets,n=this.untils,t=n.length-1;for(o=0;o<t;o++)if(i=c[o],e=c[o+1],r=c[o?o-1:o],i<e&&P.moveAmbiguousForward?i=e:i>r&&P.moveInvalidForward&&(i=r),A<n[o]-6e4*i)return c[o];return c[t]},abbr:function(a){return this.abbrs[this._index(a)]},offset:function(a){return S("zone.offset has been deprecated in favor of zone.utcOffset"),this.offsets[this._index(a)]},utcOffset:function(a){return this.offsets[this._index(a)]}},s.prototype.scoreOffsetAt=function(a){this.offsetScore+=Math.abs(this.zone.utcOffset(a.at)-a.offset),this.zone.abbr(a.at).replace(/[^A-Z]/g,"")!==a.abbr&&this.abbrScore++},P.version="0.5.14",P.dataVersion="",P._zones=N,P._links=C,P._names=O,P.add=d,P.link=z,P.load=E,P.zone=h,P.zoneExists=g,P.guess=function(a){return k&&!a||(k=b()),k},P.names=function(){var a,i=[];for(a in O)O.hasOwnProperty(a)&&(N[a]||N[C[a]])&&O[a]&&i.push(O[a]);return i.sort()},P.Zone=n,P.unpack=c,P.unpackBase60=e,P.needsOffset=T,P.moveInvalidForward=!0,P.moveAmbiguousForward=!1;var y=a.fn;a.tz=P,a.defaultZone=null,a.updateOffset=function(i,e){var r,o=a.defaultZone;void 0===i._z&&(o&&T(i)&&!i._isUTC&&(i._d=a.utc(i._a)._d,i.utc().add(o.parse(i),"minutes")),i._z=o),i._z&&(r=i._z.utcOffset(i),Math.abs(r)<16&&(r/=60),void 0!==i.utcOffset?i.utcOffset(-r,e):i.zone(r,e))},y.tz=function(i,e){return i?(this._z=h(i),this._z?a.updateOffset(this,e):S("Moment Timezone has no data for "+i+". See http://momentjs.com/timezone/docs/#/data-loading/."),this):this._z?this._z.name:void 0},y.zoneName=_(y.zoneName),y.zoneAbbr=_(y.zoneAbbr),y.utc=function(a){return function(){return this._z=null,a.apply(this,arguments)}}(y.utc),a.tz.setDefault=function(i){return(B<2||2===B&&L<9)&&S("Moment Timezone setDefault() requires Moment.js >= 2.9.0. You are using Moment.js "+a.version+"."),a.defaultZone=i?h(i):null,a};var q=a.momentProperties;return"[object Array]"===Object.prototype.toString.call(q)?(q.push("_z"),q.push("_a")):q&&(q._z=null),E({version:"2017c",zones:["Africa/Abidjan|GMT|0|0||48e5","Africa/Nairobi|EAT|-30|0||47e5","Africa/Algiers|CET|-10|0||26e5","Africa/Lagos|WAT|-10|0||17e6","Africa/Maputo|CAT|-20|0||26e5","Africa/Cairo|EET EEST|-20 -30|01010|1M2m0 gL0 e10 mn0|15e6","Africa/Casablanca|WET WEST|0 -10|0101010101010101010101010101010101010101010|1H3C0 wM0 co0 go0 1o00 s00 dA0 vc0 11A0 A00 e00 y00 11A0 uM0 e00 Dc0 11A0 s00 e00 IM0 WM0 mo0 gM0 LA0 WM0 jA0 e00 Rc0 11A0 e00 e00 U00 11A0 8o0 e00 11A0 11A0 5A0 e00 17c0 1fA0 1a00|32e5","Europe/Paris|CET CEST|-10 -20|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|11e6","Africa/Johannesburg|SAST|-20|0||84e5","Africa/Khartoum|EAT CAT|-30 -20|01|1Usl0|51e5","Africa/Tripoli|EET CET CEST|-20 -10 -20|0120|1IlA0 TA0 1o00|11e5","Africa/Windhoek|WAST WAT CAT|-20 -10 -20|0101010101012|1GQo0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0|32e4","America/Adak|HST HDT|a0 90|01010101010101010101010|1GIc0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|326","America/Anchorage|AKST AKDT|90 80|01010101010101010101010|1GIb0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|30e4","America/Santo_Domingo|AST|40|0||29e5","America/Araguaina|-03 -02|30 20|010|1IdD0 Lz0|14e4","America/Fortaleza|-03|30|0||34e5","America/Asuncion|-03 -04|30 40|01010101010101010101010|1GTf0 1cN0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0|28e5","America/Panama|EST|50|0||15e5","America/Bahia|-02 -03|20 30|01|1GCq0|27e5","America/Mexico_City|CST CDT|60 50|01010101010101010101010|1GQw0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0|20e6","America/Managua|CST|60|0||22e5","America/La_Paz|-04|40|0||19e5","America/Lima|-05|50|0||11e6","America/Denver|MST MDT|70 60|01010101010101010101010|1GI90 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|26e5","America/Campo_Grande|-03 -04|30 40|01010101010101010101010|1GCr0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1C10 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0|77e4","America/Cancun|CST CDT EST|60 50 50|01010102|1GQw0 1nX0 14p0 1lb0 14p0 1lb0 Dd0|63e4","America/Caracas|-0430 -04|4u 40|01|1QMT0|29e5","America/Chicago|CST CDT|60 50|01010101010101010101010|1GI80 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|92e5","America/Chihuahua|MST MDT|70 60|01010101010101010101010|1GQx0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0|81e4","America/Phoenix|MST|70|0||42e5","America/Los_Angeles|PST PDT|80 70|01010101010101010101010|1GIa0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|15e6","America/New_York|EST EDT|50 40|01010101010101010101010|1GI70 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|21e6","America/Rio_Branco|-04 -05|40 50|01|1KLE0|31e4","America/Fort_Nelson|PST PDT MST|80 70 70|01010102|1GIa0 1zb0 Op0 1zb0 Op0 1zb0 Op0|39e2","America/Halifax|AST ADT|40 30|01010101010101010101010|1GI60 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|39e4","America/Godthab|-03 -02|30 20|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|17e3","America/Grand_Turk|EST EDT AST|50 40 40|0101010121010101010|1GI70 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 5Ip0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|37e2","America/Havana|CST CDT|50 40|01010101010101010101010|1GQt0 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0|21e5","America/Metlakatla|PST AKST AKDT|80 90 80|0121212121212121|1PAa0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|14e2","America/Miquelon|-03 -02|30 20|01010101010101010101010|1GI50 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|61e2","America/Montevideo|-02 -03|20 30|01010101|1GI40 1o10 11z0 1o10 11z0 1o10 11z0|17e5","America/Noronha|-02|20|0||30e2","America/Port-au-Prince|EST EDT|50 40|010101010101010101010|1GI70 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 3iN0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|23e5","Antarctica/Palmer|-03 -04|30 40|010101010|1H3D0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0|40","America/Santiago|-03 -04|30 40|010101010101010101010|1H3D0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Dd0 1Nb0 Ap0|62e5","America/Sao_Paulo|-02 -03|20 30|01010101010101010101010|1GCq0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1C10 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0|20e6","Atlantic/Azores|-01 +00|10 0|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|25e4","America/St_Johns|NST NDT|3u 2u|01010101010101010101010|1GI5u 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0|11e4","Antarctica/Casey|+11 +08|-b0 -80|010|1GAF0 blz0|10","Antarctica/Davis|+05 +07|-50 -70|01|1GAI0|70","Pacific/Port_Moresby|+10|-a0|0||25e4","Pacific/Guadalcanal|+11|-b0|0||11e4","Asia/Tashkent|+05|-50|0||23e5","Pacific/Auckland|NZDT NZST|-d0 -c0|01010101010101010101010|1GQe0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00|14e5","Asia/Baghdad|+03|-30|0||66e5","Antarctica/Troll|+00 +02|0 -20|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|40","Asia/Dhaka|+06|-60|0||16e6","Asia/Amman|EET EEST|-20 -30|010101010101010101010|1GPy0 4bX0 Dd0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00|25e5","Asia/Kamchatka|+12|-c0|0||18e4","Asia/Baku|+04 +05|-40 -50|010101010|1GNA0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|27e5","Asia/Bangkok|+07|-70|0||15e6","Asia/Barnaul|+07 +06|-70 -60|010|1N7v0 3rd0","Asia/Beirut|EET EEST|-20 -30|01010101010101010101010|1GNy0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0|22e5","Asia/Manila|+08|-80|0||24e6","Asia/Kolkata|IST|-5u|0||15e6","Asia/Chita|+10 +08 +09|-a0 -80 -90|012|1N7s0 3re0|33e4","Asia/Ulaanbaatar|+08 +09|-80 -90|01010|1O8G0 1cJ0 1cP0 1cJ0|12e5","Asia/Shanghai|CST|-80|0||23e6","Asia/Colombo|+0530|-5u|0||22e5","Asia/Damascus|EET EEST|-20 -30|01010101010101010101010|1GPy0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0|26e5","Asia/Dili|+09|-90|0||19e4","Asia/Dubai|+04|-40|0||39e5","Asia/Famagusta|EET EEST +03|-20 -30 -30|0101010101201010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 15U0 2Ks0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0","Asia/Gaza|EET EEST|-20 -30|01010101010101010101010|1GPy0 1a00 1fA0 1cL0 1cN0 1nX0 1210 1nz0 1220 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0|18e5","Asia/Hong_Kong|HKT|-80|0||73e5","Asia/Hovd|+07 +08|-70 -80|01010|1O8H0 1cJ0 1cP0 1cJ0|81e3","Asia/Irkutsk|+09 +08|-90 -80|01|1N7t0|60e4","Europe/Istanbul|EET EEST +03|-20 -30 -30|01010101012|1GNB0 1qM0 11A0 1o00 1200 1nA0 11A0 1tA0 U00 15w0|13e6","Asia/Jakarta|WIB|-70|0||31e6","Asia/Jayapura|WIT|-90|0||26e4","Asia/Jerusalem|IST IDT|-20 -30|01010101010101010101010|1GPA0 1aL0 1eN0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0|81e4","Asia/Kabul|+0430|-4u|0||46e5","Asia/Karachi|PKT|-50|0||24e6","Asia/Kathmandu|+0545|-5J|0||12e5","Asia/Yakutsk|+10 +09|-a0 -90|01|1N7s0|28e4","Asia/Krasnoyarsk|+08 +07|-80 -70|01|1N7u0|10e5","Asia/Magadan|+12 +10 +11|-c0 -a0 -b0|012|1N7q0 3Cq0|95e3","Asia/Makassar|WITA|-80|0||15e5","Europe/Athens|EET EEST|-20 -30|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|35e5","Asia/Novosibirsk|+07 +06|-70 -60|010|1N7v0 4eN0|15e5","Asia/Omsk|+07 +06|-70 -60|01|1N7v0|12e5","Asia/Pyongyang|KST KST|-90 -8u|01|1P4D0|29e5","Asia/Rangoon|+0630|-6u|0||48e5","Asia/Sakhalin|+11 +10|-b0 -a0|010|1N7r0 3rd0|58e4","Asia/Seoul|KST|-90|0||23e6","Asia/Srednekolymsk|+12 +11|-c0 -b0|01|1N7q0|35e2","Asia/Tehran|+0330 +0430|-3u -4u|01010101010101010101010|1GLUu 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0|14e6","Asia/Tokyo|JST|-90|0||38e6","Asia/Tomsk|+07 +06|-70 -60|010|1N7v0 3Qp0|10e5","Asia/Vladivostok|+11 +10|-b0 -a0|01|1N7r0|60e4","Asia/Yekaterinburg|+06 +05|-60 -50|01|1N7w0|14e5","Europe/Lisbon|WET WEST|0 -10|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|27e5","Atlantic/Cape_Verde|-01|10|0||50e4","Australia/Sydney|AEDT AEST|-b0 -a0|01010101010101010101010|1GQg0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0|40e5","Australia/Adelaide|ACDT ACST|-au -9u|01010101010101010101010|1GQgu 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0|11e5","Australia/Brisbane|AEST|-a0|0||20e5","Australia/Darwin|ACST|-9u|0||12e4","Australia/Eucla|+0845|-8J|0||368","Australia/Lord_Howe|+11 +1030|-b0 -au|01010101010101010101010|1GQf0 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu|347","Australia/Perth|AWST|-80|0||18e5","Pacific/Easter|-05 -06|50 60|010101010101010101010|1H3D0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1Nb0 Dd0 1Nb0 Ap0|30e2","Europe/Dublin|GMT IST|0 -10|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|12e5","Pacific/Tahiti|-10|a0|0||18e4","Pacific/Niue|-11|b0|0||12e2","Etc/GMT+12|-12|c0|0|","Pacific/Galapagos|-06|60|0||25e3","Etc/GMT+7|-07|70|0|","Pacific/Pitcairn|-08|80|0||56","Pacific/Gambier|-09|90|0||125","Etc/GMT-1|+01|-10|0|","Pacific/Fakaofo|+13|-d0|0||483","Pacific/Kiritimati|+14|-e0|0||51e2","Etc/GMT-2|+02|-20|0|","Etc/UCT|UCT|0|0|","Etc/UTC|UTC|0|0|","Europe/Astrakhan|+04 +03|-40 -30|010|1N7y0 3rd0","Europe/London|GMT BST|0 -10|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|10e6","Europe/Chisinau|EET EEST|-20 -30|01010101010101010101010|1GNA0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|67e4","Europe/Kaliningrad|+03 EET|-30 -20|01|1N7z0|44e4","Europe/Volgograd|+04 +03|-40 -30|01|1N7y0|10e5","Europe/Moscow|MSK MSK|-40 -30|01|1N7y0|16e6","Europe/Saratov|+04 +03|-40 -30|010|1N7y0 5810","Europe/Simferopol|EET EEST MSK MSK|-20 -30 -40 -30|0101023|1GNB0 1qM0 11A0 1o00 11z0 1nW0|33e4","Pacific/Honolulu|HST|a0|0||37e4","MET|MET MEST|-10 -20|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0","Pacific/Chatham|+1345 +1245|-dJ -cJ|01010101010101010101010|1GQe0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00|600","Pacific/Apia|+14 +13|-e0 -d0|01010101010101010101010|1GQe0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00|37e3","Pacific/Bougainville|+10 +11|-a0 -b0|01|1NwE0|18e4","Pacific/Fiji|+13 +12|-d0 -c0|01010101010101010101010|1Goe0 1Nc0 Ao0 1Q00 xz0 1SN0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 uM0 1SM0 uM0 1SM0 uM0 1VA0 s00 1VA0|88e4","Pacific/Guam|ChST|-a0|0||17e4","Pacific/Marquesas|-0930|9u|0||86e2","Pacific/Pago_Pago|SST|b0|0||37e2","Pacific/Norfolk|+1130 +11|-bu -b0|01|1PoCu|25e4","Pacific/Tongatapu|+13 +14|-d0 -e0|010|1S4d0 s00|75e3"],links:["Africa/Abidjan|Africa/Accra","Africa/Abidjan|Africa/Bamako","Africa/Abidjan|Africa/Banjul","Africa/Abidjan|Africa/Bissau","Africa/Abidjan|Africa/Conakry","Africa/Abidjan|Africa/Dakar","Africa/Abidjan|Africa/Freetown","Africa/Abidjan|Africa/Lome","Africa/Abidjan|Africa/Monrovia","Africa/Abidjan|Africa/Nouakchott","Africa/Abidjan|Africa/Ouagadougou","Africa/Abidjan|Africa/Sao_Tome","Africa/Abidjan|Africa/Timbuktu","Africa/Abidjan|America/Danmarkshavn","Africa/Abidjan|Atlantic/Reykjavik","Africa/Abidjan|Atlantic/St_Helena","Africa/Abidjan|Etc/GMT","Africa/Abidjan|Etc/GMT+0","Africa/Abidjan|Etc/GMT-0","Africa/Abidjan|Etc/GMT0","Africa/Abidjan|Etc/Greenwich","Africa/Abidjan|GMT","Africa/Abidjan|GMT+0","Africa/Abidjan|GMT-0","Africa/Abidjan|GMT0","Africa/Abidjan|Greenwich","Africa/Abidjan|Iceland","Africa/Algiers|Africa/Tunis","Africa/Cairo|Egypt","Africa/Casablanca|Africa/El_Aaiun","Africa/Johannesburg|Africa/Maseru","Africa/Johannesburg|Africa/Mbabane","Africa/Lagos|Africa/Bangui","Africa/Lagos|Africa/Brazzaville","Africa/Lagos|Africa/Douala","Africa/Lagos|Africa/Kinshasa","Africa/Lagos|Africa/Libreville","Africa/Lagos|Africa/Luanda","Africa/Lagos|Africa/Malabo","Africa/Lagos|Africa/Ndjamena","Africa/Lagos|Africa/Niamey","Africa/Lagos|Africa/Porto-Novo","Africa/Maputo|Africa/Blantyre","Africa/Maputo|Africa/Bujumbura","Africa/Maputo|Africa/Gaborone","Africa/Maputo|Africa/Harare","Africa/Maputo|Africa/Kigali","Africa/Maputo|Africa/Lubumbashi","Africa/Maputo|Africa/Lusaka","Africa/Nairobi|Africa/Addis_Ababa","Africa/Nairobi|Africa/Asmara","Africa/Nairobi|Africa/Asmera","Africa/Nairobi|Africa/Dar_es_Salaam","Africa/Nairobi|Africa/Djibouti","Africa/Nairobi|Africa/Juba","Africa/Nairobi|Africa/Kampala","Africa/Nairobi|Africa/Mogadishu","Africa/Nairobi|Indian/Antananarivo","Africa/Nairobi|Indian/Comoro","Africa/Nairobi|Indian/Mayotte","Africa/Tripoli|Libya","America/Adak|America/Atka","America/Adak|US/Aleutian","America/Anchorage|America/Juneau","America/Anchorage|America/Nome","America/Anchorage|America/Sitka","America/Anchorage|America/Yakutat","America/Anchorage|US/Alaska","America/Campo_Grande|America/Cuiaba","America/Chicago|America/Indiana/Knox","America/Chicago|America/Indiana/Tell_City","America/Chicago|America/Knox_IN","America/Chicago|America/Matamoros","America/Chicago|America/Menominee","America/Chicago|America/North_Dakota/Beulah","America/Chicago|America/North_Dakota/Center","America/Chicago|America/North_Dakota/New_Salem","America/Chicago|America/Rainy_River","America/Chicago|America/Rankin_Inlet","America/Chicago|America/Resolute","America/Chicago|America/Winnipeg","America/Chicago|CST6CDT","America/Chicago|Canada/Central","America/Chicago|US/Central","America/Chicago|US/Indiana-Starke","America/Chihuahua|America/Mazatlan","America/Chihuahua|Mexico/BajaSur","America/Denver|America/Boise","America/Denver|America/Cambridge_Bay","America/Denver|America/Edmonton","America/Denver|America/Inuvik","America/Denver|America/Ojinaga","America/Denver|America/Shiprock","America/Denver|America/Yellowknife","America/Denver|Canada/Mountain","America/Denver|MST7MDT","America/Denver|Navajo","America/Denver|US/Mountain","America/Fortaleza|America/Argentina/Buenos_Aires","America/Fortaleza|America/Argentina/Catamarca","America/Fortaleza|America/Argentina/ComodRivadavia","America/Fortaleza|America/Argentina/Cordoba","America/Fortaleza|America/Argentina/Jujuy","America/Fortaleza|America/Argentina/La_Rioja","America/Fortaleza|America/Argentina/Mendoza","America/Fortaleza|America/Argentina/Rio_Gallegos","America/Fortaleza|America/Argentina/Salta","America/Fortaleza|America/Argentina/San_Juan","America/Fortaleza|America/Argentina/San_Luis","America/Fortaleza|America/Argentina/Tucuman","America/Fortaleza|America/Argentina/Ushuaia","America/Fortaleza|America/Belem","America/Fortaleza|America/Buenos_Aires","America/Fortaleza|America/Catamarca","America/Fortaleza|America/Cayenne","America/Fortaleza|America/Cordoba","America/Fortaleza|America/Jujuy","America/Fortaleza|America/Maceio","America/Fortaleza|America/Mendoza","America/Fortaleza|America/Paramaribo","America/Fortaleza|America/Recife","America/Fortaleza|America/Rosario","America/Fortaleza|America/Santarem","America/Fortaleza|Antarctica/Rothera","America/Fortaleza|Atlantic/Stanley","America/Fortaleza|Etc/GMT+3","America/Halifax|America/Glace_Bay","America/Halifax|America/Goose_Bay","America/Halifax|America/Moncton","America/Halifax|America/Thule","America/Halifax|Atlantic/Bermuda","America/Halifax|Canada/Atlantic","America/Havana|Cuba","America/La_Paz|America/Boa_Vista","America/La_Paz|America/Guyana","America/La_Paz|America/Manaus","America/La_Paz|America/Porto_Velho","America/La_Paz|Brazil/West","America/La_Paz|Etc/GMT+4","America/Lima|America/Bogota","America/Lima|America/Guayaquil","America/Lima|Etc/GMT+5","America/Los_Angeles|America/Dawson","America/Los_Angeles|America/Ensenada","America/Los_Angeles|America/Santa_Isabel","America/Los_Angeles|America/Tijuana","America/Los_Angeles|America/Vancouver","America/Los_Angeles|America/Whitehorse","America/Los_Angeles|Canada/Pacific","America/Los_Angeles|Canada/Yukon","America/Los_Angeles|Mexico/BajaNorte","America/Los_Angeles|PST8PDT","America/Los_Angeles|US/Pacific","America/Los_Angeles|US/Pacific-New","America/Managua|America/Belize","America/Managua|America/Costa_Rica","America/Managua|America/El_Salvador","America/Managua|America/Guatemala","America/Managua|America/Regina","America/Managua|America/Swift_Current","America/Managua|America/Tegucigalpa","America/Managua|Canada/Saskatchewan","America/Mexico_City|America/Bahia_Banderas","America/Mexico_City|America/Merida","America/Mexico_City|America/Monterrey","America/Mexico_City|Mexico/General","America/New_York|America/Detroit","America/New_York|America/Fort_Wayne","America/New_York|America/Indiana/Indianapolis","America/New_York|America/Indiana/Marengo","America/New_York|America/Indiana/Petersburg","America/New_York|America/Indiana/Vevay","America/New_York|America/Indiana/Vincennes","America/New_York|America/Indiana/Winamac","America/New_York|America/Indianapolis","America/New_York|America/Iqaluit","America/New_York|America/Kentucky/Louisville","America/New_York|America/Kentucky/Monticello","America/New_York|America/Louisville","America/New_York|America/Montreal","America/New_York|America/Nassau","America/New_York|America/Nipigon","America/New_York|America/Pangnirtung","America/New_York|America/Thunder_Bay","America/New_York|America/Toronto","America/New_York|Canada/Eastern","America/New_York|EST5EDT","America/New_York|US/East-Indiana","America/New_York|US/Eastern","America/New_York|US/Michigan","America/Noronha|Atlantic/South_Georgia","America/Noronha|Brazil/DeNoronha","America/Noronha|Etc/GMT+2","America/Panama|America/Atikokan","America/Panama|America/Cayman","America/Panama|America/Coral_Harbour","America/Panama|America/Jamaica","America/Panama|EST","America/Panama|Jamaica","America/Phoenix|America/Creston","America/Phoenix|America/Dawson_Creek","America/Phoenix|America/Hermosillo","America/Phoenix|MST","America/Phoenix|US/Arizona","America/Rio_Branco|America/Eirunepe","America/Rio_Branco|America/Porto_Acre","America/Rio_Branco|Brazil/Acre","America/Santiago|Chile/Continental","America/Santo_Domingo|America/Anguilla","America/Santo_Domingo|America/Antigua","America/Santo_Domingo|America/Aruba","America/Santo_Domingo|America/Barbados","America/Santo_Domingo|America/Blanc-Sablon","America/Santo_Domingo|America/Curacao","America/Santo_Domingo|America/Dominica","America/Santo_Domingo|America/Grenada","America/Santo_Domingo|America/Guadeloupe","America/Santo_Domingo|America/Kralendijk","America/Santo_Domingo|America/Lower_Princes","America/Santo_Domingo|America/Marigot","America/Santo_Domingo|America/Martinique","America/Santo_Domingo|America/Montserrat","America/Santo_Domingo|America/Port_of_Spain","America/Santo_Domingo|America/Puerto_Rico","America/Santo_Domingo|America/St_Barthelemy","America/Santo_Domingo|America/St_Kitts","America/Santo_Domingo|America/St_Lucia","America/Santo_Domingo|America/St_Thomas","America/Santo_Domingo|America/St_Vincent","America/Santo_Domingo|America/Tortola","America/Santo_Domingo|America/Virgin","America/Sao_Paulo|Brazil/East","America/St_Johns|Canada/Newfoundland","Antarctica/Palmer|America/Punta_Arenas","Asia/Baghdad|Antarctica/Syowa","Asia/Baghdad|Asia/Aden","Asia/Baghdad|Asia/Bahrain","Asia/Baghdad|Asia/Kuwait","Asia/Baghdad|Asia/Qatar","Asia/Baghdad|Asia/Riyadh","Asia/Baghdad|Etc/GMT-3","Asia/Baghdad|Europe/Minsk","Asia/Bangkok|Asia/Ho_Chi_Minh","Asia/Bangkok|Asia/Novokuznetsk","Asia/Bangkok|Asia/Phnom_Penh","Asia/Bangkok|Asia/Saigon","Asia/Bangkok|Asia/Vientiane","Asia/Bangkok|Etc/GMT-7","Asia/Bangkok|Indian/Christmas","Asia/Dhaka|Antarctica/Vostok","Asia/Dhaka|Asia/Almaty","Asia/Dhaka|Asia/Bishkek","Asia/Dhaka|Asia/Dacca","Asia/Dhaka|Asia/Kashgar","Asia/Dhaka|Asia/Qyzylorda","Asia/Dhaka|Asia/Thimbu","Asia/Dhaka|Asia/Thimphu","Asia/Dhaka|Asia/Urumqi","Asia/Dhaka|Etc/GMT-6","Asia/Dhaka|Indian/Chagos","Asia/Dili|Etc/GMT-9","Asia/Dili|Pacific/Palau","Asia/Dubai|Asia/Muscat","Asia/Dubai|Asia/Tbilisi","Asia/Dubai|Asia/Yerevan","Asia/Dubai|Etc/GMT-4","Asia/Dubai|Europe/Samara","Asia/Dubai|Indian/Mahe","Asia/Dubai|Indian/Mauritius","Asia/Dubai|Indian/Reunion","Asia/Gaza|Asia/Hebron","Asia/Hong_Kong|Hongkong","Asia/Jakarta|Asia/Pontianak","Asia/Jerusalem|Asia/Tel_Aviv","Asia/Jerusalem|Israel","Asia/Kamchatka|Asia/Anadyr","Asia/Kamchatka|Etc/GMT-12","Asia/Kamchatka|Kwajalein","Asia/Kamchatka|Pacific/Funafuti","Asia/Kamchatka|Pacific/Kwajalein","Asia/Kamchatka|Pacific/Majuro","Asia/Kamchatka|Pacific/Nauru","Asia/Kamchatka|Pacific/Tarawa","Asia/Kamchatka|Pacific/Wake","Asia/Kamchatka|Pacific/Wallis","Asia/Kathmandu|Asia/Katmandu","Asia/Kolkata|Asia/Calcutta","Asia/Makassar|Asia/Ujung_Pandang","Asia/Manila|Asia/Brunei","Asia/Manila|Asia/Kuala_Lumpur","Asia/Manila|Asia/Kuching","Asia/Manila|Asia/Singapore","Asia/Manila|Etc/GMT-8","Asia/Manila|Singapore","Asia/Rangoon|Asia/Yangon","Asia/Rangoon|Indian/Cocos","Asia/Seoul|ROK","Asia/Shanghai|Asia/Chongqing","Asia/Shanghai|Asia/Chungking","Asia/Shanghai|Asia/Harbin","Asia/Shanghai|Asia/Macao","Asia/Shanghai|Asia/Macau","Asia/Shanghai|Asia/Taipei","Asia/Shanghai|PRC","Asia/Shanghai|ROC","Asia/Tashkent|Antarctica/Mawson","Asia/Tashkent|Asia/Aqtau","Asia/Tashkent|Asia/Aqtobe","Asia/Tashkent|Asia/Ashgabat","Asia/Tashkent|Asia/Ashkhabad","Asia/Tashkent|Asia/Atyrau","Asia/Tashkent|Asia/Dushanbe","Asia/Tashkent|Asia/Oral","Asia/Tashkent|Asia/Samarkand","Asia/Tashkent|Etc/GMT-5","Asia/Tashkent|Indian/Kerguelen","Asia/Tashkent|Indian/Maldives","Asia/Tehran|Iran","Asia/Tokyo|Japan","Asia/Ulaanbaatar|Asia/Choibalsan","Asia/Ulaanbaatar|Asia/Ulan_Bator","Asia/Vladivostok|Asia/Ust-Nera","Asia/Yakutsk|Asia/Khandyga","Atlantic/Azores|America/Scoresbysund","Atlantic/Cape_Verde|Etc/GMT+1","Australia/Adelaide|Australia/Broken_Hill","Australia/Adelaide|Australia/South","Australia/Adelaide|Australia/Yancowinna","Australia/Brisbane|Australia/Lindeman","Australia/Brisbane|Australia/Queensland","Australia/Darwin|Australia/North","Australia/Lord_Howe|Australia/LHI","Australia/Perth|Australia/West","Australia/Sydney|Australia/ACT","Australia/Sydney|Australia/Canberra","Australia/Sydney|Australia/Currie","Australia/Sydney|Australia/Hobart","Australia/Sydney|Australia/Melbourne","Australia/Sydney|Australia/NSW","Australia/Sydney|Australia/Tasmania","Australia/Sydney|Australia/Victoria","Etc/UCT|UCT","Etc/UTC|Etc/Universal","Etc/UTC|Etc/Zulu","Etc/UTC|UTC","Etc/UTC|Universal","Etc/UTC|Zulu","Europe/Astrakhan|Europe/Ulyanovsk","Europe/Athens|Asia/Nicosia","Europe/Athens|EET","Europe/Athens|Europe/Bucharest","Europe/Athens|Europe/Helsinki","Europe/Athens|Europe/Kiev","Europe/Athens|Europe/Mariehamn","Europe/Athens|Europe/Nicosia","Europe/Athens|Europe/Riga","Europe/Athens|Europe/Sofia","Europe/Athens|Europe/Tallinn","Europe/Athens|Europe/Uzhgorod","Europe/Athens|Europe/Vilnius","Europe/Athens|Europe/Zaporozhye","Europe/Chisinau|Europe/Tiraspol","Europe/Dublin|Eire","Europe/Istanbul|Asia/Istanbul","Europe/Istanbul|Turkey","Europe/Lisbon|Atlantic/Canary","Europe/Lisbon|Atlantic/Faeroe","Europe/Lisbon|Atlantic/Faroe","Europe/Lisbon|Atlantic/Madeira","Europe/Lisbon|Portugal","Europe/Lisbon|WET","Europe/London|Europe/Belfast","Europe/London|Europe/Guernsey","Europe/London|Europe/Isle_of_Man","Europe/London|Europe/Jersey","Europe/London|GB","Europe/London|GB-Eire","Europe/Moscow|W-SU","Europe/Paris|Africa/Ceuta","Europe/Paris|Arctic/Longyearbyen","Europe/Paris|Atlantic/Jan_Mayen","Europe/Paris|CET","Europe/Paris|Europe/Amsterdam","Europe/Paris|Europe/Andorra","Europe/Paris|Europe/Belgrade","Europe/Paris|Europe/Berlin","Europe/Paris|Europe/Bratislava","Europe/Paris|Europe/Brussels","Europe/Paris|Europe/Budapest","Europe/Paris|Europe/Busingen","Europe/Paris|Europe/Copenhagen","Europe/Paris|Europe/Gibraltar","Europe/Paris|Europe/Ljubljana","Europe/Paris|Europe/Luxembourg","Europe/Paris|Europe/Madrid","Europe/Paris|Europe/Malta","Europe/Paris|Europe/Monaco","Europe/Paris|Europe/Oslo","Europe/Paris|Europe/Podgorica","Europe/Paris|Europe/Prague","Europe/Paris|Europe/Rome","Europe/Paris|Europe/San_Marino","Europe/Paris|Europe/Sarajevo","Europe/Paris|Europe/Skopje","Europe/Paris|Europe/Stockholm","Europe/Paris|Europe/Tirane","Europe/Paris|Europe/Vaduz","Europe/Paris|Europe/Vatican","Europe/Paris|Europe/Vienna","Europe/Paris|Europe/Warsaw","Europe/Paris|Europe/Zagreb","Europe/Paris|Europe/Zurich","Europe/Paris|Poland","Europe/Volgograd|Europe/Kirov","Pacific/Auckland|Antarctica/McMurdo","Pacific/Auckland|Antarctica/South_Pole","Pacific/Auckland|NZ","Pacific/Chatham|NZ-CHAT","Pacific/Easter|Chile/EasterIsland","Pacific/Fakaofo|Etc/GMT-13","Pacific/Fakaofo|Pacific/Enderbury","Pacific/Galapagos|Etc/GMT+6","Pacific/Gambier|Etc/GMT+9","Pacific/Guadalcanal|Antarctica/Macquarie","Pacific/Guadalcanal|Etc/GMT-11","Pacific/Guadalcanal|Pacific/Efate","Pacific/Guadalcanal|Pacific/Kosrae","Pacific/Guadalcanal|Pacific/Noumea","Pacific/Guadalcanal|Pacific/Pohnpei","Pacific/Guadalcanal|Pacific/Ponape","Pacific/Guam|Pacific/Saipan","Pacific/Honolulu|HST","Pacific/Honolulu|Pacific/Johnston","Pacific/Honolulu|US/Hawaii","Pacific/Kiritimati|Etc/GMT-14","Pacific/Niue|Etc/GMT+11","Pacific/Pago_Pago|Pacific/Midway","Pacific/Pago_Pago|Pacific/Samoa","Pacific/Pago_Pago|US/Samoa","Pacific/Pitcairn|Etc/GMT+8","Pacific/Port_Moresby|Antarctica/DumontDUrville","Pacific/Port_Moresby|Etc/GMT-10","Pacific/Port_Moresby|Pacific/Chuuk","Pacific/Port_Moresby|Pacific/Truk","Pacific/Port_Moresby|Pacific/Yap","Pacific/Tahiti|Etc/GMT+10","Pacific/Tahiti|Pacific/Rarotonga"]}),a});
\ No newline at end of file
diff --git a/polymer_2.0.2/bower_components/moment-timezone/builds/moment-timezone-with-data.js b/polymer_2.0.2/bower_components/moment-timezone/builds/moment-timezone-with-data.js
new file mode 100644
index 0000000..f0c870d
--- /dev/null
+++ b/polymer_2.0.2/bower_components/moment-timezone/builds/moment-timezone-with-data.js
@@ -0,0 +1,1204 @@
+//! moment-timezone.js
+//! version : 0.5.14
+//! Copyright (c) JS Foundation and other contributors
+//! license : MIT
+//! github.com/moment/moment-timezone
+
+(function (root, factory) {
+	"use strict";
+
+	/*global define*/
+	if (typeof define === 'function' && define.amd) {
+		define(['moment'], factory);                 // AMD
+	} else if (typeof module === 'object' && module.exports) {
+		module.exports = factory(require('moment')); // Node
+	} else {
+		factory(root.moment);                        // Browser
+	}
+}(this, function (moment) {
+	"use strict";
+
+	// Do not load moment-timezone a second time.
+	// if (moment.tz !== undefined) {
+	// 	logError('Moment Timezone ' + moment.tz.version + ' was already loaded ' + (moment.tz.dataVersion ? 'with data from ' : 'without any data') + moment.tz.dataVersion);
+	// 	return moment;
+	// }
+
+	var VERSION = "0.5.14",
+		zones = {},
+		links = {},
+		names = {},
+		guesses = {},
+		cachedGuess,
+
+		momentVersion = moment.version.split('.'),
+		major = +momentVersion[0],
+		minor = +momentVersion[1];
+
+	// Moment.js version check
+	if (major < 2 || (major === 2 && minor < 6)) {
+		logError('Moment Timezone requires Moment.js >= 2.6.0. You are using Moment.js ' + moment.version + '. See momentjs.com');
+	}
+
+	/************************************
+		Unpacking
+	************************************/
+
+	function charCodeToInt(charCode) {
+		if (charCode > 96) {
+			return charCode - 87;
+		} else if (charCode > 64) {
+			return charCode - 29;
+		}
+		return charCode - 48;
+	}
+
+	function unpackBase60(string) {
+		var i = 0,
+			parts = string.split('.'),
+			whole = parts[0],
+			fractional = parts[1] || '',
+			multiplier = 1,
+			num,
+			out = 0,
+			sign = 1;
+
+		// handle negative numbers
+		if (string.charCodeAt(0) === 45) {
+			i = 1;
+			sign = -1;
+		}
+
+		// handle digits before the decimal
+		for (i; i < whole.length; i++) {
+			num = charCodeToInt(whole.charCodeAt(i));
+			out = 60 * out + num;
+		}
+
+		// handle digits after the decimal
+		for (i = 0; i < fractional.length; i++) {
+			multiplier = multiplier / 60;
+			num = charCodeToInt(fractional.charCodeAt(i));
+			out += num * multiplier;
+		}
+
+		return out * sign;
+	}
+
+	function arrayToInt (array) {
+		for (var i = 0; i < array.length; i++) {
+			array[i] = unpackBase60(array[i]);
+		}
+	}
+
+	function intToUntil (array, length) {
+		for (var i = 0; i < length; i++) {
+			array[i] = Math.round((array[i - 1] || 0) + (array[i] * 60000)); // minutes to milliseconds
+		}
+
+		array[length - 1] = Infinity;
+	}
+
+	function mapIndices (source, indices) {
+		var out = [], i;
+
+		for (i = 0; i < indices.length; i++) {
+			out[i] = source[indices[i]];
+		}
+
+		return out;
+	}
+
+	function unpack (string) {
+		var data = string.split('|'),
+			offsets = data[2].split(' '),
+			indices = data[3].split(''),
+			untils  = data[4].split(' ');
+
+		arrayToInt(offsets);
+		arrayToInt(indices);
+		arrayToInt(untils);
+
+		intToUntil(untils, indices.length);
+
+		return {
+			name       : data[0],
+			abbrs      : mapIndices(data[1].split(' '), indices),
+			offsets    : mapIndices(offsets, indices),
+			untils     : untils,
+			population : data[5] | 0
+		};
+	}
+
+	/************************************
+		Zone object
+	************************************/
+
+	function Zone (packedString) {
+		if (packedString) {
+			this._set(unpack(packedString));
+		}
+	}
+
+	Zone.prototype = {
+		_set : function (unpacked) {
+			this.name       = unpacked.name;
+			this.abbrs      = unpacked.abbrs;
+			this.untils     = unpacked.untils;
+			this.offsets    = unpacked.offsets;
+			this.population = unpacked.population;
+		},
+
+		_index : function (timestamp) {
+			var target = +timestamp,
+				untils = this.untils,
+				i;
+
+			for (i = 0; i < untils.length; i++) {
+				if (target < untils[i]) {
+					return i;
+				}
+			}
+		},
+
+		parse : function (timestamp) {
+			var target  = +timestamp,
+				offsets = this.offsets,
+				untils  = this.untils,
+				max     = untils.length - 1,
+				offset, offsetNext, offsetPrev, i;
+
+			for (i = 0; i < max; i++) {
+				offset     = offsets[i];
+				offsetNext = offsets[i + 1];
+				offsetPrev = offsets[i ? i - 1 : i];
+
+				if (offset < offsetNext && tz.moveAmbiguousForward) {
+					offset = offsetNext;
+				} else if (offset > offsetPrev && tz.moveInvalidForward) {
+					offset = offsetPrev;
+				}
+
+				if (target < untils[i] - (offset * 60000)) {
+					return offsets[i];
+				}
+			}
+
+			return offsets[max];
+		},
+
+		abbr : function (mom) {
+			return this.abbrs[this._index(mom)];
+		},
+
+		offset : function (mom) {
+			logError("zone.offset has been deprecated in favor of zone.utcOffset");
+			return this.offsets[this._index(mom)];
+		},
+
+		utcOffset : function (mom) {
+			return this.offsets[this._index(mom)];
+		}
+	};
+
+	/************************************
+		Current Timezone
+	************************************/
+
+	function OffsetAt(at) {
+		var timeString = at.toTimeString();
+		var abbr = timeString.match(/\([a-z ]+\)/i);
+		if (abbr && abbr[0]) {
+			// 17:56:31 GMT-0600 (CST)
+			// 17:56:31 GMT-0600 (Central Standard Time)
+			abbr = abbr[0].match(/[A-Z]/g);
+			abbr = abbr ? abbr.join('') : undefined;
+		} else {
+			// 17:56:31 CST
+			// 17:56:31 GMT+0800 (台北標準時間)
+			abbr = timeString.match(/[A-Z]{3,5}/g);
+			abbr = abbr ? abbr[0] : undefined;
+		}
+
+		if (abbr === 'GMT') {
+			abbr = undefined;
+		}
+
+		this.at = +at;
+		this.abbr = abbr;
+		this.offset = at.getTimezoneOffset();
+	}
+
+	function ZoneScore(zone) {
+		this.zone = zone;
+		this.offsetScore = 0;
+		this.abbrScore = 0;
+	}
+
+	ZoneScore.prototype.scoreOffsetAt = function (offsetAt) {
+		this.offsetScore += Math.abs(this.zone.utcOffset(offsetAt.at) - offsetAt.offset);
+		if (this.zone.abbr(offsetAt.at).replace(/[^A-Z]/g, '') !== offsetAt.abbr) {
+			this.abbrScore++;
+		}
+	};
+
+	function findChange(low, high) {
+		var mid, diff;
+
+		while ((diff = ((high.at - low.at) / 12e4 | 0) * 6e4)) {
+			mid = new OffsetAt(new Date(low.at + diff));
+			if (mid.offset === low.offset) {
+				low = mid;
+			} else {
+				high = mid;
+			}
+		}
+
+		return low;
+	}
+
+	function userOffsets() {
+		var startYear = new Date().getFullYear() - 2,
+			last = new OffsetAt(new Date(startYear, 0, 1)),
+			offsets = [last],
+			change, next, i;
+
+		for (i = 1; i < 48; i++) {
+			next = new OffsetAt(new Date(startYear, i, 1));
+			if (next.offset !== last.offset) {
+				change = findChange(last, next);
+				offsets.push(change);
+				offsets.push(new OffsetAt(new Date(change.at + 6e4)));
+			}
+			last = next;
+		}
+
+		for (i = 0; i < 4; i++) {
+			offsets.push(new OffsetAt(new Date(startYear + i, 0, 1)));
+			offsets.push(new OffsetAt(new Date(startYear + i, 6, 1)));
+		}
+
+		return offsets;
+	}
+
+	function sortZoneScores (a, b) {
+		if (a.offsetScore !== b.offsetScore) {
+			return a.offsetScore - b.offsetScore;
+		}
+		if (a.abbrScore !== b.abbrScore) {
+			return a.abbrScore - b.abbrScore;
+		}
+		return b.zone.population - a.zone.population;
+	}
+
+	function addToGuesses (name, offsets) {
+		var i, offset;
+		arrayToInt(offsets);
+		for (i = 0; i < offsets.length; i++) {
+			offset = offsets[i];
+			guesses[offset] = guesses[offset] || {};
+			guesses[offset][name] = true;
+		}
+	}
+
+	function guessesForUserOffsets (offsets) {
+		var offsetsLength = offsets.length,
+			filteredGuesses = {},
+			out = [],
+			i, j, guessesOffset;
+
+		for (i = 0; i < offsetsLength; i++) {
+			guessesOffset = guesses[offsets[i].offset] || {};
+			for (j in guessesOffset) {
+				if (guessesOffset.hasOwnProperty(j)) {
+					filteredGuesses[j] = true;
+				}
+			}
+		}
+
+		for (i in filteredGuesses) {
+			if (filteredGuesses.hasOwnProperty(i)) {
+				out.push(names[i]);
+			}
+		}
+
+		return out;
+	}
+
+	function rebuildGuess () {
+
+		// use Intl API when available and returning valid time zone
+		try {
+			var intlName = Intl.DateTimeFormat().resolvedOptions().timeZone;
+			if (intlName && intlName.length > 3) {
+				var name = names[normalizeName(intlName)];
+				if (name) {
+					return name;
+				}
+				logError("Moment Timezone found " + intlName + " from the Intl api, but did not have that data loaded.");
+			}
+		} catch (e) {
+			// Intl unavailable, fall back to manual guessing.
+		}
+
+		var offsets = userOffsets(),
+			offsetsLength = offsets.length,
+			guesses = guessesForUserOffsets(offsets),
+			zoneScores = [],
+			zoneScore, i, j;
+
+		for (i = 0; i < guesses.length; i++) {
+			zoneScore = new ZoneScore(getZone(guesses[i]), offsetsLength);
+			for (j = 0; j < offsetsLength; j++) {
+				zoneScore.scoreOffsetAt(offsets[j]);
+			}
+			zoneScores.push(zoneScore);
+		}
+
+		zoneScores.sort(sortZoneScores);
+
+		return zoneScores.length > 0 ? zoneScores[0].zone.name : undefined;
+	}
+
+	function guess (ignoreCache) {
+		if (!cachedGuess || ignoreCache) {
+			cachedGuess = rebuildGuess();
+		}
+		return cachedGuess;
+	}
+
+	/************************************
+		Global Methods
+	************************************/
+
+	function normalizeName (name) {
+		return (name || '').toLowerCase().replace(/\//g, '_');
+	}
+
+	function addZone (packed) {
+		var i, name, split, normalized;
+
+		if (typeof packed === "string") {
+			packed = [packed];
+		}
+
+		for (i = 0; i < packed.length; i++) {
+			split = packed[i].split('|');
+			name = split[0];
+			normalized = normalizeName(name);
+			zones[normalized] = packed[i];
+			names[normalized] = name;
+			addToGuesses(normalized, split[2].split(' '));
+		}
+	}
+
+	function getZone (name, caller) {
+		name = normalizeName(name);
+
+		var zone = zones[name];
+		var link;
+
+		if (zone instanceof Zone) {
+			return zone;
+		}
+
+		if (typeof zone === 'string') {
+			zone = new Zone(zone);
+			zones[name] = zone;
+			return zone;
+		}
+
+		// Pass getZone to prevent recursion more than 1 level deep
+		if (links[name] && caller !== getZone && (link = getZone(links[name], getZone))) {
+			zone = zones[name] = new Zone();
+			zone._set(link);
+			zone.name = names[name];
+			return zone;
+		}
+
+		return null;
+	}
+
+	function getNames () {
+		var i, out = [];
+
+		for (i in names) {
+			if (names.hasOwnProperty(i) && (zones[i] || zones[links[i]]) && names[i]) {
+				out.push(names[i]);
+			}
+		}
+
+		return out.sort();
+	}
+
+	function addLink (aliases) {
+		var i, alias, normal0, normal1;
+
+		if (typeof aliases === "string") {
+			aliases = [aliases];
+		}
+
+		for (i = 0; i < aliases.length; i++) {
+			alias = aliases[i].split('|');
+
+			normal0 = normalizeName(alias[0]);
+			normal1 = normalizeName(alias[1]);
+
+			links[normal0] = normal1;
+			names[normal0] = alias[0];
+
+			links[normal1] = normal0;
+			names[normal1] = alias[1];
+		}
+	}
+
+	function loadData (data) {
+		addZone(data.zones);
+		addLink(data.links);
+		tz.dataVersion = data.version;
+	}
+
+	function zoneExists (name) {
+		if (!zoneExists.didShowError) {
+			zoneExists.didShowError = true;
+				logError("moment.tz.zoneExists('" + name + "') has been deprecated in favor of !moment.tz.zone('" + name + "')");
+		}
+		return !!getZone(name);
+	}
+
+	function needsOffset (m) {
+		var isUnixTimestamp = (m._f === 'X' || m._f === 'x');
+		return !!(m._a && (m._tzm === undefined) && !isUnixTimestamp);
+	}
+
+	function logError (message) {
+		if (typeof console !== 'undefined' && typeof console.error === 'function') {
+			console.error(message);
+		}
+	}
+
+	/************************************
+		moment.tz namespace
+	************************************/
+
+	function tz (input) {
+		var args = Array.prototype.slice.call(arguments, 0, -1),
+			name = arguments[arguments.length - 1],
+			zone = getZone(name),
+			out  = moment.utc.apply(null, args);
+
+		if (zone && !moment.isMoment(input) && needsOffset(out)) {
+			out.add(zone.parse(out), 'minutes');
+		}
+
+		out.tz(name);
+
+		return out;
+	}
+
+	tz.version      = VERSION;
+	tz.dataVersion  = '';
+	tz._zones       = zones;
+	tz._links       = links;
+	tz._names       = names;
+	tz.add          = addZone;
+	tz.link         = addLink;
+	tz.load         = loadData;
+	tz.zone         = getZone;
+	tz.zoneExists   = zoneExists; // deprecated in 0.1.0
+	tz.guess        = guess;
+	tz.names        = getNames;
+	tz.Zone         = Zone;
+	tz.unpack       = unpack;
+	tz.unpackBase60 = unpackBase60;
+	tz.needsOffset  = needsOffset;
+	tz.moveInvalidForward   = true;
+	tz.moveAmbiguousForward = false;
+
+	/************************************
+		Interface with Moment.js
+	************************************/
+
+	var fn = moment.fn;
+
+	moment.tz = tz;
+
+	moment.defaultZone = null;
+
+	moment.updateOffset = function (mom, keepTime) {
+		var zone = moment.defaultZone,
+			offset;
+
+		if (mom._z === undefined) {
+			if (zone && needsOffset(mom) && !mom._isUTC) {
+				mom._d = moment.utc(mom._a)._d;
+				mom.utc().add(zone.parse(mom), 'minutes');
+			}
+			mom._z = zone;
+		}
+		if (mom._z) {
+			offset = mom._z.utcOffset(mom);
+			if (Math.abs(offset) < 16) {
+				offset = offset / 60;
+			}
+			if (mom.utcOffset !== undefined) {
+				mom.utcOffset(-offset, keepTime);
+			} else {
+				mom.zone(offset, keepTime);
+			}
+		}
+	};
+
+	fn.tz = function (name, keepTime) {
+		if (name) {
+			this._z = getZone(name);
+			if (this._z) {
+				moment.updateOffset(this, keepTime);
+			} else {
+				logError("Moment Timezone has no data for " + name + ". See http://momentjs.com/timezone/docs/#/data-loading/.");
+			}
+			return this;
+		}
+		if (this._z) { return this._z.name; }
+	};
+
+	function abbrWrap (old) {
+		return function () {
+			if (this._z) { return this._z.abbr(this); }
+			return old.call(this);
+		};
+	}
+
+	function resetZoneWrap (old) {
+		return function () {
+			this._z = null;
+			return old.apply(this, arguments);
+		};
+	}
+
+	fn.zoneName = abbrWrap(fn.zoneName);
+	fn.zoneAbbr = abbrWrap(fn.zoneAbbr);
+	fn.utc      = resetZoneWrap(fn.utc);
+
+	moment.tz.setDefault = function(name) {
+		if (major < 2 || (major === 2 && minor < 9)) {
+			logError('Moment Timezone setDefault() requires Moment.js >= 2.9.0. You are using Moment.js ' + moment.version + '.');
+		}
+		moment.defaultZone = name ? getZone(name) : null;
+		return moment;
+	};
+
+	// Cloning a moment should include the _z property.
+	var momentProperties = moment.momentProperties;
+	if (Object.prototype.toString.call(momentProperties) === '[object Array]') {
+		// moment 2.8.1+
+		momentProperties.push('_z');
+		momentProperties.push('_a');
+	} else if (momentProperties) {
+		// moment 2.7.0
+		momentProperties._z = null;
+	}
+
+	loadData({
+		"version": "2017c",
+		"zones": [
+			"Africa/Abidjan|LMT GMT|g.8 0|01|-2ldXH.Q|48e5",
+			"Africa/Accra|LMT GMT +0020|.Q 0 -k|012121212121212121212121212121212121212121212121|-26BbX.8 6tzX.8 MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE|41e5",
+			"Africa/Nairobi|LMT EAT +0230 +0245|-2r.g -30 -2u -2J|01231|-1F3Cr.g 3Dzr.g okMu MFXJ|47e5",
+			"Africa/Algiers|PMT WET WEST CET CEST|-9.l 0 -10 -10 -20|0121212121212121343431312123431213|-2nco9.l cNb9.l HA0 19A0 1iM0 11c0 1oo0 Wo0 1rc0 QM0 1EM0 UM0 DA0 Imo0 rd0 De0 9Xz0 1fb0 1ap0 16K0 2yo0 mEp0 hwL0 jxA0 11A0 dDd0 17b0 11B0 1cN0 2Dy0 1cN0 1fB0 1cL0|26e5",
+			"Africa/Lagos|LMT WAT|-d.A -10|01|-22y0d.A|17e6",
+			"Africa/Bissau|LMT -01 GMT|12.k 10 0|012|-2ldWV.E 2xonV.E|39e4",
+			"Africa/Maputo|LMT CAT|-2a.k -20|01|-2GJea.k|26e5",
+			"Africa/Cairo|EET EEST|-20 -30|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-1bIO0 vb0 1ip0 11z0 1iN0 1nz0 12p0 1pz0 10N0 1pz0 16p0 1jz0 s3d0 Vz0 1oN0 11b0 1oO0 10N0 1pz0 10N0 1pb0 10N0 1pb0 10N0 1pb0 10N0 1pz0 10N0 1pb0 10N0 1pb0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1WL0 rd0 1Rz0 wp0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1qL0 Xd0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1ny0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 WL0 1qN0 Rb0 1wp0 On0 1zd0 Lz0 1EN0 Fb0 c10 8n0 8Nd0 gL0 e10 mn0|15e6",
+			"Africa/Casablanca|LMT WET WEST CET|u.k 0 -10 -10|0121212121212121213121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2gMnt.E 130Lt.E rb0 Dd0 dVb0 b6p0 TX0 EoB0 LL0 gnd0 rz0 43d0 AL0 1Nd0 XX0 1Cp0 pz0 dEp0 4mn0 SyN0 AL0 1Nd0 wn0 1FB0 Db0 1zd0 Lz0 1Nf0 wM0 co0 go0 1o00 s00 dA0 vc0 11A0 A00 e00 y00 11A0 uM0 e00 Dc0 11A0 s00 e00 IM0 WM0 mo0 gM0 LA0 WM0 jA0 e00 Rc0 11A0 e00 e00 U00 11A0 8o0 e00 11A0 11A0 5A0 e00 17c0 1fA0 1a00 1a00 1fA0 17c0 1io0 14o0 1lc0 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1lc0 14o0 1fA0|32e5",
+			"Africa/Ceuta|WET WEST CET CEST|0 -10 -10 -20|010101010101010101010232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-25KN0 11z0 drd0 18p0 3HX0 17d0 1fz0 1a10 1io0 1a00 1y7o0 LL0 gnd0 rz0 43d0 AL0 1Nd0 XX0 1Cp0 pz0 dEp0 4VB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|85e3",
+			"Africa/El_Aaiun|LMT -01 WET WEST|Q.M 10 0 -10|01232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-1rDz7.c 1GVA7.c 6L0 AL0 1Nd0 XX0 1Cp0 pz0 1cBB0 AL0 1Nd0 wn0 1FB0 Db0 1zd0 Lz0 1Nf0 wM0 co0 go0 1o00 s00 dA0 vc0 11A0 A00 e00 y00 11A0 uM0 e00 Dc0 11A0 s00 e00 IM0 WM0 mo0 gM0 LA0 WM0 jA0 e00 Rc0 11A0 e00 e00 U00 11A0 8o0 e00 11A0 11A0 5A0 e00 17c0 1fA0 1a00 1a00 1fA0 17c0 1io0 14o0 1lc0 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1lc0 14o0 1fA0|20e4",
+			"Africa/Johannesburg|SAST SAST SAST|-1u -20 -30|012121|-2GJdu 1Ajdu 1cL0 1cN0 1cL0|84e5",
+			"Africa/Juba|LMT CAT CAST EAT|-26.s -20 -30 -30|01212121212121212121212121212121213|-1yW26.s 1zK06.s 16L0 1iN0 17b0 1jd0 17b0 1ip0 17z0 1i10 17X0 1hB0 18n0 1hd0 19b0 1gp0 19z0 1iN0 17b0 1ip0 17z0 1i10 18n0 1hd0 18L0 1gN0 19b0 1gp0 19z0 1iN0 17z0 1i10 17X0 yGd0",
+			"Africa/Khartoum|LMT CAT CAST EAT|-2a.8 -20 -30 -30|012121212121212121212121212121212131|-1yW2a.8 1zK0a.8 16L0 1iN0 17b0 1jd0 17b0 1ip0 17z0 1i10 17X0 1hB0 18n0 1hd0 19b0 1gp0 19z0 1iN0 17b0 1ip0 17z0 1i10 18n0 1hd0 18L0 1gN0 19b0 1gp0 19z0 1iN0 17z0 1i10 17X0 yGd0 HjL0|51e5",
+			"Africa/Monrovia|MMT MMT GMT|H.8 I.u 0|012|-23Lzg.Q 28G01.m|11e5",
+			"Africa/Ndjamena|LMT WAT WAST|-10.c -10 -20|0121|-2le10.c 2J3c0.c Wn0|13e5",
+			"Africa/Tripoli|LMT CET CEST EET|-Q.I -10 -20 -20|012121213121212121212121213123123|-21JcQ.I 1hnBQ.I vx0 4iP0 xx0 4eN0 Bb0 7ip0 U0n0 A10 1db0 1cN0 1db0 1dd0 1db0 1eN0 1bb0 1e10 1cL0 1c10 1db0 1dd0 1db0 1cN0 1db0 1q10 fAn0 1ep0 1db0 AKq0 TA0 1o00|11e5",
+			"Africa/Tunis|PMT CET CEST|-9.l -10 -20|0121212121212121212121212121212121|-2nco9.l 18pa9.l 1qM0 DA0 3Tc0 11B0 1ze0 WM0 7z0 3d0 14L0 1cN0 1f90 1ar0 16J0 1gXB0 WM0 1rA0 11c0 nwo0 Ko0 1cM0 1cM0 1rA0 10M0 zuM0 10N0 1aN0 1qM0 WM0 1qM0 11A0 1o00|20e5",
+			"Africa/Windhoek|+0130 SAST SAST CAT WAT WAST|-1u -20 -30 -20 -10 -20|01213454545454545454545454545454545454545454545454543|-2GJdu 1Ajdu 1cL0 1SqL0 9Io0 16P0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0|32e4",
+			"America/Adak|NST NWT NPT BST BDT AHST HST HDT|b0 a0 a0 b0 a0 a0 a0 90|012034343434343434343434343434343456767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17SX0 8wW0 iB0 Qlb0 52O0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cm0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|326",
+			"America/Anchorage|AST AWT APT AHST AHDT YST AKST AKDT|a0 90 90 a0 90 90 90 80|012034343434343434343434343434343456767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17T00 8wX0 iA0 Qlb0 52O0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cm0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|30e4",
+			"America/Port_of_Spain|LMT AST|46.4 40|01|-2kNvR.U|43e3",
+			"America/Araguaina|LMT -03 -02|3c.M 30 20|0121212121212121212121212121212121212121212121212121|-2glwL.c HdKL.c 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 dMN0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 ny10 Lz0|14e4",
+			"America/Argentina/Buenos_Aires|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323232323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 A4p0 uL0 1qN0 WL0",
+			"America/Argentina/Catamarca|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323132321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 rlB0 7B0 8zb0 uL0",
+			"America/Argentina/Cordoba|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323132323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 A4p0 uL0 1qN0 WL0",
+			"America/Argentina/Jujuy|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323121323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1ze0 TX0 1ld0 WK0 1wp0 TX0 A4p0 uL0",
+			"America/Argentina/La_Rioja|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323231232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Qn0 qO0 16n0 Rb0 1wp0 TX0 rlB0 7B0 8zb0 uL0",
+			"America/Argentina/Mendoza|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232312121321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1u20 SL0 1vd0 Tb0 1wp0 TW0 ri10 Op0 7TX0 uL0",
+			"America/Argentina/Rio_Gallegos|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 rlB0 7B0 8zb0 uL0",
+			"America/Argentina/Salta|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323231323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 A4p0 uL0",
+			"America/Argentina/San_Juan|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323231232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Qn0 qO0 16n0 Rb0 1wp0 TX0 rld0 m10 8lb0 uL0",
+			"America/Argentina/San_Luis|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323121212321212|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 XX0 1q20 SL0 AN0 vDb0 m10 8lb0 8L0 jd0 1qN0 WL0 1qN0",
+			"America/Argentina/Tucuman|CMT -04 -03 -02|4g.M 40 30 20|0121212121212121212121212121212121212121212323232313232123232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 rlB0 4N0 8BX0 uL0 1qN0 WL0",
+			"America/Argentina/Ushuaia|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 rkN0 8p0 8zb0 uL0",
+			"America/Curacao|LMT -0430 AST|4z.L 4u 40|012|-2kV7o.d 28KLS.d|15e4",
+			"America/Asuncion|AMT -04 -03|3O.E 40 30|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-1x589.k 1DKM9.k 3CL0 3Dd0 10L0 1pB0 10n0 1pB0 10n0 1pB0 1cL0 1dd0 1db0 1dd0 1cL0 1dd0 1cL0 1dd0 1cL0 1dd0 1db0 1dd0 1cL0 1dd0 1cL0 1dd0 1cL0 1dd0 1db0 1dd0 1cL0 1lB0 14n0 1dd0 1cL0 1fd0 WL0 1rd0 1aL0 1dB0 Xz0 1qp0 Xb0 1qN0 10L0 1rB0 TX0 1tB0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 WN0 1qL0 11B0 1nX0 1ip0 WL0 1qN0 WL0 1qN0 WL0 1tB0 TX0 1tB0 TX0 1tB0 19X0 1a10 1fz0 1a10 1fz0 1cN0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0|28e5",
+			"America/Atikokan|CST CDT CWT CPT EST|60 50 50 50 50|0101234|-25TQ0 1in0 Rnb0 3je0 8x30 iw0|28e2",
+			"America/Bahia|LMT -03 -02|2y.4 30 20|01212121212121212121212121212121212121212121212121212121212121|-2glxp.U HdLp.U 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 l5B0 Rb0|27e5",
+			"America/Bahia_Banderas|LMT MST CST PST MDT CDT|71 70 60 80 60 50|0121212131414141414141414141414141414152525252525252525252525252525252525252525252525252525252|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 otX0 gmN0 P2N0 13Vd0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nW0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|84e3",
+			"America/Barbados|LMT BMT AST ADT|3W.t 3W.t 40 30|01232323232|-1Q0I1.v jsM0 1ODC1.v IL0 1ip0 17b0 1ip0 17b0 1ld0 13b0|28e4",
+			"America/Belem|LMT -03 -02|3d.U 30 20|012121212121212121212121212121|-2glwK.4 HdKK.4 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0|20e5",
+			"America/Belize|LMT CST -0530 CDT|5Q.M 60 5u 50|01212121212121212121212121212121212121212121212121213131|-2kBu7.c fPA7.c Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1f0Mu qn0 lxB0 mn0|57e3",
+			"America/Blanc-Sablon|AST ADT AWT APT|40 30 30 30|010230|-25TS0 1in0 UGp0 8x50 iu0|11e2",
+			"America/Boa_Vista|LMT -04 -03|42.E 40 30|0121212121212121212121212121212121|-2glvV.k HdKV.k 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 smp0 WL0 1tB0 2L0|62e2",
+			"America/Bogota|BMT -05 -04|4U.g 50 40|0121|-2eb73.I 38yo3.I 2en0|90e5",
+			"America/Boise|PST PDT MST MWT MPT MDT|80 70 70 60 60 60|0101023425252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252|-261q0 1nX0 11B0 1nX0 8C10 JCL0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 Dd0 1Kn0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|21e4",
+			"America/Cambridge_Bay|-00 MST MWT MPT MDDT MDT CST CDT EST|0 70 60 60 50 60 60 50 50|0123141515151515151515151515151515151515151515678651515151515151515151515151515151515151515151515151515151515151515151515151|-21Jc0 RO90 8x20 ix0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11A0 1nX0 2K0 WQ0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|15e2",
+			"America/Campo_Grande|LMT -04 -03|3C.s 40 30|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-2glwl.w HdLl.w 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 1C10 Lz0 1Ip0 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1C10 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1C10 Lz0 1C10 Lz0 1C10 Lz0 1C10 On0 1zd0 Rb0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0|77e4",
+			"America/Cancun|LMT CST EST EDT CDT|5L.4 60 50 40 50|0123232341414141414141414141414141414141412|-1UQG0 2q2o0 yLB0 1lb0 14p0 1lb0 14p0 Lz0 xB0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 Dd0|63e4",
+			"America/Caracas|CMT -0430 -04|4r.E 4u 40|01212|-2kV7w.k 28KM2.k 1IwOu kqo0|29e5",
+			"America/Cayenne|LMT -04 -03|3t.k 40 30|012|-2mrwu.E 2gWou.E|58e3",
+			"America/Panama|CMT EST|5j.A 50|01|-2uduE.o|15e5",
+			"America/Chicago|CST CDT EST CWT CPT|60 50 50 50 50|01010101010101010101010101010101010102010101010103401010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 1wp0 TX0 WN0 1qL0 1cN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 11B0 1Hz0 14p0 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 RB0 8x30 iw0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|92e5",
+			"America/Chihuahua|LMT MST CST CDT MDT|74.k 70 60 50 60|0121212323241414141414141414141414141414141414141414141414141414141414141414141414141414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 2zQN0 1lb0 14p0 1lb0 14q0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|81e4",
+			"America/Costa_Rica|SJMT CST CDT|5A.d 60 50|0121212121|-1Xd6n.L 2lu0n.L Db0 1Kp